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

Add color and typography presets to Global Styles #56622

Merged
merged 48 commits into from
Feb 28, 2024

Conversation

scruffian
Copy link
Contributor

@scruffian scruffian commented Nov 29, 2023

What?

A popular feature in classic themes was to allow users to change the color palette and font families of their theme, usually the customizer. This is already possible in Global Styles, but the UI to do so is tricky to use - it takes a lot of clicks and a deep understanding of how Global Styles works. This PR abstracts that complexity away for users so they can change colors and typography details easily without knowing how Global Styles works.

These color and typography settings are extracted from the style variations, and exposed in the Global Styles UI.

Why?

This makes it possible to mix and match color and typography settings from different style variations. In the future this will also allow theme developers to offer a much wider range of color and typography variations and potentially even mix and match these variations between themes.

How?

  • Process style variations to extract the color or typography rules from them. Note: This extracts all of the typography/color rules, not just those under "settings", but all of the rules in the style variation.
  • Add a new UI to the colors and typography sections of the Global Styles UI to give access to these extracted settings

Testing Instructions

  1. Switch to a theme that has multiple style variations
  2. Open the Site Editor
  3. Go to the Global Styles panel
  4. Open the Colors section
  5. Open the Palette section
  6. You should see a section called "Presets"
  7. Select one of the presets
  8. The colors of your preview should be updated to match the preset
  9. Go back to the root of Global Styles
  10. Open the Typography section
  11. Select "Typesets"
  12. Select one of the Preset typography options
  13. The typography of the preview should update

Screenshots or screencast

Screenshot 2023-12-07 at 17 07 08 Screenshot 2023-12-07 at 16 48 04 Screenshot 2023-12-07 at 16 47 52

There's also a demo video here: https://ben.blog/2023/12/07/global-styles-add-color-and-typography-presets/

Todo

  • Show the defaults for both color and typography
  • Also apply the duotone from the style variation

Questions

  • Should we name each color/typography variation? What should they be called?
  • Does the "Typesets" section in "Typography" make sense?
  • How could we surface this in Site View?

Notes

One of the powerful things about the approach taken here is that it will work for existing themes - it doesn't require theme developers to add special settings to their themes.

Copy link

github-actions bot commented Nov 29, 2023

Size Change: +1.64 kB (0%)

Total Size: 1.71 MB

Filename Size Change
build/edit-site/index.min.js 216 kB +1.58 kB (+1%)
build/edit-site/style-rtl.css 15.4 kB +28 B (0%)
build/edit-site/style.css 15.4 kB +28 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.22 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.37 kB
build/block-editor/content.css 4.37 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/index.min.js 251 kB
build/block-editor/style-rtl.css 15.5 kB
build/block-editor/style.css 15.5 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 90 B
build/block-library/blocks/archives/style.css 90 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 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 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 415 B
build/block-library/blocks/button/editor.css 414 B
build/block-library/blocks/button/style-rtl.css 627 B
build/block-library/blocks/button/style.css 626 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 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 421 B
build/block-library/blocks/columns/style.css 421 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 199 B
build/block-library/blocks/comment-template/style.css 198 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.69 kB
build/block-library/blocks/cover/style.css 1.68 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 322 B
build/block-library/blocks/embed/editor.css 322 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 227 B
build/block-library/blocks/form-input/editor.css 227 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 471 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.72 kB
build/block-library/blocks/gallery/style.css 1.72 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 647 B
build/block-library/blocks/group/editor.css 647 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 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 894 B
build/block-library/blocks/image/editor.css 893 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view.min.js 1.54 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 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 505 B
build/block-library/blocks/media-text/style.css 503 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 259 B
build/block-library/blocks/navigation-link/style.css 257 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.02 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 666 B
build/block-library/blocks/post-featured-image/editor.css 662 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 409 B
build/block-library/blocks/post-template/style.css 408 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 354 B
build/block-library/blocks/pullquote/style.css 354 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 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 140 B
build/block-library/blocks/read-more/style.css 140 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 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 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 629 B
build/block-library/blocks/search/style.css 628 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 478 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 229 B
build/block-library/blocks/separator/style.css 229 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 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.49 kB
build/block-library/blocks/social-links/style.css 1.48 kB
build/block-library/blocks/spacer/editor-rtl.css 350 B
build/block-library/blocks/spacer/editor.css 350 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 395 B
build/block-library/blocks/table/editor.css 395 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 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/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.4 kB
build/block-library/editor.css 12.3 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 217 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.8 kB
build/block-library/style.css 14.8 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.8 kB
build/commands/index.min.js 15.6 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/components/index.min.js 223 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.9 kB
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.77 kB
build/core-data/index.min.js 72.8 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.32 kB
build/customize-widgets/style.css 1.32 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.95 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 23.7 kB
build/edit-post/style-rtl.css 5.64 kB
build/edit-post/style.css 5.63 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.22 kB
build/edit-widgets/style.css 4.22 kB
build/editor/index.min.js 63.9 kB
build/editor/style-rtl.css 5.32 kB
build/editor/style.css 5.32 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.89 kB
build/format-library/style-rtl.css 478 B
build/format-library/style.css 477 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 12.9 kB
build/interactivity/navigation.min.js 1.15 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 1.36 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.74 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 2 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 5.78 kB
build/patterns/style-rtl.css 540 B
build/patterns/style.css 539 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.05 kB
build/preferences/index.min.js 2.82 kB
build/preferences/style-rtl.css 698 B
build/preferences/style.css 700 B
build/primitives/index.min.js 975 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 623 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.72 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.4 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.95 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 2.08 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.72 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

Copy link

github-actions bot commented Nov 30, 2023

Flaky tests detected in b63b417.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/8007146955
📝 Reported issues:

@scruffian scruffian changed the title Add colors and typography to the styles tab Add color and typography presets to Global Styles Dec 7, 2023

const { GlobalStylesContext } = unlock( blockEditorPrivateApis );

const getFontFamilies = ( themeJson ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

There's a lot of duplicate code in this function that could be extracted to a function.

};

export default function ScreenTypographyTypesets() {
const variations = useSelect( ( select ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Return an object.

const { base, user } = useContext( GlobalStylesContext );

const typographyVariations =
variations && getVariationsByProperty( user, variations, 'typography' );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Add the default?

} );
};

const selectOnEnter = ( event ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Quite a lot of this is just copy/paste from the Variation component.


export default function ColorVariations() {
const { user } = useContext( GlobalStylesContext );
const variations = useSelect( ( select ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Return an object

).__experimentalGetCurrentThemeGlobalStylesVariations();
}, [] );
const colorVariations =
variations && getVariationsByProperty( user, variations, 'color' ); // should also get filter?
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Add the default variation

}

export default function TypographyVariations() {
const variations = useSelect( ( select ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Return an object


const { base, user } = useContext( GlobalStylesContext );

const typographyVariations =
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Add the default variation

@MaggieCabrera
Copy link
Contributor

This doesn't seem to be working for variations with more than 2 fonts. I added this variation to TT4 that uses a third font for buttons and it didn't show under typesets:

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"title": "Maggie",
	"settings": {
		"typography": {
			"fluid": true,
			"fontFamilies": [
				{
					"fontFace": [
						{
							"fontFamily": "Instrument Sans",
							"fontStyle": "normal",
							"fontWeight": "400 700",
							"src": [
								"file:./assets/fonts/instrument-sans/InstrumentSans-VariableFont_wdth,wght.woff2"
							]
						},
						{
							"fontFamily": "Instrument Sans",
							"fontStyle": "italic",
							"fontWeight": "400 700",
							"src": [
								"file:./assets/fonts/instrument-sans/InstrumentSans-Italic-VariableFont_wdth,wght.woff2"
							]
						}
					],
					"fontFamily": "\"Instrument Sans\", sans-serif",
					"name": "Instrument Sans",
					"slug": "heading"
				},
				{
					"fontFace": [
						{
							"fontFamily": "Cardo",
							"fontStyle": "normal",
							"fontWeight": "400",
							"src": ["file:./assets/fonts/cardo/cardo_normal_400.woff2"]
						},
						{
							"fontFamily": "Cardo",
							"fontStyle": "italic",
							"fontWeight": "400",
							"src": ["file:./assets/fonts/cardo/cardo_italic_400.woff2"]
						},
						{
							"fontFamily": "Cardo",
							"fontStyle": "normal",
							"fontWeight": "700",
							"src": ["file:./assets/fonts/cardo/cardo_normal_700.woff2"]
						}
					],
					"fontFamily": "Cardo",
					"name": "Cardo",
					"slug": "buttons"
				},
				{
					"fontFace": [
						{
							"fontFamily": "Jost",
							"fontStyle": "normal",
							"fontWeight": "100 900",
							"src": ["file:./assets/fonts/jost/Jost-VariableFont_wght.woff2"]
						},
						{
							"fontFamily": "Jost",
							"fontStyle": "italic",
							"fontWeight": "100 900",
							"src": [
								"file:./assets/fonts/jost/Jost-Italic-VariableFont_wght.woff2"
							]
						}
					],
					"fontFamily": "\"Jost\", sans-serif",
					"name": "Jost",
					"slug": "body"
				},
				{
					"fontFamily": "-apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif",
					"name": "System Sans-serif",
					"slug": "system-sans-serif"
				},
				{
					"fontFamily": "Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol",
					"name": "System Serif",
					"slug": "system-serif"
				}
			]
		}
	},
	"styles": {
		"blocks": {
			"core/button": {
				"typography": {
					"fontFamily": "var(--wp--preset--font-family--buttons)"
				}
			}
		},
		"elements": {
			"button": {
				"typography": {
					"fontFamily": "var(--wp--preset--font-family--buttons)"
				}
			}
		}
	}
}

@ramonjd
Copy link
Member

ramonjd commented Feb 1, 2024

@scruffian @MaggieCabrera If you need help moving this one forward, I'm happy to rebase and test, and tinker with it.

I'll take it for a spin next week.

If there are any outstanding items or gotchas, let me know.

Thank you!

Copy link

github-actions bot commented Feb 1, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: scruffian <[email protected]>
Co-authored-by: ramonjd <[email protected]>
Co-authored-by: richtabor <[email protected]>
Co-authored-by: mtias <[email protected]>
Co-authored-by: MaggieCabrera <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.


typographyVariations?.forEach( ( variation ) => {
const [ bodyFontFamilyName, headingFontFamilyName ] =
getFontFamilyNames( mergeBaseAndUserConfigs( base, variation ) );
Copy link
Member

Choose a reason for hiding this comment

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

Maybe we need to come up with a way to name style variations with no font-families, e.g., cases where variations have typography styles only like this:

{
	"settings": {},
	"styles": {
		"typography": {
			"letterSpacing": "10px"
		},
		"blocks": {
			"core/post-title": {
				"typography": {
					"fontWeight": "700"
				},
				"color": {
					"background": "red"
				}
			}
		}
	}
}

Possibly ${variationTitle} - typeset or, when variation.title doesn't exist in the theme.json ${variationFileName} - typeset?

Screenshot 2024-02-05 at 2 17 05 pm

Copy link
Member

Choose a reason for hiding this comment

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

Maybe we need to come up with a way to name style variations with no font-families, e.g., cases where variations have typography styles only like this:

To simplify this, I propose we lean in on a "Font book" type approach, where the heading and body fonts are used in for A and a respectively, like this:

CleanShot 2024-02-06 at 13 36 34

We already do that for styles:

CleanShot 2024-02-06 at 13 38 10

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I updated the PR to use these designs:

Screenshot 2024-02-24 at 10 34 34

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, this looks good. We can expand later on listing exactly what aspects are being modified, which is a general concern of variations.

Copy link
Member

Choose a reason for hiding this comment

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

Looks great!

Copy link
Member

@ramonjd ramonjd left a comment

Choose a reason for hiding this comment

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

Just rebasing/testing today and making some observations. I can look further into the following:

  • create hooks to grab typography/color variation sets
  • decide how to handle labelling variations with no presets
  • tests
  • other stuff 😄

<VStack spacing={ 3 }>
<FontFamilies />
<ItemGroup isBordered>
<NavigationButtonAsItem
Copy link
Member

Choose a reason for hiding this comment

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

Wondering if the all the work grabbing the typography settings from the variations could be done in a memoized hook, or store selector.

That way we could do a length check on the array here and skip rendering the button.

@ramonjd
Copy link
Member

ramonjd commented Feb 6, 2024

I'm thinking we could split this PR.

First we could work on the hook to grab theme style variation styles by property:

This could more quickly unblock the work @apeatling is doing.

This would mean we'd work on the UI/site editor components etc in another PR.

It would further help to split up the PR as there are some aspects of how and what we show in the editor that I think need resolved.

For instance how should the site editor, if at all, present theme style variations that have no presets? Related comments: https://github.com/WordPress/gutenberg/pull/56622/files#r1477640893 and https://github.com/WordPress/gutenberg/pull/56622/files#r1477627148

Maybe we shouldn't focus on presets so much and rather present them as subsets of variations (typography and so on) So if a theme hasn't got a any heading/body font families defined, what do we do?

In short, in my estimation, the discussions about UX and UI will take longer than getting some working utils ready.

What do folks think?

@richtabor
Copy link
Member

Maybe we shouldn't focus on presets so much and rather present them as subsets of variations (typography and so on)

I think they're one and the same. Having a full theme style variation is a nice way to switch up your whole site's look, but splitting out the colors and typesets within each is nice so you're not having to go all-or-nothing.

So if a theme hasn't any heading/body font families defined, what do we do?

I wouldn't expect there to be a preset for it then.

@ramonjd
Copy link
Member

ramonjd commented Feb 6, 2024

Thanks for the feedback @richtabor! This gives us plenty to go off, thanks!

@scruffian
Copy link
Contributor Author

In short, in my estimation, the discussions about UX and UI will take longer than getting some working utils ready.

I agree with this. There's a whole lot of crazy javascript manipulations happening that need to be tidied up and tested thoroughly. We can get a lot of this in place before making the UX decisions.

Thanks for working on this.

ramonjd added a commit that referenced this pull request Feb 8, 2024
Pulling out the utils from #56622 so we test separately
Copy link
Member

@ramonjd ramonjd left a comment

Choose a reason for hiding this comment

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

This is working pretty well, thanks a lot!

I'm happy if @mtias and @richtabor are happy. 😄

I've tested in about 12 block themes and didn't notice any huge blockers.

For follow ups

It would be good to have some fallbacks for highlightedColors in case the background/text styles are the same as the available palette colors. See comment: #56622 (comment)

From this comment: Might also be a good janitorial follow up to move variation components into components/global-styles/variations and then all the related CSS as well

My feeling is that we should probably refactor the StylePreview component into smaller pieces that can be reused, so that all three previews share the same code, but this will take a bit of unpicking...

Agree. This would be a good refactor follow up.

*/
const ratio = ratioState ? ratioState : fallbackRatio;

const { highlightedColors } = useStylesPreviewColors();
Copy link
Member

Choose a reason for hiding this comment

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

While testing I noticed an issue with some themes that had only 2 palette colors, e.g., Freddie.

If those colors match heading or background colors, they're being filtered out:

const highlightedColors = paletteColors
.filter(
// we exclude these two colors because they are already visible in the preview.
( { color } ) => color !== backgroundColor && color !== headingColor

The result is that, although there's a variation, the colors are empty:

Screenshot 2024-02-28 at 12 08 24 pm

CanvasLoader already gets around it this way:

const [ fallbackIndicatorColor ] = useGlobalStyle( 'color.text' );
const [ backgroundColor ] = useGlobalStyle( 'color.background' );
const { highlightedColors } = useStylesPreviewColors();
const indicatorColor =
highlightedColors[ 0 ]?.color ?? fallbackIndicatorColor;

Not sure what's appropriate in <StylesPreviewColors />

Maybe something like:

	const { paletteColors, highlightedColors } = useStylesPreviewColors();

	const previewColors = highlightedColors.length
		? highlightedColors
		: paletteColors.slice( 0, 2 );

Copy link
Member

Choose a reason for hiding this comment

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

Update: this is already an "feature" of trunk, in that style variation previews won't show them either.

I think it just looks strange in the preset previews. Maybe good for an immediate follow up.

To replicate the above issue, here's a style variation example. The palette colors are the same as the background and text colors so the variation will show nothing.

{
	"version": 2,
	"settings": {
	"color": {
		"palette": [
			{
				"color": "#000000",
				"name": "Base",
				"slug": "base"
			},
			{
				"color": "#ffffff",
				"name": "Contrast",
				"slug": "contrast"
			}
		]
	}
	},
	"styles": {
		"color": {
			"text": "#000000",
			"background": "var(--wp--preset--color--contrast)"
		}
	}
}

key={ slug }
style={ {
boxShadow:
'inset 0 0 0 1px #0003',
Copy link
Member

Choose a reason for hiding this comment

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

I added this to ensure the colors have a border like the ColorIndicator component.

In some themes, the background color matches the highlights, or are close in contrast:

Before

Screenshot 2024-02-28 at 12 11 30 pm

After

Screenshot 2024-02-28 at 12 11 02 pm

Copy link
Member

@richtabor richtabor Feb 28, 2024

Choose a reason for hiding this comment

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

I added this to ensure the colors have a border like the ColorIndicator component.

I don't think this is necessary, as I want to update these colors to be more representative of the style by using the text and button colors for the indicators. I will open another issue on that (to do as a follow-up).

@richtabor
Copy link
Member

One detail on the placement—I think we should try placing colors within the "Palette" group (not the drilldown) and the type variations within the "Fonts" group. Both cases at the top, with the breakdown right below.

I agree, hierarchy wise they're a bit in the mix—rather than appropriately placed.

I think this could work for this initial effort, then we can revisit secondary affordances for when there are more than 6 (perhaps a "View more/all" and a flyout, like the Colors panel):

CleanShot 2024-02-28 at 10 50 04

@scruffian
Copy link
Contributor Author

Design updated:

Screenshot 2024-02-28 at 15 55 39 Screenshot 2024-02-28 at 15 55 31

@scruffian
Copy link
Contributor Author

I'm going to bring this in, but just noting the followups here:

  1. Consider breaking the StylePreveiw component into smaller components that can be shared across these different instances, and clean up the extra CSS (https://github.com/WordPress/gutenberg/pull/56622/files#r1501797756)
  2. Reconsider the colors used in the StylePreview
  3. Deal with the case where presets are appearing blank (Add color and typography presets to Global Styles #56622 (comment))

@scruffian scruffian merged commit ed72f48 into trunk Feb 28, 2024
59 checks passed
@scruffian scruffian deleted the add/colors-and-typography branch February 28, 2024 16:19
@github-actions github-actions bot added this to the Gutenberg 17.9 milestone Feb 28, 2024
@scruffian
Copy link
Contributor Author

Sorry I did the merge and forgot to add the props to it again :(

Co-authored-by: scruffian <[email protected]>
Co-authored-by: ramonjd <[email protected]>
Co-authored-by: richtabor <[email protected]>
Co-authored-by: mtias <[email protected]>
Co-authored-by: MaggieCabrera <[email protected]>

@richtabor
Copy link
Member

Reconsider the colors used in the StylePreview

Follow up issue here: #59444

@richtabor
Copy link
Member

Good stuff!

The best part of this effort is that all existing block themes will inherit this without having to do a thing. Anyone running a block theme can use any combination of colors or fonts, from any of their theme variations. Very nice.

@matiasbenedetto
Copy link
Contributor

matiasbenedetto commented Mar 4, 2024

Hi 👋 , I'm sorry to be late to this conversation. I think the typography presets are not working as users would expect. Its behavior could feel unpredictable. I submitted an issue around this: #59574

@timnicholson
Copy link

I've noticed that color palettes don't show up as such if the colors-only json in the /styles directory has a "style" section in it at all. Even if the syles section only has a CSS value. I have some light CSS that is needed to change the font colors on certain background colors.

For example, this doesn't show up as a color palette in v6.6. I assume the reasoning is that if a global style contains anything other than color settings, it should be retained as a global style and not generate a preset color palette that really limits what you can do to default readable text based on the background color.

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"title": "Midnight Blue, Blue, Yellow",
	"styles": {
		"css": ".has-background.has-tertiary-background-color { color: var(--wp--preset--color--foreground); }"
	},	
	"settings": {
		"color": {
			"palette": [
				{
					"slug": "primary",
					"color": "#34495e",
					"name": "Primary (Midnight Blue)"
				},
				{
					"slug": "secondary",
					"color": "#3498db",
					"name": "Secondary (Blue)"
				},
				{
					"slug": "tertiary",
					"color": "#f1c40f",
					"name": "Tertiary (Yellow)"
				}

Any chance that "color pairs" are in the works for theme.json and global styles? Meaning the ability to specify a background and text color at the same time? Something like this:

{
	"slug": "primary",
	"color": "#34495e",
	"text": "#ffffff",
	"name": "Primary (Midnight Blue)"
},

@scruffian
Copy link
Contributor Author

@timnicholson your assumption is correct. If the style variation contains any keys other than color it will be treated as a full style variation, not a color palette. I would be reluctant to make exceptions for specific keys because where does that end? I think the better option is to fix the issues that the CSS is trying to solve by improving Global Styles.

Any chance that "color pairs" are in the works for theme.json and global styles?

Not that I know of it.

@richtabor
Copy link
Member

Any chance that "color pairs" are in the works for theme.json and global styles? Meaning the ability to specify a background and text color at the same time?

Not exactly, but you can create block style variations for group/columns blocks that apply styling to nested blocks, using whatever set of colors.

@timnicholson
Copy link

I just noticed that WordPress v6.6 is now outputting CSS that sets the text color to the foreground color on colored backgrounds. And it uses specificity with .has-background as well, which overrides my theme CSS that uses .has-primary-background-color. I thought 6.6 was supposed to reduce CSS specificity :-/

.has-background.has-primary-background-color { color: var(--wp--preset--color--foreground) }

I was able to fix that with the additional specificity.

But another issue is the two little color dots on the global theme styles are all gray no matter what the color scheme is. Does anyone know what colors it is actually pulling for those? They used to pull the first and second color in the palette (so I made the first two the "interesting" ones), but now they are all just gray.

@richtabor
Copy link
Member

I just noticed that WordPress v6.6 is now outputting CSS that sets the text color to the foreground color on colored backgrounds.

Do you mind opening a new issue with more details of this (visuals, active theme, etc). It's not something I am aware of.

But another issue is the two little color dots on the global theme styles are all gray no matter what the color scheme is.

They're using background color, heading and button/link color.

@timnicholson
Copy link

timnicholson commented Jul 29, 2024

I just noticed that WordPress v6.6 is now outputting CSS that sets the text color to the foreground color on colored backgrounds.

Do you mind opening a new issue with more details of this (visuals, active theme, etc). It's not something I am aware of.

Sorry, I jumped the gun on this. I thought it was WordPress outputting CSS for the foreground color, but it wasn't. The "bug" is actually that the Global Theme Styles preview doesn't swap out the "additional CSS" from the theme.json partials. So when I chose a style that used dark text on the light primary color, that CSS "stuck" no matter what other style I chose.

But another issue is the two little color dots on the global theme styles are all gray no matter what the color scheme is.

They're using background color, heading and button/link color.

I can't get those two dots to be any color other than the foreground color. Even simply using the Block Editor Settings to change the button or link color doesn't change the color of the two dots. The only way I can get those dots to change is if I put something truly unique into the foreground color setting, like to include comments like this. This seems to override some WordPress logic that is checking to see if the foreground color in the global style json is different than that of the main theme.json. By including these comments, it wont' equal "#555555" in theme.json and thus will display the button color in both dots. Very odd bug.

	"styles": {
		"color": {
			"background": "var(--wp--preset--color--base)",
			"text": "#555555 /*var(--wp--preset--color--contrast)*/"
		},

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Theme Style Variations Related to style variations provided by block themes Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants