{"version":3,"file":"ngx-core-components-charts.mjs","sources":["../../../projects/ngx-core-components/charts/shared/chart-export.service.ts","../../../projects/ngx-core-components/charts/shared/chart-export-menu.component.ts","../../../projects/ngx-core-components/charts/shared/chart-utils.ts","../../../projects/ngx-core-components/charts/bar-chart/bar-chart.component.ts","../../../projects/ngx-core-components/charts/line-chart/line-chart.component.ts","../../../projects/ngx-core-components/charts/pie-chart/pie-chart.component.ts","../../../projects/ngx-core-components/charts/sparkline/sparkline.component.ts","../../../projects/ngx-core-components/charts/gantt-chart/models/gantt-task.model.ts","../../../projects/ngx-core-components/charts/gantt-chart/models/gantt-dependency.model.ts","../../../projects/ngx-core-components/charts/gantt-chart/models/gantt-config.model.ts","../../../projects/ngx-core-components/charts/gantt-chart/utils/date-utils.ts","../../../projects/ngx-core-components/charts/gantt-chart/services/gantt-scale.service.ts","../../../projects/ngx-core-components/charts/gantt-chart/services/gantt-layout.service.ts","../../../projects/ngx-core-components/charts/gantt-chart/services/gantt-keyboard.service.ts","../../../projects/ngx-core-components/charts/gantt-chart/services/gantt-print.service.ts","../../../projects/ngx-core-components/charts/gantt-chart/utils/svg-utils.ts","../../../projects/ngx-core-components/charts/gantt-chart/gantt-chart.component.ts","../../../projects/ngx-core-components/charts/gauge-chart/gauge-chart.component.ts","../../../projects/ngx-core-components/charts/radar-chart/radar-chart.component.ts","../../../projects/ngx-core-components/charts/heatmap-chart/heatmap-chart.component.ts","../../../projects/ngx-core-components/charts/treemap-chart/treemap-chart.component.ts","../../../projects/ngx-core-components/charts/area-chart/area-chart.component.ts","../../../projects/ngx-core-components/charts/funnel-chart/funnel-chart.component.ts","../../../projects/ngx-core-components/charts/combo-chart/combo-chart.component.ts","../../../projects/ngx-core-components/charts/scatter-plot/scatter-plot.component.ts","../../../projects/ngx-core-components/charts/bubble-chart/bubble-chart.component.ts","../../../projects/ngx-core-components/charts/sunburst-chart/sunburst-chart.component.ts","../../../projects/ngx-core-components/charts/waterfall-chart/waterfall-chart.component.ts","../../../projects/ngx-core-components/charts/box-plot-chart/box-plot-chart.component.ts","../../../projects/ngx-core-components/charts/radial-bar-chart/radial-bar-chart.component.ts","../../../projects/ngx-core-components/charts/candlestick-chart/candlestick-chart.component.ts","../../../projects/ngx-core-components/charts/polar-area-chart/polar-area-chart.component.ts","../../../projects/ngx-core-components/charts/bullet-chart/bullet-chart.component.ts","../../../projects/ngx-core-components/charts/dumbbell-chart/dumbbell-chart.component.ts","../../../projects/ngx-core-components/charts/lollipop-chart/lollipop-chart.component.ts","../../../projects/ngx-core-components/charts/slope-chart/slope-chart.component.ts","../../../projects/ngx-core-components/charts/sankey-chart/sankey-chart.component.ts","../../../projects/ngx-core-components/charts/violin-plot/violin-plot.component.ts","../../../projects/ngx-core-components/charts/ridgeline-chart/ridgeline-chart.component.ts","../../../projects/ngx-core-components/charts/pareto-chart/pareto-chart.component.ts","../../../projects/ngx-core-components/charts/marimekko-chart/marimekko-chart.component.ts","../../../projects/ngx-core-components/charts/chord-diagram/chord-diagram.component.ts","../../../projects/ngx-core-components/charts/dependency-wheel/dependency-wheel.component.ts","../../../projects/ngx-core-components/charts/adjacency-matrix/adjacency-matrix.component.ts","../../../projects/ngx-core-components/charts/biplot/biplot.component.ts","../../../projects/ngx-core-components/charts/renko-chart/renko-chart.component.ts","../../../projects/ngx-core-components/charts/kagi-chart/kagi-chart.component.ts","../../../projects/ngx-core-components/charts/point-figure-chart/point-figure-chart.component.ts","../../../projects/ngx-core-components/charts/wind-rose/wind-rose.component.ts","../../../projects/ngx-core-components/charts/area-range-chart/area-range-chart.component.ts","../../../projects/ngx-core-components/charts/area-spline-range-chart/area-spline-range-chart.component.ts","../../../projects/ngx-core-components/charts/streamgraph/streamgraph.component.ts","../../../projects/ngx-core-components/charts/column-range-chart/column-range-chart.component.ts","../../../projects/ngx-core-components/charts/column-pyramid-chart/column-pyramid-chart.component.ts","../../../projects/ngx-core-components/charts/variwide-chart/variwide-chart.component.ts","../../../projects/ngx-core-components/charts/variable-pie-chart/variable-pie-chart.component.ts","../../../projects/ngx-core-components/charts/packed-bubble-chart/packed-bubble-chart.component.ts","../../../projects/ngx-core-components/charts/network-graph/network-graph.component.ts","../../../projects/ngx-core-components/charts/treegraph/treegraph.component.ts","../../../projects/ngx-core-components/charts/arc-diagram/arc-diagram.component.ts","../../../projects/ngx-core-components/charts/histogram/histogram.component.ts","../../../projects/ngx-core-components/charts/bell-curve-chart/bell-curve-chart.component.ts","../../../projects/ngx-core-components/charts/error-bar/error-bar.component.ts","../../../projects/ngx-core-components/charts/tilemap/tilemap.component.ts","../../../projects/ngx-core-components/charts/venn-diagram/venn-diagram.component.ts","../../../projects/ngx-core-components/charts/parallel-coordinates/parallel-coordinates.component.ts","../../../projects/ngx-core-components/charts/word-cloud/word-cloud.component.ts","../../../projects/ngx-core-components/charts/pictorial-chart/pictorial-chart.component.ts","../../../projects/ngx-core-components/charts/vector-plot/vector-plot.component.ts","../../../projects/ngx-core-components/charts/ohlc-chart/ohlc-chart.component.ts","../../../projects/ngx-core-components/charts/hlc-chart/hlc-chart.component.ts","../../../projects/ngx-core-components/charts/hollow-candlestick-chart/hollow-candlestick-chart.component.ts","../../../projects/ngx-core-components/charts/heikin-ashi-chart/heikin-ashi-chart.component.ts","../../../projects/ngx-core-components/charts/flags/flags.component.ts","../../../projects/ngx-core-components/charts/shared/map-data.ts","../../../projects/ngx-core-components/charts/map-choropleth/map-choropleth.component.ts","../../../projects/ngx-core-components/charts/map-bubble/map-bubble.component.ts","../../../projects/ngx-core-components/charts/map-line-point/map-line-point.component.ts","../../../projects/ngx-core-components/charts/flowmap/flowmap.component.ts","../../../projects/ngx-core-components/charts/geo-heatmap/geo-heatmap.component.ts","../../../projects/ngx-core-components/charts/tiled-web-map/tiled-web-map.component.ts","../../../projects/ngx-core-components/charts/token-streaming-chart/token-streaming-chart.component.ts","../../../projects/ngx-core-components/charts/embedding-space-projection/embedding-space-projection.component.ts","../../../projects/ngx-core-components/charts/agentic-cognitive-topology/agentic-cognitive-topology.component.ts","../../../projects/ngx-core-components/charts/transformer-attention-heatmap/transformer-attention-heatmap.component.ts","../../../projects/ngx-core-components/charts/shared/chart-theme.service.ts","../../../projects/ngx-core-components/charts/shared/chart-annotations.ts","../../../projects/ngx-core-components/charts/shared/chart-skeleton.component.ts","../../../projects/ngx-core-components/charts/shared/chart-sync-group.directive.ts","../../../projects/ngx-core-components/charts/shared/chart-brush-zoom.component.ts","../../../projects/ngx-core-components/charts/shared/chart-tooltip.service.ts","../../../projects/ngx-core-components/charts/step-line-chart/step-line-chart.component.ts","../../../projects/ngx-core-components/charts/calendar-heatmap/calendar-heatmap.component.ts","../../../projects/ngx-core-components/charts/nested-donut-chart/nested-donut-chart.component.ts","../../../projects/ngx-core-components/charts/pyramid-chart/pyramid-chart.component.ts","../../../projects/ngx-core-components/charts/range-bar-chart/range-bar-chart.component.ts","../../../projects/ngx-core-components/charts/timeline-chart/timeline-chart.component.ts","../../../projects/ngx-core-components/charts/org-chart/org-chart.component.ts","../../../projects/ngx-core-components/charts/multi-needle-gauge/multi-needle-gauge.component.ts","../../../projects/ngx-core-components/charts/public-api.ts","../../../projects/ngx-core-components/charts/ngx-core-components-charts.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { isPlatformBrowser } from '@angular/common';\nimport { PLATFORM_ID } from '@angular/core';\n\n/**\n * ChartExportService — SSR-safe chart data and image export.\n *\n * All public methods are no-ops on the server (SSR) platform.\n * Inject this service in chart components to avoid duplicating\n * download logic and document/window references across all 70+ charts.\n *\n * Usage:\n *   private readonly exportSvc = inject(ChartExportService);\n *   this.exportSvc.downloadCsv(headers, rows, 'my-chart.csv');\n */\n@Injectable({ providedIn: 'root' })\nexport class ChartExportService {\n  private readonly doc = inject(DOCUMENT);\n  private readonly platformId = inject(PLATFORM_ID);\n\n  private get isBrowser(): boolean {\n    return isPlatformBrowser(this.platformId);\n  }\n\n  /** Trigger a file download from a Blob */\n  private triggerDownload(blob: Blob, filename: string): void {\n    if (!this.isBrowser) return;\n    const url = (this.doc.defaultView as Window & typeof globalThis).URL.createObjectURL(blob);\n    const link = this.doc.createElement('a');\n    link.href = url;\n    link.setAttribute('download', filename);\n    this.doc.body.appendChild(link);\n    link.click();\n    this.doc.body.removeChild(link);\n    (this.doc.defaultView as Window & typeof globalThis).URL.revokeObjectURL(url);\n  }\n\n  /** Download chart data as CSV */\n  downloadCsv(headers: string[], rows: (string | number)[][], filename: string): void {\n    if (!this.isBrowser) return;\n    const csvLines = [\n      headers.map(h => `\"${h}\"`).join(','),\n      ...rows.map(row => row.map(cell => (typeof cell === 'string' ? `\"${cell}\"` : String(cell))).join(',')),\n    ];\n    const blob = new Blob([csvLines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n    this.triggerDownload(blob, filename);\n  }\n\n  /** Download chart data as JSON */\n  downloadJson(data: object, filename: string): void {\n    if (!this.isBrowser) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    this.triggerDownload(blob, filename);\n  }\n\n  /** Download the chart SVG element as an .svg file */\n  downloadSvg(svgEl: SVGElement | null | undefined, filename: string): void {\n    if (!this.isBrowser || !svgEl) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svgEl);\n    if (!source.match(/^<svg[^>]+xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns:xlink=\"http:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    this.triggerDownload(blob, filename);\n  }\n\n  /** Open a print dialog to save the chart as PDF (print-to-PDF) */\n  downloadPdf(svgEl: SVGElement | null | undefined, title: string, filename: string): void {\n    if (!this.isBrowser || !svgEl) return;\n    const win = this.doc.defaultView as (Window & typeof globalThis) | null;\n    if (!win) return;\n\n    const printWindow = win.open('', '_blank');\n    if (!printWindow) {\n      // Popup blocked — fail gracefully\n      console.warn(`[ChartExportService] Could not open print window for \"${filename}\". Allow pop-ups to enable PDF export.`);\n      return;\n    }\n\n    const svgHtml = svgEl.outerHTML;\n    const date = new Date().toLocaleString();\n\n    const html = `<!DOCTYPE html>\n<html>\n<head>\n  <title>${title}</title>\n  <style>\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n      padding: 24px; color: #0f172a; text-align: center;\n    }\n    .header {\n      display: flex; justify-content: space-between; align-items: center;\n      border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left;\n    }\n    .chart-title { font-size: 20px; font-weight: bold; }\n    .chart-date { font-size: 12px; color: #64748b; }\n    .chart-container {\n      display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1;\n      border-radius: 12px; padding: 20px; background: #ffffff; width: 90%;\n    }\n    svg { width: 100%; height: auto; }\n    @media print {\n      body { padding: 0; }\n      .chart-container { border: none; padding: 0; width: 100%; }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"header\">\n    <div class=\"chart-title\">${title}</div>\n    <div class=\"chart-date\">${date}</div>\n  </div>\n  <div class=\"chart-container\">${svgHtml}</div>\n  <script>\n    window.onload = function () { window.print(); setTimeout(function () { window.close(); }, 600); };\n  <\\/script>\n</body>\n</html>`;\n\n    printWindow.document.write(html);\n    printWindow.document.close();\n  }\n}\n","import { Component, ChangeDetectionStrategy, input, output, signal, HostListener, viewChildren, ElementRef } from '@angular/core';\n\nexport type ExportFormat = 'json' | 'csv' | 'svg' | 'pdf';\n\n/**\n * ChartExportMenuComponent — reusable standalone export dropdown.\n *\n * Replaces the ~40 lines of duplicated export button + dropdown HTML\n * that previously existed in every chart component.\n *\n * Usage:\n *   <ngx-chart-export-menu\n *     [formats]=\"['json','csv','svg','pdf']\"\n *     (exportClicked)=\"onExport($event)\"\n *   />\n */\n@Component({\n  selector: 'ngx-chart-export-menu',\n  standalone: true,\n  imports: [],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"chart-export-menu\" (keydown.arrowdown)=\"onArrowDown($event)\" (keydown.arrowup)=\"onArrowUp($event)\">\n      <button\n        class=\"export-trigger\"\n        (click)=\"toggle($event)\"\n        [attr.aria-expanded]=\"isOpen()\"\n        aria-haspopup=\"menu\"\n        aria-label=\"Export chart data\"\n        type=\"button\"\n      >\n        📤 Export\n      </button>\n\n      @if (isOpen()) {\n        <div class=\"export-dropdown\" role=\"menu\">\n          @for (fmt of formats(); track fmt; let i = $index) {\n            <button\n              #menuBtn\n              type=\"button\"\n              role=\"menuitem\"\n              (click)=\"select(fmt)\"\n            >\n              {{ formatIcon(fmt) }} Export {{ fmt.toUpperCase() }}\n            </button>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: background 0.15s, color 0.15s, border-color 0.15s;\n      font-family: inherit;\n    }\n\n    .export-trigger:hover,\n    .export-trigger:focus-visible {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n      outline: none;\n    }\n\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.06);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 130px;\n      z-index: 51;\n      animation: dropdownOpen 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n\n    @keyframes dropdownOpen {\n      from { opacity: 0; transform: translateY(-4px) scale(0.97); }\n      to   { opacity: 1; transform: translateY(0)    scale(1); }\n    }\n\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: background 0.1s, color 0.1s;\n    }\n\n    .export-dropdown button:hover,\n    .export-dropdown button:focus-visible {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n      outline: none;\n    }\n  `],\n})\nexport class ChartExportMenuComponent {\n  formats = input<ExportFormat[]>(['json', 'csv', 'svg', 'pdf']);\n  exportClicked = output<ExportFormat>();\n\n  isOpen = signal(false);\n  focusedIndex = signal<number>(-1);\n  menuBtns = viewChildren<ElementRef<HTMLButtonElement>>('menuBtn');\n\n  toggle(event: MouseEvent): void {\n    event.stopPropagation();\n    const nextVal = !this.isOpen();\n    this.isOpen.set(nextVal);\n    this.focusedIndex.set(-1);\n  }\n\n  select(fmt: ExportFormat): void {\n    this.isOpen.set(false);\n    this.focusedIndex.set(-1);\n    this.exportClicked.emit(fmt);\n  }\n\n  formatIcon(fmt: ExportFormat): string {\n    const icons: Record<ExportFormat, string> = {\n      json: '📊',\n      csv: '📄',\n      svg: '🖼️',\n      pdf: '📕',\n    };\n    return icons[fmt] ?? '📁';\n  }\n\n  onArrowDown(event: Event): void {\n    if (!this.isOpen()) return;\n    event.preventDefault();\n    this.navigate(1);\n  }\n\n  onArrowUp(event: Event): void {\n    if (!this.isOpen()) return;\n    event.preventDefault();\n    this.navigate(-1);\n  }\n\n  private navigate(direction: number): void {\n    const list = this.formats();\n    if (list.length === 0) return;\n    const nextIdx = (this.focusedIndex() + direction + list.length) % list.length;\n    this.focusedIndex.set(nextIdx);\n\n    const buttons = this.menuBtns();\n    if (buttons && buttons[nextIdx]) {\n      buttons[nextIdx].nativeElement.focus();\n    }\n  }\n\n  @HostListener('document:click')\n  closeOnOutsideClick(): void {\n    this.isOpen.set(false);\n    this.focusedIndex.set(-1);\n  }\n\n  @HostListener('document:keydown.escape')\n  closeOnEscape(): void {\n    this.isOpen.set(false);\n    this.focusedIndex.set(-1);\n  }\n}\n","// Shared chart utilities and constants\n\nexport const CHART_COLORS = [\n  '#4a90d9', '#ff6358', '#27ae60', '#f39c12', '#8e44ad',\n  '#1abc9c', '#e74c3c', '#3498db', '#2ecc71', '#e67e22',\n];\n\nexport interface ChartSeries {\n  name: string;\n  data: number[];\n  color?: string;\n}\n\nexport interface ChartDataPoint {\n  label: string;\n  value: number;\n  color?: string;\n}\n\n/** Map a value [min..max] → [rangeMin..rangeMax] */\nexport function scale(value: number, min: number, max: number, rangeMin: number, rangeMax: number): number {\n  if (max === min) return rangeMin;\n  return rangeMin + ((value - min) / (max - min)) * (rangeMax - rangeMin);\n}\n\n/** Compute nice axis ticks for a range */\nexport function niceTicks(min: number, max: number, count = 5): number[] {\n  if (min === max) return [min];\n  const range = max - min;\n  const step = niceStep(range / count);\n  const start = Math.floor(min / step) * step;\n  const ticks: number[] = [];\n  for (let v = start; v <= max + step * 0.01; v += step) {\n    ticks.push(parseFloat(v.toFixed(10)));\n  }\n  return ticks;\n}\n\nfunction niceStep(step: number): number {\n  const mag = Math.pow(10, Math.floor(Math.log10(step)));\n  const frac = step / mag;\n  if (frac < 1.5) return mag;\n  if (frac < 3) return 2 * mag;\n  if (frac < 7) return 5 * mag;\n  return 10 * mag;\n}\n\n/** Smooth bezier path through points */\nexport function smoothPath(points: [number, number][]): string {\n  if (points.length < 2) return '';\n  let d = `M ${points[0][0]} ${points[0][1]}`;\n  for (let i = 1; i < points.length; i++) {\n    const prev = points[i - 1];\n    const curr = points[i];\n    const cpx = (prev[0] + curr[0]) / 2;\n    d += ` C ${cpx} ${prev[1]}, ${cpx} ${curr[1]}, ${curr[0]} ${curr[1]}`;\n  }\n  return d;\n}\n\n/** Format number for display */\nexport function fmtNum(n: number): string {\n  if (Math.abs(n) >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n  if (Math.abs(n) >= 1_000) return (n / 1_000).toFixed(1) + 'K';\n  return n % 1 === 0 ? n.toString() : n.toFixed(1);\n}\n\nexport function generateUniqueId(prefix: string): string {\n  return prefix + '-' + Math.random().toString(36).substring(2, 9);\n}\n\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject, DestroyRef, TemplateRef, output\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartSeries, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-bar-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-bar-chart\"\n      (mousemove)=\"onMouseMove($event)\"\n      (mouseleave)=\"onMouseLeave()\"\n    >\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend()) {\n        <div class=\"chart-legend\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"seriesColor(i)\"></span>\n              {{ s.name }}\n            </span>\n          }\n        </div>\n      }\n\n      <!-- SVG Chart -->\n      <svg\n        #svgEl\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"chartHeight()\"\n        class=\"chart-svg\"\n      >\n        <defs>\n          @for (s of series(); track s.name; let i = $index) {\n            <linearGradient [attr.id]=\"'bar-grad-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i)\" stop-opacity=\"1\"/>\n              <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i)\" stop-opacity=\"0.75\"/>\n            </linearGradient>\n          }\n        </defs>\n        <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n\n          <!-- Y axis grid lines + labels -->\n          @for (tick of yTicks(); track tick) {\n            <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n              @if (showGrid()) {\n                <line\n                  [attr.x1]=\"0\" [attr.x2]=\"innerW()\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\" stroke-dasharray=\"3,3\"\n                />\n              }\n              <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ labelFormatter() ? labelFormatter()!(tick) : fmtNum(tick) }}</text>\n            </g>\n          }\n\n          <!-- Reference Lines -->\n          @for (ref of referenceLines(); track ref.label) {\n            <g [attr.transform]=\"'translate(0,' + yPos(ref.value) + ')'\">\n              <line\n                [attr.x1]=\"0\" [attr.x2]=\"innerW()\"\n                [attr.stroke]=\"ref.color || '#ef4444'\"\n                [attr.stroke-dasharray]=\"ref.strokeDasharray || '4,4'\"\n                stroke-width=\"1.5\"\n              />\n              <text\n                [attr.x]=\"innerW() - 4\"\n                y=\"-6\"\n                class=\"reference-line-label\"\n                text-anchor=\"end\"\n                [attr.fill]=\"ref.color || '#ef4444'\"\n              >\n                {{ ref.label }}: {{ labelFormatter() ? labelFormatter()!(ref.value) : fmtNum(ref.value) }}\n              </text>\n            </g>\n          }\n\n          <!-- Column Highlight Ruler (Enterprise interactive UX) -->\n          @if (activeColumnIndex() !== null) {\n            <rect\n              [attr.x]=\"colStartX(activeColumnIndex()!)\"\n              [attr.y]=\"0\"\n              [attr.width]=\"groupW()\"\n              [attr.height]=\"innerH()\"\n              class=\"column-ruler\"\n            />\n          }\n\n          <!-- X axis category labels -->\n          @for (cat of categories(); track cat; let i = $index) {\n            <text\n              [attr.x]=\"catMidX(i)\"\n              [attr.y]=\"innerH() + 16\"\n              class=\"axis-label\"\n              text-anchor=\"middle\"\n            >{{ cat }}</text>\n          }\n\n          <!-- Bars -->\n          @for (s of series(); track s.name; let si = $index) {\n            @for (v of s.data; track $index; let ci = $index) {\n              @if (v !== null && v !== undefined) {\n                <rect\n                  [attr.x]=\"barX(ci, si)\"\n                  [attr.y]=\"barY(v)\"\n                  [attr.width]=\"singleBarWidth()\"\n                  [attr.height]=\"barH(v)\"\n                  [attr.fill]=\"s.color ? s.color : 'url(#bar-grad-' + si + ')'\"\n                  [attr.rx]=\"4\"\n                  class=\"bar-rect\"\n                  (click)=\"onBarClick(ci, si, v)\"\n                />\n                @if (showLabels() && animateState()) {\n                  <text\n                    [attr.x]=\"barX(ci, si) + singleBarWidth() / 2\"\n                    [attr.y]=\"barY(v) - 4\"\n                    class=\"bar-label\"\n                    text-anchor=\"middle\"\n                  >{{ labelFormatter() ? labelFormatter()!(v) : fmtNum(v) }}</text>\n                }\n              }\n            }\n          }\n\n          <!-- Axes -->\n          <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n        </g>\n      </svg>\n\n      <!-- Advanced Grouped Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.cat }}</div>\n            @for (row of t.rows; track row.name) {\n              <div class=\"tt-row\">\n                <span class=\"tt-dot\" [style.background]=\"row.color\"></span>\n                <span class=\"tt-name\">{{ row.name }}</span>\n                <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(row.value) : fmtNum(row.value) }}</span>\n              </div>\n            }\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-bar-chart { position: relative; background: var(--ngx-chart-bg, #fff); font-family: inherit; }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n    .chart-legend { display: flex; gap: 16px; padding: 4px 0 12px; flex-wrap: wrap; }\n    .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ngx-chart-axis-text, #6c757d); font-weight: 500; }\n    .legend-dot { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }\n    .chart-svg { display: block; overflow: visible; }\n    .axis-label { font-size: 11px; fill: var(--ngx-chart-axis-text, #6c757d); user-select: none; font-weight: 500; }\n    .column-ruler { fill: rgba(99, 102, 241, 0.03); stroke: rgba(99, 102, 241, 0.08); stroke-width: 1; rx: 6; ry: 6; pointer-events: none; transition: x 0.15s cubic-bezier(0.16, 1, 0.3, 1), width 0.15s cubic-bezier(0.16, 1, 0.3, 1); }\n    \n    .reference-line-label { font-size: 10px; font-weight: 700; user-select: none; }\n\n    .bar-rect {\n      cursor: pointer;\n      transition: y 0.5s cubic-bezier(0.16, 1, 0.3, 1), height 0.5s cubic-bezier(0.16, 1, 0.3, 1), fill-opacity 0.15s, stroke-width 0.15s;\n      stroke: #fff;\n      stroke-width: 0.5;\n    }\n    .bar-rect:hover {\n      fill-opacity: 0.9;\n      stroke-width: 1.5;\n      filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.08));\n    }\n    .bar-label { font-size: 11px; fill: var(--ngx-chart-axis-text, #6c757d); pointer-events: none; font-weight: 600; }\n    \n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-cat { font-weight: 700; margin-bottom: 8px; font-size: 12.5px; border-bottom: 1px solid rgba(255, 255, 255, 0.15); padding-bottom: 6px; color: #38bdf8; }\n    .tt-row { display: flex; align-items: center; gap: 8px; margin-top: 5px; }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }\n    .tt-name { color: rgba(248, 250, 252, 0.8); flex: 1; }\n    .tt-val { font-weight: 700; font-family: monospace; }\n\n    /* Export styles */\n    `]\n})\nexport class BarChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 12;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<ChartSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(260);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(false);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  stackMode = input<'none' | 'normal' | 'percent'>('none');\n  referenceLines = input<{ value: number; label: string; color?: string; strokeDasharray?: string }[]>([]);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  barClick = output<{ category: string; value: number; seriesName: string }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  animateState = signal(false);\n  activeColumnIndex = signal<number | null>(null);\n  containerWidth = signal<number>(600);\n\n  tooltip = signal<{ x: number; y: number; cat: string; rows: { name: string; value: number; color: string }[] } | null>(null);\n\n  chartHeight = computed(() => this.height());\n  innerW = computed(() => this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT);\n  innerH = computed(() => this.chartHeight() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  private allValues = computed(() => this.series().flatMap(s => s.data.filter(v => v != null)));\n  private yMin = computed(() => Math.min(0, ...this.allValues()));\n  private yMax = computed(() => Math.max(1, ...this.allValues()));\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    // Start growth load animations\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  yPos(v: number): number {\n    return scale(v, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  barY(v: number): number {\n    if (!this.animateState()) return this.yPos(0);\n    return Math.min(this.yPos(0), this.yPos(v));\n  }\n\n  barH(v: number): number {\n    if (!this.animateState()) return 0;\n    return Math.abs(this.yPos(0) - this.yPos(v));\n  }\n\n  groupW = computed(() => this.categories().length > 0 ? this.innerW() / this.categories().length : 0);\n  \n  singleBarWidth = computed(() => {\n    const n = this.series().length || 1;\n    return Math.max(4, (this.groupW() - 8) / n);\n  });\n\n  catMidX(i: number): number { return i * this.groupW() + this.groupW() / 2; }\n  \n  barX(ci: number, si: number): number {\n    const n = this.series().length;\n    const gx = ci * this.groupW() + 4;\n    return gx + si * this.singleBarWidth();\n  }\n\n  colStartX(i: number): number {\n    return i * this.groupW();\n  }\n\n  seriesColor(i: number): string { return this.colors()[i % this.colors().length]; }\n  barColor(si: number, s: ChartSeries): string { return s.color || this.seriesColor(si); }\n\n  onMouseMove(event: MouseEvent): void {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.PAD_LEFT;\n    const cats = this.categories();\n    if (cats.length === 0) return;\n\n    // Determine hover category column index\n    const idx = Math.floor(mx / this.groupW());\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n\n    this.activeColumnIndex.set(ci);\n\n    const rows = this.series().map((s, si) => ({\n      name: s.name,\n      value: s.data[ci] ?? 0,\n      color: this.barColor(si, s),\n    }));\n\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      cat: cats[ci],\n      rows\n    });\n  }\n\n  onBarClick(ci: number, si: number, v: number): void {\n    const s = this.series()[si];\n    const cats = this.categories();\n    this.barClick.emit({\n      category: cats[ci] ?? '',\n      value: v,\n      seriesName: s?.name ?? ''\n    });\n  }\n\n  onMouseLeave(): void {\n    this.activeColumnIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const data = cats.map((cat, ci) => {\n      const entry: Record<string, any> = { category: cat };\n      sers.forEach(s => {\n        if (s.data[ci] !== undefined && s.data[ci] !== null) {\n          entry[s.name] = s.data[ci];\n        }\n      });\n      return entry;\n    });\n    this.exportSvc.downloadJson(data, 'bar-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const headers = ['Category', ...sers.map(s => s.name)];\n    const rows: (string | number)[][] = cats.map((cat, ci) => [cat, ...sers.map(s => s.data[ci] ?? '')]);\n    this.exportSvc.downloadCsv(headers, rows, 'bar-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, inject, DestroyRef, TemplateRef, output\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartSeries, niceTicks, scale, smoothPath, fmtNum, generateUniqueId } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-line-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-line-chart\"\n      (mousemove)=\"onMouseMove($event)\"\n      (mouseleave)=\"onMouseLeave()\"\n    >\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend()) {\n        <div class=\"chart-legend\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-line\" [style.background]=\"seriesColor(i, s)\"></span>\n              {{ s.name }}\n            </span>\n          }\n        </div>\n      }\n\n      <!-- Reset Zoom Floating Button -->\n      @if (zoomScale() !== 1 || panOffset().x !== 0 || panOffset().y !== 0) {\n        <button class=\"reset-zoom-btn\" (click)=\"resetZoom()\" type=\"button\">Reset Zoom</button>\n      }\n\n      <!-- SVG Chart -->\n      <svg\n        #svgEl\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"chartHeight()\"\n        class=\"chart-svg\"\n        (wheel)=\"onWheel($event)\"\n        (mousedown)=\"onMouseDown($event)\"\n        (mousemove)=\"onSvgMouseMove($event)\"\n        (mouseup)=\"onMouseUp()\"\n        (mouseleave)=\"onMouseLeaveChart()\"\n        [class.zoom-active]=\"zoomEnabled() || panEnabled()\"\n        [class.panning]=\"isPanning\"\n      >\n        <defs>\n          @for (s of series(); track s.name; let i = $index) {\n            <linearGradient [attr.id]=\"instanceId + '-area-grad-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.3\"/>\n              <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.02\"/>\n            </linearGradient>\n          }\n        </defs>\n        <g [attr.transform]=\"'translate(' + (PAD_LEFT + panOffset().x) + ',' + (PAD_TOP + panOffset().y) + ') scale(' + zoomScale() + ')'\">\n\n          <!-- Y axis ticks and gridlines -->\n          @for (tick of yTicks(); track tick) {\n            <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n              @if (showGrid()) {\n                <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" stroke=\"var(--ngx-chart-grid,#ebedf0)\" stroke-dasharray=\"3,3\"/>\n              }\n              <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ labelFormatter() ? labelFormatter()!(tick) : fmtNum(tick) }}</text>\n            </g>\n          }\n\n          <!-- Reference Lines -->\n          @for (ref of referenceLines(); track ref.label) {\n            <g [attr.transform]=\"'translate(0,' + yPos(ref.value) + ')'\">\n              <line\n                [attr.x1]=\"0\" [attr.x2]=\"innerW()\"\n                [attr.stroke]=\"ref.color || '#ef4444'\"\n                [attr.stroke-dasharray]=\"ref.strokeDasharray || '4,4'\"\n                stroke-width=\"1.5\"\n              />\n              <text\n                [attr.x]=\"innerW() - 4\"\n                y=\"-6\"\n                class=\"reference-line-label\"\n                text-anchor=\"end\"\n                [attr.fill]=\"ref.color || '#ef4444'\"\n              >\n                {{ ref.label }}: {{ labelFormatter() ? labelFormatter()!(ref.value) : fmtNum(ref.value) }}\n              </text>\n            </g>\n          }\n\n          <!-- X axis category labels -->\n          @for (cat of categories(); track cat; let i = $index) {\n            <text [attr.x]=\"xPos(i)\" [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ cat }}</text>\n          }\n\n          <!-- Lines and Areas -->\n          @for (s of series(); track s.name; let si = $index) {\n            @if (showArea()) {\n              <path\n                [attr.d]=\"areaPath(s)\"\n                [attr.fill]=\"'url(#' + instanceId + '-area-grad-' + si + ')'\"\n                stroke=\"none\"\n                class=\"area-path\"\n              />\n            }\n            <path\n              [attr.d]=\"linePath(s)\"\n              [attr.stroke]=\"seriesColor(si, s)\"\n              fill=\"none\"\n              stroke-width=\"2.5\"\n              stroke-linejoin=\"round\"\n              stroke-linecap=\"round\"\n              class=\"line-path\"\n            />\n            @if (showMarkers() && animateState()) {\n              @for (v of s.data; track $index; let ci = $index) {\n                <circle\n                  [attr.cx]=\"xPos(ci)\"\n                  [attr.cy]=\"yPos(v)\"\n                  [attr.r]=\"activeCategoryIndex() === ci ? 6 : 4\"\n                  [attr.fill]=\"seriesColor(si, s)\"\n                  [attr.stroke]=\"activeCategoryIndex() === ci ? '#fff' : '#fff'\"\n                  [attr.stroke-width]=\"activeCategoryIndex() === ci ? 2.5 : 2\"\n                  [attr.filter]=\"activeCategoryIndex() === ci ? 'drop-shadow(0 2px 4px rgba(0,0,0,0.25))' : null\"\n                  class=\"marker-dot\"\n                  (click)=\"onPointClick(ci, si, v)\"\n                />\n                @if (showLabels() && animateState()) {\n                  <text\n                    [attr.x]=\"xPos(ci)\"\n                    [attr.y]=\"yPos(v) - 8\"\n                    class=\"line-label\"\n                    text-anchor=\"middle\"\n                  >{{ labelFormatter() ? labelFormatter()!(v) : fmtNum(v) }}</text>\n                }\n              }\n            }\n          }\n\n          <!-- Crosshair -->\n          @if (crosshair(); as ch) {\n            <line [attr.x1]=\"ch.x\" [attr.x2]=\"ch.x\" y1=\"0\" [attr.y2]=\"innerH()\"\n              stroke=\"var(--ngx-chart-axis,#ced4da)\" stroke-dasharray=\"4,3\" class=\"chart-crosshair\"/>\n          }\n\n          <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\"/>\n          <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\"/>\n        </g>\n      </svg>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.cat }}</div>\n            @for (row of t.rows; track row.name) {\n              <div class=\"tt-row\">\n                <span class=\"tt-dot\" [style.background]=\"row.color\"></span>\n                <span class=\"tt-name\">{{ row.name }}</span>\n                <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(row.value) : fmtNum(row.value) }}</span>\n              </div>\n            }\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-line-chart { position: relative; background: var(--ngx-chart-bg, #fff); }\n    .reset-zoom-btn {\n      position: absolute;\n      top: 40px;\n      right: 12px;\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid rgba(0, 0, 0, 0.1);\n      padding: 6px 12px;\n      border-radius: 20px;\n      font-size: 11px;\n      font-weight: 600;\n      color: #334155;\n      cursor: pointer;\n      box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n      transition: all 0.2s;\n      z-index: 10;\n    }\n    .reset-zoom-btn:hover {\n      background: rgba(255, 255, 255, 0.9);\n      transform: translateY(-1px);\n    }\n    .ngx-line-chart.dark-mode .reset-zoom-btn {\n      background: rgba(30, 41, 59, 0.7);\n      border-color: rgba(255, 255, 255, 0.1);\n      color: #f1f5f9;\n    }\n    .chart-svg.panning {\n      cursor: grabbing !important;\n    }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n    .chart-legend { display: flex; gap: 16px; padding: 4px 0 12px; flex-wrap: wrap; }\n    .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .legend-line { width: 18px; height: 4px; border-radius: 2px; display: inline-block; }\n    .chart-svg { display: block; overflow: visible; cursor: crosshair; }\n    .axis-label { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); user-select: none; font-weight: 500; }\n    .chart-crosshair { transition: x1 0.12s cubic-bezier(0.16, 1, 0.3, 1), x2 0.12s cubic-bezier(0.16, 1, 0.3, 1); }\n    .reference-line-label { font-size: 10px; font-weight: 700; user-select: none; }\n    .line-label { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); pointer-events: none; font-weight: 600; }\n    .marker-dot { cursor: pointer; }\n\n    /* Keyframe Line draw transition */\n    @keyframes lineDraw {\n      from { stroke-dashoffset: 1200; }\n      to { stroke-dashoffset: 0; }\n    }\n    .line-path {\n      stroke-dasharray: 1200;\n      stroke-dashoffset: 1200;\n      animation: lineDraw 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    \n    @keyframes areaFadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .area-path {\n      animation: areaFadeIn 1s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both;\n    }\n\n    .marker-dot {\n      animation: areaFadeIn 0.5s ease 0.8s both;\n      transition: r 0.15s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.15s;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-cat { font-weight: 700; margin-bottom: 8px; font-size: 12.5px; border-bottom: 1px solid rgba(255, 255, 255, 0.15); padding-bottom: 6px; color: #38bdf8; }\n    .tt-row { display: flex; align-items: center; gap: 8px; margin-top: 5px; }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }\n    .tt-name { color: rgba(248, 250, 252, 0.8); flex: 1; }\n    .tt-val { font-weight: 700; font-family: monospace; }\n\n    /* Export styles removed */\n  `]\n})\nexport class LineChartComponent {\n  readonly instanceId = generateUniqueId('chart');\n  private readonly exportSvc = inject(ChartExportService);\n\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 12;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<ChartSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(260);\n  showGrid = input<boolean>(true);\n  showArea = input<boolean>(false);\n  showMarkers = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showLabels = input<boolean>(false);\n  referenceLines = input<{ value: number; label: string; color?: string; strokeDasharray?: string }[]>([]);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  zoomEnabled = input<boolean>(false);\n  panEnabled = input<boolean>(false);\n\n  pointClick = output<{ category: string; value: number; seriesName: string }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  animateState = signal(false);\n  containerWidth = signal<number>(600);\n  zoomScale = signal<number>(1);\n  panOffset = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n\n  crosshair = signal<{ x: number } | null>(null);\n  activeCategoryIndex = signal<number | null>(null);\n  tooltip = signal<{ x: number; y: number; cat: string; rows: {name:string;value:number;color:string}[] } | null>(null);\n\n  chartHeight = computed(() => this.height());\n  innerW = computed(() => this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT);\n  innerH = computed(() => this.chartHeight() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  private allValues = computed(() => this.series().flatMap(s => s.data));\n  private yMin = computed(() => Math.min(0, ...this.allValues()));\n  private yMax = computed(() => Math.max(1, ...this.allValues()));\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  yPos(v: number): number { return scale(v, this.yMin(), this.yMax(), this.innerH(), 0); }\n  xPos(i: number): number {\n    const n = this.categories().length;\n    return n <= 1 ? this.innerW() / 2 : scale(i, 0, n - 1, 0, this.innerW());\n  }\n\n  seriesColor(i: number, s: ChartSeries): string { return s.color || this.colors()[i % this.colors().length]; }\n\n  linePath(s: ChartSeries): string {\n    const pts: [number, number][] = s.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    return smoothPath(pts);\n  }\n\n  areaPath(s: ChartSeries): string {\n    const pts: [number, number][] = s.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    const line = smoothPath(pts);\n    const last = pts[pts.length - 1];\n    const first = pts[0];\n    return line + ` L ${last[0]} ${this.innerH()} L ${first[0]} ${this.innerH()} Z`;\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    if (this.isPanning) return;\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = (event.clientX - rect.left - this.PAD_LEFT - this.panOffset().x) / this.zoomScale();\n    const cats = this.categories();\n    if (cats.length === 0) return;\n    const idx = Math.round(scale(mx, 0, this.innerW(), 0, cats.length - 1));\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n    this.crosshair.set({ x: this.xPos(ci) });\n    this.activeCategoryIndex.set(ci);\n    const rows = this.series().map((s, si) => ({\n      name: s.name,\n      value: s.data[ci] ?? 0,\n      color: this.seriesColor(si, s),\n    }));\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      cat: cats[ci],\n      rows,\n    });\n  }\n\n  isPanning = false;\n  panStart = { x: 0, y: 0 };\n\n  onWheel(event: WheelEvent): void {\n    if (!this.zoomEnabled()) return;\n    event.preventDefault();\n    \n    const zoomFactor = 1.1;\n    let newScale = this.zoomScale();\n    if (event.deltaY < 0) {\n      newScale = Math.min(5, newScale * zoomFactor);\n    } else {\n      newScale = Math.max(1, newScale / zoomFactor);\n    }\n    \n    const rect = this.svgEl()?.nativeElement.getBoundingClientRect();\n    if (rect && newScale !== this.zoomScale()) {\n      const mouseX = event.clientX - rect.left - this.PAD_LEFT;\n      const mouseY = event.clientY - rect.top - this.PAD_TOP;\n      \n      const prevScale = this.zoomScale();\n      const dx = mouseX - this.panOffset().x;\n      const dy = mouseY - this.panOffset().y;\n      \n      const newX = mouseX - dx * (newScale / prevScale);\n      const newY = mouseY - dy * (newScale / prevScale);\n      \n      this.zoomScale.set(newScale);\n      this.panOffset.set({ x: newScale === 1 ? 0 : newX, y: newScale === 1 ? 0 : newY });\n    }\n  }\n\n  onMouseDown(event: MouseEvent): void {\n    if (!this.panEnabled() || this.zoomScale() === 1) return;\n    this.isPanning = true;\n    this.panStart = {\n      x: event.clientX - this.panOffset().x,\n      y: event.clientY - this.panOffset().y\n    };\n  }\n\n  onSvgMouseMove(event: MouseEvent): void {\n    if (this.isPanning) {\n      const newX = event.clientX - this.panStart.x;\n      const newY = event.clientY - this.panStart.y;\n      this.panOffset.set({ x: newX, y: newY });\n    }\n  }\n\n  onMouseUp(): void {\n    this.isPanning = false;\n  }\n\n  onMouseLeaveChart(): void {\n    this.isPanning = false;\n  }\n\n  resetZoom(): void {\n    this.zoomScale.set(1);\n    this.panOffset.set({ x: 0, y: 0 });\n  }\n\n  onPointClick(ci: number, si: number, v: number): void {\n    const s = this.series()[si];\n    const cats = this.categories();\n    this.pointClick.emit({\n      category: cats[ci] ?? '',\n      value: v,\n      seriesName: s?.name ?? ''\n    });\n  }\n\n  onMouseLeave(): void {\n    this.crosshair.set(null);\n    this.activeCategoryIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const headers = ['Category', ...sers.map(s => s.name)];\n    const rows = cats.map((cat, ci) => [cat, ...sers.map(s => s.data[ci] ?? '')] as (string | number)[]);\n    this.exportSvc.downloadCsv(headers, rows, 'line-chart-data.csv');\n  }\n\n  exportToJson(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const data = cats.map((cat, ci) => {\n      const entry: Record<string, string | number> = { category: cat };\n      sers.forEach(s => { if (s.data[ci] !== undefined && s.data[ci] !== null) entry[s.name] = s.data[ci]; });\n      return entry;\n    });\n    this.exportSvc.downloadJson(data, 'line-chart-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'line-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Line Chart', 'line-chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject, DestroyRef\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartDataPoint, fmtNum } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-pie-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-pie-chart\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + height() + ' ' + height()\"\n          [attr.width]=\"height()\"\n          [attr.height]=\"height()\"\n        >\n          <g [attr.transform]=\"'translate(' + cx() + ',' + cy() + ')'\" class=\"pie-group\">\n            @for (slice of slices(); track slice.index) {\n              <path\n                [attr.d]=\"slice.path\"\n                [attr.fill]=\"slice.color\"\n                [attr.stroke]=\"'#fff'\"\n                stroke-width=\"2\"\n                class=\"pie-slice\"\n                [class.hovered]=\"hovered() === slice.index\"\n                [style.transform]=\"hovered() === slice.index ? 'translate(' + (slice.cos * 8) + 'px,' + (slice.sin * 8) + 'px)' : 'translate(0, 0)'\"\n                (mouseenter)=\"hovered.set(slice.index); onSliceHover($event, slice)\"\n                (mouseleave)=\"hovered.set(-1); tooltip.set(null)\"\n              />\n              @if (showLabels() && slice.midAngle !== null) {\n                <text\n                  [attr.x]=\"labelX(slice)\"\n                  [attr.y]=\"labelY(slice)\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                  class=\"slice-label\"\n                >{{ slice.pct }}%</text>\n              }\n            }\n            <!-- Donut hole -->\n            @if (mode() === 'donut') {\n              <text class=\"donut-center-text\" text-anchor=\"middle\" dy=\"-8\">{{ centerTitle() }}</text>\n              <text class=\"donut-center-value\" text-anchor=\"middle\" dy=\"14\">{{ centerValue() }}</text>\n            }\n          </g>\n        </svg>\n\n        @if (showLegend()) {\n          <div class=\"chart-legend\">\n            @for (slice of slices(); track slice.index) {\n              <div class=\"legend-item\" (mouseenter)=\"hovered.set(slice.index)\" (mouseleave)=\"hovered.set(-1)\">\n                <span class=\"legend-dot\" [style.background]=\"slice.color\"></span>\n                <span class=\"legend-label\">{{ slice.label }}</span>\n                <span class=\"legend-pct\">{{ slice.pct }}%</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n          <strong>{{ t.label }}</strong>: {{ fmtNum(t.value) }} ({{ t.pct }}%)\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-pie-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 24px;\n      flex-wrap: wrap;\n    }\n    /* SVG uses explicit width/height attrs for intrinsic size;\n       max-width: 100% + min-width: 0 lets it shrink inside flex. */\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n      animation: pieGrow 0.75s cubic-bezier(0.16, 1, 0.3, 1) both;\n      transform-origin: center;\n    }\n\n    @keyframes pieGrow {\n      from { transform: scale(0.4) rotate(-90deg); opacity: 0; }\n      to { transform: scale(1) rotate(0); opacity: 1; }\n    }\n    .pie-group {\n      transform-origin: center;\n    }\n\n    .pie-slice {\n      cursor: pointer;\n      transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), fill-opacity 0.15s;\n      transform-origin: 0px 0px;\n    }\n    .pie-slice.hovered { fill-opacity: 0.95; filter: drop-shadow(0 6px 10px rgba(0,0,0,0.16)); }\n    .slice-label { font-size: 11px; fill: #fff; font-weight: 600; pointer-events: none; user-select: none; }\n    .donut-center-text { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; }\n    .donut-center-value { font-size: 24px; font-weight: 900; fill: var(--ngx-chart-text,#0f172a); }\n    .chart-legend { display: flex; flex-direction: column; gap: 6px; flex-shrink: 0; }\n    .legend-item { display: flex; align-items: center; gap: 8px; font-size: 12px; cursor: pointer; padding: 5px 10px; border-radius: 8px; transition: all 0.15s; }\n    .legend-item:hover { background: var(--ngx-chart-grid,#f1f3f5); }\n    .legend-dot { width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; }\n    .legend-label { flex: 1; color: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .legend-pct { font-weight: 600; color: var(--ngx-chart-text,#212529); }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex; align-items: center; gap: 6px;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; }\n\n\n  `]\n})\nexport class PieChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<ChartDataPoint[]>([]);\n  mode = input<'pie' | 'donut'>('pie');\n  donutHoleSize = input<number>(0.55);\n  height = input<number>(240);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  centerTitle = input<string>('Total');\n  centerValueOverride = input<string | null>(null, { alias: 'centerValue' });\n  showExport = input<boolean>(false);\n  drillData = input<Map<string, ChartDataPoint[]>>(new Map());\n  enableDrillDown = input<boolean>(false);\n  colors$ = this.colors;\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n\n  hovered = signal(-1);\n  tooltip = signal<{x:number;y:number;label:string;value:number;pct:number;color:string}|null>(null);\n\n  svgSize = computed(() => this.height());\n  cx = computed(() => this.svgSize() / 2);\n  cy = computed(() => this.svgSize() / 2);\n  radius = computed(() => this.svgSize() / 2 - 10);\n  holeR = computed(() => this.radius() * this.donutHoleSize());\n\n  constructor() {}\n\n  centerValue = computed(() => {\n    const override = this.centerValueOverride();\n    if (override !== null) return override;\n    const total = this.data().reduce((s, d) => s + d.value, 0);\n    return fmtNum(total);\n  });\n\n  slices = computed(() => {\n    const d = this.data();\n    const total = d.reduce((s, x) => s + x.value, 0) || 1;\n    let start = -Math.PI / 2;\n    return d.map((item, i) => {\n      const frac = item.value / total;\n      let angle = frac * Math.PI * 2;\n      // Cap angle slightly if it is a full circle to prevent coinciding SVG endpoints\n      if (frac >= 0.999) {\n        angle = Math.PI * 2 - 0.0001;\n      }\n      const end = start + angle;\n      const mid = start + angle / 2;\n      const r = this.radius();\n      const path = this.mode() === 'donut'\n        ? this.ringPath(start, end, r, this.holeR())\n        : this.arcPath(start, end, r);\n      const cos = Math.cos(mid);\n      const sin = Math.sin(mid);\n      start = end;\n      return {\n        index: i,\n        label: item.label,\n        value: item.value,\n        pct: Math.round(frac * 100),\n        color: item.color || this.colors()[i % this.colors().length],\n        path,\n        midAngle: mid,\n        cos,\n        sin,\n      };\n    });\n  });\n\n  private arcPath(startAngle: number, endAngle: number, r: number): string {\n    const x1 = Math.cos(startAngle) * r;\n    const y1 = Math.sin(startAngle) * r;\n    const x2 = Math.cos(endAngle) * r;\n    const y2 = Math.sin(endAngle) * r;\n    const large = endAngle - startAngle > Math.PI ? 1 : 0;\n    return `M 0 0 L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`;\n  }\n\n  private ringPath(startAngle: number, endAngle: number, outerR: number, innerR: number): string {\n    const ox1 = Math.cos(startAngle) * outerR;\n    const oy1 = Math.sin(startAngle) * outerR;\n    const ox2 = Math.cos(endAngle) * outerR;\n    const oy2 = Math.sin(endAngle) * outerR;\n\n    const ix1 = Math.cos(startAngle) * innerR;\n    const iy1 = Math.sin(startAngle) * innerR;\n    const ix2 = Math.cos(endAngle) * innerR;\n    const iy2 = Math.sin(endAngle) * innerR;\n\n    const large = endAngle - startAngle > Math.PI ? 1 : 0;\n    return `M ${ix1} ${iy1} L ${ox1} ${oy1} A ${outerR} ${outerR} 0 ${large} 1 ${ox2} ${oy2} L ${ix2} ${iy2} A ${innerR} ${innerR} 0 ${large} 0 ${ix1} ${iy1} Z`;\n  }\n\n  labelX(s: {midAngle:number}): number {\n    const r = this.mode() === 'donut' ? (this.radius() + this.holeR()) / 2 : this.radius() * 0.7;\n    return Math.cos(s.midAngle) * r;\n  }\n  labelY(s: {midAngle:number}): number {\n    const r = this.mode() === 'donut' ? (this.radius() + this.holeR()) / 2 : this.radius() * 0.7;\n    return Math.sin(s.midAngle) * r;\n  }\n\n  onSliceHover(event: MouseEvent, slice: {label:string;value:number;pct:number;color:string}): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-pie-chart') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      ...slice,\n    });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'pie-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Value'];\n    const rows = data.map(d => [d.label, d.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'pie-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import { Component, ChangeDetectionStrategy, input, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, scale, smoothPath } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-sparkline',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <svg\n      [attr.width]=\"width()\"\n      [attr.height]=\"height()\"\n      class=\"ngx-sparkline\"\n      [attr.aria-label]=\"'Sparkline'\"\n      (mousemove)=\"onMouseMove($event)\"\n      (mouseleave)=\"hoveredIndex.set(null)\"\n    >\n      <defs>\n        <linearGradient id=\"sparkline-grad\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n          <stop offset=\"0%\" [attr.stop-color]=\"color()\" stop-opacity=\"0.32\" />\n          <stop offset=\"100%\" [attr.stop-color]=\"color()\" stop-opacity=\"0\" />\n        </linearGradient>\n      </defs>\n\n      @if (type() === 'line' || type() === 'area') {\n        @if (type() === 'area') {\n          <path [attr.d]=\"areaPath()\" fill=\"url(#sparkline-grad)\" stroke=\"none\" class=\"sparkline-area\"/>\n        }\n        <path\n          [attr.d]=\"linePath()\"\n          [attr.stroke]=\"color()\"\n          fill=\"none\"\n          stroke-width=\"2\"\n          stroke-linejoin=\"round\"\n          stroke-linecap=\"round\"\n          class=\"sparkline-path\"\n        />\n        <!-- End dot (if not hovered) -->\n        @if (endPoint(); as ep) {\n          @if (hoveredIndex() === null) {\n            <circle [attr.cx]=\"ep[0]\" [attr.cy]=\"ep[1]\" r=\"3\" [attr.fill]=\"color()\" class=\"end-dot\"/>\n          }\n        }\n      }\n      @if (type() === 'bar') {\n        @for (item of barItems(); track $index; let idx = $index) {\n          <rect\n            [attr.x]=\"item.x\"\n            [attr.y]=\"item.y\"\n            [attr.width]=\"item.w\"\n            [attr.height]=\"item.h\"\n            [attr.fill]=\"color()\"\n            [attr.rx]=\"1\"\n            [class.hovered]=\"hoveredIndex() === idx\"\n            [style.animation-delay]=\"(idx * 0.02) + 's'\"\n            class=\"sparkline-bar\"\n          />\n        }\n      }\n\n      <!-- Interactive Tracker overlay -->\n      @if (activePoint(); as ap) {\n        <!-- Vertical guide line -->\n        <line\n          [attr.x1]=\"ap[0]\"\n          [attr.x2]=\"ap[0]\"\n          [attr.y1]=\"PAD\"\n          [attr.y2]=\"PAD + h()\"\n          stroke=\"rgba(100, 116, 139, 0.25)\"\n          stroke-width=\"1.2\"\n          stroke-dasharray=\"2,2\"\n          class=\"tracker-line\"\n        />\n        <!-- Outer glowing ring -->\n        <circle\n          [attr.cx]=\"ap[0]\"\n          [attr.cy]=\"ap[1]\"\n          r=\"5\"\n          [attr.fill]=\"color()\"\n          fill-opacity=\"0.25\"\n          class=\"tracker-ring\"\n        />\n        <!-- Inner solid dot -->\n        <circle\n          [attr.cx]=\"ap[0]\"\n          [attr.cy]=\"ap[1]\"\n          r=\"2.5\"\n          [attr.fill]=\"color()\"\n          stroke=\"#ffffff\"\n          stroke-width=\"1\"\n          class=\"tracker-dot\"\n        />\n      }\n    </svg>\n  `,\n  styles: [`\n    :host {\n      display: inline-block;\n    }\n    .ngx-sparkline {\n      display: block;\n      overflow: visible;\n      cursor: crosshair;\n    }\n\n    @keyframes lineDraw {\n      from { stroke-dashoffset: 400; }\n      to { stroke-dashoffset: 0; }\n    }\n    .sparkline-path {\n      stroke-dasharray: 400;\n      stroke-dashoffset: 400;\n      animation: lineDraw 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n\n    @keyframes areaFade {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .sparkline-area {\n      animation: areaFade 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.2s both;\n    }\n\n    .end-dot {\n      animation: areaFade 0.4s ease-out 0.8s both;\n    }\n\n    .sparkline-bar {\n      opacity: 0.85;\n      transition: opacity 0.2s, fill 0.2s;\n      animation: areaFade 0.4s ease-out both;\n    }\n    .sparkline-bar:hover, .sparkline-bar.hovered {\n      opacity: 1;\n      filter: brightness(1.1);\n    }\n\n    .tracker-line {\n      pointer-events: none;\n    }\n    .tracker-ring {\n      pointer-events: none;\n      animation: trackerPulse 1.5s infinite alternate;\n    }\n    .tracker-dot {\n      pointer-events: none;\n    }\n\n    @keyframes trackerPulse {\n      from { r: 4.5px; fill-opacity: 0.2; }\n      to { r: 6.5px; fill-opacity: 0.4; }\n    }\n  `]\n})\nexport class SparklineComponent {\n  data = input<number[]>([]);\n  type = input<'line' | 'bar' | 'area'>('line');\n  color = input<string>(CHART_COLORS[0]);\n  width = input<number>(120);\n  height = input<number>(36);\n\n  PAD = 2;\n\n  w = computed(() => this.width() - this.PAD * 2);\n  h = computed(() => this.height() - this.PAD * 2);\n\n  hoveredIndex = signal<number | null>(null);\n\n  private yMin = computed(() => Math.min(...this.data(), 0));\n  private yMax = computed(() => Math.max(...this.data(), 1));\n\n  pts = computed<[number, number][]>(() => {\n    const d = this.data();\n    const n = d.length;\n    if (n === 0) return [];\n    return d.map((v, i) => [\n      this.PAD + scale(i, 0, Math.max(n - 1, 1), 0, this.w()),\n      this.PAD + scale(v, this.yMin(), this.yMax(), this.h(), 0),\n    ]);\n  });\n\n  linePath = computed(() => smoothPath(this.pts()));\n\n  areaPath = computed(() => {\n    const pts = this.pts();\n    if (pts.length < 2) return '';\n    const line = smoothPath(pts);\n    const last = pts[pts.length - 1];\n    const first = pts[0];\n    const bottom = this.PAD + this.h();\n    return line + ` L ${last[0]} ${bottom} L ${first[0]} ${bottom} Z`;\n  });\n\n  endPoint = computed<[number, number] | null>(() => {\n    const pts = this.pts();\n    return pts.length > 0 ? pts[pts.length - 1] : null;\n  });\n\n  activePoint = computed(() => {\n    const idx = this.hoveredIndex();\n    if (this.type() === 'bar') return null; // Dot tracking only for lines/areas\n    return idx !== null && this.pts()[idx] ? this.pts()[idx] : null;\n  });\n\n  barItems = computed(() => {\n    const d = this.data();\n    const n = d.length;\n    if (n === 0) return [];\n    const bw = Math.max(2, this.w() / n - 1);\n    const zero = this.PAD + scale(0, this.yMin(), this.yMax(), this.h(), 0);\n    return d.map((v, i) => {\n      const x = this.PAD + scale(i, 0, Math.max(n - 1, 1), 0, this.w()) - bw / 2;\n      const y = this.PAD + scale(v, this.yMin(), this.yMax(), this.h(), 0);\n      return { x, y, w: bw, h: Math.abs(zero - y) };\n    });\n  });\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const rect = el.getBoundingClientRect();\n    const x = event.clientX - rect.left - this.PAD;\n    const n = this.data().length;\n    if (n === 0) return;\n    const idx = Math.max(0, Math.min(n - 1, Math.round(scale(x, 0, this.w(), 0, n - 1))));\n    this.hoveredIndex.set(idx);\n  }\n}\n","export interface GanttTooltipContext {\n  task: GanttTask;\n  subtask?: GanttSubtask;\n}\n\nexport enum GanttItemType {\n  Bar = 'bar',\n  Range = 'range',\n  Custom = 'custom',\n}\n\nexport interface GanttSubtask {\n  id: string;\n  name: string;\n  start: Date;\n  end: Date;\n  color: string;\n  description?: string;\n  progress?: number;\n  meta?: Record<string, unknown>;\n  cssClass?: string;\n}\n\nexport interface GanttTask {\n  id: string;\n  name: string;\n  start: Date;\n  end: Date;\n  progress: number;\n  parentId: string | null;\n  collapsed: boolean;\n  isMilestone: boolean;\n  color?: string;\n  meta?: Record<string, unknown>;\n  draggable?: boolean;\n  cssClass?: string;\n  /** Tasks sharing the same rowId (and the same parentId) are rendered in a single row. */\n  rowId?: string;\n  /** Subtasks rendered as colored segments inside this task's bar. */\n  subtasks?: GanttSubtask[];\n  /** Group ID for group mode — tasks with same group_id are grouped together. */\n  group_id?: string;\n  /** Whether this specific item can be dragged in the sidebar table. */\n  itemDraggable?: boolean;\n  /** Whether dependency links can be created from/to this task. Defaults to true when linkable is enabled. */\n  linkable?: boolean;\n  /** Whether the task can be expanded to show children (auto-detected from children/parentId). */\n  expandable?: boolean;\n  /** Item display type: bar (default), range, or custom. */\n  type?: GanttItemType;\n  /** Custom style overrides for the task bar element. */\n  barStyle?: Partial<CSSStyleDeclaration>;\n  /** Custom style overrides for the task's lane (row background). */\n  laneStyle?: Partial<CSSStyleDeclaration>;\n  /** Dependency links defined on this item (alternative to top-level dependencies input). */\n  links?: (string | { type: 'FS' | 'SS' | 'FF' | 'SF'; link: string; color?: string })[];\n  /** Children items for tree hierarchy (alternative to parentId). */\n  children?: GanttTask[];\n}\n","export enum DependencyType {\n  FinishToStart = 'FS',\n  StartToStart = 'SS',\n  FinishToFinish = 'FF',\n  StartToFinish = 'SF',\n}\n\nexport interface GanttDependency {\n  fromId: string;\n  toId: string;\n  type: DependencyType;\n  color?: string | { default: string; active?: string };\n  cssClass?: string;\n}\n","import { GanttTask } from './gantt-task.model';\n\nexport enum ZoomLevel {\n  Hour = 'hour',\n  Day = 'day',\n  Week = 'week',\n  Month = 'month',\n  Quarter = 'quarter',\n  Year = 'year',\n}\n\nexport enum GanttLinkLineType {\n  Curve = 'curve',\n  Straight = 'straight',\n}\n\nexport interface GanttLinkOptions {\n  dependencyTypes?: ('FS' | 'SS' | 'FF' | 'SF')[];\n  showArrow?: boolean;\n  lineType?: GanttLinkLineType;\n}\n\nexport interface GanttToolbarOptions {\n  viewTypes?: ZoomLevel[];\n}\n\nexport interface GanttThemeColors {\n  primary?: string;\n  danger?: string;\n  highlight?: string;\n  background?: string;\n  text?: {\n    main?: string;\n    muted?: string;\n    light?: string;\n    inverse?: string;\n  };\n  gray?: {\n    100?: string;\n    200?: string;\n    300?: string;\n    400?: string;\n    500?: string;\n    600?: string;\n  };\n}\n\nexport interface GanttStyleOptions {\n  primaryColor?: string;\n  headerHeight?: number;\n  rowHeight?: number;\n  barHeight?: number;\n  defaultTheme?: string;\n  themes?: Record<string, GanttThemeColors>;\n}\n\nexport interface GanttColumnDef {\n  field: string | ((task: GanttTask) => string);\n  header: string;\n  width: number;\n}\n\nexport interface GanttConfig {\n  zoomLevel: ZoomLevel;\n  rowHeight: number;\n  columnWidth: number;\n  sidebarColumns: GanttColumnDef[];\n  sidebarWidth: number;\n  showTodayMarker: boolean;\n  showGrid: boolean;\n  collapsible: boolean;\n  headerHeight: number;\n  snapTo: 'none' | 'day' | 'hour';\n  locale: string;\n  /** Enable drag to create dependency links between tasks */\n  linkable: boolean;\n  /** Link rendering options */\n  linkOptions: GanttLinkOptions;\n  /** Enable task selection (single or multi) */\n  selectable: boolean;\n  /** Allow selecting multiple tasks (requires selectable: true) */\n  multiple: boolean;\n  /** Show built-in toolbar with view type switcher */\n  showToolbar: boolean;\n  /** Toolbar configuration */\n  toolbarOptions: GanttToolbarOptions;\n  /** Style/theme options */\n  styleOptions: GanttStyleOptions;\n  /** Enable virtual scrolling for large datasets */\n  virtualScrollEnabled: boolean;\n  /** Show loading overlay */\n  loading: boolean;\n  /** Delay in ms before showing loading indicator */\n  loadingDelay: number;\n  /** Show baseline comparison bars */\n  showBaseline: boolean;\n  /** Enable table row drag and drop */\n  tableDraggable: boolean;\n  /** Emit load event when scrolling near edges */\n  loadOnScroll: boolean;\n  /** Maximum nesting level for tree hierarchy */\n  maxLevel: number;\n  /** Bar height in pixels */\n  barHeight: number;\n  /** Enable alternate row colors for better row distinction */\n  enableAlternateRowColor: boolean;\n  /** Enable alternate column colors for better column distinction */\n  enableAlternateColumnColor: boolean;\n  /** Enable drag to select area zoom feature */\n  enableDragToZoom: boolean;\n}\n\nexport const DEFAULT_GANTT_CONFIG: GanttConfig = {\n  zoomLevel: ZoomLevel.Day,\n  rowHeight: 40,\n  columnWidth: 40,\n  sidebarColumns: [{ field: 'name', header: 'Task Name', width: 200 }],\n  sidebarWidth: 280,\n  showTodayMarker: true,\n  showGrid: true,\n  collapsible: true,\n  headerHeight: 60,\n  snapTo: 'day',\n  locale: 'en-US',\n  linkable: false,\n  linkOptions: {\n    dependencyTypes: ['FS'],\n    showArrow: true,\n    lineType: GanttLinkLineType.Curve,\n  },\n  selectable: false,\n  multiple: false,\n  showToolbar: false,\n  toolbarOptions: {\n    viewTypes: [ZoomLevel.Day, ZoomLevel.Month, ZoomLevel.Year],\n  },\n  styleOptions: {\n    primaryColor: '#4a90d9',\n    headerHeight: 60,\n    rowHeight: 40,\n    barHeight: 24,\n    defaultTheme: 'default',\n    themes: {\n      default: {\n        primary: '#4a90d9',\n        danger: '#ff6358',\n        highlight: '#ff9f73',\n        background: '#ffffff',\n        text: { main: '#212529', muted: '#6c757d', light: '#adb5bd', inverse: '#ffffff' },\n        gray: { 100: '#f8f9fa', 200: '#f1f3f5', 300: '#e9ecef', 400: '#dee2e6', 500: '#adb5bd', 600: '#6c757d' },\n      },\n    },\n  },\n  virtualScrollEnabled: false,\n  loading: false,\n  loadingDelay: 0,\n  showBaseline: false,\n  tableDraggable: false,\n  loadOnScroll: false,\n  maxLevel: 10,\n  barHeight: 24,\n  enableAlternateRowColor: false,\n  enableAlternateColumnColor: false,\n  enableDragToZoom: false,\n};\n","import { ZoomLevel } from '../models';\n\nexport function addDays(date: Date, days: number): Date {\n  const result = new Date(date);\n  result.setDate(result.getDate() + days);\n  return result;\n}\n\nexport function addHours(date: Date, hours: number): Date {\n  const result = new Date(date);\n  result.setTime(result.getTime() + hours * 3600000);\n  return result;\n}\n\nexport function diffDays(a: Date, b: Date): number {\n  const msPerDay = 86400000;\n  return Math.round((a.getTime() - b.getTime()) / msPerDay);\n}\n\nexport function diffHours(a: Date, b: Date): number {\n  return (a.getTime() - b.getTime()) / 3600000;\n}\n\nexport function startOfHour(date: Date): Date {\n  const result = new Date(date);\n  result.setMinutes(0, 0, 0);\n  return result;\n}\n\nexport function startOfDay(date: Date): Date {\n  const result = new Date(date);\n  result.setHours(0, 0, 0, 0);\n  return result;\n}\n\nexport function startOfWeek(date: Date, weekStartsOn = 1): Date {\n  const result = startOfDay(date);\n  const day = result.getDay();\n  const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n  result.setDate(result.getDate() - diff);\n  return result;\n}\n\nexport function startOfMonth(date: Date): Date {\n  const result = new Date(date);\n  result.setDate(1);\n  result.setHours(0, 0, 0, 0);\n  return result;\n}\n\nexport function startOfQuarter(date: Date): Date {\n  const result = new Date(date);\n  const quarter = Math.floor(result.getMonth() / 3);\n  result.setMonth(quarter * 3, 1);\n  result.setHours(0, 0, 0, 0);\n  return result;\n}\n\nexport function startOfYear(date: Date): Date {\n  const result = new Date(date);\n  result.setMonth(0, 1);\n  result.setHours(0, 0, 0, 0);\n  return result;\n}\n\nexport function addMonths(date: Date, months: number): Date {\n  const result = new Date(date);\n  result.setMonth(result.getMonth() + months);\n  return result;\n}\n\nexport function addQuarters(date: Date, quarters: number): Date {\n  return addMonths(date, quarters * 3);\n}\n\nexport function addYears(date: Date, years: number): Date {\n  const result = new Date(date);\n  result.setFullYear(result.getFullYear() + years);\n  return result;\n}\n\nexport function addWeeks(date: Date, weeks: number): Date {\n  return addDays(date, weeks * 7);\n}\n\nexport function isWeekend(date: Date): boolean {\n  const day = date.getDay();\n  return day === 0 || day === 6;\n}\n\nexport function daysInMonth(date: Date): number {\n  return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\nexport function getDateRange(tasks: { start: Date; end: Date }[]): { start: Date; end: Date } {\n  if (tasks.length === 0) {\n    const today = startOfDay(new Date());\n    return { start: today, end: addDays(today, 30) };\n  }\n  let min = tasks[0].start.getTime();\n  let max = tasks[0].end.getTime();\n  for (const t of tasks) {\n    if (t.start.getTime() < min) min = t.start.getTime();\n    if (t.end.getTime() > max) max = t.end.getTime();\n  }\n  return { start: addDays(new Date(min), -2), end: addDays(new Date(max), 2) };\n}\n\nexport function getColumnDates(start: Date, end: Date, zoom: ZoomLevel): Date[] {\n  const dates: Date[] = [];\n  let current: Date;\n\n  switch (zoom) {\n    case ZoomLevel.Hour:\n      current = startOfHour(start);\n      while (current <= end) {\n        dates.push(new Date(current));\n        current = addHours(current, 1);\n      }\n      break;\n    case ZoomLevel.Day:\n      current = startOfDay(start);\n      while (current <= end) {\n        dates.push(new Date(current));\n        current = addDays(current, 1);\n      }\n      break;\n    case ZoomLevel.Week:\n      current = startOfWeek(start);\n      while (current <= end) {\n        dates.push(new Date(current));\n        current = addWeeks(current, 1);\n      }\n      break;\n    case ZoomLevel.Month:\n      current = startOfMonth(start);\n      while (current <= end) {\n        dates.push(new Date(current));\n        current = addMonths(current, 1);\n      }\n      break;\n    case ZoomLevel.Quarter:\n      current = startOfQuarter(start);\n      while (current <= end) {\n        dates.push(new Date(current));\n        current = addQuarters(current, 1);\n      }\n      break;\n    case ZoomLevel.Year:\n      current = startOfYear(start);\n      while (current <= end) {\n        dates.push(new Date(current));\n        current = addYears(current, 1);\n      }\n      break;\n  }\n  return dates;\n}\n\nexport function snapToDay(date: Date): Date {\n  const result = startOfDay(date);\n  if (date.getHours() >= 12) {\n    return addDays(result, 1);\n  }\n  return result;\n}\n","import { Injectable } from '@angular/core';\nimport { ZoomLevel } from '../models';\nimport {\n  diffDays, diffHours, startOfDay, startOfHour, startOfWeek, startOfMonth,\n  startOfQuarter, startOfYear, addDays, addHours, snapToDay, daysInMonth,\n} from '../utils/date-utils';\n\n@Injectable()\nexport class GanttScaleService {\n  dateToX(date: Date, startDate: Date, columnWidth: number, zoomLevel: ZoomLevel): number {\n    switch (zoomLevel) {\n      case ZoomLevel.Hour: {\n        const hours = diffHours(date, startOfHour(startDate));\n        return hours * columnWidth;\n      }\n      case ZoomLevel.Day: {\n        const hours = diffHours(date, startOfDay(startDate));\n        return (hours / 24) * columnWidth;\n      }\n      case ZoomLevel.Week: {\n        const totalDays = (date.getTime() - startOfWeek(startDate).getTime()) / 86400000;\n        return (totalDays / 7) * columnWidth;\n      }\n      case ZoomLevel.Month: {\n        const start = startOfMonth(startDate);\n        const months =\n          (date.getFullYear() - start.getFullYear()) * 12 +\n          (date.getMonth() - start.getMonth());\n        const monthStart = startOfMonth(date);\n        const msInMonth = date.getTime() - monthStart.getTime();\n        const dim = daysInMonth(date);\n        const monthFraction = msInMonth / (dim * 86400000);\n        return (months + monthFraction) * columnWidth;\n      }\n      case ZoomLevel.Quarter: {\n        const start = startOfQuarter(startDate);\n        const startQ = start.getFullYear() * 4 + Math.floor(start.getMonth() / 3);\n        const dateQ = date.getFullYear() * 4 + Math.floor(date.getMonth() / 3);\n        const qDiff = dateQ - startQ;\n        // Fraction within the quarter\n        const qStart = new Date(date.getFullYear(), Math.floor(date.getMonth() / 3) * 3, 1);\n        const qEnd = new Date(date.getFullYear(), Math.floor(date.getMonth() / 3) * 3 + 3, 1);\n        const qDays = (qEnd.getTime() - qStart.getTime()) / 86400000;\n        const dayInQ = (date.getTime() - qStart.getTime()) / 86400000;\n        return (qDiff + dayInQ / qDays) * columnWidth;\n      }\n      case ZoomLevel.Year: {\n        const start = startOfYear(startDate);\n        const yearDiff = date.getFullYear() - start.getFullYear();\n        const yearStart = new Date(date.getFullYear(), 0, 1);\n        const yearEnd = new Date(date.getFullYear() + 1, 0, 1);\n        const yDays = (yearEnd.getTime() - yearStart.getTime()) / 86400000;\n        const dayInY = (date.getTime() - yearStart.getTime()) / 86400000;\n        return (yearDiff + dayInY / yDays) * columnWidth;\n      }\n    }\n  }\n\n  xToDate(x: number, startDate: Date, columnWidth: number, zoomLevel: ZoomLevel): Date {\n    switch (zoomLevel) {\n      case ZoomLevel.Hour: {\n        const hours = x / columnWidth;\n        return addHours(startOfHour(startDate), hours);\n      }\n      case ZoomLevel.Day: {\n        const days = x / columnWidth;\n        return new Date(startOfDay(startDate).getTime() + days * 86400000);\n      }\n      case ZoomLevel.Week: {\n        const weeks = x / columnWidth;\n        return new Date(startOfWeek(startDate).getTime() + weeks * 604800000);\n      }\n      case ZoomLevel.Month: {\n        const months = x / columnWidth;\n        const start = startOfMonth(startDate);\n        const result = new Date(start);\n        result.setMonth(result.getMonth() + Math.floor(months));\n        const fraction = months - Math.floor(months);\n        const dim = daysInMonth(result);\n        return new Date(result.getTime() + fraction * dim * 86400000);\n      }\n      case ZoomLevel.Quarter: {\n        const quarters = x / columnWidth;\n        const start = startOfQuarter(startDate);\n        const result = new Date(start);\n        result.setMonth(result.getMonth() + Math.floor(quarters) * 3);\n        const fraction = quarters - Math.floor(quarters);\n        const qStart = new Date(result.getFullYear(), Math.floor(result.getMonth() / 3) * 3, 1);\n        const qEnd = new Date(result.getFullYear(), Math.floor(result.getMonth() / 3) * 3 + 3, 1);\n        const qDays = (qEnd.getTime() - qStart.getTime()) / 86400000;\n        return new Date(qStart.getTime() + fraction * qDays * 86400000);\n      }\n      case ZoomLevel.Year: {\n        const years = x / columnWidth;\n        const start = startOfYear(startDate);\n        const result = new Date(start);\n        result.setFullYear(result.getFullYear() + Math.floor(years));\n        const fraction = years - Math.floor(years);\n        const yearStart = new Date(result.getFullYear(), 0, 1);\n        const yearEnd = new Date(result.getFullYear() + 1, 0, 1);\n        const yDays = (yearEnd.getTime() - yearStart.getTime()) / 86400000;\n        return new Date(yearStart.getTime() + fraction * yDays * 86400000);\n      }\n    }\n  }\n\n  snapDate(date: Date, snapTo: 'none' | 'day' | 'hour'): Date {\n    switch (snapTo) {\n      case 'day':\n        return snapToDay(date);\n      case 'hour': {\n        const result = new Date(date);\n        if (result.getMinutes() >= 30) {\n          result.setHours(result.getHours() + 1);\n        }\n        result.setMinutes(0, 0, 0);\n        return result;\n      }\n      default:\n        return date;\n    }\n  }\n\n  getBarWidth(start: Date, end: Date, startDate: Date, columnWidth: number, zoomLevel: ZoomLevel): number {\n    const x1 = this.dateToX(start, startDate, columnWidth, zoomLevel);\n    const x2 = this.dateToX(end, startDate, columnWidth, zoomLevel);\n    return Math.max(x2 - x1, 4);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { GanttTask } from '../models/gantt-task.model';\nimport { GanttGroup } from '../models/gantt-group.model';\n\nexport interface FlatRow {\n  task: GanttTask;\n  /** Additional tasks that share this row (same rowId). */\n  extraTasks: GanttTask[];\n  depth: number;\n  rowIndex: number;\n  hasChildren: boolean;\n  isVisible: boolean;\n  /** Set when this row is a group header. */\n  group?: GanttGroup;\n  /** Whether this is a group header row. */\n  isGroupHeader: boolean;\n}\n\ninterface RowGroup {\n  primary: GanttTask;\n  extra: GanttTask[];\n}\n\n@Injectable()\nexport class GanttLayoutService {\n  flattenTasks(tasks: GanttTask[], groups?: GanttGroup[]): FlatRow[] {\n    if (groups && groups.length > 0) {\n      return this.flattenWithGroups(tasks, groups);\n    }\n    return this.flattenTree(tasks);\n  }\n\n  private flattenTree(tasks: GanttTask[]): FlatRow[] {\n    const childrenMap = new Map<string | null, GanttTask[]>();\n    for (const task of tasks) {\n      const parentId = task.parentId;\n      if (!childrenMap.has(parentId)) {\n        childrenMap.set(parentId, []);\n      }\n      childrenMap.get(parentId)!.push(task);\n    }\n\n    const rows: FlatRow[] = [];\n    let rowIndex = 0;\n\n    const traverse = (parentId: string | null, depth: number, parentVisible: boolean): void => {\n      const children = childrenMap.get(parentId) || [];\n\n      // Group children by rowId, preserving original order for primary tasks.\n      const rowGroups: RowGroup[] = [];\n      const rowIdToGroup = new Map<string, RowGroup>();\n\n      for (const task of children) {\n        if (task.rowId) {\n          const existing = rowIdToGroup.get(task.rowId);\n          if (existing) {\n            existing.extra.push(task);\n          } else {\n            const group = { primary: task, extra: [] as GanttTask[] };\n            rowGroups.push(group);\n            rowIdToGroup.set(task.rowId, group);\n          }\n        } else {\n          rowGroups.push({ primary: task, extra: [] });\n        }\n      }\n\n      for (const { primary: task, extra: extraTasks } of rowGroups) {\n        const hasChildren = childrenMap.has(task.id) && childrenMap.get(task.id)!.length > 0;\n        const isVisible = parentVisible;\n        rows.push({ task, extraTasks, depth, rowIndex: isVisible ? rowIndex : -1, hasChildren, isVisible, isGroupHeader: false });\n        if (isVisible) rowIndex++;\n        const childVisible = isVisible && !task.collapsed;\n        traverse(task.id, depth + 1, childVisible);\n      }\n    };\n\n    traverse(null, 0, true);\n    return rows;\n  }\n\n  private flattenWithGroups(tasks: GanttTask[], groups: GanttGroup[]): FlatRow[] {\n    const rows: FlatRow[] = [];\n    let rowIndex = 0;\n\n    // Build a map of tasks by group_id\n    const tasksByGroup = new Map<string, GanttTask[]>();\n    const ungroupedTasks: GanttTask[] = [];\n    for (const task of tasks) {\n      if (task.group_id) {\n        if (!tasksByGroup.has(task.group_id)) {\n          tasksByGroup.set(task.group_id, []);\n        }\n        tasksByGroup.get(task.group_id)!.push(task);\n      } else {\n        ungroupedTasks.push(task);\n      }\n    }\n\n    for (const group of groups) {\n      // Create a pseudo-task for the group header\n      const groupTask: GanttTask = {\n        id: `__group__${group.id}`,\n        name: group.title,\n        start: new Date(),\n        end: new Date(),\n        progress: 0,\n        parentId: null,\n        collapsed: group.expanded === false,\n        isMilestone: false,\n        cssClass: group.class,\n      };\n\n      const groupTasks = tasksByGroup.get(group.id) || [];\n\n      // Calculate group date range\n      if (groupTasks.length > 0) {\n        let minStart = groupTasks[0].start.getTime();\n        let maxEnd = groupTasks[0].end.getTime();\n        let totalProgress = 0;\n        for (const t of groupTasks) {\n          if (t.start.getTime() < minStart) minStart = t.start.getTime();\n          if (t.end.getTime() > maxEnd) maxEnd = t.end.getTime();\n          totalProgress += t.progress;\n        }\n        groupTask.start = new Date(minStart);\n        groupTask.end = new Date(maxEnd);\n        groupTask.progress = Math.round(totalProgress / groupTasks.length);\n      }\n\n      const hasChildren = groupTasks.length > 0;\n      rows.push({\n        task: groupTask,\n        extraTasks: [],\n        depth: 0,\n        rowIndex: rowIndex++,\n        hasChildren,\n        isVisible: true,\n        group,\n        isGroupHeader: true,\n      });\n\n      if (group.expanded !== false) {\n        // Flatten group tasks using tree logic\n        const groupRows = this.flattenTree(groupTasks);\n        for (const r of groupRows) {\n          if (r.isVisible) {\n            r.rowIndex = rowIndex++;\n            r.depth += 1; // indent within group\n          }\n          rows.push(r);\n        }\n      }\n    }\n\n    // Also flatten any ungrouped tasks\n    if (ungroupedTasks.length > 0) {\n      const ungroupedRows = this.flattenTree(ungroupedTasks);\n      for (const r of ungroupedRows) {\n        if (r.isVisible) {\n          r.rowIndex = rowIndex++;\n        }\n        rows.push(r);\n      }\n    }\n\n    return rows;\n  }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable()\nexport class GanttKeyboardService {\n  readonly focusedTaskId = signal<string | null>(null);\n\n  focusTask(taskId: string): void {\n    this.focusedTaskId.set(taskId);\n  }\n\n  clearFocus(): void {\n    this.focusedTaskId.set(null);\n  }\n\n  handleKeyDown(\n    event: KeyboardEvent,\n    visibleTaskIds: string[],\n    callbacks: {\n      onSelect?: (taskId: string) => void;\n      onEscape?: () => void;\n    }\n  ): void {\n    const currentId = this.focusedTaskId();\n    const currentIndex = currentId ? visibleTaskIds.indexOf(currentId) : -1;\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        if (currentIndex < visibleTaskIds.length - 1) {\n          this.focusTask(visibleTaskIds[currentIndex + 1]);\n        }\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        if (currentIndex > 0) {\n          this.focusTask(visibleTaskIds[currentIndex - 1]);\n        }\n        break;\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        if (currentId && callbacks.onSelect) {\n          callbacks.onSelect(currentId);\n        }\n        break;\n      case 'Escape':\n        this.clearFocus();\n        callbacks.onEscape?.();\n        break;\n    }\n  }\n}\n","import { Injectable, ElementRef } from '@angular/core';\n\n/**\n * Service for exporting the gantt chart as a PNG image.\n * Requires html2canvas as an optional peer dependency for full export.\n * Falls back to SVG serialization if html2canvas is not available.\n */\n@Injectable()\nexport class GanttPrintService {\n  private root: HTMLElement | null = null;\n\n  register(rootRef: ElementRef<HTMLElement>): void {\n    this.root = rootRef.nativeElement;\n  }\n\n  /**\n   * Export the gantt chart as a PNG data URL.\n   * Uses the Canvas API to capture the rendered content.\n   */\n  async exportAsImage(ignoreElementClass?: string): Promise<string | null> {\n    if (!this.root) {\n      console.warn('[GanttPrintService] No root element registered.');\n      return null;\n    }\n\n    try {\n      // Try to use html2canvas if available\n      const html2canvas = await this.loadHtml2Canvas();\n      if (html2canvas) {\n        const canvas = await html2canvas(this.root, {\n          logging: false,\n          allowTaint: true,\n          useCORS: true,\n          width: this.root.scrollWidth,\n          height: this.root.scrollHeight,\n          ignoreElements: (element: Element) => {\n            if (ignoreElementClass && element.classList.contains(ignoreElementClass)) {\n              return true;\n            }\n            return false;\n          },\n        });\n        return canvas.toDataURL('image/png');\n      }\n\n      // Fallback: capture via basic canvas rendering\n      return this.fallbackCapture();\n    } catch {\n      console.warn('[GanttPrintService] Export failed.');\n      return null;\n    }\n  }\n\n  /**\n   * Download the gantt chart as a PNG file.\n   */\n  async print(name: string = 'gantt-chart', ignoreElementClass?: string): Promise<void> {\n    const dataUrl = await this.exportAsImage(ignoreElementClass);\n    if (dataUrl) {\n      const link = document.createElement('a');\n      link.download = `${name}.png`;\n      link.href = dataUrl;\n      link.click();\n    }\n  }\n\n  private async loadHtml2Canvas(): Promise<((el: HTMLElement, opts: unknown) => Promise<HTMLCanvasElement>) | null> {\n    try {\n      // html2canvas is an optional peer dependency – if not installed, fallback is used\n      const module = await (Function('return import(\"html2canvas\")')() as Promise<{ default: (el: HTMLElement, opts: unknown) => Promise<HTMLCanvasElement> }>);\n      return module.default || null;\n    } catch {\n      return null;\n    }\n  }\n\n  private fallbackCapture(): string | null {\n    if (!this.root) return null;\n\n    // Basic fallback: render a simple canvas with the gantt dimensions\n    const canvas = document.createElement('canvas');\n    const rect = this.root.getBoundingClientRect();\n    canvas.width = rect.width;\n    canvas.height = rect.height;\n    const ctx = canvas.getContext('2d');\n    if (!ctx) return null;\n\n    // Fill with background\n    ctx.fillStyle = '#ffffff';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n    // Draw a message indicating html2canvas is needed for full export\n    ctx.fillStyle = '#6c757d';\n    ctx.font = '14px sans-serif';\n    ctx.textAlign = 'center';\n    ctx.fillText(\n      'Install html2canvas for full chart export (npm install html2canvas)',\n      canvas.width / 2,\n      canvas.height / 2,\n    );\n\n    return canvas.toDataURL('image/png');\n  }\n}\n","import { DependencyType, GanttLinkLineType } from '../models';\n\nexport interface Rect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nexport function computeDependencyPath(\n  from: Rect,\n  to: Rect,\n  type: DependencyType,\n  offset = 12,\n  lineType: GanttLinkLineType = GanttLinkLineType.Straight\n): string {\n  let startX: number;\n  let startY: number;\n  let endX: number;\n  let endY: number;\n\n  switch (type) {\n    case DependencyType.FinishToStart:\n      startX = from.x + from.width;\n      startY = from.y + from.height / 2;\n      endX = to.x;\n      endY = to.y + to.height / 2;\n      break;\n    case DependencyType.StartToStart:\n      startX = from.x;\n      startY = from.y + from.height / 2;\n      endX = to.x;\n      endY = to.y + to.height / 2;\n      break;\n    case DependencyType.FinishToFinish:\n      startX = from.x + from.width;\n      startY = from.y + from.height / 2;\n      endX = to.x + to.width;\n      endY = to.y + to.height / 2;\n      break;\n    case DependencyType.StartToFinish:\n      startX = from.x;\n      startY = from.y + from.height / 2;\n      endX = to.x + to.width;\n      endY = to.y + to.height / 2;\n      break;\n  }\n\n  if (lineType === GanttLinkLineType.Curve) {\n    return computeCurvePath(startX, startY, endX, endY, type, offset);\n  }\n\n  return computeStraightPath(startX, startY, endX, endY, type, offset);\n}\n\nfunction computeStraightPath(\n  startX: number, startY: number,\n  endX: number, endY: number,\n  type: DependencyType, offset: number\n): string {\n  const midX = startX + offset;\n\n  if (type === DependencyType.FinishToStart && endX > startX + offset * 2) {\n    const mx = (startX + endX) / 2;\n    return `M ${startX} ${startY} H ${mx} V ${endY} H ${endX}`;\n  }\n\n  return `M ${startX} ${startY} H ${midX} V ${endY} H ${endX}`;\n}\n\nfunction computeCurvePath(\n  startX: number, startY: number,\n  endX: number, endY: number,\n  type: DependencyType, offset: number\n): string {\n  const dx = endX - startX;\n  const dy = endY - startY;\n  const r = Math.min(Math.abs(dy) / 2, offset);\n\n  if (type === DependencyType.FinishToStart && dx > offset * 2) {\n    // Smooth S-curve\n    const midX = (startX + endX) / 2;\n    const cp1x = midX;\n    const cp1y = startY;\n    const cp2x = midX;\n    const cp2y = endY;\n    return `M ${startX} ${startY} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${endX} ${endY}`;\n  }\n\n  // Route around: go right, down/up, then left/right to target\n  const midX = startX + offset;\n  const signY = dy >= 0 ? 1 : -1;\n\n  if (Math.abs(dy) < r * 2) {\n    // Very close vertically, simple curve\n    return `M ${startX} ${startY} C ${midX} ${startY}, ${endX - offset} ${endY}, ${endX} ${endY}`;\n  }\n\n  return `M ${startX} ${startY} ` +\n    `H ${midX - r} ` +\n    `Q ${midX} ${startY}, ${midX} ${startY + signY * r} ` +\n    `V ${endY - signY * r} ` +\n    `Q ${midX} ${endY}, ${midX + r} ${endY} ` +\n    `H ${endX}`;\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  effect,\n  input,\n  output,\n  computed,\n  signal,\n  viewChild,\n  inject,\n  ElementRef,\n  TemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\nimport {\n  GanttTask,\n  GanttSubtask,\n  GanttDependency,\n  DependencyType,\n  GanttConfig,\n  GanttColumnDef,\n  GanttLinkLineType,\n  DEFAULT_GANTT_CONFIG,\n  ZoomLevel,\n  GanttGroup,\n  GanttBaselineItem,\n  GanttTaskChangeEvent,\n  GanttTaskClickEvent,\n  GanttDependencyClickEvent,\n  GanttScrollEvent,\n  GanttDragEvent,\n  GanttLinkDragEvent,\n  GanttLineClickEvent,\n  GanttBarClickEvent,\n  GanttSelectedEvent,\n  GanttTableDragStartedEvent,\n  GanttTableDragEndedEvent,\n  GanttTableDragDroppedEvent,\n  GanttLoadOnScrollEvent,\n  GanttVirtualScrolledIndexChangeEvent,\n  GanttViewChangeEvent,\n  GanttExpandChangeEvent,\n  GanttTooltipContext,\n} from './models';\nimport { GanttScaleService } from './services/gantt-scale.service';\nimport { GanttLayoutService, FlatRow } from './services/gantt-layout.service';\nimport { GanttKeyboardService } from './services/gantt-keyboard.service';\nimport { GanttPrintService } from './services/gantt-print.service';\nimport {\n  getDateRange,\n  getColumnDates,\n  isWeekend,\n  startOfDay,\n  addDays,\n  addHours,\n} from './utils/date-utils';\nimport { Rect, computeDependencyPath } from './utils/svg-utils';\n\n@Component({\n  selector: 'ngx-gantt-chart',\n  standalone: true,\n  imports: [NgTemplateOutlet],\n  providers: [GanttScaleService, GanttLayoutService, GanttKeyboardService, GanttPrintService],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"k-gantt\" [class.k-gantt-dark]=\"mergedConfig().styleOptions.defaultTheme === 'dark'\" [class.k-no-grid]=\"!mergedConfig().showGrid\" [style]=\"themeVars()\" (keydown)=\"onKeyDown($event)\">\n\n      @if (mergedConfig().showToolbar) {\n        <div class=\"k-gantt-toolbar\">\n          <div class=\"k-toolbar-group k-toolbar-views\">\n            @for (vt of mergedConfig().toolbarOptions.viewTypes; track vt) {\n              <button class=\"k-toolbar-btn\" [class.k-active]=\"mergedConfig().zoomLevel === vt\" (click)=\"onToolbarViewChange(vt)\">{{ getViewLabel(vt) }}</button>\n            }\n          </div>\n          <div class=\"k-toolbar-group\">\n            <button class=\"k-toolbar-btn\" (click)=\"scrollToToday()\" [title]=\"i18n.gantt.today\">{{ i18n.gantt.today }}</button>\n            @if (mergedConfig().collapsible) {\n              <button class=\"k-toolbar-btn\" (click)=\"expandAll()\">Expand</button>\n              <button class=\"k-toolbar-btn\" (click)=\"collapseAll()\">Collapse</button>\n            }\n          </div>\n          <div class=\"k-toolbar-group\">\n            <button class=\"k-toolbar-btn\" [class.k-active]=\"showCriticalPath()\" (click)=\"toggleCriticalPath()\" [title]=\"i18n.gantt.criticalPath\">📌 {{ i18n.gantt.criticalPath }}</button>\n          </div>\n          @if (isDragToZoomEnabled()) {\n            <div class=\"k-toolbar-group k-toolbar-zoom\" style=\"margin-left: auto;\">\n              <button class=\"k-toolbar-btn k-zoom-mode-btn\" [class.k-active]=\"isAreaZoomMode()\" (click)=\"toggleAreaZoomMode()\" title=\"Toggle Area Selection Zoom\">\n                🔍 Area Zoom\n              </button>\n              @if (isZoomed()) {\n                <button class=\"k-toolbar-btn k-zoom-reset-btn\" (click)=\"resetZoom()\" title=\"Reset to full timeline\">\n                  Reset Zoom\n                </button>\n              }\n            </div>\n          }\n        </div>\n      }\n\n      <div class=\"k-gantt-body\">\n        <div class=\"k-gantt-treelist\" [style.width.px]=\"mergedConfig().sidebarWidth\">\n          <div class=\"k-treelist-header\" [style.height.px]=\"mergedConfig().headerHeight\">\n            <table class=\"k-treelist-header-table\">\n              <colgroup>\n                @for (col of sidebarColumns(); track col.header + '-' + $index) { <col [style.width.px]=\"col.width\"/> }\n              </colgroup>\n              <thead><tr>\n                @for (col of sidebarColumns(); track col.header + '-' + $index) { <th class=\"k-header-cell\">{{ col.header }}</th> }\n              </tr></thead>\n            </table>\n          </div>\n          <div class=\"k-treelist-content\" #treelistContent (wheel)=\"onTreelistWheel($event)\">\n            <table class=\"k-treelist-table\">\n              <colgroup>\n                @for (col of sidebarColumns(); track col.header + '-' + $index) { <col [style.width.px]=\"col.width\"/> }\n              </colgroup>\n              <tbody>\n                @if (mergedConfig().virtualScrollEnabled) {\n                  <tr [style.height.px]=\"virtualRange().start * mergedConfig().rowHeight\">\n                    <td [attr.colspan]=\"sidebarColumns().length\" style=\"padding:0; border:none; height: inherit;\"></td>\n                  </tr>\n                }\n                @for (row of renderedRows(); track row.task.id; let i = $index) {\n                  @let actualIdx = mergedConfig().virtualScrollEnabled ? virtualRange().start + i : i;\n                  <tr class=\"k-treelist-row\" [class.k-group-header-row]=\"row.isGroupHeader\" [style.height.px]=\"mergedConfig().rowHeight\"\n                    [class.k-alt]=\"mergedConfig().enableAlternateRowColor && actualIdx % 2 === 1 && !row.isGroupHeader\" [class.k-selected]=\"isTaskSelected(row.task.id)\" [class.k-hover]=\"hoveredTaskId() === row.task.id\"\n                    (mouseenter)=\"hoveredTaskId.set(row.task.id)\" (mouseleave)=\"hoveredTaskId.set(null)\" (click)=\"onRowClick(row.task, $event)\">\n                    @if (row.isGroupHeader) {\n                      <td class=\"k-treelist-cell k-group-cell\" [attr.colspan]=\"sidebarColumns().length\">\n                        @if (mergedConfig().collapsible) {\n                          <button class=\"k-collapse-btn\" (click)=\"onToggleGroupCollapse(row.group!); $event.stopPropagation()\" [attr.aria-expanded]=\"row.group!.expanded !== false\">\n                            <span class=\"k-icon\" [class.k-collapsed]=\"row.group!.expanded === false\">&#9660;</span>\n                          </button>\n                        }\n                        <span class=\"k-group-title\">{{ row.task.name }}</span>\n                      </td>\n                    } @else {\n                      @for (col of sidebarColumns(); track col.header + '-' + $index; let colIndex = $index) {\n                        <td class=\"k-treelist-cell\" [class.k-name-cell]=\"isNameColumn(col, colIndex)\" [class.k-date-cell]=\"isDateColumn(col)\" [class.k-pct-cell]=\"isProgressColumn(col)\">\n                          @if (isNameColumn(col, colIndex)) {\n                            @if (mergedConfig().tableDraggable && row.task.itemDraggable !== false) {\n                              <span class=\"k-drag-handle\" draggable=\"true\" (dragstart)=\"onTableDragStart($event, row)\" (dragend)=\"onTableDragEnd($event, row)\" title=\"Drag to reorder\">&#8942;&#8942;</span>\n                            }\n                            <span class=\"k-indent\" [style.width.px]=\"row.depth * 20\"></span>\n                            @if (row.hasChildren && mergedConfig().collapsible) {\n                              <button class=\"k-collapse-btn\" (click)=\"onToggleCollapse(row.task.id); $event.stopPropagation()\" [attr.aria-expanded]=\"!row.task.collapsed\">\n                                <span class=\"k-icon\" [class.k-collapsed]=\"row.task.collapsed\">&#9660;</span>\n                              </button>\n                            } @else { <span class=\"k-collapse-spacer\"></span> }\n                            @if (row.task.isMilestone) { <span class=\"k-milestone-icon\">&#9670;</span> }\n                            <div class=\"k-name-wrapper\">\n                              <span class=\"k-task-name\" [class.k-summary-name]=\"row.hasChildren\" [title]=\"row.task.name\">{{ row.task.name }}</span>\n                              @if (getUniqueExtraTasks(row).length > 0) {\n                                <div class=\"k-extra-tasks-chips\">\n                                  @for (extra of getUniqueExtraTasks(row); track extra.id) {\n                                    <span class=\"k-extra-task-chip\" [style.background]=\"extra.color || '#6c757d'\" [title]=\"extra.name\">{{ extra.name.length > 14 ? extra.name.slice(0, 14) + '\\u2026' : extra.name }}</span>\n                                  }\n                                </div>\n                              }\n                            </div>\n                          } @else if (isProgressColumn(col) && row.extraTasks.length > 0) {\n                            <span class=\"k-multi-pct\" [title]=\"getRowProgressTitle(row)\">~{{ getRowAvgProgress(row) }}%</span>\n                          } @else { {{ getSidebarCellValue(row, col) }} }\n                        </td>\n                      }\n                    }\n                  </tr>\n                }\n                @if (mergedConfig().virtualScrollEnabled) {\n                  <tr [style.height.px]=\"(visibleRows().length > virtualRange().end) ? (visibleRows().length - virtualRange().end) * mergedConfig().rowHeight : 0\">\n                    <td [attr.colspan]=\"sidebarColumns().length\" style=\"padding:0; border:none; height: inherit;\"></td>\n                  </tr>\n                }\n              </tbody>\n            </table>\n          </div>\n        </div>\n\n        <div class=\"k-splitbar\" (pointerdown)=\"onSplitBarDown($event)\"><span class=\"k-splitbar-icon\">&#8942;</span></div>\n\n        <div class=\"k-gantt-timeline\">\n          <div class=\"k-timeline-header\" [style.height.px]=\"mergedConfig().headerHeight\">\n            <div class=\"k-timeline-header-wrap\" [style.width.px]=\"totalWidth()\" [style.margin-left.px]=\"-(scrollLeft())\">\n              <div class=\"k-header-row k-header-primary\">\n                @for (group of primaryHeaderGroups(); track group.label + group.x) {\n                  <div class=\"k-header-group-cell\" [style.left.px]=\"group.x\" [style.width.px]=\"group.width\">{{ group.label }}</div>\n                }\n              </div>\n              <div class=\"k-header-row k-header-secondary\">\n                @for (col of headerColumns(); track col.x) {\n                  <div class=\"k-header-tick-cell\" [style.left.px]=\"col.x\" [style.width.px]=\"col.width\" [class.k-weekend]=\"col.isWeekend\" [class.k-today-header]=\"col.isToday\">{{ col.label }}</div>\n                }\n              </div>\n            </div>\n          </div>\n\n          <div class=\"k-timeline-content\" #timelineContent (scroll)=\"onTimelineScroll()\"\n            [class.k-zoom-mode-cursor]=\"isAreaZoomMode()\"\n            [class.k-zoom-dragging]=\"isDraggingZoom()\"\n            (pointerdown)=\"onTimelinePointerDown($event)\">\n            <div class=\"k-timeline-canvas\" [style.width.px]=\"totalWidth()\" [style.height.px]=\"totalHeight()\">\n              <div class=\"k-gantt-rows\">\n                @for (row of renderedRows(); track row.task.id; let i = $index) {\n                  @let actualIdx = mergedConfig().virtualScrollEnabled ? virtualRange().start + i : i;\n                  <div class=\"k-gantt-row\" [class.k-group-row]=\"row.isGroupHeader\" [style.top.px]=\"actualIdx * mergedConfig().rowHeight\" [style.height.px]=\"mergedConfig().rowHeight\"\n                    [class.k-alt]=\"mergedConfig().enableAlternateRowColor && actualIdx % 2 === 1 && !row.isGroupHeader\" [class.k-hover]=\"hoveredTaskId() === row.task.id\" [class.k-selected]=\"isTaskSelected(row.task.id)\"\n                    (mouseenter)=\"hoveredTaskId.set(row.task.id)\" (mouseleave)=\"hoveredTaskId.set(null)\"\n                    (dragover)=\"mergedConfig().tableDraggable ? onTableDragOver($event, row) : null\" (drop)=\"mergedConfig().tableDraggable ? onTableDrop($event, row) : null\">\n                  </div>\n                }\n              </div>\n\n              @if (mergedConfig().showGrid) {\n                <div class=\"k-gantt-columns\">\n                  @for (col of headerColumns(); track col.x; let colIndex = $index) {\n                    <div class=\"k-gantt-column\" [style.left.px]=\"col.x\" [style.width.px]=\"col.width\" [style.height.px]=\"totalHeight()\" \n                      [class.k-weekend-col]=\"col.isWeekend\" [class.k-alt-col]=\"mergedConfig().enableAlternateColumnColor && colIndex % 2 === 1\"></div>\n                  }\n                </div>\n              }\n\n              @if (mergedConfig().showTodayMarker && todayX() !== null) {\n                <div class=\"k-today-marker\" [style.left.px]=\"todayX()\" [style.height.px]=\"totalHeight()\"><div class=\"k-today-indicator\"></div></div>\n              }\n\n              @if (mergedConfig().showBaseline && baselineItems().length > 0) {\n                <div class=\"k-gantt-baselines\">\n                  @for (bl of baselineBars(); track bl.id) {\n                    <div class=\"k-baseline-bar\" [style.top.px]=\"bl.top\" [style.left.px]=\"bl.left\" [style.width.px]=\"bl.width\" [style.height.px]=\"mergedConfig().barHeight\"></div>\n                  }\n                </div>\n              }\n\n              <div class=\"k-gantt-tasks\">\n                @for (bar of taskBars(); track bar.task.id) {\n                  <div class=\"k-task-wrap\" [style.top.px]=\"bar.top\" [style.height.px]=\"mergedConfig().rowHeight\" [class]=\"bar.task.cssClass || ''\">\n                    @if (bar.isGroupHeader) {\n                    } @else if (bar.task.isMilestone) {\n                      <div class=\"k-milestone\" [style.left.px]=\"bar.left - 8\" [class.k-focused]=\"keyboardService.focusedTaskId() === bar.task.id\" [class.k-selected]=\"isTaskSelected(bar.task.id)\" [class.k-critical-task]=\"criticalPathInfo().criticalTaskIds.has(bar.task.id)\"\n                        (mouseenter)=\"hoveredTaskId.set(bar.primaryTaskId); showTooltip(bar.task, $event)\" (mousemove)=\"updateTooltipPosition($event)\" (mouseleave)=\"hoveredTaskId.set(null); hideTooltip()\"\n                        (click)=\"onTaskBarClick(bar.task, $event)\" (dblclick)=\"onTaskBarDblClick(bar.task, $event)\" tabindex=\"0\" [attr.aria-label]=\"'Milestone: ' + bar.task.name\">\n                        <div class=\"k-milestone-diamond\" [style.background]=\"bar.task.color || '#e74c3c'\"></div>\n                      </div>\n                    } @else if (bar.task.type === 'range') {\n                      <div class=\"k-task k-task-range\" [style.left.px]=\"bar.left\" [style.width.px]=\"bar.width\" [style.background]=\"bar.task.color || '#ff9f73'\"\n                        [class.k-selected]=\"isTaskSelected(bar.task.id)\" [class.k-critical-task]=\"criticalPathInfo().criticalTaskIds.has(bar.task.id)\"\n                        (mouseenter)=\"hoveredTaskId.set(bar.primaryTaskId); showTooltip(bar.task, $event)\" (mousemove)=\"updateTooltipPosition($event)\" (mouseleave)=\"hoveredTaskId.set(null); hideTooltip()\"\n                        (click)=\"onTaskBarClick(bar.task, $event)\" tabindex=\"0\" [attr.aria-label]=\"bar.task.name\">\n                        <span class=\"k-task-text\">{{ bar.task.name }}</span>\n                        @if (mergedConfig().linkable && bar.task.linkable !== false) {\n                          <div class=\"k-link-connector k-link-start\" (pointerdown)=\"onLinkDragStart($event, bar.task, 'start')\"></div>\n                          <div class=\"k-link-connector k-link-end\" (pointerdown)=\"onLinkDragStart($event, bar.task, 'end')\"></div>\n                        }\n                      </div>\n                    } @else if (bar.isSummary) {\n                      <div class=\"k-task-summary\" [style.left.px]=\"bar.left\" [style.width.px]=\"bar.width\" [class.k-selected]=\"isTaskSelected(bar.task.id)\" [class.k-critical-task]=\"criticalPathInfo().criticalTaskIds.has(bar.task.id)\"\n                        (mouseenter)=\"hoveredTaskId.set(bar.primaryTaskId); showTooltip(bar.task, $event)\" (mousemove)=\"updateTooltipPosition($event)\" (mouseleave)=\"hoveredTaskId.set(null); hideTooltip()\"\n                        (click)=\"onTaskBarClick(bar.task, $event)\" tabindex=\"0\">\n                        <div class=\"k-summary-bar\"><div class=\"k-summary-progress\" [style.width.%]=\"bar.task.progress\"></div></div>\n                        <div class=\"k-summary-left-cap\"></div><div class=\"k-summary-right-cap\"></div>\n                      </div>\n                    } @else if (bar.task.subtasks && bar.task.subtasks.length > 0) {\n                      <div class=\"k-task k-task-with-subtasks\" [style.left.px]=\"bar.left\" [style.width.px]=\"bar.width\" [style.background]=\"bar.task.color || '#e9ecef'\"\n                        [class.k-selected]=\"isTaskSelected(bar.task.id)\" [class.k-critical-task]=\"criticalPathInfo().criticalTaskIds.has(bar.task.id)\"\n                        (mouseenter)=\"hoveredTaskId.set(bar.primaryTaskId)\" (mouseleave)=\"hoveredTaskId.set(null); hideTooltip()\"\n                        (pointerdown)=\"onBarPointerDown($event, bar.task, 'move')\" (click)=\"onTaskBarClick(bar.task, $event)\"\n                        tabindex=\"0\" role=\"img\" [attr.aria-label]=\"bar.task.name + ' with ' + bar.task.subtasks.length + ' subtasks'\">\n                        @for (sub of getSubtaskBars(bar); track sub.subtask.id) {\n                          <div class=\"k-subtask-segment\" [class]=\"sub.subtask.cssClass || ''\" [style.left.px]=\"sub.left\" [style.width.px]=\"sub.width\" [style.background]=\"sub.subtask.color\"\n                            [title]=\"sub.subtask.name\"\n                            (mouseenter)=\"showSubtaskTooltip(bar.task, sub.subtask, $event); $event.stopPropagation()\" (mousemove)=\"updateTooltipPosition($event)\" (mouseleave)=\"hideTooltip()\">\n                            @if (sub.width > 40) { <span class=\"k-subtask-text\">{{ sub.subtask.name }}</span> }\n                            @if (sub.subtask.progress != null) { <div class=\"k-subtask-progress\" [style.width.%]=\"sub.subtask.progress\"></div> }\n                          </div>\n                        }\n                        @if (bar.task.draggable !== false) {\n                          <div class=\"k-resize-handle k-resize-w\" (pointerdown)=\"onBarPointerDown($event, bar.task, 'resize-left')\"></div>\n                          <div class=\"k-resize-handle k-resize-e\" (pointerdown)=\"onBarPointerDown($event, bar.task, 'resize-right')\"></div>\n                        }\n                        @if (mergedConfig().linkable && bar.task.linkable !== false) {\n                          <div class=\"k-link-connector k-link-start\" (pointerdown)=\"onLinkDragStart($event, bar.task, 'start')\"></div>\n                          <div class=\"k-link-connector k-link-end\" (pointerdown)=\"onLinkDragStart($event, bar.task, 'end')\"></div>\n                        }\n                      </div>\n                    } @else {\n                      <div class=\"k-task\" [style.left.px]=\"bar.left\" [style.width.px]=\"bar.width\" [style.background]=\"bar.task.color || 'var(--k-primary, #4a90d9)'\"\n                        [class.k-focused]=\"keyboardService.focusedTaskId() === bar.task.id\" [class.k-selected]=\"isTaskSelected(bar.task.id)\" [class.k-critical-task]=\"criticalPathInfo().criticalTaskIds.has(bar.task.id)\"\n                        (mouseenter)=\"hoveredTaskId.set(bar.primaryTaskId); showTooltip(bar.task, $event)\" (mousemove)=\"updateTooltipPosition($event)\" (mouseleave)=\"hoveredTaskId.set(null); hideTooltip()\"\n                        (pointerdown)=\"onBarPointerDown($event, bar.task, 'move')\" (click)=\"onTaskBarClick(bar.task, $event)\" (dblclick)=\"onTaskBarDblClick(bar.task, $event)\"\n                        tabindex=\"0\" role=\"img\" [attr.aria-label]=\"bar.task.name + ' - ' + bar.task.progress + '% complete'\">\n                        <div class=\"k-task-progress\" [style.width.%]=\"bar.task.progress\"><div class=\"k-task-progress-inner\"></div></div>\n                        <span class=\"k-task-text\">{{ bar.task.name }}</span>\n                        @if (bar.task.draggable !== false) {\n                          <div class=\"k-resize-handle k-resize-w\" (pointerdown)=\"onBarPointerDown($event, bar.task, 'resize-left')\"></div>\n                          <div class=\"k-resize-handle k-resize-e\" (pointerdown)=\"onBarPointerDown($event, bar.task, 'resize-right')\"></div>\n                        }\n                        @if (mergedConfig().linkable && bar.task.linkable !== false) {\n                          <div class=\"k-link-connector k-link-start\" (pointerdown)=\"onLinkDragStart($event, bar.task, 'start')\"></div>\n                          <div class=\"k-link-connector k-link-end\" (pointerdown)=\"onLinkDragStart($event, bar.task, 'end')\"></div>\n                        }\n                      </div>\n                    }\n                    @if (bar.slackWidth > 0) {\n                      <div class=\"k-task-slack-trail\" [style.left.px]=\"bar.left + bar.width\" [style.width.px]=\"bar.slackWidth\"></div>\n                    }\n                  </div>\n                }\n              </div>\n\n              <svg class=\"k-gantt-dependencies\" [attr.width]=\"totalWidth()\" [attr.height]=\"totalHeight()\">\n                <defs>\n                  @if (mergedConfig().linkOptions.showArrow !== false) {\n                    <marker id=\"k-arrowhead-default\" markerWidth=\"10\" markerHeight=\"7\" refX=\"10\" refY=\"3.5\" orient=\"auto\">\n                      <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#a0aec0\"/>\n                    </marker>\n                    <marker id=\"k-arrowhead-critical\" markerWidth=\"10\" markerHeight=\"7\" refX=\"10\" refY=\"3.5\" orient=\"auto\">\n                      <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"var(--k-danger, #ff6358)\"/>\n                    </marker>\n                  }\n                </defs>\n                @for (dep of dependencyPaths(); track dep.key) {\n                  <path class=\"k-dep-line\" [attr.d]=\"dep.path\" [attr.stroke]=\"dep.color\"\n                    [attr.marker-end]=\"mergedConfig().linkOptions.showArrow !== false ? (dep.isCritical ? 'url(#k-arrowhead-critical)' : 'url(#k-arrowhead-default)') : null\"\n                    [class]=\"dep.dependency.cssClass || ''\" [class.k-critical-dep]=\"dep.isCritical\" (click)=\"onDependencyClick(dep.dependency, $event)\"/>\n                }\n                @if (linkDragLine()) {\n                  <line class=\"k-link-drag-line\" [attr.x1]=\"linkDragLine()!.x1\" [attr.y1]=\"linkDragLine()!.y1\" [attr.x2]=\"linkDragLine()!.x2\" [attr.y2]=\"linkDragLine()!.y2\"\n                    stroke=\"#ff6358\" stroke-width=\"2\" stroke-dasharray=\"4 3\"/>\n                }\n              </svg>\n              @if (isDraggingZoom() && zoomDragStart() && zoomDragCurrent() && zoomOverlayWidth() > 5) {\n                <div class=\"k-gantt-zoom-overlay\" [style.left.px]=\"zoomOverlayLeft()\" [style.width.px]=\"zoomOverlayWidth()\" [style.height.px]=\"totalHeight()\">\n                  <div class=\"k-zoom-overlay-badge\">{{ zoomOverlayDateRangeText() }}</div>\n                </div>\n              }\n            </div>\n          </div>\n        </div>\n      </div>\n\n      @if (showLoading()) {\n        <div class=\"k-loading-overlay\"><div class=\"k-loading-spinner\"><div class=\"k-spinner-circle\"></div><span class=\"k-loading-text\">{{ i18n.common.loading }}</span></div></div>\n      }\n    </div>\n\n    @if (tooltipTask()) {\n      <div class=\"k-bar-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n        @if (tooltipTemplate()) {\n          <ng-container *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: { task: tooltipTask()!, subtask: tooltipSubtask() ?? undefined } }\" />\n        } @else {\n          <div class=\"k-bar-tooltip-title\">{{ tooltipTask()!.name }}</div>\n          @if (tooltipSubtask()) {\n            <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">Subtask</span><span class=\"k-bar-tooltip-value\">{{ tooltipSubtask()!.name }}</span></div>\n            <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">Start</span><span class=\"k-bar-tooltip-value\">{{ formatDateFull(tooltipSubtask()!.start) }}</span></div>\n            <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">End</span><span class=\"k-bar-tooltip-value\">{{ formatDateFull(tooltipSubtask()!.end) }}</span></div>\n            @if (tooltipSubtask()!.progress != null) { <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">Progress</span><span class=\"k-bar-tooltip-value\">{{ tooltipSubtask()!.progress }}%</span></div> }\n          } @else {\n            <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">Start</span><span class=\"k-bar-tooltip-value\">{{ formatDateFull(tooltipTask()!.start) }}</span></div>\n            <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">End</span><span class=\"k-bar-tooltip-value\">{{ formatDateFull(tooltipTask()!.end) }}</span></div>\n            <div class=\"k-bar-tooltip-row\"><span class=\"k-bar-tooltip-label\">Progress</span><span class=\"k-bar-tooltip-value\">{{ tooltipTask()!.progress }}%</span></div>\n            @if (showCriticalPath()) {\n              <div class=\"k-bar-tooltip-row\">\n                <span class=\"k-bar-tooltip-label\">Slack</span>\n                <span class=\"k-bar-tooltip-value\" [style.color]=\"isTaskCritical(tooltipTask()!.id) ? 'var(--k-danger, #ff6358)' : 'inherit'\">\n                  {{ isTaskCritical(tooltipTask()!.id) ? '0 days (Critical)' : getTaskSlackDays(tooltipTask()!.id) + ' days' }}\n                </span>\n              </div>\n            }\n          }\n        }\n      </div>\n    }\n\n    @if (rowTooltipData()) {\n      <div class=\"k-bar-tooltip k-row-tooltip\" [style.left.px]=\"rowTooltipX()\" [style.top.px]=\"rowTooltipY()\">\n        <div class=\"k-bar-tooltip-title\">Tasks in this row</div>\n        @for (t of rowTooltipData()!.allTasks; track t.id) {\n          <div class=\"k-row-tooltip-task\">\n            <span class=\"k-row-tooltip-dot\" [style.background]=\"t.color || '#4a90d9'\"></span>\n            <span class=\"k-row-tooltip-name\">{{ t.name }}</span>\n            <span class=\"k-bar-tooltip-value\">{{ t.progress }}%</span>\n          </div>\n        }\n      </div>\n    }\n  `,\n  styles: [`\n    :host { display: block; height: 100%; min-height: var(--ngx-gantt-min-height, 420px); position: relative; }\n    .k-gantt { display: flex; flex-direction: column; height: 100%; min-height: inherit; width: 100%; background: var(--ngx-gantt-bg, #ffffff); border: 1px solid var(--ngx-gantt-border, #dee2e6); border-radius: 4px; font-family: var(--ngx-gantt-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif); font-size: var(--ngx-gantt-font-size, 13px); color: var(--ngx-gantt-text, #212529); overflow: hidden; position: relative; }\n    .k-gantt-body { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n    .k-gantt-toolbar { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-bottom: 1px solid var(--ngx-gantt-border, #dee2e6); background: var(--ngx-gantt-header-bg, #f1f3f5); flex-shrink: 0; }\n    .k-toolbar-group { display: flex; gap: 4px; }\n    .k-toolbar-btn { padding: 4px 12px; border: 1px solid var(--ngx-gantt-border, #dee2e6); border-radius: 4px; background: var(--ngx-gantt-bg, #fff); color: var(--ngx-gantt-text, #212529); font-size: 12px; cursor: pointer; font-family: inherit; transition: all 0.12s; }\n    .k-toolbar-btn:hover { background: var(--ngx-gantt-hover-bg, #e8f0fe); }\n    .k-toolbar-btn.k-active { background: var(--k-primary, #4a90d9); color: #fff; border-color: var(--k-primary, #4a90d9); }\n    .k-gantt-treelist { display: flex; flex-direction: column; flex-shrink: 0; border-right: 1px solid var(--ngx-gantt-border, #dee2e6); overflow: hidden; background: var(--ngx-gantt-bg, #ffffff); }\n    .k-treelist-header { flex-shrink: 0; background: var(--ngx-gantt-header-bg, #f1f3f5); border-bottom: 1px solid var(--ngx-gantt-border, #dee2e6); overflow: hidden; display: flex; align-items: flex-end; }\n    .k-treelist-header-table, .k-treelist-table { width: 100%; border-collapse: collapse; table-layout: fixed; }\n    .k-header-cell { padding: 8px; text-align: left; font-size: 12px; font-weight: 600; color: var(--ngx-gantt-header-text, #495057); border-right: 1px solid var(--ngx-gantt-border, #dee2e6); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .k-header-cell:last-child { border-right: none; text-align: center; }\n    .k-treelist-content { flex: 1; overflow: hidden; }\n    .k-treelist-row { cursor: default; border-bottom: 1px solid var(--ngx-gantt-grid-line, #ebedf0); }\n    .k-treelist-row.k-alt { background: var(--ngx-gantt-alt-bg, #f8f9fa); }\n    .k-treelist-row.k-hover { background: var(--ngx-gantt-hover-bg, #e8f0fe) !important; }\n    .k-treelist-row.k-selected { background: var(--ngx-gantt-selected-bg, #d0e1f9) !important; }\n    .k-treelist-cell { padding: 0 8px; height: 100%; vertical-align: middle; border-right: 1px solid var(--ngx-gantt-grid-line, #ebedf0); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n    .k-treelist-cell:last-child { border-right: none; }\n    .k-group-header-row { background: var(--ngx-gantt-header-bg, #f1f3f5) !important; font-weight: 600; }\n    .k-group-cell { display: flex; align-items: center; gap: 4px; }\n    .k-group-title { font-size: 13px; font-weight: 700; }\n    .k-group-row { background: var(--ngx-gantt-header-bg, #f1f3f5) !important; }\n    .k-name-cell { display: flex; align-items: center; gap: 0; }\n    .k-indent { display: inline-block; flex-shrink: 0; }\n    .k-name-wrapper { display: flex; flex-direction: column; min-width: 0; justify-content: center; gap: 2px; overflow: hidden; }\n    .k-extra-tasks-chips { display: flex; flex-wrap: wrap; gap: 3px; }\n    .k-extra-task-chip { display: inline-flex; align-items: center; padding: 0 5px; height: 14px; border-radius: 7px; font-size: 10px; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 110px; opacity: 0.9; font-weight: 500; }\n    .k-multi-pct { cursor: help; }\n    .k-drag-handle { cursor: grab; color: var(--ngx-gantt-text-secondary, #6c757d); font-size: 12px; padding: 0 4px; flex-shrink: 0; opacity: 0.5; user-select: none; }\n    .k-drag-handle:hover { opacity: 1; }\n    .k-collapse-btn { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; flex-shrink: 0; background: none; border: none; cursor: pointer; padding: 0; color: var(--ngx-gantt-text-secondary, #6c757d); border-radius: 3px; }\n    .k-collapse-btn:hover { background: var(--ngx-gantt-border, #dee2e6); }\n    .k-icon { font-size: 8px; transition: transform 0.15s ease; display: inline-block; }\n    .k-icon.k-collapsed { transform: rotate(-90deg); }\n    .k-collapse-spacer { display: inline-block; width: 20px; flex-shrink: 0; }\n    .k-milestone-icon { color: var(--ngx-gantt-milestone-color, #e74c3c); margin-right: 4px; font-size: 10px; flex-shrink: 0; }\n    .k-task-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n    .k-summary-name { font-weight: 600; }\n    .k-date-cell { font-size: 11px; color: var(--ngx-gantt-text-secondary, #6c757d); text-align: center; }\n    .k-pct-cell { font-size: 11px; text-align: center; font-weight: 500; }\n    .k-splitbar { width: 7px; flex-shrink: 0; background: var(--ngx-gantt-header-bg, #f1f3f5); border-left: 1px solid var(--ngx-gantt-border, #dee2e6); border-right: 1px solid var(--ngx-gantt-border, #dee2e6); cursor: col-resize; display: flex; align-items: center; justify-content: center; user-select: none; z-index: 2; }\n    .k-splitbar:hover { background: var(--ngx-gantt-border, #dee2e6); }\n    .k-splitbar-icon { color: var(--ngx-gantt-text-secondary, #6c757d); font-size: 14px; line-height: 1; }\n    .k-gantt-timeline { flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; }\n    .k-timeline-header { flex-shrink: 0; overflow: hidden; background: var(--ngx-gantt-header-bg, #f1f3f5); border-bottom: 1px solid var(--ngx-gantt-border, #dee2e6); }\n    .k-timeline-header-wrap { position: relative; display: flex; flex-direction: column; height: 100%; }\n    .k-header-row { position: relative; flex: 1; }\n    .k-header-primary { border-bottom: 1px solid var(--ngx-gantt-border, #dee2e6); }\n    .k-header-group-cell { position: absolute; top: 0; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; color: var(--ngx-gantt-header-text, #495057); border-right: 1px solid var(--ngx-gantt-border, #dee2e6); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding: 0 4px; box-sizing: border-box; }\n    .k-header-tick-cell { position: absolute; top: 0; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 11px; color: var(--ngx-gantt-text-secondary, #6c757d); border-right: 1px solid var(--ngx-gantt-grid-line, #ebedf0); white-space: nowrap; box-sizing: border-box; }\n    .k-header-tick-cell.k-weekend { background: var(--ngx-gantt-weekend-bg, rgba(0,0,0,0.02)); color: #adb5bd; }\n    .k-header-tick-cell.k-today-header { color: var(--k-danger, #ff6358); font-weight: 700; }\n    .k-timeline-content { flex: 1; overflow: auto; }\n    .k-timeline-canvas { position: relative; overflow: hidden; }\n    .k-gantt-rows { position: absolute; top: 0; left: 0; right: 0; }\n    .k-gantt-row { position: absolute; left: 0; right: 0; border-bottom: 1px solid var(--ngx-gantt-grid-line, #ebedf0); }\n    .k-gantt-row.k-alt { background: var(--ngx-gantt-alt-bg, #f8f9fa); }\n    .k-gantt-row.k-hover { background: var(--ngx-gantt-hover-bg, #e8f0fe) !important; }\n    .k-gantt-row.k-selected { background: var(--ngx-gantt-selected-bg, #d0e1f9) !important; }\n    .k-gantt-columns { position: absolute; top: 0; left: 0; }\n    .k-gantt-column { position: absolute; top: 0; border-right: 1px solid var(--ngx-gantt-grid-line, #ebedf0); box-sizing: border-box; }\n    .k-gantt-column.k-weekend-col { background: var(--ngx-gantt-weekend-bg, rgba(0,0,0,0.02)); }\n    .k-gantt-column.k-alt-col { background: var(--ngx-gantt-alt-col-bg, rgba(0,0,0,0.03)); }\n    .k-today-marker { position: absolute; top: 0; width: 2px; background: var(--k-danger, #ff6358); z-index: 3; pointer-events: none; }\n    .k-today-indicator { position: absolute; top: -1px; left: -5px; width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 8px solid var(--k-danger, #ff6358); }\n    .k-gantt-baselines { position: absolute; top: 0; left: 0; z-index: 1; }\n    .k-baseline-bar { position: absolute; background: rgba(0,0,0,0.08); border: 1px dashed rgba(0,0,0,0.15); border-radius: 3px; pointer-events: none; }\n    .k-gantt-tasks { position: absolute; top: 0; left: 0; z-index: 2; }\n    .k-task-wrap { position: absolute; left: 0; right: 0; display: flex; align-items: center; pointer-events: none; }\n    .k-task { position: absolute; height: var(--ngx-gantt-bar-height, 24px); border-radius: 4px; cursor: grab; pointer-events: all; display: flex; align-items: center; justify-content: center; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.06); transition: box-shadow 0.15s ease; user-select: none; }\n    .k-task:hover { box-shadow: 0 3px 8px rgba(0,0,0,0.18), 0 1px 3px rgba(0,0,0,0.1); }\n    .k-task:active { cursor: grabbing; }\n    .k-task.k-focused { outline: 2px solid var(--k-primary, #4a90d9); outline-offset: 2px; }\n    .k-task.k-selected { outline: 2px solid var(--k-primary, #4a90d9); outline-offset: 1px; }\n    .k-task-range { height: 8px !important; border-radius: 4px; cursor: pointer; opacity: 0.8; }\n    .k-task-range .k-task-text { font-size: 10px; }\n    .k-task-progress { position: absolute; top: 0; left: 0; height: 100%; overflow: hidden; border-radius: 4px 0 0 4px; }\n    .k-task-progress-inner { width: 10000px; height: 100%; background: var(--ngx-gantt-bar-progress-bg, rgba(0,0,0,0.15)); }\n    .k-task-text { position: relative; z-index: 1; padding: 0 8px; color: var(--ngx-gantt-bar-text, #ffffff); font-size: 12px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-shadow: 0 1px 1px rgba(0,0,0,0.15); }\n    .k-resize-handle { position: absolute; top: 0; width: 6px; height: 100%; cursor: col-resize; pointer-events: all; z-index: 2; }\n    .k-resize-w { left: 0; }\n    .k-resize-e { right: 0; }\n    .k-resize-handle:hover { background: rgba(255,255,255,0.25); }\n    .k-link-connector { position: absolute; top: 50%; width: 10px; height: 10px; border-radius: 50%; background: var(--k-danger, #ff6358); transform: translateY(-50%); cursor: crosshair; pointer-events: all; opacity: 0; transition: opacity 0.15s ease; z-index: 5; }\n    .k-task:hover .k-link-connector { opacity: 1; }\n    .k-link-start { left: -5px; }\n    .k-link-end { right: -5px; }\n    .k-link-drag-line { pointer-events: none; }\n    .k-task-with-subtasks { overflow: hidden; box-shadow: none; }\n    .k-task-with-subtasks:hover { box-shadow: none; }\n    .k-task-with-subtasks.k-dragging { background: rgba(0,0,0,0.06) !important; border: 1px dashed rgba(0,0,0,0.2); border-radius: 4px; }\n    .k-subtask-segment { position: absolute; top: 0; height: 100%; border-radius: 4px; display: flex; align-items: center; justify-content: center; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.12); transition: box-shadow 0.15s ease, transform 0.1s ease; cursor: pointer; pointer-events: all; min-width: 4px; }\n    .k-subtask-segment:hover { box-shadow: 0 3px 8px rgba(0,0,0,0.22); transform: scaleY(1.08); z-index: 1; }\n    .k-subtask-segment.transit-arrow { height: 40%; top: 30%; border-radius: 2px; box-shadow: none; }\n    .k-subtask-text { position: relative; z-index: 1; padding: 0 6px; color: #fff; font-size: 11px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-shadow: 0 1px 1px rgba(0,0,0,0.2); }\n    .k-subtask-progress { position: absolute; top: 0; left: 0; height: 100%; background: rgba(0,0,0,0.15); border-radius: 4px 0 0 4px; pointer-events: none; }\n    .k-task-summary { position: absolute; height: 10px; pointer-events: all; cursor: pointer; display: flex; align-items: flex-end; }\n    .k-task-summary.k-selected { outline: 2px solid var(--k-primary, #4a90d9); outline-offset: 3px; border-radius: 2px; }\n    .k-summary-bar { position: relative; width: 100%; height: 6px; background: var(--ngx-gantt-summary-color, #495057); }\n    .k-summary-progress { height: 100%; background: #343a40; }\n    .k-summary-left-cap, .k-summary-right-cap { position: absolute; bottom: 0; width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 6px solid var(--ngx-gantt-summary-color, #495057); }\n    .k-summary-left-cap { left: -1px; }\n    .k-summary-right-cap { right: -1px; }\n    .k-milestone { position: absolute; pointer-events: all; cursor: pointer; }\n    .k-milestone.k-selected { outline: 2px solid var(--k-primary, #4a90d9); outline-offset: 4px; border-radius: 2px; }\n    .k-milestone-diamond { width: 16px; height: 16px; background: var(--ngx-gantt-milestone-color, #e74c3c); transform: rotate(45deg); border-radius: 2px; box-shadow: 0 1px 3px rgba(0,0,0,0.15); }\n    .k-gantt-dependencies { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none; }\n    .k-dep-line { fill: none; stroke: var(--k-dependency-line, #a0aec0); stroke-width: 1.5; pointer-events: stroke; cursor: pointer; }\n    .k-dep-line:hover { stroke-width: 3; }\n    .k-loading-overlay { position: absolute; inset: 0; background: rgba(255,255,255,0.7); z-index: 100; display: flex; align-items: center; justify-content: center; }\n    .k-loading-spinner { display: flex; flex-direction: column; align-items: center; gap: 12px; }\n    @keyframes k-spin { to { transform: rotate(360deg); } }\n    .k-spinner-circle { width: 32px; height: 32px; border: 3px solid var(--ngx-gantt-border, #dee2e6); border-top-color: var(--k-primary, #4a90d9); border-radius: 50%; animation: k-spin 0.8s linear infinite; }\n    .k-loading-text { font-size: 12px; color: var(--ngx-gantt-text-secondary, #6c757d); }\n    @keyframes k-tooltip-fadein { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }\n    .k-bar-tooltip { position: absolute; z-index: 9999; background: var(--ngx-gantt-tooltip-bg, #2d3748); color: var(--ngx-gantt-tooltip-text, #ffffff); border-radius: 6px; padding: 10px 14px; min-width: 180px; box-shadow: 0 4px 16px rgba(0,0,0,0.22); pointer-events: none; font-size: 12px; line-height: 1.5; animation: k-tooltip-fadein 0.15s ease; }\n    .k-bar-tooltip-title { font-weight: 700; font-size: 13px; margin-bottom: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 220px; }\n    .k-bar-tooltip-row { display: flex; gap: 12px; margin-top: 3px; }\n    .k-bar-tooltip-label { color: var(--ngx-gantt-tooltip-label, rgba(255,255,255,0.65)); white-space: nowrap; min-width: 60px; flex-shrink: 0; }\n    .k-bar-tooltip-value { font-weight: 500; white-space: nowrap; text-align: right; margin-left: auto; }\n    .k-row-tooltip { min-width: 240px; }\n    .k-row-tooltip-task { display: flex; align-items: center; gap: 6px; margin-top: 5px; padding-top: 5px; border-top: 1px solid rgba(255,255,255,0.12); }\n    .k-row-tooltip-task:first-of-type { border-top: none; }\n    .k-row-tooltip-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }\n    .k-row-tooltip-name { flex: 1; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n    .k-gantt.k-no-grid .k-header-cell, .k-gantt.k-no-grid .k-treelist-cell, .k-gantt.k-no-grid .k-treelist-row, .k-gantt.k-no-grid .k-header-group-cell, .k-gantt.k-no-grid .k-header-tick-cell, .k-gantt.k-no-grid .k-gantt-row, .k-gantt.k-no-grid .k-gantt-column { border: none !important; }\n    .k-gantt-zoom-overlay { position: absolute; top: 0; background: rgba(37, 99, 235, 0.15); border-left: 3px solid var(--k-primary, #3b82f6); border-right: 3px solid var(--k-primary, #3b82f6); z-index: 10; pointer-events: none; backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px); box-sizing: border-box; }\n    .k-zoom-overlay-badge { position: absolute; top: 8px; left: 50%; transform: translateX(-50%); background: #1e293b; color: #fff; padding: 4px 12px; border-radius: 20px; font-size: 11px; font-weight: 600; white-space: nowrap; box-shadow: 0 4px 12px rgba(0,0,0,0.18); border: 1px solid rgba(255,255,255,0.1); }\n    .k-timeline-content.k-zoom-dragging * { pointer-events: none !important; }\n    .k-timeline-content.k-zoom-mode-cursor { cursor: crosshair !important; }\n    .k-timeline-content.k-zoom-mode-cursor .k-task, .k-timeline-content.k-zoom-mode-cursor .k-milestone, .k-timeline-content.k-zoom-mode-cursor .k-task-summary { cursor: crosshair !important; pointer-events: none !important; }\n\n    /* Dark Mode variables override */\n    :host-context(.dark-theme) .k-gantt,\n    .k-gantt-dark,\n    .k-gantt.k-gantt-dark {\n      --ngx-gantt-bg: #1e1e24;\n      --ngx-gantt-text: #e5e7eb;\n      --ngx-gantt-border: #374151;\n      --ngx-gantt-header-bg: #111827;\n      --ngx-gantt-header-text: #9ca3af;\n      --ngx-gantt-grid-line: #2d3748;\n      --ngx-gantt-alt-bg: #1f2937;\n      --ngx-gantt-hover-bg: rgba(37, 99, 235, 0.2);\n      --ngx-gantt-selected-bg: rgba(37, 99, 235, 0.4);\n      --ngx-gantt-weekend-bg: rgba(255, 255, 255, 0.02);\n      --ngx-gantt-alt-col-bg: rgba(255, 255, 255, 0.03);\n      --ngx-gantt-tooltip-bg: #111827;\n      --ngx-gantt-tooltip-text: #f3f4f6;\n      --ngx-gantt-tooltip-label: rgba(243, 244, 246, 0.65);\n    }\n\n    /* Additional dark mode adjustments for inner button borders and headers */\n    :host-context(.dark-theme) .k-toolbar-btn,\n    .k-gantt-dark .k-toolbar-btn {\n      background: #1f2937;\n      color: #e5e7eb;\n      border-color: #374151;\n    }\n    :host-context(.dark-theme) .k-toolbar-btn:hover,\n    .k-gantt-dark .k-toolbar-btn:hover {\n      background: #374151;\n    }\n    :host-context(.dark-theme) .k-toolbar-btn.k-active,\n    .k-gantt-dark .k-toolbar-btn.k-active {\n      background: var(--k-primary, #4a90d9);\n      color: #fff;\n      border-color: var(--k-primary, #4a90d9);\n    }\n    :host-context(.dark-theme) .k-splitbar,\n    .k-gantt-dark .k-splitbar {\n      background: #111827;\n      border-color: #374151;\n    }\n    :host-context(.dark-theme) .k-collapse-btn:hover,\n    .k-gantt-dark .k-collapse-btn:hover {\n      background: #374151;\n    }\n\n    /* Critical Path Highlighting */\n    .k-task.k-critical-task {\n      border: 1.5px solid var(--k-danger, #ff6358) !important;\n      box-shadow: 0 0 8px rgba(255, 99, 88, 0.4), 0 1px 3px rgba(0,0,0,0.12) !important;\n    }\n    .k-milestone.k-critical-task .k-milestone-diamond {\n      background: var(--k-danger, #ff6358) !important;\n      border: 1.5px solid var(--k-danger, #ff6358) !important;\n      box-shadow: 0 0 8px rgba(255, 99, 88, 0.5) !important;\n    }\n    .k-task-summary.k-critical-task .k-summary-bar {\n      background: var(--k-danger, #ff6358) !important;\n    }\n    .k-task-summary.k-critical-task .k-summary-left-cap,\n    .k-task-summary.k-critical-task .k-summary-right-cap {\n      border-top-color: var(--k-danger, #ff6358) !important;\n    }\n    .k-dep-line.k-critical-dep {\n      stroke: var(--k-danger, #ff6358) !important;\n      stroke-width: 2.5 !important;\n      filter: drop-shadow(0 0 2px rgba(255, 99, 88, 0.6));\n    }\n    .k-dep-line.k-critical-dep:hover {\n      stroke-width: 4 !important;\n    }\n\n    /* Slack Float Trail */\n    .k-task-slack-trail {\n      position: absolute;\n      top: 50%;\n      height: 2px;\n      border-top: 2px dashed var(--k-warning, #f59e0b);\n      transform: translateY(-50%);\n      pointer-events: none;\n      z-index: 1;\n      opacity: 0.75;\n    }\n    .k-task-slack-trail::after {\n      content: '';\n      position: absolute;\n      right: 0;\n      top: -4px;\n      width: 2px;\n      height: 8px;\n      background: var(--k-warning, #f59e0b);\n      border-radius: 1px;\n    }\n  `]\n})\nexport class GanttChartComponent {\n  i18n = inject(NGX_CORE_I18N);\n\n  tasks = input.required<GanttTask[]>();\n  dependencies = input<GanttDependency[]>([]);\n  config = input<Partial<GanttConfig>>({});\n  groups = input<GanttGroup[]>([]);\n  baselineItems = input<GanttBaselineItem[]>([]);\n  tooltipTemplate = input<TemplateRef<{ $implicit: GanttTooltipContext }> | null>(null);\n  enableDragToZoom = input<boolean>(false);\n\n  taskChange = output<GanttTaskChangeEvent>();\n  taskClick = output<GanttTaskClickEvent>();\n  taskDblClick = output<GanttTaskClickEvent>();\n  dependencyClick = output<GanttDependencyClickEvent>();\n  scroll = output<GanttScrollEvent>();\n  zoomChange = output<ZoomLevel>();\n  dragStarted = output<GanttDragEvent>();\n  dragMoved = output<GanttDragEvent>();\n  dragEnded = output<GanttDragEvent>();\n  linkDragStarted = output<GanttLinkDragEvent>();\n  linkDragEnded = output<GanttLinkDragEvent>();\n  lineClick = output<GanttLineClickEvent>();\n  barClick = output<GanttBarClickEvent>();\n  selectedChange = output<GanttSelectedEvent>();\n  viewChange = output<GanttViewChangeEvent>();\n  expandChange = output<GanttExpandChangeEvent>();\n  loadOnScroll = output<GanttLoadOnScrollEvent>();\n  virtualScrolledIndexChange = output<GanttVirtualScrolledIndexChangeEvent>();\n  tableDragStarted = output<GanttTableDragStartedEvent>();\n  tableDragEnded = output<GanttTableDragEndedEvent>();\n  tableDragDropped = output<GanttTableDragDroppedEvent>();\n  zoomRangeChange = output<{ start: Date; end: Date }>();\n\n  private scaleService = inject(GanttScaleService);\n  private layoutService = inject(GanttLayoutService);\n  keyboardService = inject(GanttKeyboardService);\n  private printService = inject(GanttPrintService);\n  private elementRef = inject(ElementRef);\n  private timelineContent = viewChild<ElementRef<HTMLDivElement>>('timelineContent');\n  private treelistContent = viewChild<ElementRef<HTMLDivElement>>('treelistContent');\n\n  private internalCollapsed = signal<Map<string, boolean>>(new Map());\n  private internalGroupExpanded = signal<Map<string, boolean>>(new Map());\n  hoveredTaskId = signal<string | null>(null);\n  private selectedTaskIds = signal<Set<string>>(new Set());\n  scrollLeft = signal(0);\n  private sidebarWidthOverride = signal<number | null>(null);\n  private lastEmittedZoom = signal<ZoomLevel | null>(null);\n  showLoading = signal(false);\n  private loadingTimer: ReturnType<typeof setTimeout> | null = null;\n  tooltipTask = signal<GanttTask | null>(null);\n  tooltipSubtask = signal<GanttSubtask | null>(null);\n  tooltipX = signal(0);\n  tooltipY = signal(0);\n  rowTooltipData = signal<{ allTasks: GanttTask[] } | null>(null);\n  rowTooltipX = signal(0);\n  rowTooltipY = signal(0);\n  linkDragLine = signal<{ x1: number; y1: number; x2: number; y2: number } | null>(null);\n  private linkDragSource: GanttTask | null = null;\n  private tableDragSourceRow: FlatRow | null = null;\n  virtualRange = signal<{ start: number; end: number }>({ start: 0, end: Infinity });\n\n  // Area Zoom State\n  isAreaZoomMode = signal(false);\n  zoomStart = signal<Date | null>(null);\n  zoomEnd = signal<Date | null>(null);\n  zoomColumnWidth = signal<number | null>(null);\n  internalZoomLevel = signal<ZoomLevel | null>(null);\n  isDraggingZoom = signal(false);\n  zoomDragStart = signal<{ x: number, y: number } | null>(null);\n  zoomDragCurrent = signal<{ x: number, y: number } | null>(null);\n\n  showCriticalPath = signal(false);\n\n  criticalPathInfo = computed(() => {\n    if (!this.showCriticalPath()) {\n      return { criticalTaskIds: new Set<string>(), criticalDepKeys: new Set<string>(), taskSlacks: new Map<string, number>() };\n    }\n    return this.computeCriticalPath(this.tasks(), this.dependencies());\n  });\n\n  toggleCriticalPath(): void {\n    this.showCriticalPath.update(v => !v);\n  }\n\n  isDragToZoomEnabled = computed(() => this.enableDragToZoom() || this.mergedConfig().enableDragToZoom || false);\n  isZoomed = computed(() => this.zoomStart() !== null);\n\n  zoomOverlayLeft = computed(() => {\n    const start = this.zoomDragStart();\n    const current = this.zoomDragCurrent();\n    if (!start || !current) return 0;\n    return Math.min(start.x, current.x);\n  });\n\n  zoomOverlayWidth = computed(() => {\n    const start = this.zoomDragStart();\n    const current = this.zoomDragCurrent();\n    if (!start || !current) return 0;\n    return Math.abs(start.x - current.x);\n  });\n\n  zoomOverlayDateRangeText = computed(() => {\n    const start = this.zoomDragStart();\n    const current = this.zoomDragCurrent();\n    if (!start || !current) return '';\n    const maxVal = this.totalWidth();\n    const leftX = Math.max(0, Math.min(maxVal, Math.min(start.x, current.x)));\n    const rightX = Math.max(0, Math.min(maxVal, Math.max(start.x, current.x)));\n\n    const cfg = this.mergedConfig();\n    const baseRange = getDateRange(this.tasks());\n    const currentStart = this.zoomStart() || baseRange.start;\n\n    const date1 = this.scaleService.xToDate(leftX, currentStart, cfg.columnWidth, cfg.zoomLevel);\n    const date2 = this.scaleService.xToDate(rightX, currentStart, cfg.columnWidth, cfg.zoomLevel);\n\n\n    const format = (d: Date) => d.toLocaleDateString(cfg.locale, { month: 'short', day: 'numeric' });\n    return `${format(date1)} \\u2013 ${format(date2)}`;\n  });\n\n  mergedConfig = computed<GanttConfig>(() => {\n    const base = { ...DEFAULT_GANTT_CONFIG, ...this.config() };\n    const sbOverride = this.sidebarWidthOverride();\n    if (sbOverride !== null) base.sidebarWidth = sbOverride;\n\n    const intZoom = this.internalZoomLevel();\n    if (intZoom !== null) base.zoomLevel = intZoom;\n\n    const customColWidth = this.zoomColumnWidth();\n    if (customColWidth !== null) base.columnWidth = customColWidth;\n\n    if (this.config().linkOptions) base.linkOptions = { ...DEFAULT_GANTT_CONFIG.linkOptions, ...this.config().linkOptions };\n    if (this.config().toolbarOptions) base.toolbarOptions = { ...DEFAULT_GANTT_CONFIG.toolbarOptions, ...this.config().toolbarOptions };\n    if (this.config().styleOptions) base.styleOptions = { ...DEFAULT_GANTT_CONFIG.styleOptions, ...this.config().styleOptions };\n    return base;\n  });\n\n  themeVars = computed<string>(() => {\n    const theme = this.mergedConfig().styleOptions.themes?.[this.mergedConfig().styleOptions.defaultTheme || 'default'];\n    if (!theme) return '';\n    const v: string[] = [];\n    if (theme.primary) v.push('--k-primary:' + theme.primary);\n    if (theme.danger) v.push('--k-danger:' + theme.danger);\n    if (theme.background) v.push('--ngx-gantt-bg:' + theme.background);\n    return v.join(';');\n  });\n\n  sidebarColumns = computed<GanttColumnDef[]>(() => {\n    const columns = this.mergedConfig().sidebarColumns ?? [];\n    if (columns.length === 0) return DEFAULT_GANTT_CONFIG.sidebarColumns;\n    return columns.map(c => ({ ...c, width: Math.max(60, c.width || 120) }));\n  });\n\n  private effectiveTasks = computed<GanttTask[]>(() => {\n    const collapsed = this.internalCollapsed();\n    return this.tasks().map(t => ({ ...t, collapsed: collapsed.has(t.id) ? collapsed.get(t.id)! : t.collapsed }));\n  });\n\n  private effectiveGroups = computed<GanttGroup[]>(() => {\n    const m = this.internalGroupExpanded();\n    return this.groups().map(g => ({ ...g, expanded: m.has(g.id) ? m.get(g.id)! : (g.expanded !== false) }));\n  });\n\n  private flatRows = computed<FlatRow[]>(() =>\n    this.layoutService.flattenTasks(this.effectiveTasks(), this.effectiveGroups().length > 0 ? this.effectiveGroups() : undefined)\n  );\n\n  visibleRows = computed<FlatRow[]>(() => this.flatRows().filter(r => r.isVisible));\n\n  renderedRows = computed<FlatRow[]>(() => {\n    const rows = this.visibleRows();\n    if (!this.mergedConfig().virtualScrollEnabled) return rows;\n    const range = this.virtualRange();\n    return rows.slice(range.start, Math.min(range.end, rows.length));\n  });\n\n  private dateRange = computed(() => {\n    const customStart = this.zoomStart();\n    const customEnd = this.zoomEnd();\n    if (customStart && customEnd) {\n      return { start: customStart, end: customEnd };\n    }\n    return getDateRange(this.tasks());\n  });\n  private columnDates = computed(() => getColumnDates(this.dateRange().start, this.dateRange().end, this.mergedConfig().zoomLevel));\n  totalWidth = computed(() => this.columnDates().length * this.mergedConfig().columnWidth);\n  totalHeight = computed(() => this.visibleRows().length * this.mergedConfig().rowHeight);\n\n  headerColumns = computed(() => {\n    const cfg = this.mergedConfig();\n    const today = startOfDay(new Date());\n    return this.columnDates().map((date, i) => ({\n      x: i * cfg.columnWidth, width: cfg.columnWidth, date,\n      label: this.getSecondaryLabel(date, cfg.zoomLevel, cfg.locale),\n      isWeekend: isWeekend(date), isToday: date.getTime() === today.getTime(),\n    }));\n  });\n\n  primaryHeaderGroups = computed(() => {\n    const cfg = this.mergedConfig();\n    const dates = this.columnDates();\n    if (dates.length === 0) return [];\n    const groups: { x: number; width: number; label: string }[] = [];\n    let currentLabel = this.getPrimaryLabel(dates[0], cfg.zoomLevel, cfg.locale);\n    let startIdx = 0;\n    for (let i = 1; i <= dates.length; i++) {\n      const label = i < dates.length ? this.getPrimaryLabel(dates[i], cfg.zoomLevel, cfg.locale) : '';\n      if (label !== currentLabel || i === dates.length) {\n        groups.push({ x: startIdx * cfg.columnWidth, width: (i - startIdx) * cfg.columnWidth, label: currentLabel });\n        currentLabel = label; startIdx = i;\n      }\n    }\n    return groups;\n  });\n\n  todayX = computed<number | null>(() => {\n    const today = startOfDay(new Date());\n    const range = this.dateRange();\n    if (today < range.start || today > range.end) return null;\n    const cfg = this.mergedConfig();\n    return this.scaleService.dateToX(today, range.start, cfg.columnWidth, cfg.zoomLevel);\n  });\n\n  taskBars = computed(() => {\n    const cfg = this.mergedConfig();\n    const range = this.dateRange();\n    const critInfo = this.criticalPathInfo();\n\n    const makeBar = (task: GanttTask, top: number, rowIndex: number, isSummary: boolean, primaryTaskId: string, isGroupHeader: boolean) => {\n      const slackMs = critInfo.taskSlacks?.get(task.id) || 0;\n      let slackWidth = 0;\n      if (!isGroupHeader && !task.isMilestone && !isSummary && slackMs > 1000) {\n        const endX = this.scaleService.dateToX(new Date(task.end.getTime() + slackMs), range.start, cfg.columnWidth, cfg.zoomLevel);\n        const startX = this.scaleService.dateToX(task.end, range.start, cfg.columnWidth, cfg.zoomLevel);\n        slackWidth = Math.max(0, endX - startX);\n      }\n\n      return {\n        task, left: isGroupHeader ? 0 : this.scaleService.dateToX(task.start, range.start, cfg.columnWidth, cfg.zoomLevel),\n        width: isGroupHeader || task.isMilestone ? 0 : this.scaleService.getBarWidth(task.start, task.end, range.start, cfg.columnWidth, cfg.zoomLevel),\n        top, isSummary, barHeight: cfg.barHeight, rowIndex, primaryTaskId, isGroupHeader,\n        slackWidth\n      };\n    };\n    const bars: ReturnType<typeof makeBar>[] = [];\n    this.renderedRows().forEach((row, idx) => {\n      const top = idx * cfg.rowHeight;\n      const isSummary = row.hasChildren && !row.task.isMilestone && !row.isGroupHeader;\n      bars.push(makeBar(row.task, top, idx, isSummary, row.task.id, row.isGroupHeader));\n      if (!row.isGroupHeader) {\n        for (const extra of row.extraTasks) bars.push(makeBar(extra, top, idx, false, row.task.id, false));\n      }\n    });\n    return bars;\n  });\n\n  baselineBars = computed(() => {\n    if (!this.mergedConfig().showBaseline) return [];\n    const cfg = this.mergedConfig();\n    const range = this.dateRange();\n    const rows = this.renderedRows();\n    const rowMap = new Map(rows.map((r, idx) => [r.task.id, idx]));\n    return this.baselineItems().filter(bl => bl.start && bl.end && rowMap.has(bl.id)).map(bl => {\n      const rowIdx = rowMap.get(bl.id)!;\n      return {\n        id: bl.id, start: bl.start!, end: bl.end!,\n        left: this.scaleService.dateToX(bl.start!, range.start, cfg.columnWidth, cfg.zoomLevel),\n        width: this.scaleService.getBarWidth(bl.start!, bl.end!, range.start, cfg.columnWidth, cfg.zoomLevel),\n        top: rowIdx * cfg.rowHeight + (cfg.rowHeight - cfg.barHeight) / 2 + cfg.barHeight - 4,\n      };\n    });\n  });\n\n  dependencyPaths = computed(() => {\n    const bars = this.taskBars();\n    const cfg = this.mergedConfig();\n    const lineType = cfg.linkOptions.lineType || GanttLinkLineType.Straight;\n    const barMap = new Map(bars.map(b => [b.task.id, b]));\n    const critInfo = this.criticalPathInfo();\n    return this.dependencies().filter(dep => barMap.has(dep.fromId) && barMap.has(dep.toId)).map(dep => {\n      const from = barMap.get(dep.fromId)!;\n      const to = barMap.get(dep.toId)!;\n      const barH = from.isSummary ? 10 : cfg.barHeight;\n      const fromCY = from.top + cfg.rowHeight / 2;\n      const toCY = to.top + cfg.rowHeight / 2;\n      const fromRect: Rect = { x: from.left, y: fromCY - barH / 2, width: from.width || 16, height: barH };\n      const toRect: Rect = { x: to.left, y: toCY - (to.isSummary ? 5 : cfg.barHeight / 2), width: to.width || 16, height: to.isSummary ? 10 : cfg.barHeight };\n      const key = dep.fromId + '-' + dep.toId;\n      const isCrit = critInfo.criticalDepKeys.has(key);\n      const depColor = isCrit ? 'var(--k-danger, #ff6358)' : (typeof dep.color === 'string' ? dep.color : (typeof dep.color === 'object' ? dep.color.default : 'var(--k-dependency-line, #a0aec0)'));\n      return { dependency: dep, path: computeDependencyPath(fromRect, toRect, dep.type, 12, lineType), key, color: depColor, isCritical: isCrit };\n    });\n  });\n\n  private computeCriticalPath(\n    tasks: GanttTask[],\n    dependencies: GanttDependency[]\n  ): { criticalTaskIds: Set<string>; criticalDepKeys: Set<string>; taskSlacks: Map<string, number> } {\n    const taskMap = new Map<string, GanttTask>();\n    for (const task of tasks) {\n      taskMap.set(task.id, task);\n    }\n\n    const validDeps = dependencies.filter(\n      (dep) => taskMap.has(dep.fromId) && taskMap.has(dep.toId)\n    );\n\n    const adj = new Map<string, string[]>();\n    const revAdj = new Map<string, string[]>();\n\n    for (const dep of validDeps) {\n      if (!adj.has(dep.fromId)) adj.set(dep.fromId, []);\n      adj.get(dep.fromId)!.push(dep.toId);\n\n      if (!revAdj.has(dep.toId)) revAdj.set(dep.toId, []);\n      revAdj.get(dep.toId)!.push(dep.fromId);\n    }\n\n    const visited = new Map<string, 'visiting' | 'visited'>();\n    const order: string[] = [];\n    let hasCycle = false;\n\n    const dfs = (nodeId: string) => {\n      if (hasCycle) return;\n      if (visited.get(nodeId) === 'visiting') {\n        hasCycle = true;\n        return;\n      }\n      if (visited.get(nodeId) === 'visited') return;\n\n      visited.set(nodeId, 'visiting');\n      const neighbors = adj.get(nodeId) || [];\n      for (const neighbor of neighbors) {\n        dfs(neighbor);\n      }\n      visited.set(nodeId, 'visited');\n      order.push(nodeId);\n    };\n\n    for (const task of tasks) {\n      if (!visited.has(task.id)) {\n        dfs(task.id);\n      }\n    }\n\n    if (hasCycle) {\n      return { criticalTaskIds: new Set(), criticalDepKeys: new Set(), taskSlacks: new Map() };\n    }\n\n    const topoOrder = [...order].reverse();\n\n    const ES = new Map<string, number>();\n    const EF = new Map<string, number>();\n\n    for (const task of tasks) {\n      ES.set(task.id, task.start.getTime());\n      EF.set(task.id, task.end.getTime());\n    }\n\n    for (const u of topoOrder) {\n      const taskU = taskMap.get(u)!;\n      const durationU = taskU.end.getTime() - taskU.start.getTime();\n      const esVal = ES.get(u)!;\n      EF.set(u, esVal + durationU);\n\n      const successors = adj.get(u) || [];\n      for (const v of successors) {\n        const dep = validDeps.find((d) => d.fromId === u && d.toId === v)!;\n        const taskV = taskMap.get(v)!;\n        const durationV = taskV.end.getTime() - taskV.start.getTime();\n        const efVal = EF.get(u)!;\n        const esValU = ES.get(u)!;\n\n        let candES = ES.get(v)!;\n        if (dep.type === DependencyType.FinishToStart) {\n          candES = Math.max(candES, efVal);\n        } else if (dep.type === DependencyType.StartToStart) {\n          candES = Math.max(candES, esValU);\n        } else if (dep.type === DependencyType.FinishToFinish) {\n          candES = Math.max(candES, efVal - durationV);\n        } else if (dep.type === DependencyType.StartToFinish) {\n          candES = Math.max(candES, esValU - durationV);\n        }\n        ES.set(v, candES);\n      }\n    }\n\n    let maxEF = 0;\n    for (const task of tasks) {\n      maxEF = Math.max(maxEF, EF.get(task.id) || 0);\n    }\n\n    const LF = new Map<string, number>();\n    const LS = new Map<string, number>();\n\n    for (const task of tasks) {\n      LF.set(task.id, maxEF);\n      LS.set(task.id, maxEF - (task.end.getTime() - task.start.getTime()));\n    }\n\n    for (const u of order) {\n      const taskU = taskMap.get(u)!;\n      const durationU = taskU.end.getTime() - taskU.start.getTime();\n      const lfVal = LF.get(u)!;\n      LS.set(u, lfVal - durationU);\n\n      const successors = adj.get(u) || [];\n      let minLF = LF.get(u)!;\n\n      for (const v of successors) {\n        const dep = validDeps.find((d) => d.fromId === u && d.toId === v)!;\n        const lsValV = LS.get(v)!;\n        const lfValV = LF.get(v)!;\n\n        if (dep.type === DependencyType.FinishToStart) {\n          minLF = Math.min(minLF, lsValV);\n        } else if (dep.type === DependencyType.StartToStart) {\n          minLF = Math.min(minLF, lsValV + durationU);\n        } else if (dep.type === DependencyType.FinishToFinish) {\n          minLF = Math.min(minLF, lfValV);\n        } else if (dep.type === DependencyType.StartToFinish) {\n          minLF = Math.min(minLF, lfValV + durationU);\n        }\n      }\n      LF.set(u, minLF);\n      LS.set(u, minLF - durationU);\n    }\n\n    const criticalTaskIds = new Set<string>();\n    const threshold = 1000;\n\n    for (const task of tasks) {\n      const isConnected = adj.has(task.id) || revAdj.has(task.id);\n      if (isConnected) {\n        const esVal = ES.get(task.id)!;\n        const lsVal = LS.get(task.id)!;\n        const slack = lsVal - esVal;\n        if (slack <= threshold) {\n          criticalTaskIds.add(task.id);\n        }\n      }\n    }\n\n    const criticalDepKeys = new Set<string>();\n    for (const dep of validDeps) {\n      if (criticalTaskIds.has(dep.fromId) && criticalTaskIds.has(dep.toId)) {\n        const esU = ES.get(dep.fromId)!;\n        const efU = EF.get(dep.fromId)!;\n        const esV = ES.get(dep.toId)!;\n        const efV = EF.get(dep.toId)!;\n        let isActive = false;\n\n        switch (dep.type) {\n          case DependencyType.FinishToStart:\n            isActive = Math.abs(efU - esV) <= threshold;\n            break;\n          case DependencyType.StartToStart:\n            isActive = Math.abs(esU - esV) <= threshold;\n            break;\n          case DependencyType.FinishToFinish:\n            isActive = Math.abs(efU - efV) <= threshold;\n            break;\n          case DependencyType.StartToFinish:\n            isActive = Math.abs(esU - efV) <= threshold;\n            break;\n        }\n\n        if (isActive) {\n          criticalDepKeys.add(dep.fromId + '-' + dep.toId);\n        }\n      }\n    }\n\n    const taskSlacks = new Map<string, number>();\n    for (const task of tasks) {\n      const esVal = ES.get(task.id);\n      const lsVal = LS.get(task.id);\n      if (esVal !== undefined && lsVal !== undefined) {\n        taskSlacks.set(task.id, Math.max(0, lsVal - esVal));\n      }\n    }\n\n    return { criticalTaskIds, criticalDepKeys, taskSlacks };\n  }\n\n  constructor() {\n    effect(() => {\n      const zoom = this.mergedConfig().zoomLevel;\n      if (this.lastEmittedZoom() !== zoom) { this.lastEmittedZoom.set(zoom); this.zoomChange.emit(zoom); }\n    });\n    effect(() => {\n      const loading = this.mergedConfig().loading;\n      const delay = this.mergedConfig().loadingDelay;\n      if (this.loadingTimer) { clearTimeout(this.loadingTimer); this.loadingTimer = null; }\n      if (loading) {\n        if (delay > 0) { this.loadingTimer = setTimeout(() => this.showLoading.set(true), delay); }\n        else { this.showLoading.set(true); }\n      } else { this.showLoading.set(false); }\n    });\n    effect(() => { this.printService.register(this.elementRef); });\n  }\n\n  isTaskSelected(taskId: string): boolean { return this.selectedTaskIds().has(taskId); }\n\n  private toggleSelection(task: GanttTask, event: Event): void {\n    const cfg = this.mergedConfig();\n    const current = new Set(this.selectedTaskIds());\n    if (cfg.selectable && cfg.multiple) {\n      if (current.has(task.id)) current.delete(task.id); else current.add(task.id);\n    } else { current.clear(); current.add(task.id); }\n    this.selectedTaskIds.set(current);\n    if (cfg.selectable) {\n      const selectedTasks = this.tasks().filter(t => current.has(t.id));\n      this.selectedChange.emit({ event, current: task, selectedValue: cfg.multiple ? selectedTasks : task });\n    }\n  }\n\n  onTimelineScroll(): void {\n    const el = this.timelineContent()?.nativeElement;\n    if (!el) return;\n    this.scrollLeft.set(el.scrollLeft);\n    const treeEl = this.treelistContent()?.nativeElement;\n    if (treeEl) treeEl.scrollTop = el.scrollTop;\n    if (this.mergedConfig().virtualScrollEnabled) {\n      const rh = this.mergedConfig().rowHeight;\n      const startIdx = Math.floor(el.scrollTop / rh);\n      const count = Math.ceil(el.clientHeight / rh);\n      this.virtualRange.set({ start: Math.max(0, startIdx - 5), end: startIdx + count + 5 });\n      this.virtualScrolledIndexChange.emit({ index: startIdx, renderedRange: this.virtualRange(), count: this.visibleRows().length });\n    }\n    const cfg = this.mergedConfig();\n    const range = this.dateRange();\n    const visStart = this.scaleService.xToDate(el.scrollLeft, range.start, cfg.columnWidth, cfg.zoomLevel);\n    const visEnd = this.scaleService.xToDate(el.scrollLeft + el.clientWidth, range.start, cfg.columnWidth, cfg.zoomLevel);\n    this.scroll.emit({ scrollLeft: el.scrollLeft, scrollTop: el.scrollTop, visibleStartDate: visStart, visibleEndDate: visEnd });\n    if (cfg.loadOnScroll && (el.scrollLeft < 100 || el.scrollLeft + el.clientWidth > el.scrollWidth - 100)) {\n      this.loadOnScroll.emit({ start: visStart, end: visEnd });\n    }\n  }\n\n  onTreelistWheel(event: WheelEvent): void {\n    const timelineEl = this.timelineContent()?.nativeElement;\n    if (!timelineEl) return;\n    event.preventDefault();\n\n    if (event.shiftKey && event.deltaY !== 0) {\n      timelineEl.scrollLeft += event.deltaY;\n    } else {\n      timelineEl.scrollTop += event.deltaY;\n      timelineEl.scrollLeft += event.deltaX;\n    }\n  }\n\n  onSplitBarDown(event: PointerEvent): void {\n    event.preventDefault();\n    const startX = event.clientX;\n    const startWidth = this.mergedConfig().sidebarWidth;\n    const onMove = (e: PointerEvent) => { this.sidebarWidthOverride.set(Math.max(150, Math.min(600, startWidth + e.clientX - startX))); };\n    const onUp = () => { document.removeEventListener('pointermove', onMove); document.removeEventListener('pointerup', onUp); };\n    document.addEventListener('pointermove', onMove);\n    document.addEventListener('pointerup', onUp);\n  }\n\n  onBarPointerDown(event: PointerEvent, task: GanttTask, mode: 'move' | 'resize-left' | 'resize-right'): void {\n    if (task.draggable === false) return;\n    if (event.shiftKey && this.isDragToZoomEnabled()) return;\n    event.preventDefault(); event.stopPropagation();\n    const startX = event.clientX;\n    const cfg = this.mergedConfig();\n    const barEl = (event.target as HTMLElement).closest('.k-task') as HTMLElement;\n    if (!barEl) return;\n    const origLeft = parseFloat(barEl.style.left) || 0;\n    const origWidth = parseFloat(barEl.style.width) || barEl.offsetWidth;\n    barEl.style.cursor = mode === 'move' ? 'grabbing' : 'col-resize';\n    barEl.style.zIndex = '10'; barEl.style.opacity = '0.85'; barEl.classList.add('k-dragging');\n    this.dragStarted.emit({ task });\n    const onMove = (e: PointerEvent) => {\n      const dx = e.clientX - startX;\n      if (mode === 'move') barEl.style.left = (origLeft + dx) + 'px';\n      else if (mode === 'resize-right') barEl.style.width = Math.max(10, origWidth + dx) + 'px';\n      else { const nw = origWidth - dx; if (nw > 10) { barEl.style.left = (origLeft + dx) + 'px'; barEl.style.width = nw + 'px'; } }\n      this.dragMoved.emit({ task });\n    };\n    const onUp = (e: PointerEvent) => {\n      document.removeEventListener('pointermove', onMove); document.removeEventListener('pointerup', onUp);\n      barEl.style.cursor = ''; barEl.style.zIndex = ''; barEl.style.opacity = ''; barEl.classList.remove('k-dragging');\n      this.dragEnded.emit({ task });\n      const deltaX = e.clientX - startX;\n      if (Math.abs(deltaX) < 2) return;\n\n      const range = this.dateRange();\n      const ps = task.start, pe = task.end;\n      let ns: Date, ne: Date;\n\n      let newLeft = origLeft;\n      let newWidth = origWidth;\n\n      if (mode === 'move') {\n        newLeft = origLeft + deltaX;\n      } else if (mode === 'resize-right') {\n        newWidth = Math.max(10, origWidth + deltaX);\n      } else {\n        const nw = origWidth - deltaX;\n        if (nw > 10) {\n          newLeft = origLeft + deltaX;\n          newWidth = nw;\n        } else {\n          newLeft = origLeft + origWidth - 10;\n          newWidth = 10;\n        }\n      }\n\n      if (mode === 'move') {\n        ns = this.scaleService.xToDate(newLeft, range.start, cfg.columnWidth, cfg.zoomLevel);\n        const duration = pe.getTime() - ps.getTime();\n        ne = new Date(ns.getTime() + duration);\n      } else if (mode === 'resize-right') {\n        ns = ps;\n        ne = this.scaleService.xToDate(newLeft + newWidth, range.start, cfg.columnWidth, cfg.zoomLevel);\n      } else {\n        ns = this.scaleService.xToDate(newLeft, range.start, cfg.columnWidth, cfg.zoomLevel);\n        ne = pe;\n      }\n\n      if (cfg.snapTo !== 'none') {\n        ns = this.scaleService.snapDate(ns, cfg.snapTo);\n        ne = this.scaleService.snapDate(ne, cfg.snapTo);\n      }\n\n      const minDurationMs = cfg.zoomLevel === ZoomLevel.Hour ? 3600000 : 86400000;\n      if (mode !== 'move' && ne.getTime() - ns.getTime() < minDurationMs) {\n        if (mode === 'resize-left') {\n          ns = new Date(ne.getTime() - minDurationMs);\n        } else {\n          ne = new Date(ns.getTime() + minDurationMs);\n        }\n      } else if (ne <= ns) {\n        ne = cfg.zoomLevel === ZoomLevel.Hour ? addHours(ns, 1) : addDays(ns, 1);\n      }\n\n\n      let subs = task.subtasks;\n      if (subs && subs.length > 0) {\n        const od = pe.getTime() - ps.getTime(), nd = ne.getTime() - ns.getTime();\n        if (mode === 'move') {\n          const sh = ns.getTime() - ps.getTime();\n          subs = subs.map(s => ({ ...s, start: new Date(s.start.getTime() + sh), end: new Date(s.end.getTime() + sh) }));\n        } else if (od > 0) {\n          subs = subs.map(s => {\n            const sr = (s.start.getTime() - ps.getTime()) / od, er = (s.end.getTime() - ps.getTime()) / od;\n            return { ...s, start: new Date(ns.getTime() + sr * nd), end: new Date(ns.getTime() + er * nd) };\n          });\n        }\n      }\n      this.taskChange.emit({ task: { ...task, start: ns, end: ne, subtasks: subs }, previousStart: ps, previousEnd: pe });\n    };\n    document.addEventListener('pointermove', onMove); document.addEventListener('pointerup', onUp);\n  }\n\n  onLinkDragStart(event: PointerEvent, task: GanttTask, side: 'start' | 'end'): void {\n    if (event.shiftKey && this.isDragToZoomEnabled()) return;\n    event.preventDefault(); event.stopPropagation();\n    this.linkDragSource = task;\n    const timelineEl = this.timelineContent()?.nativeElement;\n    if (!timelineEl) return;\n    const cfg = this.mergedConfig();\n    const taskBar = this.taskBars().find(b => b.task.id === task.id);\n    if (!taskBar) return;\n    const x1 = side === 'end' ? taskBar.left + taskBar.width : taskBar.left;\n    const y1 = taskBar.top + cfg.rowHeight / 2;\n    this.linkDragStarted.emit({ source: task });\n    const onMove = (e: PointerEvent) => {\n      const rect = timelineEl.getBoundingClientRect();\n      this.linkDragLine.set({ x1, y1, x2: e.clientX - rect.left + timelineEl.scrollLeft, y2: e.clientY - rect.top + timelineEl.scrollTop });\n    };\n    const onUp = (e: PointerEvent) => {\n      document.removeEventListener('pointermove', onMove); document.removeEventListener('pointerup', onUp);\n      this.linkDragLine.set(null);\n      const rect = timelineEl.getBoundingClientRect();\n      const dropY = e.clientY - rect.top + timelineEl.scrollTop;\n      const dropX = e.clientX - rect.left + timelineEl.scrollLeft;\n      const targetRow = this.renderedRows().find((_row, idx) => { const rt = idx * cfg.rowHeight; return dropY >= rt && dropY < rt + cfg.rowHeight; });\n      if (targetRow && targetRow.task.id !== task.id) {\n        const tb = this.taskBars().find(b => b.task.id === targetRow.task.id);\n        if (tb) {\n          const ts = dropX < tb.left + tb.width / 2 ? 'start' : 'end';\n          let lt: DependencyType;\n          if (side === 'end' && ts === 'start') lt = DependencyType.FinishToStart; else if (side === 'start' && ts === 'start') lt = DependencyType.StartToStart;\n          else if (side === 'end' && ts === 'end') lt = DependencyType.FinishToFinish; else lt = DependencyType.StartToFinish;\n          this.linkDragEnded.emit({ source: task, target: targetRow.task, type: lt });\n        }\n      } else { this.linkDragEnded.emit({ source: task }); }\n      this.linkDragSource = null;\n    };\n    document.addEventListener('pointermove', onMove); document.addEventListener('pointerup', onUp);\n  }\n\n  onTableDragStart(event: DragEvent, row: FlatRow): void {\n    this.tableDragSourceRow = row;\n    event.dataTransfer?.setData('text/plain', row.task.id);\n    this.tableDragStarted.emit({ source: row.task, sourceParent: this.tasks().find(t => t.id === row.task.parentId) || null });\n  }\n  onTableDragEnd(_event: DragEvent, row: FlatRow): void {\n    this.tableDragEnded.emit({ source: row.task, sourceParent: this.tasks().find(t => t.id === row.task.parentId) || null });\n    this.tableDragSourceRow = null;\n  }\n  onTableDragOver(event: DragEvent, row: FlatRow): void {\n    if (this.tableDragSourceRow && this.tableDragSourceRow.task.id !== row.task.id) { event.preventDefault(); }\n  }\n  onTableDrop(event: DragEvent, targetRow: FlatRow): void {\n    event.preventDefault();\n    if (!this.tableDragSourceRow || this.tableDragSourceRow.task.id === targetRow.task.id) return;\n    const src = this.tableDragSourceRow.task;\n    const rect = (event.target as HTMLElement).closest('.k-gantt-row')?.getBoundingClientRect();\n    let pos: 'before' | 'inside' | 'after' = 'after';\n    if (rect) { const ry = event.clientY - rect.top, th = rect.height / 3; if (ry < th) pos = 'before'; else if (ry < th * 2) pos = 'inside'; }\n    this.tableDragDropped.emit({ source: src, sourceParent: this.tasks().find(t => t.id === src.parentId) || null, target: targetRow.task, targetParent: this.tasks().find(t => t.id === targetRow.task.parentId) || null, dropPosition: pos });\n    this.tableDragSourceRow = null;\n  }\n\n  onRowClick(task: GanttTask, event: MouseEvent): void {\n    this.toggleSelection(task, event); this.keyboardService.focusTask(task.id);\n    this.taskClick.emit({ task, originalEvent: event }); this.barClick.emit({ event, task });\n  }\n  onTaskBarClick(task: GanttTask, event: MouseEvent): void {\n    event.stopPropagation(); this.toggleSelection(task, event); this.keyboardService.focusTask(task.id);\n    this.taskClick.emit({ task, originalEvent: event }); this.barClick.emit({ event, task });\n  }\n  onTaskBarDblClick(task: GanttTask, event: MouseEvent): void { event.stopPropagation(); this.taskDblClick.emit({ task, originalEvent: event }); }\n  onDependencyClick(dep: GanttDependency, event: MouseEvent): void {\n    this.dependencyClick.emit({ dependency: dep, originalEvent: event });\n    const source = this.tasks().find(t => t.id === dep.fromId);\n    const target = this.tasks().find(t => t.id === dep.toId);\n    if (source && target) this.lineClick.emit({ event, source, target });\n  }\n  onToggleCollapse(taskId: string): void {\n    const current = new Map(this.internalCollapsed());\n    const task = this.tasks().find(t => t.id === taskId);\n    if (!task) return;\n    const isCollapsed = current.has(taskId) ? current.get(taskId)! : task.collapsed;\n    current.set(taskId, !isCollapsed);\n    this.internalCollapsed.set(current);\n    this.expandChange.emit({ item: task, expanded: isCollapsed });\n  }\n  onToggleGroupCollapse(group: GanttGroup): void {\n    const current = new Map(this.internalGroupExpanded());\n    const isExpanded = current.has(group.id) ? current.get(group.id)! : (group.expanded !== false);\n    current.set(group.id, !isExpanded);\n    this.internalGroupExpanded.set(current);\n    this.expandChange.emit({ group, expanded: !isExpanded });\n  }\n  onToolbarViewChange(vt: ZoomLevel): void {\n    this.internalZoomLevel.set(vt);\n    this.viewChange.emit({ viewType: vt });\n    this.zoomChange.emit(vt);\n  }\n\n  toggleAreaZoomMode(): void {\n    this.isAreaZoomMode.update(v => !v);\n  }\n\n  resetZoom(): void {\n    this.zoomStart.set(null);\n    this.zoomEnd.set(null);\n    this.zoomColumnWidth.set(null);\n    this.internalZoomLevel.set(null);\n    this.isAreaZoomMode.set(false);\n\n\n    // Scroll to first task start date or today\n    setTimeout(() => {\n      const tasks = this.tasks();\n      if (tasks.length > 0) {\n        this.scrollToDate(tasks[0].start);\n      } else {\n        this.scrollToToday();\n      }\n    }, 50);\n  }\n\n  private getBestZoomLevel(start: Date, end: Date): ZoomLevel {\n    const ms = Math.abs(end.getTime() - start.getTime());\n    const days = ms / 86400000;\n\n    if (days <= 0.5) return ZoomLevel.Hour;\n    if (days <= 10) return ZoomLevel.Day;\n    if (days <= 45) return ZoomLevel.Week;\n    if (days <= 180) return ZoomLevel.Month;\n    if (days <= 500) return ZoomLevel.Quarter;\n    return ZoomLevel.Year;\n  }\n\n  private zoomToRange(x1: number, x2: number): void {\n    const timelineEl = this.timelineContent()?.nativeElement;\n    if (!timelineEl) return;\n\n    const cfg = this.mergedConfig();\n    const baseRange = getDateRange(this.tasks());\n    const currentStart = this.zoomStart() || baseRange.start;\n\n    const maxVal = this.totalWidth();\n    const boundedX1 = Math.max(0, Math.min(maxVal, x1));\n    const boundedX2 = Math.max(0, Math.min(maxVal, x2));\n\n    // Convert pixels to Dates\n    const date1 = this.scaleService.xToDate(boundedX1, currentStart, cfg.columnWidth, cfg.zoomLevel);\n    const date2 = this.scaleService.xToDate(boundedX2, currentStart, cfg.columnWidth, cfg.zoomLevel);\n\n\n    const startD = date1 < date2 ? date1 : date2;\n    const endD = date1 < date2 ? date2 : date1;\n\n    if (Math.abs(endD.getTime() - startD.getTime()) < 60000) {\n      return;\n    }\n\n    // Select the best scale for this range\n    const bestZoom = this.getBestZoomLevel(startD, endD);\n\n    // Calculate new column width to stretch columns to fit the viewport width\n    const viewportWidth = timelineEl.clientWidth || 800;\n    const colDates = getColumnDates(startD, endD, bestZoom);\n    const numCols = Math.max(1, colDates.length);\n    const stretchColWidth = Math.floor(viewportWidth / numCols);\n\n    // Clamp column width between base and 300px\n    const baseColWidth = cfg.columnWidth || 40;\n    const finalColWidth = Math.max(baseColWidth, Math.min(300, stretchColWidth));\n\n    // Update signals\n    this.zoomStart.set(startD);\n    this.zoomEnd.set(endD);\n    this.internalZoomLevel.set(bestZoom);\n    this.zoomColumnWidth.set(finalColWidth);\n\n    // Emit output\n    this.zoomRangeChange.emit({ start: startD, end: endD });\n    this.zoomChange.emit(bestZoom);\n\n    // Scroll back to the left start position\n    setTimeout(() => {\n      if (timelineEl) {\n        timelineEl.scrollLeft = 0;\n      }\n    }, 50);\n  }\n\n  onTimelinePointerDown(event: PointerEvent): void {\n    if (!this.isDragToZoomEnabled()) return;\n    if (event.button !== 0) return;\n\n    const isZoomButtonActive = this.isAreaZoomMode();\n    const isShiftPressed = event.shiftKey;\n\n    if (!isZoomButtonActive && !isShiftPressed) {\n      return;\n    }\n\n    const timelineEl = this.timelineContent()?.nativeElement;\n    if (!timelineEl) return;\n\n    const rect = timelineEl.getBoundingClientRect();\n    const isScrollbarClick =\n      event.clientX - rect.left >= timelineEl.clientWidth ||\n      event.clientY - rect.top >= timelineEl.clientHeight;\n    if (isScrollbarClick) return;\n\n    const target = event.target as HTMLElement;\n    const isTaskClick = target.closest('.k-task, .k-milestone, .k-task-summary, .k-link-connector, .k-resize-handle, .k-subtask-segment');\n\n    if (isTaskClick && !isZoomButtonActive && !isShiftPressed) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    const startX = event.clientX - rect.left + timelineEl.scrollLeft;\n    const startY = event.clientY - rect.top + timelineEl.scrollTop;\n\n    this.isDraggingZoom.set(true);\n    this.zoomDragStart.set({ x: startX, y: startY });\n    this.zoomDragCurrent.set({ x: startX, y: startY });\n\n    let lastDragClientX = event.clientX;\n    const scrollSpeed = 10;\n    const edgeThreshold = 40;\n    let autoScrollInterval: any = setInterval(() => {\n      const currentTimelineEl = this.timelineContent()?.nativeElement;\n      if (!currentTimelineEl) return;\n\n      const currentRect = currentTimelineEl.getBoundingClientRect();\n      const pointerX = lastDragClientX - currentRect.left;\n      const width = currentTimelineEl.clientWidth;\n\n      let dx = 0;\n      if (pointerX < edgeThreshold) {\n        dx = -scrollSpeed;\n      } else if (pointerX > width - edgeThreshold) {\n        dx = scrollSpeed;\n      }\n\n      if (dx !== 0) {\n        const oldScroll = currentTimelineEl.scrollLeft;\n        currentTimelineEl.scrollLeft += dx;\n        const actualDx = currentTimelineEl.scrollLeft - oldScroll;\n        if (actualDx !== 0) {\n          const updatedX = lastDragClientX - currentRect.left + currentTimelineEl.scrollLeft;\n          const updatedY = event.clientY - currentRect.top + currentTimelineEl.scrollTop;\n          this.zoomDragCurrent.set({ x: updatedX, y: updatedY });\n        }\n      }\n    }, 16);\n\n    const onMove = (e: PointerEvent) => {\n      lastDragClientX = e.clientX;\n      const currentX = e.clientX - rect.left + timelineEl.scrollLeft;\n      const currentY = e.clientY - rect.top + timelineEl.scrollTop;\n      this.zoomDragCurrent.set({ x: currentX, y: currentY });\n    };\n\n    const onUp = (e: PointerEvent) => {\n      if (autoScrollInterval) {\n        clearInterval(autoScrollInterval);\n        autoScrollInterval = null;\n      }\n      document.removeEventListener('pointermove', onMove);\n      document.removeEventListener('pointerup', onUp);\n\n      this.isDraggingZoom.set(false);\n      const start = this.zoomDragStart();\n      const current = this.zoomDragCurrent();\n      this.zoomDragStart.set(null);\n      this.zoomDragCurrent.set(null);\n\n      if (!start || !current) return;\n\n      const x1 = Math.min(start.x, current.x);\n      const x2 = Math.max(start.x, current.x);\n\n      if (x2 - x1 > 10) {\n        this.zoomToRange(x1, x2);\n      }\n    };\n\n    document.addEventListener('pointermove', onMove);\n    document.addEventListener('pointerup', onUp);\n  }\n\n  getViewLabel(vt: ZoomLevel): string {\n    const m: Record<string, string> = { hour: 'Hour', day: 'Day', week: 'Week', month: 'Month', quarter: 'Quarter', year: 'Year' };\n    return m[vt] || vt;\n  }\n  onKeyDown(event: KeyboardEvent): void {\n    const focusedId = this.keyboardService.focusedTaskId();\n    const task = focusedId ? this.tasks().find(t => t.id === focusedId) : null;\n\n    if (task && task.draggable !== false && ['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n      // Rescheduling or resizing via keyboard\n      event.preventDefault();\n      const cfg = this.mergedConfig();\n      const isHour = cfg.zoomLevel === ZoomLevel.Hour;\n      const msUnit = isHour ? 3600000 : 86400000;\n      \n      const ps = task.start;\n      const pe = task.end;\n      let ns = new Date(ps);\n      let ne = new Date(pe);\n\n      const direction = event.key === 'ArrowRight' ? 1 : -1;\n      const deltaMs = direction * msUnit;\n\n      const isResize = event.altKey || event.shiftKey;\n      if (isResize) {\n        // Alt or Shift + ArrowRight/Left: Resize from the right edge\n        ne = new Date(pe.getTime() + deltaMs);\n      } else {\n        // Move entire task bar\n        ns = new Date(ps.getTime() + deltaMs);\n        ne = new Date(pe.getTime() + deltaMs);\n      }\n\n      if (ne <= ns) {\n        ne = new Date(ns.getTime() + msUnit);\n      }\n\n      if (cfg.snapTo !== 'none') {\n        ns = this.scaleService.snapDate(ns, cfg.snapTo);\n        ne = this.scaleService.snapDate(ne, cfg.snapTo);\n      }\n\n      let subs = task.subtasks;\n      if (subs && subs.length > 0) {\n        const od = pe.getTime() - ps.getTime(), nd = ne.getTime() - ns.getTime();\n        if (!isResize) {\n          const sh = ns.getTime() - ps.getTime();\n          subs = subs.map(s => ({ ...s, start: new Date(s.start.getTime() + sh), end: new Date(s.end.getTime() + sh) }));\n        } else if (od > 0) {\n          subs = subs.map(s => {\n            const sr = (s.start.getTime() - ps.getTime()) / od, er = (s.end.getTime() - ps.getTime()) / od;\n            return { ...s, start: new Date(ns.getTime() + sr * nd), end: new Date(ns.getTime() + er * nd) };\n          });\n        }\n      }\n\n      this.taskChange.emit({\n        task: { ...task, start: ns, end: ne, subtasks: subs },\n        previousStart: ps,\n        previousEnd: pe\n      });\n      return;\n    }\n\n    const ids = this.renderedRows().map(r => r.task.id);\n    this.keyboardService.handleKeyDown(event, ids, {\n      onSelect: (taskId) => { const task = this.tasks().find(t => t.id === taskId); if (task) { this.toggleSelection(task, event as unknown as Event); this.taskClick.emit({ task, originalEvent: event as unknown as MouseEvent }); } },\n      onEscape: () => { this.selectedTaskIds.set(new Set()); },\n    });\n  }\n\n  getTaskSlackDays(taskId: string): number {\n    const slackMs = this.criticalPathInfo().taskSlacks?.get(taskId) || 0;\n    return Math.round((slackMs / 86400000) * 10) / 10;\n  }\n\n  isTaskCritical(taskId: string): boolean {\n    return this.criticalPathInfo().criticalTaskIds.has(taskId);\n  }\n\n  scrollToToday(): void { this.scrollToDate(new Date()); }\n  scrollToDate(date: Date): void {\n    const cfg = this.mergedConfig(), range = this.dateRange();\n    const x = this.scaleService.dateToX(date, range.start, cfg.columnWidth, cfg.zoomLevel);\n    const el = this.timelineContent()?.nativeElement;\n    if (el) el.scrollLeft = Math.max(0, x - el.clientWidth / 2);\n  }\n  scrollToTask(taskId: string): void {\n    const idx = this.visibleRows().findIndex(r => r.task.id === taskId);\n    if (idx === -1) return;\n    const el = this.timelineContent()?.nativeElement;\n    if (el) el.scrollTop = idx * this.mergedConfig().rowHeight;\n  }\n  expandAll(): void {\n    const map = new Map<string, boolean>();\n    this.tasks().forEach(t => map.set(t.id, false));\n    this.internalCollapsed.set(map);\n    const gm = new Map<string, boolean>();\n    this.groups().forEach(g => gm.set(g.id, true));\n    this.internalGroupExpanded.set(gm);\n  }\n  collapseAll(): void {\n    const map = new Map<string, boolean>();\n    this.flatRows().filter(r => r.hasChildren).forEach(r => map.set(r.task.id, true));\n    this.internalCollapsed.set(map);\n    const gm = new Map<string, boolean>();\n    this.groups().forEach(g => gm.set(g.id, false));\n    this.internalGroupExpanded.set(gm);\n  }\n  async exportAsImage(filename?: string): Promise<void> { await this.printService.print(filename); }\n  async getImageDataUrl(): Promise<string | null> { return this.printService.exportAsImage(); }\n  isSelected(taskId: string): boolean { return this.selectedTaskIds().has(taskId); }\n  getSelectedIds(): string[] { return Array.from(this.selectedTaskIds()); }\n  rerenderView(): void { this.internalCollapsed.set(new Map(this.internalCollapsed())); }\n\n  formatDateShort(date: Date): string { return date.toLocaleDateString(this.mergedConfig().locale, { month: 'short', day: 'numeric' }); }\n  formatDateFull(date: Date): string { return date.toLocaleDateString(this.mergedConfig().locale, { month: 'short', day: 'numeric', year: 'numeric' }); }\n  isNameColumn(col: GanttColumnDef, index: number): boolean { return typeof col.field === 'function' ? index === 0 : col.field === 'name' || index === 0; }\n  isDateColumn(col: GanttColumnDef): boolean { return typeof col.field === 'string' && (col.field === 'start' || col.field === 'end'); }\n  isProgressColumn(col: GanttColumnDef): boolean { return typeof col.field === 'string' && col.field === 'progress'; }\n  getSidebarCellValue(row: FlatRow, col: GanttColumnDef): string {\n    if (typeof col.field === 'function') return String(col.field(row.task) ?? '');\n    switch (col.field) {\n      case 'start': return this.formatDateShort(getRowStart(row));\n      case 'end': return this.formatDateShort(getRowEnd(row));\n      case 'progress': return row.extraTasks.length > 0 ? '~' + this.getRowAvgProgress(row) + '%' : row.task.progress + '%';\n      default: { const v = ((row.task as unknown) as Record<string, unknown>)[col.field]; if (v instanceof Date) return this.formatDateShort(v); return v == null ? '' : String(v); }\n    }\n  }\n  showTooltip(task: GanttTask, event: MouseEvent): void {\n    this.tooltipTask.set(task); this.tooltipSubtask.set(null);\n    this.updateTooltipPosition(event);\n  }\n  showSubtaskTooltip(task: GanttTask, subtask: GanttSubtask, event: MouseEvent): void {\n    this.tooltipTask.set(task); this.tooltipSubtask.set(subtask);\n    this.updateTooltipPosition(event);\n  }\n  updateTooltipPosition(event: MouseEvent): void {\n    const hostRect = this.elementRef.nativeElement.getBoundingClientRect();\n    const relX = event.clientX - hostRect.left;\n    const relY = event.clientY - hostRect.top;\n    const hostW = hostRect.width;\n    const hostH = hostRect.height;\n    const estimatedW = this.tooltipSubtask() ? 240 : 220;\n    const estimatedH = this.tooltipSubtask() ? 140 : 120;\n    this.tooltipX.set(flipCoord(relX, estimatedW, hostW));\n    this.tooltipY.set(flipCoord(relY, estimatedH, hostH));\n  }\n  hideTooltip(): void { this.tooltipTask.set(null); this.tooltipSubtask.set(null); }\n  getRowAvgProgress(row: FlatRow): number { const all = [row.task, ...row.extraTasks]; return Math.round(all.reduce((s, t) => s + t.progress, 0) / all.length); }\n  getRowProgressTitle(row: FlatRow): string { return [row.task, ...row.extraTasks].map(t => t.name + ': ' + t.progress + '%').join(', '); }\n  getUniqueExtraTasks(row: FlatRow): GanttTask[] { return row.extraTasks.filter(t => t.name !== row.task.name); }\n  getMetaEntries(meta: Record<string, unknown> | undefined): { key: string; value: string }[] {\n    if (!meta) return [];\n    return Object.entries(meta).map(([k, v]) => ({ key: k.replace(/([A-Z])/g, ' $1').replace(/^./, c => c.toUpperCase()), value: String(v) }));\n  }\n  getSubtaskBars(bar: { task: GanttTask; left: number; width: number }): { subtask: GanttSubtask; left: number; width: number }[] {\n    const subs = bar.task.subtasks; if (!subs || subs.length === 0) return [];\n    const cfg = this.mergedConfig(), range = this.dateRange();\n    const bars: { subtask: GanttSubtask; left: number; width: number }[] = [];\n\n    for (const sub of subs) {\n      if (sub.end.getTime() <= bar.task.start.getTime() || sub.start.getTime() >= bar.task.end.getTime()) {\n        continue;\n      }\n      const subStartX = this.scaleService.dateToX(sub.start, range.start, cfg.columnWidth, cfg.zoomLevel);\n      const subEndX = this.scaleService.dateToX(sub.end, range.start, cfg.columnWidth, cfg.zoomLevel);\n      const parentStartX = bar.left;\n      const parentEndX = bar.left + bar.width;\n      const clipStartX = Math.max(parentStartX, subStartX);\n      const clipEndX = Math.min(parentEndX, subEndX);\n\n      if (clipEndX > clipStartX) {\n        bars.push({\n          subtask: sub,\n          left: clipStartX - parentStartX,\n          width: clipEndX - clipStartX\n        });\n      }\n    }\n    return bars;\n  }\n  showRowTooltip(row: FlatRow, event: MouseEvent): void { this.rowTooltipData.set({ allTasks: [row.task, ...row.extraTasks] }); this.positionRowTooltip(event); }\n  updateRowTooltip(event: MouseEvent): void { if (this.rowTooltipData()) this.positionRowTooltip(event); }\n  hideRowTooltip(): void { this.rowTooltipData.set(null); }\n  toStyleStr(style: Partial<CSSStyleDeclaration>): string { return Object.entries(style).filter(([, v]) => v != null).map(([k, v]) => k.replace(/([A-Z])/g, '-$1').toLowerCase() + ':' + v).join(';'); }\n  private positionRowTooltip(event: MouseEvent): void {\n    const hostRect = this.elementRef.nativeElement.getBoundingClientRect();\n    this.rowTooltipX.set(flipCoord(event.clientX - hostRect.left, 260, hostRect.width));\n    this.rowTooltipY.set(flipCoord(event.clientY - hostRect.top, 120, hostRect.height));\n  }\n  private getPrimaryLabel(date: Date, zoom: ZoomLevel, locale: string): string {\n    switch (zoom) {\n      case ZoomLevel.Hour: return date.toLocaleDateString(locale, { month: 'short', day: 'numeric', year: 'numeric' });\n      case ZoomLevel.Day: case ZoomLevel.Week: return date.toLocaleDateString(locale, { month: 'long', year: 'numeric' });\n      case ZoomLevel.Month: case ZoomLevel.Quarter: return date.getFullYear().toString();\n      case ZoomLevel.Year: return '';\n    }\n  }\n  private getSecondaryLabel(date: Date, zoom: ZoomLevel, locale: string): string {\n    switch (zoom) {\n      case ZoomLevel.Hour: return date.getHours().toString().padStart(2, '0') + ':00';\n      case ZoomLevel.Day: return date.toLocaleDateString(locale, { weekday: 'narrow' }) + ' ' + date.getDate();\n      case ZoomLevel.Week: { const oj = new Date(date.getFullYear(), 0, 1); return 'W' + Math.ceil(((date.getTime() - oj.getTime()) / 86400000 + oj.getDay() + 1) / 7); }\n      case ZoomLevel.Month: return date.toLocaleDateString(locale, { month: 'short' });\n      case ZoomLevel.Quarter: return 'Q' + (Math.floor(date.getMonth() / 3) + 1);\n      case ZoomLevel.Year: return date.getFullYear().toString();\n    }\n  }\n\n}\n\nfunction flipCoord(cursor: number, size: number, viewport: number): number { const O = 14; return cursor + O + size > viewport ? cursor - size - O : cursor + O; }\nfunction getRowStart(row: FlatRow): Date { if (row.extraTasks.length === 0) return row.task.start; return new Date(Math.min(row.task.start.getTime(), ...row.extraTasks.map(t => t.start.getTime()))); }\nfunction getRowEnd(row: FlatRow): Date { if (row.extraTasks.length === 0) return row.task.end; return new Date(Math.max(row.task.end.getTime(), ...row.extraTasks.map(t => t.end.getTime()))); }\n","import {\n  Component, input, computed, signal, ChangeDetectionStrategy,\n  ElementRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface GaugeThreshold {\n  value: number; // The threshold limit (inclusive upper boundary)\n  color: string; // The color associated with this threshold\n}\n\n@Component({\n  selector: 'ngx-gauge-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"ngx-gauge-wrapper\"\n      (mousemove)=\"onMouseMove($event)\"\n      (mouseenter)=\"hovered.set(true)\"\n      (mouseleave)=\"hovered.set(false)\"\n    >\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hovered.set(false)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"ngx-gauge-container\">\n        <!-- SVG Gauge dial -->\n        <svg\n          #svgEl\n          class=\"ngx-gauge-svg\"\n          viewBox=\"0 0 200 200\"\n        >\n          <defs>\n            <linearGradient id=\"gauge-progress-grad\" x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\">\n              <stop offset=\"0%\" [attr.stop-color]=\"gaugeColor()\" stop-opacity=\"0.85\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"gaugeColor()\" />\n            </linearGradient>\n            <linearGradient id=\"pivot-cap-grad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n              <stop offset=\"0%\" stop-color=\"#64748b\" />\n              <stop offset=\"50%\" stop-color=\"#334155\" />\n              <stop offset=\"100%\" stop-color=\"#0f172a\" />\n            </linearGradient>\n            <linearGradient id=\"needle-grad\" x1=\"0%\" y1=\"100%\" x2=\"0%\" y2=\"0%\">\n              <stop offset=\"0%\" [attr.stop-color]=\"gaugeColor()\" stop-opacity=\"0.75\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"gaugeColor()\" />\n            </linearGradient>\n            <filter id=\"gauge-blur-glow\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">\n              <feGaussianBlur stdDeviation=\"3\" result=\"blur\" />\n              <feComposite in=\"SourceGraphic\" in2=\"blur\" operator=\"over\" />\n            </filter>\n          </defs>\n\n          <!-- Outer background guide track -->\n          <path\n            [attr.d]=\"backgroundArcPath()\"\n            fill=\"none\"\n            stroke=\"var(--ngx-gauge-track-bg, rgba(148, 163, 184, 0.12))\"\n            stroke-width=\"14\"\n            stroke-linecap=\"round\"\n          />\n\n          <!-- Colored background glow track -->\n          <path\n            [attr.d]=\"backgroundArcPath()\"\n            fill=\"none\"\n            [attr.stroke]=\"gaugeColor()\"\n            stroke-width=\"18\"\n            stroke-linecap=\"round\"\n            opacity=\"0.15\"\n            [attr.stroke-dasharray]=\"arcLength() + ',' + arcLength()\"\n            [attr.stroke-dashoffset]=\"progressDashOffset()\"\n            class=\"progress-arc-glow\"\n          />\n\n          <!-- Colored progress arc -->\n          <path\n            [attr.d]=\"backgroundArcPath()\"\n            fill=\"none\"\n            stroke=\"url(#gauge-progress-grad)\"\n            stroke-width=\"14\"\n            stroke-linecap=\"round\"\n            [attr.stroke-dasharray]=\"arcLength() + ',' + arcLength()\"\n            [attr.stroke-dashoffset]=\"progressDashOffset()\"\n            class=\"progress-arc\"\n          />\n\n          <!-- Colored threshold zone lines (Outer edge) -->\n          <g class=\"gauge-thresholds\">\n            @for (arc of thresholdArcs(); track $index) {\n              <path\n                [attr.d]=\"arc.path\"\n                fill=\"none\"\n                [attr.stroke]=\"arc.color\"\n                stroke-width=\"3\"\n                stroke-linecap=\"round\"\n                opacity=\"0.65\"\n              />\n            }\n          </g>\n\n          <!-- Instrument Dial Ticks & Labels -->\n          <g class=\"gauge-ticks\">\n            @for (tick of ticks(); track $index) {\n              <!-- Radial Tick Mark -->\n              <line\n                [attr.x1]=\"tick.x1\"\n                [attr.y1]=\"tick.y1\"\n                [attr.x2]=\"tick.x2\"\n                [attr.y2]=\"tick.y2\"\n                [attr.stroke]=\"tick.isMajor ? 'var(--text-secondary, #64748b)' : 'var(--border-color, #cbd5e1)'\"\n                [attr.stroke-width]=\"tick.isMajor ? 1.5 : 1\"\n                opacity=\"0.6\"\n              />\n              <!-- Value Label -->\n              @if (tick.isMajor) {\n                <text\n                  [attr.x]=\"tick.textX\"\n                  [attr.y]=\"tick.textY\"\n                  fill=\"var(--text-secondary, #64748b)\"\n                  font-size=\"8px\"\n                  font-weight=\"700\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                  font-family=\"monospace\"\n                >{{ tick.valueText }}</text>\n              }\n            }\n          </g>\n\n          <!-- Needle / Indicator dial -->\n          @if (showNeedle()) {\n            <g [attr.transform]=\"needleTransformString()\" class=\"gauge-needle-group\">\n              <!-- Tapered needle spear -->\n              <path\n                d=\"M 100 100 L 98 32 L 100 20 L 102 32 Z\"\n                fill=\"url(#needle-grad)\"\n                class=\"gauge-needle\"\n              />\n              <!-- Core pin highlighting line -->\n              <line\n                x1=\"100\" y1=\"98\"\n                x2=\"100\" y2=\"24\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.2\"\n                stroke-linecap=\"round\"\n                opacity=\"0.9\"\n              />\n              <!-- Multi-layered pivot cap -->\n              <circle\n                cx=\"100\"\n                cy=\"100\"\n                r=\"10\"\n                fill=\"url(#pivot-cap-grad)\"\n                stroke=\"rgba(0, 0, 0, 0.2)\"\n                stroke-width=\"1\"\n              />\n              <circle\n                cx=\"100\"\n                cy=\"100\"\n                r=\"4\"\n                fill=\"#ffffff\"\n                opacity=\"0.25\"\n              />\n            </g>\n          }\n        </svg>\n\n        <!-- Center values badge -->\n        <div class=\"gauge-center-badge\" [class.semi-mode]=\"type() === 'semi'\">\n          <div class=\"gauge-value\" [style.color]=\"gaugeColor()\">{{ value().toLocaleString() }}</div>\n          @if (label()) {\n            <div class=\"gauge-label\">{{ label() }}</div>\n          }\n        </div>\n      </div>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (hovered()) {\n        <div\n          class=\"chart-tooltip\"\n          [style.left.px]=\"tooltipX()\"\n          [style.top.px]=\"tooltipY()\"\n        >\n          @if (label()) {\n            <div class=\"tt-cat\">{{ label() }}</div>\n          } @else {\n            <div class=\"tt-cat\">Gauge Metric</div>\n          }\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"gaugeColor()\"></span>\n            <span class=\"tt-name\">Value</span>\n            <span class=\"tt-val\">{{ value().toLocaleString() }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Range</span>\n            <span class=\"tt-val\">{{ min() }} - {{ max() }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n\n    .ngx-gauge-wrapper {\n      width: 100%;\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 16px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n\n    .ngx-gauge-container {\n      position: relative;\n      width: 100%;\n      max-width: 240px;\n      aspect-ratio: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .ngx-gauge-svg {\n      width: 100%;\n      height: 100%;\n      overflow: visible;\n    }\n\n    /* Arcs transition */\n    .progress-arc {\n      transition: stroke-dashoffset 1.0s cubic-bezier(0.16, 1, 0.3, 1), stroke 0.3s ease;\n      filter: drop-shadow(0 2px 4px rgba(0,0,0,0.08));\n    }\n    .progress-arc-glow {\n      transition: stroke-dashoffset 1.0s cubic-bezier(0.16, 1, 0.3, 1), stroke 0.3s ease;\n    }\n\n    /* Needle transition animations */\n    .gauge-needle-group {\n      transition: transform 1.2s cubic-bezier(0.34, 1.56, 0.64, 1);\n      transform-origin: 100px 100px;\n    }\n    .gauge-needle {\n      filter: drop-shadow(0 3px 6px rgba(0,0,0,0.22));\n    }\n\n    /* Center Value Indicator */\n    .gauge-center-badge {\n      position: absolute;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      text-align: center;\n      pointer-events: none;\n      z-index: 2;\n    }\n    .gauge-center-badge.semi-mode {\n      transform: translateY(18px);\n    }\n\n    .gauge-value {\n      font-size: 32px;\n      font-weight: 850;\n      letter-spacing: -0.8px;\n      line-height: 1;\n      transition: color 0.3s ease;\n      font-family: var(--ngx-heading-font-family, inherit);\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.05));\n    }\n    .gauge-label {\n      font-size: 10px;\n      text-transform: uppercase;\n      font-weight: 750;\n      color: var(--text-secondary, #64748b);\n      letter-spacing: 0.8px;\n      margin-top: 6px;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Header and Export dropdown styles */\n    .chart-header {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .chart-export-menu {\n      position: absolute;\n      right: 0;\n      top: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class GaugeChartComponent {\n  // Input Configs\n  value = input.required<number>();\n  min = input<number>(0);\n  max = input<number>(100);\n  label = input<string>('');\n  type = input<'full' | 'semi'>('semi'); // 'full' is 280deg, 'semi' is 180deg\n  showNeedle = input<boolean>(true);\n  color = input<string>('var(--primary-color, #4f46e5)');\n  thresholds = input<GaugeThreshold[]>([]);\n  showExport = input<boolean>(false);\n\n  // State Signals\n  hovered = signal<boolean>(false);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  animateState = signal<boolean>(false);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  constructor() {\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  // Gauge angles definitions\n  // 0 deg in polar is to the right (3 o'clock). 90 deg is straight down (6 o'clock).\n  startAngle = computed(() => {\n    return this.type() === 'semi' ? 270 : 225;\n  });\n\n  endAngle = computed(() => {\n    return this.type() === 'semi' ? 450 : 495;\n  });\n\n  // Arc length calculations\n  arcLength = computed(() => {\n    const radius = 72;\n    const angleRange = this.endAngle() - this.startAngle();\n    return (2 * Math.PI * radius * angleRange) / 360;\n  });\n\n  progressDashOffset = computed(() => {\n    const L = this.arcLength();\n    const minVal = this.min();\n    const maxVal = this.max();\n    const currentVal = Math.max(minVal, Math.min(maxVal, this.value()));\n    const range = maxVal - minVal;\n    const fraction = range === 0 ? 0 : (currentVal - minVal) / range;\n    const targetOffset = L - (fraction * L);\n    return this.animateState() ? targetOffset : L;\n  });\n\n  // Calculate coordinates and build path for background track\n  backgroundArcPath = computed(() => {\n    return this.describeArc(100, 100, 72, this.startAngle(), this.endAngle());\n  });\n\n  // Needle rotation calculation\n  needleTransformString = computed(() => {\n    const minVal = this.min();\n    const maxVal = this.max();\n    const currentVal = Math.max(minVal, Math.min(maxVal, this.value()));\n    const range = maxVal - minVal;\n    const fraction = range === 0 ? 0 : (currentVal - minVal) / range;\n\n    const angleRange = this.endAngle() - this.startAngle();\n    const targetAngle = this.startAngle() + angleRange * fraction;\n\n    const angle = this.animateState() ? targetAngle : this.startAngle();\n\n    // Needle points straight up at 0 deg rotation (12 o'clock, which is 360 in polar offset)\n    const rotateAngle = angle - 360;\n    return `rotate(${rotateAngle})`;\n  });\n\n  // Evaluate the gauge color depending on bound thresholds\n  gaugeColor = computed(() => {\n    const val = this.value();\n    const thresholdList = this.thresholds();\n\n    if (thresholdList.length === 0) {\n      return this.color();\n    }\n\n    // Sort thresholds ascending\n    const sorted = [...thresholdList].sort((a, b) => a.value - b.value);\n    \n    // Find the first threshold color where values exceed the limit\n    for (const t of sorted) {\n      if (val <= t.value) {\n        return t.color;\n      }\n    }\n\n    // Default to the last threshold color if value exceeds all thresholds\n    return sorted[sorted.length - 1].color;\n  });\n\n  private getThresholdColorForValue(val: number): string {\n    const thresholdList = this.thresholds();\n    if (thresholdList.length === 0) {\n      return this.color();\n    }\n    const sorted = [...thresholdList].sort((a, b) => a.value - b.value);\n    for (const t of sorted) {\n      if (val <= t.value) {\n        return t.color;\n      }\n    }\n    return sorted[sorted.length - 1].color;\n  }\n\n  ticks = computed(() => {\n    const minVal = this.min();\n    const maxVal = this.max();\n    const range = maxVal - minVal;\n    const startA = this.startAngle();\n    const endA = this.endAngle();\n    const angleRange = endA - startA;\n    \n    // We want 11 ticks (every 10%)\n    const tickCount = 11;\n    const result = [];\n    \n    for (let i = 0; i < tickCount; i++) {\n      const fraction = i / (tickCount - 1);\n      const val = minVal + range * fraction;\n      const angle = startA + angleRange * fraction;\n      \n      // Radial line coords\n      const outerRad = 64;\n      const innerRad = i % 2 === 0 ? 56 : 60; // Major vs minor ticks\n      \n      const outerPt = this.polarToCartesian(100, 100, outerRad, angle);\n      const innerPt = this.polarToCartesian(100, 100, innerRad, angle);\n      \n      // Text coords (for major ticks)\n      let textPt = null;\n      if (i % 2 === 0) {\n        textPt = this.polarToCartesian(100, 100, 44, angle);\n      }\n      \n      const color = this.getThresholdColorForValue(val);\n      \n      result.push({\n        x1: innerPt.x,\n        y1: innerPt.y,\n        x2: outerPt.x,\n        y2: outerPt.y,\n        textX: textPt?.x ?? 0,\n        textY: textPt?.y ?? 0,\n        valueText: Math.round(val).toString(),\n        isMajor: i % 2 === 0,\n        color\n      });\n    }\n    return result;\n  });\n\n  thresholdArcs = computed(() => {\n    const list = this.thresholds();\n    if (list.length === 0) return [];\n    \n    const minVal = this.min();\n    const maxVal = this.max();\n    const range = maxVal - minVal;\n    const startA = this.startAngle();\n    const endA = this.endAngle();\n    const angleRange = endA - startA;\n    \n    // Sort thresholds ascending\n    const sorted = [...list].sort((a, b) => a.value - b.value);\n    \n    const arcs = [];\n    let currentVal = minVal;\n    \n    for (let i = 0; i < sorted.length; i++) {\n      const nextVal = Math.min(maxVal, sorted[i].value);\n      if (nextVal <= currentVal) continue;\n      \n      const startFraction = (currentVal - minVal) / range;\n      const endFraction = (nextVal - minVal) / range;\n      \n      const startAngleSegment = startA + angleRange * startFraction;\n      const endAngleSegment = startA + angleRange * endFraction;\n      \n      // Radius slightly outside: e.g. 81px\n      const path = this.describeArc(100, 100, 81, startAngleSegment, endAngleSegment);\n      \n      arcs.push({\n        path,\n        color: sorted[i].color\n      });\n      \n      currentVal = nextVal;\n    }\n    \n    return arcs;\n  });\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = {\n      label: this.label(),\n      value: this.value(),\n      min: this.min(),\n      max: this.max()\n    };\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'gauge-chart-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    let csv = 'Label,Value,Min,Max\\n';\n    csv += `\"${this.label() || ''}\",${this.value()},${this.min()},${this.max()}\\n`;\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'gauge-chart-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'gauge-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgClone = svg.cloneNode(true) as SVGElement;\n    svgClone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n    const svgString = new XMLSerializer().serializeToString(svgClone);\n    \n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body {\n              margin: 0;\n              display: flex;\n              justify-content: center;\n              align-items: center;\n              height: 100vh;\n              background-color: #ffffff;\n              font-family: system-ui, sans-serif;\n            }\n            .print-container {\n              text-align: center;\n              width: 100%;\n              max-width: 800px;\n              padding: 20px;\n            }\n            svg {\n              width: 100%;\n              height: auto;\n              max-height: 90vh;\n            }\n            @media print {\n              body {\n                background: none;\n              }\n              .print-container {\n                max-width: 100%;\n                padding: 0;\n              }\n              svg {\n                page-break-inside: avoid;\n              }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${svgString}\n          </div>\n          <script>\n            window.onload = () => {\n              window.print();\n              window.close();\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    this.tooltipX.set(event.clientX - rect.left);\n    this.tooltipY.set(event.clientY - rect.top);\n  }\n\n  // Polar to Cartesian Math helpers\n  private polarToCartesian(centerX: number, centerY: number, radius: number, angleInDegrees: number) {\n    const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0;\n\n    return {\n      x: centerX + radius * Math.cos(angleInRadians),\n      y: centerY + radius * Math.sin(angleInRadians)\n    };\n  }\n\n  private describeArc(x: number, y: number, radius: number, startAngle: number, endAngle: number): string {\n    const start = this.polarToCartesian(x, y, radius, startAngle);\n    const end = this.polarToCartesian(x, y, radius, endAngle);\n\n    // If starting and ending angle range exceeds 180 degrees, set largeArcFlag\n    const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1';\n\n    return [\n      'M', start.x, start.y,\n      'A', radius, radius, 0, largeArcFlag, 1, end.x, end.y\n    ].join(' ');\n  }\n}\n","import {\n  Component, input, signal, computed, ChangeDetectionStrategy,\n  ElementRef, viewChild, HostListener, inject\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { generateUniqueId } from '../shared/chart-utils';\n\nexport interface RadarSeries {\n  label: string;\n  values: number[]; // Array of values corresponding to categories\n}\n\n@Component({\n  selector: 'ngx-radar-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-radar-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onPointLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Radar Chart Visual Panel -->\n      <div class=\"ngx-radar-container\">\n        <svg\n          #svgEl\n          class=\"ngx-radar-svg\"\n          viewBox=\"0 0 220 220\"\n        >\n          <defs>\n            @for (series of seriesData(); track series.label; let sIdx = $index) {\n              <linearGradient [attr.id]=\"instanceId + '-radar-grad-' + sIdx\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n                <stop offset=\"0%\" [attr.stop-color]=\"getSeriesColor(sIdx, 1)\" stop-opacity=\"0.35\" />\n                <stop offset=\"100%\" [attr.stop-color]=\"getSeriesColor(sIdx, 1)\" stop-opacity=\"0.05\" />\n              </linearGradient>\n            }\n          </defs>\n\n          <!-- Concentric polygon grids (web rings) -->\n          @for (ring of gridRings(); track ring) {\n            <polygon\n              [attr.points]=\"getRingPoints(ring)\"\n              fill=\"none\"\n              stroke=\"var(--border-light, rgba(226, 232, 240, 0.6))\"\n              stroke-width=\"0.8\"\n              stroke-dasharray=\"2,2\"\n            />\n          }\n\n          <!-- Axis lines projecting out to categories -->\n          @for (axis of axes(); track $index) {\n            <line\n              [attr.x1]=\"110\"\n              [attr.y1]=\"110\"\n              [attr.x2]=\"axis.x\"\n              [attr.y2]=\"axis.y\"\n              stroke=\"var(--border-color, rgba(226, 232, 240, 0.8))\"\n              stroke-width=\"0.8\"\n              stroke-dasharray=\"3,3\"\n            />\n            <!-- Category Label text positions -->\n            <text\n              [attr.x]=\"axis.labelX\"\n              [attr.y]=\"axis.labelY\"\n              [attr.text-anchor]=\"axis.align\"\n              class=\"axis-label\"\n            >\n              {{ categories()[$index] }}\n            </text>\n          }\n\n          <!-- Radar polygon areas representing series -->\n          @for (series of seriesData(); track series.label; let sIdx = $index) {\n            <polygon\n              [attr.points]=\"getSeriesPoints(series)\"\n              [attr.fill]=\"'url(#' + instanceId + '-radar-grad-' + sIdx + ')'\"\n              [attr.stroke]=\"getSeriesColor(sIdx, 1)\"\n              stroke-width=\"2.5\"\n              class=\"radar-polygon\"\n              [class.active]=\"hoveredSeries() === series.label\"\n              (mouseenter)=\"hoveredSeries.set(series.label)\"\n              (mouseleave)=\"hoveredSeries.set(null)\"\n            />\n\n            <!-- Plot data dots on points -->\n            @for (pt of getSeriesPointList(series); track $index) {\n              <circle\n                [attr.cx]=\"pt.x\"\n                [attr.cy]=\"pt.y\"\n                [attr.r]=\"hoveredPoint()?.seriesLabel === series.label && hoveredPoint()?.index === $index ? 5.5 : 3.5\"\n                [attr.fill]=\"getSeriesColor(sIdx, 1)\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.5\"\n                class=\"radar-dot\"\n                [class.hovered]=\"hoveredPoint()?.seriesLabel === series.label && hoveredPoint()?.index === $index\"\n                (mouseenter)=\"onPointEnter(series, $index, pt, $event)\"\n                (mouseleave)=\"onPointLeave()\"\n              />\n            }\n          }\n        </svg>\n\n        <!-- Hover Tooltip Overlay -->\n        @if (tooltip().show) {\n          <div\n            class=\"radar-tooltip\"\n            [style.left.px]=\"tooltip().x\"\n            [style.top.px]=\"tooltip().y\"\n          >\n            <div class=\"tt-cat\">{{ tooltip().series }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"tooltip().color\"></span>\n              <span class=\"tt-name\">{{ tooltip().category }}</span>\n              <span class=\"tt-val\">{{ tooltip().value }}</span>\n            </div>\n          </div>\n        }\n      </div>\n\n      <!-- Legend Panel -->\n      <div class=\"radar-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredSeries.set(null)\">\n        @for (series of seriesData(); track series.label; let sIdx = $index) {\n          <div\n            class=\"legend-item\"\n            [class.dimmed]=\"hoveredSeries() !== null && hoveredSeries() !== series.label\"\n            (mouseenter)=\"hoveredSeries.set(series.label)\"\n            (mouseleave)=\"hoveredSeries.set(null)\"\n          >\n            <span class=\"legend-indicator\" [style.background]=\"getSeriesColor(sIdx, 1)\"></span>\n            <span class=\"legend-text\">{{ series.label }}</span>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n\n    .ngx-radar-wrapper {\n      width: 100%;\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      gap: 16px;\n      padding: 24px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n\n    .ngx-radar-container {\n      position: relative;\n      width: 100%;\n      max-width: 280px;\n      aspect-ratio: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .ngx-radar-svg {\n      width: 100%;\n      height: 100%;\n      overflow: visible;\n    }\n\n    @keyframes radarScaleIn {\n      from { transform: scale(0.1); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n\n    /* Radar Polygons styling */\n    .radar-polygon {\n      transition: stroke-width 0.25s cubic-bezier(0.16, 1, 0.3, 1), fill-opacity 0.25s;\n      cursor: pointer;\n      transform-origin: 110px 110px;\n      animation: radarScaleIn 0.8s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .radar-polygon:hover, .radar-polygon.active {\n      stroke-width: 3.5px;\n    }\n\n    .radar-dot {\n      cursor: pointer;\n      transition: r 0.2s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.2s;\n      transform-origin: 110px 110px;\n      animation: radarScaleIn 0.8s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .radar-dot.hovered {\n      filter: drop-shadow(0 0 4px rgba(0,0,0,0.25));\n      stroke-width: 2px;\n    }\n\n    /* Labels styling */\n    .axis-label {\n      font-size: 8px;\n      font-weight: 700;\n      fill: var(--text-secondary, #64748b);\n      letter-spacing: -0.1px;\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .radar-tooltip {\n      position: absolute;\n      z-index: 100;\n      pointer-events: none;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -115%);\n      min-width: 140px;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Legend Layout */\n    .radar-legend {\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: center;\n      gap: 12px;\n    }\n    .legend-item {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      cursor: pointer;\n      transition: opacity 0.2s;\n    }\n    .legend-item.dimmed {\n      opacity: 0.35;\n    }\n    .legend-indicator {\n      width: 10px;\n      height: 10px;\n      border-radius: 3px;\n    }\n    .legend-text {\n      font-size: 12px;\n      font-weight: 600;\n      color: var(--text-primary, #0f172a);\n    }\n\n    /* Header and Export dropdown styles */\n    .chart-header {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n\n  `]\n})\nexport class RadarChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly instanceId = generateUniqueId('chart');\n  // Input binds\n  seriesData = input.required<RadarSeries[]>();\n  categories = input.required<string[]>();\n  max = input<number>(100);\n  colors = input<string[]>(['#4f46e5', '#fbbf24', '#a855f7', '#06b6d4']);\n  showExport = input<boolean>(false);\n\n  // Hover status signals\n  hoveredSeries = signal<string | null>(null);\n  hoveredPoint = signal<{ seriesLabel: string; index: number } | null>(null);\n  tooltip = signal<{ show: boolean; series: string; category: string; value: string; x: number; y: number; color: string }>({\n    show: false,\n    series: '',\n    category: '',\n    value: '',\n    x: 0,\n    y: 0,\n    color: ''\n  });\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  // Concentric circle rings count\n  gridRings = signal<number[]>([0.2, 0.4, 0.6, 0.8, 1]);\n\n  // Radius bound sizing (inside the 220x220 viewBox, center is 110, 110, maxRadius is 70)\n  centerX = 110;\n  centerY = 110;\n  maxRadius = 70;\n\n  // Calculate coordinates for category axis projections\n  axes = computed(() => {\n    const N = this.categories().length;\n    return this.categories().map((_, i) => {\n      const angle = (i * 2 * Math.PI) / N - Math.PI / 2; // Start from top\n      const x = this.centerX + this.maxRadius * Math.cos(angle);\n      const y = this.centerY + this.maxRadius * Math.sin(angle);\n\n      // Label coordinate placement (offset slightly outwards)\n      const labelDistance = this.maxRadius + 14;\n      const labelX = this.centerX + labelDistance * Math.cos(angle);\n      const labelY = this.centerY + labelDistance * Math.sin(angle) + 3; // +3 offset for vertical alignment\n\n      // Text alignments depending on quadrant position\n      let align: 'start' | 'middle' | 'end' = 'middle';\n      if (Math.cos(angle) > 0.1) align = 'start';\n      else if (Math.cos(angle) < -0.1) align = 'end';\n\n      return { x, y, labelX, labelY, align };\n    });\n  });\n\n  // Generate points string for web ring paths\n  getRingPoints(ringFraction: number): string {\n    const N = this.categories().length;\n    const r = this.maxRadius * ringFraction;\n    const points: string[] = [];\n\n    for (let i = 0; i < N; i++) {\n      const angle = (i * 2 * Math.PI) / N - Math.PI / 2;\n      const x = this.centerX + r * Math.cos(angle);\n      const y = this.centerY + r * Math.sin(angle);\n      points.push(`${x},${y}`);\n    }\n\n    return points.join(' ');\n  }\n\n  // Generate points string for data series polygons\n  getSeriesPoints(series: RadarSeries): string {\n    const N = this.categories().length;\n    const points: string[] = [];\n\n    for (let i = 0; i < N; i++) {\n      const value = series.values[i] ?? 0;\n      const fraction = Math.min(1, value / this.max());\n      const r = this.maxRadius * fraction;\n      \n      const angle = (i * 2 * Math.PI) / N - Math.PI / 2;\n      const x = this.centerX + r * Math.cos(angle);\n      const y = this.centerY + r * Math.sin(angle);\n      points.push(`${x},${y}`);\n    }\n\n    return points.join(' ');\n  }\n\n  // Get point list representing coordinate items to draw dots\n  getSeriesPointList(series: RadarSeries): Array<{ x: number; y: number; value: number }> {\n    const N = this.categories().length;\n    const list: Array<{ x: number; y: number; value: number }> = [];\n\n    for (let i = 0; i < N; i++) {\n      const value = series.values[i] ?? 0;\n      const fraction = Math.min(1, value / this.max());\n      const r = this.maxRadius * fraction;\n      \n      const angle = (i * 2 * Math.PI) / N - Math.PI / 2;\n      const x = this.centerX + r * Math.cos(angle);\n      const y = this.centerY + r * Math.sin(angle);\n      list.push({ x, y, value });\n    }\n\n    return list;\n  }\n\n  // Utility to fetch colors\n  getSeriesColor(index: number, opacity: number): string {\n    const colorList = this.colors();\n    const color = colorList[index % colorList.length];\n\n    if (opacity === 1) return color;\n    \n    // Convert hex to rgba\n    const h = color.replace('#', '');\n    const r = parseInt(h.substring(0, 2), 16);\n    const g = parseInt(h.substring(2, 4), 16);\n    const b = parseInt(h.substring(4, 6), 16);\n    return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n  }\n\n  // Hover point interactions\n  onPointEnter(series: RadarSeries, index: number, pt: { x: number; y: number; value: number }, event: MouseEvent): void {\n    this.hoveredSeries.set(series.label);\n    this.hoveredPoint.set({ seriesLabel: series.label, index });\n\n    // Tooltip position mappings relative to the outer container\n    const svgRect = (event.currentTarget as SVGElement).ownerSVGElement!.getBoundingClientRect();\n    const containerRect = (event.currentTarget as SVGElement).ownerSVGElement!.parentElement!.getBoundingClientRect();\n\n    // Map coordinates relative to parent container\n    const x = (pt.x / 220) * svgRect.width + (svgRect.left - containerRect.left);\n    const y = (pt.y / 220) * svgRect.height + (svgRect.top - containerRect.top);\n\n    const seriesIndex = this.seriesData().indexOf(series);\n    const color = this.getSeriesColor(seriesIndex, 1);\n\n    this.tooltip.set({\n      show: true,\n      series: series.label,\n      category: this.categories()[index] ?? '',\n      value: pt.value.toLocaleString(),\n      x,\n      y,\n      color\n    });\n  }\n\n  onPointLeave(): void {\n    this.hoveredSeries.set(null);\n    this.hoveredPoint.set(null);\n    this.tooltip.update(t => ({ ...t, show: false }));\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.seriesData();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'radar-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const seriesData = this.seriesData();\n    const categories = this.categories();\n    if (!seriesData.length) return;\n    const headers = ['Series', 'Category', 'Value'];\n    const rows: (string | number)[][] = [];\n    seriesData.forEach(series => {\n      series.values.forEach((val, idx) => {\n        rows.push([series.label || '', categories[idx] || '', val]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'radar-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n}\n","import {\n  Component, input, output, signal, computed, ChangeDetectionStrategy,\n  ElementRef, viewChild, inject\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\n\n@Component({\n  selector: 'ngx-heatmap-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-heatmap-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onCellLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"ngx-heatmap-container\">\n        <!-- SVG Grid rendering -->\n        <svg\n          #svgEl\n          class=\"ngx-heatmap-svg\"\n          [attr.viewBox]=\"viewBoxString()\"\n          preserveAspectRatio=\"xMidYMid meet\"\n        >\n          <!-- Y-axis labels -->\n          @for (yLabel of yAxisLabels(); track $index) {\n            <text\n              [attr.x]=\"leftOffset - 8\"\n              [attr.y]=\"getRowY($index) + cellHeight() / 2\"\n              class=\"axis-label y-axis-label\"\n              text-anchor=\"end\"\n              dominant-baseline=\"middle\"\n            >\n              {{ yLabel }}\n            </text>\n          }\n\n          <!-- X-axis labels -->\n          @for (xLabel of xAxisLabels(); track $index) {\n            <text\n              [attr.x]=\"getColX($index) + cellWidth() / 2\"\n              [attr.y]=\"topOffset - 8\"\n              class=\"axis-label x-axis-label\"\n              text-anchor=\"middle\"\n            >\n              {{ xLabel }}\n            </text>\n          }\n\n          <!-- Heatmap Cells -->\n          @for (row of data(); track $index; let rIdx = $index) {\n            @for (val of row; track $index; let cIdx = $index) {\n              <rect\n                [attr.x]=\"getColX(cIdx)\"\n                [attr.y]=\"getRowY(rIdx)\"\n                [attr.width]=\"cellWidth() - cellSpacing\"\n                [attr.height]=\"cellHeight() - cellSpacing\"\n                [attr.fill]=\"getCellColor(val)\"\n                class=\"heatmap-cell\"\n                [style.animation-delay]=\"(rIdx * 0.03 + cIdx * 0.03) + 's'\"\n                (mouseenter)=\"onCellEnter(rIdx, cIdx, val, $event)\"\n                (mouseleave)=\"onCellLeave()\"\n                (click)=\"onCellClick(rIdx, cIdx, val)\"\n                rx=\"3\"\n                ry=\"3\"\n              />\n            }\n          }\n        </svg>\n\n        <!-- Dynamic Tooltip -->\n        @if (tooltip().show) {\n          <div\n            class=\"heatmap-tooltip\"\n            [style.left.px]=\"tooltip().x\"\n            [style.top.px]=\"tooltip().y\"\n          >\n            <div class=\"tt-cat\">{{ tooltip().title }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"getCellColor(tooltip().rawVal)\"></span>\n              <span class=\"tt-name\">Value</span>\n              <span class=\"tt-val\">{{ tooltip().value }}</span>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-heatmap-wrapper {\n      width: 100%;\n      height: 100%;\n      padding: 20px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n    .ngx-heatmap-container {\n      position: relative;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-heatmap-svg {\n      width: 100%;\n      height: 100%;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 700;\n      fill: var(--text-secondary, #64748b);\n      font-family: inherit;\n    }\n\n    @keyframes cellFadeIn {\n      from { opacity: 0; transform: scale(0.95); }\n      to { opacity: 1; transform: scale(1); }\n    }\n\n    .heatmap-cell {\n      cursor: pointer;\n      transition: fill 0.2s ease, stroke 0.15s ease, filter 0.15s ease;\n      stroke: transparent;\n      stroke-width: 1px;\n      transform-origin: center;\n      animation: cellFadeIn 0.4s ease-out both;\n    }\n    .heatmap-cell:hover {\n      filter: brightness(1.1) drop-shadow(0 4px 8px rgba(0,0,0,0.18));\n      stroke: var(--ngx-chart-hover-stroke, #0f172a);\n      stroke-width: 1.5px;\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .heatmap-tooltip {\n      position: absolute;\n      z-index: 100;\n      pointer-events: none;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -115%);\n      min-width: 140px;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Header styles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n  `]\n})\nexport class HeatmapChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input.required<number[][]>();\n  xAxisLabels = input<string[]>([]);\n  yAxisLabels = input<string[]>([]);\n  colorRange = input<string[]>(['#e2e8f0', '#4f46e5']);\n  showExport = input<boolean>(false);\n\n  cellClick = output<{ row: number; col: number; value: number }>();\n\n  // Dimensions configuration\n  leftOffset = 70;\n  topOffset = 30;\n  cellSpacing = 3;\n\n  tooltip = signal<{ show: boolean; title: string; value: string; x: number; y: number; rawVal: number }>({\n    show: false,\n    title: '',\n    value: '',\n    x: 0,\n    y: 0,\n    rawVal: 0\n  });\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  cellWidth = computed(() => {\n    const cols = this.data()[0]?.length || 1;\n    return Math.max(16, (500 - this.leftOffset) / cols);\n  });\n\n  cellHeight = computed(() => {\n    const rows = this.data().length || 1;\n    return Math.max(16, (250 - this.topOffset) / rows);\n  });\n\n  viewBoxString = computed(() => {\n    const cols = this.data()[0]?.length || 1;\n    const rows = this.data().length || 1;\n    const width = this.leftOffset + cols * this.cellWidth() + 10;\n    const height = this.topOffset + rows * this.cellHeight() + 10;\n    return `0 0 ${width} ${height}`;\n  });\n\n  getColX(colIdx: number): number {\n    return this.leftOffset + colIdx * this.cellWidth();\n  }\n\n  getRowY(rowIdx: number): number {\n    return this.topOffset + rowIdx * this.cellHeight();\n  }\n\n  getCellColor(val: number): string {\n    const values = this.data().flat();\n    const min = Math.min(...values, 0);\n    const max = Math.max(...values, 1);\n    const range = max - min;\n    const fraction = range === 0 ? 0.5 : (val - min) / range;\n    return this.interpolateColor(this.colorRange()[0], this.colorRange()[1], fraction);\n  }\n\n  private interpolateColor(color1: string, color2: string, fraction: number): string {\n    const hex = (x: string) => {\n      const h = x.replace('#', '');\n      return h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n    };\n    const c1 = hex(color1);\n    const c2 = hex(color2);\n\n    const r1 = parseInt(c1.substring(0, 2), 16);\n    const g1 = parseInt(c1.substring(2, 4), 16);\n    const b1 = parseInt(c1.substring(4, 6), 16);\n\n    const r2 = parseInt(c2.substring(0, 2), 16);\n    const g2 = parseInt(c2.substring(2, 4), 16);\n    const b2 = parseInt(c2.substring(4, 6), 16);\n\n    const r = Math.round(r1 + (r2 - r1) * fraction);\n    const g = Math.round(g1 + (g2 - g1) * fraction);\n    const b = Math.round(b1 + (b2 - b1) * fraction);\n\n    return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n  }\n\n  onCellEnter(rIdx: number, cIdx: number, val: number, event: MouseEvent): void {\n    const xLabel = this.xAxisLabels()[cIdx] || `Col ${cIdx + 1}`;\n    const yLabel = this.yAxisLabels()[rIdx] || `Row ${rIdx + 1}`;\n    const title = `${yLabel} • ${xLabel}`;\n\n    const rect = (event.currentTarget as SVGRectElement).getBoundingClientRect();\n    const parentRect = (event.currentTarget as SVGRectElement).ownerSVGElement!.parentElement!.getBoundingClientRect();\n    const x = rect.left - parentRect.left + rect.width / 2;\n    const y = rect.top - parentRect.top;\n\n    this.tooltip.set({\n      show: true,\n      title,\n      value: val.toLocaleString(),\n      x,\n      y,\n      rawVal: val\n    });\n  }\n\n  onCellLeave(): void {\n    this.tooltip.update(t => ({ ...t, show: false }));\n  }\n\n  onCellClick(rIdx: number, cIdx: number, val: number): void {\n    this.cellClick.emit({ row: rIdx, col: cIdx, value: val });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'heatmap-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const xLabels = this.xAxisLabels();\n    const yLabels = this.yAxisLabels();\n    const headers = ['Row_Label', 'Column_Label', 'Value'];\n    const rows: (string | number)[][] = [];\n    data.forEach((row, rIdx) => {\n      const yLabel = yLabels[rIdx] || `Row ${rIdx + 1}`;\n      row.forEach((val, cIdx) => {\n        const xLabel = xLabels[cIdx] || `Col ${cIdx + 1}`;\n        rows.push([yLabel, xLabel, val]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'heatmap-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'heatmap-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Heatmap Chart', 'heatmap-chart.pdf');\n  }\n}\n","import { Component, input, output, signal, computed, ChangeDetectionStrategy, viewChild, ElementRef, HostListener } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface TreemapItem {\n  label: string;\n  value: number;\n  color?: string;\n}\n\ninterface LayoutItem extends TreemapItem {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  displayColor: string;\n}\n\n@Component({\n  selector: 'ngx-treemap-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-treemap-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onItemLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"ngx-treemap-container\">\n        <!-- SVG Canvas -->\n        <svg\n          #svgEl\n          class=\"ngx-treemap-svg\"\n          viewBox=\"0 0 500 300\"\n          preserveAspectRatio=\"xMidYMid meet\"\n        >\n          <defs>\n            <linearGradient id=\"treemap-sheen\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n              <stop offset=\"0%\" stop-color=\"#ffffff\" stop-opacity=\"0.18\" />\n              <stop offset=\"100%\" stop-color=\"#ffffff\" stop-opacity=\"0.0\" />\n            </linearGradient>\n          </defs>\n\n          @for (item of layoutRects(); track item.label; let idx = $index) {\n            <g\n              class=\"treemap-group\"\n              [style.transform-origin]=\"(item.x + item.w/2) + 'px ' + (item.y + item.h/2) + 'px'\"\n              [style.animation-delay]=\"idx * 0.03 + 's'\"\n              (mouseenter)=\"onItemEnter(item, $event)\"\n              (mouseleave)=\"onItemLeave()\"\n              (click)=\"onItemClick(item)\"\n            >\n              <!-- Cell Box -->\n              <rect\n                [attr.x]=\"item.x\"\n                [attr.y]=\"item.y\"\n                [attr.width]=\"item.w\"\n                [attr.height]=\"item.h\"\n                [attr.fill]=\"item.displayColor\"\n                class=\"treemap-rect\"\n                rx=\"4\"\n                ry=\"4\"\n              />\n\n              <!-- Glass Sheen Overlay -->\n              <rect\n                [attr.x]=\"item.x\"\n                [attr.y]=\"item.y\"\n                [attr.width]=\"item.w\"\n                [attr.height]=\"item.h\"\n                fill=\"url(#treemap-sheen)\"\n                rx=\"4\"\n                ry=\"4\"\n                pointer-events=\"none\"\n              />\n              \n              <!-- Labels (Only show if rectangle is large enough) -->\n              @if (item.w > 50 && item.h > 30) {\n                <text\n                  [attr.x]=\"item.x + 8\"\n                  [attr.y]=\"item.y + 18\"\n                  class=\"treemap-label\"\n                >\n                  {{ item.label }}\n                </text>\n                @if (item.h > 45) {\n                  <text\n                    [attr.x]=\"item.x + 8\"\n                    [attr.y]=\"item.y + 32\"\n                    class=\"treemap-value\"\n                  >\n                    {{ item.value.toLocaleString() }}\n                  </text>\n                }\n              }\n            </g>\n          }\n        </svg>\n\n        <!-- Glassmorphic Tooltip Overlay -->\n        @if (tooltip().show) {\n          <div\n            class=\"treemap-tooltip\"\n            [style.left.px]=\"tooltip().x\"\n            [style.top.px]=\"tooltip().y\"\n          >\n            <div class=\"tt-cat\">{{ tooltip().title }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"tooltip().color\"></span>\n              <span class=\"tt-name\">Value</span>\n              <span class=\"tt-val\">{{ tooltip().value }}</span>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-treemap-wrapper {\n      width: 100%;\n      height: 100%;\n      padding: 16px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .ngx-treemap-container {\n      position: relative;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-treemap-svg {\n      width: 100%;\n      height: 100%;\n      display: block;\n      overflow: visible;\n    }\n\n    @keyframes treemapScaleIn {\n      from { opacity: 0; transform: scale(0.92); }\n      to { opacity: 1; transform: scale(1); }\n    }\n\n    .treemap-group {\n      cursor: pointer;\n      animation: treemapScaleIn 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;\n      transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .treemap-group:hover {\n      transform: scale(1.025);\n    }\n    .treemap-rect {\n      stroke: var(--bg-secondary, #ffffff);\n      stroke-width: 1.5px;\n      transition: fill 0.2s ease, stroke 0.2s ease, filter 0.2s ease;\n    }\n    .treemap-group:hover .treemap-rect {\n      filter: brightness(1.06) drop-shadow(0 4px 12px rgba(0,0,0,0.22));\n      stroke: var(--ngx-chart-hover-stroke, #0f172a);\n      stroke-width: 2px;\n    }\n    .treemap-label {\n      font-size: 11px;\n      font-weight: 750;\n      fill: #ffffff;\n      font-family: inherit;\n      pointer-events: none;\n      text-shadow: 0 1px 2px rgba(0,0,0,0.3);\n    }\n    .treemap-value {\n      font-size: 9px;\n      font-weight: 600;\n      fill: rgba(255, 255, 255, 0.95);\n      font-family: inherit;\n      pointer-events: none;\n      text-shadow: 0 1px 2px rgba(0,0,0,0.3);\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .treemap-tooltip {\n      position: absolute;\n      z-index: 100;\n      pointer-events: none;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -115%);\n      min-width: 140px;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export Trigger & Dropdown */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class TreemapChartComponent {\n  data = input.required<TreemapItem[]>();\n  colors = input<string[]>(['#4f46e5', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899', '#06b6d4']);\n  showExport = input<boolean>(false);\n\n  itemClick = output<TreemapItem>();\n\n  exportMenuOpen = signal(false);\n  tooltip = signal<{ show: boolean; title: string; value: string; x: number; y: number; color: string }>({\n    show: false,\n    title: '',\n    value: '',\n    x: 0,\n    y: 0,\n    color: ''\n  });\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  layoutRects = computed(() => {\n    const rawData = this.data();\n    if (!rawData || rawData.length === 0) return [];\n\n    // Sort items descending by value\n    const items = [...rawData].sort((a, b) => b.value - a.value);\n    const totalVal = items.reduce((sum, item) => sum + item.value, 0);\n\n    const layoutList: LayoutItem[] = [];\n    \n    // Canvas viewBox is 500x300. Leave a tiny padding margin around\n    const w = 500;\n    const h = 300;\n\n    const colorsList = this.colors();\n\n    this.subdivide(items, 0, 0, w, h, totalVal, (item, rx, ry, rw, rh, index) => {\n      const displayColor = item.color || colorsList[index % colorsList.length];\n      layoutList.push({\n        ...item,\n        x: rx,\n        y: ry,\n        w: rw,\n        h: rh,\n        displayColor\n      });\n    }, 0);\n\n    return layoutList;\n  });\n\n  private subdivide(\n    items: TreemapItem[],\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n    totalVal: number,\n    callback: (item: TreemapItem, rx: number, ry: number, rw: number, rh: number, index: number) => void,\n    startIndex: number\n  ) {\n    if (items.length === 0) return;\n    if (items.length === 1) {\n      callback(items[0], x, y, w, h, startIndex);\n      return;\n    }\n\n    // Proportional division\n    let splitIdx = 1;\n    let group1Sum = items[0].value;\n    let minDiff = Math.abs(group1Sum - (totalVal - group1Sum));\n\n    for (let i = 2; i < items.length; i++) {\n      const tempSum = group1Sum + items[i - 1].value;\n      const tempDiff = Math.abs(tempSum - (totalVal - tempSum));\n      if (tempDiff < minDiff) {\n        group1Sum = tempSum;\n        splitIdx = i;\n        minDiff = tempDiff;\n      } else {\n        break;\n      }\n    }\n\n    const group1 = items.slice(0, splitIdx);\n    const group2 = items.slice(splitIdx);\n    const group2Sum = totalVal - group1Sum;\n\n    // Split on wider axis\n    if (w > h) {\n      const w1 = w * (group1Sum / totalVal);\n      const w2 = w - w1;\n      this.subdivide(group1, x, y, w1, h, group1Sum, callback, startIndex);\n      this.subdivide(group2, x + w1, y, w2, h, group2Sum, callback, startIndex + splitIdx);\n    } else {\n      const h1 = h * (group1Sum / totalVal);\n      const h2 = h - h1;\n      this.subdivide(group1, x, y, w, h1, group1Sum, callback, startIndex);\n      this.subdivide(group2, x, y + h1, w, h2, group2Sum, callback, startIndex + splitIdx);\n    }\n  }\n\n  onItemEnter(item: LayoutItem, event: MouseEvent): void {\n    const rect = (event.currentTarget as SVGGraphicsElement).getBoundingClientRect();\n    const parentRect = (event.currentTarget as SVGGraphicsElement).ownerSVGElement!.parentElement!.getBoundingClientRect();\n    const x = rect.left - parentRect.left + rect.width / 2;\n    const y = rect.top - parentRect.top;\n\n    this.tooltip.set({\n      show: true,\n      title: item.label,\n      value: item.value.toLocaleString(),\n      x,\n      y,\n      color: item.displayColor\n    });\n  }\n\n  onItemLeave(): void {\n    this.tooltip.update(t => ({ ...t, show: false }));\n  }\n\n  onItemClick(item: LayoutItem): void {\n    this.itemClick.emit(item);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'treemap-chart.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    let csv = 'Label,Value\\n';\n    data.forEach(d => {\n      csv += `\"${d.label || ''}\",${d.value}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'treemap-chart.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'treemap-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const serializer = new XMLSerializer();\n    let svgString = serializer.serializeToString(svg);\n    if (!svgString.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      svgString = svgString.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Chart Export</title>\n          <style>\n            body {\n              margin: 20px;\n              font-family: system-ui, sans-serif;\n              text-align: center;\n            }\n            .print-container {\n              display: inline-block;\n              margin: 0 auto;\n            }\n            svg {\n              width: 100%;\n              height: auto;\n            }\n            @media print {\n              body { margin: 0; }\n              .no-print { display: none; }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${svgString}\n          </div>\n          <script>\n            window.onload = () => {\n              setTimeout(() => {\n                window.print();\n                window.close();\n              }, 250);\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartSeries, niceTicks, scale, smoothPath, fmtNum } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-area-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-area-chart\" (mousemove)=\"onMouseMove($event)\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      @if (showLegend()) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"seriesColor(i, s)\"></span>\n              {{ s.name }}\n            </span>\n          }\n        </div>\n      }\n      \n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <defs>\n            @for (s of series(); track s.name; let i = $index) {\n              <linearGradient [attr.id]=\"'area-gradient-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.45\"/>\n                <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.02\"/>\n              </linearGradient>\n            }\n          </defs>\n          \n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Gridlines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" stroke=\"var(--ngx-chart-grid, #e2e8f0)\" stroke-dasharray=\"3,3\"/>\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(tick) }}</text>\n              </g>\n            }\n\n            <!-- X Axis Categories -->\n            @for (cat of categories(); track cat; let i = $index) {\n              <text [attr.x]=\"xPos(i)\" [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ cat }}</text>\n            }\n\n            <!-- Area & Line Paths -->\n            @for (s of series(); track s.name; let si = $index) {\n              <!-- Area Fill -->\n              <path\n                [attr.d]=\"areaPath(s)\"\n                [attr.fill]=\"'url(#area-gradient-' + si + ')'\"\n                stroke=\"none\"\n                class=\"area-path\"\n              />\n              \n              <!-- Border Line -->\n              <path\n                [attr.d]=\"linePath(s)\"\n                [attr.stroke]=\"seriesColor(si, s)\"\n                fill=\"none\"\n                stroke-width=\"3\"\n                stroke-linejoin=\"round\"\n                stroke-linecap=\"round\"\n                class=\"line-path\"\n              />\n              \n              <!-- Hover Markers -->\n              @if (showMarkers() && animateState()) {\n                @for (v of s.data; track $index; let ci = $index) {\n                  <circle\n                    [attr.cx]=\"xPos(ci)\"\n                    [attr.cy]=\"yPos(v)\"\n                    [attr.r]=\"activeCategoryIndex() === ci ? 6 : 4\"\n                    [attr.fill]=\"seriesColor(si, s)\"\n                    [attr.stroke]=\"activeCategoryIndex() === ci ? '#fff' : '#fff'\"\n                    [attr.stroke-width]=\"activeCategoryIndex() === ci ? 2.5 : 2\"\n                    [attr.filter]=\"activeCategoryIndex() === ci ? 'drop-shadow(0 2px 4px rgba(0,0,0,0.25))' : null\"\n                    class=\"marker-dot\"\n                  />\n                }\n              }\n            }\n\n            <!-- Vertical Crosshair -->\n            @if (crosshair(); as ch) {\n              <line [attr.x1]=\"ch.x\" [attr.x2]=\"ch.x\" y1=\"0\" [attr.y2]=\"innerH()\"\n                stroke=\"var(--primary-color, #4f46e5)\" stroke-opacity=\"0.3\" stroke-width=\"1.5\" stroke-dasharray=\"4,4\"/>\n            }\n\n            <!-- Axis Lines -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n          </g>\n        </svg>\n      </div>\n\n      <!-- Hover Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <div class=\"tt-cat\">{{ t.cat }}</div>\n          @for (row of t.rows; track row.name) {\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"row.color\"></span>\n              <span class=\"tt-name\">{{ row.name }}</span>\n              <strong class=\"tt-val\">{{ fmtNum(row.value) }}</strong>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-area-chart {\n      position: relative;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      padding: 0 0 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .legend-dot {\n      width: 12px;\n      height: 4px;\n      border-radius: 2px;\n      display: inline-block;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n      cursor: crosshair;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n    }\n    \n    @keyframes lineDraw {\n      from { stroke-dashoffset: 1200; }\n      to { stroke-dashoffset: 0; }\n    }\n    .line-path {\n      stroke-dasharray: 1200;\n      stroke-dashoffset: 1200;\n      animation: lineDraw 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    \n    @keyframes areaFadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .area-path {\n      animation: areaFadeIn 1s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both;\n    }\n\n    .marker-dot {\n      animation: areaFadeIn 0.5s ease 0.8s both;\n      transition: r 0.15s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.15s;\n    }\n    \n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-cat { font-weight: 700; margin-bottom: 8px; font-size: 12.5px; border-bottom: 1px solid rgba(255, 255, 255, 0.15); padding-bottom: 6px; color: #38bdf8; }\n    .tt-row { display: flex; align-items: center; gap: 8px; margin-top: 5px; }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }\n    .tt-name { color: rgba(248, 250, 252, 0.8); flex: 1; }\n    .tt-val { font-weight: 700; font-family: monospace; }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class AreaChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 12;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<ChartSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(260);\n  showGrid = input<boolean>(true);\n  showMarkers = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  crosshair = signal<{ x: number } | null>(null);\n  activeCategoryIndex = signal<number | null>(null);\n  tooltip = signal<{ x: number; y: number; cat: string; rows: { name: string; value: number; color: string }[] } | null>(null);\n  containerWidth = signal<number>(600);\n\n  innerW = computed(() => this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT);\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  animateState = signal(false);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Subtract padding of .ngx-area-chart (20px on each side = 40px)\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  private allValues = computed(() => this.series().flatMap(s => s.data));\n  private yMin = computed(() => Math.min(0, ...this.allValues()));\n  private yMax = computed(() => Math.max(1, ...this.allValues()));\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  yPos(v: number): number { return scale(v, this.yMin(), this.yMax(), this.innerH(), 0); }\n  xPos(i: number): number {\n    const n = this.categories().length;\n    return n <= 1 ? this.innerW() / 2 : scale(i, 0, n - 1, 0, this.innerW());\n  }\n\n  seriesColor(i: number, s: ChartSeries): string {\n    return s.color || this.colors()[i % this.colors().length];\n  }\n\n  linePath(s: ChartSeries): string {\n    const pts: [number, number][] = s.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    return smoothPath(pts);\n  }\n\n  areaPath(s: ChartSeries): string {\n    const pts: [number, number][] = s.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    const line = smoothPath(pts);\n    const last = pts[pts.length - 1];\n    const first = pts[0];\n    return line + ` L ${last[0]} ${this.innerH()} L ${first[0]} ${this.innerH()} Z`;\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.PAD_LEFT;\n    const cats = this.categories();\n    if (cats.length === 0) return;\n    const idx = Math.round(scale(mx, 0, this.innerW(), 0, cats.length - 1));\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n    this.crosshair.set({ x: this.xPos(ci) });\n    this.activeCategoryIndex.set(ci);\n    const rows = this.series().map((s, si) => ({\n      name: s.name,\n      value: s.data[ci] ?? 0,\n      color: this.seriesColor(si, s),\n    }));\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      cat: cats[ci],\n      rows,\n    });\n  }\n\n  onMouseLeave(): void {\n    this.crosshair.set(null);\n    this.activeCategoryIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const data = cats.map((cat, ci) => {\n      const entry: Record<string, any> = { category: cat };\n      sers.forEach(s => {\n        if (s.data[ci] !== undefined && s.data[ci] !== null) {\n          entry[s.name] = s.data[ci];\n        }\n      });\n      return entry;\n    });\n    this.exportSvc.downloadJson(data, 'area-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const headers = ['Category', ...sers.map(s => s.name)];\n    const rows: (string | number)[][] = cats.map((cat, ci) => [cat, ...sers.map(s => s.data[ci] ?? '')]);\n    this.exportSvc.downloadCsv(headers, rows, 'area-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface FunnelItem {\n  name: string;\n  value: number;\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-funnel-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-funnel-chart\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"funnel-layout\">\n        <!-- SVG Visual Funnel / Pyramid -->\n        <div class=\"funnel-graphic\" (mouseleave)=\"hoveredIndex.set(null)\">\n          <svg\n            #svgEl\n            [attr.width]=\"'100%'\"\n            [attr.height]=\"height()\"\n            viewBox=\"0 0 400 300\"\n            preserveAspectRatio=\"xMidYMid meet\"\n            class=\"funnel-svg\"\n          >\n            <defs>\n              @for (stage of funnelStages(); track stage.name; let i = $index) {\n                <linearGradient [id]=\"'funnel-grad-' + i\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n                  <stop offset=\"0%\" [attr.stop-color]=\"stage.color\" />\n                  <stop offset=\"100%\" [attr.stop-color]=\"stage.color\" stop-opacity=\"0.65\" />\n                </linearGradient>\n              }\n            </defs>\n            <g>\n              @for (stage of funnelStages(); track stage.name; let i = $index) {\n                <polygon\n                  [attr.points]=\"stage.points\"\n                  [attr.fill]=\"'url(#funnel-grad-' + i + ')'\"\n                  [class.active]=\"hoveredIndex() === i\"\n                  [style.transform-origin]=\"'200px ' + stage.yCenter + 'px'\"\n                  [style.animation-delay]=\"i * 0.06 + 's'\"\n                  (mouseenter)=\"hoveredIndex.set(i)\"\n                  (mousemove)=\"onMouseMove($event, i)\"\n                  class=\"funnel-polygon\"\n                />\n              }\n            </g>\n          </svg>\n          \n          <!-- Hover Tooltip -->\n          @if (hoveredIndex() !== null) {\n            @if (funnelStages()[hoveredIndex()!]; as stage) {\n              <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n                <div class=\"tt-cat\">{{ stage.name }}</div>\n                <div class=\"tt-row\">\n                  <span class=\"tt-dot\" [style.background]=\"stage.color\"></span>\n                  <span class=\"tt-name\">Value</span>\n                  <span class=\"tt-val\">{{ fmtNum(stage.value) }}</span>\n                </div>\n                <div class=\"tt-row\">\n                  <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n                  <span class=\"tt-name\">{{ mode() === 'funnel' ? 'Conversion' : 'Share' }}</span>\n                  <span class=\"tt-val\">\n                    {{ (mode() === 'funnel' ? (stage.value / funnelStages()[0].value) : (stage.value / totalValue())) | percent:'1.0-1' }}\n                  </span>\n                </div>\n              </div>\n            }\n          }\n        </div>\n\n        <!-- Sidebar legend & metric checklist -->\n        <div class=\"funnel-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null)\">\n          @for (stage of funnelStages(); track stage.name; let i = $index) {\n            <div\n              class=\"legend-item\"\n              [class.active]=\"hoveredIndex() === i\"\n              (mouseenter)=\"hoveredIndex.set(i)\"\n              (mouseleave)=\"hoveredIndex.set(null)\"\n            >\n              <span class=\"legend-color-dot\" [style.background]=\"stage.color\"></span>\n              <div class=\"legend-content\">\n                <span class=\"legend-title\">{{ stage.name }}</span>\n                <div class=\"legend-metrics\">\n                  <span class=\"metric-value\">{{ fmtNum(stage.value) }}</span>\n                  <span class=\"metric-pct\">\n                    {{ (mode() === 'funnel' ? (stage.value / funnelStages()[0].value) : (stage.value / totalValue())) | percent:'1.0-1' }}\n                  </span>\n                </div>\n              </div>\n            </div>\n          }\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-funnel-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 16px;\n      padding: 20px;\n      position: relative;\n    }\n    .funnel-layout {\n      display: grid;\n      grid-template-columns: 1.2fr 1fr;\n      gap: 24px;\n      align-items: center;\n    }\n    @media (max-width: 600px) {\n      .funnel-layout {\n        grid-template-columns: 1fr;\n      }\n    }\n    \n    .funnel-graphic {\n      position: relative;\n      width: 100%;\n    }\n    .funnel-svg {\n      display: block;\n      overflow: visible;\n    }\n\n    @keyframes funnelBuildIn {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n\n    .funnel-polygon {\n      cursor: pointer;\n      opacity: 0.88;\n      transition: opacity 0.25s, transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), filter 0.25s;\n      animation: funnelBuildIn 0.7s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .funnel-polygon:hover, .funnel-polygon.active {\n      opacity: 1;\n      transform: scale(1.03);\n      filter: drop-shadow(0 8px 16px rgba(0,0,0,0.18)) brightness(1.03);\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 155px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Sidebar metrics list */\n    .funnel-legend {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      padding: 10px 14px;\n      border-radius: 8px;\n      border: 1px solid transparent;\n      transition: all 0.2s;\n      cursor: pointer;\n    }\n    .legend-item:hover, .legend-item.active {\n      background: var(--ngx-chart-grid, #f8fafc);\n      border-color: var(--ngx-chart-grid, #e2e8f0);\n    }\n    .legend-color-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .legend-content {\n      flex: 1;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 16px;\n    }\n    .legend-title {\n      font-size: 13px;\n      font-weight: 600;\n      color: var(--ngx-chart-text, #0f172a);\n    }\n    .legend-metrics {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n    }\n    .metric-value {\n      font-size: 13px;\n      font-weight: 700;\n      color: var(--ngx-chart-text, #0f172a);\n    }\n    .metric-pct {\n      font-size: 11px;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: var(--ngx-chart-grid, #f1f5f9);\n      padding: 2px 6px;\n      border-radius: 4px;\n      font-weight: 600;\n    }\n\n    /* Header and Export dropdown styles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class FunnelChartComponent {\n  data = input<FunnelItem[]>([]);\n  height = input<number>(300);\n  colors = input<string[]>(CHART_COLORS);\n  mode = input<'funnel' | 'pyramid'>('funnel');\n  showExport = input<boolean>(false);\n\n  hoveredIndex = signal<number | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  totalValue = computed(() => {\n    return this.data().reduce((sum, item) => sum + item.value, 0) || 1;\n  });\n\n  // Computes the SVG polygon coordinates for the funnel / pyramid steps\n  funnelStages = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return [];\n    \n    const count = items.length;\n    const svgW = 400;\n    const svgH = 300;\n    const maxFunnelW = 320;\n\n    if (this.mode() === 'pyramid') {\n      // Pyramid Mode: Stacks vertically to form a triangle pointing up.\n      const totalVal = this.totalValue();\n      let currentY = 0;\n\n      return items.map((item, idx) => {\n        const h = (item.value / totalVal) * svgH;\n        const yTop = currentY;\n        const yBot = currentY + h;\n\n        const wTop = (yTop / svgH) * maxFunnelW;\n        const wBot = (yBot / svgH) * maxFunnelW;\n\n        const xTopLeft = (svgW - wTop) / 2;\n        const xTopRight = (svgW + wTop) / 2;\n        const xBotLeft = (svgW - wBot) / 2;\n        const xBotRight = (svgW + wBot) / 2;\n\n        const points = `${xTopLeft},${yTop} ${xTopRight},${yTop} ${xBotRight},${yBot} ${xBotLeft},${yBot}`;\n        const color = item.color || this.colors()[idx % this.colors().length];\n\n        currentY += h;\n\n        return {\n          name: item.name,\n          value: item.value,\n          points,\n          color,\n          yCenter: (yTop + yBot) / 2\n        };\n      });\n    } else {\n      // Standard Funnel Mode\n      const maxVal = items[0]?.value || 1;\n      const stepH = svgH / count;\n      \n      return items.map((item, idx) => {\n        const topPct = item.value / maxVal;\n        const botPct = idx < count - 1 ? items[idx + 1].value / maxVal : topPct * 0.4;\n        \n        const topW = topPct * maxFunnelW;\n        const botW = botPct * maxFunnelW;\n        \n        const yTop = idx * stepH;\n        const yBot = (idx + 1) * stepH;\n        \n        const xTopLeft = (svgW - topW) / 2;\n        const xTopRight = (svgW + topW) / 2;\n        const xBotLeft = (svgW - botW) / 2;\n        const xBotRight = (svgW + botW) / 2;\n        \n        const points = `${xTopLeft},${yTop} ${xTopRight},${yTop} ${xBotRight},${yBot} ${xBotLeft},${yBot}`;\n        const color = item.color || this.colors()[idx % this.colors().length];\n        \n        return {\n          name: item.name,\n          value: item.value,\n          points,\n          color,\n          yCenter: (yTop + yBot) / 2\n        };\n      });\n    }\n  });\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'funnel-chart-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    let csv = 'Name,Value\\n';\n    data.forEach(d => {\n      csv += `\"${d.name || ''}\",${d.value}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'funnel-chart-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'funnel-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgClone = svg.cloneNode(true) as SVGElement;\n    svgClone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n    const svgString = new XMLSerializer().serializeToString(svgClone);\n    \n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body {\n              margin: 0;\n              display: flex;\n              justify-content: center;\n              align-items: center;\n              height: 100vh;\n              background-color: #ffffff;\n              font-family: system-ui, sans-serif;\n            }\n            .print-container {\n              text-align: center;\n              width: 100%;\n              max-width: 800px;\n              padding: 20px;\n            }\n            svg {\n              width: 100%;\n              height: auto;\n              max-height: 90vh;\n            }\n            @media print {\n              body {\n                background: none;\n              }\n              .print-container {\n                max-width: 100%;\n                padding: 0;\n              }\n              svg {\n                page-break-inside: avoid;\n              }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${svgString}\n          </div>\n          <script>\n            window.onload = () => {\n              window.print();\n              window.close();\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n\n  onMouseMove(event: MouseEvent, index: number): void {\n    const el = event.currentTarget as SVGElement;\n    const parentRect = el.parentElement?.parentElement?.getBoundingClientRect();\n    if (parentRect) {\n      this.tooltipX.set(event.clientX - parentRect.left);\n      this.tooltipY.set(event.clientY - parentRect.top);\n    }\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject, DestroyRef\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartSeries, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-combo-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-combo-chart\" [class.dark]=\"theme() === 'dark'\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend()) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\">\n          @for (s of barSeries(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot bar\" [style.background]=\"barSeriesColor(i)\"></span>\n              {{ s.name }} (Bar)\n            </span>\n          }\n          @for (s of lineSeries(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-line\" [style.border-color]=\"lineSeriesColor(i)\"></span>\n              <span class=\"legend-dot marker\" [style.background]=\"lineSeriesColor(i)\"></span>\n              {{ s.name }} (Line)\n            </span>\n          }\n        </div>\n      }\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n          (mouseleave)=\"onMouseLeave()\"\n        >\n          <defs>\n            @for (s of barSeries(); track s.name; let si = $index) {\n              <linearGradient [id]=\"'combo-bar-grad-' + si\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" [attr.stop-color]=\"s.color || barSeriesColor(si)\" stop-opacity=\"1\"/>\n                <stop offset=\"100%\" [attr.stop-color]=\"s.color || barSeriesColor(si)\" stop-opacity=\"0.75\"/>\n              </linearGradient>\n            }\n          </defs>\n\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines -->\n            @if (showGrid()) {\n              @for (tick of leftYTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"leftYPos(tick)\"\n                  [attr.y2]=\"leftYPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis (Left) - Bars -->\n            @for (tick of leftYTicks(); track tick) {\n              <text\n                x=\"-10\"\n                [attr.y]=\"leftYPos(tick) + 4\"\n                class=\"axis-label left\"\n                text-anchor=\"end\"\n              >{{ fmtNum(tick) }}</text>\n            }\n            <text\n              [attr.transform]=\"'rotate(-90) translate(' + (-innerH()/2) + ', -36)'\"\n              class=\"axis-title left\"\n              text-anchor=\"middle\"\n            >{{ barYTitle() }}</text>\n\n            <!-- Y-Axis (Right) - Lines -->\n            @for (tick of rightYTicks(); track tick) {\n              <text\n                [attr.x]=\"innerW() + 10\"\n                [attr.y]=\"rightYPos(tick) + 4\"\n                class=\"axis-label right\"\n                text-anchor=\"start\"\n              >{{ fmtNum(tick) }}</text>\n            }\n            <text\n              [attr.transform]=\"'rotate(90) translate(' + (innerH()/2) + ', ' + (-innerW() - 36) + ')'\"\n              class=\"axis-title right\"\n              text-anchor=\"middle\"\n            >{{ lineYTitle() }}</text>\n\n            <!-- X-Axis Labels -->\n            @for (cat of categories(); track cat; let i = $index) {\n              <text\n                [attr.x]=\"catMidX(i)\"\n                [attr.y]=\"innerH() + 20\"\n                class=\"axis-label x\"\n                text-anchor=\"middle\"\n              >{{ cat }}</text>\n            }\n\n            <!-- Active Category Column Highlight -->\n            @if (activeCategoryIndex() !== null) {\n              <rect\n                [attr.x]=\"activeCategoryIndex()! * groupW() + 2\"\n                [attr.y]=\"0\"\n                [attr.width]=\"groupW() - 4\"\n                [attr.height]=\"innerH()\"\n                class=\"column-highlight\"\n              />\n            }\n\n            <!-- Bars (Left Y-Axis Scale) -->\n            @for (s of barSeries(); track s.name; let si = $index) {\n              @for (v of s.data; track $index; let ci = $index) {\n                @if (v !== null && v !== undefined) {\n                  <rect\n                    [attr.x]=\"barX(ci, si)\"\n                    [attr.y]=\"barY(v)\"\n                    [attr.width]=\"singleBarWidth()\"\n                    [attr.height]=\"barH(v)\"\n                    [attr.fill]=\"s.color ? s.color : 'url(#combo-bar-grad-' + si + ')'\"\n                    [attr.rx]=\"4\"\n                    class=\"bar-rect\"\n                  />\n                }\n              }\n            }\n\n            <!-- Lines (Right Y-Axis Scale) -->\n            @for (s of lineSeries(); track s.name; let si = $index) {\n              <!-- Draw Line Path -->\n              <path\n                [attr.d]=\"linePath(s)\"\n                fill=\"none\"\n                [attr.stroke]=\"s.color || lineSeriesColor(si)\"\n                stroke-width=\"3\"\n                stroke-linecap=\"round\"\n                class=\"line-path\"\n              />\n              <!-- Draw Markers -->\n              @for (v of s.data; track $index; let ci = $index) {\n                @if (v !== null && v !== undefined) {\n                  <circle\n                    [attr.cx]=\"catMidX(ci)\"\n                    [attr.cy]=\"rightYPos(v)\"\n                    [attr.r]=\"activeCategoryIndex() === ci ? 6.5 : 4\"\n                    [attr.fill]=\"'#ffffff'\"\n                    [attr.stroke]=\"s.color || lineSeriesColor(si)\"\n                    [attr.stroke-width]=\"activeCategoryIndex() === ci ? 3 : 2.5\"\n                    class=\"line-marker\"\n                    [style.transform-origin]=\"catMidX(ci) + 'px ' + rightYPos(v) + 'px'\"\n                  />\n                }\n              }\n            }\n\n            <!-- Invisible Hover Interactive Hitboxes -->\n            @for (cat of categories(); track cat; let i = $index) {\n              <rect\n                [attr.x]=\"i * groupW()\"\n                [attr.y]=\"0\"\n                [attr.width]=\"groupW()\"\n                [attr.height]=\"innerH()\"\n                fill=\"transparent\"\n                class=\"hitbox\"\n                (mousemove)=\"onMouseMove($event, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line [attr.x1]=\"innerW()\" [attr.x2]=\"innerW()\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Dynamic Combined Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tt-cat\">{{ t.category }}</div>\n            <div class=\"tt-body\">\n              @for (item of t.items; track item.name) {\n                <div class=\"tt-row\">\n                  <span class=\"tt-dot\" [style.background]=\"item.color\" [class.line-dot]=\"item.type === 'line'\"></span>\n                  <span class=\"tt-name\">{{ item.name }}</span>\n                  <span class=\"tt-val\">{{ fmtNum(item.value) }}{{ item.suffix || '' }}</span>\n                </div>\n              }\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-combo-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      transition: background-color 0.3s;\n    }\n    .ngx-combo-chart.dark {\n      background: rgba(30, 32, 48, 0.45);\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: transparent;\n      --ngx-chart-grid: rgba(255, 255, 255, 0.06);\n      --ngx-chart-axis: rgba(255, 255, 255, 0.12);\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 16px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      font-size: 12px;\n      font-weight: 500;\n      color: #64748b;\n    }\n    .dark .legend-item {\n      color: #94a3b8;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      display: inline-block;\n    }\n    .legend-dot.bar {\n      border-radius: 2px;\n    }\n    .legend-line {\n      width: 14px;\n      border-bottom: 2px solid;\n      display: inline-block;\n    }\n    .legend-dot.marker {\n      margin-left: -12px;\n      width: 6px;\n      height: 6px;\n      border: 1.5px solid #ffffff;\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n    .dark .axis-label {\n      fill: #94a3b8;\n    }\n    .axis-title {\n      font-size: 11px;\n      font-weight: 600;\n      fill: #475569;\n      letter-spacing: 0.5px;\n    }\n    .dark .axis-title {\n      fill: #cbd5e1;\n    }\n    .column-highlight {\n      fill: rgba(59, 130, 246, 0.04);\n      pointer-events: none;\n      rx: 6;\n      ry: 6;\n      animation: fadeIn 0.12s ease-out;\n    }\n    .dark .column-highlight {\n      fill: rgba(255, 255, 255, 0.03);\n    }\n    .bar-rect {\n      transition: y 0.5s cubic-bezier(0.16, 1, 0.3, 1),\n                  height 0.5s cubic-bezier(0.16, 1, 0.3, 1),\n                  fill-opacity 0.15s,\n                  stroke-width 0.15s;\n      stroke: #ffffff;\n      stroke-width: 0.5;\n      cursor: pointer;\n    }\n    .bar-rect:hover {\n      fill-opacity: 0.9;\n      stroke-width: 1.5;\n      filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.08));\n    }\n\n    @keyframes drawLine {\n      from { stroke-dashoffset: 1200; }\n      to { stroke-dashoffset: 0; }\n    }\n\n    .line-path {\n      stroke-dasharray: 1200;\n      stroke-dashoffset: 1200;\n      animation: drawLine 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      transition: stroke 0.2s;\n    }\n\n    @keyframes markerFade {\n      from { opacity: 0; transform: scale(0); }\n      to { opacity: 1; transform: scale(1); }\n    }\n\n    .line-marker {\n      cursor: pointer;\n      transition: r 0.2s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.2s;\n      animation: markerFade 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.6s both;\n    }\n    .hitbox {\n      cursor: crosshair;\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-dot.line-dot {\n      border: 1.5px solid #ffffff;\n      box-sizing: border-box;\n      width: 9px;\n      height: 9px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class ComboChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  PAD_LEFT = 52;\n  PAD_TOP = 16;\n  PAD_RIGHT = 52;\n  PAD_BOTTOM = 36;\n\n  barSeries = input<ChartSeries[]>([]);\n  lineSeries = input<ChartSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  theme = input<'light' | 'dark'>('light');\n  colors = input<string[]>(CHART_COLORS);\n  barYTitle = input<string>('Volume');\n  lineYTitle = input<string>('Percentage');\n  showExport = input<boolean>(false);\n\n  activeCategoryIndex = signal<number | null>(null);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  tooltip = signal<{\n    x: number;\n    y: number;\n    category: string;\n    items: Array<{ name: string; value: number; color: string; type: 'bar' | 'line'; suffix?: string }>;\n  } | null>(null);\n\n  animateState = signal(false);\n\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Trigger compute width changes\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  // Dimension Calculations\n  innerW = computed(() => {\n    const el = this.container()?.nativeElement;\n    const totalW = el ? el.getBoundingClientRect().width : 600;\n    return Math.max(200, totalW - this.PAD_LEFT - this.PAD_RIGHT);\n  });\n\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  // Left Y-Axis Calculations (Bar values)\n  private leftValues = computed(() => this.barSeries().flatMap(s => s.data.filter(v => v !== null)));\n  private leftMin = computed(() => Math.min(0, ...this.leftValues()));\n  private leftMax = computed(() => Math.max(1, ...this.leftValues()));\n  leftYTicks = computed(() => niceTicks(this.leftMin(), this.leftMax(), 5));\n\n  leftYPos(v: number): number {\n    return scale(v, this.leftMin(), this.leftMax(), this.innerH(), 0);\n  }\n  \n  barY(v: number): number {\n    if (!this.animateState()) return this.leftYPos(0);\n    return Math.min(this.leftYPos(0), this.leftYPos(v));\n  }\n  \n  barH(v: number): number {\n    if (!this.animateState()) return 0;\n    return Math.abs(this.leftYPos(0) - this.leftYPos(v));\n  }\n\n  // Right Y-Axis Calculations (Line values)\n  private rightValues = computed(() => this.lineSeries().flatMap(s => s.data.filter(v => v !== null)));\n  private rightMin = computed(() => Math.min(0, ...this.rightValues()));\n  private rightMax = computed(() => Math.max(100, ...this.rightValues()));\n  rightYTicks = computed(() => niceTicks(this.rightMin(), this.rightMax(), 5));\n\n  rightYPos(v: number): number {\n    return scale(v, this.rightMin(), this.rightMax(), this.innerH(), 0);\n  }\n\n  // Layout positioning\n  groupW = computed(() => this.categories().length > 0 ? this.innerW() / this.categories().length : 0);\n  singleBarWidth = computed(() => {\n    const numSeries = this.barSeries().length || 1;\n    return Math.max(4, (this.groupW() - 12) / numSeries);\n  });\n\n  catMidX(i: number): number {\n    return i * this.groupW() + this.groupW() / 2;\n  }\n\n  barX(ci: number, si: number): number {\n    const numSeries = this.barSeries().length;\n    const groupStartX = ci * this.groupW() + 6;\n    return groupStartX + si * this.singleBarWidth();\n  }\n\n  barSeriesColor(si: number): string {\n    return this.colors()[si % this.colors().length];\n  }\n\n  lineSeriesColor(si: number): string {\n    // Avoid color collision by shifting indices\n    const offset = this.barSeries().length || 0;\n    return this.colors()[(si + offset) % this.colors().length];\n  }\n\n  // Line paths generator\n  linePath(series: ChartSeries): string {\n    const pts = series.data.map((v, ci) => {\n      if (v === null || v === undefined) return null;\n      return [this.catMidX(ci), this.rightYPos(v)] as [number, number];\n    }).filter((p): p is [number, number] => p !== null);\n\n    if (pts.length < 2) return '';\n    let d = `M ${pts[0][0]} ${pts[0][1]}`;\n    for (let i = 1; i < pts.length; i++) {\n      d += ` L ${pts[i][0]} ${pts[i][1]}`;\n    }\n    return d;\n  }\n\n  onMouseMove(event: MouseEvent, index: number) {\n    this.activeCategoryIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    const catName = this.categories()[index] || `Category ${index + 1}`;\n    const items: any[] = [];\n\n    // Bars info\n    this.barSeries().forEach((s, si) => {\n      const val = s.data[index];\n      if (val !== undefined && val !== null) {\n        items.push({\n          name: s.name,\n          value: val,\n          color: s.color || this.barSeriesColor(si),\n          type: 'bar'\n        });\n      }\n    });\n\n    // Lines info\n    this.lineSeries().forEach((s, si) => {\n      const val = s.data[index];\n      if (val !== undefined && val !== null) {\n        items.push({\n          name: s.name,\n          value: val,\n          color: s.color || this.lineSeriesColor(si),\n          type: 'line',\n          suffix: '%'\n        });\n      }\n    });\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      category: catName,\n      items\n    });\n  }\n\n  onMouseLeave() {\n    this.activeCategoryIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const cats = this.categories();\n    const bars = this.barSeries();\n    const lines = this.lineSeries();\n    if (!cats.length) return;\n    const data = cats.map((cat, ci) => {\n      const entry: Record<string, any> = { category: cat };\n      bars.forEach(s => { if (s.data[ci] !== undefined && s.data[ci] !== null) entry[s.name + '_bar'] = s.data[ci]; });\n      lines.forEach(s => { if (s.data[ci] !== undefined && s.data[ci] !== null) entry[s.name + '_line'] = s.data[ci]; });\n      return entry;\n    });\n    this.exportSvc.downloadJson(data, 'combo-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const cats = this.categories();\n    const bars = this.barSeries();\n    const lines = this.lineSeries();\n    if (!cats.length) return;\n    const headers = ['Category', ...bars.map(s => s.name + ' (Bar)'), ...lines.map(s => s.name + ' (Line)')];\n    const rows: (string | number)[][] = cats.map((cat, ci) => {\n      return [\n        cat,\n        ...bars.map(s => s.data[ci] ?? ''),\n        ...lines.map(s => s.data[ci] ?? '')\n      ];\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'combo-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface ScatterPoint {\n  x: number;\n  y: number;\n  label?: string;\n  group?: string;\n  size?: number; // Bubble sizing support\n}\n\n@Component({\n  selector: 'ngx-scatter-plot',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-scatter-plot\" [class.dark]=\"theme() === 'dark'\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend() && uniqueGroups().length > 0) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\">\n          @for (group of uniqueGroups(); track group; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"groupColor(group)\"></span>\n              {{ group }}\n            </span>\n          }\n        </div>\n      }\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n          (mouseleave)=\"onMouseLeave()\"\n        >\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal and Vertical) -->\n            @if (showGrid()) {\n              <!-- Horizontal Grid Lines -->\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n              <!-- Vertical Grid Lines -->\n              @for (tick of xTicks(); track tick) {\n                <line\n                  [attr.x1]=\"xPos(tick)\"\n                  [attr.x2]=\"xPos(tick)\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @for (tick of yTicks(); track tick) {\n              <text\n                x=\"-10\"\n                [attr.y]=\"yPos(tick) + 4\"\n                class=\"axis-label y\"\n                text-anchor=\"end\"\n              >{{ fmtNum(tick) }}</text>\n            }\n            <text\n              [attr.transform]=\"'rotate(-90) translate(' + (-innerH()/2) + ', -36)'\"\n              class=\"axis-title y\"\n              text-anchor=\"middle\"\n            >{{ yTitle() }}</text>\n\n            <!-- X-Axis Labels -->\n            @for (tick of xTicks(); track tick) {\n              <text\n                [attr.x]=\"xPos(tick)\"\n                [attr.y]=\"innerH() + 20\"\n                class=\"axis-label x\"\n                text-anchor=\"middle\"\n              >{{ fmtNum(tick) }}</text>\n            }\n            <text\n              [attr.x]=\"innerW() / 2\"\n              [attr.y]=\"innerH() + 38\"\n              class=\"axis-title x\"\n              text-anchor=\"middle\"\n            >{{ xTitle() }}</text>\n\n            <!-- Active Crosshair -->\n            @if (hoveredPointIndex() !== null) {\n              @if (scaledPoints()[hoveredPointIndex()!]; as pt) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"pt.cy\"\n                  [attr.y2]=\"pt.cy\"\n                  stroke=\"rgba(79, 70, 229, 0.35)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"pt.cx\"\n                  [attr.x2]=\"pt.cx\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(79, 70, 229, 0.35)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- Render Data Points -->\n            @for (pt of scaledPoints(); track $index; let i = $index) {\n              <circle\n                [attr.cx]=\"pt.cx\"\n                [attr.cy]=\"pt.cy\"\n                [attr.r]=\"hoveredPointIndex() === i ? pt.r + 3.5 : pt.r\"\n                [attr.fill]=\"pt.color\"\n                [attr.stroke]=\"'#ffffff'\"\n                stroke-width=\"1.5\"\n                class=\"scatter-point\"\n                [class.hovered]=\"hoveredPointIndex() === i\"\n                [style.transform-origin]=\"pt.cx + 'px ' + pt.cy + 'px'\"\n                [style.animation-delay]=\"(i * 0.015) + 's'\"\n                (mouseenter)=\"onPointHover($event, pt.raw, i)\"\n                (mousemove)=\"onPointHover($event, pt.raw, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            @if (t.label) {\n              <div class=\"tt-cat\">{{ t.label }}</div>\n            } @else {\n              <div class=\"tt-cat\">Point Data</div>\n            }\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">Group</span>\n              <span class=\"tt-val\">{{ t.group || 'Default' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n              <span class=\"tt-name\">{{ xTitle() }}</span>\n              <span class=\"tt-val\">{{ fmtNum(ptX(t)) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n              <span class=\"tt-name\">{{ yTitle() }}</span>\n              <span class=\"tt-val\">{{ fmtNum(ptY(t)) }}</span>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-scatter-plot {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      transition: background-color 0.3s;\n    }\n    .ngx-scatter-plot.dark {\n      background: rgba(30, 32, 48, 0.45);\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: transparent;\n      --ngx-chart-grid: rgba(255, 255, 255, 0.06);\n      --ngx-chart-axis: rgba(255, 255, 255, 0.12);\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 16px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      font-size: 12px;\n      font-weight: 500;\n      color: #64748b;\n    }\n    .dark .legend-item {\n      color: #94a3b8;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      display: inline-block;\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n    .dark .axis-label {\n      fill: #94a3b8;\n    }\n    .axis-title {\n      font-size: 11px;\n      font-weight: 600;\n      fill: #475569;\n      letter-spacing: 0.5px;\n    }\n    .dark .axis-title {\n      fill: #cbd5e1;\n    }\n\n    @keyframes scatterPointPop {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); opacity: 0.85; }\n    }\n\n    .scatter-point {\n      cursor: pointer;\n      transition: r 0.25s cubic-bezier(0.16, 1, 0.3, 1),\n                  opacity 0.25s,\n                  filter 0.25s,\n                  stroke-width 0.2s;\n      animation: scatterPointPop 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .scatter-point.hovered {\n      opacity: 0.95;\n      filter: drop-shadow(0 0 6px var(--ngx-chart-hover-stroke, #4f46e5));\n      stroke: #ffffff;\n      stroke-width: 2px;\n    }\n\n    .crosshair-line {\n      pointer-events: none;\n      animation: fadeIn 0.15s ease-out forwards;\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class ScatterPlotComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  PAD_LEFT = 52;\n  PAD_TOP = 16;\n  PAD_RIGHT = 24;\n  PAD_BOTTOM = 48;\n\n  data = input<ScatterPoint[]>([]);\n  xTitle = input<string>('X Axis');\n  yTitle = input<string>('Y Axis');\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  theme = input<'light' | 'dark'>('light');\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  hoveredPointIndex = signal<number | null>(null);\n\n  tooltip = signal<{\n    x: number;\n    y: number;\n    label?: string;\n    group?: string;\n    xVal: number;\n    yVal: number;\n    color: string;\n  } | null>(null);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  // Dynamic dimension scales\n  innerW = computed(() => {\n    const el = this.container()?.nativeElement;\n    const totalW = el ? el.getBoundingClientRect().width : 600;\n    return Math.max(200, totalW - this.PAD_LEFT - this.PAD_RIGHT);\n  });\n\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  // Group mappings\n  uniqueGroups = computed(() => {\n    const grps = new Set<string>();\n    this.data().forEach(p => {\n      if (p.group) grps.add(p.group);\n    });\n    return Array.from(grps);\n  });\n\n  groupColor(groupName?: string): string {\n    if (!groupName) return this.colors()[0];\n    const idx = this.uniqueGroups().indexOf(groupName);\n    return this.colors()[idx % this.colors().length];\n  }\n\n  // Bounds Calculations\n  private xValues = computed(() => this.data().map(pt => pt.x));\n  private xMin = computed(() => this.xValues().length > 0 ? Math.min(...this.xValues()) * 0.9 : 0);\n  private xMax = computed(() => this.xValues().length > 0 ? Math.max(...this.xValues()) * 1.1 : 100);\n  xTicks = computed(() => niceTicks(this.xMin(), this.xMax(), 5));\n\n  private yValues = computed(() => this.data().map(pt => pt.y));\n  private yMin = computed(() => this.yValues().length > 0 ? Math.min(...this.yValues()) * 0.9 : 0);\n  private yMax = computed(() => this.yValues().length > 0 ? Math.max(...this.yValues()) * 1.1 : 100);\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  // Map absolute coordinate points to SVG canvas\n  xPos(x: number): number {\n    return scale(x, this.xMin(), this.xMax(), 0, this.innerW());\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  scaledPoints = computed(() => {\n    return this.data().map((pt, i) => {\n      const cx = this.xPos(pt.x);\n      const cy = this.yPos(pt.y);\n      const r = pt.size ? Math.max(3, Math.min(20, pt.size)) : 6;\n      return {\n        cx,\n        cy,\n        r,\n        color: this.groupColor(pt.group),\n        raw: pt\n      };\n    });\n  });\n\n  onPointHover(event: MouseEvent, pt: ScatterPoint, index: number) {\n    this.hoveredPointIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      label: pt.label,\n      group: pt.group,\n      xVal: pt.x,\n      yVal: pt.y,\n      color: this.groupColor(pt.group)\n    });\n  }\n\n  onMouseLeave() {\n    this.hoveredPointIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  ptX(t: { xVal: number }): number { return t.xVal; }\n  ptY(t: { yVal: number }): number { return t.yVal; }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'scatter-plot.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Group', 'X', 'Y', 'Size'];\n    const rows = data.map(d => [d.label || '', d.group || '', d.x, d.y, d.size !== undefined ? d.size : '']);\n    this.exportSvc.downloadCsv(headers, rows, 'scatter-plot.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import { Component, ChangeDetectionStrategy, input, computed, signal, ElementRef, viewChild, inject } from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface BubblePoint {\n  x: number;\n  y: number;\n  z: number; // Magnitude/Volume sizing value\n  label?: string;\n  group?: string;\n}\n\n@Component({\n  selector: 'ngx-bubble-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-bubble-chart\" [class.dark]=\"theme() === 'dark'\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <!-- Title and Legend -->\n        @if (showLegend() && uniqueGroups().length > 0) {\n          <div class=\"chart-legend\">\n            @for (group of uniqueGroups(); track group; let i = $index) {\n              <span class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"groupColor(group)\"></span>\n                {{ group }}\n              </span>\n            }\n          </div>\n        }\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n          (mouseleave)=\"onMouseLeave()\"\n        >\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal and Vertical) -->\n            @if (showGrid()) {\n              <!-- Horizontal Grid Lines -->\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n              <!-- Vertical Grid Lines -->\n              @for (tick of xTicks(); track tick) {\n                <line\n                  [attr.x1]=\"xPos(tick)\"\n                  [attr.x2]=\"xPos(tick)\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @for (tick of yTicks(); track tick) {\n              <text\n                x=\"-10\"\n                [attr.y]=\"yPos(tick) + 4\"\n                class=\"axis-label y\"\n                text-anchor=\"end\"\n              >{{ fmtNum(tick) }}</text>\n            }\n            <text\n              [attr.transform]=\"'rotate(-90) translate(' + (-innerH()/2) + ', -38)'\"\n              class=\"axis-title y\"\n              text-anchor=\"middle\"\n            >{{ yTitle() }}</text>\n\n            <!-- X-Axis Labels -->\n            @for (tick of xTicks(); track tick) {\n              <text\n                [attr.x]=\"xPos(tick)\"\n                [attr.y]=\"innerH() + 20\"\n                class=\"axis-label x\"\n                text-anchor=\"middle\"\n              >{{ fmtNum(tick) }}</text>\n            }\n            <text\n              [attr.x]=\"innerW() / 2\"\n              [attr.y]=\"innerH() + 38\"\n              class=\"axis-title x\"\n              text-anchor=\"middle\"\n            >{{ xTitle() }}</text>\n\n            <!-- Active Crosshair -->\n            @if (hoveredPointIndex() !== null) {\n              @if (scaledPoints()[hoveredPointIndex()!]; as pt) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"pt.cy\"\n                  [attr.y2]=\"pt.cy\"\n                  stroke=\"rgba(79, 70, 229, 0.35)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"pt.cx\"\n                  [attr.x2]=\"pt.cx\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(79, 70, 229, 0.35)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- Render Data Bubbles -->\n            @for (pt of scaledPoints(); track $index; let i = $index) {\n              <circle\n                [attr.cx]=\"pt.cx\"\n                [attr.cy]=\"pt.cy\"\n                [attr.r]=\"hoveredPointIndex() === i ? pt.r * 1.15 + 2 : pt.r\"\n                [attr.fill]=\"pt.color\"\n                [attr.stroke]=\"'#ffffff'\"\n                [attr.stroke-width]=\"hoveredPointIndex() === i ? 2 : 1.2\"\n                [attr.fill-opacity]=\"hoveredPointIndex() === i ? 0.85 : 0.65\"\n                class=\"bubble-point\"\n                [class.hovered]=\"hoveredPointIndex() === i\"\n                [style.transform-origin]=\"pt.cx + 'px ' + pt.cy + 'px'\"\n                [style.animation-delay]=\"(i * 0.015) + 's'\"\n                (mouseenter)=\"onPointHover($event, pt.raw, i)\"\n                (mousemove)=\"onPointHover($event, pt.raw, i)\"\n              />\n              <!-- Optional bubble inner label for larger sizes -->\n              @if (showLabels() && pt.r > 12) {\n                <text\n                  [attr.x]=\"pt.cx\"\n                  [attr.y]=\"pt.cy + 3\"\n                  class=\"bubble-inner-label\"\n                  text-anchor=\"middle\"\n                  [attr.fill]=\"'#ffffff'\"\n                  pointer-events=\"none\"\n                >{{ pt.raw.label || fmtNum(pt.raw.z) }}</text>\n              }\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Premium Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            @if (t.label) {\n              <div class=\"tt-cat\">{{ t.label }}</div>\n            } @else {\n              <div class=\"tt-cat\">Bubble Data</div>\n            }\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">Group</span>\n              <span class=\"tt-val\">{{ t.group || 'Default' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n              <span class=\"tt-name\">{{ xTitle() }}</span>\n              <span class=\"tt-val\">{{ fmtNum(t.xVal) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n              <span class=\"tt-name\">{{ yTitle() }}</span>\n              <span class=\"tt-val\">{{ fmtNum(t.yVal) }}</span>\n            </div>\n            <div class=\"tt-row bubble-highlight-row\">\n              <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n              <span class=\"tt-name\">{{ zTitle() }} (Size)</span>\n              <span class=\"tt-val\">{{ fmtNum(t.zVal) }}</span>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-bubble-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      transition: background-color 0.3s;\n    }\n    .ngx-bubble-chart.dark {\n      background: rgba(30, 32, 48, 0.45);\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: transparent;\n      --ngx-chart-grid: rgba(255, 255, 255, 0.06);\n      --ngx-chart-axis: rgba(255, 255, 255, 0.12);\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n      position: relative;\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      font-size: 12px;\n      font-weight: 500;\n      color: #64748b;\n    }\n    .dark .legend-item {\n      color: #94a3b8;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      display: inline-block;\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n    .dark .axis-label {\n      fill: #94a3b8;\n    }\n    .axis-title {\n      font-size: 11px;\n      font-weight: 600;\n      fill: #475569;\n      letter-spacing: 0.5px;\n    }\n    .dark .axis-title {\n      fill: #cbd5e1;\n    }\n\n    @keyframes bubblePop {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); }\n    }\n\n    .bubble-point {\n      cursor: pointer;\n      transition: r 0.25s cubic-bezier(0.16, 1, 0.3, 1),\n                  fill-opacity 0.2s,\n                  stroke-width 0.2s;\n      animation: bubblePop 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .bubble-point.hovered {\n      filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15));\n      stroke: #ffffff;\n    }\n    .bubble-inner-label {\n      font-size: 8px;\n      font-weight: 700;\n      text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n      user-select: none;\n    }\n\n    .crosshair-line {\n      pointer-events: none;\n      animation: fadeIn 0.15s ease-out forwards;\n    }\n\n    @keyframes fadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .bubble-highlight-row {\n      margin-top: 6px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.1);\n      padding-top: 4px;\n      color: #fbbf24;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export Trigger */\n    `]\n})\nexport class BubbleChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  PAD_LEFT = 52;\n  PAD_TOP = 16;\n  PAD_RIGHT = 24;\n  PAD_BOTTOM = 48;\n\n  data = input<BubblePoint[]>([]);\n  xTitle = input<string>('X Axis');\n  yTitle = input<string>('Y Axis');\n  zTitle = input<string>('Size');\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  theme = input<'light' | 'dark'>('light');\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  hoveredPointIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    label?: string;\n    group?: string;\n    xVal: number;\n    yVal: number;\n    zVal: number;\n    color: string;\n  } | null>(null);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  // Dynamic dimension scales\n  innerW = computed(() => {\n    const el = this.container()?.nativeElement;\n    const totalW = el ? el.getBoundingClientRect().width : 600;\n    return Math.max(200, totalW - this.PAD_LEFT - this.PAD_RIGHT);\n  });\n\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  // Group mappings\n  uniqueGroups = computed(() => {\n    const grps = new Set<string>();\n    this.data().forEach(p => {\n      if (p.group) grps.add(p.group);\n    });\n    return Array.from(grps);\n  });\n\n  groupColor(groupName?: string): string {\n    if (!groupName) return this.colors()[0];\n    const idx = this.uniqueGroups().indexOf(groupName);\n    return this.colors()[idx % this.colors().length];\n  }\n\n  // Bounds Calculations\n  private xValues = computed(() => this.data().map(pt => pt.x));\n  private xMin = computed(() => this.xValues().length > 0 ? Math.min(...this.xValues()) * 0.9 : 0);\n  private xMax = computed(() => this.xValues().length > 0 ? Math.max(...this.xValues()) * 1.1 : 100);\n  xTicks = computed(() => niceTicks(this.xMin(), this.xMax(), 5));\n\n  private yValues = computed(() => this.data().map(pt => pt.y));\n  private yMin = computed(() => this.yValues().length > 0 ? Math.min(...this.yValues()) * 0.9 : 0);\n  private yMax = computed(() => this.yValues().length > 0 ? Math.max(...this.yValues()) * 1.1 : 100);\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  // Bubble size sizing scale calculations\n  private zValues = computed(() => this.data().map(pt => pt.z));\n  private zMin = computed(() => this.zValues().length > 0 ? Math.min(...this.zValues()) : 0);\n  private zMax = computed(() => this.zValues().length > 0 ? Math.max(...this.zValues()) : 1);\n\n  // Map absolute coordinate points to SVG canvas\n  xPos(x: number): number {\n    return scale(x, this.xMin(), this.xMax(), 0, this.innerW());\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  scaledPoints = computed(() => {\n    return this.data().map((pt, i) => {\n      const cx = this.xPos(pt.x);\n      const cy = this.yPos(pt.y);\n      // Size mapping between 5 and 35 radius\n      const r = scale(pt.z, this.zMin(), this.zMax(), 5, 35);\n      return {\n        cx,\n        cy,\n        r,\n        color: this.groupColor(pt.group),\n        raw: pt\n      };\n    });\n  });\n\n  onPointHover(event: MouseEvent, pt: BubblePoint, index: number) {\n    this.hoveredPointIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      label: pt.label,\n      group: pt.group,\n      xVal: pt.x,\n      yVal: pt.y,\n      zVal: pt.z,\n      color: this.groupColor(pt.group)\n    });\n  }\n\n  onMouseLeave() {\n    this.hoveredPointIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'bubble-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Group', 'X', 'Y', 'Z'];\n    const rows: (string | number)[][] = data.map(d => [d.label || '', d.group || '', d.x, d.y, d.z]);\n    this.exportSvc.downloadCsv(headers, rows, 'bubble-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface SunburstNode {\n  label: string;\n  value?: number; // Leaf value. If parent, computed as sum of children if omitted.\n  color?: string;\n  children?: SunburstNode[];\n}\n\ninterface SunburstSlice {\n  id: string;\n  label: string;\n  value: number;\n  depth: number;\n  startAngle: number;\n  endAngle: number;\n  path: string;\n  color: string;\n  parentPath: string;\n  pct: number;\n}\n\n@Component({\n  selector: 'ngx-sunburst-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-sunburst-chart\" [class.dark]=\"theme() === 'dark'\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onSliceLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + height() + ' ' + height()\"\n          [attr.width]=\"height()\"\n          [attr.height]=\"height()\"\n        >\n          <g [attr.transform]=\"'translate(' + cx() + ',' + cy() + ')'\" class=\"sunburst-group\">\n            @for (slice of slices(); track slice.id; let idx = $index) {\n              <path\n                [attr.d]=\"slice.path\"\n                [attr.fill]=\"slice.color\"\n                [attr.stroke]=\"theme() === 'dark' ? '#1e2030' : '#ffffff'\"\n                stroke-width=\"1.5\"\n                class=\"sunburst-slice\"\n                [class.hovered]=\"hoveredSliceId() === slice.id\"\n                [style.animation-delay]=\"(idx * 0.01) + 's'\"\n                (mouseenter)=\"onSliceHover($event, slice)\"\n                (mouseleave)=\"onSliceLeave()\"\n              />\n              <!-- Optional Radial Text Labels for large slices -->\n              @if (showLabels() && (slice.endAngle - slice.startAngle) > 0.15 && slice.depth < 2) {\n                <text\n                  [attr.transform]=\"labelTransform(slice)\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                  class=\"slice-label\"\n                  pointer-events=\"none\"\n                >\n                  {{ slice.label }}\n                </text>\n              }\n            }\n          </g>\n        </svg>\n\n        <!-- Legend showing top-level categories -->\n        @if (showLegend() && topLevelNodes().length > 0) {\n          <div class=\"chart-legend\">\n            @for (node of topLevelNodes(); track node.label; let i = $index) {\n              <div class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"node.color || colors()[i % colors().length]\"></span>\n                <span class=\"legend-label\">{{ node.label }}</span>\n                <span class=\"legend-val\">{{ fmtNum(getNodeValue(node)) }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <div class=\"tt-path\">{{ t.parentPath || t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <span class=\"tt-name\">Value</span>\n            <span class=\"tt-val\">{{ fmtNum(t.value) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Contribution</span>\n            <span class=\"tt-val\">{{ t.pct }}%</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-sunburst-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      transition: background-color 0.3s;\n    }\n    .ngx-sunburst-chart.dark {\n      background: rgba(30, 32, 48, 0.45);\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: transparent;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 20px;\n      position: relative;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 32px;\n      flex-wrap: wrap;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n      animation: sunburstGrow 0.8s cubic-bezier(0.16, 1, 0.3, 1) both;\n      transform-origin: center;\n    }\n\n    @keyframes sunburstGrow {\n      from { transform: scale(0.3) rotate(-120deg); opacity: 0; }\n      to { transform: scale(1) rotate(0); opacity: 1; }\n    }\n\n    .sunburst-slice {\n      cursor: pointer;\n      transition: fill-opacity 0.2s, stroke 0.2s, filter 0.25s;\n    }\n    .sunburst-slice:hover {\n      fill-opacity: 0.9;\n      filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));\n    }\n    .slice-label {\n      font-size: 9px;\n      fill: #ffffff;\n      font-weight: 700;\n      text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n      user-select: none;\n    }\n\n    .chart-legend {\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n      flex-shrink: 0;\n      min-width: 160px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      padding: 4px 8px;\n      border-radius: 6px;\n      transition: background-color 0.15s;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 3px;\n      flex-shrink: 0;\n    }\n    .legend-label {\n      flex: 1;\n      color: #64748b;\n      font-weight: 500;\n    }\n    .dark .legend-label {\n      color: #94a3b8;\n    }\n    .legend-val {\n      font-weight: 700;\n      color: #334155;\n    }\n    .dark .legend-val {\n      color: #cbd5e1;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-path {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class SunburstChartComponent {\n  data = input<SunburstNode[]>([]);\n  height = input<number>(300);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  theme = input<'light' | 'dark'>('light');\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  exportMenuOpen = signal(false);\n  hoveredSliceId = signal<string | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    label: string;\n    parentPath: string;\n    value: number;\n    pct: number;\n    color: string;\n  } | null>(null);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  cx = computed(() => this.height() / 2);\n  cy = computed(() => this.height() / 2);\n  radius = computed(() => this.height() / 2 - 10);\n\n  topLevelNodes = computed(() => this.data());\n\n  maxDepth = computed(() => {\n    const getDepth = (node: SunburstNode): number => {\n      if (!node.children || node.children.length === 0) return 0;\n      return 1 + Math.max(...node.children.map(getDepth));\n    };\n    const rootNodes = this.data();\n    if (!rootNodes || rootNodes.length === 0) return 0;\n    return Math.max(...rootNodes.map(getDepth));\n  });\n\n  getNodeValue(node: SunburstNode): number {\n    if (node.value !== undefined) return node.value;\n    if (node.children && node.children.length > 0) {\n      return node.children.reduce((sum, c) => sum + this.getNodeValue(c), 0);\n    }\n    return 0;\n  }\n\n  private adjustColorBrightness(hex: string, percent: number): string {\n    if (!hex.startsWith('#')) return hex;\n    const num = parseInt(hex.replace('#', ''), 16);\n    const amt = Math.round(2.55 * percent);\n    const R = Math.max(0, Math.min(255, (num >> 16) + amt));\n    const G = Math.max(0, Math.min(255, ((num >> 8) & 0x00ff) + amt));\n    const B = Math.max(0, Math.min(255, (num & 0x0000ff) + amt));\n    return '#' + (0x1000000 + R * 0x10000 + G * 0x100 + B).toString(16).slice(1);\n  }\n\n  private ringPath(startAngle: number, endAngle: number, outerR: number, innerR: number): string {\n    const ox1 = Math.cos(startAngle) * outerR;\n    const oy1 = Math.sin(startAngle) * outerR;\n    const ox2 = Math.cos(endAngle) * outerR;\n    const oy2 = Math.sin(endAngle) * outerR;\n\n    const ix1 = Math.cos(startAngle) * innerR;\n    const iy1 = Math.sin(startAngle) * innerR;\n    const ix2 = Math.cos(endAngle) * innerR;\n    const iy2 = Math.sin(endAngle) * innerR;\n\n    const large = endAngle - startAngle > Math.PI ? 1 : 0;\n    return `M ${ix1} ${iy1} L ${ox1} ${oy1} A ${outerR} ${outerR} 0 ${large} 1 ${ox2} ${oy2} L ${ix2} ${iy2} A ${innerR} ${innerR} 0 ${large} 0 ${ix1} ${iy1} Z`;\n  }\n\n  slices = computed(() => {\n    const rootNodes = this.data();\n    if (!rootNodes || rootNodes.length === 0) return [];\n\n    const totalVal = rootNodes.reduce((sum, n) => sum + this.getNodeValue(n), 0) || 1;\n    const list: SunburstSlice[] = [];\n    const colorsList = this.colors();\n\n    const processNode = (\n      node: SunburstNode,\n      depth: number,\n      startAngle: number,\n      endAngle: number,\n      parentPath: string,\n      color: string\n    ) => {\n      const val = this.getNodeValue(node);\n      const frac = val / totalVal;\n      const angle = endAngle - startAngle;\n      \n      const maxRadius = this.radius();\n      const numDepths = this.maxDepth() + 1;\n      const depthWidth = maxRadius / numDepths;\n      const innerR = depth * depthWidth;\n      const outerR = (depth + 1) * depthWidth;\n\n      const path = this.ringPath(startAngle, endAngle, outerR, innerR);\n      const pathName = parentPath ? `${parentPath} › ${node.label}` : node.label;\n      const pct = Math.round(frac * 100);\n\n      list.push({\n        id: `${depth}-${node.label}-${startAngle.toFixed(4)}`,\n        label: node.label,\n        value: val,\n        depth,\n        startAngle,\n        endAngle,\n        path,\n        color,\n        parentPath: pathName,\n        pct\n      });\n\n      if (node.children && node.children.length > 0) {\n        const childrenSum = node.children.reduce((sum, c) => sum + this.getNodeValue(c), 0) || 1;\n        let currStart = startAngle;\n        node.children.forEach((child, idx) => {\n          const childVal = this.getNodeValue(child);\n          const childAngle = (childVal / childrenSum) * angle;\n          const childEnd = currStart + childAngle;\n          // Sub-color: darken slightly per depth\n          const childColor = child.color || this.adjustColorBrightness(color, -10);\n          processNode(child, depth + 1, currStart, childEnd, pathName, childColor);\n          currStart = childEnd;\n        });\n      }\n    };\n\n    let currentStart = -Math.PI / 2;\n    rootNodes.forEach((node, idx) => {\n      const val = this.getNodeValue(node);\n      const angle = (val / totalVal) * Math.PI * 2;\n      const end = currentStart + angle;\n      const color = node.color || colorsList[idx % colorsList.length];\n      processNode(node, 0, currentStart, end, '', color);\n      currentStart = end;\n    });\n\n    return list;\n  });\n\n  labelTransform(slice: SunburstSlice): string {\n    const depthWidth = this.radius() / (this.maxDepth() + 1);\n    const r = (slice.depth + 0.5) * depthWidth;\n    const midAngle = slice.startAngle + (slice.endAngle - slice.startAngle) / 2;\n    const x = Math.cos(midAngle) * r;\n    const y = Math.sin(midAngle) * r;\n    \n    // Rotate text to follow radial lines\n    let rotation = (midAngle * 180) / Math.PI;\n    // Flip text if it is in the bottom half of the circle to prevent upside-down labels\n    if (rotation > 90 && rotation < 270) {\n      rotation -= 180;\n    } else if (rotation < -90) {\n      rotation += 180;\n    }\n    return `translate(${x}, ${y}) rotate(${rotation})`;\n  }\n\n  onSliceHover(event: MouseEvent, slice: SunburstSlice): void {\n    this.hoveredSliceId.set(slice.id);\n    const el = (event.currentTarget as SVGElement).ownerSVGElement!.parentElement!;\n    const rect = el.getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: slice.label,\n      parentPath: slice.parentPath,\n      value: slice.value,\n      pct: slice.pct,\n      color: slice.color\n    });\n  }\n\n  onSliceLeave(): void {\n    this.hoveredSliceId.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n  }\n\n  exportToCsv(): void {\n    const slices = this.slices();\n    if (!slices.length) return;\n    let csv = 'Depth,Path,Value,Percentage\\n';\n    slices.forEach(s => {\n      csv += `${s.depth},\"${s.parentPath}\",${s.value},${s.pct}%\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'sunburst-chart-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'sunburst-chart-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'sunburst-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, inject\n} from '@angular/core';\nimport { niceTicks, scale, fmtNum } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface WaterfallItem {\n  label: string;\n  value: number;\n  isTotal?: boolean;\n}\n\n@Component({\n  selector: 'ngx-waterfall-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-waterfall-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <defs>\n            <linearGradient id=\"waterfall-pos\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"positiveColor()\" stop-opacity=\"1\"/>\n              <stop offset=\"100%\" [attr.stop-color]=\"positiveColor()\" stop-opacity=\"0.75\"/>\n            </linearGradient>\n            <linearGradient id=\"waterfall-neg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"negativeColor()\" stop-opacity=\"1\"/>\n              <stop offset=\"100%\" [attr.stop-color]=\"negativeColor()\" stop-opacity=\"0.75\"/>\n            </linearGradient>\n            <linearGradient id=\"waterfall-tot\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"totalColor()\" stop-opacity=\"1\"/>\n              <stop offset=\"100%\" [attr.stop-color]=\"totalColor()\" stop-opacity=\"0.75\"/>\n            </linearGradient>\n          </defs>\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @for (tick of yTicks(); track tick) {\n              <text\n                x=\"-10\"\n                [attr.y]=\"yPos(tick) + 4\"\n                class=\"axis-label y\"\n                text-anchor=\"end\"\n              >{{ fmtNum(tick) }}</text>\n            }\n\n            <!-- X-Axis Labels -->\n            @for (bar of computedBars(); track $index; let i = $index) {\n              <text\n                [attr.x]=\"bar.x + bar.width / 2\"\n                [attr.y]=\"innerH() + 20\"\n                class=\"axis-label x\"\n                text-anchor=\"middle\"\n              >{{ bar.label }}</text>\n            }\n\n            <!-- Connecting dashed lines between columns -->\n            @for (bar of computedBars(); track $index; let i = $index) {\n              @if (i < computedBars().length - 1) {\n                <line\n                  [attr.x1]=\"bar.x + bar.width\"\n                  [attr.x2]=\"computedBars()[i+1].x\"\n                  [attr.y1]=\"bar.connectY\"\n                  [attr.y2]=\"bar.connectY\"\n                  stroke=\"var(--ngx-chart-axis, #ced4da)\"\n                  stroke-dasharray=\"3,3\"\n                  stroke-width=\"1.5\"\n                />\n              }\n            }\n\n            <!-- Bars -->\n            @for (bar of computedBars(); track $index; let i = $index) {\n              <rect\n                [attr.x]=\"bar.x\"\n                [attr.y]=\"bar.y\"\n                [attr.width]=\"bar.width\"\n                [attr.height]=\"bar.rectH\"\n                [attr.fill]=\"bar.fill\"\n                [attr.rx]=\"4\"\n                class=\"waterfall-bar\"\n                [class.hovered]=\"hoveredIndex() === i\"\n                (mouseenter)=\"onBarHover($event, bar, i)\"\n              />\n              @if (showLabels() && bar.rectH > 14) {\n                <text\n                  [attr.x]=\"bar.x + bar.width / 2\"\n                  [attr.y]=\"bar.y + (bar.rectH / 2) + 4\"\n                  text-anchor=\"middle\"\n                  class=\"bar-value-label\"\n                >\n                  {{ bar.value > 0 ? '+' : '' }}{{ fmtNum(bar.value) }}\n                </text>\n              }\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ t.label }}</div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-val\">Change: <strong [style.color]=\"t.color\">{{ t.value > 0 ? '+' : '' }}{{ fmtNum(t.value) }}</strong></div>\n              <div class=\"tooltip-val\">Running Balance: <strong>{{ fmtNum(t.balance) }}</strong></div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-waterfall-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 550;\n    }\n    .waterfall-bar {\n      cursor: pointer;\n      transition: opacity 0.2s, filter 0.2s, stroke-width 0.2s;\n      stroke: #fff;\n      stroke-width: 0.5;\n    }\n    .waterfall-bar.hovered {\n      opacity: 0.95;\n      stroke-width: 1.5;\n      filter: brightness(1.04) drop-shadow(0 4px 8px rgba(0,0,0,0.12));\n    }\n    .bar-value-label {\n      font-size: 9px;\n      fill: #ffffff;\n      font-weight: 600;\n      pointer-events: none;\n    }\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tooltip-header {\n      font-weight: 700;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 6px;\n      margin-bottom: 8px;\n      color: #38bdf8;\n      font-size: 12.5px;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 5px;\n    }\n    .tooltip-val {\n      color: rgba(248, 250, 252, 0.8);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n    }\n\n  `]\n})\nexport class WaterfallChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  PAD_LEFT = 52;\n  PAD_TOP = 20;\n  PAD_RIGHT = 24;\n  PAD_BOTTOM = 36;\n\n  data = input<WaterfallItem[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n\n  // Styling properties\n  positiveColor = input<string>('#10b981'); // Emerald\n  negativeColor = input<string>('#ef4444'); // Rose/Red\n  totalColor = input<string>('#64748b');    // Slate\n  showExport = input<boolean>(false);\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    label: string;\n    value: number;\n    balance: number;\n    color: string;\n  } | null>(null);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  innerW = computed(() => {\n    const el = this.container()?.nativeElement;\n    const totalW = el ? el.getBoundingClientRect().width : 600;\n    return Math.max(200, totalW - this.PAD_LEFT - this.PAD_RIGHT);\n  });\n\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  // Compute intermediate running balances and waterfall metrics\n  processedData = computed(() => {\n    const raw = this.data();\n    let balance = 0;\n    return raw.map(item => {\n      const start = balance;\n      if (item.isTotal) {\n        // If it's explicitly designated as a Total, the column represents the current total\n        // but wait: does it reset or just display the accumulated balance? It displays the balance!\n        const val = balance;\n        return {\n          label: item.label,\n          value: val,\n          start: 0,\n          end: val,\n          isTotal: true,\n          runningBalance: val\n        };\n      } else {\n        balance += item.value;\n        return {\n          label: item.label,\n          value: item.value,\n          start: start,\n          end: balance,\n          isTotal: false,\n          runningBalance: balance\n        };\n      }\n    });\n  });\n\n  // Bounds\n  yMin = computed(() => {\n    const vals = [0, ...this.processedData().map(d => d.end), ...this.processedData().map(d => d.start)];\n    return Math.min(...vals) < 0 ? Math.min(...vals) * 1.1 : 0;\n  });\n\n  yMax = computed(() => {\n    const vals = [0, ...this.processedData().map(d => d.end), ...this.processedData().map(d => d.start)];\n    return Math.max(...vals) * 1.1;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  // Scale functions\n  xPos(index: number, count: number): number {\n    const step = this.innerW() / count;\n    return index * step + step * 0.15; // 15% margin\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  barWidth(count: number): number {\n    return (this.innerW() / count) * 0.7; // 70% width\n  }\n\n  computedBars = computed(() => {\n    const items = this.processedData();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.barWidth(count);\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx, count);\n      const yStart = this.yPos(item.start);\n      const yEnd = this.yPos(item.end);\n\n      const y = Math.min(yStart, yEnd);\n      const rectH = Math.max(2, Math.abs(yStart - yEnd));\n\n      let fill = 'url(#waterfall-tot)';\n      let color = this.totalColor();\n      if (!item.isTotal) {\n        fill = item.value >= 0 ? 'url(#waterfall-pos)' : 'url(#waterfall-neg)';\n        color = item.value >= 0 ? this.positiveColor() : this.negativeColor();\n      }\n\n      // Connect line is drawn from the end value of this item\n      const connectY = yEnd;\n\n      return {\n        x,\n        y,\n        rectH,\n        width,\n        color,\n        fill,\n        connectY,\n        label: item.label,\n        value: item.value,\n        balance: item.runningBalance,\n        isTotal: item.isTotal\n      };\n    });\n  });\n\n  onBarHover(event: MouseEvent, bar: any, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      label: bar.label,\n      value: bar.value,\n      balance: bar.balance,\n      color: bar.color\n    });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Value', 'Is Total'];\n    const rows = data.map(d => [d.label || '', d.value, d.isTotal ? 'true' : 'false']);\n    this.exportSvc.downloadCsv(headers, rows, 'waterfall-chart.csv');\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'waterfall-chart.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'waterfall-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'waterfall-chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject, DestroyRef\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { CommonModule } from '@angular/common';\nimport { niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface BoxPlotItem {\n  label: string;\n  min: number;\n  q1: number;\n  median: number;\n  q3: number;\n  max: number;\n  outliers?: number[];\n}\n\n@Component({\n  selector: 'ngx-box-plot-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-box-plot-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <defs>\n            <linearGradient id=\"boxplot-grad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"color()\" stop-opacity=\"0.32\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"color()\" stop-opacity=\"0.08\" />\n            </linearGradient>\n          </defs>\n\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @for (tick of yTicks(); track tick) {\n              <text\n                x=\"-10\"\n                [attr.y]=\"yPos(tick) + 4\"\n                class=\"axis-label y\"\n                text-anchor=\"end\"\n              >{{ fmtNum(tick) }}</text>\n            }\n\n            <!-- X-Axis Labels -->\n            @for (item of data(); track $index; let i = $index) {\n              <text\n                [attr.x]=\"xPos(i) + boxWidth() / 2\"\n                [attr.y]=\"innerH() + 20\"\n                class=\"axis-label x\"\n                text-anchor=\"middle\"\n              >{{ item.label }}</text>\n            }\n\n            <!-- Box Plot Elements -->\n            @for (box of computedBoxes(); track $index; let i = $index) {\n              <!-- Whiskers (Vertical Lines) -->\n              <line\n                [attr.centerX]=\"box.centerX\"\n                [attr.x1]=\"box.centerX\"\n                [attr.x2]=\"box.centerX\"\n                [attr.y1]=\"box.yMin\"\n                [attr.y2]=\"box.yMax\"\n                [attr.stroke]=\"color()\"\n                stroke-width=\"1.5\"\n                class=\"whisker-line\"\n              />\n\n              <!-- Whisker Caps (Horizontal Lines) -->\n              <line\n                [attr.x1]=\"box.centerX - capWidth() / 2\"\n                [attr.x2]=\"box.centerX + capWidth() / 2\"\n                [attr.y1]=\"box.yMin\"\n                [attr.y2]=\"box.yMin\"\n                [attr.stroke]=\"color()\"\n                stroke-width=\"1.5\"\n                class=\"whisker-line\"\n              />\n              <line\n                [attr.x1]=\"box.centerX - capWidth() / 2\"\n                [attr.x2]=\"box.centerX + capWidth() / 2\"\n                [attr.y1]=\"box.yMax\"\n                [attr.y2]=\"box.yMax\"\n                [attr.stroke]=\"color()\"\n                stroke-width=\"1.5\"\n                class=\"whisker-line\"\n              />\n\n              <!-- Interquartile Box -->\n              <rect\n                [attr.x]=\"box.x\"\n                [attr.y]=\"box.yQ3\"\n                [attr.width]=\"box.width\"\n                [attr.height]=\"box.boxHeight\"\n                fill=\"url(#boxplot-grad)\"\n                [attr.stroke]=\"color()\"\n                stroke-width=\"2\"\n                [attr.rx]=\"4\"\n                class=\"boxplot-rect\"\n                [class.hovered]=\"hoveredIndex() === i\"\n                [style.transform-origin]=\"box.centerX + 'px ' + box.yMedian + 'px'\"\n                [style.animation-delay]=\"i * 0.05 + 's'\"\n                (mouseenter)=\"onBoxHover($event, box.raw, i)\"\n                (mousemove)=\"onBoxHover($event, box.raw, i)\"\n              />\n\n              <!-- Median line -->\n              <line\n                [attr.x1]=\"box.x\"\n                [attr.x2]=\"box.x + box.width\"\n                [attr.y1]=\"box.yMedian\"\n                [attr.y2]=\"box.yMedian\"\n                [attr.stroke]=\"color()\"\n                stroke-width=\"2.5\"\n                class=\"median-line\"\n              />\n\n              <!-- Outliers (plotted as circles) -->\n              @for (outlier of box.outlierPoints; track $index) {\n                <circle\n                  [attr.cx]=\"box.centerX\"\n                  [attr.cy]=\"outlier.y\"\n                  [attr.r]=\"3.5\"\n                  [attr.fill]=\"outlierColor()\"\n                  [attr.stroke]=\"'#ffffff'\"\n                  stroke-width=\"1.2\"\n                  class=\"outlier-dot\"\n                  [style.transform-origin]=\"box.centerX + 'px ' + outlier.y + 'px'\"\n                  (mouseenter)=\"onOutlierHover($event, box.raw.label, outlier.value)\"\n                  (mousemove)=\"onOutlierHover($event, box.raw.label, outlier.value)\"\n                />\n              }\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ t.label }}</div>\n            <div class=\"tooltip-body\">\n              @if (t.isOutlier) {\n                <div class=\"tooltip-val\">\n                  <span>Outlier:</span>\n                  <strong>{{ fmtNum(t.outlierVal!) }}</strong>\n                </div>\n              } @else {\n                <div class=\"tooltip-val\">\n                  <span>Maximum:</span>\n                  <strong>{{ fmtNum(t.max) }}</strong>\n                </div>\n                <div class=\"tooltip-val\">\n                  <span>Third Quartile (Q3):</span>\n                  <strong>{{ fmtNum(t.q3) }}</strong>\n                </div>\n                <div class=\"tooltip-val\" style=\"color: #38bdf8;\">\n                  <span>Median:</span>\n                  <strong>{{ fmtNum(t.median) }}</strong>\n                </div>\n                <div class=\"tooltip-val\">\n                  <span>First Quartile (Q1):</span>\n                  <strong>{{ fmtNum(t.q1) }}</strong>\n                </div>\n                <div class=\"tooltip-val\">\n                  <span>Minimum:</span>\n                  <strong>{{ fmtNum(t.min) }}</strong>\n                </div>\n              }\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-box-plot-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n\n    @keyframes boxPlotGrow {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n\n    .boxplot-rect {\n      cursor: pointer;\n      transition: opacity 0.2s, fill 0.2s, stroke-width 0.2s, filter 0.2s;\n      animation: boxPlotGrow 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .boxplot-rect:hover, .boxplot-rect.hovered {\n      filter: brightness(1.05) drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n      stroke-width: 2.5px;\n    }\n\n    @keyframes whiskerFade {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .whisker-line, .median-line {\n      animation: whiskerFade 0.6s ease-out 0.2s both;\n    }\n\n    @keyframes outlierPop {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .outlier-dot {\n      cursor: crosshair;\n      transition: r 0.2s cubic-bezier(0.16, 1, 0.3, 1), fill 0.2s;\n      animation: outlierPop 0.4s cubic-bezier(0.16, 1, 0.3, 1) 0.5s both;\n    }\n    .outlier-dot:hover {\n      r: 5.5px;\n      fill: #ef4444;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 155px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n      font-weight: 700;\n    }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n      z-index: 60;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n    }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class BoxPlotChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  PAD_LEFT = 52;\n  PAD_TOP = 20;\n  PAD_RIGHT = 24;\n  PAD_BOTTOM = 36;\n\n  data = input<BoxPlotItem[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  // Styles\n  color = input<string>('#4f46e5'); // Primary Indigo\n  fillColor = input<string>('rgba(79, 70, 229, 0.12)'); // Translucent primary\n  outlierColor = input<string>('#ef4444'); // Red/Rose\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    label: string;\n    min: number;\n    q1: number;\n    median: number;\n    q3: number;\n    max: number;\n    isOutlier: boolean;\n    outlierVal?: number;\n  } | null>(null);\n\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Trigger compute width changes\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => {\n    const el = this.container()?.nativeElement;\n    const totalW = el ? el.getBoundingClientRect().width : 600;\n    return Math.max(200, totalW - this.PAD_LEFT - this.PAD_RIGHT);\n  });\n\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  // Range and Ticks bounds calculation\n  yMin = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 0;\n    const allVals = items.flatMap(item => [\n      item.min,\n      ...(item.outliers || [])\n    ]);\n    const minVal = Math.min(...allVals);\n    return minVal < 0 ? minVal * 1.15 : minVal * 0.85;\n  });\n\n  yMax = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 100;\n    const allVals = items.flatMap(item => [\n      item.max,\n      ...(item.outliers || [])\n    ]);\n    return Math.max(...allVals) * 1.15;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  // Box positions\n  xPos(index: number): number {\n    const count = this.data().length || 1;\n    const step = this.innerW() / count;\n    return index * step + step * 0.2;\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  boxWidth(): number {\n    const count = this.data().length || 1;\n    return (this.innerW() / count) * 0.6;\n  }\n\n  capWidth(): number {\n    return this.boxWidth() * 0.45;\n  }\n\n  computedBoxes = computed(() => {\n    const items = this.data();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.boxWidth();\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx);\n      const centerX = x + width / 2;\n\n      const yMin = this.yPos(item.min);\n      const yQ1 = this.yPos(item.q1);\n      const yMedian = this.yPos(item.median);\n      const yQ3 = this.yPos(item.q3);\n      const yMax = this.yPos(item.max);\n\n      const boxHeight = Math.abs(yQ1 - yQ3);\n\n      const outlierPoints = (item.outliers || []).map(val => ({\n        value: val,\n        y: this.yPos(val)\n      }));\n\n      return {\n        x,\n        centerX,\n        width,\n        yMin,\n        yQ1,\n        yMedian,\n        yQ3,\n        yMax,\n        boxHeight,\n        outlierPoints,\n        raw: item\n      };\n    });\n  });\n\n  onBoxHover(event: MouseEvent, item: BoxPlotItem, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      label: item.label,\n      min: item.min,\n      q1: item.q1,\n      median: item.median,\n      q3: item.q3,\n      max: item.max,\n      isOutlier: false\n    });\n  }\n\n  onOutlierHover(event: MouseEvent, label: string, outlierVal: number) {\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      label: `${label} outlier`,\n      min: 0,\n      q1: 0,\n      median: 0,\n      q3: 0,\n      max: 0,\n      isOutlier: true,\n      outlierVal\n    });\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Min', 'Q1', 'Median', 'Q3', 'Max'];\n    const rows = data.map(d => [d.label, d.min, d.q1, d.median, d.q3, d.max]);\n    this.exportSvc.downloadCsv(headers, rows, 'box-plot-data.csv');\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    this.exportSvc.downloadJson(data, 'box-plot-data.json');\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'box-plot-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Box Plot Chart Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .axis-label { font-size: 11px; fill: #6c757d; font-weight: 500; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Box Plot Chart Analytics</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, generateUniqueId } from '../shared/chart-utils';\n\nexport interface RadialBarItem {\n  label: string;\n  value: number;\n  max: number;\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-radial-bar-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-radial-bar-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-layout\">\n        <!-- SVG Concentric Circles -->\n        <div class=\"radial-visual\">\n          <svg\n            #svgEl\n            [attr.width]=\"height()\"\n            [attr.height]=\"height()\"\n            [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n            class=\"radial-svg\"\n          >\n            <defs>\n              @for (ring of computedRings(); track $index; let i = $index) {\n                <linearGradient [attr.id]=\"instanceId + '-radial-grad-' + i\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n                  <stop offset=\"0%\" [attr.stop-color]=\"ring.color\" />\n                  <stop offset=\"100%\" [attr.stop-color]=\"ring.color\" stop-opacity=\"0.6\" />\n                </linearGradient>\n              }\n            </defs>\n            <!-- Rotate group by -90deg so rings start at 12 o'clock -->\n            <g [attr.transform]=\"'translate(' + center() + ',' + center() + ') rotate(-90)'\">\n              @for (ring of computedRings(); track $index; let i = $index) {\n                <!-- Background track ring -->\n                <circle\n                  cx=\"0\"\n                  cy=\"0\"\n                  [attr.r]=\"ring.r\"\n                  fill=\"none\"\n                  [attr.stroke]=\"ring.color\"\n                  stroke-opacity=\"0.08\"\n                  [attr.stroke-width]=\"strokeWidth()\"\n                />\n\n                <!-- Active progress ring -->\n                <circle\n                  cx=\"0\"\n                  cy=\"0\"\n                  [attr.r]=\"ring.r\"\n                  fill=\"none\"\n                  [attr.stroke]=\"'url(#' + instanceId + '-radial-grad-' + i + ')'\"\n                  [attr.stroke-width]=\"hoveredIndex() === i ? strokeWidth() + 3 : strokeWidth()\"\n                  [attr.stroke-dasharray]=\"ring.dashArray\"\n                  [attr.stroke-dashoffset]=\"animateState() ? 0 : ring.circumference\"\n                  stroke-linecap=\"round\"\n                  class=\"progress-ring\"\n                  [class.hovered]=\"hoveredIndex() === i\"\n                  (mouseenter)=\"onRingHover(ring.raw, i)\"\n                  (mousemove)=\"onRingMouseMove($event)\"\n                />\n              }\n            </g>\n          </svg>\n\n          <!-- Inside Center Details (Hover/Selected summary) -->\n          <div class=\"center-content\">\n            @if (hoveredIndex() !== null) {\n              @if (computedRings()[hoveredIndex()!]; as active) {\n                <span class=\"center-label\">{{ active.label }}</span>\n                <span class=\"center-value\" [style.color]=\"active.color\">\n                  {{ active.pct }}%\n                </span>\n                <span class=\"center-sublabel\">\n                  {{ fmtNum(active.value) }} / {{ fmtNum(active.max) }}\n                </span>\n              }\n            } @else if (data().length > 0) {\n              <span class=\"center-label\">Average</span>\n              <span class=\"center-value\">{{ avgPct() }}%</span>\n              <span class=\"center-sublabel\">Completed</span>\n            }\n          </div>\n        </div>\n\n        <!-- Legend / List -->\n        @if (showLegend() && data().length > 0) {\n          <div class=\"radial-legend\" (mousemove)=\"$event.stopPropagation()\">\n            @for (ring of computedRings(); track $index; let i = $index) {\n              <div\n                class=\"legend-item\"\n                [class.active]=\"hoveredIndex() === i\"\n                (mouseenter)=\"hoveredIndex.set(i)\"\n                (mouseleave)=\"hoveredIndex.set(null)\"\n              >\n                <span class=\"legend-color-dot\" [style.background]=\"ring.color\"></span>\n                <div class=\"legend-content\">\n                  <span class=\"legend-title\">{{ ring.label }}</span>\n                  <div class=\"legend-metrics\">\n                    <span class=\"metric-value\">{{ ring.pct }}%</span>\n                  </div>\n                </div>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip() && hoveredIndex() !== null) {\n        <div\n          class=\"chart-tooltip\"\n          [style.left.px]=\"tooltipX()\"\n          [style.top.px]=\"tooltipY()\"\n        >\n          <div class=\"tt-cat\">{{ tooltip().label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"tooltip().color\"></span>\n            <span class=\"tt-name\">Progress</span>\n            <span class=\"tt-val\">{{ tooltip().pct }}%</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Value</span>\n            <span class=\"tt-val\">{{ fmtNum(tooltip().value) }} / {{ fmtNum(tooltip().max) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-radial-bar-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .chart-layout {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 24px;\n      flex-wrap: wrap;\n    }\n    .radial-visual {\n      position: relative;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    .radial-svg {\n      display: block;\n    }\n    .progress-ring {\n      cursor: pointer;\n      transition: stroke-width 0.3s cubic-bezier(0.16, 1, 0.3, 1),\n                  stroke-dashoffset 1.2s cubic-bezier(0.16, 1, 0.3, 1),\n                  filter 0.3s ease,\n                  opacity 0.2s;\n    }\n    .progress-ring.hovered {\n      filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.15));\n    }\n    .center-content {\n      position: absolute;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n      text-align: center;\n    }\n    .center-label {\n      font-size: 11px;\n      font-weight: 600;\n      color: #64748b;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n    .center-value {\n      font-size: 24px;\n      font-weight: 800;\n      color: #1e293b;\n      line-height: 1.1;\n      margin: 2px 0;\n    }\n    .center-sublabel {\n      font-size: 10px;\n      color: #94a3b8;\n    }\n\n    /* Legend */\n    .radial-legend {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      min-width: 150px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      padding: 6px 12px;\n      border-radius: 8px;\n      border: 1px solid transparent;\n      transition: all 0.2s;\n      cursor: pointer;\n    }\n    .legend-item:hover, .legend-item.active {\n      background: var(--ngx-chart-grid, #f8fafc);\n      border-color: var(--ngx-chart-grid, #e2e8f0);\n    }\n    .legend-color-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .legend-content {\n      flex: 1;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 12px;\n    }\n    .legend-title {\n      font-size: 12px;\n      font-weight: 600;\n      color: #475569;\n    }\n    .metric-value {\n      font-size: 12px;\n      font-weight: 700;\n      color: #1e293b;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class RadialBarChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly instanceId = generateUniqueId('chart');\n  data = input<RadialBarItem[]>([]);\n  height = input<number>(300);\n  showLegend = input<boolean>(true);\n\n  // Configuration properties\n  strokeWidth = input<number>(10);\n  ringGap = input<number>(4);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  animateState = signal<boolean>(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  size = computed(() => this.height());\n  center = computed(() => this.size() / 2);\n\n  constructor() {\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  // Ring properties\n  computedRings = computed(() => {\n    const raw = this.data();\n    const count = raw.length;\n    const centerPt = this.center();\n    const ringW = this.strokeWidth();\n    const gap = this.ringGap();\n\n    // Start radii calculation from the outside inwards\n    // Max radius leaves padding on outside\n    const maxRadius = centerPt - ringW - 4;\n\n    return raw.map((item, idx) => {\n      // Offset outwards to inwards\n      const r = maxRadius - idx * (ringW + gap);\n      const pct = Math.min(100, Math.max(0, Math.round((item.value / item.max) * 100)));\n      const color = item.color || this.colors()[idx % this.colors().length];\n\n      // Circular arc math\n      const C = 2 * Math.PI * r;\n      // dasharray structure: \"arcLength, circumference\"\n      const arcLength = (pct / 100) * C;\n      const dashArray = `${arcLength}, ${C}`;\n\n      return {\n        r,\n        pct,\n        color,\n        dashArray,\n        circumference: C,\n        label: item.label,\n        value: item.value,\n        max: item.max,\n        raw: item\n      };\n    });\n  });\n\n  // Calculate average percentage of completion\n  avgPct = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 0;\n    const sum = raw.reduce((acc, curr) => acc + (curr.value / curr.max), 0);\n    return Math.round((sum / raw.length) * 100);\n  });\n\n  onRingHover(item: RadialBarItem, index: number) {\n    this.hoveredIndex.set(index);\n    const ring = this.computedRings()[index];\n    if (ring) {\n      this.tooltip.set(ring);\n    }\n  }\n\n  onRingMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-radial-bar-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'radial-bar-chart.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Value', 'Max'];\n    const rows = data.map(d => [d.label || '', d.value, d.max]);\n    this.exportSvc.downloadCsv(headers, rows, 'radial-bar-chart.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject, DestroyRef\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface CandlestickItem {\n  date: string | Date;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\n@Component({\n  selector: 'ngx-candlestick-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-candlestick-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <defs>\n            <linearGradient id=\"candle-bullish-grad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"bullishColor()\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"bullishColor()\" stop-opacity=\"0.8\" />\n            </linearGradient>\n            <linearGradient id=\"candle-bearish-grad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"bearishColor()\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"bearishColor()\" stop-opacity=\"0.8\" />\n            </linearGradient>\n          </defs>\n\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @for (tick of yTicks(); track tick) {\n              <text\n                x=\"-10\"\n                [attr.y]=\"yPos(tick) + 4\"\n                class=\"axis-label y\"\n                text-anchor=\"end\"\n              >{{ fmtNum(tick) }}</text>\n            }\n\n            <!-- X-Axis Labels -->\n            @for (item of data(); track $index; let i = $index) {\n              <text\n                [attr.x]=\"xPos(i) + candleWidth() / 2\"\n                [attr.y]=\"innerH() + 20\"\n                class=\"axis-label x\"\n                text-anchor=\"middle\"\n              >{{ formatDate(item.date) }}</text>\n            }\n\n            <!-- Active Crosshair -->\n            @if (hoveredIndex() !== null) {\n              @if (computedCandles()[hoveredIndex()!]; as candle) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"candle.yClose\"\n                  [attr.y2]=\"candle.yClose\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"candle.centerX\"\n                  [attr.x2]=\"candle.centerX\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- Candles -->\n            @for (candle of computedCandles(); track $index; let i = $index) {\n              <!-- Whisker/Wick Line (High to Low) -->\n              <line\n                [attr.x1]=\"candle.centerX\"\n                [attr.x2]=\"candle.centerX\"\n                [attr.y1]=\"candle.yHigh\"\n                [attr.y2]=\"candle.yLow\"\n                [attr.stroke]=\"candle.color\"\n                stroke-width=\"1.5\"\n                class=\"candle-wick\"\n              />\n\n              <!-- Candle Body Rect (Open to Close) -->\n              <rect\n                [attr.x]=\"candle.x\"\n                [attr.y]=\"candle.y\"\n                [attr.width]=\"candle.width\"\n                [attr.height]=\"candle.rectH\"\n                [attr.fill]=\"candle.isBullish ? 'url(#candle-bullish-grad)' : 'url(#candle-bearish-grad)'\"\n                [attr.stroke]=\"candle.color\"\n                stroke-width=\"1\"\n                class=\"candle-rect\"\n                [class.hovered]=\"hoveredIndex() === i\"\n                [style.transform-origin]=\"candle.centerX + 'px ' + candle.yOpen + 'px'\"\n                [style.animation-delay]=\"i * 0.03 + 's'\"\n                (mouseenter)=\"onCandleHover($event, candle.raw, i)\"\n                (mousemove)=\"onCandleHover($event, candle.raw, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ formatDate(t.date) }}</div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-direction\" [style.color]=\"t.direction === 'Bullish' ? '#10b981' : '#ef4444'\">\n                <strong>{{ t.direction }}</strong> ({{ t.changePct }})\n              </div>\n              <div class=\"tooltip-val\">\n                <span>High:</span>\n                <strong>{{ fmtNum(t.high) }}</strong>\n              </div>\n              <div class=\"tooltip-val\">\n                <span>Open:</span>\n                <strong>{{ fmtNum(t.open) }}</strong>\n              </div>\n              <div class=\"tooltip-val\" style=\"color: #38bdf8;\">\n                <span>Close:</span>\n                <strong>{{ fmtNum(t.close) }}</strong>\n              </div>\n              <div class=\"tooltip-val\">\n                <span>Low:</span>\n                <strong>{{ fmtNum(t.low) }}</strong>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-candlestick-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n\n    @keyframes candleGrow {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n\n    .candle-rect {\n      cursor: pointer;\n      transition: fill 0.15s, opacity 0.15s, stroke-width 0.15s, filter 0.15s;\n      animation: candleGrow 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .candle-rect.hovered {\n      filter: brightness(1.05) drop-shadow(0 4px 10px rgba(0,0,0,0.18));\n      stroke-width: 1.5px;\n    }\n\n    @keyframes wickFade {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .candle-wick {\n      animation: wickFade 0.6s ease-out 0.2s both;\n    }\n\n    .crosshair-line {\n      pointer-events: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 155px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tooltip-direction {\n      font-size: 10px;\n      font-weight: 700;\n      margin-bottom: 6px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n      font-weight: 700;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class CandlestickChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  PAD_LEFT = 52;\n  PAD_TOP = 20;\n  PAD_RIGHT = 24;\n  PAD_BOTTOM = 36;\n\n  data = input<CandlestickItem[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  // Bullish/Bearish colors\n  bullishColor = input<string>('#10b981'); // Emerald/Green\n  bearishColor = input<string>('#ef4444');  // Rose/Red\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    date: string | Date;\n    open: number;\n    high: number;\n    low: number;\n    close: number;\n    direction: 'Bullish' | 'Bearish';\n    changePct: string;\n  } | null>(null);\n\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Trigger compute width changes\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => {\n    const el = this.container()?.nativeElement;\n    const totalW = el ? el.getBoundingClientRect().width : 600;\n    return Math.max(200, totalW - this.PAD_LEFT - this.PAD_RIGHT);\n  });\n\n  innerH = computed(() => this.height() - this.PAD_TOP - this.PAD_BOTTOM);\n\n  // Range bounds calculation\n  yMin = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 0;\n    const lows = items.map(d => d.low);\n    return Math.min(...lows) * 0.98; // 2% padding below\n  });\n\n  yMax = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 100;\n    const highs = items.map(d => d.high);\n    return Math.max(...highs) * 1.02; // 2% padding above\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  // Category scaling positions\n  xPos(index: number): number {\n    const count = this.data().length || 1;\n    const step = this.innerW() / count;\n    return index * step + step * 0.15;\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  candleWidth(): number {\n    const count = this.data().length || 1;\n    return (this.innerW() / count) * 0.7; // 70% width\n  }\n\n  computedCandles = computed(() => {\n    const items = this.data();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.candleWidth();\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx);\n      const centerX = x + width / 2;\n\n      const yOpen = this.yPos(item.open);\n      const yClose = this.yPos(item.close);\n      const yHigh = this.yPos(item.high);\n      const yLow = this.yPos(item.low);\n\n      const y = Math.min(yOpen, yClose);\n      const rectH = Math.max(2, Math.abs(yOpen - yClose));\n\n      const isBullish = item.close >= item.open;\n      const color = isBullish ? this.bullishColor() : this.bearishColor();\n\n      return {\n        x,\n        centerX,\n        width,\n        yHigh,\n        yLow,\n        yOpen,\n        yClose,\n        y,\n        rectH,\n        color,\n        isBullish,\n        raw: item\n      };\n    });\n  });\n\n  onCandleHover(event: MouseEvent, item: CandlestickItem, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    const isBullish = item.close >= item.open;\n    const change = item.close - item.open;\n    const changePct = ((change / item.open) * 100).toFixed(2) + '%';\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      date: item.date,\n      open: item.open,\n      high: item.high,\n      low: item.low,\n      close: item.close,\n      direction: isBullish ? 'Bullish' : 'Bearish',\n      changePct\n    });\n  }\n\n  formatDate(d: string | Date): string {\n    if (d instanceof Date) {\n      return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n    }\n    return d;\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'candlestick-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Date', 'Open', 'High', 'Low', 'Close'];\n    const rows: (string | number)[][] = data.map(d => [d.date instanceof Date ? d.date.toISOString() : d.date, d.open, d.high, d.low, d.close]);\n    this.exportSvc.downloadCsv(headers, rows, 'candlestick-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject, DestroyRef, output\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartDataPoint, fmtNum } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-polar-area-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-polar-area-chart\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + height() + ' ' + height()\"\n          [attr.width]=\"height()\"\n          [attr.height]=\"height()\"\n        >\n          <g [attr.transform]=\"'translate(' + cx() + ',' + cy() + ')'\">\n            <!-- Concentric Grid Lines -->\n            @for (level of gridLevels(); track level) {\n              <circle\n                cx=\"0\"\n                cy=\"0\"\n                [attr.r]=\"level.radius\"\n                fill=\"none\"\n                stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                stroke-width=\"1\"\n                stroke-dasharray=\"3,3\"\n              />\n              @if (showLabels()) {\n                <text\n                  x=\"4\"\n                  [attr.y]=\"-level.radius + 12\"\n                  class=\"grid-label\"\n                >{{ formatNumber(level.value) }}</text>\n              }\n            }\n\n            <!-- Chart Slices -->\n            @for (slice of slices(); track slice.index) {\n              <path\n                [attr.d]=\"slice.path\"\n                [attr.fill]=\"slice.color\"\n                [attr.stroke]=\"'#fff'\"\n                stroke-width=\"1.5\"\n                fill-opacity=\"0.8\"\n                class=\"polar-slice\"\n                [class.hovered]=\"hovered() === slice.index\"\n                [style.transform]=\"hovered() === slice.index ? 'scale(1.04)' : 'scale(1)'\"\n                (mouseenter)=\"hovered.set(slice.index); onSliceHover($event, slice)\"\n                (mouseleave)=\"hovered.set(-1); tooltip.set(null)\"\n                (click)=\"onSliceClick(slice)\"\n              />\n              \n              <!-- Value Labels inside/at edge of slices -->\n              @if (showLabels() && slice.value > 0) {\n                <text\n                  [attr.x]=\"labelX(slice)\"\n                  [attr.y]=\"labelY(slice)\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                  class=\"slice-label\"\n                >{{ formatNumber(slice.value) }}</text>\n              }\n            }\n          </g>\n        </svg>\n\n        @if (showLegend()) {\n          <div class=\"chart-legend\">\n            @for (slice of slices(); track slice.index) {\n              <div class=\"legend-item\" (mouseenter)=\"hovered.set(slice.index)\" (mouseleave)=\"hovered.set(-1)\">\n                <span class=\"legend-dot\" [style.background]=\"slice.color\"></span>\n                <span class=\"legend-label\">{{ slice.label }}</span>\n                <span class=\"legend-val\">{{ formatNumber(slice.value) }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n          <strong>{{ t.label }}</strong>: {{ formatNumber(t.value) }}\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-polar-area-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 24px;\n      flex-wrap: wrap;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n      animation: polarGrow 0.75s cubic-bezier(0.16, 1, 0.3, 1) both;\n      transform-origin: center;\n    }\n\n    @keyframes polarGrow {\n      from { transform: scale(0.6) rotate(-45deg); opacity: 0; }\n      to { transform: scale(1) rotate(0); opacity: 1; }\n    }\n\n    .polar-slice {\n      cursor: pointer;\n      transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), fill-opacity 0.15s;\n      transform-origin: 0px 0px;\n    }\n    .polar-slice:hover {\n      fill-opacity: 0.95;\n    }\n    .slice-label {\n      font-size: 10px;\n      fill: #fff;\n      font-weight: 700;\n      pointer-events: none;\n      user-select: none;\n      text-shadow: 0 1px 2px rgba(0,0,0,0.5);\n    }\n    .grid-label {\n      font-size: 9px;\n      fill: var(--ngx-chart-axis-text, #94a3b8);\n      pointer-events: none;\n      user-select: none;\n    }\n    .chart-legend {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      flex-shrink: 0;\n      min-width: 140px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      cursor: pointer;\n      padding: 5px 10px;\n      border-radius: 8px;\n      transition: all 0.15s;\n    }\n    .legend-item:hover {\n      background: var(--ngx-chart-grid, #f1f3f5);\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 3px;\n      flex-shrink: 0;\n    }\n    .legend-label {\n      flex: 1;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      font-weight: 550;\n    }\n    .legend-val {\n      font-weight: 700;\n      color: var(--ngx-chart-text, #212529);\n    }\n\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 8px 12px;\n      border-radius: 8px;\n      font-size: 12px;\n      min-width: 120px;\n      box-shadow: 0 10px 20px -5px rgba(0,0,0,0.25);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      transition: left 0.1s ease-out, top 0.1s ease-out;\n      font-family: inherit;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n    }\n\n\n  `]\n})\nexport class PolarAreaChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<ChartDataPoint[]>([]);\n  height = input<number>(280);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  sliceClick = output<ChartDataPoint>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n\n  hovered = signal(-1);\n  tooltip = signal<{x:number;y:number;label:string;value:number;color:string}|null>(null);\n\n  svgSize = computed(() => this.height());\n  cx = computed(() => this.svgSize() / 2);\n  cy = computed(() => this.svgSize() / 2);\n  maxRadius = computed(() => this.svgSize() / 2 - 25);\n\n  private maxValue = computed(() => {\n    const vals = this.data().map(d => d.value);\n    return Math.max(1, ...vals);\n  });\n\n  gridLevels = computed(() => {\n    const maxVal = this.maxValue();\n    const maxR = this.maxRadius();\n    return [\n      { value: maxVal * 0.25, radius: maxR * 0.25 },\n      { value: maxVal * 0.5, radius: maxR * 0.5 },\n      { value: maxVal * 0.75, radius: maxR * 0.75 },\n      { value: maxVal, radius: maxR }\n    ];\n  });\n\n  slices = computed(() => {\n    const d = this.data();\n    if (!d.length) return [];\n    const maxVal = this.maxValue();\n    const maxR = this.maxRadius();\n    const angleStep = (2 * Math.PI) / d.length;\n\n    let currentAngle = -Math.PI / 2;\n\n    return d.map((item, i) => {\n      const start = currentAngle;\n      const end = currentAngle + angleStep;\n      const mid = start + angleStep / 2;\n\n      // Radius is proportional to the value\n      const r = maxVal > 0 ? (item.value / maxVal) * maxR : 0;\n\n      // Draw SVG arc path\n      const x1 = Math.cos(start) * r;\n      const y1 = Math.sin(start) * r;\n      const x2 = Math.cos(end) * r;\n      const y2 = Math.sin(end) * r;\n      const largeArc = angleStep > Math.PI ? 1 : 0;\n      const path = `M 0 0 L ${x1} ${y1} A ${r} ${r} 0 ${largeArc} 1 ${x2} ${y2} Z`;\n\n      currentAngle = end;\n\n      return {\n        index: i,\n        label: item.label,\n        value: item.value,\n        color: item.color || this.colors()[i % this.colors().length],\n        path,\n        midAngle: mid,\n        radius: r\n      };\n    });\n  });\n\n  labelX(s: {midAngle:number; radius:number}): number {\n    return Math.cos(s.midAngle) * s.radius * 0.7;\n  }\n\n  labelY(s: {midAngle:number; radius:number}): number {\n    return Math.sin(s.midAngle) * s.radius * 0.7;\n  }\n\n  onSliceHover(event: MouseEvent, slice: {label:string;value:number;color:string}): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-polar-area-chart') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: slice.label,\n      value: slice.value,\n      color: slice.color\n    });\n  }\n\n  onSliceClick(slice: {label:string;value:number;color?:string}) {\n    this.sliceClick.emit({ label: slice.label, value: slice.value, color: slice.color });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'polar-area-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Value'];\n    const rows = data.map(d => [d.label, d.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'polar-area-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\n\n@Component({\n  selector: 'ngx-bullet-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-bullet-chart\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"bullet-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          <!-- Background Ranges -->\n          @for (r of rangeRects(); track $index) {\n            <rect\n              [attr.x]=\"r.x\"\n              [attr.y]=\"0\"\n              [attr.width]=\"r.width\"\n              [attr.height]=\"barHeight()\"\n              [attr.fill]=\"r.color\"\n              class=\"bullet-range\"\n            />\n          }\n\n          <!-- Actual Value Bar -->\n          <rect\n            [attr.x]=\"0\"\n            [attr.y]=\"valBarY()\"\n            [attr.width]=\"valBarWidth()\"\n            [attr.height]=\"valBarHeight()\"\n            [attr.fill]=\"valueColor()\"\n            class=\"bullet-value-bar\"\n          />\n\n          <!-- Target Line Marker -->\n          <line\n            [attr.x1]=\"targetX()\"\n            [attr.x2]=\"targetX()\"\n            [attr.y1]=\"targetY1()\"\n            [attr.y2]=\"targetY2()\"\n            [attr.stroke]=\"targetColor()\"\n            stroke-width=\"3\"\n            class=\"bullet-target-marker\"\n          />\n\n          <!-- Value Labels / Ticks at bottom -->\n          @if (showLabels()) {\n            <g class=\"bullet-labels\" [attr.transform]=\"'translate(0,' + (barHeight() + 14) + ')'\">\n              <!-- Min tick -->\n              <text x=\"0\" text-anchor=\"middle\" class=\"tick-label\">0</text>\n              \n              <!-- Range ticks -->\n              @for (val of ranges(); track val) {\n                <text\n                  [attr.x]=\"xPos(val)\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label\"\n                >{{ val }}</text>\n              }\n\n              <!-- Max tick -->\n              <text [attr.x]=\"innerW()\" text-anchor=\"middle\" class=\"tick-label\">{{ max() }}</text>\n            </g>\n          }\n        </g>\n      </svg>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-bullet-chart {\n      width: 100%;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n    }\n    .bullet-svg {\n      display: block;\n      overflow: visible;\n    }\n    .bullet-range {\n      transition: width 0.3s ease, x 0.3s ease;\n    }\n    .bullet-value-bar {\n      transition: width 0.5s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .bullet-target-marker {\n      transition: x1 0.5s cubic-bezier(0.16, 1, 0.3, 1), x2 0.5s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tick-label {\n      font-size: 10px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class BulletChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  value = input<number>(0);\n  target = input<number>(0);\n  max = input<number>(100);\n  ranges = input<number[]>([50, 85, 100]);\n  rangeColors = input<string[]>(['#f1f5f9', '#e2e8f0', '#cbd5e1']);\n  valueColor = input<string>('#4f46e5');\n  targetColor = input<string>('#ef4444');\n  height = input<number>(50);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 5,\n    right: 15,\n    bottom: this.showLabels() ? 20 : 5,\n    left: 15\n  }));\n\n  svgHeight = computed(() => this.height() + this.margin().top + this.margin().bottom);\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  barHeight = computed(() => this.height());\n\n  // Value bar sizing\n  valBarHeight = computed(() => this.barHeight() * 0.35);\n  valBarY = computed(() => (this.barHeight() - this.valBarHeight()) / 2);\n\n  // Target marker sizing\n  targetY1 = computed(() => this.barHeight() * 0.15);\n  targetY2 = computed(() => this.barHeight() * 0.85);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  xPos(v: number): number {\n    const maxVal = this.max() || 1;\n    const clamped = Math.max(0, Math.min(maxVal, v));\n    return (clamped / maxVal) * this.innerW();\n  }\n\n  valBarWidth = computed(() => this.xPos(this.value()));\n  targetX = computed(() => this.xPos(this.target()));\n\n  rangeRects = computed(() => {\n    const limits = this.ranges();\n    const colors = this.rangeColors();\n    const rects: Array<{ x: number; width: number; color: string }> = [];\n\n    let prev = 0;\n    limits.forEach((limit, idx) => {\n      const x = this.xPos(prev);\n      const width = Math.max(0, this.xPos(limit) - x);\n      const color = colors[idx % colors.length];\n      rects.push({ x, width, color });\n      prev = limit;\n    });\n\n    return rects;\n  });\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = {\n      value: this.value(),\n      target: this.target(),\n      max: this.max(),\n      ranges: this.ranges()\n    };\n    this.exportSvc.downloadJson(data, 'bullet-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const headers = ['Value', 'Target', 'Max', 'Ranges'];\n    const rows: (string | number)[][] = [[this.value(), this.target(), this.max(), this.ranges().join(';')]];\n    this.exportSvc.downloadCsv(headers, rows, 'bullet-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface DumbbellItem {\n  label: string;\n  startValue: number;\n  endValue: number;\n  startColor?: string;\n  endColor?: string;\n}\n\n@Component({\n  selector: 'ngx-dumbbell-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-dumbbell-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend() && data().length > 0) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          <div class=\"legend-item\">\n            <span class=\"legend-dot\" [style.background]=\"startColor()\"></span>\n            <span class=\"legend-label\">{{ startLabel() }}</span>\n          </div>\n          <div class=\"legend-item\">\n            <span class=\"legend-dot\" [style.background]=\"endColor()\"></span>\n            <span class=\"legend-label\">{{ endLabel() }}</span>\n          </div>\n        </div>\n      }\n\n      <svg\n        #svgEl\n        class=\"dumbbell-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          <!-- Grid Lines -->\n          @if (showGrid()) {\n            @for (tick of xTicks(); track tick) {\n              <line\n                [attr.x1]=\"xPos(tick)\"\n                [attr.x2]=\"xPos(tick)\"\n                [attr.y1]=\"0\"\n                [attr.y2]=\"innerH()\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Dumbbells -->\n          @for (item of computedItems(); track item.label; let i = $index) {\n            <g\n              class=\"dumbbell-row\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onRowHover(i, $event)\"\n              (mousemove)=\"onRowMouseMove($event)\"\n            >\n              <!-- Row background trigger -->\n              <rect\n                [attr.x]=\"-margin().left\"\n                [attr.y]=\"item.y - rowHeight() / 2\"\n                [attr.width]=\"containerWidth()\"\n                [attr.height]=\"rowHeight()\"\n                fill=\"transparent\"\n                style=\"cursor: pointer;\"\n              />\n\n              <!-- Label -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"-10\"\n                  [attr.y]=\"item.y\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"y-axis-label\"\n                >\n                  {{ item.label }}\n                </text>\n              }\n\n              <!-- Connecting Bar -->\n              <line\n                [attr.x1]=\"xPos(item.startValue)\"\n                [attr.x2]=\"xPos(item.endValue)\"\n                [attr.y1]=\"item.y\"\n                [attr.y2]=\"item.y\"\n                [attr.stroke]=\"item.barColor\"\n                stroke-width=\"4\"\n                stroke-linecap=\"round\"\n                class=\"connecting-bar\"\n              />\n\n              <!-- Start Dot -->\n              <circle\n                [attr.cx]=\"xPos(item.startValue)\"\n                [attr.cy]=\"item.y\"\n                [attr.r]=\"hoveredIndex() === i ? 8 : 6\"\n                [attr.fill]=\"item.sColor\"\n                class=\"endpoint-dot start-dot\"\n              />\n\n              <!-- End Dot -->\n              <circle\n                [attr.cx]=\"xPos(item.endValue)\"\n                [attr.cy]=\"item.y\"\n                [attr.r]=\"hoveredIndex() === i ? 8 : 6\"\n                [attr.fill]=\"item.eColor\"\n                class=\"endpoint-dot end-dot\"\n              />\n            </g>\n          }\n\n          <!-- X Axis (Bottom) -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n            @for (tick of xTicks(); track tick) {\n              <g [attr.transform]=\"'translate(' + xPos(tick) + ',0)'\">\n                <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"4\" class=\"tick-line\" />\n                <text\n                  [attr.y]=\"16\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"startColor()\"></span>\n            <span class=\"tt-name\">{{ startLabel() }}</span>\n            <span class=\"tt-val\">{{ formatNumber(t.startValue) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"endColor()\"></span>\n            <span class=\"tt-name\">{{ endLabel() }}</span>\n            <span class=\"tt-val\">{{ formatNumber(t.endValue) }}</span>\n          </div>\n          <div class=\"tt-row delta-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Difference</span>\n            <span class=\"tt-val\" [style.color]=\"t.delta >= 0 ? '#10b981' : '#ef4444'\">\n              {{ t.delta >= 0 ? '+' : '' }}{{ formatNumber(t.delta) }}\n            </span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-dumbbell-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .dumbbell-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 500;\n      user-select: none;\n    }\n    .y-axis-label {\n      font-size: 12px;\n      fill: var(--ngx-chart-axis-text, #334155);\n      font-weight: 600;\n      user-select: none;\n    }\n    .connecting-bar {\n      transition: stroke-width 0.2s ease, opacity 0.2s ease;\n      opacity: 0.85;\n    }\n    .endpoint-dot {\n      transition: r 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 0.2s ease;\n      stroke: var(--ngx-chart-bg, #ffffff);\n      stroke-width: 1.5;\n    }\n    .dumbbell-row {\n      transition: opacity 0.2s ease;\n    }\n    .dumbbell-row.dimmed {\n      opacity: 0.3;\n    }\n    .dumbbell-row.highlighted .connecting-bar {\n      stroke-width: 6;\n      opacity: 1;\n    }\n    \n    /* Legend */\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 16px;\n      justify-content: flex-end;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n    }\n    .legend-label {\n      font-size: 12px;\n      color: #475569;\n      font-weight: 600;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .delta-row {\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      margin-top: 6px;\n      padding-top: 6px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Header and Export dropdown styles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class DumbbellChartComponent {\n  data = input<DumbbellItem[]>([]);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  startColor = input<string>('#ef4444');\n  endColor = input<string>('#10b981');\n  startLabel = input<string>('Start');\n  endLabel = input<string>('End');\n  colors = input<string[]>(CHART_COLORS);\n  showLegend = input<boolean>(true);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 30,\n    bottom: 30,\n    left: this.showLabels() ? 100 : 20\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Min and Max values of the entire dataset\n  minVal = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 0;\n    const values = raw.flatMap(d => [d.startValue, d.endValue]);\n    return Math.min(...values);\n  });\n\n  maxVal = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 100;\n    const values = raw.flatMap(d => [d.startValue, d.endValue]);\n    return Math.max(...values);\n  });\n\n  xTicks = computed(() => {\n    const min = this.minVal();\n    const max = this.maxVal();\n    // Add buffer padding to the domain\n    const span = max - min || 1;\n    const paddedMin = Math.max(0, min - span * 0.1);\n    const paddedMax = max + span * 0.1;\n    return niceTicks(paddedMin, paddedMax, 5);\n  });\n\n  xDomain = computed(() => {\n    const ticks = this.xTicks();\n    return {\n      min: ticks[0],\n      max: ticks[ticks.length - 1]\n    };\n  });\n\n  xPos(val: number): number {\n    const domain = this.xDomain();\n    return scale(val, domain.min, domain.max, 0, this.innerW());\n  }\n\n  rowHeight = computed(() => {\n    const count = this.data().length || 1;\n    return this.innerH() / count;\n  });\n\n  computedItems = computed(() => {\n    const raw = this.data();\n    const rowH = this.rowHeight();\n    const defaultStartColor = this.startColor();\n    const defaultEndColor = this.endColor();\n\n    return raw.map((item, idx) => {\n      const y = rowH * idx + rowH / 2;\n      const sColor = item.startColor || defaultStartColor;\n      const eColor = item.endColor || defaultEndColor;\n      // Connect bar color (neutral gray/slate)\n      const barColor = 'var(--ngx-chart-axis, #cbd5e1)';\n\n      return {\n        ...item,\n        y,\n        sColor,\n        eColor,\n        barColor\n      };\n    });\n  });\n\n  onRowHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const item = this.data()[idx];\n    if (item) {\n      this.tooltip.set({\n        ...item,\n        delta: item.endValue - item.startValue\n      });\n    }\n  }\n\n  onRowMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-dumbbell-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'dumbbell-chart-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    let csv = 'Label,StartValue,EndValue,StartColor,EndColor\\\\n';\n    data.forEach(d => {\n      csv += `\"${d.label || ''}\",${d.startValue},${d.endValue},\"${d.startColor || ''}\",\"${d.endColor || ''}\"\\\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'dumbbell-chart-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'dumbbell-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgClone = svg.cloneNode(true) as SVGElement;\n    svgClone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n    const svgString = new XMLSerializer().serializeToString(svgClone);\n    \n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body {\n              margin: 0;\n              display: flex;\n              justify-content: center;\n              align-items: center;\n              height: 100vh;\n              background-color: #ffffff;\n              font-family: system-ui, sans-serif;\n            }\n            .print-container {\n              text-align: center;\n              width: 100%;\n              max-width: 800px;\n              padding: 20px;\n            }\n            svg {\n              width: 100%;\n              height: auto;\n              max-height: 90vh;\n            }\n            @media print {\n              body {\n                background: none;\n              }\n              .print-container {\n                max-width: 100%;\n                padding: 0;\n              }\n              svg {\n                page-break-inside: avoid;\n              }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${svgString}\n          </div>\n          <script>\n            window.onload = () => {\n              window.print();\n              window.close();\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartDataPoint, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-lollipop-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-lollipop-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"lollipop-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          <!-- Grid Lines (Horizontal Orientation: vertical lines; Vertical Orientation: horizontal lines) -->\n          @if (showGrid()) {\n            @if (orientation() === 'horizontal') {\n              @for (tick of xTicks(); track tick) {\n                <line\n                  [attr.x1]=\"xPos(tick)\"\n                  [attr.x2]=\"xPos(tick)\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  class=\"grid-line\"\n                />\n              }\n            } @else {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  class=\"grid-line\"\n                />\n              }\n            }\n          }\n\n          <!-- Lollipops -->\n          @for (item of computedItems(); track item.label; let i = $index) {\n            <g\n              class=\"lollipop-row\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onItemHover(i, $event)\"\n              (mousemove)=\"onItemMouseMove($event)\"\n            >\n              <!-- Row backdrop for easier hover -->\n              @if (orientation() === 'horizontal') {\n                <rect\n                  [attr.x]=\"-margin().left\"\n                  [attr.y]=\"item.coord - itemSpacing() / 2\"\n                  [attr.width]=\"containerWidth()\"\n                  [attr.height]=\"itemSpacing()\"\n                  fill=\"transparent\"\n                  style=\"cursor: pointer;\"\n                />\n              } @else {\n                <rect\n                  [attr.x]=\"item.coord - itemSpacing() / 2\"\n                  [attr.y]=\"-margin().top\"\n                  [attr.width]=\"itemSpacing()\"\n                  [attr.height]=\"svgHeight()\"\n                  fill=\"transparent\"\n                  style=\"cursor: pointer;\"\n                />\n              }\n\n              <!-- Stem Line -->\n              @if (orientation() === 'horizontal') {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"xPos(item.value)\"\n                  [attr.y1]=\"item.coord\"\n                  [attr.y2]=\"item.coord\"\n                  [attr.stroke]=\"item.color\"\n                  stroke-width=\"2\"\n                  class=\"lollipop-stem\"\n                />\n              } @else {\n                <line\n                  [attr.x1]=\"item.coord\"\n                  [attr.x2]=\"item.coord\"\n                  [attr.y1]=\"innerH()\"\n                  [attr.y2]=\"yPos(item.value)\"\n                  [attr.stroke]=\"item.color\"\n                  stroke-width=\"2\"\n                  class=\"lollipop-stem\"\n                />\n              }\n\n              <!-- Candy Dot -->\n              @if (orientation() === 'horizontal') {\n                <circle\n                  [attr.cx]=\"xPos(item.value)\"\n                  [attr.cy]=\"item.coord\"\n                  [attr.r]=\"hoveredIndex() === i ? dotRadius() + 2 : dotRadius()\"\n                  [attr.fill]=\"item.color\"\n                  class=\"lollipop-candy\"\n                />\n              } @else {\n                <circle\n                  [attr.cx]=\"item.coord\"\n                  [attr.cy]=\"yPos(item.value)\"\n                  [attr.r]=\"hoveredIndex() === i ? dotRadius() + 2 : dotRadius()\"\n                  [attr.fill]=\"item.color\"\n                  class=\"lollipop-candy\"\n                />\n              }\n            </g>\n          }\n\n          <!-- Y Axis (Left) / X Axis (Bottom) -->\n          @if (orientation() === 'horizontal') {\n            <!-- Left Y Axis for Horizontal -->\n            <g class=\"y-axis\">\n              <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n              @if (showLabels()) {\n                @for (item of computedItems(); track item.label) {\n                  <text\n                    [attr.x]=\"-10\"\n                    [attr.y]=\"item.coord\"\n                    text-anchor=\"end\"\n                    dominant-baseline=\"middle\"\n                    class=\"axis-label\"\n                  >\n                    {{ item.label }}\n                  </text>\n                }\n              }\n            </g>\n\n            <!-- Bottom X Axis for Horizontal -->\n            <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n              <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n              @for (tick of xTicks(); track tick) {\n                <g [attr.transform]=\"'translate(' + xPos(tick) + ',0)'\">\n                  <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"4\" class=\"tick-line\" />\n                  <text [attr.y]=\"16\" text-anchor=\"middle\" class=\"tick-label\">\n                    {{ formatNumber(tick) }}\n                  </text>\n                </g>\n              }\n            </g>\n          } @else {\n            <!-- Left Y Axis for Vertical -->\n            <g class=\"y-axis\">\n              <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n              @for (tick of yTicks(); track tick) {\n                <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                  <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                  <text [attr.x]=\"-8\" text-anchor=\"end\" dominant-baseline=\"middle\" class=\"tick-label\">\n                    {{ formatNumber(tick) }}\n                  </text>\n                </g>\n              }\n            </g>\n\n            <!-- Bottom X Axis for Vertical -->\n            <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n              <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n              @if (showLabels()) {\n                @for (item of computedItems(); track item.label) {\n                  <text\n                    [attr.x]=\"item.coord\"\n                    [attr.y]=\"16\"\n                    text-anchor=\"middle\"\n                    class=\"axis-label\"\n                  >\n                    {{ item.label }}\n                  </text>\n                }\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <span class=\"tt-name\">Value</span>\n            <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-lollipop-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .lollipop-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label, .axis-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .lollipop-stem {\n      opacity: 0.75;\n      transition: stroke-width 0.2s ease, opacity 0.2s ease;\n    }\n    .lollipop-candy {\n      transition: r 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), filter 0.2s ease;\n      stroke: var(--ngx-chart-bg, #ffffff);\n      stroke-width: 1.5;\n      cursor: pointer;\n    }\n    .lollipop-row {\n      transition: opacity 0.2s ease;\n    }\n    .lollipop-row.dimmed {\n      opacity: 0.3;\n    }\n    .lollipop-row.highlighted .lollipop-stem {\n      stroke-width: 3.5;\n      opacity: 1;\n    }\n    .lollipop-row.highlighted .lollipop-candy {\n      filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.15));\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Header styles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n  `]\n})\nexport class LollipopChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<ChartDataPoint[]>([]);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  orientation = input<'horizontal' | 'vertical'>('horizontal');\n  colors = input<string[]>(CHART_COLORS);\n  dotRadius = input<number>(8);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => {\n    const isHoriz = this.orientation() === 'horizontal';\n    return {\n      top: 20,\n      right: 30,\n      bottom: 40,\n      left: this.showLabels() ? (isHoriz ? 80 : 40) : 20\n    };\n  });\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Domain range calculations\n  maxVal = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 100;\n    return Math.max(...raw.map(d => d.value), 0);\n  });\n\n  ticks = computed(() => {\n    const max = this.maxVal();\n    return niceTicks(0, max, 5);\n  });\n\n  xTicks = computed(() => {\n    return this.orientation() === 'horizontal' ? this.ticks() : [];\n  });\n\n  yTicks = computed(() => {\n    return this.orientation() === 'vertical' ? this.ticks() : [];\n  });\n\n  domainMax = computed(() => {\n    const t = this.ticks();\n    return t[t.length - 1] || 100;\n  });\n\n  xPos(val: number): number {\n    return scale(val, 0, this.domainMax(), 0, this.innerW());\n  }\n\n  yPos(val: number): number {\n    // Invert for SVG y coordinate mapping\n    return scale(val, 0, this.domainMax(), this.innerH(), 0);\n  }\n\n  itemSpacing = computed(() => {\n    const count = this.data().length || 1;\n    const axisLength = this.orientation() === 'horizontal' ? this.innerH() : this.innerW();\n    return axisLength / count;\n  });\n\n  computedItems = computed(() => {\n    const raw = this.data();\n    const spacing = this.itemSpacing();\n    const palette = this.colors();\n\n    return raw.map((item, idx) => {\n      const coord = spacing * idx + spacing / 2;\n      const color = item.color || palette[idx % palette.length];\n\n      return {\n        ...item,\n        coord,\n        color\n      };\n    });\n  });\n\n  onItemHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const item = this.computedItems()[idx];\n    if (item) {\n      this.tooltip.set(item);\n    }\n  }\n\n  onItemMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-lollipop-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'lollipop-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Value'];\n    const rows = data.map(d => [d.label || '', d.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'lollipop-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'lollipop-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Lollipop Chart', 'lollipop-chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild, HostListener\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, scale } from '../shared/chart-utils';\n\nexport interface SlopeDataPoint {\n  label: string;\n  startValue: number;\n  endValue: number;\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-slope-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-slope-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"slope-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          <!-- Left Axis Line -->\n          <line\n            [attr.x1]=\"leftAxisX()\"\n            [attr.x2]=\"leftAxisX()\"\n            [attr.y1]=\"0\"\n            [attr.y2]=\"innerH()\"\n            class=\"axis-line\"\n          />\n\n          <!-- Right Axis Line -->\n          <line\n            [attr.x1]=\"rightAxisX()\"\n            [attr.x2]=\"rightAxisX()\"\n            [attr.y1]=\"0\"\n            [attr.y2]=\"innerH()\"\n            class=\"axis-line\"\n          />\n\n          <!-- Axis Labels at Top -->\n          <text\n            [attr.x]=\"leftAxisX()\"\n            [attr.y]=\"-10\"\n            text-anchor=\"middle\"\n            class=\"axis-title\"\n          >\n            {{ startLabel() }}\n          </text>\n          <text\n            [attr.x]=\"rightAxisX()\"\n            [attr.y]=\"-10\"\n            text-anchor=\"middle\"\n            class=\"axis-title\"\n          >\n            {{ endLabel() }}\n          </text>\n\n          <!-- Slope Lines & Dots -->\n          @for (item of computedItems(); track item.label; let i = $index) {\n            <g\n              class=\"slope-group\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onSlopeHover(i, $event)\"\n              (mousemove)=\"onSlopeMouseMove($event)\"\n            >\n              <!-- Connecting Slope Line -->\n              <line\n                [attr.x1]=\"leftAxisX()\"\n                [attr.x2]=\"rightAxisX()\"\n                [attr.y1]=\"item.leftY\"\n                [attr.y2]=\"item.rightY\"\n                [attr.stroke]=\"item.lineColor\"\n                stroke-width=\"2.5\"\n                class=\"slope-line\"\n              />\n\n              <!-- Left Endpoint Dot -->\n              <circle\n                [attr.cx]=\"leftAxisX()\"\n                [attr.cy]=\"item.leftY\"\n                [attr.r]=\"hoveredIndex() === i ? 6 : 4\"\n                [attr.fill]=\"item.lineColor\"\n                class=\"endpoint-dot\"\n              />\n\n              <!-- Right Endpoint Dot -->\n              <circle\n                [attr.cx]=\"rightAxisX()\"\n                [attr.cy]=\"item.rightY\"\n                [attr.r]=\"hoveredIndex() === i ? 6 : 4\"\n                [attr.fill]=\"item.lineColor\"\n                class=\"endpoint-dot\"\n              />\n\n              <!-- Label and Value on Left Axis (Outer Left side) -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"leftAxisX() - 12\"\n                  [attr.y]=\"item.leftY\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"slope-label left-label\"\n                >\n                  {{ item.label }}\n                </text>\n              }\n\n              <!-- Value on Left Axis (Inner Left side) -->\n              @if (showValues()) {\n                <text\n                  [attr.x]=\"leftAxisX() + 10\"\n                  [attr.y]=\"item.leftY\"\n                  text-anchor=\"start\"\n                  dominant-baseline=\"middle\"\n                  class=\"slope-value\"\n                >\n                  {{ formatNumber(item.startValue) }}\n                </text>\n              }\n\n              <!-- Value on Right Axis (Inner Right side) -->\n              @if (showValues()) {\n                <text\n                  [attr.x]=\"rightAxisX() - 10\"\n                  [attr.y]=\"item.rightY\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"slope-value\"\n                >\n                  {{ formatNumber(item.endValue) }}\n                </text>\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">{{ startLabel() }}</span>\n            <span class=\"tt-val\">{{ formatNumber(t.startValue) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.lineColor\"></span>\n            <span class=\"tt-name\">{{ endLabel() }}</span>\n            <span class=\"tt-val\">{{ formatNumber(t.endValue) }}</span>\n          </div>\n          <div class=\"tt-row delta-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Change</span>\n            <span class=\"tt-val\" [style.color]=\"t.delta >= 0 ? '#10b981' : '#ef4444'\">\n              {{ t.delta >= 0 ? '+' : '' }}{{ formatNumber(t.delta) }} ({{ t.deltaPct >= 0 ? '+' : '' }}{{ t.deltaPct.toFixed(1) }}%)\n            </span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-slope-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .slope-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 2;\n    }\n    .axis-title {\n      font-size: 13px;\n      font-weight: 700;\n      fill: var(--ngx-chart-axis-text, #334155);\n      letter-spacing: 0.5px;\n      user-select: none;\n    }\n    .slope-line {\n      transition: stroke-width 0.2s ease, stroke-dashoffset 0.8s ease, opacity 0.2s ease;\n      cursor: pointer;\n    }\n    .endpoint-dot {\n      transition: r 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 0.2s ease;\n      stroke: var(--ngx-chart-bg, #ffffff);\n      stroke-width: 1.5;\n    }\n    .slope-label {\n      font-size: 12px;\n      fill: var(--ngx-chart-axis-text, #1e293b);\n      font-weight: 600;\n      user-select: none;\n      transition: font-size 0.2s ease;\n    }\n    .slope-value {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .slope-group {\n      transition: opacity 0.2s ease;\n    }\n    .slope-group.dimmed {\n      opacity: 0.2;\n    }\n    .slope-group.highlighted .slope-line {\n      stroke-width: 4.5;\n    }\n    .slope-group.highlighted .slope-label {\n      font-size: 13px;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 170px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .delta-row {\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      margin-top: 6px;\n      padding-top: 6px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class SlopeChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<SlopeDataPoint[]>([]);\n  startLabel = input<string>('Before');\n  endLabel = input<string>('After');\n  height = input<number>(350);\n  showLabels = input<boolean>(true);\n  showValues = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 40,\n    right: this.showLabels() ? 120 : 40,\n    bottom: 20,\n    left: this.showLabels() ? 120 : 40\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  leftAxisX = computed(() => 0);\n  rightAxisX = computed(() => this.innerW());\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Bounds\n  bounds = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return { min: 0, max: 100 };\n    const allVals = raw.flatMap(d => [d.startValue, d.endValue]);\n    const min = Math.min(...allVals);\n    const max = Math.max(...allVals);\n    const pad = (max - min) * 0.05 || 10;\n    return {\n      min: Math.max(0, min - pad),\n      max: max + pad\n    };\n  });\n\n  computedItems = computed(() => {\n    const raw = this.data();\n    const b = this.bounds();\n    const palette = this.colors();\n\n    return raw.map((item, idx) => {\n      // Invert Y mapping for SVG\n      const leftY = scale(item.startValue, b.min, b.max, this.innerH(), 0);\n      const rightY = scale(item.endValue, b.min, b.max, this.innerH(), 0);\n\n      // Color coding: Green for positive change, Red for negative, Slate for equal\n      const delta = item.endValue - item.startValue;\n      let lineColor = item.color;\n      if (!lineColor) {\n        if (delta > 0) {\n          lineColor = '#10b981'; // Green\n        } else if (delta < 0) {\n          lineColor = '#ef4444'; // Red\n        } else {\n          lineColor = '#94a3b8'; // Slate\n        }\n      }\n\n      return {\n        ...item,\n        leftY,\n        rightY,\n        lineColor\n      };\n    });\n  });\n\n  onSlopeHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const item = this.computedItems()[idx];\n    if (item) {\n      const delta = item.endValue - item.startValue;\n      const base = item.startValue || 1;\n      const deltaPct = (delta / base) * 100;\n      this.tooltip.set({\n        ...item,\n        delta,\n        deltaPct\n      });\n    }\n  }\n\n  onSlopeMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-slope-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'slope-chart.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Start Value', 'End Value'];\n    const rows = data.map(d => [d.label || '', d.startValue, d.endValue]);\n    this.exportSvc.downloadCsv(headers, rows, 'slope-chart.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild, HostListener\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface SankeyNode {\n  id: string;\n  label: string;\n  color?: string;\n}\n\nexport interface SankeyLink {\n  source: string;\n  target: string;\n  value: number;\n}\n\ninterface ProcessedNode {\n  id: string;\n  label: string;\n  color: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  value: number;\n  column: number;\n  inSum: number;\n  outSum: number;\n}\n\ninterface ProcessedLink {\n  sourceId: string;\n  targetId: string;\n  value: number;\n  path: string;\n  color: string;\n  thickness: number;\n  sourceNode: ProcessedNode;\n  targetNode: ProcessedNode;\n}\n\n@Component({\n  selector: 'ngx-sankey-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-sankey-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"sankey-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Links (Rendered first so they sit behind nodes) -->\n          @for (link of computedData().links; track link.sourceId + '-' + link.targetId; let i = $index) {\n            <path\n              [attr.d]=\"link.path\"\n              [attr.stroke]=\"link.color\"\n              [attr.stroke-width]=\"link.thickness\"\n              fill=\"none\"\n              class=\"sankey-link\"\n              [class.highlighted]=\"isLinkHighlighted(link)\"\n              [class.dimmed]=\"hoveredNodeId() !== null || (hoveredLinkId() !== null && hoveredLinkId() !== i)\"\n              (mousemove)=\"onLinkMouseMove($event)\"\n              (mouseenter)=\"onLinkHover(i, $event)\"\n            />\n          }\n\n          <!-- Nodes -->\n          @for (node of computedData().nodes; track node.id) {\n            <g\n              class=\"sankey-node-group\"\n              [class.dimmed]=\"isNodeDimmed(node)\"\n              (mouseenter)=\"onNodeHover(node.id)\"\n            >\n              <!-- Node Bar -->\n              <rect\n                [attr.x]=\"node.x\"\n                [attr.y]=\"node.y\"\n                [attr.width]=\"node.width\"\n                [attr.height]=\"node.height\"\n                [attr.fill]=\"node.color\"\n                rx=\"3\"\n                class=\"sankey-node\"\n              />\n\n              <!-- Labels -->\n              @if (showLabels() && node.height > 10) {\n                <text\n                  [attr.x]=\"node.column === 0 ? node.x - 8 : node.x + node.width + 8\"\n                  [attr.y]=\"node.y + node.height / 2\"\n                  [attr.text-anchor]=\"node.column === 0 ? 'end' : 'start'\"\n                  dominant-baseline=\"middle\"\n                  class=\"node-label\"\n                >\n                  {{ node.label }} \n                  @if (showValues()) {\n                    <tspan class=\"node-val\">({{ formatNumber(node.value) }})</tspan>\n                  }\n                </text>\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (t.type === 'node') {\n            <div class=\"tt-cat\">{{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">Total Flow</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n            @if (t.inSum > 0) {\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Incoming</span>\n                <span class=\"tt-val\">{{ formatNumber(t.inSum) }}</span>\n              </div>\n            }\n            @if (t.outSum > 0) {\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Outgoing</span>\n                <span class=\"tt-val\">{{ formatNumber(t.outSum) }}</span>\n              </div>\n            }\n          } @else if (t.type === 'link') {\n            <div class=\"tt-cat\">Flow Connection</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Source</span>\n              <span class=\"tt-val\">{{ t.sourceLabel }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Target</span>\n              <span class=\"tt-val\">{{ t.targetLabel }}</span>\n            </div>\n            <div class=\"tt-row delta-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">Flow Value</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-sankey-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .sankey-svg {\n      display: block;\n      overflow: visible;\n    }\n    .sankey-node {\n      stroke: var(--ngx-chart-bg, #ffffff);\n      stroke-width: 1.5;\n      cursor: pointer;\n    }\n    .node-label {\n      font-size: 11px;\n      font-weight: 700;\n      fill: var(--ngx-chart-axis-text, #1e293b);\n      user-select: none;\n      pointer-events: none;\n    }\n    .node-val {\n      font-weight: 500;\n      fill: #64748b;\n    }\n    .sankey-link {\n      opacity: 0.35;\n      transition: opacity 0.25s ease;\n      cursor: pointer;\n    }\n    .sankey-link:hover, .sankey-link.highlighted {\n      opacity: 0.85 !important;\n    }\n    .sankey-link.dimmed {\n      opacity: 0.1;\n    }\n    .sankey-node-group {\n      transition: opacity 0.25s ease;\n    }\n    .sankey-node-group.dimmed {\n      opacity: 0.3;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .delta-row {\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      margin-top: 6px;\n      padding-top: 6px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class SankeyChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  nodes = input<SankeyNode[]>([]);\n  links = input<SankeyLink[]>([]);\n  height = input<number>(400);\n  showLabels = input<boolean>(true);\n  showValues = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  nodePadding = input<number>(16);\n  nodeWidth = input<number>(20);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredNodeId = signal<string | null>(null);\n  hoveredLinkId = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: this.showLabels() ? 80 : 20,\n    bottom: 20,\n    left: this.showLabels() ? 80 : 20\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Sankey layout compiler\n  computedData = computed(() => {\n    const rawNodes = this.nodes();\n    const rawLinks = this.links();\n    const w = this.innerW();\n    const h = this.innerH();\n    const padding = this.nodePadding();\n    const nodeW = this.nodeWidth();\n    const palette = this.colors();\n\n    if (rawNodes.length === 0) {\n      return { nodes: [], links: [] };\n    }\n\n    // Initialize processed nodes list\n    const processedNodes: ProcessedNode[] = rawNodes.map((n, idx) => ({\n      id: n.id,\n      label: n.label,\n      color: n.color || palette[idx % palette.length],\n      x: 0,\n      y: 0,\n      width: nodeW,\n      height: 0,\n      value: 0,\n      column: 0,\n      inSum: 0,\n      outSum: 0\n    }));\n\n    const nodeMap = new Map<string, ProcessedNode>();\n    processedNodes.forEach(n => nodeMap.set(n.id, n));\n\n    // Calculate node incoming and outgoing flow sums\n    rawLinks.forEach(l => {\n      const src = nodeMap.get(l.source);\n      const tgt = nodeMap.get(l.target);\n      if (src && tgt) {\n        src.outSum += l.value;\n        tgt.inSum += l.value;\n      }\n    });\n\n    processedNodes.forEach(n => {\n      n.value = Math.max(n.inSum, n.outSum);\n    });\n\n    // 1. Assign columns (topological layering)\n    // Find node connections\n    const incoming = new Map<string, string[]>();\n    rawLinks.forEach(l => {\n      if (!incoming.has(l.target)) {\n        incoming.set(l.target, []);\n      }\n      incoming.get(l.target)!.push(l.source);\n    });\n\n    // Queue-based column assignment (simplistic relaxation)\n    let maxCol = 0;\n    const computedColumns = new Map<string, number>();\n\n    // Start with root nodes (no incoming)\n    processedNodes.forEach(n => {\n      if ((incoming.get(n.id)?.length || 0) === 0) {\n        computedColumns.set(n.id, 0);\n      }\n    });\n\n    // Relax column level for other nodes\n    let relaxed = true;\n    let iterations = 0;\n    while (relaxed && iterations < 10) {\n      relaxed = false;\n      iterations++;\n      rawLinks.forEach(l => {\n        const srcCol = computedColumns.get(l.source) ?? 0;\n        const tgtCol = computedColumns.get(l.target);\n        if (tgtCol === undefined || tgtCol <= srcCol) {\n          computedColumns.set(l.target, srcCol + 1);\n          maxCol = Math.max(maxCol, srcCol + 1);\n          relaxed = true;\n        }\n      });\n    }\n\n    processedNodes.forEach(n => {\n      n.column = computedColumns.get(n.id) ?? 0;\n    });\n\n    // Group nodes by column\n    const columns: ProcessedNode[][] = [];\n    for (let c = 0; c <= maxCol; c++) {\n      columns.push([]);\n    }\n    processedNodes.forEach(n => {\n      if (columns[n.column]) {\n        columns[n.column].push(n);\n      } else {\n        // Fallback to column 0 if index overflow\n        columns[0].push(n);\n        n.column = 0;\n      }\n    });\n\n    const numCols = columns.length;\n    const colSpacing = numCols > 1 ? (w - nodeW) / (numCols - 1) : 0;\n\n    // 2. Calculate vertical scaling (kY)\n    let maxColumnSum = 0;\n    columns.forEach(colNodes => {\n      const sum = colNodes.reduce((acc, curr) => acc + curr.value, 0);\n      maxColumnSum = Math.max(maxColumnSum, sum);\n    });\n\n    // Avoid division by zero\n    const flowSum = maxColumnSum || 1;\n    // Calculate scaling factor kY\n    let minPadding = padding;\n    let kY = (h - (columns[0].length - 1) * minPadding) / flowSum;\n\n    // Adjust kY to make sure padding fits in all columns\n    columns.forEach(colNodes => {\n      const colPaddingSum = (colNodes.length - 1) * padding;\n      const currentKY = (h - colPaddingSum) / (colNodes.reduce((acc, curr) => acc + curr.value, 0) || 1);\n      if (currentKY < kY) {\n        kY = currentKY;\n      }\n    });\n\n    if (kY < 0.1) kY = 0.1; // Floor boundary protection\n\n    // 3. Position nodes\n    columns.forEach((colNodes, colIdx) => {\n      const x = colIdx * colSpacing;\n      const totalColVal = colNodes.reduce((acc, curr) => acc + curr.value, 0);\n      const totalHeight = totalColVal * kY + (colNodes.length - 1) * padding;\n      \n      // Center the column vertically\n      let currentY = (h - totalHeight) / 2;\n\n      colNodes.forEach(n => {\n        n.x = x;\n        n.y = currentY;\n        n.height = Math.max(4, n.value * kY); // Guarantee a minimum 4px height\n        currentY += n.height + padding;\n      });\n    });\n\n    // 4. Position and shape Links\n    // Track current vertical offset for stacking links at source & target nodes\n    const sourceLinkOffset = new Map<string, number>();\n    const targetLinkOffset = new Map<string, number>();\n\n    const processedLinks: ProcessedLink[] = [];\n\n    rawLinks.forEach((link, idx) => {\n      const sNode = nodeMap.get(link.source);\n      const tNode = nodeMap.get(link.target);\n\n      if (sNode && tNode) {\n        const thickness = Math.max(1, link.value * kY);\n        \n        // Get or initialize link offsets on the nodes\n        const sOffset = sourceLinkOffset.get(sNode.id) ?? 0;\n        const tOffset = targetLinkOffset.get(tNode.id) ?? 0;\n\n        // Calculate link endpoints\n        const x0 = sNode.x + sNode.width;\n        const y0 = sNode.y + sOffset + thickness / 2;\n\n        const x1 = tNode.x;\n        const y1 = tNode.y + tOffset + thickness / 2;\n\n        // Curved Bézier path generator\n        const controlPtX = (x0 + x1) / 2;\n        const path = `M ${x0} ${y0} C ${controlPtX} ${y0}, ${controlPtX} ${y1}, ${x1} ${y1}`;\n\n        // Save offsets for subsequent links\n        sourceLinkOffset.set(sNode.id, sOffset + link.value * kY);\n        targetLinkOffset.set(tNode.id, tOffset + link.value * kY);\n\n        processedLinks.push({\n          sourceId: link.source,\n          targetId: link.target,\n          value: link.value,\n          path,\n          color: sNode.color, // Link color inherits source node's theme\n          thickness,\n          sourceNode: sNode,\n          targetNode: tNode\n        });\n      }\n    });\n\n    return {\n      nodes: processedNodes,\n      links: processedLinks\n    };\n  });\n\n  isLinkHighlighted(link: ProcessedLink): boolean {\n    const hoveredNId = this.hoveredNodeId();\n    if (hoveredNId !== null) {\n      return link.sourceId === hoveredNId || link.targetId === hoveredNId;\n    }\n    return false;\n  }\n\n  isNodeDimmed(node: ProcessedNode): boolean {\n    const hoveredNId = this.hoveredNodeId();\n    if (hoveredNId !== null) {\n      if (hoveredNId === node.id) return false;\n      // Check if node is connected to the hovered node via links\n      const links = this.computedData().links;\n      const isConnected = links.some(l => \n        (l.sourceId === hoveredNId && l.targetId === node.id) ||\n        (l.targetId === hoveredNId && l.sourceId === node.id)\n      );\n      return !isConnected;\n    }\n\n    const hoveredLId = this.hoveredLinkId();\n    if (hoveredLId !== null) {\n      const activeLink = this.computedData().links[hoveredLId];\n      if (activeLink) {\n        return node.id !== activeLink.sourceId && node.id !== activeLink.targetId;\n      }\n    }\n\n    return false;\n  }\n\n  onNodeHover(nodeId: string) {\n    this.hoveredNodeId.set(nodeId);\n    const node = this.computedData().nodes.find(n => n.id === nodeId);\n    if (node) {\n      this.tooltip.set({\n        type: 'node',\n        label: node.label,\n        value: node.value,\n        inSum: node.inSum,\n        outSum: node.outSum,\n        color: node.color\n      });\n    }\n  }\n\n  onLinkHover(idx: number, event: MouseEvent) {\n    this.hoveredLinkId.set(idx);\n    const link = this.computedData().links[idx];\n    if (link) {\n      this.tooltip.set({\n        type: 'link',\n        sourceLabel: link.sourceNode.label,\n        targetLabel: link.targetNode.label,\n        value: link.value,\n        color: link.color\n      });\n    }\n  }\n\n  onLinkMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-sankey-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredNodeId.set(null);\n    this.hoveredLinkId.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = { nodes: this.nodes(), links: this.links() };\n    this.exportSvc.downloadJson(data, 'sankey-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const links = this.links();\n    if (!links.length) return;\n    const headers = ['Source', 'Target', 'Value'];\n    const rows = links.map(l => [l.source, l.target, l.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'sankey-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface ViolinItem {\n  label: string;\n  values: number[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-violin-plot',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-violin-plot\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"violin-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          <!-- Grid Lines (Horizontal reference grid) -->\n          @if (showGrid()) {\n            @for (tick of yTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(tick)\"\n                [attr.y2]=\"yPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Violins -->\n          @for (item of computedItems(); track item.label; let i = $index) {\n            <g\n              class=\"violin-group\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onItemHover(i, $event)\"\n              (mousemove)=\"onItemMouseMove($event)\"\n            >\n              <!-- Row/column hover trigger zone -->\n              <rect\n                [attr.x]=\"item.centerX - colWidth() / 2\"\n                [attr.y]=\"-margin().top\"\n                [attr.width]=\"colWidth()\"\n                [attr.height]=\"svgHeight()\"\n                fill=\"transparent\"\n                style=\"cursor: pointer;\"\n              />\n\n              <!-- Symmetrical Violin Path -->\n              <path\n                [attr.d]=\"item.path\"\n                [attr.fill]=\"item.color\"\n                fill-opacity=\"0.3\"\n                [attr.stroke]=\"item.color\"\n                stroke-width=\"1.5\"\n                class=\"violin-path\"\n              />\n\n              <!-- Overlay Jittered Points -->\n              @if (showPoints()) {\n                @for (val of item.values; track val; let sIdx = $index) {\n                  <circle\n                    [attr.cx]=\"item.centerX + getJitterOffset(val, sIdx, item.centerX)\"\n                    [attr.cy]=\"yPos(val)\"\n                    [attr.r]=\"3\"\n                    [attr.fill]=\"item.color\"\n                    fill-opacity=\"0.65\"\n                    class=\"jitter-point\"\n                  />\n                }\n              }\n\n              <!-- Whisker line (min to max) -->\n              <line\n                [attr.x1]=\"item.centerX\"\n                [attr.x2]=\"item.centerX\"\n                [attr.y1]=\"yPos(item.box.min)\"\n                [attr.y2]=\"yPos(item.box.max)\"\n                [attr.stroke]=\"item.color\"\n                stroke-width=\"1\"\n                class=\"whisker-line\"\n              />\n\n              <!-- Q1-Q3 Box -->\n              <rect\n                [attr.x]=\"item.centerX - 4\"\n                [attr.y]=\"yPos(item.box.q3)\"\n                [attr.width]=\"8\"\n                [attr.height]=\"Math.max(2, yPos(item.box.q1) - yPos(item.box.q3))\"\n                [attr.fill]=\"'#1e293b'\"\n                [attr.stroke]=\"item.color\"\n                stroke-width=\"1\"\n                class=\"box-rect\"\n              />\n\n              <!-- Median Dot marker -->\n              <circle\n                [attr.cx]=\"item.centerX\"\n                [attr.cy]=\"yPos(item.box.median)\"\n                [attr.r]=\"3\"\n                fill=\"#ffffff\"\n                class=\"median-dot\"\n              />\n\n              <!-- Column Category Labels at bottom -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"item.centerX\"\n                  [attr.y]=\"innerH() + 18\"\n                  text-anchor=\"middle\"\n                  class=\"x-axis-label\"\n                >\n                  {{ item.label }}\n                </text>\n              }\n            </g>\n          }\n\n          <!-- Y Axis (Left side) -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- Bottom X Axis Line -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-name\">Samples</span>\n            <span class=\"tt-val\">{{ t.count }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Max</span>\n            <span class=\"tt-val\">{{ formatNumber(t.box.max) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Q3</span>\n            <span class=\"tt-val\">{{ formatNumber(t.box.q3) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: #ffffff; border: 1.5px solid var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Median</span>\n            <span class=\"tt-val\">{{ formatNumber(t.box.median) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Q1</span>\n            <span class=\"tt-val\">{{ formatNumber(t.box.q1) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Min</span>\n            <span class=\"tt-val\">{{ formatNumber(t.box.min) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-violin-plot {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .violin-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label, .x-axis-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .violin-path {\n      transition: fill-opacity 0.2s ease, stroke-width 0.2s ease;\n      cursor: pointer;\n      transform-origin: bottom;\n      animation: violinScaleIn 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;\n    }\n    @keyframes violinScaleIn {\n      from { transform: scaleX(0); opacity: 0; }\n      to { transform: scaleX(1); opacity: 1; }\n    }\n    .jitter-point {\n      animation: pointFadeIn 0.5s ease forwards;\n      opacity: 0;\n    }\n    @keyframes pointFadeIn {\n      from { opacity: 0; transform: scale(0); }\n      to { opacity: 1; transform: scale(1); }\n    }\n    .violin-group {\n      transition: opacity 0.2s ease;\n    }\n    .violin-group.dimmed {\n      opacity: 0.3;\n    }\n    .violin-group.highlighted .violin-path {\n      fill-opacity: 0.5;\n      stroke-width: 2.5;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export Trigger & Dropdown */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class ViolinPlotComponent {\n  data = input<ViolinItem[]>([]);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showPoints = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  getJitterOffset(val: number, index: number, centerX: number): number {\n    return Math.sin(val * 1000 + index) * 12;\n  }\n\n  readonly Math = Math;\n\n  margin = computed(() => ({\n    top: 20,\n    right: 20,\n    bottom: this.showLabels() ? 30 : 10,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Bounds\n  bounds = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return { min: 0, max: 100 };\n    const allValues = raw.flatMap(d => d.values);\n    if (allValues.length === 0) return { min: 0, max: 100 };\n    const min = Math.min(...allValues);\n    const max = Math.max(...allValues);\n    const pad = (max - min) * 0.1 || 10;\n    return {\n      min: Math.max(0, min - pad),\n      max: max + pad\n    };\n  });\n\n  yTicks = computed(() => {\n    const b = this.bounds();\n    return niceTicks(b.min, b.max, 5);\n  });\n\n  domainMax = computed(() => {\n    const t = this.yTicks();\n    return t[t.length - 1] || 100;\n  });\n\n  domainMin = computed(() => {\n    const t = this.yTicks();\n    return t[0] || 0;\n  });\n\n  yPos(val: number): number {\n    return scale(val, this.domainMin(), this.domainMax(), this.innerH(), 0);\n  }\n\n  colWidth = computed(() => {\n    const count = this.data().length || 1;\n    return this.innerW() / count;\n  });\n\n  computedItems = computed(() => {\n    const raw = this.data();\n    const count = raw.length;\n    if (count === 0) return [];\n\n    const colW = this.colWidth();\n    const minVal = this.domainMin();\n    const maxVal = this.domainMax();\n    const palette = this.colors();\n\n    // Symmetrical Violin calculation using Gaussian KDE\n    return raw.map((item, idx) => {\n      const color = item.color || palette[idx % palette.length];\n      const centerX = colW * idx + colW / 2;\n\n      // 1. Calculate statistical box coordinates (min, q1, median, q3, max)\n      const sorted = [...item.values].sort((a, b) => a - b);\n      const valCount = sorted.length;\n      let min = 0, q1 = 0, median = 0, q3 = 0, max = 0;\n\n      if (valCount > 0) {\n        min = sorted[0];\n        max = sorted[valCount - 1];\n        median = this.getPercentile(sorted, 50);\n        q1 = this.getPercentile(sorted, 25);\n        q3 = this.getPercentile(sorted, 75);\n      }\n\n      // 2. Compute Gaussian KDE curve\n      // Estimate optimal bandwidth (Silverman's rule of thumb)\n      const stdDev = this.getStdDev(item.values, median);\n      const bandwidth = 0.9 * Math.min(stdDev, (q3 - q1) / 1.34) * Math.pow(valCount, -0.2) || 1.0;\n\n      // Sample points along the vertical y-axis\n      const sampleCount = 40;\n      const densityPoints: { value: number; density: number }[] = [];\n\n      for (let s = 0; s <= sampleCount; s++) {\n        // Value mapping along domain\n        const v = minVal + (s / sampleCount) * (maxVal - minVal);\n        const density = this.kernelDensityEstimator(item.values, v, bandwidth);\n        densityPoints.push({ value: v, density });\n      }\n\n      // Find max density value for scaling the width of the violin\n      const maxDensity = Math.max(...densityPoints.map(p => p.density)) || 1.0;\n      // Allow violin to fill up to 85% of its column width\n      const maxHalfWidth = (colW * 0.42);\n\n      // Build symmetrical closed SVG path\n      // Curve flows from bottom min to top max on the right, and then down on the left\n      const rightPoints: string[] = [];\n      const leftPoints: string[] = [];\n\n      densityPoints.forEach(p => {\n        const y = this.yPos(p.value);\n        const widthOffset = (p.density / maxDensity) * maxHalfWidth;\n\n        const rx = centerX + widthOffset;\n        const lx = centerX - widthOffset;\n\n        rightPoints.push(`${rx},${y}`);\n        leftPoints.unshift(`${lx},${y}`); // Prepended to loop back down symmetrically\n      });\n\n      const pathString = `M ${centerX},${this.yPos(minVal)} L ` +\n        rightPoints.join(' L ') + ` L ${centerX},${this.yPos(maxVal)} L ` +\n        leftPoints.join(' L ') + ' Z';\n\n      return {\n        label: item.label,\n        values: item.values,\n        count: valCount,\n        color,\n        centerX,\n        box: { min, q1, median, q3, max },\n        path: pathString\n      };\n    });\n  });\n\n  // Gaussian Kernel function\n  private kernelDensityEstimator(samples: number[], x: number, bandwidth: number): number {\n    const n = samples.length;\n    if (n === 0) return 0;\n    let sum = 0;\n    for (let i = 0; i < n; i++) {\n      const u = (x - samples[i]) / bandwidth;\n      // Gaussian kernel: K(u) = (1/sqrt(2*pi)) * exp(-0.5 * u^2)\n      const kernel = (1 / Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * u * u);\n      sum += kernel;\n    }\n    return sum / (n * bandwidth);\n  }\n\n  // StdDev calculation helper\n  private getStdDev(values: number[], mean: number): number {\n    const n = values.length;\n    if (n <= 1) return 1.0;\n    const sqDiffs = values.map(v => Math.pow(v - mean, 2));\n    const sum = sqDiffs.reduce((acc, curr) => acc + curr, 0);\n    return Math.sqrt(sum / (n - 1));\n  }\n\n  // Percentile calculation helper\n  private getPercentile(sorted: number[], pct: number): number {\n    const n = sorted.length;\n    const index = (pct / 100) * (n - 1);\n    const low = Math.floor(index);\n    const high = Math.ceil(index);\n    if (low === high) return sorted[low];\n    return sorted[low] + (index - low) * (sorted[high] - sorted[low]);\n  }\n\n  onItemHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const item = this.computedItems()[idx];\n    if (item) {\n      this.tooltip.set(item);\n    }\n  }\n\n  onItemMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-violin-plot');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'violin-plot.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    let csv = 'Label,Value\\n';\n    data.forEach(d => {\n      (d.values || []).forEach(val => {\n        csv += `\"${d.label || ''}\",${val}\\n`;\n      });\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'violin-plot.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'violin-plot.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const serializer = new XMLSerializer();\n    let svgString = serializer.serializeToString(svg);\n    if (!svgString.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      svgString = svgString.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Chart Export</title>\n          <style>\n            body {\n              margin: 20px;\n              font-family: system-ui, sans-serif;\n              text-align: center;\n            }\n            .print-container {\n              display: inline-block;\n              margin: 0 auto;\n            }\n            svg {\n              width: 100%;\n              height: auto;\n            }\n            @media print {\n              body { margin: 0; }\n              .no-print { display: none; }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${svgString}\n          </div>\n          <script>\n            window.onload = () => {\n              setTimeout(() => {\n                window.print();\n                window.close();\n              }, 250);\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild, HostListener\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale, generateUniqueId } from '../shared/chart-utils';\n\nexport interface RidgelineItem {\n  label: string;\n  values: number[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-ridgeline-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-ridgeline-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"ridgeline-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <defs>\n          @if (useGradient()) {\n            @for (item of computedItems(); track item.label; let i = $index) {\n              <linearGradient [attr.id]=\"instanceId + '-ridgeline-grad-' + i\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n                <stop offset=\"0%\" stop-color=\"#3b82f6\" stop-opacity=\"0.5\" />\n                <stop offset=\"50%\" [attr.stop-color]=\"item.color\" stop-opacity=\"0.5\" />\n                <stop offset=\"100%\" stop-color=\"#ef4444\" stop-opacity=\"0.5\" />\n              </linearGradient>\n            }\n          }\n        </defs>\n\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- X Grid Lines (Vertical reference grid) -->\n          @if (showGrid()) {\n            @for (tick of xTicks(); track tick) {\n              <line\n                [attr.x1]=\"xPos(tick)\"\n                [attr.x2]=\"xPos(tick)\"\n                [attr.y1]=\"0\"\n                [attr.y2]=\"innerH()\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Ridgeline stack (Rendered in reverse order so bottom rows overlap correctly on top of top rows) -->\n          @for (item of computedItems(); track item.label; let i = $index) {\n            <g\n              class=\"ridgeline-row\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onRowHover(i, $event)\"\n              (mousemove)=\"onRowMouseMove($event)\"\n            >\n              <!-- Baseline for each row -->\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"item.baselineY\"\n                [attr.y2]=\"item.baselineY\"\n                class=\"row-baseline\"\n              />\n\n              <!-- Shaded density area under the curve -->\n              <path\n                [attr.d]=\"item.areaPath\"\n                [attr.fill]=\"useGradient() ? 'url(#' + instanceId + '-ridgeline-grad-' + i + ')' : item.color\"\n                [attr.fill-opacity]=\"useGradient() ? 1.0 : 0.4\"\n                class=\"density-area\"\n              />\n\n              <!-- Top stroke line outlining the curve -->\n              <path\n                [attr.d]=\"item.linePath\"\n                [attr.stroke]=\"item.color\"\n                stroke-width=\"2\"\n                fill=\"none\"\n                class=\"density-line\"\n              />\n\n              <!-- Row label on Y Axis (Left side) -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"-12\"\n                  [attr.y]=\"item.baselineY - 4\"\n                  text-anchor=\"end\"\n                  class=\"y-axis-label\"\n                >\n                  {{ item.label }}\n                </text>\n              }\n            </g>\n          }\n\n          <!-- Bottom X Axis (Ticks and grid labels at bottom) -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n            @for (tick of xTicks(); track tick) {\n              <g [attr.transform]=\"'translate(' + xPos(tick) + ',0)'\">\n                <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"4\" class=\"tick-line\" />\n                <text\n                  [attr.y]=\"16\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-name\">Samples</span>\n            <span class=\"tt-val\">{{ t.count }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Median Value</span>\n            <span class=\"tt-val\">{{ formatNumber(t.median) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: var(--ngx-chart-axis, #94a3b8);\"></span>\n            <span class=\"tt-name\">Min / Max</span>\n            <span class=\"tt-val\">{{ formatNumber(t.min) }} - {{ formatNumber(t.max) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-ridgeline-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 12px;\n    }\n    .ridgeline-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .y-axis-label {\n      font-size: 12px;\n      fill: var(--ngx-chart-axis-text, #334155);\n      font-weight: 600;\n      user-select: none;\n    }\n    .row-baseline {\n      stroke: var(--ngx-chart-grid, #e2e8f0);\n      stroke-width: 1;\n      stroke-dasharray: 2,2;\n    }\n    .density-area, .density-line {\n      animation: ridgelineWipeIn 1s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      clip-path: inset(0 100% 0 0);\n    }\n    @keyframes ridgelineWipeIn {\n      to { clip-path: inset(0 0 0 0); }\n    }\n    .density-area {\n      transition: fill-opacity 0.2s ease;\n      cursor: pointer;\n    }\n    .density-line {\n      transition: stroke-width 0.2s ease;\n      cursor: pointer;\n    }\n    .ridgeline-row {\n      transition: opacity 0.2s ease;\n    }\n    .ridgeline-row.dimmed {\n      opacity: 0.2;\n    }\n    .ridgeline-row.highlighted .density-area {\n      fill-opacity: 0.65;\n    }\n    .ridgeline-row.highlighted .density-line {\n      stroke-width: 3.5;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class RidgelineChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly instanceId = generateUniqueId('chart');\n  data = input<RidgelineItem[]>([]);\n  height = input<number>(400);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  useGradient = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  overlap = input<number>(1.6); // Stack overlap ratio multiplier\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 40,\n    right: 20,\n    bottom: 30,\n    left: this.showLabels() ? 90 : 20\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Bounds\n  bounds = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return { min: 0, max: 100 };\n    const allValues = raw.flatMap(d => d.values);\n    if (allValues.length === 0) return { min: 0, max: 100 };\n    const min = Math.min(...allValues);\n    const max = Math.max(...allValues);\n    const span = max - min || 10;\n    return {\n      min: Math.max(0, min - span * 0.05),\n      max: max + span * 0.05\n    };\n  });\n\n  xTicks = computed(() => {\n    const b = this.bounds();\n    return niceTicks(b.min, b.max, 5);\n  });\n\n  xDomain = computed(() => {\n    const ticks = this.xTicks();\n    return {\n      min: ticks[0] ?? 0,\n      max: ticks[ticks.length - 1] ?? 100\n    };\n  });\n\n  xPos(val: number): number {\n    const domain = this.xDomain();\n    return scale(val, domain.min, domain.max, 0, this.innerW());\n  }\n\n  computedItems = computed(() => {\n    const raw = this.data();\n    const count = raw.length;\n    if (count === 0) return [];\n\n    const domain = this.xDomain();\n    const baseH = this.innerH();\n    const overlapFactor = this.overlap();\n    const palette = this.colors();\n\n    // Row separation height calculation\n    const rowStep = baseH / (count + overlapFactor - 1);\n    const maxKdeHeight = rowStep * overlapFactor;\n\n    return raw.map((item, idx) => {\n      const color = item.color || palette[idx % palette.length];\n      \n      // baselineY calculation: stack bottom-to-top\n      const baselineY = baseH - idx * rowStep;\n\n      // Basic stats calculation for tooltip details\n      const sorted = [...item.values].sort((a, b) => a - b);\n      const valCount = sorted.length;\n      const min = valCount > 0 ? sorted[0] : 0;\n      const max = valCount > 0 ? sorted[valCount - 1] : 0;\n      const median = valCount > 0 ? sorted[Math.floor(valCount / 2)] : 0;\n\n      // Bandwidth estimation using Silverman's rule of thumb\n      const q1 = sorted[Math.floor(valCount * 0.25)] || 0;\n      const q3 = sorted[Math.floor(valCount * 0.75)] || 0;\n      const stdDev = this.getStdDev(item.values, median);\n      const bandwidth = 0.9 * Math.min(stdDev, (q3 - q1) / 1.34) * Math.pow(valCount, -0.2) || 1.0;\n\n      // Sample density along horizontal X scale\n      const sampleCount = 50;\n      const densityPoints: { xCoord: number; yOffset: number }[] = [];\n\n      for (let s = 0; s <= sampleCount; s++) {\n        const v = domain.min + (s / sampleCount) * (domain.max - domain.min);\n        const xCoord = this.xPos(v);\n        const density = this.kernelDensityEstimator(item.values, v, bandwidth);\n        densityPoints.push({ xCoord, yOffset: density });\n      }\n\n      const maxDensity = Math.max(...densityPoints.map(p => p.yOffset)) || 1.0;\n\n      // Build path points\n      const points: string[] = [];\n      densityPoints.forEach(p => {\n        const heightOffset = (p.yOffset / maxDensity) * maxKdeHeight;\n        const yCoord = baselineY - heightOffset;\n        points.push(`${p.xCoord},${yCoord}`);\n      });\n\n      // areaPath starts at bottom-left corner, sweeps across curve, and closes at bottom-right\n      const areaPath = `M 0,${baselineY} L ` + points.join(' L ') + ` L ${this.innerW()},${baselineY} Z`;\n      const linePath = `M ` + points.join(' L ');\n\n      return {\n        label: item.label,\n        count: valCount,\n        min,\n        max,\n        median,\n        color,\n        baselineY,\n        areaPath,\n        linePath\n      };\n    });\n  });\n\n  private kernelDensityEstimator(samples: number[], x: number, bandwidth: number): number {\n    const n = samples.length;\n    if (n === 0) return 0;\n    let sum = 0;\n    for (let i = 0; i < n; i++) {\n      const u = (x - samples[i]) / bandwidth;\n      const kernel = (1 / Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * u * u);\n      sum += kernel;\n    }\n    return sum / (n * bandwidth);\n  }\n\n  private getStdDev(values: number[], mean: number): number {\n    const n = values.length;\n    if (n <= 1) return 1.0;\n    const sqDiffs = values.map(v => Math.pow(v - mean, 2));\n    const sum = sqDiffs.reduce((acc, curr) => acc + curr, 0);\n    return Math.sqrt(sum / (n - 1));\n  }\n\n  onRowHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const item = this.computedItems()[idx];\n    if (item) {\n      this.tooltip.set(item);\n    }\n  }\n\n  onRowMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-ridgeline-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'ridgeline-chart.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Value'];\n    const rows: (string | number)[][] = [];\n    data.forEach(d => {\n      (d.values || []).forEach(val => {\n        rows.push([d.label || '', val]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'ridgeline-chart.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface ParetoItem {\n  label: string;\n  value: number;\n}\n\n@Component({\n  selector: 'ngx-pareto-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-pareto-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"pareto-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines (Horizontal reference grid scaled to left Y Axis) -->\n          @if (showGrid()) {\n            @for (tick of leftYTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yLeftPos(tick)\"\n                [attr.y2]=\"yLeftPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Bars (Raw Values) -->\n          @for (item of computedItems(); track item.label; let i = $index) {\n            <rect\n              [attr.x]=\"item.barX\"\n              [attr.y]=\"yLeftPos(item.value)\"\n              [attr.width]=\"barWidth()\"\n              [attr.height]=\"Math.max(2, innerH() - yLeftPos(item.value))\"\n              [attr.fill]=\"barColor()\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              (mouseenter)=\"onItemHover(i, $event)\"\n              (mousemove)=\"onItemMouseMove($event)\"\n              class=\"pareto-bar\"\n              rx=\"4\"\n            />\n          }\n\n          <!-- Cumulative Percentage Line -->\n          @if (computedItems().length > 0) {\n            <path\n              [attr.d]=\"linePath()\"\n              [attr.stroke]=\"lineColor()\"\n              stroke-width=\"3\"\n              fill=\"none\"\n              stroke-linecap=\"round\"\n              class=\"pareto-line\"\n            />\n\n            <!-- Line Node Circles -->\n            @for (item of computedItems(); track item.label; let i = $index) {\n              <circle\n                [attr.cx]=\"item.centerX\"\n                [attr.cy]=\"yRightPos(item.cumPct)\"\n                [attr.r]=\"hoveredIndex() === i ? 6 : 4\"\n                [attr.fill]=\"lineColor()\"\n                [attr.stroke]=\"'#ffffff'\"\n                stroke-width=\"1.5\"\n                [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n                (mouseenter)=\"onItemHover(i, $event)\"\n                (mousemove)=\"onItemMouseMove($event)\"\n                class=\"pareto-dot\"\n              />\n              @if (showCumPercentLabels()) {\n                <text\n                  [attr.x]=\"item.centerX\"\n                  [attr.y]=\"yRightPos(item.cumPct) - 10\"\n                  text-anchor=\"middle\"\n                  class=\"cum-pct-label\"\n                  [attr.fill]=\"lineColor()\"\n                >\n                  {{ item.cumPct.toFixed(0) }}%\n                </text>\n              }\n            }\n          }\n\n          <!-- Y1 Axis (Left side - Raw Values) -->\n          <g class=\"y-axis left-y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of leftYTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yLeftPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- Y2 Axis (Right side - Cumulative Percentage) -->\n          <g [attr.transform]=\"'translate(' + innerW() + ',0)'\" class=\"y-axis right-y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of rightYTicks; track tick) {\n              <g [attr.transform]=\"'translate(0,' + yRightPos(tick) + ')'\">\n                <line [attr.x1]=\"0\" [attr.x2]=\"4\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"8\"\n                  text-anchor=\"start\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ tick }}%\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- X Axis (Bottom labels) -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n            @if (showLabels()) {\n              @for (item of computedItems(); track item.label) {\n                <text\n                  [attr.x]=\"item.centerX\"\n                  [attr.y]=\"18\"\n                  text-anchor=\"middle\"\n                  class=\"x-axis-label\"\n                >\n                  {{ item.label }}\n                </text>\n              }\n            }\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"barColor()\"></span>\n            <span class=\"tt-name\">Value</span>\n            <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Percent Contribution</span>\n            <span class=\"tt-val\">{{ t.pct.toFixed(1) }}%</span>\n          </div>\n          <div class=\"tt-row delta-row\">\n            <span class=\"tt-dot\" [style.background]=\"lineColor()\"></span>\n            <span class=\"tt-name\">Cumulative %</span>\n            <span class=\"tt-val\">{{ t.cumPct.toFixed(1) }}%</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-pareto-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .pareto-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label, .x-axis-label, .cum-pct-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .cum-pct-label {\n      font-size: 10px;\n      font-weight: 600;\n    }\n    .pareto-bar {\n      transition: fill-opacity 0.2s ease, opacity 0.2s ease;\n      cursor: pointer;\n      transform-origin: bottom;\n      animation: paretoBarGrow 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    @keyframes paretoBarGrow {\n      from { transform: scaleY(0); }\n      to { transform: scaleY(1); }\n    }\n    .pareto-bar.dimmed, .pareto-dot.dimmed {\n      opacity: 0.3;\n    }\n    .pareto-bar:hover {\n      fill-opacity: 0.85;\n    }\n    .pareto-line {\n      stroke-dasharray: 1000;\n      stroke-dashoffset: 1000;\n      animation: drawLine 1s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      pointer-events: none;\n    }\n    .pareto-dot, .cum-pct-label {\n      cursor: pointer;\n      transition: r 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 0.2s ease;\n      animation: fadeIn 0.4s ease-out 0.8s forwards;\n      opacity: 0;\n    }\n    @keyframes fadeIn {\n      to { opacity: 1; }\n    }\n    @keyframes drawLine {\n      to {\n        stroke-dashoffset: 0;\n      }\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 180px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .delta-row {\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      margin-top: 6px;\n      padding-top: 6px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class ParetoChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<ParetoItem[]>([]);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showCumPercentLabels = input<boolean>(true);\n  barColor = input<string>('#4a90d9');\n  lineColor = input<string>('#ff6358');\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  readonly Math = Math;\n\n  margin = computed(() => ({\n    top: 30,\n    right: 50,\n    bottom: this.showLabels() ? 30 : 10,\n    left: 50\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Sorted and processed items\n  computedItems = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n\n    // Sort descending by value (Standard Pareto rule)\n    const sorted = [...raw].sort((a, b) => b.value - a.value);\n    const total = sorted.reduce((acc, curr) => acc + curr.value, 0) || 1;\n\n    const count = sorted.length;\n    const colW = this.innerW() / count;\n    const bW = colW * 0.7;\n\n    let runningSum = 0;\n\n    return sorted.map((item, idx) => {\n      runningSum += item.value;\n      const pct = (item.value / total) * 100;\n      const cumPct = (runningSum / total) * 100;\n\n      const centerX = colW * idx + colW / 2;\n      const barX = colW * idx + (colW - bW) / 2;\n\n      return {\n        ...item,\n        pct,\n        cumPct,\n        centerX,\n        barX\n      };\n    });\n  });\n\n  // Scales for left Y Axis (Values) and right Y Axis (Percentages: 0-100%)\n  maxLeftVal = computed(() => {\n    const items = this.computedItems();\n    if (items.length === 0) return 100;\n    return Math.max(...items.map(d => d.value), 0);\n  });\n\n  leftYTicks = computed(() => {\n    const max = this.maxLeftVal();\n    return niceTicks(0, max, 5);\n  });\n\n  leftYDomainMax = computed(() => {\n    const ticks = this.leftYTicks();\n    return ticks[ticks.length - 1] || 100;\n  });\n\n  rightYTicks = [0, 20, 40, 60, 80, 100];\n\n  yLeftPos(val: number): number {\n    return scale(val, 0, this.leftYDomainMax(), this.innerH(), 0);\n  }\n\n  yRightPos(val: number): number {\n    return scale(val, 0, 100, this.innerH(), 0);\n  }\n\n  barWidth = computed(() => {\n    const count = this.computedItems().length || 1;\n    return (this.innerW() / count) * 0.7;\n  });\n\n  // Connecting cumulative percentage lines path generator\n  linePath = computed(() => {\n    const items = this.computedItems();\n    if (items.length === 0) return '';\n    \n    return items.map((item, idx) => {\n      const x = item.centerX;\n      const y = this.yRightPos(item.cumPct);\n      return `${idx === 0 ? 'M' : 'L'} ${x} ${y}`;\n    }).join(' ');\n  });\n\n  onItemHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const item = this.computedItems()[idx];\n    if (item) {\n      this.tooltip.set(item);\n    }\n  }\n\n  onItemMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-pareto-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'pareto-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    const cum = this.computedItems();\n    if (!data.length) return;\n    const headers = ['Label', 'Value', 'CumulativePercentage'];\n    const rows = cum.map(d => [d.label, d.value, d.cumPct]);\n    this.exportSvc.downloadCsv(headers, rows, 'pareto-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface MarimekkoSegment {\n  name: string;\n  value: number;\n}\n\nexport interface MarimekkoItem {\n  label: string;\n  segments: MarimekkoSegment[];\n}\n\ninterface ProcessedSegment {\n  name: string;\n  value: number;\n  color: string;\n  y: number;\n  height: number;\n  pctOfCol: number;\n  pctOfTotal: number;\n  colIndex: number;\n  segIndex: number;\n}\n\ninterface ProcessedCol {\n  label: string;\n  x: number;\n  width: number;\n  total: number;\n  pctOfTotal: number;\n  segments: ProcessedSegment[];\n}\n\n@Component({\n  selector: 'ngx-marimekko-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-marimekko-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"marimekko-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines (Horizontal percentage lines) -->\n          @if (showGrid()) {\n            @for (pct of gridPercentages; track pct) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(pct)\"\n                [attr.y2]=\"yPos(pct)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Columns & Segments -->\n          @for (col of computedCols(); track col.label; let i = $index) {\n            <g class=\"marimekko-col-group\">\n              @for (seg of col.segments; track seg.name; let j = $index) {\n                <g class=\"marimekko-rect-group\">\n                  <rect\n                    [attr.x]=\"col.x\"\n                    [attr.y]=\"seg.y\"\n                    [attr.width]=\"col.width\"\n                    [attr.height]=\"seg.height\"\n                    [attr.fill]=\"seg.color\"\n                    class=\"marimekko-segment\"\n                    [class.dimmed]=\"hoveredIndices() !== null && (hoveredIndices()!.col !== i || hoveredIndices()!.seg !== j)\"\n                    (mouseenter)=\"onSegmentHover(i, j, $event)\"\n                    (mousemove)=\"onSegmentMouseMove($event)\"\n                    stroke=\"#ffffff\"\n                    stroke-width=\"1.5\"\n                    [style.animation-delay]=\"(i * 0.15) + 's'\"\n                  />\n                  @if (showSegmentLabels() && col.width > 40 && seg.height > 16) {\n                    <text\n                      [attr.x]=\"col.x + col.width / 2\"\n                      [attr.y]=\"seg.y + seg.height / 2\"\n                      text-anchor=\"middle\"\n                      dominant-baseline=\"middle\"\n                      class=\"segment-label\"\n                      [style.animation-delay]=\"(0.6 + i * 0.15) + 's'\"\n                    >\n                      {{ seg.pctOfCol.toFixed(0) }}%\n                    </text>\n                  }\n                </g>\n              }\n\n              <!-- Bottom Column Labels (Only render if column width is greater than 16px) -->\n              @if (showLabels() && col.width > 16) {\n                <text\n                  [attr.x]=\"col.x + col.width / 2\"\n                  [attr.y]=\"innerH() + 18\"\n                  text-anchor=\"middle\"\n                  class=\"x-axis-label\"\n                >\n                  {{ col.label }}\n                </text>\n              }\n            </g>\n          }\n\n          <!-- Y Axis (Left side - Percentage) -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (pct of gridPercentages; track pct) {\n              <g [attr.transform]=\"'translate(0,' + yPos(pct) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ pct }}%\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- X Axis (Bottom boundary line) -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.colLabel }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <span class=\"tt-name\">{{ t.name }}</span>\n            <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">% of Column</span>\n            <span class=\"tt-val\">{{ t.pctOfCol.toFixed(1) }}%</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">% of Total Market</span>\n            <span class=\"tt-val\">{{ t.pctOfTotal.toFixed(1) }}%</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-marimekko-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .marimekko-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label, .x-axis-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .marimekko-segment {\n      transition: fill-opacity 0.2s ease, opacity 0.2s ease;\n      cursor: pointer;\n      transform-origin: bottom;\n      animation: marimekkoScaleUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      opacity: 0;\n    }\n    @keyframes marimekkoScaleUp {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n    .segment-label {\n      font-size: 10px;\n      fill: #ffffff;\n      pointer-events: none;\n      font-weight: 600;\n      animation: fadeIn 0.4s ease-out forwards;\n      opacity: 0;\n    }\n    @keyframes fadeIn {\n      to { opacity: 1; }\n    }\n    .marimekko-segment.dimmed {\n      opacity: 0.35;\n    }\n    .marimekko-segment:hover {\n      fill-opacity: 0.9;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 180px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class MarimekkoChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<MarimekkoItem[]>([]);\n  height = input<number>(400);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showSegmentLabels = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredIndices = signal<{ col: number; seg: number } | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 20,\n    bottom: this.showLabels() ? 30 : 10,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  gridPercentages = [0, 25, 50, 75, 100];\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  yPos(pct: number): number {\n    return scale(pct, 0, 100, this.innerH(), 0);\n  }\n\n  computedCols = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n\n    const grandTotal = raw.reduce((acc, col) => {\n      const colSum = col.segments.reduce((s, seg) => s + seg.value, 0);\n      return acc + colSum;\n    }, 0) || 1;\n\n    const w = this.innerW();\n    const h = this.innerH();\n    const palette = this.colors();\n\n    let xOffset = 0;\n\n    return raw.map((col, cIdx) => {\n      const colTotal = col.segments.reduce((s, seg) => s + seg.value, 0);\n      const colWidthPct = colTotal / grandTotal;\n      const colWidth = colWidthPct * w;\n\n      const colX = xOffset;\n      xOffset += colWidth;\n\n      let yOffset = h;\n\n      const segments = col.segments.map((seg, sIdx) => {\n        const segHeightPct = colTotal > 0 ? (seg.value / colTotal) : 0;\n        const segHeight = segHeightPct * h;\n\n        yOffset -= segHeight;\n        const color = palette[(sIdx + cIdx) % palette.length];\n\n        return {\n          name: seg.name,\n          value: seg.value,\n          color,\n          y: yOffset,\n          height: segHeight,\n          pctOfCol: segHeightPct * 100,\n          pctOfTotal: (seg.value / grandTotal) * 100,\n          colIndex: cIdx,\n          segIndex: sIdx\n        };\n      });\n\n      return {\n        label: col.label,\n        x: colX,\n        width: colWidth,\n        total: colTotal,\n        pctOfTotal: colWidthPct * 100,\n        segments\n      };\n    });\n  });\n\n  onSegmentHover(colIndex: number, segIndex: number, event: MouseEvent) {\n    this.hoveredIndices.set({ col: colIndex, seg: segIndex });\n    const col = this.computedCols()[colIndex];\n    if (col) {\n      const seg = col.segments[segIndex];\n      if (seg) {\n        this.tooltip.set({\n          colLabel: col.label,\n          name: seg.name,\n          value: seg.value,\n          color: seg.color,\n          pctOfCol: seg.pctOfCol,\n          pctOfTotal: seg.pctOfTotal\n        });\n      }\n    }\n  }\n\n  onSegmentMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-marimekko-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndices.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'marimekko-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Column_Label', 'Segment_Name', 'Value'];\n    const rows: (string | number)[][] = [];\n    data.forEach(col => {\n      col.segments.forEach(seg => {\n        rows.push([col.label || '', seg.name || '', seg.value]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'marimekko-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Marimekko Export', 'marimekko-chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface ChordItem {\n  labels: string[];\n  matrix: number[][];\n  colors?: string[];\n}\n\ninterface ProcessedNode {\n  index: number;\n  label: string;\n  color: string;\n  startAngle: number;\n  endAngle: number;\n  value: number;\n  path: string;\n  textX: number;\n  textY: number;\n  textAngle: number;\n  textAnchor: string;\n}\n\ninterface ProcessedRibbon {\n  sourceIndex: number;\n  targetIndex: number;\n  sourceLabel: string;\n  targetLabel: string;\n  value: number;\n  color: string;\n  path: string;\n}\n\n@Component({\n  selector: 'ngx-chord-diagram',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-chord-diagram\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"chord-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + (containerWidth() / 2) + ',' + (svgHeight() / 2) + ')'\">\n          \n          <!-- Inner Ribbons (Chords) -->\n          @for (rib of computedRibbons(); track rib.path; let i = $index) {\n            <path\n              [attr.d]=\"rib.path\"\n              [attr.fill]=\"rib.color\"\n              fill-opacity=\"0.35\"\n              [attr.stroke]=\"rib.color\"\n              stroke-opacity=\"0.5\"\n              stroke-width=\"0.5\"\n              class=\"chord-ribbon\"\n              [class.dimmed]=\"hoveredNodeIndex() !== null && hoveredNodeIndex() !== rib.sourceIndex && hoveredNodeIndex() !== rib.targetIndex\"\n              [class.highlighted]=\"hoveredRibbonIndex() === i || (hoveredNodeIndex() !== null && (hoveredNodeIndex() === rib.sourceIndex || hoveredNodeIndex() === rib.targetIndex))\"\n              (mouseenter)=\"onRibbonHover(i, $event)\"\n              (mousemove)=\"onMouseMove($event)\"\n            />\n          }\n\n          <!-- Outer Node Arcs -->\n          @for (node of computedNodes(); track node.index; let i = $index) {\n            <g\n              class=\"chord-node-group\"\n              [class.dimmed]=\"hoveredNodeIndex() !== null && hoveredNodeIndex() !== i\"\n              [class.highlighted]=\"hoveredNodeIndex() === i\"\n              (mouseenter)=\"onNodeHover(i)\"\n              (mousemove)=\"onMouseMove($event)\"\n            >\n              <!-- Outer Arc Rect Segment -->\n              <path\n                [attr.d]=\"node.path\"\n                [attr.fill]=\"node.color\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.5\"\n                class=\"node-arc\"\n              />\n\n              <!-- Outer Text Label -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"node.textX\"\n                  [attr.y]=\"node.textY\"\n                  [attr.transform]=\"'rotate(' + node.textAngle + ',' + node.textX + ',' + node.textY + ')'\"\n                  [attr.text-anchor]=\"node.textAnchor\"\n                  class=\"node-label\"\n                >\n                  {{ node.label }}\n                </text>\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (t.type === 'node') {\n            <div class=\"tt-cat\">{{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Total Flow</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n          } @else if (t.type === 'ribbon') {\n            <div class=\"tt-cat\">Flow Connection</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">{{ t.sourceLabel }} ➔ {{ t.targetLabel }}</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-chord-diagram {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chord-svg {\n      display: block;\n      overflow: visible;\n    }\n    .node-arc {\n      cursor: pointer;\n      transition: fill-opacity 0.2s ease, stroke-width 0.2s ease;\n      transform-origin: center;\n      animation: chordScaleIn 0.8s cubic-bezier(0.34, 1.3, 0.64, 1) forwards;\n    }\n    .node-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #334155);\n      font-weight: 600;\n      user-select: none;\n      pointer-events: none;\n    }\n    .chord-ribbon {\n      cursor: pointer;\n      transition: fill-opacity 0.2s ease, stroke-width 0.2s ease, opacity 0.2s ease;\n      transform-origin: center;\n      animation: chordScaleIn 1s cubic-bezier(0.34, 1.3, 0.64, 1) forwards;\n    }\n    @keyframes chordScaleIn {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .chord-ribbon.dimmed, .chord-node-group.dimmed {\n      opacity: 0.15;\n    }\n    .chord-ribbon.highlighted {\n      fill-opacity: 0.75;\n      stroke-width: 1.5;\n      stroke-opacity: 1;\n    }\n    .chord-node-group.highlighted .node-arc {\n      stroke-width: 2.5;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class ChordDiagramComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  matrix = input<number[][]>([]);\n  labels = input<string[]>([]);\n  height = input<number>(400);\n  showLabels = input<boolean>(true);\n  nodePadding = input<number>(0.04);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredNodeIndex = signal<number | null>(null);\n  hoveredRibbonIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  svgHeight = computed(() => this.height());\n\n  // Radius definitions\n  outerRadius = computed(() => Math.min(this.containerWidth(), this.svgHeight()) * 0.4 - 20);\n  innerRadius = computed(() => this.outerRadius() - 16);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Pre-calculate node arcs properties\n  computedNodes = computed<ProcessedNode[]>(() => {\n    const m = this.matrix();\n    const l = this.labels();\n    const count = m.length;\n    if (count === 0) return [];\n\n    const palette = this.colors();\n    const rOuter = this.outerRadius();\n    const rInner = this.innerRadius();\n\n    // 1. Calculate node totals\n    const nodeTotals = m.map((row, i) => {\n      let sum = 0;\n      for (let j = 0; j < count; j++) {\n        sum += m[i][j] + m[j][i];\n      }\n      return sum;\n    });\n\n    const grandTotal = nodeTotals.reduce((sum, v) => sum + v, 0) || 1;\n\n    // Allocate padding space between nodes\n    const padAngle = this.nodePadding();\n    const availAngle = 2 * Math.PI - padAngle * count;\n\n    let currentAngle = -Math.PI / 2; // Start at top center\n\n    return nodeTotals.map((val, idx) => {\n      const angleSweep = (val / grandTotal) * availAngle;\n      const startAngle = currentAngle;\n      const endAngle = startAngle + angleSweep;\n      currentAngle = endAngle + padAngle;\n\n      const label = l[idx] || `Node ${idx + 1}`;\n      const color = palette[idx % palette.length];\n\n      // Draw SVG arc path\n      const x1_o = rOuter * Math.cos(startAngle);\n      const y1_o = rOuter * Math.sin(startAngle);\n      const x2_o = rOuter * Math.cos(endAngle);\n      const y2_o = rOuter * Math.sin(endAngle);\n\n      const x1_i = rInner * Math.cos(endAngle);\n      const y1_i = rInner * Math.sin(endAngle);\n      const x2_i = rInner * Math.cos(startAngle);\n      const y2_i = rInner * Math.sin(startAngle);\n\n      const largeArc = angleSweep > Math.PI ? 1 : 0;\n      const path = `M ${x1_o} ${y1_o} A ${rOuter} ${rOuter} 0 ${largeArc} 1 ${x2_o} ${y2_o} L ${x1_i} ${y1_i} A ${rInner} ${rInner} 0 ${largeArc} 0 ${x2_i} ${y2_i} Z`;\n\n      // Label positioning on outer circumference\n      const labelAngle = startAngle + angleSweep / 2;\n      const textRadius = rOuter + 10;\n      const textX = textRadius * Math.cos(labelAngle);\n      const textY = textRadius * Math.sin(labelAngle);\n\n      // Rotate text correctly to read outwards\n      let textAngle = (labelAngle * 180) / Math.PI;\n      let textAnchor = 'start';\n      if (labelAngle > Math.PI / 2 || labelAngle < -Math.PI / 2) {\n        textAngle += 180;\n        textAnchor = 'end';\n      }\n\n      return {\n        index: idx,\n        label,\n        color,\n        startAngle,\n        endAngle,\n        value: val,\n        path,\n        textX,\n        textY,\n        textAngle,\n        textAnchor\n      };\n    });\n  });\n\n  // Pre-calculate inner ribbons (chords)\n  computedRibbons = computed<ProcessedRibbon[]>(() => {\n    const nodes = this.computedNodes();\n    const m = this.matrix();\n    const l = this.labels();\n    const count = m.length;\n    if (nodes.length === 0) return [];\n\n    const rInner = this.innerRadius();\n    const ribbons: ProcessedRibbon[] = [];\n\n    // Keep track of angle progress along each node's outer arc\n    const progressNodeStart = nodes.map(n => n.startAngle);\n    const progressNodeTotal = nodes.map(n => n.value || 1);\n    const progressNodeSweep = nodes.map(n => n.endAngle - n.startAngle);\n\n    for (let i = 0; i < count; i++) {\n      for (let j = i; j < count; j++) {\n        const flow_ij = m[i][j];\n        const flow_ji = m[j][i];\n        const totalFlow = flow_ij + flow_ji;\n        if (totalFlow === 0) continue;\n\n        // Node i: angle allocation for this specific chord relation\n        const sweep_i = (totalFlow / progressNodeTotal[i]) * progressNodeSweep[i];\n        const a1 = progressNodeStart[i];\n        const a2 = a1 + sweep_i;\n        progressNodeStart[i] = a2;\n\n        // Node j: angle allocation for this specific chord relation\n        const sweep_j = (totalFlow / progressNodeTotal[j]) * progressNodeSweep[j];\n        const b1 = progressNodeStart[j];\n        const b2 = b1 + sweep_j;\n        progressNodeStart[j] = b2;\n\n        // Draw Ribbon Path\n        const ax1 = rInner * Math.cos(a1);\n        const ay1 = rInner * Math.sin(a1);\n        const ax2 = rInner * Math.cos(a2);\n        const ay2 = rInner * Math.sin(a2);\n\n        const bx1 = rInner * Math.cos(b1);\n        const by1 = rInner * Math.sin(b1);\n        const bx2 = rInner * Math.cos(b2);\n        const by2 = rInner * Math.sin(b2);\n\n        // SVG Chord Ribbon Command: Arc at i, Bezier curve to j, Arc at j, Bezier curve back to i\n        const largeArc_i = (a2 - a1) > Math.PI ? 1 : 0;\n        const largeArc_j = (b2 - b1) > Math.PI ? 1 : 0;\n        const path = `M ${ax1} ${ay1} A ${rInner} ${rInner} 0 ${largeArc_i} 1 ${ax2} ${ay2} Q 0 0 ${bx1} ${by1} A ${rInner} ${rInner} 0 ${largeArc_j} 1 ${bx2} ${by2} Q 0 0 ${ax1} ${ay1} Z`;\n\n        ribbons.push({\n          sourceIndex: i,\n          targetIndex: j,\n          sourceLabel: l[i] || `Node ${i + 1}`,\n          targetLabel: l[j] || `Node ${j + 1}`,\n          value: totalFlow,\n          color: nodes[i].color,\n          path\n        });\n      }\n    }\n\n    return ribbons;\n  });\n\n  onNodeHover(idx: number) {\n    this.hoveredNodeIndex.set(idx);\n    const node = this.computedNodes()[idx];\n    if (node) {\n      this.tooltip.set({\n        type: 'node',\n        label: node.label,\n        value: node.value\n      });\n    }\n  }\n\n  onRibbonHover(idx: number, event: MouseEvent) {\n    this.hoveredRibbonIndex.set(idx);\n    const rib = this.computedRibbons()[idx];\n    if (rib) {\n      this.tooltip.set({\n        type: 'ribbon',\n        sourceLabel: rib.sourceLabel,\n        targetLabel: rib.targetLabel,\n        value: rib.value\n      });\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-chord-diagram');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredNodeIndex.set(null);\n    this.hoveredRibbonIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const matrix = this.matrix();\n    const labels = this.labels();\n    if (!matrix.length || !labels.length) return;\n    const data = [];\n    for (let r = 0; r < matrix.length; r++) {\n      for (let c = 0; c < matrix[r].length; c++) {\n        if (matrix[r][c] > 0) {\n          data.push({ source: labels[r], target: labels[c], weight: matrix[r][c] });\n        }\n      }\n    }\n    this.exportSvc.downloadJson(data, 'chord-data.json');\n  }\n\n  exportToCsv(): void {\n    const matrix = this.matrix();\n    const labels = this.labels();\n    if (!matrix.length || !labels.length) return;\n    const headers = ['Source', 'Target', 'Weight'];\n    const rows: (string | number)[][] = [];\n    for (let r = 0; r < matrix.length; r++) {\n      for (let c = 0; c < matrix[r].length; c++) {\n        if (matrix[r][c] > 0) {\n          rows.push([labels[r], labels[c], matrix[r][c]]);\n        }\n      }\n    }\n    this.exportSvc.downloadCsv(headers, rows, 'chord-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface DependencyItem {\n  labels: string[];\n  matrix: number[][];\n  colors?: string[];\n}\n\ninterface ProcessedNode {\n  index: number;\n  label: string;\n  color: string;\n  startAngle: number;\n  endAngle: number;\n  value: number;\n  path: string;\n  textX: number;\n  textY: number;\n  textAngle: number;\n  textAnchor: string;\n}\n\ninterface ProcessedDependency {\n  sourceIndex: number;\n  targetIndex: number;\n  sourceLabel: string;\n  targetLabel: string;\n  value: number;\n  color: string;\n  path: string;\n}\n\n@Component({\n  selector: 'ngx-dependency-wheel',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-dependency-wheel\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"wheel-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + (containerWidth() / 2) + ',' + (svgHeight() / 2) + ')'\">\n          \n          <!-- Tapered Dependency Ribbons -->\n          @for (dep of computedDependencies(); track dep.path; let i = $index) {\n            <path\n              [attr.d]=\"dep.path\"\n              [attr.fill]=\"dep.color\"\n              fill-opacity=\"0.3\"\n              [attr.stroke]=\"dep.color\"\n              stroke-opacity=\"0.4\"\n              stroke-width=\"0.5\"\n              class=\"dependency-ribbon\"\n              [class.dimmed]=\"hoveredNodeIndex() !== null && hoveredNodeIndex() !== dep.sourceIndex && hoveredNodeIndex() !== dep.targetIndex\"\n              [class.highlighted]=\"hoveredDependencyIndex() === i || (hoveredNodeIndex() !== null && (hoveredNodeIndex() === dep.sourceIndex || hoveredNodeIndex() === dep.targetIndex))\"\n              (mouseenter)=\"onDependencyHover(i, $event)\"\n              (mousemove)=\"onMouseMove($event)\"\n            />\n          }\n\n          <!-- Outer Circle Nodes -->\n          @for (node of computedNodes(); track node.index; let i = $index) {\n            <g\n              class=\"wheel-node-group\"\n              [class.dimmed]=\"hoveredNodeIndex() !== null && hoveredNodeIndex() !== i\"\n              [class.highlighted]=\"hoveredNodeIndex() === i\"\n              (mouseenter)=\"onNodeHover(i)\"\n              (mousemove)=\"onMouseMove($event)\"\n            >\n              <!-- Arc Segment -->\n              <path\n                [attr.d]=\"node.path\"\n                [attr.fill]=\"node.color\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.5\"\n                class=\"node-arc\"\n              />\n\n              <!-- Label -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"node.textX\"\n                  [attr.y]=\"node.textY\"\n                  [attr.transform]=\"'rotate(' + node.textAngle + ',' + node.textX + ',' + node.textY + ')'\"\n                  [attr.text-anchor]=\"node.textAnchor\"\n                  class=\"node-label\"\n                >\n                  {{ node.label }}\n                </text>\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (t.type === 'node') {\n            <div class=\"tt-cat\">{{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Total Weight</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n          } @else if (t.type === 'dependency') {\n            <div class=\"tt-cat\">Dependency</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">{{ t.sourceLabel }} depends on</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">{{ t.targetLabel }}</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-dependency-wheel {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .wheel-svg {\n      display: block;\n      overflow: visible;\n    }\n    .node-arc {\n      cursor: pointer;\n      transition: fill-opacity 0.2s ease, stroke-width 0.2s ease;\n      transform-origin: center;\n      animation: wheelScaleIn 0.8s cubic-bezier(0.34, 1.3, 0.64, 1) forwards;\n    }\n    .node-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #334155);\n      font-weight: 600;\n      user-select: none;\n      pointer-events: none;\n    }\n    .dependency-ribbon {\n      cursor: pointer;\n      transition: fill-opacity 0.2s ease, stroke-width 0.2s ease, opacity 0.2s ease;\n      transform-origin: center;\n      animation: wheelScaleIn 1s cubic-bezier(0.34, 1.3, 0.64, 1) forwards;\n    }\n    @keyframes wheelScaleIn {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .dependency-ribbon.dimmed, .wheel-node-group.dimmed {\n      opacity: 0.15;\n    }\n    .dependency-ribbon.highlighted {\n      fill-opacity: 0.7;\n      stroke-width: 1.5;\n      stroke-opacity: 0.9;\n    }\n    .wheel-node-group.highlighted .node-arc {\n      stroke-width: 2.5;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class DependencyWheelComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  matrix = input<number[][]>([]);\n  labels = input<string[]>([]);\n  height = input<number>(400);\n  showLabels = input<boolean>(true);\n  nodePadding = input<number>(0.04);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredNodeIndex = signal<number | null>(null);\n  hoveredDependencyIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  svgHeight = computed(() => this.height());\n\n  outerRadius = computed(() => Math.min(this.containerWidth(), this.svgHeight()) * 0.4 - 20);\n  innerRadius = computed(() => this.outerRadius() - 16);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Pre-calculate nodes layout\n  computedNodes = computed<ProcessedNode[]>(() => {\n    const m = this.matrix();\n    const l = this.labels();\n    const count = m.length;\n    if (count === 0) return [];\n\n    const palette = this.colors();\n    const rOuter = this.outerRadius();\n    const rInner = this.innerRadius();\n\n    // Sum of directed inputs & outputs representing node total dependency scale\n    const nodeTotals = m.map((row, i) => {\n      let outbound = row.reduce((sum, v) => sum + v, 0);\n      let inbound = 0;\n      for (let j = 0; j < count; j++) {\n        inbound += m[j][i];\n      }\n      return outbound + inbound;\n    });\n\n    const grandTotal = nodeTotals.reduce((sum, v) => sum + v, 0) || 1;\n    const padAngle = this.nodePadding();\n    const availAngle = 2 * Math.PI - padAngle * count;\n\n    let currentAngle = -Math.PI / 2;\n\n    return nodeTotals.map((val, idx) => {\n      const angleSweep = (val / grandTotal) * availAngle;\n      const startAngle = currentAngle;\n      const endAngle = startAngle + angleSweep;\n      currentAngle = endAngle + padAngle;\n\n      const label = l[idx] || `Node ${idx + 1}`;\n      const color = palette[idx % palette.length];\n\n      const x1_o = rOuter * Math.cos(startAngle);\n      const y1_o = rOuter * Math.sin(startAngle);\n      const x2_o = rOuter * Math.cos(endAngle);\n      const y2_o = rOuter * Math.sin(endAngle);\n\n      const x1_i = rInner * Math.cos(endAngle);\n      const y1_i = rInner * Math.sin(endAngle);\n      const x2_i = rInner * Math.cos(startAngle);\n      const y2_i = rInner * Math.sin(startAngle);\n\n      const largeArc = angleSweep > Math.PI ? 1 : 0;\n      const path = `M ${x1_o} ${y1_o} A ${rOuter} ${rOuter} 0 ${largeArc} 1 ${x2_o} ${y2_o} L ${x1_i} ${y1_i} A ${rInner} ${rInner} 0 ${largeArc} 0 ${x2_i} ${y2_i} Z`;\n\n      const labelAngle = startAngle + angleSweep / 2;\n      const textRadius = rOuter + 10;\n      const textX = textRadius * Math.cos(labelAngle);\n      const textY = textRadius * Math.sin(labelAngle);\n\n      let textAngle = (labelAngle * 180) / Math.PI;\n      let textAnchor = 'start';\n      if (labelAngle > Math.PI / 2 || labelAngle < -Math.PI / 2) {\n        textAngle += 180;\n        textAnchor = 'end';\n      }\n\n      return {\n        index: idx,\n        label,\n        color,\n        startAngle,\n        endAngle,\n        value: val,\n        path,\n        textX,\n        textY,\n        textAngle,\n        textAnchor\n      };\n    });\n  });\n\n  // Directed Tapered dependencies ribbon calculations\n  computedDependencies = computed<ProcessedDependency[]>(() => {\n    const nodes = this.computedNodes();\n    const m = this.matrix();\n    const l = this.labels();\n    const count = m.length;\n    if (nodes.length === 0) return [];\n\n    const rInner = this.innerRadius();\n    const dependencies: ProcessedDependency[] = [];\n\n    // Track starting offset angles for outbound dependencies of each source node\n    const progressNodeStart = nodes.map(n => n.startAngle);\n    const progressNodeTotal = m.map(row => row.reduce((sum, v) => sum + v, 0) || 1);\n    const progressNodeSweep = nodes.map(n => n.endAngle - n.startAngle);\n\n    for (let i = 0; i < count; i++) {\n      for (let j = 0; j < count; j++) {\n        if (i === j) continue; // Skip self-dependencies for clean rendering\n        const val = m[i][j];\n        if (val === 0) continue;\n\n        // Angle sweep width on source node i proportional to dependency value\n        const totalOutbound = progressNodeTotal[i];\n        // Outbound is allocated on the first half of node's total sweep angle\n        const sweep_i = (val / totalOutbound) * (progressNodeSweep[i] * 0.5);\n        const a1 = progressNodeStart[i];\n        const a2 = a1 + sweep_i;\n        progressNodeStart[i] = a2;\n\n        // Target node j center angle (tapers to a point at the center of destination's arc)\n        const targetSweep = nodes[j].endAngle - nodes[j].startAngle;\n        const targetAngle = nodes[j].startAngle + targetSweep * 0.75; // Align target points in target's second half\n\n        const ax1 = rInner * Math.cos(a1);\n        const ay1 = rInner * Math.sin(a1);\n        const ax2 = rInner * Math.cos(a2);\n        const ay2 = rInner * Math.sin(a2);\n\n        const bx = rInner * Math.cos(targetAngle);\n        const by = rInner * Math.sin(targetAngle);\n\n        // SVG Tapered path: Arc at source node, curved path converging at single destination point on the target node\n        const path = `M ${ax1} ${ay1} A ${rInner} ${rInner} 0 0 1 ${ax2} ${ay2} Q 0 0 ${bx} ${by} Q 0 0 ${ax1} ${ay1} Z`;\n\n        dependencies.push({\n          sourceIndex: i,\n          targetIndex: j,\n          sourceLabel: l[i] || `Node ${i + 1}`,\n          targetLabel: l[j] || `Node ${j + 1}`,\n          value: val,\n          color: nodes[i].color,\n          path\n        });\n      }\n    }\n\n    return dependencies;\n  });\n\n  onNodeHover(idx: number) {\n    this.hoveredNodeIndex.set(idx);\n    const node = this.computedNodes()[idx];\n    if (node) {\n      this.tooltip.set({\n        type: 'node',\n        label: node.label,\n        value: node.value\n      });\n    }\n  }\n\n  onDependencyHover(idx: number, event: MouseEvent) {\n    this.hoveredDependencyIndex.set(idx);\n    const dep = this.computedDependencies()[idx];\n    if (dep) {\n      this.tooltip.set({\n        type: 'dependency',\n        sourceLabel: dep.sourceLabel,\n        targetLabel: dep.targetLabel,\n        value: dep.value\n      });\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-dependency-wheel');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredNodeIndex.set(null);\n    this.hoveredDependencyIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const matrix = this.matrix();\n    const labels = this.labels();\n    if (!matrix.length || !labels.length) return;\n    const data = [];\n    for (let r = 0; r < matrix.length; r++) {\n      for (let c = 0; c < matrix[r].length; c++) {\n        if (matrix[r][c] > 0) {\n          data.push({ source: labels[r], target: labels[c], weight: matrix[r][c] });\n        }\n      }\n    }\n    this.exportSvc.downloadJson(data, 'dependency-wheel-data.json');\n  }\n\n  exportToCsv(): void {\n    const matrix = this.matrix();\n    const labels = this.labels();\n    if (!matrix.length || !labels.length) return;\n    const headers = ['Source', 'Target', 'Weight'];\n    const rows: (string | number)[][] = [];\n    for (let r = 0; r < matrix.length; r++) {\n      for (let c = 0; c < matrix[r].length; c++) {\n        if (matrix[r][c] > 0) {\n          rows.push([labels[r], labels[c], matrix[r][c]]);\n        }\n      }\n    }\n    this.exportSvc.downloadCsv(headers, rows, 'dependency-wheel-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface MatrixItem {\n  labels: string[];\n  matrix: number[][];\n  color?: string;\n}\n\ninterface ProcessedCell {\n  rowIdx: number;\n  colIdx: number;\n  value: number;\n  x: number;\n  y: number;\n  size: number;\n  opacity: number;\n  color: string;\n}\n\n@Component({\n  selector: 'ngx-adjacency-matrix',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-adjacency-matrix\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"matrix-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Column Labels (Top - rotated for readability) -->\n          @if (showLabels()) {\n            @for (label of labels(); track label; let i = $index) {\n              <g [attr.transform]=\"'translate(' + (i * cellSize() + cellSize() / 2) + ', -8)'\">\n                <text\n                  transform=\"rotate(-45)\"\n                  text-anchor=\"start\"\n                  class=\"col-label\"\n                >\n                  {{ label }}\n                </text>\n              </g>\n            }\n          }\n\n          <!-- Row Labels (Left) -->\n          @if (showLabels()) {\n            @for (label of labels(); track label; let i = $index) {\n              <text\n                [attr.x]=\"-12\"\n                [attr.y]=\"i * cellSize() + cellSize() / 2\"\n                text-anchor=\"end\"\n                dominant-baseline=\"middle\"\n                class=\"row-label\"\n              >\n                {{ label }}\n              </text>\n            }\n          }\n\n          <!-- Grid Background Matrix Cells -->\n          @for (cell of computedCells(); track cell.rowIdx + '-' + cell.colIdx; let i = $index) {\n            <g>\n              <rect\n                [attr.x]=\"cell.x\"\n                [attr.y]=\"cell.y\"\n                [attr.width]=\"cell.size\"\n                [attr.height]=\"cell.size\"\n                [attr.fill]=\"cell.color\"\n                [attr.fill-opacity]=\"cell.opacity\"\n                [attr.stroke]=\"gridColor()\"\n                stroke-width=\"1\"\n                class=\"matrix-cell\"\n                [class.dimmed]=\"hoveredCoords() !== null && hoveredCoords()!.row !== cell.rowIdx && hoveredCoords()!.col !== cell.colIdx\"\n                [class.highlighted]=\"hoveredCoords() !== null && (hoveredCoords()!.row === cell.rowIdx || hoveredCoords()!.col === cell.colIdx)\"\n                (mouseenter)=\"onCellHover(cell.rowIdx, cell.colIdx, $event)\"\n                (mousemove)=\"onMouseMove($event)\"\n                [style.animation-delay]=\"(cell.rowIdx * 0.04 + cell.colIdx * 0.04) + 's'\"\n              />\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.source }} ➔ {{ t.target }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-name\">Connection Weight</span>\n            <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-adjacency-matrix {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .matrix-svg {\n      display: block;\n      overflow: visible;\n    }\n    .matrix-cell {\n      transition: fill-opacity 0.15s ease, opacity 0.15s ease;\n      cursor: pointer;\n      animation: cellFadeIn 0.4s ease-out forwards;\n      opacity: 0;\n      transform-origin: center;\n    }\n    @keyframes cellFadeIn {\n      to { opacity: 1; }\n    }\n    .matrix-cell.dimmed {\n      opacity: 0.4;\n    }\n    .matrix-cell.highlighted {\n      stroke: var(--ngx-chart-axis, #94a3b8);\n      stroke-width: 1.5;\n    }\n    .row-label, .col-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #475569);\n      font-weight: 600;\n      user-select: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class AdjacencyMatrixComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  matrix = input<number[][]>([]);\n  labels = input<string[]>([]);\n  height = input<number>(400);\n  showLabels = input<boolean>(true);\n  color = input<string>(CHART_COLORS[0]); // Base matrix color\n  gridColor = input<string>('var(--ngx-chart-bg, #ffffff)');\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredCoords = signal<{ row: number; col: number } | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  svgHeight = computed(() => this.height());\n\n  margin = computed(() => ({\n    top: this.showLabels() ? 80 : 10,\n    right: 20,\n    bottom: 20,\n    left: this.showLabels() ? 80 : 10\n  }));\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  cellSize = computed(() => {\n    const count = this.labels().length || 1;\n    const sizeLimit = Math.min(this.innerW(), this.innerH());\n    return sizeLimit / count;\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  computedCells = computed<ProcessedCell[]>(() => {\n    const m = this.matrix();\n    const count = m.length;\n    if (count === 0) return [];\n\n    const cellS = this.cellSize();\n    const c = this.color();\n\n    // Find matrix maximum weight to scale opacity values\n    let maxWeight = 0;\n    for (let r = 0; r < count; r++) {\n      for (let col = 0; col < count; col++) {\n        if (m[r][col] > maxWeight) {\n          maxWeight = m[r][col];\n        }\n      }\n    }\n    if (maxWeight === 0) maxWeight = 1;\n\n    const cells: ProcessedCell[] = [];\n\n    for (let r = 0; r < count; r++) {\n      for (let col = 0; col < count; col++) {\n        const value = m[r][col];\n        // Calculate cell opacity relative to connection weight (minimum opacity of 0.05 for non-zero connections)\n        const opacity = value > 0 ? Math.max(0.08, value / maxWeight) : 0.02;\n\n        cells.push({\n          rowIdx: r,\n          colIdx: col,\n          value,\n          x: col * cellS,\n          y: r * cellS,\n          size: cellS,\n          opacity,\n          color: value > 0 ? c : '#e2e8f0'\n        });\n      }\n    }\n\n    return cells;\n  });\n\n  onCellHover(row: number, col: number, event: MouseEvent) {\n    this.hoveredCoords.set({ row, col });\n    const m = this.matrix();\n    const l = this.labels();\n    this.tooltip.set({\n      source: l[row] || `Node ${row + 1}`,\n      target: l[col] || `Node ${col + 1}`,\n      value: m[row][col]\n    });\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-adjacency-matrix');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredCoords.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const matrix = this.matrix();\n    const labels = this.labels();\n    if (!matrix.length || !labels.length) return;\n    const data = [];\n    for (let r = 0; r < matrix.length; r++) {\n      for (let c = 0; c < matrix[r].length; c++) {\n        if (matrix[r][c] > 0) {\n          data.push({ source: labels[r], target: labels[c], weight: matrix[r][c] });\n        }\n      }\n    }\n    this.exportSvc.downloadJson(data, 'adjacency-matrix-data.json');\n  }\n\n  exportToCsv(): void {\n    const matrix = this.matrix();\n    const labels = this.labels();\n    if (!matrix.length || !labels.length) return;\n    const headers = ['Source', 'Target', 'Weight'];\n    const rows: (string | number)[][] = [];\n    for (let r = 0; r < matrix.length; r++) {\n      for (let c = 0; c < matrix[r].length; c++) {\n        if (matrix[r][c] > 0) {\n          rows.push([labels[r], labels[c], matrix[r][c]]);\n        }\n      }\n    }\n    this.exportSvc.downloadCsv(headers, rows, 'adjacency-matrix-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface BiplotPoint {\n  x: number;\n  y: number;\n  label: string;\n  group?: string;\n}\n\nexport interface BiplotVector {\n  x: number;\n  y: number;\n  label: string;\n}\n\ninterface ProcessedPoint {\n  label: string;\n  xVal: number;\n  yVal: number;\n  cx: number;\n  cy: number;\n  group?: string;\n  color: string;\n}\n\ninterface ProcessedVector {\n  label: string;\n  xVal: number;\n  yVal: number;\n  x2: number;\n  y2: number;\n}\n\n@Component({\n  selector: 'ngx-biplot',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-biplot\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"biplot-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <!-- Arrowhead Marker Definition -->\n        <defs>\n          <marker\n            id=\"vector-arrow\"\n            viewBox=\"0 0 10 10\"\n            refX=\"6\"\n            refY=\"5\"\n            markerWidth=\"6\"\n            markerHeight=\"6\"\n            orient=\"auto-start-reverse\"\n          >\n            <path d=\"M 0 1.5 L 10 5 L 0 8.5 z\" fill=\"#ef4444\" />\n          </marker>\n        </defs>\n\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Axis Lines (Passing through Origin 0,0) -->\n          <line\n            [attr.x1]=\"0\"\n            [attr.x2]=\"innerW()\"\n            [attr.y1]=\"originY()\"\n            [attr.y2]=\"originY()\"\n            class=\"axis-line origin-axis\"\n          />\n          <line\n            [attr.x1]=\"originX()\"\n            [attr.x2]=\"originX()\"\n            [attr.y1]=\"0\"\n            [attr.y2]=\"innerH()\"\n            class=\"axis-line origin-axis\"\n          />\n\n          <!-- Tick Marks on X Axis -->\n          @for (tick of xTicks(); track tick) {\n            <g [attr.transform]=\"'translate(' + xPos(tick) + ', 0)'\">\n              <line\n                [attr.y1]=\"originY() - 3\"\n                [attr.y2]=\"originY() + 3\"\n                class=\"tick-line\"\n              />\n              @if (tick !== 0) {\n                <text\n                  [attr.y]=\"originY() + 14\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatNumber(tick) }}\n                </text>\n              }\n            </g>\n          }\n\n          <!-- Tick Marks on Y Axis -->\n          @for (tick of yTicks(); track tick) {\n            <g [attr.transform]=\"'translate(0, ' + yPos(tick) + ')'\">\n              <line\n                [attr.x1]=\"originX() - 3\"\n                [attr.x2]=\"originX() + 3\"\n                class=\"tick-line\"\n              />\n              @if (tick !== 0) {\n                <text\n                  [attr.x]=\"originX() - 8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatNumber(tick) }}\n                </text>\n              }\n            </g>\n          }\n\n          <!-- Zero Label at Origin -->\n          <text\n            [attr.x]=\"originX() - 8\"\n            [attr.y]=\"originY() + 12\"\n            text-anchor=\"end\"\n            class=\"tick-label origin-label\"\n          >\n            0\n          </text>\n\n          <!-- Vector Loadings (Variables) -->\n          @for (vec of computedVectors(); track vec.label) {\n            <g class=\"vector-group\">\n              <line\n                [attr.x1]=\"originX()\"\n                [attr.y1]=\"originY()\"\n                [attr.x2]=\"vec.x2\"\n                [attr.y2]=\"vec.y2\"\n                class=\"vector-line\"\n                marker-end=\"url(#vector-arrow)\"\n              />\n              <text\n                [attr.x]=\"vec.x2 + (vec.x2 > originX() ? 6 : -6)\"\n                [attr.y]=\"vec.y2 + (vec.y2 > originY() ? 6 : -6)\"\n                [attr.text-anchor]=\"vec.x2 > originX() ? 'start' : 'end'\"\n                dominant-baseline=\"middle\"\n                class=\"vector-label\"\n              >\n                {{ vec.label }}\n              </text>\n            </g>\n          }\n\n          <!-- Scatter Points (Observations) -->\n          @for (pt of computedPoints(); track pt.label; let i = $index) {\n            <g\n              class=\"point-group\"\n              [class.dimmed]=\"hoveredPointIndex() !== null && hoveredPointIndex() !== i\"\n              (mouseenter)=\"onPointHover(i, $event)\"\n              (mousemove)=\"onMouseMove($event)\"\n            >\n              <circle\n                [attr.cx]=\"pt.cx\"\n                [attr.cy]=\"pt.cy\"\n                [attr.r]=\"hoveredPointIndex() === i ? 7 : 5\"\n                [attr.fill]=\"pt.color\"\n                [attr.stroke]=\"'#ffffff'\"\n                [attr.stroke-width]=\"hoveredPointIndex() === i ? 2 : 1\"\n                class=\"biplot-point\"\n              />\n              @if (showLabels() || hoveredPointIndex() === i) {\n                <text\n                  [attr.x]=\"pt.cx + 8\"\n                  [attr.y]=\"pt.cy - 6\"\n                  class=\"point-label\"\n                >\n                  {{ pt.label }}\n                </text>\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          @if (t.group) {\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Group</span>\n              <span class=\"tt-val\">{{ t.group }}</span>\n            </div>\n          }\n          <div class=\"tt-row\">\n            <span class=\"tt-name\">PC1 (X)</span>\n            <span class=\"tt-val\">{{ formatNumber(t.x) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-name\">PC2 (Y)</span>\n            <span class=\"tt-val\">{{ formatNumber(t.y) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-biplot {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .biplot-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1;\n    }\n    .origin-axis {\n      stroke: var(--ngx-chart-axis-strong, #94a3b8);\n      stroke-width: 1.5;\n      stroke-dasharray: 3,3;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label, .point-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .origin-label {\n      fill: var(--ngx-chart-axis-text, #475569);\n      font-weight: 700;\n    }\n    .biplot-point {\n      cursor: pointer;\n      transition: r 0.2s ease, stroke-width 0.2s ease;\n      transform-origin: center;\n      animation: pointScaleIn 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n      opacity: 0;\n    }\n    @keyframes pointScaleIn {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .point-group {\n      transition: opacity 0.2s ease;\n    }\n    .point-group.dimmed {\n      opacity: 0.35;\n    }\n    .vector-group {\n      animation: vectorFadeIn 0.8s ease-out forwards;\n      opacity: 0;\n    }\n    @keyframes vectorFadeIn {\n      to { opacity: 1; }\n    }\n    .vector-line {\n      stroke: #ef4444;\n      stroke-width: 2;\n      stroke-linecap: round;\n      pointer-events: none;\n    }\n    .vector-label {\n      font-size: 11px;\n      fill: #ef4444;\n      font-weight: 700;\n      user-select: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n      margin-bottom: 12px;\n    }\n    .export-trigger {\n      float: right;\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n      z-index: 60;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class BiplotComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  points = input<BiplotPoint[]>([]);\n  vectors = input<BiplotVector[]>([]);\n  height = input<number>(400);\n  showLabels = input<boolean>(true);\n  vectorScale = input<number>(1.0);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(500);\n  hoveredPointIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  svgHeight = computed(() => this.height());\n\n  margin = computed(() => ({\n    top: 40,\n    right: 40,\n    bottom: 40,\n    left: 40\n  }));\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  // Determine global domain range Symmetrical around zero\n  maxExtent = computed(() => {\n    const pts = this.points();\n    const vecs = this.vectors();\n    const scaleFactor = this.vectorScale();\n    const allCoords = [\n      ...pts.map(p => Math.abs(p.x)),\n      ...pts.map(p => Math.abs(p.y)),\n      ...vecs.map(v => Math.abs(v.x * scaleFactor)),\n      ...vecs.map(v => Math.abs(v.y * scaleFactor))\n    ];\n    if (allCoords.length === 0) return 1.0;\n    const maxVal = Math.max(...allCoords);\n    return maxVal * 1.15 || 1.0;\n  });\n\n  xTicks = computed(() => {\n    const limit = this.maxExtent();\n    return [-limit, -limit / 2, 0, limit / 2, limit];\n  });\n\n  yTicks = computed(() => {\n    const limit = this.maxExtent();\n    return [-limit, -limit / 2, 0, limit / 2, limit];\n  });\n\n  xPos(val: number): number {\n    const limit = this.maxExtent();\n    // Maps -limit..+limit to 0..innerW\n    return ((val + limit) / (2 * limit)) * this.innerW();\n  }\n\n  yPos(val: number): number {\n    const limit = this.maxExtent();\n    // Maps -limit..+limit to innerH..0 (inverted SVG coords)\n    return this.innerH() - ((val + limit) / (2 * limit)) * this.innerH();\n  }\n\n  originX = computed(() => this.xPos(0));\n  originY = computed(() => this.yPos(0));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  computedPoints = computed<ProcessedPoint[]>(() => {\n    const pts = this.points();\n    const palette = this.colors();\n\n    // Map group labels to color mapping dictionary\n    const groups = Array.from(new Set(pts.map(p => p.group).filter(Boolean)));\n    const groupColors: Record<string, string> = {};\n    groups.forEach((g, idx) => {\n      groupColors[g!] = palette[idx % palette.length];\n    });\n\n    return pts.map(p => {\n      const color = p.group ? groupColors[p.group] : palette[0];\n      return {\n        label: p.label,\n        xVal: p.x,\n        yVal: p.y,\n        cx: this.xPos(p.x),\n        cy: this.yPos(p.y),\n        group: p.group,\n        color\n      };\n    });\n  });\n\n  computedVectors = computed<ProcessedVector[]>(() => {\n    const vecs = this.vectors();\n    const scaleFactor = this.vectorScale();\n    return vecs.map(v => ({\n      label: v.label,\n      xVal: v.x * scaleFactor,\n      yVal: v.y * scaleFactor,\n      x2: this.xPos(v.x * scaleFactor),\n      y2: this.yPos(v.y * scaleFactor)\n    }));\n  });\n\n  onPointHover(idx: number, event: MouseEvent) {\n    this.hoveredPointIndex.set(idx);\n    const pt = this.computedPoints()[idx];\n    if (pt) {\n      this.tooltip.set({\n        label: pt.label,\n        group: pt.group,\n        x: pt.xVal,\n        y: pt.yVal\n      });\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-biplot');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredPointIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const points = this.points();\n    const vectors = this.vectors();\n    if (!points.length && !vectors.length) return;\n    const headers = ['Type', 'Label', 'Group', 'X', 'Y'];\n    const rows = points.map(d => ['Point', d.label || '', d.group || '', d.x, d.y]);\n    vectors.forEach(v => {\n      rows.push(['Vector', v.label, '', v.x, v.y]);\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'biplot-data.csv');\n  }\n\n  exportToJson(): void {\n    const data = { points: this.points(), vectors: this.vectors() };\n    this.exportSvc.downloadJson(data, 'biplot-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'biplot.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Biplot Export', 'biplot.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface RenkoBrick {\n  index: number;\n  open: number;\n  close: number;\n  type: 'bullish' | 'bearish';\n  color: string;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\n@Component({\n  selector: 'ngx-renko-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-renko-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Renko Chart</span>\n          <span class=\"header-boxsize\">Box Size: {{ boxSize() }}</span>\n        </div>\n        \n        <!-- Export menu trigger -->\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"renko-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines -->\n          @if (showGrid()) {\n            @for (tick of yTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(tick)\"\n                [attr.y2]=\"yPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Bricks -->\n          @for (brick of computedBricks(); track brick.index; let i = $index) {\n            <rect\n              [attr.x]=\"brick.x\"\n              [attr.y]=\"brick.y\"\n              [attr.width]=\"brick.w\"\n              [attr.height]=\"brick.h\"\n              [attr.fill]=\"brick.color\"\n              class=\"renko-brick\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onBrickHover(i, $event)\"\n              (mousemove)=\"onMouseMove($event)\"\n              stroke=\"#ffffff\"\n              stroke-width=\"0.5\"\n              [style.animation-delay]=\"(i * 0.03) + 's'\"\n            />\n          }\n\n          <!-- Y Axis (Left side) -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ labelFormatter() ? labelFormatter()!(tick) : formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- Bottom X Axis Line -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\" [style.color]=\"t.color\">\n              {{ t.type === 'bullish' ? 'Yang (Bullish)' : 'Yin (Bearish)' }}\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Open</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.open) : formatNumber(t.open) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Close</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.close) : formatNumber(t.close) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-renko-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-boxsize {\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: var(--ngx-chart-grid, #f1f5f9);\n      padding: 2px 8px;\n      border-radius: 6px;\n    }\n    .renko-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .renko-brick {\n      cursor: pointer;\n      animation: brickFadeUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      opacity: 0;\n      transform-origin: bottom;\n    }\n    @keyframes brickFadeUp {\n      from { transform: scale(0.6); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .renko-brick.dimmed {\n      opacity: 0.25 !important;\n    }\n    .renko-brick.highlighted {\n      stroke: var(--ngx-chart-axis-strong, #64748b) !important;\n      stroke-width: 1.5px !important;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 130px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class RenkoChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<number[]>([]);\n  boxSize = input<number>(5);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  bullishColor = input<string>('#10b981');\n  bearishColor = input<string>('#ef4444');\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 20,\n    bottom: 20,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Calculate Renko Bricks based on boxSize requirement\n  computedBricks = computed<RenkoBrick[]>(() => {\n    const prices = this.data();\n    const size = this.boxSize() || 5;\n    if (prices.length === 0) return [];\n\n    const bricks: Omit<RenkoBrick, 'x' | 'y' | 'w' | 'h'>[] = [];\n    let currentPrice = prices[0];\n    let brickIndex = 0;\n\n    for (let i = 1; i < prices.length; i++) {\n      const price = prices[i];\n      const diff = price - currentPrice;\n\n      if (Math.abs(diff) >= size) {\n        const numBricks = Math.floor(Math.abs(diff) / size);\n        const direction = diff > 0 ? 1 : -1;\n\n        for (let b = 0; b < numBricks; b++) {\n          const nextPrice = currentPrice + direction * size;\n          bricks.push({\n            index: brickIndex++,\n            open: currentPrice,\n            close: nextPrice,\n            type: direction > 0 ? 'bullish' : 'bearish',\n            color: direction > 0 ? this.bullishColor() : this.bearishColor()\n          });\n          currentPrice = nextPrice;\n        }\n      }\n    }\n\n    // Now layout coordinates\n    const count = bricks.length;\n    if (count === 0) return [];\n\n    const w = this.innerW();\n    const h = this.innerH();\n\n    // Find min and max close levels to scale Y Axis\n    const allPrices = bricks.flatMap(b => [b.open, b.close]);\n    const minVal = Math.min(...allPrices);\n    const maxVal = Math.max(...allPrices);\n    const span = maxVal - minVal || 10;\n    const yMin = Math.max(0, minVal - span * 0.05);\n    const yMax = maxVal + span * 0.05;\n\n    // Distribute X columns horizontally\n    const brickW = w / count;\n\n    return bricks.map((b, idx) => {\n      // Scale coordinates\n      const yOpen = scale(b.open, yMin, yMax, h, 0);\n      const yClose = scale(b.close, yMin, yMax, h, 0);\n\n      const brickH = Math.abs(yClose - yOpen);\n      const brickY = Math.min(yOpen, yClose);\n      const brickX = idx * brickW;\n\n      return {\n        ...b,\n        x: brickX,\n        y: brickY,\n        w: brickW * 0.9, // 10% gap spacing\n        h: Math.max(2, brickH)\n      } as RenkoBrick;\n    });\n  });\n\n  yTicks = computed(() => {\n    const bricks = this.computedBricks();\n    if (bricks.length === 0) return [0, 50, 100];\n    const allPrices = bricks.flatMap(b => [b.open, b.close]);\n    const minVal = Math.min(...allPrices);\n    const maxVal = Math.max(...allPrices);\n    const span = maxVal - minVal || 10;\n    return niceTicks(Math.max(0, minVal - span * 0.05), maxVal + span * 0.05, 5);\n  });\n\n  yDomainMax = computed(() => {\n    const ticks = this.yTicks();\n    return ticks[ticks.length - 1] || 100;\n  });\n\n  yDomainMin = computed(() => {\n    const ticks = this.yTicks();\n    return ticks[0] || 0;\n  });\n\n  yPos(val: number): number {\n    return scale(val, this.yDomainMin(), this.yDomainMax(), this.innerH(), 0);\n  }\n\n  onBrickHover(idx: number, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const brick = this.computedBricks()[idx];\n    if (brick) {\n      this.tooltip.set(brick);\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-renko-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const bricks = this.computedBricks();\n    if (!bricks.length) return;\n    const data = bricks.map(b => ({\n      index: b.index,\n      type: b.type,\n      open: b.open,\n      close: b.close\n    }));\n    this.exportSvc.downloadJson(data, 'renko-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const bricks = this.computedBricks();\n    if (!bricks.length) return;\n    const headers = ['Index', 'Type', 'Open', 'Close'];\n    const rows = bricks.map(b => [b.index, b.type, b.open, b.close]);\n    this.exportSvc.downloadCsv(headers, rows, 'renko-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface KagiSegment {\n  x: number;\n  y1: number;\n  y2: number;\n  val1: number;\n  val2: number;\n  type: 'vertical' | 'horizontal';\n  trend: 'bullish' | 'bearish';\n  color: string;\n  thickness: number;\n}\n\n@Component({\n  selector: 'ngx-kagi-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-kagi-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Kagi Chart</span>\n          <span class=\"header-reversal\">Reversal: {{ reversalAmount() }}</span>\n        </div>\n\n        <!-- Export Menu -->\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"kagi-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines -->\n          @if (showGrid()) {\n            @for (tick of yTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(tick)\"\n                [attr.y2]=\"yPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Kagi Line Paths -->\n          @for (seg of computedSegments(); track $index; let idx = $index) {\n            <line\n              [attr.x1]=\"seg.x\"\n              [attr.y1]=\"seg.y1\"\n              [attr.x2]=\"seg.type === 'horizontal' ? nextX(idx) : seg.x\"\n              [attr.y2]=\"seg.y2\"\n              [attr.stroke]=\"seg.color\"\n              [attr.stroke-width]=\"seg.thickness\"\n              stroke-linecap=\"round\"\n              class=\"kagi-line\"\n              [class.dimmed]=\"hoveredSegmentIndex() !== null && hoveredSegmentIndex() !== idx\"\n              (mouseenter)=\"onSegmentHover(idx, $event)\"\n              (mousemove)=\"onMouseMove($event)\"\n              [style.animation-delay]=\"(idx * 0.05) + 's'\"\n            />\n          }\n\n          <!-- Y Axis (Left side) -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ labelFormatter() ? labelFormatter()!(tick) : formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- Bottom X Axis Line -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\" [style.color]=\"t.color\">\n              {{ t.trend === 'bullish' ? 'Yang (Bullish)' : 'Yin (Bearish)' }}\n            </div>\n            @if (t.type === 'vertical') {\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">From</span>\n                <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.val1) : formatNumber(t.val1) }}</span>\n              </div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">To</span>\n                <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.val2) : formatNumber(t.val2) }}</span>\n              </div>\n            } @else {\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Reversal level</span>\n                <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.val1) : formatNumber(t.val1) }}</span>\n              </div>\n            }\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-kagi-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-reversal {\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: var(--ngx-chart-grid, #f1f5f9);\n      padding: 2px 8px;\n      border-radius: 6px;\n    }\n    .kagi-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .kagi-line {\n      cursor: pointer;\n      animation: lineFadeIn 0.5s ease-out forwards;\n      opacity: 0;\n    }\n    @keyframes lineFadeIn {\n      to { opacity: 1; }\n    }\n    .kagi-line.dimmed {\n      opacity: 0.25 !important;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles removed */\n  `]\n})\nexport class KagiChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<number[]>([]);\n  reversalAmount = input<number>(15);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  bullishColor = input<string>('#10b981');\n  bearishColor = input<string>('#ef4444');\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredSegmentIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 20,\n    bottom: 20,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Next X coord calculation helper for horizontal connections\n  nextX(idx: number): number {\n    const segments = this.computedSegments();\n    // Look ahead to find the next vertical segment coordinate\n    for (let i = idx + 1; i < segments.length; i++) {\n      if (segments[i].type === 'vertical') {\n        return segments[i].x;\n      }\n    }\n    return segments[idx].x + 20; // Default fallback\n  }\n\n  // Calculate Kagi Segments based on reversal size\n  computedSegments = computed<KagiSegment[]>(() => {\n    const prices = this.data();\n    const reversal = this.reversalAmount() || 15;\n    if (prices.length === 0) return [];\n\n    // Calculate reversal columns\n    const rawSegments: { start: number; end: number; type: 'vertical' | 'horizontal'; trend: 'bullish' | 'bearish' }[] = [];\n    let startVal = prices[0];\n    let currentVal = prices[0];\n    let direction = 0; // 0: undecided, 1: up, -1: down\n    let trend: 'bullish' | 'bearish' = 'bearish';\n\n    // Track historical highs/lows for trend thick/thin switching (Kagi rule)\n    let priorHigh = prices[0];\n    let priorLow = prices[0];\n\n    for (let i = 1; i < prices.length; i++) {\n      const price = prices[i];\n      const diff = price - currentVal;\n\n      if (direction === 0) {\n        if (Math.abs(diff) >= reversal) {\n          direction = diff > 0 ? 1 : -1;\n          currentVal = price;\n        }\n      } else if (direction === 1) {\n        // Upward trend\n        if (price > currentVal) {\n          if (price > priorHigh) {\n            trend = 'bullish';\n          }\n          currentVal = price;\n        } else if (currentVal - price >= reversal) {\n          // Reversal downward\n          rawSegments.push({ start: startVal, end: currentVal, type: 'vertical', trend });\n          rawSegments.push({ start: currentVal, end: currentVal, type: 'horizontal', trend });\n          priorHigh = currentVal;\n          startVal = currentVal;\n          currentVal = price;\n          direction = -1;\n        }\n      } else {\n        // Downward trend\n        if (price < currentVal) {\n          if (price < priorLow) {\n            trend = 'bearish';\n          }\n          currentVal = price;\n        } else if (price - currentVal >= reversal) {\n          // Reversal upward\n          rawSegments.push({ start: startVal, end: currentVal, type: 'vertical', trend });\n          rawSegments.push({ start: currentVal, end: currentVal, type: 'horizontal', trend });\n          priorLow = currentVal;\n          startVal = currentVal;\n          currentVal = price;\n          direction = 1;\n        }\n      }\n    }\n    rawSegments.push({ start: startVal, end: currentVal, type: 'vertical', trend });\n\n    // Filter/scale coordinates\n    const w = this.innerW();\n    const h = this.innerH();\n\n    const allVals = prices;\n    const minVal = Math.min(...allVals);\n    const maxVal = Math.max(...allVals);\n    const span = maxVal - minVal || 10;\n    const yMin = Math.max(0, minVal - span * 0.05);\n    const yMax = maxVal + span * 0.05;\n\n    // Distribute vertical columns\n    const numCols = rawSegments.filter(s => s.type === 'vertical').length || 1;\n    const colStep = w / numCols;\n\n    let colIdx = 0;\n    const segments: KagiSegment[] = [];\n\n    rawSegments.forEach((rs) => {\n      const y1 = scale(rs.start, yMin, yMax, h, 0);\n      const y2 = scale(rs.end, yMin, yMax, h, 0);\n      const x = colIdx * colStep + colStep / 2;\n\n      if (rs.type === 'vertical') {\n        segments.push({\n          x,\n          y1,\n          y2,\n          val1: rs.start,\n          val2: rs.end,\n          type: 'vertical',\n          trend: rs.trend,\n          color: rs.trend === 'bullish' ? this.bullishColor() : this.bearishColor(),\n          thickness: rs.trend === 'bullish' ? 3.5 : 1.2\n        });\n        colIdx++;\n      } else {\n        segments.push({\n          x,\n          y1: y1,\n          y2: y1,\n          val1: rs.start,\n          val2: rs.start,\n          type: 'horizontal',\n          trend: rs.trend,\n          color: rs.trend === 'bullish' ? this.bullishColor() : this.bearishColor(),\n          thickness: rs.trend === 'bullish' ? 3.5 : 1.2\n        });\n      }\n    });\n\n    return segments;\n  });\n\n  yTicks = computed(() => {\n    const prices = this.data();\n    if (prices.length === 0) return [0, 50, 100];\n    const minVal = Math.min(...prices);\n    const maxVal = Math.max(...prices);\n    const span = maxVal - minVal || 10;\n    return niceTicks(Math.max(0, minVal - span * 0.05), maxVal + span * 0.05, 5);\n  });\n\n  yDomainMax = computed(() => {\n    const ticks = this.yTicks();\n    return ticks[ticks.length - 1] || 100;\n  });\n\n  yDomainMin = computed(() => {\n    const ticks = this.yTicks();\n    return ticks[0] || 0;\n  });\n\n  yPos(val: number): number {\n    return scale(val, this.yDomainMin(), this.yDomainMax(), this.innerH(), 0);\n  }\n\n  onSegmentHover(idx: number, event: MouseEvent) {\n    this.hoveredSegmentIndex.set(idx);\n    const seg = this.computedSegments()[idx];\n    if (seg) {\n      this.tooltip.set(seg);\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-kagi-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredSegmentIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const segments = this.computedSegments();\n    if (!segments.length) return;\n    const headers = ['Index', 'Type', 'FromValue', 'ToValue', 'Trend'];\n    const rows = segments.map((seg, idx) => [idx, seg.type, seg.val1, seg.val2, seg.trend]);\n    this.exportSvc.downloadCsv(headers, rows, 'kagi-chart-data.csv');\n  }\n\n  exportToJson(): void {\n    const segments = this.computedSegments();\n    if (!segments.length) return;\n    const data = segments.map((seg, idx) => ({\n      index: idx,\n      type: seg.type,\n      from: seg.val1,\n      to: seg.val2,\n      trend: seg.trend\n    }));\n    this.exportSvc.downloadJson(data, 'kagi-chart-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'kagi-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Kagi Chart', 'kagi-chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface PFCell {\n  colIdx: number;\n  rowIdx: number;\n  type: 'X' | 'O';\n  value: number;\n  color: string;\n  x: number;\n  y: number;\n  size: number;\n}\n\ninterface PFColumn {\n  type: 'X' | 'O';\n  minBox: number;\n  maxBox: number;\n}\n\n@Component({\n  selector: 'ngx-point-figure-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-point-figure-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Point & Figure Chart</span>\n          <span class=\"header-settings\">Box: {{ boxSize() }} | Rev: {{ reversal() }}</span>\n        </div>\n\n        <!-- Export Menu -->\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"pf-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Y Grid Lines -->\n          @if (showGrid()) {\n            @for (row of yTicks(); track row) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(row)\"\n                [attr.y2]=\"yPos(row)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- X's and O's Cell Shapes -->\n          @for (cell of computedCells(); track cell.colIdx + '-' + cell.rowIdx; let idx = $index) {\n            <g\n              class=\"pf-cell-group\"\n              [class.dimmed]=\"hoveredCellIndex() !== null && hoveredCellIndex() !== idx\"\n              (mouseenter)=\"onCellHover(idx, $event)\"\n              (mousemove)=\"onMouseMove($event)\"\n              [style.animation-delay]=\"(cell.colIdx * 0.05) + 's'\"\n            >\n              @if (cell.type === 'X') {\n                <line\n                  [attr.x1]=\"cell.x + cell.size * 0.15\"\n                  [attr.y1]=\"cell.y + cell.size * 0.15\"\n                  [attr.x2]=\"cell.x + cell.size * 0.85\"\n                  [attr.y2]=\"cell.y + cell.size * 0.85\"\n                  [attr.stroke]=\"cell.color\"\n                  stroke-width=\"2.5\"\n                  stroke-linecap=\"round\"\n                  class=\"pf-shape\"\n                />\n                <line\n                  [attr.x1]=\"cell.x + cell.size * 0.85\"\n                  [attr.y1]=\"cell.y + cell.size * 0.15\"\n                  [attr.x2]=\"cell.x + cell.size * 0.15\"\n                  [attr.y2]=\"cell.y + cell.size * 0.85\"\n                  [attr.stroke]=\"cell.color\"\n                  stroke-width=\"2.5\"\n                  stroke-linecap=\"round\"\n                  class=\"pf-shape\"\n                />\n              } @else {\n                <circle\n                  [attr.cx]=\"cell.x + cell.size / 2\"\n                  [attr.cy]=\"cell.y + cell.size / 2\"\n                  [attr.r]=\"cell.size * 0.35\"\n                  [attr.stroke]=\"cell.color\"\n                  fill=\"none\"\n                  stroke-width=\"2.5\"\n                  class=\"pf-shape\"\n                />\n              }\n            </g>\n          }\n\n          <!-- Y Axis (Left side) -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ labelFormatter() ? labelFormatter()!(tick) : formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- Bottom X Axis line -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\" [style.color]=\"t.color\">\n              {{ t.type === 'X' ? 'Price Rise (X)' : 'Price Fall (O)' }}\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Level</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.value) : formatNumber(t.value) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Column</span>\n              <span class=\"tt-val\">#{{ t.colIdx + 1 }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-point-figure-chart {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-settings {\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: var(--ngx-chart-grid, #f1f5f9);\n      padding: 2px 8px;\n      border-radius: 6px;\n    }\n    .pf-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .pf-cell-group {\n      cursor: pointer;\n      opacity: 0;\n      animation: cellFadeIn 0.4s ease-out forwards;\n    }\n    @keyframes cellFadeIn {\n      to { opacity: 1; }\n    }\n    .pf-cell-group.dimmed {\n      opacity: 0.25 !important;\n    }\n    .pf-shape {\n      transition: stroke-width 0.15s ease;\n    }\n    .pf-cell-group:hover .pf-shape {\n      stroke-width: 3.5px !important;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 130px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class PointFigureChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<number[]>([]);\n  boxSize = input<number>(4);\n  reversal = input<number>(3);\n  height = input<number>(350);\n  showGrid = input<boolean>(true);\n  xColor = input<string>('#10b981');\n  oColor = input<string>('#ef4444');\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredCellIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 20,\n    bottom: 20,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Calculate grid boxes populated with X or O\n  computedCells = computed<PFCell[]>(() => {\n    const prices = this.data();\n    const size = this.boxSize() || 4;\n    const revSize = this.reversal() || 3;\n    if (prices.length === 0) return [];\n\n    const getBox = (price: number) => Math.floor(price / size);\n\n    const columns: PFColumn[] = [];\n    let curType: 'X' | 'O' = 'X';\n    let curMin = getBox(prices[0]);\n    let curMax = curMin;\n\n    for (let i = 1; i < prices.length; i++) {\n      const box = getBox(prices[i]);\n\n      if (curType === 'X') {\n        if (box > curMax) {\n          curMax = box;\n        } else if (curMax - box >= revSize) {\n          columns.push({ type: 'X', minBox: curMin, maxBox: curMax });\n          curType = 'O';\n          curMin = box;\n          curMax = curMax - 1;\n        }\n      } else {\n        if (box < curMin) {\n          curMin = box;\n        } else if (box - curMin >= revSize) {\n          columns.push({ type: 'O', minBox: curMin, maxBox: curMax });\n          curType = 'X';\n          curMax = box;\n          curMin = curMin + 1;\n        }\n      }\n    }\n    columns.push({ type: curType, minBox: curMin, maxBox: curMax });\n\n    const w = this.innerW();\n    const h = this.innerH();\n\n    const allBoxes = columns.flatMap(c => [c.minBox, c.maxBox]);\n    if (allBoxes.length === 0) return [];\n    const minBoxIdx = Math.min(...allBoxes);\n    const maxBoxIdx = Math.max(...allBoxes);\n    const numRows = maxBoxIdx - minBoxIdx + 1;\n\n    const cellSize = Math.min(w / columns.length, h / numRows);\n\n    const cells: PFCell[] = [];\n    columns.forEach((col, cIdx) => {\n      for (let r = col.minBox; r <= col.maxBox; r++) {\n        const val = r * size;\n        const color = col.type === 'X' ? this.xColor() : this.oColor();\n\n        const yOffset = h - (r - minBoxIdx + 1) * cellSize;\n        const xOffset = cIdx * cellSize;\n\n        cells.push({\n          colIdx: cIdx,\n          rowIdx: r,\n          type: col.type,\n          value: val,\n          color,\n          x: xOffset,\n          y: yOffset,\n          size: cellSize\n        });\n      }\n    });\n\n    return cells;\n  });\n\n  yTicks = computed(() => {\n    const cells = this.computedCells();\n    if (cells.length === 0) return [];\n    const rows = Array.from(new Set(cells.map(c => c.rowIdx))).sort((a, b) => a - b);\n    const size = this.boxSize() || 4;\n\n    const maxLabels = 8;\n    const step = Math.max(1, Math.floor(rows.length / maxLabels));\n\n    return rows.filter((r, idx) => idx % step === 0).map(r => r * size);\n  });\n\n  yPos(val: number): number {\n    const cells = this.computedCells();\n    if (cells.length === 0) return 0;\n    const size = this.boxSize() || 4;\n    const boxIdx = val / size;\n\n    const rowIdxs = cells.map(c => c.rowIdx);\n    const minBoxIdx = Math.min(...rowIdxs);\n    const cellS = cells[0].size;\n\n    return this.innerH() - (boxIdx - minBoxIdx + 0.5) * cellS;\n  }\n\n  onCellHover(idx: number, event: MouseEvent) {\n    this.hoveredCellIndex.set(idx);\n    const cell = this.computedCells()[idx];\n    if (cell) {\n      this.tooltip.set(cell);\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-point-figure-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredCellIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const cells = this.computedCells();\n    if (!cells.length) return;\n\n    const data = cells.map(c => ({\n      column: c.colIdx,\n      row: c.rowIdx,\n      type: c.type,\n      value: c.value\n    }));\n    this.exportSvc.downloadJson(data, 'point-figure-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const cells = this.computedCells();\n    if (!cells.length) return;\n    const headers = ['Column', 'Row', 'Type', 'Value'];\n    const rows = cells.map(c => [c.colIdx, c.rowIdx, c.type, c.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'point-figure-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface WindRoseSpeedBin {\n  label: string;\n  value: number; // percentage frequency (0 to 100)\n}\n\nexport interface WindRoseItem {\n  direction: string;\n  speedBins: WindRoseSpeedBin[];\n}\n\ninterface ProcessedWedgeBin {\n  direction: string;\n  binLabel: string;\n  value: number;\n  cumValue: number;\n  color: string;\n  path: string;\n}\n\ninterface ProcessedWedge {\n  direction: string;\n  angle: number;\n  bins: ProcessedWedgeBin[];\n}\n\n@Component({\n  selector: 'ngx-wind-rose',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-wind-rose\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Wind Rose Chart</span>\n          <span class=\"header-subtitle\">Directional Distribution & Wind Speed Bins</span>\n        </div>\n\n        <!-- Export Menu -->\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"rose-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + (containerWidth() / 2) + ',' + (svgHeight() / 2) + ')'\">\n          \n          <!-- Concentric Grid Circles -->\n          @for (grid of gridLevels(); track grid) {\n            <circle\n              [attr.cx]=\"0\"\n              [attr.cy]=\"0\"\n              [attr.r]=\"radiusScale(grid)\"\n              class=\"grid-circle\"\n            />\n            <text\n              [attr.x]=\"5\"\n              [attr.y]=\"-radiusScale(grid) - 2\"\n              class=\"grid-label\"\n            >\n              {{ grid }}%\n            </text>\n          }\n\n          <!-- Axis Direction Spokes -->\n          @for (wdir of directionsList; track wdir; let i = $index) {\n            @if (i % 2 === 0) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.y1]=\"0\"\n                [attr.x2]=\"maxRadius() * Math.cos(directionAngle(wdir))\"\n                [attr.y2]=\"maxRadius() * Math.sin(directionAngle(wdir))\"\n                class=\"spoke-line\"\n              />\n              <text\n                [attr.x]=\"(maxRadius() + 14) * Math.cos(directionAngle(wdir))\"\n                [attr.y]=\"(maxRadius() + 14) * Math.sin(directionAngle(wdir))\"\n                text-anchor=\"middle\"\n                dominant-baseline=\"middle\"\n                class=\"direction-label\"\n              >\n                {{ wdir }}\n              </text>\n            }\n          }\n\n          <!-- Wind Rose Wedges -->\n          @for (wedge of computedWedges(); track wedge.direction; let wIdx = $index) {\n            @for (bin of wedge.bins; track bin.binLabel; let bIdx = $index) {\n              <path\n                [attr.d]=\"bin.path\"\n                [attr.fill]=\"bin.color\"\n                class=\"rose-wedge\"\n                [class.dimmed]=\"hoveredBin() !== null && (hoveredBin()!.wIdx !== wIdx || hoveredBin()!.bIdx !== bIdx)\"\n                [class.highlighted]=\"hoveredBin() !== null && hoveredBin()!.wIdx === wIdx && hoveredBin()!.bIdx === bIdx\"\n                (mouseenter)=\"onWedgeHover(wIdx, bIdx, $event)\"\n                (mousemove)=\"onMouseMove($event)\"\n                [style.animation-delay]=\"(wIdx * 0.04 + bIdx * 0.05) + 's'\"\n                stroke=\"#ffffff\"\n                stroke-width=\"0.3\"\n              />\n            }\n          }\n        </g>\n      </svg>\n\n      <!-- Legend -->\n      <div class=\"legend-container\">\n        @for (legend of legendItems(); track legend.label) {\n          <div class=\"legend-item\">\n            <span class=\"legend-dot\" [style.background]=\"legend.color\"></span>\n            <span class=\"legend-text\">{{ legend.label }}</span>\n          </div>\n        }\n      </div>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.direction }} Sector</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">{{ t.binLabel }}</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.value) : t.value.toFixed(1) + '%' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Cumulative</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.cumValue) : t.cumValue.toFixed(1) + '%' }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-wind-rose {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n      display: block;\n    }\n    .header-subtitle {\n      font-size: 11px;\n      color: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n    }\n    .rose-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-circle {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n      fill: none;\n    }\n    .grid-label {\n      font-size: 9px;\n      fill: var(--ngx-chart-axis-text, #94a3b8);\n      font-weight: 600;\n    }\n    .spoke-line {\n      stroke: var(--ngx-chart-grid, #e2e8f0);\n      stroke-width: 1;\n      stroke-dasharray: 2,2;\n    }\n    .direction-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #475569);\n      font-weight: 700;\n      user-select: none;\n    }\n    .rose-wedge {\n      cursor: pointer;\n      transform-origin: center;\n      animation: wedgeScaleIn 0.8s cubic-bezier(0.34, 1.3, 0.64, 1) forwards;\n      opacity: 0;\n    }\n    @keyframes wedgeScaleIn {\n      from { transform: scale(0); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .rose-wedge.dimmed {\n      opacity: 0.25 !important;\n    }\n    .rose-wedge.highlighted {\n      stroke: var(--ngx-chart-axis-strong, #475569) !important;\n      stroke-width: 1px !important;\n    }\n    .legend-container {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 12px;\n      justify-content: center;\n      margin-top: 14px;\n      padding-top: 10px;\n      border-top: 1px solid var(--ngx-chart-grid, #f1f5f9);\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 2px;\n    }\n    .legend-text {\n      font-size: 11px;\n      color: var(--ngx-chart-axis-text, #475569);\n      font-weight: 600;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n  `]\n})\nexport class WindRoseChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<WindRoseItem[]>([]);\n  height = input<number>(400);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredBin = signal<{ wIdx: number; bIdx: number } | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  readonly Math = Math;\n\n  directionsList = [\n    'N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE',\n    'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'\n  ];\n\n  svgHeight = computed(() => this.height());\n  maxRadius = computed(() => Math.min(this.containerWidth(), this.svgHeight()) * 0.45 - 28);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  directionAngle(dir: string): number {\n    const idx = this.directionsList.indexOf(dir);\n    if (idx === -1) return 0;\n    return -Math.PI / 2 + (idx * 2 * Math.PI) / 16;\n  }\n\n  maxCumulativePercentage = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 0;\n    let maxVal = 0;\n    raw.forEach(item => {\n      const sum = item.speedBins.reduce((acc, bin) => acc + bin.value, 0);\n      if (sum > maxVal) maxVal = sum;\n    });\n    return maxVal;\n  });\n\n  gridLevels = computed(() => {\n    const maxPct = this.maxCumulativePercentage();\n    if (maxPct === 0) return [5, 10, 15, 20];\n    \n    if (maxPct <= 10) return [2.5, 5, 7.5, 10];\n    if (maxPct <= 20) return [5, 10, 15, 20];\n    return [10, 20, 30, 40];\n  });\n\n  maxGridPct = computed(() => {\n    const levels = this.gridLevels();\n    return levels[levels.length - 1] || 100;\n  });\n\n  radiusScale(pct: number): number {\n    const rMax = this.maxRadius();\n    const gridMax = this.maxGridPct();\n    return (pct / gridMax) * rMax;\n  }\n\n  computedWedges = computed<ProcessedWedge[]>(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n\n    const palette = this.colors();\n    const rMax = this.maxRadius();\n    const gridMax = this.maxGridPct();\n\n    const sectorAngle = (2 * Math.PI) / 16;\n    const wedgeAngleSweep = sectorAngle * 0.8;\n\n    return raw.map((item, wIdx) => {\n      const angle = this.directionAngle(item.direction);\n      const startAngle = angle - wedgeAngleSweep / 2;\n      const endAngle = angle + wedgeAngleSweep / 2;\n\n      let runningSum = 0;\n      const bins: ProcessedWedgeBin[] = item.speedBins.map((bin, bIdx) => {\n        const value = bin.value;\n        const startRad = (runningSum / gridMax) * rMax;\n        runningSum += value;\n        const endRad = (runningSum / gridMax) * rMax;\n\n        const color = palette[bIdx % palette.length];\n\n        const x1 = startRad * Math.cos(startAngle);\n        const y1 = startRad * Math.sin(startAngle);\n        const x2 = startRad * Math.cos(endAngle);\n        const y2 = startRad * Math.sin(endAngle);\n\n        const x3 = endRad * Math.cos(endAngle);\n        const y3 = endRad * Math.sin(endAngle);\n        const x4 = endRad * Math.cos(startAngle);\n        const y4 = endRad * Math.sin(startAngle);\n\n        const path = `M ${x4} ${y4} L ${x3} ${y3} A ${endRad} ${endRad} 0 0 0 ${x2} ${y2} L ${x1} ${y1} A ${startRad} ${startRad} 0 0 1 ${x4} ${y4} Z`;\n\n        return {\n          direction: item.direction,\n          binLabel: bin.label,\n          value,\n          cumValue: runningSum,\n          color,\n          path\n        };\n      });\n\n      return {\n        direction: item.direction,\n        angle,\n        bins\n      };\n    });\n  });\n\n  legendItems = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n    \n    const firstWedge = raw[0];\n    const palette = this.colors();\n    \n    return firstWedge.speedBins.map((bin, idx) => ({\n      label: bin.label,\n      color: palette[idx % palette.length]\n    }));\n  });\n\n  onWedgeHover(wIdx: number, bIdx: number, event: MouseEvent) {\n    this.hoveredBin.set({ wIdx, bIdx });\n    const wedge = this.computedWedges()[wIdx];\n    if (wedge) {\n      const bin = wedge.bins[bIdx];\n      if (bin) {\n        this.tooltip.set(bin);\n      }\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-wind-rose');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredBin.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const raw = this.data();\n    if (!raw.length) return;\n    const headers = ['Direction', 'SpeedBin', 'Frequency'];\n    const rows: (string | number)[][] = [];\n    raw.forEach(item => {\n      item.speedBins.forEach(bin => {\n        rows.push([item.direction, bin.label, bin.value]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'wind-rose-data.csv');\n  }\n\n  exportToJson(): void {\n    const raw = this.data();\n    if (!raw.length) return;\n    const data = raw.flatMap(item =>\n      item.speedBins.map(bin => ({\n        direction: item.direction,\n        binLabel: bin.label,\n        value: bin.value\n      }))\n    );\n    this.exportSvc.downloadJson(data, 'wind-rose-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'wind-rose.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'wind-rose.pdf');\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface AreaRangeDataPoint {\n  category: string;\n  low: number;\n  high: number;\n}\n\nexport interface AreaRangeSeries {\n  name: string;\n  data: AreaRangeDataPoint[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-area-range-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-area-range-chart\" (mousemove)=\"onMouseMove($event)\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend()) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"seriesColor(i, s)\"></span>\n              {{ s.name }} (Range)\n            </span>\n          }\n        </div>\n      }\n      \n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <defs>\n            @for (s of series(); track s.name; let i = $index) {\n              <linearGradient [attr.id]=\"'range-gradient-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.4\"/>\n                <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.05\"/>\n              </linearGradient>\n            }\n          </defs>\n          \n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Gridlines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" stroke=\"var(--ngx-chart-grid, #e2e8f0)\" stroke-dasharray=\"3,3\"/>\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(tick) }}</text>\n              </g>\n            }\n\n            <!-- X Axis Categories -->\n            @for (cat of inferredCategories(); track cat; let i = $index) {\n              <text [attr.x]=\"xPos(i)\" [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ cat }}</text>\n            }\n\n            <!-- Range Shaded Areas and Boundaries -->\n            @for (s of series(); track s.name; let si = $index) {\n              <!-- Area Fill -->\n              <path\n                [attr.d]=\"areaPath(s)\"\n                [attr.fill]=\"'url(#range-gradient-' + si + ')'\"\n                stroke=\"none\"\n                class=\"area-path\"\n              />\n              \n              <!-- High Boundary Line -->\n              <path\n                [attr.d]=\"highLinePath(s)\"\n                [attr.stroke]=\"seriesColor(si, s)\"\n                fill=\"none\"\n                stroke-width=\"2\"\n                stroke-linejoin=\"round\"\n                stroke-linecap=\"round\"\n                class=\"line-path high-boundary\"\n              />\n\n              <!-- Low Boundary Line -->\n              <path\n                [attr.d]=\"lowLinePath(s)\"\n                [attr.stroke]=\"seriesColor(si, s)\"\n                fill=\"none\"\n                stroke-width=\"1.5\"\n                stroke-dasharray=\"3,3\"\n                stroke-linejoin=\"round\"\n                stroke-linecap=\"round\"\n                class=\"line-path low-boundary\"\n              />\n              \n              <!-- Hover Markers (dots on high and low bounds) -->\n              @if (showMarkers() && animateState()) {\n                @for (d of s.data; track $index; let ci = $index) {\n                  <!-- High Dot -->\n                  <circle\n                    [attr.cx]=\"xPos(ci)\"\n                    [attr.cy]=\"yPos(d.high)\"\n                    [attr.r]=\"activeCategoryIndex() === ci ? 5 : 3.5\"\n                    [attr.fill]=\"seriesColor(si, s)\"\n                    [attr.stroke]=\"'#fff'\"\n                    [attr.stroke-width]=\"activeCategoryIndex() === ci ? 2 : 1.5\"\n                    class=\"marker-dot\"\n                  />\n                  <!-- Low Dot -->\n                  <circle\n                    [attr.cx]=\"xPos(ci)\"\n                    [attr.cy]=\"yPos(d.low)\"\n                    [attr.r]=\"activeCategoryIndex() === ci ? 5 : 3.5\"\n                    [attr.fill]=\"seriesColor(si, s)\"\n                    [attr.stroke]=\"'#fff'\"\n                    [attr.stroke-width]=\"activeCategoryIndex() === ci ? 2 : 1.5\"\n                    class=\"marker-dot\"\n                  />\n                  <!-- Optional Labels -->\n                  @if (showLabels() && activeCategoryIndex() === ci) {\n                    <text [attr.x]=\"xPos(ci)\" [attr.y]=\"yPos(d.high) - 8\" class=\"label-text\" text-anchor=\"middle\">{{ fmtNum(d.high) }}</text>\n                    <text [attr.x]=\"xPos(ci)\" [attr.y]=\"yPos(d.low) + 14\" class=\"label-text\" text-anchor=\"middle\">{{ fmtNum(d.low) }}</text>\n                  }\n                }\n              }\n            }\n\n            <!-- Vertical Crosshair -->\n            @if (crosshair(); as ch) {\n              <line [attr.x1]=\"ch.x\" [attr.x2]=\"ch.x\" y1=\"0\" [attr.y2]=\"innerH()\"\n                stroke=\"var(--primary-color, #4f46e5)\" stroke-opacity=\"0.3\" stroke-width=\"1.5\" stroke-dasharray=\"4,4\"/>\n            }\n\n            <!-- Axis Lines -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n          </g>\n        </svg>\n      </div>\n\n      <!-- Hover Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <div class=\"tt-cat\">{{ t.cat }}</div>\n          @for (row of t.rows; track row.name) {\n            <div class=\"tt-row header-row\">\n              <span class=\"tt-dot\" [style.background]=\"row.color\"></span>\n              <strong class=\"tt-name\">{{ row.name }}</strong>\n            </div>\n            <div class=\"tt-row detail-row\">\n              <span class=\"tt-sub-label\">High:</span>\n              <span class=\"tt-val\">{{ fmtNum(row.high) }}</span>\n            </div>\n            <div class=\"tt-row detail-row\">\n              <span class=\"tt-sub-label\">Low:</span>\n              <span class=\"tt-val\">{{ fmtNum(row.low) }}</span>\n            </div>\n            <div class=\"tt-row detail-row range-row\">\n              <span class=\"tt-sub-label\">Range:</span>\n              <span class=\"tt-val highlight\">{{ fmtNum(row.high - row.low) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-area-range-chart {\n      position: relative;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      padding: 0 0 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .legend-dot {\n      width: 12px;\n      height: 6px;\n      border-radius: 2px;\n      display: inline-block;\n      opacity: 0.7;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n      cursor: crosshair;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n    }\n    .label-text {\n      font-size: 9px;\n      fill: var(--text-primary, #1e293b);\n      font-weight: bold;\n      pointer-events: none;\n    }\n    \n    @keyframes lineDraw {\n      from { stroke-dashoffset: 1200; }\n      to { stroke-dashoffset: 0; }\n    }\n    .line-path {\n      stroke-dasharray: 1200;\n      stroke-dashoffset: 1200;\n      animation: lineDraw 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    \n    @keyframes areaFadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .area-path {\n      animation: areaFadeIn 1s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both;\n    }\n\n    .marker-dot {\n      animation: areaFadeIn 0.5s ease 0.8s both;\n      transition: r 0.15s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.15s;\n    }\n    \n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11.5px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 8px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 6px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .header-row {\n      margin-top: 8px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.1);\n      padding-top: 6px;\n    }\n    .header-row:first-of-type {\n      margin-top: 0;\n      border-top: none;\n      padding-top: 0;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.95);\n      flex: 1;\n    }\n    .detail-row {\n      padding-left: 16px;\n      font-size: 11px;\n    }\n    .tt-sub-label {\n      color: rgba(248, 250, 252, 0.65);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 600;\n      font-family: monospace;\n    }\n    .tt-val.highlight {\n      color: #38bdf8;\n    }\n    .range-row {\n      border-top: 1px dotted rgba(255, 255, 255, 0.1);\n      margin-top: 2px;\n      padding-top: 2px;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class AreaRangeChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 15;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<AreaRangeSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showMarkers = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showLabels = input<boolean>(false);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  crosshair = signal<{ x: number } | null>(null);\n  activeCategoryIndex = signal<number | null>(null);\n  tooltip = signal<{ x: number; y: number; cat: string; rows: { name: string; low: number; high: number; color: string }[] } | null>(null);\n  containerWidth = signal<number>(600);\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  inferredCategories = computed(() => {\n    const cats = this.categories();\n    if (cats.length > 0) return cats;\n    const s = this.series();\n    if (s.length === 0) return [];\n    return s[0].data.map(d => d.category);\n  });\n\n  animateState = signal(false);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  private allLowHighValues = computed(() => this.series().flatMap(s => s.data.flatMap(d => [d.low, d.high])));\n  private yMin = computed(() => {\n    const vals = this.allLowHighValues();\n    if (vals.length === 0) return 0;\n    const min = Math.min(...vals);\n    return min < 0 ? min * 1.1 : min * 0.95;\n  });\n  private yMax = computed(() => {\n    const vals = this.allLowHighValues();\n    if (vals.length === 0) return 100;\n    const max = Math.max(...vals);\n    return max < 0 ? max * 0.95 : max * 1.05;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  yPos(v: number): number {\n    const ticks = this.yTicks();\n    return scale(v, ticks[0], ticks[ticks.length - 1], this.innerH(), 0);\n  }\n\n  xPos(i: number): number {\n    const n = this.inferredCategories().length;\n    return n <= 1 ? this.innerW() / 2 : scale(i, 0, n - 1, 0, this.innerW());\n  }\n\n  seriesColor(i: number, s: AreaRangeSeries): string {\n    return s.color || this.colors()[i % this.colors().length];\n  }\n\n  highLinePath(s: AreaRangeSeries): string {\n    if (s.data.length === 0) return '';\n    return 'M ' + s.data.map((d, i) => `${this.xPos(i)} ${this.yPos(d.high)}`).join(' L ');\n  }\n\n  lowLinePath(s: AreaRangeSeries): string {\n    if (s.data.length === 0) return '';\n    return 'M ' + s.data.map((d, i) => `${this.xPos(i)} ${this.yPos(d.low)}`).join(' L ');\n  }\n\n  areaPath(s: AreaRangeSeries): string {\n    const data = s.data;\n    if (data.length === 0) return '';\n    const highPts = data.map((d, i) => `${this.xPos(i)} ${this.yPos(d.high)}`);\n    const lowPts = [...data].reverse().map((d, i) => `${this.xPos(data.length - 1 - i)} ${this.yPos(d.low)}`);\n    return `M ${highPts.join(' L ')} L ${lowPts.join(' L ')} Z`;\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.PAD_LEFT;\n    const cats = this.inferredCategories();\n    if (cats.length === 0) return;\n    const idx = Math.round(scale(mx, 0, this.innerW(), 0, cats.length - 1));\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n    this.crosshair.set({ x: this.xPos(ci) });\n    this.activeCategoryIndex.set(ci);\n\n    const rows = this.series().map((s, si) => {\n      const point = s.data[ci];\n      return {\n        name: s.name,\n        low: point ? point.low : 0,\n        high: point ? point.high : 0,\n        color: this.seriesColor(si, s)\n      };\n    });\n\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      cat: cats[ci],\n      rows\n    });\n  }\n\n  onMouseLeave(): void {\n    this.crosshair.set(null);\n    this.activeCategoryIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.series(), 'area-range-data.json');\n  }\n\n  exportToCsv(): void {\n    const sers = this.series();\n    if (!sers.length) return;\n    const headers = ['Series', 'Category', 'Low', 'High'];\n    const rows: (string | number)[][] = [];\n    sers.forEach(s => {\n      s.data.forEach(d => {\n        rows.push([s.name, d.category, d.low, d.high]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'area-range-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, smoothPath, fmtNum } from '../shared/chart-utils';\n\nexport interface AreaRangeDataPoint {\n  category: string;\n  low: number;\n  high: number;\n}\n\nexport interface AreaRangeSeries {\n  name: string;\n  data: AreaRangeDataPoint[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-area-spline-range-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-area-spline-range-chart\" (mousemove)=\"onMouseMove($event)\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend()) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"seriesColor(i, s)\"></span>\n              {{ s.name }} (Spline Range)\n            </span>\n          }\n        </div>\n      }\n      \n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <defs>\n            @for (s of series(); track s.name; let i = $index) {\n              <linearGradient [attr.id]=\"'spline-gradient-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.45\"/>\n                <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.05\"/>\n              </linearGradient>\n            }\n          </defs>\n          \n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Gridlines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" stroke=\"var(--ngx-chart-grid, #e2e8f0)\" stroke-dasharray=\"3,3\"/>\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(tick) }}</text>\n              </g>\n            }\n\n            <!-- X Axis Categories -->\n            @for (cat of inferredCategories(); track cat; let i = $index) {\n              <text [attr.x]=\"xPos(i)\" [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ cat }}</text>\n            }\n\n            <!-- Range Shaded Areas and Smooth Boundaries -->\n            @for (s of series(); track s.name; let si = $index) {\n              <!-- Smooth Area Fill -->\n              <path\n                [attr.d]=\"areaPath(s)\"\n                [attr.fill]=\"'url(#spline-gradient-' + si + ')'\"\n                stroke=\"none\"\n                class=\"area-path\"\n              />\n              \n              <!-- Smooth High Boundary Line -->\n              <path\n                [attr.d]=\"highLinePath(s)\"\n                [attr.stroke]=\"seriesColor(si, s)\"\n                fill=\"none\"\n                stroke-width=\"2.5\"\n                stroke-linejoin=\"round\"\n                stroke-linecap=\"round\"\n                class=\"line-path high-boundary\"\n              />\n\n              <!-- Smooth Low Boundary Line -->\n              <path\n                [attr.d]=\"lowLinePath(s)\"\n                [attr.stroke]=\"seriesColor(si, s)\"\n                fill=\"none\"\n                stroke-width=\"1.5\"\n                stroke-dasharray=\"3,3\"\n                stroke-linejoin=\"round\"\n                stroke-linecap=\"round\"\n                class=\"line-path low-boundary\"\n              />\n              \n              <!-- Hover Markers (dots on smooth bounds) -->\n              @if (showMarkers() && animateState()) {\n                @for (d of s.data; track $index; let ci = $index) {\n                  <!-- High Dot -->\n                  <circle\n                    [attr.cx]=\"xPos(ci)\"\n                    [attr.cy]=\"yPos(d.high)\"\n                    [attr.r]=\"activeCategoryIndex() === ci ? 5.5 : 3.5\"\n                    [attr.fill]=\"seriesColor(si, s)\"\n                    [attr.stroke]=\"'#fff'\"\n                    [attr.stroke-width]=\"activeCategoryIndex() === ci ? 2 : 1.5\"\n                    class=\"marker-dot\"\n                  />\n                  <!-- Low Dot -->\n                  <circle\n                    [attr.cx]=\"xPos(ci)\"\n                    [attr.cy]=\"yPos(d.low)\"\n                    [attr.r]=\"activeCategoryIndex() === ci ? 5.5 : 3.5\"\n                    [attr.fill]=\"seriesColor(si, s)\"\n                    [attr.stroke]=\"'#fff'\"\n                    [attr.stroke-width]=\"activeCategoryIndex() === ci ? 2 : 1.5\"\n                    class=\"marker-dot\"\n                  />\n                  <!-- Optional Labels -->\n                  @if (showLabels() && activeCategoryIndex() === ci) {\n                    <text [attr.x]=\"xPos(ci)\" [attr.y]=\"yPos(d.high) - 8\" class=\"label-text\" text-anchor=\"middle\">{{ fmtNum(d.high) }}</text>\n                    <text [attr.x]=\"xPos(ci)\" [attr.y]=\"yPos(d.low) + 14\" class=\"label-text\" text-anchor=\"middle\">{{ fmtNum(d.low) }}</text>\n                  }\n                }\n              }\n            }\n\n            <!-- Vertical Crosshair -->\n            @if (crosshair(); as ch) {\n              <line [attr.x1]=\"ch.x\" [attr.x2]=\"ch.x\" y1=\"0\" [attr.y2]=\"innerH()\"\n                stroke=\"var(--primary-color, #4f46e5)\" stroke-opacity=\"0.3\" stroke-width=\"1.5\" stroke-dasharray=\"4,4\"/>\n            }\n\n            <!-- Axis Lines -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n          </g>\n        </svg>\n      </div>\n\n      <!-- Hover Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <div class=\"tt-cat\">{{ t.cat }}</div>\n          @for (row of t.rows; track row.name) {\n            <div class=\"tt-row header-row\">\n              <span class=\"tt-dot\" [style.background]=\"row.color\"></span>\n              <strong class=\"tt-name\">{{ row.name }}</strong>\n            </div>\n            <div class=\"tt-row detail-row\">\n              <span class=\"tt-sub-label\">High (Max):</span>\n              <span class=\"tt-val\">{{ fmtNum(row.high) }}</span>\n            </div>\n            <div class=\"tt-row detail-row\">\n              <span class=\"tt-sub-label\">Low (Min):</span>\n              <span class=\"tt-val\">{{ fmtNum(row.low) }}</span>\n            </div>\n            <div class=\"tt-row detail-row range-row\">\n              <span class=\"tt-sub-label\">Spread Range:</span>\n              <span class=\"tt-val highlight\">{{ fmtNum(row.high - row.low) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-area-spline-range-chart {\n      position: relative;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      padding: 0 0 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .legend-dot {\n      width: 12px;\n      height: 6px;\n      border-radius: 2px;\n      display: inline-block;\n      opacity: 0.7;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n      cursor: crosshair;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n    }\n    .label-text {\n      font-size: 9px;\n      fill: var(--text-primary, #1e293b);\n      font-weight: bold;\n      pointer-events: none;\n    }\n    \n    @keyframes lineDraw {\n      from { stroke-dashoffset: 1200; }\n      to { stroke-dashoffset: 0; }\n    }\n    .line-path {\n      stroke-dasharray: 1200;\n      stroke-dashoffset: 1200;\n      animation: lineDraw 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    \n    @keyframes areaFadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n    .area-path {\n      animation: areaFadeIn 1s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both;\n    }\n\n    .marker-dot {\n      animation: areaFadeIn 0.5s ease 0.8s both;\n      transition: r 0.15s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.15s;\n    }\n    \n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11.5px;\n      min-width: 155px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 8px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 6px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .header-row {\n      margin-top: 8px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.1);\n      padding-top: 6px;\n    }\n    .header-row:first-of-type {\n      margin-top: 0;\n      border-top: none;\n      padding-top: 0;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.95);\n      flex: 1;\n    }\n    .detail-row {\n      padding-left: 16px;\n      font-size: 11px;\n    }\n    .tt-sub-label {\n      color: rgba(248, 250, 252, 0.65);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 600;\n      font-family: monospace;\n    }\n    .tt-val.highlight {\n      color: #38bdf8;\n    }\n    .range-row {\n      border-top: 1px dotted rgba(255, 255, 255, 0.1);\n      margin-top: 2px;\n      padding-top: 2px;\n    }\n\n    /* Export styles */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class AreaSplineRangeChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 15;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<AreaRangeSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showMarkers = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showLabels = input<boolean>(false);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  crosshair = signal<{ x: number } | null>(null);\n  activeCategoryIndex = signal<number | null>(null);\n  tooltip = signal<{ x: number; y: number; cat: string; rows: { name: string; low: number; high: number; color: string }[] } | null>(null);\n  containerWidth = signal<number>(600);\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  inferredCategories = computed(() => {\n    const cats = this.categories();\n    if (cats.length > 0) return cats;\n    const s = this.series();\n    if (s.length === 0) return [];\n    return s[0].data.map(d => d.category);\n  });\n\n  animateState = signal(false);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  private allLowHighValues = computed(() => this.series().flatMap(s => s.data.flatMap(d => [d.low, d.high])));\n  private yMin = computed(() => {\n    const vals = this.allLowHighValues();\n    if (vals.length === 0) return 0;\n    const min = Math.min(...vals);\n    return min < 0 ? min * 1.1 : min * 0.95;\n  });\n  private yMax = computed(() => {\n    const vals = this.allLowHighValues();\n    if (vals.length === 0) return 100;\n    const max = Math.max(...vals);\n    return max < 0 ? max * 0.95 : max * 1.05;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  yPos(v: number): number {\n    const ticks = this.yTicks();\n    return scale(v, ticks[0], ticks[ticks.length - 1], this.innerH(), 0);\n  }\n\n  xPos(i: number): number {\n    const n = this.inferredCategories().length;\n    return n <= 1 ? this.innerW() / 2 : scale(i, 0, n - 1, 0, this.innerW());\n  }\n\n  seriesColor(i: number, s: AreaRangeSeries): string {\n    return s.color || this.colors()[i % this.colors().length];\n  }\n\n  highLinePath(s: AreaRangeSeries): string {\n    const pts: [number, number][] = s.data.map((d, i) => [this.xPos(i), this.yPos(d.high)]);\n    return smoothPath(pts);\n  }\n\n  lowLinePath(s: AreaRangeSeries): string {\n    const pts: [number, number][] = s.data.map((d, i) => [this.xPos(i), this.yPos(d.low)]);\n    return smoothPath(pts);\n  }\n\n  areaPath(s: AreaRangeSeries): string {\n    const data = s.data;\n    if (data.length === 0) return '';\n    const highPts: [number, number][] = data.map((d, i) => [this.xPos(i), this.yPos(d.high)]);\n    const lowPts: [number, number][] = data.map((d, i) => [this.xPos(i), this.yPos(d.low)]);\n    \n    const highPath = smoothPath(highPts);\n    const lowPtsReversed = [...lowPts].reverse();\n    const lowPathReversed = smoothPath(lowPtsReversed);\n    \n    if (!lowPathReversed) return '';\n    const lowPathPart = 'L' + lowPathReversed.slice(1);\n    return `${highPath} ${lowPathPart} Z`;\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.PAD_LEFT;\n    const cats = this.inferredCategories();\n    if (cats.length === 0) return;\n    const idx = Math.round(scale(mx, 0, this.innerW(), 0, cats.length - 1));\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n    this.crosshair.set({ x: this.xPos(ci) });\n    this.activeCategoryIndex.set(ci);\n\n    const rows = this.series().map((s, si) => {\n      const point = s.data[ci];\n      return {\n        name: s.name,\n        low: point ? point.low : 0,\n        high: point ? point.high : 0,\n        color: this.seriesColor(si, s)\n      };\n    });\n\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      cat: cats[ci],\n      rows\n    });\n  }\n\n  onMouseLeave(): void {\n    this.crosshair.set(null);\n    this.activeCategoryIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.series(), 'area-range-data.json');\n  }\n\n  exportToCsv(): void {\n    const sers = this.series();\n    if (!sers.length) return;\n    const headers = ['Series', 'Category', 'Low', 'High'];\n    const rows: (string | number)[][] = [];\n    sers.forEach(s => {\n      s.data.forEach(d => {\n        rows.push([s.name, d.category, d.low, d.high]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'area-range-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, niceTicks, scale, smoothPath, fmtNum } from '../shared/chart-utils';\n\nexport interface StreamgraphSeries {\n  name: string;\n  data: number[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-streamgraph',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-streamgraph\" (mousemove)=\"onMouseMove($event)\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend()) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"seriesColor(i, s)\"></span>\n              {{ s.name }}\n            </span>\n          }\n        </div>\n      }\n      \n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <defs>\n            @for (s of series(); track s.name; let i = $index) {\n              <linearGradient [attr.id]=\"'stream-gradient-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.85\"/>\n                <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.6\"/>\n              </linearGradient>\n            }\n          </defs>\n          \n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Central Baseline (Zero Reference) -->\n            @if (showBaseline()) {\n              <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"yPos(0)\" [attr.y2]=\"yPos(0)\" \n                stroke=\"var(--ngx-chart-axis, #cbd5e1)\" stroke-dasharray=\"4,4\" stroke-opacity=\"0.7\"/>\n            }\n\n            <!-- Gridlines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" stroke=\"var(--ngx-chart-grid, #f1f5f9)\" stroke-dasharray=\"3,3\"/>\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(Math.abs(tick)) }}</text>\n              </g>\n            }\n\n            <!-- X Axis Categories -->\n            @for (cat of inferredCategories(); track cat; let i = $index) {\n              <text [attr.x]=\"xPos(i)\" [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ cat }}</text>\n            }\n\n            <!-- Flowing Spline Layers -->\n            @for (layer of computedLayers(); track layer.name; let li = $index) {\n              <path\n                [attr.d]=\"layer.path\"\n                [attr.fill]=\"'url(#stream-gradient-' + li + ')'\"\n                [attr.stroke]=\"layer.color\"\n                stroke-width=\"0.5\"\n                stroke-opacity=\"0.5\"\n                class=\"stream-path\"\n                [class.dimmed]=\"activeSeriesIndex() !== null && activeSeriesIndex() !== li\"\n                [class.active]=\"activeSeriesIndex() === li\"\n                (mouseenter)=\"activeSeriesIndex.set(li)\"\n                (mouseleave)=\"activeSeriesIndex.set(null)\"\n              />\n            }\n\n            <!-- Vertical Crosshair -->\n            @if (crosshair(); as ch) {\n              <line [attr.x1]=\"ch.x\" [attr.x2]=\"ch.x\" y1=\"0\" [attr.y2]=\"innerH()\"\n                stroke=\"var(--primary-color, #4f46e5)\" stroke-opacity=\"0.4\" stroke-width=\"1.5\" stroke-dasharray=\"4,4\"/>\n            }\n\n            <!-- Axis Line at bottom -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #cbd5e1)\"/>\n          </g>\n        </svg>\n      </div>\n\n      <!-- Hover Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <div class=\"tt-cat\">{{ t.cat }}</div>\n          <div class=\"tt-total-row\">Total Flow: <strong>{{ fmtNum(t.total) }}</strong></div>\n          @for (row of t.rows; track row.name; let ri = $index) {\n            <div class=\"tt-row\" [class.highlight]=\"activeSeriesIndex() === ri\">\n              <span class=\"tt-dot\" [style.background]=\"row.color\"></span>\n              <span class=\"tt-name\">{{ row.name }}</span>\n              <span class=\"tt-val\">{{ fmtNum(row.value) }}</span>\n              <span class=\"tt-percent\">({{ row.percent }})</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-streamgraph {\n      position: relative;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n    }\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      padding: 0 0 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      display: inline-block;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n    }\n    \n    .stream-path {\n      cursor: pointer;\n      transition: fill-opacity 0.2s, opacity 0.2s, stroke-width 0.2s;\n    }\n    .stream-path.dimmed {\n      opacity: 0.35;\n    }\n    .stream-path.active {\n      opacity: 1;\n      stroke-width: 1.5;\n      stroke: #ffffff;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11.5px;\n      min-width: 170px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-cat {\n      font-weight: 700;\n      font-size: 12.5px;\n      color: #38bdf8;\n    }\n    .tt-total-row {\n      font-size: 11px;\n      color: rgba(248, 250, 252, 0.7);\n      margin-bottom: 8px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      margin-top: 4px;\n      font-size: 11px;\n      color: rgba(248, 250, 252, 0.85);\n      transition: transform 0.1s, color 0.1s;\n    }\n    .tt-row.highlight {\n      color: #ffffff;\n      font-weight: bold;\n      transform: scale(1.05);\n    }\n    .tt-dot {\n      width: 7px;\n      height: 7px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 600;\n      font-family: monospace;\n    }\n    .tt-percent {\n      font-size: 9.5px;\n      color: rgba(248, 250, 252, 0.5);\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n    }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class StreamgraphComponent {\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 15;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<StreamgraphSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showBaseline = input<boolean>(true);\n\n  exportMenuOpen = signal(false);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  crosshair = signal<{ x: number } | null>(null);\n  activeSeriesIndex = signal<number | null>(null);\n  activeCategoryIndex = signal<number | null>(null);\n  tooltip = signal<{ x: number; y: number; cat: string; total: number; rows: { name: string; value: number; percent: string; color: string }[] } | null>(null);\n  containerWidth = signal<number>(600);\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  inferredCategories = computed(() => {\n    const cats = this.categories();\n    if (cats.length > 0) return cats;\n    const s = this.series();\n    if (s.length === 0) return [];\n    const maxLen = Math.max(...s.map(ser => ser.data.length));\n    return Array.from({ length: maxLen }, (_, i) => `Point ${i + 1}`);\n  });\n\n  animateState = signal(false);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n    setTimeout(() => this.animateState.set(true), 50);\n  }\n\n  // Calculate standard stacked stream offsets (Silhouette)\n  private stackLayout = computed(() => {\n    const sers = this.series();\n    const numCats = this.inferredCategories().length;\n    if (sers.length === 0 || numCats === 0) return { min: 0, max: 100, seriesLayers: [] };\n\n    // Initialize stacks\n    const lowStack: number[][] = Array.from({ length: sers.length }, () => Array(numCats).fill(0));\n    const highStack: number[][] = Array.from({ length: sers.length }, () => Array(numCats).fill(0));\n    const sumAtIdx = Array(numCats).fill(0);\n\n    // Compute sums at each index\n    for (let i = 0; i < numCats; i++) {\n      let sum = 0;\n      for (let j = 0; j < sers.length; j++) {\n        sum += sers[j].data[i] || 0;\n      }\n      sumAtIdx[i] = sum;\n    }\n\n    let globalMin = 0;\n    let globalMax = 1;\n\n    for (let i = 0; i < numCats; i++) {\n      const sum = sumAtIdx[i];\n      const offset = -sum / 2; // Symmetric Center\n      let runningSum = 0;\n      for (let j = 0; j < sers.length; j++) {\n        const val = sers[j].data[i] || 0;\n        lowStack[j][i] = offset + runningSum;\n        highStack[j][i] = offset + runningSum + val;\n        runningSum += val;\n\n        if (lowStack[j][i] < globalMin) globalMin = lowStack[j][i];\n        if (highStack[j][i] > globalMax) globalMax = highStack[j][i];\n      }\n    }\n\n    return {\n      min: globalMin,\n      max: globalMax,\n      lowStack,\n      highStack,\n      sumAtIdx\n    };\n  });\n\n  private yDomain = computed(() => {\n    const layout = this.stackLayout();\n    const min = layout.min;\n    const max = layout.max;\n    // Keep it symmetric\n    const bounds = Math.max(Math.abs(min), Math.abs(max));\n    return {\n      min: -bounds,\n      max: bounds\n    };\n  });\n\n  yTicks = computed(() => {\n    const domain = this.yDomain();\n    return niceTicks(domain.min, domain.max, 5);\n  });\n\n  yPos(v: number): number {\n    const ticks = this.yTicks();\n    return scale(v, ticks[0], ticks[ticks.length - 1], this.innerH(), 0);\n  }\n\n  xPos(i: number): number {\n    const n = this.inferredCategories().length;\n    return n <= 1 ? this.innerW() / 2 : scale(i, 0, n - 1, 0, this.innerW());\n  }\n\n  seriesColor(i: number, s: StreamgraphSeries): string {\n    return s.color || this.colors()[i % this.colors().length];\n  }\n\n  computedLayers = computed(() => {\n    const sers = this.series();\n    const layout = this.stackLayout();\n    if (sers.length === 0 || !layout.lowStack) return [];\n\n    return sers.map((s, si) => {\n      const lowPts: [number, number][] = s.data.map((_, i) => [this.xPos(i), this.yPos(layout.lowStack![si][i])]);\n      const highPts: [number, number][] = s.data.map((_, i) => [this.xPos(i), this.yPos(layout.highStack![si][i])]);\n\n      const highPath = smoothPath(highPts);\n      const lowPtsReversed = [...lowPts].reverse();\n      const lowPathReversed = smoothPath(lowPtsReversed);\n      \n      let path = '';\n      if (highPath && lowPathReversed) {\n        path = `${highPath} L ${lowPtsReversed[0][0]} ${lowPtsReversed[0][1]} ${lowPathReversed.slice(1)} Z`;\n      }\n\n      return {\n        name: s.name,\n        color: this.seriesColor(si, s),\n        path\n      };\n    });\n  });\n\n  onMouseMove(event: MouseEvent): void {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.PAD_LEFT;\n    const cats = this.inferredCategories();\n    if (cats.length === 0) return;\n    const idx = Math.round(scale(mx, 0, this.innerW(), 0, cats.length - 1));\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n    this.crosshair.set({ x: this.xPos(ci) });\n    this.activeCategoryIndex.set(ci);\n\n    const layout = this.stackLayout();\n    const totalFlow = layout.sumAtIdx ? layout.sumAtIdx[ci] : 0;\n\n    const rows = this.series().map((s, si) => {\n      const value = s.data[ci] || 0;\n      const pct = totalFlow > 0 ? ((value / totalFlow) * 100).toFixed(1) + '%' : '0%';\n      return {\n        name: s.name,\n        value,\n        percent: pct,\n        color: this.seriesColor(si, s)\n      };\n    });\n\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      cat: cats[ci],\n      total: totalFlow,\n      rows\n    });\n  }\n\n  onMouseLeave(): void {\n    this.crosshair.set(null);\n    this.activeCategoryIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const cats = this.inferredCategories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n\n    const data = cats.map((cat, ci) => {\n      const entry: Record<string, any> = { category: cat };\n      sers.forEach(s => {\n        entry[s.name] = s.data[ci] || 0;\n      });\n      return entry;\n    });\n\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'streamgraph-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const cats = this.inferredCategories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n\n    let headers = ['Category', ...sers.map(s => `\"${s.name}\"`)];\n    let csv = headers.join(',') + '\\n';\n\n    cats.forEach((cat, ci) => {\n      const row = [`\"${cat}\"`, ...sers.map(s => String(s.data[ci] || 0))];\n      csv += row.join(',') + '\\n';\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'streamgraph-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'streamgraph.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Streamgraph Chart Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .axis-label { font-size: 11px; fill: #6c757d; font-weight: 500; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Streamgraph Visualization Analysis</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n  readonly Math = Math;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface ColumnRangePoint {\n  category: string;\n  low: number;\n  high: number;\n}\n\nexport interface ColumnRangeSeries {\n  name: string;\n  data: ColumnRangePoint[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-column-range-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-column-range-chart\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend() && series().length > 0) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (s of series(); track s.name; let i = $index) {\n            <div class=\"legend-item\">\n              <span class=\"legend-rect\" [style.background]=\"seriesColor(i, s)\"></span>\n              <span class=\"legend-label\">{{ s.name }}</span>\n            </div>\n          }\n        </div>\n      }\n\n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" class=\"grid-line\" stroke-dasharray=\"3,3\" />\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(tick) }}</text>\n              </g>\n            }\n\n            <!-- X Axis Labels -->\n            @for (cat of inferredCategories(); track cat; let i = $index) {\n              <text\n                [attr.x]=\"bandXCenter(i)\"\n                [attr.y]=\"innerH() + 16\"\n                text-anchor=\"middle\"\n                class=\"axis-label\"\n              >\n                {{ cat }}\n              </text>\n            }\n\n            <!-- Columns -->\n            @for (s of series(); track s.name; let si = $index) {\n              @for (d of s.data; track $index; let ci = $index) {\n                @if (isValidPoint(d)) {\n                  <rect\n                    [attr.x]=\"barX(ci, si)\"\n                    [attr.y]=\"barY(d)\"\n                    [attr.width]=\"barWidth()\"\n                    [attr.height]=\"barHeight(d)\"\n                    [attr.fill]=\"seriesColor(si, s)\"\n                    rx=\"4\"\n                    ry=\"4\"\n                    class=\"column-rect\"\n                    [class.dimmed]=\"hoveredSeriesIndex() !== null && (hoveredSeriesIndex() !== si || hoveredCategoryIndex() !== ci)\"\n                    [class.highlighted]=\"hoveredSeriesIndex() === si && hoveredCategoryIndex() === ci\"\n                    (mouseenter)=\"onColumnHover(ci, si, d, $event)\"\n                    (mousemove)=\"onColumnMouseMove($event)\"\n                  />\n                  <!-- Optional Labels on top/bottom of columns -->\n                  @if (showLabels() && hoveredCategoryIndex() === ci && hoveredSeriesIndex() === si) {\n                    <text\n                      [attr.x]=\"barX(ci, si) + barWidth() / 2\"\n                      [attr.y]=\"barY(d) - 6\"\n                      text-anchor=\"middle\"\n                      class=\"label-text\"\n                    >\n                      {{ fmtNum(d.high) }}\n                    </text>\n                    <text\n                      [attr.x]=\"barX(ci, si) + barWidth() / 2\"\n                      [attr.y]=\"barY(d) + barHeight(d) + 12\"\n                      text-anchor=\"middle\"\n                      class=\"label-text\"\n                    >\n                      {{ fmtNum(d.low) }}\n                    </text>\n                  }\n                }\n              }\n            }\n\n            <!-- Axis Line -->\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n          </g>\n        </svg>\n      </div>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.category }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <span class=\"tt-name\">{{ t.seriesName }}</span>\n          </div>\n          <div class=\"tt-row detail-row\">\n            <span class=\"tt-sub-label\">High:</span>\n            <span class=\"tt-val\">{{ fmtNum(t.high) }}</span>\n          </div>\n          <div class=\"tt-row detail-row\">\n            <span class=\"tt-sub-label\">Low:</span>\n            <span class=\"tt-val\">{{ fmtNum(t.low) }}</span>\n          </div>\n          <div class=\"tt-row detail-row range-row\">\n            <span class=\"tt-sub-label\">Range Depth:</span>\n            <span class=\"tt-val highlight\">{{ fmtNum(t.high - t.low) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-column-range-chart {\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n      user-select: none;\n    }\n    .label-text {\n      font-size: 9px;\n      fill: var(--text-primary, #1e293b);\n      font-weight: bold;\n      pointer-events: none;\n    }\n    .column-rect {\n      cursor: pointer;\n      transition: opacity 0.2s ease, transform 0.2s ease, fill-opacity 0.2s ease;\n    }\n    .column-rect.dimmed {\n      opacity: 0.35;\n    }\n    .column-rect.highlighted {\n      opacity: 1;\n      filter: drop-shadow(0 4px 8px rgba(0,0,0,0.12));\n    }\n    \n    /* Legend */\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .legend-rect {\n      width: 12px;\n      height: 12px;\n      border-radius: 3px;\n    }\n    .legend-label {\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11.5px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.95);\n      font-weight: 600;\n      flex: 1;\n    }\n    .detail-row {\n      padding-left: 16px;\n      font-size: 11px;\n    }\n    .tt-sub-label {\n      color: rgba(248, 250, 252, 0.65);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 600;\n      font-family: monospace;\n    }\n    .tt-val.highlight {\n      color: #38bdf8;\n    }\n    .range-row {\n      border-top: 1px dotted rgba(255, 255, 255, 0.1);\n      margin-top: 2px;\n      padding-top: 2px;\n    }\n\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    `]\n})\nexport class ColumnRangeChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 15;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<ColumnRangeSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showLabels = input<boolean>(false);\n\n  containerWidth = signal<number>(600);\n  hoveredSeriesIndex = signal<number | null>(null);\n  hoveredCategoryIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  inferredCategories = computed(() => {\n    const cats = this.categories();\n    if (cats.length > 0) return cats;\n    const s = this.series();\n    if (s.length === 0) return [];\n    return s[0].data.map(d => d.category);\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Find min/max values for scale calculation\n  private allValues = computed(() => this.series().flatMap(s => s.data.flatMap(d => [d.low, d.high])));\n  \n  private yMin = computed(() => {\n    const vals = this.allValues();\n    if (vals.length === 0) return 0;\n    const min = Math.min(...vals);\n    return min < 0 ? min * 1.1 : min * 0.95;\n  });\n\n  private yMax = computed(() => {\n    const vals = this.allValues();\n    if (vals.length === 0) return 100;\n    const max = Math.max(...vals);\n    return max < 0 ? max * 0.95 : max * 1.05;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  yPos(v: number): number {\n    const ticks = this.yTicks();\n    return scale(v, ticks[0], ticks[ticks.length - 1], this.innerH(), 0);\n  }\n\n  // Ordinal Band Scales logic\n  bandW = computed(() => {\n    const numCats = this.inferredCategories().length || 1;\n    return this.innerW() / numCats;\n  });\n\n  groupW = computed(() => {\n    return this.bandW() * 0.85; // 85% of band is used for series grouping\n  });\n\n  barWidth = computed(() => {\n    const numSeries = this.series().length || 1;\n    return this.groupW() / numSeries;\n  });\n\n  bandXCenter(i: number): number {\n    return (i + 0.5) * this.bandW();\n  }\n\n  barX(i: number, si: number): number {\n    const bandCenter = this.bandXCenter(i);\n    const offset = -this.groupW() / 2 + si * this.barWidth();\n    return bandCenter + offset + (this.barWidth() * 0.05); // center offset and keep padding\n  }\n\n  barY(d: ColumnRangePoint): number {\n    const yL = this.yPos(d.low);\n    const yH = this.yPos(d.high);\n    return Math.min(yL, yH);\n  }\n\n  barHeight(d: ColumnRangePoint): number {\n    const yL = this.yPos(d.low);\n    const yH = this.yPos(d.high);\n    return Math.max(1, Math.abs(yL - yH));\n  }\n\n  isValidPoint(d: ColumnRangePoint): boolean {\n    return d !== null && d.low !== undefined && d.high !== undefined;\n  }\n\n  seriesColor(i: number, s: ColumnRangeSeries): string {\n    return s.color || this.colors()[i % this.colors().length];\n  }\n\n  onColumnHover(ci: number, si: number, d: ColumnRangePoint, event: MouseEvent) {\n    this.hoveredCategoryIndex.set(ci);\n    this.hoveredSeriesIndex.set(si);\n    const s = this.series()[si];\n    this.tooltip.set({\n      category: d.category,\n      seriesName: s.name,\n      low: d.low,\n      high: d.high,\n      color: this.seriesColor(si, s)\n    });\n  }\n\n  onColumnMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-column-range-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredCategoryIndex.set(null);\n    this.hoveredSeriesIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.series(), 'column-range-data.json');\n  }\n\n  exportToCsv(): void {\n    const sers = this.series();\n    if (!sers.length) return;\n    const headers = ['Series', 'Category', 'Low', 'High'];\n    const rows: (string | number)[][] = [];\n    sers.forEach(s => {\n      s.data.forEach(d => {\n        rows.push([s.name, d.category, d.low, d.high]);\n      });\n    });\n    this.exportSvc.downloadCsv(headers, rows, 'column-range-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface ColumnPyramidSeries {\n  name: string;\n  data: number[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-column-pyramid-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-column-pyramid-chart\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend() && series().length > 0) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (s of series(); track s.name; let i = $index) {\n            <div class=\"legend-item\">\n              <span class=\"legend-rect\" [style.border-bottom]=\"'10px solid ' + seriesColor(i, s)\"></span>\n              <span class=\"legend-label\">{{ s.name }}</span>\n            </div>\n          }\n        </div>\n      }\n\n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" class=\"grid-line\" stroke-dasharray=\"3,3\" />\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(tick) }}</text>\n              </g>\n            }\n\n            <!-- X Axis Labels -->\n            @for (cat of inferredCategories(); track cat; let i = $index) {\n              <text\n                [attr.x]=\"bandXCenter(i)\"\n                [attr.y]=\"innerH() + 16\"\n                text-anchor=\"middle\"\n                class=\"axis-label\"\n              >\n                {{ cat }}\n              </text>\n            }\n\n            <!-- Pyramid Columns (Polygons) -->\n            @for (s of series(); track s.name; let si = $index) {\n              @for (v of s.data; track $index; let ci = $index) {\n                <polygon\n                  [attr.points]=\"pyramidPoints(ci, si, v)\"\n                  [attr.fill]=\"seriesColor(si, s)\"\n                  [attr.stroke]=\"seriesColor(si, s)\"\n                  stroke-width=\"1\"\n                  class=\"pyramid-poly\"\n                  [class.dimmed]=\"hoveredSeriesIndex() !== null && (hoveredSeriesIndex() !== si || hoveredCategoryIndex() !== ci)\"\n                  [class.highlighted]=\"hoveredSeriesIndex() === si && hoveredCategoryIndex() === ci\"\n                  (mouseenter)=\"onPyramidHover(ci, si, v, $event)\"\n                  (mousemove)=\"onPyramidMouseMove($event)\"\n                />\n                <!-- Optional Value Labels -->\n                @if (showLabels() && hoveredCategoryIndex() === ci && hoveredSeriesIndex() === si) {\n                  <text\n                    [attr.x]=\"barXCenter(ci, si)\"\n                    [attr.y]=\"labelY(v)\"\n                    text-anchor=\"middle\"\n                    class=\"label-text\"\n                  >\n                    {{ fmtNum(v) }}\n                  </text>\n                }\n              }\n            }\n\n            <!-- Axis Line -->\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n          </g>\n        </svg>\n      </div>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.category }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <span class=\"tt-name\">{{ t.seriesName }}:</span>\n            <span class=\"tt-val highlight\">{{ fmtNum(t.value) }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-column-pyramid-chart {\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n      user-select: none;\n    }\n    .label-text {\n      font-size: 9.5px;\n      fill: var(--text-primary, #1e293b);\n      font-weight: bold;\n      pointer-events: none;\n    }\n    .pyramid-poly {\n      cursor: pointer;\n      transition: opacity 0.2s ease, fill-opacity 0.2s ease, stroke-width 0.2s ease;\n    }\n    .pyramid-poly.dimmed {\n      opacity: 0.35;\n    }\n    .pyramid-poly.highlighted {\n      opacity: 1;\n      stroke: #ffffff;\n      stroke-width: 1.5;\n      filter: drop-shadow(0 4px 8px rgba(0,0,0,0.12));\n    }\n    \n    /* Legend */\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .legend-rect {\n      width: 0;\n      height: 0;\n      border-left: 6px solid transparent;\n      border-right: 6px solid transparent;\n      display: inline-block;\n    }\n    .legend-label {\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11.5px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.85);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n    .tt-val.highlight {\n      color: #38bdf8;\n    }\n\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    `]\n})\nexport class ColumnPyramidChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 15;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  series = input<ColumnPyramidSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showLabels = input<boolean>(false);\n  inverted = input<boolean>(true); // default to inverted pyramid\n\n  containerWidth = signal<number>(600);\n  hoveredSeriesIndex = signal<number | null>(null);\n  hoveredCategoryIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  inferredCategories = computed(() => {\n    const cats = this.categories();\n    if (cats.length > 0) return cats;\n    const s = this.series();\n    if (s.length === 0) return [];\n    return s[0].data.map((_, i) => `Cat ${i + 1}`);\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  private allValues = computed(() => this.series().flatMap(s => s.data));\n  \n  private yMin = computed(() => {\n    const vals = this.allValues();\n    if (vals.length === 0) return 0;\n    const min = Math.min(...vals);\n    return min < 0 ? min * 1.1 : 0;\n  });\n\n  private yMax = computed(() => {\n    const vals = this.allValues();\n    if (vals.length === 0) return 100;\n    const max = Math.max(...vals);\n    return max < 0 ? 0 : max * 1.1;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  yPos(v: number): number {\n    const ticks = this.yTicks();\n    return scale(v, ticks[0], ticks[ticks.length - 1], this.innerH(), 0);\n  }\n\n  // Ordinal Band Scales\n  bandW = computed(() => {\n    const numCats = this.inferredCategories().length || 1;\n    return this.innerW() / numCats;\n  });\n\n  groupW = computed(() => {\n    return this.bandW() * 0.8; // 80% used for groups\n  });\n\n  barWidth = computed(() => {\n    const numSeries = this.series().length || 1;\n    return this.groupW() / numSeries;\n  });\n\n  bandXCenter(i: number): number {\n    return (i + 0.5) * this.bandW();\n  }\n\n  barXCenter(i: number, si: number): number {\n    const bandCenter = this.bandXCenter(i);\n    const offset = -this.groupW() / 2 + si * this.barWidth() + this.barWidth() / 2;\n    return bandCenter + offset;\n  }\n\n  pyramidPoints(i: number, si: number, v: number): string {\n    const xCenter = this.barXCenter(i, si);\n    const w = this.barWidth() * 0.9;\n    const xL = xCenter - w / 2;\n    const xR = xCenter + w / 2;\n    \n    const yBaseline = this.yPos(0);\n    const yVal = this.yPos(v);\n\n    if (this.inverted()) {\n      // Base at top (yVal), apex at baseline (yBaseline)\n      return `${xL},${yVal} ${xR},${yVal} ${xCenter},${yBaseline}`;\n    } else {\n      // Base at baseline (yBaseline), apex at top (yVal)\n      return `${xL},${yBaseline} ${xR},${yBaseline} ${xCenter},${yVal}`;\n    }\n  }\n\n  labelY(v: number): number {\n    const yVal = this.yPos(v);\n    const yBaseline = this.yPos(0);\n    if (this.inverted()) {\n      // Inverted pyramid: value is at the top, apex is at baseline\n      return yVal - 6;\n    } else {\n      // Upright pyramid: apex is at value\n      return yVal - 6;\n    }\n  }\n\n  seriesColor(i: number, s: ColumnPyramidSeries): string {\n    return s.color || this.colors()[i % this.colors().length];\n  }\n\n  onPyramidHover(ci: number, si: number, v: number, event: MouseEvent) {\n    this.hoveredCategoryIndex.set(ci);\n    this.hoveredSeriesIndex.set(si);\n    const s = this.series()[si];\n    const cats = this.inferredCategories();\n    this.tooltip.set({\n      category: cats[ci] || `Point ${ci + 1}`,\n      seriesName: s.name,\n      value: v,\n      color: this.seriesColor(si, s)\n    });\n  }\n\n  onPyramidMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-column-pyramid-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredCategoryIndex.set(null);\n    this.hoveredSeriesIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const data = cats.map((cat, ci) => {\n      const entry: Record<string, any> = { category: cat };\n      sers.forEach(s => {\n        if (s.data[ci] !== undefined && s.data[ci] !== null) {\n          entry[s.name] = s.data[ci];\n        }\n      });\n      return entry;\n    });\n    this.exportSvc.downloadJson(data, 'column-pyramid-data.json');\n  }\n\n  exportToCsv(): void {\n    const cats = this.categories();\n    const sers = this.series();\n    if (!cats.length || !sers.length) return;\n    const headers = ['Category', ...sers.map(s => s.name)];\n    const rows: (string | number)[][] = cats.map((cat, ci) => [cat, ...sers.map(s => s.data[ci] ?? '')]);\n    this.exportSvc.downloadCsv(headers, rows, 'column-pyramid-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, niceTicks, scale, fmtNum } from '../shared/chart-utils';\n\nexport interface VariwidePoint {\n  label: string;\n  y: number;   // Height value (e.g. price, percentage, rate)\n  w: number;   // Width value (e.g. quantity, volume, size)\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-variwide-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-variwide-chart\" (mouseleave)=\"onMouseLeave()\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Legend -->\n      @if (showLegend() && data().length > 0) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n          @for (d of data(); track d.label; let i = $index) {\n            <div class=\"legend-item\">\n              <span class=\"legend-rect\" [style.background]=\"pointColor(i, d)\"></span>\n              <span class=\"legend-label\">{{ d.label }} (w: {{ fmtNum(d.w) }})</span>\n            </div>\n          }\n        </div>\n      }\n\n      <div class=\"chart-svg-wrap\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines -->\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                @if (showGrid()) {\n                  <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" class=\"grid-line\" stroke-dasharray=\"3,3\" />\n                }\n                <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ fmtNum(tick) }}</text>\n              </g>\n            }\n\n            <!-- Variwide Columns -->\n            @for (p of computedPoints(); track p.label; let i = $index) {\n              <rect\n                [attr.x]=\"p.colX\"\n                [attr.y]=\"p.rectY\"\n                [attr.width]=\"p.colW\"\n                [attr.height]=\"p.colH\"\n                [attr.fill]=\"p.color\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.5\"\n                class=\"variwide-rect\"\n                [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n                [class.highlighted]=\"hoveredIndex() === i\"\n                (mouseenter)=\"onColumnHover(i, p, $event)\"\n                (mousemove)=\"onColumnMouseMove($event)\"\n              />\n              \n              <!-- Column Division Gridline -->\n              @if (i > 0 && showGrid()) {\n                <line\n                  [attr.x1]=\"p.colX\"\n                  [attr.x2]=\"p.colX\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  class=\"column-divider-line\"\n                  stroke-dasharray=\"2,2\"\n                />\n              }\n\n              <!-- Centered X Category Label -->\n              <text\n                [attr.x]=\"p.colX + p.colW / 2\"\n                [attr.y]=\"innerH() + 16\"\n                text-anchor=\"middle\"\n                class=\"axis-label category-label\"\n              >\n                {{ p.label }}\n              </text>\n\n              <!-- Optional labels inside/above columns -->\n              @if (showLabels() && hoveredIndex() === i) {\n                <text\n                  [attr.x]=\"p.colX + p.colW / 2\"\n                  [attr.y]=\"p.rectY - 6\"\n                  text-anchor=\"middle\"\n                  class=\"label-text\"\n                >\n                  {{ fmtNum(p.y) }}\n                </text>\n              }\n            }\n\n            <!-- Zero Baseline Line -->\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"yPos(0)\" [attr.y2]=\"yPos(0)\" class=\"baseline-line\" />\n            \n            <!-- Border lines -->\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n          </g>\n        </svg>\n      </div>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          <div class=\"tt-cat\">{{ t.label }}</div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <span class=\"tt-name\">Height (Y-Value):</span>\n            <span class=\"tt-val highlight\">{{ fmtNum(t.y) }}</span>\n          </div>\n          <div class=\"tt-row\">\n            <span class=\"tt-dot\" style=\"background: transparent;\"></span>\n            <span class=\"tt-name\">Width (Weight):</span>\n            <span class=\"tt-val\">{{ fmtNum(t.w) }}</span>\n          </div>\n          <div class=\"tt-row detail-row range-row\">\n            <span class=\"tt-sub-label\">Width Share:</span>\n            <span class=\"tt-val\">{{ t.pct }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    .ngx-variwide-chart {\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      padding: 20px;\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg-wrap {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n    }\n    .column-divider-line {\n      stroke: var(--ngx-chart-grid, #e2e8f0);\n      stroke-width: 1;\n      opacity: 0.5;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .baseline-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1;\n      stroke-opacity: 0.8;\n    }\n    .axis-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #94a3b8);\n      user-select: none;\n    }\n    .category-label {\n      font-size: 9.5px;\n      fill: var(--text-secondary, #64748b);\n    }\n    .label-text {\n      font-size: 9.5px;\n      fill: var(--text-primary, #1e293b);\n      font-weight: bold;\n      pointer-events: none;\n    }\n    .variwide-rect {\n      cursor: pointer;\n      transition: opacity 0.2s ease, fill-opacity 0.2s ease;\n    }\n    .variwide-rect.dimmed {\n      opacity: 0.35;\n    }\n    .variwide-rect.highlighted {\n      opacity: 1;\n      filter: drop-shadow(0 4px 10px rgba(0,0,0,0.15));\n    }\n    \n    /* Legend */\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      margin-bottom: 12px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .legend-rect {\n      width: 12px;\n      height: 12px;\n      border-radius: 3px;\n    }\n    .legend-label {\n      font-size: 12px;\n      color: var(--text-secondary, #64748b);\n      font-weight: 500;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11.5px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.85);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n    .tt-val.highlight {\n      color: #38bdf8;\n    }\n    .detail-row {\n      padding-left: 16px;\n      font-size: 11px;\n    }\n    .tt-sub-label {\n      color: rgba(248, 250, 252, 0.65);\n      flex: 1;\n    }\n    .range-row {\n      border-top: 1px dotted rgba(255, 255, 255, 0.1);\n      margin-top: 2px;\n      padding-top: 2px;\n    }\n\n    /* Export dropdown styles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n    }\n  `]\n})\nexport class VariwideChartComponent {\n  readonly PAD_LEFT = 48;\n  readonly PAD_TOP = 15;\n  readonly PAD_RIGHT = 16;\n  readonly PAD_BOTTOM = 32;\n\n  data = input<VariwidePoint[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  showLabels = input<boolean>(false);\n\n  containerWidth = signal<number>(600);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width - 40);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Width Calculations\n  totalWidthVal = computed(() => {\n    return this.data().reduce((acc, d) => acc + (d.w || 0), 0) || 1;\n  });\n\n  // Height scaling\n  private allYValues = computed(() => this.data().map(d => d.y));\n\n  private yMin = computed(() => {\n    const vals = this.allYValues();\n    if (vals.length === 0) return 0;\n    const min = Math.min(...vals);\n    return min < 0 ? min * 1.1 : 0;\n  });\n\n  private yMax = computed(() => {\n    const vals = this.allYValues();\n    if (vals.length === 0) return 100;\n    const max = Math.max(...vals);\n    return max < 0 ? 0 : max * 1.1;\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  yPos(v: number): number {\n    const ticks = this.yTicks();\n    return scale(v, ticks[0], ticks[ticks.length - 1], this.innerH(), 0);\n  }\n\n  pointColor(i: number, p: VariwidePoint): string {\n    return p.color || this.colors()[i % this.colors().length];\n  }\n\n  // Pre-calculate positions and widths of columns\n  computedPoints = computed(() => {\n    const raw = this.data();\n    const totalWVal = this.totalWidthVal();\n    const wScale = this.innerW() / totalWVal;\n    \n    let currentX = 0;\n    const yBaseline = this.yPos(0);\n\n    return raw.map((d, i) => {\n      const colW = (d.w || 0) * wScale;\n      const colX = currentX;\n      currentX += colW;\n\n      const yVal = this.yPos(d.y);\n      const rectY = Math.min(yBaseline, yVal);\n      const colH = Math.max(1, Math.abs(yBaseline - yVal));\n\n      return {\n        ...d,\n        colX,\n        colW,\n        rectY,\n        colH,\n        color: this.pointColor(i, d)\n      };\n    });\n  });\n\n  onColumnHover(idx: number, p: any, event: MouseEvent) {\n    this.hoveredIndex.set(idx);\n    const totalW = this.totalWidthVal();\n    const pct = totalW > 0 ? ((p.w / totalW) * 100).toFixed(1) + '%' : '0%';\n    this.tooltip.set({\n      label: p.label,\n      y: p.y,\n      w: p.w,\n      pct,\n      color: p.color\n    });\n  }\n\n  onColumnMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-variwide-chart');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'variwide-chart.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const totalW = this.totalWidthVal();\n    \n    let csv = 'Label,Height (Y-Value),Width (Weight),Width Share\\n';\n    data.forEach(d => {\n      const pct = totalW > 0 ? ((d.w / totalW) * 100).toFixed(2) + '%' : '0%';\n      csv += `\"${d.label}\",${d.y},${d.w},${pct}\\n`;\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'variwide-chart.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'variwide-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Variwide Chart Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .axis-label { font-size: 11px; fill: #6c757d; font-weight: 500; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Variwide Chart Analytics</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface VariablePieDataPoint {\n  label: string;\n  value: number;       // Determines arc angle (percentage of total value)\n  radiusValue: number; // Determines radius length of this specific slice\n  color?: string;\n}\n\ninterface ProcessedSlice {\n  index: number;\n  label: string;\n  value: number;\n  radiusValue: number;\n  pct: number;\n  color: string;\n  path: string;\n  midAngle: number;\n  cos: number;\n  sin: number;\n  outerR: number;\n  innerR: number;\n}\n\n@Component({\n  selector: 'ngx-variable-pie-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-variable-pie-chart\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + height() + ' ' + height()\"\n          [attr.width]=\"height()\"\n          [attr.height]=\"height()\"\n        >\n          <g [attr.transform]=\"'translate(' + cx() + ',' + cy() + ')'\" class=\"pie-group\">\n            @for (slice of slices(); track slice.index) {\n              <path\n                [attr.d]=\"slice.path\"\n                [attr.fill]=\"slice.color\"\n                [attr.stroke]=\"'#fff'\"\n                stroke-width=\"2\"\n                class=\"pie-slice\"\n                [class.hovered]=\"hovered() === slice.index\"\n                [style.transform]=\"hovered() === slice.index ? 'translate(' + (slice.cos * 8) + 'px,' + (slice.sin * 8) + 'px)' : 'translate(0, 0)'\"\n                (mouseenter)=\"hovered.set(slice.index); onSliceHover($event, slice)\"\n                (mouseleave)=\"hovered.set(-1); tooltip.set(null)\"\n              />\n              @if (showLabels() && slice.midAngle !== null) {\n                <text\n                  [attr.x]=\"labelX(slice)\"\n                  [attr.y]=\"labelY(slice)\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                  class=\"slice-label\"\n                >{{ slice.pct }}%</text>\n              }\n            }\n            <!-- Donut hole/center text -->\n            @if (mode() === 'donut') {\n              <circle [attr.r]=\"donutHoleRadius()\" fill=\"#ffffff\" />\n              <text class=\"donut-center-text\" text-anchor=\"middle\" dy=\"-8\">{{ centerTitle() }}</text>\n              <text class=\"donut-center-value\" text-anchor=\"middle\" dy=\"14\">{{ centerValue() }}</text>\n            }\n          </g>\n        </svg>\n\n        @if (showLegend()) {\n          <div class=\"chart-legend\">\n            @for (slice of slices(); track slice.index) {\n              <div class=\"legend-item\" (mouseenter)=\"hovered.set(slice.index)\" (mouseleave)=\"hovered.set(-1)\">\n                <span class=\"legend-dot\" [style.background]=\"slice.color\"></span>\n                <div class=\"legend-details\">\n                  <span class=\"legend-label\">{{ slice.label }}</span>\n                  <span class=\"legend-sub\">val: {{ fmtNum(slice.value) }} | rad: {{ fmtNum(slice.radiusValue) }}</span>\n                </div>\n                <span class=\"legend-pct\">{{ slice.pct }}%</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n          <div class=\"tt-content\">\n            <strong>{{ t.label }}</strong>\n            <div>Arc (Value): {{ fmtNum(t.value) }} ({{ t.pct }}%)</div>\n            <div>Radius: {{ fmtNum(t.radiusValue) }}</div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-variable-pie-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n      padding: 16px;\n      border-radius: 16px;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 8px;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 24px;\n      flex-wrap: wrap;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n      animation: pieGrow 0.75s cubic-bezier(0.16, 1, 0.3, 1) both;\n      transform-origin: center;\n    }\n\n    @keyframes pieGrow {\n      from { transform: scale(0.4) rotate(-90deg); opacity: 0; }\n      to { transform: scale(1) rotate(0); opacity: 1; }\n    }\n    .pie-group {\n      transform-origin: center;\n    }\n\n    .pie-slice {\n      cursor: pointer;\n      transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), fill-opacity 0.15s;\n      transform-origin: 0px 0px;\n    }\n    .pie-slice.hovered { fill-opacity: 0.95; filter: drop-shadow(0 6px 10px rgba(0,0,0,0.16)); }\n    .slice-label { font-size: 10px; fill: #fff; font-weight: 700; pointer-events: none; user-select: none; }\n    .donut-center-text { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; }\n    .donut-center-value { font-size: 20px; font-weight: 900; fill: var(--ngx-chart-text,#0f172a); }\n    .chart-legend { display: flex; flex-direction: column; gap: 6px; flex-shrink: 0; min-width: 160px; }\n    .legend-item { display: flex; align-items: center; gap: 8px; font-size: 12px; cursor: pointer; padding: 5px 10px; border-radius: 8px; transition: all 0.15s; }\n    .legend-item:hover { background: var(--ngx-chart-grid,#f1f3f5); }\n    .legend-dot { width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; }\n    .legend-details { display: flex; flex-direction: column; flex: 1; }\n    .legend-label { color: var(--ngx-chart-text,#212529); font-weight: 600; }\n    .legend-sub { font-size: 10px; color: var(--ngx-chart-axis-text,#6c757d); }\n    .legend-pct { font-weight: 600; color: var(--ngx-chart-text,#212529); }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex; align-items: flex-start; gap: 8px;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 4px; }\n    .tt-content { display: flex; flex-direction: column; gap: 2px; }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n    }\n  `]\n})\nexport class VariablePieChartComponent {\n  data = input<VariablePieDataPoint[]>([]);\n  mode = input<'pie' | 'donut'>('pie');\n  donutHoleSize = input<number>(0.35); // Fraction of max radius\n  height = input<number>(300);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  centerTitle = input<string>('Total');\n  centerValueOverride = input<string | null>(null, { alias: 'centerValue' });\n  showExport = input<boolean>(false);\n  minRadiusPercent = input<number>(0.35); // relative to max radius\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  exportMenuOpen = signal(false);\n  hovered = signal(-1);\n  tooltip = signal<{x:number;y:number;label:string;value:number;radiusValue:number;pct:number;color:string}|null>(null);\n\n  cx = computed(() => this.height() / 2);\n  cy = computed(() => this.height() / 2);\n  maxRadius = computed(() => this.height() / 2 - 20);\n\n  donutHoleRadius = computed(() => {\n    if (this.mode() !== 'donut') return 0;\n    return this.maxRadius() * this.donutHoleSize();\n  });\n\n  centerValue = computed(() => {\n    const override = this.centerValueOverride();\n    if (override !== null) return override;\n    const total = this.data().reduce((s, d) => s + d.value, 0);\n    return fmtNum(total);\n  });\n\n  slices = computed<ProcessedSlice[]>(() => {\n    const d = this.data();\n    if (!d.length) return [];\n    \n    const totalVal = d.reduce((s, x) => s + x.value, 0) || 1;\n    \n    // Find min and max radiusValues for scaling radius\n    let minRadVal = Infinity;\n    let maxRadVal = -Infinity;\n    d.forEach(x => {\n      if (x.radiusValue < minRadVal) minRadVal = x.radiusValue;\n      if (x.radiusValue > maxRadVal) maxRadVal = x.radiusValue;\n    });\n\n    if (minRadVal === Infinity) minRadVal = 0;\n    if (maxRadVal === -Infinity) maxRadVal = 1;\n    if (minRadVal === maxRadVal) minRadVal = maxRadVal - 1; // avoid divide by zero\n\n    const maxR = this.maxRadius();\n    const innerR = this.donutHoleRadius();\n    const minR = maxR * this.minRadiusPercent();\n\n    let start = -Math.PI / 2;\n    return d.map((item, i) => {\n      const frac = item.value / totalVal;\n      let angle = frac * Math.PI * 2;\n      // Cap angle slightly if it is a full circle to prevent coinciding SVG endpoints\n      if (frac >= 0.999) {\n        angle = Math.PI * 2 - 0.0001;\n      }\n      const end = start + angle;\n      const mid = start + angle / 2;\n\n      // Scale radius for this slice:\n      // If donut mode, outerRadius must be scaled in range [innerR + 15, maxR]\n      const rangeStart = this.mode() === 'donut' ? Math.max(innerR + 15, minR) : minR;\n      const rangeEnd = maxR;\n      \n      let outerR = rangeStart + ((item.radiusValue - minRadVal) / (maxRadVal - minRadVal)) * (rangeEnd - rangeStart);\n      if (isNaN(outerR)) outerR = maxR;\n\n      const path = this.mode() === 'donut'\n        ? this.ringPath(start, end, outerR, innerR)\n        : this.arcPath(start, end, outerR);\n\n      const cos = Math.cos(mid);\n      const sin = Math.sin(mid);\n      const res = {\n        index: i,\n        label: item.label,\n        value: item.value,\n        radiusValue: item.radiusValue,\n        pct: Math.round(frac * 100),\n        color: item.color || this.colors()[i % this.colors().length],\n        path,\n        midAngle: mid,\n        cos,\n        sin,\n        outerR,\n        innerR\n      };\n      start = end;\n      return res;\n    });\n  });\n\n  private arcPath(startAngle: number, endAngle: number, r: number): string {\n    const x1 = Math.cos(startAngle) * r;\n    const y1 = Math.sin(startAngle) * r;\n    const x2 = Math.cos(endAngle) * r;\n    const y2 = Math.sin(endAngle) * r;\n    const large = endAngle - startAngle > Math.PI ? 1 : 0;\n    return `M 0 0 L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`;\n  }\n\n  private ringPath(startAngle: number, endAngle: number, outerR: number, innerR: number): string {\n    const ox1 = Math.cos(startAngle) * outerR;\n    const oy1 = Math.sin(startAngle) * outerR;\n    const ox2 = Math.cos(endAngle) * outerR;\n    const oy2 = Math.sin(endAngle) * outerR;\n\n    const ix1 = Math.cos(startAngle) * innerR;\n    const iy1 = Math.sin(startAngle) * innerR;\n    const ix2 = Math.cos(endAngle) * innerR;\n    const iy2 = Math.sin(endAngle) * innerR;\n\n    const large = endAngle - startAngle > Math.PI ? 1 : 0;\n    return `M ${ix1} ${iy1} L ${ox1} ${oy1} A ${outerR} ${outerR} 0 ${large} 1 ${ox2} ${oy2} L ${ix2} ${iy2} A ${innerR} ${innerR} 0 ${large} 0 ${ix1} ${iy1} Z`;\n  }\n\n  labelX(s: ProcessedSlice): number {\n    const r = this.mode() === 'donut' ? (s.outerR + s.innerR) / 2 : s.outerR * 0.7;\n    return Math.cos(s.midAngle) * r;\n  }\n\n  labelY(s: ProcessedSlice): number {\n    const r = this.mode() === 'donut' ? (s.outerR + s.innerR) / 2 : s.outerR * 0.7;\n    return Math.sin(s.midAngle) * r;\n  }\n\n  onSliceHover(event: MouseEvent, slice: ProcessedSlice): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-variable-pie-chart') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: slice.label,\n      value: slice.value,\n      radiusValue: slice.radiusValue,\n      pct: slice.pct,\n      color: slice.color,\n    });\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    let csv = 'Label,Value,RadiusValue\\n';\n    data.forEach(d => {\n      csv += `\"${d.label}\",${d.value},${d.radiusValue}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'variable-pie-chart-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'variable-pie-chart-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'variable-pie-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Variable Radius Pie Chart Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; }\n          svg { max-width: 100%; height: auto; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Variable Radius Pie Chart Analytics</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface BubbleNode {\n  id: string;\n  label: string;\n  value: number;       // Determines size\n  group?: string;      // Optional grouping for clustered packing\n  color?: string;\n}\n\ninterface SimulatedNode {\n  id: string;\n  label: string;\n  value: number;\n  group: string;\n  r: number;\n  x: number;\n  y: number;\n  vx: number;\n  vy: number;\n  color: string;\n}\n\n@Component({\n  selector: 'ngx-packed-bubble-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-packed-bubble-chart\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n          [attr.width]=\"width()\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Grid/Background helper rings -->\n          <circle [attr.cx]=\"cx()\" [attr.cy]=\"cy()\" [attr.r]=\"cx() * 0.8\" fill=\"none\" stroke=\"var(--ngx-chart-grid, #f1f5f9)\" stroke-width=\"1\" stroke-dasharray=\"4\" />\n          <circle [attr.cx]=\"cx()\" [attr.cy]=\"cy()\" [attr.r]=\"cx() * 0.5\" fill=\"none\" stroke=\"var(--ngx-chart-grid, #f1f5f9)\" stroke-width=\"1\" stroke-dasharray=\"4\" />\n\n          <!-- Group Labels (centered around cluster areas if grouped) -->\n          @if (showGroupLabels() && groupCenters().length > 1) {\n            @for (gc of groupCenters(); track gc.group) {\n              <text\n                [attr.x]=\"gc.x\"\n                [attr.y]=\"gc.y - 20\"\n                text-anchor=\"middle\"\n                class=\"cluster-label\"\n              >\n                {{ gc.group }}\n              </text>\n            }\n          }\n\n          <!-- Bubble Elements -->\n          @for (node of computedNodes(); track node.id) {\n            <g class=\"bubble-group\" [class.hovered]=\"hoveredId() === node.id\">\n              <circle\n                [attr.cx]=\"node.x\"\n                [attr.cy]=\"node.y\"\n                [attr.r]=\"node.r\"\n                [attr.fill]=\"node.color\"\n                [attr.stroke]=\"'#ffffff'\"\n                [attr.stroke-width]=\"hoveredId() === node.id ? 3 : 1.5\"\n                class=\"bubble\"\n                (mouseenter)=\"hoveredId.set(node.id); onBubbleHover($event, node)\"\n                (mouseleave)=\"hoveredId.set(null); tooltip.set(null)\"\n              />\n              @if (showLabels() && node.r > 20) {\n                <text\n                  [attr.x]=\"node.x\"\n                  [attr.y]=\"node.y\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                  class=\"bubble-label\"\n                  [style.font-size.px]=\"Math.max(9, Math.min(13, node.r / 3.5))\"\n                >\n                  {{ truncate(node.label, node.r) }}\n                </text>\n              }\n            </g>\n          }\n        </svg>\n\n        <!-- Legend (shown if groups exist) -->\n        @if (showLegend() && uniqueGroups().length > 1) {\n          <div class=\"chart-legend\">\n            @for (grp of uniqueGroups(); track grp; let i = $index) {\n              <div class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"getGroupColor(grp, i)\"></span>\n                <span class=\"legend-label\">{{ grp }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n          <div class=\"tt-content\">\n            <strong>{{ t.label }}</strong>\n            @if (t.group) {\n              <div class=\"tt-group\">Group: {{ t.group }}</div>\n            }\n            <div class=\"tt-val\">Value: {{ fmtNum(t.value) }}</div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-packed-bubble-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n      padding: 16px;\n      border-radius: 16px;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 8px;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 24px;\n      flex-wrap: wrap;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n    }\n    .bubble-group {\n      cursor: pointer;\n    }\n    .bubble {\n      transition: stroke-width 0.2s, stroke 0.2s, fill-opacity 0.15s;\n    }\n    .bubble-group:hover .bubble {\n      fill-opacity: 0.9;\n      filter: drop-shadow(0 6px 12px rgba(0,0,0,0.15));\n    }\n    .bubble-label {\n      fill: #ffffff;\n      font-weight: 700;\n      pointer-events: none;\n      user-select: none;\n      text-shadow: 0 1px 2px rgba(0,0,0,0.4);\n    }\n    .cluster-label {\n      font-size: 11px;\n      fill: var(--ngx-chart-axis-text, #94a3b8);\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      pointer-events: none;\n      user-select: none;\n    }\n    .chart-legend {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      flex-shrink: 0;\n      min-width: 130px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 3px;\n      flex-shrink: 0;\n    }\n    .legend-label {\n      color: var(--ngx-chart-text, #1e293b);\n      font-weight: 600;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex; align-items: flex-start; gap: 8px;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 4px; }\n    .tt-content { display: flex; flex-direction: column; gap: 2px; }\n    .tt-group { font-size: 10px; color: rgba(248, 250, 252, 0.7); }\n    .tt-val { font-weight: 700; }\n\n\n  `]\n})\nexport class PackedBubbleChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<BubbleNode[]>([]);\n  height = input<number>(300);\n  width = input<number>(450);\n  colors = input<string[]>(CHART_COLORS);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showGroupLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  minBubbleRadius = input<number>(10);\n  maxBubbleRadius = input<number>(45);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n\n  hoveredId = signal<string | null>(null);\n  tooltip = signal<{x:number;y:number;label:string;value:number;group?:string;color:string}|null>(null);\n\n  cx = computed(() => this.width() / 2);\n  cy = computed(() => this.height() / 2);\n\n  uniqueGroups = computed(() => {\n    const grps = new Set<string>();\n    this.data().forEach(node => {\n      if (node.group) grps.add(node.group);\n    });\n    return Array.from(grps);\n  });\n\n  groupCenters = computed(() => {\n    const grps = this.uniqueGroups();\n    const count = grps.length;\n    const centerx = this.cx();\n    const centery = this.cy();\n    if (count <= 1) {\n      return [{ group: 'default', x: centerx, y: centery }];\n    }\n    // Arrange group centers on a circle around the chart center\n    const radius = Math.min(centerx, centery) * 0.35;\n    return grps.map((grp, i) => {\n      const angle = (i / count) * Math.PI * 2;\n      return {\n        group: grp,\n        x: centerx + Math.cos(angle) * radius,\n        y: centery + Math.sin(angle) * radius\n      };\n    });\n  });\n\n  computedNodes = computed<SimulatedNode[]>(() => {\n    const rawData = this.data();\n    if (!rawData.length) return [];\n\n    let minVal = Infinity;\n    let maxVal = -Infinity;\n    rawData.forEach(node => {\n      if (node.value < minVal) minVal = node.value;\n      if (node.value > maxVal) maxVal = node.value;\n    });\n\n    if (minVal === Infinity) minVal = 0;\n    if (maxVal === -Infinity) maxVal = 1;\n    if (minVal === maxVal) minVal = maxVal - 1;\n\n    const minR = this.minBubbleRadius();\n    const maxR = this.maxBubbleRadius();\n\n    // Map each data node to a simulated node with an initial layout position\n    const grps = this.uniqueGroups();\n    const centerx = this.cx();\n    const centery = this.cy();\n    const centers = this.groupCenters();\n\n    const nodes: SimulatedNode[] = rawData.map((node, i) => {\n      const groupName = node.group || 'default';\n      const grpIdx = grps.indexOf(groupName);\n      const color = node.color || this.colors()[grpIdx >= 0 ? grpIdx % this.colors().length : i % this.colors().length];\n\n      // scale radius by square root to make bubble area proportional to value\n      const t = (node.value - minVal) / (maxVal - minVal);\n      const radius = minR + Math.sqrt(t) * (maxR - minR);\n\n      // Random starting positions clustered around their group center\n      const targetCenter = centers.find(c => c.group === groupName) || { x: centerx, y: centery };\n      const angle = Math.random() * Math.PI * 2;\n      const dist = Math.random() * 20;\n\n      return {\n        id: node.id,\n        label: node.label,\n        value: node.value,\n        group: groupName,\n        r: isNaN(radius) ? minR : radius,\n        x: targetCenter.x + Math.cos(angle) * dist,\n        y: targetCenter.y + Math.sin(angle) * dist,\n        vx: 0,\n        vy: 0,\n        color\n      };\n    });\n\n    // Run simple force-directed simulation\n    const iterations = 180;\n    const gravity = 0.06;\n    const damping = 0.65;\n    const padding = 3.5;\n    const repulsionStrength = 0.75;\n\n    for (let it = 0; it < iterations; it++) {\n      // 1. Attraction force to respective group centers\n      nodes.forEach(node => {\n        const targetCenter = centers.find(c => c.group === node.group) || { x: centerx, y: centery };\n        node.vx += (targetCenter.x - node.x) * gravity;\n        node.vy += (targetCenter.y - node.y) * gravity;\n      });\n\n      // 2. Collision resolution (repulsion)\n      for (let i = 0; i < nodes.length; i++) {\n        const nodeA = nodes[i];\n        for (let j = i + 1; j < nodes.length; j++) {\n          const nodeB = nodes[j];\n          const dx = nodeB.x - nodeA.x;\n          const dy = nodeB.y - nodeA.y;\n          const dist = Math.sqrt(dx * dx + dy * dy) || 0.1;\n          const minDist = nodeA.r + nodeB.r + padding;\n\n          if (dist < minDist) {\n            const overlap = minDist - dist;\n            const nx = dx / dist;\n            const ny = dy / dist;\n\n            // Push nodes apart proportionally\n            const force = overlap * 0.5 * repulsionStrength;\n            nodeA.vx -= nx * force;\n            nodeA.vy -= ny * force;\n            nodeB.vx += nx * force;\n            nodeB.vy += ny * force;\n          }\n        }\n      }\n\n      // 3. Update positions and damp velocities\n      nodes.forEach(node => {\n        node.x += node.vx;\n        node.y += node.vy;\n        node.vx *= damping;\n        node.vy *= damping;\n\n        // Keep inside bounds\n        const borderPadding = node.r + 5;\n        if (node.x < borderPadding) { node.x = borderPadding; node.vx = 0; }\n        if (node.x > this.width() - borderPadding) { node.x = this.width() - borderPadding; node.vx = 0; }\n        if (node.y < borderPadding) { node.y = borderPadding; node.vy = 0; }\n        if (node.y > this.height() - borderPadding) { node.y = this.height() - borderPadding; node.vy = 0; }\n      });\n    }\n\n    return nodes;\n  });\n\n  getGroupColor(group: string, idx: number): string {\n    return this.colors()[idx % this.colors().length];\n  }\n\n  truncate(str: string, radius: number): string {\n    const limit = Math.floor(radius / 3.2);\n    if (str.length <= limit) return str;\n    return str.substring(0, Math.max(3, limit - 2)) + '...';\n  }\n\n  onBubbleHover(event: MouseEvent, node: SimulatedNode): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-packed-bubble-chart') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: node.label,\n      value: node.value,\n      group: node.group !== 'default' ? node.group : undefined,\n      color: node.color\n    });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'packed-bubble-chart.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Group', 'Value'];\n    const rows = data.map(d => [d.label || '', d.group || '', d.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'packed-bubble-chart.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n  readonly Math = Math;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener, inject\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface NetworkNode {\n  id: string;\n  label: string;\n  value?: number; // Size/importance\n  group?: string;\n  color?: string;\n}\n\nexport interface NetworkLink {\n  source: string; // node ID\n  target: string; // node ID\n  value?: number; // strength/weight\n}\n\ninterface SimulatedNode {\n  id: string;\n  label: string;\n  value: number;\n  group: string;\n  x: number;\n  y: number;\n  vx: number;\n  vy: number;\n  r: number;\n  color: string;\n}\n\ninterface SimulatedLink {\n  sourceId: string;\n  targetId: string;\n  sourceNode: SimulatedNode;\n  targetNode: SimulatedNode;\n  weight: number;\n}\n\n@Component({\n  selector: 'ngx-network-graph',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-network-graph\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n          [attr.width]=\"width()\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Network Links -->\n          @for (link of computedLinks(); track link.sourceId + '-' + link.targetId) {\n            <line\n              [attr.x1]=\"link.sourceNode.x\"\n              [attr.y1]=\"link.sourceNode.y\"\n              [attr.x2]=\"link.targetNode.x\"\n              [attr.y2]=\"link.targetNode.y\"\n              [attr.stroke]=\"linkHovered(link) ? 'var(--primary-color, #4f46e5)' : 'var(--ngx-chart-grid, #cbd5e1)'\"\n              [attr.stroke-width]=\"linkHovered(link) ? link.weight + 3 : link.weight\"\n              [attr.stroke-opacity]=\"linkHovered(link) ? 0.9 : 0.65\"\n              class=\"link-line\"\n              (mouseenter)=\"hoveredLink.set(link); onLinkHover($event, link)\"\n              (mouseleave)=\"hoveredLink.set(null); tooltip.set(null)\"\n            />\n          }\n\n          <!-- Network Nodes -->\n          @for (node of computedNodes(); track node.id) {\n            <g\n              class=\"node-group\"\n              [class.hovered]=\"hoveredNodeId() === node.id || neighborNodeIds().includes(node.id)\"\n              [class.dimmed]=\"hoveredNodeId() !== null && hoveredNodeId() !== node.id && !neighborNodeIds().includes(node.id)\"\n              (mouseenter)=\"onNodeMouseEnter($event, node)\"\n              (mouseleave)=\"onNodeMouseLeave()\"\n            >\n              <circle\n                [attr.cx]=\"node.x\"\n                [attr.cy]=\"node.y\"\n                [attr.r]=\"node.r\"\n                [attr.fill]=\"node.color\"\n                [attr.stroke]=\"hoveredNodeId() === node.id ? 'var(--primary-color, #4f46e5)' : '#ffffff'\"\n                [attr.stroke-width]=\"hoveredNodeId() === node.id ? 3 : 1.5\"\n                class=\"node-circle\"\n              />\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"node.x\"\n                  [attr.y]=\"node.y + node.r + 14\"\n                  text-anchor=\"middle\"\n                  class=\"node-label\"\n                >\n                  {{ node.label }}\n                </text>\n              }\n            </g>\n          }\n        </svg>\n\n        <!-- Legend (shown if groups exist) -->\n        @if (showLegend() && uniqueGroups().length > 1) {\n          <div class=\"chart-legend\">\n            @for (grp of uniqueGroups(); track grp; let i = $index) {\n              <div class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"getGroupColor(grp, i)\"></span>\n                <span class=\"legend-label\">{{ grp }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (t.type === 'node') {\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <div class=\"tt-content\">\n              <strong>{{ t.label }}</strong>\n              @if (t.group) {\n                <div class=\"tt-group\">Group: {{ t.group }}</div>\n              }\n              <div class=\"tt-val\">Connections: {{ t.connections }}</div>\n            </div>\n          } @else {\n            <div class=\"tt-content\">\n              <strong>Link Connection</strong>\n              <div>{{ t.sourceLabel }} ➔ {{ t.targetLabel }}</div>\n              <div>Weight: {{ fmtNum(t.value) }}</div>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-network-graph {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n      padding: 16px;\n      border-radius: 16px;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 8px;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: 24px;\n      flex-wrap: wrap;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n    }\n    .link-line {\n      cursor: pointer;\n      transition: stroke 0.2s, stroke-width 0.2s, stroke-opacity 0.2s;\n    }\n    .node-group {\n      cursor: pointer;\n      transition: opacity 0.25s ease;\n    }\n    .node-circle {\n      transition: r 0.2s, stroke 0.2s, stroke-width 0.2s;\n    }\n    .node-group:hover .node-circle {\n      filter: drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n    }\n    .node-group.dimmed {\n      opacity: 0.3;\n    }\n    .node-label {\n      fill: var(--ngx-chart-text, #1e293b);\n      font-size: 11px;\n      font-weight: 600;\n      pointer-events: none;\n      user-select: none;\n    }\n    .chart-legend {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      flex-shrink: 0;\n      min-width: 130px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 3px;\n      flex-shrink: 0;\n    }\n    .legend-label {\n      color: var(--ngx-chart-text, #1e293b);\n      font-weight: 600;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex; align-items: flex-start; gap: 8px;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 4px; }\n    .tt-content { display: flex; flex-direction: column; gap: 2px; }\n    .tt-group { font-size: 10px; color: rgba(248, 250, 252, 0.7); }\n    .tt-val { font-weight: 700; }\n\n\n  `]\n})\nexport class NetworkGraphComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  nodes = input<NetworkNode[]>([]);\n  links = input<NetworkLink[]>([]);\n  height = input<number>(300);\n  width = input<number>(450);\n  colors = input<string[]>(CHART_COLORS);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  linkLength = input<number>(65);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n\n  hoveredNodeId = signal<string | null>(null);\n  hoveredLink = signal<SimulatedLink | null>(null);\n  tooltip = signal<any | null>(null);\n\n  cx = computed(() => this.width() / 2);\n  cy = computed(() => this.height() / 2);\n\n  uniqueGroups = computed(() => {\n    const grps = new Set<string>();\n    this.nodes().forEach(n => {\n      if (n.group) grps.add(n.group);\n    });\n    return Array.from(grps);\n  });\n\n  // Returns array of node ids connected to the hovered node\n  neighborNodeIds = computed<string[]>(() => {\n    const active = this.hoveredNodeId();\n    if (!active) return [];\n    const connected = new Set<string>();\n    this.links().forEach(link => {\n      if (link.source === active) connected.add(link.target);\n      if (link.target === active) connected.add(link.source);\n    });\n    return Array.from(connected);\n  });\n\n  computedNodes = computed<SimulatedNode[]>(() => {\n    const rawNodes = this.nodes();\n    if (!rawNodes.length) return [];\n\n    const totalNodes = rawNodes.length;\n    const centerx = this.cx();\n    const centery = this.cy();\n    const grps = this.uniqueGroups();\n\n    // Map raw nodes to simulated nodes with initial spiral/circular layout\n    const nodes: SimulatedNode[] = rawNodes.map((n, i) => {\n      const g = n.group || 'default';\n      const grpIdx = grps.indexOf(g);\n      const color = n.color || this.colors()[grpIdx >= 0 ? grpIdx % this.colors().length : i % this.colors().length];\n\n      // Sizing of nodes based on value input or default\n      const r = n.value ? Math.max(6, Math.min(22, 6 + Math.sqrt(n.value) * 1.5)) : 10;\n\n      // Circular positioning starting layout\n      const angle = (i / totalNodes) * Math.PI * 2;\n      const startRadius = Math.min(centerx, centery) * 0.45;\n\n      return {\n        id: n.id,\n        label: n.label,\n        value: n.value || 0,\n        group: g,\n        r,\n        color,\n        x: centerx + Math.cos(angle) * startRadius,\n        y: centery + Math.sin(angle) * startRadius,\n        vx: 0,\n        vy: 0\n      };\n    });\n\n    const linkList = this.links();\n    const iterations = 160;\n    const lLength = this.linkLength();\n    const attraction = 0.05;\n    const repulsion = 120; // Repulsion constant\n    const gravity = 0.035;\n    const damping = 0.75;\n\n    // Run force-directed layout simulation\n    for (let it = 0; it < iterations; it++) {\n      // 1. Repulsion between all pairs of nodes\n      for (let i = 0; i < nodes.length; i++) {\n        const nodeA = nodes[i];\n        for (let j = i + 1; j < nodes.length; j++) {\n          const nodeB = nodes[j];\n          const dx = nodeB.x - nodeA.x;\n          const dy = nodeB.y - nodeA.y;\n          const dist = Math.sqrt(dx * dx + dy * dy) || 0.1;\n          const rLimit = nodeA.r + nodeB.r + 20;\n\n          // Repulsive force inversely proportional to distance squared\n          const force = (repulsion / (dist * dist)) * (dist < rLimit ? 3.0 : 1.0);\n          nodeA.vx -= (dx / dist) * force;\n          nodeA.vy -= (dy / dist) * force;\n          nodeB.vx += (dx / dist) * force;\n          nodeB.vy += (dy / dist) * force;\n        }\n      }\n\n      // 2. Link Attraction forces\n      linkList.forEach(link => {\n        const sourceNode = nodes.find(n => n.id === link.source);\n        const targetNode = nodes.find(n => n.id === link.target);\n        if (!sourceNode || !targetNode) return;\n\n        const dx = targetNode.x - sourceNode.x;\n        const dy = targetNode.y - sourceNode.y;\n        const dist = Math.sqrt(dx * dx + dy * dy) || 0.1;\n        const linkStr = link.value ? Math.max(0.2, Math.min(1.5, link.value)) : 1;\n\n        // Pull force towards link target length\n        const offset = dist - lLength;\n        const forceX = (dx / dist) * offset * attraction * linkStr;\n        const forceY = (dy / dist) * offset * attraction * linkStr;\n\n        sourceNode.vx += forceX;\n        sourceNode.vy += forceY;\n        targetNode.vx -= forceX;\n        targetNode.vy -= forceY;\n      });\n\n      // 3. Gravity attraction to center & update positions\n      nodes.forEach(node => {\n        node.vx += (centerx - node.x) * gravity;\n        node.vy += (centery - node.y) * gravity;\n\n        node.x += node.vx;\n        node.y += node.vy;\n\n        node.vx *= damping;\n        node.vy *= damping;\n\n        // Keep inside bounds\n        const borderPadding = node.r + 8;\n        if (node.x < borderPadding) { node.x = borderPadding; node.vx = 0; }\n        if (node.x > this.width() - borderPadding) { node.x = this.width() - borderPadding; node.vx = 0; }\n        if (node.y < borderPadding) { node.y = borderPadding; node.vy = 0; }\n        if (node.y > this.height() - borderPadding) { node.y = this.height() - borderPadding; node.vy = 0; }\n      });\n    }\n\n    return nodes;\n  });\n\n  computedLinks = computed<SimulatedLink[]>(() => {\n    const rawLinks = this.links();\n    const nodes = this.computedNodes();\n    if (!nodes.length) return [];\n\n    return rawLinks.map(link => {\n      const sourceNode = nodes.find(n => n.id === link.source);\n      const targetNode = nodes.find(n => n.id === link.target);\n      const weight = link.value ? Math.max(1, Math.min(8, link.value)) : 1.5;\n\n      return {\n        sourceId: link.source,\n        targetId: link.target,\n        sourceNode: sourceNode || nodes[0],\n        targetNode: targetNode || nodes[0],\n        weight\n      };\n    });\n  });\n\n  getGroupColor(group: string, idx: number): string {\n    return this.colors()[idx % this.colors().length];\n  }\n\n  linkHovered(link: SimulatedLink): boolean {\n    const activeLink = this.hoveredLink();\n    if (activeLink && activeLink.sourceId === link.sourceId && activeLink.targetId === link.targetId) {\n      return true;\n    }\n    const node = this.hoveredNodeId();\n    if (node && (link.sourceId === node || link.targetId === node)) {\n      return true;\n    }\n    return false;\n  }\n\n  onNodeMouseEnter(event: MouseEvent, node: SimulatedNode): void {\n    this.hoveredNodeId.set(node.id);\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-network-graph') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n\n    // count connections\n    const connCount = this.links().filter(l => l.source === node.id || l.target === node.id).length;\n\n    this.tooltip.set({\n      type: 'node',\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: node.label,\n      group: node.group !== 'default' ? node.group : undefined,\n      connections: connCount,\n      color: node.color\n    });\n  }\n\n  onNodeMouseLeave(): void {\n    this.hoveredNodeId.set(null);\n    this.tooltip.set(null);\n  }\n\n  onLinkHover(event: MouseEvent, link: SimulatedLink): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-network-graph') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n\n    this.tooltip.set({\n      type: 'link',\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      sourceLabel: link.sourceNode.label,\n      targetLabel: link.targetNode.label,\n      value: link.weight\n    });\n  }\n\n  onMouseLeave(): void {\n    this.hoveredNodeId.set(null);\n    this.hoveredLink.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = { nodes: this.nodes(), links: this.links() };\n    this.exportSvc.downloadJson(data, 'network-graph-data.json');\n  }\n\n  exportToCsv(): void {\n    const links = this.links();\n    if (!links.length) return;\n    const headers = ['Source', 'Target', 'Weight'];\n    const rows = links.map(l => [l.source, l.target, l.value || 1]);\n    this.exportSvc.downloadCsv(headers, rows, 'network-graph-links.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface TreeGraphNode {\n  id: string;\n  label: string;\n  parentId?: string; // Undefined for root node\n  value?: number;    // Optional node value/size\n  color?: string;\n}\n\ninterface ProcessedNode {\n  id: string;\n  label: string;\n  parentId?: string;\n  value: number;\n  depth: number;\n  x: number;\n  y: number;\n  color: string;\n  children: ProcessedNode[];\n}\n\ninterface TreeLink {\n  parentId: string;\n  childId: string;\n  path: string;\n}\n\n@Component({\n  selector: 'ngx-treegraph',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-treegraph\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n          [attr.width]=\"width()\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Tree Links (Bezier Curves) -->\n          @for (link of computedLinks(); track link.parentId + '-' + link.childId) {\n            <path\n              [attr.d]=\"link.path\"\n              fill=\"none\"\n              stroke=\"var(--ngx-chart-grid, #cbd5e1)\"\n              stroke-width=\"2\"\n              class=\"link-line\"\n              [class.highlighted]=\"hoveredNodeId() === link.parentId || hoveredNodeId() === link.childId\"\n            />\n          }\n\n          <!-- Tree Nodes -->\n          @for (node of computedNodes(); track node.id) {\n            <g\n              class=\"node-group\"\n              [class.hovered]=\"hoveredNodeId() === node.id\"\n              [style.transform]=\"'translate(' + node.x + 'px,' + node.y + 'px)'\"\n              (mouseenter)=\"hoveredNodeId.set(node.id); onNodeHover($event, node)\"\n              (mouseleave)=\"hoveredNodeId.set(null); tooltip.set(null)\"\n            >\n              <circle\n                r=\"7\"\n                [attr.fill]=\"node.color\"\n                [attr.stroke]=\"hoveredNodeId() === node.id ? 'var(--primary-color, #4f46e5)' : '#ffffff'\"\n                stroke-width=\"2\"\n                class=\"node-circle\"\n              />\n              <text\n                [attr.x]=\"node.children.length === 0 ? 10 : -10\"\n                [attr.y]=\"4\"\n                [attr.text-anchor]=\"node.children.length === 0 ? 'start' : 'end'\"\n                class=\"node-label\"\n              >\n                {{ node.label }}\n              </text>\n            </g>\n          }\n        </svg>\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n          <div class=\"tt-content\">\n            <strong>{{ t.label }}</strong>\n            <div class=\"tt-sub\">Depth: Level {{ t.depth }}</div>\n            @if (t.value > 0) {\n              <div class=\"tt-val\">Value: {{ fmtNum(t.value) }}</div>\n            }\n            <div class=\"tt-sub\">Children: {{ t.childrenCount }}</div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-treegraph {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n      padding: 16px;\n      border-radius: 16px;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 8px;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n    }\n    .link-line {\n      transition: stroke 0.25s, stroke-width 0.25s;\n    }\n    .link-line.highlighted {\n      stroke: var(--primary-color, #4f46e5);\n      stroke-width: 3px;\n    }\n    .node-group {\n      cursor: pointer;\n      transition: transform 0.2s ease-out;\n    }\n    .node-circle {\n      transition: stroke 0.15s, stroke-width 0.15s, r 0.15s;\n    }\n    .node-group:hover .node-circle {\n      r: 9;\n      filter: drop-shadow(0 4px 6px rgba(0,0,0,0.15));\n    }\n    .node-label {\n      fill: var(--ngx-chart-text, #1e293b);\n      font-size: 11px;\n      font-weight: 600;\n      pointer-events: none;\n      user-select: none;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 145px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex; align-items: flex-start; gap: 8px;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 4px; }\n    .tt-content { display: flex; flex-direction: column; gap: 2px; }\n    .tt-sub { font-size: 10px; color: rgba(248, 250, 252, 0.7); }\n    .tt-val { font-weight: 700; }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      font-family: inherit;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n    }\n  `]\n})\nexport class TreeGraphComponent {\n  data = input<TreeGraphNode[]>([]);\n  height = input<number>(300);\n  width = input<number>(500);\n  colors = input<string[]>(CHART_COLORS);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  exportMenuOpen = signal(false);\n  hoveredNodeId = signal<string | null>(null);\n  tooltip = signal<any | null>(null);\n\n  // Computes the node structure recursively and maps coordinate layouts\n  computedTree = computed<{ nodes: ProcessedNode[]; root: ProcessedNode | null }>(() => {\n    const rawData = this.data();\n    if (!rawData.length) return { nodes: [], root: null };\n\n    // 1. Build basic structure\n    const nodeMap = new Map<string, ProcessedNode>();\n    rawData.forEach(item => {\n      nodeMap.set(item.id, {\n        id: item.id,\n        label: item.label,\n        parentId: item.parentId,\n        value: item.value || 0,\n        depth: 0,\n        x: 0,\n        y: 0,\n        color: item.color || '',\n        children: []\n      });\n    });\n\n    let root: ProcessedNode | null = null;\n\n    // Link parents to children and identify root\n    nodeMap.forEach(node => {\n      if (node.parentId && nodeMap.has(node.parentId)) {\n        nodeMap.get(node.parentId)!.children.push(node);\n      } else {\n        // Assume first node with no valid parent is root\n        if (!root) root = node;\n      }\n    });\n\n    if (!root && nodeMap.size > 0) {\n      root = nodeMap.values().next().value || null;\n    }\n\n    if (!root) return { nodes: [], root: null };\n\n    // Assign depths recursively\n    const setDepth = (node: ProcessedNode, depth: number) => {\n      node.depth = depth;\n      node.children.forEach(c => setDepth(c, depth + 1));\n    };\n    setDepth(root, 0);\n\n    // Get max depth in the tree\n    let maxDepth = 0;\n    const allNodes: ProcessedNode[] = [];\n    nodeMap.forEach(n => {\n      allNodes.push(n);\n      if (n.depth > maxDepth) maxDepth = n.depth;\n    });\n\n    // 2. Compute Layout (Horizontal Balanced Layout)\n    // Sibling layout vertical coordinates: We assign coordinates to leaf nodes first,\n    // and parent coordinate is the average of its children.\n    const leftMargin = 70;\n    const rightMargin = 70;\n    const topMargin = 25;\n    const bottomMargin = 25;\n\n    const printableW = this.width() - leftMargin - rightMargin;\n    const levelWidth = maxDepth > 0 ? printableW / maxDepth : printableW;\n\n    let leafIndex = 0;\n    const leaves: ProcessedNode[] = [];\n    \n    // Count leaves recursively\n    const findLeaves = (node: ProcessedNode) => {\n      if (node.children.length === 0) {\n        leaves.push(node);\n      } else {\n        node.children.forEach(findLeaves);\n      }\n    };\n    findLeaves(root);\n\n    const totalLeaves = leaves.length || 1;\n    const printableH = this.height() - topMargin - bottomMargin;\n    const leafSpacing = totalLeaves > 1 ? printableH / (totalLeaves - 1) : printableH;\n\n    // DFS layout assignment\n    const layoutNode = (node: ProcessedNode) => {\n      // Set X based on depth\n      node.x = leftMargin + node.depth * levelWidth;\n\n      if (node.children.length === 0) {\n        // Leaf node y-coordinate\n        node.y = topMargin + leafIndex * leafSpacing;\n        leafIndex++;\n      } else {\n        // Lay out children first\n        node.children.forEach(layoutNode);\n        // Parent y is the average of children's y coords\n        const sumY = node.children.reduce((sum, child) => sum + child.y, 0);\n        node.y = sumY / node.children.length;\n      }\n\n      // Assign colors based on depth\n      if (!node.color) {\n        node.color = this.colors()[node.depth % this.colors().length];\n      }\n    };\n\n    layoutNode(root);\n\n    return { nodes: allNodes, root };\n  });\n\n  computedNodes = computed<ProcessedNode[]>(() => {\n    return this.computedTree().nodes;\n  });\n\n  computedLinks = computed<TreeLink[]>(() => {\n    const nodes = this.computedNodes();\n    const links: TreeLink[] = [];\n\n    nodes.forEach(node => {\n      node.children.forEach(child => {\n        // Horizontal Bezier curve from parent to child\n        const path = `M ${node.x} ${node.y} C ${(node.x + child.x) / 2} ${node.y}, ${(node.x + child.x) / 2} ${child.y}, ${child.x} ${child.y}`;\n        links.push({\n          parentId: node.id,\n          childId: child.id,\n          path\n        });\n      });\n    });\n\n    return links;\n  });\n\n  onNodeHover(event: MouseEvent, node: ProcessedNode): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-treegraph') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: node.label,\n      depth: node.depth,\n      value: node.value,\n      childrenCount: node.children.length,\n      color: node.color\n    });\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    let csv = 'ID,Label,ParentID,Value\\n';\n    data.forEach(d => {\n      csv += `\"${d.id}\",\"${d.label}\",\"${d.parentId || ''}\",${d.value || 0}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tree-graph-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tree-graph-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tree-graph.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Tree Graph Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; }\n          svg { max-width: 100%; height: auto; }\n          .link-line { stroke: #cbd5e1; }\n          .node-label { fill: #1e293b; font-size: 11px; font-weight: 600; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Tree Graph Analytics</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import { Component, ChangeDetectionStrategy, input, computed, signal, ElementRef, viewChild, HostListener, inject } from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface ArcNode {\n  id: string;\n  label: string;\n  value?: number; // Node size factor\n  color?: string;\n}\n\nexport interface ArcLink {\n  source: string; // node ID\n  target: string; // node ID\n  value?: number; // Link thickness factor\n}\n\ninterface ProcessedNode {\n  id: string;\n  label: string;\n  value: number;\n  x: number;\n  y: number;\n  r: number;\n  color: string;\n  index: number;\n}\n\ninterface ProcessedLink {\n  sourceId: string;\n  targetId: string;\n  sourceNode: ProcessedNode;\n  targetNode: ProcessedNode;\n  path: string;\n  weight: number;\n}\n\n@Component({\n  selector: 'ngx-arc-diagram',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-arc-diagram\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-body\">\n        <svg\n          #svgEl\n          class=\"chart-svg\"\n          [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n          [attr.width]=\"width()\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Baseline horizontal axis -->\n          <line\n            [attr.x1]=\"margin().left\"\n            [attr.y1]=\"axisY()\"\n            [attr.x2]=\"width() - margin().right\"\n            [attr.y2]=\"axisY()\"\n            stroke=\"var(--ngx-chart-grid, #e2e8f0)\"\n            stroke-width=\"1.5\"\n            stroke-dasharray=\"3 3\"\n          />\n\n          <!-- Arc Links -->\n          @for (link of computedLinks(); track link.sourceId + '-' + link.targetId) {\n            <path\n              [attr.d]=\"link.path\"\n              fill=\"none\"\n              [attr.stroke]=\"linkHovered(link) ? 'var(--primary-color, #4f46e5)' : 'var(--ngx-chart-grid, #cbd5e1)'\"\n              [attr.stroke-width]=\"linkHovered(link) ? link.weight + 2.5 : link.weight\"\n              [attr.stroke-opacity]=\"linkHovered(link) ? 0.9 : 0.45\"\n              class=\"link-arc\"\n              (mouseenter)=\"hoveredLink.set(link); onLinkHover($event, link)\"\n              (mouseleave)=\"hoveredLink.set(null); tooltip.set(null)\"\n            />\n          }\n\n          <!-- Node Circles & Labels -->\n          @for (node of computedNodes(); track node.id) {\n            <g\n              class=\"node-group\"\n              [class.hovered]=\"hoveredNodeId() === node.id || neighborNodeIds().includes(node.id)\"\n              [class.dimmed]=\"hoveredNodeId() !== null && hoveredNodeId() !== node.id && !neighborNodeIds().includes(node.id)\"\n              (mouseenter)=\"hoveredNodeId.set(node.id); onNodeHover($event, node)\"\n              (mouseleave)=\"hoveredNodeId.set(null); tooltip.set(null)\"\n            >\n              <!-- Arc Node Circle -->\n              <circle\n                [attr.cx]=\"node.x\"\n                [attr.cy]=\"node.y\"\n                [attr.r]=\"node.r\"\n                [attr.fill]=\"node.color\"\n                [attr.stroke]=\"hoveredNodeId() === node.id ? 'var(--primary-color, #4f46e5)' : '#ffffff'\"\n                [attr.stroke-width]=\"hoveredNodeId() === node.id ? 2.5 : 1.5\"\n                class=\"node-circle\"\n              />\n              <!-- Vertical rotated or horizontal label -->\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"node.x\"\n                  [attr.y]=\"node.y + node.r + 14\"\n                  [attr.transform]=\"'rotate(35, ' + node.x + ', ' + (node.y + node.r + 14) + ')'\"\n                  text-anchor=\"start\"\n                  class=\"node-label\"\n                >\n                  {{ node.label }}\n                </text>\n              }\n            </g>\n          }\n        </svg>\n      </div>\n\n      <!-- Premium Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (t.type === 'node') {\n            <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n            <div class=\"tt-content\">\n              <strong>{{ t.label }}</strong>\n              <div class=\"tt-sub\">Connections: {{ t.connections }}</div>\n              @if (t.value > 0) {\n                <div>Node Value: {{ fmtNum(t.value) }}</div>\n              }\n            </div>\n          } @else {\n            <div class=\"tt-content\">\n              <strong>Connection Arc</strong>\n              <div>{{ t.sourceLabel }} ➔ {{ t.targetLabel }}</div>\n              <div>Weight: {{ fmtNum(t.value) }}</div>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-arc-diagram {\n      position: relative;\n      background: var(--ngx-chart-bg, #fff);\n      font-family: inherit;\n      overflow: hidden;\n      padding: 16px;\n      border-radius: 16px;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      min-height: 24px;\n      position: relative;\n      margin-bottom: 8px;\n    }\n    .chart-body {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    .chart-svg {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      min-width: 0;\n      overflow: visible; /* To ensure rotated labels aren't clipped */\n    }\n    .link-arc {\n      cursor: pointer;\n      transition: stroke 0.2s, stroke-width 0.2s, stroke-opacity 0.2s;\n    }\n    .node-group {\n      cursor: pointer;\n      transition: opacity 0.2s ease;\n    }\n    .node-circle {\n      transition: r 0.15s, stroke 0.15s, stroke-width 0.15s;\n    }\n    .node-group:hover .node-circle {\n      r: 8.5;\n      filter: drop-shadow(0 3px 6px rgba(0,0,0,0.15));\n    }\n    .node-group.dimmed {\n      opacity: 0.35;\n    }\n    .node-label {\n      fill: var(--ngx-chart-text, #475569);\n      font-size: 10px;\n      font-weight: 600;\n      pointer-events: none;\n      user-select: none;\n    }\n\n    /* Premium Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 145px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      display: flex; align-items: flex-start; gap: 8px;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n      font-family: inherit;\n    }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 4px; }\n    .tt-content { display: flex; flex-direction: column; gap: 2px; }\n    .tt-sub { font-size: 10px; color: rgba(248, 250, 252, 0.7); }\n    .tt-val { font-weight: 700; }\n\n    /* Export styles */\n    `]\n})\nexport class ArcDiagramComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  nodes = input<ArcNode[]>([]);\n  links = input<ArcLink[]>([]);\n  height = input<number>(300);\n  width = input<number>(550);\n  colors = input<string[]>(CHART_COLORS);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  hoveredNodeId = signal<string | null>(null);\n  hoveredLink = signal<ProcessedLink | null>(null);\n  tooltip = signal<any | null>(null);\n\n  margin = computed(() => ({\n    top: 30,\n    right: 60,\n    bottom: 60, // extra space for rotated node labels\n    left: 40\n  }));\n\n  axisY = computed(() => this.height() - this.margin().bottom);\n\n  uniqueGroups = computed(() => {\n    return Array.from(new Set(this.nodes().map(n => n.id)));\n  });\n\n  // Neighbor nodes connected to active hovered node\n  neighborNodeIds = computed<string[]>(() => {\n    const active = this.hoveredNodeId();\n    if (!active) return [];\n    const connected = new Set<string>();\n    this.links().forEach(link => {\n      if (link.source === active) connected.add(link.target);\n      if (link.target === active) connected.add(link.source);\n    });\n    return Array.from(connected);\n  });\n\n  computedNodes = computed<ProcessedNode[]>(() => {\n    const rawNodes = this.nodes();\n    if (!rawNodes.length) return [];\n\n    const totalNodes = rawNodes.length;\n    const startX = this.margin().left;\n    const endX = this.width() - this.margin().right;\n    const nodeSpacing = totalNodes > 1 ? (endX - startX) / (totalNodes - 1) : 0;\n    const yCoord = this.axisY();\n\n    return rawNodes.map((node, i) => {\n      const color = node.color || this.colors()[i % this.colors().length];\n      const r = node.value ? Math.max(5, Math.min(18, 5 + Math.sqrt(node.value) * 1.2)) : 6.5;\n      const x = startX + i * nodeSpacing;\n\n      return {\n        id: node.id,\n        label: node.label,\n        value: node.value || 0,\n        x,\n        y: yCoord,\n        r,\n        color,\n        index: i\n      };\n    });\n  });\n\n  computedLinks = computed<ProcessedLink[]>(() => {\n    const rawLinks = this.links();\n    const nodes = this.computedNodes();\n    if (!nodes.length) return [];\n\n    const links: ProcessedLink[] = [];\n    rawLinks.forEach(link => {\n      const sourceNode = nodes.find(n => n.id === link.source);\n      const targetNode = nodes.find(n => n.id === link.target);\n      if (!sourceNode || !targetNode) return;\n\n      const weight = link.value ? Math.max(1, Math.min(6, link.value)) : 1.5;\n\n      // Draw semi-circular arc curving upward\n      // R is half of coordinate difference\n      const r = Math.abs(targetNode.x - sourceNode.x) / 2;\n      const startNode = sourceNode.x < targetNode.x ? sourceNode : targetNode;\n      const endNode = sourceNode.x < targetNode.x ? targetNode : sourceNode;\n      \n      const path = `M ${startNode.x} ${startNode.y} A ${r} ${r} 0 0 1 ${endNode.x} ${endNode.y}`;\n\n      links.push({\n        sourceId: link.source,\n        targetId: link.target,\n        sourceNode,\n        targetNode,\n        path,\n        weight\n      });\n    });\n\n    return links;\n  });\n\n  linkHovered(link: ProcessedLink): boolean {\n    const activeLink = this.hoveredLink();\n    if (activeLink && activeLink.sourceId === link.sourceId && activeLink.targetId === link.targetId) {\n      return true;\n    }\n    const node = this.hoveredNodeId();\n    if (node && (link.sourceId === node || link.targetId === node)) {\n      return true;\n    }\n    return false;\n  }\n\n  onNodeHover(event: MouseEvent, node: ProcessedNode): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-arc-diagram') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const connCount = this.links().filter(l => l.source === node.id || l.target === node.id).length;\n\n    this.tooltip.set({\n      type: 'node',\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      label: node.label,\n      connections: connCount,\n      value: node.value,\n      color: node.color\n    });\n  }\n\n  onLinkHover(event: MouseEvent, link: ProcessedLink): void {\n    const el = (event.currentTarget as HTMLElement).closest('.ngx-arc-diagram') as HTMLElement;\n    const rect = el.getBoundingClientRect();\n\n    this.tooltip.set({\n      type: 'link',\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n      sourceLabel: link.sourceNode.label,\n      targetLabel: link.targetNode.label,\n      value: link.weight\n    });\n  }\n\n  onMouseLeave(): void {\n    this.hoveredNodeId.set(null);\n    this.hoveredLink.set(null);\n    this.tooltip.set(null);\n  }\n\n    onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = { nodes: this.nodes(), links: this.links() };\n    this.exportSvc.downloadJson(data, 'arc-diagram-data.json');\n  }\n\n  exportToCsv(): void {\n    const links = this.links();\n    if (!links.length) return;\n    const headers = ['Source', 'Target', 'Value'];\n    const rows: (string | number)[][] = links.map(l => [l.source || '', l.target || '', l.value ?? 0]);\n    this.exportSvc.downloadCsv(headers, rows, 'arc-diagram-links.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild\n} from '@angular/core';\nimport { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface HistogramBin {\n  index: number;\n  min: number;\n  max: number;\n  count: number;\n  label: string;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\n@Component({\n  selector: 'ngx-histogram',\n  standalone: true,\n  imports: [ChartExportMenuComponent, DecimalPipe, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-histogram\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Histogram Distribution</span>\n          <span class=\"header-subtitle\">Bins: {{ binsCount() }}</span>\n        </div>\n        \n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"histogram-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines -->\n          @if (showGrid()) {\n            @for (tick of yTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(tick)\"\n                [attr.y2]=\"yPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Bars -->\n          @for (bin of computedBins(); track bin.index; let i = $index) {\n            <rect\n              [attr.x]=\"bin.x\"\n              [attr.y]=\"bin.y\"\n              [attr.width]=\"bin.w\"\n              [attr.height]=\"bin.h\"\n              [attr.fill]=\"barColor(i)\"\n              class=\"histogram-bar\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onBarHover(i)\"\n              (mousemove)=\"onMouseMove($event)\"\n              stroke=\"#ffffff\"\n              stroke-width=\"1\"\n              rx=\"4\"\n              ry=\"4\"\n              [style.animation-delay]=\"(i * 0.03) + 's'\"\n            />\n            \n            @if (showLabels() && bin.count > 0) {\n              <text\n                [attr.x]=\"bin.x + bin.w / 2\"\n                [attr.y]=\"bin.y - 6\"\n                text-anchor=\"middle\"\n                class=\"bar-label\"\n              >\n                {{ bin.count }}\n              </text>\n            }\n          }\n\n          <!-- Y Axis -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ labelFormatter() ? labelFormatter()!(tick) : formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- X Axis -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n            @for (bin of computedBins(); track bin.index) {\n              <g [attr.transform]=\"'translate(' + (bin.x + bin.w / 2) + ',0)'\">\n                <line [attr.y1]=\"0\" [attr.y2]=\"4\" class=\"tick-line\" />\n                <text\n                  [attr.y]=\"16\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label x-tick-label\"\n                >\n                  {{ bin.min | number:'1.0-1' }}\n                </text>\n              </g>\n            }\n            <!-- Max tick label for X Axis end edge -->\n            @if (computedBins().length > 0) {\n              @let lastBin = computedBins()[computedBins().length - 1];\n              <g [attr.transform]=\"'translate(' + (lastBin.x + lastBin.w) + ',0)'\">\n                <line [attr.y1]=\"0\" [attr.y2]=\"4\" class=\"tick-line\" />\n                <text\n                  [attr.y]=\"16\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label x-tick-label\"\n                >\n                  {{ lastBin.max | number:'1.0-1' }}\n                </text>\n              </g>\n            }\n          </g>\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">Range: {{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Frequency</span>\n              <span class=\"tt-val\">{{ t.count }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Percentage</span>\n              <span class=\"tt-val\">{{ t.percentage | number:'1.0-1' }}%</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-histogram {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .histogram-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n      stroke-dasharray: 3,3;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 10px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .x-tick-label {\n      font-size: 9px;\n    }\n    .histogram-bar {\n      cursor: pointer;\n      transition: all 0.2s ease-in-out;\n      transform-origin: bottom;\n      animation: barGrow 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      opacity: 0;\n    }\n    @keyframes barGrow {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n    .histogram-bar.dimmed {\n      opacity: 0.3 !important;\n    }\n    .histogram-bar.highlighted {\n      filter: drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n      stroke: #334155 !important;\n      stroke-width: 1.5px !important;\n    }\n    .bar-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--ngx-chart-axis-text, #475569);\n      user-select: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles removed */\n  `]\n})\nexport class HistogramComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<number[]>([]);\n  binsCount = input<number>(10);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 30,\n    right: 25,\n    bottom: 30,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  computedBins = computed<HistogramBin[]>(() => {\n    const rawData = this.data();\n    const count = Math.max(1, this.binsCount() || 10);\n    if (rawData.length === 0) return [];\n\n    let min = Math.min(...rawData);\n    let max = Math.max(...rawData);\n    if (min === max) {\n      min -= 1;\n      max += 1;\n    }\n\n    const range = max - min;\n    const binWidth = range / count;\n\n    // Initialize bins\n    const bins = Array.from({ length: count }, (_, i) => {\n      const bMin = min + i * binWidth;\n      const bMax = bMin + binWidth;\n      return {\n        index: i,\n        min: bMin,\n        max: bMax,\n        count: 0,\n        label: `${bMin.toFixed(1)} – ${bMax.toFixed(1)}`\n      };\n    });\n\n    // Populate bins\n    rawData.forEach(val => {\n      let bIdx = Math.floor((val - min) / binWidth);\n      if (bIdx >= count) bIdx = count - 1;\n      if (bIdx < 0) bIdx = 0;\n      bins[bIdx].count++;\n    });\n\n    const maxCount = Math.max(1, ...bins.map(b => b.count));\n    const w = this.innerW();\n    const h = this.innerH();\n    const barW = w / count;\n\n    return bins.map((b, i) => {\n      const barH = scale(b.count, 0, maxCount, 0, h);\n      return {\n        ...b,\n        x: i * barW,\n        y: h - barH,\n        w: barW * 0.95, // 5% spacing between bars\n        h: Math.max(2, barH)\n      } as HistogramBin;\n    });\n  });\n\n  yTicks = computed(() => {\n    const bins = this.computedBins();\n    if (bins.length === 0) return [0, 5, 10];\n    const maxCount = Math.max(1, ...bins.map(b => b.count));\n    return niceTicks(0, maxCount, 5);\n  });\n\n  yDomainMax = computed(() => {\n    const ticks = this.yTicks();\n    return ticks[ticks.length - 1] || 10;\n  });\n\n  yPos(val: number): number {\n    return scale(val, 0, this.yDomainMax(), this.innerH(), 0);\n  }\n\n  barColor(i: number): string {\n    const colorsList = this.colors();\n    return colorsList[i % colorsList.length];\n  }\n\n  onBarHover(idx: number) {\n    this.hoveredIndex.set(idx);\n    const bin = this.computedBins()[idx];\n    if (bin) {\n      const total = this.data().length || 1;\n      this.tooltip.set({\n        ...bin,\n        percentage: (bin.count / total) * 100\n      });\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-histogram');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const bins = this.computedBins();\n    if (!bins.length) return;\n    const headers = ['Bin Index', 'Range Min', 'Range Max', 'Frequency'];\n    const rows = bins.map(b => [b.index, b.min, b.max, b.count]);\n    this.exportSvc.downloadCsv(headers, rows, 'histogram-data.csv');\n  }\n\n  exportToJson(): void {\n    const bins = this.computedBins();\n    if (!bins.length) return;\n    const data = bins.map(b => ({\n      index: b.index,\n      min: b.min,\n      max: b.max,\n      frequency: b.count\n    }));\n    this.exportSvc.downloadJson(data, 'histogram-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'histogram.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Histogram Distribution Analysis', 'histogram.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule, DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface CurvePoint {\n  xVal: number;\n  yVal: number;\n  zScore: number;\n  percentile: number;\n  px: number;\n  py: number;\n}\n\n@Component({\n  selector: 'ngx-bell-curve-chart',\n  standalone: true,\n  imports: [CommonModule, DecimalPipe, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-bell-curve\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Bell Curve (Normal Distribution)</span>\n          <span class=\"header-subtitle\">Mean (μ): {{ computedMean() | number:'1.1-2' }}, SD (σ): {{ computedSD() | number:'1.1-2' }}</span>\n        </div>\n        \n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"bell-curve-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n        (mousemove)=\"onSvgMouseMove($event)\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines -->\n          @if (showGrid()) {\n            @for (tick of yTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(tick)\"\n                [attr.y2]=\"yPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Shaded Standard Deviation Bands -->\n          @if (fillArea() && curvePoints().length > 0) {\n            <!-- ±3σ Band -->\n            <path [attr.d]=\"bandPath(-3, 3)\" fill=\"rgba(74, 144, 217, 0.08)\" stroke=\"none\" />\n            <!-- ±2σ Band -->\n            <path [attr.d]=\"bandPath(-2, 2)\" fill=\"rgba(74, 144, 217, 0.12)\" stroke=\"none\" />\n            <!-- ±1σ Band -->\n            <path [attr.d]=\"bandPath(-1, 1)\" fill=\"rgba(74, 144, 217, 0.18)\" stroke=\"none\" />\n          }\n\n          <!-- Distribution Curve Line -->\n          @if (curvePath(); as pathStr) {\n            <path\n              [attr.d]=\"pathStr\"\n              [attr.stroke]=\"curveColor()\"\n              fill=\"none\"\n              stroke-width=\"3\"\n              stroke-linecap=\"round\"\n              class=\"bell-curve-line\"\n            />\n          }\n\n          <!-- Standard Deviation Vertical Lines -->\n          @for (sdVal of sdPositions(); track sdVal.label) {\n            <g>\n              <line\n                [attr.x1]=\"xPos(sdVal.val)\"\n                [attr.x2]=\"xPos(sdVal.val)\"\n                [attr.y1]=\"0\"\n                [attr.y2]=\"innerH()\"\n                [attr.stroke]=\"sdVal.label === 'μ' ? curveColor() : 'rgba(100, 116, 139, 0.5)'\"\n                [attr.stroke-dasharray]=\"sdVal.label === 'μ' ? 'none' : '4,4'\"\n                [attr.stroke-width]=\"sdVal.label === 'μ' ? 1.5 : 1\"\n              />\n              <text\n                [attr.x]=\"xPos(sdVal.val)\"\n                [attr.y]=\"innerH() + 14\"\n                text-anchor=\"middle\"\n                class=\"axis-label sd-label\"\n              >\n                {{ sdVal.label }}\n              </text>\n              <text\n                [attr.x]=\"xPos(sdVal.val)\"\n                [attr.y]=\"innerH() + 26\"\n                text-anchor=\"middle\"\n                class=\"axis-label sd-val-text\"\n              >\n                {{ sdVal.val | number:'1.0-1' }}\n              </text>\n            </g>\n          }\n\n          <!-- Hover Cursor Line -->\n          @if (hoveredPoint(); as hp) {\n            <circle\n              [attr.cx]=\"hp.px\"\n              [attr.cy]=\"hp.py\"\n              [attr.r]=\"6\"\n              [attr.fill]=\"curveColor()\"\n              stroke=\"#ffffff\"\n              stroke-width=\"2\"\n              class=\"hover-dot\"\n            />\n            <line\n              [attr.x1]=\"hp.px\"\n              [attr.x2]=\"hp.px\"\n              [attr.y1]=\"hp.py\"\n              [attr.y2]=\"innerH()\"\n              stroke=\"#cbd5e1\"\n              stroke-dasharray=\"3,3\"\n            />\n          }\n\n          <!-- Y Axis -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatDensity(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- X Axis base line -->\n          <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">Value: {{ t.xVal | number:'1.1-2' }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Density</span>\n              <span class=\"tt-val\">{{ t.yVal | number:'1.1-4' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Z-Score</span>\n              <span class=\"tt-val\">{{ t.zScore | number:'1.1-2' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Percentile</span>\n              <span class=\"tt-val\">{{ t.percentile | number:'1.1-2' }}%</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-bell-curve {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .bell-curve-svg {\n      display: block;\n      overflow: visible;\n      cursor: crosshair;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n      stroke-dasharray: 3,3;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 10px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .sd-label {\n      font-weight: 700;\n      fill: #475569;\n    }\n    .sd-val-text {\n      font-size: 9px;\n      fill: #94a3b8;\n    }\n    .bell-curve-line {\n      animation: drawCurve 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      stroke-dasharray: 1200;\n      stroke-dashoffset: 1200;\n    }\n    @keyframes drawCurve {\n      from { stroke-dashoffset: 1200; }\n      to { stroke-dashoffset: 0; }\n    }\n    .hover-dot {\n      transition: r 0.1s ease;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.08s linear, top 0.08s linear;\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class BellCurveChartComponent {\n  data = input<number[]>([]);\n  mean = input<number | undefined>(undefined);\n  standardDeviation = input<number | undefined>(undefined);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  fillArea = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredPoint = signal<CurvePoint | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 25,\n    bottom: 40,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  // Compute Mean\n  computedMean = computed<number>(() => {\n    const customMean = this.mean();\n    if (customMean !== undefined) return customMean;\n    const raw = this.data();\n    if (raw.length === 0) return 0;\n    return raw.reduce((a, b) => a + b, 0) / raw.length;\n  });\n\n  // Compute Standard Deviation\n  computedSD = computed<number>(() => {\n    const customSD = this.standardDeviation();\n    if (customSD !== undefined) return customSD;\n    const raw = this.data();\n    if (raw.length <= 1) return 1;\n    const m = this.computedMean();\n    const variance = raw.map(x => Math.pow(x - m, 2)).reduce((a, b) => a + b, 0) / raw.length;\n    return Math.sqrt(variance) || 1;\n  });\n\n  curveColor = computed(() => {\n    const colorsList = this.colors();\n    return colorsList[0] || '#4a90d9';\n  });\n\n  // Positions on X Axis for Standard Deviation indicators\n  sdPositions = computed(() => {\n    const m = this.computedMean();\n    const sd = this.computedSD();\n    return [\n      { label: '-3σ', val: m - 3 * sd },\n      { label: '-2σ', val: m - 2 * sd },\n      { label: '-1σ', val: m - sd },\n      { label: 'μ', val: m },\n      { label: '+1σ', val: m + sd },\n      { label: '+2σ', val: m + 2 * sd },\n      { label: '+3σ', val: m + 3 * sd }\n    ];\n  });\n\n  // Generate points on the normal distribution curve (range -3.5σ to +3.5σ)\n  curvePoints = computed<CurvePoint[]>(() => {\n    const m = this.computedMean();\n    const sd = this.computedSD();\n    const w = this.innerW();\n    const h = this.innerH();\n\n    const minX = m - 3.5 * sd;\n    const maxX = m + 3.5 * sd;\n\n    const points: CurvePoint[] = [];\n    const steps = 120;\n    const stepVal = (maxX - minX) / steps;\n\n    // Normal probability density function\n    // f(x) = (1 / (sd * sqrt(2pi))) * e^(-0.5 * ((x-m)/sd)^2)\n    const factor = 1 / (sd * Math.sqrt(2 * Math.PI));\n\n    for (let i = 0; i <= steps; i++) {\n      const xVal = minX + i * stepVal;\n      const zScore = (xVal - m) / sd;\n      const yVal = factor * Math.exp(-0.5 * zScore * zScore);\n\n      // Numeric Cumulative Distribution Function (CDF) approximation for percentile\n      const percentile = this.normalCDF(zScore) * 100;\n\n      // Temporary pixel layout coords (will be mapped using computed signals)\n      points.push({\n        xVal,\n        yVal,\n        zScore,\n        percentile,\n        px: 0,\n        py: 0\n      });\n    }\n\n    // Now map yVal and xVal to actual pixel coordinates\n    const maxYVal = factor; // peak height of standard normal is at mean (z=0)\n    const yDomainMax = maxYVal * 1.1; // leave some top padding\n\n    return points.map(pt => ({\n      ...pt,\n      px: scale(pt.xVal, minX, maxX, 0, w),\n      py: scale(pt.yVal, 0, yDomainMax, h, 0)\n    }));\n  });\n\n  curvePath = computed<string>(() => {\n    const pts = this.curvePoints();\n    if (pts.length === 0) return '';\n    return pts.reduce((acc, pt, idx) => {\n      return idx === 0 ? `M ${pt.px} ${pt.py}` : `${acc} L ${pt.px} ${pt.py}`;\n    }, '');\n  });\n\n  yTicks = computed(() => {\n    const sd = this.computedSD();\n    const factor = 1 / (sd * Math.sqrt(2 * Math.PI));\n    return niceTicks(0, factor * 1.1, 5);\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  yPos(val: number): number {\n    const sd = this.computedSD();\n    const factor = 1 / (sd * Math.sqrt(2 * Math.PI));\n    return scale(val, 0, factor * 1.1, this.innerH(), 0);\n  }\n\n  xPos(xVal: number): number {\n    const m = this.computedMean();\n    const sd = this.computedSD();\n    const minX = m - 3.5 * sd;\n    const maxX = m + 3.5 * sd;\n    return scale(xVal, minX, maxX, 0, this.innerW());\n  }\n\n  // Create SVG path for standard deviation band fills\n  bandPath(startZ: number, endZ: number): string {\n    const pts = this.curvePoints();\n    if (pts.length === 0) return '';\n\n    const bandPts = pts.filter(pt => pt.zScore >= startZ && pt.zScore <= endZ);\n    if (bandPts.length === 0) return '';\n\n    const first = bandPts[0];\n    const last = bandPts[bandPts.length - 1];\n\n    let path = `M ${first.px} ${this.innerH()}`;\n    bandPts.forEach(pt => {\n      path += ` L ${pt.px} ${pt.py}`;\n    });\n    path += ` L ${last.px} ${this.innerH()} Z`;\n    return path;\n  }\n\n  onSvgMouseMove(event: MouseEvent) {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n\n    const rect = svg.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.margin().left;\n    const pts = this.curvePoints();\n\n    if (pts.length === 0) return;\n\n    // Find the point closest horizontally to mouse X\n    let closestPt = pts[0];\n    let minDist = Math.abs(pts[0].px - mx);\n\n    for (let i = 1; i < pts.length; i++) {\n      const dist = Math.abs(pts[i].px - mx);\n      if (dist < minDist) {\n        minDist = dist;\n        closestPt = pts[i];\n      }\n    }\n\n    // Set tooltip coordinates relative to parent container\n    const parentRect = svg.parentElement?.getBoundingClientRect();\n    if (parentRect) {\n      this.hoveredPoint.set(closestPt);\n      this.tooltip.set(closestPt);\n      this.tooltipX.set(event.clientX - parentRect.left);\n      this.tooltipY.set(event.clientY - parentRect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredPoint.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const pts = this.curvePoints();\n    if (!pts.length) return;\n\n    let csv = 'X Value,Y Density,Z Score,Percentile\\n';\n    pts.forEach(p => {\n      csv += `${p.xVal},${p.yVal},${p.zScore},${p.percentile}\\n`;\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'bell-curve-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const pts = this.curvePoints();\n    if (!pts.length) return;\n\n    const data = pts.map(p => ({\n      xVal: p.xVal,\n      yDensity: p.yVal,\n      zScore: p.zScore,\n      percentile: p.percentile\n    }));\n\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'bell-curve-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'bell-curve-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Bell Curve Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .tick-label { font-size: 10px; fill: #64748b; font-weight: 550; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Bell Curve Distribution Analysis</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  // Helper CDF calculator for Normal Distribution\n  private normalCDF(z: number): number {\n    // Abromowitz and Stegun formula 26.2.17\n    const t = 1.0 / (1.0 + 0.2316419 * Math.abs(z));\n    const d = 0.398942280401 * Math.exp(-z * z / 2.0);\n    const p = d * t * (0.31938153 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + t * 1.330274429))));\n    return z >= 0 ? 1.0 - p : p;\n  }\n\n  formatDensity(v: number): string {\n    return v.toFixed(3);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum, niceTicks, scale } from '../shared/chart-utils';\n\nexport interface ErrorBarPoint {\n  label: string;\n  value: number;\n  errorPlus: number;\n  errorMinus: number;\n  color?: string;\n  x: number;\n  y: number;\n  yTop: number;\n  yBottom: number;\n}\n\n@Component({\n  selector: 'ngx-error-bar',\n  standalone: true,\n  imports: [DecimalPipe, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-error-bar\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Error Bar Estimation</span>\n          <span class=\"header-subtitle\">Uncertainty margins visualization</span>\n        </div>\n        \n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"error-bar-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Lines -->\n          @if (showGrid()) {\n            @for (tick of yTicks(); track tick) {\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"yPos(tick)\"\n                [attr.y2]=\"yPos(tick)\"\n                class=\"grid-line\"\n              />\n            }\n          }\n\n          <!-- Bars (if chartType is 'bar') -->\n          @if (chartType() === 'bar') {\n            @for (pt of computedPoints(); track pt.label; let i = $index) {\n              <rect\n                [attr.x]=\"pt.x - barWidth() / 2\"\n                [attr.y]=\"barY(pt.value)\"\n                [attr.width]=\"barWidth()\"\n                [attr.height]=\"barHeight(pt.value)\"\n                [attr.fill]=\"pointColor(pt, i)\"\n                opacity=\"0.75\"\n                class=\"bar-rect\"\n                [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n                (mouseenter)=\"onPointHover(i)\"\n              />\n            }\n          }\n\n          <!-- Line Connection (if chartType is 'line') -->\n          @if (chartType() === 'line' && linePath(); as pathStr) {\n            <path\n              [attr.d]=\"pathStr\"\n              [attr.stroke]=\"lineColor()\"\n              fill=\"none\"\n              stroke-width=\"2.5\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              class=\"trend-line\"\n            />\n          }\n\n          <!-- Error Whiskers & Caps -->\n          @for (pt of computedPoints(); track pt.label; let i = $index) {\n            <g\n              class=\"error-whisker-group\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onPointHover(i)\"\n            >\n              <!-- Vertical Error Line -->\n              <line\n                [attr.x1]=\"pt.x\"\n                [attr.x2]=\"pt.x\"\n                [attr.y1]=\"pt.yTop\"\n                [attr.y2]=\"pt.yBottom\"\n                class=\"whisker-line\"\n                [attr.stroke]=\"whiskerColor()\"\n                stroke-width=\"1.8\"\n              />\n              <!-- Top Cap Line -->\n              <line\n                [attr.x1]=\"pt.x - capWidth() / 2\"\n                [attr.x2]=\"pt.x + capWidth() / 2\"\n                [attr.y1]=\"pt.yTop\"\n                [attr.y2]=\"pt.yTop\"\n                class=\"whisker-cap\"\n                [attr.stroke]=\"whiskerColor()\"\n                stroke-width=\"1.8\"\n              />\n              <!-- Bottom Cap Line -->\n              <line\n                [attr.x1]=\"pt.x - capWidth() / 2\"\n                [attr.x2]=\"pt.x + capWidth() / 2\"\n                [attr.y1]=\"pt.yBottom\"\n                [attr.y2]=\"pt.yBottom\"\n                class=\"whisker-cap\"\n                [attr.stroke]=\"whiskerColor()\"\n                stroke-width=\"1.8\"\n              />\n\n              <!-- Center Point Marker (if chartType is 'line') -->\n              @if (chartType() === 'line') {\n                <circle\n                  [attr.cx]=\"pt.x\"\n                  [attr.cy]=\"pt.y\"\n                  [attr.r]=\"hoveredIndex() === i ? 6 : 4.5\"\n                  [attr.fill]=\"pointColor(pt, i)\"\n                  stroke=\"#ffffff\"\n                  stroke-width=\"1.5\"\n                  class=\"center-dot\"\n                  (mousemove)=\"onMouseMove($event)\"\n                />\n              } @else {\n                <!-- Hover transparent indicator for bars -->\n                <circle\n                  [attr.cx]=\"pt.x\"\n                  [attr.cy]=\"pt.y\"\n                  [attr.r]=\"6\"\n                  fill=\"none\"\n                  stroke=\"none\"\n                  pointer-events=\"all\"\n                  (mousemove)=\"onMouseMove($event)\"\n                />\n              }\n            </g>\n          }\n\n          <!-- Y Axis -->\n          <g class=\"y-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"axis-line\" />\n            @for (tick of yTicks(); track tick) {\n              <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"0\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ labelFormatter() ? labelFormatter()!(tick) : formatNumber(tick) }}\n                </text>\n              </g>\n            }\n          </g>\n\n          <!-- X Axis -->\n          <g [attr.transform]=\"'translate(0,' + innerH() + ')'\" class=\"x-axis\">\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"axis-line\" />\n            @for (pt of computedPoints(); track pt.label; let i = $index) {\n              <g [attr.transform]=\"'translate(' + pt.x + ',0)'\">\n                <line [attr.y1]=\"0\" [attr.y2]=\"4\" class=\"tick-line\" />\n                <text\n                  [attr.y]=\"16\"\n                  text-anchor=\"middle\"\n                  class=\"tick-label x-tick-label\"\n                >\n                  {{ pt.label }}\n                </text>\n              </g>\n            }\n          </g>\n\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Value</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.value) : formatNumber(t.value) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Margin (+ / -)</span>\n              <span class=\"tt-val\">+{{ t.errorPlus | number:'1.0-2' }} / -{{ t.errorMinus | number:'1.0-2' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Confidence Range</span>\n              <span class=\"tt-val\">[{{ (t.value - t.errorMinus) | number:'1.0-2' }} , {{ (t.value + t.errorPlus) | number:'1.0-2' }}]</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-error-bar {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .error-bar-svg {\n      display: block;\n      overflow: visible;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1;\n      stroke-dasharray: 3,3;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.5;\n    }\n    .tick-label {\n      font-size: 10px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 550;\n      user-select: none;\n    }\n    .x-tick-label {\n      font-size: 10px;\n    }\n    .bar-rect {\n      cursor: pointer;\n      transition: all 0.2s ease;\n    }\n    .bar-rect.dimmed {\n      opacity: 0.25 !important;\n    }\n    .error-whisker-group {\n      cursor: pointer;\n    }\n    .error-whisker-group.dimmed {\n      opacity: 0.3;\n    }\n    .error-whisker-group.highlighted .whisker-line,\n    .error-whisker-group.highlighted .whisker-cap {\n      stroke: #0f172a !important;\n      stroke-width: 2.2px !important;\n    }\n    .center-dot {\n      transition: r 0.15s ease;\n    }\n    .trend-line {\n      stroke-dasharray: 1000;\n      stroke-dashoffset: 1000;\n      animation: drawLine 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    @keyframes drawLine {\n      from { stroke-dashoffset: 1000; }\n      to { stroke-dashoffset: 0; }\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class ErrorBarComponent {\n  data = input<{ label: string; value: number; errorPlus: number; errorMinus: number; color?: string }[]>([]);\n  chartType = input<'line' | 'bar'>('line');\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 25,\n    right: 25,\n    bottom: 35,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  capWidth = computed(() => Math.max(6, Math.min(14, this.innerW() / (this.data().length || 1) * 0.15)));\n  barWidth = computed(() => Math.max(10, (this.innerW() / (this.data().length || 1)) * 0.6));\n\n  yDomain = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return { min: 0, max: 100 };\n\n    const mins = raw.map(d => d.value - d.errorMinus);\n    const maxs = raw.map(d => d.value + d.errorPlus);\n\n    const minVal = Math.min(0, ...mins);\n    const maxVal = Math.max(10, ...maxs);\n    const range = maxVal - minVal;\n\n    return {\n      min: minVal - range * 0.05,\n      max: maxVal + range * 0.05\n    };\n  });\n\n  yTicks = computed(() => {\n    const domain = this.yDomain();\n    return niceTicks(domain.min, domain.max, 5);\n  });\n\n  yDomainMin = computed(() => this.yTicks()[0] || 0);\n  yDomainMax = computed(() => this.yTicks()[this.yTicks().length - 1] || 100);\n\n  computedPoints = computed<ErrorBarPoint[]>(() => {\n    const raw = this.data();\n    const count = raw.length;\n    if (count === 0) return [];\n\n    const w = this.innerW();\n    const h = this.innerH();\n    const yMin = this.yDomainMin();\n    const yMax = this.yDomainMax();\n\n    return raw.map((d, i) => {\n      // Scale X evenly\n      const x = count <= 1 ? w / 2 : scale(i, 0, count - 1, w * 0.08, w * 0.92);\n      const y = scale(d.value, yMin, yMax, h, 0);\n      const yTop = scale(d.value + d.errorPlus, yMin, yMax, h, 0);\n      const yBottom = scale(d.value - d.errorMinus, yMin, yMax, h, 0);\n\n      return {\n        ...d,\n        x,\n        y,\n        yTop,\n        yBottom\n      };\n    });\n  });\n\n  linePath = computed<string>(() => {\n    const pts = this.computedPoints();\n    if (pts.length < 2) return '';\n    return pts.reduce((acc, pt, idx) => {\n      return idx === 0 ? `M ${pt.x} ${pt.y}` : `${acc} L ${pt.x} ${pt.y}`;\n    }, '');\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  yPos(val: number): number {\n    return scale(val, this.yDomainMin(), this.yDomainMax(), this.innerH(), 0);\n  }\n\n  barY(val: number): number {\n    const yVal = this.yPos(val);\n    const yZero = this.yPos(0);\n    return Math.min(yVal, yZero);\n  }\n\n  barHeight(val: number): number {\n    const yVal = this.yPos(val);\n    const yZero = this.yPos(0);\n    return Math.abs(yVal - yZero);\n  }\n\n  pointColor(pt: ErrorBarPoint, i: number): string {\n    if (pt.color) return pt.color;\n    const colorsList = this.colors();\n    return colorsList[i % colorsList.length];\n  }\n\n  lineColor(): string {\n    return this.colors()[0] || '#4a90d9';\n  }\n\n  whiskerColor(): string {\n    return '#64748b';\n  }\n\n  onPointHover(idx: number) {\n    this.hoveredIndex.set(idx);\n    const pt = this.computedPoints()[idx];\n    if (pt) {\n      this.tooltip.set(pt);\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-error-bar');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const pts = this.computedPoints();\n    if (!pts.length) return;\n\n    let csv = 'Label,Value,Error Plus,Error Minus\\n';\n    pts.forEach(p => {\n      csv += `\"${p.label}\",${p.value},${p.errorPlus},${p.errorMinus}\\n`;\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'error-bar-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const pts = this.computedPoints();\n    if (!pts.length) return;\n\n    const data = pts.map(p => ({\n      label: p.label,\n      value: p.value,\n      errorPlus: p.errorPlus,\n      errorMinus: p.errorMinus\n    }));\n\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'error-bar-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'error-bar.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Error Bar Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .tick-label { font-size: 10px; fill: #64748b; font-weight: 550; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Error Bar Uncertainty Analysis</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum, scale } from '../shared/chart-utils';\n\nexport interface TileItem {\n  r: number;\n  c: number;\n  label: string;\n  value: number;\n  color?: string;\n  tooltipInfo?: string;\n}\n\nexport interface ComputedTile {\n  raw: TileItem;\n  index: number;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  pointsPath: string; // for hexagon\n  color: string;\n}\n\n@Component({\n  selector: 'ngx-tilemap',\n  standalone: true,\n  imports: [CommonModule, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-tilemap\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Grid Tilemap</span>\n          <span class=\"header-subtitle\">Layout: {{ type() | titlecase }} Grid</span>\n        </div>\n        \n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"tilemap-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          @for (tile of computedTiles(); track tile.index; let i = $index) {\n            <g\n              class=\"tile-group\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onTileHover(i)\"\n              (mousemove)=\"onMouseMove($event)\"\n            >\n              @if (type() === 'rect') {\n                <rect\n                  [attr.x]=\"tile.x\"\n                  [attr.y]=\"tile.y\"\n                  [attr.width]=\"tile.w\"\n                  [attr.height]=\"tile.h\"\n                  [attr.fill]=\"tile.color\"\n                  stroke=\"#ffffff\"\n                  stroke-width=\"1.5\"\n                  rx=\"6\"\n                  ry=\"6\"\n                  class=\"tile-element\"\n                />\n              } @else {\n                <path\n                  [attr.d]=\"tile.pointsPath\"\n                  [attr.fill]=\"tile.color\"\n                  stroke=\"#ffffff\"\n                  stroke-width=\"1.5\"\n                  class=\"tile-element\"\n                />\n              }\n\n              @if (showLabels()) {\n                <text\n                  [attr.x]=\"tile.x + tile.w / 2\"\n                  [attr.y]=\"tile.y + tile.h / 2 + 3\"\n                  text-anchor=\"middle\"\n                  class=\"tile-label\"\n                  [attr.fill]=\"getTextColor(tile.color)\"\n                >\n                  {{ tile.raw.label }}\n                </text>\n                <text\n                  [attr.x]=\"tile.x + tile.w / 2\"\n                  [attr.y]=\"tile.y + tile.h / 2 + 14\"\n                  text-anchor=\"middle\"\n                  class=\"tile-sublabel\"\n                  [attr.fill]=\"getTextColor(tile.color)\"\n                  opacity=\"0.8\"\n                >\n                  {{ formatNumber(tile.raw.value) }}\n                </text>\n              }\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Grid Pos</span>\n              <span class=\"tt-val\">Row {{ t.r }}, Col {{ t.c }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Value</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.value) : formatNumber(t.value) }}</span>\n            </div>\n            @if (t.tooltipInfo) {\n              <div class=\"tt-info\">{{ t.tooltipInfo }}</div>\n            }\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-tilemap {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .tilemap-svg {\n      display: block;\n      overflow: visible;\n    }\n    .tile-group {\n      cursor: pointer;\n      transition: opacity 0.2s ease;\n    }\n    .tile-group.dimmed {\n      opacity: 0.3 !important;\n    }\n    .tile-element {\n      transition: transform 0.2s ease, filter 0.2s ease;\n      transform-origin: center;\n    }\n    .tile-group.highlighted .tile-element {\n      filter: drop-shadow(0 4px 10px rgba(0,0,0,0.18));\n      transform: scale(1.05);\n      stroke: #0f172a !important;\n      stroke-width: 2px !important;\n      z-index: 10;\n    }\n    .tile-label {\n      font-size: 11px;\n      font-weight: 700;\n      pointer-events: none;\n      user-select: none;\n    }\n    .tile-sublabel {\n      font-size: 8.5px;\n      font-weight: 600;\n      pointer-events: none;\n      user-select: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n    .tt-info {\n      font-size: 10px;\n      color: #a7f3d0;\n      margin-top: 8px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.1);\n      padding-top: 4px;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class TilemapComponent {\n  data = input<TileItem[]>([]);\n  type = input<'rect' | 'hexagon'>('rect');\n  height = input<number>(350);\n  colors = input<string[]>(CHART_COLORS);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 15,\n    right: 15,\n    bottom: 15,\n    left: 15\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  computedTiles = computed<ComputedTile[]>(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n\n    const rows = raw.map(d => d.r);\n    const cols = raw.map(d => d.c);\n\n    const minRow = Math.min(...rows);\n    const maxRow = Math.max(...rows);\n    const minCol = Math.min(...cols);\n    const maxCol = Math.max(...cols);\n\n    const rowCount = maxRow - minRow + 1;\n    const colCount = maxCol - minCol + 1;\n\n    const w = this.innerW();\n    const h = this.innerH();\n\n    const minVal = Math.min(...raw.map(d => d.value));\n    const maxVal = Math.max(1, ...raw.map(d => d.value));\n\n    // Colors mapping\n    const baseColor = this.colors()[0] || '#4a90d9';\n\n    if (this.type() === 'rect') {\n      const cellW = w / colCount;\n      const cellH = h / rowCount;\n      const padding = 4;\n\n      return raw.map((d, idx) => {\n        const x = (d.c - minCol) * cellW + padding / 2;\n        const y = (d.r - minRow) * cellH + padding / 2;\n        const tileW = cellW - padding;\n        const tileH = cellH - padding;\n\n        return {\n          raw: d,\n          index: idx,\n          x,\n          y,\n          w: tileW,\n          h: tileH,\n          pointsPath: '',\n          color: d.color || this.interpolateColor(baseColor, d.value, minVal, maxVal)\n        };\n      });\n    } else {\n      // Hexagonal layout\n      // Divide horizontal space by (colCount * 0.75 + 0.25)\n      const hexW = w / (colCount * 0.75 + 0.25);\n      const hexH = h / (rowCount + 0.5);\n      const padding = 3;\n\n      // Hexagon radius\n      const radius = Math.min(hexW / 2, hexH / Math.sqrt(3)) - padding / 2;\n\n      return raw.map((d, idx) => {\n        const cx = (d.c - minCol) * hexW * 0.75 + hexW / 2;\n        // Shift alternate columns vertically\n        const cy = (d.r - minRow) * hexH + ((d.c - minCol) % 2 === 0 ? 0 : hexH / 2) + hexH / 2;\n\n        // Draw hexagon corners path\n        let path = '';\n        for (let k = 0; k < 6; k++) {\n          const angleRad = (k * 60 * Math.PI) / 180;\n          const x = cx + radius * Math.cos(angleRad);\n          const y = cy + radius * Math.sin(angleRad);\n          path += (k === 0 ? 'M' : 'L') + ` ${x} ${y}`;\n        }\n        path += ' Z';\n\n        return {\n          raw: d,\n          index: idx,\n          x: cx - radius,\n          y: cy - radius,\n          w: radius * 2,\n          h: radius * 2,\n          pointsPath: path,\n          color: d.color || this.interpolateColor(baseColor, d.value, minVal, maxVal)\n        };\n      });\n    }\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Linear color interpolation from a light tone of the baseColor to the actual baseColor\n  private interpolateColor(baseHex: string, val: number, min: number, max: number): string {\n    const t = max === min ? 0.5 : (val - min) / (max - min);\n\n    // Standard base color parsing\n    let rB = 74, gB = 144, bB = 217;\n    if (baseHex.startsWith('#')) {\n      const hex = baseHex.substring(1);\n      if (hex.length === 3) {\n        rB = parseInt(hex[0] + hex[0], 16);\n        gB = parseInt(hex[1] + hex[1], 16);\n        bB = parseInt(hex[2] + hex[2], 16);\n      } else if (hex.length === 6) {\n        rB = parseInt(hex.substring(0, 2), 16);\n        gB = parseInt(hex.substring(2, 4), 16);\n        bB = parseInt(hex.substring(4, 6), 16);\n      }\n    }\n\n    // Interpolate with light color (e.g. RGB 240, 246, 255)\n    const rStart = 240, gStart = 246, bStart = 255;\n    const r = Math.round(rStart + t * (rB - rStart));\n    const g = Math.round(gStart + t * (gB - gStart));\n    const b = Math.round(bStart + t * (bB - bStart));\n\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n\n  // Returns white text for dark backgrounds, dark text for light backgrounds\n  getTextColor(bgColor: string): string {\n    if (bgColor.startsWith('rgb')) {\n      const matches = bgColor.match(/\\d+/g);\n      if (matches && matches.length >= 3) {\n        const r = parseInt(matches[0]);\n        const g = parseInt(matches[1]);\n        const b = parseInt(matches[2]);\n        const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n        return brightness > 140 ? '#1e293b' : '#ffffff';\n      }\n    }\n    return '#1e293b';\n  }\n\n  onTileHover(idx: number) {\n    this.hoveredIndex.set(idx);\n    const tile = this.computedTiles()[idx];\n    if (tile) {\n      this.tooltip.set(tile.raw);\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-tilemap');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const tiles = this.computedTiles();\n    if (!tiles.length) return;\n\n    let csv = 'Label,Row,Col,Value,TooltipInfo\\n';\n    tiles.forEach(t => {\n      csv += `\"${t.raw.label}\",${t.raw.r},${t.raw.c},${t.raw.value},\"${t.raw.tooltipInfo || ''}\"\\n`;\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tilemap-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const tiles = this.computedTiles();\n    if (!tiles.length) return;\n\n    const data = tiles.map(t => ({\n      label: t.raw.label,\n      row: t.raw.r,\n      col: t.raw.c,\n      value: t.raw.value,\n      tooltipInfo: t.raw.tooltipInfo\n    }));\n\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tilemap-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tilemap.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Tilemap Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .tile-label { font-size: 11px; font-weight: bold; }\n          .tile-sublabel { font-size: 8.5px; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Grid Tilemap Analysis</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface VennRegion {\n  key: string;\n  label: string;\n  value: number;\n  color: string;\n  textX: number;\n  textY: number;\n}\n\n@Component({\n  selector: 'ngx-venn-diagram',\n  standalone: true,\n  imports: [CommonModule, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-venn\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Venn Diagram Overlap</span>\n          <span class=\"header-subtitle\">Sets: {{ sets().join(', ') }}</span>\n        </div>\n        \n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"venn-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n        (mousemove)=\"onSvgMouseMove($event)\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          <!-- Venn Circles Fills -->\n          @for (c of circles(); track c.id) {\n            <circle\n              [attr.cx]=\"c.cx\"\n              [attr.cy]=\"c.cy\"\n              [attr.r]=\"c.r\"\n              [attr.fill]=\"c.color\"\n              class=\"venn-circle-shape\"\n              [class.active-c]=\"isCircleActive(c.id)\"\n            />\n          }\n\n          <!-- Venn Borders (drawn separately to stack on top of fills) -->\n          @for (c of circles(); track c.id) {\n            <circle\n              [attr.cx]=\"c.cx\"\n              [attr.cy]=\"c.cy\"\n              [attr.r]=\"c.r\"\n              fill=\"none\"\n              [attr.stroke]=\"c.color\"\n              stroke-width=\"2.5\"\n              pointer-events=\"none\"\n            />\n          }\n\n          <!-- Centroid Labels -->\n          @for (r of computedRegions(); track r.key; let i = $index) {\n            <g\n              class=\"region-label-group\"\n              [class.highlighted]=\"hoveredRegionKey() === r.key\"\n            >\n              <text\n                [attr.x]=\"r.textX\"\n                [attr.y]=\"r.textY\"\n                text-anchor=\"middle\"\n                class=\"region-label\"\n              >\n                {{ r.label }}\n              </text>\n              <text\n                [attr.x]=\"r.textX\"\n                [attr.y]=\"r.textY + 12\"\n                text-anchor=\"middle\"\n                class=\"region-val\"\n              >\n                {{ formatNumber(r.value) }}\n              </text>\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\" [style.color]=\"t.color\">{{ t.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Overlap Value</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.value) : formatNumber(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-venn {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .venn-svg {\n      display: block;\n      overflow: visible;\n    }\n    .venn-circle-shape {\n      mix-blend-mode: multiply;\n      opacity: 0.35;\n      transition: opacity 0.2s ease, transform 0.2s ease;\n    }\n    .venn-circle-shape.active-c {\n      opacity: 0.55;\n    }\n    .region-label-group {\n      pointer-events: none;\n      user-select: none;\n      opacity: 0.75;\n      transition: opacity 0.15s ease, transform 0.15s ease;\n    }\n    .region-label-group.highlighted {\n      opacity: 1;\n      transform: scale(1.05);\n    }\n    .region-label {\n      font-size: 10.5px;\n      font-weight: 700;\n      fill: #1e293b;\n    }\n    .region-val {\n      font-size: 9px;\n      font-weight: 600;\n      fill: #475569;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class VennDiagramComponent {\n  sets = input<string[]>(['A', 'B']);\n  sizes = input<Record<string, number>>({});\n  height = input<number>(350);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredRegionKey = signal<string | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 10,\n    right: 10,\n    bottom: 10,\n    left: 10\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  isThreeSets = computed<boolean>(() => this.sets().length >= 3);\n\n  // Geometry configuration of circles\n  circles = computed(() => {\n    const is3 = this.isThreeSets();\n    const w = this.innerW();\n    const h = this.innerH();\n    const cols = this.colors();\n\n    if (!is3) {\n      // 2 circles\n      const r = Math.min(w, h) * 0.32;\n      const cxA = w / 2 - r * 0.45;\n      const cxB = w / 2 + r * 0.45;\n      const cy = h / 2;\n\n      return [\n        { id: 'A', cx: cxA, cy, r, color: cols[0] || '#4a90d9' },\n        { id: 'B', cx: cxB, cy, r, color: cols[1] || '#ff6358' }\n      ];\n    } else {\n      // 3 circles\n      const r = Math.min(w, h) * 0.28;\n      const cxA = w / 2;\n      const cyA = h / 2 - r * 0.38;\n      const cxB = w / 2 - r * 0.45;\n      const cyB = h / 2 + r * 0.4;\n      const cxC = w / 2 + r * 0.45;\n      const cyC = h / 2 + r * 0.4;\n\n      return [\n        { id: 'A', cx: cxA, cy: cyA, r, color: cols[0] || '#4a90d9' },\n        { id: 'B', cx: cxB, cy: cyB, r, color: cols[1] || '#ff6358' },\n        { id: 'C', cx: cxC, cy: cyC, r, color: cols[2] || '#27ae60' }\n      ];\n    }\n  });\n\n  computedRegions = computed<VennRegion[]>(() => {\n    const is3 = this.isThreeSets();\n    const sizeMap = this.sizes();\n    const circs = this.circles();\n    const labels = this.sets();\n    const cols = this.colors();\n\n    const labelA = labels[0] || 'A';\n    const labelB = labels[1] || 'B';\n\n    if (!is3) {\n      const cA = circs[0];\n      const cB = circs[1];\n\n      return [\n        {\n          key: 'A',\n          label: `${labelA} only`,\n          value: sizeMap['A'] ?? 100,\n          color: cA.color,\n          textX: cA.cx - cA.r * 0.4,\n          textY: cA.cy - 5\n        },\n        {\n          key: 'B',\n          label: `${labelB} only`,\n          value: sizeMap['B'] ?? 80,\n          color: cB.color,\n          textX: cB.cx + cB.r * 0.4,\n          textY: cB.cy - 5\n        },\n        {\n          key: 'A&B',\n          label: 'Overlap',\n          value: sizeMap['A&B'] ?? 30,\n          color: cols[2] || '#f39c12',\n          textX: (cA.cx + cB.cx) / 2,\n          textY: cA.cy - 5\n        }\n      ];\n    } else {\n      const labelC = labels[2] || 'C';\n      const cA = circs[0];\n      const cB = circs[1];\n      const cC = circs[2];\n\n      return [\n        {\n          key: 'A',\n          label: `${labelA} only`,\n          value: sizeMap['A'] ?? 120,\n          color: cA.color,\n          textX: cA.cx,\n          textY: cA.cy - cA.r * 0.45\n        },\n        {\n          key: 'B',\n          label: `${labelB} only`,\n          value: sizeMap['B'] ?? 100,\n          color: cB.color,\n          textX: cB.cx - cB.r * 0.4,\n          textY: cB.cy + cB.r * 0.25\n        },\n        {\n          key: 'C',\n          label: `${labelC} only`,\n          value: sizeMap['C'] ?? 90,\n          color: cC.color,\n          textX: cC.cx + cC.r * 0.4,\n          textY: cC.cy + cC.r * 0.25\n        },\n        {\n          key: 'A&B',\n          label: `${labelA} ∩ ${labelB}`,\n          value: sizeMap['A&B'] ?? 40,\n          color: cols[3] || '#f39c12',\n          textX: (cA.cx + cB.cx) / 2 - 10,\n          textY: (cA.cy + cB.cy) / 2 - 10\n        },\n        {\n          key: 'B&C',\n          label: `${labelB} ∩ ${labelC}`,\n          value: sizeMap['B&C'] ?? 30,\n          color: cols[4] || '#8e44ad',\n          textX: (cB.cx + cC.cx) / 2,\n          textY: (cB.cy + cC.cy) / 2 + 15\n        },\n        {\n          key: 'A&C',\n          label: `${labelA} ∩ ${labelC}`,\n          value: sizeMap['A&C'] ?? 25,\n          color: cols[5] || '#1abc9c',\n          textX: (cA.cx + cC.cx) / 2 + 10,\n          textY: (cA.cy + cC.cy) / 2 - 10\n        },\n        {\n          key: 'A&B&C',\n          label: 'Intersection',\n          value: sizeMap['A&B&C'] ?? 15,\n          color: '#34495e',\n          textX: cA.cx,\n          textY: (cA.cy + cB.cy) / 2 + 5\n        }\n      ];\n    }\n  });\n\n  isCircleActive(cId: string): boolean {\n    const rKey = this.hoveredRegionKey();\n    if (!rKey) return false;\n    return rKey.includes(cId);\n  }\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  onSvgMouseMove(event: MouseEvent) {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n\n    const rect = svg.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.margin().left;\n    const my = event.clientY - rect.top - this.margin().top;\n\n    const circs = this.circles();\n    const is3 = this.isThreeSets();\n\n    // Calculate containment in circles A, B (and C)\n    const inA = this.inCircle(mx, my, circs[0]);\n    const inB = this.inCircle(mx, my, circs[1]);\n    const inC = is3 ? this.inCircle(mx, my, circs[2]) : false;\n\n    let regionKey = '';\n    if (is3) {\n      if (inA && inB && inC) regionKey = 'A&B&C';\n      else if (inA && inB) regionKey = 'A&B';\n      else if (inB && inC) regionKey = 'B&C';\n      else if (inA && inC) regionKey = 'A&C';\n      else if (inA) regionKey = 'A';\n      else if (inB) regionKey = 'B';\n      else if (inC) regionKey = 'C';\n    } else {\n      if (inA && inB) regionKey = 'A&B';\n      else if (inA) regionKey = 'A';\n      else if (inB) regionKey = 'B';\n    }\n\n    if (regionKey) {\n      this.hoveredRegionKey.set(regionKey);\n      const region = this.computedRegions().find(r => r.key === regionKey);\n      if (region) {\n        this.tooltip.set(region);\n        const parentRect = svg.parentElement?.getBoundingClientRect();\n        if (parentRect) {\n          this.tooltipX.set(event.clientX - parentRect.left);\n          this.tooltipY.set(event.clientY - parentRect.top);\n        }\n      }\n    } else {\n      this.hoveredRegionKey.set(null);\n      this.tooltip.set(null);\n    }\n  }\n\n  private inCircle(x: number, y: number, circle: { cx: number; cy: number; r: number }): boolean {\n    const dx = x - circle.cx;\n    const dy = y - circle.cy;\n    return dx * dx + dy * dy <= circle.r * circle.r;\n  }\n\n  onMouseLeave() {\n    this.hoveredRegionKey.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const regions = this.computedRegions();\n    if (!regions.length) return;\n\n    let csv = 'Region Key,Region Label,Overlap Value\\n';\n    regions.forEach(r => {\n      csv += `\"${r.key}\",\"${r.label}\",${r.value}\\n`;\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'venn-diagram-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const regions = this.computedRegions();\n    if (!regions.length) return;\n\n    const data = regions.map(r => ({\n      regionKey: r.key,\n      label: r.label,\n      value: r.value\n    }));\n\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'venn-diagram-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'venn-diagram.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Venn Diagram Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .region-label { font-size: 10.5px; font-weight: bold; fill: #1e293b; }\n          .region-val { font-size: 9px; fill: #475569; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Venn Intersection Overlap Analysis</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum, scale } from '../shared/chart-utils';\n\nexport interface AxisDimension {\n  key: string;\n  min: number;\n  max: number;\n  ticks: number[];\n  x: number;\n}\n\nexport interface ParallelLine {\n  rawData: any;\n  index: number;\n  points: { x: number; y: number }[];\n  pathStr: string;\n  color: string;\n}\n\n@Component({\n  selector: 'ngx-parallel-coordinates',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-parallel-coordinates\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Parallel Coordinates Visualization</span>\n          <span class=\"header-subtitle\">Dimensions: {{ dimensions().join(' | ') }}</span>\n        </div>\n        \n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"parallel-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n        (mousemove)=\"onSvgMouseMove($event)\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Dimensions Axes Grid Lines -->\n          @for (axis of axes(); track axis.key) {\n            <line\n              [attr.x1]=\"axis.x\"\n              [attr.x2]=\"axis.x\"\n              [attr.y1]=\"0\"\n              [attr.y2]=\"innerH()\"\n              class=\"axis-line\"\n            />\n            \n            <!-- Axis Title -->\n            <text\n              [attr.x]=\"axis.x\"\n              [attr.y]=\"-10\"\n              text-anchor=\"middle\"\n              class=\"axis-title\"\n            >\n              {{ axis.key }}\n            </text>\n\n            <!-- Ticks on Axis (Min, Mid, Max) -->\n            @for (tick of axis.ticks; track tick) {\n              <g [attr.transform]=\"'translate(' + axis.x + ',' + yPosForAxis(tick, axis) + ')'\">\n                <line [attr.x1]=\"-4\" [attr.x2]=\"4\" [attr.y1]=\"0\" [attr.y2]=\"0\" class=\"tick-line\" />\n                <text\n                  [attr.x]=\"-8\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                  class=\"tick-label\"\n                >\n                  {{ formatAxisVal(axis.key, tick) }}\n                </text>\n              </g>\n            }\n          }\n\n          <!-- Data Lines -->\n          @for (line of computedLines(); track line.index; let i = $index) {\n            <path\n              [attr.d]=\"line.pathStr\"\n              [attr.stroke]=\"line.color\"\n              fill=\"none\"\n              [attr.stroke-width]=\"hoveredIndex() === i ? 4 : 1.8\"\n              class=\"data-line\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n            />\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">Record #{{ t.index + 1 }}</div>\n            @for (dim of dimensions(); track dim) {\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">{{ dim }}</span>\n                <span class=\"tt-val\">{{ formatAxisVal(dim, t.rawData[dim]) }}</span>\n              </div>\n            }\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-parallel-coordinates {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .parallel-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-axis, #cbd5e1);\n      stroke-width: 1.8;\n    }\n    .tick-line {\n      stroke: var(--ngx-chart-axis, #94a3b8);\n      stroke-width: 1.2;\n    }\n    .tick-label {\n      font-size: 9px;\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-weight: 600;\n      user-select: none;\n    }\n    .axis-title {\n      font-size: 11px;\n      font-weight: 700;\n      fill: var(--ngx-chart-axis-text, #334155);\n      user-select: none;\n    }\n    .data-line {\n      transition: stroke-width 0.15s ease, opacity 0.15s ease;\n      opacity: 0.65;\n    }\n    .data-line.dimmed {\n      opacity: 0.12 !important;\n    }\n    .data-line.highlighted {\n      opacity: 1 !important;\n      filter: drop-shadow(0 2px 5px rgba(0,0,0,0.15));\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class ParallelCoordinatesComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  data = input<Record<string, any>[]>([]);\n  dimensions = input<string[]>([]);\n  colorKey = input<string | undefined>(undefined);\n  height = input<number>(350);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((dim: string, val: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 35,\n    right: 40,\n    bottom: 25,\n    left: 45\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  // Compute boundaries for each axis\n  axes = computed<AxisDimension[]>(() => {\n    const dims = this.dimensions();\n    const raw = this.data();\n    const w = this.innerW();\n\n    if (dims.length === 0 || raw.length === 0) return [];\n\n    return dims.map((dim, idx) => {\n      const vals = raw.map(d => Number(d[dim]) || 0);\n      const min = Math.min(...vals);\n      const max = Math.max(1, ...vals);\n      const x = dims.length <= 1 ? w / 2 : scale(idx, 0, dims.length - 1, 0, w);\n\n      // 3 ticks: min, mid, max\n      const mid = min + (max - min) / 2;\n\n      return {\n        key: dim,\n        min,\n        max,\n        ticks: [min, mid, max],\n        x\n      };\n    });\n  });\n\n  computedLines = computed<ParallelLine[]>(() => {\n    const raw = this.data();\n    const axesList = this.axes();\n    const h = this.innerH();\n    const cols = this.colors();\n    const colKey = this.colorKey();\n\n    if (raw.length === 0 || axesList.length === 0) return [];\n\n    // Distinct categorical color values helper\n    const categories = colKey ? Array.from(new Set(raw.map(d => d[colKey]))) : [];\n\n    return raw.map((d, lineIdx) => {\n      const points = axesList.map(axis => {\n        const val = Number(d[axis.key]) || 0;\n        const y = scale(val, axis.min, axis.max, h, 0);\n        return { x: axis.x, y };\n      });\n\n      const pathStr = points.reduce((acc, pt, idx) => {\n        return idx === 0 ? `M ${pt.x} ${pt.y}` : `${acc} L ${pt.x} ${pt.y}`;\n      }, '');\n\n      let color = cols[lineIdx % cols.length];\n      if (colKey) {\n        const catIdx = categories.indexOf(d[colKey]);\n        color = cols[catIdx % cols.length];\n      }\n\n      return {\n        rawData: d,\n        index: lineIdx,\n        points,\n        pathStr,\n        color\n      };\n    });\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  yPosForAxis(val: number, axis: AxisDimension): number {\n    return scale(val, axis.min, axis.max, this.innerH(), 0);\n  }\n\n  formatAxisVal(dim: string, val: number): string {\n    const formatter = this.labelFormatter();\n    if (formatter) return formatter(dim, val);\n    return fmtNum(val);\n  }\n\n  onSvgMouseMove(event: MouseEvent) {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n\n    const rect = svg.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.margin().left;\n    const my = event.clientY - rect.top - this.margin().top;\n\n    const lines = this.computedLines();\n    const axesList = this.axes();\n\n    if (lines.length === 0 || axesList.length < 2) return;\n\n    // Find the horizontal segment that the mouse is currently in\n    let segmentIdx = 0;\n    for (let i = 0; i < axesList.length - 1; i++) {\n      if (mx >= axesList[i].x && mx <= axesList[i+1].x) {\n        segmentIdx = i;\n        break;\n      }\n    }\n\n    // Determine the interpolation factor t in this segment\n    const axisLeft = axesList[segmentIdx];\n    const axisRight = axesList[segmentIdx + 1];\n    const segmentW = axisRight.x - axisLeft.x;\n    const t = segmentW === 0 ? 0 : (mx - axisLeft.x) / segmentW;\n\n    // Find the line that is vertically closest to the mouse cursor at mx\n    let closestLineIdx = 0;\n    let minDist = Infinity;\n\n    lines.forEach((line, idx) => {\n      const yLeft = line.points[segmentIdx].y;\n      const yRight = line.points[segmentIdx + 1].y;\n      // Linear interpolation of y value on the line segment\n      const yLine = yLeft + t * (yRight - yLeft);\n      const dist = Math.abs(yLine - my);\n\n      if (dist < minDist) {\n        minDist = dist;\n        closestLineIdx = idx;\n      }\n    });\n\n    // If mouse is within 25px vertically, highlight the line\n    if (minDist < 25) {\n      this.hoveredIndex.set(closestLineIdx);\n      const activeLine = lines[closestLineIdx];\n      this.tooltip.set(activeLine);\n\n      const parentRect = svg.parentElement?.getBoundingClientRect();\n      if (parentRect) {\n        this.tooltipX.set(event.clientX - parentRect.left);\n        this.tooltipY.set(event.clientY - parentRect.top);\n      }\n    } else {\n      this.hoveredIndex.set(null);\n      this.tooltip.set(null);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'parallel-coordinates.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    const dimensions = this.dimensions();\n    if (!data.length || !dimensions.length) return;\n    const headers = ['Label', ...dimensions];\n    const rows = data.map(d => [d['label'] || '', ...dimensions.map(dim => d[dim] !== undefined ? d[dim] : '')]);\n    this.exportSvc.downloadCsv(headers, rows, 'parallel-coordinates.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum, scale } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface WordItem {\n  text: string;\n  value: number;\n  color?: string;\n}\n\nexport interface PlacedWord {\n  raw: WordItem;\n  index: number;\n  text: string;\n  fontSize: number;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  color: string;\n}\n\ninterface BoundingBox {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n}\n\n@Component({\n  selector: 'ngx-word-cloud',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-word-cloud\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Word Cloud Frequency</span>\n          <span class=\"header-subtitle\">Key terms analysis</span>\n        </div>\n        \n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"word-cloud-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          @for (word of placedWords(); track word.index; let i = $index) {\n            <g\n              class=\"word-group\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              [attr.transform]=\"'translate(' + word.x + ',' + word.y + ')'\"\n              (mouseenter)=\"onWordHover(i)\"\n              (mousemove)=\"onMouseMove($event)\"\n            >\n              <text\n                text-anchor=\"middle\"\n                dominant-baseline=\"central\"\n                [attr.font-size]=\"word.fontSize + 'px'\"\n                [attr.fill]=\"word.color\"\n                [style.font-weight]=\"'700'\"\n                class=\"cloud-word-text\"\n              >\n                {{ word.text }}\n              </text>\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.text }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Weight/Count</span>\n              <span class=\"tt-val\">{{ formatNumber(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-word-cloud {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .word-cloud-svg {\n      display: block;\n      overflow: visible;\n    }\n    .word-group {\n      cursor: pointer;\n      transition: opacity 0.2s ease, transform 0.2s ease;\n    }\n    .word-group.dimmed {\n      opacity: 0.18 !important;\n    }\n    .word-group.highlighted {\n      transform: scale(1.1);\n      filter: drop-shadow(0 4px 8px rgba(0,0,0,0.18));\n      opacity: 1 !important;\n    }\n    .cloud-word-text {\n      user-select: none;\n      transition: fill 0.15s ease;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 120px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n  `]\n})\nexport class WordCloudComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<WordItem[]>([]);\n  height = input<number>(350);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 10,\n    right: 10,\n    bottom: 10,\n    left: 10\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  // Placement calculation based on Archimedean spiral\n  placedWords = computed<PlacedWord[]>(() => {\n    const raw = [...this.data()].sort((a, b) => b.value - a.value);\n    if (raw.length === 0) return [];\n\n    const w = this.innerW();\n    const h = this.innerH();\n    const cx = w / 2;\n    const cy = h / 2;\n\n    const minVal = Math.min(...raw.map(d => d.value));\n    const maxVal = Math.max(1, ...raw.map(d => d.value));\n\n    const cols = this.colors();\n    const placed: PlacedWord[] = [];\n    const boxes: BoundingBox[] = [];\n\n    // Aspect ratio multiplier to handle non-square layout bounds\n    const aspectRatio = w / h;\n\n    raw.forEach((d, idx) => {\n      // Scale font size\n      const fSize = Math.round(scale(d.value, minVal, maxVal, 10, 42));\n\n      // Bounding box approximation (standard average character width multiplier is 0.55)\n      const wordW = d.text.length * fSize * 0.58;\n      const wordH = fSize * 1.1;\n\n      let placedSuccessfully = false;\n      let theta = 0;\n      let radiusMultiplier = 1.5;\n\n      // Try placing along the Archimedean spiral\n      for (let step = 0; step < 300; step++) {\n        // Spiral equations\n        const r = radiusMultiplier * theta;\n        const x = cx + r * Math.cos(theta) * aspectRatio;\n        const y = cy + r * Math.sin(theta);\n\n        // Word box centered at (x, y)\n        const box: BoundingBox = {\n          x1: x - wordW / 2,\n          y1: y - wordH / 2,\n          x2: x + wordW / 2,\n          y2: y + wordH / 2\n        };\n\n        // Collision check\n        const collides = boxes.some(b => {\n          return !(box.x2 < b.x1 || box.x1 > b.x2 || box.y2 < b.y1 || box.y1 > b.y2);\n        });\n\n        // Check if outside SVG bounds (leave 10px buffer)\n        const outOfBounds = box.x1 < 10 || box.x2 > w - 10 || box.y1 < 10 || box.y2 > h - 10;\n\n        if (!collides && !outOfBounds) {\n          boxes.push(box);\n          placed.push({\n            raw: d,\n            index: idx,\n            text: d.text,\n            fontSize: fSize,\n            x,\n            y,\n            width: wordW,\n            height: wordH,\n            color: d.color || cols[idx % cols.length]\n          });\n          placedSuccessfully = true;\n          break;\n        }\n\n        // Increment spiral parameters\n        theta += 0.12;\n      }\n\n      // Fallback: If cannot fit, place on outer edge or omit to prevent clutter\n      if (!placedSuccessfully) {\n        // Place at random boundary spot\n        const angle = Math.random() * Math.PI * 2;\n        const radius = Math.min(w, h) * 0.42;\n        const x = cx + radius * Math.cos(angle);\n        const y = cy + radius * Math.sin(angle);\n        placed.push({\n          raw: d,\n          index: idx,\n          text: d.text,\n          fontSize: fSize,\n          x,\n          y,\n          width: wordW,\n          height: wordH,\n          color: d.color || cols[idx % cols.length]\n        });\n      }\n    });\n\n    return placed;\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  onWordHover(idx: number) {\n    this.hoveredIndex.set(idx);\n    const word = this.placedWords()[idx];\n    if (word) {\n      this.tooltip.set(word.raw);\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-word-cloud');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const words = this.placedWords();\n    if (!words.length) return;\n    const headers = ['Text', 'Value'];\n    const rows = words.map(w => [w.text, w.raw.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'word-cloud-data.csv');\n  }\n\n  exportToJson(): void {\n    const words = this.placedWords();\n    if (!words.length) return;\n    const data = words.map(w => ({\n      text: w.text,\n      value: w.raw.value\n    }));\n    this.exportSvc.downloadJson(data, 'word-cloud-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'word-cloud.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Word Cloud Frequency Analysis', 'word-cloud.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, fmtNum } from '../shared/chart-utils';\n\nexport interface PictorialIcon {\n  index: number;\n  row: number;\n  col: number;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  fillId: string;\n  fraction: number;\n}\n\n@Component({\n  selector: 'ngx-pictorial-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, DecimalPipe, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-pictorial\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Pictorial Progress</span>\n          <span class=\"header-subtitle\">Value: {{ value() }} / {{ max() }} ({{ percentage() | number:'1.0-1' }}%)</span>\n        </div>\n        \n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"pictorial-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n      >\n        <defs>\n          <!-- Create dynamic linear gradients for partial fills -->\n          @for (ic of computedIcons(); track ic.index) {\n            <linearGradient [attr.id]=\"ic.fillId\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n              <stop offset=\"0%\" [attr.stop-color]=\"activeColor()\" />\n              <stop [attr.offset]=\"(ic.fraction * 100) + '%'\" [attr.stop-color]=\"activeColor()\" />\n              <stop [attr.offset]=\"(ic.fraction * 100) + '%'\" [attr.stop-color]=\"inactiveColor()\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"inactiveColor()\" />\n            </linearGradient>\n          }\n        </defs>\n\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          @for (ic of computedIcons(); track ic.index; let i = $index) {\n            <g\n              class=\"icon-group\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n              (mouseenter)=\"onIconHover(i)\"\n              (mousemove)=\"onMouseMove($event)\"\n            >\n              <!-- Draw the icon shape scaled and positioned -->\n              <path\n                [attr.d]=\"iconPath()\"\n                [attr.transform]=\"getIconTransform(ic)\"\n                [attr.fill]=\"'url(#' + ic.fillId + ')'\"\n                class=\"pictorial-shape\"\n              />\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">Icon #{{ t.index + 1 }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Value Threshold</span>\n              <span class=\"tt-val\">{{ formatNumber(t.threshold) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Fill Level</span>\n              <span class=\"tt-val\">{{ t.fraction * 100 | number:'1.0-1' }}%</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-pictorial {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .pictorial-svg {\n      display: block;\n      overflow: visible;\n    }\n    .icon-group {\n      cursor: pointer;\n    }\n    .pictorial-shape {\n      transition: transform 0.15s ease, filter 0.15s ease;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.06));\n    }\n    .icon-group.highlighted .pictorial-shape {\n      transform: scale(1.1) translate(-2px, -2px);\n      filter: drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 130px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n  `]\n})\nexport class PictorialChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  value = input<number>(0);\n  max = input<number>(100);\n  icon = input<'user' | 'star' | 'heart' | 'lightbulb' | 'car'>('user');\n  iconCount = input<number>(10);\n  height = input<number>(180);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 15,\n    right: 15,\n    bottom: 15,\n    left: 15\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  percentage = computed(() => {\n    const m = Math.max(1, this.max());\n    return Math.min(100, Math.max(0, (this.value() / m) * 100));\n  });\n\n  activeColor = computed(() => this.colors()[0] || '#4a90d9');\n  inactiveColor = computed(() => '#cbd5e1'); // neutral slate-300 standard unselected\n\n  iconPath = computed<string>(() => {\n    switch (this.icon()) {\n      case 'star':\n        return 'M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z';\n      case 'heart':\n        return 'M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z';\n      case 'lightbulb':\n        return 'M12 2C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16H10v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z';\n      case 'car':\n        return 'M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z';\n      case 'user':\n      default:\n        return 'M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z';\n    }\n  });\n\n  computedIcons = computed<PictorialIcon[]>(() => {\n    const totalCount = Math.max(1, this.iconCount());\n    const val = this.value();\n    const m = Math.max(1, this.max());\n    const chunkVal = m / totalCount;\n\n    const w = this.innerW();\n    const h = this.innerH();\n\n    // Determine grid layout based on count\n    let cols = totalCount;\n    let rows = 1;\n    if (totalCount > 10) {\n      cols = 10;\n      rows = Math.ceil(totalCount / 10);\n    }\n\n    const cellW = w / cols;\n    const cellH = h / rows;\n    const size = Math.min(cellW, cellH) * 0.85;\n\n    const icons: PictorialIcon[] = [];\n\n    for (let i = 0; i < totalCount; i++) {\n      const row = Math.floor(i / cols);\n      const col = i % cols;\n\n      // Position centering inside cell bounds\n      const x = col * cellW + (cellW - size) / 2;\n      const y = row * cellH + (cellH - size) / 2;\n\n      // Calculate fraction fill level for this icon\n      const lowerThreshold = i * chunkVal;\n      const upperThreshold = (i + 1) * chunkVal;\n      let fraction = 0;\n\n      if (val >= upperThreshold) {\n        fraction = 1;\n      } else if (val > lowerThreshold) {\n        fraction = (val - lowerThreshold) / chunkVal;\n      }\n\n      icons.push({\n        index: i,\n        row,\n        col,\n        x,\n        y,\n        w: size,\n        h: size,\n        fillId: `pictorial-fill-${i}-${Math.round(fraction * 100)}`,\n        fraction\n      });\n    }\n\n    return icons;\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Returns scaling transformation to scale icon SVG path (assumed 24x24 viewBox) to target cell size\n  getIconTransform(ic: PictorialIcon): string {\n    const scaleFactor = ic.w / 24;\n    return `translate(${ic.x}, ${ic.y}) scale(${scaleFactor})`;\n  }\n\n  onIconHover(idx: number) {\n    this.hoveredIndex.set(idx);\n    const totalCount = Math.max(1, this.iconCount());\n    const m = Math.max(1, this.max());\n    const chunkVal = m / totalCount;\n    const ic = this.computedIcons()[idx];\n\n    if (ic) {\n      this.tooltip.set({\n        index: idx,\n        threshold: (idx + 1) * chunkVal,\n        fraction: ic.fraction\n      });\n    }\n  }\n\n  onMouseMove(event: MouseEvent) {\n    const el = event.currentTarget as SVGElement;\n    const container = el.closest('.ngx-pictorial');\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const totalCount = Math.max(1, this.iconCount());\n    const m = Math.max(1, this.max());\n    const chunkVal = m / totalCount;\n    const icons = this.computedIcons();\n\n    const data = icons.map(ic => ({\n      index: ic.index,\n      threshold: (ic.index + 1) * chunkVal,\n      fraction: ic.fraction\n    }));\n    this.exportSvc.downloadJson({ value: this.value(), max: this.max(), percentage: this.percentage(), icons: data }, 'pictorial-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const totalCount = Math.max(1, this.iconCount());\n    const m = Math.max(1, this.max());\n    const chunkVal = m / totalCount;\n    const icons = this.computedIcons();\n    \n    if (!icons.length) return;\n    const headers = ['Icon Index', 'Threshold Value', 'Fill Level Fraction'];\n    const rows = icons.map(ic => [ic.index, (ic.index + 1) * chunkVal, ic.fraction]);\n    this.exportSvc.downloadCsv(headers, rows, 'pictorial-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  formatNumber(v: number): string {\n    return fmtNum(v);\n  }\n}\n\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, TemplateRef, viewChild, HostListener\n} from '@angular/core';\nimport { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport { CHART_COLORS, fmtNum, scale } from '../shared/chart-utils';\n\nexport interface VectorItem {\n  x: number;\n  y: number;\n  vx: number;\n  vy: number;\n  magnitude?: number;\n  color?: string;\n}\n\nexport interface ComputedVector {\n  raw: VectorItem;\n  index: number;\n  px: number;\n  py: number;\n  xStart: number;\n  yStart: number;\n  xEnd: number;\n  yEnd: number;\n  arrowHeadPath: string;\n  magnitude: number;\n  angleDeg: number;\n  color: string;\n}\n\n@Component({\n  selector: 'ngx-vector-plot',\n  standalone: true,\n  imports: [DecimalPipe, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-vector-plot\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"header-info\">\n          <span class=\"header-title\">Vector Field Plot</span>\n          <span class=\"header-subtitle\">Vectors count: {{ data().length }}</span>\n        </div>\n        \n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <svg\n        #svgEl\n        class=\"vector-plot-svg\"\n        [attr.width]=\"'100%'\"\n        [attr.height]=\"svgHeight()\"\n        (mousemove)=\"onSvgMouseMove($event)\"\n      >\n        <g [attr.transform]=\"'translate(' + margin().left + ',' + margin().top + ')'\">\n          \n          <!-- Grid Background (Cartesian quadrants or divisions) -->\n          @if (showGrid()) {\n            <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH() / 2\" [attr.y2]=\"innerH() / 2\" class=\"grid-axis-line\" />\n            <line [attr.x1]=\"innerW() / 2\" [attr.x2]=\"innerW() / 2\" [attr.y1]=\"0\" [attr.y2]=\"innerH()\" class=\"grid-axis-line\" />\n          }\n\n          <!-- Vectors -->\n          @for (vec of computedVectors(); track vec.index; let i = $index) {\n            <g\n              class=\"vector-group\"\n              [class.dimmed]=\"hoveredIndex() !== null && hoveredIndex() !== i\"\n              [class.highlighted]=\"hoveredIndex() === i\"\n            >\n              <!-- Arrow Shaft -->\n              <line\n                [attr.x1]=\"vec.xStart\"\n                [attr.y1]=\"vec.yStart\"\n                [attr.x2]=\"vec.xEnd\"\n                [attr.y2]=\"vec.yEnd\"\n                [attr.stroke]=\"vec.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 3 : 1.6\"\n                stroke-linecap=\"round\"\n                class=\"vector-shaft\"\n              />\n              \n              <!-- Arrow Head -->\n              <path\n                [attr.d]=\"vec.arrowHeadPath\"\n                [attr.fill]=\"'none'\"\n                [attr.stroke]=\"vec.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 2.5 : 1.5\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                class=\"vector-arrowhead\"\n              />\n\n              <!-- Grid Point Anchor -->\n              <circle\n                [attr.cx]=\"vec.px\"\n                [attr.cy]=\"vec.py\"\n                [attr.r]=\"hoveredIndex() === i ? 3 : 1.5\"\n                [attr.fill]=\"vec.color\"\n                opacity=\"0.6\"\n              />\n            </g>\n          }\n        </g>\n      </svg>\n\n      <!-- Glassmorphic Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n          @if (tooltipTemplate()) {\n            <ng-container\n              *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"\n            ></ng-container>\n          } @else {\n            <div class=\"tt-cat\">Vector #{{ t.index + 1 }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Position (X, Y)</span>\n              <span class=\"tt-val\">({{ t.raw.x | number:'1.1-2' }}, {{ t.raw.y | number:'1.1-2' }})</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Velocity (Vx, Vy)</span>\n              <span class=\"tt-val\">({{ t.raw.vx | number:'1.1-2' }}, {{ t.raw.vy | number:'1.1-2' }})</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Magnitude</span>\n              <span class=\"tt-val\">{{ t.magnitude | number:'1.1-3' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Angle</span>\n              <span class=\"tt-val\">{{ t.angleDeg | number:'1.0-1' }}°</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      position: relative;\n    }\n    .ngx-vector-plot {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      min-height: 24px;\n      position: relative;\n    }\n    .header-info {\n      display: flex;\n      flex-direction: column;\n    }\n    .header-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--ngx-chart-axis-text, #334155);\n    }\n    .header-subtitle {\n      font-size: 11px;\n      font-weight: 500;\n      color: var(--ngx-chart-axis-text, #64748b);\n    }\n    .vector-plot-svg {\n      display: block;\n      overflow: visible;\n      background: var(--ngx-vector-bg, #fafafa);\n      border-radius: 8px;\n    }\n    .grid-axis-line {\n      stroke: var(--ngx-chart-grid, #e2e8f0);\n      stroke-width: 1.2;\n      stroke-dasharray: 4,4;\n    }\n    .vector-group {\n      transition: opacity 0.15s ease;\n    }\n    .vector-group.dimmed {\n      opacity: 0.22 !important;\n    }\n    .vector-group.highlighted {\n      opacity: 1 !important;\n    }\n    .vector-shaft {\n      transition: stroke-width 0.1s ease;\n    }\n    .vector-arrowhead {\n      transition: stroke-width 0.1s ease;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class VectorPlotComponent {\n  data = input<VectorItem[]>([]);\n  gridSize = input<number>(20);\n  height = input<number>(350);\n  colors = input<string[]>(CHART_COLORS);\n  showGrid = input<boolean>(true);\n  showExport = input<boolean>(false);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  containerWidth = signal<number>(500);\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  margin = computed(() => ({\n    top: 20,\n    right: 20,\n    bottom: 20,\n    left: 20\n  }));\n\n  svgHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.margin().left - this.margin().right));\n  innerH = computed(() => Math.max(10, this.svgHeight() - this.margin().top - this.margin().bottom));\n\n  computedVectors = computed<ComputedVector[]>(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n\n    const w = this.innerW();\n    const h = this.innerH();\n\n    // Map bounds\n    const xs = raw.map(d => d.x);\n    const ys = raw.map(d => d.y);\n\n    let minX = Math.min(...xs);\n    let maxX = Math.max(...xs);\n    let minY = Math.min(...ys);\n    let maxY = Math.max(...ys);\n\n    // Padding bounds slightly\n    if (minX === maxX) { minX -= 1; maxX += 1; }\n    if (minY === maxY) { minY -= 1; maxY += 1; }\n\n    const vels = raw.map(d => d.magnitude ?? Math.sqrt(d.vx * d.vx + d.vy * d.vy));\n    const maxVal = Math.max(0.1, ...vels);\n\n    const cols = this.colors();\n    const startColor = '#a5f3fc'; // light cyan\n    const endColor = cols[0] || '#4f46e5';\n\n    // Cell dimension estimation\n    const colsCount = Array.from(new Set(xs)).length || 10;\n    const cellW = w / colsCount;\n    const maxArrowLength = Math.max(8, cellW * 0.9);\n\n    return raw.map((d, idx) => {\n      // Map node grid pos\n      const px = scale(d.x, minX, maxX, w * 0.05, w * 0.95);\n      const py = scale(d.y, minY, maxY, h * 0.95, h * 0.05); // Invert Y for Cartesian representation\n\n      const mag = d.magnitude ?? Math.sqrt(d.vx * d.vx + d.vy * d.vy);\n      const arrowLength = scale(mag, 0, maxVal, 6, maxArrowLength);\n\n      // Angle estimation\n      const angleRad = Math.atan2(-d.vy, d.vx); // Negative Vy to compensate for SVG inverted Y-axis\n      const angleDeg = (angleRad * 180) / Math.PI;\n\n      // Draw arrow line centered at grid node (px, py)\n      const dx = Math.cos(angleRad) * arrowLength;\n      const dy = Math.sin(angleRad) * arrowLength;\n\n      const xStart = px - dx / 2;\n      const yStart = py - dy / 2;\n      const xEnd = px + dx / 2;\n      const yEnd = py + dy / 2;\n\n      // Draw arrow head coordinates\n      const headSize = Math.max(3, arrowLength * 0.25);\n      const ax = xEnd - headSize * Math.cos(angleRad - Math.PI / 6);\n      const ay = yEnd - headSize * Math.sin(angleRad - Math.PI / 6);\n      const bx = xEnd - headSize * Math.cos(angleRad + Math.PI / 6);\n      const by = yEnd - headSize * Math.sin(angleRad + Math.PI / 6);\n\n      const arrowHeadPath = `M ${ax} ${ay} L ${xEnd} ${yEnd} L ${bx} ${by}`;\n\n      // Dynamic color based on velocity magnitude\n      const color = d.color || this.interpolateColor(startColor, endColor, mag, 0, maxVal);\n\n      return {\n        raw: d,\n        index: idx,\n        px,\n        py,\n        xStart,\n        yStart,\n        xEnd,\n        yEnd,\n        arrowHeadPath,\n        magnitude: mag,\n        angleDeg: angleDeg < 0 ? angleDeg + 360 : angleDeg,\n        color\n      };\n    });\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  // Linear color interpolation helper\n  private interpolateColor(startHex: string, endHex: string, val: number, min: number, max: number): string {\n    const t = max === min ? 0.5 : (val - min) / (max - min);\n\n    const parseHex = (hex: string) => {\n      let r = 0, g = 0, b = 0;\n      const parsed = hex.startsWith('#') ? hex.substring(1) : hex;\n      if (parsed.length === 3) {\n        r = parseInt(parsed[0] + parsed[0], 16);\n        g = parseInt(parsed[1] + parsed[1], 16);\n        b = parseInt(parsed[2] + parsed[2], 16);\n      } else if (parsed.length === 6) {\n        r = parseInt(parsed.substring(0, 2), 16);\n        g = parseInt(parsed.substring(2, 4), 16);\n        b = parseInt(parsed.substring(4, 6), 16);\n      }\n      return { r, g, b };\n    };\n\n    const c1 = parseHex(startHex);\n    const c2 = parseHex(endHex);\n\n    const r = Math.round(c1.r + t * (c2.r - c1.r));\n    const g = Math.round(c1.g + t * (c2.g - c1.g));\n    const b = Math.round(c1.b + t * (c2.b - c1.b));\n\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n\n  onSvgMouseMove(event: MouseEvent) {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n\n    const rect = svg.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.margin().left;\n    const my = event.clientY - rect.top - this.margin().top;\n\n    const vectors = this.computedVectors();\n    if (vectors.length === 0) return;\n\n    // Find the closest grid point to mouse position\n    let closestIdx = 0;\n    let minDist = Infinity;\n\n    vectors.forEach((vec, idx) => {\n      const dx = vec.px - mx;\n      const dy = vec.py - my;\n      const dist = Math.sqrt(dx * dx + dy * dy);\n\n      if (dist < minDist) {\n        minDist = dist;\n        closestIdx = idx;\n      }\n    });\n\n    // If within 30px, trigger tooltip tracking\n    if (minDist < 30) {\n      this.hoveredIndex.set(closestIdx);\n      this.tooltip.set(vectors[closestIdx]);\n\n      const parentRect = svg.parentElement?.getBoundingClientRect();\n      if (parentRect) {\n        this.tooltipX.set(event.clientX - parentRect.left);\n        this.tooltipY.set(event.clientY - parentRect.top);\n      }\n    } else {\n      this.hoveredIndex.set(null);\n      this.tooltip.set(null);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const vectors = this.computedVectors();\n    if (!vectors.length) return;\n\n    let csv = 'X,Y,Vx,Vy,Magnitude,AngleDegrees\\n';\n    vectors.forEach(v => {\n      csv += `${v.raw.x},${v.raw.y},${v.raw.vx},${v.raw.vy},${v.magnitude},${v.angleDeg}\\n`;\n    });\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'vector-plot-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const vectors = this.computedVectors();\n    if (!vectors.length) return;\n\n    const data = vectors.map(v => ({\n      x: v.raw.x,\n      y: v.raw.y,\n      vx: v.raw.vx,\n      vy: v.raw.vy,\n      magnitude: v.magnitude,\n      angleDegrees: v.angleDeg\n    }));\n\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'vector-plot-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'vector-plot.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Vector Plot Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Vector Field Plot Flow Analysis</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { niceTicks, scale, fmtNum, CHART_COLORS } from '../shared/chart-utils';\n\nexport interface OHLCItem {\n  date: string | Date;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\n@Component({\n  selector: 'ngx-ohlc-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-ohlc-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @if (showLabels()) {\n              @for (tick of yTicks(); track tick) {\n                <text\n                  x=\"-10\"\n                  [attr.y]=\"yPos(tick) + 4\"\n                  class=\"axis-label y\"\n                  text-anchor=\"end\"\n                >{{ fmtNum(tick) }}</text>\n              }\n            }\n\n            <!-- X-Axis Labels -->\n            @if (showLabels()) {\n              @for (item of data(); track $index; let i = $index) {\n                @if (shouldShowXLabel(i)) {\n                  <text\n                    [attr.x]=\"xPos(i) + tickWidth() / 2\"\n                    [attr.y]=\"innerH() + 20\"\n                    class=\"axis-label x\"\n                    text-anchor=\"middle\"\n                  >{{ formatDate(item.date) }}</text>\n                }\n              }\n            }\n\n            <!-- Active Crosshair -->\n            @if (hoveredIndex() !== null) {\n              @if (computedTicks()[hoveredIndex()!]; as tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"tick.yClose\"\n                  [attr.y2]=\"tick.yClose\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"tick.centerX\"\n                  [attr.x2]=\"tick.centerX\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- OHLC Ticks -->\n            @for (tick of computedTicks(); track $index; let i = $index) {\n              <!-- Vertical Line (High to Low) -->\n              <line\n                [attr.x1]=\"tick.centerX\"\n                [attr.y1]=\"tick.yHigh\"\n                [attr.x2]=\"tick.centerX\"\n                [attr.y2]=\"tick.yLow\"\n                [attr.stroke]=\"tick.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 3 : 2\"\n                class=\"ohlc-line\"\n              />\n\n              <!-- Left Tick (Open) -->\n              <line\n                [attr.x1]=\"tick.centerX - tick.width / 2\"\n                [attr.y1]=\"tick.yOpen\"\n                [attr.x2]=\"tick.centerX\"\n                [attr.y2]=\"tick.yOpen\"\n                [attr.stroke]=\"tick.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 3 : 2\"\n                class=\"ohlc-line\"\n              />\n\n              <!-- Right Tick (Close) -->\n              <line\n                [attr.x1]=\"tick.centerX\"\n                [attr.y1]=\"tick.yClose\"\n                [attr.x2]=\"tick.centerX + tick.width / 2\"\n                [attr.y2]=\"tick.yClose\"\n                [attr.stroke]=\"tick.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 3 : 2\"\n                class=\"ohlc-line\"\n              />\n\n              <!-- Transparent Hover Area (UX optimization) -->\n              <rect\n                [attr.x]=\"tick.x\"\n                [attr.y]=\"0\"\n                [attr.width]=\"tick.cellWidth\"\n                [attr.height]=\"innerH()\"\n                fill=\"transparent\"\n                style=\"cursor: pointer;\"\n                (mouseenter)=\"onTickHover($event, tick.raw, i)\"\n                (mousemove)=\"onTickHover($event, tick.raw, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ formatDate(t.date) }}</div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-direction\" [style.color]=\"t.direction === 'Bullish' ? '#10b981' : '#ef4444'\">\n                <strong>{{ t.direction }}</strong> ({{ t.changePct }})\n              </div>\n              <div class=\"tooltip-val\">\n                <span>High:</span>\n                <strong>{{ fmtNum(t.high) }}</strong>\n              </div>\n              <div class=\"tooltip-val\" style=\"color: #60a5fa;\">\n                <span>Open:</span>\n                <strong>{{ fmtNum(t.open) }}</strong>\n              </div>\n              <div class=\"tooltip-val\" style=\"color: #38bdf8;\">\n                <span>Close:</span>\n                <strong>{{ fmtNum(t.close) }}</strong>\n              </div>\n              <div class=\"tooltip-val\">\n                <span>Low:</span>\n                <strong>{{ fmtNum(t.low) }}</strong>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-ohlc-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n    .ohlc-line {\n      transition: stroke-width 0.15s, stroke 0.15s;\n    }\n    .crosshair-line {\n      pointer-events: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 155px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.08s ease-out, top 0.08s ease-out;\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tooltip-direction {\n      font-size: 10px;\n      font-weight: 700;\n      margin-bottom: 6px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n      font-weight: 700;\n    }\n\n\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class OHLCChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  readonly PAD_LEFT = 52;\n  readonly PAD_TOP = 20;\n  readonly PAD_RIGHT = 24;\n  readonly PAD_BOTTOM = 36;\n\n  data = input.required<OHLCItem[]>();\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  bullishColor = input<string>('#10b981');\n  bearishColor = input<string>('#ef4444');\n\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    date: string | Date;\n    open: number;\n    high: number;\n    low: number;\n    close: number;\n    direction: 'Bullish' | 'Bearish';\n    changePct: string;\n  } | null>(null);\n\n  containerWidth = signal<number>(600);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Subtract padding\n          this.containerWidth.set(width - 32);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => Math.max(200, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(100, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  yMin = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 0;\n    const lows = items.map(d => d.low);\n    const minVal = Math.min(...lows);\n    return minVal * 0.99; // 1% safety margin\n  });\n\n  yMax = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 100;\n    const highs = items.map(d => d.high);\n    const maxVal = Math.max(...highs);\n    return maxVal * 1.01; // 1% safety margin\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  xPos(index: number): number {\n    const count = this.data().length || 1;\n    const step = this.innerW() / count;\n    return index * step;\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  tickWidth(): number {\n    const count = this.data().length || 1;\n    return (this.innerW() / count) * 0.6; // 60% of cell width\n  }\n\n  computedTicks = computed(() => {\n    const items = this.data();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.tickWidth();\n    const cellWidth = this.innerW() / count;\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx);\n      const centerX = x + cellWidth / 2;\n\n      const yOpen = this.yPos(item.open);\n      const yClose = this.yPos(item.close);\n      const yHigh = this.yPos(item.high);\n      const yLow = this.yPos(item.low);\n\n      const isBullish = item.close >= item.open;\n      const color = isBullish ? this.bullishColor() : this.bearishColor();\n\n      return {\n        x,\n        centerX,\n        cellWidth,\n        width,\n        yHigh,\n        yLow,\n        yOpen,\n        yClose,\n        color,\n        isBullish,\n        raw: item\n      };\n    });\n  });\n\n  shouldShowXLabel(index: number): boolean {\n    const count = this.data().length;\n    if (count <= 10) return true;\n    if (count <= 25) return index % 2 === 0;\n    if (count <= 50) return index % 5 === 0;\n    return index % 10 === 0;\n  }\n\n  onTickHover(event: MouseEvent, item: OHLCItem, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    const isBullish = item.close >= item.open;\n    const change = item.close - item.open;\n    const changePct = ((change / item.open) * 100).toFixed(2) + '%';\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      date: item.date,\n      open: item.open,\n      high: item.high,\n      low: item.low,\n      close: item.close,\n      direction: isBullish ? 'Bullish' : 'Bearish',\n      changePct\n    });\n  }\n\n  formatDate(d: string | Date): string {\n    if (d instanceof Date) {\n      return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n    }\n    return String(d);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    this.exportSvc.downloadJson(this.data(), 'ohlc-chart-data.json');\n  }\n\n  exportToCsv(): void {\n    const items = this.data();\n    if (!items.length) return;\n    const headers = ['Date', 'Open', 'High', 'Low', 'Close'];\n    const rows = items.map(item => [this.formatDate(item.date), item.open, item.high, item.low, item.close]);\n    this.exportSvc.downloadCsv(headers, rows, 'ohlc-chart-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { niceTicks, scale, fmtNum, CHART_COLORS } from '../shared/chart-utils';\n\nexport interface HLCItem {\n  date: string | Date;\n  high: number;\n  low: number;\n  close: number;\n}\n\n@Component({\n  selector: 'ngx-hlc-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-hlc-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @if (showLabels()) {\n              @for (tick of yTicks(); track tick) {\n                <text\n                  x=\"-10\"\n                  [attr.y]=\"yPos(tick) + 4\"\n                  class=\"axis-label y\"\n                  text-anchor=\"end\"\n                >{{ fmtNum(tick) }}</text>\n              }\n            }\n\n            <!-- X-Axis Labels -->\n            @if (showLabels()) {\n              @for (item of data(); track $index; let i = $index) {\n                @if (shouldShowXLabel(i)) {\n                  <text\n                    [attr.x]=\"xPos(i) + tickWidth() / 2\"\n                    [attr.y]=\"innerH() + 20\"\n                    class=\"axis-label x\"\n                    text-anchor=\"middle\"\n                  >{{ formatDate(item.date) }}</text>\n                }\n              }\n            }\n\n            <!-- Active Crosshair -->\n            @if (hoveredIndex() !== null) {\n              @if (computedTicks()[hoveredIndex()!]; as tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"tick.yClose\"\n                  [attr.y2]=\"tick.yClose\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"tick.centerX\"\n                  [attr.x2]=\"tick.centerX\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- HLC Ticks -->\n            @for (tick of computedTicks(); track $index; let i = $index) {\n              <!-- Vertical Line (High to Low) -->\n              <line\n                [attr.x1]=\"tick.centerX\"\n                [attr.y1]=\"tick.yHigh\"\n                [attr.x2]=\"tick.centerX\"\n                [attr.y2]=\"tick.yLow\"\n                [attr.stroke]=\"tick.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 3 : 2\"\n                class=\"hlc-line\"\n              />\n\n              <!-- Right Tick (Close) -->\n              <line\n                [attr.x1]=\"tick.centerX\"\n                [attr.y1]=\"tick.yClose\"\n                [attr.x2]=\"tick.centerX + tick.width / 2\"\n                [attr.y2]=\"tick.yClose\"\n                [attr.stroke]=\"tick.color\"\n                [attr.stroke-width]=\"hoveredIndex() === i ? 3 : 2\"\n                class=\"hlc-line\"\n              />\n\n              <!-- Transparent Hover Area (UX optimization) -->\n              <rect\n                [attr.x]=\"tick.x\"\n                [attr.y]=\"0\"\n                [attr.width]=\"tick.cellWidth\"\n                [attr.height]=\"innerH()\"\n                fill=\"transparent\"\n                style=\"cursor: pointer;\"\n                (mouseenter)=\"onTickHover($event, tick.raw, i)\"\n                (mousemove)=\"onTickHover($event, tick.raw, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ formatDate(t.date) }}</div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-direction\" [style.color]=\"t.direction === 'Bullish' ? '#10b981' : '#ef4444'\">\n                <strong>{{ t.direction }}</strong> ({{ t.changePct }})\n              </div>\n              <div class=\"tooltip-val\">\n                <span>High:</span>\n                <strong>{{ fmtNum(t.high) }}</strong>\n              </div>\n              <div class=\"tooltip-val\" style=\"color: #38bdf8;\">\n                <span>Close:</span>\n                <strong>{{ fmtNum(t.close) }}</strong>\n              </div>\n              <div class=\"tooltip-val\">\n                <span>Low:</span>\n                <strong>{{ fmtNum(t.low) }}</strong>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-hlc-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n    .hlc-line {\n      transition: stroke-width 0.15s, stroke 0.15s;\n    }\n    .crosshair-line {\n      pointer-events: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 155px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.08s ease-out, top 0.08s ease-out;\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tooltip-direction {\n      font-size: 10px;\n      font-weight: 700;\n      margin-bottom: 6px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n      font-weight: 700;\n    }\n\n    /* Export styles removed */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class HLCChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  readonly PAD_LEFT = 52;\n  readonly PAD_TOP = 20;\n  readonly PAD_RIGHT = 24;\n  readonly PAD_BOTTOM = 36;\n\n  data = input.required<HLCItem[]>();\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  bullishColor = input<string>('#10b981');\n  bearishColor = input<string>('#ef4444');\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    date: string | Date;\n    high: number;\n    low: number;\n    close: number;\n    direction: 'Bullish' | 'Bearish';\n    changePct: string;\n  } | null>(null);\n\n  containerWidth = signal<number>(600);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Subtract padding\n          this.containerWidth.set(width - 32);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => Math.max(200, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(100, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  yMin = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 0;\n    const lows = items.map(d => d.low);\n    const minVal = Math.min(...lows);\n    return minVal * 0.99; // 1% safety margin\n  });\n\n  yMax = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 100;\n    const highs = items.map(d => d.high);\n    const maxVal = Math.max(...highs);\n    return maxVal * 1.01; // 1% safety margin\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  xPos(index: number): number {\n    const count = this.data().length || 1;\n    const step = this.innerW() / count;\n    return index * step;\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  tickWidth(): number {\n    const count = this.data().length || 1;\n    return (this.innerW() / count) * 0.6; // 60% of cell width\n  }\n\n  computedTicks = computed(() => {\n    const items = this.data();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.tickWidth();\n    const cellWidth = this.innerW() / count;\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx);\n      const centerX = x + cellWidth / 2;\n\n      const yHigh = this.yPos(item.high);\n      const yLow = this.yPos(item.low);\n      const yClose = this.yPos(item.close);\n\n      let isBullish = true;\n      if (idx > 0) {\n        isBullish = item.close >= items[idx - 1].close;\n      }\n      const color = isBullish ? this.bullishColor() : this.bearishColor();\n\n      return {\n        x,\n        centerX,\n        cellWidth,\n        width,\n        yHigh,\n        yLow,\n        yClose,\n        color,\n        isBullish,\n        raw: item\n      };\n    });\n  });\n\n  shouldShowXLabel(index: number): boolean {\n    const count = this.data().length;\n    if (count <= 10) return true;\n    if (count <= 25) return index % 2 === 0;\n    if (count <= 50) return index % 5 === 0;\n    return index % 10 === 0;\n  }\n\n  onTickHover(event: MouseEvent, item: HLCItem, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    const items = this.data();\n    let isBullish = true;\n    let changePct = '0.00%';\n    if (index > 0) {\n      const prev = items[index - 1];\n      isBullish = item.close >= prev.close;\n      const change = item.close - prev.close;\n      changePct = ((change / prev.close) * 100).toFixed(2) + '%';\n    }\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      date: item.date,\n      high: item.high,\n      low: item.low,\n      close: item.close,\n      direction: isBullish ? 'Bullish' : 'Bearish',\n      changePct\n    });\n  }\n\n  formatDate(d: string | Date): string {\n    if (d instanceof Date) {\n      return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n    }\n    return String(d);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const items = this.data();\n    if (!items.length) return;\n    const headers = ['Date', 'High', 'Low', 'Close'];\n    const rows = items.map(item => [this.formatDate(item.date), item.high, item.low, item.close]);\n    this.exportSvc.downloadCsv(headers, rows, 'hlc-chart-data.csv');\n  }\n\n  exportToJson(): void {\n    const items = this.data();\n    if (!items.length) return;\n    this.exportSvc.downloadJson(items, 'hlc-chart-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'hlc-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'HLC Chart', 'hlc-chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { niceTicks, scale, fmtNum, CHART_COLORS } from '../shared/chart-utils';\n\nexport interface CandlestickItem {\n  date: string | Date;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\n@Component({\n  selector: 'ngx-hollow-candlestick-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-hollow-candlestick-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @if (showLabels()) {\n              @for (tick of yTicks(); track tick) {\n                <text\n                  x=\"-10\"\n                  [attr.y]=\"yPos(tick) + 4\"\n                  class=\"axis-label y\"\n                  text-anchor=\"end\"\n                >{{ fmtNum(tick) }}</text>\n              }\n            }\n\n            <!-- X-Axis Labels -->\n            @if (showLabels()) {\n              @for (item of data(); track $index; let i = $index) {\n                @if (shouldShowXLabel(i)) {\n                  <text\n                    [attr.x]=\"xPos(i) + candleWidth() / 2\"\n                    [attr.y]=\"innerH() + 20\"\n                    class=\"axis-label x\"\n                    text-anchor=\"middle\"\n                  >{{ formatDate(item.date) }}</text>\n                }\n              }\n            }\n\n            <!-- Active Crosshair -->\n            @if (hoveredIndex() !== null) {\n              @if (computedCandles()[hoveredIndex()!]; as candle) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"candle.yClose\"\n                  [attr.y2]=\"candle.yClose\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"candle.centerX\"\n                  [attr.x2]=\"candle.centerX\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- Hollow Candlesticks -->\n            @for (candle of computedCandles(); track $index; let i = $index) {\n              <!-- Upper Wick (High to Top of Body) -->\n              <line\n                [attr.x1]=\"candle.centerX\"\n                [attr.y1]=\"candle.yHigh\"\n                [attr.x2]=\"candle.centerX\"\n                [attr.y2]=\"candle.yBodyTop\"\n                [attr.stroke]=\"candle.color\"\n                stroke-width=\"1.5\"\n              />\n\n              <!-- Lower Wick (Bottom of Body to Low) -->\n              <line\n                [attr.x1]=\"candle.centerX\"\n                [attr.y1]=\"candle.yBodyBottom\"\n                [attr.x2]=\"candle.centerX\"\n                [attr.y2]=\"candle.yLow\"\n                [attr.stroke]=\"candle.color\"\n                stroke-width=\"1.5\"\n              />\n\n              <!-- Candle Body Rect (Hollow vs Solid) -->\n              <rect\n                [attr.x]=\"candle.x\"\n                [attr.y]=\"candle.y\"\n                [attr.width]=\"candle.width\"\n                [attr.height]=\"candle.rectH\"\n                [attr.fill]=\"candle.isHollow ? 'none' : candle.color\"\n                [attr.stroke]=\"candle.color\"\n                [attr.stroke-width]=\"candle.isHollow ? 2 : 1\"\n                class=\"candle-rect\"\n                [class.hovered]=\"hoveredIndex() === i\"\n                [style.transform-origin]=\"candle.centerX + 'px ' + candle.yOpen + 'px'\"\n                [style.animation-delay]=\"i * 0.02 + 's'\"\n                (mouseenter)=\"onCandleHover($event, candle.raw, i)\"\n                (mousemove)=\"onCandleHover($event, candle.raw, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ formatDate(t.date) }}</div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-direction\" [style.color]=\"t.isUp ? '#10b981' : '#ef4444'\">\n                <strong>{{ t.direction }}</strong> ({{ t.changePct }})\n              </div>\n              <div class=\"tooltip-val\" style=\"font-size: 10px; color: rgba(255, 255, 255, 0.6); margin-bottom: 2px;\">\n                <span>Type:</span>\n                <strong>{{ t.hollowText }}</strong>\n              </div>\n              <div class=\"tooltip-val\">\n                <span>High:</span>\n                <strong>{{ fmtNum(t.high) }}</strong>\n              </div>\n              <div class=\"tooltip-val\" style=\"color: #60a5fa;\">\n                <span>Open:</span>\n                <strong>{{ fmtNum(t.open) }}</strong>\n              </div>\n              <div class=\"tooltip-val\" style=\"color: #38bdf8;\">\n                <span>Close:</span>\n                <strong>{{ fmtNum(t.close) }}</strong>\n              </div>\n              <div class=\"tooltip-val\">\n                <span>Low:</span>\n                <strong>{{ fmtNum(t.low) }}</strong>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-hollow-candlestick-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n\n    @keyframes candleGrow {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n\n    .candle-rect {\n      cursor: pointer;\n      transition: fill 0.15s, stroke-width 0.15s, filter 0.15s;\n      animation: candleGrow 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .candle-rect.hovered {\n      filter: brightness(1.05) drop-shadow(0 4px 8px rgba(0,0,0,0.15));\n      stroke-width: 2.5px !important;\n    }\n    .crosshair-line {\n      pointer-events: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 165px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.08s ease-out, top 0.08s ease-out;\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tooltip-direction {\n      font-size: 10px;\n      font-weight: 700;\n      margin-bottom: 6px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      gap: 16px;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n      font-weight: 700;\n    }\n\n    /* Export styles removed */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class HollowCandlestickChartComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  readonly PAD_LEFT = 52;\n  readonly PAD_TOP = 20;\n  readonly PAD_RIGHT = 24;\n  readonly PAD_BOTTOM = 36;\n\n  data = input.required<CandlestickItem[]>();\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  bullishColor = input<string>('#10b981');\n  bearishColor = input<string>('#ef4444');\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    date: string | Date;\n    open: number;\n    high: number;\n    low: number;\n    close: number;\n    isUp: boolean;\n    direction: string;\n    hollowText: string;\n    changePct: string;\n  } | null>(null);\n\n  containerWidth = signal<number>(600);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Subtract padding\n          this.containerWidth.set(width - 32);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => Math.max(200, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(100, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  yMin = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 0;\n    const lows = items.map(d => d.low);\n    const minVal = Math.min(...lows);\n    return minVal * 0.99; // 1% safety margin\n  });\n\n  yMax = computed(() => {\n    const items = this.data();\n    if (items.length === 0) return 100;\n    const highs = items.map(d => d.high);\n    const maxVal = Math.max(...highs);\n    return maxVal * 1.01; // 1% safety margin\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  xPos(index: number): number {\n    const count = this.data().length || 1;\n    const step = this.innerW() / count;\n    return index * step + step * 0.15; // padding\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  candleWidth(): number {\n    const count = this.data().length || 1;\n    return (this.innerW() / count) * 0.7; // 70% width\n  }\n\n  computedCandles = computed(() => {\n    const items = this.data();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.candleWidth();\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx);\n      const centerX = x + width / 2;\n\n      const yOpen = this.yPos(item.open);\n      const yClose = this.yPos(item.close);\n      const yHigh = this.yPos(item.high);\n      const yLow = this.yPos(item.low);\n\n      const y = Math.min(yOpen, yClose);\n      const rectH = Math.max(2, Math.abs(yOpen - yClose));\n\n      // Color (compare close to previous close)\n      let isUp = true;\n      if (idx > 0) {\n        isUp = item.close >= items[idx - 1].close;\n      }\n      const color = isUp ? this.bullishColor() : this.bearishColor();\n\n      // Hollow/Solid (compare close to open of current day)\n      const isHollow = item.close >= item.open;\n\n      return {\n        x,\n        centerX,\n        width,\n        yHigh,\n        yLow,\n        yOpen,\n        yClose,\n        y,\n        rectH,\n        yBodyTop: y,\n        yBodyBottom: y + rectH,\n        color,\n        isUp,\n        isHollow,\n        raw: item\n      };\n    });\n  });\n\n  shouldShowXLabel(index: number): boolean {\n    const count = this.data().length;\n    if (count <= 10) return true;\n    if (count <= 25) return index % 2 === 0;\n    if (count <= 50) return index % 5 === 0;\n    return index % 10 === 0;\n  }\n\n  onCandleHover(event: MouseEvent, item: CandlestickItem, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    const items = this.data();\n    let isUp = true;\n    let changePct = '0.00%';\n    if (index > 0) {\n      const prev = items[index - 1];\n      isUp = item.close >= prev.close;\n      const change = item.close - prev.close;\n      changePct = ((change / prev.close) * 100).toFixed(2) + '%';\n    } else {\n      isUp = item.close >= item.open;\n      const change = item.close - item.open;\n      changePct = ((change / item.open) * 100).toFixed(2) + '%';\n    }\n\n    const direction = isUp ? 'Up vs Yesterday' : 'Down vs Yesterday';\n    const isHollow = item.close >= item.open;\n    const hollowText = isHollow ? 'Hollow (Bullish Day)' : 'Solid (Bearish Day)';\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      date: item.date,\n      open: item.open,\n      high: item.high,\n      low: item.low,\n      close: item.close,\n      isUp,\n      direction,\n      hollowText,\n      changePct\n    });\n  }\n\n  formatDate(d: string | Date): string {\n    if (d instanceof Date) {\n      return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n    }\n    return String(d);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const items = this.data();\n    if (!items.length) return;\n    const headers = ['Date', 'Open', 'High', 'Low', 'Close'];\n    const rows = items.map(item => [this.formatDate(item.date), item.open, item.high, item.low, item.close]);\n    this.exportSvc.downloadCsv(headers, rows, 'hollow-candlestick-data.csv');\n  }\n\n  exportToJson(): void {\n    const items = this.data();\n    if (!items.length) return;\n    this.exportSvc.downloadJson(items, 'hollow-candlestick-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'hollow-candlestick-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Hollow Candlestick Chart', 'hollow-candlestick-chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { niceTicks, scale, fmtNum, CHART_COLORS , generateUniqueId } from '../shared/chart-utils';\n\nexport interface CandlestickItem {\n  date: string | Date;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\ninterface HeikinAshiCalculatedItem {\n  date: string | Date;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n  original: CandlestickItem;\n}\n\n@Component({\n  selector: 'ngx-heikin-ashi-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-heikin-ashi-chart\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <defs>\n            <linearGradient [id]=\"instanceId + '-ha-bullish-grad'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"bullishColor()\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"bullishColor()\" stop-opacity=\"0.8\" />\n            </linearGradient>\n            <linearGradient [id]=\"instanceId + '-ha-bearish-grad'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"bearishColor()\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"bearishColor()\" stop-opacity=\"0.8\" />\n            </linearGradient>\n          </defs>\n\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @if (showLabels()) {\n              @for (tick of yTicks(); track tick) {\n                <text\n                  x=\"-10\"\n                  [attr.y]=\"yPos(tick) + 4\"\n                  class=\"axis-label y\"\n                  text-anchor=\"end\"\n                >{{ fmtNum(tick) }}</text>\n              }\n            }\n\n            <!-- X-Axis Labels -->\n            @if (showLabels()) {\n              @for (item of heikinAshiData(); track $index; let i = $index) {\n                @if (shouldShowXLabel(i)) {\n                  <text\n                    [attr.x]=\"xPos(i) + candleWidth() / 2\"\n                    [attr.y]=\"innerH() + 20\"\n                    class=\"axis-label x\"\n                    text-anchor=\"middle\"\n                  >{{ formatDate(item.date) }}</text>\n                }\n              }\n            }\n\n            <!-- Active Crosshair -->\n            @if (hoveredIndex() !== null) {\n              @if (computedCandles()[hoveredIndex()!]; as candle) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"candle.yClose\"\n                  [attr.y2]=\"candle.yClose\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n                <line\n                  [attr.x1]=\"candle.centerX\"\n                  [attr.x2]=\"candle.centerX\"\n                  [attr.y1]=\"0\"\n                  [attr.y2]=\"innerH()\"\n                  stroke=\"rgba(100, 116, 139, 0.25)\"\n                  stroke-width=\"1.2\"\n                  stroke-dasharray=\"3,3\"\n                  class=\"crosshair-line\"\n                />\n              }\n            }\n\n            <!-- Heikin-Ashi Candles -->\n            @for (candle of computedCandles(); track $index; let i = $index) {\n              <!-- Wick Line (High to Low) -->\n              <line\n                [attr.x1]=\"candle.centerX\"\n                [attr.x2]=\"candle.centerX\"\n                [attr.y1]=\"candle.yHigh\"\n                [attr.y2]=\"candle.yLow\"\n                [attr.stroke]=\"candle.color\"\n                stroke-width=\"1.5\"\n                class=\"candle-wick\"\n              />\n\n              <!-- Candle Body Rect (Open to Close) -->\n              <rect\n                [attr.x]=\"candle.x\"\n                [attr.y]=\"candle.y\"\n                [attr.width]=\"candle.width\"\n                [attr.height]=\"candle.rectH\"\n                [attr.fill]=\"candle.isBullish ? 'url(#' + instanceId + '-ha-bullish-grad)' : 'url(#' + instanceId + '-ha-bearish-grad)'\"\n                [attr.stroke]=\"candle.color\"\n                stroke-width=\"1\"\n                class=\"candle-rect\"\n                [class.hovered]=\"hoveredIndex() === i\"\n                [style.transform-origin]=\"candle.centerX + 'px ' + candle.yOpen + 'px'\"\n                [style.animation-delay]=\"i * 0.02 + 's'\"\n                (mouseenter)=\"onCandleHover($event, candle.raw, i)\"\n                (mousemove)=\"onCandleHover($event, candle.raw, i)\"\n              />\n            }\n\n            <!-- Base axes borders -->\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\">{{ formatDate(t.date) }}</div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-direction\" [style.color]=\"t.isBullish ? '#10b981' : '#ef4444'\">\n                <strong>{{ t.isBullish ? 'Bullish Trend' : 'Bearish Trend' }}</strong>\n              </div>\n              <!-- Tabular Tooltip for comparisons -->\n              <div class=\"tooltip-columns\">\n                <div class=\"tooltip-col\">\n                  <div class=\"col-title\">Original</div>\n                  <div class=\"tooltip-val\"><span>O:</span> <strong>{{ fmtNum(t.orig.open) }}</strong></div>\n                  <div class=\"tooltip-val\"><span>H:</span> <strong>{{ fmtNum(t.orig.high) }}</strong></div>\n                  <div class=\"tooltip-val\"><span>L:</span> <strong>{{ fmtNum(t.orig.low) }}</strong></div>\n                  <div class=\"tooltip-val\"><span>C:</span> <strong>{{ fmtNum(t.orig.close) }}</strong></div>\n                </div>\n                <div class=\"tooltip-col bordered\">\n                  <div class=\"col-title\" style=\"color: #38bdf8;\">Heikin-Ashi</div>\n                  <div class=\"tooltip-val\"><span>O:</span> <strong>{{ fmtNum(t.ha.open) }}</strong></div>\n                  <div class=\"tooltip-val\"><span>H:</span> <strong>{{ fmtNum(t.ha.high) }}</strong></div>\n                  <div class=\"tooltip-val\"><span>L:</span> <strong>{{ fmtNum(t.ha.low) }}</strong></div>\n                  <div class=\"tooltip-val\"><span>C:</span> <strong>{{ fmtNum(t.ha.close) }}</strong></div>\n                </div>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-heikin-ashi-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n\n    @keyframes candleGrow {\n      from { transform: scaleY(0); opacity: 0; }\n      to { transform: scaleY(1); opacity: 1; }\n    }\n\n    .candle-rect {\n      cursor: pointer;\n      transition: fill 0.15s, opacity 0.15s, stroke-width 0.15s, filter 0.15s;\n      animation: candleGrow 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;\n    }\n    .candle-rect.hovered {\n      filter: brightness(1.05) drop-shadow(0 4px 10px rgba(0,0,0,0.18));\n      stroke-width: 1.5px;\n    }\n    .crosshair-line {\n      pointer-events: none;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.94));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 210px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.08s ease-out, top 0.08s ease-out;\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tooltip-direction {\n      font-size: 10px;\n      font-weight: 700;\n      margin-bottom: 8px;\n      text-transform: uppercase;\n      letter-spacing: 0.3px;\n    }\n    .tooltip-columns {\n      display: flex;\n      gap: 12px;\n    }\n    .tooltip-col {\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      flex: 1;\n    }\n    .tooltip-col.bordered {\n      border-left: 1px solid rgba(255, 255, 255, 0.15);\n      padding-left: 12px;\n    }\n    .col-title {\n      font-weight: 600;\n      font-size: 9.5px;\n      color: rgba(255, 255, 255, 0.5);\n      text-transform: uppercase;\n      margin-bottom: 4px;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      gap: 8px;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val span {\n      color: rgba(255, 255, 255, 0.55);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n      font-weight: 700;\n    }\n\n    /* Export styles removed */\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class HeikinAshiChartComponent {\n  readonly instanceId = generateUniqueId('chart');\n  private readonly exportSvc = inject(ChartExportService);\n\n  readonly PAD_LEFT = 52;\n  readonly PAD_TOP = 20;\n  readonly PAD_RIGHT = 24;\n  readonly PAD_BOTTOM = 36;\n\n  data = input.required<CandlestickItem[]>();\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  bullishColor = input<string>('#10b981');\n  bearishColor = input<string>('#ef4444');\n\n  hoveredIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    date: string | Date;\n    isBullish: boolean;\n    orig: CandlestickItem;\n    ha: { open: number; high: number; low: number; close: number };\n  } | null>(null);\n\n  containerWidth = signal<number>(600);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Subtract padding\n          this.containerWidth.set(width - 32);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => Math.max(200, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(100, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  // Compute Heikin-Ashi series\n  heikinAshiData = computed<HeikinAshiCalculatedItem[]>(() => {\n    const raw = this.data();\n    if (raw.length === 0) return [];\n    const ha: HeikinAshiCalculatedItem[] = [];\n\n    // First item\n    const item0 = raw[0];\n    const haClose0 = (item0.open + item0.high + item0.low + item0.close) / 4;\n    const haOpen0 = (item0.open + item0.close) / 2;\n    const haHigh0 = Math.max(item0.high, haOpen0, haClose0);\n    const haLow0 = Math.min(item0.low, haOpen0, haClose0);\n\n    ha.push({\n      date: item0.date,\n      open: haOpen0,\n      high: haHigh0,\n      low: haLow0,\n      close: haClose0,\n      original: item0\n    });\n\n    // Subsequent items\n    for (let i = 1; i < raw.length; i++) {\n      const item = raw[i];\n      const prev = ha[i - 1];\n\n      const haClose = (item.open + item.high + item.low + item.close) / 4;\n      const haOpen = (prev.open + prev.close) / 2;\n      const haHigh = Math.max(item.high, haOpen, haClose);\n      const haLow = Math.min(item.low, haOpen, haClose);\n\n      ha.push({\n        date: item.date,\n        open: haOpen,\n        high: haHigh,\n        low: haLow,\n        close: haClose,\n        original: item\n      });\n    }\n\n    return ha;\n  });\n\n  yMin = computed(() => {\n    const items = this.heikinAshiData();\n    if (items.length === 0) return 0;\n    const lows = items.map(d => d.low);\n    const minVal = Math.min(...lows);\n    return minVal * 0.99; // 1% safety margin\n  });\n\n  yMax = computed(() => {\n    const items = this.heikinAshiData();\n    if (items.length === 0) return 100;\n    const highs = items.map(d => d.high);\n    const maxVal = Math.max(...highs);\n    return maxVal * 1.01; // 1% safety margin\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  xPos(index: number): number {\n    const count = this.heikinAshiData().length || 1;\n    const step = this.innerW() / count;\n    return index * step + step * 0.15; // padding\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  candleWidth(): number {\n    const count = this.heikinAshiData().length || 1;\n    return (this.innerW() / count) * 0.7; // 70% width\n  }\n\n  computedCandles = computed(() => {\n    const items = this.heikinAshiData();\n    const count = items.length;\n    if (count === 0) return [];\n    const width = this.candleWidth();\n\n    return items.map((item, idx) => {\n      const x = this.xPos(idx);\n      const centerX = x + width / 2;\n\n      const yOpen = this.yPos(item.open);\n      const yClose = this.yPos(item.close);\n      const yHigh = this.yPos(item.high);\n      const yLow = this.yPos(item.low);\n\n      const y = Math.min(yOpen, yClose);\n      const rectH = Math.max(2, Math.abs(yOpen - yClose));\n\n      const isBullish = item.close >= item.open;\n      const color = isBullish ? this.bullishColor() : this.bearishColor();\n\n      return {\n        x,\n        centerX,\n        width,\n        yHigh,\n        yLow,\n        yOpen,\n        yClose,\n        y,\n        rectH,\n        color,\n        isBullish,\n        raw: item\n      };\n    });\n  });\n\n  shouldShowXLabel(index: number): boolean {\n    const count = this.heikinAshiData().length;\n    if (count <= 10) return true;\n    if (count <= 25) return index % 2 === 0;\n    if (count <= 50) return index % 5 === 0;\n    return index % 10 === 0;\n  }\n\n  onCandleHover(event: MouseEvent, item: HeikinAshiCalculatedItem, index: number) {\n    this.hoveredIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    const tooltipX = event.clientX - rect.left;\n    const tooltipY = event.clientY - rect.top;\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      date: item.date,\n      isBullish: item.close >= item.open,\n      orig: item.original,\n      ha: { open: item.open, high: item.high, low: item.low, close: item.close }\n    });\n  }\n\n  formatDate(d: string | Date): string {\n    if (d instanceof Date) {\n      return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n    }\n    return String(d);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const items = this.heikinAshiData();\n    if (!items.length) return;\n    const headers = ['Date', 'Orig_Open', 'Orig_High', 'Orig_Low', 'Orig_Close', 'HA_Open', 'HA_High', 'HA_Low', 'HA_Close'];\n    const rows = items.map(item => [\n      this.formatDate(item.date),\n      item.original.open, item.original.high, item.original.low, item.original.close,\n      item.open, item.high, item.low, item.close\n    ]);\n    this.exportSvc.downloadCsv(headers, rows, 'heikin-ashi-data.csv');\n  }\n\n  exportToJson(): void {\n    const items = this.heikinAshiData();\n    if (!items.length) return;\n    this.exportSvc.downloadJson(items, 'heikin-ashi-data.json');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'heikin-ashi-chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Heikin-Ashi Chart', 'heikin-ashi-chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { niceTicks, scale, fmtNum, CHART_COLORS, smoothPath } from '../shared/chart-utils';\n\nexport interface ChartFlag {\n  x: string | Date | number;\n  y?: number;\n  title: string;\n  text?: string;\n  color?: string;\n  shape?: 'flag' | 'pin' | 'square' | 'circle';\n}\n\nexport interface ChartSeries {\n  name: string;\n  data: number[];\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-flags',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-flags-chart\" (mouseleave)=\"hoveredFlagIndex.set(null); tooltip.set(null)\">\n      <!-- Toolbar with Export option -->\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"hoveredFlagIndex.set(null); tooltip.set(null)\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n          class=\"chart-svg\"\n        >\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Grid Lines (Horizontal) -->\n            @if (showGrid() && hasDataset()) {\n              @for (tick of yTicks(); track tick) {\n                <line\n                  [attr.x1]=\"0\"\n                  [attr.x2]=\"innerW()\"\n                  [attr.y1]=\"yPos(tick)\"\n                  [attr.y2]=\"yPos(tick)\"\n                  stroke=\"var(--ngx-chart-grid, #ebedf0)\"\n                  stroke-dasharray=\"3,3\"\n                />\n              }\n            }\n\n            <!-- Y-Axis Labels -->\n            @if (showLabels() && hasDataset()) {\n              @for (tick of yTicks(); track tick) {\n                <text\n                  x=\"-10\"\n                  [attr.y]=\"yPos(tick) + 4\"\n                  class=\"axis-label y\"\n                  text-anchor=\"end\"\n                >{{ fmtNum(tick) }}</text>\n              }\n            }\n\n            <!-- Background Line Chart (if dataset is provided) -->\n            @if (hasDataset() && dataset(); as ds) {\n              <!-- Area Fill -->\n              <path\n                [attr.d]=\"areaPath(ds)\"\n                fill=\"rgba(79, 70, 229, 0.05)\"\n                stroke=\"none\"\n              />\n              <!-- Line Path -->\n              <path\n                [attr.d]=\"linePath(ds)\"\n                [attr.stroke]=\"ds.color || '#6366f1'\"\n                fill=\"none\"\n                stroke-width=\"2\"\n                stroke-linejoin=\"round\"\n                stroke-linecap=\"round\"\n                opacity=\"0.8\"\n              />\n            } @else {\n              <!-- Timeline Horizontal Base Line -->\n              <line\n                [attr.x1]=\"0\"\n                [attr.x2]=\"innerW()\"\n                [attr.y1]=\"innerH() / 2\"\n                [attr.y2]=\"innerH() / 2\"\n                stroke=\"#cbd5e1\"\n                stroke-width=\"2\"\n              />\n            }\n\n            <!-- X-Axis Labels -->\n            @if (showLabels()) {\n              @for (cat of categories(); track cat; let i = $index) {\n                @if (shouldShowXLabel(i)) {\n                  <text\n                    [attr.x]=\"xPos(i)\"\n                    [attr.y]=\"innerH() + 20\"\n                    class=\"axis-label x\"\n                    text-anchor=\"middle\"\n                  >{{ formatDate(cat) }}</text>\n                }\n              }\n            }\n\n            <!-- Flags Layer -->\n            @for (flag of computedFlags(); track $index; let i = $index) {\n              <!-- Flagpole line -->\n              <line\n                [attr.x1]=\"flag.cx\"\n                [attr.y1]=\"flag.cy\"\n                [attr.x2]=\"flag.cx\"\n                [attr.y2]=\"flag.poleTop\"\n                [attr.stroke]=\"flag.color\"\n                stroke-width=\"1.5\"\n                [attr.stroke-dasharray]=\"flag.shape === 'pin' ? 'none' : '1,1'\"\n              />\n\n              <!-- Flag Shape Banner -->\n              <g\n                class=\"flag-group\"\n                [class.hovered]=\"hoveredFlagIndex() === i\"\n                (mouseenter)=\"onFlagHover($event, flag.raw, i, flag.cx, flag.poleTop)\"\n                (mousemove)=\"onFlagHover($event, flag.raw, i, flag.cx, flag.poleTop)\"\n                style=\"cursor: pointer;\"\n              >\n                <!-- Render flag banner by shape -->\n                @if (flag.shape === 'flag') {\n                  <!-- Standard flag banner pointing right -->\n                  <path\n                    [attr.d]=\"'M ' + flag.cx + ',' + flag.poleTop + \n                              ' L ' + (flag.cx + flag.width) + ',' + flag.poleTop + \n                              ' L ' + (flag.cx + flag.width - 5) + ',' + (flag.poleTop + 9) + \n                              ' L ' + (flag.cx + flag.width) + ',' + (flag.poleTop + 18) + \n                              ' L ' + flag.cx + ',' + (flag.poleTop + 18) + ' Z'\"\n                    [attr.fill]=\"flag.color\"\n                    [attr.stroke]=\"flag.color\"\n                    stroke-width=\"1\"\n                  />\n                  <text\n                    [attr.x]=\"flag.cx + flag.width / 2 - 2\"\n                    [attr.y]=\"flag.poleTop + 12\"\n                    text-anchor=\"middle\"\n                    fill=\"#ffffff\"\n                    font-size=\"9px\"\n                    font-weight=\"700\"\n                  >{{ flag.title }}</text>\n                } @else if (flag.shape === 'pin') {\n                  <!-- Pin Circle shape -->\n                  <circle\n                    [attr.cx]=\"flag.cx\"\n                    [attr.cy]=\"flag.poleTop - 8\"\n                    [attr.r]=\"10\"\n                    [attr.fill]=\"flag.color\"\n                    [attr.stroke]=\"'#ffffff'\"\n                    stroke-width=\"1.5\"\n                    [attr.filter]=\"hoveredFlagIndex() === i ? 'drop-shadow(0 2px 4px rgba(0,0,0,0.15))' : null\"\n                  />\n                  <text\n                    [attr.x]=\"flag.cx\"\n                    [attr.y]=\"flag.poleTop - 5\"\n                    text-anchor=\"middle\"\n                    fill=\"#ffffff\"\n                    font-size=\"9px\"\n                    font-weight=\"700\"\n                  >{{ flag.title }}</text>\n                } @else if (flag.shape === 'circle') {\n                  <!-- Circle shape flag -->\n                  <circle\n                    [attr.cx]=\"flag.cx\"\n                    [attr.cy]=\"flag.poleTop\"\n                    [attr.r]=\"9\"\n                    [attr.fill]=\"'#ffffff'\"\n                    [attr.stroke]=\"flag.color\"\n                    stroke-width=\"2\"\n                  />\n                  <text\n                    [attr.x]=\"flag.cx\"\n                    [attr.y]=\"flag.poleTop + 3\"\n                    text-anchor=\"middle\"\n                    [attr.fill]=\"flag.color\"\n                    font-size=\"9px\"\n                    font-weight=\"700\"\n                  >{{ flag.title }}</text>\n                } @else {\n                  <!-- Square shape flag (Default) -->\n                  <rect\n                    [attr.x]=\"flag.cx - flag.width / 2\"\n                    [attr.y]=\"flag.poleTop - 18\"\n                    [attr.width]=\"flag.width\"\n                    [attr.height]=\"18\"\n                    rx=\"3\"\n                    ry=\"3\"\n                    [attr.fill]=\"flag.color\"\n                    [attr.stroke]=\"'#ffffff'\"\n                    stroke-width=\"1\"\n                  />\n                  <text\n                    [attr.x]=\"flag.cx\"\n                    [attr.y]=\"flag.poleTop - 6\"\n                    text-anchor=\"middle\"\n                    fill=\"#ffffff\"\n                    font-size=\"9px\"\n                    font-weight=\"700\"\n                  >{{ flag.title }}</text>\n                }\n              </g>\n            }\n\n            <!-- Base axes borders (Only when dataset is present) -->\n            @if (hasDataset()) {\n              <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n              <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis, #ced4da)\"/>\n            }\n          </g>\n        </svg>\n\n        <!-- Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n            <div class=\"tooltip-header\" [style.border-bottom-color]=\"t.color\">\n              <span class=\"flag-type-dot\" [style.background]=\"t.color\"></span>\n              {{ t.title }}\n            </div>\n            <div class=\"tooltip-body\">\n              <div class=\"tooltip-date\">Date: <strong>{{ formatDate(t.date) }}</strong></div>\n              @if (t.text) {\n                <div class=\"tooltip-desc\">{{ t.text }}</div>\n              }\n              @if (t.yVal !== undefined) {\n                <div class=\"tooltip-val\" style=\"margin-top: 4px;\">\n                  <span>Value:</span>\n                  <strong>{{ fmtNum(t.yVal) }}</strong>\n                </div>\n              }\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-flags-chart {\n      position: relative;\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n    .chart-svg {\n      display: block;\n      overflow: visible;\n    }\n    .axis-label {\n      font-size: 10px;\n      fill: #64748b;\n      font-weight: 500;\n    }\n\n    .flag-group {\n      transition: transform 0.15s ease-out;\n    }\n    .flag-group.hovered {\n      transform: scale(1.1);\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      z-index: 100;\n      min-width: 160px;\n      max-width: 250px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transition: left 0.08s ease-out, top 0.08s ease-out;\n    }\n    .tooltip-header {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1.5px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #f8fafc;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .flag-type-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      display: inline-block;\n    }\n    .tooltip-body {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n    .tooltip-date {\n      font-size: 10px;\n      color: rgba(255, 255, 255, 0.6);\n    }\n    .tooltip-date strong {\n      color: #38bdf8;\n    }\n    .tooltip-desc {\n      font-size: 10.5px;\n      color: rgba(248, 250, 252, 0.95);\n      margin-top: 4px;\n      line-height: 1.4;\n      word-break: break-word;\n    }\n    .tooltip-val {\n      display: flex;\n      justify-content: space-between;\n      color: rgba(248, 250, 252, 0.85);\n    }\n    .tooltip-val strong {\n      color: #f8fafc;\n      font-family: monospace;\n    }\n\n    /* Export styles */\n    .chart-export-menu {\n      position: absolute;\n      top: 0;\n      right: 0;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #6c757d);\n      background: rgba(255, 255, 255, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #fff;\n      color: var(--primary-color, #4f46e5);\n      border-color: var(--primary-color, #4f46e5);\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #fff;\n      border: 1px solid var(--ngx-chart-grid, #ebedf0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.08);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n      z-index: 60;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #343a40;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: var(--primary-color, #4f46e5);\n    }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n  `]\n})\nexport class FlagsComponent {\n  readonly PAD_LEFT = 52;\n  readonly PAD_TOP = 40; // larger pad top to avoid flags clipping at the top\n  readonly PAD_RIGHT = 24;\n  readonly PAD_BOTTOM = 36;\n\n  data = input.required<ChartFlag[]>();\n  dataset = input<ChartSeries | null>(null);\n  categories = input<string[]>([]);\n  height = input<number>(300);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showExport = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n\n  exportMenuOpen = signal(false);\n  hoveredFlagIndex = signal<number | null>(null);\n  tooltip = signal<{\n    x: number;\n    y: number;\n    title: string;\n    text?: string;\n    date: string;\n    color: string;\n    yVal?: number;\n  } | null>(null);\n\n  containerWidth = signal<number>(600);\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          // Subtract padding\n          this.containerWidth.set(width - 32);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  innerW = computed(() => Math.max(200, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(100, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  hasDataset = computed(() => {\n    const ds = this.dataset();\n    return !!(ds && ds.data && ds.data.length > 0);\n  });\n\n  yMin = computed(() => {\n    if (!this.hasDataset()) return 0;\n    const data = this.dataset()?.data || [];\n    const minVal = Math.min(...data);\n    return minVal < 0 ? minVal * 1.1 : minVal * 0.95;\n  });\n\n  yMax = computed(() => {\n    if (!this.hasDataset()) return 100;\n    const data = this.dataset()?.data || [];\n    const maxVal = Math.max(...data);\n    return maxVal * 1.05; // 5% margin\n  });\n\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  xPos(index: number): number {\n    const count = this.categories().length || 1;\n    if (count <= 1) return this.innerW() / 2;\n    return scale(index, 0, count - 1, 0, this.innerW());\n  }\n\n  yPos(y: number): number {\n    return scale(y, this.yMin(), this.yMax(), this.innerH(), 0);\n  }\n\n  linePath(ds: ChartSeries): string {\n    const pts: [number, number][] = ds.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    return smoothPath(pts);\n  }\n\n  areaPath(ds: ChartSeries): string {\n    const pts: [number, number][] = ds.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    const line = smoothPath(pts);\n    const last = pts[pts.length - 1];\n    const first = pts[0];\n    return line + ` L ${last[0]} ${this.innerH()} L ${first[0]} ${this.innerH()} Z`;\n  }\n\n  computedFlags = computed(() => {\n    const flags = this.data();\n    const cats = this.categories();\n    const hasDS = this.hasDataset();\n    const ds = this.dataset();\n\n    return flags.map(flag => {\n      // Find category index matching flag.x\n      const flagXStr = String(flag.x);\n      const idx = cats.findIndex(cat => String(cat) === flagXStr);\n      \n      let cx = this.innerW() / 2;\n      let cy = this.innerH() / 2;\n      let yVal: number | undefined;\n\n      if (idx !== -1) {\n        cx = this.xPos(idx);\n        if (hasDS && ds) {\n          yVal = flag.y !== undefined ? flag.y : ds.data[idx];\n          if (yVal !== undefined) {\n            cy = this.yPos(yVal);\n          }\n        } else {\n          cy = this.innerH() / 2;\n        }\n      }\n\n      // Height of flagpole: e.g. 35px\n      const poleHeight = 35;\n      const poleTop = cy - poleHeight;\n\n      // Color\n      const color = flag.color || this.colors()[0];\n      const shape = flag.shape || 'flag';\n      \n      // Dynamic width based on title text\n      const width = Math.max(18, flag.title.length * 8 + 8);\n\n      return {\n        cx,\n        cy,\n        poleTop,\n        color,\n        shape,\n        width,\n        title: flag.title,\n        text: flag.text,\n        yVal,\n        raw: flag\n      };\n    });\n  });\n\n  shouldShowXLabel(index: number): boolean {\n    const count = this.categories().length;\n    if (count <= 10) return true;\n    if (count <= 25) return index % 2 === 0;\n    if (count <= 50) return index % 5 === 0;\n    return index % 10 === 0;\n  }\n\n  onFlagHover(event: MouseEvent, flag: ChartFlag, index: number, cx: number, poleTop: number) {\n    this.hoveredFlagIndex.set(index);\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const rect = containerEl.getBoundingClientRect();\n    \n    // Position tooltip above the flag banner\n    const tooltipX = cx + this.PAD_LEFT;\n    const tooltipY = poleTop + this.PAD_TOP - 10;\n\n    let yVal: number | undefined;\n    if (this.hasDataset() && this.dataset()) {\n      const idx = this.categories().findIndex(cat => String(cat) === String(flag.x));\n      if (idx !== -1) {\n        yVal = flag.y !== undefined ? flag.y : this.dataset()!.data[idx];\n      }\n    }\n\n    this.tooltip.set({\n      x: tooltipX,\n      y: tooltipY,\n      title: flag.title,\n      text: flag.text,\n      date: String(flag.x),\n      color: flag.color || this.colors()[0],\n      yVal\n    });\n  }\n\n  formatDate(d: string | Date | number): string {\n    if (d instanceof Date) {\n      return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n    }\n    return String(d);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToCsv(): void {\n    const items = this.data();\n    if (!items.length) return;\n    let csv = 'Coordinate,Title,Text,Color,Shape,YValue\\n';\n    items.forEach(item => {\n      csv += `\"${this.formatDate(item.x)}\",\"${item.title}\",\"${item.text || ''}\",\"${item.color || ''}\",\"${item.shape || 'flag'}\",${item.y || ''}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'flags-annotation-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToJson(): void {\n    const blob = new Blob([JSON.stringify(this.data(), null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'flags-annotation-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'flags-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    const svgHtml = svg.outerHTML;\n    const printTemplate = `\n      <html>\n      <head>\n        <title>Timeline Flags Annotation Export</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; text-align: center; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; text-align: left; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          .chart-container { display: inline-block; margin-top: 24px; border: 1px solid #cbd5e1; border-radius: 12px; padding: 20px; background: #ffffff; width: 90%; }\n          svg { width: 100%; height: auto; }\n          .axis-label { font-size: 11px; fill: #6c757d; font-weight: 500; }\n          @media print {\n            body { padding: 0; }\n            .chart-container { border: none; padding: 0; width: 100%; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">Timeline Flags Annotation Analytics</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        <div class=\"chart-container\">\n          ${svgHtml}\n        </div>\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","// Shared Map Datasets and Projections for ngx-core-components\n\nexport interface MapRegion {\n  id: string;\n  name: string;\n  polygons: [number, number][][]; // longitude, latitude\n}\n\n/**\n * Standard World Map outline with coordinates (longitude, latitude)\n */\nexport const WORLD_MAP_DATA: MapRegion[] = [\n  {\n    id: 'GL',\n    name: 'Greenland',\n    polygons: [[[-70, 60], [-60, 83], [-20, 83], [-10, 75], [-40, 60], [-70, 60]]]\n  },\n  {\n    id: 'CA',\n    name: 'Canada',\n    polygons: [[[-168, 65], [-140, 70], [-120, 75], [-80, 75], [-60, 75], [-50, 60], [-60, 50], [-115, 50], [-140, 60], [-168, 65]]]\n  },\n  {\n    id: 'US',\n    name: 'United States',\n    polygons: [[[-125, 49], [-65, 49], [-80, 25], [-115, 25], [-125, 49]]]\n  },\n  {\n    id: 'MX',\n    name: 'Mexico',\n    polygons: [[[-115, 25], [-90, 20], [-80, 8], [-77, 8], [-95, 15], [-115, 25]]]\n  },\n  {\n    id: 'SA',\n    name: 'South America',\n    polygons: [[[-80, 8], [-45, 10], [-35, -5], [-40, -25], [-65, -55], [-75, -50], [-75, -20], [-80, 8]]]\n  },\n  {\n    id: 'EU',\n    name: 'Europe',\n    polygons: [[[-10, 60], [30, 70], [45, 60], [30, 35], [-5, 35], [-10, 45], [-10, 60]]]\n  },\n  {\n    id: 'AF',\n    name: 'Africa',\n    polygons: [[[-17, 35], [30, 32], [50, 12], [40, -20], [20, -35], [10, 5], [-17, 15], [-17, 35]]]\n  },\n  {\n    id: 'RU',\n    name: 'Russia',\n    polygons: [[[30, 60], [60, 75], [120, 75], [180, 70], [170, 45], [130, 45], [80, 50], [30, 60]]]\n  },\n  {\n    id: 'CN',\n    name: 'China',\n    polygons: [[[75, 45], [130, 45], [125, 20], [105, 20], [75, 30], [75, 45]]]\n  },\n  {\n    id: 'IN',\n    name: 'India',\n    polygons: [[[68, 25], [78, 30], [90, 25], [80, 8], [68, 25]]]\n  },\n  {\n    id: 'ME',\n    name: 'Middle East',\n    polygons: [[[30, 32], [60, 32], [60, 25], [50, 12], [35, 12], [30, 32]]]\n  },\n  {\n    id: 'AU',\n    name: 'Australia',\n    polygons: [[[113, -11], [153, -11], [150, -39], [115, -35], [113, -11]]]\n  }\n];\n\n/**\n * Projects a longitude and latitude coordinate into a 2D viewport using Equirectangular projection\n */\nexport function project(\n  lng: number,\n  lat: number,\n  width: number,\n  height: number,\n  padding = { top: 10, right: 10, bottom: 10, left: 10 }\n): { x: number; y: number } {\n  const innerWidth = width - padding.left - padding.right;\n  const innerHeight = height - padding.top - padding.bottom;\n\n  // Scale longitude to X\n  const x = padding.left + ((lng + 180) / 360) * innerWidth;\n  \n  // Scale latitude to Y (note latitude 90 is top, -90 is bottom)\n  const y = padding.top + ((90 - lat) / 180) * innerHeight;\n\n  return { x, y };\n}\n\n/**\n * Helper to generate an SVG path from a set of polygons\n */\nexport function getSvgPath(\n  polygons: [number, number][][],\n  width: number,\n  height: number,\n  padding = { top: 10, right: 10, bottom: 10, left: 10 }\n): string {\n  let path = '';\n  for (const poly of polygons) {\n    if (poly.length === 0) continue;\n    const start = project(poly[0][0], poly[0][1], width, height, padding);\n    path += `M ${start.x.toFixed(1)} ${start.y.toFixed(1)}`;\n    for (let i = 1; i < poly.length; i++) {\n      const pt = project(poly[i][0], poly[i][1], width, height, padding);\n      path += ` L ${pt.x.toFixed(1)} ${pt.y.toFixed(1)}`;\n    }\n    path += ' Z ';\n  }\n  return path;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { fmtNum } from '../shared/chart-utils';\nimport { WORLD_MAP_DATA, getSvgPath } from '../shared/map-data';\n\nexport interface ChoroplethDataPoint {\n  regionId: string; // e.g. 'US', 'CA', 'CN', etc.\n  value: number;\n  label?: string; // Optional custom name/description\n}\n\n@Component({\n  selector: 'ngx-map-choropleth',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-map-choropleth\" [class.dark]=\"theme() === 'dark'\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title\">\n          <h4>{{ title() }}</h4>\n        </div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Color scale legend -->\n      @if (showLegend() && data().length > 0) {\n        <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\">\n          <span class=\"legend-label\">{{ fmtNum(minVal()) }}</span>\n          <div class=\"legend-bar\" [style.background]=\"legendGradient()\"></div>\n          <span class=\"legend-label\">{{ fmtNum(maxVal()) }}</span>\n        </div>\n      }\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          class=\"map-svg\"\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n        >\n          <g>\n            <!-- Map Geometries -->\n            @for (region of computedRegions(); track region.id) {\n              <path\n                [attr.d]=\"region.path\"\n                [attr.fill]=\"region.fillColor\"\n                [attr.stroke]=\"theme() === 'dark' ? '#1e293b' : '#ffffff'\"\n                [attr.stroke-width]=\"hoveredRegionId() === region.id ? 2.5 : 1\"\n                class=\"map-region\"\n                [class.highlighted]=\"hoveredRegionId() === region.id\"\n                (mouseenter)=\"onRegionHover(region, $event)\"\n                (mousemove)=\"onRegionMouseMove($event)\"\n              />\n            }\n          </g>\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n            <div class=\"tt-cat\">{{ t.name }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">Value</span>\n              <span class=\"tt-val\">{{ fmtNum(t.value) }}</span>\n            </div>\n            @if (t.label) {\n              <div class=\"tt-row label-row\">\n                <span class=\"tt-name\">{{ t.label }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-map-choropleth {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n      transition: background-color 0.3s;\n    }\n    .ngx-map-choropleth.dark {\n      background: #0f172a;\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: #0f172a;\n      --ngx-chart-tooltip-bg: rgba(15, 23, 42, 0.95);\n      --ngx-chart-tooltip-color: #f8fafc;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      position: relative;\n    }\n    .chart-title h4 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 600;\n      color: var(--ngx-chart-title-color, #1e293b);\n    }\n    .dark .chart-title h4 {\n      color: #f8fafc;\n    }\n    .map-svg {\n      display: block;\n      overflow: visible;\n    }\n    .map-region {\n      cursor: pointer;\n      transition: fill 0.2s, stroke-width 0.15s, filter 0.15s;\n    }\n    .map-region.highlighted {\n      filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.25));\n    }\n    \n    /* Legend Gradient */\n    .chart-legend {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-bottom: 16px;\n      justify-content: flex-end;\n    }\n    .legend-label {\n      font-size: 11px;\n      color: #64748b;\n      font-weight: 600;\n    }\n    .dark .legend-label {\n      color: #94a3b8;\n    }\n    .legend-bar {\n      width: 120px;\n      height: 10px;\n      border-radius: 4px;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .label-row {\n      font-style: italic;\n      color: rgba(255, 255, 255, 0.7);\n      font-size: 11px;\n      margin-top: 6px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.1);\n      padding-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles removed */\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n  `]\n})\nexport class MapChoroplethComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  title = input<string>('Region Distribution');\n  data = input<ChoroplethDataPoint[]>([]);\n  height = input<number>(400);\n  colors = input<string[]>(['#e0f2fe', '#0284c7']); // minColor, maxColor\n  noDataColor = input<string>('#e2e8f0');\n  showLegend = input<boolean>(true);\n  showExport = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n\n  containerWidth = signal<number>(600);\n  hoveredRegionId = signal<string | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  minVal = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 0;\n    return Math.min(...raw.map(d => d.value));\n  });\n\n  maxVal = computed(() => {\n    const raw = this.data();\n    if (raw.length === 0) return 100;\n    return Math.max(...raw.map(d => d.value));\n  });\n\n  legendGradient = computed(() => {\n    const cols = this.colors();\n    const c1 = cols[0] || '#e0f2fe';\n    const c2 = cols[1] || '#0284c7';\n    return `linear-gradient(to right, ${c1}, ${c2})`;\n  });\n\n  computedRegions = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const rawData = this.data();\n    const min = this.minVal();\n    const max = this.maxVal();\n    const minColor = this.colors()[0] || '#e0f2fe';\n    const maxColor = this.colors()[1] || '#0284c7';\n    const emptyColor = this.theme() === 'dark' ? '#1e293b' : this.noDataColor();\n\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n\n    return WORLD_MAP_DATA.map(region => {\n      const path = getSvgPath(region.polygons, w, h, padding);\n      const dataPoint = rawData.find(d => d.regionId.toUpperCase() === region.id.toUpperCase());\n      \n      let fillColor = emptyColor;\n      let value = 0;\n      let hasData = false;\n      let label = '';\n\n      if (dataPoint) {\n        hasData = true;\n        value = dataPoint.value;\n        label = dataPoint.label || '';\n        const range = max - min || 1;\n        const factor = Math.max(0, Math.min(1, (value - min) / range));\n        fillColor = this.interpolateColor(minColor, maxColor, factor);\n      }\n\n      return {\n        id: region.id,\n        name: region.name,\n        path,\n        value,\n        hasData,\n        label,\n        fillColor\n      };\n    });\n  });\n\n  onRegionHover(region: any, event: MouseEvent) {\n    this.hoveredRegionId.set(region.id);\n    if (region.hasData) {\n      this.tooltip.set({\n        name: region.name,\n        value: region.value,\n        label: region.label,\n        color: region.fillColor\n      });\n    } else {\n      this.tooltip.set({\n        name: region.name,\n        value: 0,\n        label: 'No Data',\n        color: region.fillColor\n      });\n    }\n  }\n\n  onRegionMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredRegionId.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'choropleth-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['RegionId', 'Value', 'Label'];\n    const rows = data.map(d => [d.regionId, d.value, d.label || '']);\n    this.exportSvc.downloadCsv(headers, rows, 'choropleth-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'choropleth-map.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Choropleth Map', 'choropleth-map.pdf');\n  }\n\n  private interpolateColor(color1: string, color2: string, factor: number): string {\n    const c1 = this.parseHex(color1);\n    const c2 = this.parseHex(color2);\n    const r = Math.round(c1.r + factor * (c2.r - c1.r));\n    const g = Math.round(c1.g + factor * (c2.g - c1.g));\n    const b = Math.round(c1.b + factor * (c2.b - c1.b));\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n\n  private parseHex(hex: string) {\n    let clean = hex.replace('#', '');\n    if (clean.length === 3) {\n      clean = clean.split('').map(c => c + c).join('');\n    }\n    const num = parseInt(clean, 16);\n    return {\n      r: (num >> 16) & 255,\n      g: (num >> 8) & 255,\n      b: num & 255\n    };\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { fmtNum, scale } from '../shared/chart-utils';\nimport { WORLD_MAP_DATA, getSvgPath, project } from '../shared/map-data';\n\nexport interface MapBubblePoint {\n  lat: number;\n  lng: number;\n  value: number;\n  label?: string;\n  color?: string; // Optional custom color override\n  group?: string; // Group for color categorization\n}\n\n@Component({\n  selector: 'ngx-map-bubble',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-map-bubble\" [class.dark]=\"theme() === 'dark'\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title\">\n          <h4>{{ title() }}</h4>\n        </div>\n        \n        <!-- Legend -->\n        @if (showLegend() && uniqueGroups().length > 0) {\n          <div class=\"chart-legend\">\n            @for (grp of uniqueGroups(); track grp; let idx = $index) {\n              <span class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"getGroupColor(grp)\"></span>\n                {{ grp }}\n              </span>\n            }\n          </div>\n        }\n\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          class=\"map-svg\"\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Base Map Outlines -->\n          <g class=\"map-base\">\n            @for (pathStr of baseMapPaths(); track $index) {\n              <path\n                [attr.d]=\"pathStr\"\n                [attr.fill]=\"theme() === 'dark' ? '#1e293b' : '#f1f5f9'\"\n                [attr.stroke]=\"theme() === 'dark' ? '#0f172a' : '#cbd5e1'\"\n                stroke-width=\"1\"\n              />\n            }\n          </g>\n\n          <!-- Bubble Overlays -->\n          <g class=\"map-bubbles\">\n            @for (bubble of scaledBubbles(); track $index; let i = $index) {\n              <circle\n                [attr.cx]=\"bubble.x\"\n                [attr.cy]=\"bubble.y\"\n                [attr.r]=\"hoveredBubbleIndex() === i ? bubble.r * 1.15 + 2 : bubble.r\"\n                [attr.fill]=\"bubble.color\"\n                stroke=\"#ffffff\"\n                [attr.stroke-width]=\"hoveredBubbleIndex() === i ? 2 : 1.2\"\n                [attr.fill-opacity]=\"hoveredBubbleIndex() === i ? 0.9 : 0.7\"\n                class=\"bubble-node\"\n                [class.hovered]=\"hoveredBubbleIndex() === i\"\n                (mouseenter)=\"onBubbleHover(bubble, i, $event)\"\n                (mousemove)=\"onBubbleMouseMove($event)\"\n              />\n            }\n          </g>\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n            <div class=\"tt-cat\">{{ t.label || 'Location Marker' }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Value</span>\n              <span class=\"tt-val\">{{ fmtNum(t.value) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Coords</span>\n              <span class=\"tt-val\">{{ t.lat.toFixed(2) }}°, {{ t.lng.toFixed(2) }}°</span>\n            </div>\n            @if (t.group) {\n              <div class=\"tt-row label-row\">\n                <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n                <span class=\"tt-name\">Group: {{ t.group }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-map-bubble {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n      transition: background-color 0.3s;\n    }\n    .ngx-map-bubble.dark {\n      background: #0f172a;\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: #0f172a;\n      --ngx-chart-tooltip-bg: rgba(15, 23, 42, 0.95);\n      --ngx-chart-tooltip-color: #f8fafc;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      position: relative;\n    }\n    .chart-title h4 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 600;\n      color: var(--ngx-chart-title-color, #1e293b);\n    }\n    .dark .chart-title h4 {\n      color: #f8fafc;\n    }\n    \n    /* Legend styling */\n    .chart-legend {\n      display: flex;\n      gap: 16px;\n      flex-wrap: wrap;\n      margin-right: 80px;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      font-size: 12px;\n      font-weight: 500;\n      color: #64748b;\n    }\n    .dark .legend-item {\n      color: #94a3b8;\n    }\n    .legend-dot {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      display: inline-block;\n    }\n\n    .map-svg {\n      display: block;\n      overflow: visible;\n    }\n    .bubble-node {\n      cursor: pointer;\n      transition: r 0.2s cubic-bezier(0.16, 1, 0.3, 1), fill-opacity 0.2s, stroke-width 0.2s;\n    }\n    .bubble-node.hovered {\n      filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.35));\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .label-row {\n      margin-top: 6px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.1);\n      padding-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles removed */\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n  `]\n})\nexport class MapBubbleComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  title = input<string>('Geographical Bubble Matrix');\n  data = input<MapBubblePoint[]>([]);\n  height = input<number>(400);\n  colors = input<string[]>(['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899']);\n  minBubbleSize = input<number>(6);\n  maxBubbleSize = input<number>(28);\n  showLegend = input<boolean>(true);\n  showExport = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n\n  containerWidth = signal<number>(600);\n  hoveredBubbleIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  uniqueGroups = computed(() => {\n    const grps = new Set<string>();\n    this.data().forEach(p => {\n      if (p.group) grps.add(p.group);\n    });\n    return Array.from(grps);\n  });\n\n  getGroupColor(grp?: string): string {\n    if (!grp) return this.colors()[0];\n    const idx = this.uniqueGroups().indexOf(grp);\n    return this.colors()[idx % this.colors().length];\n  }\n\n  baseMapPaths = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n    return WORLD_MAP_DATA.map(region => getSvgPath(region.polygons, w, h, padding));\n  });\n\n  private values = computed(() => this.data().map(d => d.value));\n  private minVal = computed(() => this.values().length > 0 ? Math.min(...this.values()) : 0);\n  private maxVal = computed(() => this.values().length > 0 ? Math.max(...this.values()) : 100);\n\n  scaledBubbles = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const min = this.minVal();\n    const max = this.maxVal();\n    const minSize = this.minBubbleSize();\n    const maxSize = this.maxBubbleSize();\n    \n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n\n    return this.data().map(pt => {\n      const coord = project(pt.lng, pt.lat, w, h, padding);\n      const r = scale(pt.value, min, max, minSize, maxSize);\n      const color = pt.color || this.getGroupColor(pt.group);\n\n      return {\n        x: coord.x,\n        y: coord.y,\n        r,\n        color,\n        raw: pt\n      };\n    });\n  });\n\n  onBubbleHover(bubble: any, index: number, event: MouseEvent) {\n    this.hoveredBubbleIndex.set(index);\n    this.tooltip.set({\n      label: bubble.raw.label,\n      value: bubble.raw.value,\n      lat: bubble.raw.lat,\n      lng: bubble.raw.lng,\n      group: bubble.raw.group,\n      color: bubble.color\n    });\n  }\n\n  onBubbleMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredBubbleIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'map-bubbles-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Label', 'Group', 'Latitude', 'Longitude', 'Value'];\n    const rows = data.map(d => [d.label || '', d.group || '', d.lat, d.lng, d.value]);\n    this.exportSvc.downloadCsv(headers, rows, 'map-bubbles-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'map-bubbles.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Map Bubbles', 'map-bubbles.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { WORLD_MAP_DATA, getSvgPath, project } from '../shared/map-data';\n\nexport interface MapPoint {\n  lat: number;\n  lng: number;\n  label?: string;\n  color?: string;\n  size?: number;\n}\n\nexport interface MapLine {\n  fromIndex: number;\n  toIndex: number;\n  label?: string;\n  color?: string;\n  strokeWidth?: number;\n  dashed?: boolean;\n}\n\n@Component({\n  selector: 'ngx-map-line-point',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-map-line-point\" [class.dark]=\"theme() === 'dark'\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title\">\n          <h4>{{ title() }}</h4>\n        </div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          class=\"map-svg\"\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Base Map Outlines -->\n          <g class=\"map-base\">\n            @for (pathStr of baseMapPaths(); track $index) {\n              <path\n                [attr.d]=\"pathStr\"\n                [attr.fill]=\"theme() === 'dark' ? '#1e293b' : '#f8fafc'\"\n                [attr.stroke]=\"theme() === 'dark' ? '#0f172a' : '#e2e8f0'\"\n                stroke-width=\"1.2\"\n              />\n            }\n          </g>\n\n          <!-- Connection Lines -->\n          <g class=\"map-lines\">\n            @for (line of computedLines(); track $index; let i = $index) {\n              <line\n                [attr.x1]=\"line.x1\"\n                [attr.y1]=\"line.y1\"\n                [attr.x2]=\"line.x2\"\n                [attr.y2]=\"line.y2\"\n                [attr.stroke]=\"line.color\"\n                [attr.stroke-width]=\"hoveredLineIndex() === i ? (line.strokeWidth || 2) * 1.8 : (line.strokeWidth || 2)\"\n                [attr.stroke-dasharray]=\"line.dashed ? '4,4' : 'none'\"\n                stroke-linecap=\"round\"\n                class=\"network-line\"\n                [class.hovered]=\"hoveredLineIndex() === i\"\n                (mouseenter)=\"onLineHover(line.raw, i, $event)\"\n                (mousemove)=\"onLineMouseMove($event)\"\n              />\n            }\n          </g>\n\n          <!-- Coordinate Points -->\n          <g class=\"map-points\">\n            @for (pt of computedPoints(); track $index; let i = $index) {\n              <circle\n                [attr.cx]=\"pt.x\"\n                [attr.cy]=\"pt.y\"\n                [attr.r]=\"hoveredPointIndex() === i ? pt.size * 1.5 + 2 : pt.size\"\n                [attr.fill]=\"pt.color\"\n                stroke=\"#ffffff\"\n                [attr.stroke-width]=\"hoveredPointIndex() === i ? 2.5 : 1.5\"\n                class=\"network-point\"\n                [class.hovered]=\"hoveredPointIndex() === i\"\n                (mouseenter)=\"onPointHover(pt.raw, i, $event)\"\n                (mousemove)=\"onPointMouseMove($event)\"\n              />\n            }\n          </g>\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n            @if (t.type === 'point') {\n              <div class=\"tt-cat\">{{ t.label || 'Network Point' }}</div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Coords</span>\n                <span class=\"tt-val\">{{ t.lat.toFixed(2) }}°, {{ t.lng.toFixed(2) }}°</span>\n              </div>\n            } @else {\n              <div class=\"tt-cat\">Route Segment</div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Route</span>\n                <span class=\"tt-val\">{{ t.label || 'Connected Route' }}</span>\n              </div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">From</span>\n                <span class=\"tt-val\">{{ t.fromLabel || '#' + t.fromIndex }}</span>\n              </div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">To</span>\n                <span class=\"tt-val\">{{ t.toLabel || '#' + t.toIndex }}</span>\n              </div>\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-map-line-point {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n      transition: background-color 0.3s;\n    }\n    .ngx-map-line-point.dark {\n      background: #0f172a;\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: #0f172a;\n      --ngx-chart-tooltip-bg: rgba(15, 23, 42, 0.95);\n      --ngx-chart-tooltip-color: #f8fafc;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      position: relative;\n    }\n    .chart-title h4 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 600;\n      color: var(--ngx-chart-title-color, #1e293b);\n    }\n    .dark .chart-title h4 {\n      color: #f8fafc;\n    }\n\n    .map-svg {\n      display: block;\n      overflow: visible;\n    }\n    .network-line {\n      cursor: pointer;\n      opacity: 0.8;\n      transition: stroke-width 0.2s, stroke 0.2s, opacity 0.2s;\n    }\n    .network-line.hovered {\n      opacity: 1;\n    }\n    .network-point {\n      cursor: pointer;\n      transition: r 0.2s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.15s;\n    }\n    .network-point.hovered {\n      filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.3));\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 160px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n  `]\n})\nexport class MapLinePointComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  title = input<string>('Geographical Networks');\n  points = input<MapPoint[]>([]);\n  lines = input<MapLine[]>([]);\n  height = input<number>(400);\n  theme = input<'light' | 'dark'>('light');\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(600);\n  hoveredPointIndex = signal<number | null>(null);\n  hoveredLineIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  baseMapPaths = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n    return WORLD_MAP_DATA.map(region => getSvgPath(region.polygons, w, h, padding));\n  });\n\n  computedPoints = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n\n    return this.points().map(pt => {\n      const coord = project(pt.lng, pt.lat, w, h, padding);\n      return {\n        x: coord.x,\n        y: coord.y,\n        size: pt.size || 6,\n        color: pt.color || '#4f46e5',\n        raw: pt\n      };\n    });\n  });\n\n  computedLines = computed(() => {\n    const pts = this.computedPoints();\n    return this.lines().map(line => {\n      const p1 = pts[line.fromIndex];\n      const p2 = pts[line.toIndex];\n      const x1 = p1 ? p1.x : 0;\n      const y1 = p1 ? p1.y : 0;\n      const x2 = p2 ? p2.x : 0;\n      const y2 = p2 ? p2.y : 0;\n      const color = line.color || 'rgba(99, 102, 241, 0.45)';\n\n      return {\n        x1, y1, x2, y2,\n        color,\n        dashed: line.dashed || false,\n        strokeWidth: line.strokeWidth || 2,\n        raw: line\n      };\n    });\n  });\n\n  onPointHover(pt: MapPoint, idx: number, event: MouseEvent) {\n    this.hoveredPointIndex.set(idx);\n    this.hoveredLineIndex.set(null);\n    this.tooltip.set({\n      type: 'point',\n      label: pt.label,\n      lat: pt.lat,\n      lng: pt.lng\n    });\n  }\n\n  onPointMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onLineHover(line: MapLine, idx: number, event: MouseEvent) {\n    this.hoveredLineIndex.set(idx);\n    this.hoveredPointIndex.set(null);\n    const fromPt = this.points()[line.fromIndex];\n    const toPt = this.points()[line.toIndex];\n    this.tooltip.set({\n      type: 'line',\n      label: line.label,\n      fromIndex: line.fromIndex,\n      toIndex: line.toIndex,\n      fromLabel: fromPt ? fromPt.label : '',\n      toLabel: toPt ? toPt.label : ''\n    });\n  }\n\n  onLineMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredPointIndex.set(null);\n    this.hoveredLineIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = { points: this.points(), lines: this.lines() };\n    this.exportSvc.downloadJson(data, 'map-line-point-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.points();\n    if (!data.length) return;\n    const headers = ['Label', 'Latitude', 'Longitude', 'Color', 'Size'];\n    const rows = data.map(d => [d.label || '', d.lat, d.lng, d.color || '', d.size || '']);\n    this.exportSvc.downloadCsv(headers, rows, 'map-points-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'chart.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'chart.pdf');\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { fmtNum, scale } from '../shared/chart-utils';\nimport { WORLD_MAP_DATA, getSvgPath, project } from '../shared/map-data';\n\nexport interface FlowNode {\n  id: string;\n  lat: number;\n  lng: number;\n  label?: string;\n  size?: number;\n  color?: string;\n}\n\nexport interface FlowConnection {\n  from: string;\n  to: string;\n  value: number;\n  label?: string;\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-flowmap',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-flowmap\" [class.dark]=\"theme() === 'dark'\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title\">\n          <h4>{{ title() }}</h4>\n        </div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          class=\"map-svg\"\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Base Map Outlines -->\n          <g class=\"map-base\">\n            @for (pathStr of baseMapPaths(); track $index) {\n              <path\n                [attr.d]=\"pathStr\"\n                [attr.fill]=\"theme() === 'dark' ? '#1e293b' : '#f1f5f9'\"\n                [attr.stroke]=\"theme() === 'dark' ? '#0f172a' : '#e2e8f0'\"\n                stroke-width=\"1.2\"\n              />\n            }\n          </g>\n\n          <!-- Curved Flow Connections -->\n          <g class=\"map-flows\">\n            @for (flow of computedFlows(); track $index; let i = $index) {\n              <!-- Background wider hover trigger path -->\n              <path\n                [attr.d]=\"flow.path\"\n                fill=\"none\"\n                stroke=\"transparent\"\n                stroke-width=\"12\"\n                style=\"cursor: pointer;\"\n                (mouseenter)=\"onFlowHover(flow.raw, i, $event)\"\n                (mousemove)=\"onFlowMouseMove($event)\"\n              />\n              \n              <!-- Display Path -->\n              <path\n                [attr.d]=\"flow.path\"\n                fill=\"none\"\n                [attr.stroke]=\"flow.color\"\n                [attr.stroke-width]=\"hoveredFlowIndex() === i ? flow.strokeWidth * 1.6 + 1 : flow.strokeWidth\"\n                [attr.opacity]=\"hoveredFlowIndex() === i ? 0.95 : 0.7\"\n                class=\"flow-path\"\n                [style.animation-duration]=\"flow.duration\"\n              />\n            }\n          </g>\n\n          <!-- Flow Nodes -->\n          <g class=\"map-nodes\">\n            @for (node of computedNodes(); track node.id; let i = $index) {\n              <circle\n                [attr.cx]=\"node.x\"\n                [attr.cy]=\"node.y\"\n                [attr.r]=\"hoveredNodeId() === node.id ? node.size * 1.4 + 2 : node.size\"\n                [attr.fill]=\"node.color\"\n                stroke=\"#ffffff\"\n                [attr.stroke-width]=\"hoveredNodeId() === node.id ? 2.5 : 1.5\"\n                class=\"flow-node\"\n                [class.hovered]=\"hoveredNodeId() === node.id\"\n                (mouseenter)=\"onNodeHover(node.raw, $event)\"\n                (mousemove)=\"onNodeMouseMove($event)\"\n              />\n            }\n          </g>\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n            @if (t.type === 'node') {\n              <div class=\"tt-cat\">{{ t.label || t.id }}</div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Node ID</span>\n                <span class=\"tt-val\">{{ t.id }}</span>\n              </div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Coords</span>\n                <span class=\"tt-val\">{{ t.lat.toFixed(2) }}°, {{ t.lng.toFixed(2) }}°</span>\n              </div>\n            } @else {\n              <div class=\"tt-cat\">Flow Connection</div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Route</span>\n                <span class=\"tt-val\">{{ t.from }} ➔ {{ t.to }}</span>\n              </div>\n              <div class=\"tt-row\">\n                <span class=\"tt-name\">Volume</span>\n                <span class=\"tt-val\">{{ fmtNum(t.value) }}</span>\n              </div>\n              @if (t.label) {\n                <div class=\"tt-row label-row\">\n                  <span class=\"tt-name\">{{ t.label }}</span>\n                </div>\n              }\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-flowmap {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n      transition: background-color 0.3s;\n    }\n    .ngx-flowmap.dark {\n      background: #0f172a;\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: #0f172a;\n      --ngx-chart-tooltip-bg: rgba(15, 23, 42, 0.95);\n      --ngx-chart-tooltip-color: #f8fafc;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      position: relative;\n    }\n    .chart-title h4 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 600;\n      color: var(--ngx-chart-title-color, #1e293b);\n    }\n    .dark .chart-title h4 {\n      color: #f8fafc;\n    }\n\n    .map-svg {\n      display: block;\n      overflow: visible;\n    }\n\n    @keyframes flowMoving {\n      to {\n        stroke-dashoffset: -20;\n      }\n    }\n\n    .flow-path {\n      stroke-dasharray: 6, 4;\n      animation: flowMoving linear infinite;\n      cursor: pointer;\n    }\n    .flow-node {\n      cursor: pointer;\n      transition: r 0.2s cubic-bezier(0.16, 1, 0.3, 1), stroke-width 0.15s;\n    }\n    .flow-node.hovered {\n      filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.3));\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 170px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .label-row {\n      margin-top: 6px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      padding-top: 4px;\n      font-style: italic;\n      color: rgba(255, 255, 255, 0.7);\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Header and Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n  `]\n})\nexport class FlowmapComponent {\n  title = input<string>('Global Logistics Flowmap');\n  nodes = input<FlowNode[]>([]);\n  flows = input<FlowConnection[]>([]);\n  height = input<number>(400);\n  theme = input<'light' | 'dark'>('light');\n  showExport = input<boolean>(false);\n  colors = input<string[]>(['#6366f1', '#3b82f6', '#10b981', '#f59e0b', '#ef4444']);\n\n  containerWidth = signal<number>(600);\n  hoveredNodeId = signal<string | null>(null);\n  hoveredFlowIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  baseMapPaths = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n    return WORLD_MAP_DATA.map(region => getSvgPath(region.polygons, w, h, padding));\n  });\n\n  computedNodes = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n\n    return this.nodes().map(node => {\n      const coord = project(node.lng, node.lat, w, h, padding);\n      return {\n        id: node.id,\n        x: coord.x,\n        y: coord.y,\n        size: node.size || 8,\n        color: node.color || '#4f46e5',\n        raw: node\n      };\n    });\n  });\n\n  private flowValues = computed(() => this.flows().map(f => f.value));\n  private maxFlowVal = computed(() => this.flowValues().length > 0 ? Math.max(...this.flowValues()) : 1);\n  private minFlowVal = computed(() => this.flowValues().length > 0 ? Math.min(...this.flowValues()) : 0);\n\n  computedFlows = computed(() => {\n    const nodesMap = new Map<string, { x: number; y: number }>();\n    this.computedNodes().forEach(n => nodesMap.set(n.id.toUpperCase(), { x: n.x, y: n.y }));\n\n    const maxVal = this.maxFlowVal();\n    const minVal = this.minFlowVal();\n\n    return this.flows().map((flow, index) => {\n      const p1 = nodesMap.get(flow.from.toUpperCase());\n      const p2 = nodesMap.get(flow.to.toUpperCase());\n      \n      const x1 = p1 ? p1.x : 0;\n      const y1 = p1 ? p1.y : 0;\n      const x2 = p2 ? p2.x : 0;\n      const y2 = p2 ? p2.y : 0;\n\n      // Quadratic Bezier math\n      // Midpoint:\n      const mx = (x1 + x2) / 2;\n      const my = (y1 + y2) / 2;\n      \n      // Delta\n      const dx = x2 - x1;\n      const dy = y2 - y1;\n      const len = Math.sqrt(dx*dx + dy*dy) || 1;\n      \n      // Curvature offset (perpendicular to direction)\n      const curOffset = len * 0.18;\n      const cx = mx - (dy / len) * curOffset;\n      const cy = my + (dx / len) * curOffset;\n\n      const path = `M ${x1.toFixed(1)} ${y1.toFixed(1)} Q ${cx.toFixed(1)} ${cy.toFixed(1)} ${x2.toFixed(1)} ${y2.toFixed(1)}`;\n      \n      // Scaling line thickness: 1.5px to 6px\n      const strokeWidth = scale(flow.value, minVal, maxVal, 1.5, 6);\n      \n      // Animation duration: higher value (faster flow) is shorter duration\n      const duration = scale(flow.value, minVal, maxVal, 2.5, 0.8) + 's';\n\n      const color = flow.color || this.colors()[index % this.colors().length];\n\n      return {\n        path,\n        strokeWidth,\n        duration,\n        color,\n        raw: flow\n      };\n    });\n  });\n\n  onNodeHover(node: FlowNode, event: MouseEvent) {\n    this.hoveredNodeId.set(node.id);\n    this.hoveredFlowIndex.set(null);\n    this.tooltip.set({\n      type: 'node',\n      id: node.id,\n      label: node.label,\n      lat: node.lat,\n      lng: node.lng\n    });\n  }\n\n  onNodeMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onFlowHover(flow: FlowConnection, idx: number, event: MouseEvent) {\n    this.hoveredFlowIndex.set(idx);\n    this.hoveredNodeId.set(null);\n    this.tooltip.set({\n      type: 'flow',\n      from: flow.from,\n      to: flow.to,\n      value: flow.value,\n      label: flow.label\n    });\n  }\n\n  onFlowMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredNodeId.set(null);\n    this.hoveredFlowIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = { nodes: this.nodes(), flows: this.flows() };\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'flowmap-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.flows();\n    if (!data.length) return;\n    let csv = 'FromNode,ToNode,Volume,Label\\n';\n    data.forEach(d => {\n      csv += `\"${d.from}\",\"${d.to}\",${d.value},\"${d.label || ''}\"\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'flowmap-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'flowmap.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgClone = svg.cloneNode(true) as SVGElement;\n    svgClone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n    const svgString = new XMLSerializer().serializeToString(svgClone);\n    \n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body {\n              margin: 0;\n              display: flex;\n              justify-content: center;\n              align-items: center;\n              height: 100vh;\n              background-color: #ffffff;\n              font-family: system-ui, sans-serif;\n            }\n            .print-container {\n              text-align: center;\n              width: 100%;\n              max-width: 800px;\n              padding: 20px;\n            }\n            svg {\n              width: 100%;\n              height: auto;\n              max-height: 90vh;\n            }\n            @media print {\n              body {\n                background: none;\n              }\n              .print-container {\n                max-width: 100%;\n                padding: 0;\n              }\n              svg {\n                page-break-inside: avoid;\n              }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${svgString}\n          </div>\n          <script>\n            window.onload = () => {\n              window.print();\n              window.close();\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, viewChild\n} from '@angular/core';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\nimport { fmtNum, scale } from '../shared/chart-utils';\nimport { WORLD_MAP_DATA, getSvgPath, project } from '../shared/map-data';\n\nexport interface GeoHeatmapPoint {\n  lat: number;\n  lng: number;\n  weight: number;\n}\n\ninterface HeatmapCell {\n  x: number;\n  y: number;\n  weight: number;\n  lat: number;\n  lng: number;\n  color: string;\n  radius: number;\n}\n\n@Component({\n  selector: 'ngx-geo-heatmap',\n  standalone: true,\n  imports: [ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-geo-heatmap\" [class.dark]=\"theme() === 'dark'\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"onMouseLeave()\">\n        <div class=\"chart-title\">\n          <h4>{{ title() }}</h4>\n        </div>\n        \n        <!-- Legend -->\n        @if (showLegend() && computedCells().length > 0) {\n          <div class=\"chart-legend\" (mousemove)=\"$event.stopPropagation()\">\n            <span class=\"legend-label\">Low</span>\n            <div class=\"legend-bar\" [style.background]=\"legendGradient()\"></div>\n            <span class=\"legend-label\">High</span>\n          </div>\n        }\n\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"chart-svg-container\" #container>\n        <svg\n          #svgEl\n          class=\"map-svg\"\n          [attr.width]=\"'100%'\"\n          [attr.height]=\"height()\"\n        >\n          <defs>\n            <filter id=\"heatmap-blur-filter\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n              <feGaussianBlur stdDeviation=\"12\" />\n            </filter>\n          </defs>\n\n          <!-- Base Map Outlines -->\n          <g class=\"map-base\">\n            @for (pathStr of baseMapPaths(); track $index) {\n              <path\n                [attr.d]=\"pathStr\"\n                [attr.fill]=\"theme() === 'dark' ? '#1e293b' : '#f1f5f9'\"\n                [attr.stroke]=\"theme() === 'dark' ? '#0f172a' : '#e2e8f0'\"\n                stroke-width=\"1.2\"\n              />\n            }\n          </g>\n\n          <!-- Heatmap Overlay -->\n          <g class=\"map-heatmap\" [attr.filter]=\"blur() ? 'url(#heatmap-blur-filter)' : null\">\n            @for (cell of computedCells(); track $index) {\n              <circle\n                [attr.cx]=\"cell.x\"\n                [attr.cy]=\"cell.y\"\n                [attr.r]=\"cell.radius\"\n                [attr.fill]=\"cell.color\"\n                [attr.opacity]=\"theme() === 'dark' ? 0.65 : 0.55\"\n                class=\"heatmap-blob\"\n              />\n            }\n          </g>\n\n          <!-- Heatmap Interactive Hover Overlay -->\n          <!-- We render smaller invisible trigger circles to capture mouse pointer events for tooltips -->\n          <g class=\"map-triggers\">\n            @for (cell of computedCells(); track $index; let i = $index) {\n              <circle\n                [attr.cx]=\"cell.x\"\n                [attr.cy]=\"cell.y\"\n                [attr.r]=\"cell.radius * 0.8\"\n                fill=\"transparent\"\n                style=\"cursor: pointer;\"\n                (mouseenter)=\"onCellHover(cell, i, $event)\"\n                (mousemove)=\"onCellMouseMove($event)\"\n              />\n            }\n          </g>\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n            <div class=\"tt-cat\">Density Zone</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Center Coords</span>\n              <span class=\"tt-val\">{{ t.lat.toFixed(2) }}°, {{ t.lng.toFixed(2) }}°</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Weight Intensity</span>\n              <span class=\"tt-val\">{{ fmtNum(t.weight) }}</span>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-geo-heatmap {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n      transition: background-color 0.3s;\n    }\n    .ngx-geo-heatmap.dark {\n      background: #0f172a;\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: #0f172a;\n      --ngx-chart-tooltip-bg: rgba(15, 23, 42, 0.95);\n      --ngx-chart-tooltip-color: #f8fafc;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      position: relative;\n    }\n    .chart-title h4 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 600;\n      color: var(--ngx-chart-title-color, #1e293b);\n    }\n    .dark .chart-title h4 {\n      color: #f8fafc;\n    }\n\n    /* Legend */\n    .chart-legend {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-bottom: 16px;\n      justify-content: flex-end;\n    }\n    .legend-label {\n      font-size: 11px;\n      color: #64748b;\n      font-weight: 600;\n    }\n    .dark .legend-label {\n      color: #94a3b8;\n    }\n    .legend-bar {\n      width: 100px;\n      height: 10px;\n      border-radius: 4px;\n    }\n\n    .map-svg {\n      display: block;\n      overflow: visible;\n    }\n    .heatmap-blob {\n      mix-blend-mode: multiply;\n      pointer-events: none;\n    }\n    .dark .heatmap-blob {\n      mix-blend-mode: screen;\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-10px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Export styles removed */\n    .chart-svg-container {\n      position: relative;\n      width: 100%;\n    }\n  `]\n})\nexport class GeoHeatmapComponent {\n  private readonly exportSvc = inject(ChartExportService);\n\n  title = input<string>('Geographical Heatmap');\n  data = input<GeoHeatmapPoint[]>([]);\n  height = input<number>(400);\n  gridSize = input<number>(10); // degrees, standard cell subdivision size\n  colors = input<string[]>(['#10b981', '#fbbf24', '#ef4444']); // Low, Med, High\n  blur = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  showExport = input<boolean>(false);\n  theme = input<'light' | 'dark'>('light');\n\n  containerWidth = signal<number>(600);\n  hoveredCellIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  legendGradient = computed(() => {\n    const cols = this.colors();\n    return `linear-gradient(to right, ${cols.join(', ')})`;\n  });\n\n  baseMapPaths = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n    return WORLD_MAP_DATA.map(region => getSvgPath(region.polygons, w, h, padding));\n  });\n\n  computedCells = computed(() => {\n    const rawData = this.data();\n    const size = Math.max(1, this.gridSize());\n    \n    // Group/bin points into a grid\n    const grid = new Map<string, { weight: number; lat: number; lng: number }>();\n    \n    rawData.forEach(pt => {\n      // Find grid cell center\n      const latBin = Math.floor(pt.lat / size) * size + size / 2;\n      const lngBin = Math.floor(pt.lng / size) * size + size / 2;\n      const key = `${latBin},${lngBin}`;\n      \n      const existing = grid.get(key) || { weight: 0, lat: latBin, lng: lngBin };\n      existing.weight += pt.weight;\n      grid.set(key, existing);\n    });\n\n    const w = this.containerWidth();\n    const h = this.height();\n    const padding = { top: 10, right: 10, bottom: 10, left: 10 };\n\n    const cells = Array.from(grid.values());\n    if (cells.length === 0) return [];\n\n    const weights = cells.map(c => c.weight);\n    const maxWeight = Math.max(...weights);\n    const minWeight = Math.min(...weights);\n\n    return cells.map(cell => {\n      const coord = project(cell.lng, cell.lat, w, h, padding);\n      \n      // Interpolate colors based on weight (low, medium, high support)\n      const range = maxWeight - minWeight || 1;\n      const factor = Math.max(0, Math.min(1, (cell.weight - minWeight) / range));\n      const color = this.getHeatmapColor(factor);\n\n      // Map radius based on viewport size and weight\n      // Larger weight -> larger radius blob\n      const baseR = scale(size, 1, 45, 10, 80);\n      const radius = scale(cell.weight, minWeight, maxWeight, baseR * 0.7, baseR * 1.5);\n\n      return {\n        x: coord.x,\n        y: coord.y,\n        lat: cell.lat,\n        lng: cell.lng,\n        weight: cell.weight,\n        color,\n        radius\n      };\n    });\n  });\n\n  onCellHover(cell: HeatmapCell, index: number, event: MouseEvent) {\n    this.hoveredCellIndex.set(index);\n    this.tooltip.set({\n      lat: cell.lat,\n      lng: cell.lng,\n      weight: cell.weight\n    });\n  }\n\n  onCellMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredCellIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = this.data();\n    if (!data.length) return;\n    this.exportSvc.downloadJson(data, 'geo-heatmap-data.json');\n  }\n\n  exportToCsv(): void {\n    const data = this.data();\n    if (!data.length) return;\n    const headers = ['Latitude', 'Longitude', 'Weight'];\n    const rows = data.map(d => [d.lat, d.lng, d.weight]);\n    this.exportSvc.downloadCsv(headers, rows, 'geo-heatmap-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'geo-heatmap.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Geographical Heatmap', 'geo-heatmap.pdf');\n  }\n\n  private getHeatmapColor(factor: number): string {\n    const cols = this.colors();\n    if (cols.length < 2) return cols[0] || '#ef4444';\n    \n    // Scale factor to segments\n    const segments = cols.length - 1;\n    const scaledFactor = factor * segments;\n    const index = Math.floor(scaledFactor);\n    const segmentFactor = scaledFactor - index;\n    \n    const c1 = cols[Math.min(index, cols.length - 1)];\n    const c2 = cols[Math.min(index + 1, cols.length - 1)];\n    \n    return this.interpolateColor(c1, c2, Math.max(0, Math.min(1, segmentFactor)));\n  }\n\n  private interpolateColor(color1: string, color2: string, factor: number): string {\n    const c1 = this.parseHex(color1);\n    const c2 = this.parseHex(color2);\n    const r = Math.round(c1.r + factor * (c2.r - c1.r));\n    const g = Math.round(c1.g + factor * (c2.g - c1.g));\n    const b = Math.round(c1.b + factor * (c2.b - c1.b));\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n\n  private parseHex(hex: string) {\n    let clean = hex.replace('#', '');\n    if (clean.length === 3) {\n      clean = clean.split('').map(c => c + c).join('');\n    }\n    const num = parseInt(clean, 16);\n    return {\n      r: (num >> 16) & 255,\n      g: (num >> 8) & 255,\n      b: num & 255\n    };\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, viewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface MapMarker {\n  lat: number;\n  lng: number;\n  label?: string;\n}\n\n@Component({\n  selector: 'ngx-tiled-web-map',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div \n      class=\"ngx-tiled-web-map\" \n      [class.dark]=\"theme() === 'dark'\"\n      (mouseleave)=\"onMouseLeave()\"\n    >\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\">\n        <div class=\"chart-title\">\n          <h4>{{ title() }}</h4>\n        </div>\n        \n        <!-- Controls & Zoom -->\n        <div class=\"map-controls\">\n          <button class=\"ctrl-btn\" (click)=\"zoomIn()\" aria-label=\"Zoom In\">➕</button>\n          <button class=\"ctrl-btn\" (click)=\"zoomOut()\" aria-label=\"Zoom Out\">➖</button>\n          <button class=\"ctrl-btn Reset\" (click)=\"resetMap()\" aria-label=\"Reset Map\">🔄 Reset</button>\n        </div>\n\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Map viewport -->\n      <div \n        class=\"map-viewport\" \n        #container\n        [style.height.px]=\"height()\"\n        (mousedown)=\"onMouseDown($event)\"\n        (mousemove)=\"onMouseMove($event)\"\n        (mouseup)=\"onMouseUp()\"\n        (mouseleave)=\"onMouseUp()\"\n        style=\"cursor: grab;\"\n        [style.cursor]=\"isDragging() ? 'grabbing' : 'grab'\"\n      >\n        <!-- Tile Container Grid -->\n        <div class=\"tiles-container\">\n          @for (tile of computedTiles(); track tile.key) {\n            <img \n              [src]=\"tile.url\" \n              [style.left.px]=\"tile.x\" \n              [style.top.px]=\"tile.y\" \n              class=\"map-tile\"\n              draggable=\"false\"\n              alt=\"Map Tile\"\n            />\n          }\n        </div>\n\n        <!-- Overlays (SVG for markers and info) -->\n        <svg \n          #svgEl\n          class=\"overlay-svg\"\n          [attr.width]=\"containerWidth()\"\n          [attr.height]=\"height()\"\n        >\n          <!-- Markers -->\n          <g>\n            @for (marker of computedMarkers(); track $index; let i = $index) {\n              <!-- Marker Pin -->\n              <g \n                [attr.transform]=\"'translate(' + marker.x + ',' + marker.y + ')'\"\n                class=\"marker-group\"\n                (mouseenter)=\"onMarkerHover(marker.raw, i, $event)\"\n                (mousemove)=\"onMarkerMouseMove($event)\"\n                style=\"cursor: pointer;\"\n              >\n                <!-- Pin Path -->\n                <path \n                  d=\"M0 -24 C-6 -24 -11 -19 -11 -13 C-11 -4 0 0 0 0 C0 0 11 -4 11 -13 C11 -19 6 -24 0 -24 Z\" \n                  fill=\"#ef4444\" \n                  stroke=\"#ffffff\"\n                  stroke-width=\"1.5\"\n                />\n                <!-- Inner Dot -->\n                <circle cx=\"0\" cy=\"-13\" r=\"3.5\" fill=\"#ffffff\" />\n              </g>\n            }\n          </g>\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (tooltip(); as t) {\n          <div class=\"chart-tooltip\" [style.left.px]=\"tooltipX()\" [style.top.px]=\"tooltipY()\">\n            <div class=\"tt-cat\">{{ t.label || 'Location Pin' }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Lat</span>\n              <span class=\"tt-val\">{{ t.lat.toFixed(4) }}°</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Lng</span>\n              <span class=\"tt-val\">{{ t.lng.toFixed(4) }}°</span>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n    }\n    .ngx-tiled-web-map {\n      background: var(--ngx-chart-bg, #ffffff);\n      border-radius: 16px;\n      padding: 16px;\n      box-sizing: border-box;\n      font-family: var(--ngx-font-family, system-ui, sans-serif);\n      position: relative;\n      width: 100%;\n      user-select: none;\n      transition: background-color 0.3s;\n    }\n    .ngx-tiled-web-map.dark {\n      background: #0f172a;\n      border: 1px solid rgba(255, 255, 255, 0.05);\n      --ngx-chart-bg: #0f172a;\n      --ngx-chart-tooltip-bg: rgba(15, 23, 42, 0.95);\n      --ngx-chart-tooltip-color: #f8fafc;\n    }\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n      position: relative;\n    }\n    .chart-title h4 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 600;\n      color: var(--ngx-chart-title-color, #1e293b);\n    }\n    .dark .chart-title h4 {\n      color: #f8fafc;\n    }\n\n    /* Controls */\n    .map-controls {\n      display: flex;\n      gap: 6px;\n      margin-right: 80px;\n    }\n    .ctrl-btn {\n      padding: 4px 8px;\n      font-size: 11px;\n      font-weight: 600;\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(6px);\n      border: 1px solid #e2e8f0;\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .ctrl-btn:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .dark .ctrl-btn {\n      background: rgba(30, 41, 59, 0.8);\n      border-color: rgba(255, 255, 255, 0.08);\n      color: #f8fafc;\n    }\n    .dark .ctrl-btn:hover {\n      background: #1e293b;\n      color: #38bdf8;\n      border-color: #38bdf8;\n    }\n\n    /* Viewport */\n    .map-viewport {\n      position: relative;\n      width: 100%;\n      border-radius: 10px;\n      overflow: hidden;\n      background: #e5e9f0;\n      border: 1px solid #e2e8f0;\n    }\n    .dark .map-viewport {\n      background: #1e293b;\n      border-color: rgba(255, 255, 255, 0.08);\n    }\n\n    /* Tiles container */\n    .tiles-container {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n    }\n    .map-tile {\n      position: absolute;\n      width: 256px;\n      height: 256px;\n      display: block;\n    }\n\n    /* SVG Overlay */\n    .overlay-svg {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n      overflow: visible;\n    }\n    .marker-group {\n      pointer-events: auto;\n    }\n    .marker-group path {\n      transition: fill 0.15s, transform 0.15s;\n    }\n    .marker-group:hover path {\n      fill: #dc2626;\n      transform: scale(1.1);\n    }\n\n    /* Glassmorphic Tooltip */\n    .chart-tooltip {\n      position: absolute;\n      pointer-events: none;\n      transform: translate(-50%, -100%) translateY(-30px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 12px;\n      min-width: 140px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12.5px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n\n    /* Header and Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class TiledWebMapComponent {\n  title = input<string>('Interactive World Map');\n  defaultCenter = input<{ lat: number; lng: number }>({ lat: 20, lng: 0 });\n  defaultZoom = input<number>(2);\n  markers = input<MapMarker[]>([]);\n  height = input<number>(450);\n  theme = input<'light' | 'dark'>('light');\n  showExport = input<boolean>(false);\n\n  containerWidth = signal<number>(800);\n  mapCenter = signal<{ lat: number; lng: number }>({ lat: 20, lng: 0 });\n  mapZoom = signal<number>(2);\n\n  // Panning State\n  isDragging = signal<boolean>(false);\n  private dragStartX = 0;\n  private dragStartY = 0;\n  private dragStartCenter = { lat: 0, lng: 0 };\n\n  // Tooltip State\n  hoveredMarkerIndex = signal<number | null>(null);\n  tooltip = signal<any | null>(null);\n  tooltipX = signal<number>(0);\n  tooltipY = signal<number>(0);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  private container = viewChild<ElementRef>('container');\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    \n    // Watch dimensions\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) {\n          this.containerWidth.set(width);\n        }\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n\n    // Set initial configuration\n    this.mapCenter.set(this.defaultCenter());\n    this.mapZoom.set(this.defaultZoom());\n  }\n\n  // Slippy map computations\n  // Fractional center point in tile coordinates\n  centerTileCoords = computed(() => {\n    const lat = Math.max(-85, Math.min(85, this.mapCenter().lat));\n    const lng = this.mapCenter().lng;\n    const zoom = this.mapZoom();\n    const n = Math.pow(2, zoom);\n\n    const xFrac = ((lng + 180) / 360) * n;\n    const latRad = (lat * Math.PI) / 180;\n    const yFrac = ((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * n;\n\n    return { x: xFrac, y: yFrac, n };\n  });\n\n  // Compute standard tile grid overlap\n  computedTiles = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const { x: xc, y: yc, n } = this.centerTileCoords();\n    const zoom = this.mapZoom();\n\n    // Viewport left and top in tile pixels (each tile is 256px)\n    const viewLeft = xc * 256 - w / 2;\n    const viewTop = yc * 256 - h / 2;\n\n    const minTx = Math.max(0, Math.floor(viewLeft / 256));\n    const maxTx = Math.min(n - 1, Math.floor((viewLeft + w) / 256));\n    const minTy = Math.max(0, Math.floor(viewTop / 256));\n    const maxTy = Math.min(n - 1, Math.floor((viewTop + h) / 256));\n\n    const tiles: { key: string; url: string; x: number; y: number }[] = [];\n\n    for (let tx = minTx; tx <= maxTx; tx++) {\n      for (let ty = minTy; ty <= maxTy; ty++) {\n        // Pixel offsets relative to container\n        const xOffset = tx * 256 - viewLeft;\n        const yOffset = ty * 256 - viewTop;\n        \n        // Clean URL to OSM tiles (SSL secure, subdomain-less)\n        const url = `https://tile.openstreetmap.org/${zoom}/${tx}/${ty}.png`;\n        \n        tiles.push({\n          key: `${zoom}-${tx}-${ty}`,\n          url,\n          x: xOffset,\n          y: yOffset\n        });\n      }\n    }\n\n    return tiles;\n  });\n\n  // Project marker locations to pixel coordinates relative to the viewport\n  computedMarkers = computed(() => {\n    const w = this.containerWidth();\n    const h = this.height();\n    const { x: xc, y: yc, n } = this.centerTileCoords();\n\n    const viewLeft = xc * 256 - w / 2;\n    const viewTop = yc * 256 - h / 2;\n\n    return this.markers().map(marker => {\n      const lat = Math.max(-85, Math.min(85, marker.lat));\n      const lng = marker.lng;\n\n      // Project\n      const mxFrac = ((lng + 180) / 360) * n;\n      const mLatRad = (lat * Math.PI) / 180;\n      const myFrac = ((1 - Math.log(Math.tan(mLatRad) + 1 / Math.cos(mLatRad)) / Math.PI) / 2) * n;\n\n      const px = mxFrac * 256 - viewLeft;\n      const py = myFrac * 256 - viewTop;\n\n      return {\n        x: px,\n        y: py,\n        raw: marker\n      };\n    });\n  });\n\n  // Map Controls\n  zoomIn() {\n    this.mapZoom.set(Math.min(18, this.mapZoom() + 1));\n  }\n\n  zoomOut() {\n    this.mapZoom.set(Math.max(0, this.mapZoom() - 1));\n  }\n\n  resetMap() {\n    this.mapCenter.set(this.defaultCenter());\n    this.mapZoom.set(this.defaultZoom());\n  }\n\n  // Interactive Drag Panning\n  onMouseDown(event: MouseEvent) {\n    // Avoid dragging conflict with header/buttons\n    if ((event.target as HTMLElement).closest('.chart-header') || (event.target as HTMLElement).closest('.map-controls')) {\n      return;\n    }\n    event.preventDefault();\n    this.isDragging.set(true);\n    this.dragStartX = event.clientX;\n    this.dragStartY = event.clientY;\n    this.dragStartCenter = { ...this.mapCenter() };\n  }\n\n  onMouseMove(event: MouseEvent) {\n    if (!this.isDragging()) return;\n\n    const dx = event.clientX - this.dragStartX;\n    const dy = event.clientY - this.dragStartY;\n\n    const zoom = this.mapZoom();\n    const n = Math.pow(2, zoom);\n\n    // Convert pixel delta back to lat/lng using center values\n    const lat = Math.max(-85, Math.min(85, this.dragStartCenter.lat));\n    const lng = this.dragStartCenter.lng;\n\n    // Center tile coord at start\n    const xcStart = ((lng + 180) / 360) * n;\n    const latRadStart = (lat * Math.PI) / 180;\n    const ycStart = ((1 - Math.log(Math.tan(latRadStart) + 1 / Math.cos(latRadStart)) / Math.PI) / 2) * n;\n\n    // Shift center by negative pixel offsets\n    const xcNew = xcStart - (dx / 256);\n    const ycNew = ycStart - (dy / 256);\n\n    // Convert back to lng\n    const newLng = (xcNew / n) * 360 - 180;\n\n    // Convert back to lat (using Gudermannian/sinh math)\n    const sinhVal = Math.sinh(Math.PI * (1 - 2 * (ycNew / n)));\n    const newLat = (Math.atan(sinhVal) * 180) / Math.PI;\n\n    // Keep longitude bounded within -180 and 180 (cycling around)\n    let finalLng = newLng % 360;\n    if (finalLng < -180) finalLng += 360;\n    if (finalLng > 180) finalLng -= 360;\n\n    this.mapCenter.set({\n      lat: Math.max(-85, Math.min(85, newLat)),\n      lng: finalLng\n    });\n  }\n\n  onMouseUp() {\n    this.isDragging.set(false);\n  }\n\n  // Hover markers\n  onMarkerHover(marker: MapMarker, index: number, event: MouseEvent) {\n    this.hoveredMarkerIndex.set(index);\n    this.tooltip.set({\n      label: marker.label,\n      lat: marker.lat,\n      lng: marker.lng\n    });\n  }\n\n  onMarkerMouseMove(event: MouseEvent) {\n    const containerEl = this.container()?.nativeElement;\n    if (containerEl) {\n      const rect = containerEl.getBoundingClientRect();\n      this.tooltipX.set(event.clientX - rect.left);\n      this.tooltipY.set(event.clientY - rect.top);\n    }\n  }\n\n  onMouseLeave() {\n    this.hoveredMarkerIndex.set(null);\n    this.tooltip.set(null);\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const data = {\n      center: this.mapCenter(),\n      zoom: this.mapZoom(),\n      markers: this.markers()\n    };\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tiled-map-state.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const data = this.markers();\n    if (!data.length) return;\n    let csv = 'Label,Latitude,Longitude\\n';\n    data.forEach(d => {\n      csv += `\"${d.label || ''}\",${d.lat},${d.lng}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'tiled-map-markers.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  // Renders the current layout as SVG representation\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    if (!source.match(/^<svg[^>]+xmlns\\:xlink=\"http\\:\\/\\/www\\.w3\\.org\\/1999\\/xlink\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'map-overlay.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    // Generate a print representation of the actual DOM viewport so that raster tiles print nicely\n    const containerEl = this.container()?.nativeElement;\n    if (!containerEl) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    \n    // Copy HTML contents containing both tile images and SVGs\n    const htmlString = containerEl.innerHTML;\n    const width = this.containerWidth();\n    const height = this.height();\n\n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF - Tiled Web Map</title>\n          <style>\n            body {\n              margin: 0;\n              display: flex;\n              justify-content: center;\n              align-items: center;\n              height: 100vh;\n              background-color: #ffffff;\n              font-family: system-ui, sans-serif;\n            }\n            .print-container {\n              position: relative;\n              width: ${width}px;\n              height: ${height}px;\n              overflow: hidden;\n              background: #e5e9f0;\n              border: 1px solid #cbd5e1;\n              box-sizing: border-box;\n            }\n            .tiles-container {\n              position: absolute;\n              top: 0;\n              left: 0;\n              width: 100%;\n              height: 100%;\n            }\n            .map-tile {\n              position: absolute;\n              width: 256px;\n              height: 256px;\n              display: block;\n            }\n            svg {\n              position: absolute;\n              top: 0;\n              left: 0;\n              width: 100%;\n              height: 100%;\n              overflow: visible;\n            }\n            @media print {\n              body {\n                background: none;\n              }\n              .print-container {\n                page-break-inside: avoid;\n              }\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"print-container\">\n            ${htmlString}\n          </div>\n          <script>\n            window.onload = () => {\n              // Wait for image tiles to download before print dialog\n              setTimeout(() => {\n                window.print();\n                window.close();\n              }, 600);\n            };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n}\n","import {\n  Component, input, output, signal, computed, ChangeDetectionStrategy,\n  ElementRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { smoothPath, niceTicks, fmtNum } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-token-streaming-chart',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-token-stream-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\">\n        <div class=\"chart-title-space\">\n          <div class=\"stream-title\">\n            <span class=\"pulse-indicator\"></span>\n            {{ title() }}\n          </div>\n          <div class=\"stream-subtitle\">\n            TPS: <span class=\"highlight-val\">{{ currentTps() }}</span> | Total Tokens: <span class=\"highlight-val\">{{ points().length }}</span>\n          </div>\n        </div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      <div class=\"ngx-token-stream-container\" [style.height.px]=\"height()\">\n        <svg\n          #svgEl\n          class=\"ngx-token-stream-svg\"\n          [attr.viewBox]=\"viewBoxString()\"\n          [attr.height]=\"height()\"\n          preserveAspectRatio=\"none\"\n          (mousemove)=\"onMouseMove($event)\"\n          (mouseleave)=\"hoveredIndex.set(null)\"\n        >\n          <!-- Grid Lines (Horizontal) -->\n          @for (yVal of gridYLines(); track yVal) {\n            <line\n              [attr.x1]=\"viewBoxX()\"\n              [attr.x2]=\"viewBoxX() + chartWidth\"\n              [attr.y1]=\"yVal\"\n              [attr.y2]=\"yVal\"\n              class=\"grid-line\"\n            />\n          }\n\n          <!-- Y-axis tick labels -->\n          @for (tick of yAxisTicks(); track tick.val) {\n            <text\n              [attr.x]=\"viewBoxX() - 2\"\n              [attr.y]=\"tick.y\"\n              class=\"axis-label\"\n              text-anchor=\"end\"\n              dominant-baseline=\"middle\"\n            >{{ tick.label }}</text>\n          }\n\n          <!-- X-axis tick labels -->\n          @for (tick of xAxisTicks(); track tick.index) {\n            <text\n              [attr.x]=\"tick.x\"\n              [attr.y]=\"height() - 2\"\n              class=\"axis-label\"\n              text-anchor=\"middle\"\n              dominant-baseline=\"auto\"\n            >{{ tick.index }}</text>\n          }\n\n          <!-- Threshold line -->\n          @if (threshold() !== null) {\n            <line\n              [attr.x1]=\"viewBoxX()\"\n              [attr.x2]=\"viewBoxX() + chartWidth\"\n              [attr.y1]=\"thresholdY()\"\n              [attr.y2]=\"thresholdY()\"\n              class=\"threshold-line\"\n            />\n            <text\n              [attr.x]=\"viewBoxX() + chartWidth + 4\"\n              [attr.y]=\"thresholdY()\"\n              class=\"threshold-label\"\n              dominant-baseline=\"middle\"\n            >{{ threshold() }}</text>\n          }\n\n          <!-- Area under path (linear gradient) -->\n          <defs>\n            <linearGradient [attr.id]=\"'stream-area-grad-' + instanceId\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n              <stop offset=\"0%\" [attr.stop-color]=\"colors()[0]\" stop-opacity=\"0.25\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"colors()[0]\" stop-opacity=\"0\" />\n            </linearGradient>\n          </defs>\n\n          @if (points().length > 1) {\n            <!-- Shaded Area -->\n            <path\n              [attr.d]=\"areaPath()\"\n              [attr.fill]=\"'url(#stream-area-grad-' + instanceId + ')'\"\n              stroke=\"none\"\n            />\n            \n            <!-- Stroke Path -->\n            <path\n              [attr.d]=\"linePath()\"\n              [attr.stroke]=\"colors()[0]\"\n              stroke-width=\"2.5\"\n              fill=\"none\"\n              stroke-linejoin=\"round\"\n              stroke-linecap=\"round\"\n            />\n          }\n\n          <!-- Guide / Tracker elements -->\n          @if (activePoint(); as ap) {\n            <line\n              [attr.x1]=\"ap.x\"\n              [attr.x2]=\"ap.x\"\n              [attr.y1]=\"0\"\n              [attr.y2]=\"height()\"\n              class=\"tracker-guide-line\"\n            />\n            <circle\n              [attr.cx]=\"ap.x\"\n              [attr.cy]=\"ap.y\"\n              r=\"6\"\n              [attr.fill]=\"colors()[0]\"\n              fill-opacity=\"0.3\"\n              class=\"tracker-glowing-ring\"\n            />\n            <circle\n              [attr.cx]=\"ap.x\"\n              [attr.cy]=\"ap.y\"\n              r=\"3\"\n              [attr.fill]=\"colors()[0]\"\n              stroke=\"#ffffff\"\n              stroke-width=\"1\"\n            />\n          }\n        </svg>\n\n        <!-- Glassmorphic Tooltip -->\n        @if (activePoint(); as ap) {\n          <div\n            class=\"stream-tooltip\"\n            [style.left.px]=\"ap.screenX\"\n            [style.top.px]=\"ap.screenY\"\n          >\n            <div class=\"tt-cat\">Token #{{ ap.index + 1 }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"colors()[0]\"></span>\n              <span class=\"tt-name\">Speed / Value</span>\n              <span class=\"tt-val\">{{ ap.val.toFixed(1) }} ms/tok</span>\n            </div>\n            <div class=\"tt-row action-row\">\n              <button class=\"tt-action-btn\" (click)=\"onTooltipAction(ap.index, ap.val)\">\n                Ask Agent to Analyze\n              </button>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-token-stream-wrapper {\n      width: 100%;\n      height: 100%;\n      padding: 16px 20px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n    .ngx-token-stream-container {\n      position: relative;\n      width: 100%;\n      overflow: hidden;\n    }\n    .ngx-token-stream-svg {\n      width: 100%;\n      height: 100%;\n      display: block;\n      overflow: visible;\n      cursor: crosshair;\n    }\n    .grid-line {\n      stroke: var(--ngx-chart-grid, #e2e8f0);\n      stroke-width: 1px;\n      stroke-dasharray: 4,4;\n    }\n    .axis-label {\n      font-size: 9px;\n      fill: var(--ngx-chart-axis-text, #94a3b8);\n      font-family: monospace;\n    }\n    .threshold-line {\n      stroke: #ef4444;\n      stroke-width: 1.5px;\n      stroke-dasharray: 6,3;\n      stroke-opacity: 0.8;\n    }\n    .threshold-label {\n      font-size: 9px;\n      fill: #ef4444;\n      font-family: monospace;\n      font-weight: 600;\n    }\n    .tracker-guide-line {\n      stroke: rgba(99, 102, 241, 0.4);\n      stroke-width: 1px;\n      stroke-dasharray: 2,2;\n      pointer-events: none;\n    }\n    .tracker-glowing-ring {\n      pointer-events: none;\n      animation: ringPulse 1.2s infinite alternate;\n    }\n    @keyframes ringPulse {\n      from { r: 5px; fill-opacity: 0.2; }\n      to { r: 8px; fill-opacity: 0.5; }\n    }\n    \n    /* Header and Subtitles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n    }\n    .stream-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--text-primary, #1e293b);\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .stream-subtitle {\n      font-size: 11px;\n      color: var(--text-secondary, #64748b);\n      margin-top: 2px;\n    }\n    .highlight-val {\n      font-weight: 700;\n      color: #6366f1;\n      font-family: monospace;\n    }\n    .pulse-indicator {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      background: #22c55e;\n      box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7);\n      animation: pulse 1.5s infinite;\n    }\n    @keyframes pulse {\n      0% {\n        transform: scale(0.95);\n        box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7);\n      }\n      70% {\n        transform: scale(1);\n        box-shadow: 0 0 0 6px rgba(34, 197, 94, 0);\n      }\n      100% {\n        transform: scale(0.95);\n        box-shadow: 0 0 0 0 rgba(34, 197, 94, 0);\n      }\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .stream-tooltip {\n      position: absolute;\n      z-index: 100;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -115%);\n      min-width: 150px;\n      pointer-events: auto; /* Enable buttons inside tooltip */\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n    .action-row {\n      margin-top: 8px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      padding-top: 6px;\n      justify-content: center;\n    }\n    .tt-action-btn {\n      background: #4f46e5;\n      color: #ffffff;\n      border: none;\n      border-radius: 4px;\n      padding: 4px 8px;\n      font-size: 10px;\n      cursor: pointer;\n      font-weight: 600;\n      transition: all 0.15s;\n      width: 100%;\n    }\n    .tt-action-btn:hover {\n      background: #6366f1;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class TokenStreamingChartComponent {\n  title = input<string>('Real-Time Token Stream');\n  windowSize = input<number>(50);\n  height = input<number>(300);\n  colors = input<string[]>(['#4a90d9', '#ff6358', '#27ae60', '#f39c12', '#8e44ad', '#1abc9c', '#e74c3c', '#3498db', '#2ecc71', '#e67e22']);\n  showExport = input<boolean>(true);\n  threshold = input<number | null>(null);\n\n  streamTick = output<{ index: number; value: number }>();\n  agentPromptRequest = output<{ index: number; value: number; prompt: string }>();\n\n  // State signals\n  points = signal<number[]>([]);\n  currentTps = signal<number>(0);\n  hoveredIndex = signal<number | null>(null);\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  // Unique instance ID for gradient references (avoids DOM collisions with multiple instances)\n  readonly instanceId = Math.random().toString(36).substring(2, 8);\n\n  // Dimensions\n  private readonly leftPad = 38;\n  private readonly bottomPad = 18;\n  chartWidth = 600;\n  stepWidth = 12; // Distance between consecutive points on x-axis\n\n  // Grid helper\n  gridYLines = computed(() => {\n    const h = this.height();\n    return [h * 0.25, h * 0.5, h * 0.75];\n  });\n\n  // Calculate sliding viewBox position to keep latest point visible\n  viewBoxX = computed(() => {\n    const n = this.points().length;\n    const maxVisible = this.windowSize();\n    if (n <= maxVisible) return -this.leftPad;\n    return (n - maxVisible) * this.stepWidth - this.leftPad;\n  });\n\n  viewBoxString = computed(() => {\n    return `${this.viewBoxX()} 0 ${this.chartWidth + this.leftPad} ${this.height() + this.bottomPad}`;\n  });\n\n  // Scale Y to fits bounds\n  private yMin = computed(() => {\n    const pts = this.points();\n    if (!pts.length) return 0;\n    return Math.min(...pts, 0);\n  });\n\n  private yMax = computed(() => {\n    const pts = this.points();\n    if (!pts.length) return 100;\n    return Math.max(...pts, 50);\n  });\n\n  // Convert points to coordinate pairs\n  scaledPoints = computed<[number, number][]>(() => {\n    const pts = this.points();\n    const min = this.yMin();\n    const max = this.yMax();\n    const range = max - min || 1;\n    const h = this.height();\n\n    return pts.map((v, i) => {\n      const x = i * this.stepWidth;\n      const y = h - ((v - min) / range) * (h - 10) - 5;\n      return [x, y];\n    });\n  });\n\n  linePath = computed(() => {\n    const pts = this.scaledPoints();\n    if (pts.length < 2) return '';\n    return smoothPath(pts);\n  });\n\n  areaPath = computed(() => {\n    const pts = this.scaledPoints();\n    if (pts.length < 2) return '';\n    const last = pts[pts.length - 1];\n    const first = pts[0];\n    const bottom = this.height();\n    return smoothPath(pts) + ` L ${last[0]} ${bottom} L ${first[0]} ${bottom} Z`;\n  });\n\n  // Y-axis tick labels\n  yAxisTicks = computed(() => {\n    const min = this.yMin();\n    const max = this.yMax();\n    const range = max - min || 1;\n    const h = this.height();\n    const ticks = niceTicks(min, max, 5);\n    return ticks.map(val => ({\n      val,\n      label: fmtNum(val),\n      y: h - ((val - min) / range) * (h - 10) - 5\n    }));\n  });\n\n  // X-axis tick labels (every 10th token)\n  xAxisTicks = computed(() => {\n    const n = this.points().length;\n    const ticks: { index: number; x: number }[] = [];\n    for (let i = 0; i < n; i += 10) {\n      ticks.push({ index: i, x: i * this.stepWidth });\n    }\n    return ticks;\n  });\n\n  // Threshold Y coordinate\n  thresholdY = computed(() => {\n    const t = this.threshold();\n    if (t === null) return 0;\n    const min = this.yMin();\n    const max = this.yMax();\n    const range = max - min || 1;\n    const h = this.height();\n    return h - ((t - min) / range) * (h - 10) - 5;\n  });\n\n  activePoint = computed(() => {\n    const idx = this.hoveredIndex();\n    if (idx === null) return null;\n    const pts = this.scaledPoints();\n    const rawVal = this.points()[idx];\n    if (idx >= 0 && idx < pts.length) {\n      const pt = pts[idx];\n      // Convert SVG coordinates to container relative screen positions for custom tooltip\n      const svg = this.svgEl()?.nativeElement;\n      if (!svg) return null;\n      \n      const svgWidth = svg.clientWidth || this.chartWidth;\n      const svgHeight = svg.clientHeight || this.height();\n      \n      // Calculate where this point is within the current visible viewbox\n      const startX = this.viewBoxX();\n      const xRatio = (pt[0] - startX) / this.chartWidth;\n      const yRatio = pt[1] / this.height();\n\n      return {\n        index: idx,\n        val: rawVal,\n        x: pt[0],\n        y: pt[1],\n        screenX: xRatio * svgWidth,\n        screenY: yRatio * svgHeight\n      };\n    }\n    return null;\n  });\n\n  constructor() {\n    // Populate some initial simulated data if none is provided\n    const initData = [20, 25, 30, 28, 35, 45, 52, 48, 55, 60];\n    this.points.set(initData);\n    this.currentTps.set(38.5);\n  }\n\n  // Public API method to append dynamic points in real-time\n  appendPoint(val: number): void {\n    const current = this.points();\n    this.points.set([...current, val]);\n    \n    // Simulate updating Tokens Per Second\n    const tps = Math.round((40 + Math.random() * 20 - (val / 15)) * 10) / 10;\n    this.currentTps.set(tps > 5 ? tps : 5);\n\n    this.streamTick.emit({ index: current.length, value: val });\n  }\n\n  // Public API: replace all points at once\n  setPoints(newPoints: number[]): void {\n    this.points.set(newPoints);\n  }\n\n  // Public API: clear all data\n  clearPoints(): void {\n    this.points.set([]);\n    this.currentTps.set(0);\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const rect = svg.getBoundingClientRect();\n    const screenX = event.clientX - rect.left;\n    const svgWidth = rect.width || 1;\n\n    // Map screen X back to viewBox coordinates\n    const startX = this.viewBoxX();\n    const viewBoxX = startX + (screenX / svgWidth) * this.chartWidth;\n\n    // Find nearest point index\n    const n = this.points().length;\n    if (n === 0) return;\n    const nearestIdx = Math.max(0, Math.min(n - 1, Math.round(viewBoxX / this.stepWidth)));\n    this.hoveredIndex.set(nearestIdx);\n  }\n\n  onTooltipAction(index: number, value: number): void {\n    this.agentPromptRequest.emit({\n      index,\n      value,\n      prompt: `Analyze token generation performance anomaly at token index ${index} with speed ${value} ms/tok.`\n    });\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const pts = this.points();\n    const blob = new Blob([JSON.stringify(pts, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'token-streaming-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const pts = this.points();\n    let csv = 'Token_Index,Latency_Ms\\n';\n    pts.forEach((v, i) => {\n      csv += `${i + 1},${v}\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'token-streaming-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'token-streaming-chart.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgString = new XMLSerializer().serializeToString(svg);\n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body { margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background: white; }\n            svg { width: 100%; height: auto; }\n          </style>\n        </head>\n        <body>\n          ${svgString}\n          <script>\n            window.onload = () => { window.print(); window.close(); };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n}\n","import {\n  Component, input, output, signal, computed, ChangeDetectionStrategy,\n  ElementRef, viewChild, HostListener, effect\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS } from '../shared/chart-utils';\n\nexport interface EmbeddingPoint {\n  id: string;\n  x: number;\n  y: number;\n  group?: string;\n  label?: string;\n}\n\n@Component({\n  selector: 'ngx-embedding-space-projection',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-embedding-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\">\n        <div class=\"chart-title-space\">\n          <div class=\"projection-title\">Embedding Space Projection</div>\n          <div class=\"projection-subtitle\">\n            Total Vectors: <span class=\"highlight-val\">{{ data().length }}</span> |\n            Lasso Selected: <span class=\"highlight-val\">{{ selectedIds().length }}</span>\n          </div>\n        </div>\n        <div class=\"action-buttons\">\n          <button class=\"clear-lasso-btn\" [disabled]=\"selectedIds().length === 0\" (click)=\"clearSelection()\">\n            🧹 Clear Lasso\n          </button>\n          @if (showExport()) {\n            <div class=\"chart-export-menu\">\n              <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n              @if (exportMenuOpen()) {\n                <div class=\"export-dropdown\">\n                  <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                  <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                  <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                  <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n                </div>\n              }\n            </div>\n          }\n        </div>\n      </div>\n\n      <div class=\"ngx-embedding-container\" [style.height.px]=\"height()\">\n        <!-- SVG Canvas with Lasso drag handles -->\n        <svg\n          #svgEl\n          class=\"ngx-embedding-svg\"\n          [attr.viewBox]=\"viewBoxString()\"\n          [attr.height]=\"height()\"\n          (mousedown)=\"onMouseDown($event)\"\n          (mousemove)=\"onMouseMove($event)\"\n          (mouseup)=\"onMouseUp($event)\"\n          (mouseleave)=\"onMouseLeave()\"\n        >\n          <g [attr.transform]=\"zoomTransform()\">\n            <!-- Grid Background lines -->\n            <line [attr.x1]=\"0\" [attr.x2]=\"width()\" [attr.y1]=\"height() / 2\" [attr.y2]=\"height() / 2\" class=\"axis-line\" />\n            <line [attr.x1]=\"width() / 2\" [attr.x2]=\"width() / 2\" [attr.y1]=\"0\" [attr.y2]=\"height()\" class=\"axis-line\" />\n\n            <!-- X-axis tick labels -->\n            @for (tick of xTicks(); track tick.value) {\n              <line [attr.x1]=\"tick.pos\" [attr.x2]=\"tick.pos\" [attr.y1]=\"height() - padding + 2\" [attr.y2]=\"height() - padding + 6\" class=\"axis-tick\" />\n              <text [attr.x]=\"tick.pos\" [attr.y]=\"height() - padding + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ tick.label }}</text>\n            }\n\n            <!-- Y-axis tick labels -->\n            @for (tick of yTicks(); track tick.value) {\n              <line [attr.x1]=\"padding - 6\" [attr.x2]=\"padding - 2\" [attr.y1]=\"tick.pos\" [attr.y2]=\"tick.pos\" class=\"axis-tick\" />\n              <text [attr.x]=\"padding - 9\" [attr.y]=\"tick.pos\" class=\"axis-label\" text-anchor=\"end\" dominant-baseline=\"middle\">{{ tick.label }}</text>\n            }\n\n            <!-- Batched SVG Paths grouped by color group -->\n            @for (grpPath of batchedGroupPaths(); track grpPath.group) {\n              <path\n                [attr.d]=\"grpPath.path\"\n                [attr.fill]=\"grpPath.color\"\n                class=\"batched-dots-path\"\n              />\n            }\n\n            <!-- Individually rendered circles only for lasso selected/highlighted points (to allow individual styles) -->\n            @for (pt of selectedPoints(); track pt.id) {\n              <circle\n                [attr.cx]=\"pt.screenX\"\n                [attr.cy]=\"pt.screenY\"\n                [attr.r]=\"dotRadius() + 1.5\"\n                [attr.fill]=\"pt.color\"\n                class=\"selected-dot-ring\"\n              />\n              <circle\n                [attr.cx]=\"pt.screenX\"\n                [attr.cy]=\"pt.screenY\"\n                [attr.r]=\"dotRadius()\"\n                [attr.fill]=\"pt.color\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.2\"\n              />\n            }\n\n            <!-- Clicked point persistent highlight ring -->\n            @if (clickedPointData(); as cp) {\n              <circle\n                [attr.cx]=\"cp.screenX\"\n                [attr.cy]=\"cp.screenY\"\n                r=\"10\"\n                fill=\"none\"\n                stroke=\"#f59e0b\"\n                stroke-width=\"2\"\n                stroke-dasharray=\"3,2\"\n                class=\"clicked-dot-ring\"\n              />\n              <circle\n                [attr.cx]=\"cp.screenX\"\n                [attr.cy]=\"cp.screenY\"\n                [attr.r]=\"dotRadius() + 1\"\n                [attr.fill]=\"cp.color\"\n                stroke=\"#f59e0b\"\n                stroke-width=\"1.5\"\n              />\n            }\n\n            <!-- Single hovered dot highlight ring -->\n            @if (hoveredPoint(); as hp) {\n              <circle\n                [attr.cx]=\"hp.screenX\"\n                [attr.cy]=\"hp.screenY\"\n                r=\"7\"\n                [attr.fill]=\"hp.color\"\n                fill-opacity=\"0.3\"\n                class=\"hovered-dot-pulse\"\n              />\n              <circle\n                [attr.cx]=\"hp.screenX\"\n                [attr.cy]=\"hp.screenY\"\n                [attr.r]=\"dotRadius() + 1\"\n                [attr.fill]=\"hp.color\"\n                stroke=\"#ffffff\"\n                stroke-width=\"1.5\"\n              />\n            }\n\n            <!-- Lasso Polygon overlay -->\n            @if (lassoPath().length > 1) {\n              <polygon\n                [attr.points]=\"lassoPolygonPoints()\"\n                class=\"lasso-overlay\"\n              />\n              <path\n                [attr.d]=\"lassoLinePath()\"\n                class=\"lasso-outline\"\n              />\n            }\n          </g>\n        </svg>\n\n        <!-- Cluster Legend -->\n        @if (showLegend() && groups().length > 0) {\n          <div class=\"embedding-legend\">\n            @for (group of groups(); track group; let i = $index) {\n              <div class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"colors()[i % colors().length]\"></span>\n                <span class=\"legend-label\">{{ group }}</span>\n              </div>\n            }\n          </div>\n        }\n\n        <!-- Floating Zoom Controls -->\n        <div class=\"zoom-controls\" (click)=\"$event.stopPropagation()\">\n          <button (click)=\"zoomIn()\" title=\"Zoom In\">➕</button>\n          <button (click)=\"zoomOut()\" title=\"Zoom Out\">➖</button>\n          <button (click)=\"resetZoom()\" title=\"Reset\">🔄</button>\n          <span class=\"zoom-level\">{{ zoomPercent() }}%</span>\n        </div>\n\n        <!-- Tooltip overlay -->\n        @if (hoveredPoint(); as hp) {\n          <div\n            class=\"projection-tooltip\"\n            [style.left.px]=\"hp.screenX * scale() + translateX()\"\n            [style.top.px]=\"hp.screenY * scale() + translateY()\"\n          >\n            <div class=\"tt-cat\">{{ hp.label || 'Vector ID: ' + hp.id }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"hp.color\"></span>\n              <span class=\"tt-name\">Cluster</span>\n              <span class=\"tt-val\">{{ hp.group || 'None' }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-name\">Coords</span>\n              <span class=\"tt-val\">({{ hp.x.toFixed(2) }}, {{ hp.y.toFixed(2) }})</span>\n            </div>\n            <div class=\"tt-row action-row\">\n              <button class=\"tt-action-btn\" (click)=\"onExplainCluster(hp)\">\n                Ask Agent to Explain Cluster\n              </button>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-embedding-wrapper {\n      width: 100%;\n      height: 100%;\n      padding: 16px 20px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n    .ngx-embedding-container {\n      position: relative;\n      width: 100%;\n      overflow: hidden;\n    }\n    .ngx-embedding-svg {\n      width: 100%;\n      height: 100%;\n      display: block;\n      overflow: visible;\n      user-select: none;\n      -webkit-user-select: none;\n    }\n    .axis-line {\n      stroke: var(--ngx-chart-grid, #f1f5f9);\n      stroke-width: 1px;\n    }\n    .axis-tick {\n      stroke: var(--ngx-chart-grid, #94a3b8);\n      stroke-width: 1px;\n    }\n    .axis-label {\n      font-size: 9px;\n      font-family: monospace;\n      fill: var(--ngx-chart-axis-text, #64748b);\n    }\n    .batched-dots-path {\n      opacity: 0.65;\n      transition: opacity 0.25s;\n    }\n    .batched-dots-path:hover {\n      opacity: 0.8;\n    }\n    .selected-dot-ring {\n      stroke: rgba(99, 102, 241, 0.6);\n      stroke-width: 1.5px;\n      fill: none;\n    }\n    .clicked-dot-ring {\n      animation: clickedRingSpin 3s linear infinite;\n    }\n    @keyframes clickedRingSpin {\n      from { stroke-dashoffset: 0; }\n      to { stroke-dashoffset: 20; }\n    }\n    .hovered-dot-pulse {\n      pointer-events: none;\n      animation: pulseHover 1.2s infinite alternate;\n    }\n    @keyframes pulseHover {\n      from { r: 5px; fill-opacity: 0.2; }\n      to { r: 9px; fill-opacity: 0.5; }\n    }\n\n    /* Lasso style */\n    .lasso-overlay {\n      fill: rgba(99, 102, 241, 0.08);\n      pointer-events: none;\n    }\n    .lasso-outline {\n      stroke: #4f46e5;\n      stroke-width: 1.5px;\n      stroke-dasharray: 4,3;\n      fill: none;\n      pointer-events: none;\n    }\n\n    /* Header & Action bar */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n    }\n    .projection-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--text-primary, #1e293b);\n    }\n    .projection-subtitle {\n      font-size: 11px;\n      color: var(--text-secondary, #64748b);\n      margin-top: 2px;\n    }\n    .highlight-val {\n      font-weight: 700;\n      color: #6366f1;\n      font-family: monospace;\n    }\n    .action-buttons {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n    .clear-lasso-btn {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: #64748b;\n      background: #f1f5f9;\n      border: 1px solid #cbd5e1;\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .clear-lasso-btn:not([disabled]):hover {\n      background: #cbd5e1;\n      color: #0f172a;\n    }\n    .clear-lasso-btn[disabled] {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .projection-tooltip {\n      position: absolute;\n      z-index: 100;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -115%);\n      min-width: 170px;\n      pointer-events: auto;\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n    .action-row {\n      margin-top: 8px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      padding-top: 6px;\n      justify-content: center;\n    }\n    .tt-action-btn {\n      background: #4f46e5;\n      color: #ffffff;\n      border: none;\n      border-radius: 4px;\n      padding: 4px 8px;\n      font-size: 10px;\n      cursor: pointer;\n      font-weight: 600;\n      transition: all 0.15s;\n      width: 100%;\n    }\n    .tt-action-btn:hover {\n      background: #6366f1;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n\n    /* Cluster Legend */\n    .embedding-legend {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n      background: rgba(15, 23, 42, 0.75);\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      border: 1px solid rgba(255, 255, 255, 0.12);\n      border-radius: 8px;\n      padding: 8px 12px;\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      z-index: 10;\n      max-height: 180px;\n      overflow-y: auto;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .legend-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .legend-label {\n      font-size: 10px;\n      font-weight: 600;\n      color: rgba(248, 250, 252, 0.9);\n      white-space: nowrap;\n      font-family: system-ui, sans-serif;\n    }\n\n    /* Zoom controls floating style */\n    .zoom-controls {\n      position: absolute;\n      bottom: 8px;\n      right: 8px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      background: rgba(15, 23, 42, 0.8);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      border-radius: 8px;\n      padding: 4px 8px;\n      box-shadow: 0 4px 6px rgba(0,0,0,0.1);\n      z-index: 10;\n    }\n    .zoom-controls button {\n      background: rgba(255, 255, 255, 0.15);\n      border: none;\n      color: #ffffff;\n      width: 24px;\n      height: 24px;\n      border-radius: 4px;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 10px;\n      transition: background 0.15s;\n    }\n    .zoom-controls button:hover {\n      background: rgba(255, 255, 255, 0.3);\n    }\n    .zoom-level {\n      color: rgba(255, 255, 255, 0.85);\n      font-size: 10px;\n      font-weight: 600;\n      font-family: monospace;\n      padding-left: 4px;\n      min-width: 32px;\n      text-align: right;\n    }\n  `]\n})\nexport class EmbeddingSpaceProjectionComponent {\n  data = input.required<EmbeddingPoint[]>();\n  width = input<number>(600);\n  height = input<number>(400);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  dotRadius = input<number>(3.5);\n\n  lassoSelected = output<string[]>();\n  agentQueryRequest = output<{ selectedIds: string[]; queryType: string }>();\n  pointClick = output<EmbeddingPoint>();\n\n  // Signals\n  selectedIds = signal<string[]>([]);\n  lassoPath = signal<[number, number][]>([]);\n  hoveredIndex = signal<number | null>(null);\n  exportMenuOpen = signal(false);\n  isDragging = signal<boolean>(false);\n  clickedPointIndex = signal<number | null>(null);\n\n  // Zoom & Pan state\n  scale = signal<number>(1);\n  translateX = signal<number>(0);\n  translateY = signal<number>(0);\n  isPanning = signal<boolean>(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  private panStartX = 0;\n  private panStartY = 0;\n  private dragStartX = 0;\n  private dragStartY = 0;\n  padding = 20;\n\n  viewBoxString = computed(() => `0 0 ${this.width()} ${this.height()}`);\n  zoomPercent = computed(() => Math.round(this.scale() * 100));\n  zoomTransform = computed(() => `translate(${this.translateX()}, ${this.translateY()}) scale(${this.scale()})`);\n\n  constructor() {\n    effect(() => {\n      const svg = this.svgEl()?.nativeElement;\n      if (!svg) return;\n\n      const handler = (e: WheelEvent) => this.onWheel(e);\n      svg.addEventListener('wheel', handler, { passive: false });\n\n      return () => svg.removeEventListener('wheel', handler);\n    });\n  }\n\n  // Calculate global coordinate bounds\n  private bounds = computed(() => {\n    const pts = this.data();\n    if (!pts.length) return { minX: -1, maxX: 1, minY: -1, maxY: 1 };\n    const xs = pts.map(p => p.x);\n    const ys = pts.map(p => p.y);\n    return {\n      minX: Math.min(...xs),\n      maxX: Math.max(...xs),\n      minY: Math.min(...ys),\n      maxY: Math.max(...ys)\n    };\n  });\n\n  // Unique groups for mapping colors\n  groups = computed(() => {\n    const pts = this.data();\n    const grps = Array.from(new Set(pts.map(p => p.group).filter(Boolean)));\n    return grps as string[];\n  });\n\n  // X-axis tick values\n  xTicks = computed(() => {\n    const b = this.bounds();\n    const w = this.width();\n    const pad = this.padding;\n    const tickCount = 5;\n    const ticks: { value: number; pos: number; label: string }[] = [];\n    const rangeX = b.maxX - b.minX || 1;\n    for (let i = 0; i < tickCount; i++) {\n      const frac = i / (tickCount - 1);\n      const value = b.minX + frac * rangeX;\n      const pos = pad + frac * (w - pad * 2);\n      ticks.push({ value, pos, label: value.toFixed(1) });\n    }\n    return ticks;\n  });\n\n  // Y-axis tick values\n  yTicks = computed(() => {\n    const b = this.bounds();\n    const h = this.height();\n    const pad = this.padding;\n    const tickCount = 5;\n    const ticks: { value: number; pos: number; label: string }[] = [];\n    const rangeY = b.maxY - b.minY || 1;\n    for (let i = 0; i < tickCount; i++) {\n      const frac = i / (tickCount - 1);\n      const value = b.minY + frac * rangeY;\n      // Invert Y: low data value at bottom (high screen Y), high data value at top (low screen Y)\n      const pos = h - (pad + frac * (h - pad * 2));\n      ticks.push({ value, pos, label: value.toFixed(1) });\n    }\n    return ticks;\n  });\n\n  // Calculate screen relative positions\n  transformedPoints = computed(() => {\n    const pts = this.data();\n    const b = this.bounds();\n    const w = this.width();\n    const h = this.height();\n    const pad = this.padding;\n    const grps = this.groups();\n    const colors = this.colors();\n\n    const rangeX = b.maxX - b.minX || 1;\n    const rangeY = b.maxY - b.minY || 1;\n\n    return pts.map((p, idx) => {\n      const screenX = pad + ((p.x - b.minX) / rangeX) * (w - pad * 2);\n      const screenY = h - (pad + ((p.y - b.minY) / rangeY) * (h - pad * 2)); // invert Y axis\n\n      let colorIndex = 0;\n      if (p.group) {\n        colorIndex = grps.indexOf(p.group) % colors.length;\n      }\n      const color = colors[colorIndex] || colors[0];\n\n      return {\n        ...p,\n        screenX,\n        screenY,\n        color,\n        index: idx\n      };\n    });\n  });\n\n  // SVG Path Batching logic - compiles thousands of dots into a single path per group\n  batchedGroupPaths = computed(() => {\n    const pts = this.transformedPoints();\n    const grps = this.groups();\n    const colors = this.colors();\n    const r = this.dotRadius();\n\n    // Setup map\n    const pathsMap: Record<string, string[]> = { 'default': [] };\n    grps.forEach(g => pathsMap[g] = []);\n\n    pts.forEach(p => {\n      // SVG command to draw a circle of radius r around (cx, cy):\n      // Move to cx + r, cy, then draw two semicircles\n      const cx = p.screenX;\n      const cy = p.screenY;\n      const cmd = `M ${cx} ${cy} m -${r} 0 a ${r} ${r} 0 1 0 ${r * 2} 0 a ${r} ${r} 0 1 0 -${r * 2} 0`;\n\n      const key = p.group || 'default';\n      pathsMap[key].push(cmd);\n    });\n\n    const result = Object.keys(pathsMap).map(key => {\n      const grpIndex = grps.indexOf(key);\n      const color = key === 'default' ? colors[0] : (colors[grpIndex % colors.length] || colors[0]);\n      return {\n        group: key,\n        color,\n        path: pathsMap[key].join(' ')\n      };\n    });\n\n    return result.filter(r => r.path.trim().length > 0);\n  });\n\n  selectedPoints = computed(() => {\n    const sIds = new Set(this.selectedIds());\n    return this.transformedPoints().filter(p => sIds.has(p.id));\n  });\n\n  hoveredPoint = computed(() => {\n    const idx = this.hoveredIndex();\n    if (idx === null) return null;\n    const pts = this.transformedPoints();\n    return idx >= 0 && idx < pts.length ? pts[idx] : null;\n  });\n\n  clickedPointData = computed(() => {\n    const idx = this.clickedPointIndex();\n    if (idx === null) return null;\n    const pts = this.transformedPoints();\n    return idx >= 0 && idx < pts.length ? pts[idx] : null;\n  });\n\n  lassoPolygonPoints = computed(() => {\n    return this.lassoPath().map(p => `${p[0]},${p[1]}`).join(' ');\n  });\n\n  lassoLinePath = computed(() => {\n    const path = this.lassoPath();\n    if (path.length < 2) return '';\n    return path.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p[0]} ${p[1]}`).join(' ') + ' Z';\n  });\n\n  clearSelection(): void {\n    this.selectedIds.set([]);\n    this.lassoPath.set([]);\n    this.lassoSelected.emit([]);\n  }\n\n  onMouseDown(event: MouseEvent): void {\n    // Only handle left click\n    if (event.button !== 0) return;\n\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const rect = svg.getBoundingClientRect();\n    const x = event.clientX - rect.left;\n    const y = event.clientY - rect.top;\n\n    // Record drag start position for click-vs-drag detection\n    this.dragStartX = event.clientX;\n    this.dragStartY = event.clientY;\n\n    // Alt+click = pan mode\n    if (event.altKey) {\n      event.preventDefault();\n      this.isPanning.set(true);\n      this.panStartX = event.clientX - this.translateX();\n      this.panStartY = event.clientY - this.translateY();\n      return;\n    }\n\n    // Normal left click = lasso mode\n    this.isDragging.set(true);\n    this.lassoPath.set([[x, y]]);\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const rect = svg.getBoundingClientRect();\n    const x = event.clientX - rect.left;\n    const y = event.clientY - rect.top;\n\n    // Pan mode\n    if (this.isPanning()) {\n      this.translateX.set(event.clientX - this.panStartX);\n      this.translateY.set(event.clientY - this.panStartY);\n      return;\n    }\n\n    if (this.isDragging()) {\n      const current = this.lassoPath();\n      this.lassoPath.set([...current, [x, y]]);\n    } else {\n      // Compute hovered point (account for zoom transform)\n      const pts = this.transformedPoints();\n      const currentScale = this.scale();\n      const tx = this.translateX();\n      const ty = this.translateY();\n      let minDistance = 15; // Hover range\n      let nearestIdx: number | null = null;\n      pts.forEach((p, idx) => {\n        const screenPtX = p.screenX * currentScale + tx;\n        const screenPtY = p.screenY * currentScale + ty;\n        const dx = screenPtX - x;\n        const dy = screenPtY - y;\n        const dist = Math.sqrt(dx * dx + dy * dy);\n        if (dist < minDistance) {\n          minDistance = dist;\n          nearestIdx = idx;\n        }\n      });\n      this.hoveredIndex.set(nearestIdx);\n    }\n  }\n\n  onMouseUp(event: MouseEvent): void {\n    // End panning\n    if (this.isPanning()) {\n      this.isPanning.set(false);\n      return;\n    }\n\n    if (!this.isDragging()) return;\n    this.isDragging.set(false);\n\n    // Determine if this was a click (tiny drag distance) vs a real lasso drag\n    const dx = event.clientX - this.dragStartX;\n    const dy = event.clientY - this.dragStartY;\n    const dragDistance = Math.sqrt(dx * dx + dy * dy);\n\n    if (dragDistance < 5) {\n      // This was a single click — attempt point selection\n      this.lassoPath.set([]);\n      const svg = this.svgEl()?.nativeElement;\n      if (!svg) return;\n      const rect = svg.getBoundingClientRect();\n      const x = event.clientX - rect.left;\n      const y = event.clientY - rect.top;\n\n      const pts = this.transformedPoints();\n      const currentScale = this.scale();\n      const tx = this.translateX();\n      const ty = this.translateY();\n      let minDist = 15;\n      let nearestIdx: number | null = null;\n\n      pts.forEach((p, idx) => {\n        const screenPtX = p.screenX * currentScale + tx;\n        const screenPtY = p.screenY * currentScale + ty;\n        const ddx = screenPtX - x;\n        const ddy = screenPtY - y;\n        const dist = Math.sqrt(ddx * ddx + ddy * ddy);\n        if (dist < minDist) {\n          minDist = dist;\n          nearestIdx = idx;\n        }\n      });\n\n      if (nearestIdx !== null) {\n        this.clickedPointIndex.set(nearestIdx);\n        const pt = pts[nearestIdx];\n        this.pointClick.emit({\n          id: pt.id,\n          x: pt.x,\n          y: pt.y,\n          group: pt.group,\n          label: pt.label\n        });\n      } else {\n        // Clicked empty space — clear clicked point\n        this.clickedPointIndex.set(null);\n      }\n      return;\n    }\n\n    // Real lasso drag — determine points inside the polygon\n    const poly = this.lassoPath();\n    if (poly.length < 3) {\n      this.lassoPath.set([]);\n      return;\n    }\n\n    const selected: string[] = [];\n    const pts = this.transformedPoints();\n    pts.forEach(p => {\n      if (this.isPointInPolygon([p.screenX, p.screenY], poly)) {\n        selected.push(p.id);\n      }\n    });\n\n    this.selectedIds.set(selected);\n    this.lassoSelected.emit(selected);\n  }\n\n  onMouseLeave(): void {\n    if (this.isDragging()) {\n      this.isDragging.set(false);\n      this.lassoPath.set([]);\n    }\n    if (this.isPanning()) {\n      this.isPanning.set(false);\n    }\n    this.hoveredIndex.set(null);\n  }\n\n  // Ray casting point-in-polygon implementation\n  private isPointInPolygon(pt: [number, number], poly: [number, number][]): boolean {\n    const x = pt[0], y = pt[1];\n    let inside = false;\n    for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n      const xi = poly[i][0], yi = poly[i][1];\n      const xj = poly[j][0], yj = poly[j][1];\n      const intersect = ((yi > y) !== (yj > y))\n          && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n      if (intersect) inside = !inside;\n    }\n    return inside;\n  }\n\n  onExplainCluster(hp: any): void {\n    const ids = this.selectedIds().length > 0 ? this.selectedIds() : [hp.id];\n    this.agentQueryRequest.emit({\n      selectedIds: ids,\n      queryType: 'explain_cluster'\n    });\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  // Zoom & Pan\n  onWheel(event: WheelEvent): void {\n    event.preventDefault();\n    const zoomFactor = 1.15;\n    let newScale = this.scale();\n    if (event.deltaY < 0) {\n      newScale *= zoomFactor;\n    } else {\n      newScale /= zoomFactor;\n    }\n\n    // Boundary constraints: min 0.3x, max 3.0x zoom\n    newScale = Math.max(0.3, Math.min(3, newScale));\n\n    const svg = this.svgEl()?.nativeElement;\n    if (svg) {\n      const rect = svg.getBoundingClientRect();\n      const mouseX = event.clientX - rect.left;\n      const mouseY = event.clientY - rect.top;\n\n      const currentScale = this.scale();\n      const svgX = (mouseX - this.translateX()) / currentScale;\n      const svgY = (mouseY - this.translateY()) / currentScale;\n\n      this.scale.set(newScale);\n      this.translateX.set(mouseX - svgX * newScale);\n      this.translateY.set(mouseY - svgY * newScale);\n    } else {\n      this.scale.set(newScale);\n    }\n  }\n\n  zoomIn(): void {\n    const nextScale = Math.min(3, this.scale() * 1.2);\n    this.scale.set(nextScale);\n  }\n\n  zoomOut(): void {\n    const nextScale = Math.max(0.3, this.scale() / 1.2);\n    this.scale.set(nextScale);\n  }\n\n  resetZoom(): void {\n    this.scale.set(1);\n    this.translateX.set(0);\n    this.translateY.set(0);\n  }\n\n  exportToJson(): void {\n    const blob = new Blob([JSON.stringify(this.data(), null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'embedding-projection-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    let csv = 'ID,X,Y,Group,Label\\n';\n    this.data().forEach(p => {\n      csv += `\"${p.id}\",${p.x},${p.y},\"${p.group || ''}\",\"${p.label || ''}\"\\n`;\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'embedding-projection-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'embedding-projection.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgString = new XMLSerializer().serializeToString(svg);\n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body { margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background: white; }\n            svg { width: 100%; height: auto; }\n          </style>\n        </head>\n        <body>\n          ${svgString}\n          <script>\n            window.onload = () => { window.print(); window.close(); };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n}\n","import {\n  Component, input, output, signal, computed, ChangeDetectionStrategy,\n  ElementRef, viewChild, HostListener, effect, inject\n} from '@angular/core';\nimport { CommonModule, UpperCasePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CHART_COLORS } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent } from '../shared/chart-export-menu.component';\nimport type { ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface TopologyNode {\n  id: string;\n  label: string;\n  status: 'idle' | 'thinking' | 'success' | 'error';\n  type?: string;     // e.g. 'orchestrator' | 'agent' | 'tool' | 'critic'\n  prompt?: string;\n  response?: string;\n  x?: number;\n  y?: number;\n}\n\nexport interface TopologyLink {\n  source: string;\n  target: string;\n  active?: boolean;\n  label?: string;\n}\n\ninterface ProcessedNode extends TopologyNode {\n  x: number;\n  y: number;\n  depth: number;\n}\n\n@Component({\n  selector: 'ngx-agentic-cognitive-topology',\n  standalone: true,\n  imports: [CommonModule, UpperCasePipe, FormsModule, ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-topology-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\" (mouseleave)=\"closeTooltip()\">\n        <div class=\"chart-title-space\">\n          <div class=\"topology-title\">Agentic Cognitive Topology (DAG)</div>\n          <div class=\"topology-subtitle\">\n            Active Agents: <span class=\"highlight-val\">{{ activeAgentsCount() }}</span> / {{ effectiveNodes().length }}\n          </div>\n        </div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <!-- Editor Toolbar (Renders in Edit Mode) -->\n      @if (editable()) {\n        <div class=\"editor-toolbar\">\n          <div class=\"toolbar-section\">\n            <button class=\"tb-btn primary\" (click)=\"addNode()\" title=\"Add Node\">➕ Add Agent</button>\n            <span class=\"tb-divider\"></span>\n            <button class=\"tb-btn\" [disabled]=\"undoStack().length === 0\" (click)=\"undo()\" title=\"Undo (Ctrl+Z)\">↩️ Undo ({{ undoStack().length }})</button>\n            <button class=\"tb-btn\" [disabled]=\"redoStack().length === 0\" (click)=\"redo()\" title=\"Redo (Ctrl+Y)\">↪️ Redo ({{ redoStack().length }})</button>\n            <span class=\"tb-divider\"></span>\n            <button class=\"tb-btn\" [class.active]=\"snapToGridActive()\" (click)=\"snapToGridActive.set(!snapToGridActive())\" title=\"Toggle Snap to Grid\">\n              🧲 Snap ({{ gridSize() }}px)\n            </button>\n            <button class=\"tb-btn\" (click)=\"autoLayout()\" title=\"Rearrange Nodes Automatically\">\n              🔀 Rearrange\n            </button>\n          </div>\n          <div class=\"toolbar-section\">\n            <button class=\"tb-btn\" (click)=\"exportWorkflowSchema()\" title=\"Copy Workflow JSON Schema\">📋 Copy JSON Flow</button>\n            \n            <div class=\"validation-badge\" [class.valid]=\"validationReport().isValid\">\n              @if (validationReport().isValid) {\n                ✅ DAG Solid\n              } @else {\n                ⚠️ Warning: \n                @if (validationReport().hasCycles) { Cycle detected! }\n                @if (validationReport().orphans.length > 0) { Isolated nodes present! }\n              }\n            </div>\n          </div>\n        </div>\n      }\n\n      <div class=\"ngx-topology-container\" [style.height.px]=\"height()\">\n        <!-- SVG DAG Drawing Canvas -->\n        <svg\n          #svgEl\n          class=\"ngx-topology-svg\"\n          [attr.viewBox]=\"viewBoxString()\"\n          [attr.height]=\"height()\"\n          (click)=\"onCanvasClick()\"\n          (mousedown)=\"onMouseDown($event)\"\n          (mousemove)=\"onMouseMove($event)\"\n          (mouseup)=\"onMouseUp()\"\n          (mouseleave)=\"onMouseLeave()\"\n          [style.cursor]=\"draggingNodeId() ? 'grabbing' : isPanning() ? 'grabbing' : activePortDrag() ? 'crosshair' : 'grab'\"\n        >\n          <!-- Grid background dots -->\n          <defs>\n            <pattern id=\"grid-pattern\" width=\"20\" height=\"20\" patternUnits=\"userSpaceOnUse\">\n              <circle cx=\"2\" cy=\"2\" r=\"1\" fill=\"rgba(148, 163, 184, 0.15)\" />\n            </pattern>\n          </defs>\n          <rect width=\"100%\" height=\"100%\" fill=\"url(#grid-pattern)\" />\n\n          <!-- Arrow markers for links -->\n          <defs>\n            <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto\">\n              <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--ngx-chart-grid, #94a3b8)\" />\n            </marker>\n            <marker id=\"arrow-active\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto\">\n              <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#4f46e5\" />\n            </marker>\n          </defs>\n\n          <!-- Group that scales and translates nodes & links based on zoom/pan state -->\n          <g [attr.transform]=\"transformString()\">\n            <!-- Links rendering -->\n            @for (link of computedLinks(); track link.source + '-' + link.target) {\n              <!-- Background link shadow / glow -->\n              @if (link.active) {\n                <path\n                  [attr.d]=\"link.path\"\n                  fill=\"none\"\n                  stroke=\"#6366f1\"\n                  stroke-width=\"5\"\n                  stroke-opacity=\"0.15\"\n                />\n              }\n              \n              <!-- Link line -->\n              <path\n                [attr.d]=\"link.path\"\n                fill=\"none\"\n                [attr.stroke]=\"link.active ? '#4f46e5' : '#94a3b8'\"\n                [attr.stroke-width]=\"link.active ? 2.5 : 1.5\"\n                [attr.marker-end]=\"link.active ? 'url(#arrow-active)' : 'url(#arrow)'\"\n                [class.link-active-flow]=\"link.active\"\n                class=\"topology-link-path\"\n              />\n\n              <!-- Link Delete Button (Renders in Edit Mode) -->\n              @if (editable()) {\n                <g class=\"link-delete-btn\" [attr.transform]=\"'translate(' + getMidpointX(link) + ',' + getMidpointY(link) + ')'\" (click)=\"deleteLink(link.source, link.target, $event)\">\n                  <circle r=\"7\" fill=\"#ef4444\" stroke=\"#ffffff\" stroke-width=\"1.2\" />\n                  <text text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#ffffff\" font-size=\"8\" font-weight=\"900\" y=\"-0.5\">×</text>\n                </g>\n              } @else if (link.label) {\n                <!-- Optional edge label -->\n                <text\n                  class=\"edge-label\"\n                  [attr.x]=\"getMidpointX(link)\"\n                  [attr.y]=\"getMidpointY(link)\"\n                  text-anchor=\"middle\"\n                  dominant-baseline=\"middle\"\n                >{{ link.label }}</text>\n              }\n            }\n\n            <!-- Temporary connector drawing edge (renders when dragging a port link) -->\n            @if (temporaryDragLinkPath()) {\n              <path [attr.d]=\"temporaryDragLinkPath()\" class=\"temporary-drag-link\" fill=\"none\" />\n            }\n\n            <!-- Nodes rendering via foreignObject -->\n            @for (node of computedNodes(); track node.id) {\n              <g\n                [class.node-thinking]=\"node.status === 'thinking'\"\n                [class.node-success]=\"node.status === 'success'\"\n                [class.node-error]=\"node.status === 'error'\"\n                [class.node-status-thinking]=\"node.status === 'thinking'\"\n                [class.node-status-success]=\"node.status === 'success'\"\n                [class.node-status-error]=\"node.status === 'error'\"\n                [style.transform]=\"'translate(' + (node.x - nodeWidth / 2) + 'px,' + (node.y - nodeHeight / 2) + 'px)'\"\n                [style.--node-translate]=\"'translate(' + (node.x - nodeWidth / 2) + 'px,' + (node.y - nodeHeight / 2) + 'px)'\"\n                class=\"node-group\"\n                (click)=\"onNodeClick(node, $event)\"\n                (dblclick)=\"onNodeDblClick(node, $event)\"\n                (mousedown)=\"onNodeMouseDown(node, $event)\"\n                (mouseenter)=\"hoveredNodeId.set(node.id)\"\n                (mouseleave)=\"hoveredNodeId.set(null)\"\n              >\n                <!-- Outer border & backdrop glow -->\n                <rect\n                  [attr.width]=\"nodeWidth\"\n                  [attr.height]=\"nodeHeight\"\n                  rx=\"10\"\n                  class=\"node-backdrop\"\n                  [attr.stroke]=\"getNodeBorderColor(node)\"\n                />\n\n                <!-- Embedded Rich HTML Content -->\n                <foreignObject\n                  [attr.width]=\"nodeWidth\"\n                  [attr.height]=\"nodeHeight\"\n                  class=\"node-html-container\"\n                >\n                  <div class=\"node-card\" [class]=\"node.status\">\n                    <div class=\"node-card-header\">\n                      <span class=\"node-type\">{{ (node.type || 'Agent') | uppercase }}</span>\n                      <span class=\"status-indicator\"></span>\n                    </div>\n                    <div class=\"node-card-body\">\n                      <div class=\"node-label\">{{ node.label }}</div>\n                      @if (node.prompt) {\n                        <div class=\"node-prompt-preview\">{{ node.prompt }}</div>\n                      }\n                    </div>\n                  </div>\n                </foreignObject>\n\n                <!-- Connection Ports Handles (Renders in Edit Mode) -->\n                @if (editable()) {\n                  <circle cx=\"67.5\" cy=\"0\" r=\"4\" class=\"connection-port top\" (mousedown)=\"onPortMouseDown(node, [0, -1], $event)\" title=\"Drag connection\" />\n                  <circle cx=\"67.5\" cy=\"55\" r=\"4\" class=\"connection-port bottom\" (mousedown)=\"onPortMouseDown(node, [0, 1], $event)\" title=\"Drag connection\" />\n                  <circle cx=\"0\" cy=\"27.5\" r=\"4\" class=\"connection-port left\" (mousedown)=\"onPortMouseDown(node, [-1, 0], $event)\" title=\"Drag connection\" />\n                  <circle cx=\"135\" cy=\"27.5\" r=\"4\" class=\"connection-port right\" (mousedown)=\"onPortMouseDown(node, [1, 0], $event)\" title=\"Drag connection\" />\n\n                  <!-- Node Delete Badge -->\n                  <g class=\"node-delete-btn\" transform=\"translate(132, 3)\" (click)=\"deleteNode(node.id, $event)\">\n                    <circle r=\"6\" fill=\"#ef4444\" stroke=\"#ffffff\" stroke-width=\"1\" />\n                    <text text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#ffffff\" font-size=\"8\" font-weight=\"900\" y=\"-0.5\">×</text>\n                  </g>\n                }\n\n                <!-- Hover preview pill -->\n                @if (!editable() && hoveredNodeId() === node.id && !tooltipData()) {\n                  <foreignObject\n                    [attr.x]=\"0\"\n                    [attr.y]=\"-28\"\n                    [attr.width]=\"nodeWidth\"\n                    [attr.height]=\"26\"\n                    class=\"hover-preview-container\"\n                  >\n                    <div class=\"hover-preview\">\n                      <span class=\"hover-preview-label\">{{ node.label }}</span>\n                      <span class=\"hover-preview-badge\" [class]=\"'badge-' + node.status\">{{ node.status }}</span>\n                    </div>\n                  </foreignObject>\n                }\n              </g>\n            }\n          </g>\n        </svg>\n\n        <!-- Floating Zoom Controls -->\n        <div class=\"zoom-controls\" (click)=\"$event.stopPropagation()\">\n          <button (click)=\"zoomIn()\" title=\"Zoom In\">➕</button>\n          <button (click)=\"zoomOut()\" title=\"Zoom Out\">➖</button>\n          <button (click)=\"resetZoom()\" title=\"Reset Zoom\">🔄</button>\n          <span class=\"zoom-level\">{{ zoomPercent() }}%</span>\n        </div>\n\n        <!-- Promptable Glassmorphic Tooltip Action Menu -->\n        @if (tooltipData(); as td) {\n          <div\n            class=\"topology-tooltip\"\n            [style.left.px]=\"td.screenX\"\n            [style.top.px]=\"td.screenY\"\n            (click)=\"$event.stopPropagation()\"\n          >\n            <div class=\"tt-cat\">{{ td.node.label }} ({{ td.node.status | uppercase }})</div>\n            @if (td.node.prompt) {\n              <div class=\"tt-section\">\n                <span class=\"section-title\">Latest Prompt:</span>\n                <p class=\"section-content\">\"{{ td.node.prompt }}\"</p>\n              </div>\n            }\n            @if (td.node.response) {\n              <div class=\"tt-section\">\n                <span class=\"section-title\">Latest Response:</span>\n                <p class=\"section-content\">\"{{ td.node.response }}\"</p>\n              </div>\n            }\n            <div class=\"action-buttons-row\">\n              <button class=\"action-btn explain\" (click)=\"triggerAction('explain', td.node.id)\">\n                Ask Agent to Explain\n              </button>\n              <button class=\"action-btn rerun\" (click)=\"triggerAction('rerun', td.node.id)\">\n                🔄 Rerun Agent\n              </button>\n            </div>\n          </div>\n        }\n\n        <!-- Glassmorphic Property Editor Modal -->\n        @if (activeEditingNode(); as node) {\n          <div class=\"modal-backdrop\" (click)=\"activeEditingNode.set(null)\">\n            <div class=\"modal-card\" (click)=\"$event.stopPropagation()\">\n              <div class=\"modal-header\">\n                <h3>Edit Agent Node</h3>\n                <button class=\"modal-close\" (click)=\"activeEditingNode.set(null)\">×</button>\n              </div>\n              <div class=\"modal-body\">\n                <div class=\"form-group\">\n                  <label>Agent Label</label>\n                  <input type=\"text\" [(ngModel)]=\"node.label\" placeholder=\"Enter label...\" />\n                </div>\n                <div class=\"form-row\">\n                  <div class=\"form-group half\">\n                    <label>Type</label>\n                    <select [(ngModel)]=\"node.type\">\n                      <option value=\"orchestrator\">Orchestrator</option>\n                      <option value=\"agent\">Agent</option>\n                      <option value=\"tool\">Tool</option>\n                      <option value=\"critic\">Critic</option>\n                    </select>\n                  </div>\n                  <div class=\"form-group half\">\n                    <label>Status</label>\n                    <select [(ngModel)]=\"node.status\">\n                      <option value=\"idle\">Idle</option>\n                      <option value=\"thinking\">Thinking</option>\n                      <option value=\"success\">Success</option>\n                      <option value=\"error\">Error</option>\n                    </select>\n                  </div>\n                </div>\n                <div class=\"form-group\">\n                  <label>Prompt Template</label>\n                  <textarea [(ngModel)]=\"node.prompt\" rows=\"3\" placeholder=\"Define agent prompt rules...\"></textarea>\n                </div>\n                <div class=\"form-group\">\n                  <label>Latest Response</label>\n                  <textarea [(ngModel)]=\"node.response\" rows=\"3\" placeholder=\"Mock agent response...\"></textarea>\n                </div>\n              </div>\n              <div class=\"modal-footer\">\n                <button class=\"btn btn-secondary\" (click)=\"activeEditingNode.set(null)\">Cancel</button>\n                <button class=\"btn btn-primary\" (click)=\"saveNodeEdit()\">Save Changes</button>\n              </div>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-topology-wrapper {\n      width: 100%;\n      height: 100%;\n      padding: 16px 20px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n    .ngx-topology-container {\n      position: relative;\n      width: 100%;\n      overflow: hidden;\n    }\n    .ngx-topology-svg {\n      width: 100%;\n      height: 100%;\n      display: block;\n      overflow: visible;\n    }\n\n    /* Links Flow animations */\n    .topology-link-path {\n      transition: stroke 0.25s, stroke-width 0.25s;\n    }\n    .link-active-flow {\n      stroke-dasharray: 6,4;\n      animation: linkFlow 0.8s linear infinite;\n    }\n    @keyframes linkFlow {\n      from { stroke-dashoffset: 20; }\n      to { stroke-dashoffset: 0; }\n    }\n\n    /* Edge labels */\n    .edge-label {\n      font-size: 9px;\n      fill: var(--text-secondary, #64748b);\n      font-family: system-ui, sans-serif;\n      pointer-events: none;\n    }\n\n    /* Link Delete circles in Edit Mode */\n    .link-delete-btn {\n      cursor: pointer;\n      opacity: 0.8;\n      transition: opacity 0.15s;\n    }\n    .link-delete-btn:hover {\n      opacity: 1;\n    }\n    .link-delete-btn circle {\n      transition: r 0.15s ease, fill 0.15s ease;\n    }\n    .link-delete-btn:hover circle {\n      r: 9;\n      fill: #dc2626;\n    }\n\n    /* SVG temporary connecting drag link */\n    .temporary-drag-link {\n      stroke: #f97316;\n      stroke-width: 2;\n      stroke-dasharray: 4,4;\n      pointer-events: none;\n    }\n\n    /* Connection ports inside SVG node group */\n    .connection-port {\n      fill: #ffffff;\n      stroke: #4f46e5;\n      stroke-width: 1.5;\n      cursor: crosshair;\n      transition: r 0.15s, fill 0.15s;\n    }\n    .connection-port:hover {\n      r: 6.5;\n      fill: #4f46e5;\n    }\n\n    /* Node delete badges */\n    .node-delete-btn {\n      cursor: pointer;\n      opacity: 0.8;\n      transition: opacity 0.15s;\n    }\n    .node-delete-btn:hover {\n      opacity: 1;\n    }\n    .node-delete-btn circle {\n      transition: r 0.15s ease, fill 0.15s ease;\n    }\n    .node-delete-btn:hover circle {\n      r: 8.5;\n      fill: #dc2626;\n    }\n\n    /* Nodes layout inside SVG foreignObject */\n    .node-group {\n      cursor: pointer;\n      transition: transform 0.2s ease-out;\n    }\n    .node-backdrop {\n      fill: #ffffff;\n      stroke: #cbd5e1;\n      stroke-width: 1.5px;\n      transition: all 0.2s;\n    }\n    .node-group:hover .node-backdrop {\n      stroke-width: 2px;\n      filter: drop-shadow(0 8px 12px rgba(99,102,241,0.18));\n    }\n    .node-html-container {\n      overflow: hidden;\n      border-radius: 10px;\n      pointer-events: none; /* Let clicks pass to the SVG parent <g> group */\n    }\n\n    /* Hover preview pill */\n    .hover-preview-container {\n      overflow: visible;\n      pointer-events: none;\n    }\n    .hover-preview {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      padding: 3px 8px;\n      background: rgba(15, 23, 42, 0.88);\n      backdrop-filter: blur(6px);\n      border-radius: 10px;\n      font-family: system-ui, sans-serif;\n      pointer-events: none;\n      white-space: nowrap;\n      max-width: 100%;\n    }\n    .hover-preview-label {\n      font-size: 11px;\n      font-weight: 600;\n      color: #f8fafc;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n    .hover-preview-badge {\n      font-size: 8px;\n      font-weight: 700;\n      text-transform: uppercase;\n      padding: 1px 5px;\n      border-radius: 6px;\n      letter-spacing: 0.04em;\n    }\n    .badge-idle {\n      background: #334155;\n      color: #94a3b8;\n    }\n    .badge-thinking {\n      background: rgba(99, 102, 241, 0.25);\n      color: #a5b4fc;\n    }\n    .badge-success {\n      background: rgba(34, 197, 94, 0.25);\n      color: #86efac;\n    }\n    .badge-error {\n      background: rgba(239, 68, 68, 0.25);\n      color: #fca5a5;\n    }\n\n    /* Node card HTML states */\n    .node-card {\n      width: 100%;\n      height: 100%;\n      padding: 8px 10px;\n      box-sizing: border-box;\n      display: flex;\n      flex-direction: column;\n      font-family: system-ui, sans-serif;\n    }\n    .node-card-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 4px;\n    }\n    .node-type {\n      font-size: 8px;\n      font-weight: 700;\n      color: #64748b;\n      letter-spacing: 0.05em;\n    }\n    .status-indicator {\n      width: 6px;\n      height: 6px;\n      border-radius: 50%;\n      background: #94a3b8;\n    }\n    .node-label {\n      font-size: 11px;\n      font-weight: 700;\n      color: #0f172a;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n    .node-prompt-preview {\n      font-size: 8px;\n      color: #64748b;\n      margin-top: 3px;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    /* Color variations based on Status */\n    .node-card.thinking .status-indicator {\n      background: #6366f1;\n      box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.7);\n      animation: statusIndicatorPulse 1.2s infinite;\n    }\n    @keyframes statusIndicatorPulse {\n      0% { box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.5); }\n      70% { box-shadow: 0 0 0 4px rgba(99, 102, 241, 0); }\n      100% { box-shadow: 0 0 0 0 rgba(99, 102, 241, 0); }\n    }\n    .node-group.node-thinking .node-backdrop {\n      stroke-width: 2px;\n      filter: drop-shadow(0 4px 10px rgba(99, 102, 241, 0.15));\n    }\n\n    .node-card.success .status-indicator {\n      background: #22c55e;\n    }\n\n    .node-card.error .status-indicator {\n      background: #ef4444;\n    }\n\n    /* Node status transition animations */\n    .node-status-thinking {\n      animation: thinkingPulse 2s ease-in-out infinite;\n    }\n    @keyframes thinkingPulse {\n      0%   { transform: var(--node-translate) scale(1); filter: drop-shadow(0 0 0 rgba(99,102,241,0)); }\n      50%  { transform: var(--node-translate) scale(1.03); filter: drop-shadow(0 0 8px rgba(99,102,241,0.35)); }\n      100% { transform: var(--node-translate) scale(1); filter: drop-shadow(0 0 0 rgba(99,102,241,0)); }\n    }\n    .node-status-success {\n      animation: successFlash 0.6s ease-out 1;\n    }\n    @keyframes successFlash {\n      0%   { filter: drop-shadow(0 0 0 rgba(34,197,94,0)); }\n      30%  { filter: drop-shadow(0 0 10px rgba(34,197,94,0.5)); }\n      100% { filter: drop-shadow(0 0 0 rgba(34,197,94,0)); }\n    }\n    .node-status-error {\n      animation: errorShake 0.4s ease-in-out 1;\n    }\n    @keyframes errorShake {\n      0%   { transform: var(--node-translate) translateX(0); }\n      20%  { transform: var(--node-translate) translateX(-3px); }\n      40%  { transform: var(--node-translate) translateX(3px); }\n      60%  { transform: var(--node-translate) translateX(-2px); }\n      80%  { transform: var(--node-translate) translateX(2px); }\n      100% { transform: var(--node-translate) translateX(0); }\n    }\n\n    /* Header & Titles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n    }\n    .topology-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--text-primary, #1e293b);\n    }\n    .topology-subtitle {\n      font-size: 11px;\n      color: var(--text-secondary, #64748b);\n      margin-top: 2px;\n    }\n    .highlight-val {\n      font-weight: 700;\n      color: #6366f1;\n      font-family: monospace;\n    }\n\n    /* Interactive editor toolbar styles */\n    .editor-toolbar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      background: rgba(241, 245, 249, 0.7);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 10px;\n      padding: 8px 14px;\n      margin-bottom: 14px;\n      gap: 12px;\n      flex-wrap: wrap;\n    }\n    .toolbar-section {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n    .tb-btn {\n      padding: 6px 12px;\n      font-size: 11px;\n      font-weight: 600;\n      background: #ffffff;\n      border: 1px solid #cbd5e1;\n      border-radius: 6px;\n      color: #334155;\n      cursor: pointer;\n      transition: all 0.15s;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n    }\n    .tb-btn:hover:not(:disabled) {\n      background: #f8fafc;\n      border-color: #94a3b8;\n    }\n    .tb-btn:disabled {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n    .tb-btn.primary {\n      background: #4f46e5;\n      color: #ffffff;\n      border-color: #4f46e5;\n    }\n    .tb-btn.primary:hover:not(:disabled) {\n      background: #4338ca;\n    }\n    .tb-btn.active {\n      background: #e0e7ff;\n      border-color: #6366f1;\n      color: #4f46e5;\n    }\n    .tb-divider {\n      height: 16px;\n      width: 1px;\n      background: #cbd5e1;\n    }\n    .validation-badge {\n      font-size: 11px;\n      font-weight: 600;\n      padding: 4px 10px;\n      border-radius: 6px;\n      background: #fee2e2;\n      color: #ef4444;\n      display: flex;\n      align-items: center;\n      gap: 4px;\n    }\n    .validation-badge.valid {\n      background: #dcfce7;\n      color: #15803d;\n    }\n\n    /* Actionable Tooltip Action Menu */\n    .topology-tooltip {\n      position: absolute;\n      z-index: 100;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.94));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 12px 14px;\n      border-radius: 12px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -105%);\n      width: 210px;\n      pointer-events: auto;\n      font-family: system-ui, sans-serif;\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 12px;\n      color: #38bdf8;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n    }\n    .tt-section {\n      margin-top: 6px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n    }\n    .section-title {\n      font-weight: 700;\n      color: #38bdf8;\n      font-size: 9px;\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n    }\n    .section-content {\n      margin: 0;\n      color: rgba(248, 250, 252, 0.85);\n      font-style: italic;\n      font-family: monospace;\n      font-size: 10px;\n      display: -webkit-box;\n      -webkit-line-clamp: 2;\n      -webkit-box-orient: vertical;\n      overflow: hidden;\n    }\n    .action-buttons-row {\n      margin-top: 10px;\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      border-top: 1px solid rgba(255, 255, 255, 0.15);\n      padding-top: 8px;\n    }\n    .action-btn {\n      color: #ffffff;\n      border: none;\n      border-radius: 4px;\n      padding: 5px 8px;\n      font-size: 10px;\n      cursor: pointer;\n      font-weight: 600;\n      transition: all 0.12s;\n      width: 100%;\n      text-align: left;\n    }\n    .action-btn.explain {\n      background: #4f46e5;\n    }\n    .action-btn.explain:hover {\n      background: #6366f1;\n    }\n    .action-btn.rerun {\n      background: #334155;\n    }\n    .action-btn.rerun:hover {\n      background: #475569;\n    }\n\n    /* Frosted glass Modal editor styling */\n    .modal-backdrop {\n      position: fixed;\n      top: 0; left: 0; width: 100vw; height: 100vh;\n      background: rgba(15, 23, 42, 0.45);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      z-index: 1000;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n    .modal-card {\n      background: var(--ngx-chart-bg, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 16px;\n      box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n      width: 90%;\n      max-width: 440px;\n      padding: 24px;\n      box-sizing: border-box;\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n      animation: modalAppear 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n    }\n    @keyframes modalAppear {\n      from { transform: scale(0.95); opacity: 0; }\n      to { transform: scale(1); opacity: 1; }\n    }\n    .modal-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid #e2e8f0;\n      padding-bottom: 12px;\n    }\n    .modal-header h3 {\n      margin: 0;\n      font-size: 15px;\n      font-weight: 700;\n      color: #0f172a;\n    }\n    .modal-close {\n      background: none;\n      border: none;\n      font-size: 22px;\n      color: #64748b;\n      cursor: pointer;\n    }\n    .modal-body {\n      display: flex;\n      flex-direction: column;\n      gap: 14px;\n    }\n    .form-group {\n      display: flex;\n      flex-direction: column;\n      gap: 5px;\n    }\n    .form-group label {\n      font-size: 10px;\n      font-weight: 700;\n      color: #475569;\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n    }\n    .form-group input, .form-group select, .form-group textarea {\n      padding: 8px 12px;\n      border: 1px solid #cbd5e1;\n      border-radius: 6px;\n      font-size: 12px;\n      font-family: inherit;\n      color: #0f172a;\n      outline: none;\n      background: #ffffff;\n      transition: border-color 0.15s;\n    }\n    .form-group input:focus, .form-group select:focus, .form-group textarea:focus {\n      border-color: #6366f1;\n    }\n    .form-row {\n      display: flex;\n      gap: 12px;\n    }\n    .form-group.half {\n      flex: 1;\n    }\n    .modal-footer {\n      display: flex;\n      justify-content: flex-end;\n      gap: 8px;\n      border-top: 1px solid #e2e8f0;\n      padding-top: 14px;\n    }\n    .btn {\n      padding: 8px 16px;\n      font-size: 11px;\n      font-weight: 600;\n      border-radius: 6px;\n      cursor: pointer;\n      border: 1px solid transparent;\n      transition: all 0.15s;\n    }\n    .btn-secondary {\n      background: #ffffff;\n      border-color: #cbd5e1;\n      color: #334155;\n    }\n    .btn-secondary:hover {\n      background: #f1f5f9;\n    }\n    .btn-primary {\n      background: #4f46e5;\n      color: #ffffff;\n    }\n    .btn-primary:hover {\n      background: #4338ca;\n    }\n    \n    /* Zoom controls floating style */\n    .zoom-controls {\n      position: absolute;\n      bottom: 12px;\n      right: 12px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      background: rgba(15, 23, 42, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      border-radius: 8px;\n      padding: 4px 8px;\n      box-shadow: 0 4px 6px rgba(0,0,0,0.1);\n      z-index: 10;\n    }\n    .zoom-controls button {\n      background: rgba(255, 255, 255, 0.15);\n      border: none;\n      color: #ffffff;\n      width: 24px;\n      height: 24px;\n      border-radius: 4px;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 10px;\n      transition: background 0.15s;\n    }\n    .zoom-controls button:hover {\n      background: rgba(255, 255, 255, 0.3);\n    }\n    .zoom-level {\n      color: rgba(255, 255, 255, 0.85);\n      font-size: 10px;\n      font-weight: 600;\n      font-family: monospace;\n      padding-left: 4px;\n      min-width: 32px;\n      text-align: right;\n    }\n  `]\n})\nexport class AgenticCognitiveTopologyComponent {\n  private readonly exportSvc = inject(ChartExportService);\n  nodes = input.required<TopologyNode[]>();\n  links = input.required<TopologyLink[]>();\n  width = input<number>(650);\n  height = input<number>(450);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(true);\n\n  // Interactive Editor Inputs\n  editable = input<boolean>(false);\n  gridSize = input<number>(20);\n\n  nodeActionClick = output<{ nodeId: string; action: string }>();\n  nodePositionChange = output<{ nodeId: string; x: number; y: number }>();\n  \n  // Interactive Editor Outputs\n  nodesChange = output<TopologyNode[]>();\n  linksChange = output<TopologyLink[]>();\n  validationError = output<string>();\n\n  // State\n  exportMenuOpen = signal(false);\n  tooltipData = signal<{ node: TopologyNode; screenX: number; screenY: number } | null>(null);\n\n  // Hover preview state\n  hoveredNodeId = signal<string | null>(null);\n\n  // Drag-to-reposition state\n  nodePositionOverrides = signal<Map<string, { x: number; y: number }>>(new Map());\n  draggingNodeId = signal<string | null>(null);\n  private dragOffsetX = 0;\n  private dragOffsetY = 0;\n\n  // Zoom & Pan State\n  scale = signal<number>(1);\n  translateX = signal<number>(0);\n  translateY = signal<number>(0);\n  isPanning = signal<boolean>(false);\n  \n  zoomPercent = computed(() => Math.round(this.scale() * 100));\n  transformString = computed(() => `translate(${this.translateX()}, ${this.translateY()}) scale(${this.scale()})`);\n\n  private startX = 0;\n  private startY = 0;\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  // Node Dimensions\n  nodeWidth = 135;\n  nodeHeight = 55;\n\n  // Interactive Editor State Signals\n  activeEditingNode = signal<TopologyNode | null>(null);\n  activePortDrag = signal<{ nodeId: string; portX: number; portY: number; dir: [number, number] } | null>(null);\n  portDragCurrentMouse = signal<{ x: number; y: number } | null>(null);\n  snapToGridActive = signal<boolean>(true);\n  \n  undoStack = signal<{\n    addedNodes: TopologyNode[];\n    deletedNodeIds: Set<string>;\n    editedNodesMap: Map<string, TopologyNode>;\n    addedLinks: TopologyLink[];\n    deletedLinks: Set<string>;\n    nodePositionOverrides: Map<string, { x: number; y: number }>;\n  }[]>([]);\n  redoStack = signal<{\n    addedNodes: TopologyNode[];\n    deletedNodeIds: Set<string>;\n    editedNodesMap: Map<string, TopologyNode>;\n    addedLinks: TopologyLink[];\n    deletedLinks: Set<string>;\n    nodePositionOverrides: Map<string, { x: number; y: number }>;\n  }[]>([]);\n\n  // Functional Overrides to avoid syncing state anomalies\n  addedNodes = signal<TopologyNode[]>([]);\n  deletedNodeIds = signal<Set<string>>(new Set());\n  editedNodesMap = signal<Map<string, TopologyNode>>(new Map());\n  addedLinks = signal<TopologyLink[]>([]);\n  deletedLinks = signal<Set<string>>(new Set());\n\n  // Merge functional state signals reactively\n  effectiveNodes = computed(() => {\n    const base = this.nodes();\n    const added = this.addedNodes();\n    const deleted = this.deletedNodeIds();\n    const edited = this.editedNodesMap();\n\n    let combined = [...base, ...added];\n    combined = combined.filter(n => !deleted.has(n.id));\n    combined = combined.map(n => edited.has(n.id) ? edited.get(n.id)! : n);\n    return combined;\n  });\n\n  effectiveLinks = computed(() => {\n    const base = this.links();\n    const added = this.addedLinks();\n    const deleted = this.deletedLinks();\n    const deletedNodes = this.deletedNodeIds();\n\n    let combined = [...base, ...added];\n    combined = combined.filter(l => !deleted.has(`${l.source}-${l.target}`));\n    combined = combined.filter(l => !deletedNodes.has(l.source) && !deletedNodes.has(l.target));\n    return combined;\n  });\n\n  /** Color map: maps lowercase node type string to a color from the colors input */\n  private typeColorMap = computed<Map<string, string>>(() => {\n    const rawNodes = this.effectiveNodes();\n    const c = this.colors();\n    const map = new Map<string, string>();\n    let idx = 0;\n    rawNodes.forEach(n => {\n      const t = (n.type || 'agent').toLowerCase();\n      if (!map.has(t)) {\n        map.set(t, c[idx % c.length]);\n        idx++;\n      }\n    });\n    return map;\n  });\n\n  /** Status-based override colors (take priority over type colors) */\n  private statusColorMap: Record<string, string> = {\n    thinking: '#6366f1',\n    success: '#22c55e',\n    error: '#ef4444'\n  };\n\n  viewBoxString = computed(() => `0 0 ${this.width()} ${this.height()}`);\n\n  constructor() {\n    effect(() => {\n      const svg = this.svgEl()?.nativeElement;\n      if (!svg) return;\n\n      const handler = (e: WheelEvent) => {\n        this.onWheel(e);\n      };\n\n      // Register non-passive wheel event listener\n      svg.addEventListener('wheel', handler, { passive: false });\n\n      // Return cleanup function to remove listener on destroy/change\n      return () => {\n        svg.removeEventListener('wheel', handler);\n      };\n    });\n  }\n\n  activeAgentsCount = computed(() => {\n    return this.effectiveNodes().filter(n => n.status !== 'idle').length;\n  });\n\n  // Balanced Layered DAG layout algorithm calculated in-component\n  computedNodes = computed<ProcessedNode[]>(() => {\n    const rawNodes = this.effectiveNodes();\n    const rawLinks = this.effectiveLinks();\n    const overrides = this.nodePositionOverrides();\n    if (!rawNodes.length) return [];\n\n    // Find links map\n    const incomingCount: Record<string, number> = {};\n    const outgoingMap: Record<string, string[]> = {};\n    \n    rawNodes.forEach(n => {\n      incomingCount[n.id] = 0;\n      outgoingMap[n.id] = [];\n    });\n\n    rawLinks.forEach(link => {\n      if (incomingCount[link.target] !== undefined) incomingCount[link.target]++;\n      if (outgoingMap[link.source] !== undefined) outgoingMap[link.source].push(link.target);\n    });\n\n    // BFS Topological level mapping with cycle detection\n    const depthMap: Record<string, number> = {};\n    const visited = new Set<string>();\n    const queue: string[] = [];\n\n    // Identify roots\n    rawNodes.forEach(n => {\n      if (incomingCount[n.id] === 0) {\n        queue.push(n.id);\n        depthMap[n.id] = 0;\n      }\n    });\n\n    // Fallback if no root\n    if (queue.length === 0 && rawNodes.length > 0) {\n      queue.push(rawNodes[0].id);\n      depthMap[rawNodes[0].id] = 0;\n    }\n\n    let maxDepth = 0;\n    while (queue.length > 0) {\n      const current = queue.shift()!;\n      const curDepth = depthMap[current];\n\n      // Cycle detection: skip if already fully visited at this or deeper depth\n      if (visited.has(current)) {\n        continue;\n      }\n      visited.add(current);\n      \n      const outgoing = outgoingMap[current] || [];\n      outgoing.forEach(target => {\n        const nextDepth = curDepth + 1;\n        if (depthMap[target] === undefined || nextDepth > depthMap[target]) {\n          // Check for back-edge cycle: target already visited at a shallower depth\n          if (visited.has(target)) {\n            console.warn(`[ngx-agentic-cognitive-topology] Cycle detected: ${current} → ${target}. Skipping re-traversal.`);\n            return;\n          }\n          depthMap[target] = nextDepth;\n          if (nextDepth > maxDepth) maxDepth = nextDepth;\n          queue.push(target);\n        }\n      });\n    }\n\n    // Nodes grouped by depth level\n    const depthGroups: Record<number, string[]> = {};\n    for (let d = 0; d <= maxDepth; d++) {\n      depthGroups[d] = [];\n    }\n\n    rawNodes.forEach(n => {\n      const d = depthMap[n.id] ?? 0;\n      if (depthGroups[d] === undefined) {\n        depthGroups[d] = [];\n      }\n      depthGroups[d].push(n.id);\n    });\n\n    // Compute coordinates\n    const computedNodesList: ProcessedNode[] = [];\n    const w = this.width();\n    const h = this.height();\n\n    // Map each group horizontally/vertically\n    const levelsCount = maxDepth + 1;\n    const paddingY = 40;\n    const availableH = h - paddingY * 2;\n    const levelSpacingY = levelsCount > 1 ? availableH / maxDepth : availableH;\n\n    rawNodes.forEach(n => {\n      // Check drag position overrides first\n      const override = overrides.get(n.id);\n      if (override) {\n        computedNodesList.push({\n          ...n,\n          x: override.x,\n          y: override.y,\n          depth: depthMap[n.id] ?? 0\n        });\n        return;\n      }\n\n      // If coordinates are manually specified, respect them\n      if (n.x !== undefined && n.y !== undefined) {\n        computedNodesList.push({\n          ...n,\n          x: n.x,\n          y: n.y,\n          depth: depthMap[n.id] ?? 0\n        });\n        return;\n      }\n\n      const d = depthMap[n.id] ?? 0;\n      const group = depthGroups[d] || [n.id];\n      const indexInGroup = group.indexOf(n.id);\n      const totalInGroup = group.length;\n\n      // Vertical spacing Y\n      const y = paddingY + d * levelSpacingY;\n\n      // Horizontal layout X\n      const availableW = w - 80;\n      const xSpacing = totalInGroup > 1 ? availableW / (totalInGroup - 1) : availableW;\n      const x = totalInGroup > 1 \n        ? 40 + indexInGroup * xSpacing \n        : w / 2;\n\n      computedNodesList.push({\n        ...n,\n        x,\n        y,\n        depth: d\n      });\n    });\n\n    return computedNodesList;\n  });\n\n  computedLinks = computed(() => {\n    const nodes = this.computedNodes();\n    const rawLinks = this.effectiveLinks();\n    const nodeMap = new Map<string, ProcessedNode>();\n    nodes.forEach(n => nodeMap.set(n.id, n));\n\n    return rawLinks.map(link => {\n      const src = nodeMap.get(link.source);\n      const dest = nodeMap.get(link.target);\n      \n      if (!src || !dest) {\n        return {\n          source: link.source,\n          target: link.target,\n          path: '',\n          active: false,\n          label: link.label,\n          srcX: 0,\n          srcY: 0,\n          destX: 0,\n          destY: 0,\n          cp1X: 0,\n          cp1Y: 0,\n          cp2X: 0,\n          cp2Y: 0\n        };\n      }\n\n      // Dynamic ports selection based on closest Euclidean distance\n      const w = this.nodeWidth;\n      const h = this.nodeHeight;\n\n      const srcPorts = [\n        { x: src.x, y: src.y - h / 2, dir: [0, -1] }, // Top\n        { x: src.x, y: src.y + h / 2, dir: [0, 1] },  // Bottom\n        { x: src.x - w / 2, y: src.y, dir: [-1, 0] }, // Left\n        { x: src.x + w / 2, y: src.y, dir: [1, 0] }   // Right\n      ];\n\n      const destPorts = [\n        { x: dest.x, y: dest.y - h / 2, dir: [0, -1] }, // Top\n        { x: dest.x, y: dest.y + h / 2, dir: [0, 1] },  // Bottom\n        { x: dest.x - w / 2, y: dest.y, dir: [-1, 0] }, // Left\n        { x: dest.x + w / 2, y: dest.y, dir: [1, 0] }   // Right\n      ];\n\n      let minDistance = Infinity;\n      let bestSrc = srcPorts[1];  // Default bottom\n      let bestDest = destPorts[0]; // Default top\n\n      srcPorts.forEach(sp => {\n        destPorts.forEach(dp => {\n          const dx = dp.x - sp.x;\n          const dy = dp.y - sp.y;\n          const dist = Math.sqrt(dx * dx + dy * dy);\n          if (dist < minDistance) {\n            minDistance = dist;\n            bestSrc = sp;\n            bestDest = dp;\n          }\n        });\n      });\n\n      const x1 = bestSrc.x;\n      const y1 = bestSrc.y;\n      const x2 = bestDest.x;\n      const y2 = bestDest.y;\n\n      const dx = Math.abs(x2 - x1);\n      const dy = Math.abs(y2 - y1);\n      const offset = Math.max(30, Math.min(100, Math.max(dx, dy) * 0.4));\n\n      const cp1x = x1 + bestSrc.dir[0] * offset;\n      const cp1y = y1 + bestSrc.dir[1] * offset;\n      const cp2x = x2 + bestDest.dir[0] * offset;\n      const cp2y = y2 + bestDest.dir[1] * offset;\n\n      const path = `M ${x1} ${y1} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${x2} ${y2}`;\n\n      // A link is active if active === true OR source node is currently thinking\n      const active = !!link.active || src.status === 'thinking';\n\n      return {\n        source: link.source,\n        target: link.target,\n        path,\n        active,\n        label: link.label,\n        srcX: x1,\n        srcY: y1,\n        destX: x2,\n        destY: y2,\n        cp1X: cp1x,\n        cp1Y: cp1y,\n        cp2X: cp2x,\n        cp2Y: cp2y\n      };\n    });\n  });\n\n  // SVG port connection path trace (Cubic bezier curved connector from port center to mouse)\n  temporaryDragLinkPath = computed(() => {\n    const drag = this.activePortDrag();\n    const mouse = this.portDragCurrentMouse();\n    if (!drag || !mouse) return '';\n    const x1 = drag.portX;\n    const y1 = drag.portY;\n    const x2 = mouse.x;\n    const y2 = mouse.y;\n    const cp1x = x1 + drag.dir[0] * 60;\n    const cp1y = y1 + drag.dir[1] * 60;\n    return `M ${x1} ${y1} C ${cp1x} ${cp1y}, ${cp1x} ${cp1y}, ${x2} ${y2}`;\n  });\n\n  // Validation report generator\n  validationReport = computed(() => {\n    const nodes = this.effectiveNodes();\n    const links = this.effectiveLinks();\n    \n    const incoming: Record<string, number> = {};\n    const outgoing: Record<string, number> = {};\n    nodes.forEach(n => {\n      incoming[n.id] = 0;\n      outgoing[n.id] = 0;\n    });\n    \n    links.forEach(l => {\n      if (incoming[l.target] !== undefined) incoming[l.target]++;\n      if (outgoing[l.source] !== undefined) outgoing[l.source]++;\n    });\n\n    const orphans = nodes.filter(n => incoming[n.id] === 0 && outgoing[n.id] === 0).map(n => n.id);\n    const hasCycles = this.detectCyclesGlobal();\n\n    return {\n      orphans,\n      hasCycles,\n      isValid: orphans.length === 0 && !hasCycles\n    };\n  });\n\n  onNodeClick(node: TopologyNode, event: MouseEvent): void {\n    if (this.editable()) return; // Don't trigger action tooltip menu in edit mode\n    event.stopPropagation();\n    \n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const currentScale = this.scale();\n    const screenX = (node.x ?? this.width() / 2) * currentScale + this.translateX();\n    const screenY = ((node.y ?? this.height() / 2) - this.nodeHeight / 2) * currentScale + this.translateY();\n\n    this.tooltipData.set({\n      node,\n      screenX,\n      screenY\n    });\n  }\n\n  onCanvasClick(): void {\n    this.closeTooltip();\n  }\n\n  closeTooltip(): void {\n    this.tooltipData.set(null);\n  }\n\n  triggerAction(action: string, nodeId: string): void {\n    this.nodeActionClick.emit({ nodeId, action });\n    this.closeTooltip();\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const payload = { nodes: this.effectiveNodes(), links: this.effectiveLinks() };\n    this.exportSvc.downloadJson(payload, 'topology-flow-data.json');\n  }\n\n  exportToCsv(): void {\n    const links = this.effectiveLinks();\n    if (!links.length) return;\n    const headers = ['Source', 'Target', 'Active'];\n    const rows = links.map(l => [l.source, l.target, l.active ? 'true' : 'false']);\n    this.exportSvc.downloadCsv(headers, rows, 'topology-flow-data.csv');\n  }\n\n  exportToSvg(): void {\n    this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'cognitive-topology.svg');\n  }\n\n  exportToPdf(): void {\n    this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Chart Export', 'cognitive-topology.pdf');\n  }\n\n  // ── Color helpers ──\n\n  /** Returns the border color for a node, based on status (priority) or type (from colors input) */\n  getNodeBorderColor(node: ProcessedNode): string {\n    // Status colors take priority\n    if (node.status !== 'idle' && this.statusColorMap[node.status]) {\n      return this.statusColorMap[node.status];\n    }\n    // Fall back to type-based color from the colors input\n    const t = (node.type || 'agent').toLowerCase();\n    return this.typeColorMap().get(t) ?? '#cbd5e1';\n  }\n\n  // ── Edge label midpoint helpers (cubic Bézier midpoint at t=0.5) ──\n\n  getMidpointX(link: { srcX: number; destX: number; cp1X: number; cp2X: number }): number {\n    const t = 0.5;\n    const x0 = link.srcX;\n    const x1 = link.cp1X;\n    const x2 = link.cp2X;\n    const x3 = link.destX;\n    return Math.pow(1-t,3)*x0 + 3*Math.pow(1-t,2)*t*x1 + 3*(1-t)*Math.pow(t,2)*x2 + Math.pow(t,3)*x3;\n  }\n\n  getMidpointY(link: { srcY: number; destY: number; cp1Y: number; cp2Y: number }): number {\n    const t = 0.5;\n    const y0 = link.srcY;\n    const y1 = link.cp1Y;\n    const y2 = link.cp2Y;\n    const y3 = link.destY;\n    return Math.pow(1-t,3)*y0 + 3*Math.pow(1-t,2)*t*y1 + 3*(1-t)*Math.pow(t,2)*y2 + Math.pow(t,3)*y3;\n  }\n\n  // ── Undo/Redo & State History Snapshots ──\n\n  saveHistory(): void {\n    const snapshot = {\n      addedNodes: [...this.addedNodes()],\n      deletedNodeIds: new Set(this.deletedNodeIds()),\n      editedNodesMap: new Map(this.editedNodesMap()),\n      addedLinks: [...this.addedLinks()],\n      deletedLinks: new Set(this.deletedLinks()),\n      nodePositionOverrides: new Map(this.nodePositionOverrides())\n    };\n    this.undoStack.update(stack => [...stack, snapshot]);\n    this.redoStack.set([]); // Clear redo stack on new action\n  }\n\n  applySnapshot(snap: any): void {\n    this.addedNodes.set(snap.addedNodes);\n    this.deletedNodeIds.set(snap.deletedNodeIds);\n    this.editedNodesMap.set(snap.editedNodesMap);\n    this.addedLinks.set(snap.addedLinks);\n    this.deletedLinks.set(snap.deletedLinks);\n    this.nodePositionOverrides.set(snap.nodePositionOverrides);\n\n    // Emit changes to parent\n    this.nodesChange.emit(this.effectiveNodes());\n    this.linksChange.emit(this.effectiveLinks());\n  }\n\n  undo(): void {\n    const stack = this.undoStack();\n    if (stack.length === 0) return;\n    \n    // Save current state to redo stack\n    const current = {\n      addedNodes: [...this.addedNodes()],\n      deletedNodeIds: new Set(this.deletedNodeIds()),\n      editedNodesMap: new Map(this.editedNodesMap()),\n      addedLinks: [...this.addedLinks()],\n      deletedLinks: new Set(this.deletedLinks()),\n      nodePositionOverrides: new Map(this.nodePositionOverrides())\n    };\n    this.redoStack.update(rStack => [...rStack, current]);\n\n    const previous = stack[stack.length - 1];\n    this.undoStack.set(stack.slice(0, -1));\n    this.applySnapshot(previous);\n  }\n\n  redo(): void {\n    const rStack = this.redoStack();\n    if (rStack.length === 0) return;\n\n    // Save current state to undo stack\n    const current = {\n      addedNodes: [...this.addedNodes()],\n      deletedNodeIds: new Set(this.deletedNodeIds()),\n      editedNodesMap: new Map(this.editedNodesMap()),\n      addedLinks: [...this.addedLinks()],\n      deletedLinks: new Set(this.deletedLinks()),\n      nodePositionOverrides: new Map(this.nodePositionOverrides())\n    };\n    this.undoStack.update(stack => [...stack, current]);\n\n    const next = rStack[rStack.length - 1];\n    this.redoStack.set(rStack.slice(0, -1));\n    this.applySnapshot(next);\n  }\n\n  // Keyboard shortcut listener\n  @HostListener('document:keydown', ['$event'])\n  handleKeyDown(event: KeyboardEvent): void {\n    if (!this.editable()) return;\n    \n    const target = event.target as HTMLElement;\n    if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n      return;\n    }\n\n    if (event.ctrlKey || event.metaKey) {\n      if (event.key.toLowerCase() === 'z') {\n        event.preventDefault();\n        this.undo();\n      } else if (event.key.toLowerCase() === 'y') {\n        event.preventDefault();\n        this.redo();\n      }\n    }\n  }\n\n  autoLayout(): void {\n    this.saveHistory();\n    this.nodePositionOverrides.set(new Map());\n    \n    // Clear manual x,y on any added nodes so they layout topological\n    this.addedNodes.update(nodes => nodes.map(n => {\n      const { x, y, ...rest } = n;\n      return rest;\n    }));\n\n    this.nodesChange.emit(this.effectiveNodes());\n  }\n\n  addNode(): void {\n    this.saveHistory();\n    const nextId = 'node_' + Math.random().toString(36).substring(2, 8);\n    const newNode: TopologyNode = {\n      id: nextId,\n      label: 'New Agent',\n      status: 'idle',\n      type: 'agent',\n      prompt: '',\n      response: '',\n      x: this.width() / 2 - this.translateX(),\n      y: this.height() / 2 - this.translateY()\n    };\n    \n    // Snapped default positioning\n    const overrides = new Map(this.nodePositionOverrides());\n    let x = newNode.x!;\n    let y = newNode.y!;\n    if (this.snapToGridActive()) {\n      const grid = this.gridSize();\n      x = Math.round(x / grid) * grid;\n      y = Math.round(y / grid) * grid;\n    }\n    overrides.set(nextId, { x, y });\n    this.nodePositionOverrides.set(overrides);\n\n    this.addedNodes.update(nodes => [...nodes, newNode]);\n    this.nodesChange.emit(this.effectiveNodes());\n  }\n\n  deleteNode(nodeId: string, event: MouseEvent): void {\n    event.stopPropagation();\n    this.saveHistory();\n    \n    const overrides = new Map(this.nodePositionOverrides());\n    overrides.delete(nodeId);\n    this.nodePositionOverrides.set(overrides);\n\n    this.deletedNodeIds.update(set => {\n      const copy = new Set(set);\n      copy.add(nodeId);\n      return copy;\n    });\n\n    this.nodesChange.emit(this.effectiveNodes());\n    this.linksChange.emit(this.effectiveLinks());\n  }\n\n  deleteLink(source: string, target: string, event: MouseEvent): void {\n    event.stopPropagation();\n    this.saveHistory();\n\n    const linkKey = `${source}-${target}`;\n    this.deletedLinks.update(set => {\n      const copy = new Set(set);\n      copy.add(linkKey);\n      return copy;\n    });\n\n    // Also remove from addedLinks if present\n    this.addedLinks.update(links => links.filter(l => !(l.source === source && l.target === target)));\n\n    this.linksChange.emit(this.effectiveLinks());\n  }\n\n  onNodeDblClick(node: TopologyNode, event: MouseEvent): void {\n    if (!this.editable()) return;\n    event.stopPropagation();\n    this.activeEditingNode.set({ ...node });\n  }\n\n  saveNodeEdit(): void {\n    const edited = this.activeEditingNode();\n    if (!edited) return;\n    this.saveHistory();\n\n    this.editedNodesMap.update(map => {\n      const copy = new Map(map);\n      copy.set(edited.id, edited);\n      return copy;\n    });\n\n    this.activeEditingNode.set(null);\n    this.nodesChange.emit(this.effectiveNodes());\n  }\n\n  // ── Drag connection drawing logic ──\n\n  onPortMouseDown(node: ProcessedNode, dir: [number, number], event: MouseEvent): void {\n    if (!this.editable()) return;\n    event.stopPropagation();\n    event.preventDefault();\n    \n    const w = this.nodeWidth;\n    const h = this.nodeHeight;\n    let portX = node.x;\n    let portY = node.y;\n    if (dir[0] === 0 && dir[1] === -1) { portY -= h/2; }\n    else if (dir[0] === 0 && dir[1] === 1) { portY += h/2; }\n    else if (dir[0] === -1 && dir[1] === 0) { portX -= w/2; }\n    else if (dir[0] === 1 && dir[1] === 0) { portX += w/2; }\n\n    this.activePortDrag.set({\n      nodeId: node.id,\n      portX,\n      portY,\n      dir\n    });\n    this.portDragCurrentMouse.set({ x: portX, y: portY });\n  }\n\n  // ── Node drag-to-reposition ──\n\n  onNodeMouseDown(node: ProcessedNode, event: MouseEvent): void {\n    if (event.button !== 0) return;\n    event.stopPropagation();\n    event.preventDefault();\n\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const rect = svg.getBoundingClientRect();\n    const currentScale = this.scale();\n    \n    const svgX = (event.clientX - rect.left - this.translateX()) / currentScale;\n    const svgY = (event.clientY - rect.top - this.translateY()) / currentScale;\n\n    this.dragOffsetX = svgX - node.x;\n    this.dragOffsetY = svgY - node.y;\n    this.draggingNodeId.set(node.id);\n    \n    // Save history point before dragging start\n    if (this.editable()) {\n      this.saveHistory();\n    }\n  }\n\n  // Zoom & Pan Mouse Interaction Event Handlers\n  onMouseDown(event: MouseEvent): void {\n    if (event.button !== 0) return;\n    if (this.draggingNodeId() || this.activePortDrag()) return;\n    \n    const target = event.target as HTMLElement;\n    if (target.closest('.node-group') || target.closest('.topology-tooltip') || target.closest('.zoom-controls') || target.closest('.chart-export-menu') || target.closest('.editor-toolbar') || target.closest('.modal-card')) {\n      return;\n    }\n\n    event.preventDefault();\n    this.isPanning.set(true);\n    this.startX = event.clientX - this.translateX();\n    this.startY = event.clientY - this.translateY();\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const dragId = this.draggingNodeId();\n    const portDrag = this.activePortDrag();\n\n    if (dragId) {\n      const svg = this.svgEl()?.nativeElement;\n      if (!svg) return;\n      const rect = svg.getBoundingClientRect();\n      const currentScale = this.scale();\n      const svgX = (event.clientX - rect.left - this.translateX()) / currentScale;\n      const svgY = (event.clientY - rect.top - this.translateY()) / currentScale;\n\n      const newX = svgX - this.dragOffsetX;\n      const newY = svgY - this.dragOffsetY;\n\n      let x = newX;\n      let y = newY;\n      if (this.editable() && this.snapToGridActive()) {\n        const grid = this.gridSize();\n        x = Math.round(newX / grid) * grid;\n        y = Math.round(newY / grid) * grid;\n      }\n\n      const current = new Map(this.nodePositionOverrides());\n      current.set(dragId, { x, y });\n      this.nodePositionOverrides.set(current);\n      return;\n    }\n\n    if (portDrag) {\n      const svg = this.svgEl()?.nativeElement;\n      if (!svg) return;\n      const rect = svg.getBoundingClientRect();\n      const currentScale = this.scale();\n      const svgX = (event.clientX - rect.left - this.translateX()) / currentScale;\n      const svgY = (event.clientY - rect.top - this.translateY()) / currentScale;\n\n      this.portDragCurrentMouse.set({ x: svgX, y: svgY });\n      return;\n    }\n\n    if (!this.isPanning()) return;\n    this.translateX.set(event.clientX - this.startX);\n    this.translateY.set(event.clientY - this.startY);\n  }\n\n  onMouseUp(): void {\n    const dragId = this.draggingNodeId();\n    const portDrag = this.activePortDrag();\n\n    if (dragId) {\n      const pos = this.nodePositionOverrides().get(dragId);\n      if (pos) {\n        this.nodePositionChange.emit({ nodeId: dragId, x: pos.x, y: pos.y });\n      }\n      this.draggingNodeId.set(null);\n      return;\n    }\n\n    if (portDrag) {\n      const targetId = this.hoveredNodeId();\n      const sourceId = portDrag.nodeId;\n      \n      if (targetId && targetId !== sourceId) {\n        const introducesCycle = this.checkCycle(targetId, sourceId); // Cycles check\n        const alreadyConnected = this.effectiveLinks().some(l => l.source === sourceId && l.target === targetId);\n\n        if (alreadyConnected) {\n          this.validationError.emit(`Connection already exists between ${sourceId} and ${targetId}.`);\n        } else if (introducesCycle) {\n          this.validationError.emit(`Cannot connect: introducing a cyclic dependency.`);\n        } else {\n          this.saveHistory();\n          const newLink: TopologyLink = {\n            source: sourceId,\n            target: targetId,\n            active: false\n          };\n          this.addedLinks.update(links => [...links, newLink]);\n          this.linksChange.emit(this.effectiveLinks());\n        }\n      }\n      this.activePortDrag.set(null);\n      this.portDragCurrentMouse.set(null);\n      return;\n    }\n\n    this.isPanning.set(false);\n  }\n\n  onMouseLeave(): void {\n    if (this.draggingNodeId()) {\n      const dragId = this.draggingNodeId()!;\n      const pos = this.nodePositionOverrides().get(dragId);\n      if (pos) {\n        this.nodePositionChange.emit({ nodeId: dragId, x: pos.x, y: pos.y });\n      }\n      this.draggingNodeId.set(null);\n    }\n    this.activePortDrag.set(null);\n    this.portDragCurrentMouse.set(null);\n    this.isPanning.set(false);\n    this.hoveredNodeId.set(null);\n  }\n\n  onWheel(event: WheelEvent): void {\n    event.preventDefault();\n    const zoomFactor = 1.15;\n    let newScale = this.scale();\n    if (event.deltaY < 0) {\n      newScale *= zoomFactor;\n    } else {\n      newScale /= zoomFactor;\n    }\n    \n    // Boundary constraints: min 0.3x, max 3.0x zoom\n    newScale = Math.max(0.3, Math.min(3, newScale));\n    \n    const svg = this.svgEl()?.nativeElement;\n    if (svg) {\n      const rect = svg.getBoundingClientRect();\n      const mouseX = event.clientX - rect.left;\n      const mouseY = event.clientY - rect.top;\n      \n      const currentScale = this.scale();\n      const svgX = (mouseX - this.translateX()) / currentScale;\n      const svgY = (mouseY - this.translateY()) / currentScale;\n      \n      this.scale.set(newScale);\n      this.translateX.set(mouseX - svgX * newScale);\n      this.translateY.set(mouseY - svgY * newScale);\n    } else {\n      this.scale.set(newScale);\n    }\n  }\n\n  zoomIn(): void {\n    const nextScale = Math.min(3, this.scale() * 1.2);\n    this.scale.set(nextScale);\n  }\n\n  zoomOut(): void {\n    const nextScale = Math.max(0.3, this.scale() / 1.2);\n    this.scale.set(nextScale);\n  }\n\n  resetZoom(): void {\n    this.scale.set(1);\n    this.translateX.set(0);\n    this.translateY.set(0);\n  }\n\n  // ── DAG Helper validations ──\n\n  checkCycle(start: string, target: string): boolean {\n    const links = this.effectiveLinks();\n    const adj: Record<string, string[]> = {};\n    this.effectiveNodes().forEach(n => adj[n.id] = []);\n    links.forEach(l => {\n      if (adj[l.source]) adj[l.source].push(l.target);\n    });\n    \n    const queue = [start];\n    const visited = new Set<string>();\n    while (queue.length > 0) {\n      const cur = queue.shift()!;\n      if (cur === target) return true;\n      if (visited.has(cur)) continue;\n      visited.add(cur);\n      const neighbors = adj[cur] || [];\n      for (const n of neighbors) {\n        if (!visited.has(n)) {\n          queue.push(n);\n        }\n      }\n    }\n    return false;\n  }\n\n  detectCyclesGlobal(): boolean {\n    const nodes = this.effectiveNodes();\n    const links = this.effectiveLinks();\n    const adj: Record<string, string[]> = {};\n    nodes.forEach(n => adj[n.id] = []);\n    links.forEach(l => {\n      if (adj[l.source]) adj[l.source].push(l.target);\n    });\n\n    const visited = new Set<string>();\n    const recStack = new Set<string>();\n\n    const dfs = (nodeId: string): boolean => {\n      if (recStack.has(nodeId)) return true;\n      if (visited.has(nodeId)) return false;\n\n      visited.add(nodeId);\n      recStack.add(nodeId);\n\n      const neighbors = adj[nodeId] || [];\n      for (const neighbor of neighbors) {\n        if (dfs(neighbor)) return true;\n      }\n\n      recStack.delete(nodeId);\n      return false;\n    };\n\n    for (const node of nodes) {\n      if (!visited.has(node.id)) {\n        if (dfs(node.id)) return true;\n      }\n    }\n    return false;\n  }\n\n  exportWorkflowSchema(): void {\n    const payload = {\n      schemaVersion: \"1.0.0\",\n      description: \"Cognitive workflow schema exported from ngx-agentic-cognitive-topology\",\n      graph: {\n        nodes: this.effectiveNodes().map(n => ({\n          id: n.id,\n          label: n.label,\n          type: n.type || 'agent',\n          metadata: {\n            prompt: n.prompt || '',\n            response: n.response || ''\n          }\n        })),\n        edges: this.effectiveLinks().map(l => ({\n          source: l.source,\n          target: l.target,\n          label: l.label || ''\n        }))\n      }\n    };\n\n    if (typeof navigator !== 'undefined' && navigator.clipboard) {\n      navigator.clipboard.writeText(JSON.stringify(payload, null, 2))\n        .then(() => this.validationError.emit(\"Workflow schema copied to clipboard!\"))\n        .catch(() => console.error(\"Clipboard copy failed\"));\n    }\n  }\n}\n","import {\n  Component, input, output, signal, computed, ChangeDetectionStrategy,\n  ElementRef, viewChild, HostListener\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'ngx-transformer-attention-heatmap',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-attention-wrapper\">\n      <div class=\"chart-header\" (mousemove)=\"$event.stopPropagation()\">\n        <div class=\"chart-title-space\">\n          <div class=\"heatmap-title\">{{ title() }}</div>\n          <div class=\"heatmap-subtitle\">\n            @if (subtitle()) {\n              {{ subtitle() }}\n            } @else {\n              Matrix Size: <span class=\"highlight-val\">{{ tokensY().length }} x {{ tokensX().length }}</span>\n            }\n          </div>\n        </div>\n        @if (showExport()) {\n          <div class=\"chart-export-menu\">\n            <button class=\"export-trigger\" (click)=\"toggleExportMenu($event)\" aria-label=\"Export Menu\">📤 Export</button>\n            @if (exportMenuOpen()) {\n              <div class=\"export-dropdown\">\n                <button (click)=\"onExport('json')\">📊 Export JSON</button>\n                <button (click)=\"onExport('csv')\">📄 Export CSV</button>\n                <button (click)=\"onExport('svg')\">🖼️ Export SVG</button>\n                <button (click)=\"onExport('pdf')\">📕 Export PDF</button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n\n      @if (heads() && heads()!.length > 1) {\n        <div class=\"head-selector\">\n          @for (head of heads()!; track $index; let i = $index) {\n            <button\n              class=\"head-btn\"\n              [class.active]=\"activeHeadIndex() === i\"\n              (click)=\"activeHeadIndex.set(i)\"\n            >\n              {{ headLabels()[i] || 'Head ' + (i + 1) }}\n            </button>\n          }\n        </div>\n      }\n\n      <div class=\"ngx-attention-container\" [style.height.px]=\"height()\">\n        <!-- SVG Grid rendering -->\n        <svg\n          #svgEl\n          class=\"ngx-attention-svg\"\n          [attr.viewBox]=\"viewBoxString()\"\n          [attr.height]=\"height()\"\n          tabindex=\"0\"\n          (keydown)=\"onKeyDown($event)\"\n        >\n          <!-- Color Scale Gradient Definition -->\n          <defs>\n            <linearGradient [attr.id]=\"gradientId\" x1=\"0\" y1=\"1\" x2=\"0\" y2=\"0\">\n              <stop offset=\"0%\" [attr.stop-color]=\"colors()[0]\" />\n              <stop offset=\"100%\" [attr.stop-color]=\"colors()[1]\" />\n            </linearGradient>\n          </defs>\n          <!-- Y-axis Label Tokens (Left) -->\n          @for (yTok of tokensY(); track $index; let rIdx = $index) {\n            <text\n              [attr.x]=\"leftOffset - 12\"\n              [attr.y]=\"getRowY(rIdx) + cellHeight() / 2\"\n              class=\"token-label y-token-label\"\n              [class.highlighted]=\"isRowHighlighted(rIdx)\"\n              text-anchor=\"end\"\n              dominant-baseline=\"middle\"\n              (mouseenter)=\"hoveredRow.set(rIdx)\"\n              (mouseleave)=\"clearHover()\"\n            >\n              {{ yTok }}\n            </text>\n          }\n\n          <!-- X-axis Label Tokens (Top, rotated for readability) -->\n          @for (xTok of tokensX(); track $index; let cIdx = $index) {\n            <text\n              [attr.transform]=\"'translate(' + (getColX(cIdx) + cellWidth() / 2) + ',' + (topOffset - 12) + ') rotate(-45)'\"\n              class=\"token-label x-token-label\"\n              [class.highlighted]=\"isColHighlighted(cIdx)\"\n              text-anchor=\"start\"\n              (mouseenter)=\"hoveredCol.set(cIdx)\"\n              (mouseleave)=\"clearHover()\"\n            >\n              {{ xTok }}\n            </text>\n          }\n\n          <!-- Attention Heatmap Cells -->\n          @for (row of activeWeights(); track $index; let rIdx = $index) {\n            @for (val of row; track $index; let cIdx = $index) {\n              <rect\n                [attr.x]=\"getColX(cIdx)\"\n                [attr.y]=\"getRowY(rIdx)\"\n                [attr.width]=\"cellWidth() - cellSpacing\"\n                [attr.height]=\"cellHeight() - cellSpacing\"\n                [attr.fill]=\"getCellColor(val)\"\n                class=\"attention-cell\"\n                [class.fade-dim]=\"isDimmed(rIdx, cIdx)\"\n                [class.active-highlight]=\"hoveredRow() === rIdx && hoveredCol() === cIdx\"\n                [class.focused-cell]=\"focusedRow() === rIdx && focusedCol() === cIdx\"\n                [style.animation-delay]=\"(rIdx * 0.03 + cIdx * 0.03) + 's'\"\n                (mouseenter)=\"onCellEnter(rIdx, cIdx, val, $event)\"\n                (mouseleave)=\"clearHover()\"\n                (click)=\"onCellClick(rIdx, cIdx, val)\"\n                rx=\"3\"\n                ry=\"3\"\n              />\n            }\n          }\n\n          <!-- Color Scale Legend Bar -->\n          <rect\n            [attr.x]=\"legendX()\"\n            [attr.y]=\"topOffset\"\n            [attr.width]=\"15\"\n            [attr.height]=\"legendHeight()\"\n            [attr.fill]=\"'url(#' + gradientId + ')'\"\n            rx=\"3\"\n            ry=\"3\"\n            class=\"legend-bar\"\n          />\n          <text\n            [attr.x]=\"legendX() + 7.5\"\n            [attr.y]=\"topOffset - 6\"\n            text-anchor=\"middle\"\n            class=\"legend-label\"\n          >High</text>\n          <text\n            [attr.x]=\"legendX() + 7.5\"\n            [attr.y]=\"topOffset + legendHeight() + 14\"\n            text-anchor=\"middle\"\n            class=\"legend-label\"\n          >Low</text>\n        </svg>\n\n        <!-- Dynamic Tooltip -->\n        @if (tooltip().show) {\n          <div\n            class=\"attention-tooltip\"\n            [style.left.px]=\"tooltip().x\"\n            [style.top.px]=\"tooltip().y\"\n          >\n            <div class=\"tt-cat\">{{ tooltip().title }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"colors()[1]\"></span>\n              <span class=\"tt-name\">Attention Weight</span>\n              <span class=\"tt-val\">{{ tooltip().value }}</span>\n            </div>\n            <div class=\"tt-row action-row\">\n              <button class=\"tt-action-btn\" (click)=\"onQueryAttention(tooltip().row, tooltip().col)\">\n                Analyze Attention Link\n              </button>\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-attention-wrapper {\n      width: 100%;\n      height: 100%;\n      padding: 16px 20px;\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 12px;\n      box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05));\n      position: relative;\n    }\n    .ngx-attention-container {\n      position: relative;\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-attention-svg {\n      width: 100%;\n      height: 100%;\n      overflow: visible;\n    }\n    .token-label {\n      font-size: 10px;\n      font-weight: 600;\n      fill: var(--text-secondary, #64748b);\n      font-family: inherit;\n      cursor: pointer;\n      transition: fill 0.15s, font-weight 0.15s;\n    }\n    .token-label.highlighted, .token-label:hover {\n      fill: #4f46e5;\n      font-weight: 700;\n    }\n\n    @keyframes cellFade {\n      from { opacity: 0; transform: scale(0.92); }\n      to { opacity: 1; transform: scale(1); }\n    }\n\n    .attention-cell {\n      cursor: pointer;\n      stroke: transparent;\n      stroke-width: 1px;\n      transform-origin: center;\n      animation: cellFade 0.4s ease-out both;\n      transition: opacity 0.2s, filter 0.2s, stroke 0.15s;\n    }\n    .attention-cell:hover, .attention-cell.active-highlight {\n      filter: brightness(1.15) drop-shadow(0 3px 6px rgba(236, 72, 153, 0.25));\n      stroke: #ec4899;\n      stroke-width: 1.5px;\n      opacity: 1 !important;\n    }\n    .attention-cell.fade-dim {\n      opacity: 0.25;\n    }\n    .attention-cell.focused-cell {\n      stroke: #facc15;\n      stroke-width: 2.5px;\n      filter: brightness(1.1) drop-shadow(0 0 6px rgba(250, 204, 21, 0.6));\n      opacity: 1 !important;\n    }\n\n    /* Legend bar */\n    .legend-bar {\n      stroke: var(--border-color, #e2e8f0);\n      stroke-width: 1px;\n    }\n    .legend-label {\n      font-size: 9px;\n      fill: var(--text-secondary, #64748b);\n      font-family: inherit;\n      font-weight: 600;\n    }\n\n    /* Head selector */\n    .head-selector {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 6px;\n      margin-bottom: 10px;\n    }\n    .head-btn {\n      padding: 4px 12px;\n      font-size: 11px;\n      font-weight: 600;\n      border: 1px solid var(--border-color, #e2e8f0);\n      border-radius: 999px;\n      background: var(--bg-secondary, #ffffff);\n      color: var(--text-secondary, #64748b);\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .head-btn:hover {\n      border-color: #6366f1;\n      color: #4f46e5;\n    }\n    .head-btn.active {\n      background: #4f46e5;\n      color: #ffffff;\n      border-color: #4f46e5;\n    }\n\n    /* SVG focus outline */\n    .ngx-attention-svg:focus {\n      outline: 2px solid #6366f1;\n      outline-offset: 2px;\n      border-radius: 4px;\n    }\n\n    /* Glassmorphic Tooltip styling */\n    .attention-tooltip {\n      position: absolute;\n      z-index: 100;\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px);\n      -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc);\n      padding: 10px 14px;\n      border-radius: 10px;\n      font-size: 11px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      transform: translate(-50%, -115%);\n      min-width: 160px;\n      pointer-events: auto;\n    }\n    .tt-cat {\n      font-weight: 700;\n      margin-bottom: 6px;\n      font-size: 11px;\n      border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n      padding-bottom: 4px;\n      color: #38bdf8;\n    }\n    .tt-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      margin-top: 4px;\n    }\n    .tt-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      flex-shrink: 0;\n    }\n    .tt-name {\n      color: rgba(248, 250, 252, 0.8);\n      flex: 1;\n    }\n    .tt-val {\n      font-weight: 700;\n      font-family: monospace;\n    }\n    .action-row {\n      margin-top: 8px;\n      border-top: 1px dashed rgba(255, 255, 255, 0.15);\n      padding-top: 6px;\n      justify-content: center;\n    }\n    .tt-action-btn {\n      background: #4f46e5;\n      color: #ffffff;\n      border: none;\n      border-radius: 4px;\n      padding: 4px 8px;\n      font-size: 10px;\n      cursor: pointer;\n      font-weight: 600;\n      transition: all 0.15s;\n      width: 100%;\n    }\n    .tt-action-btn:hover {\n      background: #6366f1;\n    }\n\n    /* Header and titles */\n    .chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 16px;\n    }\n    .heatmap-title {\n      font-size: 14px;\n      font-weight: 700;\n      color: var(--text-primary, #1e293b);\n    }\n    .heatmap-subtitle {\n      font-size: 11px;\n      color: var(--text-secondary, #64748b);\n      margin-top: 2px;\n    }\n    .highlight-val {\n      font-weight: 700;\n      color: #6366f1;\n      font-family: monospace;\n    }\n\n    /* Export dropdown styles */\n    .chart-export-menu {\n      position: relative;\n      z-index: 50;\n    }\n    .export-trigger {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-chart-axis-text, #64748b);\n      background: rgba(241, 245, 249, 0.8);\n      backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 6px;\n      cursor: pointer;\n      transition: all 0.15s;\n    }\n    .export-trigger:hover {\n      background: #ffffff;\n      color: #4f46e5;\n      border-color: #4f46e5;\n    }\n    .export-dropdown {\n      position: absolute;\n      right: 0;\n      top: calc(100% + 4px);\n      background: #ffffff;\n      border: 1px solid var(--ngx-chart-grid, #e2e8f0);\n      border-radius: 8px;\n      box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);\n      padding: 4px;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      min-width: 120px;\n    }\n    .export-dropdown button {\n      background: none;\n      border: none;\n      padding: 6px 10px;\n      font-size: 11px;\n      text-align: left;\n      cursor: pointer;\n      color: #1e293b;\n      border-radius: 4px;\n      width: 100%;\n      transition: all 0.12s;\n    }\n    .export-dropdown button:hover {\n      background: rgba(79, 70, 229, 0.06);\n      color: #4f46e5;\n    }\n  `]\n})\nexport class TransformerAttentionHeatmapComponent {\n  private static instanceCounter = 0;\n  private instanceId = ++TransformerAttentionHeatmapComponent.instanceCounter;\n\n  tokensX = input.required<string[]>();\n  tokensY = input.required<string[]>();\n  weights = input.required<number[][]>();\n  height = input<number>(350);\n  colors = input<string[]>(['#f1f5f9', '#ec4899']); // Pink attention weights scale\n  showExport = input<boolean>(true);\n  title = input<string>('Transformer Attention Heatmap');\n  subtitle = input<string>('');\n\n  // Multi-head attention inputs\n  heads = input<number[][][] | null>(null);\n  headLabels = input<string[]>([]);\n\n  cellClick = output<{ row: number; col: number; weight: number }>();\n  agentQueryRequest = output<{ query: string; tokenY: string; tokenX: string; weight: number }>();\n\n  // Multi-head state\n  activeHeadIndex = signal<number>(0);\n\n  // Active weights: use selected head when heads() is set, otherwise fall back to weights()\n  activeWeights = computed(() => {\n    const h = this.heads();\n    if (h && h.length > 0) {\n      const idx = Math.min(this.activeHeadIndex(), h.length - 1);\n      return h[idx];\n    }\n    return this.weights();\n  });\n\n  // Hover states for bi-directional highlighting\n  hoveredRow = signal<number | null>(null);\n  hoveredCol = signal<number | null>(null);\n\n  // Keyboard navigation focus\n  focusedRow = signal<number | null>(null);\n  focusedCol = signal<number | null>(null);\n  \n  tooltip = signal<{ show: boolean; row: number; col: number; title: string; value: string; x: number; y: number }>({\n    show: false,\n    row: -1,\n    col: -1,\n    title: '',\n    value: '',\n    x: 0,\n    y: 0\n  });\n  exportMenuOpen = signal(false);\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n\n  // Unique gradient ID for this instance\n  gradientId = `attn-gradient-${this.instanceId}`;\n\n  // Dimensions\n  leftOffset = 80;\n  topOffset = 70;\n  rightOffset = 50; // space for legend bar\n  cellSpacing = 2.5;\n\n  cellWidth = computed(() => {\n    const cols = this.tokensX().length || 1;\n    const availableWidth = Math.max(200, this.height() * 1.45 - this.leftOffset - this.rightOffset);\n    return Math.max(16, availableWidth / cols);\n  });\n\n  cellHeight = computed(() => {\n    const rows = this.tokensY().length || 1;\n    const availableHeight = this.height() - this.topOffset - 20;\n    return Math.max(16, availableHeight / rows);\n  });\n\n  // Legend position and size\n  legendX = computed(() => {\n    const cols = this.tokensX().length || 1;\n    return this.leftOffset + cols * this.cellWidth() + 16;\n  });\n\n  legendHeight = computed(() => {\n    const rows = this.tokensY().length || 1;\n    return rows * this.cellHeight();\n  });\n\n  viewBoxString = computed(() => {\n    const cols = this.tokensX().length || 1;\n    const rows = this.tokensY().length || 1;\n    const width = this.leftOffset + cols * this.cellWidth() + this.rightOffset;\n    const height = this.topOffset + rows * this.cellHeight() + 20;\n    return `0 0 ${width} ${height}`;\n  });\n\n  getColX(colIdx: number): number {\n    return this.leftOffset + colIdx * this.cellWidth();\n  }\n\n  getRowY(rowIdx: number): number {\n    return this.topOffset + rowIdx * this.cellHeight();\n  }\n\n  getCellColor(val: number): string {\n    // Interpolates from colors[0] (low attention) to colors[1] (high attention)\n    return this.interpolateColor(this.colors()[0], this.colors()[1], val);\n  }\n\n  private interpolateColor(color1: string, color2: string, fraction: number): string {\n    const hex = (x: string) => {\n      const h = x.replace('#', '');\n      return h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n    };\n    const c1 = hex(color1);\n    const c2 = hex(color2);\n\n    const r1 = parseInt(c1.substring(0, 2), 16);\n    const g1 = parseInt(c1.substring(2, 4), 16);\n    const b1 = parseInt(c1.substring(4, 6), 16);\n\n    const r2 = parseInt(c2.substring(0, 2), 16);\n    const g2 = parseInt(c2.substring(2, 4), 16);\n    const b2 = parseInt(c2.substring(4, 6), 16);\n\n    const r = Math.round(r1 + (r2 - r1) * fraction);\n    const g = Math.round(g1 + (g2 - g1) * fraction);\n    const b = Math.round(b1 + (b2 - b1) * fraction);\n\n    return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n  }\n\n  // Row and Column Bi-directional highlighting logic\n  isRowHighlighted(rIdx: number): boolean {\n    return this.hoveredRow() === rIdx;\n  }\n\n  isColHighlighted(cIdx: number): boolean {\n    return this.hoveredCol() === cIdx;\n  }\n\n  isDimmed(rIdx: number, cIdx: number): boolean {\n    const hr = this.hoveredRow();\n    const hc = this.hoveredCol();\n    const fr = this.focusedRow();\n    const fc = this.focusedCol();\n\n    // If both hover and focus are inactive, no dimming\n    if (hr === null && hc === null && fr === null && fc === null) return false;\n\n    // Hover takes priority for dimming\n    if (hr !== null || hc !== null) {\n      if (hr !== null && hc !== null) {\n        return hr !== rIdx || hc !== cIdx;\n      }\n      if (hr !== null) return hr !== rIdx;\n      if (hc !== null) return hc !== cIdx;\n    }\n\n    // Keyboard focus dimming\n    if (fr !== null && fc !== null) {\n      return fr !== rIdx || fc !== cIdx;\n    }\n    return false;\n  }\n\n  onCellEnter(rIdx: number, cIdx: number, val: number, event: MouseEvent): void {\n    this.hoveredRow.set(rIdx);\n    this.hoveredCol.set(cIdx);\n\n    const xLabel = this.tokensX()[cIdx] || '';\n    const yLabel = this.tokensY()[rIdx] || '';\n    const title = `\"${yLabel}\" ➔ \"${xLabel}\"`;\n\n    const rect = (event.currentTarget as SVGRectElement).getBoundingClientRect();\n    const parentRect = (event.currentTarget as SVGRectElement).ownerSVGElement!.parentElement!.getBoundingClientRect();\n    \n    const x = rect.left - parentRect.left + rect.width / 2;\n    const y = rect.top - parentRect.top;\n\n    this.tooltip.set({\n      show: true,\n      row: rIdx,\n      col: cIdx,\n      title,\n      value: `${(val * 100).toFixed(1)}%`,\n      x,\n      y\n    });\n  }\n\n  clearHover(): void {\n    this.hoveredRow.set(null);\n    this.hoveredCol.set(null);\n    this.tooltip.update(t => ({ ...t, show: false }));\n  }\n\n  onCellClick(rIdx: number, cIdx: number, val: number): void {\n    this.cellClick.emit({ row: rIdx, col: cIdx, weight: val });\n  }\n\n  onQueryAttention(row: number, col: number): void {\n    const tokenY = this.tokensY()[row];\n    const tokenX = this.tokensX()[col];\n    const val = this.activeWeights()[row]?.[col] ?? 0;\n    this.agentQueryRequest.emit({\n      query: `Analyze transformer attention relationship between Y token \"${tokenY}\" and X token \"${tokenX}\" with score ${(val * 100).toFixed(1)}%.`,\n      tokenY,\n      tokenX,\n      weight: val\n    });\n  }\n\n  // Keyboard navigation\n  onKeyDown(event: KeyboardEvent): void {\n    const rows = this.tokensY().length;\n    const cols = this.tokensX().length;\n    if (rows === 0 || cols === 0) return;\n\n    let fr = this.focusedRow();\n    let fc = this.focusedCol();\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        if (fr === null || fc === null) { this.focusedRow.set(0); this.focusedCol.set(0); }\n        else { this.focusedRow.set(Math.min(fr + 1, rows - 1)); }\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        if (fr === null || fc === null) { this.focusedRow.set(0); this.focusedCol.set(0); }\n        else { this.focusedRow.set(Math.max(fr - 1, 0)); }\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        if (fr === null || fc === null) { this.focusedRow.set(0); this.focusedCol.set(0); }\n        else { this.focusedCol.set(Math.min(fc + 1, cols - 1)); }\n        break;\n      case 'ArrowLeft':\n        event.preventDefault();\n        if (fr === null || fc === null) { this.focusedRow.set(0); this.focusedCol.set(0); }\n        else { this.focusedCol.set(Math.max(fc - 1, 0)); }\n        break;\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        fr = this.focusedRow();\n        fc = this.focusedCol();\n        if (fr !== null && fc !== null) {\n          const w = this.activeWeights();\n          const val = w[fr]?.[fc] ?? 0;\n          this.cellClick.emit({ row: fr, col: fc, weight: val });\n        }\n        break;\n      case 'Escape':\n        this.focusedRow.set(null);\n        this.focusedCol.set(null);\n        break;\n      default:\n        return; // don't prevent default for other keys\n    }\n  }\n\n  toggleExportMenu(event: MouseEvent): void {\n    event.stopPropagation();\n    this.exportMenuOpen.set(!this.exportMenuOpen());\n  }\n\n  @HostListener('document:click')\n  closeExportMenu(): void {\n    this.exportMenuOpen.set(false);\n  }\n\n  onExport(type: 'json' | 'csv' | 'svg' | 'pdf'): void {\n    this.exportMenuOpen.set(false);\n    if (type === 'json') this.exportToJson();\n    else if (type === 'csv') this.exportToCsv();\n    else if (type === 'svg') this.exportToSvg();\n    else if (type === 'pdf') this.exportToPdf();\n  }\n\n  exportToJson(): void {\n    const payload = {\n      tokensX: this.tokensX(),\n      tokensY: this.tokensY(),\n      weights: this.activeWeights()\n    };\n    const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'attention-heatmap-data.json');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToCsv(): void {\n    const xTok = this.tokensX();\n    const yTok = this.tokensY();\n    const matrix = this.activeWeights();\n    let csv = 'Y_Token,X_Token,Weight\\n';\n    matrix.forEach((row, rIdx) => {\n      row.forEach((val, cIdx) => {\n        csv += `\"${yTok[rIdx]}\",\"${xTok[cIdx]}\",${val}\\n`;\n      });\n    });\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'attention-heatmap-data.csv');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToSvg(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const serializer = new XMLSerializer();\n    let source = serializer.serializeToString(svg);\n    if (!source.match(/^<svg[^>]+xmlns=\"http\\:\\/\\/www\\.w3\\.org\\/2000\\/svg\"/)) {\n      source = source.replace(/^<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n    }\n    source = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + source;\n    const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.setAttribute('download', 'attention-heatmap.svg');\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n  }\n\n  exportToPdf(): void {\n    const svg = this.svgEl()?.nativeElement;\n    if (!svg) return;\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) return;\n    const svgString = new XMLSerializer().serializeToString(svg);\n    printWindow.document.write(`\n      <html>\n        <head>\n          <title>Export PDF</title>\n          <style>\n            body { margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background: white; }\n            svg { width: 100%; height: auto; }\n          </style>\n        </head>\n        <body>\n          ${svgString}\n          <script>\n            window.onload = () => { window.print(); window.close(); };\n          </script>\n        </body>\n      </html>\n    `);\n    printWindow.document.close();\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { CHART_COLORS } from './chart-utils';\n\nexport type ChartThemeName = 'light' | 'dark' | 'highContrast' | 'pastel' | 'corporate' | 'monoChrome';\nexport type ColorblindMode = 'none' | 'deuteranopia' | 'protanopia' | 'tritanopia';\n\nexport interface ChartTheme {\n  name: ChartThemeName;\n  colors: string[];\n  bg: string;\n  grid: string;\n  axis: string;\n  axisText: string;\n  tooltipBg: string;\n  tooltipColor: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ChartThemeService {\n  \n  private themes: Record<ChartThemeName, ChartTheme> = {\n    light: {\n      name: 'light',\n      colors: [...CHART_COLORS],\n      bg: '#ffffff',\n      grid: '#e2e8f0',\n      axis: '#94a3b8',\n      axisText: '#64748b',\n      tooltipBg: 'rgba(255, 255, 255, 0.8)',\n      tooltipColor: '#0f172a'\n    },\n    dark: {\n      name: 'dark',\n      colors: ['#60a5fa', '#f43f5e', '#34d399', '#fbbf24', '#c084fc', '#2dd4bf', '#ef4444', '#3b82f6', '#10b981', '#f97316'],\n      bg: '#0f172a',\n      grid: '#334155',\n      axis: '#475569',\n      axisText: '#cbd5e1',\n      tooltipBg: 'rgba(15, 23, 42, 0.8)',\n      tooltipColor: '#f8fafc'\n    },\n    highContrast: {\n      name: 'highContrast',\n      colors: ['#ffff00', '#00ffff', '#ff00ff', '#00ff00', '#ff0000', '#0000ff', '#ffffff', '#ff8800', '#88ff00', '#ff0088'],\n      bg: '#000000',\n      grid: '#ffffff',\n      axis: '#ffffff',\n      axisText: '#ffffff',\n      tooltipBg: '#000000',\n      tooltipColor: '#ffffff'\n    },\n    pastel: {\n      name: 'pastel',\n      colors: ['#ffb3ba', '#ffdfba', '#ffffba', '#baffc9', '#bae1ff', '#e8baff', '#ffbaf2', '#ffc4ba', '#e2ffba', '#bacfff'],\n      bg: '#fdfdfd',\n      grid: '#f0f0f0',\n      axis: '#d0d0d0',\n      axisText: '#888888',\n      tooltipBg: 'rgba(255, 255, 255, 0.9)',\n      tooltipColor: '#333333'\n    },\n    corporate: {\n      name: 'corporate',\n      colors: ['#003f5c', '#2f4b7c', '#665191', '#a05195', '#d45087', '#f95d6a', '#ff7c43', '#ffa600', '#488f31', '#de425b'],\n      bg: '#ffffff',\n      grid: '#eaebed',\n      axis: '#c4c8cb',\n      axisText: '#4a4e53',\n      tooltipBg: 'rgba(240, 240, 240, 0.9)',\n      tooltipColor: '#1e1e1e'\n    },\n    monoChrome: {\n      name: 'monoChrome',\n      colors: ['#03045e', '#023e8a', '#0077b6', '#0096c7', '#00b4d8', '#48cae4', '#90e0ef', '#ade8f4', '#caf0f8', '#e0fbfc'],\n      bg: '#ffffff',\n      grid: '#f1f5f9',\n      axis: '#cbd5e1',\n      axisText: '#475569',\n      tooltipBg: 'rgba(255, 255, 255, 0.8)',\n      tooltipColor: '#0f172a'\n    }\n  };\n\n  getTheme(name: ChartThemeName): ChartTheme {\n    return this.themes[name] || this.themes['light'];\n  }\n\n  applyTheme(element: HTMLElement, themeName: ChartThemeName): void {\n    const theme = this.getTheme(themeName);\n    element.style.setProperty('--ngx-chart-bg', theme.bg);\n    element.style.setProperty('--ngx-chart-grid', theme.grid);\n    element.style.setProperty('--ngx-chart-axis', theme.axis);\n    element.style.setProperty('--ngx-chart-axis-text', theme.axisText);\n    element.style.setProperty('--ngx-chart-tooltip-bg', theme.tooltipBg);\n    element.style.setProperty('--ngx-chart-tooltip-color', theme.tooltipColor);\n  }\n\n  getColorblindPalette(mode: ColorblindMode): string[] {\n    switch (mode) {\n      case 'deuteranopia':\n      case 'protanopia':\n        // Wong / Okabe-Ito friendly\n        return ['#E69F00', '#56B4E9', '#009E73', '#F0E442', '#0072B2', '#D55E00', '#CC79A7', '#000000', '#999999', '#FFFFFF'];\n      case 'tritanopia':\n        // Tritanopia friendly\n        return ['#FF0000', '#FF9900', '#00FF00', '#00FFFF', '#0000FF', '#9900FF', '#FF00FF', '#000000', '#999999', '#FFFFFF'];\n      case 'none':\n      default:\n        return [...CHART_COLORS];\n    }\n  }\n}\n","export type AnnotationType = 'line' | 'band' | 'text' | 'arrow' | 'circle';\n\nexport interface ChartAnnotation {\n  type: AnnotationType;\n  axis?: 'x' | 'y';\n  value?: number;\n  from?: number;\n  to?: number;\n  text?: string;\n  x?: number;\n  y?: number;\n  fromPoint?: { x: number; y: number };\n  toPoint?: { x: number; y: number };\n  radius?: number;\n  color?: string;\n  opacity?: number;\n  strokeDasharray?: string;\n  fontSize?: number;\n  fontWeight?: string;\n}\n\nexport function renderAnnotationSvg(\n  annotation: ChartAnnotation,\n  xScale: (val: number) => number,\n  yScale: (val: number) => number,\n  innerW: number,\n  innerH: number\n): string {\n  const color = annotation.color || '#ff0000';\n  const opacity = annotation.opacity ?? 1;\n  const dasharray = annotation.strokeDasharray ? `stroke-dasharray=\"${annotation.strokeDasharray}\"` : '';\n\n  switch (annotation.type) {\n    case 'line': {\n      if (annotation.axis === 'y' && annotation.value !== undefined) {\n        const y = yScale(annotation.value);\n        return `<line x1=\"0\" y1=\"${y}\" x2=\"${innerW}\" y2=\"${y}\" stroke=\"${color}\" stroke-width=\"2\" opacity=\"${opacity}\" ${dasharray} />`;\n      } else if (annotation.axis === 'x' && annotation.value !== undefined) {\n        const x = xScale(annotation.value);\n        return `<line x1=\"${x}\" y1=\"0\" x2=\"${x}\" y2=\"${innerH}\" stroke=\"${color}\" stroke-width=\"2\" opacity=\"${opacity}\" ${dasharray} />`;\n      }\n      return '';\n    }\n    case 'band': {\n      if (annotation.axis === 'y' && annotation.from !== undefined && annotation.to !== undefined) {\n        const y1 = yScale(annotation.from);\n        const y2 = yScale(annotation.to);\n        const y = Math.min(y1, y2);\n        const h = Math.abs(y1 - y2);\n        return `<rect x=\"0\" y=\"${y}\" width=\"${innerW}\" height=\"${h}\" fill=\"${color}\" opacity=\"${opacity}\" />`;\n      } else if (annotation.axis === 'x' && annotation.from !== undefined && annotation.to !== undefined) {\n        const x1 = xScale(annotation.from);\n        const x2 = xScale(annotation.to);\n        const x = Math.min(x1, x2);\n        const w = Math.abs(x1 - x2);\n        return `<rect x=\"${x}\" y=\"0\" width=\"${w}\" height=\"${innerH}\" fill=\"${color}\" opacity=\"${opacity}\" />`;\n      }\n      return '';\n    }\n    case 'text': {\n      if (annotation.text && annotation.x !== undefined && annotation.y !== undefined) {\n        const x = xScale(annotation.x);\n        const y = yScale(annotation.y);\n        const fs = annotation.fontSize || 12;\n        const fw = annotation.fontWeight || 'normal';\n        return `<text x=\"${x}\" y=\"${y}\" fill=\"${color}\" opacity=\"${opacity}\" font-size=\"${fs}\" font-weight=\"${fw}\" dominant-baseline=\"middle\" text-anchor=\"middle\">${annotation.text}</text>`;\n      }\n      return '';\n    }\n    case 'arrow': {\n      if (annotation.fromPoint && annotation.toPoint) {\n        const fx = xScale(annotation.fromPoint.x);\n        const fy = yScale(annotation.fromPoint.y);\n        const tx = xScale(annotation.toPoint.x);\n        const ty = yScale(annotation.toPoint.y);\n        // A simple line; standard SVG would need a marker for an arrowhead.\n        return `\n          <g opacity=\"${opacity}\">\n            <line x1=\"${fx}\" y1=\"${fy}\" x2=\"${tx}\" y2=\"${ty}\" stroke=\"${color}\" stroke-width=\"2\" ${dasharray} />\n            <circle cx=\"${tx}\" cy=\"${ty}\" r=\"3\" fill=\"${color}\" />\n          </g>`;\n      }\n      return '';\n    }\n    case 'circle': {\n      if (annotation.x !== undefined && annotation.y !== undefined) {\n        const x = xScale(annotation.x);\n        const y = yScale(annotation.y);\n        const r = annotation.radius || 5;\n        return `<circle cx=\"${x}\" cy=\"${y}\" r=\"${r}\" fill=\"${color}\" opacity=\"${opacity}\" />`;\n      }\n      return '';\n    }\n  }\n  return '';\n}\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n  selector: 'ngx-chart-skeleton',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"skeleton-container\" [style.height.px]=\"height()\">\n      @if (mode() === 'loading') {\n        <svg [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"shimmer-svg\">\n          <defs>\n            <linearGradient id=\"shimmerGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n              <stop offset=\"0%\" stop-color=\"#e2e8f0\" stop-opacity=\"0.3\" />\n              <stop offset=\"50%\" stop-color=\"#e2e8f0\" stop-opacity=\"0.8\" />\n              <stop offset=\"100%\" stop-color=\"#e2e8f0\" stop-opacity=\"0.3\" />\n            </linearGradient>\n          </defs>\n          @switch (chartType()) {\n            @case ('bar') {\n              <rect x=\"10%\" y=\"40%\" width=\"12%\" height=\"60%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <rect x=\"26%\" y=\"20%\" width=\"12%\" height=\"80%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <rect x=\"42%\" y=\"60%\" width=\"12%\" height=\"40%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <rect x=\"58%\" y=\"30%\" width=\"12%\" height=\"70%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <rect x=\"74%\" y=\"50%\" width=\"12%\" height=\"50%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n            }\n            @case ('line') {\n              <path d=\"M 10 80 Q 25 30 50 60 T 90 20\" fill=\"none\" stroke=\"url(#shimmerGrad)\" stroke-width=\"4\" transform=\"scale(3) translate(0, 5)\" class=\"shimmer-rect\" />\n            }\n            @case ('pie') {\n              <circle cx=\"50%\" cy=\"50%\" r=\"30%\" fill=\"none\" stroke=\"url(#shimmerGrad)\" stroke-width=\"40\" class=\"shimmer-rect\" />\n            }\n            @case ('scatter') {\n              <circle cx=\"20%\" cy=\"70%\" r=\"8\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <circle cx=\"40%\" cy=\"40%\" r=\"6\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <circle cx=\"60%\" cy=\"80%\" r=\"10\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <circle cx=\"80%\" cy=\"30%\" r=\"7\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n            }\n            @default {\n              <line x1=\"10%\" y1=\"90%\" x2=\"90%\" y2=\"90%\" stroke=\"url(#shimmerGrad)\" stroke-width=\"2\" class=\"shimmer-rect\" />\n              <line x1=\"10%\" y1=\"10%\" x2=\"10%\" y2=\"90%\" stroke=\"url(#shimmerGrad)\" stroke-width=\"2\" class=\"shimmer-rect\" />\n              <rect x=\"20%\" y=\"30%\" width=\"30%\" height=\"40%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n              <circle cx=\"70%\" cy=\"50%\" r=\"15%\" fill=\"url(#shimmerGrad)\" class=\"shimmer-rect\" />\n            }\n          }\n        </svg>\n      } @else {\n        <div class=\"empty-state\">\n          <div class=\"empty-icon\">{{ icon() }}</div>\n          <div class=\"empty-message\">{{ message() }}</div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    .skeleton-container {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background: var(--ngx-chart-bg, transparent);\n      border-radius: 8px;\n    }\n    .shimmer-svg {\n      width: 100%;\n      height: 100%;\n    }\n    .shimmer-rect {\n      animation: shimmer 2s infinite linear;\n    }\n    @keyframes shimmer {\n      0% { opacity: 0.5; }\n      50% { opacity: 1; }\n      100% { opacity: 0.5; }\n    }\n    .empty-state {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      opacity: 0.6;\n    }\n    .empty-icon {\n      font-size: 48px;\n      margin-bottom: 16px;\n    }\n    .empty-message {\n      font-size: 16px;\n      color: var(--ngx-chart-axis-text, #64748b);\n      font-family: sans-serif;\n    }\n  `]\n})\nexport class ChartSkeletonComponent {\n  mode = input<'loading' | 'empty'>('loading');\n  chartType = input<'bar' | 'line' | 'pie' | 'scatter' | 'heatmap' | 'generic'>('generic');\n  height = input<number>(260);\n  message = input<string>('No data available');\n  icon = input<string>('📊');\n}\n","import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit } from '@angular/core';\n\n@Directive({\n  selector: '[ngxChartSyncGroup]',\n  standalone: true\n})\nexport class ChartSyncGroupDirective implements OnInit, OnDestroy {\n  @Input('ngxChartSyncGroup') groupName: string = '';\n\n  private static groups = new Map<string, Set<ElementRef>>();\n\n  constructor(private el: ElementRef) {}\n\n  ngOnInit() {\n    if (!this.groupName) return;\n    if (!ChartSyncGroupDirective.groups.has(this.groupName)) {\n      ChartSyncGroupDirective.groups.set(this.groupName, new Set());\n    }\n    ChartSyncGroupDirective.groups.get(this.groupName)!.add(this.el);\n  }\n\n  ngOnDestroy() {\n    if (this.groupName && ChartSyncGroupDirective.groups.has(this.groupName)) {\n      ChartSyncGroupDirective.groups.get(this.groupName)!.delete(this.el);\n      if (ChartSyncGroupDirective.groups.get(this.groupName)!.size === 0) {\n        ChartSyncGroupDirective.groups.delete(this.groupName);\n      }\n    }\n  }\n\n  @HostListener('mousemove', ['$event'])\n  onMouseMove(event: MouseEvent) {\n    if (!this.groupName) return;\n    \n    const rect = this.el.nativeElement.getBoundingClientRect();\n    const x = event.clientX - rect.left;\n    const normalizedX = x / rect.width;\n\n    const group = ChartSyncGroupDirective.groups.get(this.groupName);\n    if (group) {\n      group.forEach(chartEl => {\n        if (chartEl !== this.el) {\n          const syncEvent = new CustomEvent('chart-sync-hover', {\n            detail: { normalizedX }\n          });\n          chartEl.nativeElement.dispatchEvent(syncEvent);\n        }\n      });\n    }\n  }\n\n  @HostListener('mouseleave')\n  onMouseLeave() {\n    if (!this.groupName) return;\n\n    const group = ChartSyncGroupDirective.groups.get(this.groupName);\n    if (group) {\n      group.forEach(chartEl => {\n        if (chartEl !== this.el) {\n          const syncEvent = new CustomEvent('chart-sync-clear');\n          chartEl.nativeElement.dispatchEvent(syncEvent);\n        }\n      });\n    }\n  }\n}\n","import {\n  Component, ChangeDetectionStrategy, input, output, computed, signal,\n  ElementRef, inject, DestroyRef, HostListener, ViewChild, AfterViewInit,\n  untracked, effect\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'ngx-chart-brush-zoom',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"brush-zoom-container\" #container (dblclick)=\"reset()\" (click)=\"onTrackClick($event)\">\n      <svg [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"brush-svg\">\n        <!-- Background sparkline -->\n        @if (sparklinePath()) {\n          <path [attr.d]=\"sparklinePath()\" [attr.fill]=\"color()\" fill-opacity=\"0.18\" [attr.stroke]=\"color()\" stroke-width=\"1.5\" />\n        }\n        \n        <!-- Unselected dimmed overlays -->\n        <rect class=\"overlay-dim\" x=\"0\" y=\"0\" [attr.width]=\"Math.max(0, windowLeft())\" [attr.height]=\"height()\" />\n        <rect class=\"overlay-dim\" [attr.x]=\"windowRight()\" y=\"0\" [attr.width]=\"Math.max(0, effectiveWidth() - windowRight())\" [attr.height]=\"height()\" />\n        \n        <!-- Selection window -->\n        <rect class=\"selection-window\"\n              [attr.x]=\"windowLeft()\" y=\"0\"\n              [attr.width]=\"windowWidth()\" [attr.height]=\"height()\"\n              [attr.stroke]=\"color()\"\n              (mousedown)=\"onWindowMouseDown($event)\"\n              (touchstart)=\"onWindowTouchStart($event)\" />\n              \n        <!-- Left handle pill -->\n        <g [attr.transform]=\"'translate(' + (windowLeft() - handleHitWidth / 2) + ', 0)'\"\n           class=\"handle-group\"\n           (mousedown)=\"onHandleMouseDown($event, 'left')\"\n           (touchstart)=\"onHandleTouchStart($event, 'left')\">\n          <rect class=\"handle-hitbox\" [attr.width]=\"handleHitWidth\" [attr.height]=\"height()\" fill=\"transparent\" />\n          <rect class=\"handle-pill\" [attr.x]=\"(handleHitWidth - 8) / 2\" y=\"2\" width=\"8\" [attr.height]=\"height() - 4\" rx=\"4\" [attr.fill]=\"color()\" />\n          <line [attr.x1]=\"handleHitWidth / 2\" y1=\"8\" [attr.x2]=\"handleHitWidth / 2\" [attr.y2]=\"height() - 8\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-dasharray=\"2,2\" />\n        </g>\n              \n        <!-- Right handle pill -->\n        <g [attr.transform]=\"'translate(' + (windowRight() - handleHitWidth / 2) + ', 0)'\"\n           class=\"handle-group\"\n           (mousedown)=\"onHandleMouseDown($event, 'right')\"\n           (touchstart)=\"onHandleTouchStart($event, 'right')\">\n          <rect class=\"handle-hitbox\" [attr.width]=\"handleHitWidth\" [attr.height]=\"height()\" fill=\"transparent\" />\n          <rect class=\"handle-pill\" [attr.x]=\"(handleHitWidth - 8) / 2\" y=\"2\" width=\"8\" [attr.height]=\"height() - 4\" rx=\"4\" [attr.fill]=\"color()\" />\n          <line [attr.x1]=\"handleHitWidth / 2\" y1=\"8\" [attr.x2]=\"handleHitWidth / 2\" [attr.y2]=\"height() - 8\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-dasharray=\"2,2\" />\n        </g>\n      </svg>\n    </div>\n  `,\n  styles: [`\n    :host { display: block; width: 100%; }\n    .brush-zoom-container {\n      width: 100%;\n      position: relative;\n      user-select: none;\n      margin-top: 8px;\n      background: var(--ngx-chart-brush-bg, rgba(15, 23, 42, 0.03));\n      border: 1px solid var(--ngx-chart-border, #e2e8f0);\n      border-radius: 8px;\n      overflow: hidden;\n      cursor: pointer;\n    }\n    .brush-svg {\n      display: block;\n      overflow: visible;\n      width: 100%;\n    }\n    .overlay-dim {\n      fill: rgba(15, 23, 42, 0.15);\n      pointer-events: none;\n    }\n    .selection-window {\n      fill: rgba(59, 130, 246, 0.08);\n      cursor: grab;\n      stroke-width: 1.5;\n    }\n    .selection-window:active {\n      cursor: grabbing;\n      fill: rgba(59, 130, 246, 0.15);\n    }\n    .handle-group {\n      cursor: ew-resize;\n    }\n    .handle-pill {\n      transition: filter 0.15s;\n      filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));\n    }\n    .handle-group:hover .handle-pill {\n      filter: drop-shadow(0 3px 6px rgba(0,0,0,0.35)) brightness(1.15);\n    }\n  `]\n})\nexport class ChartBrushZoomComponent implements AfterViewInit {\n  data = input<number[] | any[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(50);\n  startIndex = input<number>(0);\n  endIndex = input<number>(-1);\n  color = input<string>('#3b82f6');\n\n  rangeChange = output<{ startIndex: number; endIndex: number; startCategory: string; endCategory: string }>();\n\n  @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n\n  width = signal<number>(0);\n  handleHitWidth = 16;\n  \n  // Normalized range indices\n  sIdx = signal<number>(0);\n  eIdx = signal<number>(0);\n\n  private destroyRef = inject(DestroyRef);\n  private resizeObserver!: ResizeObserver;\n  private isDragging = false;\n  private dragType: 'left' | 'right' | 'window' | null = null;\n  private startX = 0;\n  private startSIdx = 0;\n  private startEIdx = 0;\n  private initialized = false;\n\n  readonly Math = Math;\n\n  constructor() {\n    effect(() => {\n      const dLen = this.dataLen();\n      const sInput = this.startIndex();\n      let eInput = this.endIndex();\n      \n      if (!this.initialized && dLen > 0) {\n        if (eInput === -1 || eInput >= dLen) {\n          eInput = Math.max(0, dLen - 1);\n        }\n        untracked(() => {\n          this.sIdx.set(Math.max(0, Math.min(sInput, eInput)));\n          this.eIdx.set(eInput);\n          this.initialized = true;\n        });\n      }\n    });\n  }\n\n  ngAfterViewInit() {\n    const el = this.containerRef.nativeElement;\n    this.width.set(el.getBoundingClientRect().width || el.offsetWidth || 600);\n\n    if (typeof ResizeObserver !== 'undefined') {\n      this.resizeObserver = new ResizeObserver(entries => {\n        if (!entries || !entries.length) return;\n        const w = entries[0].contentRect.width;\n        if (w > 0) this.width.set(w);\n      });\n      this.resizeObserver.observe(el);\n      this.destroyRef.onDestroy(() => this.resizeObserver.disconnect());\n    }\n  }\n\n  effectiveWidth = computed(() => Math.max(100, this.width()));\n\n  dataLen = computed(() => {\n    const d = this.data();\n    return Array.isArray(d) ? d.length : 0;\n  });\n\n  normalizedData = computed(() => {\n    const d = this.data();\n    if (!d || d.length === 0) return [];\n    if (typeof d[0] === 'number') return d as number[];\n    return d[0]?.data?.map((p: any) => (typeof p === 'number' ? p : (p?.y ?? 0))) || [];\n  });\n\n  sparklinePath = computed(() => {\n    const w = this.effectiveWidth();\n    const h = this.height();\n    const d = this.normalizedData();\n    if (w === 0 || d.length < 2) return '';\n    \n    const maxVal = Math.max(...d, 1);\n    const minVal = Math.min(...d, 0);\n    const range = maxVal - minVal || 1;\n    \n    let path = `M 0 ${h}`;\n    d.forEach((val: number, i: number) => {\n      const x = (i / (d.length - 1)) * w;\n      const y = h - ((val - minVal) / range) * (h - 8) - 4;\n      path += ` L ${x} ${y}`;\n    });\n    path += ` L ${w} ${h} Z`;\n    return path;\n  });\n\n  windowLeft = computed(() => {\n    const len = this.dataLen();\n    if (len <= 1) return 0;\n    return (this.sIdx() / (len - 1)) * this.effectiveWidth();\n  });\n\n  windowRight = computed(() => {\n    const len = this.dataLen();\n    if (len <= 1) return this.effectiveWidth();\n    return (this.eIdx() / (len - 1)) * this.effectiveWidth();\n  });\n\n  windowWidth = computed(() => Math.max(12, this.windowRight() - this.windowLeft()));\n\n  reset() {\n    const dLen = this.dataLen();\n    this.sIdx.set(0);\n    this.eIdx.set(Math.max(0, dLen - 1));\n    this.emitChange();\n  }\n\n  onTrackClick(e: MouseEvent) {\n    if (this.isDragging) return;\n    const rect = this.containerRef.nativeElement.getBoundingClientRect();\n    const clickX = e.clientX - rect.left;\n    const w = this.effectiveWidth();\n    const len = this.dataLen();\n    if (w === 0 || len <= 1) return;\n\n    const clickedIdx = Math.round((clickX / w) * (len - 1));\n    const currSpan = this.eIdx() - this.sIdx();\n    const halfSpan = Math.floor(currSpan / 2);\n    \n    let newS = clickedIdx - halfSpan;\n    let newE = newS + currSpan;\n\n    if (newS < 0) { newS = 0; newE = currSpan; }\n    if (newE >= len) { newE = len - 1; newS = newE - currSpan; }\n\n    this.sIdx.set(Math.max(0, newS));\n    this.eIdx.set(Math.min(len - 1, newE));\n    this.emitChange();\n  }\n\n  onWindowMouseDown(e: MouseEvent) {\n    e.stopPropagation();\n    this.startDrag(e.clientX, 'window');\n  }\n  onWindowTouchStart(e: TouchEvent) {\n    e.stopPropagation();\n    this.startDrag(e.touches[0].clientX, 'window');\n  }\n  \n  onHandleMouseDown(e: MouseEvent, type: 'left' | 'right') {\n    e.stopPropagation();\n    this.startDrag(e.clientX, type);\n  }\n  onHandleTouchStart(e: TouchEvent, type: 'left' | 'right') {\n    e.stopPropagation();\n    this.startDrag(e.touches[0].clientX, type);\n  }\n\n  private startDrag(x: number, type: 'left' | 'right' | 'window') {\n    this.isDragging = true;\n    this.dragType = type;\n    this.startX = x;\n    this.startSIdx = this.sIdx();\n    this.startEIdx = this.eIdx();\n  }\n\n  @HostListener('document:mousemove', ['$event'])\n  onMouseMove(e: MouseEvent) {\n    if (this.isDragging) this.handleDrag(e.clientX);\n  }\n\n  @HostListener('document:touchmove', ['$event'])\n  onTouchMove(e: TouchEvent) {\n    if (this.isDragging) this.handleDrag(e.touches[0].clientX);\n  }\n\n  @HostListener('document:mouseup')\n  @HostListener('document:touchend')\n  onDragEnd() {\n    if (this.isDragging) {\n      this.isDragging = false;\n      this.dragType = null;\n      this.emitChange();\n    }\n  }\n\n  private handleDrag(clientX: number) {\n    const dx = clientX - this.startX;\n    const w = this.effectiveWidth();\n    const len = this.dataLen();\n    if (w === 0 || len <= 1) return;\n\n    const indexDelta = (dx / w) * (len - 1);\n    \n    if (this.dragType === 'window') {\n      let newS = Math.round(this.startSIdx + indexDelta);\n      let newE = Math.round(this.startEIdx + indexDelta);\n      const span = this.startEIdx - this.startSIdx;\n      \n      if (newS < 0) { newS = 0; newE = span; }\n      if (newE >= len) { newE = len - 1; newS = newE - span; }\n      \n      this.sIdx.set(newS);\n      this.eIdx.set(newE);\n    } else if (this.dragType === 'left') {\n      let newS = Math.round(this.startSIdx + indexDelta);\n      newS = Math.max(0, Math.min(newS, this.eIdx() - 1));\n      this.sIdx.set(newS);\n    } else if (this.dragType === 'right') {\n      let newE = Math.round(this.startEIdx + indexDelta);\n      newE = Math.max(this.sIdx() + 1, Math.min(newE, len - 1));\n      this.eIdx.set(newE);\n    }\n\n    this.emitChange();\n  }\n\n  private emitChange() {\n    const s = this.sIdx();\n    const e = this.eIdx();\n    const cats = this.categories();\n    this.rangeChange.emit({\n      startIndex: s,\n      endIndex: e,\n      startCategory: cats[s] ?? '',\n      endCategory: cats[e] ?? ''\n    });\n  }\n}\n","import { Injectable, signal } from '@angular/core';\n\nexport interface TooltipRow {\n  name: string;\n  value: number | string;\n  color: string;\n  formattedValue?: string;\n}\n\nexport interface TooltipState {\n  visible: boolean;\n  x: number;\n  y: number;\n  title: string;\n  rows: TooltipRow[];\n  pinned?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ChartTooltipService {\n  readonly state = signal<TooltipState | null>(null);\n\n  show(x: number, y: number, title: string, rows: TooltipRow[]): void {\n    if (this.state()?.pinned) return;\n    this.state.set({ visible: true, x, y, title, rows });\n  }\n\n  hide(): void {\n    if (this.state()?.pinned) return;\n    this.state.set(null);\n  }\n\n  togglePin(): void {\n    const curr = this.state();\n    if (!curr) return;\n    this.state.set({ ...curr, pinned: !curr.pinned });\n  }\n\n  /** Compute flip position if tooltip hits viewport right/bottom bounds */\n  getAdjustedPosition(x: number, y: number, containerW: number, containerH: number, tooltipW = 160, tooltipH = 100): { left: number; top: number } {\n    let left = x;\n    let top = y - 10;\n    if (left + tooltipW / 2 > containerW) left = containerW - tooltipW / 2 - 8;\n    if (left - tooltipW / 2 < 0) left = tooltipW / 2 + 8;\n    if (top - tooltipH < 0) top = y + 20; // flip below\n    return { left, top };\n  }\n}\n","import { Component, ChangeDetectionStrategy, input, computed, signal, ElementRef, viewChild, inject, DestroyRef, TemplateRef, output } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartSeries, niceTicks, scale, fmtNum, generateUniqueId } from '../shared/chart-utils';\n\n@Component({\n  selector: 'ngx-step-line-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-step-line-chart\" (mousemove)=\"onMouseMove($event)\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n      @if (showLegend()) {\n        <div class=\"chart-legend\">\n          @for (s of series(); track s.name; let i = $index) {\n            <span class=\"legend-item\"><span class=\"legend-line\" [style.background]=\"seriesColor(i, s)\"></span>{{ s.name }}</span>\n          }\n        </div>\n      }\n      <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"chartHeight()\" class=\"chart-svg\">\n        <defs>\n          @for (s of series(); track s.name; let i = $index) {\n            <linearGradient [attr.id]=\"instanceId + '-area-grad-' + i\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.3\"/>\n              <stop offset=\"100%\" [attr.stop-color]=\"seriesColor(i, s)\" stop-opacity=\"0.02\"/>\n            </linearGradient>\n          }\n        </defs>\n        <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n          @for (tick of yTicks(); track tick) {\n            <g [attr.transform]=\"'translate(0,' + yPos(tick) + ')'\">\n              @if (showGrid()) { <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" stroke=\"var(--ngx-chart-grid,#ebedf0)\" stroke-dasharray=\"3,3\"/> }\n              <text x=\"-8\" dy=\"4\" class=\"axis-label\" text-anchor=\"end\">{{ labelFormatter() ? labelFormatter()!(tick) : fmtNum(tick) }}</text>\n            </g>\n          }\n          @for (ref of referenceLines(); track ref.label) {\n            <g [attr.transform]=\"'translate(0,' + yPos(ref.value) + ')'\">\n              <line [attr.x1]=\"0\" [attr.x2]=\"innerW()\" [attr.stroke]=\"ref.color || '#ef4444'\" [attr.stroke-dasharray]=\"'4,4'\"/>\n            </g>\n          }\n          @for (cat of categories(); track cat; let i = $index) {\n            <text [attr.x]=\"xPos(i)\" [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">{{ cat }}</text>\n          }\n          @for (s of series(); track s.name; let si = $index) {\n            @if (showArea()) {\n              <path [attr.d]=\"areaPath(s)\" [attr.fill]=\"'url(#' + instanceId + '-area-grad-' + si + ')'\" stroke=\"none\" class=\"area-path\"/>\n            }\n            <path [attr.d]=\"linePath(s)\" [attr.stroke]=\"seriesColor(si, s)\" fill=\"none\" stroke-width=\"2.5\" class=\"line-path\"/>\n            @if (showMarkers()) {\n              @for (v of s.data; track $index; let ci = $index) {\n                <circle [attr.cx]=\"xPos(ci)\" [attr.cy]=\"yPos(v)\" [attr.r]=\"activeCategoryIndex() === ci ? 6 : 4\"\n                  [attr.fill]=\"seriesColor(si, s)\" class=\"marker-dot\" stroke=\"#fff\" stroke-width=\"2\" (click)=\"pointClick.emit({category: categories()[ci], value: v, seriesName: s.name})\" />\n                @if (showLabels()) {\n                  <text [attr.x]=\"xPos(ci)\" [attr.y]=\"yPos(v) - 8\" class=\"line-label\" text-anchor=\"middle\">{{ labelFormatter() ? labelFormatter()!(v) : fmtNum(v) }}</text>\n                }\n              }\n            }\n          }\n          @if (crosshair(); as ch) {\n            <line [attr.x1]=\"ch.x\" [attr.x2]=\"ch.x\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\" stroke-dasharray=\"4,3\" class=\"chart-crosshair\"/>\n          }\n          <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\"/>\n          <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\"/>\n        </g>\n      </svg>\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) { <ng-container *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"></ng-container> }\n          @else {\n            <div class=\"tt-cat\">{{ t.cat }}</div>\n            @for (row of t.rows; track row.name) {\n              <div class=\"tt-row\"><span class=\"tt-dot\" [style.background]=\"row.color\"></span><span class=\"tt-name\">{{ row.name }}</span><span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(row.value) : fmtNum(row.value) }}</span></div>\n            }\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .ngx-step-line-chart { position: relative; background: var(--ngx-chart-bg, #fff); }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; }\n    .chart-legend { display: flex; gap: 16px; padding: 4px 0 12px; flex-wrap: wrap; }\n    .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .legend-line { width: 18px; height: 4px; border-radius: 2px; display: inline-block; }\n    .chart-svg { display: block; overflow: visible; }\n    .axis-label { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); user-select: none; font-weight: 500; }\n    .line-label { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); pointer-events: none; font-weight: 600; }\n    .marker-dot { cursor: pointer; transition: r 0.15s cubic-bezier(0.16, 1, 0.3, 1); }\n    .line-path { stroke-dasharray: 2000; stroke-dashoffset: 2000; animation: lineDraw 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards; }\n    .area-path { animation: areaFadeIn 1s cubic-bezier(0.16, 1, 0.3, 1) 0.3s both; }\n    @keyframes lineDraw { from { stroke-dashoffset: 2000; } to { stroke-dashoffset: 0; } }\n    @keyframes areaFadeIn { from { opacity: 0; } to { opacity: 1; } }\n    .chart-tooltip {\n      position: absolute; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 150px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3); z-index: 100;\n      transition: left 0.12s cubic-bezier(0.16, 1, 0.3, 1), top 0.12s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-cat { font-weight: 700; margin-bottom: 8px; font-size: 12.5px; border-bottom: 1px solid rgba(255, 255, 255, 0.15); padding-bottom: 6px; color: #38bdf8; }\n    .tt-row { display: flex; align-items: center; gap: 8px; margin-top: 5px; }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; }\n    .tt-name { color: rgba(248, 250, 252, 0.8); flex: 1; }\n    .tt-val { font-weight: 700; font-family: monospace; }\n  `]\n})\nexport class StepLineChartComponent {\n  readonly instanceId = generateUniqueId('chart');\n  private readonly exportSvc = inject(ChartExportService);\n\n  readonly PAD_LEFT = 48; readonly PAD_TOP = 12; readonly PAD_RIGHT = 16; readonly PAD_BOTTOM = 32;\n\n  series = input<ChartSeries[]>([]);\n  categories = input<string[]>([]);\n  height = input<number>(260);\n  stepMode = input<'before' | 'after' | 'middle'>('after');\n  showGrid = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(false);\n  showMarkers = input<boolean>(true);\n  showArea = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  referenceLines = input<{ value: number; label: string; color?: string; }[]>([]);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  pointClick = output<{ category: string; value: number; seriesName: string }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  containerWidth = signal<number>(600);\n  crosshair = signal<{ x: number } | null>(null);\n  activeCategoryIndex = signal<number | null>(null);\n  tooltip = signal<{ x: number; y: number; cat: string; rows: {name:string;value:number;color:string}[] } | null>(null);\n\n  chartHeight = computed(() => this.height());\n  innerW = computed(() => Math.max(10, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(10, this.chartHeight() - this.PAD_TOP - this.PAD_BOTTOM));\n\n  private allValues = computed(() => this.series().flatMap(s => s.data));\n  private yMin = computed(() => Math.min(0, ...this.allValues()));\n  private yMax = computed(() => Math.max(1, ...this.allValues()));\n  yTicks = computed(() => niceTicks(this.yMin(), this.yMax(), 5));\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || !entries.length) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) this.containerWidth.set(width);\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  yPos(v: number): number { return scale(v, this.yMin(), this.yMax(), this.innerH(), 0); }\n  xPos(i: number): number {\n    const n = this.categories().length;\n    return n <= 1 ? this.innerW() / 2 : scale(i, 0, n - 1, 0, this.innerW());\n  }\n\n  seriesColor(i: number, s: ChartSeries): string { return s.color || this.colors()[i % this.colors().length]; }\n\n  stepPath(points: [number, number][]): string {\n    if (points.length < 2) return '';\n    const mode = this.stepMode();\n    let d = `M ${points[0][0]} ${points[0][1]}`;\n    for (let i = 1; i < points.length; i++) {\n      const prev = points[i - 1];\n      const curr = points[i];\n      if (mode === 'after') {\n        d += ` L ${curr[0]} ${prev[1]} L ${curr[0]} ${curr[1]}`;\n      } else if (mode === 'before') {\n        d += ` L ${prev[0]} ${curr[1]} L ${curr[0]} ${curr[1]}`;\n      } else {\n        const midX = (prev[0] + curr[0]) / 2;\n        d += ` L ${midX} ${prev[1]} L ${midX} ${curr[1]} L ${curr[0]} ${curr[1]}`;\n      }\n    }\n    return d;\n  }\n\n  linePath(s: ChartSeries): string {\n    return this.stepPath(s.data.map((v, i) => [this.xPos(i), this.yPos(v)]));\n  }\n\n  areaPath(s: ChartSeries): string {\n    const pts: [number, number][] = s.data.map((v, i) => [this.xPos(i), this.yPos(v)]);\n    if (pts.length < 2) return '';\n    const line = this.stepPath(pts);\n    return line + ` L ${pts[pts.length - 1][0]} ${this.innerH()} L ${pts[0][0]} ${this.innerH()} Z`;\n  }\n\n  onMouseMove(event: MouseEvent): void {\n    const el = event.currentTarget as HTMLElement;\n    const rect = el.getBoundingClientRect();\n    const mx = event.clientX - rect.left - this.PAD_LEFT;\n    const cats = this.categories();\n    if (!cats.length) return;\n    const idx = Math.round(scale(mx, 0, this.innerW(), 0, cats.length - 1));\n    const ci = Math.max(0, Math.min(cats.length - 1, idx));\n    this.crosshair.set({ x: this.xPos(ci) });\n    this.activeCategoryIndex.set(ci);\n    const rows = this.series().map((s, si) => ({\n      name: s.name, value: s.data[ci] ?? 0, color: this.seriesColor(si, s),\n    }));\n    this.tooltip.set({ x: event.clientX - rect.left, y: event.clientY - rect.top, cat: cats[ci], rows });\n  }\n\n  onMouseLeave(): void {\n    this.crosshair.set(null); this.activeCategoryIndex.set(null); this.tooltip.set(null);\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'svg') this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'step-line-chart.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Step Line Chart', 'step-line-chart.pdf');\n  }\n\n  readonly fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, inject, DestroyRef, TemplateRef, output\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, type ExportFormat } from '../shared/chart-export-menu.component';\nimport { generateUniqueId, fmtNum } from '../shared/chart-utils';\n\nexport interface CalendarHeatmapData {\n  date: string;\n  value: number;\n}\n\n@Component({\n  selector: 'ngx-calendar-heatmap',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-calendar-heatmap\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      <div class=\"heatmap-scroll-container\">\n        <svg #svgEl [attr.width]=\"svgWidth()\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            <!-- Months labels -->\n            @if (showMonthLabels()) {\n              @for (m of monthLabels(); track m.x) {\n                <text [attr.x]=\"m.x\" y=\"-8\" class=\"axis-label\">{{ m.label }}</text>\n              }\n            }\n\n            <!-- Day labels -->\n            @if (showDayLabels()) {\n              <text x=\"-8\" [attr.y]=\"cellSize() * 1.5 + cellGap()\" class=\"axis-label\" text-anchor=\"end\">Mon</text>\n              <text x=\"-8\" [attr.y]=\"cellSize() * 3.5 + cellGap() * 3\" class=\"axis-label\" text-anchor=\"end\">Wed</text>\n              <text x=\"-8\" [attr.y]=\"cellSize() * 5.5 + cellGap() * 5\" class=\"axis-label\" text-anchor=\"end\">Fri</text>\n            }\n\n            <!-- Cells -->\n            @for (week of weeks(); track $index; let wIdx = $index) {\n              <g [attr.transform]=\"'translate(' + (wIdx * (cellSize() + cellGap())) + ', 0)'\">\n                @for (day of week; track day.date) {\n                  @if (day.inRange) {\n                    <rect\n                      [attr.width]=\"cellSize()\"\n                      [attr.height]=\"cellSize()\"\n                      [attr.y]=\"day.dayOfWeek * (cellSize() + cellGap())\"\n                      [attr.fill]=\"getColor(day.value)\"\n                      [attr.rx]=\"2\"\n                      [attr.ry]=\"2\"\n                      class=\"heatmap-cell\"\n                      (mouseenter)=\"onMouseEnter($event, day)\"\n                      (click)=\"onCellClick(day)\"\n                    />\n                  }\n                }\n              </g>\n            }\n          </g>\n        </svg>\n      </div>\n\n      <div class=\"heatmap-legend\">\n        <span class=\"legend-text\">Less</span>\n        @for (c of colorRange(); track c) {\n          <span class=\"legend-color-box\" [style.background]=\"c\"></span>\n        }\n        <span class=\"legend-text\">More</span>\n      </div>\n\n      <!-- Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) {\n            <ng-container *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"></ng-container>\n          } @else {\n            <div class=\"tt-val\">{{ fmtNum(t.value) }} contributions</div>\n            <div class=\"tt-date\">{{ t.date }}</div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .ngx-calendar-heatmap { position: relative; background: var(--ngx-chart-bg, #fff); padding-bottom: 16px; }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; margin-bottom: 8px; }\n    .heatmap-scroll-container { overflow-x: auto; overflow-y: hidden; padding-bottom: 8px; }\n    .chart-svg { display: block; min-width: max-content; }\n    .axis-label { font-size: 10px; fill: var(--ngx-chart-axis-text, #6c757d); user-select: none; }\n    .heatmap-cell { transition: fill 0.2s; cursor: pointer; stroke: rgba(0,0,0,0.05); stroke-width: 1px; }\n    .heatmap-cell:hover { stroke: #000; stroke-width: 2px; }\n    .heatmap-legend { display: flex; align-items: center; justify-content: flex-end; gap: 4px; font-size: 11px; color: var(--ngx-chart-axis-text, #6c757d); margin-top: 8px; padding-right: 16px; }\n    .legend-text { margin: 0 4px; }\n    .legend-color-box { width: 12px; height: 12px; border-radius: 2px; border: 1px solid rgba(0,0,0,0.1); }\n    .chart-tooltip {\n      position: fixed; pointer-events: none; transform: translate(-50%, -100%) translateY(-8px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 8px 12px;\n      border-radius: 6px; font-size: 12px;\n      box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n      z-index: 1000; text-align: center;\n    }\n    .tt-val { font-weight: 600; margin-bottom: 4px; color: #fff; }\n    .tt-date { color: rgba(255,255,255,0.7); font-size: 11px; }\n  `]\n})\nexport class CalendarHeatmapComponent {\n  readonly instanceId = generateUniqueId('heatmap');\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<CalendarHeatmapData[]>([]);\n  colorRange = input<string[]>(['#ebedf0', '#9be9a8', '#40c463', '#30a14e', '#216e39']);\n  height = input<number>(160);\n  showMonthLabels = input<boolean>(true);\n  showDayLabels = input<boolean>(true);\n  cellSize = input<number>(12);\n  cellGap = input<number>(2);\n  showExport = input<boolean>(false);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  cellClick = output<{ date: string; value: number }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  tooltip = signal<{ x: number; y: number; date: string; value: number } | null>(null);\n\n  PAD_LEFT = 32;\n  PAD_TOP = 24;\n\n  weeks = computed(() => {\n    const rawData = this.data();\n    const dataMap = new Map<string, number>();\n    rawData.forEach(d => dataMap.set(d.date.split('T')[0], d.value));\n    \n    const today = new Date();\n    today.setHours(0, 0, 0, 0);\n    const startDate = new Date(today);\n    startDate.setDate(today.getDate() - 365);\n    \n    // Adjust start date to previous Sunday\n    while (startDate.getDay() !== 0) {\n      startDate.setDate(startDate.getDate() - 1);\n    }\n    \n    const weeksList: any[][] = [];\n    let currentWeek: any[] = [];\n    \n    const iterDate = new Date(startDate);\n    while (iterDate <= today) {\n      const dStr = iterDate.toISOString().split('T')[0];\n      currentWeek.push({\n        date: dStr,\n        value: dataMap.get(dStr) || 0,\n        dayOfWeek: iterDate.getDay(),\n        inRange: true\n      });\n      \n      if (iterDate.getDay() === 6) {\n        weeksList.push(currentWeek);\n        currentWeek = [];\n      }\n      iterDate.setDate(iterDate.getDate() + 1);\n    }\n    \n    if (currentWeek.length > 0) {\n      weeksList.push(currentWeek);\n    }\n    \n    return weeksList;\n  });\n\n  monthLabels = computed(() => {\n    const wks = this.weeks();\n    const labels: { label: string; x: number }[] = [];\n    let currentMonth = -1;\n    wks.forEach((week, wIdx) => {\n      const firstDay = week.find(d => d.inRange);\n      if (firstDay) {\n        const date = new Date(firstDay.date);\n        if (date.getMonth() !== currentMonth) {\n          currentMonth = date.getMonth();\n          labels.push({\n            label: date.toLocaleString('default', { month: 'short' }),\n            x: wIdx * (this.cellSize() + this.cellGap())\n          });\n        }\n      }\n    });\n    return labels;\n  });\n\n  svgWidth = computed(() => {\n    const w = this.weeks().length * (this.cellSize() + this.cellGap()) + this.PAD_LEFT + 16;\n    return w;\n  });\n\n  private maxVal = computed(() => {\n    const vals = this.data().map(d => d.value);\n    return vals.length ? Math.max(...vals) : 1;\n  });\n\n  getColor(value: number): string {\n    const colors = this.colorRange();\n    if (value === 0) return colors[0];\n    const max = this.maxVal();\n    const ratio = value / max;\n    const idx = Math.min(colors.length - 1, Math.max(1, Math.ceil(ratio * (colors.length - 1))));\n    return colors[idx];\n  }\n\n  onMouseEnter(event: MouseEvent, day: any): void {\n    const rect = (event.target as HTMLElement).getBoundingClientRect();\n    this.tooltip.set({\n      x: rect.left + rect.width / 2,\n      y: rect.top,\n      date: day.date,\n      value: day.value\n    });\n  }\n\n  onMouseLeave(): void {\n    this.tooltip.set(null);\n  }\n\n  onCellClick(day: any): void {\n    this.cellClick.emit({ date: day.date, value: day.value });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'svg') this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'calendar-heatmap.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Calendar Heatmap', 'calendar-heatmap.pdf');\n    else {\n      const rows = this.data().map(d => [d.date, d.value]);\n      if (type === 'csv') this.exportSvc.downloadCsv(['Date', 'Value'], rows, 'calendar-data.csv');\n      else if (type === 'json') this.exportSvc.downloadJson(this.data(), 'calendar-data.json');\n    }\n  }\n\n  fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, inject, DestroyRef, TemplateRef, output\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, type ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, ChartDataPoint, generateUniqueId, fmtNum } from '../shared/chart-utils';\n\nexport interface DonutRing {\n  name: string;\n  data: ChartDataPoint[];\n}\n\n@Component({\n  selector: 'ngx-nested-donut-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-nested-donut-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      @if (showLegend()) {\n        <div class=\"chart-legend\">\n          @for (c of allCategories(); track c; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"colors()[i % colors().length]\"></span>\n              {{ c }}\n            </span>\n          }\n        </div>\n      }\n\n      <div class=\"chart-body\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + centerX() + ',' + centerY() + ')'\">\n            @for (ring of ringData(); track ring.name; let rIdx = $index) {\n              @for (slice of ring.slices; track slice.label; let sIdx = $index) {\n                <path\n                  [attr.d]=\"getArcPath(slice.startAngle, slice.endAngle, slice.innerRadius, slice.outerRadius + (activeSlice()?.ring === ring.name && activeSlice()?.label === slice.label ? 4 : 0))\"\n                  [attr.fill]=\"slice.color\"\n                  [attr.stroke]=\"'var(--ngx-chart-bg, #fff)'\"\n                  stroke-width=\"2\"\n                  class=\"arc-path\"\n                  (mouseenter)=\"onMouseEnter($event, ring.name, slice)\"\n                  (click)=\"onSliceClick(ring.name, slice)\"\n                />\n              }\n            }\n\n            @if (centerTitle() || centerValue()) {\n              <text text-anchor=\"middle\" class=\"center-text\">\n                @if (centerTitle()) {\n                  <tspan x=\"0\" dy=\"-4\" class=\"center-title\">{{ centerTitle() }}</tspan>\n                }\n                @if (centerValue()) {\n                  <tspan x=\"0\" [attr.dy]=\"centerTitle() ? 20 : 8\" class=\"center-value\">{{ centerValue() }}</tspan>\n                }\n              </text>\n            }\n          </g>\n        </svg>\n      </div>\n\n      <!-- Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) {\n            <ng-container *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"></ng-container>\n          } @else {\n            <div class=\"tt-ring\">{{ t.ring }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">{{ t.label }}</span>\n              <span class=\"tt-val\">{{ fmtNum(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .ngx-nested-donut-chart { position: relative; background: var(--ngx-chart-bg, #fff); }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; z-index: 2; }\n    .chart-legend { display: flex; gap: 16px; padding: 4px 0 12px; flex-wrap: wrap; justify-content: center; }\n    .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .legend-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }\n    .chart-body { position: relative; }\n    .chart-svg { display: block; overflow: visible; }\n    .arc-path { transition: d 0.2s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s; cursor: pointer; }\n    .arc-path:hover { opacity: 0.9; }\n    \n    .center-title { font-size: 12px; fill: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .center-value { font-size: 24px; fill: var(--ngx-chart-axis-text,#334155); font-weight: 700; }\n    \n    @keyframes arcDraw {\n      from { stroke-dasharray: 0 2000; }\n      to { stroke-dasharray: 2000 0; }\n    }\n\n    .chart-tooltip {\n      position: fixed; pointer-events: none; transform: translate(-50%, -100%) translateY(-12px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 10px; font-size: 12px; min-width: 130px;\n      box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3), 0 8px 10px -6px rgba(0,0,0,0.3);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      z-index: 100;\n      transition: left 0.1s cubic-bezier(0.16, 1, 0.3, 1), top 0.1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tt-ring { font-weight: 700; margin-bottom: 6px; font-size: 11px; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.5px; }\n    .tt-row { display: flex; align-items: center; gap: 8px; }\n    .tt-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }\n    .tt-name { color: rgba(248, 250, 252, 0.9); flex: 1; font-weight: 500; }\n    .tt-val { font-weight: 700; font-family: monospace; }\n  `]\n})\nexport class NestedDonutChartComponent {\n  readonly instanceId = generateUniqueId('ndonut');\n  private readonly exportSvc = inject(ChartExportService);\n\n  rings = input<DonutRing[]>([]);\n  height = input<number>(300);\n  ringWidth = input<number>(30);\n  ringGap = input<number>(8);\n  showLegend = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  centerTitle = input<string>('');\n  centerValue = input<string>('');\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  sliceClick = output<{ ring: string; label: string; value: number }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  containerWidth = signal<number>(400);\n\n  tooltip = signal<{ x: number; y: number; ring: string; label: string; value: number; color: string } | null>(null);\n  activeSlice = signal<{ ring: string; label: string } | null>(null);\n\n  centerX = computed(() => this.containerWidth() / 2);\n  centerY = computed(() => this.height() / 2);\n\n  allCategories = computed(() => {\n    const cats = new Set<string>();\n    this.rings().forEach(r => r.data.forEach(d => cats.add(d.label)));\n    return Array.from(cats);\n  });\n\n  ringData = computed(() => {\n    const rings = this.rings();\n    const width = this.ringWidth();\n    const gap = this.ringGap();\n    const catList = this.allCategories();\n    \n    // Outermost ring starts at maxRadius\n    const maxRadius = Math.min(this.containerWidth(), this.height()) / 2 - 16;\n    \n    return rings.map((ring, rIdx) => {\n      const total = ring.data.reduce((sum, d) => sum + d.value, 0);\n      let currentAngle = 0;\n      \n      const outerR = maxRadius - (rIdx * (width + gap));\n      const innerR = outerR - width;\n      \n      const slices = ring.data.map(d => {\n        const angle = (d.value / (total || 1)) * 360;\n        const colorIdx = catList.indexOf(d.label);\n        const slice = {\n          label: d.label,\n          value: d.value,\n          startAngle: currentAngle,\n          endAngle: currentAngle + angle,\n          innerRadius: innerR,\n          outerRadius: outerR,\n          color: d.color || this.colors()[colorIdx % this.colors().length]\n        };\n        currentAngle += angle;\n        return slice;\n      });\n      \n      return { name: ring.name, slices };\n    });\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) this.containerWidth.set(width);\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  polarToCartesian(centerX: number, centerY: number, radius: number, angleInDegrees: number) {\n    const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n    return {\n      x: centerX + (radius * Math.cos(angleInRadians)),\n      y: centerY + (radius * Math.sin(angleInRadians))\n    };\n  }\n\n  getArcPath(startAngle: number, endAngle: number, innerRadius: number, outerRadius: number): string {\n    // If it's a full circle\n    if (endAngle - startAngle === 360) {\n      endAngle -= 0.01;\n    }\n    \n    const start = this.polarToCartesian(0, 0, outerRadius, endAngle);\n    const end = this.polarToCartesian(0, 0, outerRadius, startAngle);\n    const largeArcFlag = endAngle - startAngle <= 180 ? \"0\" : \"1\";\n\n    const innerStart = this.polarToCartesian(0, 0, innerRadius, endAngle);\n    const innerEnd = this.polarToCartesian(0, 0, innerRadius, startAngle);\n\n    return [\n      \"M\", start.x, start.y,\n      \"A\", outerRadius, outerRadius, 0, largeArcFlag, 0, end.x, end.y,\n      \"L\", innerEnd.x, innerEnd.y,\n      \"A\", innerRadius, innerRadius, 0, largeArcFlag, 1, innerStart.x, innerStart.y,\n      \"Z\"\n    ].join(\" \");\n  }\n\n  onMouseEnter(event: MouseEvent, ringName: string, slice: any): void {\n    const rect = (event.target as HTMLElement).getBoundingClientRect();\n    this.activeSlice.set({ ring: ringName, label: slice.label });\n    this.tooltip.set({\n      x: event.clientX,\n      y: event.clientY,\n      ring: ringName,\n      label: slice.label,\n      value: slice.value,\n      color: slice.color\n    });\n  }\n\n  onMouseLeave(): void {\n    this.tooltip.set(null);\n    this.activeSlice.set(null);\n  }\n\n  onSliceClick(ring: string, slice: any): void {\n    this.sliceClick.emit({ ring, label: slice.label, value: slice.value });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'svg') this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'nested-donut.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Nested Donut Chart', 'nested-donut.pdf');\n    else {\n      const data = this.rings().flatMap(r => r.data.map(d => ({ ring: r.name, label: d.label, value: d.value })));\n      if (type === 'json') this.exportSvc.downloadJson(data, 'nested-donut.json');\n      else {\n        const rows = data.map(d => [d.ring, d.label, d.value]);\n        this.exportSvc.downloadCsv(['Ring', 'Label', 'Value'], rows, 'nested-donut.csv');\n      }\n    }\n  }\n\n  fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, inject, DestroyRef, TemplateRef, output\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, type ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, generateUniqueId, fmtNum } from '../shared/chart-utils';\n\nexport interface PyramidItem {\n  label: string;\n  value: number;\n  color?: string;\n}\n\n@Component({\n  selector: 'ngx-pyramid-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-pyramid-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      @if (showLegend()) {\n        <div class=\"chart-legend\">\n          @for (item of data(); track item.label; let i = $index) {\n            <span class=\"legend-item\">\n              <span class=\"legend-dot\" [style.background]=\"item.color || colors()[i % colors().length]\"></span>\n              {{ item.label }}\n            </span>\n          }\n        </div>\n      }\n\n      <div class=\"chart-body\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"height()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            @for (seg of segments(); track seg.label; let i = $index) {\n              <g\n                class=\"pyramid-segment\"\n                (mouseenter)=\"onMouseEnter($event, seg)\"\n                (click)=\"onSegmentClick(seg)\"\n                [class.active]=\"activeSeg() === seg.label\"\n              >\n                <polygon\n                  [attr.points]=\"seg.points\"\n                  [attr.fill]=\"seg.color\"\n                  stroke=\"var(--ngx-chart-bg, #fff)\"\n                  stroke-width=\"2\"\n                  class=\"seg-polygon\"\n                />\n                @if (showLabels()) {\n                  <text\n                    [attr.x]=\"centerX()\"\n                    [attr.y]=\"seg.midY\"\n                    class=\"seg-label\"\n                    text-anchor=\"middle\"\n                    dominant-baseline=\"middle\"\n                  >\n                    {{ seg.label }} {{ showValues() ? '(' + fmtNum(seg.value) + ')' : '' }}\n                  </text>\n                }\n              </g>\n            }\n          </g>\n        </svg>\n      </div>\n\n      <!-- Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) {\n            <ng-container *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"></ng-container>\n          } @else {\n            <div class=\"tt-row\">\n              <span class=\"tt-dot\" [style.background]=\"t.color\"></span>\n              <span class=\"tt-name\">{{ t.label }}</span>\n              <span class=\"tt-val\">{{ fmtNum(t.value) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .ngx-pyramid-chart { position: relative; background: var(--ngx-chart-bg, #fff); }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; z-index: 2; }\n    .chart-legend { display: flex; gap: 16px; padding: 4px 0 12px; flex-wrap: wrap; justify-content: center; }\n    .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .legend-dot { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }\n    .chart-body { position: relative; }\n    .chart-svg { display: block; overflow: visible; }\n    \n    .pyramid-segment { cursor: pointer; }\n    .seg-polygon { transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s; transform-origin: center; }\n    .pyramid-segment:hover .seg-polygon { opacity: 0.9; transform: scaleX(1.02); }\n    .pyramid-segment.active .seg-polygon { transform: scaleX(1.02); }\n    \n    .seg-label { font-size: 12px; fill: #fff; font-weight: 600; pointer-events: none; text-shadow: 0 1px 2px rgba(0,0,0,0.4); }\n\n    .chart-tooltip {\n      position: fixed; pointer-events: none; transform: translate(-50%, -100%) translateY(-12px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 8px 12px;\n      border-radius: 8px; font-size: 12px;\n      box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n      z-index: 100;\n    }\n    .tt-row { display: flex; align-items: center; gap: 8px; }\n    .tt-dot { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; }\n    .tt-name { color: rgba(248, 250, 252, 0.9); font-weight: 500; }\n    .tt-val { font-weight: 700; font-family: monospace; margin-left: 4px; }\n  `]\n})\nexport class PyramidChartComponent {\n  readonly instanceId = generateUniqueId('pyramid');\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<PyramidItem[]>([]);\n  height = input<number>(300);\n  mode = input<'pyramid' | 'inverted'>('pyramid');\n  showLabels = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  showValues = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  segmentClick = output<{ label: string; value: number }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  containerWidth = signal<number>(400);\n\n  tooltip = signal<{ x: number; y: number; label: string; value: number; color: string } | null>(null);\n  activeSeg = signal<string | null>(null);\n\n  PAD_LEFT = 16;\n  PAD_RIGHT = 16;\n  PAD_TOP = 16;\n  PAD_BOTTOM = 16;\n\n  innerW = computed(() => Math.max(0, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  innerH = computed(() => Math.max(0, this.height() - this.PAD_TOP - this.PAD_BOTTOM));\n  centerX = computed(() => this.innerW() / 2);\n\n  segments = computed(() => {\n    const rawData = this.data();\n    if (!rawData.length) return [];\n    \n    const total = rawData.reduce((sum, d) => sum + d.value, 0);\n    const mode = this.mode();\n    const w = this.innerW();\n    const h = this.innerH();\n    const cx = this.centerX();\n    \n    let currentY = 0;\n    \n    return rawData.map((d, i) => {\n      const segH = (d.value / total) * h;\n      const y0 = currentY;\n      const y1 = currentY + segH;\n      \n      let w0, w1;\n      \n      if (mode === 'pyramid') {\n        w0 = (y0 / h) * w;\n        w1 = (y1 / h) * w;\n      } else {\n        w0 = ((h - y0) / h) * w;\n        w1 = ((h - y1) / h) * w;\n      }\n      \n      // Points for trapezoid\n      const p1 = `${cx - w0/2},${y0}`;\n      const p2 = `${cx + w0/2},${y0}`;\n      const p3 = `${cx + w1/2},${y1}`;\n      const p4 = `${cx - w1/2},${y1}`;\n      \n      const color = d.color || this.colors()[i % this.colors().length];\n      \n      currentY = y1;\n      \n      return {\n        ...d,\n        color,\n        points: `${p1} ${p2} ${p3} ${p4}`,\n        midY: y0 + segH / 2\n      };\n    });\n  });\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) this.containerWidth.set(width);\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  onMouseEnter(event: MouseEvent, seg: any): void {\n    const rect = (event.target as HTMLElement).getBoundingClientRect();\n    this.activeSeg.set(seg.label);\n    this.tooltip.set({\n      x: event.clientX,\n      y: event.clientY,\n      label: seg.label,\n      value: seg.value,\n      color: seg.color\n    });\n  }\n\n  onMouseLeave(): void {\n    this.tooltip.set(null);\n    this.activeSeg.set(null);\n  }\n\n  onSegmentClick(seg: any): void {\n    this.segmentClick.emit({ label: seg.label, value: seg.value });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'svg') this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'pyramid-chart.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Pyramid Chart', 'pyramid-chart.pdf');\n    else {\n      const rows = this.data().map(d => [d.label, d.value]);\n      if (type === 'csv') this.exportSvc.downloadCsv(['Label', 'Value'], rows, 'pyramid-chart.csv');\n      else if (type === 'json') this.exportSvc.downloadJson(this.data(), 'pyramid-chart.json');\n    }\n  }\n\n  fmtNum = fmtNum;\n}\n","import {\n  Component, ChangeDetectionStrategy, input, computed, signal,\n  ElementRef, viewChild, inject, DestroyRef, TemplateRef, output\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, type ExportFormat } from '../shared/chart-export-menu.component';\nimport { CHART_COLORS, niceTicks, scale, generateUniqueId, fmtNum } from '../shared/chart-utils';\n\nexport interface RangeBarItem {\n  label: string;\n  start: number;\n  end: number;\n  color?: string;\n  category?: string;\n}\n\n@Component({\n  selector: 'ngx-range-bar-chart',\n  standalone: true,\n  imports: [ChartExportMenuComponent, NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-range-bar-chart\" (mouseleave)=\"onMouseLeave()\">\n      <div class=\"chart-header\">\n        <div class=\"chart-title-space\"></div>\n        @if (showExport()) {\n          <ngx-chart-export-menu (exportClicked)=\"onExport($event)\" />\n        }\n      </div>\n\n      @if (showLegend()) {\n        <div class=\"chart-legend\">\n          @for (c of categories(); track c; let i = $index) {\n            @if (c) {\n              <span class=\"legend-item\">\n                <span class=\"legend-dot\" [style.background]=\"colors()[i % colors().length]\"></span>\n                {{ c }}\n              </span>\n            }\n          }\n        </div>\n      }\n\n      <div class=\"chart-body\">\n        <svg #svgEl [attr.width]=\"'100%'\" [attr.height]=\"calculatedHeight()\" class=\"chart-svg\">\n          <g [attr.transform]=\"'translate(' + PAD_LEFT + ',' + PAD_TOP + ')'\">\n            \n            <!-- X axis grid and ticks -->\n            @for (tick of xTicks(); track tick) {\n              <g [attr.transform]=\"'translate(' + xPos(tick) + ', 0)'\">\n                @if (showGrid()) {\n                  <line [attr.y1]=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-grid,#ebedf0)\" stroke-dasharray=\"3,3\"/>\n                }\n                <text [attr.y]=\"innerH() + 16\" class=\"axis-label\" text-anchor=\"middle\">\n                  {{ labelFormatter() ? labelFormatter()!(tick) : fmtNum(tick) }}\n                </text>\n              </g>\n            }\n\n            <!-- Y axis items and bars -->\n            @for (layout of layoutData(); track layout.id; let i = $index) {\n              @if (layout.isHeader) {\n                <text\n                  x=\"-8\"\n                  [attr.y]=\"layout.y + barHeight() / 2\"\n                  class=\"category-header\"\n                  text-anchor=\"end\"\n                  dominant-baseline=\"middle\"\n                >{{ layout.label }}</text>\n                <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"layout.y + barHeight()/2\" [attr.y2]=\"layout.y + barHeight()/2\" stroke=\"var(--ngx-chart-grid,#ebedf0)\" stroke-dasharray=\"2,2\"/>\n              } @else {\n                <!-- Label -->\n                @if (showLabels()) {\n                  <text\n                    x=\"-8\"\n                    [attr.y]=\"layout.y + barHeight() / 2\"\n                    class=\"item-label\"\n                    text-anchor=\"end\"\n                    dominant-baseline=\"middle\"\n                  >{{ layout.label }}</text>\n                }\n                \n                <!-- Bar -->\n                <rect\n                  [attr.x]=\"layout.x\"\n                  [attr.y]=\"layout.y\"\n                  [attr.width]=\"layout.w\"\n                  [attr.height]=\"barHeight()\"\n                  [attr.fill]=\"layout.color\"\n                  [attr.rx]=\"4\"\n                  [attr.ry]=\"4\"\n                  class=\"range-bar\"\n                  (mouseenter)=\"onMouseEnter($event, layout.item)\"\n                  (click)=\"onBarClick(layout.item)\"\n                />\n              }\n            }\n\n            <line x1=\"0\" [attr.x2]=\"innerW()\" [attr.y1]=\"innerH()\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\"/>\n            <line x1=\"0\" x2=\"0\" y1=\"0\" [attr.y2]=\"innerH()\" stroke=\"var(--ngx-chart-axis,#ced4da)\"/>\n          </g>\n        </svg>\n      </div>\n\n      <!-- Tooltip -->\n      @if (tooltip(); as t) {\n        <div class=\"chart-tooltip\" [style.left.px]=\"t.x\" [style.top.px]=\"t.y\">\n          @if (tooltipTemplate()) {\n            <ng-container *ngTemplateOutlet=\"tooltipTemplate()!; context: { $implicit: t }\"></ng-container>\n          } @else {\n            <div class=\"tt-cat\">{{ t.item.label }}</div>\n            <div class=\"tt-row\">\n              <span class=\"tt-lbl\">Start:</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.item.start) : fmtNum(t.item.start) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-lbl\">End:</span>\n              <span class=\"tt-val\">{{ labelFormatter() ? labelFormatter()!(t.item.end) : fmtNum(t.item.end) }}</span>\n            </div>\n            <div class=\"tt-row\">\n              <span class=\"tt-lbl\">Duration:</span>\n              <span class=\"tt-val\">{{ fmtNum(t.item.end - t.item.start) }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; position: relative; }\n    .ngx-range-bar-chart { position: relative; background: var(--ngx-chart-bg, #fff); }\n    .chart-header { display: flex; justify-content: space-between; align-items: center; min-height: 24px; position: relative; z-index: 2; }\n    .chart-legend { display: flex; gap: 16px; padding: 4px 0 12px; flex-wrap: wrap; }\n    .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; }\n    .legend-dot { width: 12px; height: 12px; border-radius: 2px; display: inline-block; }\n    \n    .chart-body { overflow-x: auto; overflow-y: hidden; }\n    .chart-svg { display: block; min-width: 100%; }\n    \n    .axis-label { font-size: 11px; fill: var(--ngx-chart-axis-text,#6c757d); user-select: none; font-weight: 500; }\n    .category-header { font-size: 12px; fill: var(--ngx-chart-axis-text,#334155); font-weight: 700; user-select: none; }\n    .item-label { font-size: 11.5px; fill: var(--ngx-chart-axis-text,#6c757d); font-weight: 500; user-select: none; }\n    \n    .range-bar { cursor: pointer; transition: filter 0.2s, opacity 0.2s; opacity: 0.9; }\n    .range-bar:hover { opacity: 1; filter: brightness(1.1); stroke: rgba(0,0,0,0.1); stroke-width: 1; }\n\n    .chart-tooltip {\n      position: fixed; pointer-events: none; transform: translate(-50%, -100%) translateY(-12px);\n      background: var(--ngx-chart-tooltip-bg, rgba(15, 23, 42, 0.92));\n      backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n      color: var(--ngx-chart-tooltip-color, #f8fafc); padding: 10px 14px;\n      border-radius: 8px; font-size: 12px; min-width: 160px;\n      box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n      z-index: 100;\n    }\n    .tt-cat { font-weight: 700; margin-bottom: 8px; font-size: 12.5px; border-bottom: 1px solid rgba(255, 255, 255, 0.15); padding-bottom: 6px; color: #38bdf8; }\n    .tt-row { display: flex; align-items: center; justify-content: space-between; margin-top: 4px; }\n    .tt-lbl { color: rgba(248, 250, 252, 0.8); }\n    .tt-val { font-weight: 700; font-family: monospace; }\n  `]\n})\nexport class RangeBarChartComponent {\n  readonly instanceId = generateUniqueId('range');\n  private readonly exportSvc = inject(ChartExportService);\n\n  data = input<RangeBarItem[]>([]);\n  height = input<number>(300);\n  barHeight = input<number>(24);\n  barGap = input<number>(8);\n  showGrid = input<boolean>(true);\n  showLabels = input<boolean>(true);\n  showLegend = input<boolean>(false);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(false);\n  labelFormatter = input<((v: number) => string) | undefined>(undefined);\n  tooltipTemplate = input<TemplateRef<any> | null>(null);\n\n  barClick = output<{ label: string; start: number; end: number }>();\n\n  svgEl = viewChild<ElementRef<SVGElement>>('svgEl');\n  containerWidth = signal<number>(600);\n\n  tooltip = signal<{ x: number; y: number; item: RangeBarItem } | null>(null);\n\n  PAD_LEFT = 120;\n  PAD_TOP = 16;\n  PAD_RIGHT = 32;\n  PAD_BOTTOM = 32;\n\n  innerW = computed(() => Math.max(0, this.containerWidth() - this.PAD_LEFT - this.PAD_RIGHT));\n  \n  categories = computed(() => {\n    const cats = new Set<string>();\n    this.data().forEach(d => { if (d.category) cats.add(d.category); });\n    return Array.from(cats);\n  });\n\n  xRange = computed(() => {\n    const d = this.data();\n    if (!d.length) return { min: 0, max: 100 };\n    const min = Math.min(...d.map(i => i.start));\n    const max = Math.max(...d.map(i => i.end));\n    return { min, max: max === min ? max + 1 : max };\n  });\n\n  xTicks = computed(() => niceTicks(this.xRange().min, this.xRange().max, 5));\n\n  layoutData = computed(() => {\n    const raw = this.data();\n    const grps = new Map<string, RangeBarItem[]>();\n    const order: string[] = [];\n    \n    raw.forEach(d => {\n      const c = d.category || '';\n      if (!grps.has(c)) {\n        grps.set(c, []);\n        order.push(c);\n      }\n      grps.get(c)!.push(d);\n    });\n\n    const layout: any[] = [];\n    let currentY = 0;\n    const { min, max } = this.xRange();\n    const w = this.innerW();\n\n    order.forEach((cat, catIdx) => {\n      if (cat) {\n        layout.push({ id: `header-${cat}`, isHeader: true, label: cat, y: currentY });\n        currentY += this.barHeight() + this.barGap();\n      }\n      \n      const items = grps.get(cat)!;\n      items.forEach((item, iIdx) => {\n        const x = scale(item.start, min, max, 0, w);\n        const endX = scale(item.end, min, max, 0, w);\n        const color = item.color || this.colors()[catIdx % this.colors().length];\n        \n        layout.push({\n          id: `item-${cat}-${iIdx}-${item.label}`,\n          isHeader: false,\n          label: item.label,\n          y: currentY,\n          x,\n          w: Math.max(2, endX - x),\n          color,\n          item\n        });\n        currentY += this.barHeight() + this.barGap();\n      });\n      \n      // Extra gap after group\n      if (catIdx < order.length - 1) {\n        currentY += this.barGap();\n      }\n    });\n\n    return layout;\n  });\n\n  innerH = computed(() => {\n    const l = this.layoutData();\n    if (!l.length) return 100;\n    const last = l[l.length - 1];\n    return last.y + this.barHeight();\n  });\n\n  calculatedHeight = computed(() => this.innerH() + this.PAD_TOP + this.PAD_BOTTOM);\n\n  constructor() {\n    const hostEl = inject(ElementRef).nativeElement;\n    if (typeof ResizeObserver !== 'undefined') {\n      const resizeObserver = new ResizeObserver(entries => {\n        if (!entries || entries.length === 0) return;\n        const width = entries[0].contentRect.width;\n        if (width > 0) this.containerWidth.set(width);\n      });\n      resizeObserver.observe(hostEl);\n      inject(DestroyRef).onDestroy(() => resizeObserver.disconnect());\n    }\n  }\n\n  xPos(v: number): number {\n    return scale(v, this.xRange().min, this.xRange().max, 0, this.innerW());\n  }\n\n  onMouseEnter(event: MouseEvent, item: RangeBarItem): void {\n    const rect = (event.target as HTMLElement).getBoundingClientRect();\n    this.tooltip.set({\n      x: event.clientX,\n      y: event.clientY,\n      item\n    });\n  }\n\n  onMouseLeave(): void {\n    this.tooltip.set(null);\n  }\n\n  onBarClick(item: RangeBarItem): void {\n    this.barClick.emit({ label: item.label, start: item.start, end: item.end });\n  }\n\n  onExport(type: ExportFormat): void {\n    if (type === 'svg') this.exportSvc.downloadSvg(this.svgEl()?.nativeElement, 'range-bar-chart.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(this.svgEl()?.nativeElement, 'Range Bar Chart', 'range-bar-chart.pdf');\n    else {\n      if (type === 'csv') {\n        const rows = this.data().map(d => [d.category || '', d.label, d.start, d.end]);\n        this.exportSvc.downloadCsv(['Category', 'Label', 'Start', 'End'], rows, 'range-bar-chart.csv');\n      }\n      else if (type === 'json') this.exportSvc.downloadJson(this.data(), 'range-bar-chart.json');\n    }\n  }\n\n  fmtNum = fmtNum;\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  computed,\n  signal,\n  inject,\n  DestroyRef,\n  ElementRef,\n  viewChild,\n  effect,\n  output\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, generateUniqueId, scale } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface TimelineEvent {\n  id: string;\n  title: string;\n  category?: string;\n  startDate: string | Date;\n  endDate?: string | Date;\n  status?: 'completed' | 'in-progress' | 'pending' | 'failed' | 'warning';\n  details?: string;\n  icon?: string;\n}\n\n@Component({\n  selector: 'ngx-timeline-chart',\n  standalone: true,\n  imports: [CommonModule, ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-chart-container\" #container>\n      <div class=\"ngx-chart-header\">\n        <div class=\"ngx-chart-legend\" *ngIf=\"showLegend()\">\n          <div class=\"legend-item\" *ngFor=\"let cat of categories()\">\n            <span class=\"legend-color\" [style.background-color]=\"categoryColors()[cat]\"></span>\n            <span class=\"legend-label\">{{ cat }}</span>\n          </div>\n        </div>\n        <ngx-chart-export-menu *ngIf=\"showExport()\" (exportClicked)=\"onExport($event)\" />\n      </div>\n\n      <svg class=\"ngx-chart-svg\" [attr.width]=\"width()\" [attr.height]=\"height()\" [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\">\n        <!-- Grid lines and Axis -->\n        <g class=\"grid-lines\">\n          <line *ngFor=\"let tick of xTicks()\" \n                [attr.x1]=\"tick.x\" \n                [attr.y1]=\"marginTop\" \n                [attr.x2]=\"tick.x\" \n                [attr.y2]=\"height() - marginBottom\"\n                class=\"ngx-chart-grid\" />\n        </g>\n        \n        <g class=\"x-axis\">\n          <line [attr.x1]=\"marginLeft\" [attr.y1]=\"height() - marginBottom\" [attr.x2]=\"width() - marginRight\" [attr.y2]=\"height() - marginBottom\" class=\"ngx-chart-axis\" />\n          <text *ngFor=\"let tick of xTicks()\" \n                [attr.x]=\"tick.x\" \n                [attr.y]=\"height() - marginBottom + 20\" \n                text-anchor=\"middle\" \n                class=\"ngx-chart-axis-text\">\n            {{ tick.label }}\n          </text>\n        </g>\n\n        <!-- Categories Background & Labels -->\n        <g class=\"category-rows\">\n          <g *ngFor=\"let cat of categories(); let i = index\">\n            <rect [attr.x]=\"0\" [attr.y]=\"yScale(i) - 20\" [attr.width]=\"width()\" [attr.height]=\"rowHeight\" fill=\"var(--ngx-chart-bg)\" opacity=\"0.5\" />\n            <text [attr.x]=\"10\" [attr.y]=\"yScale(i) + 5\" class=\"ngx-chart-axis-text\" font-weight=\"bold\">{{ cat }}</text>\n          </g>\n        </g>\n\n        <!-- Events -->\n        <g class=\"events\">\n          <g *ngFor=\"let ev of processedEvents()\" \n             (mouseenter)=\"hoverEvent.set(ev)\" \n             (mouseleave)=\"hoverEvent.set(null)\"\n             (click)=\"eventClick.emit(ev.raw)\"\n             class=\"event-group\">\n            \n            <ng-container *ngIf=\"ev.isDuration; else milestone\">\n              <rect [attr.x]=\"ev.x\" \n                    [attr.y]=\"ev.y - 12\" \n                    [attr.width]=\"ev.width\" \n                    [attr.height]=\"24\" \n                    rx=\"12\" \n                    [attr.fill]=\"ev.color\"\n                    class=\"event-bar\" />\n              <text [attr.x]=\"ev.x + 12\" [attr.y]=\"ev.y + 4\" fill=\"#fff\" font-size=\"12\" class=\"event-text\" pointer-events=\"none\">\n                {{ ev.raw.title }}\n              </text>\n            </ng-container>\n\n            <ng-template #milestone>\n              <path [attr.d]=\"getDiamondPath(ev.x, ev.y, 8)\" [attr.fill]=\"ev.color\" class=\"event-pin\" />\n              <text [attr.x]=\"ev.x\" [attr.y]=\"ev.y - 16\" text-anchor=\"middle\" class=\"ngx-chart-axis-text\" font-size=\"12\">\n                {{ ev.raw.title }}\n              </text>\n            </ng-template>\n          </g>\n        </g>\n\n        <!-- Tooltip -->\n        <foreignObject *ngIf=\"hoverEvent()\" \n                       [attr.x]=\"getTooltipX(hoverEvent()!)\" \n                       [attr.y]=\"getTooltipY(hoverEvent()!)\" \n                       width=\"220\" height=\"120\"\n                       class=\"tooltip-fo\">\n          <div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"ngx-chart-tooltip\">\n            <div class=\"tooltip-title\">{{ hoverEvent()!.raw.title }}</div>\n            <div class=\"tooltip-body\">\n              <div>Status: {{ hoverEvent()!.raw.status || 'unknown' }}</div>\n              <div>Start: {{ formatDate(hoverEvent()!.raw.startDate) }}</div>\n              <div *ngIf=\"hoverEvent()!.raw.endDate\">End: {{ formatDate(hoverEvent()!.raw.endDate) }}</div>\n              <div *ngIf=\"hoverEvent()!.raw.details\" class=\"tooltip-details\">{{ hoverEvent()!.raw.details }}</div>\n            </div>\n          </div>\n        </foreignObject>\n      </svg>\n    </div>\n  `,\n  styles: [`\n    .ngx-chart-container {\n      position: relative;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      font-family: sans-serif;\n    }\n    .ngx-chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 8px 16px;\n    }\n    .ngx-chart-legend {\n      display: flex;\n      gap: 16px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      color: var(--ngx-chart-axis-text, #666);\n    }\n    .legend-color {\n      width: 12px;\n      height: 12px;\n      border-radius: 50%;\n    }\n    .ngx-chart-svg {\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-chart-grid {\n      stroke: var(--ngx-chart-grid, #e0e0e0);\n      stroke-width: 1;\n      stroke-dasharray: 4;\n    }\n    .ngx-chart-axis {\n      stroke: var(--ngx-chart-axis, #ccc);\n      stroke-width: 2;\n    }\n    .ngx-chart-axis-text {\n      fill: var(--ngx-chart-axis-text, #666);\n      font-size: 12px;\n    }\n    .event-group {\n      cursor: pointer;\n      transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .event-group:hover {\n      opacity: 0.8;\n    }\n    .event-bar, .event-pin {\n      transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .tooltip-fo {\n      pointer-events: none;\n      overflow: visible;\n    }\n    .ngx-chart-tooltip {\n      background: var(--ngx-chart-tooltip-bg, rgba(255, 255, 255, 0.8));\n      backdrop-filter: blur(8px);\n      border: 1px solid rgba(255, 255, 255, 0.2);\n      border-radius: 8px;\n      padding: 12px;\n      color: var(--ngx-chart-tooltip-color, #333);\n      box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n      font-size: 12px;\n      width: 100%;\n      box-sizing: border-box;\n    }\n    .tooltip-title {\n      font-weight: bold;\n      margin-bottom: 4px;\n      font-size: 14px;\n    }\n    .tooltip-details {\n      margin-top: 4px;\n      font-style: italic;\n      opacity: 0.8;\n    }\n  `]\n})\nexport class TimelineChartComponent {\n  events = input<TimelineEvent[]>([]);\n  height = input<number>(280);\n  groupCategories = input<boolean>(true);\n  showLegend = input<boolean>(true);\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(true);\n\n  private exportSvc = inject(ChartExportService);\n  eventClick = output<TimelineEvent>();\n\n  container = viewChild<ElementRef>('container');\n\n  onExport(type: ExportFormat): void {\n    const el = this.container()?.nativeElement;\n    if (type === 'svg') this.exportSvc.downloadSvg(el, 'timeline-chart.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(el, 'Timeline Chart', 'timeline-chart.pdf');\n  }\n  width = signal<number>(800);\n  hoverEvent = signal<any>(null);\n\n  chartId = generateUniqueId('timeline');\n  \n  marginLeft = 120;\n  marginRight = 40;\n  marginTop = 40;\n  marginBottom = 40;\n  rowHeight = 60;\n\n  get containerEl() {\n    return this.container()?.nativeElement;\n  }\n\n  statusColors: Record<string, string> = {\n    'completed': '#10b981',\n    'in-progress': '#3b82f6',\n    'pending': '#9ca3af',\n    'failed': '#ef4444',\n    'warning': '#f59e0b'\n  };\n\n  private destroyRef = inject(DestroyRef);\n\n  constructor() {\n    effect((onCleanup) => {\n      const el = this.container()?.nativeElement;\n      if (!el) return;\n      const ro = new ResizeObserver(entries => {\n        if (entries[0]) {\n          this.width.set(entries[0].contentRect.width || 800);\n        }\n      });\n      ro.observe(el);\n      onCleanup(() => ro.disconnect());\n    });\n  }\n\n  categories = computed(() => {\n    if (!this.groupCategories()) return ['Default'];\n    const cats = new Set(this.events().map(e => e.category || 'Other'));\n    return Array.from(cats);\n  });\n\n  categoryColors = computed(() => {\n    const cats = this.categories();\n    const cols = this.colors();\n    const map: Record<string, string> = {};\n    cats.forEach((c, i) => map[c] = cols[i % cols.length]);\n    return map;\n  });\n\n  timeRange = computed(() => {\n    let minTime = Infinity;\n    let maxTime = -Infinity;\n    \n    this.events().forEach(e => {\n      const start = new Date(e.startDate).getTime();\n      const end = e.endDate ? new Date(e.endDate).getTime() : start;\n      if (start < minTime) minTime = start;\n      if (end > maxTime) maxTime = end;\n      if (start > maxTime) maxTime = start;\n    });\n\n    if (minTime === Infinity) {\n      const now = Date.now();\n      minTime = now - 86400000;\n      maxTime = now + 86400000;\n    } else {\n      const diff = maxTime - minTime;\n      minTime -= diff * 0.05;\n      maxTime += diff * 0.05;\n    }\n    \n    return { min: minTime, max: maxTime };\n  });\n\n  xScale = (time: number) => {\n    const range = this.timeRange();\n    return scale(time, range.min, range.max, this.marginLeft, this.width() - this.marginRight);\n  };\n\n  yScale = (index: number) => {\n    return this.marginTop + (index + 0.5) * this.rowHeight;\n  };\n\n  xTicks = computed(() => {\n    const range = this.timeRange();\n    const ticks = [];\n    const count = 5;\n    const step = (range.max - range.min) / count;\n    for (let i = 0; i <= count; i++) {\n      const t = range.min + i * step;\n      ticks.push({\n        x: this.xScale(t),\n        label: new Date(t).toLocaleDateString()\n      });\n    }\n    return ticks;\n  });\n\n  processedEvents = computed(() => {\n    const cats = this.categories();\n    return this.events().map(ev => {\n      const start = new Date(ev.startDate).getTime();\n      const end = ev.endDate ? new Date(ev.endDate).getTime() : start;\n      \n      const x1 = this.xScale(start);\n      const x2 = this.xScale(end);\n      \n      const catIdx = this.groupCategories() ? cats.indexOf(ev.category || 'Other') : 0;\n      const y = this.yScale(catIdx);\n      \n      const color = ev.status ? (this.statusColors[ev.status] || '#ccc') : this.categoryColors()[ev.category || 'Other'];\n      \n      return {\n        raw: ev,\n        x: x1,\n        y,\n        width: Math.max(x2 - x1, 4),\n        isDuration: !!ev.endDate && (end > start),\n        color\n      };\n    });\n  });\n\n  getDiamondPath(cx: number, cy: number, r: number): string {\n    return `M ${cx} ${cy-r} L ${cx+r} ${cy} L ${cx} ${cy+r} L ${cx-r} ${cy} Z`;\n  }\n\n  getTooltipX(ev: any): number {\n    let x = ev.x + (ev.width || 0) / 2;\n    if (x + 240 > this.width()) x -= 240;\n    return x;\n  }\n\n  getTooltipY(ev: any): number {\n    return ev.y - 130;\n  }\n\n  formatDate(d: any): string {\n    return new Date(d).toLocaleString();\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  computed,\n  signal,\n  inject,\n  DestroyRef,\n  ElementRef,\n  viewChild,\n  effect,\n  output\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, generateUniqueId } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface OrgNode {\n  id: string;\n  name: string;\n  title?: string;\n  department?: string;\n  avatarUrl?: string;\n  icon?: string;\n  children?: OrgNode[];\n  expanded?: boolean;\n}\n\ninterface RenderNode {\n  data: OrgNode;\n  x: number;\n  y: number;\n  depth: number;\n  hasChildren: boolean;\n  expanded: boolean;\n}\n\ninterface RenderLink {\n  source: RenderNode;\n  target: RenderNode;\n  path: string;\n}\n\n@Component({\n  selector: 'ngx-org-chart',\n  standalone: true,\n  imports: [CommonModule, ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-chart-container\" #container>\n      <div class=\"ngx-chart-header\">\n        <ngx-chart-export-menu *ngIf=\"showExport()\" (exportClicked)=\"onExport($event)\" />\n      </div>\n\n      <div class=\"scroll-container\">\n        <svg class=\"ngx-chart-svg\" [attr.width]=\"svgWidth()\" [attr.height]=\"svgHeight()\">\n          <g [attr.transform]=\"'translate(' + translateX() + ', ' + translateY() + ')'\">\n            <!-- Links -->\n            <path *ngFor=\"let link of links()\"\n                  [attr.d]=\"link.path\"\n                  class=\"org-link\" />\n            \n            <!-- Nodes -->\n            <g *ngFor=\"let node of nodes()\"\n               class=\"org-node\"\n               [attr.transform]=\"'translate(' + node.x + ',' + node.y + ')'\">\n              \n              <!-- Card Background -->\n              <rect [attr.x]=\"-nodeWidth()/2\" \n                    [attr.y]=\"-nodeHeight()/2\" \n                    [attr.width]=\"nodeWidth()\" \n                    [attr.height]=\"nodeHeight()\" \n                    rx=\"8\"\n                    class=\"org-card\" \n                    (click)=\"nodeClick.emit(node.data)\" />\n              \n              <!-- Avatar -->\n              <image *ngIf=\"node.data.avatarUrl\"\n                     [attr.href]=\"node.data.avatarUrl\"\n                     [attr.x]=\"-nodeWidth()/2 + 10\"\n                     [attr.y]=\"-20\"\n                     width=\"40\" height=\"40\"\n                     clip-path=\"url(#avatar-clip)\" />\n              \n              <clipPath id=\"avatar-clip\">\n                <circle [attr.cx]=\"-nodeWidth()/2 + 30\" cy=\"0\" r=\"20\" />\n              </clipPath>\n\n              <!-- Circle fallback if no avatar -->\n              <circle *ngIf=\"!node.data.avatarUrl\"\n                      [attr.cx]=\"-nodeWidth()/2 + 30\"\n                      [attr.cy]=\"0\"\n                      r=\"16\"\n                      [attr.fill]=\"getColor(node.depth)\" />\n              \n              <text *ngIf=\"!node.data.avatarUrl\"\n                    [attr.x]=\"-nodeWidth()/2 + 30\"\n                    [attr.y]=\"4\"\n                    text-anchor=\"middle\"\n                    fill=\"#fff\"\n                    font-size=\"12\"\n                    font-weight=\"bold\">\n                {{ node.data.name.charAt(0) }}\n              </text>\n\n              <!-- Text Details -->\n              <text [attr.x]=\"-nodeWidth()/2 + 60\" [attr.y]=\"-6\" class=\"org-name\">{{ node.data.name }}</text>\n              <text [attr.x]=\"-nodeWidth()/2 + 60\" [attr.y]=\"12\" class=\"org-title\">{{ node.data.title || '' }}</text>\n\n              <!-- Expand/Collapse Handle -->\n              <g *ngIf=\"node.hasChildren\"\n                 class=\"expand-handle\"\n                 [attr.transform]=\"getHandleTransform()\"\n                 (click)=\"toggleNode(node, $event)\">\n                <circle cx=\"0\" cy=\"0\" r=\"10\" fill=\"#fff\" stroke=\"#ccc\" />\n                <text x=\"0\" y=\"4\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"bold\" fill=\"#666\">\n                  {{ node.expanded ? '-' : '+' }}\n                </text>\n              </g>\n            </g>\n          </g>\n        </svg>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .ngx-chart-container {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n      font-family: sans-serif;\n    }\n    .ngx-chart-header {\n      position: absolute;\n      top: 8px;\n      right: 16px;\n      z-index: 10;\n    }\n    .scroll-container {\n      width: 100%;\n      height: 100%;\n      overflow: auto;\n    }\n    .ngx-chart-svg {\n      min-width: 100%;\n      min-height: 100%;\n    }\n    .org-link {\n      fill: none;\n      stroke: var(--ngx-chart-grid, #cbd5e1);\n      stroke-width: 2px;\n      transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .org-node {\n      cursor: pointer;\n      transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n    .org-card {\n      fill: var(--ngx-chart-tooltip-bg, rgba(255, 255, 255, 0.85));\n      stroke: rgba(0,0,0,0.1);\n      stroke-width: 1px;\n      backdrop-filter: blur(8px);\n    }\n    .org-node:hover .org-card {\n      stroke: var(--ngx-chart-axis-text, #94a3b8);\n      filter: drop-shadow(0 4px 6px rgba(0,0,0,0.1));\n    }\n    .org-name {\n      fill: var(--ngx-chart-axis-text, #1e293b);\n      font-size: 14px;\n      font-weight: bold;\n    }\n    .org-title {\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-size: 12px;\n    }\n    .expand-handle {\n      cursor: pointer;\n    }\n    .expand-handle:hover circle {\n      fill: #f1f5f9;\n    }\n  `]\n})\nexport class OrgChartComponent {\n  rootNode = input.required<OrgNode>();\n  height = input<number>(450);\n  nodeWidth = input<number>(180);\n  nodeHeight = input<number>(60);\n  orientation = input<'vertical' | 'horizontal'>('vertical');\n  colors = input<string[]>(CHART_COLORS);\n  showExport = input<boolean>(true);\n\n  private exportSvc = inject(ChartExportService);\n  nodeClick = output<OrgNode>();\n  nodeToggle = output<OrgNode>();\n\n  container = viewChild<ElementRef>('container');\n\n  onExport(type: ExportFormat): void {\n    const el = this.container()?.nativeElement;\n    if (type === 'svg') this.exportSvc.downloadSvg(el, 'org-chart.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(el, 'Org Chart', 'org-chart.pdf');\n  }\n  containerWidth = signal<number>(800);\n  \n  expandedState = signal<Set<string>>(new Set());\n\n  chartId = generateUniqueId('org');\n\n  get containerEl() {\n    return this.container()?.nativeElement;\n  }\n\n  private destroyRef = inject(DestroyRef);\n\n  constructor() {\n    effect((onCleanup) => {\n      const el = this.container()?.nativeElement;\n      if (!el) return;\n      const ro = new ResizeObserver(entries => {\n        if (entries[0]) {\n          this.containerWidth.set(entries[0].contentRect.width || 800);\n        }\n      });\n      ro.observe(el);\n      onCleanup(() => ro.disconnect());\n    });\n\n    effect(() => {\n      const initExp = new Set<string>();\n      const traverse = (n: OrgNode) => {\n        if (n.expanded !== false) initExp.add(n.id);\n        n.children?.forEach(traverse);\n      };\n      traverse(this.rootNode());\n      this.expandedState.set(initExp);\n    }, { allowSignalWrites: true });\n  }\n\n  getColor(depth: number): string {\n    const c = this.colors();\n    return c[depth % c.length];\n  }\n\n  getHandleTransform(): string {\n    if (this.orientation() === 'vertical') {\n      return `translate(0, ${this.nodeHeight() / 2})`;\n    } else {\n      return `translate(${this.nodeWidth() / 2}, 0)`;\n    }\n  }\n\n  layout = computed(() => {\n    const root = this.rootNode();\n    const isVert = this.orientation() === 'vertical';\n    const dx = isVert ? this.nodeWidth() + 40 : this.nodeWidth() + 80;\n    const dy = isVert ? this.nodeHeight() + 80 : this.nodeHeight() + 40;\n    \n    const nodes: RenderNode[] = [];\n    const links: RenderLink[] = [];\n    \n    const expanded = this.expandedState();\n\n    let maxX = 0, maxY = 0, minX = 0, minY = 0;\n\n    const traverse = (node: OrgNode, depth: number, offset: number): RenderNode => {\n      const isExpanded = expanded.has(node.id);\n      const hasChildren = !!(node.children && node.children.length > 0);\n      \n      const renderNode: RenderNode = {\n        data: node, x: 0, y: 0, depth, hasChildren, expanded: isExpanded\n      };\n\n      if (hasChildren && isExpanded) {\n        const childrenNodes = node.children!.map((child, i) => {\n          const childOffset = offset + (i - (node.children!.length - 1) / 2) * dx;\n          return traverse(child, depth + 1, childOffset);\n        });\n\n        let sum = 0;\n        childrenNodes.forEach(c => sum += isVert ? c.x : c.y);\n        const center = sum / childrenNodes.length;\n\n        if (isVert) {\n          renderNode.x = center;\n          renderNode.y = depth * dy;\n        } else {\n          renderNode.x = depth * dx;\n          renderNode.y = center;\n        }\n\n        childrenNodes.forEach(child => {\n          links.push({\n            source: renderNode, target: child,\n            path: this.generatePath(renderNode, child, isVert)\n          });\n        });\n      } else {\n        if (isVert) {\n          renderNode.x = offset;\n          renderNode.y = depth * dy;\n        } else {\n          renderNode.x = depth * dx;\n          renderNode.y = offset;\n        }\n      }\n\n      nodes.push(renderNode);\n      if (renderNode.x > maxX) maxX = renderNode.x;\n      if (renderNode.y > maxY) maxY = renderNode.y;\n      if (renderNode.x < minX) minX = renderNode.x;\n      if (renderNode.y < minY) minY = renderNode.y;\n\n      return renderNode;\n    };\n\n    traverse(root, 0, 0);\n    return { nodes, links, bounds: { minX, maxX, minY, maxY } };\n  });\n\n  nodes = computed(() => this.layout().nodes);\n  links = computed(() => this.layout().links);\n  \n  svgWidth = computed(() => {\n    const w = this.layout().bounds.maxX - this.layout().bounds.minX + this.nodeWidth() + 100;\n    return Math.max(w, this.containerWidth());\n  });\n\n  svgHeight = computed(() => {\n    const h = this.layout().bounds.maxY - this.layout().bounds.minY + this.nodeHeight() + 100;\n    return Math.max(h, this.height());\n  });\n\n  translateX = computed(() => -this.layout().bounds.minX + this.nodeWidth() / 2 + 50);\n  translateY = computed(() => -this.layout().bounds.minY + this.nodeHeight() / 2 + 50);\n\n  generatePath(source: RenderNode, target: RenderNode, isVertical: boolean): string {\n    if (isVertical) {\n      const sy = source.y + this.nodeHeight() / 2;\n      const ty = target.y - this.nodeHeight() / 2;\n      const midY = (sy + ty) / 2;\n      return `M ${source.x} ${sy} L ${source.x} ${midY} L ${target.x} ${midY} L ${target.x} ${ty}`;\n    } else {\n      const sx = source.x + this.nodeWidth() / 2;\n      const tx = target.x - this.nodeWidth() / 2;\n      const midX = (sx + tx) / 2;\n      return `M ${sx} ${source.y} L ${midX} ${source.y} L ${midX} ${target.y} L ${tx} ${target.y}`;\n    }\n  }\n\n  toggleNode(node: RenderNode, event: MouseEvent) {\n    event.stopPropagation();\n    const state = new Set(this.expandedState());\n    if (state.has(node.data.id)) {\n      state.delete(node.data.id);\n    } else {\n      state.add(node.data.id);\n    }\n    this.expandedState.set(state);\n    this.nodeToggle.emit(node.data);\n  }\n}\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  input,\n  computed,\n  signal,\n  inject,\n  DestroyRef,\n  ElementRef,\n  viewChild,\n  effect,\n  output\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COLORS, generateUniqueId } from '../shared/chart-utils';\nimport { ChartExportService } from '../shared/chart-export.service';\nimport { ChartExportMenuComponent, ExportFormat } from '../shared/chart-export-menu.component';\n\nexport interface GaugeNeedle {\n  label: string;\n  value: number;\n  color: string;\n  type?: 'needle' | 'pointer' | 'target-line';\n}\n\nexport interface GaugeThreshold {\n  value: number;\n  color: string;\n}\n\n@Component({\n  selector: 'ngx-multi-needle-gauge',\n  standalone: true,\n  imports: [CommonModule, ChartExportMenuComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-chart-container\" #container>\n      <div class=\"ngx-chart-header\">\n        <div class=\"ngx-chart-legend\" *ngIf=\"showLegend()\">\n          <div class=\"legend-item\" *ngFor=\"let n of needles()\" (click)=\"needleClick.emit(n)\">\n            <span class=\"legend-color\" [style.background-color]=\"n.color\"></span>\n            <span class=\"legend-label\">{{ n.label }}: {{ n.value }}{{ units() }}</span>\n          </div>\n        </div>\n        <ngx-chart-export-menu *ngIf=\"showExport()\" (exportClicked)=\"onExport($event)\" />\n      </div>\n\n      <svg class=\"ngx-chart-svg\" [attr.width]=\"width()\" [attr.height]=\"height()\" [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\">\n        <g [attr.transform]=\"'translate(' + centerX() + ',' + centerY() + ')'\">\n          \n          <!-- Background track -->\n          <path [attr.d]=\"bgPath()\" \n                fill=\"none\" \n                stroke=\"var(--ngx-chart-grid, #e2e8f0)\" \n                [attr.stroke-width]=\"trackWidth\" \n                stroke-linecap=\"round\" />\n          \n          <!-- Threshold bands -->\n          <path *ngFor=\"let band of bands()\"\n                [attr.d]=\"band.path\"\n                fill=\"none\"\n                [attr.stroke]=\"band.color\"\n                [attr.stroke-width]=\"trackWidth\"\n                stroke-linecap=\"butt\" />\n\n          <!-- Ticks -->\n          <g *ngFor=\"let tick of ticks()\">\n            <line [attr.x1]=\"tick.x1\" [attr.y1]=\"tick.y1\" [attr.x2]=\"tick.x2\" [attr.y2]=\"tick.y2\" stroke=\"var(--ngx-chart-axis, #94a3b8)\" stroke-width=\"2\" />\n            <text [attr.x]=\"tick.tx\" [attr.y]=\"tick.ty\" class=\"ngx-chart-axis-text\" text-anchor=\"middle\" dominant-baseline=\"middle\">{{ tick.label }}</text>\n          </g>\n          \n          <!-- Needles -->\n          <g *ngFor=\"let n of processedNeedles(); let i = index\">\n            \n            <ng-container *ngIf=\"n.type === 'needle'\">\n              <polygon [attr.points]=\"n.points\" [attr.fill]=\"n.color\" class=\"needle-path\" />\n              <circle cx=\"0\" cy=\"0\" [attr.r]=\"pivotRadius\" [attr.fill]=\"n.color\" />\n            </ng-container>\n\n            <ng-container *ngIf=\"n.type === 'pointer'\">\n              <path [attr.d]=\"n.points\" [attr.fill]=\"n.color\" class=\"needle-path\" />\n            </ng-container>\n\n            <ng-container *ngIf=\"n.type === 'target-line'\">\n              <line [attr.x1]=\"n.tx1\" [attr.y1]=\"n.ty1\" [attr.x2]=\"n.tx2\" [attr.y2]=\"n.ty2\" [attr.stroke]=\"n.color\" stroke-width=\"4\" />\n            </ng-container>\n            \n          </g>\n\n          <!-- Center Value -->\n          <circle cx=\"0\" cy=\"0\" [attr.r]=\"pivotRadius * 2.5\" fill=\"var(--ngx-chart-bg, #fff)\" stroke=\"var(--ngx-chart-grid, #e2e8f0)\" stroke-width=\"2\" />\n          <text x=\"0\" y=\"5\" text-anchor=\"middle\" class=\"main-value\" font-weight=\"bold\">\n            {{ mainValue() }}\n          </text>\n          <text x=\"0\" y=\"20\" text-anchor=\"middle\" class=\"ngx-chart-axis-text\" font-size=\"10\">\n            {{ units() }}\n          </text>\n\n        </g>\n      </svg>\n    </div>\n  `,\n  styles: [`\n    .ngx-chart-container {\n      position: relative;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      font-family: sans-serif;\n    }\n    .ngx-chart-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 8px 16px;\n    }\n    .ngx-chart-legend {\n      display: flex;\n      gap: 16px;\n      flex-wrap: wrap;\n    }\n    .legend-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      cursor: pointer;\n      color: var(--ngx-chart-axis-text, #666);\n    }\n    .legend-color {\n      width: 12px;\n      height: 12px;\n      border-radius: 50%;\n    }\n    .ngx-chart-svg {\n      width: 100%;\n      height: 100%;\n    }\n    .ngx-chart-axis-text {\n      fill: var(--ngx-chart-axis-text, #64748b);\n      font-size: 12px;\n    }\n    .main-value {\n      fill: var(--ngx-chart-axis-text, #1e293b);\n      font-size: 20px;\n    }\n    .needle-path {\n      transition: all 1s cubic-bezier(0.16, 1, 0.3, 1);\n    }\n  `]\n})\nexport class MultiNeedleGaugeComponent {\n  needles = input<GaugeNeedle[]>([]);\n  min = input<number>(0);\n  max = input<number>(100);\n  thresholds = input<GaugeThreshold[]>([]);\n  height = input<number>(260);\n  dialAngle = input<number>(240);\n  units = input<string>('');\n  showLegend = input<boolean>(true);\n  showExport = input<boolean>(true);\n\n  private exportSvc = inject(ChartExportService);\n  needleClick = output<GaugeNeedle>();\n\n  container = viewChild<ElementRef>('container');\n\n  onExport(type: ExportFormat): void {\n    const el = this.container()?.nativeElement;\n    if (type === 'svg') this.exportSvc.downloadSvg(el, 'multi-needle-gauge.svg');\n    else if (type === 'pdf') this.exportSvc.downloadPdf(el, 'Multi-Needle Gauge', 'multi-needle-gauge.pdf');\n  }\n  width = signal<number>(400);\n\n  chartId = generateUniqueId('gauge');\n\n  trackWidth = 20;\n  pivotRadius = 8;\n  \n  get containerEl() {\n    return this.container()?.nativeElement;\n  }\n\n  private destroyRef = inject(DestroyRef);\n\n  constructor() {\n    effect((onCleanup) => {\n      const el = this.container()?.nativeElement;\n      if (!el) return;\n      const ro = new ResizeObserver(entries => {\n        if (entries[0]) {\n          this.width.set(entries[0].contentRect.width || 400);\n        }\n      });\n      ro.observe(el);\n      onCleanup(() => ro.disconnect());\n    });\n  }\n\n  centerX = computed(() => this.width() / 2);\n  centerY = computed(() => this.height() / 2 + 20);\n  radius = computed(() => Math.min(this.width() / 2, this.height() / 2) - 40);\n\n  startAngle = computed(() => -this.dialAngle() / 2);\n  endAngle = computed(() => this.dialAngle() / 2);\n\n  polarToCartesian(cx: number, cy: number, r: number, angleDeg: number) {\n    const angleRad = (angleDeg - 90) * Math.PI / 180.0;\n    return {\n      x: cx + (r * Math.cos(angleRad)),\n      y: cy + (r * Math.sin(angleRad))\n    };\n  }\n\n  describeArc(x: number, y: number, r: number, startA: number, endA: number) {\n    const start = this.polarToCartesian(x, y, r, endA);\n    const end = this.polarToCartesian(x, y, r, startA);\n    const largeArcFlag = endA - startA <= 180 ? \"0\" : \"1\";\n    return [\n      \"M\", start.x, start.y, \n      \"A\", r, r, 0, largeArcFlag, 0, end.x, end.y\n    ].join(\" \");\n  }\n\n  valToAngle = (val: number) => {\n    const mn = this.min();\n    const mx = this.max();\n    const clamped = Math.max(mn, Math.min(mx, val));\n    const ratio = (clamped - mn) / (mx - mn);\n    return this.startAngle() + ratio * this.dialAngle();\n  };\n\n  bgPath = computed(() => this.describeArc(0, 0, this.radius(), this.startAngle(), this.endAngle()));\n\n  bands = computed(() => {\n    const t = this.thresholds();\n    if (!t || t.length === 0) return [];\n    \n    const sorted = [...t].sort((a,b) => a.value - b.value);\n    const bnds = [];\n    let curVal = this.min();\n    \n    for (const th of sorted) {\n      if (th.value > curVal) {\n        bnds.push({\n          path: this.describeArc(0, 0, this.radius(), this.valToAngle(curVal), this.valToAngle(th.value)),\n          color: th.color\n        });\n        curVal = th.value;\n      }\n    }\n    if (curVal < this.max()) {\n      const lastCol = sorted[sorted.length-1]?.color || '#ccc';\n      bnds.push({\n        path: this.describeArc(0, 0, this.radius(), this.valToAngle(curVal), this.valToAngle(this.max())),\n        color: lastCol\n      });\n    }\n    return bnds;\n  });\n\n  ticks = computed(() => {\n    const mn = this.min();\n    const mx = this.max();\n    const range = mx - mn;\n    const steps = 10;\n    const tks = [];\n    for (let i=0; i<=steps; i++) {\n      const v = mn + (range * i) / steps;\n      const angle = this.valToAngle(v);\n      const inner = this.polarToCartesian(0, 0, this.radius() - this.trackWidth/2 - 5, angle);\n      const outer = this.polarToCartesian(0, 0, this.radius() + this.trackWidth/2 + 5, angle);\n      const textPos = this.polarToCartesian(0, 0, this.radius() + this.trackWidth/2 + 20, angle);\n      \n      tks.push({\n        x1: inner.x, y1: inner.y,\n        x2: outer.x, y2: outer.y,\n        tx: textPos.x, ty: textPos.y,\n        label: Math.round(v)\n      });\n    }\n    return tks;\n  });\n\n  processedNeedles = computed(() => {\n    return this.needles().map((n, idx) => {\n      const angle = this.valToAngle(n.value);\n      const type = n.type || 'needle';\n      \n      let points = '';\n      let tx1 = 0, ty1 = 0, tx2 = 0, ty2 = 0;\n      \n      if (type === 'needle') {\n        const r = this.radius() - this.trackWidth/2;\n        const tip = this.polarToCartesian(0, 0, r, angle);\n        const left = this.polarToCartesian(0, 0, this.pivotRadius, angle - 90);\n        const right = this.polarToCartesian(0, 0, this.pivotRadius, angle + 90);\n        points = `${tip.x},${tip.y} ${right.x},${right.y} ${left.x},${left.y}`;\n      } else if (type === 'pointer') {\n        const r = this.radius() + this.trackWidth/2 + 10;\n        const tip = this.polarToCartesian(0, 0, r, angle);\n        const left = this.polarToCartesian(0, 0, r + 10, angle - 5);\n        const right = this.polarToCartesian(0, 0, r + 10, angle + 5);\n        points = `${tip.x},${tip.y} ${right.x},${right.y} ${left.x},${left.y}`;\n      } else if (type === 'target-line') {\n        const inner = this.polarToCartesian(0, 0, this.radius() - this.trackWidth/2, angle);\n        const outer = this.polarToCartesian(0, 0, this.radius() + this.trackWidth/2, angle);\n        tx1 = inner.x; ty1 = inner.y;\n        tx2 = outer.x; ty2 = outer.y;\n      }\n      \n      return { ...n, type, points, tx1, ty1, tx2, ty2 };\n    });\n  });\n\n  mainValue = computed(() => {\n    const ns = this.needles();\n    if (ns.length > 0) return ns[0].value;\n    return 0;\n  });\n}\n","/*\n * Public API Surface — secondary entry point: ngx-core-components/charts\n */\n\n// Bar / Line / Pie / Sparkline charts\nexport { BarChartComponent } from './bar-chart/bar-chart.component';\nexport { LineChartComponent } from './line-chart/line-chart.component';\nexport { PieChartComponent } from './pie-chart/pie-chart.component';\nexport { SparklineComponent } from './sparkline/sparkline.component';\nexport type { ChartSeries, ChartDataPoint } from './shared/chart-utils';\nexport { CHART_COLORS } from './shared/chart-utils';\n\n// Gantt Chart\nexport { GanttChartComponent } from './gantt-chart/gantt-chart.component';\nexport * from './gantt-chart/models';\nexport { GanttScaleService } from './gantt-chart/services/gantt-scale.service';\nexport { GanttPrintService } from './gantt-chart/services/gantt-print.service';\nexport type { FlatRow } from './gantt-chart/services/gantt-layout.service';\nexport * from './gantt-chart/utils/date-utils';\n\n// Gauge & Radar charts\nexport { GaugeChartComponent } from './gauge-chart/gauge-chart.component';\nexport type { GaugeThreshold } from './gauge-chart/gauge-chart.component';\nexport { RadarChartComponent } from './radar-chart/radar-chart.component';\nexport type { RadarSeries } from './radar-chart/radar-chart.component';\n\n// Heatmap & Treemap charts\nexport { HeatmapChartComponent } from './heatmap-chart/heatmap-chart.component';\nexport { TreemapChartComponent } from './treemap-chart/treemap-chart.component';\nexport type { TreemapItem } from './treemap-chart/treemap-chart.component';\n\n// Area & Funnel charts\nexport { AreaChartComponent } from './area-chart/area-chart.component';\nexport { FunnelChartComponent } from './funnel-chart/funnel-chart.component';\nexport type { FunnelItem } from './funnel-chart/funnel-chart.component';\n\n// Combo & Scatter charts\nexport { ComboChartComponent } from './combo-chart/combo-chart.component';\nexport { ScatterPlotComponent } from './scatter-plot/scatter-plot.component';\nexport type { ScatterPoint } from './scatter-plot/scatter-plot.component';\n\n// Bubble & Sunburst charts\nexport { BubbleChartComponent } from './bubble-chart/bubble-chart.component';\nexport type { BubblePoint } from './bubble-chart/bubble-chart.component';\nexport { SunburstChartComponent } from './sunburst-chart/sunburst-chart.component';\nexport type { SunburstNode } from './sunburst-chart/sunburst-chart.component';\n\n// Waterfall, Box Plot, Radial Bar, and Candlestick charts\nexport { WaterfallChartComponent } from './waterfall-chart/waterfall-chart.component';\nexport type { WaterfallItem } from './waterfall-chart/waterfall-chart.component';\nexport { BoxPlotChartComponent } from './box-plot-chart/box-plot-chart.component';\nexport type { BoxPlotItem } from './box-plot-chart/box-plot-chart.component';\nexport { RadialBarChartComponent } from './radial-bar-chart/radial-bar-chart.component';\nexport type { RadialBarItem } from './radial-bar-chart/radial-bar-chart.component';\nexport { CandlestickChartComponent } from './candlestick-chart/candlestick-chart.component';\nexport type { CandlestickItem } from './candlestick-chart/candlestick-chart.component';\n\n// Polar Area & Bullet charts\nexport { PolarAreaChartComponent } from './polar-area-chart/polar-area-chart.component';\nexport { BulletChartComponent } from './bullet-chart/bullet-chart.component';\n\n// Dumbbell Chart\nexport { DumbbellChartComponent } from './dumbbell-chart/dumbbell-chart.component';\nexport type { DumbbellItem } from './dumbbell-chart/dumbbell-chart.component';\n\n// Lollipop Chart\nexport { LollipopChartComponent } from './lollipop-chart/lollipop-chart.component';\n\n// Slope Chart\nexport { SlopeChartComponent } from './slope-chart/slope-chart.component';\nexport type { SlopeDataPoint } from './slope-chart/slope-chart.component';\n\n// Sankey Chart\nexport { SankeyChartComponent } from './sankey-chart/sankey-chart.component';\nexport type { SankeyNode, SankeyLink } from './sankey-chart/sankey-chart.component';\n\n// Violin Plot\nexport { ViolinPlotComponent } from './violin-plot/violin-plot.component';\nexport type { ViolinItem } from './violin-plot/violin-plot.component';\n\n// Ridgeline Chart\nexport { RidgelineChartComponent } from './ridgeline-chart/ridgeline-chart.component';\nexport type { RidgelineItem } from './ridgeline-chart/ridgeline-chart.component';\n\n// Pareto Chart\nexport { ParetoChartComponent } from './pareto-chart/pareto-chart.component';\nexport type { ParetoItem } from './pareto-chart/pareto-chart.component';\n\n// Marimekko Chart\nexport { MarimekkoChartComponent } from './marimekko-chart/marimekko-chart.component';\nexport type { MarimekkoItem, MarimekkoSegment } from './marimekko-chart/marimekko-chart.component';\n\n// Chord Diagram\nexport { ChordDiagramComponent } from './chord-diagram/chord-diagram.component';\nexport type { ChordItem } from './chord-diagram/chord-diagram.component';\n\n// Dependency Wheel\nexport { DependencyWheelComponent } from './dependency-wheel/dependency-wheel.component';\nexport type { DependencyItem } from './dependency-wheel/dependency-wheel.component';\n\n// Adjacency Matrix\nexport { AdjacencyMatrixComponent } from './adjacency-matrix/adjacency-matrix.component';\nexport type { MatrixItem } from './adjacency-matrix/adjacency-matrix.component';\n\n// Biplot / PCA Plot\nexport { BiplotComponent } from './biplot/biplot.component';\nexport type { BiplotPoint, BiplotVector } from './biplot/biplot.component';\n\n// Renko Chart\nexport { RenkoChartComponent } from './renko-chart/renko-chart.component';\nexport type { RenkoBrick } from './renko-chart/renko-chart.component';\n\n// Kagi Chart\nexport { KagiChartComponent } from './kagi-chart/kagi-chart.component';\nexport type { KagiSegment } from './kagi-chart/kagi-chart.component';\n\n// Point & Figure Chart\nexport { PointFigureChartComponent } from './point-figure-chart/point-figure-chart.component';\nexport type { PFCell } from './point-figure-chart/point-figure-chart.component';\n\n// Wind Rose Chart\nexport { WindRoseChartComponent } from './wind-rose/wind-rose.component';\nexport type { WindRoseItem, WindRoseSpeedBin } from './wind-rose/wind-rose.component';\n\n// Batch 1: Line, Area, Spline & Bar Ranges\nexport { AreaRangeChartComponent } from './area-range-chart/area-range-chart.component';\nexport type { AreaRangeSeries, AreaRangeDataPoint } from './area-range-chart/area-range-chart.component';\nexport { AreaSplineRangeChartComponent } from './area-spline-range-chart/area-spline-range-chart.component';\nexport { StreamgraphComponent } from './streamgraph/streamgraph.component';\nexport type { StreamgraphSeries } from './streamgraph/streamgraph.component';\nexport { ColumnRangeChartComponent } from './column-range-chart/column-range-chart.component';\nexport type { ColumnRangeSeries, ColumnRangePoint } from './column-range-chart/column-range-chart.component';\nexport { ColumnPyramidChartComponent } from './column-pyramid-chart/column-pyramid-chart.component';\nexport type { ColumnPyramidSeries } from './column-pyramid-chart/column-pyramid-chart.component';\nexport { VariwideChartComponent } from './variwide-chart/variwide-chart.component';\nexport type { VariwidePoint } from './variwide-chart/variwide-chart.component';\n\n// Batch 2: Pie, Bubbles & Network Diagrams\nexport { VariablePieChartComponent } from './variable-pie-chart/variable-pie-chart.component';\nexport type { VariablePieDataPoint } from './variable-pie-chart/variable-pie-chart.component';\nexport { PackedBubbleChartComponent } from './packed-bubble-chart/packed-bubble-chart.component';\nexport type { BubbleNode } from './packed-bubble-chart/packed-bubble-chart.component';\nexport { NetworkGraphComponent } from './network-graph/network-graph.component';\nexport type { NetworkNode, NetworkLink } from './network-graph/network-graph.component';\nexport { TreeGraphComponent } from './treegraph/treegraph.component';\nexport type { TreeGraphNode } from './treegraph/treegraph.component';\nexport { ArcDiagramComponent } from './arc-diagram/arc-diagram.component';\nexport type { ArcNode, ArcLink } from './arc-diagram/arc-diagram.component';\n\n// Batch 3: Statistical & Advanced Visualizations\nexport { HistogramComponent } from './histogram/histogram.component';\nexport type { HistogramBin } from './histogram/histogram.component';\nexport { BellCurveChartComponent } from './bell-curve-chart/bell-curve-chart.component';\nexport type { CurvePoint } from './bell-curve-chart/bell-curve-chart.component';\nexport { ErrorBarComponent } from './error-bar/error-bar.component';\nexport type { ErrorBarPoint } from './error-bar/error-bar.component';\nexport { TilemapComponent } from './tilemap/tilemap.component';\nexport type { TileItem } from './tilemap/tilemap.component';\nexport { VennDiagramComponent } from './venn-diagram/venn-diagram.component';\nexport type { VennRegion } from './venn-diagram/venn-diagram.component';\nexport { ParallelCoordinatesComponent } from './parallel-coordinates/parallel-coordinates.component';\nexport type { ParallelLine, AxisDimension } from './parallel-coordinates/parallel-coordinates.component';\nexport { WordCloudComponent } from './word-cloud/word-cloud.component';\nexport type { WordItem } from './word-cloud/word-cloud.component';\nexport { PictorialChartComponent } from './pictorial-chart/pictorial-chart.component';\nexport type { PictorialIcon } from './pictorial-chart/pictorial-chart.component';\nexport { VectorPlotComponent } from './vector-plot/vector-plot.component';\nexport type { VectorItem } from './vector-plot/vector-plot.component';\n\n// Batch 4: Financial Indicators & Stock Options\nexport { OHLCChartComponent } from './ohlc-chart/ohlc-chart.component';\nexport type { OHLCItem } from './ohlc-chart/ohlc-chart.component';\nexport { HLCChartComponent } from './hlc-chart/hlc-chart.component';\nexport type { HLCItem } from './hlc-chart/hlc-chart.component';\nexport { HollowCandlestickChartComponent } from './hollow-candlestick-chart/hollow-candlestick-chart.component';\nexport { HeikinAshiChartComponent } from './heikin-ashi-chart/heikin-ashi-chart.component';\nexport { FlagsComponent } from './flags/flags.component';\nexport type { ChartFlag } from './flags/flags.component';\n\n// Batch 5: Geographical Maps\nexport { MapChoroplethComponent } from './map-choropleth/map-choropleth.component';\nexport type { ChoroplethDataPoint } from './map-choropleth/map-choropleth.component';\nexport { MapBubbleComponent } from './map-bubble/map-bubble.component';\nexport type { MapBubblePoint } from './map-bubble/map-bubble.component';\nexport { MapLinePointComponent } from './map-line-point/map-line-point.component';\nexport type { MapPoint, MapLine } from './map-line-point/map-line-point.component';\nexport { FlowmapComponent } from './flowmap/flowmap.component';\nexport type { FlowNode, FlowConnection } from './flowmap/flowmap.component';\nexport { GeoHeatmapComponent } from './geo-heatmap/geo-heatmap.component';\nexport type { GeoHeatmapPoint } from './geo-heatmap/geo-heatmap.component';\nexport { TiledWebMapComponent } from './tiled-web-map/tiled-web-map.component';\nexport type { MapMarker } from './tiled-web-map/tiled-web-map.component';\n\n// AI-Native Chart Types\nexport { TokenStreamingChartComponent } from './token-streaming-chart/token-streaming-chart.component';\nexport { EmbeddingSpaceProjectionComponent } from './embedding-space-projection/embedding-space-projection.component';\nexport type { EmbeddingPoint } from './embedding-space-projection/embedding-space-projection.component';\nexport { AgenticCognitiveTopologyComponent } from './agentic-cognitive-topology/agentic-cognitive-topology.component';\nexport type { TopologyNode, TopologyLink } from './agentic-cognitive-topology/agentic-cognitive-topology.component';\nexport { TransformerAttentionHeatmapComponent } from './transformer-attention-heatmap/transformer-attention-heatmap.component';\n\n// Shared Chart Infrastructure\nexport { ChartThemeService } from './shared/chart-theme.service';\nexport type { ChartTheme, ChartThemeName, ColorblindMode } from './shared/chart-theme.service';\nexport type { ChartAnnotation, AnnotationType } from './shared/chart-annotations';\nexport { renderAnnotationSvg } from './shared/chart-annotations';\nexport { ChartSkeletonComponent } from './shared/chart-skeleton.component';\nexport { ChartSyncGroupDirective } from './shared/chart-sync-group.directive';\nexport { ChartBrushZoomComponent } from './shared/chart-brush-zoom.component';\nexport { ChartTooltipService } from './shared/chart-tooltip.service';\nexport type { TooltipState, TooltipRow } from './shared/chart-tooltip.service';\n\n// New Chart Types — Step Line, Calendar Heatmap, Nested Donut, Pyramid, Range Bar\nexport { StepLineChartComponent } from './step-line-chart/step-line-chart.component';\nexport { CalendarHeatmapComponent } from './calendar-heatmap/calendar-heatmap.component';\nexport type { CalendarHeatmapData } from './calendar-heatmap/calendar-heatmap.component';\nexport { NestedDonutChartComponent } from './nested-donut-chart/nested-donut-chart.component';\nexport type { DonutRing } from './nested-donut-chart/nested-donut-chart.component';\nexport { PyramidChartComponent } from './pyramid-chart/pyramid-chart.component';\nexport type { PyramidItem } from './pyramid-chart/pyramid-chart.component';\nexport { RangeBarChartComponent } from './range-bar-chart/range-bar-chart.component';\nexport type { RangeBarItem } from './range-bar-chart/range-bar-chart.component';\n\n// Timeline / Activity Chart\nexport { TimelineChartComponent } from './timeline-chart/timeline-chart.component';\nexport type { TimelineEvent } from './timeline-chart/timeline-chart.component';\n\n// Org Chart\nexport { OrgChartComponent } from './org-chart/org-chart.component';\nexport type { OrgNode } from './org-chart/org-chart.component';\n\n// Multi-Needle Gauge\nexport { MultiNeedleGaugeComponent } from './multi-needle-gauge/multi-needle-gauge.component';\nexport type { GaugeNeedle as MultiGaugeNeedle } from './multi-needle-gauge/multi-needle-gauge.component';\n\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}