{"version":3,"file":"acorex-charts-bar-chart.mjs","sources":["../../../../packages/charts/bar-chart/src/lib/bar-chart.config.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.ts","../../../../packages/charts/bar-chart/src/lib/bar-chart.component.html","../../../../packages/charts/bar-chart/src/acorex-charts-bar-chart.ts"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXBarChartOption } from './bar-chart.type';\n\nexport const AXBarChartDefaultConfig: AXBarChartOption = {\n  showXAxis: true,\n  showYAxis: true,\n  showGrid: true,\n  showDataLabels: true,\n  showTooltip: true,\n  rotateXAxisLabels: 'auto',\n  barWidth: 80,\n  cornerRadius: 4,\n  animationDuration: 800,\n  animationEasing: 'cubic-out',\n  messages: {\n    ...AX_CHART_DEFAULT_MESSAGES,\n    noDataIcon: 'fa-light fa-chart-column',\n  },\n};\n\nexport const AX_BAR_CHART_CONFIG = new InjectionToken<AXBarChartOption>('AX_BAR_CHART_CONFIG', {\n  providedIn: 'root',\n  factory: () => AXBarChartDefaultConfig,\n});\n\nexport type PartialBarChartConfig = Partial<AXBarChartOption>;\n\nexport function barChartConfig(config: PartialBarChartConfig = {}): AXBarChartOption {\n  return {\n    ...AXBarChartDefaultConfig,\n    ...config,\n    messages: {\n      ...AXBarChartDefaultConfig.messages,\n      ...config.messages,\n    },\n  };\n}\n","import {\n  AX_CHART_COLOR_PALETTE,\n  AXChartComponent,\n  AXChartComponentBase,\n  computeTooltipPosition,\n  formatLargeNumber,\n  getChartColor,\n  getEasingFunction,\n  mergeChartMessages,\n  mergeChartOptions,\n  renderChartEmptyMessage,\n  resolveBarWidthFraction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\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_BAR_CHART_CONFIG } from './bar-chart.config';\nimport {\n  AXBarChartClickEvent,\n  AXBarChartClusteredData,\n  AXBarChartData,\n  AXBarChartOption,\n  AXBarChartValue,\n} from './bar-chart.type';\n\n/**\n * Bar Chart Component\n * Renders data as vertical bars with interactive hover effects and animations\n */\n@Component({\n  selector: 'ax-bar-chart',\n  templateUrl: './bar-chart.component.html',\n  styleUrls: ['./bar-chart.component.css'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [AXChartTooltipComponent],\n})\nexport class AXBarChartComponent\n  extends AXChartComponent\n  implements OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n  // Inputs\n  /** Chart data input */\n  data = input<AXBarChartValue>([] as AXBarChartValue);\n\n  /** Chart options input */\n  options = input<AXBarChartOption>({});\n\n  // Outputs\n  /** Emitted when a bar is clicked */\n  barClick = output<AXBarChartClickEvent>();\n\n  // Chart container reference\n  private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n  // D3 reference - loaded asynchronously\n  protected d3!: typeof import('d3');\n\n  // Chart elements - using proper D3 types\n  private svg!: ReturnType<typeof import('d3').select<SVGSVGElement, unknown>>;\n  private chart!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n  private xScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n  private yScale!: ReturnType<typeof import('d3').scaleLinear<number, number>>;\n  private xSubScale!: ReturnType<typeof import('d3').scaleBand<string>>;\n  private xAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n  private yAxis!: ReturnType<typeof import('d3').select<SVGGElement, unknown>>;\n\n  // Chart dimensions\n  private width!: number;\n  private height!: number;\n  private margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n  // Constants for layout calculations\n  private readonly CHAR_WIDTH_RATIO = 0.65;\n  private readonly TOOLTIP_GAP = 10;\n  private readonly AXIS_TICK_PADDING = 10;\n  private readonly Y_AXIS_TITLE_THICKNESS = 14;\n  private readonly Y_AXIS_TITLE_PADDING = 14;\n  private readonly X_AXIS_TITLE_FONT_SIZE = 14;\n  private readonly X_AXIS_TITLE_GAP = 14;\n  private readonly X_AXIS_TITLE_BLOCK_HEIGHT = 24;\n  private readonly TOP_EDGE_PADDING = 8;\n  private readonly BOTTOM_EDGE_PADDING = 8;\n  private readonly HORIZONTAL_EDGE_PADDING = 12;\n  private readonly FALLBACK_PLOT_HEIGHT = 240;\n  private readonly MIN_PLOT_HEIGHT = 120;\n  private readonly MIN_TOTAL_WIDTH = 200;\n  private readonly OUTER_PADDING_CLUSTERED = 0.2;\n  private readonly INNER_PADDING_CLUSTERED = 0.1;\n  private readonly MIN_PADDING = 0.1;\n  private readonly HOVER_TRANSITION_DURATION = 150;\n  private readonly DEFAULT_ANIMATION_DELAY = 50;\n  private readonly LABEL_ANIMATION_DELAY = 100;\n  private readonly MIN_TOP_SPACE_FOR_LABEL = 20;\n  private readonly LABEL_OFFSET = 8;\n  private readonly ROTATION_TOLERANCE_SMALL_DATASET = 1.4;\n  private readonly SMALL_DATASET_THRESHOLD = 6;\n  private readonly Y_AXIS_PADDING = 20;\n  private readonly TICK_AREA_PADDING = 6;\n  private readonly TICK_AREA_GAP = 8;\n  private readonly DEFAULT_FONT_SIZE = 13;\n  private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n  private readonly FONT_PADDING = 8;\n  private readonly MAX_LABEL_LENGTH = 20;\n  private readonly MIN_FONT_SIZE_X_AXIS = 8;\n  private readonly MAX_FONT_SIZE_X_AXIS = 14;\n  private readonly MIN_FONT_SIZE_Y_AXIS = 9;\n  private readonly MAX_FONT_SIZE_Y_AXIS = 15;\n  private readonly MANY_ITEMS_THRESHOLD = 20;\n  private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n  // Animation state\n  private _initialAnimationComplete = signal(false);\n\n  // Tooltip state\n  private _tooltipVisible = signal(false);\n  private _tooltipPosition = signal({ x: 0, y: 0 });\n  private _tooltipData = signal<AXChartTooltipData>({\n    title: '',\n    value: '0',\n    percentage: '0%',\n    color: '',\n  });\n  private _tooltipRafId: number | null = null;\n  private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n  // Signals for component state\n  private _initialized = signal(false);\n  private _rendered = signal(false);\n\n  // Tooltip accessors\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_BAR_CHART_CONFIG);\n\n  // Inject the chart colors\n  private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n  // Inject AXPlatform\n  // Removed unused AXPlatform injection\n\n  // Configuration with defaults\n  protected effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()));\n\n  // Messages with defaults\n  protected effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages));\n\n  // Track hidden bars and series\n  private readonly hiddenBars = new Set<string>();\n  private readonly hiddenSeries = new Set<string>();\n  private readonly _legendStateVersion = signal(0);\n  readonly legendStateVersion = this._legendStateVersion.asReadonly();\n\n  // Computed values for better performance\n  private readonly isClusteredMode = computed(() => {\n    const value = this.data();\n    return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n  });\n\n  private readonly visibleData = computed(() => {\n    const value = this.data() || [];\n    if (this.isClusteredMode()) {\n      return value as AXBarChartClusteredData[];\n    }\n    return (value as AXBarChartData[]).filter((d) => !this.hiddenBars.has(d.id));\n  });\n\n  private readonly hasVisibleData = computed(() => {\n    const value = this.data();\n    if (!Array.isArray(value) || value.length === 0) return false;\n\n    if (this.isClusteredMode()) {\n      const groups = value as AXBarChartClusteredData[];\n      const seriesLabels = this.getClusterSeriesLabels(groups);\n      const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n      return groups.some((g) => visibleSeries.some((label) => !!g.chartData.find((item) => item.label === label)));\n    }\n\n    return (value as AXBarChartData[]).some((d) => !this.hiddenBars.has(d.id));\n  });\n\n  // Type guard helper\n  private isClusteredData(value: AXBarChartValue): value is AXBarChartClusteredData[] {\n    return Array.isArray(value) && value.length > 0 && 'chartData' in value[0];\n  }\n\n  private getClusterSeriesLabels(groups: AXBarChartClusteredData[]): string[] {\n    return groups[0]?.chartData?.map((d) => d.label) ?? [];\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      // Create chart after D3 is loaded and container is available\n      if (this.d3 && this.chartContainerEl()) {\n        this.createChart();\n        this._rendered.set(true);\n      }\n    });\n\n    // Watch for changes to redraw the chart\n    effect(() => {\n      // Access inputs to track them\n      this.data();\n      this.effectiveOptions();\n\n      // Only update if already rendered\n      if (this._rendered()) {\n        this.updateChart();\n        this.bumpLegendState();\n      }\n    });\n  }\n\n  private bumpLegendState(): void {\n    this._legendStateVersion.update((version) => version + 1);\n  }\n\n  ngOnDestroy(): void {\n    this.cancelTooltipPosition();\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 bar chart SVG and renders all elements\n   */\n  public createChart(): void {\n    if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n    const containerElement = this.chartContainerEl().nativeElement;\n    const inputValue = (this.data() || []) as AXBarChartValue;\n    const isClustered = this.isClusteredData(inputValue);\n\n    // Use computed visibility\n    const hasAnyVisible = this.hasVisibleData();\n    const visibleSingleData = isClustered ? [] : (this.visibleData() as AXBarChartData[]);\n    const groupedData = isClustered ? (inputValue as AXBarChartClusteredData[]) : [];\n\n    // Clear existing chart SVG and messages (do not remove tooltip component)\n    this.clearChartArea(containerElement);\n\n    // Early return if no data\n    if (!Array.isArray(inputValue) || inputValue.length === 0) {\n      this.showNoDataMessage(containerElement);\n      return;\n    }\n\n    // Early return if all bars are hidden\n    if (!hasAnyVisible) {\n      this.showAllBarsHiddenMessage(containerElement);\n      return;\n    }\n\n    // Get options and setup dimensions\n    const chartOptions = this.effectiveOptions();\n    this.setupDimensions(containerElement, chartOptions);\n\n    // Create scales and axes and render based on mode\n    if (isClustered) {\n      this.setupScalesClustered(groupedData);\n      this.createAxesClustered(chartOptions, groupedData);\n      this.renderBarsClustered(groupedData);\n    } else {\n      this.setupScales(visibleSingleData);\n      this.createAxes(chartOptions);\n      this.renderBars(visibleSingleData);\n    }\n  }\n\n  /**\n   * Updates the chart when inputs change\n   */\n  public updateChart(): void {\n    this.createChart();\n  }\n\n  /**\n   * Cleans up chart resources\n   */\n  public cleanupChart(): void {\n    this.cancelTooltipPosition();\n    const container = this.chartContainerEl()?.nativeElement;\n    if (container) {\n      this.clearChartArea(container);\n    }\n    this.svg = undefined!;\n    this.chart = undefined!;\n    this._tooltipVisible.set(false);\n  }\n\n  /**\n   * Sets up chart dimensions and creates SVG with responsive attributes\n   */\n  private setupDimensions(containerElement: HTMLElement, options: AXBarChartOption): void {\n    // Remove outer margins; calculate only internal paddings for axes and labels\n    this.margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n    // Get container dimensions\n    const containerWidth = containerElement.clientWidth;\n    const containerHeight = containerElement.clientHeight;\n\n    // Axis visibility\n    const showXAxis = options.showXAxis !== false;\n    const showYAxis = options.showYAxis !== false;\n\n    // Internal left padding for Y-axis ticks/labels/title\n    const yAxisTitleThickness = options.yAxisLabel ? this.Y_AXIS_TITLE_THICKNESS : 0;\n    const yAxisTitlePadding = options.yAxisLabel ? this.Y_AXIS_TITLE_PADDING : 0;\n    const leftPaddingForYAxis = showYAxis\n      ? this.calculateMaxYAxisTickLabelWidth() + this.AXIS_TICK_PADDING + yAxisTitlePadding + yAxisTitleThickness\n      : 0;\n    const leftInnerPadding = leftPaddingForYAxis + this.HORIZONTAL_EDGE_PADDING;\n    const rightInnerPadding = this.HORIZONTAL_EDGE_PADDING;\n\n    // Estimate internal bottom padding for X-axis ticks/labels/title\n    let bottomPaddingForXAxis = 0;\n    if (showXAxis) {\n      const raw = (this.data() || []) as AXBarChartValue;\n      const isClustered = this.isClusteredData(raw);\n      const barCount = isClustered ? (raw as AXBarChartClusteredData[]).length : (raw as AXBarChartData[]).length;\n      const longestLabel = (() => {\n        if (isClustered) {\n          const groups = raw as AXBarChartClusteredData[];\n          return groups.reduce((acc, g) => (acc.length > (g.label?.length ?? 0) ? acc : (g.label ?? '')), '');\n        }\n        const flat = (raw as AXBarChartData[]) || [];\n        return flat.reduce((a, b) => (a.length > b.label.length ? a : b.label), '');\n      })();\n\n      const baseWidth = options.width ?? containerWidth;\n      const workingWidth = Math.max(1, baseWidth - leftInnerPadding - rightInnerPadding);\n      const dynamicFontSize = Math.max(10, Math.min(14, Math.round(workingWidth / 50)));\n\n      // Use truncated label length for calculation (same logic as actual rendering)\n      const maxLabelLength = barCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n      const effectiveLabelLength = Math.min(longestLabel.length, maxLabelLength);\n      const estimatedLongestLabelWidth = effectiveLabelLength * dynamicFontSize * 0.65;\n\n      const availableWidthPerBar = barCount > 0 ? workingWidth / barCount : workingWidth;\n      const rotateOption = typeof options.rotateXAxisLabels === 'boolean' ? options.rotateXAxisLabels : undefined;\n      const willRotate = this.shouldLabelsRotate(rotateOption, estimatedLongestLabelWidth, availableWidthPerBar);\n\n      const tickAreaHeight = willRotate\n        ? estimatedLongestLabelWidth * Math.SQRT1_2 + dynamicFontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING\n        : dynamicFontSize + this.TICK_AREA_PADDING + 2;\n      const gapBelowTicks = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_GAP : 0;\n      const titleBlockHeight = options.xAxisLabel && !willRotate ? this.X_AXIS_TITLE_BLOCK_HEIGHT : 0;\n      bottomPaddingForXAxis = tickAreaHeight + gapBelowTicks + titleBlockHeight;\n    }\n\n    // Determine plotting dimensions with sensible fallbacks\n    const baseWidth = options.width ?? containerWidth;\n    const totalWidth = Math.max(this.MIN_TOTAL_WIDTH, baseWidth > 0 ? baseWidth : this.MIN_TOTAL_WIDTH);\n    const plotWidth = Math.max(0, totalWidth - leftInnerPadding - rightInnerPadding);\n\n    const plotHeight = this.calculatePlotHeight(options.height, containerHeight, bottomPaddingForXAxis);\n\n    this.width = plotWidth;\n    this.height = plotHeight;\n\n    // Create SVG with explicit pixel dimensions to avoid collapse\n    const totalHeight = this.height + bottomPaddingForXAxis + this.TOP_EDGE_PADDING + this.BOTTOM_EDGE_PADDING;\n\n    const svg = this.d3\n      .select(containerElement)\n      .append('svg')\n      .attr('width', '100%')\n      .attr('height', '100%')\n      .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n      .attr('preserveAspectRatio', 'xMidYMid meet');\n\n    this.svg = svg;\n\n    // Create chart group translated by internal paddings (no external margins)\n    this.chart = this.svg\n      .append('g')\n      .attr('class', 'chart-content')\n      .attr('transform', `translate(${leftInnerPadding},${this.TOP_EDGE_PADDING})`);\n  }\n\n  /**\n   * Calculates plot height based on options and container dimensions\n   */\n  private calculatePlotHeight(\n    optionHeight: number | undefined,\n    containerHeight: number,\n    bottomPadding: number,\n  ): number {\n    if (optionHeight && optionHeight > 0) {\n      return Math.max(this.MIN_PLOT_HEIGHT, optionHeight - bottomPadding);\n    }\n    if (containerHeight > 0) {\n      return Math.max(this.MIN_PLOT_HEIGHT, containerHeight - bottomPadding);\n    }\n    return this.FALLBACK_PLOT_HEIGHT;\n  }\n\n  /**\n   * Determines if X-axis labels should rotate\n   */\n  private shouldLabelsRotate(\n    rotateOption: boolean | undefined,\n    estimatedWidth: number,\n    availableWidth: number,\n  ): boolean {\n    if (rotateOption === true) return true;\n    if (rotateOption === false) return false;\n    return estimatedWidth > availableWidth;\n  }\n\n  /**\n   * Creates x and y scales for the chart\n   */\n  private setupScales(data: AXBarChartData[]): void {\n    const barWidthFraction = resolveBarWidthFraction(this.effectiveOptions().barWidth);\n    const padding = Math.max(this.MIN_PADDING, 1 - barWidthFraction);\n\n    // Create x scale (band scale for categorical data)\n    this.xScale = this.d3\n      .scaleBand()\n      .domain(data.map((d) => d.id))\n      .range([0, this.width])\n      .padding(padding);\n\n    // Create y scale (linear scale for values)\n    // Support negative values by calculating min/max\n    const minValue = this.d3.min(data, (d) => d.value) || 0;\n    const maxValue = this.d3.max(data, (d) => d.value) || 0;\n\n    this.yScale = this.d3\n      .scaleLinear()\n      .domain([Math.min(0, minValue), Math.max(0, maxValue)])\n      .nice()\n      .range([this.height, 0]);\n  }\n\n  /**\n   * Creates x and y scales for clustered charts\n   */\n  private setupScalesClustered(groups: AXBarChartClusteredData[]): void {\n    const seriesLabels = this.getClusterSeriesLabels(groups);\n    const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n    // Outer band for clusters\n    this.xScale = this.d3\n      .scaleBand()\n      .domain(groups.map((g) => g.id))\n      .range([0, this.width])\n      .padding(this.OUTER_PADDING_CLUSTERED);\n\n    // Inner band for series\n    this.xSubScale = this.d3\n      .scaleBand()\n      .domain(visibleSeries)\n      .range([0, this.xScale.bandwidth()])\n      .padding(this.INNER_PADDING_CLUSTERED);\n\n    // Y scale across all visible values (support negative values)\n    const allVisibleValues: number[] = [];\n    for (const g of groups) {\n      visibleSeries.forEach((label) => {\n        const item = g.chartData.find((d) => d.label === label);\n        if (item && typeof item.value === 'number') allVisibleValues.push(item.value);\n      });\n    }\n    const yMin = this.d3.min(allVisibleValues) || 0;\n    const yMax = this.d3.max(allVisibleValues) || 0;\n\n    this.yScale = this.d3\n      .scaleLinear()\n      .domain([Math.min(0, yMin), Math.max(0, yMax)])\n      .nice()\n      .range([this.height, 0]);\n  }\n\n  /**\n   * Creates x and y axes with grid lines\n   */\n  private createAxes(options: AXBarChartOption): void {\n    const showXAxis = options.showXAxis !== false;\n    const showYAxis = options.showYAxis !== false;\n    const showGrid = options.showGrid !== false;\n\n    const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n    if (showXAxis) {\n      this.createXAxis(axesGroup, options);\n    }\n\n    if (showYAxis) {\n      this.createYAxis(axesGroup, options);\n    }\n\n    if (showGrid) {\n      this.createGridLines();\n    }\n  }\n\n  private createXAxis(\n    axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n    options: AXBarChartOption,\n  ): void {\n    const visibleDataForTicks = (this.data() || []).filter((d) => !this.isBarHidden(d.id));\n    const idToLabel = new Map<string, string>(visibleDataForTicks.map((d) => [d.id, d.label]));\n    this.buildXAxisCommon(axesGroup, idToLabel, options);\n  }\n\n  private createYAxis(\n    axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n    options: AXBarChartOption,\n  ): void {\n    // Create Y axis with smart number formatting\n    const yAxisGenerator = this.d3.axisLeft(this.yScale).tickFormat((value: number | { valueOf(): number }) => {\n      const numValue = typeof value === 'number' ? value : value.valueOf();\n      return formatLargeNumber(numValue);\n    });\n\n    // Reduce tick count for better readability\n    const maxValue = this.yScale.domain()[1];\n    if (maxValue > 1e6) {\n      yAxisGenerator.ticks(6); // Fewer ticks for large numbers\n    } else if (maxValue > 1e3) {\n      yAxisGenerator.ticks(8);\n    }\n\n    this.yAxis = axesGroup.append('g').attr('class', 'ax-bar-chart-axis-y').call(yAxisGenerator);\n\n    // Style the axis text\n    const dynamicFontSize = this.getYAxisTickFontSizeBasedOnHeight();\n    this.yAxis\n      .selectAll('text')\n      .style('font-size', `${dynamicFontSize}px`)\n      .style('font-weight', '400')\n      .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n      .attr('text-anchor', 'end')\n      .attr('direction', 'ltr');\n\n    // Style axis lines\n    this.yAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n    // Add Y axis title\n    if (options.yAxisLabel) {\n      this.createYAxisTitle(axesGroup, options.yAxisLabel);\n    }\n  }\n\n  private shouldRotateXAxisLabels(idToLabel: Map<string, string>, fontSize: number): boolean {\n    const options = this.effectiveOptions();\n\n    // Check if user explicitly set rotation option\n    if (options.rotateXAxisLabels === true) return true;\n    if (options.rotateXAxisLabels === false) return false;\n\n    // If 'auto' or undefined, use intelligent calculation\n    if (this.xScale.domain().length === 0) return false;\n\n    const step = this.xScale.step();\n    const labels = Array.from(idToLabel.values());\n    const longestLabel = labels.reduce((a, b) => (a.length > b.length ? a : b), '');\n    const estimatedWidth = longestLabel.length * fontSize * this.CHAR_WIDTH_RATIO;\n\n    // Heuristic: avoid rotation when there are few categories even if estimation is slightly larger\n    const domainCount = this.xScale.domain().length;\n    if (domainCount <= this.SMALL_DATASET_THRESHOLD) {\n      return estimatedWidth > step * this.ROTATION_TOLERANCE_SMALL_DATASET;\n    }\n\n    return estimatedWidth > step;\n  }\n\n  private createXAxisTitle(\n    axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n    title: string,\n    tickAreaHeight: number,\n    gapBelowTicks = this.TICK_AREA_GAP,\n  ): void {\n    // Title positioned directly below tick area with a consistent gap\n    const labelY = this.height + tickAreaHeight + gapBelowTicks;\n\n    axesGroup\n      .append('text')\n      .attr('class', 'ax-bar-chart-axis-label ax-x-axis-label')\n      .attr('text-anchor', 'middle')\n      .attr('dominant-baseline', 'hanging') // Align to top of text for better positioning\n      .attr('x', this.width / 2)\n      .attr('y', labelY)\n      .attr('direction', 'ltr')\n      .style('font-size', `${this.X_AXIS_TITLE_FONT_SIZE}px`)\n      .style('font-weight', '500')\n      .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n      .text(title);\n  }\n\n  private createYAxisTitle(axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>, title: string): void {\n    // Calculate the exact position for Y-axis title\n    // Y-axis tick labels use text-anchor: end, so they extend LEFT of the Y-axis line\n    // Y-axis is at X = 0 within the chart group\n    // Chart group is translated by (margin.left, margin.top)\n    // So Y-axis is at X = margin.left in SVG coordinates\n\n    const maxTickLabelWidth = this.calculateMaxYAxisTickLabelWidth();\n    const padding = this.Y_AXIS_PADDING;\n\n    // Position title to the left of the tick labels\n    // Since text-anchor: end aligns the text to the Y-axis, we need to go further left\n    const labelY = -maxTickLabelWidth - padding;\n\n    // Center the title vertically\n    const labelX = -this.height / 2;\n\n    axesGroup\n      .append('text')\n      .attr('class', 'ax-bar-chart-axis-label ax-y-axis-label')\n      .attr('text-anchor', 'middle')\n      .attr('dominant-baseline', 'middle')\n      .attr('transform', 'rotate(-90)')\n      .attr('x', labelX)\n      .attr('y', labelY)\n      .attr('direction', 'ltr')\n      .style('font-size', '14px')\n      .style('font-weight', '500')\n      .style('fill', 'rgb(var(--ax-comp-bar-chart-axis-label-color))')\n      .text(title);\n  }\n\n  private calculateMaxYAxisTickLabelWidth(): number {\n    // Calculate the maximum width needed for Y-axis tick labels\n    const raw = (this.data() || []) as AXBarChartValue;\n    const isClustered = this.isClusteredData(raw);\n\n    let maxValue = 0;\n    if (isClustered) {\n      const groups = raw as AXBarChartClusteredData[];\n      const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n      const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n      for (const g of groups) {\n        visibleSeries.forEach((label) => {\n          const item = g.chartData.find((d) => d.label === label);\n          if (item && typeof item.value === 'number') maxValue = Math.max(maxValue, item.value);\n        });\n      }\n    } else {\n      const visibleData = (raw as AXBarChartData[]).filter((d) => !this.isBarHidden(d.id));\n      maxValue = visibleData.reduce((acc, d) => (d.value > acc ? d.value : acc), 0);\n    }\n\n    // Use formatted number for width calculation\n    const tickLabelText = Number.isFinite(maxValue) ? formatLargeNumber(maxValue) : '00000';\n    return tickLabelText.length * this.DEFAULT_FONT_SIZE * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n  }\n\n  private createGridLines(): void {\n    this.chart\n      .append('g')\n      .attr('class', 'ax-bar-chart-grid')\n      .call(\n        this.d3\n          .axisLeft(this.yScale)\n          .tickSize(-this.width)\n          .tickFormat(() => ''),\n      )\n      .selectAll('line')\n      .style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))')\n      .style('stroke-opacity', 0.2);\n\n    // Remove unneeded elements from grid\n    this.chart.select('.ax-bar-chart-grid').selectAll('path, text').remove();\n  }\n\n  /**\n   * Creates axes for clustered charts\n   */\n  private createAxesClustered(options: AXBarChartOption, groups: AXBarChartClusteredData[]): void {\n    const showXAxis = options.showXAxis !== false;\n    const showYAxis = options.showYAxis !== false;\n    const showGrid = options.showGrid !== false;\n\n    const axesGroup = this.chart.append('g').attr('class', 'ax-bar-chart-axes');\n\n    if (showXAxis) {\n      this.createXAxisClustered(axesGroup, options, groups);\n    }\n\n    if (showYAxis) {\n      this.createYAxis(axesGroup, options);\n    }\n\n    if (showGrid) {\n      this.createGridLines();\n    }\n  }\n\n  private createXAxisClustered(\n    axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n    options: AXBarChartOption,\n    groups: AXBarChartClusteredData[],\n  ): void {\n    const idToLabel = new Map<string, string>(groups.map((g) => [g.id, g.label]));\n    this.buildXAxisCommon(axesGroup, idToLabel, options);\n  }\n\n  /**\n   * Renders the bars with animations\n   */\n  private renderBars(data: AXBarChartData[]): void {\n    // Filter out hidden bars\n    const visibleData = data.filter((d) => !this.isBarHidden(d.id));\n    const originalFullData = (this.data() as AXBarChartData[]) || [];\n\n    // Reset animation state\n    this._initialAnimationComplete.set(false);\n\n    // Get corner radius from options\n    const radius = this.effectiveOptions().cornerRadius;\n\n    // Get animation options\n    const animationDuration = this.effectiveOptions().animationDuration;\n    const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n    // Create a container for all bars\n    const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n    // Create groups for each bar to handle transformations\n    const barGroups = barsContainer\n      .selectAll('.ax-bar-chart-bar-group')\n      .data(visibleData)\n      .enter()\n      .append('g')\n      .style('cursor', 'pointer')\n      .attr('class', 'ax-bar-chart-bar-group');\n\n    // Add bars inside groups\n    const bars = barGroups\n      .append('path')\n      .attr('class', 'ax-bar-chart-bar')\n      .attr('d', (d: AXBarChartData) => {\n        const x = this.xScale(d.id);\n        const width = this.xScale.bandwidth();\n        const y = this.height - 0.5; // initial height is zero\n        return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n      })\n      .attr('fill', (d: AXBarChartData) => {\n        // Find the index of the current bar (d) in the original data array\n        const originalIndex = originalFullData.findIndex((item) => item.id === d.id);\n        // Use the original color if provided, otherwise get color from palette using original index\n        // Fallback to index 0 if not found, though this shouldn't happen with valid data.\n        return d.color || this.getColor(originalIndex !== -1 ? originalIndex : 0);\n      });\n\n    // Add data labels if they're enabled\n    if (this.effectiveOptions().showDataLabels !== false) {\n      barGroups\n        .append('text')\n        .attr('class', 'ax-bar-chart-data-label')\n        .attr('text-anchor', 'middle')\n        .attr('x', (d: AXBarChartData) => this.xScale(d.id) + this.xScale.bandwidth() / 2)\n        .attr('y', this.height) // Start from bottom for animation\n        .style('font-size', 'clamp(8px, 2vmin, 12px)')\n        .style('font-weight', '500')\n        .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n        .style('opacity', 0) // Start invisible for animation\n        .text((d: AXBarChartData) => {\n          // Format large numbers in data labels\n          return d.value >= 1000 ? formatLargeNumber(d.value) : d.value;\n        });\n\n      // Animate data labels with smart positioning to avoid clipping\n      const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n      barGroups\n        .selectAll('.ax-bar-chart-data-label')\n        .transition()\n        .duration(animationDuration)\n        .delay((d: AXBarChartData, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n        .attr('y', (d: AXBarChartData) => {\n          const barTop = this.yScale(d.value);\n\n          // If bar is near the top (100% or close), position label inside the bar\n          if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n            return barTop + this.LABEL_OFFSET;\n          }\n\n          // Otherwise, position above the bar\n          return barTop - this.LABEL_OFFSET;\n        })\n        .attr('data-inside-bar', (d: AXBarChartData) => {\n          const barTop = this.yScale(d.value);\n          return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n        })\n        .style('opacity', 1)\n        .ease(animationEasing);\n    }\n\n    // Set up event handlers on each group\n    barGroups\n      .on('mouseenter', (event: MouseEvent, d: AXBarChartData) => {\n        // Only apply hover effects if initial animation is complete\n        if (!this._initialAnimationComplete()) return;\n\n        const barEl = this.d3.select(event.currentTarget).select('path');\n\n        // Standard hover effect - darken the bar slightly and add a subtle shadow\n        barEl\n          .transition()\n          .duration(this.HOVER_TRANSITION_DURATION)\n          .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n\n        this.handleBarHover(event, d);\n      })\n      .on('mousemove', (event: MouseEvent) => {\n        // Only update tooltip if initial animation is complete\n        if (this._initialAnimationComplete()) {\n          this.updateTooltipPosition(event);\n        }\n      })\n      .on('mouseleave', (event: MouseEvent) => {\n        // Only apply hover effects if initial animation is complete\n        if (!this._initialAnimationComplete()) return;\n\n        const barEl = this.d3.select(event.currentTarget).select('path');\n\n        // Remove hover effect\n        barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n\n        this._tooltipVisible.set(false);\n      })\n      .on('click', (event: MouseEvent, d: AXBarChartData) => {\n        // Only trigger click events if initial animation is complete\n        if (this._initialAnimationComplete()) {\n          this.handleBarClick(event, d);\n        }\n      });\n\n    // Add animation\n    const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n    bars\n      .transition()\n      .duration(animationDuration)\n      .delay((d: AXBarChartData, i: number) => i * animationDelay)\n      .attrTween('d', (d: AXBarChartData) => {\n        const x = this.xScale(d.id);\n        const width = this.xScale.bandwidth();\n        const finalHeight = this.height - this.yScale(d.value);\n\n        return (t: number) => {\n          const currentHeight = finalHeight * t;\n          const currentY = this.height - currentHeight;\n          const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n          if (radius > 0 && currentHeight > 0) {\n            // Limit radius to prevent it from exceeding half the bar width\n            const effectiveRadius = Math.min(radius, width / 2);\n            return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n          } else {\n            return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n          }\n        };\n      })\n      .ease(animationEasing) // Use the configured easing function\n      .end() // Wait for all animations to complete\n      .then(() => {\n        // Mark animation as complete to enable hover effects\n        this._initialAnimationComplete.set(true);\n      });\n  }\n\n  /**\n   * Renders bars for clustered charts\n   */\n  private renderBarsClustered(groups: AXBarChartClusteredData[]): void {\n    const seriesLabels = this.getClusterSeriesLabels(groups);\n    const visibleSeries = seriesLabels.filter((s) => !this.hiddenSeries.has(s));\n\n    this._initialAnimationComplete.set(false);\n\n    const radius = this.effectiveOptions().cornerRadius;\n    const animationDuration = this.effectiveOptions().animationDuration;\n    const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n    const barsContainer = this.chart.append('g').attr('class', 'ax-bar-chart-bars-container');\n\n    const groupSel = barsContainer\n      .selectAll('.ax-bar-chart-group')\n      .data(groups)\n      .enter()\n      .append('g')\n      .attr('class', 'ax-bar-chart-group')\n      .attr('transform', (g: AXBarChartClusteredData) => `translate(${this.xScale(g.id)},0)`);\n\n    type ClusteredBarDatum = {\n      group: AXBarChartClusteredData;\n      seriesLabel: string;\n      seriesIndex: number;\n      item: AXBarChartData | undefined;\n    };\n\n    const barGroups = groupSel\n      .selectAll('.ax-bar-chart-bar-group')\n      .data((g: AXBarChartClusteredData) =>\n        visibleSeries.map((label): ClusteredBarDatum => {\n          const seriesIndex = seriesLabels.indexOf(label);\n          return {\n            group: g,\n            seriesLabel: label,\n            seriesIndex,\n            item: g.chartData.find((d) => d.label === label) ?? g.chartData[seriesIndex],\n          };\n        }),\n      )\n      .enter()\n      .append('g')\n      .style('cursor', 'pointer')\n      .attr('class', 'ax-bar-chart-bar-group');\n\n    const bars = barGroups\n      .append('path')\n      .attr('class', 'ax-bar-chart-bar')\n      .attr('data-series', (d: ClusteredBarDatum) => d.seriesLabel)\n      .attr('d', (d: ClusteredBarDatum) => {\n        const x = this.xSubScale(d.seriesLabel);\n        const width = this.xSubScale.bandwidth();\n        const y = this.height - 0.5;\n        return `M${x},${y} L${x},${y} L${x + width},${y} L${x + width},${y} Z`;\n      })\n      .attr('fill', (d: ClusteredBarDatum) => {\n        return d.item?.color || this.getColor(d.seriesIndex);\n      });\n\n    if (this.effectiveOptions().showDataLabels !== false) {\n      barGroups\n        .append('text')\n        .attr('class', 'ax-bar-chart-data-label')\n        .attr('text-anchor', 'middle')\n        .attr('x', (d: ClusteredBarDatum) => (this.xSubScale(d.seriesLabel) || 0) + this.xSubScale.bandwidth() / 2)\n        .attr('y', this.height)\n        .style('font-size', 'clamp(8px, 2vmin, 12px)')\n        .style('font-weight', '500')\n        .style('fill', 'rgb(var(--ax-comp-bar-chart-data-labels-color))')\n        .style('opacity', 0)\n        .text((d: ClusteredBarDatum) => {\n          const value = d.item?.value;\n          if (value === undefined) return '';\n          return value >= 1000 ? formatLargeNumber(value) : value;\n        });\n\n      const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n      barGroups\n        .selectAll('.ax-bar-chart-data-label')\n        .transition()\n        .duration(animationDuration)\n        .delay((_d: unknown, i: number) => i * animationDelay + this.LABEL_ANIMATION_DELAY)\n        .attr('y', (d: ClusteredBarDatum) => {\n          if (!d.item) return this.height;\n\n          const barTop = this.yScale(d.item.value);\n\n          // If bar is near the top (100% or close), position label inside the bar\n          if (barTop < this.MIN_TOP_SPACE_FOR_LABEL) {\n            return barTop + this.LABEL_OFFSET;\n          }\n\n          // Otherwise, position above the bar\n          return barTop - this.LABEL_OFFSET;\n        })\n        .attr('data-inside-bar', (d: ClusteredBarDatum) => {\n          if (!d.item) return 'false';\n\n          const barTop = this.yScale(d.item.value);\n          return barTop < this.MIN_TOP_SPACE_FOR_LABEL ? 'true' : 'false';\n        })\n        .style('opacity', 1)\n        .ease(animationEasing);\n    }\n\n    barGroups\n      .on('mouseenter', (event: MouseEvent, d: ClusteredBarDatum) => {\n        if (!this._initialAnimationComplete()) return;\n        const barEl = this.d3.select(event.currentTarget).select('path');\n        barEl\n          .transition()\n          .duration(this.HOVER_TRANSITION_DURATION)\n          .style('filter', 'brightness(0.7) drop-shadow(0 0 2px rgba(0,0,0,0.1))');\n        if (d.item) this.handleBarHover(event, d.item, d.group);\n      })\n      .on('mousemove', (event: MouseEvent) => {\n        if (this._initialAnimationComplete()) this.updateTooltipPosition(event);\n      })\n      .on('mouseleave', (event: MouseEvent) => {\n        if (!this._initialAnimationComplete()) return;\n        const barEl = this.d3.select(event.currentTarget).select('path');\n        barEl.transition().duration(this.HOVER_TRANSITION_DURATION).style('filter', null);\n        this._tooltipVisible.set(false);\n      })\n      .on('click', (event: MouseEvent, d: ClusteredBarDatum) => {\n        if (!this._initialAnimationComplete()) return;\n        if (d.item) this.handleBarClick(event, d.item);\n      });\n\n    const animationDelay = this.effectiveOptions().animationDelay ?? this.DEFAULT_ANIMATION_DELAY;\n    bars\n      .transition()\n      .duration(animationDuration)\n      .delay((_d: unknown, i: number) => i * animationDelay)\n      .attrTween('d', (d: ClusteredBarDatum) => {\n        const x = this.xSubScale(d.seriesLabel);\n        const width = this.xSubScale.bandwidth();\n        const finalHeight = d.item ? this.height - this.yScale(d.item.value) : 0;\n\n        return (t: number) => {\n          const currentHeight = finalHeight * t;\n          const currentY = this.height - currentHeight;\n          const bottomY = this.height - 0.5; // Add small gap to prevent overlap with x-axis\n\n          if (radius > 0 && currentHeight > 0) {\n            // Limit radius to prevent it from exceeding half the bar width\n            const effectiveRadius = Math.min(radius, width / 2);\n            return `M${x},${bottomY} L${x},${currentY + effectiveRadius} Q${x},${currentY} ${x + effectiveRadius},${currentY} L${x + width - effectiveRadius},${currentY} Q${x + width},${currentY} ${x + width},${currentY + effectiveRadius} L${x + width},${bottomY} Z`;\n          } else {\n            return `M${x},${bottomY} L${x},${currentY} L${x + width},${currentY} L${x + width},${bottomY} Z`;\n          }\n        };\n      })\n      .ease(animationEasing)\n      .end()\n      .then(() => this._initialAnimationComplete.set(true));\n  }\n\n  /**\n   * Gets the appropriate D3 easing function based on the option string\n   */\n  // getEasingFunction moved to shared chart utils\n\n  /**\n   * Handles bar hover event and shows tooltip\n   */\n  private handleBarHover(event: MouseEvent, datum: AXBarChartData, group?: { id: string; label: string }): void {\n    if (this.effectiveOptions().showTooltip !== false) {\n      const dataValue = this.data() as AXBarChartValue;\n      const isClustered = this.isClusteredData(dataValue);\n      const flatData: AXBarChartData[] = isClustered\n        ? (dataValue as AXBarChartClusteredData[]).flatMap((g) => g.chartData)\n        : (dataValue as AXBarChartData[]) || [];\n      const index = flatData.findIndex((item) => item.id === datum.id && item.label === datum.label);\n      const color = datum.color || this.getColor(index !== -1 ? index : 0);\n\n      // Calculate percentage of total\n      const total = isClustered\n        ? (dataValue as AXBarChartClusteredData[]).reduce(\n            (sum, g) => sum + g.chartData.reduce((s, it) => s + it.value, 0),\n            0,\n          )\n        : (flatData as AXBarChartData[]).reduce((sum, item) => sum + item.value, 0);\n      const percentage = total > 0 ? ((datum.value / total) * 100).toFixed(1) : '0';\n\n      this._tooltipData.set({\n        title: group ? `${datum.tooltipLabel || datum.label} — ${group.label}` : datum.tooltipLabel || datum.label,\n        value: formatLargeNumber(datum.value),\n        percentage: `${percentage}%`,\n        color: color,\n      });\n\n      this._tooltipVisible.set(true);\n      this.updateTooltipPosition(event);\n    }\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   * Handles bar click event\n   */\n  private handleBarClick(event: MouseEvent, datum: AXBarChartData): void {\n    this.barClick.emit({ item: datum, event: { nativeEvent: event, sender: this } });\n  }\n\n  /**\n   * Shows a message when no data is available\n   */\n  private showNoDataMessage(containerElement: HTMLElement): void {\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\n  /**\n   * Shows a message when all bars are hidden\n   */\n  private showAllBarsHiddenMessage(containerElement: HTMLElement): void {\n    const messages = this.effectiveMessages();\n    renderChartEmptyMessage(this.d3, containerElement, {\n      icon: messages.allHiddenIcon,\n      title: messages.allHidden,\n      help: messages.allHiddenHelp,\n    });\n  }\n\n  /**\n   * Gets the color for a bar based on its index\n   */\n  protected getColor(index: number): string {\n    return getChartColor(index, this.chartColors);\n  }\n\n  /**\n   * Checks if a bar is hidden\n   */\n  protected isBarHidden(id: string): boolean {\n    return this.hiddenBars.has(id);\n  }\n\n  /**\n   * Implementation of AXChartLegendCompatible interface\n   * Returns legend items based on the chart data\n   */\n  getLegendItems(): AXChartLegendItem[] {\n    const value = (this.data() || []) as AXBarChartValue;\n    if (this.isClusteredData(value)) {\n      const groups = value as AXBarChartClusteredData[];\n      const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n      const total = groups.reduce(\n        (sum, g) => sum + g.chartData.reduce((s, it) => s + (typeof it.value === 'number' ? it.value : 0), 0),\n        0,\n      );\n      return seriesLabels.map((label, index) => {\n        const seriesTotal = groups.reduce((s, g) => {\n          const item = g.chartData[index];\n          const v = item && typeof item.value === 'number' ? item.value : 0;\n          return s + v;\n        }, 0);\n        const percentage = total > 0 ? (seriesTotal / total) * 100 : 0;\n        const firstItem = groups[0]?.chartData[index];\n        return {\n          id: label,\n          name: label || `Series ${index + 1}`,\n          value: seriesTotal,\n          percentage,\n          color: firstItem?.color || this.getColor(index),\n          hidden: this.hiddenSeries.has(label),\n        };\n      });\n    }\n\n    const flat = value as AXBarChartData[];\n    const total = flat.reduce((sum, item) => sum + (typeof item.value === 'number' ? item.value : 0), 0);\n    return flat.map((item, index) => {\n      const val = typeof item.value === 'number' ? item.value : 0;\n      const percentage = total > 0 ? (val / total) * 100 : 0;\n      return {\n        id: item.id,\n        name: item.label || `Item ${index + 1}`,\n        value: item.value,\n        percentage,\n        color: item.color || this.getColor(index),\n        hidden: this.isBarHidden(item.id),\n      };\n    });\n  }\n\n  /**\n   * Implementation of AXChartLegendCompatible interface\n   * Highlights a specific bar by ID\n   */\n  highlightSegment(id: string | null): void {\n    if (!this.svg) return;\n\n    const value = (this.data() || []) as AXBarChartValue;\n    const isClustered = this.isClusteredData(value);\n\n    const resetAll = () => {\n      this.svg\n        .selectAll('.ax-bar-chart-bar')\n        .classed('ax-bar-chart-highlighted', false)\n        .classed('ax-bar-chart-dimmed', false)\n        .attr('opacity', 1)\n        .attr('filter', null)\n        .attr('stroke', null)\n        .attr('stroke-width', null)\n        .attr('stroke-opacity', null);\n    };\n\n    if (id === null) {\n      resetAll();\n      return;\n    }\n\n    if (!isClustered) {\n      if (this.isBarHidden(id as string)) {\n        resetAll();\n        return;\n      }\n      const targetBar = this.svg\n        .selectAll('.ax-bar-chart-bar')\n        .filter((d: unknown) => (d as AXBarChartData | undefined)?.id === id);\n      if (targetBar.empty()) return;\n      const isCurrentlyHighlighted = targetBar.classed('ax-bar-chart-highlighted');\n      if (isCurrentlyHighlighted) {\n        resetAll();\n      } else {\n        resetAll();\n        targetBar\n          .classed('ax-bar-chart-highlighted', true)\n          .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n          .attr('stroke', '#000')\n          .attr('stroke-width', '1px')\n          .attr('stroke-opacity', '0.3')\n          .style('transition', 'all 0.2s ease-in-out');\n        this.svg\n          .selectAll('.ax-bar-chart-bar')\n          .filter((d: unknown) => (d as AXBarChartData | undefined)?.id !== id)\n          .classed('ax-bar-chart-dimmed', true)\n          .attr('opacity', 0.5)\n          .style('transition', 'opacity 0.2s ease-in-out');\n      }\n      return;\n    }\n\n    const targetBars = this.svg\n      .selectAll('.ax-bar-chart-bar')\n      .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => {\n        const node = nodes[i];\n        return node.getAttribute('data-series') === id;\n      });\n    if (targetBars.empty()) return;\n    const isHighlighted = targetBars.classed('ax-bar-chart-highlighted');\n    if (isHighlighted) {\n      resetAll();\n    } else {\n      resetAll();\n      targetBars\n        .classed('ax-bar-chart-highlighted', true)\n        .attr('filter', 'drop-shadow(0 0 4px rgba(0, 0, 0, 0.3))')\n        .attr('stroke', '#000')\n        .attr('stroke-width', '1px')\n        .attr('stroke-opacity', '0.3')\n        .style('transition', 'all 0.2s ease-in-out');\n      this.svg\n        .selectAll('.ax-bar-chart-bar')\n        .filter((_d: unknown, i: number, nodes: SVGPathElement[]) => nodes[i].getAttribute('data-series') !== id)\n        .classed('ax-bar-chart-dimmed', true)\n        .attr('opacity', 0.5)\n        .style('transition', 'opacity 0.2s ease-in-out');\n    }\n  }\n\n  /**\n   * Implementation of AXChartLegendCompatible interface\n   * Toggles visibility of a bar by ID\n   * @returns New visibility state (true = visible, false = hidden)\n   */\n  toggleSegment(id: string): boolean {\n    const value = (this.data() || []) as AXBarChartValue;\n    const isClustered = this.isClusteredData(value);\n\n    if (!isClustered) {\n      const wasAllHidden =\n        (value as AXBarChartData[]).length > 0 && (value as AXBarChartData[]).every((d) => this.isBarHidden(d.id));\n      if (this.hiddenBars.has(id)) {\n        this.hiddenBars.delete(id);\n        if (wasAllHidden) {\n          if (this.chartContainerEl()?.nativeElement) {\n            this.clearChartArea(this.chartContainerEl().nativeElement);\n            setTimeout(() => {\n              this.createChart();\n            }, 0);\n          }\n        } else {\n          this.updateChart();\n        }\n      } else {\n        this.hiddenBars.add(id);\n        this.updateChart();\n      }\n      this.bumpLegendState();\n      return !this.hiddenBars.has(id);\n    }\n\n    // Clustered mode: toggle series by label\n    const groups = value as AXBarChartClusteredData[];\n    const seriesLabels = groups.length > 0 ? this.getClusterSeriesLabels(groups) : [];\n    const seriesCount = seriesLabels.length;\n    const wasAllHidden = seriesCount > 0 && this.hiddenSeries.size >= seriesCount;\n\n    if (this.hiddenSeries.has(id)) {\n      this.hiddenSeries.delete(id);\n      if (wasAllHidden) {\n        if (this.chartContainerEl()?.nativeElement) {\n          this.clearChartArea(this.chartContainerEl().nativeElement);\n          setTimeout(() => {\n            this.createChart();\n          }, 0);\n        }\n      } else {\n        this.updateChart();\n      }\n    } else {\n      this.hiddenSeries.add(id);\n      this.updateChart();\n    }\n\n    this.bumpLegendState();\n    return !this.hiddenSeries.has(id);\n  }\n\n  // ===== Helper utilities for modularity and maintainability =====\n\n  private getContainerElement(): HTMLElement | null {\n    return this.chartContainerEl()?.nativeElement ?? null;\n  }\n\n  private clearChartArea(containerElement: HTMLElement): void {\n    if (!this.d3) return;\n    this.d3.select(containerElement).selectAll('svg, .ax-chart-empty, .ax-chart-message-container').remove();\n  }\n\n  /**\n   * Truncates long labels with ellipsis\n   */\n  private truncateLabel(label: string, maxLength: number = this.MAX_LABEL_LENGTH): string {\n    if (label.length <= maxLength) return label;\n    return label.substring(0, maxLength - 1) + '…';\n  }\n\n  /**\n   * Gets adaptive font size for X-axis based on width and item count\n   */\n  private getXAxisTickFontSizeBasedOnWidth(): number {\n    const itemCount = this.xScale.domain().length;\n    const baseSize = Math.round(this.width / 50);\n\n    // Reduce font size for many items\n    let adjustedSize = baseSize;\n    if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n      adjustedSize = Math.round(baseSize * 0.7);\n    } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n      adjustedSize = Math.round(baseSize * 0.85);\n    }\n\n    return Math.max(this.MIN_FONT_SIZE_X_AXIS, Math.min(this.MAX_FONT_SIZE_X_AXIS, adjustedSize));\n  }\n\n  /**\n   * Gets adaptive font size for Y-axis based on height\n   */\n  private getYAxisTickFontSizeBasedOnHeight(): number {\n    const baseSize = Math.round(this.height / 30);\n    return Math.max(this.MIN_FONT_SIZE_Y_AXIS, Math.min(this.MAX_FONT_SIZE_Y_AXIS, baseSize));\n  }\n\n  private buildXAxisCommon(\n    axesGroup: ReturnType<typeof this.d3.select<SVGGElement, unknown>>,\n    idToLabel: Map<string, string>,\n    options: AXBarChartOption,\n  ): void {\n    const itemCount = this.xScale.domain().length;\n\n    // Smart tick reduction for many items\n    let tickValues = this.xScale.domain();\n    if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n      // Show every 5th tick\n      tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n    } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n      // Show every 2nd tick\n      tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n    }\n\n    const axis = this.d3\n      .axisBottom(this.xScale)\n      .tickValues(tickValues)\n      .tickFormat((id: string) => {\n        const label = idToLabel.get(id) ?? String(id);\n        // Truncate long labels intelligently\n        const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n        return this.truncateLabel(label, maxLength);\n      });\n\n    this.xAxis = axesGroup\n      .append('g')\n      .attr('class', 'ax-bar-chart-axis-x')\n      .attr('transform', `translate(0,${this.height})`)\n      .call(axis);\n\n    const dynamicFontSize = this.getXAxisTickFontSizeBasedOnWidth();\n    const xAxisTicks = this.xAxis\n      .selectAll('text')\n      .style('font-size', `${dynamicFontSize}px`)\n      .style('font-weight', '400')\n      .style('fill', 'rgba(var(--ax-comp-bar-chart-labels-color), 0.7)')\n      .attr('direction', 'ltr');\n\n    const isRotated = this.shouldRotateXAxisLabels(idToLabel, dynamicFontSize);\n    if (isRotated) {\n      xAxisTicks.attr('transform', 'rotate(-45)').style('text-anchor', 'end').attr('dx', '-0.8em').attr('dy', '0.15em');\n    }\n\n    this.xAxis.selectAll('line, path').style('stroke', 'rgb(var(--ax-comp-bar-chart-grid-lines-color))');\n\n    if (options.xAxisLabel && !isRotated) {\n      const tickNodes = (this.xAxis.selectAll('text').nodes() || []) as SVGTextElement[];\n      const measuredTickHeight =\n        tickNodes.length > 0\n          ? Math.max(\n              ...tickNodes.map((n) => {\n                try {\n                  return n?.getBBox?.()?.height ?? dynamicFontSize;\n                } catch {\n                  return dynamicFontSize;\n                }\n              }),\n            )\n          : dynamicFontSize;\n      const tickAreaHeight = measuredTickHeight + this.TICK_AREA_PADDING;\n      const gapBelowTicks = this.X_AXIS_TITLE_GAP;\n      this.createXAxisTitle(axesGroup, options.xAxisLabel, tickAreaHeight, gapBelowTicks);\n    }\n  }\n}\n","<div class=\"ax-bar-chart\" role=\"img\" #chartContainer>\n  <!-- Shared tooltip component -->\n  <ax-chart-tooltip\n    [visible]=\"tooltipVisible()\"\n    [position]=\"tooltipPosition()\"\n    [data]=\"tooltipData()\"\n    [showPercentage]=\"true\"\n  ></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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"}