From 88a0a15cffbead89982e312cd277e7de29792a3b Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 29 Jun 2026 14:37:03 +0200 Subject: [PATCH] fix(charts): round x-axis bbox height to avoid subpixel re-render loop --- packages/charts/src/hooks/useObserveXAxisHeights.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/charts/src/hooks/useObserveXAxisHeights.ts b/packages/charts/src/hooks/useObserveXAxisHeights.ts index ba4cfe2979c..9afb306c2a7 100644 --- a/packages/charts/src/hooks/useObserveXAxisHeights.ts +++ b/packages/charts/src/hooks/useObserveXAxisHeights.ts @@ -11,7 +11,7 @@ const defaultAxisHeight = 30; function measure(container: Element | null, axisCount: number, prevHeightsRef: MutableRefObject) { const heights = Array(axisCount).fill(defaultAxisHeight); container?.querySelectorAll('.xAxis').forEach((xAxis, index) => { - const height = xAxis?.getBBox()?.height; + const height = Math.ceil(xAxis?.getBBox()?.height ?? 0); if (height > defaultAxisHeight) { heights[index] = height; } @@ -31,6 +31,7 @@ export const useObserveXAxisHeights = (chartRef: RefObject, axisCoun const [xAxisHeights, setXAxisHeights] = useState(Array(axisCount).fill(defaultAxisHeight)); const prevHeightsRef = useRef(xAxisHeights); + // TODO (v3): evaluate if ResizeObserver is better here for measuring, so it doesn't run on every component update // check on every render if height changed useIsomorphicLayoutEffect(() => { const result = measure(chartRef.current, axisCount, prevHeightsRef);