@acorex/charts 22.0.0-next.0 → 22.0.0-next.10

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.
@@ -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 { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXFunnelChartOption } from './funnel-chart.type';\n\nexport const AXFunnelChartDefaultConfig: AXFunnelChartOption = {\n margin: { top: 16, right: 16, bottom: 16, left: 16 },\n neckWidth: 0.3,\n showLabels: true,\n showSegmentValues: true,\n labelOffset: 24,\n showTooltip: true,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n color: 'rgb(var(--ax-sys-color-primary-500))',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\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 mergeChartMessages,\n mergeChartOptions,\n resolveCssColorInContext,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\nimport {\n afterNextRender,\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 { 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})\nexport class AXFunnelChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n /**\n * Fixed SVG coordinate system; the graphic scales to the container via `width`/`height: 100%` + `viewBox`.\n * Margins and geometry are expressed in these units (same numeric scale as a ~400px reference viewport).\n */\n private static readonly VIEW_BOX_SIZE = 400;\n\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\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(() => mergeChartOptions(this.configToken, this.options()));\n\n protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\n\n constructor() {\n super();\n\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\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.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 vb = AXFunnelChartComponent.VIEW_BOX_SIZE;\n const width = vb;\n const height = vb;\n\n const opt = this.effectiveOptions();\n const margin = opt.margin;\n const easing = getEasingFunction(this.d3, opt.animationEasing);\n const resolvedBaseForIntensity = this.resolveCssColor(opt.color ?? 'rgb(99, 102, 241)');\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 .attr('class', 'ax-funnel-svg');\n\n container.appendChild(this.svgElement);\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n if (innerWidth < 1 || innerHeight < 1) {\n return;\n }\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 showSegmentValues = opt.showSegmentValues !== false;\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\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 sliceGroup.append('title').text(`${d.name}: ${d.value.toLocaleString()}`);\n\n if (opt.showLabels) {\n const { cx, cy, width: midW } = this.trapezoidInteriorMetrics(xTop, topW, xBottom, bottomW, yTop, yBottom);\n const { nameSize, valueSize, showValueLine, displayName } = this.computeSegmentLabelTypography(\n sliceHeight,\n midW,\n d.name,\n showSegmentValues,\n );\n const { primary, secondary } = this.pickOnSliceTextColors(computedColor);\n\n const labelGroup = sliceGroup.append('g').attr('class', 'funnel-label-group').style('opacity', 0);\n\n const lineGap = Math.max(2, sliceHeight * 0.06);\n if (showValueLine && valueSize > 0) {\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-name')\n .attr('x', cx)\n .attr('y', cy - (valueSize * 0.55 + lineGap * 0.5))\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${nameSize}`)\n .style('fill', primary)\n .text(displayName);\n\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-value')\n .attr('x', cx)\n .attr('y', cy + (nameSize * 0.55 + lineGap * 0.5))\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${valueSize}`)\n .style('fill', secondary)\n .text(d.value.toLocaleString());\n } else {\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-name funnel-label-name--single')\n .attr('x', cx)\n .attr('y', cy)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${nameSize}`)\n .style('fill', primary)\n .text(displayName);\n }\n\n labelGroup\n .transition()\n .duration(600)\n .delay(400 + i * 80)\n .style('opacity', 1);\n }\n });\n }\n\n private trapezoidInteriorMetrics(\n xTop: number,\n topW: number,\n xBottom: number,\n bottomW: number,\n yTop: number,\n yBottom: number,\n ): { cx: number; cy: number; width: number } {\n const cy = (yTop + yBottom) / 2;\n const denom = yBottom - yTop || 1;\n const t = (cy - yTop) / denom;\n const xL = xTop + t * (xBottom - xTop);\n const xR = xTop + topW + t * (xBottom + bottomW - (xTop + topW));\n return { cx: (xL + xR) / 2, cy, width: Math.max(0, xR - xL) };\n }\n\n private computeSegmentLabelTypography(\n sliceHeight: number,\n segmentInnerWidth: number,\n name: string,\n wantValue: boolean,\n ): {\n nameSize: number;\n valueSize: number;\n showValueLine: boolean;\n displayName: string;\n } {\n const charFactor = 0.52;\n const minFont = 6.5;\n const maxName = 15;\n\n const innerW = Math.max(segmentInnerWidth, 8);\n\n let showValueLine = wantValue && sliceHeight >= 17 && innerW >= 38;\n\n const fitNameOnly = (): number => {\n const raw = Math.min(maxName + 2, sliceHeight * 0.42, innerW / Math.max(name.length * charFactor, 2.5));\n return Math.max(minFont, raw);\n };\n\n const fitBoth = (): { nameSize: number; valueSize: number } => {\n const vBudget = sliceHeight * 0.76;\n let nameSize = Math.min(maxName, vBudget / 2.45, innerW / Math.max(name.length * charFactor, 2.5));\n nameSize = Math.max(minFont, nameSize);\n let valueSize = Math.max(minFont, Math.min(nameSize * 0.88, vBudget / 2.45));\n const stackH = nameSize * 1.18 + valueSize * 1.08 + sliceHeight * 0.05;\n if (stackH > sliceHeight * 0.88) {\n const scale = (sliceHeight * 0.88) / stackH;\n nameSize = Math.max(minFont, nameSize * scale);\n valueSize = Math.max(minFont, valueSize * scale);\n }\n return { nameSize, valueSize };\n };\n\n let nameSize: number;\n let valueSize = 0;\n\n if (showValueLine) {\n const both = fitBoth();\n nameSize = both.nameSize;\n valueSize = both.valueSize;\n if (nameSize * 1.2 + valueSize * 1.05 > sliceHeight * 0.9) {\n showValueLine = false;\n }\n }\n\n if (!showValueLine) {\n nameSize = fitNameOnly();\n }\n\n const maxChars = Math.max(2, Math.floor(innerW / (nameSize * charFactor)));\n const displayName = this.truncateLabel(name, maxChars);\n\n return { nameSize, valueSize, showValueLine, displayName };\n }\n\n private truncateLabel(name: string, maxChars: number): string {\n if (name.length <= maxChars) return name;\n if (maxChars <= 1) return '…';\n return `${name.slice(0, maxChars - 1)}…`;\n }\n\n private pickOnSliceTextColors(sliceColorCss: string): { primary: string; secondary: string } {\n const resolved = this.resolveCssColor(sliceColorCss);\n const c = this.d3.color(resolved);\n if (!c) {\n return { primary: 'rgba(255,255,255,0.95)', secondary: 'rgba(255,255,255,0.78)' };\n }\n const rgb = this.d3.rgb(c);\n const a = Math.max(0, Math.min(1, rgb.opacity));\n // Blend slice color over white (typical card/surface) so low-alpha intensity ramps read correctly.\n const br = (rgb.r / 255) * a + (1 - a);\n const bg = (rgb.g / 255) * a + (1 - a);\n const bb = (rgb.b / 255) * a + (1 - a);\n const lum = 0.2126 * br + 0.7152 * bg + 0.0722 * bb;\n if (lum > 0.62) {\n return { primary: 'rgba(15,23,42,0.92)', secondary: 'rgba(15,23,42,0.72)' };\n }\n return { primary: 'rgba(255,255,255,0.96)', secondary: 'rgba(255,255,255,0.78)' };\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 <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n </ax-chart-tooltip>\n @if (data()?.length === 0) {\n <div class=\"ax-chart-empty\">\n <div class=\"ax-chart-empty__card\">\n <div class=\"ax-chart-empty__icon\">\n <i [class]=\"effectiveMessages().noDataIcon + ' fa-2x'\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"ax-chart-empty__title\">{{ effectiveMessages().noData }}</div>\n <div class=\"ax-chart-empty__help\">{{ effectiveMessages().noDataHelp }}</div>\n </div>\n </div>\n }\n</div>\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 { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXFunnelChartOption } from './funnel-chart.type';\n\nexport const AXFunnelChartDefaultConfig: AXFunnelChartOption = {\n margin: { top: 16, right: 16, bottom: 16, left: 16 },\n neckWidth: 0.3,\n showLabels: true,\n showSegmentValues: true,\n labelOffset: 24,\n showTooltip: true,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n color: 'rgb(var(--ax-sys-color-primary-500))',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\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 mergeChartMessages,\n mergeChartOptions,\n resolveCssColorInContext,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\nimport {\n afterNextRender,\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 { 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})\nexport class AXFunnelChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n /**\n * Fixed SVG coordinate system; the graphic scales to the container via `width`/`height: 100%` + `viewBox`.\n * Margins and geometry are expressed in these units (same numeric scale as a ~400px reference viewport).\n */\n private static readonly VIEW_BOX_SIZE = 400;\n\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\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(() => mergeChartOptions(this.configToken, this.options()));\n\n protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\n\n constructor() {\n super();\n\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\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.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 vb = AXFunnelChartComponent.VIEW_BOX_SIZE;\n const width = vb;\n const height = vb;\n\n const opt = this.effectiveOptions();\n const margin = opt.margin;\n const easing = getEasingFunction(this.d3, opt.animationEasing);\n const resolvedBaseForIntensity = this.resolveCssColor(opt.color ?? 'rgb(99, 102, 241)');\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 .attr('class', 'ax-funnel-svg');\n\n container.appendChild(this.svgElement);\n\n const innerWidth = width - margin.left - margin.right;\n const innerHeight = height - margin.top - margin.bottom;\n if (innerWidth < 1 || innerHeight < 1) {\n return;\n }\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 showSegmentValues = opt.showSegmentValues !== false;\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\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 sliceGroup.append('title').text(`${d.name}: ${d.value.toLocaleString()}`);\n\n if (opt.showLabels) {\n const { cx, cy, width: midW } = this.trapezoidInteriorMetrics(xTop, topW, xBottom, bottomW, yTop, yBottom);\n const { nameSize, valueSize, showValueLine, displayName } = this.computeSegmentLabelTypography(\n sliceHeight,\n midW,\n d.name,\n showSegmentValues,\n );\n const { primary, secondary } = this.pickOnSliceTextColors(computedColor);\n\n const labelGroup = sliceGroup.append('g').attr('class', 'funnel-label-group').style('opacity', 0);\n\n const lineGap = Math.max(2, sliceHeight * 0.06);\n if (showValueLine && valueSize > 0) {\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-name')\n .attr('x', cx)\n .attr('y', cy - (valueSize * 0.55 + lineGap * 0.5))\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${nameSize}`)\n .style('fill', primary)\n .text(displayName);\n\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-value')\n .attr('x', cx)\n .attr('y', cy + (nameSize * 0.55 + lineGap * 0.5))\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${valueSize}`)\n .style('fill', secondary)\n .text(d.value.toLocaleString());\n } else {\n labelGroup\n .append('text')\n .attr('class', 'funnel-label-name funnel-label-name--single')\n .attr('x', cx)\n .attr('y', cy)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('font-size', `${nameSize}`)\n .style('fill', primary)\n .text(displayName);\n }\n\n labelGroup\n .transition()\n .duration(600)\n .delay(400 + i * 80)\n .style('opacity', 1);\n }\n });\n }\n\n private trapezoidInteriorMetrics(\n xTop: number,\n topW: number,\n xBottom: number,\n bottomW: number,\n yTop: number,\n yBottom: number,\n ): { cx: number; cy: number; width: number } {\n const cy = (yTop + yBottom) / 2;\n const denom = yBottom - yTop || 1;\n const t = (cy - yTop) / denom;\n const xL = xTop + t * (xBottom - xTop);\n const xR = xTop + topW + t * (xBottom + bottomW - (xTop + topW));\n return { cx: (xL + xR) / 2, cy, width: Math.max(0, xR - xL) };\n }\n\n private computeSegmentLabelTypography(\n sliceHeight: number,\n segmentInnerWidth: number,\n name: string,\n wantValue: boolean,\n ): {\n nameSize: number;\n valueSize: number;\n showValueLine: boolean;\n displayName: string;\n } {\n const charFactor = 0.52;\n const minFont = 6.5;\n const maxName = 15;\n\n const innerW = Math.max(segmentInnerWidth, 8);\n\n let showValueLine = wantValue && sliceHeight >= 17 && innerW >= 38;\n\n const fitNameOnly = (): number => {\n const raw = Math.min(maxName + 2, sliceHeight * 0.42, innerW / Math.max(name.length * charFactor, 2.5));\n return Math.max(minFont, raw);\n };\n\n const fitBoth = (): { nameSize: number; valueSize: number } => {\n const vBudget = sliceHeight * 0.76;\n let nameSize = Math.min(maxName, vBudget / 2.45, innerW / Math.max(name.length * charFactor, 2.5));\n nameSize = Math.max(minFont, nameSize);\n let valueSize = Math.max(minFont, Math.min(nameSize * 0.88, vBudget / 2.45));\n const stackH = nameSize * 1.18 + valueSize * 1.08 + sliceHeight * 0.05;\n if (stackH > sliceHeight * 0.88) {\n const scale = (sliceHeight * 0.88) / stackH;\n nameSize = Math.max(minFont, nameSize * scale);\n valueSize = Math.max(minFont, valueSize * scale);\n }\n return { nameSize, valueSize };\n };\n\n let nameSize: number;\n let valueSize = 0;\n\n if (showValueLine) {\n const both = fitBoth();\n nameSize = both.nameSize;\n valueSize = both.valueSize;\n if (nameSize * 1.2 + valueSize * 1.05 > sliceHeight * 0.9) {\n showValueLine = false;\n }\n }\n\n if (!showValueLine) {\n nameSize = fitNameOnly();\n }\n\n const maxChars = Math.max(2, Math.floor(innerW / (nameSize * charFactor)));\n const displayName = this.truncateLabel(name, maxChars);\n\n return { nameSize, valueSize, showValueLine, displayName };\n }\n\n private truncateLabel(name: string, maxChars: number): string {\n if (name.length <= maxChars) return name;\n if (maxChars <= 1) return '…';\n return `${name.slice(0, maxChars - 1)}…`;\n }\n\n private pickOnSliceTextColors(sliceColorCss: string): { primary: string; secondary: string } {\n const resolved = this.resolveCssColor(sliceColorCss);\n const c = this.d3.color(resolved);\n if (!c) {\n return { primary: 'rgba(255,255,255,0.95)', secondary: 'rgba(255,255,255,0.78)' };\n }\n const rgb = this.d3.rgb(c);\n const a = Math.max(0, Math.min(1, rgb.opacity));\n // Blend slice color over white (typical card/surface) so low-alpha intensity ramps read correctly.\n const br = (rgb.r / 255) * a + (1 - a);\n const bg = (rgb.g / 255) * a + (1 - a);\n const bb = (rgb.b / 255) * a + (1 - a);\n const lum = 0.2126 * br + 0.7152 * bg + 0.0722 * bb;\n if (lum > 0.62) {\n return { primary: 'rgba(15,23,42,0.92)', secondary: 'rgba(15,23,42,0.72)' };\n }\n return { primary: 'rgba(255,255,255,0.96)', secondary: 'rgba(255,255,255,0.78)' };\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.scheduleTooltipPosition(event, 0);\n }\n\n private scheduleTooltipPosition(event: MouseEvent, attempt: number): void {\n this._tooltipRafId = requestAnimationFrame(() => {\n const containerEl = this.chartContainerEl().nativeElement;\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(event, attempt + 1);\n return;\n }\n\n this._tooltipRafId = null;\n const rect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n this._tooltipPosition.set(\n computeTooltipPosition(rect, tooltipRect, event.clientX + 10, event.clientY - 10, 10),\n );\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 <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n </ax-chart-tooltip>\n @if (data()?.length === 0) {\n <div class=\"ax-chart-empty\">\n <div class=\"ax-chart-empty__card\">\n <div class=\"ax-chart-empty__icon\">\n <i [class]=\"effectiveMessages().noDataIcon + ' fa-2x'\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"ax-chart-empty__title\">{{ effectiveMessages().noData }}</div>\n <div class=\"ax-chart-empty__help\">{{ effectiveMessages().noDataHelp }}</div>\n </div>\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -519,28 +519,39 @@ class AXGaugeChartComponent extends AXChartComponent {
519
519
  const options = this.effectiveOptions();
520
520
  if (!options.showTooltip)
521
521
  return;
522
- this.updateTooltipPosition(event);
523
522
  this._tooltipData.set({
524
523
  title: options.label || 'Range',
525
524
  value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,
526
525
  color: 'rgb(var(--ax-comp-gauge-chart-track-color))',
527
526
  });
528
527
  this._tooltipVisible.set(true);
528
+ this.updateTooltipPosition(event);
529
529
  }
530
530
  updateTooltipPosition(event) {
531
531
  this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };
532
532
  if (this._tooltipRafId != null)
533
533
  return;
534
+ this.scheduleTooltipPosition(0);
535
+ }
536
+ scheduleTooltipPosition(attempt) {
534
537
  this._tooltipRafId = requestAnimationFrame(() => {
535
- this._tooltipRafId = null;
536
538
  const coords = this._pendingTooltipCoords;
537
- if (!coords)
539
+ if (!coords) {
540
+ this._tooltipRafId = null;
538
541
  return;
542
+ }
539
543
  const containerEl = this.chartContainerEl()?.nativeElement;
540
- if (!containerEl)
544
+ if (!containerEl) {
545
+ this._tooltipRafId = null;
541
546
  return;
542
- const rect = containerEl.getBoundingClientRect();
547
+ }
543
548
  const tooltipEl = containerEl.querySelector('.chart-tooltip');
549
+ if (!tooltipEl && this._tooltipVisible() && attempt < 3) {
550
+ this.scheduleTooltipPosition(attempt + 1);
551
+ return;
552
+ }
553
+ this._tooltipRafId = null;
554
+ const rect = containerEl.getBoundingClientRect();
544
555
  const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;
545
556
  const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);
546
557
  this._tooltipPosition.set(pos);
@@ -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 { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { 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 showDataLabels: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\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 return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n","import {\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n createChartInstanceId,\n formatLargeNumber,\n getEasingFunction,\n mergeChartMessages,\n mergeChartOptions,\n renderChartEmptyMessage,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\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})\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(() => mergeChartOptions(this.configToken, this.options()));\n\n protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\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 private readonly MIN_SEGMENT_CHORD_FOR_LABEL = 28;\n private readonly MIN_SEGMENT_RING_FOR_LABEL = 14;\n private readonly MIN_SEGMENT_LABEL_FONT = 10;\n private readonly MAX_SEGMENT_LABEL_FONT = 16;\n private readonly instanceId = createChartInstanceId('ax-gauge');\n\n private get bgGradientId(): string {\n return `${this.instanceId}-bg-gradient`;\n }\n\n private thresholdGradientId(index: number): string {\n return `${this.instanceId}-threshold-gradient-${index}`;\n }\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 const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n } else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n } else {\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 const containerElement = this.chartContainerEl().nativeElement;\n\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n\n const currentValue = this.value() as number;\n\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.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 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 || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\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, currentValue, minValue, maxValue, animationDuration);\n\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, 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(#${this.bgGradientId})`)\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 const labeledSegments: {\n startAngle: number;\n endAngle: number;\n label: string;\n }[] = [];\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 startAngle = previousEndAngle;\n const arcPath = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n }),\n )\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n\n if (threshold.label) {\n labeledSegments.push({ startAngle, endAngle, label: threshold.label });\n }\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(#${this.bgGradientId})`)\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 if (this.effectiveOptions().showDataLabels !== false && labeledSegments.length > 0) {\n this.drawSegmentLabels(chartGroup, labeledSegments, innerRadius, outerRadius);\n }\n }\n\n /**\n * Draws threshold labels centered on each segment arc when space allows.\n */\n private drawSegmentLabels(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n segments: { startAngle: number; endAngle: number; label: string }[],\n innerRadius: number,\n outerRadius: number,\n ): void {\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98);\n\n const labelGroup = chartGroup.append('g').attr('class', 'gauge-segment-labels');\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const animationDuration = this.effectiveOptions().animationDuration ?? 750;\n\n segments.forEach((segment) => {\n const angle = segment.endAngle - segment.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const fontSize = this.calculateSegmentLabelFontSize(angle, ringWidth, chordLength);\n if (fontSize <= 0) return;\n\n const availableWidth = chordLength * 0.8;\n const text = this.getFittedSegmentLabel(segment.label, fontSize, availableWidth);\n if (!text) return;\n\n const centroid = labelArc.centroid({\n innerRadius,\n outerRadius: outerRadius * 0.98,\n startAngle: segment.startAngle,\n endAngle: segment.endAngle,\n });\n\n labelGroup\n .append('text')\n .attr('class', 'gauge-segment-label')\n .attr('transform', `translate(${centroid[0]}, ${centroid[1]})`)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('pointer-events', 'none')\n .style('font-size', `${fontSize}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-data-labels-color))')\n .style('opacity', 0)\n .text(text)\n .transition()\n .duration(animationDuration)\n .style('opacity', 1);\n });\n }\n\n private calculateSegmentLabelFontSize(angle: number, ringWidth: number, chordLength: number): number {\n if (chordLength < this.MIN_SEGMENT_CHORD_FOR_LABEL || ringWidth < this.MIN_SEGMENT_RING_FOR_LABEL) {\n return 0;\n }\n\n const ringBasedSize = ringWidth * 0.45;\n const angleScale = Math.min(1, 0.7 + 0.3 * (angle / (this.HALF_CIRCLE_RADIANS / 3)));\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * angleScale, maxByChord);\n\n if (fontSize < this.MIN_SEGMENT_LABEL_FONT) return 0;\n return Math.round(Math.max(this.MIN_SEGMENT_LABEL_FONT, Math.min(fontSize, this.MAX_SEGMENT_LABEL_FONT)) * 2) / 2;\n }\n\n private getFittedSegmentLabel(label: string, fontSize: number, availableWidth: number): string {\n if (!label) return '';\n if (this.doesSegmentLabelFit(label, fontSize, availableWidth)) return label;\n return this.truncateSegmentLabel(label, fontSize, availableWidth);\n }\n\n private doesSegmentLabelFit(text: string, fontSize: number, availableWidth: number): boolean {\n return text.length * fontSize * 0.65 <= availableWidth;\n }\n\n private truncateSegmentLabel(text: string, fontSize: number, availableWidth: number): string {\n const charWidth = fontSize * (fontSize <= 10 ? 0.7 : 0.65);\n const availableForText = availableWidth - fontSize * 0.7;\n if (availableForText <= 0) return '';\n\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0) return '';\n if (text.length <= maxChars) return text;\n return `${text.substring(0, Math.max(1, maxChars))}…`;\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.chartContainerEl()\n ?.nativeElement.querySelectorAll('.ax-chart-empty')\n .forEach((el) => el.remove());\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', this.bgGradientId)\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', this.thresholdGradientId(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 || 1;\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 || 1;\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 || 1;\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>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\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 { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { 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 showDataLabels: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\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 return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n","import {\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n createChartInstanceId,\n formatLargeNumber,\n getEasingFunction,\n mergeChartMessages,\n mergeChartOptions,\n renderChartEmptyMessage,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\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})\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(() => mergeChartOptions(this.configToken, this.options()));\n\n protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\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 private readonly MIN_SEGMENT_CHORD_FOR_LABEL = 28;\n private readonly MIN_SEGMENT_RING_FOR_LABEL = 14;\n private readonly MIN_SEGMENT_LABEL_FONT = 10;\n private readonly MAX_SEGMENT_LABEL_FONT = 16;\n private readonly instanceId = createChartInstanceId('ax-gauge');\n\n private get bgGradientId(): string {\n return `${this.instanceId}-bg-gradient`;\n }\n\n private thresholdGradientId(index: number): string {\n return `${this.instanceId}-threshold-gradient-${index}`;\n }\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 const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n } else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n } else {\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 const containerElement = this.chartContainerEl().nativeElement;\n\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n\n const currentValue = this.value() as number;\n\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.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 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 || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\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, currentValue, minValue, maxValue, animationDuration);\n\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, 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(#${this.bgGradientId})`)\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 const labeledSegments: {\n startAngle: number;\n endAngle: number;\n label: string;\n }[] = [];\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 startAngle = previousEndAngle;\n const arcPath = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n }),\n )\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n\n if (threshold.label) {\n labeledSegments.push({ startAngle, endAngle, label: threshold.label });\n }\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(#${this.bgGradientId})`)\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 if (this.effectiveOptions().showDataLabels !== false && labeledSegments.length > 0) {\n this.drawSegmentLabels(chartGroup, labeledSegments, innerRadius, outerRadius);\n }\n }\n\n /**\n * Draws threshold labels centered on each segment arc when space allows.\n */\n private drawSegmentLabels(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n segments: { startAngle: number; endAngle: number; label: string }[],\n innerRadius: number,\n outerRadius: number,\n ): void {\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98);\n\n const labelGroup = chartGroup.append('g').attr('class', 'gauge-segment-labels');\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const animationDuration = this.effectiveOptions().animationDuration ?? 750;\n\n segments.forEach((segment) => {\n const angle = segment.endAngle - segment.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const fontSize = this.calculateSegmentLabelFontSize(angle, ringWidth, chordLength);\n if (fontSize <= 0) return;\n\n const availableWidth = chordLength * 0.8;\n const text = this.getFittedSegmentLabel(segment.label, fontSize, availableWidth);\n if (!text) return;\n\n const centroid = labelArc.centroid({\n innerRadius,\n outerRadius: outerRadius * 0.98,\n startAngle: segment.startAngle,\n endAngle: segment.endAngle,\n });\n\n labelGroup\n .append('text')\n .attr('class', 'gauge-segment-label')\n .attr('transform', `translate(${centroid[0]}, ${centroid[1]})`)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('pointer-events', 'none')\n .style('font-size', `${fontSize}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-data-labels-color))')\n .style('opacity', 0)\n .text(text)\n .transition()\n .duration(animationDuration)\n .style('opacity', 1);\n });\n }\n\n private calculateSegmentLabelFontSize(angle: number, ringWidth: number, chordLength: number): number {\n if (chordLength < this.MIN_SEGMENT_CHORD_FOR_LABEL || ringWidth < this.MIN_SEGMENT_RING_FOR_LABEL) {\n return 0;\n }\n\n const ringBasedSize = ringWidth * 0.45;\n const angleScale = Math.min(1, 0.7 + 0.3 * (angle / (this.HALF_CIRCLE_RADIANS / 3)));\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * angleScale, maxByChord);\n\n if (fontSize < this.MIN_SEGMENT_LABEL_FONT) return 0;\n return Math.round(Math.max(this.MIN_SEGMENT_LABEL_FONT, Math.min(fontSize, this.MAX_SEGMENT_LABEL_FONT)) * 2) / 2;\n }\n\n private getFittedSegmentLabel(label: string, fontSize: number, availableWidth: number): string {\n if (!label) return '';\n if (this.doesSegmentLabelFit(label, fontSize, availableWidth)) return label;\n return this.truncateSegmentLabel(label, fontSize, availableWidth);\n }\n\n private doesSegmentLabelFit(text: string, fontSize: number, availableWidth: number): boolean {\n return text.length * fontSize * 0.65 <= availableWidth;\n }\n\n private truncateSegmentLabel(text: string, fontSize: number, availableWidth: number): string {\n const charWidth = fontSize * (fontSize <= 10 ? 0.7 : 0.65);\n const availableForText = availableWidth - fontSize * 0.7;\n if (availableForText <= 0) return '';\n\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0) return '';\n if (text.length <= maxChars) return text;\n return `${text.substring(0, Math.max(1, maxChars))}…`;\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._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 this.updateTooltipPosition(event);\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.scheduleTooltipPosition(0);\n }\n\n private scheduleTooltipPosition(attempt: number): void {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n\n this._tooltipRafId = null;\n const rect = containerEl.getBoundingClientRect();\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.chartContainerEl()\n ?.nativeElement.querySelectorAll('.ax-chart-empty')\n .forEach((el) => el.remove());\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', this.bgGradientId)\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', this.thresholdGradientId(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 || 1;\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 || 1;\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 || 1;\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>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -295,10 +295,18 @@ class AXHeatmapChartComponent extends AXChartComponent {
295
295
  updateTooltipPos(event) {
296
296
  if (this._tooltipRafId)
297
297
  cancelAnimationFrame(this._tooltipRafId);
298
+ this.scheduleTooltipPosition(event, 0);
299
+ }
300
+ scheduleTooltipPosition(event, attempt) {
298
301
  this._tooltipRafId = requestAnimationFrame(() => {
299
302
  const containerEl = this.containerRef().nativeElement;
300
- const rect = containerEl.getBoundingClientRect();
301
303
  const tooltipEl = containerEl.querySelector('.chart-tooltip');
304
+ if (!tooltipEl && this.tooltipVisible() && attempt < 3) {
305
+ this.scheduleTooltipPosition(event, attempt + 1);
306
+ return;
307
+ }
308
+ this._tooltipRafId = null;
309
+ const rect = containerEl.getBoundingClientRect();
302
310
  const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;
303
311
  const pos = computeTooltipPosition(rect, tooltipRect, event.clientX + 10, event.clientY - 10, 10);
304
312
  this.tooltipPosition.set(pos);