@acorex/charts 20.6.17 → 20.6.19

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.
@@ -0,0 +1,181 @@
1
+ import { AXChartComponent, getEasingFunction, computeTooltipPosition } from '@acorex/charts';
2
+ import { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';
3
+ import * as i0 from '@angular/core';
4
+ import { InjectionToken, inject, input, viewChild, signal, computed, afterNextRender, effect, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
5
+
6
+ const AXHeatmapChartDefaultConfig = {
7
+ margin: { top: 30, right: 30, bottom: 60, left: 60 },
8
+ colors: ['#ebedf0', '#9be9a8', '#40c463', '#30a14e', '#216e39'], // GitHub style green scale
9
+ cellPadding: 0.05,
10
+ borderRadius: 2,
11
+ showXAxis: true,
12
+ showYAxis: true,
13
+ showTooltip: true,
14
+ animationDuration: 800,
15
+ animationEasing: 'cubic-out',
16
+ messages: {
17
+ noData: 'No data available',
18
+ noDataHelp: 'Provide X, Y, and Value data to render the heatmap',
19
+ noDataIcon: 'fa-light fa-grid-2',
20
+ },
21
+ };
22
+ const AX_HEATMAP_CHART_CONFIG = new InjectionToken('AX_HEATMAP_CHART_CONFIG', {
23
+ providedIn: 'root',
24
+ factory: () => AXHeatmapChartDefaultConfig,
25
+ });
26
+
27
+ class AXHeatmapChartComponent extends AXChartComponent {
28
+ // Inject config at the top level
29
+ defaultConfig = inject(AX_HEATMAP_CHART_CONFIG);
30
+ // Inputs
31
+ data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
32
+ options = input({}, ...(ngDevMode ? [{ debugName: "options" }] : []));
33
+ // View Child
34
+ containerRef = viewChild.required('chartContainer');
35
+ // Internal State
36
+ svg;
37
+ resizeObserver = null;
38
+ d3;
39
+ _d3Ready = signal(false, ...(ngDevMode ? [{ debugName: "_d3Ready" }] : []));
40
+ // Tooltip State
41
+ tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: "tooltipVisible" }] : []));
42
+ tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "tooltipPosition" }] : []));
43
+ tooltipData = signal({ title: '', value: '' }, ...(ngDevMode ? [{ debugName: "tooltipData" }] : []));
44
+ // Computed options (referencing the already injected defaultConfig)
45
+ effectiveOptions = computed(() => ({
46
+ ...this.defaultConfig,
47
+ ...this.options(),
48
+ }), ...(ngDevMode ? [{ debugName: "effectiveOptions" }] : []));
49
+ constructor() {
50
+ super();
51
+ // Initialize D3 and ResizeObserver
52
+ afterNextRender(() => {
53
+ this.init();
54
+ });
55
+ // Reactive Render when data or D3 is ready
56
+ effect(() => {
57
+ if (this._d3Ready()) {
58
+ this.renderChart();
59
+ }
60
+ });
61
+ }
62
+ async init() {
63
+ try {
64
+ this.d3 = await import('d3');
65
+ this.resizeObserver = new ResizeObserver(() => {
66
+ if (this._d3Ready())
67
+ this.renderChart();
68
+ });
69
+ this.resizeObserver.observe(this.containerRef().nativeElement);
70
+ this._d3Ready.set(true);
71
+ }
72
+ catch (err) {
73
+ console.error('Heatmap: Initialization failed', err);
74
+ }
75
+ }
76
+ renderChart() {
77
+ const container = this.containerRef().nativeElement;
78
+ const data = this.data() || [];
79
+ if (!container || container.clientWidth === 0 || container.clientHeight === 0)
80
+ return;
81
+ // Clear SVG if data is empty
82
+ if (data.length === 0) {
83
+ if (this.svg)
84
+ this.svg.remove();
85
+ this.svg = null;
86
+ return;
87
+ }
88
+ const options = this.effectiveOptions();
89
+ const width = container.clientWidth;
90
+ const height = container.clientHeight;
91
+ const margin = options.margin || { top: 20, right: 20, bottom: 40, left: 40 };
92
+ const innerWidth = width - margin.left - margin.right;
93
+ const innerHeight = height - margin.top - margin.bottom;
94
+ // Create/Select SVG root
95
+ if (!this.svg) {
96
+ this.svg = this.d3.select(container).append('svg').attr('style', 'width: 100%; height: 100%; display: block;');
97
+ this.svg.append('g').attr('class', 'chart-group');
98
+ }
99
+ this.svg.attr('viewBox', `0 0 ${width} ${height}`);
100
+ const g = this.svg.select('.chart-group').attr('transform', `translate(${margin.left},${margin.top})`);
101
+ // --- Scales ---
102
+ const xKeys = Array.from(new Set(data.map((d) => d.x.toString())));
103
+ const yKeys = Array.from(new Set(data.map((d) => d.y.toString())));
104
+ const xScale = this.d3.scaleBand().domain(xKeys).range([0, innerWidth]).padding(options.cellPadding);
105
+ const yScale = this.d3.scaleBand().domain(yKeys).range([innerHeight, 0]).padding(options.cellPadding);
106
+ const valueExtent = this.d3.extent(data, (d) => d.value);
107
+ const colorScale = this.d3
108
+ .scaleSequential()
109
+ .domain([valueExtent[0] || 0, valueExtent[1] || 1])
110
+ .interpolator(this.d3.interpolateRgbBasis(options.colors));
111
+ // --- Axes ---
112
+ this.drawAxis(g, 'x-axis', this.d3.axisBottom(xScale).tickSize(0), 0, innerHeight, options.showXAxis);
113
+ this.drawAxis(g, 'y-axis', this.d3.axisLeft(yScale).tickSize(0), 0, 0, options.showYAxis);
114
+ // --- Cells with Data Join ---
115
+ const easing = getEasingFunction(this.d3, options.animationEasing);
116
+ g.selectAll('.cell')
117
+ .data(data, (d) => `${d.x}-${d.y}`)
118
+ .join((enter) => enter.append('rect').attr('class', 'cell').attr('opacity', 0).attr('fill', options.colors[0]), (update) => update, (exit) => exit.transition().duration(200).attr('opacity', 0).remove())
119
+ .on('mouseenter', (event, d) => this.showTooltip(event, d, colorScale(d.value)))
120
+ .on('mousemove', (event) => this.updateTooltipPos(event))
121
+ .on('mouseleave', () => this.hideTooltip())
122
+ .transition()
123
+ .duration(options.animationDuration)
124
+ .ease(easing)
125
+ .attr('x', (d) => xScale(d.x.toString()))
126
+ .attr('y', (d) => yScale(d.y.toString()))
127
+ .attr('width', xScale.bandwidth())
128
+ .attr('height', yScale.bandwidth())
129
+ .attr('rx', options.borderRadius)
130
+ .attr('ry', options.borderRadius)
131
+ .attr('opacity', 1)
132
+ .style('fill', (d) => colorScale(d.value));
133
+ }
134
+ drawAxis(g, className, axisFn, x, y, visible = true) {
135
+ let axisG = g.select(`.${className}`);
136
+ if (axisG.empty())
137
+ axisG = g.append('g').attr('class', className);
138
+ axisG
139
+ .attr('transform', `translate(${x},${y})`)
140
+ .style('display', visible ? 'block' : 'none')
141
+ .call(axisFn)
142
+ .call((g) => g.select('.domain').remove());
143
+ }
144
+ showTooltip(event, item, color) {
145
+ if (!this.effectiveOptions().showTooltip)
146
+ return;
147
+ this.tooltipData.set({
148
+ title: `${item.x} / ${item.y}`,
149
+ value: item.label || item.value.toLocaleString(),
150
+ color: color,
151
+ });
152
+ this.tooltipVisible.set(true);
153
+ this.updateTooltipPos(event);
154
+ }
155
+ updateTooltipPos(event) {
156
+ const container = this.containerRef().nativeElement;
157
+ const rect = container.getBoundingClientRect();
158
+ const pos = computeTooltipPosition(rect, null, event.clientX, event.clientY, 15);
159
+ this.tooltipPosition.set(pos);
160
+ }
161
+ hideTooltip() {
162
+ this.tooltipVisible.set(false);
163
+ }
164
+ ngOnDestroy() {
165
+ this.resizeObserver?.disconnect();
166
+ this.svg?.remove();
167
+ }
168
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXHeatmapChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
169
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.3", type: AXHeatmapChartComponent, isStandalone: true, selector: "ax-heatmap-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-heatmap-chart-container\" role=\"img\" #chartContainer>\n @if (data()?.length === 0) {\n <div class=\"ax-heatmap-no-data\">\n <i [class]=\"effectiveOptions().messages?.noDataIcon\"></i>\n <p class=\"ax-heatmap-no-data-text\">{{ effectiveOptions().messages?.noData }}</p>\n </div>\n }\n</div>\n\n<ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n</ax-chart-tooltip>\n", styles: ["ax-heatmap-chart{display:block;width:100%;height:100%;min-height:300px;--ax-comp-heatmap-chart-bg-color: transparent;--ax-comp-heatmap-chart-text-color: var(--ax-sys-color-on-surface-variant, 28, 27, 31);--ax-comp-heatmap-chart-axis-color: var(--ax-sys-color-outline-variant, 202, 196, 208)}ax-heatmap-chart .ax-heatmap-chart-container{position:relative;width:100%;height:100%;box-sizing:border-box;padding:1rem;overflow:hidden;background-color:var(--ax-comp-heatmap-chart-bg-color)}ax-heatmap-chart .ax-heatmap-chart-container svg{display:block;width:100%;height:100%;overflow:visible}ax-heatmap-chart .ax-heatmap-chart-container svg .cell{transition:stroke .15s ease}ax-heatmap-chart .ax-heatmap-chart-container svg .cell:hover{stroke:rgba(var(--ax-comp-heatmap-chart-text-color),.6);stroke-width:2px}ax-heatmap-chart .ax-heatmap-chart-container svg .axis-label{font-size:12px;font-weight:600;fill:rgb(var(--ax-comp-heatmap-chart-text-color))}ax-heatmap-chart .ax-heatmap-chart-container svg .tick text{font-size:11px;fill:rgba(var(--ax-comp-heatmap-chart-text-color),.7)}ax-heatmap-chart .ax-heatmap-chart-container svg line,ax-heatmap-chart .ax-heatmap-chart-container svg .domain{stroke:rgba(var(--ax-comp-heatmap-chart-axis-color),.5)}ax-heatmap-chart .ax-heatmap-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;color:rgba(var(--ax-comp-heatmap-chart-text-color),.6)}ax-heatmap-chart .ax-heatmap-no-data i{font-size:2rem;margin-bottom:.5rem}\n"], dependencies: [{ kind: "component", type: AXChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
170
+ }
171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXHeatmapChartComponent, decorators: [{
172
+ type: Component,
173
+ args: [{ selector: 'ax-heatmap-chart', encapsulation: ViewEncapsulation.None, standalone: true, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-heatmap-chart-container\" role=\"img\" #chartContainer>\n @if (data()?.length === 0) {\n <div class=\"ax-heatmap-no-data\">\n <i [class]=\"effectiveOptions().messages?.noDataIcon\"></i>\n <p class=\"ax-heatmap-no-data-text\">{{ effectiveOptions().messages?.noData }}</p>\n </div>\n }\n</div>\n\n<ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n</ax-chart-tooltip>\n", styles: ["ax-heatmap-chart{display:block;width:100%;height:100%;min-height:300px;--ax-comp-heatmap-chart-bg-color: transparent;--ax-comp-heatmap-chart-text-color: var(--ax-sys-color-on-surface-variant, 28, 27, 31);--ax-comp-heatmap-chart-axis-color: var(--ax-sys-color-outline-variant, 202, 196, 208)}ax-heatmap-chart .ax-heatmap-chart-container{position:relative;width:100%;height:100%;box-sizing:border-box;padding:1rem;overflow:hidden;background-color:var(--ax-comp-heatmap-chart-bg-color)}ax-heatmap-chart .ax-heatmap-chart-container svg{display:block;width:100%;height:100%;overflow:visible}ax-heatmap-chart .ax-heatmap-chart-container svg .cell{transition:stroke .15s ease}ax-heatmap-chart .ax-heatmap-chart-container svg .cell:hover{stroke:rgba(var(--ax-comp-heatmap-chart-text-color),.6);stroke-width:2px}ax-heatmap-chart .ax-heatmap-chart-container svg .axis-label{font-size:12px;font-weight:600;fill:rgb(var(--ax-comp-heatmap-chart-text-color))}ax-heatmap-chart .ax-heatmap-chart-container svg .tick text{font-size:11px;fill:rgba(var(--ax-comp-heatmap-chart-text-color),.7)}ax-heatmap-chart .ax-heatmap-chart-container svg line,ax-heatmap-chart .ax-heatmap-chart-container svg .domain{stroke:rgba(var(--ax-comp-heatmap-chart-axis-color),.5)}ax-heatmap-chart .ax-heatmap-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;color:rgba(var(--ax-comp-heatmap-chart-text-color),.6)}ax-heatmap-chart .ax-heatmap-no-data i{font-size:2rem;margin-bottom:.5rem}\n"] }]
174
+ }], ctorParameters: () => [] });
175
+
176
+ /**
177
+ * Generated bundle index. Do not edit.
178
+ */
179
+
180
+ export { AXHeatmapChartComponent, AXHeatmapChartDefaultConfig, AX_HEATMAP_CHART_CONFIG };
181
+ //# sourceMappingURL=acorex-charts-heatmap-chart.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-charts-heatmap-chart.mjs","sources":["../tmp-esm2022/heatmap-chart/lib/heatmap-chart.config.js","../tmp-esm2022/heatmap-chart/lib/heatmap-chart.component.js","../tmp-esm2022/heatmap-chart/acorex-charts-heatmap-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXHeatmapChartDefaultConfig = {\n margin: { top: 30, right: 30, bottom: 60, left: 60 },\n colors: ['#ebedf0', '#9be9a8', '#40c463', '#30a14e', '#216e39'], // GitHub style green scale\n cellPadding: 0.05,\n borderRadius: 2,\n showXAxis: true,\n showYAxis: true,\n showTooltip: true,\n animationDuration: 800,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Provide X, Y, and Value data to render the heatmap',\n noDataIcon: 'fa-light fa-grid-2',\n },\n};\nexport const AX_HEATMAP_CHART_CONFIG = new InjectionToken('AX_HEATMAP_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXHeatmapChartDefaultConfig,\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhdG1hcC1jaGFydC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvaGVhdG1hcC1jaGFydC9zcmMvbGliL2hlYXRtYXAtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQXlCO0lBQy9ELE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7SUFDcEQsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLDJCQUEyQjtJQUM1RixXQUFXLEVBQUUsSUFBSTtJQUNqQixZQUFZLEVBQUUsQ0FBQztJQUNmLFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLG9EQUFvRDtRQUNoRSxVQUFVLEVBQUUsb0JBQW9CO0tBQ2pDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUF1Qix5QkFBeUIsRUFBRTtJQUN6RyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsMkJBQTJCO0NBQzNDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWEhlYXRtYXBDaGFydE9wdGlvbiB9IGZyb20gJy4vaGVhdG1hcC1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYSGVhdG1hcENoYXJ0RGVmYXVsdENvbmZpZzogQVhIZWF0bWFwQ2hhcnRPcHRpb24gPSB7XG4gIG1hcmdpbjogeyB0b3A6IDMwLCByaWdodDogMzAsIGJvdHRvbTogNjAsIGxlZnQ6IDYwIH0sXG4gIGNvbG9yczogWycjZWJlZGYwJywgJyM5YmU5YTgnLCAnIzQwYzQ2MycsICcjMzBhMTRlJywgJyMyMTZlMzknXSwgLy8gR2l0SHViIHN0eWxlIGdyZWVuIHNjYWxlXG4gIGNlbGxQYWRkaW5nOiAwLjA1LFxuICBib3JkZXJSYWRpdXM6IDIsXG4gIHNob3dYQXhpczogdHJ1ZSxcbiAgc2hvd1lBeGlzOiB0cnVlLFxuICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDgwMCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICBub0RhdGE6ICdObyBkYXRhIGF2YWlsYWJsZScsXG4gICAgbm9EYXRhSGVscDogJ1Byb3ZpZGUgWCwgWSwgYW5kIFZhbHVlIGRhdGEgdG8gcmVuZGVyIHRoZSBoZWF0bWFwJyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtZ3JpZC0yJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9IRUFUTUFQX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWEhlYXRtYXBDaGFydE9wdGlvbj4oJ0FYX0hFQVRNQVBfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IEFYSGVhdG1hcENoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuIl19","import { AXChartComponent, computeTooltipPosition, getEasingFunction } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_HEATMAP_CHART_CONFIG } from './heatmap-chart.config';\nimport * as i0 from \"@angular/core\";\nexport class AXHeatmapChartComponent extends AXChartComponent {\n // Inject config at the top level\n defaultConfig = inject(AX_HEATMAP_CHART_CONFIG);\n // Inputs\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // View Child\n containerRef = viewChild.required('chartContainer');\n // Internal State\n svg;\n resizeObserver = null;\n d3;\n _d3Ready = signal(false, ...(ngDevMode ? [{ debugName: \"_d3Ready\" }] : []));\n // Tooltip State\n tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"tooltipVisible\" }] : []));\n tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"tooltipPosition\" }] : []));\n tooltipData = signal({ title: '', value: '' }, ...(ngDevMode ? [{ debugName: \"tooltipData\" }] : []));\n // Computed options (referencing the already injected defaultConfig)\n effectiveOptions = computed(() => ({\n ...this.defaultConfig,\n ...this.options(),\n }), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n constructor() {\n super();\n // Initialize D3 and ResizeObserver\n afterNextRender(() => {\n this.init();\n });\n // Reactive Render when data or D3 is ready\n effect(() => {\n if (this._d3Ready()) {\n this.renderChart();\n }\n });\n }\n async init() {\n try {\n this.d3 = await import('d3');\n this.resizeObserver = new ResizeObserver(() => {\n if (this._d3Ready())\n this.renderChart();\n });\n this.resizeObserver.observe(this.containerRef().nativeElement);\n this._d3Ready.set(true);\n }\n catch (err) {\n console.error('Heatmap: Initialization failed', err);\n }\n }\n renderChart() {\n const container = this.containerRef().nativeElement;\n const data = this.data() || [];\n if (!container || container.clientWidth === 0 || container.clientHeight === 0)\n return;\n // Clear SVG if data is empty\n if (data.length === 0) {\n if (this.svg)\n this.svg.remove();\n this.svg = null;\n return;\n }\n const options = this.effectiveOptions();\n const width = container.clientWidth;\n const height = container.clientHeight;\n const margin = options.margin || { top: 20, right: 20, bottom: 40, left: 40 };\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n // Create/Select SVG root\n if (!this.svg) {\n this.svg = this.d3.select(container).append('svg').attr('style', 'width: 100%; height: 100%; display: block;');\n this.svg.append('g').attr('class', 'chart-group');\n }\n this.svg.attr('viewBox', `0 0 ${width} ${height}`);\n const g = this.svg.select('.chart-group').attr('transform', `translate(${margin.left},${margin.top})`);\n // --- Scales ---\n const xKeys = Array.from(new Set(data.map((d) => d.x.toString())));\n const yKeys = Array.from(new Set(data.map((d) => d.y.toString())));\n const xScale = this.d3.scaleBand().domain(xKeys).range([0, innerWidth]).padding(options.cellPadding);\n const yScale = this.d3.scaleBand().domain(yKeys).range([innerHeight, 0]).padding(options.cellPadding);\n const valueExtent = this.d3.extent(data, (d) => d.value);\n const colorScale = this.d3\n .scaleSequential()\n .domain([valueExtent[0] || 0, valueExtent[1] || 1])\n .interpolator(this.d3.interpolateRgbBasis(options.colors));\n // --- Axes ---\n this.drawAxis(g, 'x-axis', this.d3.axisBottom(xScale).tickSize(0), 0, innerHeight, options.showXAxis);\n this.drawAxis(g, 'y-axis', this.d3.axisLeft(yScale).tickSize(0), 0, 0, options.showYAxis);\n // --- Cells with Data Join ---\n const easing = getEasingFunction(this.d3, options.animationEasing);\n g.selectAll('.cell')\n .data(data, (d) => `${d.x}-${d.y}`)\n .join((enter) => enter.append('rect').attr('class', 'cell').attr('opacity', 0).attr('fill', options.colors[0]), (update) => update, (exit) => exit.transition().duration(200).attr('opacity', 0).remove())\n .on('mouseenter', (event, d) => this.showTooltip(event, d, colorScale(d.value)))\n .on('mousemove', (event) => this.updateTooltipPos(event))\n .on('mouseleave', () => this.hideTooltip())\n .transition()\n .duration(options.animationDuration)\n .ease(easing)\n .attr('x', (d) => xScale(d.x.toString()))\n .attr('y', (d) => yScale(d.y.toString()))\n .attr('width', xScale.bandwidth())\n .attr('height', yScale.bandwidth())\n .attr('rx', options.borderRadius)\n .attr('ry', options.borderRadius)\n .attr('opacity', 1)\n .style('fill', (d) => colorScale(d.value));\n }\n drawAxis(g, className, axisFn, x, y, visible = true) {\n let axisG = g.select(`.${className}`);\n if (axisG.empty())\n axisG = g.append('g').attr('class', className);\n axisG\n .attr('transform', `translate(${x},${y})`)\n .style('display', visible ? 'block' : 'none')\n .call(axisFn)\n .call((g) => g.select('.domain').remove());\n }\n showTooltip(event, item, color) {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.tooltipData.set({\n title: `${item.x} / ${item.y}`,\n value: item.label || item.value.toLocaleString(),\n color: color,\n });\n this.tooltipVisible.set(true);\n this.updateTooltipPos(event);\n }\n updateTooltipPos(event) {\n const container = this.containerRef().nativeElement;\n const rect = container.getBoundingClientRect();\n const pos = computeTooltipPosition(rect, null, event.clientX, event.clientY, 15);\n this.tooltipPosition.set(pos);\n }\n hideTooltip() {\n this.tooltipVisible.set(false);\n }\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n this.svg?.remove();\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXHeatmapChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.3\", type: AXHeatmapChartComponent, isStandalone: true, selector: \"ax-heatmap-chart\", inputs: { data: { classPropertyName: \"data\", publicName: \"data\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"containerRef\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-heatmap-chart-container\\\" role=\\\"img\\\" #chartContainer>\\n @if (data()?.length === 0) {\\n <div class=\\\"ax-heatmap-no-data\\\">\\n <i [class]=\\\"effectiveOptions().messages?.noDataIcon\\\"></i>\\n <p class=\\\"ax-heatmap-no-data-text\\\">{{ effectiveOptions().messages?.noData }}</p>\\n </div>\\n }\\n</div>\\n\\n<ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\">\\n</ax-chart-tooltip>\\n\", styles: [\"ax-heatmap-chart{display:block;width:100%;height:100%;min-height:300px;--ax-comp-heatmap-chart-bg-color: transparent;--ax-comp-heatmap-chart-text-color: var(--ax-sys-color-on-surface-variant, 28, 27, 31);--ax-comp-heatmap-chart-axis-color: var(--ax-sys-color-outline-variant, 202, 196, 208)}ax-heatmap-chart .ax-heatmap-chart-container{position:relative;width:100%;height:100%;box-sizing:border-box;padding:1rem;overflow:hidden;background-color:var(--ax-comp-heatmap-chart-bg-color)}ax-heatmap-chart .ax-heatmap-chart-container svg{display:block;width:100%;height:100%;overflow:visible}ax-heatmap-chart .ax-heatmap-chart-container svg .cell{transition:stroke .15s ease}ax-heatmap-chart .ax-heatmap-chart-container svg .cell:hover{stroke:rgba(var(--ax-comp-heatmap-chart-text-color),.6);stroke-width:2px}ax-heatmap-chart .ax-heatmap-chart-container svg .axis-label{font-size:12px;font-weight:600;fill:rgb(var(--ax-comp-heatmap-chart-text-color))}ax-heatmap-chart .ax-heatmap-chart-container svg .tick text{font-size:11px;fill:rgba(var(--ax-comp-heatmap-chart-text-color),.7)}ax-heatmap-chart .ax-heatmap-chart-container svg line,ax-heatmap-chart .ax-heatmap-chart-container svg .domain{stroke:rgba(var(--ax-comp-heatmap-chart-axis-color),.5)}ax-heatmap-chart .ax-heatmap-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;color:rgba(var(--ax-comp-heatmap-chart-text-color),.6)}ax-heatmap-chart .ax-heatmap-no-data i{font-size:2rem;margin-bottom:.5rem}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXHeatmapChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-heatmap-chart', encapsulation: ViewEncapsulation.None, standalone: true, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-heatmap-chart-container\\\" role=\\\"img\\\" #chartContainer>\\n @if (data()?.length === 0) {\\n <div class=\\\"ax-heatmap-no-data\\\">\\n <i [class]=\\\"effectiveOptions().messages?.noDataIcon\\\"></i>\\n <p class=\\\"ax-heatmap-no-data-text\\\">{{ effectiveOptions().messages?.noData }}</p>\\n </div>\\n }\\n</div>\\n\\n<ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\">\\n</ax-chart-tooltip>\\n\", styles: [\"ax-heatmap-chart{display:block;width:100%;height:100%;min-height:300px;--ax-comp-heatmap-chart-bg-color: transparent;--ax-comp-heatmap-chart-text-color: var(--ax-sys-color-on-surface-variant, 28, 27, 31);--ax-comp-heatmap-chart-axis-color: var(--ax-sys-color-outline-variant, 202, 196, 208)}ax-heatmap-chart .ax-heatmap-chart-container{position:relative;width:100%;height:100%;box-sizing:border-box;padding:1rem;overflow:hidden;background-color:var(--ax-comp-heatmap-chart-bg-color)}ax-heatmap-chart .ax-heatmap-chart-container svg{display:block;width:100%;height:100%;overflow:visible}ax-heatmap-chart .ax-heatmap-chart-container svg .cell{transition:stroke .15s ease}ax-heatmap-chart .ax-heatmap-chart-container svg .cell:hover{stroke:rgba(var(--ax-comp-heatmap-chart-text-color),.6);stroke-width:2px}ax-heatmap-chart .ax-heatmap-chart-container svg .axis-label{font-size:12px;font-weight:600;fill:rgb(var(--ax-comp-heatmap-chart-text-color))}ax-heatmap-chart .ax-heatmap-chart-container svg .tick text{font-size:11px;fill:rgba(var(--ax-comp-heatmap-chart-text-color),.7)}ax-heatmap-chart .ax-heatmap-chart-container svg line,ax-heatmap-chart .ax-heatmap-chart-container svg .domain{stroke:rgba(var(--ax-comp-heatmap-chart-axis-color),.5)}ax-heatmap-chart .ax-heatmap-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;color:rgba(var(--ax-comp-heatmap-chart-text-color),.6)}ax-heatmap-chart .ax-heatmap-no-data i{font-size:2rem;margin-bottom:.5rem}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhdG1hcC1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvaGVhdG1hcC1jaGFydC9zcmMvbGliL2hlYXRtYXAtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2hlYXRtYXAtY2hhcnQvc3JjL2xpYi9oZWF0bWFwLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQVlqRSxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsZ0JBQWdCO0lBQzNELGlDQUFpQztJQUNoQixhQUFhLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFFakUsU0FBUztJQUNULElBQUksR0FBRyxLQUFLLENBQWtCLEVBQUUsZ0RBQUMsQ0FBQztJQUNsQyxPQUFPLEdBQUcsS0FBSyxDQUF1QixFQUFFLG1EQUFDLENBQUM7SUFFMUMsYUFBYTtJQUNJLFlBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUE2QixnQkFBZ0IsQ0FBQyxDQUFDO0lBRWpHLGlCQUFpQjtJQUNULEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBMEIsSUFBSSxDQUFDO0lBQzNDLEVBQUUsQ0FBTTtJQUNWLFFBQVEs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LE1BQU0sR0FBRyxHQUFHLHNCQUFzQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3JCLENBQUM7dUdBeEtVLHVCQUF1QjsyRkFBdkIsdUJBQXVCLGtlQzVCcEMsNmNBV0Esc2lERGNZLHVCQUF1Qjs7MkZBR3RCLHVCQUF1QjtrQkFUbkMsU0FBUzsrQkFDRSxrQkFBa0IsaUJBR2IsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYQ2hhcnRDb21wb25lbnQsIGNvbXB1dGVUb29sdGlwUG9zaXRpb24sIGdldEVhc2luZ0Z1bmN0aW9uIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWF9IRUFUTUFQX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vaGVhdG1hcC1jaGFydC5jb25maWcnO1xuaW1wb3J0IHsgQVhIZWF0bWFwQ2hhcnRPcHRpb24sIEFYSGVhdG1hcERhdGEgfSBmcm9tICcuL2hlYXRtYXAtY2hhcnQudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWhlYXRtYXAtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhdG1hcC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hlYXRtYXAtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYSGVhdG1hcENoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQVhDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIEluamVjdCBjb25maWcgYXQgdGhlIHRvcCBsZXZlbFxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRDb25maWcgPSBpbmplY3QoQVhfSEVBVE1BUF9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIElucHV0c1xuICBkYXRhID0gaW5wdXQ8QVhIZWF0bWFwRGF0YVtdPihbXSk7XG4gIG9wdGlvbnMgPSBpbnB1dDxBWEhlYXRtYXBDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIFZpZXcgQ2hpbGRcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIEludGVybmFsIFN0YXRlXG4gIHByaXZhdGUgc3ZnOiBhbnk7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBkMzogYW55O1xuICBwcml2YXRlIF9kM1JlYWR5ID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUb29sdGlwIFN0YXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCB0b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcm90ZWN0ZWQgdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7IHRpdGxlOiAnJywgdmFsdWU6ICcnIH0pO1xuXG4gIC8vIENvbXB1dGVkIG9wdGlvbnMgKHJlZmVyZW5jaW5nIHRoZSBhbHJlYWR5IGluamVjdGVkIGRlZmF1bHRDb25maWcpXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICAuLi50aGlzLmRlZmF1bHRDb25maWcsXG4gICAgLi4udGhpcy5vcHRpb25zKCksXG4gIH0pKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBEMyBhbmQgUmVzaXplT2JzZXJ2ZXJcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWFjdGl2ZSBSZW5kZXIgd2hlbiBkYXRhIG9yIEQzIGlzIHJlYWR5XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9kM1JlYWR5KCkpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJDaGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0KCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmQzID0gYXdhaXQgaW1wb3J0KCdkMycpO1xuXG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2QzUmVhZHkoKSkgdGhpcy5yZW5kZXJDaGFydCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5jb250YWluZXJSZWYoKS5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgdGhpcy5fZDNSZWFkeS5zZXQodHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdIZWF0bWFwOiBJbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2hhcnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEoKSB8fCBbXTtcblxuICAgIGlmICghY29udGFpbmVyIHx8IGNvbnRhaW5lci5jbGllbnRXaWR0aCA9PT0gMCB8fCBjb250YWluZXIuY2xpZW50SGVpZ2h0ID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBDbGVhciBTVkcgaWYgZGF0YSBpcyBlbXB0eVxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuc3ZnKSB0aGlzLnN2Zy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBtYXJnaW4gPSBvcHRpb25zLm1hcmdpbiB8fCB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiA0MCwgbGVmdDogNDAgfTtcblxuICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xuICAgIGNvbnN0IGlubmVySGVpZ2h0ID0gaGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207XG5cbiAgICAvLyBDcmVhdGUvU2VsZWN0IFNWRyByb290XG4gICAgaWYgKCF0aGlzLnN2Zykge1xuICAgICAgdGhpcy5zdmcgPSB0aGlzLmQzLnNlbGVjdChjb250YWluZXIpLmFwcGVuZCgnc3ZnJykuYXR0cignc3R5bGUnLCAnd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgZGlzcGxheTogYmxvY2s7Jyk7XG4gICAgICB0aGlzLnN2Zy5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdjaGFydC1ncm91cCcpO1xuICAgIH1cblxuICAgIHRoaXMuc3ZnLmF0dHIoJ3ZpZXdCb3gnLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIGNvbnN0IGcgPSB0aGlzLnN2Zy5zZWxlY3QoJy5jaGFydC1ncm91cCcpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdH0sJHttYXJnaW4udG9wfSlgKTtcblxuICAgIC8vIC0tLSBTY2FsZXMgLS0tXG4gICAgY29uc3QgeEtleXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YS5tYXAoKGQpID0+IGQueC50b1N0cmluZygpKSkpO1xuICAgIGNvbnN0IHlLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEubWFwKChkKSA9PiBkLnkudG9TdHJpbmcoKSkpKTtcblxuICAgIGNvbnN0IHhTY2FsZSA9IHRoaXMuZDMuc2NhbGVCYW5kKCkuZG9tYWluKHhLZXlzKS5yYW5nZShbMCwgaW5uZXJXaWR0aF0pLnBhZGRpbmcob3B0aW9ucy5jZWxsUGFkZGluZyk7XG4gICAgY29uc3QgeVNjYWxlID0gdGhpcy5kMy5zY2FsZUJhbmQoKS5kb21haW4oeUtleXMpLnJhbmdlKFtpbm5lckhlaWdodCwgMF0pLnBhZGRpbmcob3B0aW9ucy5jZWxsUGFkZGluZyk7XG5cbiAgICBjb25zdCB2YWx1ZUV4dGVudCA9IHRoaXMuZDMuZXh0ZW50KGRhdGEsIChkOiBhbnkpID0+IGQudmFsdWUpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgY29uc3QgY29sb3JTY2FsZSA9IHRoaXMuZDNcbiAgICAgIC5zY2FsZVNlcXVlbnRpYWwoKVxuICAgICAgLmRvbWFpbihbdmFsdWVFeHRlbnRbMF0gfHwgMCwgdmFsdWVFeHRlbnRbMV0gfHwgMV0pXG4gICAgICAuaW50ZXJwb2xhdG9yKHRoaXMuZDMuaW50ZXJwb2xhdGVSZ2JCYXNpcyhvcHRpb25zLmNvbG9ycykpO1xuXG4gICAgLy8gLS0tIEF4ZXMgLS0tXG4gICAgdGhpcy5kcmF3QXhpcyhnLCAneC1heGlzJywgdGhpcy5kMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemUoMCksIDAsIGlubmVySGVpZ2h0LCBvcHRpb25zLnNob3dYQXhpcyk7XG4gICAgdGhpcy5kcmF3QXhpcyhnLCAneS1heGlzJywgdGhpcy5kMy5heGlzTGVmdCh5U2NhbGUpLnRpY2tTaXplKDApLCAwLCAwLCBvcHRpb25zLnNob3dZQXhpcyk7XG5cbiAgICAvLyAtLS0gQ2VsbHMgd2l0aCBEYXRhIEpvaW4gLS0tXG4gICAgY29uc3QgZWFzaW5nID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgb3B0aW9ucy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgZy5zZWxlY3RBbGwoJy5jZWxsJylcbiAgICAgIC5kYXRhKGRhdGEsIChkOiBhbnkpID0+IGAke2QueH0tJHtkLnl9YClcbiAgICAgIC5qb2luKFxuICAgICAgICAoZW50ZXI6IGFueSkgPT4gZW50ZXIuYXBwZW5kKCdyZWN0JykuYXR0cignY2xhc3MnLCAnY2VsbCcpLmF0dHIoJ29wYWNpdHknLCAwKS5hdHRyKCdmaWxsJywgb3B0aW9ucy5jb2xvcnMhWzBdKSxcbiAgICAgICAgKHVwZGF0ZTogYW55KSA9PiB1cGRhdGUsXG4gICAgICAgIChleGl0OiBhbnkpID0+IGV4aXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKDIwMCkuYXR0cignb3BhY2l0eScsIDApLnJlbW92ZSgpLFxuICAgICAgKVxuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50OiBhbnksIGQ6IGFueSkgPT4gdGhpcy5zaG93VG9vbHRpcChldmVudCwgZCwgY29sb3JTY2FsZShkLnZhbHVlKSkpXG4gICAgICAub24oJ21vdXNlbW92ZScsIChldmVudDogYW55KSA9PiB0aGlzLnVwZGF0ZVRvb2x0aXBQb3MoZXZlbnQpKVxuICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oaWRlVG9vbHRpcCgpKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZWFzZShlYXNpbmcpXG4gICAgICAuYXR0cigneCcsIChkOiBhbnkpID0+IHhTY2FsZShkLngudG9TdHJpbmcoKSkpXG4gICAgICAuYXR0cigneScsIChkOiBhbnkpID0+IHlTY2FsZShkLnkudG9TdHJpbmcoKSkpXG4gICAgICAuYXR0cignd2lkdGgnLCB4U2NhbGUuYmFuZHdpZHRoKCkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgeVNjYWxlLmJhbmR3aWR0aCgpKVxuICAgICAgLmF0dHIoJ3J4Jywgb3B0aW9ucy5ib3JkZXJSYWRpdXMpXG4gICAgICAuYXR0cigncnknLCBvcHRpb25zLmJvcmRlclJhZGl1cylcbiAgICAgIC5hdHRyKCdvcGFjaXR5JywgMSlcbiAgICAgIC5zdHlsZSgnZmlsbCcsIChkOiBhbnkpID0+IGNvbG9yU2NhbGUoZC52YWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3QXhpcyhnOiBhbnksIGNsYXNzTmFtZTogc3RyaW5nLCBheGlzRm46IGFueSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHZpc2libGUgPSB0cnVlKSB7XG4gICAgbGV0IGF4aXNHID0gZy5zZWxlY3QoYC4ke2NsYXNzTmFtZX1gKTtcbiAgICBpZiAoYXhpc0cuZW1wdHkoKSkgYXhpc0cgPSBnLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgY2xhc3NOYW1lKTtcblxuICAgIGF4aXNHXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3h9LCR7eX0pYClcbiAgICAgIC5zdHlsZSgnZGlzcGxheScsIHZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnKVxuICAgICAgLmNhbGwoYXhpc0ZuKVxuICAgICAgLmNhbGwoKGc6IGFueSkgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBBWEhlYXRtYXBEYXRhLCBjb2xvcjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkgcmV0dXJuO1xuICAgIHRoaXMudG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBgJHtpdGVtLnh9IC8gJHtpdGVtLnl9YCxcbiAgICAgIHZhbHVlOiBpdGVtLmxhYmVsIHx8IGl0ZW0udmFsdWUudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICAgIGNvbG9yOiBjb2xvcixcbiAgICB9KTtcbiAgICB0aGlzLnRvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3MoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUG9zKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihyZWN0LCBudWxsLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCAxNSk7XG4gICAgdGhpcy50b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVUb29sdGlwKCkge1xuICAgIHRoaXMudG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnN2Zz8ucmVtb3ZlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1oZWF0bWFwLWNoYXJ0LWNvbnRhaW5lclwiIHJvbGU9XCJpbWdcIiAjY2hhcnRDb250YWluZXI+XG4gIEBpZiAoZGF0YSgpPy5sZW5ndGggPT09IDApIHtcbiAgICA8ZGl2IGNsYXNzPVwiYXgtaGVhdG1hcC1uby1kYXRhXCI+XG4gICAgICA8aSBbY2xhc3NdPVwiZWZmZWN0aXZlT3B0aW9ucygpLm1lc3NhZ2VzPy5ub0RhdGFJY29uXCI+PC9pPlxuICAgICAgPHAgY2xhc3M9XCJheC1oZWF0bWFwLW5vLWRhdGEtdGV4dFwiPnt7IGVmZmVjdGl2ZU9wdGlvbnMoKS5tZXNzYWdlcz8ubm9EYXRhIH19PC9wPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuPGF4LWNoYXJ0LXRvb2x0aXAgW2RhdGFdPVwidG9vbHRpcERhdGEoKVwiIFtwb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24oKVwiIFt2aXNpYmxlXT1cInRvb2x0aXBWaXNpYmxlKClcIj5cbjwvYXgtY2hhcnQtdG9vbHRpcD5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1oZWF0bWFwLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2hlYXRtYXAtY2hhcnQvc3JjL2Fjb3JleC1jaGFydHMtaGVhdG1hcC1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
@@ -117,6 +117,7 @@ class AXLineChartComponent extends AXChartComponent {
117
117
  MIN_MARGIN_BOTTOM = 45;
118
118
  MIN_MARGIN_LEFT = 55;
119
119
  MAX_EXTRA_MARGIN = 60;
120
+ CHART_EDGE_PADDING = 12;
120
121
  // Styling & Visual
121
122
  DEFAULT_LINE_WIDTH = 2;
122
123
  DEFAULT_POINT_RADIUS = 4;
@@ -381,22 +382,19 @@ class AXLineChartComponent extends AXChartComponent {
381
382
  this.height = Math.max(this.height, this.MIN_DIMENSION);
382
383
  const totalWidth = this.width + this.margin.left + this.margin.right;
383
384
  const totalHeight = this.height + this.margin.top + this.margin.bottom;
385
+ const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;
386
+ const viewBoxHeight = totalHeight + this.CHART_EDGE_PADDING * 2;
384
387
  const svg = this.d3
385
388
  .select(containerElement)
386
389
  .append('svg')
387
- .attr('width', totalWidth)
388
- .attr('height', totalHeight)
389
- .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)
390
- .attr('preserveAspectRatio', 'xMidYMid meet')
391
- .attr('style', `
392
- width: ${totalWidth}px;
393
- height: ${totalHeight}px;
394
- max-width: 100%;
395
- max-height: 100%;
396
- overflow: visible;
397
- `);
390
+ .attr('width', '100%')
391
+ .attr('height', '100%')
392
+ .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)
393
+ .attr('preserveAspectRatio', 'xMidYMid meet');
398
394
  this.svg = svg;
399
- this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);
395
+ this.chart = this.svg
396
+ .append('g')
397
+ .attr('transform', `translate(${this.margin.left + this.CHART_EDGE_PADDING},${this.margin.top + this.CHART_EDGE_PADDING})`);
400
398
  }
401
399
  calculateMargins(options, containerWidth) {
402
400
  this.margin = {
@@ -1167,11 +1165,11 @@ class AXLineChartComponent extends AXChartComponent {
1167
1165
  }
1168
1166
  }
1169
1167
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXLineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXLineChartComponent, isStandalone: true, selector: "ax-line-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pointClick: "pointClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\n"], dependencies: [{ kind: "component", type: AXChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1168
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXLineChartComponent, isStandalone: true, selector: "ax-line-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pointClick: "pointClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\n"], dependencies: [{ kind: "component", type: AXChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1171
1169
  }
1172
1170
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXLineChartComponent, decorators: [{
1173
1171
  type: Component,
1174
- args: [{ selector: 'ax-line-chart', standalone: true, encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\n"] }]
1172
+ args: [{ selector: 'ax-line-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: ["ax-line-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);border-radius:.5rem;overflow:hidden;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\n"] }]
1175
1173
  }] });
1176
1174
 
1177
1175
  /**