feat: Add feature flag for Dialog scroll performance optimization#7366
Merged
mattcosta7 merged 5 commits intoperf/dialog-has-selectorfrom Dec 25, 2025
Merged
Conversation
|
| Name | Type |
|---|---|
| @primer/react | Patch |
Click here to learn what changesets are, and how to add one.
Click here if you're a maintainer who wants to add a changeset to this PR
- Add primer_react_css_has_selector_perf feature flag (default: false) - Implement ref counting for multiple dialogs (both optimized and legacy paths) - Add legacy :has() selector with :not() guard for backward compatibility - Add comprehensive tests for both flag ON and OFF states - Ensure proper cleanup on unmount with ref counting Co-authored-by: mattcosta7 <8616962+mattcosta7@users.noreply.github.com>
- Add .DisableScroll class definition to Dialog.module.css for :has() selector - Add comment explaining thread safety in JavaScript's single-threaded environment - Ensure CSS selector .Dialog.DisableScroll works correctly Co-authored-by: mattcosta7 <8616962+mattcosta7@users.noreply.github.com>
- Remove DisableScroll class from dialog element in cleanup function - Capture dialogRef.current in variable to satisfy react-hooks/exhaustive-deps - Add clarifying comments about module-level state safety in browser/test environments Co-authored-by: mattcosta7 <8616962+mattcosta7@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Add feature flag for dialog scroll optimization
feat: Add feature flag for Dialog scroll performance optimization
Dec 25, 2025
13 tasks
… counting (#7368) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: mattcosta7 <8616962+mattcosta7@users.noreply.github.com>
Contributor
|
👋 Hi, this pull request contains changes to the source code that github/github-ui depends on. If you are GitHub staff, test these changes with github/github-ui using the integration workflow. Or, apply the |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
primer_react_css_has_selector_perffeature flag to gate the Dialog scroll optimization, enabling gradual rollout and easy rollback.Changelog
New
primer_react_css_has_selector_perffeature flag (defaults tofalse).DisableScrollCSS class for :has() selector targetChanged
:has()selector with:not([data-dialog-scroll-optimized])guarddata-dialog-scroll-optimizedattribute to body, short-circuits:has()evaluation via O(1) attribute checkRemoved
Rollout strategy
Rollout plan:
:has()behavior)Testing & Reviewing
Flag OFF (legacy): Body selector
body:not([data-dialog-scroll-optimized]):has(.Dialog.DisableScroll)matches because attribute is absent. Uses expensive:has().Flag ON (optimized): Attribute
data-dialog-scroll-optimizedpresent on body causes:not()to fail immediately. Browser skips:has()evaluation. Direct classbody.DialogScrollDisabledhandles scroll disabling.Both paths use ref counting for multiple dialogs (critical for mixed Turbo/React).
Merge checklist
Original prompt
This pull request was created from Copilot chat.
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.