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

Site global styles #50102

Closed
wants to merge 24 commits into from
Closed

Site global styles #50102

wants to merge 24 commits into from

Conversation

matiasbenedetto
Copy link
Contributor

@matiasbenedetto matiasbenedetto commented Apr 26, 2023

⚠️ This is a draft.

Implements #47420 to add support for #45271.

What ?

This PR tries to add a site-level settings/styles config to persist data across theme switches.

Why ?

We need site-level data persistence to store configs such as user-added typographic fonts.

How ?

  • Creates a new global styles post to store the data related to the site (theme independent).
    • It's a new post of type wp_global_styles.
    • Its name is wp-global-styles-site.
  • Creates a new "origin" for the data:
    • The proposed hierarchy is default > blocks > theme > site > custom. Note that custom overrides the site. This allows for users to have preferences stored that can be overridden if a specific theme is in use.
    • Adds site to the allowed origins in WP_Theme_JSON_Gutenberg.
    • Makes get_merged_data to work with the new site origin.

Questions:

  • Should we reset the site level settings and styles when clicking the "Reset to defaults"? image

@github-actions
Copy link

github-actions bot commented Apr 26, 2023

Size Change: +1.21 kB (0%)

Total Size: 1.37 MB

Filename Size Change
build/api-fetch/index.min.js 2.33 kB +61 B (+3%)
build/block-directory/style-rtl.css 1.05 kB +15 B (+1%)
build/block-directory/style.css 1.05 kB +14 B (+1%)
build/block-editor/content-rtl.css 4.17 kB -6 B (0%)
build/block-editor/content.css 4.16 kB -7 B (0%)
build/block-editor/index.min.js 202 kB +1.47 kB (+1%)
build/block-editor/style-rtl.css 15.3 kB +168 B (+1%)
build/block-editor/style.css 15.3 kB +166 B (+1%)
build/block-library/blocks/cover/style-rtl.css 1.62 kB +17 B (+1%)
build/block-library/blocks/cover/style.css 1.61 kB +18 B (+1%)
build/block-library/blocks/gallery/editor-rtl.css 957 B -27 B (-3%)
build/block-library/blocks/gallery/editor.css 962 B -26 B (-3%)
build/block-library/blocks/search/editor-rtl.css 178 B +13 B (+8%) 🔍
build/block-library/blocks/search/editor.css 178 B +13 B (+8%) 🔍
build/block-library/blocks/site-logo/editor-rtl.css 760 B +4 B (+1%)
build/block-library/blocks/site-logo/editor.css 760 B +4 B (+1%)
build/block-library/editor-rtl.css 11.8 kB -9 B (0%)
build/block-library/editor.css 11.8 kB -9 B (0%)
build/block-library/index.min.js 204 kB -54 B (0%)
build/block-library/style-rtl.css 12.8 kB +11 B (0%)
build/block-library/style.css 12.8 kB +8 B (0%)
build/blocks/index.min.js 51.1 kB +15 B (0%)
build/commands/index.min.js 14.8 kB +23 B (0%)
build/commands/style-rtl.css 807 B +18 B (+2%)
build/commands/style.css 804 B +18 B (+2%)
build/components/index.min.js 210 kB +60 B (0%)
build/components/style-rtl.css 11.8 kB +22 B (0%)
build/components/style.css 11.8 kB +21 B (0%)
build/core-data/index.min.js 16.5 kB +260 B (+2%)
build/data/index.min.js 8.68 kB -4 B (0%)
build/edit-post/index.min.js 35.4 kB +221 B (+1%)
build/edit-site/index.min.js 63.4 kB -1.41 kB (-2%)
build/edit-site/style-rtl.css 10.2 kB -30 B (0%)
build/edit-site/style.css 10.2 kB -29 B (0%)
build/edit-widgets/index.min.js 17.3 kB -51 B (0%)
build/editor/index.min.js 46.1 kB +237 B (+1%)
build/editor/style-rtl.css 3.48 kB -8 B (0%)
build/editor/style.css 3.47 kB -8 B (0%)
build/private-apis/index.min.js 952 B +10 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 138 B
build/block-library/blocks/audio/theme.css 138 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 91 B
build/block-library/blocks/avatar/style.css 91 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 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 409 B
build/block-library/blocks/columns/style.css 409 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/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 B
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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 269 B
build/block-library/blocks/file/style.css 270 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/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 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 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 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 401 B
build/block-library/blocks/page-list/editor.css 401 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 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 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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 281 B
build/block-library/blocks/post-template/style.css 281 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 103 B
build/block-library/blocks/preformatted/style.css 103 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 335 B
build/block-library/blocks/pullquote/style.css 335 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 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 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 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 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/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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 234 B
build/block-library/blocks/separator/style.css 234 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 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/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 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/compose/index.min.js 12.4 kB
build/core-commands/index.min.js 1.84 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 718 B
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.76 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/style-rtl.css 7.84 kB
build/edit-post/style.css 7.83 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 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.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 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 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@oandregal oandregal self-requested a review April 26, 2023 15:01
@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 Apr 26, 2023
@priethor priethor added the [Type] Enhancement A suggestion for improvement. label Apr 28, 2023
@oandregal
Copy link
Member

I've started reviewing this and pushed a few changes, including format, tests, and behavior to make the site origin work like any other origin. I'm looking at the resolver first, and I'll move to the REST API and client-side after.

I hope you don't mind that I've pushed directly here. I thought it'll be faster given our timezone differences.

@matiasbenedetto
Copy link
Contributor Author

I've started reviewing this and pushed a few changes, including format, tests, and behavior to make the site origin work like any other origin. I'm looking at the resolver first, and I'll move to the REST API and client-side after.

I hope you don't mind that I've pushed directly here. I thought it'll be faster given our timezone differences.

That's great! go ahead, please.

@oandregal
Copy link
Member

I did a first pass and the main class (WP_Theme_JSON_Gutenberg and WP_Theme_JSON_Resolver_Gutenberg) should be ok. I'll check the REST API tomorrow (though I've already noticed there is a missing PHPDoc there).

$is_global_styles_user_theme_json = isset( $raw_config['isGlobalStylesUserThemeJSON'] ) && true === $raw_config['isGlobalStylesUserThemeJSON'];
$config = array();
if ( $is_global_styles_user_theme_json ) {
$origin = ( isset( $post->post_name ) && 'wp-global-styles-site' === $post->post_name ) ? 'site' : 'custom';
Copy link
Member

Choose a reason for hiding this comment

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

Documenting what I learn: the only change for the prepare_item_for_response method is this line. Otherwise, it's a verbatim copy of the existing 6.2 method.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, that's correct. That line and the following one (which will be using $origin value) are the only changes.

@oandregal
Copy link
Member

Done with the server changes for the REST endpoint.

In the client, we used to have only two things: user changes + base changes. The user changes were the only ones that could be updated via the site editor, and the base ones wouldn't (default + blocks + theme). Introducing the site origin means that the site editor needs to be able to update both user and site.

I'm going to start looking now at client-side changes.

() =>
async ( { dispatch } ) => {
const siteGlobalStyles = await apiFetch( {
path: '/wp/v2/global-styles/',
Copy link
Member

Choose a reason for hiding this comment

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

So, we need a way to pass the ID of the Custom Post Type that holds the data for the site origin (user changes unbound to a theme) to the client.

I see that the ID of the CPT for the custom origin (user changes bound to a theme) is taken from the themes endpoint through the wp:user-global-styles property. It was introduced at #35801. I see a mention about how it could be extended in the future.

I wonder what our options are for this:

  1. Attach it to the themes' endpoint as wp:site-global-styles, mimicking what we do with wp:user-global-styles. The data for the site is unrelated to the theme, so it feels wrong to do it this way.
  2. Attach it as a link elsewhere: where?
  3. Have a new endpoint to expose that piece of data. The current implementation of this PR. This seems too much considering the custom origin uses a link in an existing endpoint.

It seems 2 is more measured for what we're trying to do here, though we'd need to understand where. @youknowriad I'd like to hear your thoughts on this.

Copy link
Member

Choose a reason for hiding this comment

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

Attach it as a link elsewhere: where?

Perhaps a link in the settings endpoint that we already expose as the site entity?

@youknowriad
Copy link
Contributor

I'm failing to see why we need two origins "site" and "custom". What's the difference between these two? In my understanding the issue was about making "custom" cross theme, is this wrong?

@oandregal
Copy link
Member

I'm failing to see why we need two origins "site" and "custom". What's the difference between these two? In my understanding the issue was about making "custom" cross theme, is this wrong?

The rationale is that some user data needs to still be bound to the theme (custom) and some other data doesn't (site).

@youknowriad
Copy link
Contributor

The rationale is that some user data needs to still be bound to the theme (custom) and some other data doesn't (site).

I'm afraid this will introduce too much complexities. How would you differentiate between both in the UI, how do you revert to custom site one, to theme ones...

@youknowriad
Copy link
Contributor

Ok, I've discussed a bit with @mtias to understand the requirements here.

It seems:

1- We don't want to make global styles theme agnostic.
2- We do want a "font library" that is theme agnostic.

So I guess my question now, is why are we adding so much complexity to global styles (adding a level of customization) to address this? This font library issue doesn't seem relate to global styles for me?

@oandregal
Copy link
Member

I'm afraid this will introduce too much complexities. How would you differentiate between both in the UI, how do you revert to custom site one, to theme ones...

I see how the user mental model is going to be a bit shaken by this change, though my understanding is that we want site or custom depending on the feature itself. So, hopefully, the use case will be clear enough.

For example, in fonts at #45271 the ones you upload you don't want them "cleared" when you switch themes. However, for changes to styles (e.g.: background color), you want them "cleared" as they were based on the theme definition.

@oandregal
Copy link
Member

So I guess my question now, is why are we adding so much complexity to global styles (adding a level of customization) to address this? This font library issue doesn't seem relate to global styles for me?

There are a few use cases that support this. I tried to describe them at #47420

  • Manage typography font sets (PR): to allow users to save their own typography preferences, including the ability to upload fonts and select which fonts are available for the users of the site.
  • Add user styles variations at the global level (PR): to allow users to create and save their own style variations.
  • Consider whether the user palette should persist across theme switches.
  • Consider whether we allow users to make their styles persistent across themes (unlike today, where user styles are theme dependent and cleared upon theme switch).

Does this help?

@youknowriad
Copy link
Contributor

I think there's a confusion that is being made between "font presets" and "font library". One is theme.json material (presets), the other is not. I think it helps to think about the font library as "media library". We can use media in blocks and theme.json (maybe not sure) but these are not theme.json material and not saved there or anything.

In other words, I don't think we should make any update to the theme.json/global styles behavior to support fonts. Instead we have these three layers:

  • The font library: nothing enqueue, just listed in the UI and a possibility to have UI to upload... (uploaded to wp-content/fonts)
  • The font presets: saved in theme.json, enqueued automatically, a UI in global styles to pick from the library and add to the presets.
  • Font family control in typography panels: selection from the presets.

@youknowriad
Copy link
Contributor

#45271 (#46332): to allow users to save their own typography preferences, including the ability to upload fonts and select which fonts are available for the users of the site.

I've addressed this above (font library and font presets)

#45371 (#47075): to allow users to create and save their own style variations.

I don't see how this requires a "site" global style variation. Alternative user style variations are something we can support without that. (Just list them in the UI in addition to the theme variations)

Consider whether the user palette should persist across theme switches.

That's a potential use-case but maybe too small to warrant such a big complexity (both code wise and UI wise), so we need to be certain that we want that and it's unclear at the moment to me.

Consider whether we allow users to make their styles persistent across themes (unlike today, where user styles are theme dependent and cleared upon theme switch).

This is vague, I prefer concrete use-cases like the one just above.

@oandregal
Copy link
Member

The font presets: saved in theme.json, enqueued automatically, a UI in global styles to pick from the library and add to the presets.

How do we prevent this list from clearing upon theme switches? I'll let @matiasbenedetto share more about that use case, though what I heard was "we don't want users to have to re-introduce the curated list when they switch themes" (which I understand as "theme-agnostic presets").

I don't see how this requires a "site" global style variation. Alternative user style variations are something we can support without that. (Just list them in the UI in addition to the theme variations)

It's true that we can do differently. We can develop a custom solution for any. The point I tried to make at #47420 was that having a site origin addressed the needs of them all: persist user data across theme switches. The way I see it, implementing the site proposal requires less effort and maintenance than having custom code per-use-case.

@youknowriad
Copy link
Contributor

How do we prevent this list from clearing upon theme switches? I'll let @matiasbenedetto share more about that use case, though what I heard was "we don't want users to have to re-introduce the curated list when they switch themes" (which I understand as "theme-agnostic presets").

I don't think we want to retain the presets upon theme switch, we want to retain our font library. It's also the same question for color presets and... and this is going to be partially addressed by the "custom global styles variations".

It's true that we can do differently. We can develop a custom solution for any. The point I tried to make at #47420 was that having a site origin addressed the needs of them all: persist user data across theme switches. The way I see it, implementing the site proposal requires less effort and maintenance than having custom code per-use-case.

I don't see a need for any custom code here, we already have the CPT to store global styles variations, it's just that we want to use it for use ones as well.

@oandregal
Copy link
Member

I'll wait until @matiasbenedetto is around and can provide feedback. His original PR was at #46332 I see it saved to the custom origin, so it was cleared upon theme switches. If it is no longer a requisite, work can continue on that to unblock #45271

@matiasbenedetto
Copy link
Contributor Author

matiasbenedetto commented May 5, 2023

The font manager feature consists of adding fonts to the WordPress instance by downloading them from remote providers such as Google Fonts or uploading assets from the user's device.

In a prototype (#46332), we implemented this by storing the font assets in a WordPress folder and adding the font families and faces to the settings.typography.fontFamilies key of the global styles data.

That approach is not completely satisfying because the font definitions added by the user are lost when one switches themes. For that reason, we thought about having a way to persist this fontFamilies independently of the active theme. This PR is a potential way to solve that because we could add the settings.typography.fontFamilies definitions to the site origin, and we could achieve the desired outcome using the existing infrastructure around theme.json data.

I think I initially discarded implementing the font definitions persistence outside of the global styles domain to avoid custom implementation just for the font manager. Now @youknowriad has mentioned it I think we could explore a solution like that if adding a new origin for global styles is something that adds too much complexity and it is not potentially useful for other settings/styles apart from the font families definition.

@oandregal
Copy link
Member

If maintaining data upon theme switch is a requisite, I still think the site origin concept makes sense. That's what I think. Anyhow, I prioritize progress over everything else: if the way to unblock the font work is by developing a custom solution, let's do that. We can always consolidate later.

@youknowriad do you have thoughts on the way forward?

@youknowriad
Copy link
Contributor

If maintaining data upon theme switch is a requisite, I still think the site origin concept makes sense.

Think of it like "media library". Do we use "global styles" site origin to main theme switch data for media? I think it's the same for fonts personally.

That approach is not completely satisfying because the font definitions added by the user are lost when one switches themes. For that reason, we thought about having a way to persist this fontFamilies independently of the active theme.

This feels like the right approach to me. In other words, can we make "fonts" just another type of media?

@matiasbenedetto
Copy link
Contributor Author

Closing this old experimental PR

@youknowriad youknowriad deleted the add/site-global-styles branch January 30, 2024 13:31
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 [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants