@acorex/charts 20.3.48 → 20.4.0

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.
@@ -57,6 +57,15 @@ class AXChartTooltipComponent {
57
57
  }
58
58
  return typeof c === 'string' ? c : null;
59
59
  }
60
+ formattedValue() {
61
+ const v = this.data()?.value;
62
+ if (v == null)
63
+ return '';
64
+ if (typeof v === 'number')
65
+ return v.toLocaleString();
66
+ const num = Number(v);
67
+ return isNaN(num) ? v : num.toLocaleString();
68
+ }
60
69
  /**
61
70
  * Updates tooltip dimensions after it's rendered
62
71
  */
@@ -84,11 +93,11 @@ class AXChartTooltipComponent {
84
93
  };
85
94
  }
86
95
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXChartTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", 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 (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip\"\n [style.background-color]=\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\"\n [style.color]=\"data()!.tooltipColor || 'white'\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\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\">{{ data()!.value }}</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: [".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:200px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
96
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", 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 (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip\"\n [style.background-color]=\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\"\n [style.color]=\"data()!.tooltipColor || 'white'\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\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: [".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:250px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
88
97
  }
89
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXChartTooltipComponent, decorators: [{
90
99
  type: Component,
91
- args: [{ selector: 'ax-chart-tooltip', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip\"\n [style.background-color]=\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\"\n [style.color]=\"data()!.tooltipColor || 'white'\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\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\">{{ data()!.value }}</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: [".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:200px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\n"] }]
100
+ args: [{ selector: 'ax-chart-tooltip', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (visible() && data()) {\n <div\n #tooltipContainer\n class=\"chart-tooltip\"\n [style.background-color]=\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\"\n [style.color]=\"data()!.tooltipColor || 'white'\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n [ngStyle]=\"style()\"\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: [".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:250px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\n"] }]
92
101
  }], ctorParameters: () => [] });
93
102
 
94
103
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-chart-tooltip.mjs","sources":["../tmp-esm2022/chart-tooltip/lib/chart-tooltip.component.js","../tmp-esm2022/chart-tooltip/acorex-charts-chart-tooltip.js"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, NgZone, afterNextRender, inject, input, viewChild, } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class AXChartTooltipComponent {\n ngZone = inject(NgZone);\n data = input(null, ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n position = input({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"position\" }] : []));\n visible = input(false, ...(ngDevMode ? [{ debugName: \"visible\" }] : []));\n /**\n * Whether to show the tooltip's percentage badge\n */\n showPercentage = input(true, ...(ngDevMode ? [{ debugName: \"showPercentage\" }] : []));\n /**\n * Optional custom styling for the tooltip\n */\n style = input({}, ...(ngDevMode ? [{ debugName: \"style\" }] : []));\n /**\n * Reference to tooltip container for measuring dimensions\n */\n tooltipContainer = viewChild('tooltipContainer', ...(ngDevMode ? [{ debugName: \"tooltipContainer\" }] : []));\n // Tooltip dimensions\n tooltipWidth = 0;\n tooltipHeight = 0;\n constructor() {\n afterNextRender(() => {\n // Update tooltip dimensions when visible changes\n this.updateTooltipDimensions();\n });\n }\n // Helpers to support color as string | string[]\n isColorArray() {\n const color = this.data()?.color;\n return Array.isArray(color);\n }\n colorList() {\n const color = this.data()?.color;\n return Array.isArray(color) ? color : [];\n }\n singleColor() {\n const color = this.data()?.color;\n return typeof color === 'string' ? color : null;\n }\n isTitleArray() {\n const t = this.data()?.title;\n return Array.isArray(t);\n }\n titleList() {\n const t = this.data()?.title;\n return Array.isArray(t) ? t : [];\n }\n colorAt(index) {\n const c = this.data()?.color;\n if (Array.isArray(c)) {\n return c[index] ?? null;\n }\n return typeof c === 'string' ? c : null;\n }\n /**\n * Updates tooltip dimensions after it's rendered\n */\n updateTooltipDimensions() {\n if (this.visible() && this.tooltipContainer) {\n this.ngZone.runOutsideAngular(() => {\n // Use requestAnimationFrame to ensure dimensions are calculated after render\n requestAnimationFrame(() => {\n if (this.tooltipContainer()?.nativeElement) {\n this.tooltipWidth = this.tooltipContainer().nativeElement.offsetWidth;\n this.tooltipHeight = this.tooltipContainer().nativeElement.offsetHeight;\n }\n });\n });\n }\n }\n /**\n * Get adjusted tooltip position\n * Exposes properties for parent components to query tooltip dimensions\n */\n getDimensions() {\n return {\n width: this.tooltipWidth,\n height: this.tooltipHeight,\n };\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXChartTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.3\", 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 (visible() && data()) {\\n <div\\n #tooltipContainer\\n class=\\\"chart-tooltip\\\"\\n [style.background-color]=\\\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\\\"\\n [style.color]=\\\"data()!.tooltipColor || 'white'\\\"\\n [style.left.px]=\\\"position().x\\\"\\n [style.top.px]=\\\"position().y\\\"\\n [ngStyle]=\\\"style()\\\"\\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\\\">{{ data()!.value }}</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: [\".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:200px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXChartTooltipComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-chart-tooltip', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: \"@if (visible() && data()) {\\n <div\\n #tooltipContainer\\n class=\\\"chart-tooltip\\\"\\n [style.background-color]=\\\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\\\"\\n [style.color]=\\\"data()!.tooltipColor || 'white'\\\"\\n [style.left.px]=\\\"position().x\\\"\\n [style.top.px]=\\\"position().y\\\"\\n [ngStyle]=\\\"style()\\\"\\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\\\">{{ data()!.value }}</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: [\".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:200px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtdG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvY2hhcnQtdG9vbHRpcC9zcmMvbGliL2NoYXJ0LXRvb2x0aXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2NoYXJ0LXRvb2x0aXAvc3JjL2xpYi9jaGFydC10b29sdGlwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxNQUFNLEVBQ04sZUFBZSxFQUNmLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7QUFXdkIsTUFBTSxPQUFPLHVCQUF1QjtJQUMxQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWhDLElBQUksR0FBRyxLQUFLLENBQTRCLElBQUksZ0RBQUMsQ0FBQztJQUM5QyxRQUFRLEdBQUcsS0FBSyxDQUEyQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxvREFBQyxDQUFDO0lBQzNELE9BQU8sR0FBRyxLQUFLLENBQVUsS0FBSyxtREFBQyxDQUFDO0lBRWhDOztPQUVHO0lBQ0gsY0FBYyxHQUFHLEtBQUssQ0FBVSxJQUFJLDBEQUFDLENBQUM7SUFFdEM7O09BRUc7SUFDSCxLQUFLLEdBQUcsS0FBSyxDQUE0QixFQUFFLGlEQUFDLENBQUM7SUFFN0M7O09BRUc7SUFDSCxnQkFBZ0IsR0FBRyxTQUFTLENBQTZCLGtCQUFrQiw0REFBQyxDQUFDO0lBRTdFLHFCQUFxQjtJQUNYLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUU1QjtRQUNFLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsaURBQWlEO1lBQ2pELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdEQUFnRDtJQUN0QyxZQUFZO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFnQixDQUFDO1FBQzVDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRVMsU0FBUztRQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBZ0IsQ0FBQztRQUM1QyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLEtBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRVMsV0FBVztRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBZ0IsQ0FBQztRQUM1QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsS0FBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUM7SUFFUyxZQUFZO1FBQ3BCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFnQixDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRVMsU0FBUztRQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBZ0IsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFUyxPQUFPLENBQUMsS0FBYTtRQUM3QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBZ0IsQ0FBQztRQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFRLENBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDTyx1QkFBdUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pDLDZFQUE2RTtnQkFDN0UscUJBQXFCLENBQUMsR0FBRyxFQUFFO29CQUN6QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO3dCQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7d0JBQ3RFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztvQkFDMUUsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhO1FBQ1gsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDM0IsQ0FBQztJQUNKLENBQUM7dUdBN0ZVLHVCQUF1QjsyRkFBdkIsdUJBQXVCLDYxQkNyQnBDLDZuREFnREEsZ3JDRDlCWSxZQUFZOzsyRkFHWCx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0Usa0JBQWtCLGNBR2hCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE5nWm9uZSxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnLi9jaGFydC10b29sdGlwLnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1jaGFydC10b29sdGlwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LXRvb2x0aXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC10b29sdGlwLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhDaGFydFRvb2x0aXBDb21wb25lbnQge1xuICBwcml2YXRlIG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIGRhdGEgPSBpbnB1dDxBWENoYXJ0VG9vbHRpcERhdGEgfCBudWxsPihudWxsKTtcbiAgcG9zaXRpb24gPSBpbnB1dDx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+KHsgeDogMCwgeTogMCB9KTtcbiAgdmlzaWJsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSB0b29sdGlwJ3MgcGVyY2VudGFnZSBiYWRnZVxuICAgKi9cbiAgc2hvd1BlcmNlbnRhZ2UgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIHN0eWxpbmcgZm9yIHRoZSB0b29sdGlwXG4gICAqL1xuICBzdHlsZSA9IGlucHV0PHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KHt9KTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRvb2x0aXAgY29udGFpbmVyIGZvciBtZWFzdXJpbmcgZGltZW5zaW9uc1xuICAgKi9cbiAgdG9vbHRpcENvbnRhaW5lciA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ3Rvb2x0aXBDb250YWluZXInKTtcblxuICAvLyBUb29sdGlwIGRpbWVuc2lvbnNcbiAgcHJvdGVjdGVkIHRvb2x0aXBXaWR0aCA9IDA7XG4gIHByb3RlY3RlZCB0b29sdGlwSGVpZ2h0ID0gMDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgLy8gVXBkYXRlIHRvb2x0aXAgZGltZW5zaW9ucyB3aGVuIHZpc2libGUgY2hhbmdlc1xuICAgICAgdGhpcy51cGRhdGVUb29sdGlwRGltZW5zaW9ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVycyB0byBzdXBwb3J0IGNvbG9yIGFzIHN0cmluZyB8IHN0cmluZ1tdXG4gIHByb3RlY3RlZCBpc0NvbG9yQXJyYXkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmRhdGEoKT8uY29sb3IgYXMgdW5rbm93bjtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb2xvcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sb3JMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZGF0YSgpPy5jb2xvciBhcyB1bmtub3duO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbG9yKSA/IChjb2xvciBhcyBzdHJpbmdbXSkgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaW5nbGVDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZGF0YSgpPy5jb2xvciBhcyB1bmtub3duO1xuICAgIHJldHVybiB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnID8gKGNvbG9yIGFzIHN0cmluZykgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzVGl0bGVBcnJheSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ID0gdGhpcy5kYXRhKCk/LnRpdGxlIGFzIHVua25vd247XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGl0bGVMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0ID0gdGhpcy5kYXRhKCk/LnRpdGxlIGFzIHVua25vd247XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyAodCBhcyBzdHJpbmdbXSkgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2xvckF0KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjID0gdGhpcy5kYXRhKCk/LmNvbG9yIGFzIHVua25vd247XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIHJldHVybiAoYyBhcyBzdHJpbmdbXSlbaW5kZXhdID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyAoYyBhcyBzdHJpbmcpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRvb2x0aXAgZGltZW5zaW9ucyBhZnRlciBpdCdzIHJlbmRlcmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlVG9vbHRpcERpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlzaWJsZSgpICYmIHRoaXMudG9vbHRpcENvbnRhaW5lcikge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGVuc3VyZSBkaW1lbnNpb25zIGFyZSBjYWxjdWxhdGVkIGFmdGVyIHJlbmRlclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnRvb2x0aXBDb250YWluZXIoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy50b29sdGlwV2lkdGggPSB0aGlzLnRvb2x0aXBDb250YWluZXIoKS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgdGhpcy50b29sdGlwSGVpZ2h0ID0gdGhpcy50b29sdGlwQ29udGFpbmVyKCkubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWRqdXN0ZWQgdG9vbHRpcCBwb3NpdGlvblxuICAgKiBFeHBvc2VzIHByb3BlcnRpZXMgZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIHF1ZXJ5IHRvb2x0aXAgZGltZW5zaW9uc1xuICAgKi9cbiAgZ2V0RGltZW5zaW9ucygpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy50b29sdGlwV2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMudG9vbHRpcEhlaWdodCxcbiAgICB9O1xuICB9XG59XG4iLCJAaWYgKHZpc2libGUoKSAmJiBkYXRhKCkpIHtcbiAgPGRpdlxuICAgICN0b29sdGlwQ29udGFpbmVyXG4gICAgY2xhc3M9XCJjaGFydC10b29sdGlwXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJkYXRhKCkhLnRvb2x0aXBCZ0NvbG9yIHx8ICdyZ2JhKDMzLDMzLDMzLDAuOSknXCJcbiAgICBbc3R5bGUuY29sb3JdPVwiZGF0YSgpIS50b29sdGlwQ29sb3IgfHwgJ3doaXRlJ1wiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwicG9zaXRpb24oKS54XCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInBvc2l0aW9uKCkueVwiXG4gICAgW25nU3R5bGVdPVwic3R5bGUoKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1ib2R5XCI+XG4gICAgICAgIEBpZiAoIWlzVGl0bGVBcnJheSgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtdGl0bGUtcm93XCI+XG4gICAgICAgICAgICBAaWYgKHNpbmdsZUNvbG9yKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY29sb3JcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJzaW5nbGVDb2xvcigpIVwiPjwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtdGl0bGVcIj5cbiAgICAgICAgICAgICAge3sgZGF0YSgpIS50aXRsZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXRpdGxlLWxpc3RcIj5cbiAgICAgICAgICAgIEBmb3IgKHQgb2YgdGl0bGVMaXN0KCk7IGxldCBpID0gJGluZGV4OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAgICAgQGlmIChjb2xvckF0KGkpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC1jb2xvclwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNvbG9yQXQoaSkhXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0IH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtdmFsdWUtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtdmFsdWVcIj57eyBkYXRhKCkhLnZhbHVlIH19PC9kaXY+XG4gICAgICAgICAgQGlmIChzaG93UGVyY2VudGFnZSgpICYmIGRhdGEoKSEucGVyY2VudGFnZSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtcGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICB7eyBkYXRhKCkhLnBlcmNlbnRhZ2UgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1jaGFydC10b29sdGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2NoYXJ0LXRvb2x0aXAvc3JjL2Fjb3JleC1jaGFydHMtY2hhcnQtdG9vbHRpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-chart-tooltip.mjs","sources":["../tmp-esm2022/chart-tooltip/lib/chart-tooltip.component.js","../tmp-esm2022/chart-tooltip/acorex-charts-chart-tooltip.js"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, NgZone, afterNextRender, inject, input, viewChild, } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nexport class AXChartTooltipComponent {\n ngZone = inject(NgZone);\n data = input(null, ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n position = input({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"position\" }] : []));\n visible = input(false, ...(ngDevMode ? [{ debugName: \"visible\" }] : []));\n /**\n * Whether to show the tooltip's percentage badge\n */\n showPercentage = input(true, ...(ngDevMode ? [{ debugName: \"showPercentage\" }] : []));\n /**\n * Optional custom styling for the tooltip\n */\n style = input({}, ...(ngDevMode ? [{ debugName: \"style\" }] : []));\n /**\n * Reference to tooltip container for measuring dimensions\n */\n tooltipContainer = viewChild('tooltipContainer', ...(ngDevMode ? [{ debugName: \"tooltipContainer\" }] : []));\n // Tooltip dimensions\n tooltipWidth = 0;\n tooltipHeight = 0;\n constructor() {\n afterNextRender(() => {\n // Update tooltip dimensions when visible changes\n this.updateTooltipDimensions();\n });\n }\n // Helpers to support color as string | string[]\n isColorArray() {\n const color = this.data()?.color;\n return Array.isArray(color);\n }\n colorList() {\n const color = this.data()?.color;\n return Array.isArray(color) ? color : [];\n }\n singleColor() {\n const color = this.data()?.color;\n return typeof color === 'string' ? color : null;\n }\n isTitleArray() {\n const t = this.data()?.title;\n return Array.isArray(t);\n }\n titleList() {\n const t = this.data()?.title;\n return Array.isArray(t) ? t : [];\n }\n colorAt(index) {\n const c = this.data()?.color;\n if (Array.isArray(c)) {\n return c[index] ?? null;\n }\n return typeof c === 'string' ? c : null;\n }\n formattedValue() {\n const v = this.data()?.value;\n if (v == null)\n return '';\n if (typeof v === 'number')\n return v.toLocaleString();\n const num = Number(v);\n return isNaN(num) ? v : num.toLocaleString();\n }\n /**\n * Updates tooltip dimensions after it's rendered\n */\n updateTooltipDimensions() {\n if (this.visible() && this.tooltipContainer) {\n this.ngZone.runOutsideAngular(() => {\n // Use requestAnimationFrame to ensure dimensions are calculated after render\n requestAnimationFrame(() => {\n if (this.tooltipContainer()?.nativeElement) {\n this.tooltipWidth = this.tooltipContainer().nativeElement.offsetWidth;\n this.tooltipHeight = this.tooltipContainer().nativeElement.offsetHeight;\n }\n });\n });\n }\n }\n /**\n * Get adjusted tooltip position\n * Exposes properties for parent components to query tooltip dimensions\n */\n getDimensions() {\n return {\n width: this.tooltipWidth,\n height: this.tooltipHeight,\n };\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXChartTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.3\", 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 (visible() && data()) {\\n <div\\n #tooltipContainer\\n class=\\\"chart-tooltip\\\"\\n [style.background-color]=\\\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\\\"\\n [style.color]=\\\"data()!.tooltipColor || 'white'\\\"\\n [style.left.px]=\\\"position().x\\\"\\n [style.top.px]=\\\"position().y\\\"\\n [ngStyle]=\\\"style()\\\"\\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: [\".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:250px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: i1.NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXChartTooltipComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-chart-tooltip', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: \"@if (visible() && data()) {\\n <div\\n #tooltipContainer\\n class=\\\"chart-tooltip\\\"\\n [style.background-color]=\\\"data()!.tooltipBgColor || 'rgba(33,33,33,0.9)'\\\"\\n [style.color]=\\\"data()!.tooltipColor || 'white'\\\"\\n [style.left.px]=\\\"position().x\\\"\\n [style.top.px]=\\\"position().y\\\"\\n [ngStyle]=\\\"style()\\\"\\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: [\".chart-tooltip{pointer-events:none;position:absolute;z-index:10;max-width:250px;transform:translateY(-50%) translate(10px);border-radius:6px;border:1px solid rgba(255,255,255,.1);padding:8px 12px;font-size:.8rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:all .15s ease-in-out}.chart-tooltip-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.chart-tooltip-body{display:flex;flex-direction:column;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-title-row{display:flex;align-items:center;gap:6px;padding-bottom:8px}.chart-tooltip-title-list .chart-tooltip-title-row{padding-bottom:4px}.chart-tooltip-color{height:10px;width:10px;flex-shrink:0;border-radius:2px}.chart-tooltip-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.2}.chart-tooltip-value-row{display:flex;align-items:center;gap:8px}.chart-tooltip-value{flex-grow:1;font-weight:500}.chart-tooltip-percentage{flex-shrink:0;border-radius:9999px;background-color:#fff3;padding:2px 6px;font-size:.7rem;font-weight:500}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtdG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvY2hhcnQtdG9vbHRpcC9zcmMvbGliL2NoYXJ0LXRvb2x0aXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2NoYXJ0LXRvb2x0aXAvc3JjL2xpYi9jaGFydC10b29sdGlwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxNQUFNLEVBQ04sZUFBZSxFQUNmLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7QUFXdkIsTUFBTSxPQUFPLHVCQUF1QjtJQUMxQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWhDLElBQUksR0FBRyxLQUFLLENBQTRCLElBQUksZ0RBQUMsQ0FBQztJQUM5QyxRQUFRLEdBQUcsS0FBSyxDQUEyQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxvREFBQyxDQUFDO0lBQzNELE9BQU8sR0FBRyxLQUFLLENBQVUsS0FBSyxtREFBQyxDQUFDO0lBRWhDOztPQUVHO0lBQ0gsY0FBYyxHQUFHLEtBQUssQ0FBVSxJQUFJLDBEQUFDLENBQUM7SUFFdEM7O09BRUc7SUFDSCxLQUFLLEdBQUcsS0FBSyxDQUE0QixFQUFFLGlEQUFDLENBQUM7SUFFN0M7O09BRUc7SUFDSCxnQkFBZ0IsR0FBRyxTQUFTLENBQTZCLGtCQUFrQiw0REFBQyxDQUFDO0lBRTdFLHFCQUFxQjtJQUNYLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUU1QjtRQUNFLGVBQWUsQ0FB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WUFBWSxDQUFDO29CQUMxRSxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWE7UUFDWCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtTQUMzQixDQUFDO0lBQ0osQ0FBQzt1R0FyR1UsdUJBQXVCOzJGQUF2Qix1QkFBdUIsNjFCQ3JCcEMsZ29EQWdEQSxnckNEOUJZLFlBQVk7OzJGQUdYLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxrQkFBa0IsY0FHaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgTmdab25lLFxuICBhZnRlck5leHRSZW5kZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICcuL2NoYXJ0LXRvb2x0aXAudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWNoYXJ0LXRvb2x0aXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQtdG9vbHRpcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoYXJ0LXRvb2x0aXAuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCB7XG4gIHByaXZhdGUgbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgZGF0YSA9IGlucHV0PEFYQ2hhcnRUb29sdGlwRGF0YSB8IG51bGw+KG51bGwpO1xuICBwb3NpdGlvbiA9IGlucHV0PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4oeyB4OiAwLCB5OiAwIH0pO1xuICB2aXNpYmxlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRvb2x0aXAncyBwZXJjZW50YWdlIGJhZGdlXG4gICAqL1xuICBzaG93UGVyY2VudGFnZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gc3R5bGluZyBmb3IgdGhlIHRvb2x0aXBcbiAgICovXG4gIHN0eWxlID0gaW5wdXQ8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4oe30pO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdG9vbHRpcCBjb250YWluZXIgZm9yIG1lYXN1cmluZyBkaW1lbnNpb25zXG4gICAqL1xuICB0b29sdGlwQ29udGFpbmVyID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PigndG9vbHRpcENvbnRhaW5lcicpO1xuXG4gIC8vIFRvb2x0aXAgZGltZW5zaW9uc1xuICBwcm90ZWN0ZWQgdG9vbHRpcFdpZHRoID0gMDtcbiAgcHJvdGVjdGVkIHRvb2x0aXBIZWlnaHQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICAvLyBVcGRhdGUgdG9vbHRpcCBkaW1lbnNpb25zIHdoZW4gdmlzaWJsZSBjaGFuZ2VzXG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBEaW1lbnNpb25zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXJzIHRvIHN1cHBvcnQgY29sb3IgYXMgc3RyaW5nIHwgc3RyaW5nW11cbiAgcHJvdGVjdGVkIGlzQ29sb3JBcnJheSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZGF0YSgpPy5jb2xvciBhcyB1bmtub3duO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbG9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2xvckxpc3QoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5kYXRhKCk/LmNvbG9yIGFzIHVua25vd247XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29sb3IpID8gKGNvbG9yIGFzIHN0cmluZ1tdKSA6IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNpbmdsZUNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5kYXRhKCk/LmNvbG9yIGFzIHVua25vd247XG4gICAgcmV0dXJuIHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycgPyAoY29sb3IgYXMgc3RyaW5nKSA6IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNUaXRsZUFycmF5KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEoKT8udGl0bGUgYXMgdW5rbm93bjtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0aXRsZUxpc3QoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEoKT8udGl0bGUgYXMgdW5rbm93bjtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0KSA/ICh0IGFzIHN0cmluZ1tdKSA6IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbG9yQXQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGMgPSB0aGlzLmRhdGEoKT8uY29sb3IgYXMgdW5rbm93bjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkge1xuICAgICAgcmV0dXJuIChjIGFzIHN0cmluZ1tdKVtpbmRleF0gPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IChjIGFzIHN0cmluZykgOiBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IHRoaXMuZGF0YSgpPy52YWx1ZTtcbiAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgcmV0dXJuIHYudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodik7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyB2IDogbnVtLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0b29sdGlwIGRpbWVuc2lvbnMgYWZ0ZXIgaXQncyByZW5kZXJlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZVRvb2x0aXBEaW1lbnNpb25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpc2libGUoKSAmJiB0aGlzLnRvb2x0aXBDb250YWluZXIpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBlbnN1cmUgZGltZW5zaW9ucyBhcmUgY2FsY3VsYXRlZCBhZnRlciByZW5kZXJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy50b29sdGlwQ29udGFpbmVyKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcFdpZHRoID0gdGhpcy50b29sdGlwQ29udGFpbmVyKCkubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcEhlaWdodCA9IHRoaXMudG9vbHRpcENvbnRhaW5lcigpLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkanVzdGVkIHRvb2x0aXAgcG9zaXRpb25cbiAgICogRXhwb3NlcyBwcm9wZXJ0aWVzIGZvciBwYXJlbnQgY29tcG9uZW50cyB0byBxdWVyeSB0b29sdGlwIGRpbWVuc2lvbnNcbiAgICovXG4gIGdldERpbWVuc2lvbnMoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMudG9vbHRpcFdpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLnRvb2x0aXBIZWlnaHQsXG4gICAgfTtcbiAgfVxufVxuIiwiQGlmICh2aXNpYmxlKCkgJiYgZGF0YSgpKSB7XG4gIDxkaXZcbiAgICAjdG9vbHRpcENvbnRhaW5lclxuICAgIGNsYXNzPVwiY2hhcnQtdG9vbHRpcFwiXG4gICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiZGF0YSgpIS50b29sdGlwQmdDb2xvciB8fCAncmdiYSgzMywzMywzMywwLjkpJ1wiXG4gICAgW3N0eWxlLmNvbG9yXT1cImRhdGEoKSEudG9vbHRpcENvbG9yIHx8ICd3aGl0ZSdcIlxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBvc2l0aW9uKCkueFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJwb3NpdGlvbigpLnlcIlxuICAgIFtuZ1N0eWxlXT1cInN0eWxlKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtYm9keVwiPlxuICAgICAgICBAaWYgKCFpc1RpdGxlQXJyYXkoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgQGlmIChzaW5nbGVDb2xvcigpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLWNvbG9yXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2luZ2xlQ29sb3IoKSFcIj48L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXRpdGxlXCI+XG4gICAgICAgICAgICAgIHt7IGRhdGEoKSEudGl0bGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC10aXRsZS1saXN0XCI+XG4gICAgICAgICAgICBAZm9yICh0IG9mIHRpdGxlTGlzdCgpOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sb3JBdChpKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXRvb2x0aXAtY29sb3JcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2xvckF0KGkpIVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtdG9vbHRpcC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAge3sgdCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXZhbHVlLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXZhbHVlXCI+e3sgZm9ybWF0dGVkVmFsdWUoKSB9fTwvZGl2PlxuICAgICAgICAgIEBpZiAoc2hvd1BlcmNlbnRhZ2UoKSAmJiBkYXRhKCkhLnBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC10b29sdGlwLXBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAge3sgZGF0YSgpIS5wZXJjZW50YWdlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1jaGFydC10b29sdGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2NoYXJ0LXRvb2x0aXAvc3JjL2Fjb3JleC1jaGFydHMtY2hhcnQtdG9vbHRpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
@@ -74,6 +74,8 @@ class AXDonutChartComponent extends AXChartComponent {
74
74
  percentage: '0%',
75
75
  color: '',
76
76
  }, ...(ngDevMode ? [{ debugName: "_tooltipData" }] : []));
77
+ _tooltipRafId = null;
78
+ _pendingTooltipCoords = null;
77
79
  // Public computed properties for the template
78
80
  tooltipVisible = this._tooltipVisible.asReadonly();
79
81
  tooltipPosition = this._tooltipPosition.asReadonly();
@@ -402,17 +404,17 @@ class AXDonutChartComponent extends AXChartComponent {
402
404
  // Calculate inner radius based on donutWidth percentage
403
405
  const donutWidthPercent = this.effectiveOptions().donutWidth / 100;
404
406
  const innerRadius = radius * (1 - donutWidthPercent);
405
- // Create arc generator with the configured radius and corner radius
407
+ const outerRadius = radius * 0.95;
408
+ const ringWidth = outerRadius - innerRadius;
406
409
  const arc = this.d3
407
410
  .arc()
408
411
  .innerRadius(innerRadius)
409
- .outerRadius(radius * 0.95)
412
+ .outerRadius(outerRadius)
410
413
  .cornerRadius(this.effectiveOptions().cornerRadius);
411
- // Create label arc generator for placing labels (middle of the donut ring)
412
414
  const labelArc = this.d3
413
415
  .arc()
414
- .innerRadius(innerRadius + (radius * 0.95 - innerRadius) / 2)
415
- .outerRadius(innerRadius + (radius * 0.95 - innerRadius) / 2);
416
+ .innerRadius(innerRadius + ringWidth / 2)
417
+ .outerRadius(innerRadius + ringWidth / 2);
416
418
  // Get animation options
417
419
  const animationDuration = this.effectiveOptions().animationDuration;
418
420
  const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);
@@ -477,7 +479,7 @@ class AXDonutChartComponent extends AXChartComponent {
477
479
  });
478
480
  // Add data labels if enabled and chart size is sufficient
479
481
  if (this.effectiveOptions().showDataLabels && this.isChartLargeEnoughForLabels(chartWidth, chartHeight)) {
480
- this.addDataLabels(labelArc, radius, innerRadius, total, animationDuration);
482
+ this.addDataLabels(labelArc, outerRadius, innerRadius, total, animationDuration);
481
483
  }
482
484
  // Determine when all segment animations are complete (handle empty case)
483
485
  if (numSegments === 0) {
@@ -489,14 +491,11 @@ class AXDonutChartComponent extends AXChartComponent {
489
491
  return Math.min(width, height) >= this.MIN_CHART_FOR_LABELS;
490
492
  }
491
493
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
492
- addDataLabels(labelArc, radius, innerRadius, total, animationDuration) {
494
+ addDataLabels(labelArc, outerRadius, innerRadius, total, animationDuration) {
493
495
  if (!this.svg)
494
496
  return;
495
- const labelRadius = innerRadius + (radius * 0.95 - innerRadius) / 2;
496
- // Show labels for all segments with valid font size
497
497
  const dataWithLabels = this.pieData.filter((d) => {
498
- const fontSize = this.calculateLabelFontSize(d, radius, total, labelRadius);
499
- return fontSize > 0; // Only show if font size is valid
498
+ return this.calculateLabelFontSize(d, outerRadius, innerRadius, total) > 0;
500
499
  });
501
500
  const labels = this.svg
502
501
  .selectAll('.ax-donut-chart-data-label')
@@ -513,9 +512,9 @@ class AXDonutChartComponent extends AXChartComponent {
513
512
  })
514
513
  .attr('text-anchor', 'middle')
515
514
  .attr('dominant-baseline', 'middle')
516
- .style('font-size', (d) => `${this.calculateLabelFontSize(d, radius, total, labelRadius)}px`)
515
+ .style('font-size', (d) => `${this.calculateLabelFontSize(d, outerRadius, innerRadius, total)}px`)
517
516
  .style('font-weight', (d) => ((d.data.value / total) * 100 >= 15 ? '600' : '500'))
518
- .text((d) => this.getTruncatedLabelText(d, radius, labelRadius, total));
517
+ .text((d) => this.getTruncatedLabelText(d, outerRadius, innerRadius, total));
519
518
  labels
520
519
  .transition()
521
520
  .duration(animationDuration)
@@ -523,38 +522,34 @@ class AXDonutChartComponent extends AXChartComponent {
523
522
  .style('opacity', this.VISIBLE_OPACITY);
524
523
  }
525
524
  /**
526
- * Calculates optimal font size for label based on segment size
527
- * Uses smart dynamic sizing with readability constraints
525
+ * Calculates font size for data labels using the donut ring's physical dimensions.
526
+ *
527
+ * Primary driver is the ring width (radial space), with chord length as an
528
+ * overflow guard and a gentle scale-down for smaller segments to create
529
+ * visual hierarchy.
528
530
  */
529
531
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
530
- calculateLabelFontSize(d, radius, total, labelRadius) {
532
+ calculateLabelFontSize(d, outerRadius, innerRadius, total) {
531
533
  const angle = d.endAngle - d.startAngle;
532
534
  const segmentPercentage = (d.data.value / total) * 100;
533
- // Don't show labels for very small segments (< 1%)
534
- if (segmentPercentage < 1)
535
+ if (segmentPercentage < 2)
535
536
  return 0;
536
- // Calculate chord length (available horizontal space)
537
+ const ringWidth = outerRadius - innerRadius;
538
+ const labelRadius = innerRadius + ringWidth / 2;
537
539
  const chordLength = 2 * labelRadius * Math.sin(angle / 2);
538
- // Constants for font sizing
539
- const MIN_FONT_SIZE = 9; // Minimum readable size
540
- const MAX_FONT_SIZE = 14; // Maximum for aesthetics
541
- const MIN_CHORD_FOR_LABEL = 20; // Minimum space needed for any text
542
- // Don't show labels if space is too small
543
- if (chordLength < MIN_CHORD_FOR_LABEL)
540
+ const MIN_CHORD = 22;
541
+ const MIN_RING = 16;
542
+ if (chordLength < MIN_CHORD || ringWidth < MIN_RING)
544
543
  return 0;
545
- // Calculate font size based on multiple factors
546
- // 1. Based on arc angle (larger segments = larger font)
547
- const angleBasedSize = (angle * radius) / 8;
548
- // 2. Based on chord length (available horizontal space)
549
- const chordBasedSize = chordLength / 8;
550
- // 3. Based on segment percentage (proportional to data importance)
551
- const percentageBasedSize = 9 + (segmentPercentage / 100) * 5; // 9-14px range
552
- // Take the minimum of all calculations to ensure fit
553
- const calculatedSize = Math.min(angleBasedSize, chordBasedSize, percentageBasedSize);
554
- // Apply min/max constraints
555
- const finalSize = Math.max(MIN_FONT_SIZE, Math.min(calculatedSize, MAX_FONT_SIZE));
556
- // Round to .5 for crisp rendering
557
- return Math.round(finalSize * 2) / 2;
544
+ const ringBasedSize = ringWidth * 0.48;
545
+ // Segments >= 20% get full size; smaller ones scale from 0.75 → 1.0
546
+ const segmentScale = Math.min(1, 0.75 + 0.25 * (segmentPercentage / 20));
547
+ // At least 2 characters ("X%") must fit horizontally
548
+ const maxByChord = chordLength / (2 * 0.65);
549
+ const fontSize = Math.min(ringBasedSize * segmentScale, maxByChord);
550
+ const MIN_FONT_SIZE = 11;
551
+ const MAX_FONT_SIZE = 20;
552
+ return Math.round(Math.max(MIN_FONT_SIZE, Math.min(fontSize, MAX_FONT_SIZE)) * 2) / 2;
558
553
  }
559
554
  formatPercentage(value) {
560
555
  if (value < 1)
@@ -563,60 +558,34 @@ class AXDonutChartComponent extends AXChartComponent {
563
558
  return `${value.toFixed(1)}%`;
564
559
  return `${Math.round(value)}%`;
565
560
  }
566
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
567
- buildLabelText(d, total) {
568
- const percentage = (d.data.value / total) * 100;
569
- if (percentage < 1)
570
- return '';
571
- const label = d.data.label || '';
572
- const percentageText = this.formatPercentage(percentage);
573
- return label ? `${label} (${percentageText})` : percentageText;
574
- }
575
561
  /**
576
- * Truncates label text to fit within the arc segment
577
- * Uses smart truncation: tries full label, then label only, then percentage only, then truncated percentage
578
- * Calculates chord length (straight line) since text is rendered horizontally, not along the arc
562
+ * Returns the best-fit label text for a segment, progressively truncating
563
+ * from "Label (XX%)" "Label" "XX%" truncated label truncated percentage.
579
564
  */
580
565
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
581
- getTruncatedLabelText(d, radius, labelRadius, total) {
582
- const fontSize = this.calculateLabelFontSize(d, radius, total, labelRadius);
583
- // If font size is 0, segment is too small for labels
566
+ getTruncatedLabelText(d, outerRadius, innerRadius, total) {
567
+ const fontSize = this.calculateLabelFontSize(d, outerRadius, innerRadius, total);
584
568
  if (fontSize === 0)
585
569
  return '';
586
- // Calculate chord length (straight line distance) instead of arc length
587
- // Formula: chord = 2 * radius * sin(angle/2)
570
+ const ringWidth = outerRadius - innerRadius;
571
+ const labelRadius = innerRadius + ringWidth / 2;
588
572
  const angle = d.endAngle - d.startAngle;
589
573
  const chordLength = 2 * labelRadius * Math.sin(angle / 2);
590
- // Use chord length as available width with dynamic safety margin
591
- // Smaller segments need larger safety margins (percentage-based)
592
- const safetyMarginPercent = Math.max(0.15, Math.min(0.3, 1 / angle)); // 15-30% margin
593
- const availableWidth = chordLength * (1 - safetyMarginPercent);
574
+ const availableWidth = chordLength * 0.8;
594
575
  const percentage = (d.data.value / total) * 100;
595
- if (percentage < 1)
576
+ if (percentage < 2)
596
577
  return '';
597
578
  const label = d.data.label || '';
598
579
  const percentageText = this.formatPercentage(percentage);
599
- // Try different label formats in order of preference
600
580
  const fullText = label ? `${label} (${percentageText})` : percentageText;
601
- const labelOnly = label;
602
- const percentageOnly = percentageText;
603
- // 1. Try full text (label + percentage)
604
- if (this.doesTextFit(fullText, fontSize, availableWidth)) {
581
+ if (this.doesTextFit(fullText, fontSize, availableWidth))
605
582
  return fullText;
606
- }
607
- // 2. Try label only (if exists)
608
- if (label && this.doesTextFit(labelOnly, fontSize, availableWidth)) {
609
- return labelOnly;
610
- }
611
- // 3. Try percentage only
612
- if (this.doesTextFit(percentageOnly, fontSize, availableWidth)) {
613
- return percentageOnly;
614
- }
615
- // 4. Truncate the label with ellipsis
616
- if (label) {
583
+ if (label && this.doesTextFit(label, fontSize, availableWidth))
584
+ return label;
585
+ if (this.doesTextFit(percentageText, fontSize, availableWidth))
586
+ return percentageText;
587
+ if (label)
617
588
  return this.truncateTextToFit(label, fontSize, availableWidth);
618
- }
619
- // 5. Last resort: truncate percentage (very small segments)
620
589
  return this.truncateTextToFit(percentageText, fontSize, availableWidth);
621
590
  }
622
591
  /**
@@ -693,25 +662,27 @@ class AXDonutChartComponent extends AXChartComponent {
693
662
  handleSegmentLeave() {
694
663
  if (this._isInitialAnimating())
695
664
  return;
696
- // Hide tooltip
697
665
  this._tooltipVisible.set(false);
698
- this.cdr.detectChanges();
699
- // Clear all highlights to ensure segments return to normal state
700
666
  this.highlightSegment(null);
701
667
  }
702
- /**
703
- * Updates tooltip position
704
- * Ensures the tooltip is visible by adjusting position when near edges
705
- */
706
668
  updateTooltipPosition(event) {
707
- const containerEl = this.chartContainerEl()?.nativeElement;
708
- if (!containerEl)
669
+ this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };
670
+ if (this._tooltipRafId != null)
709
671
  return;
710
- const containerRect = containerEl.getBoundingClientRect();
711
- const tooltipEl = containerEl.querySelector('.chart-tooltip');
712
- const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;
713
- const pos = computeTooltipPosition(containerRect, tooltipRect, event.clientX, event.clientY, this.TOOLTIP_GAP);
714
- this._tooltipPosition.set(pos);
672
+ this._tooltipRafId = requestAnimationFrame(() => {
673
+ this._tooltipRafId = null;
674
+ const coords = this._pendingTooltipCoords;
675
+ if (!coords)
676
+ return;
677
+ const containerEl = this.chartContainerEl()?.nativeElement;
678
+ if (!containerEl)
679
+ return;
680
+ const containerRect = containerEl.getBoundingClientRect();
681
+ const tooltipEl = containerEl.querySelector('.chart-tooltip');
682
+ const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;
683
+ const pos = computeTooltipPosition(containerRect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);
684
+ this._tooltipPosition.set(pos);
685
+ });
715
686
  }
716
687
  /**
717
688
  * Adds center display with total value
@@ -759,6 +730,11 @@ class AXDonutChartComponent extends AXChartComponent {
759
730
  * Cleans up chart resources
760
731
  */
761
732
  cleanupChart() {
733
+ if (this._tooltipRafId != null) {
734
+ cancelAnimationFrame(this._tooltipRafId);
735
+ this._tooltipRafId = null;
736
+ }
737
+ this._pendingTooltipCoords = null;
762
738
  if (!this.svg)
763
739
  return;
764
740
  this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();