Skip to content
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

Prototype: merge block CSS with theme.json styles #34180

Merged
merged 10 commits into from
Jun 10, 2022
Merged

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented Aug 19, 2021

Implements #33977

I'd like feedback on the direction. Should we want to pursue this, I'd improve the implementation later.

This PR experiments with moving parts of the CSS of the block to its block.json so it can be used to be merged with theme.json styles. The result of the merging will be (later in the chain overwrites the previous):

core (theme.json) > block (block.json) > theme (theme.json) > user (styles coming from the global styles sidebar)

There're a few advantages to this approach:

  • Block styles become easily configurable by the themes (via theme.json).
  • We ship either block or theme styles, but not both.

I've noticed that many of the block styles are attached to classes (has-background, style variations, etc) so I presume, initially, we won't see a big reduction of CSS. It'll be a good first step to absorb more later (e.g.: block variations).

How to test

  • Use the empty theme.
  • Verify that the global-styles-inline-css embedded stylesheet in the frontend contains the following CSS coming from the block.json:
.wp-block-button__link {
  background-color: #32373c;
  color: #fff;
  font-size: 1.125em;
  padding-top: calc(0.667em + 2px);
  padding-right: calc(1.333em + 2px);
  padding-bottom: calc(0.667em + 2px);
  padding-left: calc(1.333em + 2px);
}
  • Add the following to the theme.json of the theme:
"styles": {
  "blocks": {
    "core/button": {
      "color": {
        "text": "#000",
        "background": "#fff"
      }
    }
  }
}
  • Verify that the global-styles-inline-css embedded stylesheet in the frontend contains the following CSS (colors come from the theme now):
.wp-block-button__link {
  background-color: #fff;
  color: #000;
  font-size: 1.125em;
  padding-top: calc(0.667em + 2px);
  padding-right: calc(1.333em + 2px);
  padding-bottom: calc(0.667em + 2px);
  padding-left: calc(1.333em + 2px);
}

@oandregal oandregal self-assigned this Aug 19, 2021
@oandregal oandregal added [Status] In Progress Tracking issues with work in progress Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Aug 19, 2021
@github-actions
Copy link

github-actions bot commented Aug 19, 2021

Size Change: +64 B (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-library/blocks/button/style-rtl.css 516 B -44 B (-8%)
build/block-library/blocks/button/style.css 516 B -44 B (-8%)
build/block-library/index.min.js 181 kB +217 B (0%)
build/block-library/style-rtl.css 11.5 kB -33 B (0%)
build/block-library/style.css 11.5 kB -32 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 151 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 615 B
build/block-library/blocks/cover/editor.css 616 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 252 B
build/block-library/blocks/file/style.css 253 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 738 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.95 kB
build/block-library/blocks/navigation/style.css 1.94 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 395 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 495 B
build/block-library/blocks/post-comments-form/style.css 495 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 628 B
build/block-library/blocks/post-comments/style.css 628 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 619 B
build/block-library/blocks/post-featured-image/editor.css 619 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 402 B
build/block-library/blocks/search/style.css 403 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 721 B
build/block-library/blocks/site-logo/editor.css 721 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.2 kB
build/block-library/editor.css 10.3 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47.1 kB
build/components/index.min.js 228 kB
build/components/style-rtl.css 14 kB
build/components/style.css 14 kB
build/compose/index.min.js 11.7 kB
build/core-data/index.min.js 14.6 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.98 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.4 kB
build/edit-post/style-rtl.css 7.08 kB
build/edit-post/style.css 7.08 kB
build/edit-site/index.min.js 47.9 kB
build/edit-site/style-rtl.css 7.73 kB
build/edit-site/style.css 7.71 kB
build/edit-widgets/index.min.js 16.4 kB
build/edit-widgets/style-rtl.css 4.4 kB
build/edit-widgets/style.css 4.4 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.07 kB
build/nux/style-rtl.css 744 B
build/nux/style.css 741 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.2 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like this direction personally. Should we also update the site editor style rendered?
Curious to get more opinions on this one. @gziolo @mcsf @talldan @mtias

@jasmussen
Copy link
Contributor

I like this principle. It does open up a bit of challenges, though, perhaps best illustrated here:

Screenshot 2021-08-23 at 10 34 44

The most important properties of the button are extracted from the style and put into the JSON file for easy parsing, tweaking and disabling at a theme's whim. This is cool, and probably sufficient. But it's obviously also not all of it, as some styles do not have JSON counterparts. It's probably fine as in most cases these are properties that are structurally sensible, such as the cursor property, or the inline-block display. The box sizing property appears to exist primarily for the button width properties to behave as intended. But it does mean we'll still likely need to keep some CSS around.

Then there are the curious bits, for example those padding values, padding: calc(0.667em + 2px) calc(1.333em + 2px);. They exist to make sure that the solid non-bordered button has the same inner padding as the 2px bordered button. I'm happy to see that easily ported to the json file, which should hopefully enable us to absorb these two styles as shortcuts to border/padding configurations, rather then classname applications:

Screenshot 2021-08-23 at 10 53 32

The padding challenge remains, though. If we were to absorb those styles, the outline would still need to have a border rule, meaning we'd still need those curious padding shenanigans in order to keep the padding intact. @kjellr @MaggieCabrera do you have any ideas for how we might refactor the buttons so that the solid and bordered versions appear equally tall? Here's a codepen to play around in.

@MaggieCabrera
Copy link
Contributor

This padding issue has been a headache for us. We've had a use case that complicates it even more, and it's a very common one for themes to implement, that is related to not having any hover states built in on the block. The case is simple: a button block that on hover looks like the outline variation. For a theme to do that it has to build in this padding trickery and then remove it when the hover happens, because then there's a border that didn't exist before. Ideally, I would like the solid button style to have a border width set to the same color as the button background but I'm guessing that won't work well for backward compatibility, will it?

@jasmussen your codepen is exactly what I would do in this case too, but the theme.json can actually define a border-width, how would that be handled then?

/cc @pbking @jffng @scruffian

@oandregal
Copy link
Member Author

I'm trying this with the empty theme and the padding still behaves as expected:

Captura de ecrã de 2021-08-23 11-39-14

The reduced padding for the outline still applies, although the default padding is now part of global-styles-inline-css instead of the block-library CSS. Did I read your comment correctly or was there a different issue?

@MaggieCabrera
Copy link
Contributor

Adding this to emptytheme's json:

	"styles": {
		"blocks": {
			"core/button": {
				"border": {
					"radius": "0",
					"color": "red",
					"style": "solid",
					"width": "6px"
				}
			}
		}		
	}

I get, on trunk:

Editor Frontend
Screenshot 2021-08-23 at 11 54 27 Screenshot 2021-08-23 at 11 54 23

And with this PR:

Editor Frontend
Screenshot 2021-08-23 at 11 58 49 Screenshot 2021-08-23 at 11 58 54

I don't know why border-radius is not picking up on trunk :S

@jasmussen
Copy link
Contributor

your codepen is exactly what I would do in this case too, but the theme.json can actually define a border-width, how would that be handled then?

That's exactly the headache I was hoping to find a better solution to. My custom CSS solution is usually to use an inner box-shadow instead of the outset border — outline isn't an option as it can't have a border radius applied. But our border control adds actual borders, not box-shadows, so in case we were to absorb the solid and outline styles as inspector control shortcuts it'd just be nice to have a neat and simple solution for the height to be the same. The calc rule is a nice hack, but as soon as a user overrides the padding on a button, mixing and matching the two styles causes drift. Maybe it's fine?

The alternate solutions I was pondering, adding an explicit height or using pseudo elements, have their own sets of downsides.

@MaggieCabrera
Copy link
Contributor

MaggieCabrera commented Aug 23, 2021

The calc rule is a nice hack, but as soon as a user overrides the padding on a button, mixing and matching the two styles causes drift. Maybe it's fine?

I would say it's fine if it only happened when the user sets it, but not so much when it's the theme.json doing so. You are just passing the headache to the themers :D

@jasmussen
Copy link
Contributor

The solid/outlined button problem is a bit tangential to the conversation here, the principle of moving these styles over still feels valid to me. This was primarily an exploration of one aspect that will start to surface as we start to do this. It's probably a good thing, as we would've encountered this same issue with the button eventually anyway.

@MaggieCabrera
Copy link
Contributor

Yeah, I believe these issues are inherent to the block but shouldn't be a blocker for this particular change

@oandregal
Copy link
Member Author

I'm looking at the issue with border-radius Maggie shared.

For the challenges of maintaining height: isn't the issue that the user can't modify the underlying values of the block style variations? If they could, when they change padding in the default state, it is also the user's responsibility to update it in the outline variation. Not a final solution but #33232 should get us moving.

@oandregal
Copy link
Member Author

This is what happens: the outline variation uses the selectors .is-style-outline > .wp-block-button__link, .wp-block-button__link.is-style-outline, with specificity 020.

The global styles rule for the button:

  • In the frontend, uses .wp-block-button__link, 010, so the outline rule wins.
  • In the editor, the global styles are wrapped by the editor class and the rule ends being .editor-styles-wrapper .wp-block-button__link, also 020. Because it's found later in the document than the outline, the global styles one wins.

I can repro the same thing in trunk. The fix for this is actually building #33232 and that the themes can provide styles for the variations. This one is getting more urgent to implement.

@oandregal
Copy link
Member Author

As for the border-radius, I didn't see any report, so filed an issue at #34240

@jasmussen
Copy link
Contributor

For the challenges of maintaining height: isn't the issue that the user can't modify the underlying values of the block style variations? If they could, when they change padding in the default state, it is also the user's responsibility to update it in the outline variation. Not a final solution but #33232 should get us moving.

The challenge is that showing a solid background button next to a bordered outlined button with the same height, is remarkably harder to accomplish than you'd think. You'd think the solid button just has a background and no border, while the outlined version has a border and no background, right? Yes, but then the border is outset from the fill, causing the height differential, shown here with a 4px border:

Screenshot 2021-08-24 at 09 55 40

The way we've done it so far is to apply padding: calc(1em + 4px); to the solid button to make it as big as the 4px bordered button:

Screenshot 2021-08-24 at 09 58 18

But calc(1em + 4px) is not a very intuitive value for someone using the block editor to change. I'm not even sure we can surface it as a configurable value at all. And it certainly wouldn't be intuitive for anyone seeing to mix the two button styles to figure out why the height is off when the padding on both buttons is the same.

Another option would be to apply the outline version using box-shadow: inset 0 0 0 4px currentColor;. That would work fine and use the same padding on both button styles. But then we can't use the Border control inspector panel, as that draws borders, not box-shadows — at least not yet.

A third option is to also draw a black border on the solid button, so both are the same height. But then you'd have to change both the background and the border color in order to change the color of the solid button. Which might be okay, but wouldn't work very well with gradient color buttons.

I found a third option here: https://codepen.io/joen/pen/yLXLEgW?editors=1100 — always drawing a transparent border on the solid button, that seems to get pretty close to accomplishing what we need. The challenge here would then be if you change the border width on the outline button, you'd also have to change the border width on the solid version, even if it was transparent. Not sure if that would be a good experience 🤔

@MaggieCabrera any thoughts on that last option above? ☝️

@MaggieCabrera
Copy link
Contributor

I found a third option here: https://codepen.io/joen/pen/yLXLEgW?editors=1100 — always drawing a transparent border on the solid button, that seems to get pretty close to accomplishing what we need. The challenge here would then be if you change the border width on the outline button, you'd also have to change the border width on the solid version, even if it was transparent. Not sure if that would be a good experience 🤔

@MaggieCabrera any thoughts on that last option above? ☝️

As I was reading what you wrote I was thinking about transparent borders.

This solution helps accomplish the hover case (which ofc right now is not something we need to worry about in this context, but it's heavy on my mind since I've been struggling with that lately) where we would want the solid button to appear as the outline version while hovering without having to tinker with the padding. I like it very much from a themer's perspective.

As for the user experience, I guess it's not ideal. It would make sense to me that border width of the button would stay consistent regardless of the variation we are editing, I don't see why the value would be different between them.

@jasmussen
Copy link
Contributor

As for the user experience, I guess it's not ideal. It would make sense to me that border width of the button would stay consistent regardless of the variation we are editing, I don't see why the value would be different between them.

It would certainly start out the same, but I imagine it would still make sense for the border width to be a per-button property.

Of the options on deck, and since you seem mostly on board with the transparent border idea (thanks for looking), to me it seems like the best path forward so we can replace that padding calc-value. What do you think, @kjellr? I know we discussed this in the past.

@mcsf
Copy link
Contributor

mcsf commented Aug 24, 2021

I like this direction personally. Should we also update the site editor style rendered?
Curious to get more opinions on this one.

I like this too.

This PR also highlights the need for a way to add comments to style configurations. The 9999px radius is a great example of this. IIRC this feedback was also recently relayed by Anne from the FSE testing group.

@mburridge
Copy link
Contributor

Added the Needs Dev Note label in case this needs a dev note (either individual or as part of a "misc" dev note) for WP 6.1 release.

@scruffian
Copy link
Contributor

@mburridge
Copy link
Contributor

Thanks @scruffian, might it be worth adding the #dev-notes tag to that post?

@scruffian
Copy link
Contributor

Done, thanks

@mburridge mburridge removed the Needs Dev Note Requires a developer note for a major WordPress release cycle label Sep 15, 2022
pento pushed a commit to WordPress/wordpress-develop that referenced this pull request Sep 29, 2022
After block CSS was merged with `theme.json` styles in [WordPress/gutenberg#34180 Gutenberg PR #34180], this removed some existing, default styling for some elements, including buttons.  This change re-adds the removed styles by enqueueing `classic.css` for classic themes.

Merges [WordPress/gutenberg#44334 Gutenberg PR #44334] into trunk.

Follow-up to [54257].

Props scruffian, oandregal, ramonopoly, aristath, andrewserong, get_dave, bernhard-reiter.
See #56467.

git-svn-id: https://develop.svn.wordpress.org/trunk@54358 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request Sep 29, 2022
After block CSS was merged with `theme.json` styles in [WordPress/gutenberg#34180 Gutenberg PR #34180], this removed some existing, default styling for some elements, including buttons.  This change re-adds the removed styles by enqueueing `classic.css` for classic themes.

Merges [WordPress/gutenberg#44334 Gutenberg PR #44334] into trunk.

Follow-up to [54257].

Props scruffian, oandregal, ramonopoly, aristath, andrewserong, get_dave, bernhard-reiter.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54358


git-svn-id: http://core.svn.wordpress.org/trunk@53917 1a063a9b-81f0-0310-95a4-ce76da25c4cd
github-actions bot pushed a commit to platformsh/wordpress-performance that referenced this pull request Sep 29, 2022
After block CSS was merged with `theme.json` styles in [WordPress/gutenberg#34180 Gutenberg PR #34180], this removed some existing, default styling for some elements, including buttons.  This change re-adds the removed styles by enqueueing `classic.css` for classic themes.

Merges [WordPress/gutenberg#44334 Gutenberg PR #44334] into trunk.

Follow-up to [54257].

Props scruffian, oandregal, ramonopoly, aristath, andrewserong, get_dave, bernhard-reiter.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54358


git-svn-id: https://core.svn.wordpress.org/trunk@53917 1a063a9b-81f0-0310-95a4-ce76da25c4cd
@scruffian
Copy link
Contributor

Draft dev note:

Why

Previously blocks styles have be expressed in CSS. When themes want to override these styles using theme.json, it can be difficult to ensure that the specificity of the CSS that Global Styles generates overrides the default block CSS. This struggle has resulted in the use of some convoluted selectors in block CSS and also some issues where Global Styles settings weren't working as expected.

What

To overcome this it is now possible to express styles for a block in JSON, using the same properties as a theme.json file. These styles are merged with the Global Styles settings, with theme and user style settings taking priority over block styles. This means that blocks which express their styles in JSON will no longer have to deal with specificity battles between their CSS and Global Styles. In addition, when themes and users override these rules then no extra CSS will be output, which has a performance benefit.

How

Blocks can add an __experimentalStyle property to their block.json file which defines style for the block. For example the pullquote block sets the following:

		"__experimentalStyle": {
			"typography": {
				"fontSize": "1.5em",
				"lineHeight": "1.6"
			}
		}

This will output the following CSS in the frontend:

.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}

@oandregal
Copy link
Member Author

There is now #45198 to track the next steps for this experimental API.

ootwch pushed a commit to ootwch/wordpress-develop that referenced this pull request Nov 4, 2022
After block CSS was merged with `theme.json` styles in [WordPress/gutenberg#34180 Gutenberg PR #34180], this removed some existing, default styling for some elements, including buttons.  This change re-adds the removed styles by enqueueing `classic.css` for classic themes.

Merges [WordPress/gutenberg#44334 Gutenberg PR #44334] into trunk.

Follow-up to [54257].

Props scruffian, oandregal, ramonopoly, aristath, andrewserong, get_dave, bernhard-reiter.
See #56467.

git-svn-id: https://develop.svn.wordpress.org/trunk@54358 602fd350-edb4-49c9-b593-d223f7449a82
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Status] In Progress Tracking issues with work in progress
Projects
None yet
Development

Successfully merging this pull request may close these issues.