{"version":3,"file":"acorex-charts-funnel-chart.mjs","sources":["../../../../packages/charts/funnel-chart/src/lib/funnel-chart.config.ts","../../../../packages/charts/funnel-chart/src/lib/funnel-chart.component.ts","../../../../packages/charts/funnel-chart/src/lib/funnel-chart.component.html","../../../../packages/charts/funnel-chart/src/acorex-charts-funnel-chart.ts"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXFunnelChartOption } from './funnel-chart.type';\n\nexport const AXFunnelChartDefaultConfig: AXFunnelChartOption = {\n  margin: { top: 16, right: 16, bottom: 16, left: 16 },\n  neckWidth: 0.3,\n  showLabels: true,\n  showSegmentValues: true,\n  labelOffset: 24,\n  showTooltip: true,\n  animationDuration: 1000,\n  animationEasing: 'cubic-out',\n  color: 'rgb(var(--ax-sys-color-primary-500))',\n  messages: {\n    ...AX_CHART_DEFAULT_MESSAGES,\n    noDataIcon: 'fa-light fa-filter-list',\n  },\n};\n\nexport const AX_FUNNEL_CHART_CONFIG = new InjectionToken<AXFunnelChartOption>('AX_FUNNEL_CHART_CONFIG', {\n  providedIn: 'root',\n  factory: () => AXFunnelChartDefaultConfig,\n});\n","import {\n  AXChartComponent,\n  AXChartComponentBase,\n  computeTooltipPosition,\n  getEasingFunction,\n  mergeChartMessages,\n  mergeChartOptions,\n  resolveCssColorInContext,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\nimport {\n  afterNextRender,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { AX_FUNNEL_CHART_CONFIG } from './funnel-chart.config';\nimport { AXFunnelChartOption, AXFunnelData } from './funnel-chart.type';\n\n@Component({\n  selector: 'ax-funnel-chart',\n  templateUrl: './funnel-chart.component.html',\n  styleUrls: ['./funnel-chart.component.css'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXChartTooltipComponent],\n})\nexport class AXFunnelChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n  private static readonly VIEW_BOX_SIZE = 400;\n\n  // Inputs\n  data = input<AXFunnelData[]>([]);\n  options = input<AXFunnelChartOption>({});\n\n  // Outputs\n  /** Emitted when a funnel segment is clicked */\n  segmentClick = output<AXFunnelData>();\n\n  private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n  // SVG State\n  private svgElement: SVGSVGElement | null = null;\n  protected d3!: typeof import('d3');\n  private _initialized = signal(false);\n  private _rendered = signal(false);\n\n  // Tooltip Signals\n  private _tooltipVisible = signal(false);\n  private _tooltipPosition = signal({ x: 0, y: 0 });\n  private _tooltipData = signal<AXChartTooltipData>({ title: '', value: '' });\n  private _tooltipRafId: number | null = null;\n  private _pendingTooltipCoords: { x: number; y: number } | null = null;\n  private readonly TOOLTIP_GAP = 10;\n\n  protected tooltipVisible = this._tooltipVisible.asReadonly();\n  protected tooltipPosition = this._tooltipPosition.asReadonly();\n  protected tooltipData = this._tooltipData.asReadonly();\n\n  private configToken = inject(AX_FUNNEL_CHART_CONFIG);\n\n  protected effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()));\n\n  protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\n\n  constructor() {\n    super();\n\n    afterNextRender(() => {\n      this._initialized.set(true);\n      this.loadD3();\n    });\n\n    effect(() => {\n      // Trigger update on data or option change\n      this.data();\n      this.effectiveOptions();\n      if (this._rendered()) {\n        this.updateChart();\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.cancelTooltipPosition();\n    this.cleanupChart();\n  }\n\n  protected async loadD3(): Promise<void> {\n    if (this.d3) return;\n    try {\n      this.d3 = await import('d3');\n      if (this._initialized() && this.chartContainerEl()) {\n        this.createChart();\n        this._rendered.set(true);\n      }\n    } catch (error) {\n      console.error('AXFunnelChart: Failed to load D3.js', error);\n    }\n  }\n\n  public createChart(): void {\n    if (!this.d3) return;\n\n    const container = this.chartContainerEl().nativeElement;\n    if (this.svgElement) {\n      this.svgElement.remove();\n      this.svgElement = null;\n    }\n    this.d3.select(container).selectAll('.ax-chart-empty').remove();\n\n    const data = [...this.data()].sort((a, b) => b.value - a.value);\n    if (!data.length) {\n      this.hideTooltip();\n      return;\n    }\n\n    const vb = AXFunnelChartComponent.VIEW_BOX_SIZE;\n    const width = vb;\n    const height = vb;\n\n    const opt = this.effectiveOptions();\n    const margin = opt.margin;\n    const easing = getEasingFunction(this.d3, opt.animationEasing);\n    const resolvedBaseForIntensity = this.resolveCssColor(opt.color ?? 'rgb(99, 102, 241)');\n\n    this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    const svg = this.d3\n      .select(this.svgElement)\n      .attr('width', '100%')\n      .attr('height', '100%')\n      .attr('viewBox', `0 0 ${width} ${height}`)\n      .attr('preserveAspectRatio', 'xMidYMid meet')\n      .attr('class', 'ax-funnel-svg');\n\n    container.appendChild(this.svgElement);\n\n    const innerWidth = width - margin.left - margin.right;\n    const innerHeight = height - margin.top - margin.bottom;\n    if (innerWidth < 1 || innerHeight < 1) {\n      return;\n    }\n\n    const g = svg.append('g').attr('transform', `translate(${margin.left},${margin.top})`);\n\n    const sliceHeight = innerHeight / data.length;\n    const maxValue = Math.max(...data.map((item) => item.value), 0);\n    const minValue = data[data.length - 1]?.value ?? maxValue;\n    const showSegmentValues = opt.showSegmentValues !== false;\n\n    data.forEach((d, i) => {\n      const topVal = d.value;\n      const bottomVal = data[i + 1]?.value ?? d.value * opt.neckWidth;\n\n      const topW = (topVal / maxValue) * innerWidth;\n      const bottomW = (bottomVal / maxValue) * innerWidth;\n\n      const xTop = (innerWidth - topW) / 2;\n      const xBottom = (innerWidth - bottomW) / 2;\n      const yTop = i * sliceHeight;\n      const yBottom = (i + 1) * sliceHeight;\n\n      const pathData = `M ${xTop},${yTop} L ${xTop + topW},${yTop} L ${xBottom + bottomW},${yBottom} L ${xBottom},${yBottom} Z`;\n\n      const sliceGroup = g.append('g').attr('class', 'funnel-slice-container');\n\n      const computedColor = this.resolveSliceColor(d, i, opt, minValue, maxValue, resolvedBaseForIntensity);\n\n      const path = sliceGroup\n        .append('path')\n        .attr('class', 'funnel-slice')\n        .attr('d', pathData)\n        .attr('fill', computedColor)\n        .style('opacity', 0)\n        .on('mouseenter', (event) => {\n          svg.classed('is-dimmed', true);\n          this.d3.select(event.currentTarget).classed('is-active', true);\n          this.showTooltip(event, d, computedColor);\n        })\n        .on('mousemove', (event) => this.updateTooltipPosition(event))\n        .on('click', () => this.segmentClick.emit(d))\n        .on('mouseleave', (event) => {\n          svg.classed('is-dimmed', false);\n          this.d3.select(event.currentTarget).classed('is-active', false);\n          this.hideTooltip();\n        });\n\n      path\n        .transition()\n        .duration(opt.animationDuration)\n        .delay(i * 80)\n        .ease(easing)\n        .style('opacity', 1);\n\n      sliceGroup.append('title').text(`${d.name}: ${d.value.toLocaleString()}`);\n\n      if (opt.showLabels) {\n        const { cx, cy, width: midW } = this.trapezoidInteriorMetrics(xTop, topW, xBottom, bottomW, yTop, yBottom);\n        const { nameSize, valueSize, showValueLine, displayName } = this.computeSegmentLabelTypography(\n          sliceHeight,\n          midW,\n          d.name,\n          showSegmentValues,\n        );\n        const { primary, secondary } = this.pickOnSliceTextColors(computedColor);\n\n        const labelGroup = sliceGroup.append('g').attr('class', 'funnel-label-group').style('opacity', 0);\n\n        const lineGap = Math.max(2, sliceHeight * 0.06);\n        if (showValueLine && valueSize > 0) {\n          labelGroup\n            .append('text')\n            .attr('class', 'funnel-label-name')\n            .attr('x', cx)\n            .attr('y', cy - (valueSize * 0.55 + lineGap * 0.5))\n            .attr('text-anchor', 'middle')\n            .attr('dominant-baseline', 'middle')\n            .style('font-size', `${nameSize}`)\n            .style('fill', primary)\n            .text(displayName);\n\n          labelGroup\n            .append('text')\n            .attr('class', 'funnel-label-value')\n            .attr('x', cx)\n            .attr('y', cy + (nameSize * 0.55 + lineGap * 0.5))\n            .attr('text-anchor', 'middle')\n            .attr('dominant-baseline', 'middle')\n            .style('font-size', `${valueSize}`)\n            .style('fill', secondary)\n            .text(d.value.toLocaleString());\n        } else {\n          labelGroup\n            .append('text')\n            .attr('class', 'funnel-label-name funnel-label-name--single')\n            .attr('x', cx)\n            .attr('y', cy)\n            .attr('text-anchor', 'middle')\n            .attr('dominant-baseline', 'middle')\n            .style('font-size', `${nameSize}`)\n            .style('fill', primary)\n            .text(displayName);\n        }\n\n        labelGroup\n          .transition()\n          .duration(600)\n          .delay(400 + i * 80)\n          .style('opacity', 1);\n      }\n    });\n  }\n\n  private trapezoidInteriorMetrics(\n    xTop: number,\n    topW: number,\n    xBottom: number,\n    bottomW: number,\n    yTop: number,\n    yBottom: number,\n  ): { cx: number; cy: number; width: number } {\n    const cy = (yTop + yBottom) / 2;\n    const denom = yBottom - yTop || 1;\n    const t = (cy - yTop) / denom;\n    const xL = xTop + t * (xBottom - xTop);\n    const xR = xTop + topW + t * (xBottom + bottomW - (xTop + topW));\n    return { cx: (xL + xR) / 2, cy, width: Math.max(0, xR - xL) };\n  }\n\n  private computeSegmentLabelTypography(\n    sliceHeight: number,\n    segmentInnerWidth: number,\n    name: string,\n    wantValue: boolean,\n  ): {\n    nameSize: number;\n    valueSize: number;\n    showValueLine: boolean;\n    displayName: string;\n  } {\n    const charFactor = 0.52;\n    const minFont = 6.5;\n    const maxName = 15;\n\n    const innerW = Math.max(segmentInnerWidth, 8);\n\n    let showValueLine = wantValue && sliceHeight >= 17 && innerW >= 38;\n\n    const fitNameOnly = (): number => {\n      const raw = Math.min(maxName + 2, sliceHeight * 0.42, innerW / Math.max(name.length * charFactor, 2.5));\n      return Math.max(minFont, raw);\n    };\n\n    const fitBoth = (): { nameSize: number; valueSize: number } => {\n      const vBudget = sliceHeight * 0.76;\n      let nameSize = Math.min(maxName, vBudget / 2.45, innerW / Math.max(name.length * charFactor, 2.5));\n      nameSize = Math.max(minFont, nameSize);\n      let valueSize = Math.max(minFont, Math.min(nameSize * 0.88, vBudget / 2.45));\n      const stackH = nameSize * 1.18 + valueSize * 1.08 + sliceHeight * 0.05;\n      if (stackH > sliceHeight * 0.88) {\n        const scale = (sliceHeight * 0.88) / stackH;\n        nameSize = Math.max(minFont, nameSize * scale);\n        valueSize = Math.max(minFont, valueSize * scale);\n      }\n      return { nameSize, valueSize };\n    };\n\n    let nameSize: number;\n    let valueSize = 0;\n\n    if (showValueLine) {\n      const both = fitBoth();\n      nameSize = both.nameSize;\n      valueSize = both.valueSize;\n      if (nameSize * 1.2 + valueSize * 1.05 > sliceHeight * 0.9) {\n        showValueLine = false;\n      }\n    }\n\n    if (!showValueLine) {\n      nameSize = fitNameOnly();\n    }\n\n    const maxChars = Math.max(2, Math.floor(innerW / (nameSize * charFactor)));\n    const displayName = this.truncateLabel(name, maxChars);\n\n    return { nameSize, valueSize, showValueLine, displayName };\n  }\n\n  private truncateLabel(name: string, maxChars: number): string {\n    if (name.length <= maxChars) return name;\n    if (maxChars <= 1) return '…';\n    return `${name.slice(0, maxChars - 1)}…`;\n  }\n\n  private pickOnSliceTextColors(sliceColorCss: string): { primary: string; secondary: string } {\n    const resolved = this.resolveCssColor(sliceColorCss);\n    const c = this.d3.color(resolved);\n    if (!c) {\n      return { primary: 'rgba(255,255,255,0.95)', secondary: 'rgba(255,255,255,0.78)' };\n    }\n    const rgb = this.d3.rgb(c);\n    const a = Math.max(0, Math.min(1, rgb.opacity));\n    // Blend slice color over white (typical card/surface) so low-alpha intensity ramps read correctly.\n    const br = (rgb.r / 255) * a + (1 - a);\n    const bg = (rgb.g / 255) * a + (1 - a);\n    const bb = (rgb.b / 255) * a + (1 - a);\n    const lum = 0.2126 * br + 0.7152 * bg + 0.0722 * bb;\n    if (lum > 0.62) {\n      return { primary: 'rgba(15,23,42,0.92)', secondary: 'rgba(15,23,42,0.72)' };\n    }\n    return { primary: 'rgba(255,255,255,0.96)', secondary: 'rgba(255,255,255,0.78)' };\n  }\n\n  private resolveSliceColor(\n    item: AXFunnelData,\n    index: number,\n    opt: AXFunnelChartOption,\n    minValue: number,\n    maxValue: number,\n    resolvedBaseRgb: string,\n  ): string {\n    if (item.color) return this.resolveCssColor(item.color);\n\n    const palette = opt.colors?.filter(Boolean) ?? [];\n    if (palette.length > 0) {\n      const key = String(item.id ?? item.name ?? index);\n      const idx = this.hashStringToUint32(key) % palette.length;\n      const raw = palette[idx] ?? opt.color ?? 'rgb(99, 102, 241)';\n      return this.resolveCssColor(raw);\n    }\n\n    const rangeMin = opt.valueRange?.min ?? minValue;\n    const rangeMax = opt.valueRange?.max ?? maxValue;\n    const span = rangeMax - rangeMin;\n    const t = span === 0 ? 1 : (item.value - rangeMin) / span;\n    const clamped = Math.max(0, Math.min(1, t));\n    return this.applyIntensityToResolvedRgb(resolvedBaseRgb, clamped);\n  }\n\n  /** `resolvedRgb` must be a computed `rgb()` / `rgba()` string (e.g. from {@link resolveCssColor}). */\n  private applyIntensityToResolvedRgb(resolvedRgb: string, t: number): string {\n    const clamped = Math.max(0, Math.min(1, t));\n    const parsed = this.d3.color(resolvedRgb);\n    if (!parsed) return resolvedRgb;\n    const rgb = this.d3.rgb(parsed);\n    const minOpacity = 0.12;\n    const opacity = minOpacity + clamped * (1 - minOpacity);\n    return `rgba(${Math.round(rgb.r)},${Math.round(rgb.g)},${Math.round(rgb.b)},${opacity})`;\n  }\n\n  private hashStringToUint32(input: string): number {\n    let hash = 5381;\n    for (let i = 0; i < input.length; i++) {\n      hash = (hash * 33) ^ input.charCodeAt(i);\n    }\n    return hash >>> 0;\n  }\n\n  private resolveCssColor(color: string): string {\n    return resolveCssColorInContext(this.chartContainerEl().nativeElement, color);\n  }\n\n  public updateChart(): void {\n    this.createChart();\n  }\n\n  private showTooltip(event: MouseEvent, item: AXFunnelData, color: string): void {\n    if (!this.effectiveOptions().showTooltip) return;\n    this._tooltipData.set({ title: item.name, value: item.value.toLocaleString(), color });\n    this._tooltipVisible.set(true);\n    this.updateTooltipPosition(event);\n  }\n\n  private updateTooltipPosition(event: MouseEvent): void {\n    this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n    if (this._tooltipRafId != null) return;\n    this.scheduleTooltipPosition(0);\n  }\n\n  private scheduleTooltipPosition(attempt: number): void {\n    this._tooltipRafId = requestAnimationFrame(() => {\n      const coords = this._pendingTooltipCoords;\n      if (!coords) {\n        this._tooltipRafId = null;\n        return;\n      }\n\n      const containerEl = this.chartContainerEl()?.nativeElement;\n      if (!containerEl) {\n        this._tooltipRafId = null;\n        return;\n      }\n\n      const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n      if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n        this.scheduleTooltipPosition(attempt + 1);\n        return;\n      }\n\n      this._tooltipRafId = null;\n      const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n      const pos = computeTooltipPosition(containerEl, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n      this._tooltipPosition.set(pos);\n    });\n  }\n\n  private cancelTooltipPosition(): void {\n    if (this._tooltipRafId != null) {\n      cancelAnimationFrame(this._tooltipRafId);\n      this._tooltipRafId = null;\n    }\n    this._pendingTooltipCoords = null;\n  }\n\n  private hideTooltip(): void {\n    this._tooltipVisible.set(false);\n  }\n\n  public cleanupChart(): void {\n    this.cancelTooltipPosition();\n    if (this.svgElement) {\n      this.svgElement.remove();\n      this.svgElement = null;\n    }\n  }\n}\n","<div class=\"ax-funnel-chart-container\" role=\"img\" #chartContainer>\n  <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n  </ax-chart-tooltip>\n  @if (data()?.length === 0) {\n    <div class=\"ax-chart-empty\">\n      <div class=\"ax-chart-empty__card\">\n        <div class=\"ax-chart-empty__icon\">\n          <i [class]=\"effectiveMessages().noDataIcon + ' fa-2x'\" aria-hidden=\"true\"></i>\n        </div>\n        <div class=\"ax-chart-empty__title\">{{ effectiveMessages().noData }}</div>\n        <div class=\"ax-chart-empty__help\">{{ effectiveMessages().noDataHelp }}</div>\n      </div>\n    </div>\n  }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}