@acorex/charts 21.0.1-next.81 → 21.0.1-next.83
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.map +1 -1
- package/fesm2022/acorex-charts-chart-legend.mjs +2 -2
- package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +26 -27
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +31 -27
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-hierarchy-chart.mjs +1 -2
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +1 -4
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs +25 -1
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-charts-funnel-chart.d.ts +23 -6
- package/types/acorex-charts-heatmap-chart.d.ts +24 -8
- package/types/acorex-charts.d.ts +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-funnel-chart.mjs","sources":["../../../../packages/charts/funnel-chart/src/lib/funnel-chart.config.ts","../../../../packages/charts/funnel-chart/src/lib/funnel-chart.component.ts","../../../../packages/charts/funnel-chart/src/lib/funnel-chart.component.html","../../../../packages/charts/funnel-chart/src/acorex-charts-funnel-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXFunnelChartOption } from './funnel-chart.type';\n\nexport const AXFunnelChartDefaultConfig: AXFunnelChartOption = {\n margin: { top: 20, right: 160, bottom: 20, left: 160 },\n neckWidth: 0.3,\n showLabels: true,\n labelOffset: 24,\n showTooltip: true,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n startColor: 'rgb(var(--ax-sys-color-primary-50))',\n endColor: 'rgb(var(--ax-sys-color-primary-950))',\n messages: {\n noData: 'No funnel data available',\n noDataIcon: 'fa-light fa-filter-list',\n },\n};\n\nexport const AX_FUNNEL_CHART_CONFIG = new InjectionToken<AXFunnelChartOption>('AX_FUNNEL_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXFunnelChartDefaultConfig,\n});\n","import { AXChartComponent, AXChartComponentBase, computeTooltipPosition, getEasingFunction } from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { map, Subscription } from 'rxjs';\nimport { AX_FUNNEL_CHART_CONFIG } from './funnel-chart.config';\nimport { AXFunnelChartOption, AXFunnelData } from './funnel-chart.type';\n\n@Component({\n selector: 'ax-funnel-chart',\n templateUrl: './funnel-chart.component.html',\n styleUrls: ['./funnel-chart.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXFunnelChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n // Inputs\n data = input<AXFunnelData[]>([]);\n options = input<AXFunnelChartOption>({});\n\n // Outputs\n /** Emitted when a funnel segment is clicked */\n segmentClick = output<AXFunnelData>();\n\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // SVG State\n private svgElement: SVGSVGElement | null = null;\n protected d3!: typeof import('d3');\n private _initialized = signal(false);\n private _rendered = signal(false);\n private platformService = inject(AXPlatform);\n protected isRtl = signal(this.platformService.isRtl());\n private directionSub?: Subscription;\n\n // Tooltip Signals\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({ title: '', value: '' });\n private _tooltipRafId: number | null = null;\n\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n private configToken = inject(AX_FUNNEL_CHART_CONFIG);\n\n protected effectiveOptions = computed(() => ({\n ...this.configToken,\n ...this.options(),\n }));\n\n constructor() {\n super();\n\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n this.directionSub = this.platformService.directionChange\n .pipe(map((i) => i.data === 'rtl'))\n .subscribe((isRtl) => {\n this.isRtl.set(isRtl);\n if (this._rendered()) {\n this.updateChart();\n }\n });\n });\n\n effect(() => {\n // Trigger update on data or option change\n this.data();\n this.effectiveOptions();\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.directionSub?.unsubscribe();\n this.cleanupChart();\n }\n\n protected async loadD3(): Promise<void> {\n if (this.d3) return;\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('AXFunnelChart: Failed to load D3.js', error);\n }\n }\n\n public createChart(): void {\n if (this.svgElement) this.svgElement.remove();\n\n const data = [...this.data()].sort((a, b) => b.value - a.value);\n if (!data.length) {\n this.hideTooltip();\n return;\n }\n\n const container = this.chartContainerEl().nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n const opt = this.effectiveOptions();\n const margin = opt.margin;\n const isRtl = this.isRtl();\n const labelOffset = opt.labelOffset ?? 24;\n\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n container.appendChild(this.svgElement);\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n const g = svg.append('g').attr('transform', `translate(${margin.left},${margin.top})`);\n\n const sliceHeight = innerHeight / data.length;\n const maxValue = data[0].value;\n const minValue = data[data.length - 1]?.value ?? maxValue;\n const easing = getEasingFunction(this.d3, opt.animationEasing);\n\n data.forEach((d, i) => {\n const topVal = d.value;\n const bottomVal = data[i + 1]?.value ?? d.value * opt.neckWidth;\n\n const topW = (topVal / maxValue) * innerWidth;\n const bottomW = (bottomVal / maxValue) * innerWidth;\n\n const xTop = (innerWidth - topW) / 2;\n const xBottom = (innerWidth - bottomW) / 2;\n const yTop = i * sliceHeight;\n const yBottom = (i + 1) * sliceHeight;\n\n const pathData = `M ${xTop},${yTop} L ${xTop + topW},${yTop} L ${xBottom + bottomW},${yBottom} L ${xBottom},${yBottom} Z`;\n\n const sliceGroup = g.append('g').attr('class', 'funnel-slice-container');\n\n const computedColor = this.resolveSliceColor(d, i, opt, minValue, maxValue);\n const path = sliceGroup\n .append('path')\n .attr('class', 'funnel-slice')\n .attr('d', pathData)\n .attr('fill', computedColor)\n .style('opacity', 0)\n .on('mouseenter', (event) => {\n svg.classed('is-dimmed', true);\n this.d3.select(event.currentTarget).classed('is-active', true);\n this.showTooltip(event, d, computedColor);\n })\n .on('mousemove', (event) => this.updateTooltipPosition(event))\n .on('click', () => this.segmentClick.emit(d))\n .on('mouseleave', (event) => {\n svg.classed('is-dimmed', false);\n this.d3.select(event.currentTarget).classed('is-active', false);\n this.hideTooltip();\n });\n\n path\n .transition()\n .duration(opt.animationDuration)\n .delay(i * 80)\n .ease(easing)\n .style('opacity', 1);\n\n if (opt.showLabels) {\n const labelGroup = sliceGroup.append('g').attr('class', 'funnel-label-group').style('opacity', 0);\n const labelX = isRtl ? innerWidth / 2 - topW / 2 - labelOffset : innerWidth / 2 + topW / 2 + labelOffset;\n // In RTL documents, SVG `text-anchor: end` can expand *into* the plot area because \"end\"\n // becomes the logical left edge. Using `start` makes the label expand away from the slice\n // on both LTR (to the right) and RTL (to the left).\n const anchor = 'start';\n\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-name')\n .attr('x', labelX)\n .attr('y', yTop + sliceHeight / 2 - 5)\n .attr('text-anchor', anchor)\n .text(d.name);\n\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-value')\n .attr('x', labelX)\n .attr('y', yTop + sliceHeight / 2 + 15)\n .attr('text-anchor', anchor)\n .text(d.value.toLocaleString());\n\n labelGroup\n .transition()\n .duration(600)\n .delay(400 + i * 80)\n .style('opacity', 1);\n }\n });\n }\n\n private resolveSliceColor(\n item: AXFunnelData,\n index: number,\n opt: AXFunnelChartOption,\n minValue: number,\n maxValue: number,\n ): string {\n if (item.color) return item.color;\n\n const palette = opt.colors?.filter(Boolean) ?? [];\n if (palette.length > 0) {\n const key = String(item.id ?? item.name ?? index);\n const idx = this.hashStringToUint32(key) % palette.length;\n return palette[idx] ?? opt.startColor ?? '#1e1b4b';\n }\n\n const startColor = opt.startColor ?? '#1e1b4b';\n const endColor = opt.endColor ?? '#818cf8';\n const resolvedStartColor = this.resolveCssColor(startColor);\n const resolvedEndColor = this.resolveCssColor(endColor);\n const range = maxValue - minValue;\n const t = range === 0 ? 1 : (item.value - minValue) / range;\n const clamped = Math.max(0, Math.min(1, t));\n return this.d3.interpolateRgb(resolvedStartColor, resolvedEndColor)(clamped);\n }\n\n private hashStringToUint32(input: string): number {\n let hash = 5381;\n for (let i = 0; i < input.length; i++) {\n hash = (hash * 33) ^ input.charCodeAt(i);\n }\n return hash >>> 0;\n }\n\n private resolveCssColor(color: string): string {\n const container = this.chartContainerEl().nativeElement;\n const probe = document.createElement('span');\n probe.style.color = color;\n probe.style.position = 'absolute';\n probe.style.left = '-9999px';\n probe.style.top = '-9999px';\n container.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n probe.remove();\n return computed || color;\n }\n\n public updateChart(): void {\n this.createChart();\n }\n\n private showTooltip(event: MouseEvent, item: AXFunnelData, color: string): void {\n if (!this.effectiveOptions().showTooltip) return;\n this._tooltipData.set({ title: item.name, value: item.value.toLocaleString(), color });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n if (this._tooltipRafId) cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = requestAnimationFrame(() => {\n const containerEl = this.chartContainerEl().nativeElement;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement;\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n this._tooltipPosition.set(computeTooltipPosition(rect, tooltipRect, event.clientX + 10, event.clientY - 10, 10));\n });\n }\n\n private hideTooltip(): void {\n this._tooltipVisible.set(false);\n }\n\n public cleanupChart(): void {\n if (this._tooltipRafId) cancelAnimationFrame(this._tooltipRafId);\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n }\n\n\n}\n","<div class=\"ax-funnel-chart-container\" role=\"img\" #chartContainer>\n @if (data()?.length === 0) {\n <div class=\"ax-funnel-no-data\">\n <i [class]=\"effectiveOptions().messages?.noDataIcon\"></i>\n <p class=\"ax-funnel-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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-funnel-chart.mjs","sources":["../../../../packages/charts/funnel-chart/src/lib/funnel-chart.config.ts","../../../../packages/charts/funnel-chart/src/lib/funnel-chart.component.ts","../../../../packages/charts/funnel-chart/src/lib/funnel-chart.component.html","../../../../packages/charts/funnel-chart/src/acorex-charts-funnel-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXFunnelChartOption } from './funnel-chart.type';\n\nexport const AXFunnelChartDefaultConfig: AXFunnelChartOption = {\n margin: { top: 20, right: 160, bottom: 20, left: 160 },\n neckWidth: 0.3,\n showLabels: true,\n labelOffset: 24,\n showTooltip: true,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n color: 'rgb(99, 102, 241)',\n messages: {\n noData: 'No funnel data available',\n noDataIcon: 'fa-light fa-filter-list',\n },\n};\n\nexport const AX_FUNNEL_CHART_CONFIG = new InjectionToken<AXFunnelChartOption>('AX_FUNNEL_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXFunnelChartDefaultConfig,\n});\n","import {\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n getEasingFunction,\n resolveCssColorInContext,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\nimport { AXPlatform } from '@acorex/core/platform';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { map, Subscription } from 'rxjs';\nimport { AX_FUNNEL_CHART_CONFIG } from './funnel-chart.config';\nimport { AXFunnelChartOption, AXFunnelData } from './funnel-chart.type';\n\n@Component({\n selector: 'ax-funnel-chart',\n templateUrl: './funnel-chart.component.html',\n styleUrls: ['./funnel-chart.component.css'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXFunnelChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n // Inputs\n data = input<AXFunnelData[]>([]);\n options = input<AXFunnelChartOption>({});\n\n // Outputs\n /** Emitted when a funnel segment is clicked */\n segmentClick = output<AXFunnelData>();\n\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // SVG State\n private svgElement: SVGSVGElement | null = null;\n protected d3!: typeof import('d3');\n private _initialized = signal(false);\n private _rendered = signal(false);\n private platformService = inject(AXPlatform);\n protected isRtl = signal(this.platformService.isRtl());\n private directionSub?: Subscription;\n\n // Tooltip Signals\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({ title: '', value: '' });\n private _tooltipRafId: number | null = null;\n\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n private configToken = inject(AX_FUNNEL_CHART_CONFIG);\n\n protected effectiveOptions = computed(() => ({\n ...this.configToken,\n ...this.options(),\n }));\n\n constructor() {\n super();\n\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n this.directionSub = this.platformService.directionChange.pipe(map((i) => i.data === 'rtl')).subscribe((isRtl) => {\n this.isRtl.set(isRtl);\n if (this._rendered()) {\n this.updateChart();\n }\n });\n });\n\n effect(() => {\n // Trigger update on data or option change\n this.data();\n this.effectiveOptions();\n if (this._rendered()) {\n this.updateChart();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.directionSub?.unsubscribe();\n this.cleanupChart();\n }\n\n protected async loadD3(): Promise<void> {\n if (this.d3) return;\n try {\n this.d3 = await import('d3');\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('AXFunnelChart: Failed to load D3.js', error);\n }\n }\n\n public createChart(): void {\n if (this.svgElement) this.svgElement.remove();\n\n const data = [...this.data()].sort((a, b) => b.value - a.value);\n if (!data.length) {\n this.hideTooltip();\n return;\n }\n\n const container = this.chartContainerEl().nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n const opt = this.effectiveOptions();\n const margin = opt.margin;\n const isRtl = this.isRtl();\n const labelOffset = opt.labelOffset ?? 24;\n\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n container.appendChild(this.svgElement);\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n\n const g = svg.append('g').attr('transform', `translate(${margin.left},${margin.top})`);\n\n const sliceHeight = innerHeight / data.length;\n const maxValue = data[0].value;\n const minValue = data[data.length - 1]?.value ?? maxValue;\n const easing = getEasingFunction(this.d3, opt.animationEasing);\n const resolvedBaseForIntensity = this.resolveCssColor(opt.color ?? 'rgb(99, 102, 241)');\n\n data.forEach((d, i) => {\n const topVal = d.value;\n const bottomVal = data[i + 1]?.value ?? d.value * opt.neckWidth;\n\n const topW = (topVal / maxValue) * innerWidth;\n const bottomW = (bottomVal / maxValue) * innerWidth;\n\n const xTop = (innerWidth - topW) / 2;\n const xBottom = (innerWidth - bottomW) / 2;\n const yTop = i * sliceHeight;\n const yBottom = (i + 1) * sliceHeight;\n\n const pathData = `M ${xTop},${yTop} L ${xTop + topW},${yTop} L ${xBottom + bottomW},${yBottom} L ${xBottom},${yBottom} Z`;\n\n const sliceGroup = g.append('g').attr('class', 'funnel-slice-container');\n\n const computedColor = this.resolveSliceColor(d, i, opt, minValue, maxValue, resolvedBaseForIntensity);\n const path = sliceGroup\n .append('path')\n .attr('class', 'funnel-slice')\n .attr('d', pathData)\n .attr('fill', computedColor)\n .style('opacity', 0)\n .on('mouseenter', (event) => {\n svg.classed('is-dimmed', true);\n this.d3.select(event.currentTarget).classed('is-active', true);\n this.showTooltip(event, d, computedColor);\n })\n .on('mousemove', (event) => this.updateTooltipPosition(event))\n .on('click', () => this.segmentClick.emit(d))\n .on('mouseleave', (event) => {\n svg.classed('is-dimmed', false);\n this.d3.select(event.currentTarget).classed('is-active', false);\n this.hideTooltip();\n });\n\n path\n .transition()\n .duration(opt.animationDuration)\n .delay(i * 80)\n .ease(easing)\n .style('opacity', 1);\n\n if (opt.showLabels) {\n const labelGroup = sliceGroup.append('g').attr('class', 'funnel-label-group').style('opacity', 0);\n const labelX = isRtl ? innerWidth / 2 - topW / 2 - labelOffset : innerWidth / 2 + topW / 2 + labelOffset;\n // In RTL documents, SVG `text-anchor: end` can expand *into* the plot area because \"end\"\n // becomes the logical left edge. Using `start` makes the label expand away from the slice\n // on both LTR (to the right) and RTL (to the left).\n const anchor = 'start';\n\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-name')\n .attr('x', labelX)\n .attr('y', yTop + sliceHeight / 2 - 5)\n .attr('text-anchor', anchor)\n .text(d.name);\n\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-value')\n .attr('x', labelX)\n .attr('y', yTop + sliceHeight / 2 + 15)\n .attr('text-anchor', anchor)\n .text(d.value.toLocaleString());\n\n labelGroup\n .transition()\n .duration(600)\n .delay(400 + i * 80)\n .style('opacity', 1);\n }\n });\n }\n\n private resolveSliceColor(\n item: AXFunnelData,\n index: number,\n opt: AXFunnelChartOption,\n minValue: number,\n maxValue: number,\n resolvedBaseRgb: string,\n ): string {\n if (item.color) return this.resolveCssColor(item.color);\n\n const palette = opt.colors?.filter(Boolean) ?? [];\n if (palette.length > 0) {\n const key = String(item.id ?? item.name ?? index);\n const idx = this.hashStringToUint32(key) % palette.length;\n const raw = palette[idx] ?? opt.color ?? 'rgb(99, 102, 241)';\n return this.resolveCssColor(raw);\n }\n\n const rangeMin = opt.valueRange?.min ?? minValue;\n const rangeMax = opt.valueRange?.max ?? maxValue;\n const span = rangeMax - rangeMin;\n const t = span === 0 ? 1 : (item.value - rangeMin) / span;\n const clamped = Math.max(0, Math.min(1, t));\n return this.applyIntensityToResolvedRgb(resolvedBaseRgb, clamped);\n }\n\n /** `resolvedRgb` must be a computed `rgb()` / `rgba()` string (e.g. from {@link resolveCssColor}). */\n private applyIntensityToResolvedRgb(resolvedRgb: string, t: number): string {\n const clamped = Math.max(0, Math.min(1, t));\n const parsed = this.d3.color(resolvedRgb);\n if (!parsed) return resolvedRgb;\n const rgb = this.d3.rgb(parsed);\n const minOpacity = 0.12;\n const opacity = minOpacity + clamped * (1 - minOpacity);\n return `rgba(${Math.round(rgb.r)},${Math.round(rgb.g)},${Math.round(rgb.b)},${opacity})`;\n }\n\n private hashStringToUint32(input: string): number {\n let hash = 5381;\n for (let i = 0; i < input.length; i++) {\n hash = (hash * 33) ^ input.charCodeAt(i);\n }\n return hash >>> 0;\n }\n\n private resolveCssColor(color: string): string {\n return resolveCssColorInContext(this.chartContainerEl().nativeElement, color);\n }\n\n public updateChart(): void {\n this.createChart();\n }\n\n private showTooltip(event: MouseEvent, item: AXFunnelData, color: string): void {\n if (!this.effectiveOptions().showTooltip) return;\n this._tooltipData.set({ title: item.name, value: item.value.toLocaleString(), color });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n if (this._tooltipRafId) cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = requestAnimationFrame(() => {\n const containerEl = this.chartContainerEl().nativeElement;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement;\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n this._tooltipPosition.set(computeTooltipPosition(rect, tooltipRect, event.clientX + 10, event.clientY - 10, 10));\n });\n }\n\n private hideTooltip(): void {\n this._tooltipVisible.set(false);\n }\n\n public cleanupChart(): void {\n if (this._tooltipRafId) cancelAnimationFrame(this._tooltipRafId);\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n }\n}\n","<div class=\"ax-funnel-chart-container\" role=\"img\" #chartContainer>\n @if (data()?.length === 0) {\n <div class=\"ax-funnel-no-data\">\n <i [class]=\"effectiveOptions().messages?.noDataIcon\"></i>\n <p class=\"ax-funnel-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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../../../../packages/charts/gauge-chart/src/lib/gauge-chart.config.ts","../../../../packages/charts/gauge-chart/src/lib/gauge-chart.component.ts","../../../../packages/charts/gauge-chart/src/lib/gauge-chart.component.html","../../../../packages/charts/gauge-chart/src/acorex-charts-gauge-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXGaugeChartOption } from './gauge-chart.type';\n\nexport const AXGaugeChartDefaultConfig: AXGaugeChartOption = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide a value to display the gauge',\n noDataIcon: 'fa-light fa-gauge',\n },\n};\n\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken<AXGaugeChartOption>('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\n\nexport type PartialGaugeChartConfig = Partial<AXGaugeChartOption>;\n\nexport function gaugeChartConfig(config: PartialGaugeChartConfig = {}): AXGaugeChartOption {\n const result = {\n ...AXGaugeChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n formatLargeNumber,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport type * as d3 from 'd3';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport { AXGaugeChartOption, AXGaugeChartValue } from './gauge-chart.type';\n\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\n@Component({\n selector: 'ax-gauge-chart',\n templateUrl: './gauge-chart.component.html',\n styleUrls: ['./gauge-chart.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXGaugeChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n // Inputs\n /** Chart value input */\n value = input<AXGaugeChartValue>(0);\n\n /** Chart options input */\n options = input<AXGaugeChartOption>({});\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // SVG element reference (created in the code)\n private svgElement: SVGSVGElement | null = null;\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Signals for component state\n private _initialized = signal(false);\n private _rendered = signal(false);\n private _prevValue = signal<number | null>(null);\n\n // Track previous options to detect changes\n private _prevOptionsString = '';\n\n // Cache for container dimensions to avoid repeated DOM reads\n private _lastContainerRect: { width: number; height: number } | null = null;\n\n // Tooltip signals\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n // Expose tooltip signals as read-only for the template\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_GAUGE_CHART_CONFIG);\n\n // Computed configuration options\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Constants\n private readonly TOOLTIP_GAP = 10;\n private readonly HALF_CIRCLE_RADIANS = Math.PI;\n private readonly QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n private readonly DEGREES_PER_RADIAN = 180 / Math.PI;\n private readonly CHART_EDGE_PADDING = 12;\n private readonly TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n private readonly TICK_LABEL_SIDE_PADDING = 6;\n private readonly LABEL_TICK_CLEARANCE = 4;\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n const currentValue = this.value();\n const options = this.effectiveOptions();\n\n // Update previous value\n this._prevValue.set(currentValue);\n\n // Only update if already rendered\n if (this._rendered()) {\n // If only the value changed, just update the value display and dial\n const optionsString = JSON.stringify(options);\n if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n } else {\n // If options changed, recreate the whole chart\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n if (this.d3) return; // Already loaded\n\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Creates the gauge chart with all elements\n */\n public createChart(): void {\n // Clear container and create SVG\n if (this.svgElement) {\n this.svgElement.remove();\n }\n\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.chartContainerEl().nativeElement.appendChild(this.svgElement);\n\n // Get current options\n const options = this.effectiveOptions();\n\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n\n // Calculate responsive dimensions\n const containerElement = this.chartContainerEl().nativeElement;\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width, 100);\n const effectiveHeight = Math.max(height, 50);\n\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr(\n 'transform',\n `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`,\n );\n\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, this.value(), minValue, maxValue, animationDuration);\n\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, this.value(), label, radius, size);\n }\n\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n\n /**\n * Updates the chart when options change\n */\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n public updateValueAndDial(value: number): void {\n if (!this.svgElement) return;\n\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n\n /**\n * Draw the background arc\n */\n private drawBackgroundArc(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n innerRadius: number,\n outerRadius: number,\n cornerRadius: number,\n ): void {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip) return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n\n /**\n * Draw the thresholds arcs\n */\n private drawThresholds(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n innerRadius: number,\n outerRadius: number,\n minValue: number,\n maxValue: number,\n thresholds: { value: number; color: string; label?: string }[],\n cornerRadius: number,\n ): void {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle) return;\n\n const arcPath = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }),\n )\n .attr('fill', threshold.color || `url(#threshold-gradient-${i})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }),\n )\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n\n /**\n * Shows tooltip for a threshold arc\n */\n private showThresholdTooltip(\n event: MouseEvent,\n startValue: number,\n endValue: number,\n color: string,\n label?: string,\n ): void {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n private showSingleRangeTooltip(event: MouseEvent): void {\n const options = this.effectiveOptions();\n if (!options.showTooltip) return;\n\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null) return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n\n /**\n * Hides the tooltip\n */\n private hideTooltip(): void {\n this._tooltipVisible.set(false);\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n\n /**\n * Creates gradient definitions for thresholds\n */\n private createGradients(\n svg: d3.Selection<SVGSVGElement, unknown, null, undefined>,\n thresholds: { value: number; color: string }[],\n ): void {\n const defs = svg.append('defs');\n\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', 'gauge-bg-gradient')\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n } else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', `threshold-gradient-${i}`)\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n\n /**\n * Draws tick marks and labels around the gauge\n */\n private drawTicks(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n radius: number,\n minValue: number,\n maxValue: number,\n size: number,\n tickCount: number,\n tickFontPx: number,\n ): void {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n\n const tickValues = [] as number[];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n\n const textSelection = tickGroup\n .selectAll<SVGTextElement, (typeof tickMetrics)[number]>('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0) bboxWidth = bbox.width;\n if (bbox.height > 0) bboxHeight = bbox.height;\n } catch {\n // Keep fallback estimates.\n }\n\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n\n private getTickCount(size: number): number {\n if (size < 200) return 3;\n if (size < 300) return 4;\n if (size < 400) return 5;\n if (size > 520) return 7;\n return 5;\n }\n\n private getTickFontSize(size: number): number {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n\n private getBaseLabelOffset(radius: number, tickLength: number, tickFontPx: number): number {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n\n private getTickLabelAnchor(cosValue: number): 'start' | 'middle' | 'end' {\n if (cosValue > 0.35) return 'start';\n if (cosValue < -0.35) return 'end';\n return 'middle';\n }\n\n private getNearEdgeProjection(\n anchor: 'start' | 'middle' | 'end',\n cosValue: number,\n sinValue: number,\n bboxWidth: number,\n bboxHeight: number,\n ): number {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n\n private formatTickValue(tick: number, minValue: number, maxValue: number): string {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n\n private estimateLabelWidth(label: string, tickFontPx: number): number {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n\n private estimateMaxTickLabelWidth(tickCount: number, minValue: number, maxValue: number, tickFontPx: number): number {\n if (tickCount <= 1) return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n\n /**\n * Draws the value and label text in the center\n */\n private drawValueDisplay(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n value: number,\n label: string,\n radius: number,\n size: number,\n ): void {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n private drawDial(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n radius: number,\n value: number,\n minValue: number,\n maxValue: number,\n animationDuration: number,\n ): void {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n\n // getEasingFunction moved to shared chart utils\n\n /**\n * Creates a path string for the needle\n */\n private createNeedlePath(radius: number): string {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n\n /**\n * Scales a value to an angle (in radians)\n */\n private scaleValueToAngle(value: number, min: number, max: number): number {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n private scaleValueToColorAngle(value: number, min: number, max: number): number {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n\n /**\n * Converts an angle back to a value\n */\n private angleToValue(angle: number, min: number, max: number): number {\n const valueRange = max - min;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n\n /**\n * Converts radians to degrees\n */\n private radiansToDegrees(radians: number): number {\n return radians * this.DEGREES_PER_RADIAN;\n }\n}\n","<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer></div>\n<ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../../../../packages/charts/gauge-chart/src/lib/gauge-chart.config.ts","../../../../packages/charts/gauge-chart/src/lib/gauge-chart.component.ts","../../../../packages/charts/gauge-chart/src/lib/gauge-chart.component.html","../../../../packages/charts/gauge-chart/src/acorex-charts-gauge-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXGaugeChartOption } from './gauge-chart.type';\n\nexport const AXGaugeChartDefaultConfig: AXGaugeChartOption = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide a value to display the gauge',\n noDataIcon: 'fa-light fa-gauge',\n },\n};\n\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken<AXGaugeChartOption>('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\n\nexport type PartialGaugeChartConfig = Partial<AXGaugeChartOption>;\n\nexport function gaugeChartConfig(config: PartialGaugeChartConfig = {}): AXGaugeChartOption {\n const result = {\n ...AXGaugeChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n formatLargeNumber,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport type * as d3 from 'd3';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport { AXGaugeChartOption, AXGaugeChartValue } from './gauge-chart.type';\n\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\n@Component({\n selector: 'ax-gauge-chart',\n templateUrl: './gauge-chart.component.html',\n styleUrls: ['./gauge-chart.component.css'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXGaugeChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n // Inputs\n /** Chart value input */\n value = input<AXGaugeChartValue>(0);\n\n /** Chart options input */\n options = input<AXGaugeChartOption>({});\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // SVG element reference (created in the code)\n private svgElement: SVGSVGElement | null = null;\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Signals for component state\n private _initialized = signal(false);\n private _rendered = signal(false);\n private _prevValue = signal<number | null>(null);\n\n // Track previous options to detect changes\n private _prevOptionsString = '';\n\n // Cache for container dimensions to avoid repeated DOM reads\n private _lastContainerRect: { width: number; height: number } | null = null;\n\n // Tooltip signals\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n // Expose tooltip signals as read-only for the template\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_GAUGE_CHART_CONFIG);\n\n // Computed configuration options\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Constants\n private readonly TOOLTIP_GAP = 10;\n private readonly HALF_CIRCLE_RADIANS = Math.PI;\n private readonly QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n private readonly DEGREES_PER_RADIAN = 180 / Math.PI;\n private readonly CHART_EDGE_PADDING = 12;\n private readonly TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n private readonly TICK_LABEL_SIDE_PADDING = 6;\n private readonly LABEL_TICK_CLEARANCE = 4;\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n const currentValue = this.value();\n const options = this.effectiveOptions();\n\n // Update previous value\n this._prevValue.set(currentValue);\n\n // Only update if already rendered\n if (this._rendered()) {\n // If only the value changed, just update the value display and dial\n const optionsString = JSON.stringify(options);\n if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n } else {\n // If options changed, recreate the whole chart\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n if (this.d3) return; // Already loaded\n\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Creates the gauge chart with all elements\n */\n public createChart(): void {\n // Clear container and create SVG\n if (this.svgElement) {\n this.svgElement.remove();\n }\n\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.chartContainerEl().nativeElement.appendChild(this.svgElement);\n\n // Get current options\n const options = this.effectiveOptions();\n\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n\n // Calculate responsive dimensions\n const containerElement = this.chartContainerEl().nativeElement;\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width, 100);\n const effectiveHeight = Math.max(height, 50);\n\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr(\n 'transform',\n `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`,\n );\n\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, this.value(), minValue, maxValue, animationDuration);\n\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, this.value(), label, radius, size);\n }\n\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n\n /**\n * Updates the chart when options change\n */\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n public updateValueAndDial(value: number): void {\n if (!this.svgElement) return;\n\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n\n /**\n * Draw the background arc\n */\n private drawBackgroundArc(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n innerRadius: number,\n outerRadius: number,\n cornerRadius: number,\n ): void {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip) return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n\n /**\n * Draw the thresholds arcs\n */\n private drawThresholds(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n innerRadius: number,\n outerRadius: number,\n minValue: number,\n maxValue: number,\n thresholds: { value: number; color: string; label?: string }[],\n cornerRadius: number,\n ): void {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle) return;\n\n const arcPath = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }),\n )\n .attr('fill', threshold.color || `url(#threshold-gradient-${i})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }),\n )\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n\n /**\n * Shows tooltip for a threshold arc\n */\n private showThresholdTooltip(\n event: MouseEvent,\n startValue: number,\n endValue: number,\n color: string,\n label?: string,\n ): void {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n private showSingleRangeTooltip(event: MouseEvent): void {\n const options = this.effectiveOptions();\n if (!options.showTooltip) return;\n\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null) return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n\n /**\n * Hides the tooltip\n */\n private hideTooltip(): void {\n this._tooltipVisible.set(false);\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n\n /**\n * Creates gradient definitions for thresholds\n */\n private createGradients(\n svg: d3.Selection<SVGSVGElement, unknown, null, undefined>,\n thresholds: { value: number; color: string }[],\n ): void {\n const defs = svg.append('defs');\n\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', 'gauge-bg-gradient')\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n } else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', `threshold-gradient-${i}`)\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n\n /**\n * Draws tick marks and labels around the gauge\n */\n private drawTicks(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n radius: number,\n minValue: number,\n maxValue: number,\n size: number,\n tickCount: number,\n tickFontPx: number,\n ): void {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n\n const tickValues = [] as number[];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n\n const textSelection = tickGroup\n .selectAll<SVGTextElement, (typeof tickMetrics)[number]>('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0) bboxWidth = bbox.width;\n if (bbox.height > 0) bboxHeight = bbox.height;\n } catch {\n // Keep fallback estimates.\n }\n\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n\n private getTickCount(size: number): number {\n if (size < 200) return 3;\n if (size < 300) return 4;\n if (size < 400) return 5;\n if (size > 520) return 7;\n return 5;\n }\n\n private getTickFontSize(size: number): number {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n\n private getBaseLabelOffset(radius: number, tickLength: number, tickFontPx: number): number {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n\n private getTickLabelAnchor(cosValue: number): 'start' | 'middle' | 'end' {\n if (cosValue > 0.35) return 'start';\n if (cosValue < -0.35) return 'end';\n return 'middle';\n }\n\n private getNearEdgeProjection(\n anchor: 'start' | 'middle' | 'end',\n cosValue: number,\n sinValue: number,\n bboxWidth: number,\n bboxHeight: number,\n ): number {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n\n private formatTickValue(tick: number, minValue: number, maxValue: number): string {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n\n private estimateLabelWidth(label: string, tickFontPx: number): number {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n\n private estimateMaxTickLabelWidth(tickCount: number, minValue: number, maxValue: number, tickFontPx: number): number {\n if (tickCount <= 1) return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n\n /**\n * Draws the value and label text in the center\n */\n private drawValueDisplay(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n value: number,\n label: string,\n radius: number,\n size: number,\n ): void {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n private drawDial(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n radius: number,\n value: number,\n minValue: number,\n maxValue: number,\n animationDuration: number,\n ): void {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n\n // getEasingFunction moved to shared chart utils\n\n /**\n * Creates a path string for the needle\n */\n private createNeedlePath(radius: number): string {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n\n /**\n * Scales a value to an angle (in radians)\n */\n private scaleValueToAngle(value: number, min: number, max: number): number {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n private scaleValueToColorAngle(value: number, min: number, max: number): number {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n\n /**\n * Converts an angle back to a value\n */\n private angleToValue(angle: number, min: number, max: number): number {\n const valueRange = max - min;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n\n /**\n * Converts radians to degrees\n */\n private radiansToDegrees(radians: number): number {\n return radians * this.DEGREES_PER_RADIAN;\n }\n}\n","<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer></div>\n<ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AXChartComponent, getEasingFunction, computeTooltipPosition } from '@acorex/charts';
|
|
1
|
+
import { AXChartComponent, resolveCssColorInContext, getEasingFunction, computeTooltipPosition } from '@acorex/charts';
|
|
2
2
|
import { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';
|
|
3
3
|
import { AXPlatform } from '@acorex/core/platform';
|
|
4
4
|
import * as i0 from '@angular/core';
|
|
@@ -7,8 +7,7 @@ import { map } from 'rxjs';
|
|
|
7
7
|
|
|
8
8
|
const AXHeatmapChartDefaultConfig = {
|
|
9
9
|
margin: { top: 30, right: 30, bottom: 60, left: 60 },
|
|
10
|
-
|
|
11
|
-
endColor: 'rgb(var(--ax-sys-color-primary-950))',
|
|
10
|
+
color: 'rgb(99, 102, 241)',
|
|
12
11
|
cellPadding: 0.05,
|
|
13
12
|
borderRadius: 2,
|
|
14
13
|
showXAxis: true,
|
|
@@ -60,9 +59,7 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
60
59
|
// Initialize D3 and ResizeObserver
|
|
61
60
|
afterNextRender(() => {
|
|
62
61
|
this.init();
|
|
63
|
-
this.directionSub = this.platformService.directionChange
|
|
64
|
-
.pipe(map((i) => i.data === 'rtl'))
|
|
65
|
-
.subscribe((isRtl) => {
|
|
62
|
+
this.directionSub = this.platformService.directionChange.pipe(map((i) => i.data === 'rtl')).subscribe((isRtl) => {
|
|
66
63
|
this.isRtl.set(isRtl);
|
|
67
64
|
if (this._d3Ready()) {
|
|
68
65
|
this.renderChart();
|
|
@@ -129,22 +126,30 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
129
126
|
const minValue = Number.isFinite(valueExtent[0]) ? valueExtent[0] : 0;
|
|
130
127
|
const maxValue = Number.isFinite(valueExtent[1]) ? valueExtent[1] : minValue + 1;
|
|
131
128
|
const palette = options.colors?.filter(Boolean) ?? [];
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
const
|
|
129
|
+
const baseColor = options.color ?? 'rgb(99, 102, 241)';
|
|
130
|
+
const rangeMin = options.valueRange?.min ?? minValue;
|
|
131
|
+
const rangeMax = options.valueRange?.max ?? maxValue;
|
|
132
|
+
const resolvedColorCache = new Map();
|
|
133
|
+
const resolvePaletteColor = (c) => {
|
|
134
|
+
const hit = resolvedColorCache.get(c);
|
|
135
|
+
if (hit !== undefined)
|
|
136
|
+
return hit;
|
|
137
|
+
const out = resolveCssColorInContext(container, c);
|
|
138
|
+
resolvedColorCache.set(c, out);
|
|
139
|
+
return out;
|
|
140
|
+
};
|
|
141
|
+
const resolvedBase = resolvePaletteColor(baseColor);
|
|
136
142
|
const getCellColor = (d) => {
|
|
137
143
|
// If a palette is provided, choose a stable "random" color per cell.
|
|
138
144
|
if (palette.length > 0) {
|
|
139
145
|
const key = `${d.x}-${d.y}`;
|
|
140
146
|
const idx = this.hashStringToUint32(key) % palette.length;
|
|
141
|
-
return palette[idx] ??
|
|
147
|
+
return resolvePaletteColor(palette[idx] ?? baseColor);
|
|
142
148
|
}
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
const t = range === 0 ? 1 : (d.value - minValue) / range;
|
|
149
|
+
const span = rangeMax - rangeMin;
|
|
150
|
+
const t = span === 0 ? 1 : (d.value - rangeMin) / span;
|
|
146
151
|
const clamped = Math.max(0, Math.min(1, t));
|
|
147
|
-
return this.
|
|
152
|
+
return this.applyIntensityToResolvedRgb(resolvedBase, clamped);
|
|
148
153
|
};
|
|
149
154
|
// --- Axes ---
|
|
150
155
|
this.drawAxis(g, 'x-axis', this.d3.axisBottom(xScale).tickSize(0), 0, innerHeight, options.showXAxis, isRtl);
|
|
@@ -159,7 +164,7 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
159
164
|
const easing = getEasingFunction(this.d3, options.animationEasing);
|
|
160
165
|
g.selectAll('.cell')
|
|
161
166
|
.data(data, (d) => `${d.x}-${d.y}`)
|
|
162
|
-
.join((enter) => enter.append('rect').attr('class', 'cell').attr('opacity', 0).attr('fill',
|
|
167
|
+
.join((enter) => enter.append('rect').attr('class', 'cell').attr('opacity', 0).attr('fill', resolvedBase), (update) => update, (exit) => exit.transition().duration(200).attr('opacity', 0).remove())
|
|
163
168
|
.on('mouseenter', (event, d) => this.showTooltip(event, d, getCellColor(d)))
|
|
164
169
|
.on('mousemove', (event) => this.updateTooltipPos(event))
|
|
165
170
|
.on('click', (_event, d) => this.cellClick.emit(d))
|
|
@@ -184,17 +189,16 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
184
189
|
}
|
|
185
190
|
return hash >>> 0;
|
|
186
191
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
return computed || color;
|
|
192
|
+
/** `resolvedRgb` must be a computed `rgb()` / `rgba()` string (e.g. from {@link resolveCssColorInContext}). */
|
|
193
|
+
applyIntensityToResolvedRgb(resolvedRgb, t) {
|
|
194
|
+
const clamped = Math.max(0, Math.min(1, t));
|
|
195
|
+
const parsed = this.d3.color(resolvedRgb);
|
|
196
|
+
if (!parsed)
|
|
197
|
+
return resolvedRgb;
|
|
198
|
+
const rgb = this.d3.rgb(parsed);
|
|
199
|
+
const minOpacity = 0.12;
|
|
200
|
+
const opacity = minOpacity + clamped * (1 - minOpacity);
|
|
201
|
+
return `rgba(${Math.round(rgb.r)},${Math.round(rgb.g)},${Math.round(rgb.b)},${opacity})`;
|
|
198
202
|
}
|
|
199
203
|
drawAxis(g, className, axisFn, x, y, visible = true, isRtl = false) {
|
|
200
204
|
let axisG = g.select(`.${className}`);
|