Uh oh!
There was an error while loading. Please reload this page.
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 <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>
… 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>
👋 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 |
Uh oh!
There was an error while loading. Please reload this page.
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.