-
Notifications
You must be signed in to change notification settings - Fork 647
feat: Add feature flag for Dialog scroll performance optimization #7366
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Add feature flag for Dialog scroll performance optimization #7366
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 <[email protected]>
- 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 <[email protected]>
- 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 <[email protected]>
… counting (#7368) Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: mattcosta7 <[email protected]>
|
👋 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 |
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.