Skip to content

Conversation

@ramonjd
Copy link
Member

@ramonjd ramonjd commented Dec 16, 2025

What?

Related to:

This PR implements simple client-side state management for block visibility that respects the currently selected device preview mode. Blocks are hidden in the editor when they have visibility restrictions for the active device preview via the existing is-block-hidden classname.

The base of this branch is currently:

That is optional and only a convenience for testing. Neither PR is dependent on the other for the purposes of merging.

No UI changes yet.

How?

  • Selectors: Updated isBlockHidden to be viewport-aware
  • Settings: Pass deviceType from editor store to block editor settings using private key

Testing Instructions

For starters, the JS unit tests should pass 🍏

To test manually, enable the experiment:

Screenshot 2025-12-15 at 10 53 52 am

Then copy and paste this into your post editor, then toggle the device menu.

<!-- wp:paragraph {"metadata":{"blockVisibility":{"mobile":false}}} -->
<p>🔴 Hidden on MOBILE (≤599px) - You should see this on tablet and desktop only</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":{"tablet":false}}} -->
<p>🟡 Hidden on TABLET (600-959px) - You should see this on mobile and desktop only</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":{"desktop":false}}} -->
<p>🟢 Hidden on DESKTOP (≥960px) - You should see this on mobile and tablet only</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":{"mobile":false,"desktop":false}}} -->
<p>🟣 Hidden on MOBILE and DESKTOP - You should only see this on tablet (600-959px)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":{"mobile":false,"tablet":false}}} -->
<p>🔵 Hidden on MOBILE and TABLET - You should only see this on desktop (≥960px)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":{"tablet":false,"desktop":false}}} -->
<p>🟠 Hidden on TABLET and DESKTOP - You should only see this on mobile (≤599px)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":{"mobile":true,"tablet":true,"desktop":true}}} -->
<p>✅ Visible on ALL breakpoints - You should always see this</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"metadata":{"blockVisibility":false}} -->
<p>❌ Completely HIDDEN (boolean false) - You should never see this</p>
<!-- /wp:paragraph -->
Kapture.2025-12-16.at.17.10.57.mp4

Make sure to test with the experiment off as well. The last item should never show with the experiment on and off.

- Introduce new hooks and utilities for managing block visibility based on viewport types.
- Update existing block list component to utilize the new visibility logic.
- Add comprehensive unit tests to validate visibility behavior across different scenarios.
- Enhance private selectors to support visibility checks for specific devices.
- Refactor related components to ensure consistent handling of block visibility attributes.
@ramonjd ramonjd changed the title * Update block visibility rendering to support responsive visibility … [WIP] Block visibility based on screen size: clientside state Dec 16, 2025
@ramonjd ramonjd added the [Status] In Progress Tracking issues with work in progress label Dec 16, 2025
@ramonjd ramonjd self-assigned this Dec 16, 2025
@github-actions
Copy link

github-actions bot commented Dec 16, 2025

Size Change: +300 B (+0.01%)

Total Size: 2.58 MB

Filename Size Change
build/scripts/block-editor/index.min.js 316 kB +163 B (+0.05%)
build/scripts/editor/index.min.js 284 kB +127 B (+0.04%)
build/styles/block-editor/content-rtl.css 4.8 kB +5 B (+0.1%)
build/styles/block-editor/content.css 4.8 kB +5 B (+0.1%)
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 549 B
build/modules/block-library/accordion/view.min.js 779 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 1.95 kB
build/modules/block-library/navigation/view.min.js 1.03 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 859 B
build/modules/boot/index.min.js 104 kB
build/modules/core-abilities/index.min.js 890 B
build/modules/edit-site-init/index.min.js 2.14 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.5 kB
build/modules/interactivity/index.min.js 14.9 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 18.8 kB
build/modules/route/index.min.js 24.6 kB
build/modules/workflow/index.min.js 36.8 kB
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/annotations/index.min.js 2.38 kB
build/scripts/api-fetch/index.min.js 2.83 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/blob/index.min.js 631 B
build/scripts/block-directory/index.min.js 8.03 kB
build/scripts/block-library/index.min.js 281 kB
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/blocks/index.min.js 56.6 kB
build/scripts/commands/index.min.js 19.9 kB
build/scripts/components/index.min.js 272 kB
build/scripts/compose/index.min.js 13.9 kB
build/scripts/core-commands/index.min.js 4.13 kB
build/scripts/core-data/index.min.js 86.7 kB
build/scripts/customize-widgets/index.min.js 12.3 kB
build/scripts/data-controls/index.min.js 793 B
build/scripts/data/index.min.js 9.62 kB
build/scripts/date/index.min.js 23.6 kB
build/scripts/deprecated/index.min.js 752 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/dom/index.min.js 4.91 kB
build/scripts/edit-post/index.min.js 16.4 kB
build/scripts/edit-site/index.min.js 234 kB
build/scripts/edit-widgets/index.min.js 20 kB
build/scripts/element/index.min.js 5.19 kB
build/scripts/escape-html/index.min.js 586 B
build/scripts/format-library/index.min.js 10.8 kB
build/scripts/hooks/index.min.js 1.83 kB
build/scripts/html-entities/index.min.js 494 B
build/scripts/i18n/index.min.js 2.46 kB
build/scripts/is-shallow-equal/index.min.js 568 B
build/scripts/keyboard-shortcuts/index.min.js 1.57 kB
build/scripts/keycodes/index.min.js 1.53 kB
build/scripts/list-reusable-blocks/index.min.js 2.44 kB
build/scripts/media-utils/index.min.js 69.5 kB
build/scripts/notices/index.min.js 1.11 kB
build/scripts/nux/index.min.js 1.88 kB
build/scripts/patterns/index.min.js 7.87 kB
build/scripts/plugins/index.min.js 2.14 kB
build/scripts/preferences-persistence/index.min.js 2.15 kB
build/scripts/preferences/index.min.js 3.31 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.61 kB
build/scripts/private-apis/index.min.js 1.07 kB
build/scripts/react-i18n/index.min.js 832 B
build/scripts/react-refresh-entry/index.min.js 9.44 kB
build/scripts/react-refresh-runtime/index.min.js 3.59 kB
build/scripts/redux-routine/index.min.js 3.36 kB
build/scripts/reusable-blocks/index.min.js 2.92 kB
build/scripts/rich-text/index.min.js 12.9 kB
build/scripts/router/index.min.js 5.96 kB
build/scripts/server-side-render/index.min.js 1.91 kB
build/scripts/shortcode/index.min.js 1.58 kB
build/scripts/style-engine/index.min.js 2.33 kB
build/scripts/theme/index.min.js 20.8 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 917 B
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43 kB
build/scripts/vendors/react-jsx-runtime.min.js 691 B
build/scripts/vendors/react.min.js 4.27 kB
build/scripts/viewport/index.min.js 1.22 kB
build/scripts/warning/index.min.js 454 B
build/scripts/widgets/index.min.js 7.81 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/block-directory/style-rtl.css 1.05 kB
build/styles/block-directory/style.css 1.05 kB
build/styles/block-editor/default-editor-styles-rtl.css 224 B
build/styles/block-editor/default-editor-styles.css 224 B
build/styles/block-editor/style-rtl.css 16.3 kB
build/styles/block-editor/style.css 16.2 kB
build/styles/block-library/accordion-heading/style-rtl.css 325 B
build/styles/block-library/accordion-heading/style.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 180 B
build/styles/block-library/accordion-item/style.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 99 B
build/styles/block-library/accordion-panel/style.css 99 B
build/styles/block-library/accordion/style-rtl.css 62 B
build/styles/block-library/accordion/style.css 62 B
build/styles/block-library/archives/editor-rtl.css 61 B
build/styles/block-library/archives/editor.css 61 B
build/styles/block-library/archives/style-rtl.css 90 B
build/styles/block-library/archives/style.css 90 B
build/styles/block-library/audio/editor-rtl.css 149 B
build/styles/block-library/audio/editor.css 151 B
build/styles/block-library/audio/style-rtl.css 132 B
build/styles/block-library/audio/style.css 132 B
build/styles/block-library/audio/theme-rtl.css 134 B
build/styles/block-library/audio/theme.css 134 B
build/styles/block-library/avatar/editor-rtl.css 115 B
build/styles/block-library/avatar/editor.css 115 B
build/styles/block-library/avatar/style-rtl.css 104 B
build/styles/block-library/avatar/style.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 203 B
build/styles/block-library/breadcrumbs/style.css 203 B
build/styles/block-library/button/editor-rtl.css 265 B
build/styles/block-library/button/editor.css 265 B
build/styles/block-library/button/style-rtl.css 554 B
build/styles/block-library/button/style.css 554 B
build/styles/block-library/buttons/editor-rtl.css 291 B
build/styles/block-library/buttons/editor.css 291 B
build/styles/block-library/buttons/style-rtl.css 349 B
build/styles/block-library/buttons/style.css 349 B
build/styles/block-library/calendar/style-rtl.css 239 B
build/styles/block-library/calendar/style.css 239 B
build/styles/block-library/categories/editor-rtl.css 132 B
build/styles/block-library/categories/editor.css 131 B
build/styles/block-library/categories/style-rtl.css 152 B
build/styles/block-library/categories/style.css 152 B
build/styles/block-library/classic-rtl.css 321 B
build/styles/block-library/classic.css 321 B
build/styles/block-library/code/editor-rtl.css 53 B
build/styles/block-library/code/editor.css 53 B
build/styles/block-library/code/style-rtl.css 139 B
build/styles/block-library/code/style.css 139 B
build/styles/block-library/code/theme-rtl.css 122 B
build/styles/block-library/code/theme.css 122 B
build/styles/block-library/columns/editor-rtl.css 108 B
build/styles/block-library/columns/editor.css 108 B
build/styles/block-library/columns/style-rtl.css 421 B
build/styles/block-library/columns/style.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 72 B
build/styles/block-library/comment-author-name/style.css 72 B
build/styles/block-library/comment-content/style-rtl.css 120 B
build/styles/block-library/comment-content/style.css 120 B
build/styles/block-library/comment-date/style-rtl.css 65 B
build/styles/block-library/comment-date/style.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 70 B
build/styles/block-library/comment-edit-link/style.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 71 B
build/styles/block-library/comment-reply-link/style.css 71 B
build/styles/block-library/comment-template/style-rtl.css 191 B
build/styles/block-library/comment-template/style.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 168 B
build/styles/block-library/comments-pagination/editor.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 201 B
build/styles/block-library/comments-pagination/style.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 75 B
build/styles/block-library/comments-title/editor.css 75 B
build/styles/block-library/comments/editor-rtl.css 842 B
build/styles/block-library/comments/editor.css 842 B
build/styles/block-library/comments/style-rtl.css 637 B
build/styles/block-library/comments/style.css 637 B
build/styles/block-library/common-rtl.css 1.11 kB
build/styles/block-library/common.css 1.11 kB
build/styles/block-library/cover/editor-rtl.css 631 B
build/styles/block-library/cover/editor.css 631 B
build/styles/block-library/cover/style-rtl.css 1.82 kB
build/styles/block-library/cover/style.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 65 B
build/styles/block-library/details/editor.css 65 B
build/styles/block-library/details/style-rtl.css 86 B
build/styles/block-library/details/style.css 86 B
build/styles/block-library/editor-elements-rtl.css 75 B
build/styles/block-library/editor-elements.css 75 B
build/styles/block-library/editor-rtl.css 11.8 kB
build/styles/block-library/editor.css 11.8 kB
build/styles/block-library/elements-rtl.css 54 B
build/styles/block-library/elements.css 54 B
build/styles/block-library/embed/editor-rtl.css 331 B
build/styles/block-library/embed/editor.css 331 B
build/styles/block-library/embed/style-rtl.css 448 B
build/styles/block-library/embed/style.css 448 B
build/styles/block-library/embed/theme-rtl.css 133 B
build/styles/block-library/embed/theme.css 133 B
build/styles/block-library/file/editor-rtl.css 324 B
build/styles/block-library/file/editor.css 324 B
build/styles/block-library/file/style-rtl.css 278 B
build/styles/block-library/file/style.css 278 B
build/styles/block-library/footnotes/style-rtl.css 198 B
build/styles/block-library/footnotes/style.css 197 B
build/styles/block-library/form-input/editor-rtl.css 229 B
build/styles/block-library/form-input/editor.css 229 B
build/styles/block-library/form-input/style-rtl.css 366 B
build/styles/block-library/form-input/style.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 344 B
build/styles/block-library/form-submission-notification/editor.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 69 B
build/styles/block-library/form-submit-button/style.css 69 B
build/styles/block-library/freeform/editor-rtl.css 2.59 kB
build/styles/block-library/freeform/editor.css 2.59 kB
build/styles/block-library/gallery/editor-rtl.css 615 B
build/styles/block-library/gallery/editor.css 616 B
build/styles/block-library/gallery/style-rtl.css 1.84 kB
build/styles/block-library/gallery/style.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 108 B
build/styles/block-library/gallery/theme.css 108 B
build/styles/block-library/group/editor-rtl.css 335 B
build/styles/block-library/group/editor.css 335 B
build/styles/block-library/group/style-rtl.css 103 B
build/styles/block-library/group/style.css 103 B
build/styles/block-library/group/theme-rtl.css 79 B
build/styles/block-library/group/theme.css 79 B
build/styles/block-library/heading/style-rtl.css 205 B
build/styles/block-library/heading/style.css 205 B
build/styles/block-library/html/editor-rtl.css 419 B
build/styles/block-library/html/editor.css 419 B
build/styles/block-library/image/editor-rtl.css 763 B
build/styles/block-library/image/editor.css 763 B
build/styles/block-library/image/style-rtl.css 1.6 kB
build/styles/block-library/image/style.css 1.59 kB
build/styles/block-library/image/theme-rtl.css 137 B
build/styles/block-library/image/theme.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 355 B
build/styles/block-library/latest-comments/style.css 354 B
build/styles/block-library/latest-posts/editor-rtl.css 139 B
build/styles/block-library/latest-posts/editor.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 520 B
build/styles/block-library/latest-posts/style.css 520 B
build/styles/block-library/list/style-rtl.css 107 B
build/styles/block-library/list/style.css 107 B
build/styles/block-library/loginout/style-rtl.css 61 B
build/styles/block-library/loginout/style.css 61 B
build/styles/block-library/math/editor-rtl.css 105 B
build/styles/block-library/math/editor.css 105 B
build/styles/block-library/math/style-rtl.css 61 B
build/styles/block-library/math/style.css 61 B
build/styles/block-library/media-text/editor-rtl.css 321 B
build/styles/block-library/media-text/editor.css 320 B
build/styles/block-library/media-text/style-rtl.css 543 B
build/styles/block-library/media-text/style.css 542 B
build/styles/block-library/more/editor-rtl.css 393 B
build/styles/block-library/more/editor.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 645 B
build/styles/block-library/navigation-link/editor.css 647 B
build/styles/block-library/navigation-link/style-rtl.css 190 B
build/styles/block-library/navigation-link/style.css 188 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 249 B
build/styles/block-library/navigation-overlay-close/style.css 249 B
build/styles/block-library/navigation-submenu/editor-rtl.css 295 B
build/styles/block-library/navigation-submenu/editor.css 294 B
build/styles/block-library/navigation/editor-rtl.css 2.25 kB
build/styles/block-library/navigation/editor.css 2.26 kB
build/styles/block-library/navigation/style-rtl.css 2.27 kB
build/styles/block-library/navigation/style.css 2.25 kB
build/styles/block-library/nextpage/editor-rtl.css 392 B
build/styles/block-library/nextpage/editor.css 392 B
build/styles/block-library/page-list/editor-rtl.css 356 B
build/styles/block-library/page-list/editor.css 356 B
build/styles/block-library/page-list/style-rtl.css 192 B
build/styles/block-library/page-list/style.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 251 B
build/styles/block-library/paragraph/editor.css 251 B
build/styles/block-library/paragraph/style-rtl.css 341 B
build/styles/block-library/paragraph/style.css 340 B
build/styles/block-library/post-author-biography/style-rtl.css 74 B
build/styles/block-library/post-author-biography/style.css 74 B
build/styles/block-library/post-author-name/style-rtl.css 69 B
build/styles/block-library/post-author-name/style.css 69 B
build/styles/block-library/post-author/style-rtl.css 188 B
build/styles/block-library/post-author/style.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 72 B
build/styles/block-library/post-comments-count/style.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 96 B
build/styles/block-library/post-comments-form/editor.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 525 B
build/styles/block-library/post-comments-form/style.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 71 B
build/styles/block-library/post-comments-link/style.css 71 B
build/styles/block-library/post-content/style-rtl.css 61 B
build/styles/block-library/post-content/style.css 61 B
build/styles/block-library/post-date/style-rtl.css 62 B
build/styles/block-library/post-date/style.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 71 B
build/styles/block-library/post-excerpt/editor.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 155 B
build/styles/block-library/post-excerpt/style.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 719 B
build/styles/block-library/post-featured-image/editor.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 347 B
build/styles/block-library/post-featured-image/style.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 215 B
build/styles/block-library/post-navigation-link/style.css 214 B
build/styles/block-library/post-template/style-rtl.css 414 B
build/styles/block-library/post-template/style.css 414 B
build/styles/block-library/post-terms/style-rtl.css 96 B
build/styles/block-library/post-terms/style.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 70 B
build/styles/block-library/post-time-to-read/style.css 70 B
build/styles/block-library/post-title/style-rtl.css 162 B
build/styles/block-library/post-title/style.css 162 B
build/styles/block-library/preformatted/style-rtl.css 125 B
build/styles/block-library/preformatted/style.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 133 B
build/styles/block-library/pullquote/editor.css 133 B
build/styles/block-library/pullquote/style-rtl.css 365 B
build/styles/block-library/pullquote/style.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 176 B
build/styles/block-library/pullquote/theme.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 154 B
build/styles/block-library/query-pagination/editor.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 237 B
build/styles/block-library/query-pagination/style.css 237 B
build/styles/block-library/query-title/style-rtl.css 64 B
build/styles/block-library/query-title/style.css 64 B
build/styles/block-library/query-total/style-rtl.css 64 B
build/styles/block-library/query-total/style.css 64 B
build/styles/block-library/query/editor-rtl.css 438 B
build/styles/block-library/query/editor.css 438 B
build/styles/block-library/quote/style-rtl.css 238 B
build/styles/block-library/quote/style.css 238 B
build/styles/block-library/quote/theme-rtl.css 233 B
build/styles/block-library/quote/theme.css 236 B
build/styles/block-library/read-more/style-rtl.css 131 B
build/styles/block-library/read-more/style.css 131 B
build/styles/block-library/reset-rtl.css 472 B
build/styles/block-library/reset.css 472 B
build/styles/block-library/rss/editor-rtl.css 126 B
build/styles/block-library/rss/editor.css 126 B
build/styles/block-library/rss/style-rtl.css 284 B
build/styles/block-library/rss/style.css 283 B
build/styles/block-library/search/editor-rtl.css 199 B
build/styles/block-library/search/editor.css 199 B
build/styles/block-library/search/style-rtl.css 665 B
build/styles/block-library/search/style.css 666 B
build/styles/block-library/search/theme-rtl.css 113 B
build/styles/block-library/search/theme.css 113 B
build/styles/block-library/separator/editor-rtl.css 100 B
build/styles/block-library/separator/editor.css 100 B
build/styles/block-library/separator/style-rtl.css 248 B
build/styles/block-library/separator/style.css 248 B
build/styles/block-library/separator/theme-rtl.css 195 B
build/styles/block-library/separator/theme.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 286 B
build/styles/block-library/shortcode/editor.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 773 B
build/styles/block-library/site-logo/editor.css 770 B
build/styles/block-library/site-logo/style-rtl.css 218 B
build/styles/block-library/site-logo/style.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 87 B
build/styles/block-library/site-tagline/editor.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 65 B
build/styles/block-library/site-tagline/style.css 65 B
build/styles/block-library/site-title/editor-rtl.css 85 B
build/styles/block-library/site-title/editor.css 85 B
build/styles/block-library/site-title/style-rtl.css 143 B
build/styles/block-library/site-title/style.css 143 B
build/styles/block-library/social-link/editor-rtl.css 314 B
build/styles/block-library/social-link/editor.css 314 B
build/styles/block-library/social-links/editor-rtl.css 339 B
build/styles/block-library/social-links/editor.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.51 kB
build/styles/block-library/social-links/style.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 346 B
build/styles/block-library/spacer/editor.css 346 B
build/styles/block-library/spacer/style-rtl.css 48 B
build/styles/block-library/spacer/style.css 48 B
build/styles/block-library/style-rtl.css 16.6 kB
build/styles/block-library/style.css 16.6 kB
build/styles/block-library/tab/style-rtl.css 202 B
build/styles/block-library/tab/style.css 202 B
build/styles/block-library/table-of-contents/style-rtl.css 83 B
build/styles/block-library/table-of-contents/style.css 83 B
build/styles/block-library/table/editor-rtl.css 394 B
build/styles/block-library/table/editor.css 394 B
build/styles/block-library/table/style-rtl.css 641 B
build/styles/block-library/table/style.css 640 B
build/styles/block-library/table/theme-rtl.css 152 B
build/styles/block-library/table/theme.css 152 B
build/styles/block-library/tabs/editor-rtl.css 236 B
build/styles/block-library/tabs/editor.css 236 B
build/styles/block-library/tabs/style-rtl.css 983 B
build/styles/block-library/tabs/style.css 983 B
build/styles/block-library/tag-cloud/editor-rtl.css 92 B
build/styles/block-library/tag-cloud/editor.css 92 B
build/styles/block-library/tag-cloud/style-rtl.css 248 B
build/styles/block-library/tag-cloud/style.css 248 B
build/styles/block-library/template-part/editor-rtl.css 368 B
build/styles/block-library/template-part/editor.css 368 B
build/styles/block-library/template-part/theme-rtl.css 113 B
build/styles/block-library/template-part/theme.css 113 B
build/styles/block-library/term-count/style-rtl.css 63 B
build/styles/block-library/term-count/style.css 63 B
build/styles/block-library/term-description/style-rtl.css 126 B
build/styles/block-library/term-description/style.css 126 B
build/styles/block-library/term-name/style-rtl.css 62 B
build/styles/block-library/term-name/style.css 62 B
build/styles/block-library/term-template/editor-rtl.css 225 B
build/styles/block-library/term-template/editor.css 225 B
build/styles/block-library/term-template/style-rtl.css 114 B
build/styles/block-library/term-template/style.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 95 B
build/styles/block-library/text-columns/editor.css 95 B
build/styles/block-library/text-columns/style-rtl.css 165 B
build/styles/block-library/text-columns/style.css 165 B
build/styles/block-library/theme-rtl.css 715 B
build/styles/block-library/theme.css 719 B
build/styles/block-library/verse/style-rtl.css 123 B
build/styles/block-library/verse/style.css 123 B
build/styles/block-library/video/editor-rtl.css 415 B
build/styles/block-library/video/editor.css 416 B
build/styles/block-library/video/style-rtl.css 202 B
build/styles/block-library/video/style.css 202 B
build/styles/block-library/video/theme-rtl.css 134 B
build/styles/block-library/video/theme.css 134 B
build/styles/commands/style-rtl.css 1.72 kB
build/styles/commands/style.css 1.72 kB
build/styles/components/style-rtl.css 14 kB
build/styles/components/style.css 14 kB
build/styles/customize-widgets/style-rtl.css 1.44 kB
build/styles/customize-widgets/style.css 1.44 kB
build/styles/edit-post/classic-rtl.css 426 B
build/styles/edit-post/classic.css 427 B
build/styles/edit-post/style-rtl.css 3.38 kB
build/styles/edit-post/style.css 3.38 kB
build/styles/edit-site/style-rtl.css 15.9 kB
build/styles/edit-site/style.css 15.9 kB
build/styles/edit-widgets/style-rtl.css 4.62 kB
build/styles/edit-widgets/style.css 4.62 kB
build/styles/editor/style-rtl.css 18.5 kB
build/styles/editor/style.css 18.5 kB
build/styles/format-library/style-rtl.css 326 B
build/styles/format-library/style.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.02 kB
build/styles/list-reusable-blocks/style.css 1.02 kB
build/styles/media-utils/style-rtl.css 400 B
build/styles/media-utils/style.css 400 B
build/styles/nux/style-rtl.css 622 B
build/styles/nux/style.css 618 B
build/styles/patterns/style-rtl.css 611 B
build/styles/patterns/style.css 611 B
build/styles/preferences/style-rtl.css 415 B
build/styles/preferences/style.css 415 B
build/styles/reusable-blocks/style-rtl.css 275 B
build/styles/reusable-blocks/style.css 275 B
build/styles/widgets/style-rtl.css 1.17 kB
build/styles/widgets/style.css 1.18 kB

compressed-size-action

@ramonjd ramonjd added [Type] Enhancement A suggestion for improvement. [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi and removed [Status] In Progress Tracking issues with work in progress labels Dec 16, 2025
@ramonjd ramonjd marked this pull request as ready for review December 16, 2025 06:42
@github-actions
Copy link

github-actions bot commented Dec 16, 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: ramonjd <[email protected]>
Co-authored-by: tellthemachines <[email protected]>
Co-authored-by: jasmussen <[email protected]>

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

@ramonjd ramonjd changed the title [WIP] Block visibility based on screen size: clientside state Block visibility based on screen size: clientside state Dec 16, 2025
@ramonjd ramonjd requested a review from mtias December 16, 2025 06:45
renderingMode,
editMediaEntity,
wrappedOnNavigateToEntityRecord,
deviceType,
Copy link
Member Author

Choose a reason for hiding this comment

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

I left out responsive Editing mode for now. Thinking that feature could be its own PR.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR implements client-side state management for block visibility based on device preview mode. Blocks with visibility restrictions are now hidden in the editor when the active device preview matches their visibility settings.

  • Added viewport-aware selectors (isBlockHidden, isHiddenInAnyDevice, getBlockVisibilitySettings)
  • Created utility functions for checking and toggling block visibility across viewports
  • Implemented useBlockVisibility hook for managing visibility state and actions
  • Passed device type from editor settings to block editor for viewport-aware behavior

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/editor/src/components/provider/use-block-editor-settings.js Added deviceType from editor store to block editor settings when experiment is enabled
packages/block-editor/src/store/private-selectors.js Updated isBlockHidden to be viewport-aware; added isHiddenInAnyDevice and getBlockVisibilitySettings selectors
packages/block-editor/src/hooks/use-block-visibility.js New hook providing visibility state and update/toggle actions for blocks
packages/block-editor/src/hooks/block-visibility-utils.js New utility functions for viewport visibility checks and toggling logic
packages/block-editor/src/components/block-list/block.js Moved isBlockHidden selector call to make it available in preview mode
packages/block-editor/src/hooks/index.js Exported useBlockVisibility hook
packages/block-editor/src/store/test/private-selectors.js Added comprehensive tests for new selectors
packages/block-editor/src/hooks/test/use-block-visibility.js Added tests for useBlockVisibility hook
packages/block-editor/src/hooks/test/block-visibility-utils.js Added tests for visibility utility functions

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link

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

@tellthemachines
Copy link
Contributor

I'm not sure we should be conditionally rendering blocks depending on the current viewport type. The problem is that, if you have built a page that has certain things hidden on mobile and then you try to edit it from an actual mobile device, you won't get the correct view of it:

Screenshot 2025-12-17 at 4 46 52 pm

It would be simpler if the "hide on..." just added a classname to the block in the editor and we let the media queries do their work.

@ramonjd
Copy link
Member Author

ramonjd commented Dec 17, 2025

It would be simpler if the "hide on..." just added a classname to the block in the editor and we let the media queries do their work.

Good point. And it matches the existing show/hide method. That's what I was doing over in #73735. I'll look at that, thanks!

I'm not sure we should be conditionally rendering blocks depending on the current viewport type. The problem is that, if you have built a page that has certain things hidden on mobile and then you try to edit it from an actual mobile device, you won't get the correct view of it:

Do you mean if we hide/show according to the viewport size?

If so, I think this comment is related: #72502 (comment)

As far as I can tell #73888 limits the behaviour to the device drop down list. This I think is a good place to start.
As an experiment, I went a bit further in #73735 (comment) so that, unless a device has been selected (Tablet, Mobile for instance) the blocks will hide/show according to the viewport size.
I thinking now that mightn't be a great experience, especially if folks are developing on a tablet! Rather, it should be a deliberate action to preview how things will look via the preview dropdown.

And related follow up: #72502 (comment)

Where I wanted to take it was hide/show only based on the dropdown preview value, not the window size.

The flaw here is "desktop" since that's the default. There's some chatter about how to represent hidden blocks, e.g., dim them.

What's your preference, or is there an alternative?

@ramonjd
Copy link
Member Author

ramonjd commented Dec 17, 2025

Good point. And it matches the existing show/hide method. That's what I was doing over in #73735. I'll look at that, thanks!

And if we extend to theme.json later, we can generate these classnames + rules on the backend and add to global styles CSS. 👍🏻

@ramonjd ramonjd changed the title Block visibility based on screen size: clientside state Block visibility based on screen size: basic clientside state Dec 17, 2025
- Introduce `deviceTypeKey` to manage device-specific visibility settings.
- Update private selectors and hooks to utilize the new device type logic.
- Remove deprecated visibility utilities and associated tests.
- Adjust block editor settings to ensure consistent device type handling.
- Enhance styles for block list components to improve visibility behavior.
border: none !important;
padding: 0 !important;
opacity: 0;
margin: 0 !important;
Copy link
Member Author

Choose a reason for hiding this comment

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

Prevents a "jump" in some blocks when selecting via list view.

- Add comprehensive unit tests for the BlockOutline component to validate rendering behavior based on block selection and category.
- Fix attribute binding in BlockListBlockProvider to ensure `bindableAttributes` is correctly passed.
- Update comments in private selectors for clarity on block visibility conditions.
@ramonjd
Copy link
Member Author

ramonjd commented Dec 17, 2025

It would be simpler if the "hide on..." just added a classname to the block in the editor and we let the media queries do their work.

Good point. And it matches the existing show/hide method. That's what I was doing over in #73735. I'll look at that, thanks!

Actually, I've left it for now because of the existing block visibility supports, which doesn't render the block.

https://github.com/WordPress/gutenberg/blob/trunk/packages/block-editor/src/components/block-list/block.js#L824

I think that's on purpose. cc @t-hamano for fact check.

On the plus side, I've simplified this PR greatly to do only one thing: apply the is-block-hidden to blocks at the appropriate breakpoint when the experiment is on.

I deleted things that can be done later, or are redundant.

@tellthemachines
Copy link
Contributor

Do you mean if we hide/show according to the viewport size?

If so, I think this comment is related: #72502 (comment)

The "View" dropdown will never allow us to preview a viewport bigger than that of the device we're on, and it's not even available at less than 782px. So we can't use it at all on mobile, and on tablet it can only give us a preview of what the screen looks like on tablet or mobile. The "Desktop" view on tablet doesn't reproduce the width of an actual desktop view:

"Desktop" on Tablet: Actual Desktop:
Screenshot 2025-12-18 at 8 28 47 am Screenshot 2025-12-18 at 8 29 27 am

When we choose to show/hide content based on breakpoint, we do so because a layout that works on a big screen doesn't necessarily work on a small one. We can't accurately preview a layout optimised for a big screen on a small one (some mobile browsers have the option to show the "desktop version" but the resulting view is rarely accurate)

What I'm getting at is we should ignore the settings of the "view" dropdown altogether, because it's not a reliable indicator of the user's actual screen width. If we simply rely on media queries to show/hide blocks, we'll always get an accurate view, whether we're using the view dropdown or an actual mobile device.

If we over-optimise for the unlikely event of someone wanting to edit a desktop layout on a phone, we risk creating a bad mobile editing experience for everyone. Not to mention that some of us still prefer to resize their browser window instead of using the "view" dropdown settings 🙀

@ramonjd
Copy link
Member Author

ramonjd commented Dec 17, 2025

What I'm getting at is we should ignore the settings of the "view" dropdown altogether, because it's not a reliable indicator of the user's actual screen width. If we simply rely on media queries to show/hide blocks, we'll always get an accurate view, whether we're using the view dropdown or an actual mobile device.

If we over-optimise for the unlikely event of someone wanting to edit a desktop layout on a phone, we risk creating a bad mobile editing experience for everyone. Not to mention that some of us still prefer to resize their browser window instead of using the "view" dropdown settings 🙀

Thanks for going deeper here. I think our instincts are aligned - I started with viewport in the first place on my POC, eventually combining it with the dropdown values.

When I was working on that POC, I realized there is, in fact, is almost zero relationship between WP's standard breakpoints and the width values of the device dropdown. 🙃

The catch is, if a user hides a paragraph in mobile viewport while editing, and the switches to the emulated device width and it doesn't hide (which is exactly what will happen if we just use viewport widths), then that's inconsistent. For that reason, I'm not convinced we should ignore the device dropdown altogether, but you're right that it's not a reliable indicator.

You mentioned "editing experience" - it's so true, and I couldn't agree more. I worry that we try to be too clever sometimes or mash new features into existing UI patterns.

Thinking about this iteratively though, and guided by the notion that our device previews should accurately reflect their respective breakpoints, then I think @mtias's comment here indicates that, yeah, the viewport should trigger breakpoints, but let's start with device previews and iterate. It's behind an experiment and the viewport connection I've already half-done.

Long term, I'm leaning towards better discoverability in relation to which blocks are hidden and which are not. If the sidebars are closed there is simply no way to know where hidden blocks are on the canvas, especially for those hidden in "Desktop" since "Desktop" device is the default setting.

Might be just me, but I find that to be an undesirable experience. I don't want to have to look around for or guess where all the hidden blocks are! 😆

Wondering if there other ways to balance this? The most promising ideas so far in my opinion are:

  1. The block is not actually "hidden" in the editor, but dimmed or indicated somehow until the user activates the device preview or toggles some other setting (another "mode" I guess 😢).
  2. This has been mentioned as a follow up, but the editor provides a means for users to locate all hidden blocks and their current settings. The list view does this to an extent, but I'm referring rather to a list of hidden blocks exclusive to their siblings, with accompanying controls to toggle them.

Discussions on this feature are getting pretty fragmented over a few open PRs and issues, sorry for banging on.

@jasmussen also has done a bunch of cogitating on this topic too.

@tellthemachines
Copy link
Contributor

When I was working on that POC, I realized there is, in fact, is almost zero relationship between WP's standard breakpoints and the width values of the device dropdown. 🙃

This is a bug! They should be the same.

@ramonjd
Copy link
Member Author

ramonjd commented Dec 17, 2025

This is a bug! They should be the same.

My kingdom for a single viewport constant! They're also in _breakpoints.scss 🙃

My guess is that they're different to accommodate sidebars etc? I suppose there's no harm in making them the same and seeing what explode 😄

@ramonjd
Copy link
Member Author

ramonjd commented Dec 18, 2025

The block is not actually "hidden" in the editor, but #73888 (comment) somehow until the user activates the device preview or toggles some other setting (another "mode" I guess 😢).

Also related:

#73888 (comment)

@jasmussen
Copy link
Contributor

jasmussen commented Dec 18, 2025

Complex conversation, but thanks for keeping at this, responsive is one of the top items.

When I was working on that POC, I realized there is, in fact, is almost zero relationship between WP's standard breakpoints and the width values of the device dropdown. 🙃

It would be grand to improve this space, however we can. Coming to mind, allowing customization of those default breakpoint values, AND tying the view dropdown sizes to those same values. I know that isn't the popular option here, but it still seems the simplest as far as user expectations, and the present direction #73888 goes. I will add, there's some additional ideas in #71210, around letting you resize and perhaps see those breakpoints as they happen.

In that vein, it seems useful to catalogue a list of all the shortcomings of this view dropdown, and slowly pick at them to eliminate these inconsistencies and problems. It seems possible, but perhaps I'm naïve?

@ramonjd
Copy link
Member Author

ramonjd commented Dec 20, 2025

It would be grand to improve this space, however we can.

💯

I'm only guessing that the device values are different to make the canvas preview behave in unknown editor environments (1 sidebar, 2 sidebars, distraction-free).

I couldn't find much context on the original PR, it was a while back, but maybe @tellthemachines remembers

No harm in trying.

Coming to mind, allowing customization of those default breakpoint values, AND tying the view dropdown sizes to those same values. I know that isn't the popular option here, but it still seems the simplest as far as user expectations, and the present direction #73888 goes.

Agree, let's start there, even if only to keep the scope manageable.

@ramonjd
Copy link
Member Author

ramonjd commented Dec 20, 2025

Just dumping this here for now, will come back to it.

Breakpoint comparison

Breakpoint Name SCSS (_breakpoints.scss) viewport/index.js compose/use-viewport-match components/breakpoint-values.js components/use-responsive-value.ts
zoomed-in 280px 280px
mobile 480px 480 480 480px
small 600px 600 600 600px
medium 782px 782 782 782px
large 960px 960 960 960px
xlarge/x-large 1080px 1080 1080px (as "x-large")
wide 1280px 1280 1280 1280px
huge 1440px 1440 1440 1440px
xhuge 1920px 1920
(em-based) 40em, 52em, 64em

To centralize, at least for common values that relate to devices/viewports, the first thing that comes to mind is a JSON source with a build step to generate a const/scss import. Maybe.

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

Labels

[Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants