Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [DevTools] Fix WhatChanged scrolling out of view in profiler sidebar by Kertsu · Pull Request #36244 · react/react · GitHub
Skip to content

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar - #36244

Merged
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info
Jul 7, 2026
Merged

[DevTools] Fix WhatChanged scrolling out of view in profiler sidebar#36244
hoxyq merged 1 commit into
react:mainfrom
Kertsu:feature/revamp-sidebar-selected-fiber-info

Conversation

@Kertsu

@KertsuKertsu commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Previously, WhatChanged and InspectedElementBadges were rendered inside the same scrollable Content div as the commit list. When a component had many render timestamps, scrolling down to pick one caused the "what changed" context to scroll out of view, requiring the user to scroll back up to see it.

While the profiler already exposes render details via hover tooltips on fibers, those are transient and pointer-dependent. This change introduces a sticky header section at the top of the Content div that holds the current commit summary, badges, and WhatChanged. The section is collapsible (click or Enter/Space) so users can reclaim vertical space for the commit list when needed. The commit list now sits below the sticky header as a sibling, so it scrolls independently while the summary remains always visible.

Closes#36525


Current Behavior

current-behavior.mov

Proposed UI

Apologies on this one. I had to upload it on YouTube since the video is quite big.


How did you test this change?

Manual Testing

CaseScreenshot
Expanded simpleexpanded-default
Collapsed Simplecollapsed-default
Focused using tab navigation while expandedexpanded-tab-focused-simple
Focused using tab navigation while collapsedcollapsed-tab-focused-simple
Long render info( expanded )long-desc-expanded
Long render info( collapsed )long-desc-collapsed

Hover (expanded)

expanded-hover-simple.mov

Hover (collapsed)

collapsed-hover-simple.mov

Why this matters

This is more than a visual polish issue:

  • The Profiler is fundamentally a context-driven debugging tool
  • Losing the “why did this render?” explanation during navigation interrupts analysis flow
  • The issue becomes progressively worse on large applications or heavily interactive surfaces
  • Hover tooltips are not an adequate replacement because they are transient and pointer-dependent
  • Keyboard users are disproportionately affected due to repeated navigation and scrolling

In practice, this increases cognitive load during performance debugging and makes long profiling sessions unnecessarily cumbersome.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 377ecab to fed7c37CompareApril 11, 2026 05:38
@KertsuKertsu changed the title Add sticky header to SidebarSelectedFiberInfo[DevTools] Fix WhatChanged scrolling out of view in profiler sidebarApr 11, 2026
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 2f354f0 to 632176dCompareApril 12, 2026 07:18
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 0a0376c to 162b730CompareApril 25, 2026 07:51
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Bumping this in case it got buried, @eps1lon@hoxyq. Happy to address any feedback or adjust the approach if the sticky header pattern isn't the direction you'd want 🙌🏻

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4644160 to 80f014aCompareMay 3, 2026 23:51
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 8e40685 to 8bb467fCompareMay 14, 2026 06:46
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 3 times, most recently from 1298a24 to d5ba16eCompareMay 27, 2026 23:24
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from ddcda66 to 7027ebaCompareJune 5, 2026 08:12
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from 4723b2c to 2ecadebCompareJune 16, 2026 01:21
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2ecadeb to 4fdf488CompareJune 23, 2026 12:22
@hoxyq
hoxyq self-requested a review June 23, 2026 12:26

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Comment on lines +31 to +40
// $FlowFixMe[missing-local-annot]
const handleKeyDown = event => {
if (event.key === 'Enter' || event.key === ' ') {
// Prevent the browser from scrolling down when Space is pressed
if (event.key === ' ') {
event.preventDefault();
}
toggleCollapsedVal();
}
};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add annotation to this callback

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in ff7fb87

@hoxyq

Copy link
Copy Markdown
Collaborator

Also, please see failed Flow jobs, you can reproduce it locally with yarn flow dom-browser.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks for highlighting the issue! Can we just put the WhatChanged and badges in a sticky subheader, same like we do it for the component name?

Without any expand / collapse mechanics, I think that should address the issue?

Thanks for the feedback, @hoxyq!

Yes, that was my original instinct too. Just lift WhatChanged and the badges out of the scroll container so they sit above the commit list as a static subheader.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That said, I understand this adds interaction complexity that may not be in line with the existing DevTools patterns. Happy to drop it and go with the simpler non-collapsible sticky subheader if you think the tradeoff is acceptable.

Just want to make sure we're aligned before I push another revision.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 4fdf488 to ff7fb87CompareJune 26, 2026 02:07
@Kertsu
Kertsu requested a review from hoxyqJune 28, 2026 07:28
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch 2 times, most recently from d1d15d2 to 0645d41CompareJuly 2, 2026 06:06

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I added the collapse mechanic is for cases where WhatChanged becomes tall, e.g. when a component has many changed hooks or props, the subheader can take up a significant portion of the sidebar height, leaving little room for the commit list. The collapsible lets users trade that context off for more list space when they need it.

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

@hoxyq

hoxyq commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

That should be fine as long as the whole view is scrollable. If the user wants to see the full commit list, they can scroll. Essentially, the main information in this UI is what caused the render and component's information, the commit list is secondary.

Ooh okay, I see. Thanks for this. Will be making some changes!

@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

Yup, sure. Thanks for the reference.

@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 0645d41 to 2b51ab3CompareJuly 6, 2026 18:06
@Kertsu

Kertsu commented Jul 6, 2026

Copy link
Copy Markdown
ContributorAuthor

Could you please attach a screenshot / screencast of the new behaviour?

Also, if possible, please add an e2e test that will cover this new UI. You can find examples in react-devtools-inline/__tests__/__e2e__.

For the badges and what changed, I just used dummy data for manual testing. This is how it looks like. Let me know what you think, @hoxyq 🙌🏻

with.commit.list.container.mov

Previously, WhatChanged and InspectedElementBadges were rendered in the
same scrollable container as the commit list. When a component had many
render timestamps, scrolling through the commit history also scrolled
the render summary out of view, requiring users to repeatedly scroll
back to regain context.
This change separates the render summary from the commit history by
making only the commit list scrollable. WhatChanged and
InspectedElementBadges remain fixed at the top of the sidebar while the
render timestamps scroll independently, keeping the currently selected
commit's context visible throughout navigation without additional
interaction.
Closesreact#36525
References:
- https://github.com/facebook/react/blob/main/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarSelectedFiberInfo.js#L132-L149
@Kertsu
Kertsuforce-pushed the feature/revamp-sidebar-selected-fiber-info branch from 2b51ab3 to 09d39aaCompareJuly 7, 2026 01:17

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyqhoxyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@hoxyq
hoxyq merged commit 91cd812 into react:mainJul 7, 2026
238 checks passed
@Kertsu

Copy link
Copy Markdown
ContributorAuthor

Thanks, @hoxyq! This is my first-ever meaningful contribution to an open source project as iconic as React 🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DevTools Bug]: Profiler's "What changed" context becomes unusable when inspecting commits with long render histories

4 participants

@Kertsu@hoxyq@suvroallen13-web@das810835-ux