@acorex/charts 21.0.1-next.9 → 21.0.1-next.91
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 +37 -23
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-legend.mjs +4 -4
- package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs +13 -4
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +83 -99
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +365 -0
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts-gauge-chart.mjs +157 -86
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +393 -0
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -0
- package/fesm2022/acorex-charts-hierarchy-chart.mjs +4 -5
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +38 -27
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs +28 -4
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/funnel-chart/README.md +3 -0
- package/heatmap-chart/README.md +3 -0
- package/package.json +19 -13
- package/{bar-chart/index.d.ts → types/acorex-charts-bar-chart.d.ts} +7 -6
- package/{chart-tooltip/index.d.ts → types/acorex-charts-chart-tooltip.d.ts} +1 -0
- package/{donut-chart/index.d.ts → types/acorex-charts-donut-chart.d.ts} +12 -11
- package/types/acorex-charts-funnel-chart.d.ts +142 -0
- package/{gauge-chart/index.d.ts → types/acorex-charts-gauge-chart.d.ts} +16 -5
- package/types/acorex-charts-heatmap-chart.d.ts +148 -0
- package/{hierarchy-chart/index.d.ts → types/acorex-charts-hierarchy-chart.d.ts} +4 -3
- package/{line-chart/index.d.ts → types/acorex-charts-line-chart.d.ts} +5 -1
- package/{index.d.ts → types/acorex-charts.d.ts} +8 -1
- /package/{chart-legend/index.d.ts → types/acorex-charts-chart-legend.d.ts} +0 -0
|
@@ -75,13 +75,37 @@ class AXChartComponent {
|
|
|
75
75
|
getHostElement() {
|
|
76
76
|
return this.#elementRef.nativeElement;
|
|
77
77
|
}
|
|
78
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
79
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
78
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
79
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.3", type: AXChartComponent, isStandalone: true, ngImport: i0 });
|
|
80
80
|
}
|
|
81
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
81
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXChartComponent, decorators: [{
|
|
82
82
|
type: Directive
|
|
83
83
|
}] });
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Resolves any CSS `<color>` the browser understands — including
|
|
87
|
+
* `rgb(var(--token))`, `hsl(var(--token))`, `color-mix()`, etc. — to a computed
|
|
88
|
+
* `rgb()` / `rgba()` string, using the cascade from `scopeElement` (e.g. the chart
|
|
89
|
+
* container) so design tokens on ancestors apply.
|
|
90
|
+
*/
|
|
91
|
+
function resolveCssColorInContext(scopeElement, cssColor) {
|
|
92
|
+
if (typeof window === 'undefined' || typeof document === 'undefined' || !getComputedStyle) {
|
|
93
|
+
return cssColor;
|
|
94
|
+
}
|
|
95
|
+
const input = cssColor?.trim();
|
|
96
|
+
if (!input) {
|
|
97
|
+
return cssColor;
|
|
98
|
+
}
|
|
99
|
+
const probe = document.createElement('span');
|
|
100
|
+
probe.style.cssText =
|
|
101
|
+
'position:absolute;left:-9999px;top:-9999px;visibility:hidden;pointer-events:none;';
|
|
102
|
+
probe.style.color = input;
|
|
103
|
+
scopeElement.appendChild(probe);
|
|
104
|
+
void probe.offsetHeight;
|
|
105
|
+
const resolved = getComputedStyle(probe).color;
|
|
106
|
+
probe.remove();
|
|
107
|
+
return resolved || cssColor;
|
|
108
|
+
}
|
|
85
109
|
/**
|
|
86
110
|
* Compute edge-aware tooltip position with intelligent placement,
|
|
87
111
|
* considering available space in all directions and preventing overflow.
|
|
@@ -194,5 +218,5 @@ const AX_CHARTS = 'ACOREX_CHARTS';
|
|
|
194
218
|
* Generated bundle index. Do not edit.
|
|
195
219
|
*/
|
|
196
220
|
|
|
197
|
-
export { AXChartComponent, AX_CHARTS, AX_CHART_COLOR_PALETTE, computeTooltipPosition, formatLargeNumber, getChartColor, getEasingFunction, mapEasingName };
|
|
221
|
+
export { AXChartComponent, AX_CHARTS, AX_CHART_COLOR_PALETTE, computeTooltipPosition, formatLargeNumber, getChartColor, getEasingFunction, mapEasingName, resolveCssColorInContext };
|
|
198
222
|
//# sourceMappingURL=acorex-charts.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts.mjs","sources":["../tmp-esm2022/lib/chart-colors.js","../tmp-esm2022/lib/chart-component-base.js","../tmp-esm2022/lib/chart-utils.js","../tmp-esm2022/index.js","../tmp-esm2022/acorex-charts.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n// Default color palette for charts\nexport const AX_CHART_COLOR_PALETTE = new InjectionToken('AX_CHART_COLOR_PALETTE', {\n providedIn: 'root',\n factory: () => [\n '#FF6B6B', // Vibrant Red\n '#4ECDC4', // Electric Teal\n '#45B7D1', // Bright Blue\n '#96CEB4', // Fresh Green\n '#FFEEAD', // Bright Yellow\n '#D4A5A5', // Rose Pink\n '#9B59B6', // Rich Purple\n '#3498DB', // Deep Blue\n '#E67E22', // Bright Orange\n '#2ECC71', // Emerald Green\n '#E74C3C', // Cherry Red\n '#1ABC9C', // Turquoise\n '#F1C40F', // Golden Yellow\n '#8E44AD', // Deep Purple\n '#16A085', // Dark Teal\n // --- Extended Colors (new) ---\n '#27AE60', // Forest Green\n '#2980B9', // Strong Blue\n '#F39C12', // Vivid Orange\n '#C0392B', // Dark Red\n '#7D3C98', // Plum Purple\n '#2C3E50', // Midnight Blue\n '#D35400', // Burnt Orange\n '#BDC3C7', // Soft Silver\n '#34495E', // Slate Gray\n '#1F618D', // Royal Blue\n '#58D68D', // Mint Green\n '#5DADE2', // Sky Blue\n '#F1948A', // Soft Coral\n '#A569BD', // Lavender Purple\n '#F8C471', // Warm Gold\n ],\n});\n/**\n * Helper function to get a color from the palette by index\n * @param index The index of the color to get\n * @param palette The color palette to use\n * @returns The color at the specified index\n */\nexport function getChartColor(index, palette) {\n return palette[index % palette.length];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL3NyYy9saWIvY2hhcnQtY29sb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCx3QkFBd0IsRUFDeEI7SUFDRSxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixTQUFTLEVBQUUsY0FBYztRQUN6QixTQUFTLEVBQUUsZ0JBQWdCO1FBQzNCLFNBQVMsRUFBRSxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxnQkFBZ0I7UUFDM0IsU0FBUyxFQUFFLFlBQVk7UUFDdkIsU0FBUyxFQUFFLGNBQWM7UUFDekIsU0FBUyxFQUFFLFlBQVk7UUFDdkIsU0FBUyxFQUFFLGdCQUFnQjtRQUMzQixTQUFTLEVBQUUsZ0JBQWdCO1FBQzNCLFNBQVMsRUFBRSxhQUFhO1FBQ3hCLFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFNBQVMsRUFBRSxnQkFBZ0I7UUFDM0IsU0FBUyxFQUFFLGNBQWM7UUFDekIsU0FBUyxFQUFFLFlBQVk7UUFFdkIsZ0NBQWdDO1FBQ2hDLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFNBQVMsRUFBRSxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxlQUFlO1FBQzFCLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLFNBQVMsRUFBRSxjQUFjO1FBQ3pCLFNBQVMsRUFBRSxnQkFBZ0I7UUFDM0IsU0FBUyxFQUFFLGVBQWU7UUFDMUIsU0FBUyxFQUFFLGNBQWM7UUFDekIsU0FBUyxFQUFFLGFBQWE7UUFDeEIsU0FBUyxFQUFFLGFBQWE7UUFDeEIsU0FBUyxFQUFFLGFBQWE7UUFDeEIsU0FBUyxFQUFFLFdBQVc7UUFDdEIsU0FBUyxFQUFFLGFBQWE7UUFDeEIsU0FBUyxFQUFFLGtCQUFrQjtRQUM3QixTQUFTLEVBQUUsWUFBWTtLQUN4QjtDQUNGLENBQ0YsQ0FBQztBQUdGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFhLEVBQUUsT0FBaUI7SUFDNUQsT0FBTyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLy8gRGVmYXVsdCBjb2xvciBwYWxldHRlIGZvciBjaGFydHNcbmV4cG9ydCBjb25zdCBBWF9DSEFSVF9DT0xPUl9QQUxFVFRFID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZ1tdPihcbiAgJ0FYX0NIQVJUX0NPTE9SX1BBTEVUVEUnLFxuICB7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAgIGZhY3Rvcnk6ICgpID0+IFtcbiAgICAgICcjRkY2QjZCJywgLy8gVmlicmFudCBSZWRcbiAgICAgICcjNEVDREM0JywgLy8gRWxlY3RyaWMgVGVhbFxuICAgICAgJyM0NUI3RDEnLCAvLyBCcmlnaHQgQmx1ZVxuICAgICAgJyM5NkNFQjQnLCAvLyBGcmVzaCBHcmVlblxuICAgICAgJyNGRkVFQUQnLCAvLyBCcmlnaHQgWWVsbG93XG4gICAgICAnI0Q0QTVBNScsIC8vIFJvc2UgUGlua1xuICAgICAgJyM5QjU5QjYnLCAvLyBSaWNoIFB1cnBsZVxuICAgICAgJyMzNDk4REInLCAvLyBEZWVwIEJsdWVcbiAgICAgICcjRTY3RTIyJywgLy8gQnJpZ2h0IE9yYW5nZVxuICAgICAgJyMyRUNDNzEnLCAvLyBFbWVyYWxkIEdyZWVuXG4gICAgICAnI0U3NEMzQycsIC8vIENoZXJyeSBSZWRcbiAgICAgICcjMUFCQzlDJywgLy8gVHVycXVvaXNlXG4gICAgICAnI0YxQzQwRicsIC8vIEdvbGRlbiBZZWxsb3dcbiAgICAgICcjOEU0NEFEJywgLy8gRGVlcCBQdXJwbGVcbiAgICAgICcjMTZBMDg1JywgLy8gRGFyayBUZWFsXG5cbiAgICAgIC8vIC0tLSBFeHRlbmRlZCBDb2xvcnMgKG5ldykgLS0tXG4gICAgICAnIzI3QUU2MCcsIC8vIEZvcmVzdCBHcmVlblxuICAgICAgJyMyOTgwQjknLCAvLyBTdHJvbmcgQmx1ZVxuICAgICAgJyNGMzlDMTInLCAvLyBWaXZpZCBPcmFuZ2VcbiAgICAgICcjQzAzOTJCJywgLy8gRGFyayBSZWRcbiAgICAgICcjN0QzQzk4JywgLy8gUGx1bSBQdXJwbGVcbiAgICAgICcjMkMzRTUwJywgLy8gTWlkbmlnaHQgQmx1ZVxuICAgICAgJyNEMzU0MDAnLCAvLyBCdXJudCBPcmFuZ2VcbiAgICAgICcjQkRDM0M3JywgLy8gU29mdCBTaWx2ZXJcbiAgICAgICcjMzQ0OTVFJywgLy8gU2xhdGUgR3JheVxuICAgICAgJyMxRjYxOEQnLCAvLyBSb3lhbCBCbHVlXG4gICAgICAnIzU4RDY4RCcsIC8vIE1pbnQgR3JlZW5cbiAgICAgICcjNURBREUyJywgLy8gU2t5IEJsdWVcbiAgICAgICcjRjE5NDhBJywgLy8gU29mdCBDb3JhbFxuICAgICAgJyNBNTY5QkQnLCAvLyBMYXZlbmRlciBQdXJwbGVcbiAgICAgICcjRjhDNDcxJywgLy8gV2FybSBHb2xkXG4gICAgXSxcbiAgfVxuKTtcblxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYSBjb2xvciBmcm9tIHRoZSBwYWxldHRlIGJ5IGluZGV4XG4gKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2xvciB0byBnZXRcbiAqIEBwYXJhbSBwYWxldHRlIFRoZSBjb2xvciBwYWxldHRlIHRvIHVzZVxuICogQHJldHVybnMgVGhlIGNvbG9yIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYXJ0Q29sb3IoaW5kZXg6IG51bWJlciwgcGFsZXR0ZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gcGFsZXR0ZVtpbmRleCAlIHBhbGV0dGUubGVuZ3RoXTtcbn1cbiJdfQ==","import { afterNextRender, Directive, ElementRef, inject, signal } from '@angular/core';\nimport * as i0 from \"@angular/core\";\n/**\n * Base component class for all chart components\n * Copied from @acorex/cdk/common NXComponent to remove external dependency\n */\nexport class AXChartComponent {\n #elementRef = inject(ElementRef);\n #isRendered = signal(false, ...(ngDevMode ? [{ debugName: \"#isRendered\" }] : []));\n isRendered = this.#isRendered.asReadonly();\n #afterNextRender = afterNextRender(() => {\n if (!this.isRendered()) {\n this.nativeElement['__axContext__'] = this;\n this.#isRendered.set(true);\n }\n });\n /**\n * Gets the native HTML element of the component\n */\n get nativeElement() {\n return this.#elementRef.nativeElement;\n }\n /**\n * Gets the host HTML element of the component (alias for nativeElement)\n * @returns T - The native DOM element associated with this component\n */\n getHostElement() {\n return this.#elementRef.nativeElement;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: AXChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.15\", type: AXChartComponent, isStandalone: true, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.15\", ngImport: i0, type: AXChartComponent, decorators: [{\n type: Directive\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtY29tcG9uZW50LWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvc3JjL2xpYi9jaGFydC1jb21wb25lbnQtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFdkY7OztHQUdHO0FBRUgsTUFBTSxPQUFnQixnQkFBZ0I7SUFDcEMsV0FBVyxHQUE0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLHVEQUFDLENBQUM7SUFFbEIsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFckQsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRTtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBa0IsQ0FBQztJQUM3QyxDQUFDO3dHQTFCbUIsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRHJDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZnRlck5leHRSZW5kZXIsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBCYXNlIGNvbXBvbmVudCBjbGFzcyBmb3IgYWxsIGNoYXJ0IGNvbXBvbmVudHNcbiAqIENvcGllZCBmcm9tIEBhY29yZXgvY2RrL2NvbW1vbiBOWENvbXBvbmVudCB0byByZW1vdmUgZXh0ZXJuYWwgZGVwZW5kZW5jeVxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBWENoYXJ0Q29tcG9uZW50IHtcbiAgI2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAjaXNSZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIGlzUmVuZGVyZWQgPSB0aGlzLiNpc1JlbmRlcmVkLmFzUmVhZG9ubHkoKTtcblxuICAjYWZ0ZXJOZXh0UmVuZGVyID0gYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuaXNSZW5kZXJlZCgpKSB7XG4gICAgICB0aGlzLm5hdGl2ZUVsZW1lbnRbJ19fYXhDb250ZXh0X18nXSA9IHRoaXM7XG4gICAgICB0aGlzLiNpc1JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYXRpdmUgSFRNTCBlbGVtZW50IG9mIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBob3N0IEhUTUwgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IChhbGlhcyBmb3IgbmF0aXZlRWxlbWVudClcbiAgICogQHJldHVybnMgVCAtIFRoZSBuYXRpdmUgRE9NIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0SG9zdEVsZW1lbnQ8VCA9IEhUTUxFbGVtZW50PigpOiBUIHtcbiAgICByZXR1cm4gdGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIFQ7XG4gIH1cbn1cbiJdfQ==","/**\n * Compute edge-aware tooltip position with intelligent placement,\n * considering available space in all directions and preventing overflow.\n */\nexport function computeTooltipPosition(containerRect, tooltipRect, clientX, clientY, gap) {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n if (!tooltipRect) {\n return {\n x: Math.min(cursorX + gap, containerRect.width - gap),\n y: Math.max(gap, Math.min(cursorY, containerRect.height - gap)),\n };\n }\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n // Determine best horizontal position\n let x;\n if (spaceRight >= tooltipRect.width + gap) {\n // Position to the right of cursor\n x = cursorX + gap;\n }\n else if (spaceLeft >= tooltipRect.width + gap) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - gap;\n }\n else {\n // Center horizontally if neither side has enough space\n x = Math.max(gap, Math.min((containerRect.width - tooltipRect.width) / 2, containerRect.width - tooltipRect.width - gap));\n }\n // Determine best vertical position\n let y;\n if (spaceBelow >= tooltipRect.height + gap) {\n // Position below cursor\n y = cursorY + gap;\n }\n else if (spaceAbove >= tooltipRect.height + gap) {\n // Position above cursor\n y = cursorY - tooltipRect.height - gap;\n }\n else {\n // Center vertically if neither direction has enough space\n y = Math.max(gap, Math.min((containerRect.height - tooltipRect.height) / 2, containerRect.height - tooltipRect.height - gap));\n }\n // Ensure tooltip stays within container bounds\n x = Math.max(gap, Math.min(x, containerRect.width - tooltipRect.width - gap));\n y = Math.max(gap, Math.min(y, containerRect.height - tooltipRect.height - gap));\n return { x, y };\n}\nexport function mapEasingName(option) {\n switch (option) {\n case 'linear':\n return 'easeLinear';\n case 'ease':\n return 'easePolyInOut';\n case 'ease-in':\n return 'easePolyIn';\n case 'ease-out':\n return 'easePolyOut';\n case 'ease-in-out':\n return 'easePolyInOut';\n case 'cubic':\n return 'easeCubic';\n case 'cubic-in':\n return 'easeCubicIn';\n case 'cubic-out':\n return 'easeCubicOut';\n case 'cubic-in-out':\n return 'easeCubicInOut';\n default:\n return 'easeCubicOut';\n }\n}\n/**\n * Formats large numbers with abbreviations (K, M, B, T)\n */\nexport function formatLargeNumber(value) {\n if (value === 0)\n return '0';\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n if (absValue >= 1e12) {\n return `${sign}${(absValue / 1e12).toFixed(1)}T`;\n }\n if (absValue >= 1e9) {\n return `${sign}${(absValue / 1e9).toFixed(1)}B`;\n }\n if (absValue >= 1e6) {\n return `${sign}${(absValue / 1e6).toFixed(1)}M`;\n }\n if (absValue >= 1e3) {\n return `${sign}${(absValue / 1e3).toFixed(1)}K`;\n }\n return value.toLocaleString();\n}\n/**\n * Returns a D3 easing function for the provided option.\n */\nexport function getEasingFunction(d3, option) {\n const name = mapEasingName(option);\n const easing = d3[name];\n return typeof easing === 'function' ? easing : d3.easeCubicOut;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvc3JjL2xpYi9jaGFydC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLGFBQXNCLEVBQ3RCLFdBQTJCLEVBQzNCLE9BQWUsRUFDZixPQUFlLEVBQ2YsR0FBVztJQUVYLE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO0lBRTVDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxhQUFhLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNyRCxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNoRSxDQUFDO0lBQ0osQ0FBQztJQUVELDhDQUE4QztJQUM5QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUNqRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDMUIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDbEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBRTNCLHFDQUFxQztJQUNyQyxJQUFJLENBQVMsQ0FBQztJQUNkLElBQUksVUFBVSxJQUFJLFdBQVcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDMUMsa0NBQWtDO1FBQ2xDLENBQUMsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7U0FBTSxJQUFJLFNBQVMsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2hELGlDQUFpQztRQUNqQyxDQUFDLEdBQUcsT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ3hDLENBQUM7U0FBTSxDQUFDO1FBQ04sdURBQXVEO1FBQ3ZELENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNWLEdBQUcsRUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FDdkcsQ0FBQztJQUNKLENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFTLENBQUM7SUFDZCxJQUFJLFVBQVUsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzNDLHdCQUF3QjtRQUN4QixDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO1NBQU0sSUFBSSxVQUFVLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNsRCx3QkFBd0I7UUFDeEIsQ0FBQyxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN6QyxDQUFDO1NBQU0sQ0FBQztRQUNOLDBEQUEwRDtRQUMxRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDVixHQUFHLEVBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQzNHLENBQUM7SUFDSixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFaEYsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBZ0JELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBZTtJQUMzQyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQ2YsS0FBSyxRQUFRO1lBQ1gsT0FBTyxZQUFZLENBQUM7UUFDdEIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxlQUFlLENBQUM7UUFDekIsS0FBSyxTQUFTO1lBQ1osT0FBTyxZQUFZLENBQUM7UUFDdEIsS0FBSyxVQUFVO1lBQ2IsT0FBTyxhQUFhLENBQUM7UUFDdkIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLEtBQUssT0FBTztZQUNWLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLEtBQUssVUFBVTtZQUNiLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLEtBQUssV0FBVztZQUNkLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLEtBQUssY0FBYztZQUNqQixPQUFPLGdCQUFnQixDQUFDO1FBQzFCO1lBQ0UsT0FBTyxjQUFjLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksS0FBSyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUU1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRWxDLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbkQsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUF1QixFQUFFLE1BQWU7SUFDeEUsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sTUFBTSxHQUFJLEVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxPQUFPLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFVLENBQUMsWUFBWSxDQUFDO0FBQzFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBUb29sdGlwUG9zaXRpb24gPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG5cbi8qKlxuICogQ29tcHV0ZSBlZGdlLWF3YXJlIHRvb2x0aXAgcG9zaXRpb24gd2l0aCBpbnRlbGxpZ2VudCBwbGFjZW1lbnQsXG4gKiBjb25zaWRlcmluZyBhdmFpbGFibGUgc3BhY2UgaW4gYWxsIGRpcmVjdGlvbnMgYW5kIHByZXZlbnRpbmcgb3ZlcmZsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKFxuICBjb250YWluZXJSZWN0OiBET01SZWN0LFxuICB0b29sdGlwUmVjdDogRE9NUmVjdCB8IG51bGwsXG4gIGNsaWVudFg6IG51bWJlcixcbiAgY2xpZW50WTogbnVtYmVyLFxuICBnYXA6IG51bWJlcixcbik6IFRvb2x0aXBQb3NpdGlvbiB7XG4gIGNvbnN0IGN1cnNvclggPSBjbGllbnRYIC0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICBjb25zdCBjdXJzb3JZID0gY2xpZW50WSAtIGNvbnRhaW5lclJlY3QudG9wO1xuXG4gIGlmICghdG9vbHRpcFJlY3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5taW4oY3Vyc29yWCArIGdhcCwgY29udGFpbmVyUmVjdC53aWR0aCAtIGdhcCksXG4gICAgICB5OiBNYXRoLm1heChnYXAsIE1hdGgubWluKGN1cnNvclksIGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gZ2FwKSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBhdmFpbGFibGUgc3BhY2UgaW4gZWFjaCBkaXJlY3Rpb25cbiAgY29uc3Qgc3BhY2VSaWdodCA9IGNvbnRhaW5lclJlY3Qud2lkdGggLSBjdXJzb3JYO1xuICBjb25zdCBzcGFjZUxlZnQgPSBjdXJzb3JYO1xuICBjb25zdCBzcGFjZUJlbG93ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgLSBjdXJzb3JZO1xuICBjb25zdCBzcGFjZUFib3ZlID0gY3Vyc29yWTtcblxuICAvLyBEZXRlcm1pbmUgYmVzdCBob3Jpem9udGFsIHBvc2l0aW9uXG4gIGxldCB4OiBudW1iZXI7XG4gIGlmIChzcGFjZVJpZ2h0ID49IHRvb2x0aXBSZWN0LndpZHRoICsgZ2FwKSB7XG4gICAgLy8gUG9zaXRpb24gdG8gdGhlIHJpZ2h0IG9mIGN1cnNvclxuICAgIHggPSBjdXJzb3JYICsgZ2FwO1xuICB9IGVsc2UgaWYgKHNwYWNlTGVmdCA+PSB0b29sdGlwUmVjdC53aWR0aCArIGdhcCkge1xuICAgIC8vIFBvc2l0aW9uIHRvIHRoZSBsZWZ0IG9mIGN1cnNvclxuICAgIHggPSBjdXJzb3JYIC0gdG9vbHRpcFJlY3Qud2lkdGggLSBnYXA7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2VudGVyIGhvcml6b250YWxseSBpZiBuZWl0aGVyIHNpZGUgaGFzIGVub3VnaCBzcGFjZVxuICAgIHggPSBNYXRoLm1heChcbiAgICAgIGdhcCxcbiAgICAgIE1hdGgubWluKChjb250YWluZXJSZWN0LndpZHRoIC0gdG9vbHRpcFJlY3Qud2lkdGgpIC8gMiwgY29udGFpbmVyUmVjdC53aWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gZ2FwKSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIGJlc3QgdmVydGljYWwgcG9zaXRpb25cbiAgbGV0IHk6IG51bWJlcjtcbiAgaWYgKHNwYWNlQmVsb3cgPj0gdG9vbHRpcFJlY3QuaGVpZ2h0ICsgZ2FwKSB7XG4gICAgLy8gUG9zaXRpb24gYmVsb3cgY3Vyc29yXG4gICAgeSA9IGN1cnNvclkgKyBnYXA7XG4gIH0gZWxzZSBpZiAoc3BhY2VBYm92ZSA+PSB0b29sdGlwUmVjdC5oZWlnaHQgKyBnYXApIHtcbiAgICAvLyBQb3NpdGlvbiBhYm92ZSBjdXJzb3JcbiAgICB5ID0gY3Vyc29yWSAtIHRvb2x0aXBSZWN0LmhlaWdodCAtIGdhcDtcbiAgfSBlbHNlIHtcbiAgICAvLyBDZW50ZXIgdmVydGljYWxseSBpZiBuZWl0aGVyIGRpcmVjdGlvbiBoYXMgZW5vdWdoIHNwYWNlXG4gICAgeSA9IE1hdGgubWF4KFxuICAgICAgZ2FwLFxuICAgICAgTWF0aC5taW4oKGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0KSAvIDIsIGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0IC0gZ2FwKSxcbiAgICApO1xuICB9XG5cbiAgLy8gRW5zdXJlIHRvb2x0aXAgc3RheXMgd2l0aGluIGNvbnRhaW5lciBib3VuZHNcbiAgeCA9IE1hdGgubWF4KGdhcCwgTWF0aC5taW4oeCwgY29udGFpbmVyUmVjdC53aWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gZ2FwKSk7XG4gIHkgPSBNYXRoLm1heChnYXAsIE1hdGgubWluKHksIGNvbnRhaW5lclJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0IC0gZ2FwKSk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufVxuXG4vKipcbiAqIE1hcCBlYXNpbmcgb3B0aW9uIHRvIGQzIGVhc2luZyBmdW5jdGlvbiBuYW1lIHRoYXQgY2FsbGVycyBjYW4gbG9va3VwIG9uIGQzLlxuICogS2VlcHMgbWFwcGluZyBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMuXG4gKi9cbmV4cG9ydCB0eXBlIEQzRWFzaW5nTmFtZSA9XG4gIHwgJ2Vhc2VMaW5lYXInXG4gIHwgJ2Vhc2VQb2x5SW5PdXQnXG4gIHwgJ2Vhc2VQb2x5SW4nXG4gIHwgJ2Vhc2VQb2x5T3V0J1xuICB8ICdlYXNlQ3ViaWMnXG4gIHwgJ2Vhc2VDdWJpY0luJ1xuICB8ICdlYXNlQ3ViaWNPdXQnXG4gIHwgJ2Vhc2VDdWJpY0luT3V0JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEVhc2luZ05hbWUob3B0aW9uPzogc3RyaW5nKTogRDNFYXNpbmdOYW1lIHtcbiAgc3dpdGNoIChvcHRpb24pIHtcbiAgICBjYXNlICdsaW5lYXInOlxuICAgICAgcmV0dXJuICdlYXNlTGluZWFyJztcbiAgICBjYXNlICdlYXNlJzpcbiAgICAgIHJldHVybiAnZWFzZVBvbHlJbk91dCc7XG4gICAgY2FzZSAnZWFzZS1pbic6XG4gICAgICByZXR1cm4gJ2Vhc2VQb2x5SW4nO1xuICAgIGNhc2UgJ2Vhc2Utb3V0JzpcbiAgICAgIHJldHVybiAnZWFzZVBvbHlPdXQnO1xuICAgIGNhc2UgJ2Vhc2UtaW4tb3V0JzpcbiAgICAgIHJldHVybiAnZWFzZVBvbHlJbk91dCc7XG4gICAgY2FzZSAnY3ViaWMnOlxuICAgICAgcmV0dXJuICdlYXNlQ3ViaWMnO1xuICAgIGNhc2UgJ2N1YmljLWluJzpcbiAgICAgIHJldHVybiAnZWFzZUN1YmljSW4nO1xuICAgIGNhc2UgJ2N1YmljLW91dCc6XG4gICAgICByZXR1cm4gJ2Vhc2VDdWJpY091dCc7XG4gICAgY2FzZSAnY3ViaWMtaW4tb3V0JzpcbiAgICAgIHJldHVybiAnZWFzZUN1YmljSW5PdXQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ2Vhc2VDdWJpY091dCc7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXRzIGxhcmdlIG51bWJlcnMgd2l0aCBhYmJyZXZpYXRpb25zIChLLCBNLCBCLCBUKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGFyZ2VOdW1iZXIodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuICcwJztcblxuICBjb25zdCBhYnNWYWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcbiAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/ICctJyA6ICcnO1xuXG4gIGlmIChhYnNWYWx1ZSA+PSAxZTEyKSB7XG4gICAgcmV0dXJuIGAke3NpZ259JHsoYWJzVmFsdWUgLyAxZTEyKS50b0ZpeGVkKDEpfVRgO1xuICB9XG4gIGlmIChhYnNWYWx1ZSA+PSAxZTkpIHtcbiAgICByZXR1cm4gYCR7c2lnbn0keyhhYnNWYWx1ZSAvIDFlOSkudG9GaXhlZCgxKX1CYDtcbiAgfVxuICBpZiAoYWJzVmFsdWUgPj0gMWU2KSB7XG4gICAgcmV0dXJuIGAke3NpZ259JHsoYWJzVmFsdWUgLyAxZTYpLnRvRml4ZWQoMSl9TWA7XG4gIH1cbiAgaWYgKGFic1ZhbHVlID49IDFlMykge1xuICAgIHJldHVybiBgJHtzaWdufSR7KGFic1ZhbHVlIC8gMWUzKS50b0ZpeGVkKDEpfUtgO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvTG9jYWxlU3RyaW5nKCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEQzIGVhc2luZyBmdW5jdGlvbiBmb3IgdGhlIHByb3ZpZGVkIG9wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVhc2luZ0Z1bmN0aW9uKGQzOiB0eXBlb2YgaW1wb3J0KCdkMycpLCBvcHRpb24/OiBzdHJpbmcpOiAodDogbnVtYmVyKSA9PiBudW1iZXIge1xuICBjb25zdCBuYW1lID0gbWFwRWFzaW5nTmFtZShvcHRpb24pO1xuICBjb25zdCBlYXNpbmcgPSAoZDMgYXMgYW55KVtuYW1lXTtcbiAgcmV0dXJuIHR5cGVvZiBlYXNpbmcgPT09ICdmdW5jdGlvbicgPyBlYXNpbmcgOiAoZDMgYXMgYW55KS5lYXNlQ3ViaWNPdXQ7XG59XG4iXX0=","export const AX_CHARTS = 'ACOREX_CHARTS';\nexport * from './lib/chart-base.interface';\nexport * from './lib/chart-colors';\nexport * from './lib/chart-component-base';\nexport * from './lib/chart-types';\nexport * from './lib/chart-utils';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDekMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEFYX0NIQVJUUyA9ICdBQ09SRVhfQ0hBUlRTJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NoYXJ0LWJhc2UuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NoYXJ0LWNvbG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jaGFydC1jb21wb25lbnQtYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jaGFydC10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jaGFydC11dGlscyc7XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9zcmMvYWNvcmV4LWNoYXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts.mjs","sources":["../../../../packages/charts/src/lib/chart-colors.ts","../../../../packages/charts/src/lib/chart-component-base.ts","../../../../packages/charts/src/lib/chart-utils.ts","../../../../packages/charts/src/index.ts","../../../../packages/charts/src/acorex-charts.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n// Default color palette for charts\nexport const AX_CHART_COLOR_PALETTE = new InjectionToken<string[]>(\n 'AX_CHART_COLOR_PALETTE',\n {\n providedIn: 'root',\n factory: () => [\n '#FF6B6B', // Vibrant Red\n '#4ECDC4', // Electric Teal\n '#45B7D1', // Bright Blue\n '#96CEB4', // Fresh Green\n '#FFEEAD', // Bright Yellow\n '#D4A5A5', // Rose Pink\n '#9B59B6', // Rich Purple\n '#3498DB', // Deep Blue\n '#E67E22', // Bright Orange\n '#2ECC71', // Emerald Green\n '#E74C3C', // Cherry Red\n '#1ABC9C', // Turquoise\n '#F1C40F', // Golden Yellow\n '#8E44AD', // Deep Purple\n '#16A085', // Dark Teal\n\n // --- Extended Colors (new) ---\n '#27AE60', // Forest Green\n '#2980B9', // Strong Blue\n '#F39C12', // Vivid Orange\n '#C0392B', // Dark Red\n '#7D3C98', // Plum Purple\n '#2C3E50', // Midnight Blue\n '#D35400', // Burnt Orange\n '#BDC3C7', // Soft Silver\n '#34495E', // Slate Gray\n '#1F618D', // Royal Blue\n '#58D68D', // Mint Green\n '#5DADE2', // Sky Blue\n '#F1948A', // Soft Coral\n '#A569BD', // Lavender Purple\n '#F8C471', // Warm Gold\n ],\n }\n);\n\n\n/**\n * Helper function to get a color from the palette by index\n * @param index The index of the color to get\n * @param palette The color palette to use\n * @returns The color at the specified index\n */\nexport function getChartColor(index: number, palette: string[]): string {\n return palette[index % palette.length];\n}\n","import { afterNextRender, Directive, ElementRef, inject, signal } from '@angular/core';\n\n/**\n * Base component class for all chart components\n * Copied from @acorex/cdk/common NXComponent to remove external dependency\n */\n@Directive()\nexport abstract class AXChartComponent {\n #elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n #isRendered = signal(false);\n\n protected isRendered = this.#isRendered.asReadonly();\n\n #afterNextRender = afterNextRender(() => {\n if (!this.isRendered()) {\n this.nativeElement['__axContext__'] = this;\n this.#isRendered.set(true);\n }\n });\n\n /**\n * Gets the native HTML element of the component\n */\n public get nativeElement(): HTMLElement {\n return this.#elementRef.nativeElement;\n }\n\n /**\n * Gets the host HTML element of the component (alias for nativeElement)\n * @returns T - The native DOM element associated with this component\n */\n public getHostElement<T = HTMLElement>(): T {\n return this.#elementRef.nativeElement as T;\n }\n}\n","export type TooltipPosition = { x: number; y: number };\n\n/**\n * Resolves any CSS `<color>` the browser understands — including\n * `rgb(var(--token))`, `hsl(var(--token))`, `color-mix()`, etc. — to a computed\n * `rgb()` / `rgba()` string, using the cascade from `scopeElement` (e.g. the chart\n * container) so design tokens on ancestors apply.\n */\nexport function resolveCssColorInContext(scopeElement: HTMLElement, cssColor: string): string {\n if (typeof window === 'undefined' || typeof document === 'undefined' || !getComputedStyle) {\n return cssColor;\n }\n const input = cssColor?.trim();\n if (!input) {\n return cssColor;\n }\n\n const probe = document.createElement('span');\n probe.style.cssText =\n 'position:absolute;left:-9999px;top:-9999px;visibility:hidden;pointer-events:none;';\n probe.style.color = input;\n scopeElement.appendChild(probe);\n void probe.offsetHeight;\n const resolved = getComputedStyle(probe).color;\n probe.remove();\n\n return resolved || cssColor;\n}\n\n/**\n * Compute edge-aware tooltip position with intelligent placement,\n * considering available space in all directions and preventing overflow.\n */\nexport function computeTooltipPosition(\n containerRect: DOMRect,\n tooltipRect: DOMRect | null,\n clientX: number,\n clientY: number,\n gap: number,\n): TooltipPosition {\n const cursorX = clientX - containerRect.left;\n const cursorY = clientY - containerRect.top;\n\n if (!tooltipRect) {\n return {\n x: Math.min(cursorX + gap, containerRect.width - gap),\n y: Math.max(gap, Math.min(cursorY, containerRect.height - gap)),\n };\n }\n\n // Calculate available space in each direction\n const spaceRight = containerRect.width - cursorX;\n const spaceLeft = cursorX;\n const spaceBelow = containerRect.height - cursorY;\n const spaceAbove = cursorY;\n\n // Determine best horizontal position\n let x: number;\n if (spaceRight >= tooltipRect.width + gap) {\n // Position to the right of cursor\n x = cursorX + gap;\n } else if (spaceLeft >= tooltipRect.width + gap) {\n // Position to the left of cursor\n x = cursorX - tooltipRect.width - gap;\n } else {\n // Center horizontally if neither side has enough space\n x = Math.max(\n gap,\n Math.min((containerRect.width - tooltipRect.width) / 2, containerRect.width - tooltipRect.width - gap),\n );\n }\n\n // Determine best vertical position\n let y: number;\n if (spaceBelow >= tooltipRect.height + gap) {\n // Position below cursor\n y = cursorY + gap;\n } else if (spaceAbove >= tooltipRect.height + gap) {\n // Position above cursor\n y = cursorY - tooltipRect.height - gap;\n } else {\n // Center vertically if neither direction has enough space\n y = Math.max(\n gap,\n Math.min((containerRect.height - tooltipRect.height) / 2, containerRect.height - tooltipRect.height - gap),\n );\n }\n\n // Ensure tooltip stays within container bounds\n x = Math.max(gap, Math.min(x, containerRect.width - tooltipRect.width - gap));\n y = Math.max(gap, Math.min(y, containerRect.height - tooltipRect.height - gap));\n\n return { x, y };\n}\n\n/**\n * Map easing option to d3 easing function name that callers can lookup on d3.\n * Keeps mapping consistent across charts.\n */\nexport type D3EasingName =\n | 'easeLinear'\n | 'easePolyInOut'\n | 'easePolyIn'\n | 'easePolyOut'\n | 'easeCubic'\n | 'easeCubicIn'\n | 'easeCubicOut'\n | 'easeCubicInOut';\n\nexport function mapEasingName(option?: string): D3EasingName {\n switch (option) {\n case 'linear':\n return 'easeLinear';\n case 'ease':\n return 'easePolyInOut';\n case 'ease-in':\n return 'easePolyIn';\n case 'ease-out':\n return 'easePolyOut';\n case 'ease-in-out':\n return 'easePolyInOut';\n case 'cubic':\n return 'easeCubic';\n case 'cubic-in':\n return 'easeCubicIn';\n case 'cubic-out':\n return 'easeCubicOut';\n case 'cubic-in-out':\n return 'easeCubicInOut';\n default:\n return 'easeCubicOut';\n }\n}\n\n/**\n * Formats large numbers with abbreviations (K, M, B, T)\n */\nexport function formatLargeNumber(value: number): string {\n if (value === 0) return '0';\n\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n if (absValue >= 1e12) {\n return `${sign}${(absValue / 1e12).toFixed(1)}T`;\n }\n if (absValue >= 1e9) {\n return `${sign}${(absValue / 1e9).toFixed(1)}B`;\n }\n if (absValue >= 1e6) {\n return `${sign}${(absValue / 1e6).toFixed(1)}M`;\n }\n if (absValue >= 1e3) {\n return `${sign}${(absValue / 1e3).toFixed(1)}K`;\n }\n\n return value.toLocaleString();\n}\n\n/**\n * Returns a D3 easing function for the provided option.\n */\nexport function getEasingFunction(d3: typeof import('d3'), option?: string): (t: number) => number {\n const name = mapEasingName(option);\n const easing = (d3 as any)[name];\n return typeof easing === 'function' ? easing : (d3 as any).easeCubicOut;\n}\n","export const AX_CHARTS = 'ACOREX_CHARTS';\nexport * from './lib/chart-base.interface';\nexport * from './lib/chart-colors';\nexport * from './lib/chart-component-base';\nexport * from './lib/chart-types';\nexport * from './lib/chart-utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,48 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acorex/charts",
|
|
3
|
-
"version": "21.0.1-next.
|
|
3
|
+
"version": "21.0.1-next.91",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"
|
|
6
|
-
"@angular/core": "^20.0.0",
|
|
7
|
-
"d3": "^7.9.0"
|
|
5
|
+
"d3": ">=7.9.0"
|
|
8
6
|
},
|
|
9
7
|
"sideEffects": false,
|
|
10
8
|
"module": "fesm2022/acorex-charts.mjs",
|
|
11
|
-
"typings": "
|
|
9
|
+
"typings": "types/acorex-charts.d.ts",
|
|
12
10
|
"exports": {
|
|
13
11
|
"./package.json": {
|
|
14
12
|
"default": "./package.json"
|
|
15
13
|
},
|
|
16
14
|
".": {
|
|
17
|
-
"types": "./
|
|
15
|
+
"types": "./types/acorex-charts.d.ts",
|
|
18
16
|
"default": "./fesm2022/acorex-charts.mjs"
|
|
19
17
|
},
|
|
20
18
|
"./bar-chart": {
|
|
21
|
-
"types": "./bar-chart
|
|
19
|
+
"types": "./types/acorex-charts-bar-chart.d.ts",
|
|
22
20
|
"default": "./fesm2022/acorex-charts-bar-chart.mjs"
|
|
23
21
|
},
|
|
24
22
|
"./chart-legend": {
|
|
25
|
-
"types": "./chart-legend
|
|
23
|
+
"types": "./types/acorex-charts-chart-legend.d.ts",
|
|
26
24
|
"default": "./fesm2022/acorex-charts-chart-legend.mjs"
|
|
27
25
|
},
|
|
28
26
|
"./chart-tooltip": {
|
|
29
|
-
"types": "./chart-tooltip
|
|
27
|
+
"types": "./types/acorex-charts-chart-tooltip.d.ts",
|
|
30
28
|
"default": "./fesm2022/acorex-charts-chart-tooltip.mjs"
|
|
31
29
|
},
|
|
32
30
|
"./donut-chart": {
|
|
33
|
-
"types": "./donut-chart
|
|
31
|
+
"types": "./types/acorex-charts-donut-chart.d.ts",
|
|
34
32
|
"default": "./fesm2022/acorex-charts-donut-chart.mjs"
|
|
35
33
|
},
|
|
34
|
+
"./funnel-chart": {
|
|
35
|
+
"types": "./types/acorex-charts-funnel-chart.d.ts",
|
|
36
|
+
"default": "./fesm2022/acorex-charts-funnel-chart.mjs"
|
|
37
|
+
},
|
|
36
38
|
"./gauge-chart": {
|
|
37
|
-
"types": "./gauge-chart
|
|
39
|
+
"types": "./types/acorex-charts-gauge-chart.d.ts",
|
|
38
40
|
"default": "./fesm2022/acorex-charts-gauge-chart.mjs"
|
|
39
41
|
},
|
|
42
|
+
"./heatmap-chart": {
|
|
43
|
+
"types": "./types/acorex-charts-heatmap-chart.d.ts",
|
|
44
|
+
"default": "./fesm2022/acorex-charts-heatmap-chart.mjs"
|
|
45
|
+
},
|
|
40
46
|
"./hierarchy-chart": {
|
|
41
|
-
"types": "./hierarchy-chart
|
|
47
|
+
"types": "./types/acorex-charts-hierarchy-chart.d.ts",
|
|
42
48
|
"default": "./fesm2022/acorex-charts-hierarchy-chart.mjs"
|
|
43
49
|
},
|
|
44
50
|
"./line-chart": {
|
|
45
|
-
"types": "./line-chart
|
|
51
|
+
"types": "./types/acorex-charts-line-chart.d.ts",
|
|
46
52
|
"default": "./fesm2022/acorex-charts-line-chart.mjs"
|
|
47
53
|
}
|
|
48
54
|
},
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import * as _acorex_charts_bar_chart from '@acorex/charts/bar-chart';
|
|
1
2
|
import * as _acorex_charts from '@acorex/charts';
|
|
2
|
-
import {
|
|
3
|
+
import { NXNativeEvent, AXAnimationEasing, AXChartComponent, AXChartComponentBase } from '@acorex/charts';
|
|
3
4
|
import * as d3 from 'd3';
|
|
4
5
|
import * as _angular_core from '@angular/core';
|
|
5
6
|
import { OnDestroy, InjectionToken } from '@angular/core';
|
|
@@ -116,6 +117,8 @@ declare class AXBarChartComponent extends AXChartComponent implements OnDestroy,
|
|
|
116
117
|
private readonly X_AXIS_TITLE_GAP;
|
|
117
118
|
private readonly X_AXIS_TITLE_BLOCK_HEIGHT;
|
|
118
119
|
private readonly TOP_EDGE_PADDING;
|
|
120
|
+
private readonly BOTTOM_EDGE_PADDING;
|
|
121
|
+
private readonly HORIZONTAL_EDGE_PADDING;
|
|
119
122
|
private readonly FALLBACK_PLOT_HEIGHT;
|
|
120
123
|
private readonly MIN_PLOT_HEIGHT;
|
|
121
124
|
private readonly MIN_TOTAL_WIDTH;
|
|
@@ -146,6 +149,8 @@ declare class AXBarChartComponent extends AXChartComponent implements OnDestroy,
|
|
|
146
149
|
private _tooltipVisible;
|
|
147
150
|
private _tooltipPosition;
|
|
148
151
|
private _tooltipData;
|
|
152
|
+
private _tooltipRafId;
|
|
153
|
+
private _pendingTooltipCoords;
|
|
149
154
|
private _initialized;
|
|
150
155
|
private _rendered;
|
|
151
156
|
protected tooltipVisible: _angular_core.Signal<boolean>;
|
|
@@ -172,7 +177,7 @@ declare class AXBarChartComponent extends AXChartComponent implements OnDestroy,
|
|
|
172
177
|
animationDuration?: number;
|
|
173
178
|
animationDelay?: number;
|
|
174
179
|
animationEasing?: _acorex_charts.AXAnimationEasing;
|
|
175
|
-
messages?: AXBarChartMessages;
|
|
180
|
+
messages?: _acorex_charts_bar_chart.AXBarChartMessages;
|
|
176
181
|
}>;
|
|
177
182
|
protected effectiveMessages: _angular_core.Signal<{
|
|
178
183
|
noData: string;
|
|
@@ -258,10 +263,6 @@ declare class AXBarChartComponent extends AXChartComponent implements OnDestroy,
|
|
|
258
263
|
* Handles bar hover event and shows tooltip
|
|
259
264
|
*/
|
|
260
265
|
private handleBarHover;
|
|
261
|
-
/**
|
|
262
|
-
* Updates tooltip position based on mouse coordinates
|
|
263
|
-
* Enhanced to handle overflow issues by positioning tooltips more intelligently
|
|
264
|
-
*/
|
|
265
266
|
private updateTooltipPosition;
|
|
266
267
|
/**
|
|
267
268
|
* Enhanced tooltip positioning that considers chart boundaries and prevents overflow
|
|
@@ -41,6 +41,7 @@ declare class AXChartTooltipComponent {
|
|
|
41
41
|
protected isTitleArray(): boolean;
|
|
42
42
|
protected titleList(): string[];
|
|
43
43
|
protected colorAt(index: number): string | null;
|
|
44
|
+
protected formattedValue(): string;
|
|
44
45
|
/**
|
|
45
46
|
* Updates tooltip dimensions after it's rendered
|
|
46
47
|
*/
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as _acorex_charts_donut_chart from '@acorex/charts/donut-chart';
|
|
1
2
|
import * as _acorex_charts from '@acorex/charts';
|
|
2
3
|
import { AXAnimationEasing, AXChartComponent, AXChartComponentBase } from '@acorex/charts';
|
|
3
4
|
import * as d3 from 'd3';
|
|
@@ -145,6 +146,8 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
|
|
|
145
146
|
private _tooltipVisible;
|
|
146
147
|
private _tooltipPosition;
|
|
147
148
|
private _tooltipData;
|
|
149
|
+
private _tooltipRafId;
|
|
150
|
+
private _pendingTooltipCoords;
|
|
148
151
|
protected tooltipVisible: _angular_core.Signal<boolean>;
|
|
149
152
|
protected tooltipPosition: _angular_core.Signal<{
|
|
150
153
|
x: number;
|
|
@@ -163,7 +166,7 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
|
|
|
163
166
|
cornerRadius?: number;
|
|
164
167
|
animationDuration?: number;
|
|
165
168
|
animationEasing?: _acorex_charts.AXAnimationEasing;
|
|
166
|
-
messages?: AXDonutChartMessages;
|
|
169
|
+
messages?: _acorex_charts_donut_chart.AXDonutChartMessages;
|
|
167
170
|
}>;
|
|
168
171
|
private readonly TOOLTIP_GAP;
|
|
169
172
|
private readonly HIGHLIGHT_TRANSITION_DURATION;
|
|
@@ -172,6 +175,7 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
|
|
|
172
175
|
private readonly LABEL_ANIMATION_DELAY;
|
|
173
176
|
private readonly MIN_CHART_DIMENSION;
|
|
174
177
|
private readonly MIN_CHART_FOR_LABELS;
|
|
178
|
+
private readonly CHART_INSET;
|
|
175
179
|
private readonly DIMMED_OPACITY;
|
|
176
180
|
private readonly VISIBLE_OPACITY;
|
|
177
181
|
protected effectiveMessages: _angular_core.Signal<{
|
|
@@ -248,16 +252,17 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
|
|
|
248
252
|
private isChartLargeEnoughForLabels;
|
|
249
253
|
private addDataLabels;
|
|
250
254
|
/**
|
|
251
|
-
* Calculates
|
|
252
|
-
*
|
|
255
|
+
* Calculates font size for data labels using the donut ring's physical dimensions.
|
|
256
|
+
*
|
|
257
|
+
* Primary driver is the ring width (radial space), with chord length as an
|
|
258
|
+
* overflow guard and a gentle scale-down for smaller segments to create
|
|
259
|
+
* visual hierarchy.
|
|
253
260
|
*/
|
|
254
261
|
private calculateLabelFontSize;
|
|
255
262
|
private formatPercentage;
|
|
256
|
-
private buildLabelText;
|
|
257
263
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* Calculates chord length (straight line) since text is rendered horizontally, not along the arc
|
|
264
|
+
* Returns the best-fit label text for a segment, progressively truncating
|
|
265
|
+
* from "Label (XX%)" → "Label" → "XX%" → truncated label → truncated percentage.
|
|
261
266
|
*/
|
|
262
267
|
private getTruncatedLabelText;
|
|
263
268
|
/**
|
|
@@ -281,10 +286,6 @@ declare class AXDonutChartComponent extends AXChartComponent implements OnDestro
|
|
|
281
286
|
* Handles mouse leave from segments
|
|
282
287
|
*/
|
|
283
288
|
private handleSegmentLeave;
|
|
284
|
-
/**
|
|
285
|
-
* Updates tooltip position
|
|
286
|
-
* Ensures the tooltip is visible by adjusting position when near edges
|
|
287
|
-
*/
|
|
288
289
|
private updateTooltipPosition;
|
|
289
290
|
/**
|
|
290
291
|
* Adds center display with total value
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import * as _acorex_charts_funnel_chart from '@acorex/charts/funnel-chart';
|
|
2
|
+
import * as _acorex_charts from '@acorex/charts';
|
|
3
|
+
import { AXAnimationEasing, AXChartComponent, AXChartComponentBase } from '@acorex/charts';
|
|
4
|
+
import * as d3 from 'd3';
|
|
5
|
+
import * as _angular_core from '@angular/core';
|
|
6
|
+
import { OnDestroy, InjectionToken } from '@angular/core';
|
|
7
|
+
import { AXChartTooltipData } from '@acorex/charts/chart-tooltip';
|
|
8
|
+
|
|
9
|
+
interface AXFunnelData {
|
|
10
|
+
id?: string | number;
|
|
11
|
+
name: string;
|
|
12
|
+
value: number;
|
|
13
|
+
/** Any CSS `<color>` resolvable in the chart container, e.g. `rgb(var(--ax-sys-color-primary-950))`. */
|
|
14
|
+
color?: string;
|
|
15
|
+
}
|
|
16
|
+
interface AXFunnelChartMessages {
|
|
17
|
+
noData?: string;
|
|
18
|
+
noDataIcon?: string;
|
|
19
|
+
}
|
|
20
|
+
interface AXFunnelChartOption {
|
|
21
|
+
/**
|
|
22
|
+
* Inset in SVG user units (fixed `viewBox` side length 400). The chart scales to its CSS box;
|
|
23
|
+
* margins keep the same proportions at any container size.
|
|
24
|
+
*/
|
|
25
|
+
margin?: {
|
|
26
|
+
top: number;
|
|
27
|
+
right: number;
|
|
28
|
+
bottom: number;
|
|
29
|
+
left: number;
|
|
30
|
+
};
|
|
31
|
+
width?: number;
|
|
32
|
+
height?: number;
|
|
33
|
+
/** The ratio of the bottom width compared to the top width for the last segment (0 to 1). Default: 0.3 */
|
|
34
|
+
neckWidth?: number;
|
|
35
|
+
colors?: string[];
|
|
36
|
+
/**
|
|
37
|
+
* Base color when `colors` is not provided: any CSS `<color>` (hex, `rgb()`, `hsl()`,
|
|
38
|
+
* `rgb(var(--token))`, `color-mix()`, …) resolved against the chart container’s cascade.
|
|
39
|
+
* Intensity follows the value position in `valueRange` (or data min–max if `valueRange` is omitted).
|
|
40
|
+
*/
|
|
41
|
+
color?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Inclusive numeric range used to map values to color intensity (0–100% of the base color).
|
|
44
|
+
* If `valueRange` is omitted, or a bound is missing, that bound uses the dataset’s min or max
|
|
45
|
+
* value (after sorting: largest slice → max, smallest → min).
|
|
46
|
+
*/
|
|
47
|
+
valueRange?: {
|
|
48
|
+
min: number;
|
|
49
|
+
max: number;
|
|
50
|
+
};
|
|
51
|
+
showLabels?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* When `showLabels` is true, also render the numeric value on each segment.
|
|
54
|
+
* Values still appear in the tooltip when `showTooltip` is enabled.
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
57
|
+
showSegmentValues?: boolean;
|
|
58
|
+
/** @deprecated Labels render inside segments; offset is unused. */
|
|
59
|
+
labelOffset?: number;
|
|
60
|
+
showTooltip?: boolean;
|
|
61
|
+
animationDuration?: number;
|
|
62
|
+
animationEasing?: AXAnimationEasing;
|
|
63
|
+
messages?: AXFunnelChartMessages;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare class AXFunnelChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {
|
|
67
|
+
/**
|
|
68
|
+
* Fixed SVG coordinate system; the graphic scales to the container via `width`/`height: 100%` + `viewBox`.
|
|
69
|
+
* Margins and geometry are expressed in these units (same numeric scale as a ~400px reference viewport).
|
|
70
|
+
*/
|
|
71
|
+
private static readonly VIEW_BOX_SIZE;
|
|
72
|
+
data: _angular_core.InputSignal<AXFunnelData[]>;
|
|
73
|
+
options: _angular_core.InputSignal<AXFunnelChartOption>;
|
|
74
|
+
/** Emitted when a funnel segment is clicked */
|
|
75
|
+
segmentClick: _angular_core.OutputEmitterRef<AXFunnelData>;
|
|
76
|
+
private readonly chartContainerEl;
|
|
77
|
+
private svgElement;
|
|
78
|
+
protected d3: typeof d3;
|
|
79
|
+
private _initialized;
|
|
80
|
+
private _rendered;
|
|
81
|
+
private _tooltipVisible;
|
|
82
|
+
private _tooltipPosition;
|
|
83
|
+
private _tooltipData;
|
|
84
|
+
private _tooltipRafId;
|
|
85
|
+
protected tooltipVisible: _angular_core.Signal<boolean>;
|
|
86
|
+
protected tooltipPosition: _angular_core.Signal<{
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
}>;
|
|
90
|
+
protected tooltipData: _angular_core.Signal<AXChartTooltipData>;
|
|
91
|
+
private configToken;
|
|
92
|
+
protected effectiveOptions: _angular_core.Signal<{
|
|
93
|
+
margin?: {
|
|
94
|
+
top: number;
|
|
95
|
+
right: number;
|
|
96
|
+
bottom: number;
|
|
97
|
+
left: number;
|
|
98
|
+
};
|
|
99
|
+
width?: number;
|
|
100
|
+
height?: number;
|
|
101
|
+
neckWidth?: number;
|
|
102
|
+
colors?: string[];
|
|
103
|
+
color?: string;
|
|
104
|
+
valueRange?: {
|
|
105
|
+
min: number;
|
|
106
|
+
max: number;
|
|
107
|
+
};
|
|
108
|
+
showLabels?: boolean;
|
|
109
|
+
showSegmentValues?: boolean;
|
|
110
|
+
labelOffset?: number;
|
|
111
|
+
showTooltip?: boolean;
|
|
112
|
+
animationDuration?: number;
|
|
113
|
+
animationEasing?: _acorex_charts.AXAnimationEasing;
|
|
114
|
+
messages?: _acorex_charts_funnel_chart.AXFunnelChartMessages;
|
|
115
|
+
}>;
|
|
116
|
+
constructor();
|
|
117
|
+
ngOnDestroy(): void;
|
|
118
|
+
protected loadD3(): Promise<void>;
|
|
119
|
+
createChart(): void;
|
|
120
|
+
private trapezoidInteriorMetrics;
|
|
121
|
+
private computeSegmentLabelTypography;
|
|
122
|
+
private truncateLabel;
|
|
123
|
+
private pickOnSliceTextColors;
|
|
124
|
+
private resolveSliceColor;
|
|
125
|
+
/** `resolvedRgb` must be a computed `rgb()` / `rgba()` string (e.g. from {@link resolveCssColor}). */
|
|
126
|
+
private applyIntensityToResolvedRgb;
|
|
127
|
+
private hashStringToUint32;
|
|
128
|
+
private resolveCssColor;
|
|
129
|
+
updateChart(): void;
|
|
130
|
+
private showTooltip;
|
|
131
|
+
private updateTooltipPosition;
|
|
132
|
+
private hideTooltip;
|
|
133
|
+
cleanupChart(): void;
|
|
134
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFunnelChartComponent, never>;
|
|
135
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFunnelChartComponent, "ax-funnel-chart", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "segmentClick": "segmentClick"; }, never, never, true, never>;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
declare const AXFunnelChartDefaultConfig: AXFunnelChartOption;
|
|
139
|
+
declare const AX_FUNNEL_CHART_CONFIG: InjectionToken<AXFunnelChartOption>;
|
|
140
|
+
|
|
141
|
+
export { AXFunnelChartComponent, AXFunnelChartDefaultConfig, AX_FUNNEL_CHART_CONFIG };
|
|
142
|
+
export type { AXFunnelChartMessages, AXFunnelChartOption, AXFunnelData };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as _acorex_charts_gauge_chart from '@acorex/charts/gauge-chart';
|
|
1
2
|
import * as _acorex_charts from '@acorex/charts';
|
|
2
3
|
import { AXAnimationEasing, AXChartComponent, AXChartComponentBase } from '@acorex/charts';
|
|
3
4
|
import * as d3 from 'd3';
|
|
@@ -106,6 +107,8 @@ declare class AXGaugeChartComponent extends AXChartComponent implements OnDestro
|
|
|
106
107
|
private _tooltipVisible;
|
|
107
108
|
private _tooltipPosition;
|
|
108
109
|
private _tooltipData;
|
|
110
|
+
private _tooltipRafId;
|
|
111
|
+
private _pendingTooltipCoords;
|
|
109
112
|
protected tooltipVisible: _angular_core.Signal<boolean>;
|
|
110
113
|
protected tooltipPosition: _angular_core.Signal<{
|
|
111
114
|
x: number;
|
|
@@ -130,12 +133,16 @@ declare class AXGaugeChartComponent extends AXChartComponent implements OnDestro
|
|
|
130
133
|
label?: string;
|
|
131
134
|
animationDuration?: number;
|
|
132
135
|
animationEasing?: _acorex_charts.AXAnimationEasing;
|
|
133
|
-
messages?: AXGaugeChartMessages;
|
|
136
|
+
messages?: _acorex_charts_gauge_chart.AXGaugeChartMessages;
|
|
134
137
|
}>;
|
|
135
138
|
private readonly TOOLTIP_GAP;
|
|
136
139
|
private readonly HALF_CIRCLE_RADIANS;
|
|
137
140
|
private readonly QUARTER_CIRCLE_RADIANS;
|
|
138
141
|
private readonly DEGREES_PER_RADIAN;
|
|
142
|
+
private readonly CHART_EDGE_PADDING;
|
|
143
|
+
private readonly TICK_LABEL_CHAR_WIDTH_RATIO;
|
|
144
|
+
private readonly TICK_LABEL_SIDE_PADDING;
|
|
145
|
+
private readonly LABEL_TICK_CLEARANCE;
|
|
139
146
|
constructor();
|
|
140
147
|
ngOnDestroy(): void;
|
|
141
148
|
/**
|
|
@@ -170,10 +177,6 @@ declare class AXGaugeChartComponent extends AXChartComponent implements OnDestro
|
|
|
170
177
|
* Shows tooltip for the entire range when no thresholds are defined
|
|
171
178
|
*/
|
|
172
179
|
private showSingleRangeTooltip;
|
|
173
|
-
/**
|
|
174
|
-
* Updates the tooltip position based on the mouse event
|
|
175
|
-
* For gauge charts, we need simpler coordinate handling since D3 events are already in container coordinates
|
|
176
|
-
*/
|
|
177
180
|
private updateTooltipPosition;
|
|
178
181
|
/**
|
|
179
182
|
* Hides the tooltip
|
|
@@ -191,6 +194,14 @@ declare class AXGaugeChartComponent extends AXChartComponent implements OnDestro
|
|
|
191
194
|
* Draws tick marks and labels around the gauge
|
|
192
195
|
*/
|
|
193
196
|
private drawTicks;
|
|
197
|
+
private getTickCount;
|
|
198
|
+
private getTickFontSize;
|
|
199
|
+
private getBaseLabelOffset;
|
|
200
|
+
private getTickLabelAnchor;
|
|
201
|
+
private getNearEdgeProjection;
|
|
202
|
+
private formatTickValue;
|
|
203
|
+
private estimateLabelWidth;
|
|
204
|
+
private estimateMaxTickLabelWidth;
|
|
194
205
|
/**
|
|
195
206
|
* Draws the value and label text in the center
|
|
196
207
|
*/
|