@acorex/charts 22.0.0-next.0 → 22.0.0-next.1
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.
- package/fesm2022/acorex-charts-bar-chart.mjs +40 -39
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs +17 -13
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +16 -5
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +9 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +16 -5
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +9 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs +18 -26
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-charts-bar-chart.d.ts +1 -0
- package/types/acorex-charts-donut-chart.d.ts +1 -0
- package/types/acorex-charts-funnel-chart.d.ts +1 -0
- package/types/acorex-charts-gauge-chart.d.ts +1 -0
- package/types/acorex-charts-heatmap-chart.d.ts +1 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i1 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { inject, NgZone, input, viewChild, afterNextRender, Component } from '@angular/core';
|
|
4
|
+
import { inject, NgZone, input, viewChild, afterNextRender, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
5
5
|
|
|
6
6
|
class AXChartTooltipComponent {
|
|
7
7
|
ngZone = inject(NgZone);
|
|
@@ -76,17 +76,19 @@ class AXChartTooltipComponent {
|
|
|
76
76
|
* Updates tooltip dimensions after it's rendered
|
|
77
77
|
*/
|
|
78
78
|
updateTooltipDimensions() {
|
|
79
|
-
if (this.visible()
|
|
80
|
-
|
|
81
|
-
// Use requestAnimationFrame to ensure dimensions are calculated after render
|
|
82
|
-
requestAnimationFrame(() => {
|
|
83
|
-
if (this.tooltipContainer()?.nativeElement) {
|
|
84
|
-
this.tooltipWidth = this.tooltipContainer().nativeElement.offsetWidth;
|
|
85
|
-
this.tooltipHeight = this.tooltipContainer().nativeElement.offsetHeight;
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
});
|
|
79
|
+
if (!this.visible()) {
|
|
80
|
+
return;
|
|
89
81
|
}
|
|
82
|
+
this.ngZone.runOutsideAngular(() => {
|
|
83
|
+
requestAnimationFrame(() => {
|
|
84
|
+
const tooltipEl = this.tooltipContainer()?.nativeElement;
|
|
85
|
+
if (!tooltipEl) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.tooltipWidth = tooltipEl.offsetWidth;
|
|
89
|
+
this.tooltipHeight = tooltipEl.offsetHeight;
|
|
90
|
+
});
|
|
91
|
+
});
|
|
90
92
|
}
|
|
91
93
|
/**
|
|
92
94
|
* Get adjusted tooltip position
|
|
@@ -99,11 +101,13 @@ class AXChartTooltipComponent {
|
|
|
99
101
|
};
|
|
100
102
|
}
|
|
101
103
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXChartTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
102
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXChartTooltipComponent, isStandalone: true, selector: "ax-chart-tooltip", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, showPercentage: { classPropertyName: "showPercentage", publicName: "showPercentage", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tooltipContainer", first: true, predicate: ["tooltipContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip
|
|
104
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXChartTooltipComponent, isStandalone: true, selector: "ax-chart-tooltip", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, showPercentage: { classPropertyName: "showPercentage", publicName: "showPercentage", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "ax-chart-tooltip-host" }, viewQueries: [{ propertyName: "tooltipContainer", first: true, predicate: ["tooltipContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip chart-tooltip-visible\"\n [style.background-color]=\"data()!.tooltipBgColor || null\"\n [style.color]=\"data()!.tooltipColor || null\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\n aria-hidden=\"false\"\n >\n <div class=\"chart-tooltip-content\">\n <div class=\"chart-tooltip-body\">\n @if (!isTitleArray()) {\n <div class=\"chart-tooltip-title-row\">\n @if (singleColor()) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"singleColor()!\"></div>\n }\n <div class=\"chart-tooltip-title\">\n {{ data()!.title }}\n </div>\n </div>\n } @else {\n <div class=\"chart-tooltip-title-list\">\n @for (t of titleList(); let i = $index; track $index) {\n <div class=\"chart-tooltip-title-row\">\n @if (colorAt(i)) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"colorAt(i)!\"></div>\n }\n <div class=\"chart-tooltip-title\">\n {{ t }}\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"chart-tooltip-value-row\">\n <div class=\"chart-tooltip-value\">{{ formattedValue() }}</div>\n @if (showPercentage() && data()!.percentage) {\n <div class=\"chart-tooltip-percentage\">\n {{ data()!.percentage }}\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["@reference \"../../../../styles/themes/default.css\";@layer components{ax-chart-tooltip.ax-chart-tooltip-host{@apply pointer-events-none absolute top-0 left-0 z-10 size-0 overflow-visible;--ax-comp-chart-tooltip-bg-color: var(--ax-comp-tooltip-bg-color, var(--ax-sys-color-dark));--ax-comp-chart-tooltip-text-color: var(--ax-comp-tooltip-text-color, var(--ax-sys-color-light))}.chart-tooltip{@apply pointer-events-none invisible fixed z-[1000] w-max max-w-[250px] rounded-md border border-white/10 px-3 py-2 text-[.8rem] opacity-0 backdrop-blur-sm transition-opacity duration-150 ease-in;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;background-color:rgba(var(--ax-comp-chart-tooltip-bg-color));color:rgba(var(--ax-comp-chart-tooltip-text-color))}.chart-tooltip-visible{@apply visible opacity-100;}.chart-tooltip-content{@apply flex items-center justify-between gap-2;}.chart-tooltip-body{@apply flex flex-col overflow-hidden text-ellipsis;}.chart-tooltip-title-row{@apply flex items-center gap-1.5 pb-2;}.chart-tooltip-title-list .chart-tooltip-title-row{@apply pb-1;}.chart-tooltip-color{@apply size-2.5 shrink-0 rounded-[2px];}.chart-tooltip-title{@apply overflow-hidden leading-[1.2] font-semibold text-ellipsis whitespace-nowrap;}.chart-tooltip-value-row{@apply flex items-center gap-2 whitespace-nowrap;}.chart-tooltip-value{@apply grow font-medium;}.chart-tooltip-percentage{@apply shrink-0 rounded-full px-1.5 py-0.5 text-[.7rem] font-medium;background-color:#fff3}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
103
105
|
}
|
|
104
106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXChartTooltipComponent, decorators: [{
|
|
105
107
|
type: Component,
|
|
106
|
-
args: [{ selector: 'ax-chart-tooltip', imports: [CommonModule],
|
|
108
|
+
args: [{ selector: 'ax-chart-tooltip', imports: [CommonModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
109
|
+
class: 'ax-chart-tooltip-host',
|
|
110
|
+
}, template: "@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip chart-tooltip-visible\"\n [style.background-color]=\"data()!.tooltipBgColor || null\"\n [style.color]=\"data()!.tooltipColor || null\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\n aria-hidden=\"false\"\n >\n <div class=\"chart-tooltip-content\">\n <div class=\"chart-tooltip-body\">\n @if (!isTitleArray()) {\n <div class=\"chart-tooltip-title-row\">\n @if (singleColor()) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"singleColor()!\"></div>\n }\n <div class=\"chart-tooltip-title\">\n {{ data()!.title }}\n </div>\n </div>\n } @else {\n <div class=\"chart-tooltip-title-list\">\n @for (t of titleList(); let i = $index; track $index) {\n <div class=\"chart-tooltip-title-row\">\n @if (colorAt(i)) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"colorAt(i)!\"></div>\n }\n <div class=\"chart-tooltip-title\">\n {{ t }}\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"chart-tooltip-value-row\">\n <div class=\"chart-tooltip-value\">{{ formattedValue() }}</div>\n @if (showPercentage() && data()!.percentage) {\n <div class=\"chart-tooltip-percentage\">\n {{ data()!.percentage }}\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["@reference \"../../../../styles/themes/default.css\";@layer components{ax-chart-tooltip.ax-chart-tooltip-host{@apply pointer-events-none absolute top-0 left-0 z-10 size-0 overflow-visible;--ax-comp-chart-tooltip-bg-color: var(--ax-comp-tooltip-bg-color, var(--ax-sys-color-dark));--ax-comp-chart-tooltip-text-color: var(--ax-comp-tooltip-text-color, var(--ax-sys-color-light))}.chart-tooltip{@apply pointer-events-none invisible fixed z-[1000] w-max max-w-[250px] rounded-md border border-white/10 px-3 py-2 text-[.8rem] opacity-0 backdrop-blur-sm transition-opacity duration-150 ease-in;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;background-color:rgba(var(--ax-comp-chart-tooltip-bg-color));color:rgba(var(--ax-comp-chart-tooltip-text-color))}.chart-tooltip-visible{@apply visible opacity-100;}.chart-tooltip-content{@apply flex items-center justify-between gap-2;}.chart-tooltip-body{@apply flex flex-col overflow-hidden text-ellipsis;}.chart-tooltip-title-row{@apply flex items-center gap-1.5 pb-2;}.chart-tooltip-title-list .chart-tooltip-title-row{@apply pb-1;}.chart-tooltip-color{@apply size-2.5 shrink-0 rounded-[2px];}.chart-tooltip-title{@apply overflow-hidden leading-[1.2] font-semibold text-ellipsis whitespace-nowrap;}.chart-tooltip-value-row{@apply flex items-center gap-2 whitespace-nowrap;}.chart-tooltip-value{@apply grow font-medium;}.chart-tooltip-percentage{@apply shrink-0 rounded-full px-1.5 py-0.5 text-[.7rem] font-medium;background-color:#fff3}}\n"] }]
|
|
107
111
|
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], showPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPercentage", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], tooltipContainer: [{ type: i0.ViewChild, args: ['tooltipContainer', { isSignal: true }] }] } });
|
|
108
112
|
|
|
109
113
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-chart-tooltip.mjs","sources":["../../../../packages/charts/chart-tooltip/src/lib/chart-tooltip.component.ts","../../../../packages/charts/chart-tooltip/src/lib/chart-tooltip.component.html","../../../../packages/charts/chart-tooltip/src/acorex-charts-chart-tooltip.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {
|
|
1
|
+
{"version":3,"file":"acorex-charts-chart-tooltip.mjs","sources":["../../../../packages/charts/chart-tooltip/src/lib/chart-tooltip.component.ts","../../../../packages/charts/chart-tooltip/src/lib/chart-tooltip.component.html","../../../../packages/charts/chart-tooltip/src/acorex-charts-chart-tooltip.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n NgZone,\n ViewEncapsulation,\n afterNextRender,\n inject,\n input,\n viewChild,\n} from '@angular/core';\nimport { AXChartTooltipData } from './chart-tooltip.type';\n\n@Component({\n selector: 'ax-chart-tooltip',\n templateUrl: './chart-tooltip.component.html',\n styleUrls: ['./chart-tooltip.component.css'],\n imports: [CommonModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ax-chart-tooltip-host',\n },\n})\nexport class AXChartTooltipComponent {\n private ngZone = inject(NgZone);\n\n data = input<AXChartTooltipData | null>(null);\n position = input<{ x: number; y: number }>({ x: 0, y: 0 });\n visible = input<boolean>(false);\n\n /**\n * Whether to show the tooltip's percentage badge\n */\n showPercentage = input<boolean>(true);\n\n /**\n * Optional custom styling for the tooltip\n */\n style = input<{ [key: string]: string }>({});\n\n /**\n * Reference to tooltip container for measuring dimensions\n */\n tooltipContainer = viewChild<ElementRef<HTMLDivElement>>('tooltipContainer');\n\n // Tooltip dimensions\n protected tooltipWidth = 0;\n protected tooltipHeight = 0;\n\n constructor() {\n afterNextRender(() => {\n // Update tooltip dimensions when visible changes\n this.updateTooltipDimensions();\n });\n }\n\n // Helpers to support color as string | string[]\n protected isColorArray(): boolean {\n const color = this.data()?.color as unknown;\n return Array.isArray(color);\n }\n\n protected colorList(): string[] {\n const color = this.data()?.color as unknown;\n return Array.isArray(color) ? (color as string[]) : [];\n }\n\n protected singleColor(): string | null {\n const color = this.data()?.color as unknown;\n return typeof color === 'string' ? (color as string) : null;\n }\n\n protected isTitleArray(): boolean {\n const t = this.data()?.title as unknown;\n return Array.isArray(t);\n }\n\n protected titleList(): string[] {\n const t = this.data()?.title as unknown;\n return Array.isArray(t) ? (t as string[]) : [];\n }\n\n protected colorAt(index: number): string | null {\n const c = this.data()?.color as unknown;\n if (Array.isArray(c)) {\n return (c as string[])[index] ?? null;\n }\n return typeof c === 'string' ? (c as string) : null;\n }\n\n protected formattedValue(): string {\n const v = this.data()?.value;\n if (v == null) return '';\n if (typeof v === 'number') return v.toLocaleString();\n const num = Number(v);\n return isNaN(num) ? v : num.toLocaleString();\n }\n\n /**\n * Updates tooltip dimensions after it's rendered\n */\n protected updateTooltipDimensions(): void {\n if (!this.visible()) {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n const tooltipEl = this.tooltipContainer()?.nativeElement;\n if (!tooltipEl) {\n return;\n }\n\n this.tooltipWidth = tooltipEl.offsetWidth;\n this.tooltipHeight = tooltipEl.offsetHeight;\n });\n });\n }\n\n /**\n * Get adjusted tooltip position\n * Exposes properties for parent components to query tooltip dimensions\n */\n getDimensions(): { width: number; height: number } {\n return {\n width: this.tooltipWidth,\n height: this.tooltipHeight,\n };\n }\n}\n","@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip chart-tooltip-visible\"\n [style.background-color]=\"data()!.tooltipBgColor || null\"\n [style.color]=\"data()!.tooltipColor || null\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\n aria-hidden=\"false\"\n >\n <div class=\"chart-tooltip-content\">\n <div class=\"chart-tooltip-body\">\n @if (!isTitleArray()) {\n <div class=\"chart-tooltip-title-row\">\n @if (singleColor()) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"singleColor()!\"></div>\n }\n <div class=\"chart-tooltip-title\">\n {{ data()!.title }}\n </div>\n </div>\n } @else {\n <div class=\"chart-tooltip-title-list\">\n @for (t of titleList(); let i = $index; track $index) {\n <div class=\"chart-tooltip-title-row\">\n @if (colorAt(i)) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"colorAt(i)!\"></div>\n }\n <div class=\"chart-tooltip-title\">\n {{ t }}\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"chart-tooltip-value-row\">\n <div class=\"chart-tooltip-value\">{{ formattedValue() }}</div>\n @if (showPercentage() && data()!.percentage) {\n <div class=\"chart-tooltip-percentage\">\n {{ data()!.percentage }}\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -669,8 +669,8 @@ class AXDonutChartComponent extends AXChartComponent {
|
|
|
669
669
|
percentage: `${percentage}%`,
|
|
670
670
|
color,
|
|
671
671
|
});
|
|
672
|
-
this.updateTooltipPosition(event);
|
|
673
672
|
this._tooltipVisible.set(true);
|
|
673
|
+
this.updateTooltipPosition(event);
|
|
674
674
|
}
|
|
675
675
|
/**
|
|
676
676
|
* Handles mouse leave from segments
|
|
@@ -685,16 +685,27 @@ class AXDonutChartComponent extends AXChartComponent {
|
|
|
685
685
|
this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };
|
|
686
686
|
if (this._tooltipRafId != null)
|
|
687
687
|
return;
|
|
688
|
+
this.scheduleTooltipPosition(0);
|
|
689
|
+
}
|
|
690
|
+
scheduleTooltipPosition(attempt) {
|
|
688
691
|
this._tooltipRafId = requestAnimationFrame(() => {
|
|
689
|
-
this._tooltipRafId = null;
|
|
690
692
|
const coords = this._pendingTooltipCoords;
|
|
691
|
-
if (!coords)
|
|
693
|
+
if (!coords) {
|
|
694
|
+
this._tooltipRafId = null;
|
|
692
695
|
return;
|
|
696
|
+
}
|
|
693
697
|
const containerEl = this.chartContainerEl()?.nativeElement;
|
|
694
|
-
if (!containerEl)
|
|
698
|
+
if (!containerEl) {
|
|
699
|
+
this._tooltipRafId = null;
|
|
695
700
|
return;
|
|
696
|
-
|
|
701
|
+
}
|
|
697
702
|
const tooltipEl = containerEl.querySelector('.chart-tooltip');
|
|
703
|
+
if (!tooltipEl && this._tooltipVisible() && attempt < 3) {
|
|
704
|
+
this.scheduleTooltipPosition(attempt + 1);
|
|
705
|
+
return;
|
|
706
|
+
}
|
|
707
|
+
this._tooltipRafId = null;
|
|
708
|
+
const containerRect = containerEl.getBoundingClientRect();
|
|
698
709
|
const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;
|
|
699
710
|
const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);
|
|
700
711
|
this._tooltipPosition.set(pos);
|
|
@@ -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 _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 }\n });\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 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.updateTooltipPosition(event);\n this._tooltipVisible.set(true);\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._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const containerRect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\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 if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\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 // computeTooltipPosition moved to shared chart utils\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":";;;;;AAIO,MAAM,yBAAyB,GAAuB;AAC3D,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,QAAQ,EAAE;AACR,QAAA,GAAG,yBAAyB;AAC5B,QAAA,UAAU,EAAE,uBAAuB;AACpC,KAAA;;MAGU,qBAAqB,GAAG,IAAI,cAAc,CAAqB,uBAAuB,EAAE;AACnG,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,yBAAyB;AACzC,CAAA;AAIK,SAAU,gBAAgB,CAAC,MAAA,GAAkC,EAAE,EAAA;IACnE,OAAO;AACL,QAAA,GAAG,yBAAyB;AAC5B,QAAA,GAAG,MAAM;AACT,QAAA,QAAQ,EAAE;YACR,GAAG,yBAAyB,CAAC,QAAQ;YACrC,GAAG,MAAM,CAAC,QAAQ;AACnB,SAAA;KACF;AACH;;ACCA;;;AAGG;AAQG,MAAO,qBACX,SAAQ,gBAAgB,CAAA;;AAIhB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;;;IAIvC,IAAI,GAAG,KAAK,CAAoB,EAAE;6EAAC;;IAGnC,OAAO,GAAG,KAAK,CAAqB,EAAE;gFAAC;;;IAIvC,YAAY,GAAG,MAAM,EAAoB;AAEzC;;AAEG;IACH,YAAY,GAAG,MAAM,EAA2B;;AAG/B,IAAA,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAA6B,gBAAgB;yFAAC;;AAG1F,IAAA,EAAE;;;IAIJ,GAAG,GAAQ,IAAI;;IAEf,OAAO,GAAU,EAAE;;AAGnB,IAAA,cAAc,GAAG,IAAI,GAAG,EAAU;IAClC,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;IACzB,mBAAmB,GAAG,MAAM,CAAC,KAAK;4FAAC;IACnC,4BAA4B,GAAG,MAAM,CAAgB,IAAI;qGAAC;;IAG1D,eAAe,GAAG,MAAM,CAAC,KAAK;wFAAC;IAC/B,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;yFAAC;IACzC,YAAY,GAAG,MAAM,CAAqB;AAChD,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,KAAK,EAAE,EAAE;AACV,KAAA;qFAAC;IACM,aAAa,GAAkB,IAAI;IACnC,qBAAqB,GAAoC,IAAI;;AAG3D,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AAClD,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACpD,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAG9C,IAAA,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;;AAG3C,IAAA,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC;;AAG1C,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;yFAAC;;IAG/E,WAAW,GAAG,EAAE;IAChB,6BAA6B,GAAG,GAAG;IACnC,yBAAyB,GAAG,WAAW;IACvC,uBAAuB,GAAG,EAAE;IAC5B,qBAAqB,GAAG,GAAG;IAC3B,mBAAmB,GAAG,GAAG;IACzB,oBAAoB,GAAG,GAAG;IAC1B,WAAW,GAAG,EAAE;IAChB,cAAc,GAAG,GAAG;IACpB,eAAe,GAAG,CAAC;AACnB,IAAA,UAAU,GAAG,qBAAqB,CAAC,UAAU,CAAC;AAC/D,IAAA,IAAY,qBAAqB,GAAA;AAC/B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,iBAAiB;IAC5C;;IAGU,iBAAiB,GAAG,QAAQ,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC;0FAAC;;AAG3G,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAyB;AAC3D,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;IAC1B,CAAC;uFAAC;;AAGQ,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC9B,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;IAC/C;;AAGU,IAAA,eAAe,CAAC,EAAU,EAAA;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IACpC;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QAEP,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE;AACf,QAAA,CAAC,CAAC;IACJ;AAEiB,IAAA,gBAAgB,GAAG,MAAM,CAAC,MAAK;;QAE9C,IAAI,CAAC,IAAI,EAAE;QACX,IAAI,CAAC,gBAAgB,EAAE;;QAGvB,SAAS,CAAC,MAAK;AACb,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACpB,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;IACJ,CAAC;yFAAC;AAEF;;;AAGG;AACH,IAAA,gBAAgB,CAAC,EAAiB,EAAA;QAChC,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAE7C,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE;YAAE;AAEhD,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGzC,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAEpE,QAAA,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,kBAAkB,EAAE;YACzB;QACF;;QAGA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;AAEvF,QAAA,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC3B;QACF;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrD;IAEQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAEf,QAAA,IAAI,CAAC;aACF,SAAS,CAAC,MAAM;AAChB,aAAA,OAAO,CAAC,4BAA4B,EAAE,KAAK;AAC3C,aAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK;AACtC,aAAA,UAAU,CAAC,IAAI,CAAC,yBAAyB;AACzC,aAAA,QAAQ,CAAC,IAAI,CAAC,6BAA6B;AAC3C,aAAA,IAAI,CAAC,WAAW,EAAE,IAAI;AACtB,aAAA,KAAK,CAAC,QAAQ,EAAE,IAAI;AACpB,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;AAEzC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEQ,IAAA,oBAAoB,CAAC,QAAgB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAEf,QAAA,IAAI,CAAC;aACF,SAAS,CAAC,MAAM;;AAEhB,aAAA,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,QAAQ;AAC3C,aAAA,OAAO,CAAC,4BAA4B,EAAE,KAAK;AAC3C,aAAA,OAAO,CAAC,uBAAuB,EAAE,IAAI;AACrC,aAAA,UAAU,CAAC,IAAI,CAAC,yBAAyB;AACzC,aAAA,QAAQ,CAAC,IAAI,CAAC,6BAA6B;AAC3C,aAAA,IAAI,CAAC,WAAW,EAAE,IAAI;AACtB,aAAA,KAAK,CAAC,QAAQ,EAAE,IAAI;AACpB,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;IAC1C;;AAGQ,IAAA,sBAAsB,CAAC,aAAkB,EAAA;QAC/C;AACG,aAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK;AACtC,aAAA,OAAO,CAAC,4BAA4B,EAAE,IAAI;AAC1C,aAAA,UAAU,CAAC,IAAI,CAAC,yBAAyB;AACzC,aAAA,QAAQ,CAAC,IAAI,CAAC,6BAA6B;aAC3C,KAAK,CAAC,QAAQ,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAC,qBAAqB,GAAG;AACrD,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3C;AAEQ,IAAA,kBAAkB,CAAC,SAAiB,EAAA;QAC1C,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI;IACvF;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,EAAU,EAAA;AACtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE;QACvC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE/F,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAE/B,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;;YAG9B,IAAI,YAAY,EAAE;;AAEhB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE;;AAE1C,oBAAA,IAAI,CAAC;0BACD,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;yBAC7C,SAAS,CAAC,oFAAoF;AAC9F,yBAAA,MAAM,EAAE;;oBAGX,UAAU,CAAC,MAAK;wBACd,IAAI,CAAC,WAAW,EAAE;oBACpB,CAAC,EAAE,CAAC,CAAC;gBACP;YACF;iBAAO;gBACL,IAAI,CAAC,WAAW,EAAE;YACpB;QACF;aAAO;;AAEL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,EAAE;QACpB;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;IAClC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;AACO,IAAA,MAAM,MAAM,GAAA;AACpB,QAAA,IAAI;YACF,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;;YAE5B,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAClD,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;QAC/C;IACF;AAEU,IAAA,cAAc,CAAC,IAAsB,EAAA;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA;;AAEG;IACI,WAAW,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;AAEzD,QAAA,IAAI;YACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;AAC9D,YAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAEjC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;YAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,EAAE;gBACxB;YACF;YAEA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,YAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,4BAA4B,EAAE;gBACnC;YACF;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,OAAO,CAAC;YACzE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC;QACrE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC;YACnD,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;AAEA;;AAEG;IACI,WAAW,GAAA;;AAEhB,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,SAAsB,EAAA;AACvC,QAAA,IAAI,CAAC;aACF,MAAM,CAAC,SAAS;aAChB,SAAS,CAAC,oFAAoF;AAC9F,aAAA,MAAM,EAAE;AACX,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACzC,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,EAAE;YACtE,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAC1B,SAAA,CAAC;IACJ;AAEA;;AAEG;IACK,4BAA4B,GAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACzC,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,EAAE;YACtE,IAAI,EAAE,QAAQ,CAAC,aAAa;YAC5B,KAAK,EAAE,QAAQ,CAAC,SAAS;YACzB,IAAI,EAAE,QAAQ,CAAC,aAAa;AAC7B,SAAA,CAAC;IACJ;AAEA;;AAEG;IACK,eAAe,CAAC,SAAsB,EAAE,OAA2B,EAAA;AACzE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AACzD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;AAE3D,QAAA,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK,IAAI,cAAc;AACrD,QAAA,MAAM,aAAa,GAAG,OAAO,EAAE,MAAM,IAAI,eAAe;;AAExD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAEpE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAChD;AAEA;;AAEG;AACK,IAAA,gBAAgB,CACtB,SAAsB,EACtB,KAAa,EACb,MAAc,EACd,WAA+B,EAAA;QAE/B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;;AAGpD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC;;QAG/D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,MAAM,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;;QAGtF,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC;;AAGjE,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IACrC;AAEA;;;AAGG;;AAEK,IAAA,oBAAoB,CAAC,SAAsB,EAAE,KAAa,EAAE,MAAc,EAAA;AAChF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;aACd,MAAM,CAAC,SAAS;aAChB,MAAM,CAAC,KAAK;AACZ,aAAA,IAAI,CAAC,OAAO,EAAE,MAAM;AACpB,aAAA,IAAI,CAAC,QAAQ,EAAE,MAAM;aACrB,IAAI,CAAC,SAAS,EAAE,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,EAAE;AACxC,aAAA,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAC;;QAG/C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAElG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;AACxG,QAAA,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QAErG,MAAM,mBAAmB,GAAG;aACzB,MAAM,CAAC,qBAAqB;AAC5B,aAAA,IAAI,CAAC,IAAI,EAAE,YAAY;AACvB,aAAA,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;AAE/B,QAAA,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;QAE/E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;AACxC,QAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;AACtD,QAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;AAEzD,QAAA,OAAO,GAAG;IACZ;AAEA;;AAEG;AACK,IAAA,mBAAmB,CACzB,UAAkB,EAClB,WAAmB,EACnB,IAAwB,EACxB,WAAmB,EAAA;AAEnB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGlC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;AACd,aAAA,GAAG;AACH,aAAA,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC;aAChD,IAAI,CAAC,IAAI;aACT,QAAQ,CAAC,IAAI,CAAC;;AAGjB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;;QAGxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,UAAU,GAAG,GAAG;QAClE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,iBAAiB,CAAC;AAEpD,QAAA,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI;AACjC,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW;AAE3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;AACd,aAAA,GAAG;aACH,WAAW,CAAC,WAAW;aACvB,WAAW,CAAC,WAAW;aACvB,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY,CAAC;AAErD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACnB,aAAA,GAAG;AACH,aAAA,WAAW,CAAC,WAAW,GAAG,SAAS,GAAG,CAAC;AACvC,aAAA,WAAW,CAAC,WAAW,GAAG,SAAS,GAAG,CAAC,CAAC;;QAG3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,iBAAiB;AACnE,QAAA,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC;;AAG3F,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;;AAGxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;aACnB,SAAS,CAAC,MAAM;AAChB,aAAA,IAAI,CAAC,IAAI,CAAC,OAAO;AACjB,aAAA,KAAK;aACL,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,wBAAwB;;AAEtC,aAAA,IAAI,CAAC,MAAM,EAAE,CAAC,CAAM,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,aAAA,KAAK,CAAC,SAAS,EAAE,CAAC;AAClB,aAAA,KAAK,CAAC,QAAQ,EAAE,SAAS;;aAEzB,EAAE,CAAC,YAAY,EAAE,CAAC,KAAiB,EAAE,CAAM,KAAI;AAC9C,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE;gBACvC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;YACtC;AACF,QAAA,CAAC;aACA,EAAE,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;AAChD,aAAA,EAAE,CAAC,WAAW,EAAE,CAAC,KAAiB,KAAI;AACrC,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACnC;AACF,QAAA,CAAC;;aAEA,EAAE,CAAC,OAAO,EAAE,CAAC,MAAkB,EAAE,CAAM,KAAI;AAC1C,YAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7B,QAAA,CAAC,CAAC;;AAGJ,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;QACvC,IAAI,SAAS,GAAG,CAAC;QACjB;AACG,aAAA,UAAU;aACV,QAAQ,CAAC,iBAAiB;aAC1B,IAAI,CAAC,eAAe;;AAEpB,aAAA,KAAK,CAAC,CAAC,EAAO,EAAE,CAAS,KAAK,CAAC,GAAG,IAAI,CAAC,uBAAuB;AAC9D,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe;;AAErC,aAAA,SAAS,CAAC,GAAG,EAAE,CAAC,CAAM,KAAI;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAChG,YAAA,OAAO,CAAC,CAAS,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAW;AACrD,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,KAAK,EAAE,MAAK;AACd,YAAA,SAAS,EAAE;AACX,YAAA,IAAI,SAAS,IAAI,WAAW,EAAE;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AACF,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,WAAW,EAAE,MAAK;;AAEpB,YAAA,SAAS,EAAE;AACX,YAAA,IAAI,SAAS,IAAI,WAAW,EAAE;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,2BAA2B,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE;AACvG,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC;QACxF;;AAGA,QAAA,IAAI,WAAW,KAAK,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;IAEQ,2BAA2B,CAAC,KAAa,EAAE,MAAc,EAAA;AAC/D,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,oBAAoB;IAC7D;;IAGQ,aAAa,CACnB,QAAa,EACb,WAAmB,EACnB,WAAmB,EACnB,WAAmB,EACnB,iBAAyB,EAAA;QAEzB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AAC/C,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC;AAClF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;aACjB,SAAS,CAAC,4BAA4B;aACtC,IAAI,CAAC,cAAc;AACnB,aAAA,KAAK;aACL,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,2BAA2B;AACzC,aAAA,KAAK,CAAC,SAAS,EAAE,CAAC;AAClB,aAAA,KAAK,CAAC,gBAAgB,EAAE,MAAM;AAC9B,aAAA,KAAK,CAAC,MAAM,EAAE,mDAAmD;AACjE,aAAA,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,KAAI;YACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrC,OAAO,CAAA,UAAA,EAAa,QAAQ,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG;AACpD,QAAA,CAAC;AACA,aAAA,IAAI,CAAC,aAAa,EAAE,QAAQ;AAC5B,aAAA,IAAI,CAAC,mBAAmB,EAAE,QAAQ;aAClC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAA,EAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA,EAAA,CAAI;AACtG,aAAA,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC;AACxG,aAAA,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAEpF;AACG,aAAA,UAAU;aACV,QAAQ,CAAC,iBAAiB;AAC1B,aAAA,KAAK,CAAC,CAAC,EAAE,EAAE,CAAS,KAAK,CAAC,GAAG,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,qBAAqB;AACtF,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3C;AAEA;;;;;;AAMG;;AAEK,IAAA,sBAAsB,CAAC,CAAM,EAAE,WAAmB,EAAE,WAAmB,EAAE,WAAmB,EAAA;QAClG,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU;AACvC,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;QAE9E,IAAI,iBAAiB,GAAG,CAAC;AAAE,YAAA,OAAO,CAAC;AAEnC,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW;AAC3C,QAAA,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,CAAC;AAC/C,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,IAAI,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,QAAQ;AAAE,YAAA,OAAO,CAAC;AAE7D,QAAA,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI;;AAGtC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,IAAI,iBAAiB,GAAG,EAAE,CAAC,CAAC;;QAGxE,MAAM,UAAU,GAAG,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC;AAE3C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,YAAY,EAAE,UAAU,CAAC;QAEnE,MAAM,aAAa,GAAG,EAAE;QACxB,MAAM,aAAa,GAAG,EAAE;QAExB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IACvF;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;QAC3B,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,CAAA,EAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7C,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;IAChC;AAEA;;;AAGG;;AAEK,IAAA,qBAAqB,CAAC,CAAM,EAAE,WAAmB,EAAE,WAAmB,EAAE,WAAmB,EAAA;AACjG,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;QACtF,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAE7B,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW;AAC3C,QAAA,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU;AACvC,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;AACzD,QAAA,MAAM,cAAc,GAAG,WAAW,GAAG,GAAG;AAExC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;QACvE,IAAI,UAAU,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;QAE7B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACxD,QAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,cAAc,CAAA,CAAA,CAAG,GAAG,cAAc;QAExE,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC;AAAE,YAAA,OAAO,QAAQ;QACzE,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC;AAAE,YAAA,OAAO,KAAK;QAC5E,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC;AAAE,YAAA,OAAO,cAAc;AACrF,QAAA,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC;QACzE,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC;IACzE;AAEA;;;AAGG;AACK,IAAA,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,cAAsB,EAAA;AACxE,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;;;QAIvB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI;QACpD,OAAO,cAAc,IAAI,cAAc;IACzC;AAEA;;;;AAIG;AACK,IAAA,iBAAiB,CAAC,IAAY,EAAE,QAAgB,EAAE,cAAsB,EAAA;AAC9E,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;;;AAIpB,QAAA,MAAM,cAAc,GAAG,QAAQ,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI;AAClD,QAAA,MAAM,SAAS,GAAG,QAAQ,GAAG,cAAc;;AAG3C,QAAA,MAAM,aAAa,GAAG,QAAQ,GAAG,GAAG;AACpC,QAAA,MAAM,gBAAgB,GAAG,cAAc,GAAG,aAAa;QAEvD,IAAI,gBAAgB,IAAI,CAAC;AAAE,YAAA,OAAO,EAAE;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAEzD,IAAI,QAAQ,IAAI,CAAC;AAAE,YAAA,OAAO,EAAE;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;AAAE,YAAA,OAAO,IAAI;;AAGxC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG;IACvD;AAEQ,IAAA,eAAe,CAAC,IAAsB,EAAA;QAC5C,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK;AAEjC,QAAA,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;AAC/D,QAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAE/E,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC;IAChE;AAEA;;AAEG;IACK,gBAAgB,CAAC,KAAiB,EAAE,KAAuB,EAAA;QACjE,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAAE;QAEhC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,KAAK,KAAK,EAAE;AACjD,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAChC;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;IACjC;IAEQ,WAAW,CAAC,KAAiB,EAAE,KAAuB,EAAA;AAC5D,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9G,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;QACpD,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QACzG,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAEzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACpB,YAAA,KAAK,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK;AACxC,YAAA,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC7B,UAAU,EAAE,CAAA,EAAG,UAAU,CAAA,CAAA,CAAG;YAC5B,KAAK;AACN,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;AAEA;;AAEG;IACK,kBAAkB,GAAA;QACxB,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAAE;AAEhC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;IAC7B;AAEQ,IAAA,qBAAqB,CAAC,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;AACnE,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB;AACzC,YAAA,IAAI,CAAC,MAAM;gBAAE;YACb,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;AAC1D,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,MAAM,aAAa,GAAG,WAAW,CAAC,qBAAqB,EAAE;YACzD,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,gBAAgB,CAAuB;AACnF,YAAA,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,qBAAqB,EAAE,GAAG,IAAI;YACxE,MAAM,GAAG,GAAG,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;AACpG,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACK,IAAA,gBAAgB,CAAC,YAAoB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,WAAW;;AAE7E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,GAAG,CAAC,CAAC;AAC5E,QAAA,MAAM,eAAe,GAAG,YAAY,GAAG,GAAG;;AAG1C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC;aACvB,MAAM,CAAC,GAAG;AACV,aAAA,IAAI,CAAC,OAAO,EAAE,8BAA8B;AAC5C,aAAA,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;;QAGhC;aACG,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,4BAA4B;AAC1C,aAAA,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,YAAY,KAAK;AACvC,aAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,aAAA,KAAK,CAAC,MAAM,EAAE,6CAA6C;AAC3D,aAAA,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;;QAGtC;aACG,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,4BAA4B;AAC1C,aAAA,IAAI,CAAC,IAAI,EAAE,OAAO;AAClB,aAAA,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,eAAe,KAAK;AAC1C,aAAA,KAAK,CAAC,MAAM,EAAE,6CAA6C;AAC3D,aAAA,KAAK,CAAC,SAAS,EAAE,KAAK;aACtB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,UAAU,IAAI,OAAO,CAAC;IACxD;AAEA;;AAEG;IACK,gBAAgB,GAAA;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;QACxD,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;AAEA;;AAEG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;AAC9B,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;AACxC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;AACA,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;QACxD,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC;kBACD,MAAM,CAAC,SAAS;iBACjB,SAAS,CAAC,oFAAoF;AAC9F,iBAAA,MAAM,EAAE;QACb;AAEA,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI;AACf,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7C;;;AAMA;;;AAGG;IACO,qBAAqB,GAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAElC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,uCAAuC;QAChD;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAC7C,MAAM,mBAAmB,GAAG;AACzB,aAAA,GAAG,CAAC,CAAC,OAAO,KAAI;YACf,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;YAC3G,OAAO,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA,EAAA,EAAK,OAAO,CAAC,KAAK,CAAA,EAAA,EAAK,UAAU,CAAA,EAAA,CAAI;AAC9D,QAAA,CAAC;aACA,IAAI,CAAC,IAAI,CAAC;QAEb,OAAO,CAAA,iBAAA,EAAoB,IAAI,CAAC,MAAM,2BAA2B,YAAY,CAAA,EAAA,EAAK,mBAAmB,CAAA,CAAE;IACzG;AAEA;;;AAGG;IACH,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAE7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA,QAAA,EAAW,KAAK,GAAG,CAAC,CAAA,CAAE;YAC1C,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACjC,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;YAC9D,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;AACtC,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,qBAAqB,CAAC,KAAa,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEQ,IAAA,cAAc,CAAC,IAAwB,EAAA;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF;AAEQ,IAAA,eAAe,CAAC,IAAwB,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD;IAEQ,oBAAoB,CAAC,YAAoB,EAAE,WAAmB,EAAA;QACpE,IAAI,WAAW,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,WAAW,IAAI,GAAG;IACvE;uGA93BW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7ClC,uUASA,EAAA,MAAA,EAAA,CAAA,+wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkCY,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAEtB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,iBAGX,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,uBAAuB,CAAC,EAAA,QAAA,EAAA,uUAAA,EAAA,MAAA,EAAA,CAAA,+wBAAA,CAAA,EAAA;wZA0BiD,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AErErG;;AAEG;;;;"}
|
|
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 _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 }\n });\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 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 containerRect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\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 if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\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 // computeTooltipPosition moved to shared chart utils\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":";;;;;AAIO,MAAM,yBAAyB,GAAuB;AAC3D,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,QAAQ,EAAE;AACR,QAAA,GAAG,yBAAyB;AAC5B,QAAA,UAAU,EAAE,uBAAuB;AACpC,KAAA;;MAGU,qBAAqB,GAAG,IAAI,cAAc,CAAqB,uBAAuB,EAAE;AACnG,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,yBAAyB;AACzC,CAAA;AAIK,SAAU,gBAAgB,CAAC,MAAA,GAAkC,EAAE,EAAA;IACnE,OAAO;AACL,QAAA,GAAG,yBAAyB;AAC5B,QAAA,GAAG,MAAM;AACT,QAAA,QAAQ,EAAE;YACR,GAAG,yBAAyB,CAAC,QAAQ;YACrC,GAAG,MAAM,CAAC,QAAQ;AACnB,SAAA;KACF;AACH;;ACCA;;;AAGG;AAQG,MAAO,qBACX,SAAQ,gBAAgB,CAAA;;AAIhB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;;;IAIvC,IAAI,GAAG,KAAK,CAAoB,EAAE;6EAAC;;IAGnC,OAAO,GAAG,KAAK,CAAqB,EAAE;gFAAC;;;IAIvC,YAAY,GAAG,MAAM,EAAoB;AAEzC;;AAEG;IACH,YAAY,GAAG,MAAM,EAA2B;;AAG/B,IAAA,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAA6B,gBAAgB;yFAAC;;AAG1F,IAAA,EAAE;;;IAIJ,GAAG,GAAQ,IAAI;;IAEf,OAAO,GAAU,EAAE;;AAGnB,IAAA,cAAc,GAAG,IAAI,GAAG,EAAU;IAClC,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;IACzB,mBAAmB,GAAG,MAAM,CAAC,KAAK;4FAAC;IACnC,4BAA4B,GAAG,MAAM,CAAgB,IAAI;qGAAC;;IAG1D,eAAe,GAAG,MAAM,CAAC,KAAK;wFAAC;IAC/B,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;yFAAC;IACzC,YAAY,GAAG,MAAM,CAAqB;AAChD,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,KAAK,EAAE,EAAE;AACV,KAAA;qFAAC;IACM,aAAa,GAAkB,IAAI;IACnC,qBAAqB,GAAoC,IAAI;;AAG3D,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AAClD,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACpD,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAG9C,IAAA,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;;AAG3C,IAAA,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC;;AAG1C,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;yFAAC;;IAG/E,WAAW,GAAG,EAAE;IAChB,6BAA6B,GAAG,GAAG;IACnC,yBAAyB,GAAG,WAAW;IACvC,uBAAuB,GAAG,EAAE;IAC5B,qBAAqB,GAAG,GAAG;IAC3B,mBAAmB,GAAG,GAAG;IACzB,oBAAoB,GAAG,GAAG;IAC1B,WAAW,GAAG,EAAE;IAChB,cAAc,GAAG,GAAG;IACpB,eAAe,GAAG,CAAC;AACnB,IAAA,UAAU,GAAG,qBAAqB,CAAC,UAAU,CAAC;AAC/D,IAAA,IAAY,qBAAqB,GAAA;AAC/B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,iBAAiB;IAC5C;;IAGU,iBAAiB,GAAG,QAAQ,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC;0FAAC;;AAG3G,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAyB;AAC3D,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;IAC1B,CAAC;uFAAC;;AAGQ,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC9B,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;IAC/C;;AAGU,IAAA,eAAe,CAAC,EAAU,EAAA;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IACpC;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QAEP,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE;AACf,QAAA,CAAC,CAAC;IACJ;AAEiB,IAAA,gBAAgB,GAAG,MAAM,CAAC,MAAK;;QAE9C,IAAI,CAAC,IAAI,EAAE;QACX,IAAI,CAAC,gBAAgB,EAAE;;QAGvB,SAAS,CAAC,MAAK;AACb,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACpB,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;IACJ,CAAC;yFAAC;AAEF;;;AAGG;AACH,IAAA,gBAAgB,CAAC,EAAiB,EAAA;QAChC,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAE7C,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE;YAAE;AAEhD,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGzC,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAEpE,QAAA,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,kBAAkB,EAAE;YACzB;QACF;;QAGA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;AAEvF,QAAA,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC3B;QACF;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrD;IAEQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAEf,QAAA,IAAI,CAAC;aACF,SAAS,CAAC,MAAM;AAChB,aAAA,OAAO,CAAC,4BAA4B,EAAE,KAAK;AAC3C,aAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK;AACtC,aAAA,UAAU,CAAC,IAAI,CAAC,yBAAyB;AACzC,aAAA,QAAQ,CAAC,IAAI,CAAC,6BAA6B;AAC3C,aAAA,IAAI,CAAC,WAAW,EAAE,IAAI;AACtB,aAAA,KAAK,CAAC,QAAQ,EAAE,IAAI;AACpB,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;AAEzC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEQ,IAAA,oBAAoB,CAAC,QAAgB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAEf,QAAA,IAAI,CAAC;aACF,SAAS,CAAC,MAAM;;AAEhB,aAAA,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,QAAQ;AAC3C,aAAA,OAAO,CAAC,4BAA4B,EAAE,KAAK;AAC3C,aAAA,OAAO,CAAC,uBAAuB,EAAE,IAAI;AACrC,aAAA,UAAU,CAAC,IAAI,CAAC,yBAAyB;AACzC,aAAA,QAAQ,CAAC,IAAI,CAAC,6BAA6B;AAC3C,aAAA,IAAI,CAAC,WAAW,EAAE,IAAI;AACtB,aAAA,KAAK,CAAC,QAAQ,EAAE,IAAI;AACpB,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;IAC1C;;AAGQ,IAAA,sBAAsB,CAAC,aAAkB,EAAA;QAC/C;AACG,aAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK;AACtC,aAAA,OAAO,CAAC,4BAA4B,EAAE,IAAI;AAC1C,aAAA,UAAU,CAAC,IAAI,CAAC,yBAAyB;AACzC,aAAA,QAAQ,CAAC,IAAI,CAAC,6BAA6B;aAC3C,KAAK,CAAC,QAAQ,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAC,qBAAqB,GAAG;AACrD,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3C;AAEQ,IAAA,kBAAkB,CAAC,SAAiB,EAAA;QAC1C,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI;IACvF;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,EAAU,EAAA;AACtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE;QACvC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE/F,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAE/B,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;;YAG9B,IAAI,YAAY,EAAE;;AAEhB,gBAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE;;AAE1C,oBAAA,IAAI,CAAC;0BACD,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;yBAC7C,SAAS,CAAC,oFAAoF;AAC9F,yBAAA,MAAM,EAAE;;oBAGX,UAAU,CAAC,MAAK;wBACd,IAAI,CAAC,WAAW,EAAE;oBACpB,CAAC,EAAE,CAAC,CAAC;gBACP;YACF;iBAAO;gBACL,IAAI,CAAC,WAAW,EAAE;YACpB;QACF;aAAO;;AAEL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,EAAE;QACpB;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;IAClC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;AAEG;AACO,IAAA,MAAM,MAAM,GAAA;AACpB,QAAA,IAAI;YACF,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;;YAE5B,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAClD,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;QAC/C;IACF;AAEU,IAAA,cAAc,CAAC,IAAsB,EAAA;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA;;AAEG;IACI,WAAW,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;AAEzD,QAAA,IAAI;YACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;AAC9D,YAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;AAEjC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;YAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,EAAE;gBACxB;YACF;YAEA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,YAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,4BAA4B,EAAE;gBACnC;YACF;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,OAAO,CAAC;YACzE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC;QACrE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC;YACnD,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;AAEA;;AAEG;IACI,WAAW,GAAA;;AAEhB,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,SAAsB,EAAA;AACvC,QAAA,IAAI,CAAC;aACF,MAAM,CAAC,SAAS;aAChB,SAAS,CAAC,oFAAoF;AAC9F,aAAA,MAAM,EAAE;AACX,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACzC,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,EAAE;YACtE,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAC1B,SAAA,CAAC;IACJ;AAEA;;AAEG;IACK,4BAA4B,GAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAAE;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACzC,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,EAAE;YACtE,IAAI,EAAE,QAAQ,CAAC,aAAa;YAC5B,KAAK,EAAE,QAAQ,CAAC,SAAS;YACzB,IAAI,EAAE,QAAQ,CAAC,aAAa;AAC7B,SAAA,CAAC;IACJ;AAEA;;AAEG;IACK,eAAe,CAAC,SAAsB,EAAE,OAA2B,EAAA;AACzE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AACzD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;AAE3D,QAAA,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK,IAAI,cAAc;AACrD,QAAA,MAAM,aAAa,GAAG,OAAO,EAAE,MAAM,IAAI,eAAe;;AAExD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAEpE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;IAChD;AAEA;;AAEG;AACK,IAAA,gBAAgB,CACtB,SAAsB,EACtB,KAAa,EACb,MAAc,EACd,WAA+B,EAAA;QAE/B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;;AAGpD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC;;QAG/D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,MAAM,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;;QAGtF,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC;;AAGjE,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IACrC;AAEA;;;AAGG;;AAEK,IAAA,oBAAoB,CAAC,SAAsB,EAAE,KAAa,EAAE,MAAc,EAAA;AAChF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;aACd,MAAM,CAAC,SAAS;aAChB,MAAM,CAAC,KAAK;AACZ,aAAA,IAAI,CAAC,OAAO,EAAE,MAAM;AACpB,aAAA,IAAI,CAAC,QAAQ,EAAE,MAAM;aACrB,IAAI,CAAC,SAAS,EAAE,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,EAAE;AACxC,aAAA,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAC;;QAG/C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAElG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;AACxG,QAAA,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QAErG,MAAM,mBAAmB,GAAG;aACzB,MAAM,CAAC,qBAAqB;AAC5B,aAAA,IAAI,CAAC,IAAI,EAAE,YAAY;AACvB,aAAA,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;AAE/B,QAAA,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;QAE/E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;AACxC,QAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;AACtD,QAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;AAEzD,QAAA,OAAO,GAAG;IACZ;AAEA;;AAEG;AACK,IAAA,mBAAmB,CACzB,UAAkB,EAClB,WAAmB,EACnB,IAAwB,EACxB,WAAmB,EAAA;AAEnB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGlC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;AACd,aAAA,GAAG;AACH,aAAA,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC;aAChD,IAAI,CAAC,IAAI;aACT,QAAQ,CAAC,IAAI,CAAC;;AAGjB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;;QAGxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,UAAU,GAAG,GAAG;QAClE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,iBAAiB,CAAC;AAEpD,QAAA,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI;AACjC,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW;AAE3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;AACd,aAAA,GAAG;aACH,WAAW,CAAC,WAAW;aACvB,WAAW,CAAC,WAAW;aACvB,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY,CAAC;AAErD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACnB,aAAA,GAAG;AACH,aAAA,WAAW,CAAC,WAAW,GAAG,SAAS,GAAG,CAAC;AACvC,aAAA,WAAW,CAAC,WAAW,GAAG,SAAS,GAAG,CAAC,CAAC;;QAG3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,iBAAiB;AACnE,QAAA,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC;;AAG3F,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;;AAGxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;aACnB,SAAS,CAAC,MAAM;AAChB,aAAA,IAAI,CAAC,IAAI,CAAC,OAAO;AACjB,aAAA,KAAK;aACL,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,wBAAwB;;AAEtC,aAAA,IAAI,CAAC,MAAM,EAAE,CAAC,CAAM,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,aAAA,KAAK,CAAC,SAAS,EAAE,CAAC;AAClB,aAAA,KAAK,CAAC,QAAQ,EAAE,SAAS;;aAEzB,EAAE,CAAC,YAAY,EAAE,CAAC,KAAiB,EAAE,CAAM,KAAI;AAC9C,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE;gBACvC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;YACtC;AACF,QAAA,CAAC;aACA,EAAE,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;AAChD,aAAA,EAAE,CAAC,WAAW,EAAE,CAAC,KAAiB,KAAI;AACrC,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACnC;AACF,QAAA,CAAC;;aAEA,EAAE,CAAC,OAAO,EAAE,CAAC,MAAkB,EAAE,CAAM,KAAI;AAC1C,YAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7B,QAAA,CAAC,CAAC;;AAGJ,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;QACvC,IAAI,SAAS,GAAG,CAAC;QACjB;AACG,aAAA,UAAU;aACV,QAAQ,CAAC,iBAAiB;aAC1B,IAAI,CAAC,eAAe;;AAEpB,aAAA,KAAK,CAAC,CAAC,EAAO,EAAE,CAAS,KAAK,CAAC,GAAG,IAAI,CAAC,uBAAuB;AAC9D,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe;;AAErC,aAAA,SAAS,CAAC,GAAG,EAAE,CAAC,CAAM,KAAI;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAChG,YAAA,OAAO,CAAC,CAAS,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAW;AACrD,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,KAAK,EAAE,MAAK;AACd,YAAA,SAAS,EAAE;AACX,YAAA,IAAI,SAAS,IAAI,WAAW,EAAE;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AACF,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,WAAW,EAAE,MAAK;;AAEpB,YAAA,SAAS,EAAE;AACX,YAAA,IAAI,SAAS,IAAI,WAAW,EAAE;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AACF,QAAA,CAAC,CAAC;;AAGJ,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,IAAI,IAAI,CAAC,2BAA2B,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE;AACvG,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC;QACxF;;AAGA,QAAA,IAAI,WAAW,KAAK,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;IAEQ,2BAA2B,CAAC,KAAa,EAAE,MAAc,EAAA;AAC/D,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,oBAAoB;IAC7D;;IAGQ,aAAa,CACnB,QAAa,EACb,WAAmB,EACnB,WAAmB,EACnB,WAAmB,EACnB,iBAAyB,EAAA;QAEzB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AAC/C,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC;AAClF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;aACjB,SAAS,CAAC,4BAA4B;aACtC,IAAI,CAAC,cAAc;AACnB,aAAA,KAAK;aACL,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,2BAA2B;AACzC,aAAA,KAAK,CAAC,SAAS,EAAE,CAAC;AAClB,aAAA,KAAK,CAAC,gBAAgB,EAAE,MAAM;AAC9B,aAAA,KAAK,CAAC,MAAM,EAAE,mDAAmD;AACjE,aAAA,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,KAAI;YACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrC,OAAO,CAAA,UAAA,EAAa,QAAQ,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG;AACpD,QAAA,CAAC;AACA,aAAA,IAAI,CAAC,aAAa,EAAE,QAAQ;AAC5B,aAAA,IAAI,CAAC,mBAAmB,EAAE,QAAQ;aAClC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAA,EAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA,EAAA,CAAI;AACtG,aAAA,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC;AACxG,aAAA,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAEpF;AACG,aAAA,UAAU;aACV,QAAQ,CAAC,iBAAiB;AAC1B,aAAA,KAAK,CAAC,CAAC,EAAE,EAAE,CAAS,KAAK,CAAC,GAAG,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,qBAAqB;AACtF,aAAA,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3C;AAEA;;;;;;AAMG;;AAEK,IAAA,sBAAsB,CAAC,CAAM,EAAE,WAAmB,EAAE,WAAmB,EAAE,WAAmB,EAAA;QAClG,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU;AACvC,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;QAE9E,IAAI,iBAAiB,GAAG,CAAC;AAAE,YAAA,OAAO,CAAC;AAEnC,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW;AAC3C,QAAA,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,CAAC;AAC/C,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,IAAI,WAAW,GAAG,SAAS,IAAI,SAAS,GAAG,QAAQ;AAAE,YAAA,OAAO,CAAC;AAE7D,QAAA,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI;;AAGtC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,IAAI,iBAAiB,GAAG,EAAE,CAAC,CAAC;;QAGxE,MAAM,UAAU,GAAG,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC;AAE3C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,YAAY,EAAE,UAAU,CAAC;QAEnE,MAAM,aAAa,GAAG,EAAE;QACxB,MAAM,aAAa,GAAG,EAAE;QAExB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IACvF;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;QAC3B,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,CAAA,EAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7C,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;IAChC;AAEA;;;AAGG;;AAEK,IAAA,qBAAqB,CAAC,CAAM,EAAE,WAAmB,EAAE,WAAmB,EAAE,WAAmB,EAAA;AACjG,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;QACtF,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAE7B,QAAA,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW;AAC3C,QAAA,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU;AACvC,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;AACzD,QAAA,MAAM,cAAc,GAAG,WAAW,GAAG,GAAG;AAExC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;QACvE,IAAI,UAAU,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;QAE7B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACxD,QAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,cAAc,CAAA,CAAA,CAAG,GAAG,cAAc;QAExE,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC;AAAE,YAAA,OAAO,QAAQ;QACzE,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC;AAAE,YAAA,OAAO,KAAK;QAC5E,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC;AAAE,YAAA,OAAO,cAAc;AACrF,QAAA,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC;QACzE,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC;IACzE;AAEA;;;AAGG;AACK,IAAA,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,cAAsB,EAAA;AACxE,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;;;QAIvB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI;QACpD,OAAO,cAAc,IAAI,cAAc;IACzC;AAEA;;;;AAIG;AACK,IAAA,iBAAiB,CAAC,IAAY,EAAE,QAAgB,EAAE,cAAsB,EAAA;AAC9E,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;;;AAIpB,QAAA,MAAM,cAAc,GAAG,QAAQ,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI;AAClD,QAAA,MAAM,SAAS,GAAG,QAAQ,GAAG,cAAc;;AAG3C,QAAA,MAAM,aAAa,GAAG,QAAQ,GAAG,GAAG;AACpC,QAAA,MAAM,gBAAgB,GAAG,cAAc,GAAG,aAAa;QAEvD,IAAI,gBAAgB,IAAI,CAAC;AAAE,YAAA,OAAO,EAAE;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAEzD,IAAI,QAAQ,IAAI,CAAC;AAAE,YAAA,OAAO,EAAE;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;AAAE,YAAA,OAAO,IAAI;;AAGxC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG;IACvD;AAEQ,IAAA,eAAe,CAAC,IAAsB,EAAA;QAC5C,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK;AAEjC,QAAA,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;AAC/D,QAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAE/E,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC;IAChE;AAEA;;AAEG;IACK,gBAAgB,CAAC,KAAiB,EAAE,KAAuB,EAAA;QACjE,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAAE;QAEhC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,KAAK,KAAK,EAAE;AACjD,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAChC;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;IACjC;IAEQ,WAAW,CAAC,KAAiB,EAAE,KAAuB,EAAA;AAC5D,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9G,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;QACpD,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QACzG,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAEzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACpB,YAAA,KAAK,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK;AACxC,YAAA,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC7B,UAAU,EAAE,CAAA,EAAG,UAAU,CAAA,CAAA,CAAG;YAC5B,KAAK;AACN,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;IACnC;AAEA;;AAEG;IACK,kBAAkB,GAAA;QACxB,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAAE;AAEhC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;IAC7B;AAEQ,IAAA,qBAAqB,CAAC,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;AACnE,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE;AAChC,QAAA,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjC;AAEQ,IAAA,uBAAuB,CAAC,OAAe,EAAA;AAC7C,QAAA,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,MAAK;AAC9C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB;YACzC,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;gBACzB;YACF;YAEA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;YAC1D,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;gBACzB;YACF;YAEA,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,gBAAgB,CAAuB;AACnF,YAAA,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE;AACvD,gBAAA,IAAI,CAAC,uBAAuB,CAAC,OAAO,GAAG,CAAC,CAAC;gBACzC;YACF;AAEA,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,MAAM,aAAa,GAAG,WAAW,CAAC,qBAAqB,EAAE;AACzD,YAAA,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,qBAAqB,EAAE,GAAG,IAAI;YACxE,MAAM,GAAG,GAAG,sBAAsB,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;AACpG,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACK,IAAA,gBAAgB,CAAC,YAAoB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QAEf,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,WAAW;;AAE7E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,GAAG,CAAC,CAAC;AAC5E,QAAA,MAAM,eAAe,GAAG,YAAY,GAAG,GAAG;;AAG1C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC;aACvB,MAAM,CAAC,GAAG;AACV,aAAA,IAAI,CAAC,OAAO,EAAE,8BAA8B;AAC5C,aAAA,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;;QAGhC;aACG,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,4BAA4B;AAC1C,aAAA,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,YAAY,KAAK;AACvC,aAAA,KAAK,CAAC,aAAa,EAAE,KAAK;AAC1B,aAAA,KAAK,CAAC,MAAM,EAAE,6CAA6C;AAC3D,aAAA,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;;QAGtC;aACG,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,4BAA4B;AAC1C,aAAA,IAAI,CAAC,IAAI,EAAE,OAAO;AAClB,aAAA,KAAK,CAAC,WAAW,EAAE,CAAA,EAAG,eAAe,KAAK;AAC1C,aAAA,KAAK,CAAC,MAAM,EAAE,6CAA6C;AAC3D,aAAA,KAAK,CAAC,SAAS,EAAE,KAAK;aACtB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,UAAU,IAAI,OAAO,CAAC;IACxD;AAEA;;AAEG;IACK,gBAAgB,GAAA;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;QACxD,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;AAEA;;AAEG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;AAC9B,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;AACxC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;AACA,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;QACxD,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC;kBACD,MAAM,CAAC,SAAS;iBACjB,SAAS,CAAC,oFAAoF;AAC9F,iBAAA,MAAM,EAAE;QACb;AAEA,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI;AACf,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7C;;;AAMA;;;AAGG;IACO,qBAAqB,GAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAElC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,uCAAuC;QAChD;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAC7C,MAAM,mBAAmB,GAAG;AACzB,aAAA,GAAG,CAAC,CAAC,OAAO,KAAI;YACf,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;YAC3G,OAAO,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA,EAAA,EAAK,OAAO,CAAC,KAAK,CAAA,EAAA,EAAK,UAAU,CAAA,EAAA,CAAI;AAC9D,QAAA,CAAC;aACA,IAAI,CAAC,IAAI,CAAC;QAEb,OAAO,CAAA,iBAAA,EAAoB,IAAI,CAAC,MAAM,2BAA2B,YAAY,CAAA,EAAA,EAAK,mBAAmB,CAAA,CAAE;IACzG;AAEA;;;AAGG;IACH,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAE7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA,QAAA,EAAW,KAAK,GAAG,CAAC,CAAA,CAAE;YAC1C,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACjC,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;YAC9D,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;AACtC,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,qBAAqB,CAAC,KAAa,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEQ,IAAA,cAAc,CAAC,IAAwB,EAAA;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF;AAEQ,IAAA,eAAe,CAAC,IAAwB,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD;IAEQ,oBAAoB,CAAC,YAAoB,EAAE,WAAmB,EAAA;QACpE,IAAI,WAAW,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,WAAW,IAAI,GAAG;IACvE;uGA/4BW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7ClC,uUASA,EAAA,MAAA,EAAA,CAAA,+wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkCY,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAEtB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,iBAGX,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,uBAAuB,CAAC,EAAA,QAAA,EAAA,uUAAA,EAAA,MAAA,EAAA,CAAA,+wBAAA,CAAA,EAAA;wZA0BiD,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AErErG;;AAEG;;;;"}
|
|
@@ -338,10 +338,18 @@ class AXFunnelChartComponent extends AXChartComponent {
|
|
|
338
338
|
updateTooltipPosition(event) {
|
|
339
339
|
if (this._tooltipRafId)
|
|
340
340
|
cancelAnimationFrame(this._tooltipRafId);
|
|
341
|
+
this.scheduleTooltipPosition(event, 0);
|
|
342
|
+
}
|
|
343
|
+
scheduleTooltipPosition(event, attempt) {
|
|
341
344
|
this._tooltipRafId = requestAnimationFrame(() => {
|
|
342
345
|
const containerEl = this.chartContainerEl().nativeElement;
|
|
343
|
-
const rect = containerEl.getBoundingClientRect();
|
|
344
346
|
const tooltipEl = containerEl.querySelector('.chart-tooltip');
|
|
347
|
+
if (!tooltipEl && this._tooltipVisible() && attempt < 3) {
|
|
348
|
+
this.scheduleTooltipPosition(event, attempt + 1);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
this._tooltipRafId = null;
|
|
352
|
+
const rect = containerEl.getBoundingClientRect();
|
|
345
353
|
const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;
|
|
346
354
|
this._tooltipPosition.set(computeTooltipPosition(rect, tooltipRect, event.clientX + 10, event.clientY - 10, 10));
|
|
347
355
|
});
|