Skip to content

Allow adding "content" role blocks to containers that also have a "content" role in write mode#71232

Merged
tellthemachines merged 20 commits intotrunkfrom
fix/nested-content-only-blocks
Sep 1, 2025
Merged

Allow adding "content" role blocks to containers that also have a "content" role in write mode#71232
tellthemachines merged 20 commits intotrunkfrom
fix/nested-content-only-blocks

Conversation

@tellthemachines
Copy link
Copy Markdown
Contributor

@tellthemachines tellthemachines commented Aug 18, 2025

What?

Addresses part of #71202.

This PR adds some logic to canInsertBlockTypeUnmemoized and canRemoveBlock to:

  • Allow adding "content" role blocks to containers that also have a "content" role in write mode;

It also updates block actions to make the options to remove, duplicate, add before, etc appear more consistently (or not appear).

Also, in order to get Gallery to work with the above rules, I added a "content" role to its caption attribute (which I think makes sense to have anyway).

This doesn't address the Buttons block, which doesn't have any "content" role in its attributes. Should it?
Should the existence of a "content" role be the guiding principle here? I think it makes sense because usually the blocks we'll want to edit in write mode are content blocks. I also like the idea of using an existing, semantically appropriate, attribute to make this work, instead of adding a new one, because it will likely provide better out of the box support for third party blocks.

This PR also doesn't address the issue of any blocks being insertable at root level (whether that be the template root or the 'main' element). That problem is complicated by the close relationship between write mode and zoom out (where it is desirable to be able to insert some blocks at root level).

Testing Instructions

  1. In design mode, add a List block and a Gallery block anywhere in the template.
  2. Switch back to write mode. It should be possible to add new items to the List and to the Gallery.
  3. "Options" in List item and Image children of those blocks should allow duplicating/adding/deleting.
  4. It should be possible to add any content blocks inside a content container such as Quote and Details.
  5. It should be possible to add any type of block or pattern to the section root.
  6. It should not be possible to add blocks to a Group block unless it's the section root block.

@tellthemachines tellthemachines self-assigned this Aug 18, 2025
@tellthemachines tellthemachines added [Type] Bug An existing feature does not function as intended [Feature] Write mode labels Aug 18, 2025
@tellthemachines tellthemachines requested review from talldan and removed request for ellatrix August 18, 2025 01:39
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Aug 18, 2025

Size Change: +152 B (+0.01%)

Total Size: 1.92 MB

Filename Size Change
build/block-editor/index.min.js 266 kB +150 B (+0.06%)
build/block-library/index.min.js 233 kB +2 B (0%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/accordion/view.min.js 427 B
build-module/block-library/file/view.min.js 466 B
build-module/block-library/form/view.min.js 533 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.19 kB
build-module/block-library/query/view.min.js 767 B
build-module/block-library/search/view.min.js 639 B
build-module/interactivity-router/full-page.min.js 565 B
build-module/interactivity-router/index.min.js 11.4 kB
build-module/interactivity/debug.min.js 17.6 kB
build-module/interactivity/index.min.js 14 kB
build/a11y/index.min.js 925 B
build/annotations/index.min.js 2.13 kB
build/api-fetch/index.min.js 2.4 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.18 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/content-rtl.css 4.43 kB
build/block-editor/content.css 4.42 kB
build/block-editor/default-editor-styles-rtl.css 392 B
build/block-editor/default-editor-styles.css 392 B
build/block-editor/style-rtl.css 15.9 kB
build/block-editor/style.css 15.9 kB
build/block-library/blocks/accordion/style-rtl.css 593 B
build/block-library/blocks/accordion/style.css 592 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 61 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 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 554 B
build/block-library/blocks/button/style.css 554 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 349 B
build/block-library/blocks/buttons/style.css 349 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 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 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 139 B
build/block-library/blocks/code/style.css 139 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 191 B
build/block-library/blocks/comment-template/style.css 191 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 168 B
build/block-library/blocks/comments-pagination/editor.css 168 B
build/block-library/blocks/comments-pagination/style-rtl.css 201 B
build/block-library/blocks/comments-pagination/style.css 201 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 842 B
build/block-library/blocks/comments/editor.css 842 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 637 B
build/block-library/blocks/cover/editor-rtl.css 631 B
build/block-library/blocks/cover/editor.css 631 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 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 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 278 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 349 B
build/block-library/blocks/form-input/style.css 349 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/freeform/editor-rtl.css 2.59 kB
build/block-library/blocks/freeform/editor.css 2.59 kB
build/block-library/blocks/gallery/editor-rtl.css 615 B
build/block-library/blocks/gallery/editor.css 616 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.83 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 334 B
build/block-library/blocks/group/editor.css 334 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 353 B
build/block-library/blocks/html/editor.css 354 B
build/block-library/blocks/image/editor-rtl.css 763 B
build/block-library/blocks/image/editor.css 763 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 139 B
build/block-library/blocks/latest-posts/editor.css 138 B
build/block-library/blocks/latest-posts/style-rtl.css 520 B
build/block-library/blocks/latest-posts/style.css 520 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 543 B
build/block-library/blocks/media-text/style.css 542 B
build/block-library/blocks/more/editor-rtl.css 393 B
build/block-library/blocks/more/editor.css 393 B
build/block-library/blocks/navigation-link/editor-rtl.css 566 B
build/block-library/blocks/navigation-link/editor.css 568 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.23 kB
build/block-library/blocks/navigation/editor.css 2.24 kB
build/block-library/blocks/navigation/style-rtl.css 2.27 kB
build/block-library/blocks/navigation/style.css 2.26 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 356 B
build/block-library/blocks/page-list/editor.css 356 B
build/block-library/blocks/page-list/style-rtl.css 192 B
build/block-library/blocks/page-list/style.css 192 B
build/block-library/blocks/paragraph/editor-rtl.css 251 B
build/block-library/blocks/paragraph/editor.css 251 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 B
build/block-library/blocks/post-comments-count/style-rtl.css 72 B
build/block-library/blocks/post-comments-count/style.css 72 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 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-comments-link/style-rtl.css 71 B
build/block-library/blocks/post-comments-link/style.css 71 B
build/block-library/blocks/post-content/style-rtl.css 61 B
build/block-library/blocks/post-content/style.css 61 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 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 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 715 B
build/block-library/blocks/post-featured-image/editor.css 712 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/style-rtl.css 414 B
build/block-library/blocks/post-template/style.css 414 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 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 162 B
build/block-library/blocks/post-title/style.css 162 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 133 B
build/block-library/blocks/pullquote/editor.css 133 B
build/block-library/blocks/pullquote/style-rtl.css 365 B
build/block-library/blocks/pullquote/style.css 365 B
build/block-library/blocks/pullquote/theme-rtl.css 176 B
build/block-library/blocks/pullquote/theme.css 176 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query-total/style-rtl.css 64 B
build/block-library/blocks/query-total/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 432 B
build/block-library/blocks/query/editor.css 432 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 131 B
build/block-library/blocks/read-more/style.css 131 B
build/block-library/blocks/rss/editor-rtl.css 126 B
build/block-library/blocks/rss/editor.css 126 B
build/block-library/blocks/rss/style-rtl.css 284 B
build/block-library/blocks/rss/style.css 283 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 674 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 773 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-link/editor-rtl.css 314 B
build/block-library/blocks/social-link/editor.css 314 B
build/block-library/blocks/social-links/editor-rtl.css 339 B
build/block-library/blocks/social-links/editor.css 338 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.51 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 92 B
build/block-library/blocks/tag-cloud/editor.css 92 B
build/block-library/blocks/tag-cloud/style-rtl.css 248 B
build/block-library/blocks/tag-cloud/style.css 248 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 413 B
build/block-library/blocks/video/editor.css 414 B
build/block-library/blocks/video/style-rtl.css 202 B
build/block-library/blocks/video/style.css 202 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.08 kB
build/block-library/common.css 1.08 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.4 kB
build/block-library/editor.css 11.4 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 15.4 kB
build/block-library/style.css 15.4 kB
build/block-library/theme-rtl.css 715 B
build/block-library/theme.css 719 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 52.6 kB
build/commands/index.min.js 16.3 kB
build/commands/style-rtl.css 956 B
build/commands/style.css 953 B
build/components/index.min.js 250 kB
build/components/style-rtl.css 13.7 kB
build/components/style.css 13.7 kB
build/compose/index.min.js 12.8 kB
build/core-commands/index.min.js 3.64 kB
build/core-data/index.min.js 74.9 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.43 kB
build/customize-widgets/style.css 1.43 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.67 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 577 B
build/edit-post/classic.css 578 B
build/edit-post/index.min.js 13.3 kB
build/edit-post/style-rtl.css 2.69 kB
build/edit-post/style.css 2.69 kB
build/edit-site/index.min.js 236 kB
build/edit-site/posts-rtl.css 8.85 kB
build/edit-site/posts.css 8.86 kB
build/edit-site/style-rtl.css 14.9 kB
build/edit-site/style.css 15 kB
build/edit-widgets/index.min.js 17.8 kB
build/edit-widgets/style-rtl.css 4.05 kB
build/edit-widgets/style.css 4.06 kB
build/editor/index.min.js 127 kB
build/editor/style-rtl.css 9.2 kB
build/editor/style.css 9.21 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.23 kB
build/format-library/style-rtl.css 472 B
build/format-library/style.css 472 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 467 B
build/i18n/index.min.js 2.23 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 847 B
build/list-reusable-blocks/style.css 848 B
build/media-utils/index.min.js 3.69 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 767 B
build/nux/style.css 763 B
build/patterns/index.min.js 7.36 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.86 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 562 B
build/preferences/style.css 562 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 978 B
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.53 kB
build/reusable-blocks/style-rtl.css 255 B
build/reusable-blocks/style.css 255 B
build/rich-text/index.min.js 12.2 kB
build/router/index.min.js 5.44 kB
build/server-side-render/index.min.js 1.6 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.97 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 556 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/vips/index.min.js 36.2 kB
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.16 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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Aug 18, 2025

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

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

@talldan
Copy link
Copy Markdown
Contributor

talldan commented Aug 18, 2025

I think Quote should allow some interaction in Write Mode. Updating the citation to the quote is an example. Updating the background of cover possibly too.

I think the root cause of the bug is the same as #67408, while a parent block can be set to the contentOnly block editing mode, there's no way to then control the block list of that block and prevent insertion, moving, or removal of blocks.

There was a PR that tried to fix the issue - Fix: Block Movers appear when content block is immediate child of a section., but it caused a bug with the 'Show Template' option when editing posts/pages. I haven't checked the latest changes in that PR.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Aug 18, 2025

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

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

Co-authored-by: tellthemachines <isabel_brison@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: jeryj <jeryj@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: talldan <talldanwp@git.wordpress.org>

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

@tellthemachines
Copy link
Copy Markdown
Contributor Author

There was a PR that tried to fix the issue - Fix: Block Movers appear when content block is immediate child of a section., but it caused a bug with the 'Show Template' option when editing posts/pages. I haven't checked the latest changes in that PR.

That PR doesn't seem to do anything. It's only checking templateLock so it won't apply to any block without a templateLock.

@talldan
Copy link
Copy Markdown
Contributor

talldan commented Aug 18, 2025

That PR doesn't seem to do anything. It's only checking templateLock so it won't apply to any block without a templateLock.

I personally don't think there's a way to solve the problem with the APIs currently available. 🤔

@tellthemachines tellthemachines force-pushed the fix/nested-content-only-blocks branch from 2a80f6c to 6baba67 Compare August 19, 2025 06:29
@tellthemachines tellthemachines requested a review from jeryj August 19, 2025 07:05
@tellthemachines
Copy link
Copy Markdown
Contributor Author

I've updated this to try something else that might allow us to support inserting new block in List and Gallery and such: checking whether the block is a content block and whether it has an allowedBlocks list.

I'm not sure whether this is the best approach for supporting this type of blocks. I added a content role for Gallery in a place where I think it makes sense to have one (the caption) but there doesn't seem to be any good place to add one to Buttons 😄

It seems like we're very much making up the rules here as we go along, and it would be good to have a more systematic approach but because there are so many edge cases it's hard to do so. For instance, Quote might be a good candidate for allowing to add more paragraphs, but it has become a generic container block and it doesn't seem a good idea to allow it to have all sorts of blocks added to it in write mode.

Anyway. Feedback much appreciated!

Comment on lines +1701 to +1700
const isContentOnlyNonRootBlock =
getBlockEditingMode( state, rootClientId ?? '' ) === 'contentOnly' &&
!! rootClientId;
if ( isContentOnlyNonRootBlock && ! isContentContainer ) {
return false;
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Maybe we should convert this into a single getBlockEditingMode call, above L1697.

@Mamaduka
Copy link
Copy Markdown
Member

Thanks for the ping, @tellthemachines!

Do we know if this is a recent regression? Can we add e2e test coverage?

Just a general note of caution: We should be careful when adding more logic to canInsertBlockTypeUnmemoized. It's been known for similar selectors to affect performance, since they might be called a lot.

@tellthemachines
Copy link
Copy Markdown
Contributor Author

Do we know if this is a recent regression? Can we add e2e test coverage?

I don't know! I just came across it while auditing blocks for #65778

Yes I'll add some tests! Also looks like the current e2e failure might be legit, I'll look into that too.

@tellthemachines tellthemachines force-pushed the fix/nested-content-only-blocks branch from fd39c6d to bfbba21 Compare August 21, 2025 05:41
@tellthemachines
Copy link
Copy Markdown
Contributor Author

tellthemachines commented Aug 21, 2025

So the e2e issue turned out to be due to one of the conditions I inserted to make nested containers uneditable catching the main element in zoom out mode, so that it became impossible to add blocks to it.

I'm not sure the solution I came up with is the best, but I think zoom out is only supposed to work within the main tag, so I added a check for whether the block we're trying to insert into is main or not.

Edit: looks like the unit tests are failing now, so there must be something wrong with this change too 😅

Comment on lines +1705 to +1708
// The "main" tag block is used by zoom out mode so it should be possible to insert
// blocks inside it.
const isRootBlockMain =
getBlock( state, rootClientId )?.attributes?.tagName === 'main';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would getSectionRootClientId() be useful here? It should return whatever we consider to be the top level content section that patterns get inserted into for Zoom Out

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yes, thanks, that worked! And it fixed the unit tests too 😊

Comment on lines +235 to +243
// Check client id of selected block and see whether it matches paragraphClientId
const getSelectedBlock = async () =>
await page.evaluate( () =>
window.wp.data
.select( 'core/block-editor' )
.getSelectedBlockClientId()
);

expect( await getSelectedBlock() ).toEqual( paragraphClientId );
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I understand this is from existing tests, but I think it's better to test user-visible behavior when possible. Besides the block editor and us devs one interacts with clientIds 😄

await expect( paragraph ).toBeFocused();
// Focused is probably the same as checking the selected class.
// await expect( paragraph ).toHaveClass( /is-selected/ );
await expect( paragraph ).toHaveText( 'Something' );

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

That's fair 😄 I'll update it!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It's not a blocker. I also don't mind updating the whole test suite in a follow-up.

@tellthemachines
Copy link
Copy Markdown
Contributor Author

Thanks for the reviews so far folks!

I improved the logic a bit to be more efficient with the selectors, and added some e2e tests.

Currently, this PR addresses:

  • Removing ability to add new blocks inside Quote, Details and Cover blocks in write mode;
  • Adding ability to add new items in List and Gallery blocks in write mode.

I'm updating the description to reflect what it does.

@talldan
Copy link
Copy Markdown
Contributor

talldan commented Aug 22, 2025

This tests well for me, apart from one bug that I found. With a list, you can indent list items, but it seems you can't unindent. We might need similar logic for removing/replacing blocks (I think the way it works is that it replaces a List block with a List Item block). I think I already mentioned somewhere about the Content panel not being ideal for showing the nesting of list blocks (screenshot is for a list that is indented twice):
Screenshot 2025-08-22 at 2 18 31 pm

Not sure if there are any small changes we can make to improve that, maybe showing only the top level list. It can also be a separate exploration given the feature is still experimental. I think it's already a bug to some extent - e.g. if the list was added in normal mode and then the user switched to write mode.

I wonder if the choice to make this work around allowedBlocks will scale well to every block. Have we checked other blocks types that use allowedBlocks to see how they work? Do we need to also check that the allowed block types are content blocks or is that already covered somehow?

@talldan
Copy link
Copy Markdown
Contributor

talldan commented Aug 22, 2025

With a list, you can indent list items, but it seems you can't unindent. We might need similar logic for removing/replacing blocks

Actually I think the PR doesn't allow removing list items or nested lists at all, but maybe that's the expected behavior and part of the iteration.

@tellthemachines
Copy link
Copy Markdown
Contributor Author

Actually I think the PR doesn't allow removing list items or nested lists at all, but maybe that's the expected behavior and part of the iteration.

I'm not sure if it is 😅

I can remove list items by deleting the text, but there's no "delete" button in the Options which maybe there should be?
The indented list question is interesting, because indented lists are essentially a new list block. If I'm not allowed to delete most nested blocks in write mode, should I be able to delete the indented list? Likewise if I delete all the list items, should the list be removed?

I'm happy to iterate on this until it feels more usable, but we need to be clear on what behaviour we actually want here.

Personally, I think it might work well to allow all types of create/delete actions inside the list block, but open to other thoughts!

@tellthemachines
Copy link
Copy Markdown
Contributor Author

I wonder if the choice to make this work around allowedBlocks will scale well to every block. Have we checked other blocks types that use allowedBlocks to see how they work? Do we need to also check that the allowed block types are content blocks or is that already covered somehow?

In this PR we're currently checking both whether the block has allowedBlocks and is a content role block. This is mainly to exclude the Navigation block 😄 but it also excludes Buttons for now. I guess we can add content roles here and there where we think they're needed to enable the functionality. I like using the content role because it translates well to what write mode should be. But there will probably be exceptions to whatever rules we come up with 😅

@talldan
Copy link
Copy Markdown
Contributor

talldan commented Aug 22, 2025

I can remove list items by deleting the text

I think I see what's happening. I can delete top level list item blocks using the keyboard, but not the indented ones (even when it's only deleting the item and not the entire list). Maybe it's a similar situation to unindenting

there's no "delete" button in the Options which maybe there should be?

My take on it is that if you can delete using the keyboard the option should be there too.

@tellthemachines tellthemachines force-pushed the fix/nested-content-only-blocks branch from f88c6c9 to 9843a44 Compare August 29, 2025 06:16
@tellthemachines
Copy link
Copy Markdown
Contributor Author

Thanks everyone for the feedback on this PR!

Since this is such a significant improvement, I think it'd be great to get in in its current shape! I know it's a complex area, though, so do feel free to wait for another approving review if you'd like.

If the tests still pass after the rebase I'll merge it. Given the whole feature is behind an experiment flag, it's very unlikely to break anything 🙈

@tellthemachines tellthemachines merged commit a040815 into trunk Sep 1, 2025
86 of 88 checks passed
@tellthemachines tellthemachines deleted the fix/nested-content-only-blocks branch September 1, 2025 00:58
@github-actions github-actions Bot added this to the Gutenberg 21.6 milestone Sep 1, 2025
@andrewserong andrewserong changed the title Prevent nested containers with content role from showing inserter in write mode Allow adding "content" role blocks to containers that also have a "content" role in write mode Sep 1, 2025
@andrewserong
Copy link
Copy Markdown
Contributor

Nice work landing this one! I've just updated the PR title to better match the final state of the PR, hope you don't mind (feel free to change it back / update it again of course).

@tellthemachines
Copy link
Copy Markdown
Contributor Author

Thanks Andy! That's a better description.

@fabiankaegy fabiankaegy added the Needs Dev Note Requires a developer note for a major WordPress release cycle label Sep 1, 2025
@getdave
Copy link
Copy Markdown
Contributor

getdave commented Sep 1, 2025

Thanks for working on this.

I agree that we should rely on the content role as the guiding principle. Hopefully this API will be sufficient as a proxy for "this is a block that should be edited in write mode" (although it also has utility beyond that mode).

I'll look to rebase the Nav block in Write mode PRs to pull in this change which should help with those efforts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Write mode Needs Dev Note Requires a developer note for a major WordPress release cycle [Type] Bug An existing feature does not function as intended

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants