fix: CSS custom properties not defined when a component first renders #2999
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.
Description
Fixes a rendering bug related to the design-system-provider where CSS custom properties have not been written by the time a component first paints.
I also organized the methods / property order and added more code comments, so apologies if this looks more complicated than it should be.
Motivation & context
This change changes the behavior of the design-system-provider to synchronously create
CSS custom properties instead of batching them asynchronously. This is being done to prevent flashes of un-styled content and un-desired transitions that result from the CSS custom property not being defined when the component using the CSS custom property first paints.
This change also introduces an optimization where it will use a
CSSStyleSheet
attached viaadoptedStyleSheets
to create the custom properties when that API is available. There are significant performance benefits to this approach over using theHTMLElement.style.setProperty
API: https://jsbench.me/hck9d4noez/1. Inline styles will be the fallback behavior if adopted stylesheets are not supported.Issue type checklist
Is this a breaking change?
Process & policy checklist