Skip to content

Conversation

@t-hamano
Copy link
Contributor

@t-hamano t-hamano commented Aug 14, 2025

First implementation for #50756

What?

This PR adds a new block API and UI for toggling block visibility in the frontend in both the frontend and the editor..

Note: First of all, I would like to discuss why this feature is necessary and what kind of extensibility it can potentially offer in the future. Any feedback would be appreciated.

Why?

Sometimes users may want to edit blocks in the backend without affecting the frontend, for example, a section that is not yet ready to be published.

How?

Implementation details are as follows. Many of the specifications are similar to Block Lock.

  • Add a new blockVisibility block support except for some generic blocks, which defaults to true. When a block is hidden, its state is saved in attributes.metadata.blockVisibility.
  • Add a new isBlockHidden private selector to the @wordpress/block-editor package.
  • Adds a menu item to the block settings dropdown to change the block's visibility.
  • In the editor, when the blockVisibility attribute is false:
    • Visually hides the block when it or any of its child blocks are not selected.
    • Displays a button in the toolbar that can also be used to toggle visibility.
    • Displays an icon in the List View.
    • In the List view, the visibility of multiple blocks can be changed simultaneously.

Testing Instructions

  • Insert a block or pattern.
  • Hide the block from the block settings dropdown.
  • Deselect the block and confirm that the block is striped.
  • Confirm that the block is not rendered in the frontend

Testing Instructions for Keyboard

In the List View, use the Tab key to focus on the hidden block. Your screen reader should announce something like this:

Paragraph my-anchor  link  Block 1 of 4, Level 1. Block is hidden.

Screenshots or screencast

7e3b756925b3e09bc0c6050f75602f49.mp4

Tasks

Below is a list of things I can think of that need to be addressed and discussed.

  • Add core backport PR
  • Add some e2e tests
  • Should the block be visually hidden in the editor as well as the frontend? This may cause problems with editing with the block. For example, unless the List View is open, the user will not know that there are hidden blocks there, and nothing visually should happen when, for example, moving up a block next to a hidden block via the block toolbar.
  • How should we enhance this block support in the future? One of the main requests would be to be able to hide blocks based on some rulesets. You can see an example of this request in this comment: Add option to hide blocks #50756 (comment)
  • If the block is hidden on the frontend, CSS and JS should not be enqueued. This may eventually be achieved in Avoid enqueueing scripts and styles for a block unless content is rendered wordpress-develop#9213.
  • List View items may already have a lot of metadata rendered. While this is not required, we may need to reorganize the information we want to display in the List View. See List view: the 'sticky' information is only visual #59409 (comment)

@t-hamano t-hamano self-assigned this Aug 14, 2025
@t-hamano t-hamano added [Feature] Block API API that allows to express the block paradigm. Needs Design Feedback Needs general design feedback. [Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Type] New API New API to be used by plugin developers or package users. labels Aug 14, 2025
@github-actions
Copy link

github-actions bot commented Aug 14, 2025

Size Change: +1.84 kB (+0.09%)

Total Size: 1.95 MB

Filename Size Change
build/block-editor/content-rtl.css 4.5 kB +70 B (+1.58%)
build/block-editor/content.css 4.49 kB +69 B (+1.56%)
build/block-editor/index.min.js 269 kB +1.63 kB (+0.61%)
build/block-editor/style-rtl.css 16 kB +8 B (+0.05%)
build/block-editor/style.css 16 kB +8 B (+0.05%)
build/block-library/index.min.js 238 kB +56 B (+0.02%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/accordion/view.min.js 658 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.6 kB
build-module/interactivity/debug.min.js 17.7 kB
build-module/interactivity/index.min.js 14.1 kB
build/a11y/index.min.js 925 B
build/annotations/index.min.js 2.13 kB
build/api-fetch/index.min.js 2.41 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/default-editor-styles-rtl.css 392 B
build/block-editor/default-editor-styles.css 392 B
build/block-library/blocks/accordion-content/style-rtl.css 213 B
build/block-library/blocks/accordion-content/style.css 212 B
build/block-library/blocks/accordion-header/style-rtl.css 330 B
build/block-library/blocks/accordion-header/style.css 330 B
build/block-library/blocks/accordion-panel/style-rtl.css 99 B
build/block-library/blocks/accordion-panel/style.css 99 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 366 B
build/block-library/blocks/form-input/style.css 366 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 625 B
build/block-library/blocks/navigation-link/editor.css 628 B
build/block-library/blocks/navigation-link/style-rtl.css 190 B
build/block-library/blocks/navigation-link/style.css 188 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 525 B
build/block-library/blocks/post-comments-form/style.css 525 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 665 B
build/block-library/blocks/search/style.css 666 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/term-template/editor-rtl.css 225 B
build/block-library/blocks/term-template/editor.css 225 B
build/block-library/blocks/term-template/style-rtl.css 135 B
build/block-library/blocks/term-template/style.css 135 B
build/block-library/blocks/terms-query/style-rtl.css 70 B
build/block-library/blocks/terms-query/style.css 70 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.5 kB
build/block-library/editor.css 11.5 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.7 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 253 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.58 kB
build/core-data/index.min.js 75.4 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.7 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.9 kB
build/edit-post/style-rtl.css 2.78 kB
build/edit-post/style.css 2.78 kB
build/edit-site/index.min.js 242 kB
build/edit-site/posts-rtl.css 9.35 kB
build/edit-site/posts.css 9.35 kB
build/edit-site/style-rtl.css 15.4 kB
build/edit-site/style.css 15.4 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 136 kB
build/editor/style-rtl.css 9.57 kB
build/editor/style.css 9.58 kB
build/element/index.min.js 4.86 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.32 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.55 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.87 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 640 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.47 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

github-actions bot commented Aug 14, 2025

Flaky tests detected in ff7a8d5.
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/18160190902
📝 Reported issues:

@t-hamano t-hamano requested review from a team, mikachan and talldan and removed request for a team, mikachan and talldan August 14, 2025 07:02
@t-hamano t-hamano marked this pull request as ready for review August 14, 2025 07:02
@t-hamano t-hamano requested a review from a team August 14, 2025 07:02
@github-actions
Copy link

github-actions bot commented Aug 14, 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: t-hamano <[email protected]>
Co-authored-by: tyxla <[email protected]>
Co-authored-by: Mamaduka <[email protected]>
Co-authored-by: ramonjd <[email protected]>
Co-authored-by: talldan <[email protected]>
Co-authored-by: sunyatasattva <[email protected]>
Co-authored-by: mukeshpanchal27 <[email protected]>
Co-authored-by: jasmussen <[email protected]>
Co-authored-by: annezazu <[email protected]>
Co-authored-by: supernovia <[email protected]>
Co-authored-by: andrewserong <[email protected]>
Co-authored-by: jameskoster <[email protected]>

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

@jasmussen
Copy link
Contributor

Nice work. I just shared some mockups in the main issue, which instead of dimming/overlaying the hidden block, actually hides it. In my comment I acknowledge the pros and cons to doing that, but since you already have a PR ready, I'm wondering if actually testing out the theory with something real isn't the best way to help decide. Beyond surfacing the potential need for focus handling, my hope is it'll make the behavior very obvious and intuitive in a way that opens up future opportunities. What do you think?

@annezazu
Copy link
Contributor

Working well thus far :) Thanks for all your efforts here. It's interesting to try this with inner blocks/container blocks. I think we can learn a lot from block locking here in terms of UX:

hiding.blocks.mov

@ramonjd
Copy link
Member

ramonjd commented Aug 14, 2025

which instead of dimming/overlaying the hidden block, actually hides it.

I'd suggest that both would actually be useful (also commented something to that effect in the issue):

  • Dimming/overlaying to make it obvious to the editor user which blocks are hidden and where. (or at least some non-annoying and unobtrusive way for a user to map out all hidden block locations in the block tree)
  • A toggle for hiding all/individual blocks in the editor to show a preview of what the frontend would look like

Future compatibility with breakpoints or other variables can be left open if we keep the data structure flexible, though @t-hamano has already thought about this.

Oh, I don't know, something like:

<!-- wp:paragraph {
	"metadata":{
		"blockVisibility": [
            {
				"type": "breakpoint",
				"value": "var:preset|breakpoint|small",
			}
          ],
	}
} -->
...

@t-hamano
Copy link
Contributor Author

t-hamano commented Oct 1, 2025

One thing I notice when testing is that some transforms might not retain the block visibility, others do

Ah, I think this problem is related to this issue:

This issue will likely occur with any blocks that extract only specific attributes and call createBlock within the transform property's callback function.

We may need to fix this in a follow-up so that all three metadata attributes (name. blockVisibility, and commentId) are not lost.

@t-hamano
Copy link
Contributor Author

t-hamano commented Oct 1, 2025

I have to admit, I preferred the 0 height one quite a bit.

I agree. Fixed in 96428fd

Could we have made that also 0 width to address Dan's good note?

I tried it, but since blocks in the editor are horizontally centered, the toolbar movement can be annoying:

08a36e833a0a0fe8b8341eb03be70b27

I'll try to find a better approach to hiding selected blocks in a follow-up.

@jasmussen
Copy link
Contributor

Potentially can default to height: 0, and look at is-layout-flex on whether it should instead be width: 0. I imagine it's more complex than that but wanted to share.

@talldan
Copy link
Contributor

talldan commented Oct 1, 2025

Potentially can default to height: 0, and look at is-layout-flex on whether it should instead be width: 0. I imagine it's more complex than that but wanted to share.

Another issue I spotted with both width: 0 and height: 0 is that the sibling block inserter tries to match the width of the hidden block in a vertical layout, and it looks noticeably strange. Maybe there are ways to solve that (e.g. by not trying to reference the hidden block's width, but the nearest visible block instead).

@t-hamano
Copy link
Contributor Author

t-hamano commented Oct 1, 2025

Another issue I spotted with both width: 0 and height: 0 is that the sibling block inserter tries to match the width of the hidden block in a vertical layout, and it looks noticeably strange. Maybe there are ways to solve that (e.g. by not trying to reference the hidden block's width, but the nearest visible block instead).

Yes, I'm investigating this...

@t-hamano
Copy link
Contributor Author

t-hamano commented Oct 1, 2025

I understand what the ideal behavior here would be, but I haven't yet figured out how to technically achieve all of the following:

  • We can't apply display:none in order to render the block toolbar. We need to render some element.
  • For vertical layout, the height should be set to 0 and the width should match the adjacent block.
  • For horizontal layout, the width should be set to 0 and the height should match the adjacent block.
  • Make sure the in-between inserter is displayed properly.

@jasmussen
Copy link
Contributor

I want to briefly pause and thank you for your work. It's been inspiring, it's been great.

Then I want to echo that this is solid work, I think it should land. To me it even feels 6.9 ready. Now whether we implement the visibility or the opacity change as you had earlier and land this, then explore height/width/collapsing separately, I'll defer to you all. To be very clear, I think it's an important value add, worth pursuing. But I also don't think it is required for the first iteration to land, especially as the block really does truly disappear when you deselect the block. That feels the main constraint.

@t-hamano
Copy link
Contributor Author

t-hamano commented Oct 1, 2025

How about this?

0363abf6c5d54fccb6d04ea803ad3bbc.1.mp4

@jasmussen
Copy link
Contributor

(⊃。•́‿•̀。)⊃━☆.*・ magic

@t-hamano

This comment was marked as resolved.

@t-hamano t-hamano merged commit 7feff31 into trunk Oct 1, 2025
83 of 87 checks passed
@t-hamano t-hamano deleted the block-visibility branch October 1, 2025 12:31
@github-project-automation github-project-automation bot moved this from 🔎 Needs Review to ✅ Done in WordPress 6.9 Editor Tasks Oct 1, 2025
@github-actions github-actions bot added this to the Gutenberg 21.8 milestone Oct 1, 2025
@tyxla
Copy link
Member

tyxla commented Oct 2, 2025

Thanks for the great work on this one @t-hamano 🫶

@paaljoachim
Copy link
Contributor

I am thinking that one can use this feature to add multi language features.
Creating the content in one language and duplicating the blocks and changing it to another language.
Using code to show language in use with a button or flag and hiding the other language.

@burnuser
Copy link

Hide a block in the frontend is really useful and much loved by my trainees, when using Plugins like Greenshift (predefined CSS Class hide_onfrontend => display:none) or Block Visibility.
But the main effect oft this tools is to hide the block ONLY in the frontend and NOT in the editor too.
The regular use-case is: “Allows draft or placeholder content to stay visible in the editor but hidden from site visitors.”

But the actual Gutenberg & Beta 1 tool hides the block ALSO in the editor!
So, to work as described with a draft, you have to

  1. unhide a hidden block
  2. edit it
  3. rehide it
  4. save the post.
    (And never forget step 3 before each saving!) – That’s a workflow from hell, but nothing I would use by myself or recommend to my trainees.
    Additional, in the editor, you can’t never see what you have written in ALL invisible blocks and must make them visible one by one to see your own content. (And, by god, don’t forget to make them invisible again afterwards before next saving!)

Suggestions:
1.) Follow your own target declaration and make the block invisible ONLY in the frontend.
2.) If you want some extra, mark such a block in the editor, e.g. with a special wireframe or an icon, which declares its invisible frontend status at a glance.
3.) If there is no quick solution to make this feature useful, remove it from the upcoming WordPress release.

@enodekciw
Copy link
Contributor

Block visibility manager of some sort should be in Gutenberg, yes. However, current implementation looks questionable, imo.

  • as per Why? - "Sometimes users may want to edit blocks in the backend without affecting the frontend, for example, a section that is not yet ready to be published." - how users are supposed to do that, if block gets hidden in the Editor? Unhide it, edit it, then if it's still not final, hide it again and save the post? Basically, keep hiding and unhiding it while doing the edits?
  • How useful is hide/show option with no conditional settings? Basically, it only allows users to "draft" blocks without affecting the frontend and not much else. I've been using Gutenberg in production since 2019 and I could count on my fingers the times I needed plain hide/show block functionality with no conditional settings. Usually, when I need to manage block visibility, I need to tie it to some sort of conditional state like user role, query string, screen size, or so.
  • Now it's saved into attributes.metadata.blockVisibility, are there any other visibilities planned to be saved in metadata except block visibility? Isn't block in attribute name a bit redundant? I mean, block label is saved into attributes.metadata.name not attributes.metadata.blockName, so why not just use attributes.metadata.visibility for visibility? :)

I'm extensively using https://github.com/ndiego/block-visibility plugin for managing block visibility state. Plugin seems to be really solid, open-source, somewhat easy to extend. It also allows not only basic show/hide but also a lot of other different options to manage the visibility (by query strings, screen sizes, user roles, etc.). I wished core Gutenberg implementation could borrow some ideas from a plugin like this :)

@t-hamano
Copy link
Contributor Author

@burnuser @enodekciw Thanks for the feedback.

Follow your own target declaration and make the block invisible ONLY in the frontend.
If you want some extra, mark such a block in the editor, e.g. with a special wireframe or an icon, which declares its invisible frontend status at a glance.

how users are supposed to do that, if block gets hidden in the Editor? Unhide it, edit it, then if it's still not final, hide it again and save the post? Basically, keep hiding and unhiding it while doing the edits?

There is a discussion about this here: #71203 (comment)

In many design tools, hiding a layer actually makes that layer disappear. If you want to edit a layer, you need to explicitly show that layer. Also, in order to see how it will ultimately be displayed on the front end, the block needs to be hidden in the editor as well. That's my understanding, but I agree that there are certainly many steps involved in editing the content of a hidden block.

How useful is hide/show option with no conditional settings? Basically, it only allows users to "draft" blocks without affecting the frontend and not much else. I've been using Gutenberg in production since 2019 and I could count on my fingers the times I needed plain hide/show block functionality with no conditional settings. Usually, when I need to manage block visibility, I need to tie it to some sort of conditional state like user role, query string, screen size, or so..

I think this needs to be carefully considered based on various user feedback. This is because it is difficult to remove a feature once it has been added. We have a responsibility to ensure full backward compatibility.

Now it's saved into attributes.metadata.blockVisibility, are there any other visibilities planned to be saved in metadata except block visibility? Isn't block in attribute name a bit redundant? I mean, block label is saved into attributes.metadata.name not attributes.metadata.blockName, so why not just use attributes.metadata.visibility for visibility? :)

One reason is to avoid confusion with the CSS property "visibility". See #50756 (comment)

I'm extensively using https://github.com/ndiego/block-visibility plugin for managing block visibility state. Plugin seems to be really solid, open-source, somewhat easy to extend. It also allows not only basic show/hide but also a lot of other different options to manage the visibility (by query strings, screen sizes, user roles, etc.). I wished core Gutenberg implementation could borrow some ideas from a plugin like this :)

I'm also aware of that plugin. We can consider which ideas to incorporate as part of future enhancements.

If you have any specific ideas about what kind of feature enhancements are needed, we would welcome you to submit a new issue.

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

Labels

[Feature] Block API API that allows to express the block paradigm. [Feature] List View Menu item in the top toolbar to select blocks from a list of links. Needs Design Feedback Needs general design feedback. [Type] New API New API to be used by plugin developers or package users.

Projects

Development

Successfully merging this pull request may close these issues.