Skip to content

Improve component CSS reliability with scoped prefix#23215

Closed
ItsJonQ wants to merge 14 commits intotrunkfrom
add/styled-scope-provider
Closed

Improve component CSS reliability with scoped prefix#23215
ItsJonQ wants to merge 14 commits intotrunkfrom
add/styled-scope-provider

Conversation

@ItsJonQ
Copy link

@ItsJonQ ItsJonQ commented Jun 16, 2020

This update adds a new (experimental) component in @wordpress/components that improves the integration with wp-admin for generated CSS-in-JS styles.

StyledScopeProvider

StyledScopeProvider is a component that adds CSS selector prefixing for styles rendered with Emotion (currently experimental within @wordpress/components).

Prefixing increases style specificity, allowing for a smoother integration into environments with pre-existing CSS rules.

Screen Shot 2020-06-22 at 11 53 30 AM

(Example: Generated scoped styles for <NumberControl /> within Gutenberg.

With the new StyledScopeProvider, we can remove the (previous) &&& work-arounds. These were added to manually bump up specificity for overriding wp-admin/Editor styles.

Note: At this moment, there are only a handful of Emotion styled @wordpress/components Components.

Extra History

This was a technique I developed for a previous project in 2018. It was used to reliably integrate and render a React components into an old PHP/jQuery powered application (much like WordPress!).

The code I'm submitted was abstracted from a library I created:
https://github.com/ItsJonQ/styled-providers

Usage

import {
	__experimentalStyledScopeProvider as StyledScopeProvider,
	__experimentalInputControl as InputControl,
} from '@wordpress/components';

const Example = () => (
	<StyledScopeProvider scope="html body.wp-admin">
		...
		<InputControl />
		...
	</StyledScopeProvider>
);

In the above example, the <InputControl /> component styles (which are generated with Emotion), will be prefixed with html body.wp-admin.
Instead of the generated CSS selector of .css-123jda, it would instead be html body.wp-admin .css-123jda. Increasing specificity in a controlled manner is helpful in situations where there may be conflicting styles.

In the case of <InputControl />, existing style rules such as .block-editor input[type="text] may pose problematic. However, the automatically generated selectors html body.wp-admin .css-123jda will help ensure the elements are styled as expected.

How has this been tested?

This has been tested in both Storybook and local Gutenberg.

  • Run npm install
  • Run npm run dev
  • Open up the editor
  • Add a Cover block
  • Make sure the min-height input is styled correctly and works
  • Add a Column block
  • Ensure the range slider is styled correctly and works

Types of changes

  • Add @emotion dependencies to @wordpress/components
  • Add new <StyledScopeProvider /> component
  • Export as __experimental
  • Integrate into Editor Provider
  • Integrate into Edit Site Editor

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

Resolves: #18483

@ItsJonQ ItsJonQ added [Type] Code Quality Issues or PRs that relate to code quality [Package] Components /packages/components [Type] Experimental Experimental feature or API. labels Jun 16, 2020
@ItsJonQ ItsJonQ requested a review from youknowriad June 16, 2020 18:49
@ItsJonQ ItsJonQ self-assigned this Jun 16, 2020
@ItsJonQ ItsJonQ added the CSS Styling Related to editor and front end styles, CSS-specific issues. label Jun 16, 2020
@github-actions
Copy link

github-actions bot commented Jun 16, 2020

Size Change: +4.4 kB (0%)

Total Size: 1.14 MB

Filename Size Change
build/block-directory/index.js 7.68 kB +1 B
build/block-editor/index.js 115 kB -3 B (0%)
build/block-library/index.js 130 kB +1 B
build/components/index.js 203 kB +4.33 kB (2%)
build/edit-post/index.js 304 kB +1 B
build/edit-site/index.js 16.6 kB +28 B (0%)
build/edit-widgets/index.js 9.35 kB +1 B
build/editor/index.js 45.1 kB +35 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.67 kB 0 B
build/api-fetch/index.js 3.39 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 944 B 0 B
build/block-directory/style.css 945 B 0 B
build/block-editor/style-rtl.css 10.8 kB 0 B
build/block-editor/style.css 10.8 kB 0 B
build/block-library/editor-rtl.css 7.54 kB 0 B
build/block-library/editor.css 7.54 kB 0 B
build/block-library/style-rtl.css 7.75 kB 0 B
build/block-library/style.css 7.76 kB 0 B
build/block-library/theme-rtl.css 728 B 0 B
build/block-library/theme.css 729 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.2 kB 0 B
build/components/style-rtl.css 15.8 kB 0 B
build/components/style.css 15.8 kB 0 B
build/compose/index.js 9.56 kB 0 B
build/core-data/index.js 11.4 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.46 kB 0 B
build/date/index.js 5.38 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 569 B 0 B
build/dom/index.js 3.23 kB 0 B
build/edit-navigation/index.js 10.8 kB 0 B
build/edit-navigation/style-rtl.css 1.08 kB 0 B
build/edit-navigation/style.css 1.08 kB 0 B
build/edit-post/style-rtl.css 5.59 kB 0 B
build/edit-post/style.css 5.58 kB 0 B
build/edit-site/style-rtl.css 3.03 kB 0 B
build/edit-site/style.css 3.03 kB 0 B
build/edit-widgets/style-rtl.css 2.45 kB 0 B
build/edit-widgets/style.css 2.45 kB 0 B
build/editor/editor-styles-rtl.css 537 B 0 B
build/editor/editor-styles.css 539 B 0 B
build/editor/style-rtl.css 3.78 kB 0 B
build/editor/style.css 3.78 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.71 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 709 B 0 B
build/keyboard-shortcuts/index.js 2.52 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.32 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.4 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 13.9 kB 0 B
build/server-side-render/index.js 2.71 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

@chrisvanpatten
Copy link
Contributor

Potentially dumb question, but would there be any impact for third parties using Emotion for styling as well? We use Emotion in all our blocks, and I'm curious if this might risk some kind of unanticipated breaking change.

@ItsJonQ
Copy link
Author

ItsJonQ commented Jun 22, 2020

Potentially dumb question, but would there be any impact for third parties using Emotion for styling as well?

@chrisvanpatten Not a dumb question at all!! <3 That's a very valid use-case and concern!

From my experience + tests (external to this project), Emotion's (internal) cache registry should respect any emotion rendered component. In the past, I've used this Provider in a nested fashion, with styled Emotion components coming in from a 3rd-party library, as well as 1st direct components. It all worked as expected 👍 !

The only issue that I can see is if a 3rd party library creates their own custom Provider, which manipulates the generated css output in an unexpected way. I'd imagine that this would be rare (but not impossible).

Hopefully this helps!

P.S. It never hurts to test it out! If you happen to test out this branch along with your custom blocks, I'd love to know how it turns out 🙏

Base automatically changed from master to trunk March 1, 2021 15:43
@mirka
Copy link
Member

mirka commented Aug 5, 2022

@ciampo and I discussed how to proceed with this PR, and we decided to close this out since we now have a somewhat more comprehensive/reliable way to deal with the forms.css problem (#42747). It also turns out that we don't need the double-ampersand hacks too often, since they're only required for low-level elements like select or input, and most of the codebase doesn't need to deal with raw elements once we have low-level library components in place.

We'll close this for now and refer back to it when we have a need for it. Thanks!

@mirka mirka closed this Aug 5, 2022
@johnbillion johnbillion deleted the add/styled-scope-provider branch April 22, 2025 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CSS Styling Related to editor and front end styles, CSS-specific issues. [Package] Components /packages/components [Type] Code Quality Issues or PRs that relate to code quality [Type] Experimental Experimental feature or API.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Emotion: Provider to increase className specificity

3 participants