@acorex/charts 22.0.0-next.27 → 22.0.0-next.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -377,10 +377,19 @@ class AXDonutChartComponent extends AXChartComponent {
377
377
  const svg = this.createSvgWithFilters(container, width, height);
378
378
  // Create main chart group
379
379
  this.svg = svg.append('g').attr('transform', `translate(${width / 2}, ${height / 2})`);
380
+ const { innerRadius } = this.getDonutRadii(width, height);
380
381
  // Create donut segments
381
382
  this.createDonutSegments(width, height, visibleData, layoutTotal);
382
383
  // Add total in center
383
- this.addCenterDisplay(displayTotal);
384
+ this.addCenterDisplay(displayTotal, innerRadius);
385
+ }
386
+ getDonutRadii(chartWidth, chartHeight) {
387
+ const maxRadius = Math.min(chartWidth, chartHeight) / 2;
388
+ const radius = Math.max(0, maxRadius - this.CHART_INSET);
389
+ const donutWidthPercent = this.effectiveOptions().donutWidth / 100;
390
+ const innerRadius = radius * (1 - donutWidthPercent);
391
+ const outerRadius = radius * 0.95;
392
+ return { innerRadius, outerRadius, radius };
384
393
  }
385
394
  /**
386
395
  * Create SVG element with filter definitions for shadows
@@ -421,13 +430,7 @@ class AXDonutChartComponent extends AXChartComponent {
421
430
  .value((d) => this.getSegmentLayoutValue(d.value))
422
431
  .sort(null)
423
432
  .padAngle(0.02);
424
- // Calculate the radius of the donut chart
425
- const maxRadius = Math.min(chartWidth, chartHeight) / 2;
426
- const radius = Math.max(0, maxRadius - this.CHART_INSET);
427
- // Calculate inner radius based on donutWidth percentage
428
- const donutWidthPercent = this.effectiveOptions().donutWidth / 100;
429
- const innerRadius = radius * (1 - donutWidthPercent);
430
- const outerRadius = radius * 0.95;
433
+ const { innerRadius, outerRadius } = this.getDonutRadii(chartWidth, chartHeight);
431
434
  const ringWidth = outerRadius - innerRadius;
432
435
  const arc = this.d3
433
436
  .arc()
@@ -726,37 +729,66 @@ class AXDonutChartComponent extends AXChartComponent {
726
729
  this._pendingTooltipCoords = null;
727
730
  }
728
731
  /**
729
- * Adds center display with total value
732
+ * Adds center display with total value, scaled to fit the donut hole.
730
733
  */
731
- addCenterDisplay(displayTotal) {
732
- if (!this.svg)
734
+ addCenterDisplay(displayTotal, innerRadius) {
735
+ if (!this.svg || innerRadius <= 0)
733
736
  return;
734
- const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;
735
- // Improved font scaling: better minimum for small sizes, better ratio for scaling
736
- const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));
737
- const subTextFontSize = baseFontSize * 0.5;
738
- // Create group for the total display
737
+ const valueText = displayTotal.toLocaleString();
738
+ const labelText = this.effectiveOptions().totalLabel || 'Total';
739
+ const { valueFontSize, labelFontSize, displayLabel } = this.calculateCenterTextSizes(valueText, labelText, innerRadius);
740
+ const labelLineHeight = labelFontSize * 1.3;
741
+ const valueY = -(labelLineHeight / 2);
739
742
  const totalDisplay = this.svg
740
743
  .append('g')
741
744
  .attr('class', 'ax-donut-chart-total-display')
742
745
  .attr('text-anchor', 'middle');
743
- // Add total value
744
746
  totalDisplay
745
747
  .append('text')
746
748
  .attr('class', 'ax-donut-chart-total-value')
747
- .style('font-size', `${baseFontSize}rem`)
749
+ .attr('y', valueY)
750
+ .attr('dominant-baseline', 'middle')
751
+ .style('font-size', `${valueFontSize}px`)
748
752
  .style('font-weight', '600')
749
753
  .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')
750
- .text(displayTotal.toLocaleString());
751
- // Add label
754
+ .text(valueText);
752
755
  totalDisplay
753
756
  .append('text')
754
757
  .attr('class', 'ax-donut-chart-total-label')
755
- .attr('dy', '1.4em')
756
- .style('font-size', `${subTextFontSize}rem`)
758
+ .attr('y', valueY + valueFontSize * 0.55 + labelLineHeight / 2)
759
+ .attr('dominant-baseline', 'middle')
760
+ .style('font-size', `${labelFontSize}px`)
757
761
  .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')
758
762
  .style('opacity', '0.8')
759
- .text(this.effectiveOptions().totalLabel || 'Total');
763
+ .text(displayLabel);
764
+ }
765
+ calculateCenterTextSizes(valueText, labelText, innerRadius) {
766
+ const availableDiameter = innerRadius * 2;
767
+ const availableWidth = availableDiameter * 0.82;
768
+ const availableHeight = availableDiameter * 0.78;
769
+ const MIN_VALUE_FONT = 9;
770
+ const MAX_VALUE_FONT = innerRadius * 0.42;
771
+ let valueFontSize = Math.min(innerRadius * 0.34, MAX_VALUE_FONT);
772
+ while (valueFontSize > MIN_VALUE_FONT && !this.doesTextFit(valueText, valueFontSize, availableWidth)) {
773
+ valueFontSize -= 0.5;
774
+ }
775
+ valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * 2) / 2);
776
+ let labelFontSize = Math.max(8, Math.round(valueFontSize * 0.42 * 2) / 2);
777
+ const labelLineHeight = labelFontSize * 1.3;
778
+ const totalHeight = valueFontSize + labelLineHeight;
779
+ if (totalHeight > availableHeight) {
780
+ const scale = availableHeight / totalHeight;
781
+ valueFontSize = Math.max(MIN_VALUE_FONT, Math.round(valueFontSize * scale * 2) / 2);
782
+ labelFontSize = Math.max(8, Math.round(labelFontSize * scale * 2) / 2);
783
+ }
784
+ while (labelFontSize > 8 && !this.doesTextFit(labelText, labelFontSize, availableWidth)) {
785
+ labelFontSize -= 0.5;
786
+ }
787
+ labelFontSize = Math.max(8, Math.round(labelFontSize * 2) / 2);
788
+ const displayLabel = this.doesTextFit(labelText, labelFontSize, availableWidth)
789
+ ? labelText
790
+ : this.truncateTextToFit(labelText, labelFontSize, availableWidth);
791
+ return { valueFontSize, labelFontSize, displayLabel };
760
792
  }
761
793
  /**
762
794
  * Handles chart rendering errors
@@ -1 +1 @@
1
- {"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 // Create donut segments\n this.createDonutSegments(width, height, visibleData, layoutTotal);\n\n // Add total in center\n this.addCenterDisplay(displayTotal);\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 // Calculate the radius of the donut chart\n const maxRadius = Math.min(chartWidth, chartHeight) / 2;\n const radius = Math.max(0, maxRadius - this.CHART_INSET);\n\n // Calculate inner radius based on donutWidth percentage\n const donutWidthPercent = this.effectiveOptions().donutWidth / 100;\n const innerRadius = radius * (1 - donutWidthPercent);\n\n const outerRadius = radius * 0.95;\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\n */\n private addCenterDisplay(displayTotal: number): void {\n if (!this.svg) return;\n\n const chartContainerWidth = this.chartContainerEl().nativeElement.clientWidth;\n // Improved font scaling: better minimum for small sizes, better ratio for scaling\n const baseFontSize = Math.max(1.8, Math.min(3.2, chartContainerWidth / 150));\n const subTextFontSize = baseFontSize * 0.5;\n\n // Create group for the total display\n const totalDisplay = this.svg\n .append('g')\n .attr('class', 'ax-donut-chart-total-display')\n .attr('text-anchor', 'middle');\n\n // Add total value\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-value')\n .style('font-size', `${baseFontSize}rem`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .text(displayTotal.toLocaleString());\n\n // Add label\n totalDisplay\n .append('text')\n .attr('class', 'ax-donut-chart-total-label')\n .attr('dy', '1.4em')\n .style('font-size', `${subTextFontSize}rem`)\n .style('fill', 'rgb(var(--ax-comp-donut-chart-value-color))')\n .style('opacity', '0.8')\n .text(this.effectiveOptions().totalLabel || 'Total');\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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"}
1
+ {"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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex/charts",
3
- "version": "22.0.0-next.27",
3
+ "version": "22.0.0-next.28",
4
4
  "peerDependencies": {
5
5
  "d3": ">=7.9.0"
6
6
  },
@@ -226,6 +226,7 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
226
226
  * Renders the donut chart with visible data
227
227
  */
228
228
  private renderDonutChart;
229
+ private getDonutRadii;
229
230
  /**
230
231
  * Create SVG element with filter definitions for shadows
231
232
  * @returns D3 SVG selection (any type due to dynamic D3 loading)
@@ -276,9 +277,10 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
276
277
  private scheduleTooltipPosition;
277
278
  private cancelTooltipPosition;
278
279
  /**
279
- * Adds center display with total value
280
+ * Adds center display with total value, scaled to fit the donut hole.
280
281
  */
281
282
  private addCenterDisplay;
283
+ private calculateCenterTextSizes;
282
284
  /**
283
285
  * Handles chart rendering errors
284
286
  */