@acorex/charts 20.6.32 → 20.6.34

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.
@@ -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 Render when data or D3 is ready
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 = container.clientWidth;
101
- const height = container.clientHeight;
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
- const margin = isRtl
120
+ let margin = isRtl
107
121
  ? { top: baseMargin.top, right: baseMargin.left, bottom: baseMargin.bottom, left: baseMargin.right }
108
- : baseMargin;
109
- const innerWidth = width - margin.left - margin.right;
110
- const innerHeight = height - margin.top - margin.bottom;
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.select(container).append('svg').attr('style', 'width: 100%; height: 100%; display: block;');
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(options.cellPadding);
126
- const yScale = this.d3.scaleBand().domain(yKeys).range([innerHeight, 0]).padding(options.cellPadding);
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
- this.drawAxis(g, 'x-axis', this.d3.axisBottom(xScale).tickSize(0), 0, innerHeight, options.showXAxis, isRtl);
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 + 44)
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: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 });
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: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"] }]
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
  /**