@acorex/charts 20.6.32 → 20.6.33
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 +2 -2
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +2 -2
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +14 -40
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +2 -2
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +130 -24
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +2 -2
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/funnel-chart/index.d.ts +9 -4
- package/heatmap-chart/index.d.ts +21 -0
- package/package.json +5 -5
|
@@ -12,6 +12,7 @@ const AXHeatmapChartDefaultConfig = {
|
|
|
12
12
|
borderRadius: 2,
|
|
13
13
|
showXAxis: true,
|
|
14
14
|
showYAxis: true,
|
|
15
|
+
rotateXAxisLabels: 'auto',
|
|
15
16
|
showTooltip: true,
|
|
16
17
|
animationDuration: 800,
|
|
17
18
|
animationEasing: 'cubic-out',
|
|
@@ -27,6 +28,19 @@ const AX_HEATMAP_CHART_CONFIG = new InjectionToken('AX_HEATMAP_CHART_CONFIG', {
|
|
|
27
28
|
});
|
|
28
29
|
|
|
29
30
|
class AXHeatmapChartComponent extends AXChartComponent {
|
|
31
|
+
/** Fixed `viewBox` side; chart scales with CSS `width` / `height` on the host container. */
|
|
32
|
+
static VIEW_BOX_SIZE = 400;
|
|
33
|
+
// X-axis layout (aligned with bar-chart heuristics)
|
|
34
|
+
CHAR_WIDTH_RATIO = 0.65;
|
|
35
|
+
ROTATION_TOLERANCE_SMALL_DATASET = 1.4;
|
|
36
|
+
SMALL_DATASET_THRESHOLD = 6;
|
|
37
|
+
MANY_ITEMS_THRESHOLD = 20;
|
|
38
|
+
VERY_MANY_ITEMS_THRESHOLD = 50;
|
|
39
|
+
MAX_LABEL_LENGTH = 20;
|
|
40
|
+
TICK_AREA_PADDING = 6;
|
|
41
|
+
X_AXIS_TITLE_GAP = 10;
|
|
42
|
+
MIN_FONT_SIZE_X_AXIS = 8;
|
|
43
|
+
MAX_FONT_SIZE_X_AXIS = 14;
|
|
30
44
|
// Inject config at the top level
|
|
31
45
|
defaultConfig = inject(AX_HEATMAP_CHART_CONFIG);
|
|
32
46
|
// Inputs
|
|
@@ -56,20 +70,19 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
56
70
|
}), ...(ngDevMode ? [{ debugName: "effectiveOptions" }] : []));
|
|
57
71
|
constructor() {
|
|
58
72
|
super();
|
|
59
|
-
// Initialize D3 and ResizeObserver
|
|
60
73
|
afterNextRender(() => {
|
|
61
74
|
this.init();
|
|
62
|
-
this.directionSub = this.platformService.directionChange
|
|
63
|
-
.pipe(map((i) => i.data === 'rtl'))
|
|
64
|
-
.subscribe((isRtl) => {
|
|
75
|
+
this.directionSub = this.platformService.directionChange.pipe(map((i) => i.data === 'rtl')).subscribe((isRtl) => {
|
|
65
76
|
this.isRtl.set(isRtl);
|
|
66
77
|
if (this._d3Ready()) {
|
|
67
78
|
this.renderChart();
|
|
68
79
|
}
|
|
69
80
|
});
|
|
70
81
|
});
|
|
71
|
-
// Reactive
|
|
82
|
+
// Reactive render when data, options, or D3 readiness change
|
|
72
83
|
effect(() => {
|
|
84
|
+
this.data();
|
|
85
|
+
this.effectiveOptions();
|
|
73
86
|
if (this._d3Ready()) {
|
|
74
87
|
this.renderChart();
|
|
75
88
|
}
|
|
@@ -84,11 +97,12 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
84
97
|
console.error('Heatmap: Initialization failed', err);
|
|
85
98
|
}
|
|
86
99
|
}
|
|
100
|
+
updateChart() {
|
|
101
|
+
this.renderChart();
|
|
102
|
+
}
|
|
87
103
|
renderChart() {
|
|
88
104
|
const container = this.containerRef().nativeElement;
|
|
89
105
|
const data = this.data() || [];
|
|
90
|
-
if (!container || container.clientWidth === 0 || container.clientHeight === 0)
|
|
91
|
-
return;
|
|
92
106
|
// Clear SVG if data is empty
|
|
93
107
|
if (data.length === 0) {
|
|
94
108
|
if (this.svg)
|
|
@@ -97,33 +111,60 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
97
111
|
return;
|
|
98
112
|
}
|
|
99
113
|
const options = this.effectiveOptions();
|
|
100
|
-
const width =
|
|
101
|
-
const height =
|
|
114
|
+
const width = AXHeatmapChartComponent.VIEW_BOX_SIZE;
|
|
115
|
+
const height = AXHeatmapChartComponent.VIEW_BOX_SIZE;
|
|
102
116
|
const isRtl = this.isRtl();
|
|
103
117
|
const baseMargin = options.margin || { top: 20, right: 20, bottom: 40, left: 40 };
|
|
104
118
|
// When rendering RTL, the Y axis is on the right; swap side margins so tick labels
|
|
105
119
|
// have the same breathing room they get on the left in LTR.
|
|
106
|
-
|
|
120
|
+
let margin = isRtl
|
|
107
121
|
? { top: baseMargin.top, right: baseMargin.left, bottom: baseMargin.bottom, left: baseMargin.right }
|
|
108
|
-
: baseMargin;
|
|
109
|
-
const
|
|
110
|
-
const
|
|
122
|
+
: { ...baseMargin };
|
|
123
|
+
const xKeys = Array.from(new Set(data.map((d) => d.x.toString())));
|
|
124
|
+
const yKeys = Array.from(new Set(data.map((d) => d.y.toString())));
|
|
125
|
+
let innerWidth = width - margin.left - margin.right;
|
|
126
|
+
const cellPad = options.cellPadding ?? 0;
|
|
127
|
+
const xScaleProbe = this.d3
|
|
128
|
+
.scaleBand()
|
|
129
|
+
.domain(xKeys)
|
|
130
|
+
.range(isRtl ? [innerWidth, 0] : [0, innerWidth])
|
|
131
|
+
.padding(cellPad);
|
|
132
|
+
const xTickFontSize = this.getHeatmapXTickFontSize(innerWidth, xKeys.length);
|
|
133
|
+
const { tickXKeys, formatXTick } = this.getHeatmapXTickPlan(xKeys);
|
|
134
|
+
const longestXLabel = xKeys.reduce((acc, k) => {
|
|
135
|
+
const t = formatXTick(k);
|
|
136
|
+
return t.length > acc.length ? t : acc;
|
|
137
|
+
}, '');
|
|
138
|
+
const estimatedLabelWidth = longestXLabel.length * xTickFontSize * this.CHAR_WIDTH_RATIO;
|
|
139
|
+
const step = xScaleProbe.step();
|
|
140
|
+
const rotateX = this.shouldRotateHeatmapXLabels(options.rotateXAxisLabels, estimatedLabelWidth, step, xKeys.length);
|
|
141
|
+
const tickAreaHeight = rotateX
|
|
142
|
+
? estimatedLabelWidth * Math.SQRT1_2 + xTickFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING
|
|
143
|
+
: xTickFontSize + this.TICK_AREA_PADDING + 2;
|
|
144
|
+
const xAxisTitleReserve = options.xAxisLabel?.trim() ? this.X_AXIS_TITLE_GAP + 16 : 0;
|
|
145
|
+
margin = { ...margin, bottom: Math.max(margin.bottom, tickAreaHeight + xAxisTitleReserve) };
|
|
146
|
+
innerWidth = width - margin.left - margin.right;
|
|
147
|
+
const innerHeight = Math.max(1, height - margin.top - margin.bottom);
|
|
111
148
|
// Create/Select SVG root
|
|
112
149
|
if (!this.svg) {
|
|
113
|
-
this.svg = this.d3
|
|
150
|
+
this.svg = this.d3
|
|
151
|
+
.select(container)
|
|
152
|
+
.append('svg')
|
|
153
|
+
.attr('width', '100%')
|
|
154
|
+
.attr('height', '100%')
|
|
155
|
+
.attr('preserveAspectRatio', 'xMidYMid meet')
|
|
156
|
+
.style('display', 'block');
|
|
114
157
|
this.svg.append('g').attr('class', 'chart-group');
|
|
115
158
|
}
|
|
116
159
|
this.svg.attr('viewBox', `0 0 ${width} ${height}`);
|
|
117
160
|
const g = this.svg.select('.chart-group').attr('transform', `translate(${margin.left},${margin.top})`);
|
|
118
161
|
// --- Scales ---
|
|
119
|
-
const xKeys = Array.from(new Set(data.map((d) => d.x.toString())));
|
|
120
|
-
const yKeys = Array.from(new Set(data.map((d) => d.y.toString())));
|
|
121
162
|
const xScale = this.d3
|
|
122
163
|
.scaleBand()
|
|
123
164
|
.domain(xKeys)
|
|
124
165
|
.range(isRtl ? [innerWidth, 0] : [0, innerWidth])
|
|
125
|
-
.padding(
|
|
126
|
-
const yScale = this.d3.scaleBand().domain(yKeys).range([innerHeight, 0]).padding(
|
|
166
|
+
.padding(cellPad);
|
|
167
|
+
const yScale = this.d3.scaleBand().domain(yKeys).range([innerHeight, 0]).padding(cellPad);
|
|
127
168
|
const valueExtent = this.d3.extent(data, (d) => d.value);
|
|
128
169
|
const minValue = Number.isFinite(valueExtent[0]) ? valueExtent[0] : 0;
|
|
129
170
|
const maxValue = Number.isFinite(valueExtent[1]) ? valueExtent[1] : minValue + 1;
|
|
@@ -154,14 +195,23 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
154
195
|
return this.applyIntensityToResolvedRgb(resolvedBase, clamped);
|
|
155
196
|
};
|
|
156
197
|
// --- Axes ---
|
|
157
|
-
|
|
198
|
+
const xAxisBuilder = this.d3
|
|
199
|
+
.axisBottom(xScale)
|
|
200
|
+
.tickSize(0)
|
|
201
|
+
.tickFormat((d) => formatXTick(String(d)));
|
|
202
|
+
if (tickXKeys.length < xKeys.length) {
|
|
203
|
+
xAxisBuilder.tickValues(tickXKeys);
|
|
204
|
+
}
|
|
205
|
+
this.drawAxis(g, 'x-axis', xAxisBuilder, 0, innerHeight, options.showXAxis, isRtl);
|
|
206
|
+
g.select('.x-axis').attr('direction', 'ltr');
|
|
207
|
+
this.styleHeatmapXAxisTicks(g, xTickFontSize, rotateX);
|
|
158
208
|
if (isRtl) {
|
|
159
209
|
this.drawAxis(g, 'y-axis', this.d3.axisRight(yScale).tickSize(0), innerWidth, 0, options.showYAxis, isRtl);
|
|
160
210
|
}
|
|
161
211
|
else {
|
|
162
212
|
this.drawAxis(g, 'y-axis', this.d3.axisLeft(yScale).tickSize(0), 0, 0, options.showYAxis, isRtl);
|
|
163
213
|
}
|
|
164
|
-
this.drawAxisLabels(g, innerWidth, innerHeight, options, isRtl);
|
|
214
|
+
this.drawAxisLabels(g, innerWidth, innerHeight, options, isRtl, tickAreaHeight);
|
|
165
215
|
// --- Cells with Data Join ---
|
|
166
216
|
const easing = getEasingFunction(this.d3, options.animationEasing);
|
|
167
217
|
g.selectAll('.cell')
|
|
@@ -250,7 +300,7 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
250
300
|
if (this._tooltipRafId)
|
|
251
301
|
cancelAnimationFrame(this._tooltipRafId);
|
|
252
302
|
}
|
|
253
|
-
drawAxisLabels(g, innerWidth, innerHeight, options, isRtl) {
|
|
303
|
+
drawAxisLabels(g, innerWidth, innerHeight, options, isRtl, xTickAreaHeight) {
|
|
254
304
|
const xText = options.xAxisLabel?.trim();
|
|
255
305
|
const yText = options.yAxisLabel?.trim();
|
|
256
306
|
const labels = g.selectAll('.axis-labels').data([0]).join('g').attr('class', 'axis-labels');
|
|
@@ -259,7 +309,7 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
259
309
|
.data(xText ? [xText] : [])
|
|
260
310
|
.join((enter) => enter.append('text').attr('class', 'axis-label axis-label-x'), (update) => update, (exit) => exit.remove())
|
|
261
311
|
.attr('x', innerWidth / 2)
|
|
262
|
-
.attr('y', innerHeight +
|
|
312
|
+
.attr('y', innerHeight + xTickAreaHeight + (xText ? this.X_AXIS_TITLE_GAP : 0))
|
|
263
313
|
.attr('text-anchor', 'middle')
|
|
264
314
|
.text((d) => d);
|
|
265
315
|
const yX = isRtl ? innerWidth + 46 : -46;
|
|
@@ -271,12 +321,68 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
271
321
|
.attr('text-anchor', 'middle')
|
|
272
322
|
.text((d) => d);
|
|
273
323
|
}
|
|
324
|
+
getHeatmapXTickFontSize(innerWidth, itemCount) {
|
|
325
|
+
const baseSize = Math.round(innerWidth / 50);
|
|
326
|
+
let adjustedSize = baseSize;
|
|
327
|
+
if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {
|
|
328
|
+
adjustedSize = Math.round(baseSize * 0.7);
|
|
329
|
+
}
|
|
330
|
+
else if (itemCount > this.MANY_ITEMS_THRESHOLD) {
|
|
331
|
+
adjustedSize = Math.round(baseSize * 0.85);
|
|
332
|
+
}
|
|
333
|
+
return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));
|
|
334
|
+
}
|
|
335
|
+
getHeatmapXTickPlan(xKeys) {
|
|
336
|
+
const n = xKeys.length;
|
|
337
|
+
const maxLabelLength = n > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;
|
|
338
|
+
let tickXKeys = xKeys;
|
|
339
|
+
if (n > this.VERY_MANY_ITEMS_THRESHOLD) {
|
|
340
|
+
tickXKeys = xKeys.filter((_, i) => i % 5 === 0);
|
|
341
|
+
}
|
|
342
|
+
else if (n > this.MANY_ITEMS_THRESHOLD) {
|
|
343
|
+
tickXKeys = xKeys.filter((_, i) => i % 2 === 0);
|
|
344
|
+
}
|
|
345
|
+
const formatXTick = (d) => this.truncateHeatmapLabel(d, maxLabelLength);
|
|
346
|
+
return { tickXKeys, formatXTick };
|
|
347
|
+
}
|
|
348
|
+
truncateHeatmapLabel(label, maxLength) {
|
|
349
|
+
if (label.length <= maxLength)
|
|
350
|
+
return label;
|
|
351
|
+
if (maxLength <= 1)
|
|
352
|
+
return '…';
|
|
353
|
+
return `${label.substring(0, maxLength - 1)}…`;
|
|
354
|
+
}
|
|
355
|
+
shouldRotateHeatmapXLabels(rotateOption, estimatedLabelWidth, step, domainCount) {
|
|
356
|
+
if (rotateOption === true)
|
|
357
|
+
return true;
|
|
358
|
+
if (rotateOption === false)
|
|
359
|
+
return false;
|
|
360
|
+
if (domainCount === 0)
|
|
361
|
+
return false;
|
|
362
|
+
if (domainCount <= this.SMALL_DATASET_THRESHOLD) {
|
|
363
|
+
return estimatedLabelWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;
|
|
364
|
+
}
|
|
365
|
+
return estimatedLabelWidth > step;
|
|
366
|
+
}
|
|
367
|
+
styleHeatmapXAxisTicks(g, fontSize, rotated) {
|
|
368
|
+
const texts = g
|
|
369
|
+
.select('.x-axis')
|
|
370
|
+
.selectAll('.tick text')
|
|
371
|
+
.style('font-size', `${fontSize}px`)
|
|
372
|
+
.style('font-weight', '400');
|
|
373
|
+
if (rotated) {
|
|
374
|
+
texts.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
texts.attr('transform', null).style('text-anchor', 'middle').attr('dx', null).attr('dy', '0.71em');
|
|
378
|
+
}
|
|
379
|
+
}
|
|
274
380
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXHeatmapChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
275
|
-
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 } }, outputs: { cellClick: "cellClick" }, 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:
|
|
381
|
+
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 } }, outputs: { cellClick: "cellClick" }, 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:0;box-sizing:border-box;--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%;min-height:0;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 });
|
|
276
382
|
}
|
|
277
383
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXHeatmapChartComponent, decorators: [{
|
|
278
384
|
type: Component,
|
|
279
|
-
args: [{ selector: 'ax-heatmap-chart', encapsulation: ViewEncapsulation.None, 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:
|
|
385
|
+
args: [{ selector: 'ax-heatmap-chart', encapsulation: ViewEncapsulation.None, 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:0;box-sizing:border-box;--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%;min-height:0;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"] }]
|
|
280
386
|
}], ctorParameters: () => [] });
|
|
281
387
|
|
|
282
388
|
/**
|