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

Allow layout controls to be disabled per block from theme.json #53378

Merged
merged 3 commits into from
Aug 9, 2023

Conversation

tellthemachines
Copy link
Contributor

What?

Fixes #47807.

Thinking better about this I'm not sure it should be possible to enable the controls from theme.json as even if the block supports layout already (say Columns or Gallery, which support layout but have controls hidden) it might not work well with the layout controls.

Testing Instructions

  1. in theme.json, add e.g.:
"settings": {
    "blocks": {
        "core/buttons": {
            "layout": false
        {
    { 
{

2.Add a Buttons block in the editor and check that no layout controls display in the sidebar.

Testing Instructions for Keyboard

Screenshots or screencast

@tellthemachines tellthemachines added [Type] Enhancement A suggestion for improvement. [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. [Feature] Layout Layout block support, its UI controls, and style output. labels Aug 7, 2023
@tellthemachines tellthemachines self-assigned this Aug 7, 2023
@github-actions
Copy link

github-actions bot commented Aug 7, 2023

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ lib/class-wp-theme-json-gutenberg.php

@@ -415,6 +415,7 @@ class WP_Theme_JSON_Gutenberg {
'writingMode' => null,
),
'behaviors' => null,
'layout' => null,
Copy link
Contributor

@andrewserong andrewserong Aug 7, 2023

Choose a reason for hiding this comment

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

Layout already exists further up in this array, so I think this line will override that earlier entry?

Does layout need to be null at the root of this array to support it being set to false?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If it's not in there it won't show up in the settings coming from theme.json, and when we get here the path is empty.

I don't think we have any other block supports that can be fully disabled by setting the whole thing to false but it would be a desirable feature to have for locking down style editing. Perhaps this needs to be looked at more holistically.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Do we know what overriding the earlier entry breaks for that matter? Content and wide sizes still seem to work for me locally 😅

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah, gotcha!

Do we know what overriding the earlier entry breaks for that matter? Content and wide sizes still seem to work for me locally 😅

I don't think it'll break anything, as far as I'm aware. Just that now anything within layout will be treated as a valid setting (not just contentSize and wideSize). So long as the rest of our code is okay with that, I think that'll be okay, but it could be good to double check with folks that might have a deeper understanding of how this works. I'll just ping @oandregal in case he has any opinions when it comes to the settings.

In terms of this PR, I think it means we could likely keep the 'layout' => null, but we can also remove the above layout => contentSize, wideSize entry, since it gets overridden by the time the code executes? Here's what it's logging out for me (a single layout => null entry):

image

Copy link
Member

Choose a reason for hiding this comment

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

I don't think we have any other block supports that can be fully disabled by setting the whole thing to false but it would be a desirable feature to have for locking down style editing. Perhaps this needs to be looked at more holistically.

Actually, locking down styles was the first thing that theme.json settings supported 😀 Examples are color.custom (disables custom color for users) or typography.custom (disables custom typographies for users).

useSetting was created to abstract all the places where this info can be sourced from: a block ancestor, the own block instance, settings (merged theme.json), etc.

So, instead of creating a new key and accessing it directly, the recommended way would be using a sub-key of the existing layout key + accessing it via useSetting.

Copy link
Contributor

Choose a reason for hiding this comment

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

If we do go with enabled though, would it make sense as a global switch for other supports too? I think ideally they all should have a similar API.

Agreed, it'd be good to ensure whichever way we go, that it's consistent. As you mention, it could be quite handy for a theme to be able to disable a whole set of controls such as color. Also, it'd mean they could do that without worrying that in a subsequent release there might be additional controls added, which is often the case with typography, which keeps getting more features added.

I quite like enabled as a subkey for each block support, since it makes it explicit what's being set to false, however this is also a good point from Ramon:

A flag like enabled appears good: what does "enabled" mean though? Does it only relate to controls while keeping layout support (wide/content sizes) via theme.json?

If we like the idea of enabled, would it be worth implementing it across the board as a proposed shape for the API. That way, if it's documented in a consistent way for block supports, maybe that might help alleviate some potential confusion?

Copy link
Contributor

@andrewserong andrewserong Aug 8, 2023

Choose a reason for hiding this comment

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

If we went with it for layout, maybe allowEditing could be added to other support types too?

Oh, I like it too! It's more specific than enabled

Copy link
Member

Choose a reason for hiding this comment

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

Sure, but there isn't a one-liner that removes a support altogether for a given block.

Ah, I see. I misunderstood. The point of using layout: false was intentional (not because you were unable to use a subkey). I like that approach, it's simple. However, it's problematic for supports that define presets. If we expand the same idea to color or typography we have:

{
  "settings": {
    "color": false,
    "typography": false
  }
}

And then, how would we define the color.palette or typography.fontSizes if we depend on the top-level key to be false to disable "all the features" of that block support?

Copy link
Member

@oandregal oandregal Aug 8, 2023

Choose a reason for hiding this comment

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

Now that I understood the problem space you are exploring 😅 I remembered that there's an issue/PR somewhere that discussed the introduction of showInUI (perhaps a better name than enabled, though I personally like allowEditing more). The idea was similar to this: the features work, but are not shown in the UI.

We discussed making it a boolean, but also the ability to enable/disable features per editor, as in:

{
  "settings": {
    "layout": {
      "showInUI": [ "siteEditor" ]
    },
    "color": {
      "showInUI": [ "postEditor", "siteEditor" ]
    }
  }
}

I'm not sure how much appetite there is for this now that most of the tools can be locked down already (not via single switch, though). Back then, the rationale that supported introducing such a flag was that agencies/admins/etc. could be interested in doing it for an individual post while maintaining them enabled site-wide. Though a boolean to lock them in all would still be useful, so it doesn't hurt starting that way. Making the flag "future-proof" (meaning it'll affect all new features introduced in the future) sounds appealing as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ooh interesting, I hadn't seen that work. Given that we seem to be moving in the direction of everything being editable through the site editor, it makes sense to start with a boolean; we can always revisit later.

@github-actions
Copy link

github-actions bot commented Aug 7, 2023

Size Change: +322 B (0%)

Total Size: 1.44 MB

Filename Size Change
build/block-editor/index.min.js 210 kB +166 B (0%)
build/block-editor/style-rtl.css 14.8 kB +1 B (0%)
build/block-editor/style.css 14.8 kB -1 B (0%)
build/block-library/blocks/columns/style-rtl.css 421 B +12 B (+3%)
build/block-library/blocks/columns/style.css 421 B +12 B (+3%)
build/block-library/blocks/search/style-rtl.css 608 B +21 B (+4%)
build/block-library/blocks/search/style.css 608 B +24 B (+4%)
build/block-library/index.min.js 202 kB -75 B (0%)
build/block-library/style-rtl.css 13.7 kB +33 B (0%)
build/block-library/style.css 13.8 kB +33 B (0%)
build/components/index.min.js 244 kB +10 B (0%)
build/core-commands/index.min.js 2.44 kB +4 B (0%)
build/edit-post/index.min.js 35.7 kB +65 B (0%)
build/edit-post/style-rtl.css 7.59 kB +11 B (0%)
build/edit-post/style.css 7.59 kB +10 B (0%)
build/edit-site/index.min.js 90.4 kB +18 B (0%)
build/edit-site/style-rtl.css 13.2 kB +7 B (0%)
build/edit-site/style.css 13.2 kB +7 B (0%)
build/edit-widgets/style-rtl.css 4.53 kB +4 B (0%)
build/edit-widgets/style.css 4.53 kB +5 B (0%)
build/editor/index.min.js 45.3 kB -45 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 6.99 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.26 kB
build/block-editor/content.css 4.25 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 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 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 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/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 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 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 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 336 B
build/block-library/blocks/html/editor.css 337 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 1.42 kB
build/block-library/blocks/image/style.css 1.42 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.46 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 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 712 B
build/block-library/blocks/navigation-link/editor.css 711 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 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 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 319 B
build/block-library/blocks/post-featured-image/style.css 319 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 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 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 302 B
build/block-library/blocks/query-pagination/style.css 299 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/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 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 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 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.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 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 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 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/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51 kB
build/commands/index.min.js 15.3 kB
build/commands/style-rtl.css 849 B
build/commands/style.css 843 B
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-data/index.min.js 16.4 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.28 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-widgets/index.min.js 16.9 kB
build/editor/style-rtl.css 3.55 kB
build/editor/style.css 3.55 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.59 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 10.4 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.18 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 951 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.71 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.83 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 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 958 B
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Cool PR! This is testing pretty well for me, for switching off controls for individual blocks, and I like how simple the approach is, too 👍

While testing this out, it raised a couple of questions / thoughts for me, when it comes to exposing the root of the layout object (layout) as being able to be set to false:

  • For other block supports, such as spacing, folks set individual properties to false rather than the whole thing. If they want to disable all controls, they'd do it one-by-one, by setting spacing.margin, spacing.padding, and spacing.blockGap to false. Would it be worth trying a similar granular approach to layout here? I was mostly thinking of this because:
  • Setting the group block to layout: false mostly works, as folks can still transform between Row/Stack/Group, but I could imagine folks reaching for this setting primarily because they want to remove the custom content/wide size input fields, but still allow Row and Stack to have orientation controls.
  • Setting layout to false at the root of theme.json switches off the contentSize and wideSize values, so it isn't possible to switch off layout controls altogether across blocks without affecting the site's styling in the way that you can switch off padding or margin across a site.

Overall, I like the idea of the simplicity of setting a particular block to switch off the layout controls, though. And nothing about exposing false here precludes exploring individual feature-based false options in follow-ups 👍

I think my only real concerns are whether the behaviour at the root of theme.json is expected (settings.layout being set to false), and the question of changing the value in VALID_SETTINGS and whether that's safe. Otherwise, I think this is looking good!

Oh, one last thing: looks like we'll want to update the schema to reflect the new allowed values, too:

image

@tellthemachines
Copy link
Contributor Author

Great thoughts @andrewserong !

I could imagine folks reaching for this setting primarily because they want to remove the custom content/wide size input fields

This might be solved once the layout controls are redesigned, as those inputs will lose prominence.

Setting layout to false at the root of theme.json switches off the contentSize and wideSize values, so it isn't possible to switch off layout controls altogether across blocks without affecting the site's styling

I'm feeling increasingly uncomfortable with how global contentSize and wideSize are coupled with layout 😅 might be good to explore some other options here.

@tellthemachines
Copy link
Contributor Author

Thanks for the feedback everyone! I've updated to use "allowEditing" to switch off controls.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Sounds like we all like the allowEditing prop as a name, and the idea of starting with using it as a boolean 👍

This is all testing well for me:

✅ Can set to false at the block level in theme.json
✅ Can set to false at the root layout level in theme.json without affecting contentSize and wideSize values
✅ Block level in theme.json correctly overrides root layout level in theme.json
✅ Block level in theme.json cannot override false value set in a block's block.json (i.e. you can't turn editing on for the Columns block)

All LGTM! ✨

Shall we also update the theme.json schema for this new prop, or leave it for another PR?

"settingsPropertiesLayout": {

'wideSize' => null,
'contentSize' => null,
'wideSize' => null,
'allowEditing' => null,
Copy link
Contributor

Choose a reason for hiding this comment

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

Doesn't need to happen in this PR, but should we add a @since 6.4.0 line in the doc comment above this const?

@ramonjd
Copy link
Member

ramonjd commented Aug 9, 2023

Should we also update the theme.json schema? I'm looking at "settingsPropertiesLayout", which I think is shared by "settings.blocks[blockName].layout".

@tellthemachines
Copy link
Contributor Author

Dev note

Disable layout controls from theme.json

It is now possible to disable layout controls globally for all blocks or on a per-block level from theme.json. This ensures that affected blocks still output their default layout styles, but the controls to edit them won't be available in the block sidebar.

In order to disable the controls for all blocks, "allowEditing": false should be added to settings.layout, like so:

"settings": {
    "layout": {
        "allowEditing": false
    }
}

To disable the controls for individual blocks, add "allowEditing": false in settings.blocks.[block name].layout, thus:

"settings": {
    "blocks": {
        "core/cover": {
            "layout": {
                "allowEditing": false
            }
        }
    }
}

@colorful-tones
Copy link
Member

I'm not able to get this new functionality to work. I have WP 6.4 RC-1 with Gutenberg 16.8.1. I've created a child theme of Twenty Twenty-Four and here is the theme.json

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"settings": {
		"blocks": {
			"core/group": {
				"layout": {
					"allowEditing": false
				}
			}
		}
	}
}

I add a Group block in a new Post/Page and I can choose from: None, Wide Width and Full Width, which indicated to me this behavior is not functioning correctly in a child theme.

I've also tried activating Twenty Twenty-Four theme (non-child) and placing the exact same code (above) within and I still have options for None, Wide Align and Full Width.

I suspect there is key information missing from the Dev Notes in giving context to how this feature is expected to behave, which will likely cause users to misinterpret or feel failed when attempting to leverage.

@fabiankaegy
Copy link
Member

fabiankaegy commented Oct 18, 2023

@colorful-tones The layout options this is intended to remove are these here in the Sidebar:

CleanShot 2023-10-18 at 18 00 35@2x

CleanShot 2023-10-18 at 18 01 42@2x

Not the alignment options

@colorful-tones
Copy link
Member

Awesome, thanks @fabiankaegy . I hope that additional clarification makes it into the final Dev Note, because it has potential to cause confusion.

@colorful-tones
Copy link
Member

Even just including your wonderful screenshot could help. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Layout Layout block support, its UI controls, and style output. [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Allow enabling and disabling Layout at block level in theme.json
7 participants