Browse Source

Fix node height growing on remount with inline parameters

The previous fix skipped the expand animation on initial mount but
missed the ResizeObserver path. On remount, trackedSettingsHeightRef
resets to 0, and the ResizeObserver sees the full panel height as a
delta, adding it to the node height that already includes the panel.

Add skipFirstObserveRef: when a node mounts with settings already
expanded, the first ResizeObserver callback syncs the tracked height
without calling setNodes, preventing the cumulative height growth.

https://claude.ai/code/session_01MvD1n4QeXutgwUpKJuDGHa
handoff-20260429-1057
Claude 4 months ago
parent
commit
f15b56f9ea
Failed to extract signature
  1. 19
      src/components/nodes/BaseNode.tsx

19
src/components/nodes/BaseNode.tsx

@ -81,16 +81,20 @@ export function BaseNode({
const isAnimatingRef = useRef(false);
const animationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const isInitialMountRef = useRef(true);
// When true, the ResizeObserver should sync trackedSettingsHeightRef without
// modifying node dimensions (the height is already accounted for from a
// previous mount before onlyRenderVisibleElements unmounted us).
const skipFirstObserveRef = useRef(false);
// Adjust node height when settings expand or collapse
useLayoutEffect(() => {
// On initial mount with settings already expanded (e.g. remount after
// onlyRenderVisibleElements), the node height already includes the panel.
// Just sync the tracked ref without adding height again.
// Tell the ResizeObserver to sync without adding height.
if (isInitialMountRef.current) {
isInitialMountRef.current = false;
if (settingsExpanded && settingsPanelRef.current) {
trackedSettingsHeightRef.current = settingsPanelRef.current.offsetHeight;
if (settingsExpanded && settingsPanel) {
skipFirstObserveRef.current = true;
}
return;
}
@ -180,6 +184,15 @@ export function BaseNode({
for (const entry of entries) {
const newPanelHeight = entry.contentRect.height;
if (newPanelHeight === 0) continue;
// On remount with settings already expanded, the node height already
// includes the panel. Just sync the ref without modifying dimensions.
if (skipFirstObserveRef.current) {
skipFirstObserveRef.current = false;
trackedSettingsHeightRef.current = newPanelHeight;
continue;
}
const delta = newPanelHeight - trackedSettingsHeightRef.current;
if (Math.abs(delta) < 2) continue; // Ignore sub-pixel changes

Loading…
Cancel
Save