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 Editor: Add new 'Push changes to Global Styles' button #46446

Merged
merged 13 commits into from
Dec 16, 2022

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Dec 9, 2022

What?

Alternative to #45961. Closes #44361.

Adds a new 'Push changes to Global Styles' button to the Advanced panel for all blocks in the Site Editor. Pressing it applies the block's typography, spacing, dimensions, and color styling to all blocks of that type in Global Styles.

Why?

See #44361.

How?

A new editor.BlockEdit filter is added to @wordpress/edit-site. This filter renders the button in an AdvancedControls fill.

When the button is pressed, we iterate through the styles that are supported by the selected block type in Global Styles, and, for each one: 1) use setAttribute() to unset the block style; 2) use GlobalStylesContext to move the style to Global Styles for that block type.

It's difficult to do this in one undo level using the current @wordpress/core-data API so, for now, we create no undo levels and implement a custom Undo button in a snackbar notification.

Testing Instructions

A basic E2E test is included. To test manually:

  1. Open the site editor by navigating to Appearance → Editor.
  2. Select a block e.g. a Heading block.
  3. Make some stylistic changes in the block inspector.
  4. Open the Advanced panel and click Push changes to Global Styles.
  5. The typography, spacing, dimensions and color changes you made should now apply to all blocks of that type ( e.g.Heading). You can verify this by navigating to Global Styles → Blocks → e.g. Heading.

Follow up work


Note: @noisysocks wrote this description, so don't judge @ramonjd if there are typos 😀

@github-actions
Copy link

github-actions bot commented Dec 9, 2022

Size Change: +3.53 kB (0%)

Total Size: 1.32 MB

Filename Size Change
build/block-editor/index.min.js 182 kB +481 B (0%)
build/block-editor/style-rtl.css 14.7 kB +33 B (0%)
build/block-editor/style.css 14.6 kB +34 B (0%)
build/block-library/index.min.js 197 kB +1.28 kB (+1%)
build/blocks/index.min.js 50.4 kB -3 B (0%)
build/components/index.min.js 204 kB +35 B (0%)
build/components/style-rtl.css 11.6 kB -65 B (-1%)
build/components/style.css 11.6 kB -67 B (-1%)
build/compose/index.min.js 12.3 kB +2 B (0%)
build/core-data/index.min.js 15.9 kB +2 B (0%)
build/customize-widgets/index.min.js 11.7 kB +39 B (0%)
build/dom/index.min.js 4.71 kB -23 B (0%)
build/edit-navigation/index.min.js 16.2 kB +30 B (0%)
build/edit-navigation/style-rtl.css 4.11 kB -28 B (-1%)
build/edit-navigation/style.css 4.12 kB -28 B (-1%)
build/edit-post/index.min.js 34.7 kB +225 B (+1%)
build/edit-post/style-rtl.css 7.45 kB -34 B (0%)
build/edit-post/style.css 7.44 kB -34 B (0%)
build/edit-site/index.min.js 64.8 kB +1.54 kB (+2%)
build/edit-site/style-rtl.css 9.06 kB +45 B (0%)
build/edit-site/style.css 9.06 kB +46 B (+1%)
build/edit-widgets/index.min.js 16.8 kB +27 B (0%)
build/edit-widgets/style-rtl.css 4.46 kB -26 B (-1%)
build/edit-widgets/style.css 4.46 kB -26 B (-1%)
build/editor/index.min.js 44.1 kB -25 B (0%)
build/style-engine/index.min.js 1.53 kB +19 B (+1%)
build/widgets/index.min.js 7.27 kB +42 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 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 7.16 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 2.71 kB
build/block-editor/content.css 2.71 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 84 B
build/block-library/blocks/avatar/style.css 84 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 485 B
build/block-library/blocks/button/editor.css 485 B
build/block-library/blocks/button/style-rtl.css 532 B
build/block-library/blocks/button/style.css 532 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 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 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 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 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 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 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 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 253 B
build/block-library/blocks/file/style.css 254 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
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 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 829 B
build/block-library/blocks/image/editor.css 828 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 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 298 B
build/block-library/blocks/latest-comments/style.css 298 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.15 kB
build/block-library/blocks/navigation/editor.css 2.16 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 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 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 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 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 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 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 282 B
build/block-library/blocks/post-template/style.css 282 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-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 326 B
build/block-library/blocks/pullquote/style.css 325 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 440 B
build/block-library/blocks/query/editor.css 440 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 409 B
build/block-library/blocks/search/style.css 406 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 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 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 457 B
build/block-library/blocks/table/editor.css 457 B
build/block-library/blocks/table/style-rtl.css 636 B
build/block-library/blocks/table/style.css 635 B
build/block-library/blocks/table/theme-rtl.css 184 B
build/block-library/blocks/table/theme.css 184 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 404 B
build/block-library/blocks/template-part/editor.css 404 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 691 B
build/block-library/blocks/video/editor.css 694 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 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
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/style-rtl.css 12.4 kB
build/block-library/style.css 12.4 kB
build/block-library/theme-rtl.css 716 B
build/block-library/theme.css 721 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.14 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/editor/style-rtl.css 3.69 kB
build/editor/style.css 3.68 kB
build/element/index.min.js 4.72 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 882 B
build/format-library/index.min.js 7.2 kB
build/format-library/style-rtl.css 598 B
build/format-library/style.css 597 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.86 kB
build/list-reusable-blocks/index.min.js 2.13 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.94 kB
build/notices/index.min.js 977 B
build/nux/index.min.js 2.07 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/plugins/index.min.js 1.95 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.59 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 283 B
build/reusable-blocks/style.css 283 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.7 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/style-rtl.css 1.21 kB
build/widgets/style.css 1.21 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@noisysocks
Copy link
Member

Here's what this branch looks like. Thanks @ramonjd for hacking on it with me 😀

Kapture.2022-12-12.at.11.33.12.mp4

To be honest I'm not so keen on this flow. The Push changes to Global Styles button is somewhat removed from where the changes are made and so there's a moment of what just happened? after you click the button. It isn't clear, I think, which styles will be pushed. I added a snackbar notification with information about which styles were pushed to try and alleviate this, but that doesn't make the button itself any less mysterious.

I think it might be clearer what will happen if the Push changes button exists on each panel and only pertains to the styles within that panel? Perhaps using blue dots as in #44361 (comment)? or something else.

A more technical limitation I faced is that there currently no way to have @wordpress/core-data create only one undo level when making changes to both the block and to global styles. A fairly substantial amount of infrastructure work is needed for us to be able to undo the push using the site editor's undo button. Not impossible by any means, but I think probably not worth the investment until we're more certain about this feature. For now I added an Undo button to the snackbar notification which I think could serve for the time being.

@jasmussen @jameskoster: Have a play with this and let me know what you think, if we should steer the ship in a different direction, or if my hesitations are misplaced and I should just continue with this approach!

@jasmussen
Copy link
Contributor

Nice, this seems remarkably close! As I understand, the button in advanced does this:

  • Moves the unique style change to being a global styles > block change
  • Queues up "Custom styles" for multi entity saving
  • Fires a snackbar

Is that correct? (If so, awesome)

I got a small error when trying to push a change, though:

Screenshot 2022-12-12 at 11 12 58

I got no snackbar, so I presume the change wasn't pushed. Was just trying to set all-caps on a navigation menu inside a template part:
Screenshot 2022-12-12 at 11 14 46

Two more questions:

  • Can the "Push to global styles" button be grayed until a change is ready to be pushed? And can it become grayed again once pushed?
  • Can this button be present also in the post editor?

@noisysocks
Copy link
Member

Nice, this seems remarkably close! As I understand, the button in advanced does this:

  • Moves the unique style change to being a global styles > block change
  • Queues up "Custom styles" for multi entity saving
  • Fires a snackbar

Is that correct? (If so, awesome)

Yeah that's right. To clarify on the first point: it resets any style changes made to the block (same as the Reset button in ToolsPanel does) and then makes those same changes to the block type (e.g. Heading) in Global Styles.

I got a small error when trying to push a change, though:

Will look into it. This was a pretty rough attempt so not surprising there are bugs 😀

  • Can the "Push to global styles" button be grayed until a change is ready to be pushed? And can it become grayed again once pushed?
  • Can this button be present also in the post editor?

Sure, will look into it.

@annezazu annezazu mentioned this pull request Dec 13, 2022
57 tasks
@jasmussen
Copy link
Contributor

To clarify on the first point: it resets any style changes made to the block (same as the Reset button in ToolsPanel does) and then makes those same changes to the block type (e.g. Heading) in Global Styles.

👌

@noisysocks
Copy link
Member

noisysocks commented Dec 15, 2022

  • Can this button be present also in the post editor?

I looked into this. Functionally, it works fine using the post editor's existing multi-entity save flow. One caveat is that it's a little strange that after pushing you won't be able to see those pushed changes in Global Styles because the post editor doesn't have the Global Styles panel. Maybe not a big deal—we could look at linking to the site editor.

Technically speaking it's not a small task as as we have to move a few bits of @wordpress/edit-site to other places that can be used by @wordpress/edit-post:

  • Add @wordpress/style-engine as a dependency to @wordpress/edit-post
  • getSupportedGlobalStylesPanels@wordpress/blocks or @wordpress/style-engine
  • GlobalStylesContext and/or useGlobalStylesUserConfig@wordpress/core-data
  • STYLE_PATH_TO_CSS_VAR_INFIX and STYLE_PATH_TO_PRESET_BLOCK_ATTRIBUTE@wordpress/blocks, maybe

All achievable but something that I'd prefer to do in a follow-up PR as it requires careful consideration.

@noisysocks noisysocks changed the title Global styles: push local block styles to global block styles Site Editor: Add new 'Push changes to Global Styles' button Dec 15, 2022
@noisysocks noisysocks added [Type] Feature New feature to highlight in changelogs. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Dec 15, 2022
@noisysocks
Copy link
Member

noisysocks commented Dec 15, 2022

OK think this is ready for a proper review now. I updated the PR description with more details and added a basic E2E test since these sorts of features tend to attract regressions as they're not super visible.

@noisysocks noisysocks marked this pull request as ready for review December 15, 2022 06:29
@jasmussen
Copy link
Contributor

I don't think pushing styles in the post editor needs to block this PR, but it would be nice to have it in both, simply so you don't have to wonder why it's missing in one place. It also seems fine that there isn't necerssarily a preview; a) this is an advanced feature, and b) I think we can have previews in the multi entity saving flow in the future, which would likely benefit theme switching as well.

As far as sharing code between the editors, it really would be nice if that were simpler. Conceptually they are mostly the same.

@noisysocks
Copy link
Member

I promise we'll circle back to the post editor @jasmussen! 😀

…set is selected. Getting a few Uncaught SyntaxError: "undefined" is not valid JSON for this function.
Copy link
Member Author

@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.

Great work! 🙇

Pushing block styles to global is working pretty well for me. So too is the "undo" button in the notification.

One thing I noticed is that resetting styles doesn't work reliably.

2022-12-16.12.18.08.mp4

I rebased to include the change in #46486, but still couldn't crack it.

I think it might be related to #46505. If so, then it's in trunk, and can be addressed separately.

It only stands out in this particular feature because I wanted to reset the block styles that I'd pushed (and saved). 🤷

package-lock.json Outdated Show resolved Hide resolved
disabled={ changes.length === 0 }
onClick={ pushChanges }
>
{ __( 'Push changes to Global Styles' ) }
Copy link
Member Author

Choose a reason for hiding this comment

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

Not a showstopper, just asking:

Is "Global Styles" a term that we use in the editor? Would something like Apply styles globally communicate what we want to say?

Copy link
Member

Choose a reason for hiding this comment

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

You're right, we don't call it Global Styles anywhere in the UI. How about "Apply styles to all Heading blocks"? (or "Move"?)

Copy link
Member Author

Choose a reason for hiding this comment

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

Sounds grand.

I tried it out and we might need to adjust white space for some block names (taking into account i18n as well)

Screen Shot 2022-12-16 at 12 56 25 pm

The following has, for example:

    white-space: normal;
    padding: $grid-unit-10;
    height: auto;

Screen Shot 2022-12-16 at 12 58 16 pm

Copy link
Member

Choose a reason for hiding this comment

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

Hmmm it's so long, looks a bit ridiculous 😅

Other options:

Push changes to Styles (technically this is what we call Global Styles)
Push styles
Apply styles globally

Copy link
Member

Choose a reason for hiding this comment

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

How about we make @jasmussen and @jameskoster decide? 😛

Copy link
Member Author

Choose a reason for hiding this comment

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

How about we make @jasmussen and @jameskoster decide? 😛

Delegate. I like it.

@noisysocks
Copy link
Member

I think it might be related to #46505. If so, then it's in trunk, and can be addressed separately.

Agreed, looks like the same issue.

@ramonjd
Copy link
Member Author

ramonjd commented Dec 16, 2022

LGTM

Let's iron out copy and reset stuff in a follow up

@noisysocks noisysocks enabled auto-merge (squash) December 16, 2022 02:16
@noisysocks noisysocks merged commit 6d9b0b6 into trunk Dec 16, 2022
@noisysocks noisysocks deleted the try/push-changes-to-global-styles branch December 16, 2022 02:43
@github-actions github-actions bot added this to the Gutenberg 14.9 milestone Dec 16, 2022
@dsas
Copy link
Contributor

dsas commented Jan 3, 2023

Let's iron out copy and reset stuff in a follow up

Is there a follow-up issue for this already?

I've been testing this on 14.9.0-rc1 and was pretty confused by this. I pressed 'Push changes to Global Styles' and a toaster said it had been pushed but when I looked at the site nothing had changed. Going back to the editor the button was still active, as if it hadn't worked.

It took me five minutes to realise that 'Push changes to Global Styles' was only updating the editor state, and not actually saving anything. The button looks a bit like the save button and pushing sounds a bit like saving (to me who git pushes stuff all of the time at least).

@noisysocks
Copy link
Member

Thanks for the feedback @dsas! Pinging @jasmussen in case it sparks any ideas for improving the UI.

There is no follow up issue for this but it is something I intend on iterating on now that am back from holidays.

@andrewserong
Copy link
Contributor

@noisysocks apologies I missed the discussion here, but there was another issue opened up over in #46928 about the naming for the button, and I've got a tiny PR up in #46965 to take a look at a small bit of renaming.

Comment on lines +53 to +55
function cloneDeep( object ) {
return ! object ? {} : JSON.parse( JSON.stringify( object ) );
}
Copy link
Member

Choose a reason for hiding this comment

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

I came across this code while testing a different PR.

@tyxla, if I recall correctly, we already have a similar utility method. Maybe we should use it here as well.

Copy link
Member

Choose a reason for hiding this comment

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

Thanks for the reminder @Mamaduka!

This is going to be addressed soon as part of the Lodash removal. Instead of the set() usages I'm planning to use setImmutably() which already clones the object anyway, so there may be no need to clone it additionally.

Copy link
Member

Choose a reason for hiding this comment

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

I had a feeling you already had a plan for this :)

Copy link
Member

Choose a reason for hiding this comment

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

Sure thing! Besides #52278 and #52279 it's the last unaddressed usage of _.set()!

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 Needs User Documentation Needs new user documentation [Type] Feature New feature to highlight in changelogs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Make it possible to push local block styles to global block styles
8 participants