Skip to content

Add Heading level variations#73823

Merged
mtias merged 8 commits intotrunkfrom
add/heading-level-variations
Dec 11, 2025
Merged

Add Heading level variations#73823
mtias merged 8 commits intotrunkfrom
add/heading-level-variations

Conversation

@mtias
Copy link
Copy Markdown
Member

@mtias mtias commented Dec 8, 2025

Closes #55067, #42181, and #32472.

image

This adds h1-h6 as block variations for the heading block, enabling the following behaviors:

  • Heading level shown in sidebar inspector variation picker
  • Level-specific icons for the sidebar picker
  • Variation detection via isActive callbacks

The variations use scope ['block', 'transform'] to appear in the sidebar picker and transforms, while keeping the inserter clean with just the base "Heading" block.

It also modifies the behavior of "block" scope in variations so that they are searchable via slash commands.

This means variations with only 'block' scope (not 'inserter') are marked as isSearchOnly and filtered from the inserter browse view, but remain searchable in inserter and slash commands.

Notes:

  • Thought of adding a new scope value of "search" but it seemed largely inadequate and we could work with what's in there already.
  • There's some extra code to handle the fact we use a default icon in the block type for all the variations but H* icons for the variation selector. This could be simplified if we removed the bookmark icon or combined it somehow. But that needs broader design discussion so starting with this.

- Heading level shown in sidebar inspector variation picker
- Level-specific icons in the sidebar picker
- Proper variation detection via isActive callbacks

The variations use scope ['block', 'transform'] to appear in the
sidebar picker and transforms, while keeping the inserter clean
with just the base "Heading" block.
@mtias mtias added [Type] Enhancement A suggestion for improvement. [Block] Heading Affects the Headings Block labels Dec 8, 2025
@github-actions github-actions bot added the First-time Contributor Pull request opened by a first-time contributor to Gutenberg repository label Dec 8, 2025
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 8, 2025

👋 Thanks for your first Pull Request and for helping build the future of Gutenberg and WordPress, @mtias! In case you missed it, we'd love to have you join us in our Slack community.

If you want to learn more about WordPress development in general, check out the Core Handbook full of helpful information.

Extends the inserter to include block-scope variations in search results,
enabling slash commands like `/h3` to find variations that appear in the
sidebar variation picker.

Variations with only 'block' scope (not 'inserter') are marked as
`isSearchOnly` and filtered from the inserter browse view, but remain
searchable.
@mtias mtias force-pushed the add/heading-level-variations branch from 213eb4a to 25d5818 Compare December 8, 2025 15:25
@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 8, 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: mtias <matveb@git.wordpress.org>
Co-authored-by: youknowriad <youknowriad@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: fabiankaegy <fabiankaegy@git.wordpress.org>
Co-authored-by: ockham <bernhard-reiter@git.wordpress.org>
Co-authored-by: skorasaurus <skorasaurus@git.wordpress.org>
Co-authored-by: SaxonF <saxonafletcher@git.wordpress.org>
Co-authored-by: ndiego <ndiego@git.wordpress.org>
Co-authored-by: priethor <priethor@git.wordpress.org>
Co-authored-by: bgardner <bgardner@git.wordpress.org>
Co-authored-by: richtabor <richtabor@git.wordpress.org>

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Dec 8, 2025

Size Change: +1.45 kB (+0.06%)

Total Size: 2.58 MB

Filename Size Change
build/scripts/block-editor/index.min.js 315 kB +81 B (+0.03%)
build/scripts/block-library/index.min.js 280 kB +1.35 kB (+0.49%)
build/styles/block-editor/style-rtl.css 16.4 kB +9 B (+0.05%)
build/styles/block-editor/style.css 16.4 kB +9 B (+0.06%)
ℹ️ 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-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 273 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.3 kB
build/scripts/edit-site/index.min.js 234 kB
build/scripts/edit-widgets/index.min.js 20 kB
build/scripts/editor/index.min.js 284 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.4 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/content-rtl.css 4.8 kB
build/styles/block-editor/content.css 4.79 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-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

@mtias
Copy link
Copy Markdown
Member Author

mtias commented Dec 8, 2025

I've simplified the handling of levels so that the UI is entirely driven by variations, which means remove the specific levels dropdown and consolidation the toolbar.

image image

@fabiankaegy
Copy link
Copy Markdown
Member

I've simplified the handling of levels so that the UI is entirely driven by variations, which means remove the specific levels dropdown and consolidation the toolbar.

image image

I in theory like the simplicity of this. But I think the UI change will be confusing.

It also creates a different experience than we show in the accordion block for example.

And finally I'm concerned of what this will mean for other variations such as the stretchy text. Can you not have a h4 stretchy text now?

@mtias
Copy link
Copy Markdown
Member Author

mtias commented Dec 8, 2025

@fabiankaegy what do you think will be confusing? It largely implements #55067.

The stretchy text stuff is moving to a block support, it should not be polluting the variations space. I think the current state creates awkwardness like #73819.

@fabiankaegy
Copy link
Copy Markdown
Member

@mtias I think just the change in existing habits will create friction. Which is totally fine if we think it is worth it.

I'm more concerned about hiding the level dropdown entirely in favor of just variations.

If there are already existing other variations in plugins etc it just breaks those because they can now no longer change the heading level.

And I do think the fact that we use the heading level dropdown in multiple blocks already makes it odd to remove it from the heading. Lots of 3rd party blocks also use the HeadingLevelDropdown control.

@ockham
Copy link
Copy Markdown
Contributor

ockham commented Dec 8, 2025

Looks like some e2e tests need adjusting, e.g.

diff --git a/test/e2e/specs/editor/blocks/heading.spec.js b/test/e2e/specs/editor/blocks/heading.spec.js
index b27c0fa52e4..719694b2210 100644
--- a/test/e2e/specs/editor/blocks/heading.spec.js
+++ b/test/e2e/specs/editor/blocks/heading.spec.js
@@ -366,7 +366,7 @@ test.describe( 'Heading', () => {
                await expect(
                        headingListViewItem,
                        'should show default block name if the content is empty'
-               ).toHaveText( 'Heading' );
+               ).toHaveText( 'Heading 2' );
 
                await editor.canvas
                        .getByRole( 'document', {

@skorasaurus
Copy link
Copy Markdown
Member

relatedly to what @fabiankaegy stated; in my organization, we remove the heading level 1 for our content editors since all of our templates are locked and let our content editors just use 2-6.

So, currently, we have:

add_filter( 'register_block_type_args', 'restrict_heading_levels', 10, 2 );

function restrict_heading_levels( $args, $block_type ) {
	if ( 'core/heading' !== $block_type ) {
		return $args;
	}
	// do not include H1
	$args['attributes']['levelOptions']['default'] = [ 2, 3, 4, 5, 6 ];

	return $args;

That filter is no longer applicable with the proposed PR and will certainly deserve a devnote at the very least to inform developers of the change.

although I can confirm that unregistering the variation prevents the variation from appearing (like the following for level 1):

wp.blocks.unregisterBlockVariation( 'core/heading', 'h1' );

I am personally ambivalent about the change overall and understand its benefits.

The block's toolbar has inconsistently been used for setting some really core settings to a block in some cases (like whether or not the list is ordered or not) but not for others (group block, whether it's stack or row or grid), so this isn't any different.

@mtias
Copy link
Copy Markdown
Member Author

mtias commented Dec 8, 2025

@skorasaurus thanks for the example! Pushed some code to handle that directly. Unregistering the variation should be the more idiomatic way, but we can still keep support for the attribute filtering. Could you check that with the above your code still works?

@skorasaurus
Copy link
Copy Markdown
Member

@skorasaurus thanks for the example! Pushed some code to handle that directly. Unregistering the variation should be the more idiomatic way, but we can still keep support for the attribute filtering. Could you check that with the above your code still works?

Yes, I can confirm that with the newer build from e6a6074 ; just having my current code example alone removes H1 from appearing. Thanks for the adjustment.

@Mamaduka Mamaduka removed the First-time Contributor Pull request opened by a first-time contributor to Gutenberg repository label Dec 9, 2025
keywords: variation.keywords || item.keywords,
frecency: calculateFrecency( time, count ),
// Pass through search-only flag for block-scope variations.
isSearchOnly: variation.isSearchOnly,
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.

This is a new flag right? I'm a little bit hesitant about it.

I mean "scope" have been used in variations to define where a variation should appear. And by adding this flag we now have two properties to define that. I may have a small preference for another "search" scope.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This is not being set by the consumer, it's just an internal flag to explicitly treat "block" context to show up in search. I implemented the search scope initially but it seemed unnecessary and confusing, since you'd think you need to pass the extra search scope to ensure something shows up on searches, but "inserter" already handles that.

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.

Ah ok, maybe we can just pass down the scope or something no?

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.

Regardless, I'm way less concerned now :)

unregisterBlockVariation( name, `h${ level }` );
}
} );
}
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.

This works and I think it's totally fine for now but:

changing a "default" attribute value to define what levels are available seems like a bad thing to start with. I wonder if we should deprecate that attribute. Unregistering a variation seems like a way better approach.

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.

That would break sites that rely on the default options attribute to remove the heading levels.

I think @fabiankaegy is also suggesting keeping the toolbar dropdown item - #73823 (comment).

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.

This is why I said "deprecate" and not "remove" :)

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.

That said, reading @fabiankaegy's comment I do agree that at a "pattern" level it's a good idea to allow disabling level options and things like that.

Copy link
Copy Markdown
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

This is working great in my testing

@fabiankaegy
Copy link
Copy Markdown
Member

@skorasaurus thanks for the example! Pushed some code to handle that directly. Unregistering the variation should be the more idiomatic way, but we can still keep support for the attribute filtering. Could you check that with the above your code still works?

Just putting it out there, but looking at #63535 I believe one of the "strengths" of that API over the unregistering of Variations is that it was context aware and instance based where as variations are global.

So with the olde model you were able to change the available heading levels on a per instance basis. Which this here doesn't allow for.

@jasmussen jasmussen self-requested a review December 9, 2025 09:54
Copy link
Copy Markdown
Contributor

@jasmussen jasmussen left a comment

Choose a reason for hiding this comment

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

This'll need a code review separately, I'm reviewing purely based on the visuals and the experience, which is captured here:

state

I like it! This feels more intuitive as far as using the heading level icons to immediately connect the heading level, also between block toolbar and inspector, which feels very ergonomic. You can always search for "Heading", whether slash command or inserter, and in that vein there's something semantically forward about this, in that it more or less embraces HTML and teaches you about the markup.

@mtias mtias force-pushed the add/heading-level-variations branch from 0c05b9d to 548d21d Compare December 11, 2025 16:58
@mtias mtias force-pushed the add/heading-level-variations branch from 548d21d to 82b3673 Compare December 11, 2025 17:58
@github-actions
Copy link
Copy Markdown

Flaky tests detected in 82b3673.
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/20142548400
📝 Reported issues:

@mtias mtias merged commit dd8c6af into trunk Dec 11, 2025
35 checks passed
@mtias mtias deleted the add/heading-level-variations branch December 11, 2025 19:26
@github-actions github-actions bot added this to the Gutenberg 22.4 milestone Dec 11, 2025
@desrosj
Copy link
Copy Markdown
Member

desrosj commented Dec 11, 2025

@mtias Just a reminder, please make sure to copy the list of contributor props from the Props Bot comment on a given PR into the bottom of the commit message so that everyone is credited for their contributions.

In this case, everyone who participated is an established, frequent contributor. So they will be included in the next release's props anyway and it's not an issue. But it becomes difficult to track while preparing for a release when they are one-off contributions. Thank you and everyone here for contributing! ❤️

@mtias
Copy link
Copy Markdown
Member Author

mtias commented Dec 11, 2025

I realized after merging, was going to follow up with another commit. In my defense, it's my first pull request on this project!

Comment on lines +2157 to +2158
// Combine inserter and block variations. Block-scope variations without
// inserter scope are searchable via slash commands but hidden from browse.
Copy link
Copy Markdown
Contributor

@t-hamano t-hamano Dec 26, 2025

Choose a reason for hiding this comment

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

It also modifies the behavior of "block" scope in variations so that they are searchable via slash commands.

This means variations with only 'block' scope (not 'inserter') are marked as isSearchOnly and filtered from the inserter browse view, but remain searchable in inserter and slash commands.

This new rule causes unintended behavior: variations that are only block-scoped can be searched with the slash inserter, for example, column block variations.

Image

dcalhoun added a commit to wordpress-mobile/GutenbergKit that referenced this pull request Feb 24, 2026
…view

Pass `isSearchOnly` through the block serialization pipeline and use it
to separate browsable blocks from search-only blocks (e.g. heading level
variations h1–h6 introduced in WordPress/gutenberg#73823). Search-only
blocks are placed in a dedicated `gbk-search-only` section that the
native inserter hides in browse mode but includes when the user searches,
matching the web inserter's behavior.
dcalhoun added a commit to wordpress-mobile/GutenbergKit that referenced this pull request Feb 25, 2026
…view

Pass `isSearchOnly` through the block serialization pipeline and use it
to separate browsable blocks from search-only blocks (e.g. heading level
variations h1–h6 introduced in WordPress/gutenberg#73823). Search-only
blocks are placed in a dedicated `gbk-search-only` section that the
native inserter hides in browse mode but includes when the user searches,
matching the web inserter's behavior.
dcalhoun added a commit to wordpress-mobile/GutenbergKit that referenced this pull request Feb 25, 2026
* build(deps): Upgrade @wordpress/* packages to .38 series

Upgrade all @wordpress/* dependencies to their .38.0 versions to align
with @wordpress/format-library@5.38.0's requirement for
@wordpress/components@^32.0.0. The previous mix of .36.0 and .38.0
packages caused duplicate @wordpress/components installations (v30.9.0
at the root and v32.0.0 nested), which led to React context mismatches
and block rendering failures.

* build: Regenerate patch files for upgraded packages

Regenerate patches for @wordpress/block-editor (15.11.0 -> 15.12.0),
@wordpress/block-library (9.36.0 -> 9.39.0), @wordpress/editor
(14.36.0 -> 14.39.0), and @wordpress/rich-text (7.38.0 -> 7.39.0).
The underlying fixes are unchanged; only the target versions and file
extensions (.js -> .mjs) were updated.

* fix: Filter search-only block variations from native inserter browse view

Pass `isSearchOnly` through the block serialization pipeline and use it
to separate browsable blocks from search-only blocks (e.g. heading level
variations h1–h6 introduced in WordPress/gutenberg#73823). Search-only
blocks are placed in a dedicated `gbk-search-only` section that the
native inserter hides in browse mode but includes when the user searches,
matching the web inserter's behavior.

* fix: Flatten native inserter search results into a single ranked list

Instead of preserving section groupings during search, flatten all blocks
(including search-only) into one section ranked by relevance. This avoids
the same block appearing in multiple sections and provides a cleaner
search experience, mirroring the approach used by the web inserter.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Block] Heading Affects the Headings Block [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

More intuitive transforming between content blocks

9 participants