From 6885f844dd977e703bae52ad4621881ca6d69973 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Mon, 29 Sep 2025 16:32:16 -0400 Subject: [PATCH 1/5] Show "Initial Paint" in the breadcrumbs when root is selected --- .../views/SuspenseTab/SuspenseBreadcrumbs.css | 7 +++++++ .../views/SuspenseTab/SuspenseBreadcrumbs.js | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css index 1e1544b477cab..84cb72ac208e7 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css @@ -11,6 +11,13 @@ display: inline; } +.SuspenseBreadcrumbsText { + font-family: var(--font-family-monospace); + font-size: var(--font-size-monospace-normal); + padding: 0.25rem; + white-space: nowrap; +} + .SuspenseBreadcrumbsListItem[aria-current="true"] .SuspenseBreadcrumbsButton { color: var(--color-button-active); } diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js index b49d0b5eb9ad0..7818c593de5fd 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js @@ -38,7 +38,15 @@ export default function SuspenseBreadcrumbs(): React$Node { return (
    - {lineage !== null && + {lineage === null ? null : lineage.length === 0 ? ( + // We selected the root. This means that we're currently viewing the Transition + // that rendered the whole screen. In laymans terms this is really "Initial Paint". + // TODO: Once we add subtree selection, then the equivalent should be called + // "Transition" since in that case it's really about a Transition within the page. +
  1. + Initial Paint +
  2. + ) : ( lineage.map((id, index) => { const node = store.getSuspenseByID(id); @@ -57,7 +65,8 @@ export default function SuspenseBreadcrumbs(): React$Node { ); - })} + }) + )}
); } From 09142da38000834713a27d1a6cfb648925d65bda Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Mon, 29 Sep 2025 16:43:43 -0400 Subject: [PATCH 2/5] Make the Initial Paint clickable to select the root --- .../views/SuspenseTab/SuspenseBreadcrumbs.css | 7 ------- .../views/SuspenseTab/SuspenseBreadcrumbs.js | 21 +++++++++++++++---- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css index 84cb72ac208e7..1e1544b477cab 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.css @@ -11,13 +11,6 @@ display: inline; } -.SuspenseBreadcrumbsText { - font-family: var(--font-family-monospace); - font-size: var(--font-size-monospace-normal); - padding: 0.25rem; - white-space: nowrap; -} - .SuspenseBreadcrumbsListItem[aria-current="true"] .SuspenseBreadcrumbsButton { color: var(--color-button-active); } diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js index 7818c593de5fd..4d2f69d8e3316 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js @@ -25,7 +25,9 @@ export default function SuspenseBreadcrumbs(): React$Node { const store = useContext(StoreContext); const treeDispatch = useContext(TreeDispatcherContext); const suspenseTreeDispatch = useContext(SuspenseTreeDispatcherContext); - const {selectedSuspenseID, lineage} = useContext(SuspenseTreeStateContext); + const {selectedSuspenseID, selectedRootID, lineage} = useContext( + SuspenseTreeStateContext, + ); const {highlightHostInstance, clearHighlightHostInstance} = useHighlightHostInstance(); @@ -43,9 +45,20 @@ export default function SuspenseBreadcrumbs(): React$Node { // that rendered the whole screen. In laymans terms this is really "Initial Paint". // TODO: Once we add subtree selection, then the equivalent should be called // "Transition" since in that case it's really about a Transition within the page. -
  • - Initial Paint -
  • + selectedRootID !== null ? ( +
  • + +
  • + ) : null ) : ( lineage.map((id, index) => { const node = store.getSuspenseByID(id); From 626a7d26f3386686a9c19cb768b512718c58320d Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Mon, 29 Sep 2025 16:45:39 -0400 Subject: [PATCH 3/5] Don't highlight the whole screen that's just annoying --- .../src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js index 4d2f69d8e3316..a9dcfc38f4214 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js @@ -48,9 +48,7 @@ export default function SuspenseBreadcrumbs(): React$Node { selectedRootID !== null ? (
  • + aria-current={selectedSuspenseID === selectedRootID}>