From 921c5a429472ae0277acb21f4938bd6cc6f199b7 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 28 May 2026 09:13:04 +0200 Subject: [PATCH] :bug: Fix drag shapes out of frames (#9905) --- render-wasm/src/render.rs | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/render-wasm/src/render.rs b/render-wasm/src/render.rs index 54bc7d6a6f..6841caaa02 100644 --- a/render-wasm/src/render.rs +++ b/render-wasm/src/render.rs @@ -3061,15 +3061,31 @@ impl RenderState { let moved_bounds = if self.options.is_interactive_transform() && !modifier_ids.is_empty() { let mut acc: Option = None; for id in modifier_ids.iter() { - let Some(s) = tree.get(id) else { continue }; - let r = self.get_cached_extrect(s, tree, 1.0); - acc = Some(match acc { - None => r, - Some(mut prev) => { - prev.join(r); - prev - } - }); + // Current (post-modifier) bounds + if let Some(s) = tree.get(id) { + let r = self.get_cached_extrect(s, tree, 1.0); + acc = Some(match acc { + None => r, + Some(mut prev) => { + prev.join(r); + prev + } + }); + } + + // Pre-modifier bounds: important so cached top-level crops that still contain the + // shape at its original position are considered "unsafe" even after the shape + // has moved away (e.g. dragging a child out of a clipped frame). + if let Some(raw) = tree.get_raw(id) { + let r0 = self.get_cached_extrect(raw, tree, 1.0); + acc = Some(match acc { + None => r0, + Some(mut prev) => { + prev.join(r0); + prev + } + }); + } } acc } else {