From 6fb77544940d033355c660556dbc48a08d1d6708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Markb=C3=A5ge?= Date: Thu, 30 Oct 2025 15:26:49 -0400 Subject: [PATCH] [DevTools] Render selected outline on top of every other rect (#35012) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When rects are close together (or overlapping) the outline can end up being covered up by sibling rects or deeper rects. This renders the selected outline on top of everything so it's always visible. Screenshot 2025-10-29 at 8 43 28 PM Screenshot 2025-10-29 at 8 58 53 PM Additionally, this makes it so that it's not part of the translucent tree when things are hidden by the timeline. That way it's easier to see what is selected inside a hidden tree. Screenshot 2025-10-29 at 8 45 24 PM Screenshot 2025-10-29 at 8 59 06 PM --- .../views/SuspenseTab/SuspenseRects.css | 10 ++--- .../views/SuspenseTab/SuspenseRects.js | 42 +++++++++++++++---- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css index 0af7baf51a6..aadb6a0fba0 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css @@ -6,12 +6,6 @@ border-radius: 0.25rem; } -.SuspenseRectsContainer[data-highlighted='true'] { - outline-color: var(--color-transition); - outline-style: solid; - outline-width: 4px; -} - .SuspenseRectsRoot { cursor: pointer; outline-color: var(--color-transition); @@ -106,6 +100,10 @@ pointer-events: none; } +.SuspenseRectOutlineRoot { + outline-color: var(--color-transition); +} + .SuspenseRectsBoundary[data-selected='true'] > .SuspenseRectsRect { box-shadow: none; } diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js index 556238f1ea9..e08cdc41736 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js @@ -236,13 +236,6 @@ function SuspenseRects({ {suspense.name} ) : null} - {selected && visible ? ( - - ) : null} ); @@ -514,6 +507,28 @@ function SuspenseRectsContainer({ scaleRef.current = boundingBoxWidth; }, [boundingBoxWidth]); + let selectedBoundingBox = null; + let selectedEnvironment = null; + if (isRootSelected) { + selectedBoundingBox = boundingBox; + selectedEnvironment = rootEnvironment; + } else if (inspectedElementID !== null) { + const selectedSuspenseNode = store.getSuspenseByID(inspectedElementID); + if ( + selectedSuspenseNode !== null && + (selectedSuspenseNode.hasUniqueSuspenders || !uniqueSuspendersOnly) + ) { + selectedBoundingBox = getBoundingBox(selectedSuspenseNode.rects); + for (let i = 0; i < timeline.length; i++) { + const timelineStep = timeline[i]; + if (timelineStep.id === inspectedElementID) { + selectedEnvironment = timelineStep.environment; + break; + } + } + } + } + return (
{ return ; })} + {selectedBoundingBox !== null ? ( + + ) : null}