{"version":3,"file":"acorex-charts-donut-chart.mjs","sources":["../../../../packages/charts/donut-chart/src/lib/donut-chart.config.ts","../../../../packages/charts/donut-chart/src/lib/donut-chart.component.ts","../../../../packages/charts/donut-chart/src/lib/donut-chart.component.html","../../../../packages/charts/donut-chart/src/acorex-charts-donut-chart.ts"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXDonutChartOption } from './donut-chart.type';\n\nexport const AXDonutChartDefaultConfig: AXDonutChartOption = {\n  showTooltip: true,\n  showDataLabels: true,\n  donutWidth: 35,\n  cornerRadius: 4,\n  animationDuration: 800,\n  animationEasing: 'cubic-out',\n  messages: {\n    ...AX_CHART_DEFAULT_MESSAGES,\n    noDataIcon: 'fa-light fa-chart-pie',\n  },\n};\n\nexport const AX_DONUT_CHART_CONFIG = new InjectionToken<AXDonutChartOption>('AX_DONUT_CHART_CONFIG', {\n  providedIn: 'root',\n  factory: () => AXDonutChartDefaultConfig,\n});\n\nexport type PartialDonutChartConfig = Partial<AXDonutChartOption>;\n\nexport function donutChartConfig(config: PartialDonutChartConfig = {}): AXDonutChartOption {\n  return {\n    ...AXDonutChartDefaultConfig,\n    ...config,\n    messages: {\n      ...AXDonutChartDefaultConfig.messages,\n      ...config.messages,\n    },\n  };\n}\n","import {\n  AX_CHART_COLOR_PALETTE,\n  AXChartComponent,\n  AXChartComponentBase,\n  computeTooltipPosition,\n  createChartInstanceId,\n  getChartColor,\n  getEasingFunction,\n  mergeChartMessages,\n  mergeChartOptions,\n  renderChartEmptyMessage,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n  afterNextRender,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  untracked,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { AX_DONUT_CHART_CONFIG } from './donut-chart.config';\nimport { AXDonutChartData, AXDonutChartOption, AXDonutChartValue } from './donut-chart.type';\n\n/**\n * Donut Chart Component\n * Displays data in a circular donut chart with interactive segments\n */\n@Component({\n  selector: 'ax-donut-chart',\n  templateUrl: './donut-chart.component.html',\n  styleUrls: ['./donut-chart.component.css'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXChartTooltipComponent],\n})\nexport class AXDonutChartComponent\n  extends AXChartComponent\n  implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n  // Dependency Injection\n  private cdr = inject(ChangeDetectorRef);\n\n  // Inputs\n  /** Chart data input */\n  data = input<AXDonutChartValue>([]);\n\n  /** Chart options input */\n  options = input<AXDonutChartOption>({});\n\n  // Outputs\n  /** Emitted when a segment is clicked */\n  segmentClick = output<AXDonutChartData>();\n\n  /** Emitted when a segment has mouse hover\n   * Can be used by external elements to highlight this segment\n   */\n  segmentHover = output<AXDonutChartData | null>();\n\n  // Chart container reference\n  private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n  // D3 reference - loaded asynchronously\n  protected d3!: typeof import('d3');\n\n  // Chart SVG reference (using 'any' since D3 is loaded dynamically at runtime)\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private svg: any = null;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private pieData: any[] = [];\n\n  // State management\n  private hiddenSegments = new Set<string>();\n  private readonly _legendStateVersion = signal(0);\n  readonly legendStateVersion = this._legendStateVersion.asReadonly();\n  private _initialized = signal(false);\n  private _rendered = signal(false);\n  private _isInitialAnimating = signal(false);\n  private _currentlyHighlightedSegment = signal<string | null>(null);\n\n  // Tooltip state\n  private _tooltipVisible = signal(false);\n  private _tooltipPosition = signal({ x: 0, y: 0 });\n  private _tooltipData = signal<AXChartTooltipData>({\n    title: '',\n    value: 0,\n    percentage: '0%',\n    color: '',\n  });\n  private _tooltipRafId: number | null = null;\n  private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n  // Public computed properties for the template\n  protected tooltipVisible = this._tooltipVisible.asReadonly();\n  protected tooltipPosition = this._tooltipPosition.asReadonly();\n  protected tooltipData = this._tooltipData.asReadonly();\n\n  // Inject configuration\n  private configToken = inject(AX_DONUT_CHART_CONFIG);\n\n  // Inject the chart colors\n  private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n  // Computed configuration options\n  protected effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()));\n\n  // Constants\n  private readonly TOOLTIP_GAP = 10;\n  private readonly HIGHLIGHT_TRANSITION_DURATION = 150;\n  private readonly HIGHLIGHT_TRANSITION_NAME = 'highlight';\n  private readonly SEGMENT_ANIMATION_DELAY = 50;\n  private readonly LABEL_ANIMATION_DELAY = 200;\n  private readonly MIN_CHART_DIMENSION = 200;\n  private readonly MIN_CHART_FOR_LABELS = 260;\n  private readonly CHART_INSET = 12;\n  private readonly DIMMED_OPACITY = 0.5;\n  private readonly VISIBLE_OPACITY = 1;\n  private readonly instanceId = createChartInstanceId('ax-donut');\n  private get segmentShadowFilterId(): string {\n    return `${this.instanceId}-segment-shadow`;\n  }\n\n  // Messages with defaults\n  protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\n\n  // Data accessor for handling different incoming data formats\n  protected chartDataArray = computed((): AXDonutChartData[] => {\n    return this.data() || [];\n  });\n\n  // Color accessor method\n  protected getColor(index: number): string {\n    return getChartColor(index, this.chartColors);\n  }\n\n  // Segment visibility check\n  protected isSegmentHidden(id: string): boolean {\n    return this.hiddenSegments.has(id);\n  }\n\n  constructor() {\n    super();\n    // Dynamically load D3 and initialize the chart when the component is ready\n    afterNextRender(() => {\n      this._initialized.set(true);\n      this.loadD3();\n    });\n  }\n\n  private readonly dataChangeEffect = effect(() => {\n    // Track data and options changes\n    this.data();\n    this.effectiveOptions();\n\n    // Only update if already rendered\n    untracked(() => {\n      if (this._rendered()) {\n        this.updateChart();\n        this.bumpLegendState();\n      }\n    });\n  });\n\n  private bumpLegendState(): void {\n    this._legendStateVersion.update((version) => version + 1);\n  }\n\n  /**\n   * Highlights a specific segment by ID\n   * @param id The segment ID to highlight, or null to clear highlight\n   */\n  highlightSegment(id: string | null): void {\n    if (this._isInitialAnimating() || !this.svg) return;\n\n    if (this._currentlyHighlightedSegment() === id) return;\n\n    this._currentlyHighlightedSegment.set(id);\n\n    // Only interrupt ongoing HIGHLIGHT transitions (not initial animations)\n    this.svg.selectAll('path').interrupt(this.HIGHLIGHT_TRANSITION_NAME);\n\n    if (id === null) {\n      this.clearAllHighlights();\n      return;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const targetSegment = this.svg.selectAll('path').filter((d: any) => d?.data?.id === id);\n\n    if (targetSegment.empty()) {\n      this._currentlyHighlightedSegment.set(null);\n      this.highlightSegment(null);\n      return;\n    }\n\n    this.dimNonTargetSegments(id);\n    this.highlightTargetSegment(targetSegment);\n    this.segmentHover.emit(this.getSegmentDataById(id));\n  }\n\n  private clearAllHighlights(): void {\n    if (!this.svg) return;\n\n    this.svg\n      .selectAll('path')\n      .classed('ax-donut-chart-highlighted', false)\n      .classed('ax-donut-chart-dimmed', false)\n      .transition(this.HIGHLIGHT_TRANSITION_NAME)\n      .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n      .attr('transform', null)\n      .style('filter', null)\n      .style('opacity', this.VISIBLE_OPACITY);\n\n    this.segmentHover.emit(null);\n  }\n\n  private dimNonTargetSegments(targetId: string): void {\n    if (!this.svg) return;\n\n    this.svg\n      .selectAll('path')\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      .filter((d: any) => d?.data?.id !== targetId)\n      .classed('ax-donut-chart-highlighted', false)\n      .classed('ax-donut-chart-dimmed', true)\n      .transition(this.HIGHLIGHT_TRANSITION_NAME)\n      .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n      .attr('transform', null)\n      .style('filter', null)\n      .style('opacity', this.DIMMED_OPACITY);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private highlightTargetSegment(targetSegment: any): void {\n    targetSegment\n      .classed('ax-donut-chart-dimmed', false)\n      .classed('ax-donut-chart-highlighted', true)\n      .transition(this.HIGHLIGHT_TRANSITION_NAME)\n      .duration(this.HIGHLIGHT_TRANSITION_DURATION)\n      .style('filter', `url(#${this.segmentShadowFilterId})`)\n      .style('opacity', this.VISIBLE_OPACITY);\n  }\n\n  private getSegmentDataById(segmentId: string): AXDonutChartData | null {\n    return untracked(() => this.chartDataArray()).find((d) => d.id === segmentId) || null;\n  }\n\n  /**\n   * Toggles visibility of a segment by ID\n   * @param id Segment ID to toggle\n   * @returns New visibility state (true = visible, false = hidden)\n   */\n  toggleSegment(id: string): boolean {\n    const chartData = this.chartDataArray();\n    const wasAllHidden = chartData.length > 0 && chartData.every((d) => this.isSegmentHidden(d.id));\n\n    if (this.hiddenSegments.has(id)) {\n      // Making a segment visible\n      this.hiddenSegments.delete(id);\n\n      // If all segments were previously hidden, we need to ensure the message is cleared\n      if (wasAllHidden) {\n        // Force complete DOM cleanup and redraw\n        if (this.chartContainerEl()?.nativeElement) {\n          // Clear only chart SVG and message containers (preserve tooltip component)\n          this.d3\n            ?.select(this.chartContainerEl().nativeElement)\n            .selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n            .remove();\n\n          // Force full redraw\n          setTimeout(() => {\n            this.createChart();\n          }, 0);\n        }\n      } else {\n        this.updateChart();\n      }\n    } else {\n      // Hiding a segment\n      this.hiddenSegments.add(id);\n      this.updateChart();\n    }\n\n    this.bumpLegendState();\n    return !this.isSegmentHidden(id);\n  }\n\n  ngOnDestroy(): void {\n    this.cleanupChart();\n  }\n\n  /**\n   * Loads D3.js dynamically\n   */\n  protected async loadD3(): Promise<void> {\n    try {\n      this.d3 = await import('d3');\n      // If container is ready, create chart\n      if (this._initialized() && this.chartContainerEl()) {\n        this.createChart();\n        this._rendered.set(true);\n      }\n    } catch (error) {\n      console.error('Failed to load D3.js:', error);\n    }\n  }\n\n  protected onSegmentClick(item: AXDonutChartData): void {\n    this.segmentClick.emit(item);\n  }\n\n  /**\n   * Creates the donut chart from current data\n   */\n  public createChart(): void {\n    if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n    try {\n      const containerElement = this.chartContainerEl().nativeElement;\n      this.clearChart(containerElement);\n\n      const data = this.chartDataArray();\n      if (!data || data.length === 0) {\n        this.showNoDataMessage();\n        return;\n      }\n\n      const visibleData = data.filter((item) => !this.hiddenSegments.has(item.id));\n      if (visibleData.length === 0) {\n        this.showAllSegmentsHiddenMessage();\n        return;\n      }\n\n      const options = this.effectiveOptions();\n      const { width, height } = this.setupDimensions(containerElement, options);\n      this.renderDonutChart(containerElement, width, height, visibleData);\n    } catch (error) {\n      console.error('Error creating donut chart:', error);\n      this.handleChartError();\n    }\n  }\n\n  /**\n   * Updates the chart with new data\n   */\n  public updateChart(): void {\n    // Reset highlighted segment state when updating\n    this._currentlyHighlightedSegment.set(null);\n    this.createChart(); // Recreate the chart with updated data\n  }\n\n  /**\n   * Clears the chart container\n   */\n  private clearChart(container: HTMLElement): void {\n    this.d3\n      .select(container)\n      .selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n      .remove();\n    this._tooltipVisible.set(false);\n  }\n\n  /**\n   * Shows a message when no data is available\n   */\n  private showNoDataMessage(): void {\n    if (!this.chartContainerEl()?.nativeElement) return;\n    const messages = this.effectiveMessages();\n    renderChartEmptyMessage(this.d3, this.chartContainerEl().nativeElement, {\n      icon: messages.noDataIcon,\n      title: messages.noData,\n      help: messages.noDataHelp,\n    });\n  }\n\n  /**\n   * Shows a message when all segments are hidden\n   */\n  private showAllSegmentsHiddenMessage(): void {\n    if (!this.chartContainerEl()?.nativeElement) return;\n    const messages = this.effectiveMessages();\n    renderChartEmptyMessage(this.d3, this.chartContainerEl().nativeElement, {\n      icon: messages.allHiddenIcon,\n      title: messages.allHidden,\n      help: messages.allHiddenHelp,\n    });\n  }\n\n  /**\n   * Setups chart dimensions based on container and options\n   */\n  private setupDimensions(container: HTMLElement, options: AXDonutChartOption): { width: number; height: number } {\n    const containerWidth = Math.max(container.clientWidth, 1);\n    const containerHeight = Math.max(container.clientHeight, 1);\n\n    const desiredWidth = options?.width || containerWidth;\n    const desiredHeight = options?.height || containerHeight;\n    // Keep donut geometry square so side spacing stays visually balanced.\n    const chartSize = Math.max(1, Math.min(desiredWidth, desiredHeight));\n\n    return { width: chartSize, height: chartSize };\n  }\n\n  /**\n   * Renders the donut chart with visible data\n   */\n  private renderDonutChart(\n    container: HTMLElement,\n    width: number,\n    height: number,\n    visibleData: AXDonutChartData[],\n  ): void {\n    const displayTotal = this.getDisplayTotal(visibleData);\n    const layoutTotal = this.getLayoutTotal(visibleData);\n\n    // Create SVG container with filters\n    const svg = this.createSvgWithFilters(container, width, height);\n\n    // Create main chart group\n    this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);\n\n    const { innerRadius } = this.getDonutRadii(width, height);\n\n    // Create donut segments\n    this.createDonutSegments(width, height, visibleData, layoutTotal);\n\n    // Add total in center\n    this.addCenterDisplay(displayTotal, innerRadius);\n  }\n\n  private getDonutRadii(\n    chartWidth: number,\n    chartHeight: number,\n  ): { innerRadius: number; outerRadius: number; radius: number } {\n    const maxRadius = Math.min(chartWidth, chartHeight) / 2;\n    const radius = Math.max(0, maxRadius - this.CHART_INSET);\n    const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n    const innerRadius = radius * (1 - donutWidthPercent);\n    const outerRadius = radius * 0.95;\n\n    return { innerRadius, outerRadius, radius };\n  }\n\n  /**\n   * Create SVG element with filter definitions for shadows\n   * @returns D3 SVG selection (any type due to dynamic D3 loading)\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private createSvgWithFilters(container: HTMLElement, width: number, height: number): any {\n    const svg = this.d3\n      .select(container)\n      .append('svg')\n      .attr('width', '100%')\n      .attr('height', '100%')\n      .attr('viewBox', `0 0 ${width} ${height}`)\n      .attr('preserveAspectRatio', 'xMidYMid meet');\n\n    // Add drop shadow filter\n    const defs = svg.append('defs');\n    const filter = defs.append('filter').attr('id', this.segmentShadowFilterId).attr('height', '130%');\n\n    filter.append('feGaussianBlur').attr('in', 'SourceAlpha').attr('stdDeviation', 2).attr('result', 'blur');\n    filter.append('feOffset').attr('in', 'blur').attr('dx', 1).attr('dy', 1).attr('result', 'offsetBlur');\n\n    const feComponentTransfer = filter\n      .append('feComponentTransfer')\n      .attr('in', 'offsetBlur')\n      .attr('result', 'offsetBlur');\n\n    feComponentTransfer.append('feFuncA').attr('type', 'linear').attr('slope', 0.3);\n\n    const feMerge = filter.append('feMerge');\n    feMerge.append('feMergeNode').attr('in', 'offsetBlur');\n    feMerge.append('feMergeNode').attr('in', 'SourceGraphic');\n\n    return svg;\n  }\n\n  /**\n   * Create and render the donut segments with animations\n   */\n  private createDonutSegments(\n    chartWidth: number,\n    chartHeight: number,\n    data: AXDonutChartData[],\n    layoutTotal: number,\n  ): void {\n    this._isInitialAnimating.set(true);\n\n    // Create pie layout\n    const pie = this.d3\n      .pie<AXDonutChartData>()\n      .value((d) => this.getSegmentLayoutValue(d.value))\n      .sort(null)\n      .padAngle(0.02);\n\n    const { innerRadius, outerRadius } = this.getDonutRadii(chartWidth, chartHeight);\n    const ringWidth = outerRadius - innerRadius;\n\n    const arc = this.d3\n      .arc()\n      .innerRadius(innerRadius)\n      .outerRadius(outerRadius)\n      .cornerRadius(this.effectiveOptions().cornerRadius);\n\n    const labelArc = this.d3\n      .arc()\n      .innerRadius(innerRadius + ringWidth / 2)\n      .outerRadius(innerRadius + ringWidth / 2);\n\n    // Get animation options\n    const animationDuration = this.effectiveOptions().animationDuration;\n    const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n    // Generate pie data\n    this.pieData = pie(data);\n\n    // Add segments with animation\n    const segments = this.svg\n      .selectAll('path')\n      .data(this.pieData)\n      .enter()\n      .append('path')\n      .attr('class', 'ax-donut-chart-segment')\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      .attr('fill', (d: any) => this.getSegmentColor(d.data))\n      .style('opacity', 0)\n      .style('cursor', 'pointer')\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      .on('mouseenter', (event: MouseEvent, d: any) => {\n        if (this.effectiveOptions().showTooltip) {\n          this.handleSliceHover(event, d.data);\n        }\n      })\n      .on('mouseleave', () => this.handleSegmentLeave())\n      .on('mousemove', (event: MouseEvent) => {\n        if (this._tooltipVisible()) {\n          this.updateTooltipPosition(event);\n        }\n      })\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      .on('click', (_event: MouseEvent, d: any) => {\n        this.onSegmentClick(d.data);\n      });\n\n    // Animate segments\n    const numSegments = this.pieData.length;\n    let completed = 0;\n    segments\n      .transition()\n      .duration(animationDuration)\n      .ease(animationEasing)\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      .delay((_d: any, i: number) => i * this.SEGMENT_ANIMATION_DELAY)\n      .style('opacity', this.VISIBLE_OPACITY)\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      .attrTween('d', (d: any) => {\n        const interpolate = this.d3.interpolate({ startAngle: d.startAngle, endAngle: d.startAngle }, d);\n        return (t: number) => arc(interpolate(t)) as string;\n      })\n      .on('end', () => {\n        completed++;\n        if (completed >= numSegments) {\n          this._isInitialAnimating.set(false);\n          this.cdr.detectChanges();\n        }\n      })\n      .on('interrupt', () => {\n        // Treat interrupts as completion to avoid getting stuck in animating state\n        completed++;\n        if (completed >= numSegments) {\n          this._isInitialAnimating.set(false);\n          this.cdr.detectChanges();\n        }\n      });\n\n    // Add data labels if enabled and chart size is sufficient\n    if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {\n      this.addDataLabels(labelArc, outerRadius, innerRadius, layoutTotal, animationDuration);\n    }\n\n    // Determine when all segment animations are complete (handle empty case)\n    if (numSegments === 0) {\n      this._isInitialAnimating.set(false);\n      this.cdr.detectChanges();\n    }\n  }\n\n  private isChartLargeEnoughForLabels(width: number, height: number): boolean {\n    return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private addDataLabels(\n    labelArc: any,\n    outerRadius: number,\n    innerRadius: number,\n    layoutTotal: number,\n    animationDuration: number,\n  ): void {\n    if (!this.svg) return;\n\n    const dataWithLabels = this.pieData.filter((d) => {\n      return this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal) > 0;\n    });\n\n    const labels = this.svg\n      .selectAll('.ax-donut-chart-data-label')\n      .data(dataWithLabels)\n      .enter()\n      .append('text')\n      .attr('class', 'ax-donut-chart-data-label')\n      .style('opacity', 0)\n      .style('pointer-events', 'none')\n      .style('fill', 'rgb(var(--ax-comp-donut-chart-data-labels-color))')\n      .attr('transform', (d) => {\n        const centroid = labelArc.centroid(d);\n        return `translate(${centroid[0]}, ${centroid[1]})`;\n      })\n      .attr('text-anchor', 'middle')\n      .attr('dominant-baseline', 'middle')\n      .style('font-size', (d) => `${this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal)}px`)\n      .style('font-weight', (d) => (this.getSegmentPercentage(d.data.value, layoutTotal) >= 15 ? '600' : '500'))\n      .text((d) => this.getTruncatedLabelText(d, outerRadius, innerRadius, layoutTotal));\n\n    labels\n      .transition()\n      .duration(animationDuration)\n      .delay((_d, i: number) => i * this.SEGMENT_ANIMATION_DELAY + this.LABEL_ANIMATION_DELAY)\n      .style('opacity', this.VISIBLE_OPACITY);\n  }\n\n  /**\n   * Calculates font size for data labels using the donut ring's physical dimensions.\n   *\n   * Primary driver is the ring width (radial space), with chord length as an\n   * overflow guard and a gentle scale-down for smaller segments to create\n   * visual hierarchy.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private calculateLabelFontSize(d: any, outerRadius: number, innerRadius: number, layoutTotal: number): number {\n    const angle = d.endAngle - d.startAngle;\n    const segmentPercentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n\n    if (segmentPercentage < 2) return 0;\n\n    const ringWidth = outerRadius - innerRadius;\n    const labelRadius = innerRadius + ringWidth / 2;\n    const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n\n    const MIN_CHORD = 22;\n    const MIN_RING = 16;\n    if (chordLength < MIN_CHORD || ringWidth < MIN_RING) return 0;\n\n    const ringBasedSize = ringWidth * 0.48;\n\n    // Segments >= 20% get full size; smaller ones scale from 0.75 → 1.0\n    const segmentScale = Math.min(1, 0.75 + 0.25 * (segmentPercentage / 20));\n\n    // At least 2 characters (\"X%\") must fit horizontally\n    const maxByChord = chordLength / (2 * 0.65);\n\n    const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);\n\n    const MIN_FONT_SIZE = 11;\n    const MAX_FONT_SIZE = 20;\n\n    return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;\n  }\n\n  private formatPercentage(value: number): string {\n    if (value < 1) return '<1%';\n    if (value < 10) return `${value.toFixed(1)}%`;\n    return `${Math.round(value)}%`;\n  }\n\n  /**\n   * Returns the best-fit label text for a segment, progressively truncating\n   * from \"Label (XX%)\" → \"Label\" → \"XX%\" → truncated label → truncated percentage.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private getTruncatedLabelText(d: any, outerRadius: number, innerRadius: number, layoutTotal: number): string {\n    const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, layoutTotal);\n    if (fontSize === 0) return '';\n\n    const ringWidth = outerRadius - innerRadius;\n    const labelRadius = innerRadius + ringWidth / 2;\n    const angle = d.endAngle - d.startAngle;\n    const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n    const availableWidth = chordLength * 0.8;\n\n    const percentage = this.getSegmentPercentage(d.data.value, layoutTotal);\n    if (percentage < 2) return '';\n\n    const label = d.data.label || '';\n    const percentageText = this.formatPercentage(percentage);\n    const fullText = label ? `${label} (${percentageText})` : percentageText;\n\n    if (this.doesTextFit(fullText, fontSize, availableWidth)) return fullText;\n    if (label && this.doesTextFit(label, fontSize, availableWidth)) return label;\n    if (this.doesTextFit(percentageText, fontSize, availableWidth)) return percentageText;\n    if (label) return this.truncateTextToFit(label, fontSize, availableWidth);\n    return this.truncateTextToFit(percentageText, fontSize, availableWidth);\n  }\n\n  /**\n   * Checks if text fits within available width using conservative estimation\n   * Uses 0.65em per character to account for font variations\n   */\n  private doesTextFit(text: string, fontSize: number, availableWidth: number): boolean {\n    if (!text) return false;\n\n    // Use conservative character width (0.65em for safety)\n    // Wider fonts like bold text need more space\n    const estimatedWidth = text.length * fontSize * 0.65;\n    return estimatedWidth <= availableWidth;\n  }\n\n  /**\n   * Truncates text to fit within available width with ellipsis\n   * Uses conservative character width to prevent overflow\n   * Adapts character width estimation based on font size\n   */\n  private truncateTextToFit(text: string, fontSize: number, availableWidth: number): string {\n    if (!text) return '';\n\n    // Adaptive character width: smaller fonts are relatively wider\n    // Larger fonts: ~0.6em, Smaller fonts: ~0.7em\n    const charWidthRatio = fontSize <= 10 ? 0.7 : 0.65;\n    const charWidth = fontSize * charWidthRatio;\n\n    // Reserve space for ellipsis\n    const ellipsisWidth = fontSize * 0.7;\n    const availableForText = availableWidth - ellipsisWidth;\n\n    if (availableForText <= 0) return '';\n\n    const maxChars = Math.floor(availableForText / charWidth);\n\n    if (maxChars <= 0) return '';\n    if (text.length <= maxChars) return text;\n\n    // Ensure at least 1 character before ellipsis\n    return text.substring(0, Math.max(1, maxChars)) + '…';\n  }\n\n  private getSegmentColor(data: AXDonutChartData): string {\n    if (data.color) return data.color;\n\n    const originalFullData = untracked(() => this.chartDataArray());\n    const originalIndex = originalFullData.findIndex((item) => item.id === data.id);\n\n    return this.getColor(originalIndex !== -1 ? originalIndex : 0);\n  }\n\n  /**\n   * Handle hover effects on a segment\n   */\n  private handleSliceHover(event: MouseEvent, datum: AXDonutChartData): void {\n    if (this._isInitialAnimating()) return;\n\n    if (this.effectiveOptions().showTooltip !== false) {\n      this.showTooltip(event, datum);\n    }\n\n    this.highlightSegment(datum.id);\n  }\n\n  private showTooltip(event: MouseEvent, datum: AXDonutChartData): void {\n    const visibleData = untracked(() => this.chartDataArray()).filter((item) => !this.hiddenSegments.has(item.id));\n    const layoutTotal = this.getLayoutTotal(visibleData);\n    const percentage = layoutTotal > 0 ? this.getSegmentPercentage(datum.value, layoutTotal).toFixed(1) : '0';\n    const color = this.getSegmentColor(datum);\n\n    this._tooltipData.set({\n      title: datum.tooltipLabel || datum.label,\n      value: datum.value.toString(),\n      percentage: `${percentage}%`,\n      color,\n    });\n\n    this._tooltipVisible.set(true);\n    this.updateTooltipPosition(event);\n  }\n\n  /**\n   * Handles mouse leave from segments\n   */\n  private handleSegmentLeave(): void {\n    if (this._isInitialAnimating()) return;\n\n    this._tooltipVisible.set(false);\n    this.highlightSegment(null);\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  /**\n   * Adds center display with total value, scaled to fit the donut hole.\n   */\n  private addCenterDisplay(displayTotal: number, innerRadius: number): void {\n    if (!this.svg || innerRadius <= 0) return;\n\n    const valueText = displayTotal.toLocaleString();\n    const labelText = this.effectiveOptions().totalLabel || 'Total';\n    const { valueFontSize, labelFontSize, displayLabel } = this.calculateCenterTextSizes(\n      valueText,\n      labelText,\n      innerRadius,\n    );\n\n    const labelLineHeight = labelFontSize * 1.3;\n    const valueY = -(labelLineHeight / 2);\n\n    const totalDisplay = this.svg\n      .append('g')\n      .attr('class', 'ax-donut-chart-total-display')\n      .attr('text-anchor', 'middle');\n\n    totalDisplay\n      .append('text')\n      .attr('class', 'ax-donut-chart-total-value')\n      .attr('y', valueY)\n      .attr('dominant-baseline', 'middle')\n      .style('font-size', `${valueFontSize}px`)\n      .style('font-weight', '600')\n      .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n      .text(valueText);\n\n    totalDisplay\n      .append('text')\n      .attr('class', 'ax-donut-chart-total-label')\n      .attr('y', valueY + valueFontSize * 0.55 + labelLineHeight / 2)\n      .attr('dominant-baseline', 'middle')\n      .style('font-size', `${labelFontSize}px`)\n      .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n      .style('opacity', '0.8')\n      .text(displayLabel);\n  }\n\n  private calculateCenterTextSizes(\n    valueText: string,\n    labelText: string,\n    innerRadius: number,\n  ): { valueFontSize: number; labelFontSize: number; displayLabel: string } {\n    const availableDiameter = innerRadius * 2;\n    const availableWidth = availableDiameter * 0.82;\n    const availableHeight = availableDiameter * 0.78;\n\n    const MIN_VALUE_FONT = 9;\n    const MAX_VALUE_FONT = innerRadius * 0.42;\n    let valueFontSize = Math.min(innerRadius * 0.34, MAX_VALUE_FONT);\n\n    while (valueFontSize > MIN_VALUE_FONT && !this.doesTextFit(valueText, valueFontSize, availableWidth)) {\n      valueFontSize -= 0.5;\n    }\n    valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * 2) / 2);\n\n    let labelFontSize = Math.max(8, Math.round(valueFontSize * 0.42 * 2) / 2);\n    const labelLineHeight = labelFontSize * 1.3;\n    const totalHeight = valueFontSize + labelLineHeight;\n\n    if (totalHeight > availableHeight) {\n      const scale = availableHeight / totalHeight;\n      valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * scale * 2) / 2);\n      labelFontSize = Math.max(8, Math.round(labelFontSize * scale * 2) / 2);\n    }\n\n    while (labelFontSize > 8 && !this.doesTextFit(labelText, labelFontSize, availableWidth)) {\n      labelFontSize -= 0.5;\n    }\n    labelFontSize = Math.max(8, Math.round(labelFontSize * 2) / 2);\n\n    const displayLabel = this.doesTextFit(labelText, labelFontSize, availableWidth)\n      ? labelText\n      : this.truncateTextToFit(labelText, labelFontSize, availableWidth);\n\n    return { valueFontSize, labelFontSize, displayLabel };\n  }\n\n  /**\n   * Handles chart rendering errors\n   */\n  private handleChartError(): void {\n    const container = this.chartContainerEl()?.nativeElement;\n    if (container) {\n      this.showNoDataMessage();\n    }\n  }\n\n  /**\n   * Cleans up chart resources\n   */\n  public cleanupChart(): void {\n    this.cancelTooltipPosition();\n    const container = this.chartContainerEl()?.nativeElement;\n    if (container) {\n      this.d3\n        ?.select(container)\n        .selectAll('svg, .ax-chart-empty, .ax-chart-message-container, .ax-donut-chart-no-data-message')\n        .remove();\n    }\n\n    this.svg = null;\n    this.pieData = [];\n    this.hiddenSegments.clear();\n    this._tooltipVisible.set(false);\n    this._currentlyHighlightedSegment.set(null);\n  }\n\n  // ===== Helper utilities for modularity and maintainability =====\n\n  /**\n   * Gets an accessibility label describing the donut chart for screen readers\n   * @returns Descriptive string for screen readers\n   */\n  protected getAccessibilityLabel(): string {\n    const data = this.chartDataArray();\n\n    if (!data || data.length === 0) {\n      return 'Empty donut chart. No data available.';\n    }\n\n    const displayTotal = this.getDisplayTotal(data);\n    const layoutTotal = this.getLayoutTotal(data);\n    const segmentDescriptions = data\n      .map((segment) => {\n        const percentage = layoutTotal > 0 ? this.getSegmentPercentage(segment.value, layoutTotal).toFixed(1) : '0';\n        return `${segment.label}: ${segment.value} (${percentage}%)`;\n      })\n      .join('; ');\n\n    return `Donut chart with ${data.length} segments. Total value: ${displayTotal}. ${segmentDescriptions}`;\n  }\n\n  /**\n   * Returns the data items for the legend\n   * @implements AXChartLegendCompatible\n   */\n  getLegendItems(): AXChartLegendItem[] {\n    const data = this.chartDataArray();\n    const layoutTotal = this.getLayoutTotal(data);\n\n    return data.map((item, index) => ({\n      id: item.id,\n      name: item.label || `Segment ${index + 1}`,\n      value: item.value,\n      color: this.getSegmentColor(item),\n      percentage: this.getSegmentPercentage(item.value, layoutTotal),\n      hidden: this.isSegmentHidden(item.id),\n    }));\n  }\n\n  private getSegmentLayoutValue(value: number): number {\n    return Math.abs(value);\n  }\n\n  private getLayoutTotal(data: AXDonutChartData[]): number {\n    return data.reduce((sum, item) => sum + this.getSegmentLayoutValue(item.value), 0);\n  }\n\n  private getDisplayTotal(data: AXDonutChartData[]): number {\n    return data.reduce((sum, item) => sum + item.value, 0);\n  }\n\n  private getSegmentPercentage(segmentValue: number, layoutTotal: number): number {\n    if (layoutTotal <= 0) return 0;\n    return (this.getSegmentLayoutValue(segmentValue) / layoutTotal) * 100;\n  }\n}\n","<div class=\"ax-donut-chart\" #chartContainer role=\"img\" [attr.aria-label]=\"getAccessibilityLabel()\">\n  <!-- Tooltip component -->\n  <ax-chart-tooltip\n    [visible]=\"tooltipVisible()\"\n    [position]=\"tooltipPosition()\"\n    [data]=\"tooltipData()\"\n    [showPercentage]=\"true\"\n  ></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}