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

i18n: Add pattern block #33217

Merged
merged 29 commits into from
Oct 29, 2021
Merged

i18n: Add pattern block #33217

merged 29 commits into from
Oct 29, 2021

Conversation

scruffian
Copy link
Contributor

@scruffian scruffian commented Jul 6, 2021

Description

This PR is a proposal to add a pattern block. This will enable block theme developers to do a few things inside their templates:

For more context, see #33192 (comment). This is another approach to that PR.

How has this been tested?

Screenshots

Kapture.2021-10-07.at.14.42.47.mp4

Types of changes

New feature (non-breaking change which adds functionality)

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@scruffian scruffian added the Internationalization (i18n) Issues or PRs related to internationalization efforts label Jul 6, 2021
@scruffian scruffian self-assigned this Jul 6, 2021
@github-actions
Copy link

github-actions bot commented Jul 6, 2021

Size Change: +272 B (0%)

Total Size: 1.08 MB

Filename Size Change
build/block-library/index.min.js 154 kB +272 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 135 kB
build/block-editor/style-rtl.css 14 kB
build/block-editor/style.css 14 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 309 B
build/block-library/blocks/buttons/editor.css 309 B
build/block-library/blocks/buttons/style-rtl.css 317 B
build/block-library/blocks/buttons/style.css 317 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 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 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 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 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 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 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 642 B
build/block-library/blocks/navigation-link/editor.css 642 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.81 kB
build/block-library/blocks/navigation/editor.css 1.81 kB
build/block-library/blocks/navigation/style-rtl.css 1.71 kB
build/block-library/blocks/navigation/style.css 1.7 kB
build/block-library/blocks/navigation/view.min.js 2.74 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 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 347 B
build/block-library/blocks/post-comments-form/style.css 347 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 B
build/block-library/blocks/post-content/style-rtl.css 56 B
build/block-library/blocks/post-content/style.css 56 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 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 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 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 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 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 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 770 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 824 B
build/block-library/blocks/social-links/editor.css 823 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/editor-rtl.css 9.78 kB
build/block-library/editor.css 9.78 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.5 kB
build/block-library/style.css 10.6 kB
build/block-library/theme-rtl.css 668 B
build/block-library/theme.css 673 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46 kB
build/components/index.min.js 212 kB
build/components/style-rtl.css 15.4 kB
build/components/style.css 15.4 kB
build/compose/index.min.js 10.9 kB
build/core-data/index.min.js 12.6 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.44 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.4 kB
build/edit-post/style-rtl.css 7.12 kB
build/edit-post/style.css 7.12 kB
build/edit-site/index.min.js 30.7 kB
build/edit-site/style-rtl.css 5.79 kB
build/edit-site/style.css 5.79 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.21 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.34 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@scruffian
Copy link
Contributor Author

I updated this as suggested by @mcsf. I'd love to get more thoughts on it.

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

I think the approach is valid, but others feel free to weigh in.

packages/block-library/src/pattern/block.json Outdated Show resolved Hide resolved
packages/block-library/src/pattern/block.json Outdated Show resolved Hide resolved
packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/index.php Outdated Show resolved Hide resolved
@mtias mtias added the Needs Technical Feedback Needs testing from a developer perspective. label Jul 16, 2021
@mcsf
Copy link
Contributor

mcsf commented Jul 16, 2021

A few things I think are needed:

  • The Pattern block should be just a stand-in for a pattern. This means that it's not a container for patterns. The corollaries are:
    • Like a Reusable Block, its only possible form is that of an empty dynamic block: <!-- wp:pattern {"slug":"..."} --/>.
    • On the client, the whole block should be replaced with the pattern: replaceInnerBlocks becomes replaceBlock.
  • The above is the minimum viable. A step up would be to only trigger the replacement — i.e. to serialise the pattern into the saved template — when the content is manipulated by the user. This can quickly get messy though, so maybe it's more efficient to focus on the saving experience:
    • Because the Pattern block comes with a side effect (currently it's replaceInnerBlocks, but the same applies with replaceBlock), the Site Editor automatically enters a dirty state when we open a template that contains a Pattern block. I haven't tried this, but it may be enough to carefully call the __unstableMarkNextChangeAsNotPersistent action before replaceBlock.
    • If that's not enough, it may be necessary to equip the Pattern block with the means to render a preview of the pattern without actually making changes to the template — and then only when the user interacts with the block do we call replaceBlock.

@scruffian
Copy link
Contributor Author

scruffian commented Jul 21, 2021

Thanks for the great feedback @mcsf. I updated this to do a couple of things:

  • When the block is initially loaded, we replace the InnerBlocks but we mark that change as not persistent
  • When the block (or any of its InnerBlocks) are selected, we replace the block with the InnerBlock and also mark that change as not persistent
  • Then when any further changes are made to these inner blocks they are saved - the wrapper has been removed in the previous step.

I'm not sure if this combination of replaceBlock and replaceInnerBlocks is the right tool for the job but when all you
have is a hammer... :)

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

It's remarkable how such a small amount of code gets us so far. This works reasonably, considering.

There is some potential for hiccoughs due to the way that an entire subtree of blocks can be silently swapped out upon user selection. For instance, if one has the List View enabled and uses it to select something inside the Pattern block, the async rendering creates a strange delayed effect — it doesn't break anything, it's just a little clunky to see. I don't think this is an issue in itself, but cc @youknowriad for good conscience. :)

Gravacao.do.ecra.2021-07-27.as.17.47.38.mov

Comment on lines 17 to 19
save: () => {
return <InnerBlocks.Content />;
},
Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks to the logic in PatternEdit to replace the block with its contents, I think we can remove save entirely.

As far as I can tell, there should never be a case where there are inner blocks to serialise for this block. I even think that allowing Pattern to serialise any kind of content here opens the door for bugs where the edit side wants to use the freshest pattern from __experimentalGetParsedPattern while save has saved something else to the database.

What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah that makes sense.

packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
@mcsf
Copy link
Contributor

mcsf commented Jul 27, 2021

@scruffian: don't forget to add fixtures for the block, per the failing integration tests.

@scruffian
Copy link
Contributor Author

I think I have addressed all the comments here, so this is ready for another review. Thanks again for looking...

@carolinan
Copy link
Contributor

Should the theme name (which is not a default theme either) be included in the fixtures?
I did not understand why a theme pattern and not a core pattern was used.

packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/pattern/index.php Outdated Show resolved Hide resolved
@@ -0,0 +1 @@
<!-- wp:pattern {"slug":"quadrat/search-results"} /-->
Copy link
Contributor

Choose a reason for hiding this comment

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

Could be twentytwenty?

packages/block-library/src/pattern/edit.js Outdated Show resolved Hide resolved
$slug = $attributes['slug'];
if ( class_exists( 'WP_Block_Patterns_Registry' ) && WP_Block_Patterns_Registry::get_instance()->is_registered( $slug ) ) {
$pattern = WP_Block_Patterns_Registry::get_instance()->get_registered( $slug );
return do_blocks( $pattern['content'] );
Copy link
Contributor

Choose a reason for hiding this comment

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

In the editor there's a "div" wrapper but there's none here, meaning that the "alignments" won't work the same way between the editor and the frontend. I think it's safer to add a wrapper here as well to unify both behaviors.

Copy link
Contributor

@youknowriad youknowriad Oct 7, 2021

Choose a reason for hiding this comment

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

Actually, wait here, I'm still forming some ideas on a related comment :)

Copy link
Contributor

Choose a reason for hiding this comment

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


// Run this effect when the block, or any of its InnerBlocks are selected.
// This replaces the Pattern block wrapper with the content of the pattern.
// This change won't be saved unless further changes are made to the InnerBlocks.
Copy link
Contributor

Choose a reason for hiding this comment

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

If the user changes something else in the template outside the pattern block, it will also save a "copy" of the pattern in the template and not reference the pattern anymore, is this intended?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's the way that patterns work in general, so I think yes.

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 misread you here, sorry. I think if the user changes the pattern then we should save a copy, but if they change other things in the template the pattern should still be loaded from the file.

}
}, [ selectedPattern?.blocks ] );

const props = useInnerBlocksProps( useBlockProps(), {} );
Copy link
Contributor

Choose a reason for hiding this comment

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

I am not sure if I implemented this correctly — does anything need to be supplied here?

Copy link
Member

Choose a reason for hiding this comment

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

I think props are optional.

@ZebulanStanphill
Copy link
Member

Doesn't converting the Pattern block to a Group change the front-end markup? Patterns (and Reusable Blocks) have no encompassing wrapper when rendered on the front-end. Any wrappers exist solely in the editor for the sake of marking the block boundaries. Or am I misunderstanding what's going on here?

@jffng
Copy link
Contributor

jffng commented Oct 28, 2021

Doesn't converting the Pattern block to a Group change the front-end markup? Patterns (and Reusable Blocks) have no encompassing wrapper when rendered on the front-end. Any wrappers exist solely in the editor for the sake of marking the block boundaries.

The markup structure is mirrored between the editor and front-end because the Pattern block's contents are output inside a wrapping div on the front-end:

return do_blocks( '<div>' . $pattern['content'] . '</div>' );

The Pattern block is only converted to a Group if edits are made to the Group or any of its inner blocks.

Does that help to clarify?

@ZebulanStanphill
Copy link
Member

@jffng Oh, interesting. That's good to know. I suspect the use of a plain <div> versus a Group (which has an additional wp-block-group CSS class) could cause styling inconsistencies, though.

$slug = $attributes['slug'];
if ( class_exists( 'WP_Block_Patterns_Registry' ) && WP_Block_Patterns_Registry::get_instance()->is_registered( $slug ) ) {
$pattern = WP_Block_Patterns_Registry::get_instance()->get_registered( $slug );
return do_blocks( '<div>' . $pattern['content'] . '</div>' );
Copy link
Member

Choose a reason for hiding this comment

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

To avoid styling inconsistencies when converting to a Group, perhaps we should add the Group block's CSS class here:

Suggested change
return do_blocks( '<div>' . $pattern['content'] . '</div>' );
return do_blocks( '<div class="wp-block-group">' . $pattern['content'] . '</div>' );

Copy link
Member

Choose a reason for hiding this comment

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

Technically it is not a Group block until it's converted. Not sure how semantic this would be.

Copy link
Contributor

Choose a reason for hiding this comment

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

Correct, it's not a Group until it's converted + edited, so I don't think we should add the group block CSS class here.

Copy link
Member

Choose a reason for hiding this comment

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

Could we make it render an actual Group block, though? In other words, would it be possible to generate and render an actual Group block on the front-end?

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes it's possible, an earlier iteration of the PR did that, but the feedback was given that a plain div is better / more semantic, since the Pattern block is not the same thing as a Group block.

This is an example of the default state (no edits made to the Pattern block's contents):

Site Editor View
Screen Shot 2021-10-28 at 3 33 25 PM Screen Shot 2021-10-28 at 3 35 08 PM

I do think it is a bit tricky to wrap the head around, but why would it make more sense to output a group on the front-end if the contents haven't been edited?

Copy link
Member

Choose a reason for hiding this comment

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

I've noticed some themes tend to target Group blocks with styles like additional padding/margin, which they don't apply to plain <div>s. In fact, I've even written Custom CSS like that within the past week or so.

If the Pattern block doesn't always output a Group, then editing it could cause a bunch of spacing to appear/disappear out of nowhere on some themes, which would be quite confusing for users.

Copy link
Member

Choose a reason for hiding this comment

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

And it's not just basic margin/padding, either. Some themes have special handling for Wide/Full block alignments when inside a Group versus not inside a Group, so this could cause some really bizarre layout shifts in those situations.

Copy link
Contributor

Choose a reason for hiding this comment

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

I've noticed some themes tend to target Group blocks with styles like additional padding/margin, which they don't apply to plain

s. In fact, I've even written Custom CSS like that within the past week or so

These seem like reasons for not rendering the Pattern inside a Group. I think the most likely scenario is for a user to not edit this block, since currently its main use cases for are string translation or including a dynamic URL inside templates. If it were wrapped inside a group by default, the risk of side effects from themes with CSS targeting Groups seems higher.

Open to other's reviewers perspectives here!

Copy link
Contributor

Choose a reason for hiding this comment

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

Also, this is all new (FSE themes) so we shouldn't base our decisions around practices in existing themes more about best practices.

I'm not sure styling raw groups is a good idea as Group block is meant to be just a div in its essence.

That said, I don't feel strongly here and I don't think it's that important either for a start. Feedback later will help us make the best decision.

@noisysocks
Copy link
Member

Let's merge this as a priority for WP 5.9 as it allows Twenty Twenty-one to work around #31815 and #36061 which are both important issues that need more thought and iteration.

@ndiego
Copy link
Member

ndiego commented Nov 2, 2021

Is there a definition of what a "Pattern block" is and/or any documentation on this yet? In skimming this PR, it appears that the Pattern block is designed purely for theme development and is not something that a user would actually insert into Block Editor. Is that correct?

@jffng
Copy link
Contributor

jffng commented Nov 2, 2021

Is there a definition of what a "Pattern block" is and/or any documentation on this yet?

Not yet, where should this go? Maybe in the Block Theme Overview?

In skimming this PR, it appears that the Pattern block is designed purely for theme development and is not something that a user would actually insert into Block Editor. Is that correct?

I think that's correct, inserting a pattern is still done via the pattern inserter. Knowing this, I think the block category should change to theme. I will open up a follow up PR and add some documentation.

@mtias
Copy link
Member

mtias commented Nov 22, 2021

@ndiego yes, currently themes can include patterns but they cannot directly use them in templates. This starts to pave the way for patterns and templates to be a more fluid system.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Internationalization (i18n) Issues or PRs related to internationalization efforts Needs Technical Feedback Needs testing from a developer perspective.
Projects
None yet
Development

Successfully merging this pull request may close these issues.