{"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    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 tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n      const pos = computeTooltipPosition(containerEl, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n      this._tooltipPosition.set(pos);\n    });\n  }\n\n  private cancelTooltipPosition(): void {\n    if (this._tooltipRafId != null) {\n      cancelAnimationFrame(this._tooltipRafId);\n      this._tooltipRafId = null;\n    }\n    this._pendingTooltipCoords = null;\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    this.cancelTooltipPosition();\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.effectiveOptions().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  /**\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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"}