From 37ad85cbaf5ee47c9e100bb026f4646ab691b8fe Mon Sep 17 00:00:00 2001 From: Omar Brikaa Date: Mon, 28 Jul 2025 00:52:07 +0300 Subject: [PATCH] fix: Fix the root cause of `flushSync` flickering (#9791) * More reliable width and height change detection * Put the dimensions useEffect before the scene render one, just in case --- .../components/canvases/StaticCanvas.tsx | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/packages/excalidraw/components/canvases/StaticCanvas.tsx b/packages/excalidraw/components/canvases/StaticCanvas.tsx index 01ce94c431..9e23fa500b 100644 --- a/packages/excalidraw/components/canvases/StaticCanvas.tsx +++ b/packages/excalidraw/components/canvases/StaticCanvas.tsx @@ -34,6 +34,13 @@ const StaticCanvas = (props: StaticCanvasProps) => { const wrapperRef = useRef(null); const isComponentMounted = useRef(false); + useEffect(() => { + props.canvas.style.width = `${props.appState.width}px`; + props.canvas.style.height = `${props.appState.height}px`; + props.canvas.width = props.appState.width * props.scale; + props.canvas.height = props.appState.height * props.scale; + }, [props.appState.height, props.appState.width, props.canvas, props.scale]); + useEffect(() => { const wrapper = wrapperRef.current; if (!wrapper) { @@ -49,26 +56,6 @@ const StaticCanvas = (props: StaticCanvasProps) => { canvas.classList.add("excalidraw__canvas", "static"); } - const widthString = `${props.appState.width}px`; - const heightString = `${props.appState.height}px`; - if (canvas.style.width !== widthString) { - canvas.style.width = widthString; - } - if (canvas.style.height !== heightString) { - canvas.style.height = heightString; - } - - const scaledWidth = props.appState.width * props.scale; - const scaledHeight = props.appState.height * props.scale; - // setting width/height resets the canvas even if dimensions not changed, - // which would cause flicker when we skip frame (due to throttling) - if (canvas.width !== scaledWidth) { - canvas.width = scaledWidth; - } - if (canvas.height !== scaledHeight) { - canvas.height = scaledHeight; - } - renderStaticScene( { canvas,