Skip to content

Global Styles: Resolve per-level heading element styles in block inspector controls - #80495

Merged
andrewserong merged 5 commits into
trunkfrom
fix/global-styles-element-layers
Jul 22, 2026
Merged

andrewserong merged 5 commits into
trunkfrom
fix/global-styles-element-layers

Conversation

@andrewserong

@andrewserong andrewserong commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Part of:

Follows:

What?

Resolve per-level heading element styles in the block inspector style inheritance logic.

Note: I haven't touched link styles yet as I'm trying to keep this fairly contained while getting up to speed on the feature.

Why?

The was a noted gap in the big global styles inheritance PR and an intended follow-up. It allows Heading blocks (or those that use heading elements) to more accurately reflect inherited colors and styles in the block inspector sidebar, i.e. those values that are set at an individual heading level in global styles (e.g. h2) rather than at the root (heading) level.

How?

Basically, attempt to implement the ideas that Aaron raised in #80438 for adding in this elements layer. Any errors in the approach here are likely mine as I attempt to get up to speed with how this is hooked together. Broadly:

  • Move the logic where we're defining the element layers into block-editor/.../global-styles so that the global-styles-engine accepts elements as a prop (it's up to the caller to specify for the different blocks)
  • Grab the headingLevel from block attributes (via the clientId retrieved from blockEdit context) so that we can grab the right element layers to pass along to resolveStyle — in my mind this is the main "bit" of this PR as it's where we tell the resolver which heading level we're using for this particular block
  • Over in the global styles engine, update the resolveStyle context object to accept an elements array so that the caller can pass in a low-to-high hierarchy of elements used by the block. While this is different to the other props, in that it's an array instead of a single value, I think it has to be an array because for headings we have heading and a specific heading value like h2

Testing Instructions

To be thorough, test with the following core blocks:

  • Button (core/button) — make sure this one works as in trunk

Heading blocks:

  • Heading (core/heading)
  • Post Title (core/post-title)
  • Site Title (core/site-title)
  • Query Title (core/query-title)
  • Comments Title (core/comments-title)
  • Term Name (core/term-name)
  • Site Tagline (core/site-tagline)
  1. In global styles, go to the Typography section > Headings and select a particular heading level (e.g. h2)
  2. Give it some styles that look pretty obvious and save
  3. In the block editor try adding the above blocks and be sure to select the appropriate heading level for them (e.g. h2)
  4. Check that the styles you applied in global styles flow through to the block inspector controls
  5. Note that styles set at the block level in global styles should take precedence over elements styles, so if your theme already sets block-level styles, then you might not see the elements styles
  6. If you go to manually set values at the block level within post content (i.e. in the block inspector) then they should overwrite global styles values just as in the previous big PR that introduced this feature

Screenshots or screencast

Setting some styling rules at the numbered heading level in Global Styles > Headings elements > Typography

image

Then, when you're in a post and you add a heading block of the appropriate level, the controls should pick up that inherited value (they don't on trunk):

2026-07-21.14.49.45.mp4

Use of AI Tools

Claude Code

andrewserong and others added 2 commits July 21, 2026 12:02
…controls

Completes the heading-family portion of the element inheritance layer tracked
in #80438 (follow-up to #77894). The block inspector now reflects styles set on
a specific heading level (`styles.elements.h1`-`h6`) in addition to the shared
`heading` element.

Previously the resolver folded in only `styles.elements.heading` for
`core/heading`, so anything written by the per-level tabs in Styles >
Typography > Headings was invisible to inspector controls. Because `fontSize`
is deliberately disabled at the "All headings" level, every Global Styles
heading font size lands in `elements.hN` and never reached a control at all.

- Engine: replace the hardcoded `BLOCK_TO_ROOT_ELEMENT` map with an optional,
  caller-supplied `elements` list on the resolve context, ordered low to high
  precedence so `h2` wins over `heading`. This keeps the engine agnostic of
  block-to-element mappings and removes core block names from the package. The
  element list joins the memo cache key so two heading levels no longer share
  an entry.
- block-editor: map block name + `level` to element keys for the heading family
  (`core/heading`, `site-title`, `post-title`, `query-title`, `comments-title`,
  `term-name`, `site-tagline`). A level of 0 (a block rendered as `<p>`) folds
  no heading layer. `clientId` is read from the block edit context, so
  `useResolvedStyle`'s signature is unchanged and no new store subscription is
  added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@andrewserong andrewserong self-assigned this Jul 21, 2026
@andrewserong andrewserong added [Type] Enhancement A suggestion for improvement. [Package] Block editor /packages/block-editor Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi labels Jul 21, 2026
@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

Size Change: +326 B (0%)

Total Size: 7.75 MB

📦 View Changed
Filename Size Change
build/scripts/block-editor/index.min.js 427 kB +330 B (+0.08%)
build/scripts/block-library/index.min.js 354 kB +3 B (0%)
build/scripts/edit-site/index.min.js 304 kB -14 B (0%)
build/scripts/editor/index.min.js 500 kB +7 B (0%)

compressed-size-action

@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

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

@andrewserong
andrewserong requested a review from ramonjd July 21, 2026 05:31
@andrewserong
andrewserong marked this pull request as ready for review July 21, 2026 05:33
@andrewserong
andrewserong requested a review from ellatrix as a code owner July 21, 2026 05:33
@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

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: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: getdave <get_dave@git.wordpress.org>

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

@ramonjd ramonjd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I gave this a smoke test and it's working really well for top level elements. Also checked:

  • buttons
  • custom preset colors
  • hover states inside elements
  • the list of blocks in pr desc

It gets a bit weird when applying styles to elements inside blocks, e.g., Group > Elements > h2. Controls will show the top level value rather than the block's.

Not a huge deal I guess. Could be a follow up.

Thanks for getting this started! 🚀

case 'core/query-title':
case 'core/comments-title':
case 'core/term-name':
case 'core/site-tagline':

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.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I think the accordion one might need a little more work, but I'll double-check tomorrow. Thanks for taking this for a spin!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I got it working for the accordion heading: it needed different handling as it derives its heading level via context rather than it being set on the individual accordion heading (so that all accordion headings in the set of accordion items receive the same heading level). It's a bit hard-coded and possibly smelly, but I tried to keep it neat where I could. Let me know if you think it's too much, and we can roll back and look at it in a follow-up if need be.

I'm a little on the fence about all this hard-coding, but at least it's fairly internal for now, and we could always look at improving it in the future... in any case, here's how it's looking now, inheriting the heading element style:

image

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I'm a little on the fence about all this hard-coding, but at least it's fairly internal for now

Nice! I think it's okay. Is there an alternative in code?

My 2c is that this small fix makes headings consistent, and therefore better for the user. That to me is more important.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Nice! I think it's okay. Is there an alternative in code?
My 2c is that this small fix makes headings consistent, and therefore better for the user. That to me is more important.

Same here. I think I was just musing out loud about the idea that at some point we might codify this in block.json in some way and make it a bit more API-ey than hard-coded.

But agreed — for now I think focusing on improving the UX while keeping the code fairly self-contained is likely the right path forward.

I haven't looked at an alternative in code, mostly I wanted to confidence check that we're okay with the hard-coding. It seems we both are for now 😄

// block's own styles. `elements` is ordered low to high precedence, so a
// level-specific `h2` correctly wins over the generic `heading`.
const elementLayers = ( elements ?? [] )
.map( ( elementName ) => styles.elements?.[ elementName ] ?? null )

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.

So we only getting layers from styles.elements so the resolver doesn't know about block's ancestors.

So changes to styles.blocks['core/group'].elements.h2 will show the inherited style it knows about, not the one that is applied.

Image

I suspect it could get rabbit holey. Not sure.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

So we only getting layers from styles.elements so the resolver doesn't know about block's ancestors.

Yeah, that's a limitation of the current approach for sure. Not sure how well it'll work to walk up the block hierarchy to see what's there 🤔

Will poke at the idea tomorrow and make a call on whether we should go down the rabbithole now, or defer it to a future voyage!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

whether we should go down the rabbithole now, or defer it to a future voyage!

It is looking a bit hairy performing block lookups up the block hierarchy to make sure we're inheriting things correctly. My vote would be to leave blocks-within-blocks behaviour to a follow up and mark it as a task in the linked issue. What do you reckon?

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.

Agree. A follow up sounds best. Thanks for digging in.

@getdave getdave left a 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.

I manually tested an number of scenarios and this worked as expected.

Noting @ramonjd's feedback about ancestor styles which will need to be resolved either here or in a follow up - will this be tracked somewhere?

As noted elsewhere I think we need some UI explanation about inherited styles other than a dotted line 😅 but I appreciate that's still in the works.

Great work here - this feature is a big win for the Editor 👏

@ramonjd

ramonjd commented Jul 22, 2026 •

Copy link
Copy Markdown
Member

As noted elsewhere I think we need some UI explanation about inherited styles other than a dotted line

Thanks @getdave. There are things coming out of the sausage factory on this point.

Some suggested visual tweaks to the icons (#77894 (comment) and #80506).

Aaron had a crack at tooltips, but I think that needs more attention in the next cycle as well as figuring out the trade off between UX and the components/design systems.

@andrewserong

Copy link
Copy Markdown
Contributor Author

+1 thanks for taking a look, Dave!

feedback about ancestor styles which will need to be resolved either here or in a follow up - will this be tracked somewhere?

Agreed this should be looked into. My vote is to leave it for a follow-up and for us use the linked issue #80438 to track it. My gut feeling is that for 7.1 we won't have perfect coverage here, and I think the task will be to improve how this works iteratively across small PRs and see at what point the coverage feels "good enough".

Which means, for now, is the coverage in this PR a good step forward, or does it feel too gappy?

@ramonjd ramonjd left a comment

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.

  • Top level element values flow through to the inspector controls as advertised
  • Switching heading levels updates the swatches
  • Block-level global styles still win over element styles

As mentioned supporting paths like Group block > elements > h2 would be a nice follow up but I don't think it's a blocker here.

Nice work 🚀

LGTM ✅

### New Features

- Added a private `resolveStyle` API that resolves the merged Global Styles cascade (root, block type, and applied block style variation) for a block, returning the inherited value and a per-leaf source map.
- Added a private `resolveStyle` API that resolves the merged Global Styles cascade (root, root-level element layers, block type, and applied block style variation) for a block, returning the inherited value and a per-leaf source map. Element layers are supplied by the caller as an ordered `elements` list on the resolve context (low to high precedence, e.g. `[ 'heading', 'h2' ]`), keeping the engine agnostic of block-to-element mappings.

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.

Needs a #80495 link I think

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added the PR to a separate changelog entry. I left the existing entries alone just in case it affects branch conflicts when we go to backport this (but I might be overthinking this one 😄)

function mockStores( rawGlobalStyles, blockStyles = [] ) {
function mockStores(
rawGlobalStyles,
{ blockStyles = [], attributes = {} } = {}

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.

Can be later, but you do you think a test with { level: 2 } (or one with { level: 0 }) would catch a future regression in the path between useVariationAndElements and getElementLayers.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

We've already got a level: 2 so I've added one with level: 0, good catch!

@andrewserong

Copy link
Copy Markdown
Contributor Author

As mentioned supporting paths like Group block > elements > h2 would be a nice follow up but I don't think it's a blocker here.

Cheers! Yes, let's take a look in a follow-up and I'll jot down some notes in the linked issue.

Thanks for the reviews! I'll merge this in once tests pass

@andrewserong andrewserong added the Backport to WP 7.1 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 22, 2026
@andrewserong
andrewserong merged commit 76749bf into trunk Jul 22, 2026
55 of 57 checks passed
@andrewserong
andrewserong deleted the fix/global-styles-element-layers branch July 22, 2026 04:40
@github-project-automation github-project-automation Bot moved this from 🔎 Needs Review to ✅ Done in WordPress 7.1 Editor Tasks Jul 22, 2026
@github-actions github-actions Bot added this to the Gutenberg 23.7 milestone Jul 22, 2026
@github-actions github-actions Bot removed the Backport to WP 7.1 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 22, 2026
gutenbergplugin pushed a commit that referenced this pull request Jul 22, 2026
…ector controls (#80495)

* Global Styles: resolve per-level heading element styles in inspector controls

Completes the heading-family portion of the element inheritance layer tracked
in #80438 (follow-up to #77894). The block inspector now reflects styles set on
a specific heading level (`styles.elements.h1`-`h6`) in addition to the shared
`heading` element.

Previously the resolver folded in only `styles.elements.heading` for
`core/heading`, so anything written by the per-level tabs in Styles >
Typography > Headings was invisible to inspector controls. Because `fontSize`
is deliberately disabled at the "All headings" level, every Global Styles
heading font size lands in `elements.hN` and never reached a control at all.

- Engine: replace the hardcoded `BLOCK_TO_ROOT_ELEMENT` map with an optional,
  caller-supplied `elements` list on the resolve context, ordered low to high
  precedence so `h2` wins over `heading`. This keeps the engine agnostic of
  block-to-element mappings and removes core block names from the package. The
  element list joins the memo cache key so two heading levels no longer share
  an entry.
- block-editor: map block name + `level` to element keys for the heading family
  (`core/heading`, `site-title`, `post-title`, `query-title`, `comments-title`,
  `term-name`, `site-tagline`). A level of 0 (a block rendered as `<p>`) folds
  no heading layer. `clientId` is read from the block edit context, so
  `useResolvedStyle`'s signature is unchanged and no new store subscription is
  added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Update comment

* Try to fix tests

* Handle accordion heading

* Add a test for the 0 heading level case, tidy up changelog

---------

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: getdave <get_dave@git.wordpress.org>
@github-actions github-actions Bot added the Backported to WP Core Pull request that has been successfully merged into WP Core label Jul 22, 2026
@github-actions

Copy link
Copy Markdown

I just cherry-picked this PR to the wp/7.1 branch to get it included in the next release: 26b39c0

@t-hamano

Copy link
Copy Markdown
Contributor

Sharing for visibility; I'm considering removing the UI for global style inheritance from WP 7.1 and GB 23.6 releases, although it is not yet finalized. Please refer to #77894 (comment) for details.

@andrewserong

Copy link
Copy Markdown
Contributor Author

Sharing for visibility; I'm considering removing the UI for global style inheritance from WP 7.1 and GB 23.6 releases, although it is not yet finalized. Please refer to #77894 (comment) for details.

Oh, thanks for the heads-up @t-hamano! Do you want me to hold off on working on fixes like this for now? (My main interest is just in helping out with whatever's going to help with the release — whether that's trying to stabilize or fix things, or get out of your way 😄)

@t-hamano t-hamano added the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Jul 22, 2026
@t-hamano

Copy link
Copy Markdown
Contributor

I'm considering introducing the Gutenberg plugin check as I do not want to stop continuous development.

See #77894 (comment)

t-hamano added a commit that referenced this pull request Jul 22, 2026
…lugin (#80555)

* Global Styles: Gate the inherited value treatment on the plugin flag

The inherited Global Styles treatment added in #77894 and #80495 lives in
`block-editor`, which is synced to WordPress Core. Keep it to the Gutenberg
plugin so Core builds keep showing locally-set values alone.

`useResolvedStyle` resolves nothing when the flag is off, so each panel's
`inheritedValue = value` default restores the pre-feature wiring, and the
block-supports panels default `showInheritanceLabelIndicators` to the same
flag, switching off every affordance routed through `getInheritanceProps`.
Both are required: gating only the value leaves `inheritedValue === value`,
which reads as a local override on every locally-set control and renders a
reset dot.

The typography panel's link-color sync reads `inheritedValue` outside that
prop, and collapsing it onto `value` would write a link color where trunk
wrote none, so it falls back to the pre-feature comparison when the flag is
off.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Note why the inheritance gate returns early

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Add the PR number to the changelog entry

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Restore comment on inheritance className gating

The comment documented a bug found in the original implementation: the
layout className must always be passed through, and only the inheritance
treatment is gated on `showInheritanceLabelIndicators`. Dropping it loses
that context since the code itself is unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Cover the Core path of ENABLE_GLOBAL_STYLES_INHERITANCE

The unit test environment sets `IS_GUTENBERG_PLUGIN` to true, so every
existing test exercises the plugin branch only. Nothing guarded the Core
behaviour the flag is meant to preserve, which is the behaviour that ships
to WordPress.

Add two files that mock the constant to false. `jest.mock` is file-scoped,
so they cannot live alongside the plugin-path tests.

- `useResolvedStyle` resolves nothing, so the panels fall back to their
  `inheritedValue = value` default and Core shows locally-set values only.
- `TypographyPanel` applies no inherited treatment and no reset dot by
  default, and its link colour sync falls back to comparing the local pair,
  which is what Core did before the inheritance treatment landed.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Compare inherited values in the Core link colour sync

The Core fallback compared `value`, but the check this replaced compared
`inheritedValue`. The two are only the same in the block inspector, where
`useResolvedStyle` resolves nothing and the prop falls back to `value`.

In Global Styles they diverge: `value` is the user config and
`inheritedValue` is the merged config. Comparing `value` there meant a
theme defining a mismatched text and link colour pair would still sync the
link colour, because both sides of the comparison were undefined until the
user set something.

Restore the original comparison, which is correct on both paths.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Guard the Core link colour sync against reading the user config

The existing link colour tests all render without an `inheritedValue`, the
block inspector shape where the prop falls back to `value`. On that path
the two configs are identical, so none of them notice if the comparison
switches from `inheritedValue` to `value`.

Add a case with the divergent Global Styles shape: an empty user config
and a merged config whose text and link colours differ. Reading `value`
there finds undefined on both sides and syncs, which the assertion catches.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
gutenbergplugin pushed a commit that referenced this pull request Jul 22, 2026
…lugin (#80555)

* Global Styles: Gate the inherited value treatment on the plugin flag

The inherited Global Styles treatment added in #77894 and #80495 lives in
`block-editor`, which is synced to WordPress Core. Keep it to the Gutenberg
plugin so Core builds keep showing locally-set values alone.

`useResolvedStyle` resolves nothing when the flag is off, so each panel's
`inheritedValue = value` default restores the pre-feature wiring, and the
block-supports panels default `showInheritanceLabelIndicators` to the same
flag, switching off every affordance routed through `getInheritanceProps`.
Both are required: gating only the value leaves `inheritedValue === value`,
which reads as a local override on every locally-set control and renders a
reset dot.

The typography panel's link-color sync reads `inheritedValue` outside that
prop, and collapsing it onto `value` would write a link color where trunk
wrote none, so it falls back to the pre-feature comparison when the flag is
off.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Note why the inheritance gate returns early

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Add the PR number to the changelog entry

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Restore comment on inheritance className gating

The comment documented a bug found in the original implementation: the
layout className must always be passed through, and only the inheritance
treatment is gated on `showInheritanceLabelIndicators`. Dropping it loses
that context since the code itself is unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Cover the Core path of ENABLE_GLOBAL_STYLES_INHERITANCE

The unit test environment sets `IS_GUTENBERG_PLUGIN` to true, so every
existing test exercises the plugin branch only. Nothing guarded the Core
behaviour the flag is meant to preserve, which is the behaviour that ships
to WordPress.

Add two files that mock the constant to false. `jest.mock` is file-scoped,
so they cannot live alongside the plugin-path tests.

- `useResolvedStyle` resolves nothing, so the panels fall back to their
  `inheritedValue = value` default and Core shows locally-set values only.
- `TypographyPanel` applies no inherited treatment and no reset dot by
  default, and its link colour sync falls back to comparing the local pair,
  which is what Core did before the inheritance treatment landed.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Compare inherited values in the Core link colour sync

The Core fallback compared `value`, but the check this replaced compared
`inheritedValue`. The two are only the same in the block inspector, where
`useResolvedStyle` resolves nothing and the prop falls back to `value`.

In Global Styles they diverge: `value` is the user config and
`inheritedValue` is the merged config. Comparing `value` there meant a
theme defining a mismatched text and link colour pair would still sync the
link colour, because both sides of the comparison were undefined until the
user set something.

Restore the original comparison, which is correct on both paths.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Guard the Core link colour sync against reading the user config

The existing link colour tests all render without an `inheritedValue`, the
block inspector shape where the prop falls back to `value`. On that path
the two configs are identical, so none of them notice if the comparison
switches from `inheritedValue` to `value`.

Add a case with the divergent Global Styles shape: an empty user config
and a merged config whose text and link colours differ. Reading `value`
there finds undefined on both sides and syncs, which the assertion catches.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
t-hamano pushed a commit that referenced this pull request Jul 22, 2026
…ector controls (#80495)

* Global Styles: resolve per-level heading element styles in inspector controls

Completes the heading-family portion of the element inheritance layer tracked
in #80438 (follow-up to #77894). The block inspector now reflects styles set on
a specific heading level (`styles.elements.h1`-`h6`) in addition to the shared
`heading` element.

Previously the resolver folded in only `styles.elements.heading` for
`core/heading`, so anything written by the per-level tabs in Styles >
Typography > Headings was invisible to inspector controls. Because `fontSize`
is deliberately disabled at the "All headings" level, every Global Styles
heading font size lands in `elements.hN` and never reached a control at all.

- Engine: replace the hardcoded `BLOCK_TO_ROOT_ELEMENT` map with an optional,
  caller-supplied `elements` list on the resolve context, ordered low to high
  precedence so `h2` wins over `heading`. This keeps the engine agnostic of
  block-to-element mappings and removes core block names from the package. The
  element list joins the memo cache key so two heading levels no longer share
  an entry.
- block-editor: map block name + `level` to element keys for the heading family
  (`core/heading`, `site-title`, `post-title`, `query-title`, `comments-title`,
  `term-name`, `site-tagline`). A level of 0 (a block rendered as `<p>`) folds
  no heading layer. `clientId` is read from the block edit context, so
  `useResolvedStyle`'s signature is unchanged and no new store subscription is
  added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Update comment

* Try to fix tests

* Handle accordion heading

* Add a test for the 0 heading level case, tidy up changelog

---------

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: getdave <get_dave@git.wordpress.org>
t-hamano added a commit that referenced this pull request Jul 22, 2026
…lugin (#80555)

* Global Styles: Gate the inherited value treatment on the plugin flag

The inherited Global Styles treatment added in #77894 and #80495 lives in
`block-editor`, which is synced to WordPress Core. Keep it to the Gutenberg
plugin so Core builds keep showing locally-set values alone.

`useResolvedStyle` resolves nothing when the flag is off, so each panel's
`inheritedValue = value` default restores the pre-feature wiring, and the
block-supports panels default `showInheritanceLabelIndicators` to the same
flag, switching off every affordance routed through `getInheritanceProps`.
Both are required: gating only the value leaves `inheritedValue === value`,
which reads as a local override on every locally-set control and renders a
reset dot.

The typography panel's link-color sync reads `inheritedValue` outside that
prop, and collapsing it onto `value` would write a link color where trunk
wrote none, so it falls back to the pre-feature comparison when the flag is
off.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Note why the inheritance gate returns early

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Add the PR number to the changelog entry

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Restore comment on inheritance className gating

The comment documented a bug found in the original implementation: the
layout className must always be passed through, and only the inheritance
treatment is gated on `showInheritanceLabelIndicators`. Dropping it loses
that context since the code itself is unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Cover the Core path of ENABLE_GLOBAL_STYLES_INHERITANCE

The unit test environment sets `IS_GUTENBERG_PLUGIN` to true, so every
existing test exercises the plugin branch only. Nothing guarded the Core
behaviour the flag is meant to preserve, which is the behaviour that ships
to WordPress.

Add two files that mock the constant to false. `jest.mock` is file-scoped,
so they cannot live alongside the plugin-path tests.

- `useResolvedStyle` resolves nothing, so the panels fall back to their
  `inheritedValue = value` default and Core shows locally-set values only.
- `TypographyPanel` applies no inherited treatment and no reset dot by
  default, and its link colour sync falls back to comparing the local pair,
  which is what Core did before the inheritance treatment landed.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Compare inherited values in the Core link colour sync

The Core fallback compared `value`, but the check this replaced compared
`inheritedValue`. The two are only the same in the block inspector, where
`useResolvedStyle` resolves nothing and the prop falls back to `value`.

In Global Styles they diverge: `value` is the user config and
`inheritedValue` is the merged config. Comparing `value` there meant a
theme defining a mismatched text and link colour pair would still sync the
link colour, because both sides of the comparison were undefined until the
user set something.

Restore the original comparison, which is correct on both paths.

Co-Authored-By: Claude <noreply@anthropic.com>

* Global Styles: Guard the Core link colour sync against reading the user config

The existing link colour tests all render without an `inheritedValue`, the
block inspector shape where the prop falls back to `value`. On that path
the two configs are identical, so none of them notice if the comparison
switches from `inheritedValue` to `value`.

Add a case with the divergent Global Styles shape: an empty user config
and a merged config whose text and link colours differ. Reading `value`
there finds undefined on both sides and syncs, which the assertion catches.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
@t-hamano

Copy link
Copy Markdown
Contributor

I just cherry-picked this PR to the release/23.6 branch to get it included in the next release: 6cd4ef0

@t-hamano t-hamano removed the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Jul 22, 2026
dd32 pushed a commit to dd32/wordpress-develop that referenced this pull request Jul 22, 2026
This updates the pinned commit hash of the Gutenberg repository from `e73c3c481db0650183f092af157f6e42efe9ee2d` to `4997026b75c922d8a6f77a03d72ed7cad04c7073`.

A full list of changes included in this commit can be found on GitHub: 
WordPress/gutenberg@e73c3c4...4997026

- Notes: Replace blur-deselect bookkeeping with useFocusOutside (WordPress/gutenberg#80222)
- Playlist: Update @SInCE tags to 7.1.0 (WordPress/gutenberg#80317)
- fix playlist block Dimensions Design (WordPress/gutenberg#80312)
- UI: Backport compat overlay fixes to WordPress 7.1 (WordPress/gutenberg#80322)
- Editor: allow selecting which block styles to apply globally (WordPress/gutenberg#79839)
- Global Styles: Reject non-string custom CSS in the REST controller (WordPress/gutenberg#80338)
- Open inspector sidebar when toggling responsive editing (WordPress/gutenberg#80307)
- Client Side Media: Honor image_strip_meta and image_max_bit_depth on the client upload path (WordPress/gutenberg#80218)
- Hide block style variations when state is enabled in global styles (WordPress/gutenberg#80341)
- Media REST API: Fix sideload and finalize for EXIF rotated images (WordPress/gutenberg#80295)
- Fix upload snackbar stuck in uploading state on server-side uploads (WordPress/gutenberg#80345)
- Try fixing responsive layout in Nav block (WordPress/gutenberg#80305)
- Responsive styles: Use viewport dropdown to control states for in-editor global styles sidebar (WordPress/gutenberg#80339)
- RichTextControl: Replace DOM focus tracking with a single React-tree focus boundary (WordPress/gutenberg#80324)
- Notes: Finish WPDS treatment for mention chips (WordPress/gutenberg#80300)
- Notes: Add placeholders to the RichText fields (WordPress/gutenberg#80296)
- Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs (WordPress/gutenberg#80260) (WordPress/gutenberg#80342)
- Device preview dropdown: use active color for device icon when responsive styles are active (WordPress/gutenberg#80346)
- Fix default aspect ratio for lazy loaded Featured image (WordPress/gutenberg#80386)
- Vips/upload-media: consolidate optional params into options objects (WordPress/gutenberg#80330)
- Autocompleters: Don't pre-encode mention search terms (WordPress/gutenberg#80377)
- Animated GIF uploads: generate sub-sizes from the first frame, matching core (WordPress/gutenberg#80268)
- Custom CSS: Fix cascade order against block style variations (WordPress/gutenberg#80340)
- Rich Text: Restore the selection when focus returns to the editable (WordPress/gutenberg#80396)
- Notes: Arm the mention kses allowance on REST note creation (WordPress/gutenberg#80221)
- Fix upload snackbar double-counting a single HEIC upload in Safari (WordPress/gutenberg#80436)
- ContentEditableControl: fix invalid label association with contenteditable div (WordPress/gutenberg#80441)
- Editor: Disable canvas resizing while zoomed out (WordPress/gutenberg#80391)
- Fix Color Picker Cursor Shaking Issue (WordPress/gutenberg#80205) (WordPress/gutenberg#80435)
- Misc fixes for WordPress-Develop 7.0 merges (WordPress/gutenberg#80444)
- Style Book: Restore live global styles updates on the styles route (WordPress/gutenberg#80459)
- Worker threads: reject pending RPC calls on worker failure or termination (WordPress/gutenberg#79955) (WordPress/gutenberg#80421)
- Media: Add timeout and size guardrails to client-side GIF to video conversion (WordPress/gutenberg#80420)
- Post Content: Use the default block appender for empty content (WordPress/gutenberg#80026)
- Block Supports: Handle nested array block gap values properly (WordPress/gutenberg#80464)
- Editor: Restore fixed device preview height for mobile and tablet (WordPress/gutenberg#80466)
- Block Editor: Guard against non-string spacing preset values (WordPress/gutenberg#80467)
- Writing flow: fully select the ancestor when a text selection crosses a nesting boundary (WordPress/gutenberg#80462)
- Block Editor: Reflect inherited Global Styles values in block inspector controls (WordPress/gutenberg#80481)
- Autocomplete: Reference the suggestions list with `aria-controls` and `aria-haspopup` (WordPress/gutenberg#80403) (WordPress/gutenberg#80499)
- Media: Remove the redundant __heicUploadSupport flag (WordPress/gutenberg#80486)
- State control - avoid tertiary variant on toggle to match style of other dropdown toggles (WordPress/gutenberg#80505)
- Icons: Store the sanitized SVG content when registering an icon (WordPress/gutenberg#80508)
- Fix `useHomeEnd` on tabs in mac testing (WordPress/gutenberg#80374)
- Playlist: Fix playback of tracks served without CORS headers (WordPress/gutenberg#80533)
- Redirect editing events to extension handlers under editableRoot (WordPress/gutenberg#80287)
- Writing flow: fully select the items when a selection extends down into a nested item (WordPress/gutenberg#80492)
- Global Styles panels: fix wrong preset committed and shown when two color presets share a hex (WordPress/gutenberg#80497)
- Replaces the `title` attributes used by revision inline diff annotations with `aria-describedby` (WordPress/gutenberg#80440)
- Notes: Remove "Add note" from the inline styles dropdown (WordPress/gutenberg#80531)
- Global Styles: Resolve per-level heading element styles in block inspector controls (WordPress/gutenberg#80495)
- Notes: Render @ mentions as span chips and narrow the kses class allowance (WordPress/gutenberg#80528)
- Revisions: Specify block level diff status via aria-label (WordPress/gutenberg#77779)
- Backport from Core: improve icon name unit tests (WordPress/gutenberg#80552)
- Device type preview: fix collapsing to content height (WordPress/gutenberg#80553)
- Wrap notices in ThemeProvider with 0 corner radius (WordPress/gutenberg#80557)
- Global Styles: Limit the inherited value treatment to the Gutenberg plugin (WordPress/gutenberg#80555)
- Fix crashes when manipulating locked blocks (WordPress/gutenberg#80509)
- Notes: align floating threads with their inline marker (WordPress/gutenberg#79877)

Props wildworks.
See #65529.

git-svn-id: https://develop.svn.wordpress.org/trunk@62824 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request Jul 22, 2026
This updates the pinned commit hash of the Gutenberg repository from `e73c3c481db0650183f092af157f6e42efe9ee2d` to `4997026b75c922d8a6f77a03d72ed7cad04c7073`.

A full list of changes included in this commit can be found on GitHub: 
WordPress/gutenberg@e73c3c4...4997026

- Notes: Replace blur-deselect bookkeeping with useFocusOutside (WordPress/gutenberg#80222)
- Playlist: Update @SInCE tags to 7.1.0 (WordPress/gutenberg#80317)
- fix playlist block Dimensions Design (WordPress/gutenberg#80312)
- UI: Backport compat overlay fixes to WordPress 7.1 (WordPress/gutenberg#80322)
- Editor: allow selecting which block styles to apply globally (WordPress/gutenberg#79839)
- Global Styles: Reject non-string custom CSS in the REST controller (WordPress/gutenberg#80338)
- Open inspector sidebar when toggling responsive editing (WordPress/gutenberg#80307)
- Client Side Media: Honor image_strip_meta and image_max_bit_depth on the client upload path (WordPress/gutenberg#80218)
- Hide block style variations when state is enabled in global styles (WordPress/gutenberg#80341)
- Media REST API: Fix sideload and finalize for EXIF rotated images (WordPress/gutenberg#80295)
- Fix upload snackbar stuck in uploading state on server-side uploads (WordPress/gutenberg#80345)
- Try fixing responsive layout in Nav block (WordPress/gutenberg#80305)
- Responsive styles: Use viewport dropdown to control states for in-editor global styles sidebar (WordPress/gutenberg#80339)
- RichTextControl: Replace DOM focus tracking with a single React-tree focus boundary (WordPress/gutenberg#80324)
- Notes: Finish WPDS treatment for mention chips (WordPress/gutenberg#80300)
- Notes: Add placeholders to the RichText fields (WordPress/gutenberg#80296)
- Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs (WordPress/gutenberg#80260) (WordPress/gutenberg#80342)
- Device preview dropdown: use active color for device icon when responsive styles are active (WordPress/gutenberg#80346)
- Fix default aspect ratio for lazy loaded Featured image (WordPress/gutenberg#80386)
- Vips/upload-media: consolidate optional params into options objects (WordPress/gutenberg#80330)
- Autocompleters: Don't pre-encode mention search terms (WordPress/gutenberg#80377)
- Animated GIF uploads: generate sub-sizes from the first frame, matching core (WordPress/gutenberg#80268)
- Custom CSS: Fix cascade order against block style variations (WordPress/gutenberg#80340)
- Rich Text: Restore the selection when focus returns to the editable (WordPress/gutenberg#80396)
- Notes: Arm the mention kses allowance on REST note creation (WordPress/gutenberg#80221)
- Fix upload snackbar double-counting a single HEIC upload in Safari (WordPress/gutenberg#80436)
- ContentEditableControl: fix invalid label association with contenteditable div (WordPress/gutenberg#80441)
- Editor: Disable canvas resizing while zoomed out (WordPress/gutenberg#80391)
- Fix Color Picker Cursor Shaking Issue (WordPress/gutenberg#80205) (WordPress/gutenberg#80435)
- Misc fixes for WordPress-Develop 7.0 merges (WordPress/gutenberg#80444)
- Style Book: Restore live global styles updates on the styles route (WordPress/gutenberg#80459)
- Worker threads: reject pending RPC calls on worker failure or termination (WordPress/gutenberg#79955) (WordPress/gutenberg#80421)
- Media: Add timeout and size guardrails to client-side GIF to video conversion (WordPress/gutenberg#80420)
- Post Content: Use the default block appender for empty content (WordPress/gutenberg#80026)
- Block Supports: Handle nested array block gap values properly (WordPress/gutenberg#80464)
- Editor: Restore fixed device preview height for mobile and tablet (WordPress/gutenberg#80466)
- Block Editor: Guard against non-string spacing preset values (WordPress/gutenberg#80467)
- Writing flow: fully select the ancestor when a text selection crosses a nesting boundary (WordPress/gutenberg#80462)
- Block Editor: Reflect inherited Global Styles values in block inspector controls (WordPress/gutenberg#80481)
- Autocomplete: Reference the suggestions list with `aria-controls` and `aria-haspopup` (WordPress/gutenberg#80403) (WordPress/gutenberg#80499)
- Media: Remove the redundant __heicUploadSupport flag (WordPress/gutenberg#80486)
- State control - avoid tertiary variant on toggle to match style of other dropdown toggles (WordPress/gutenberg#80505)
- Icons: Store the sanitized SVG content when registering an icon (WordPress/gutenberg#80508)
- Fix `useHomeEnd` on tabs in mac testing (WordPress/gutenberg#80374)
- Playlist: Fix playback of tracks served without CORS headers (WordPress/gutenberg#80533)
- Redirect editing events to extension handlers under editableRoot (WordPress/gutenberg#80287)
- Writing flow: fully select the items when a selection extends down into a nested item (WordPress/gutenberg#80492)
- Global Styles panels: fix wrong preset committed and shown when two color presets share a hex (WordPress/gutenberg#80497)
- Replaces the `title` attributes used by revision inline diff annotations with `aria-describedby` (WordPress/gutenberg#80440)
- Notes: Remove "Add note" from the inline styles dropdown (WordPress/gutenberg#80531)
- Global Styles: Resolve per-level heading element styles in block inspector controls (WordPress/gutenberg#80495)
- Notes: Render @ mentions as span chips and narrow the kses class allowance (WordPress/gutenberg#80528)
- Revisions: Specify block level diff status via aria-label (WordPress/gutenberg#77779)
- Backport from Core: improve icon name unit tests (WordPress/gutenberg#80552)
- Device type preview: fix collapsing to content height (WordPress/gutenberg#80553)
- Wrap notices in ThemeProvider with 0 corner radius (WordPress/gutenberg#80557)
- Global Styles: Limit the inherited value treatment to the Gutenberg plugin (WordPress/gutenberg#80555)
- Fix crashes when manipulating locked blocks (WordPress/gutenberg#80509)
- Notes: align floating threads with their inline marker (WordPress/gutenberg#79877)

Props wildworks.
See #65529.
Built from https://develop.svn.wordpress.org/trunk@62824


git-svn-id: http://core.svn.wordpress.org/trunk@62104 1a063a9b-81f0-0310-95a4-ce76da25c4cd
wporg-sync pushed a commit to WordPress/wordpress-develop that referenced this pull request Sep 8, 2026
This updates the pinned commit hash of the Gutenberg repository from `2872d71cde528d82675f14862a1b84e2b8abbaea` to `5a0417990a9404cc2562cdd35e3054cb0d3e546e` (version `23.7.0`).

A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/2872d71cde528d82675f14862a1b84e2b8abbaea..v23.7.0.

- Release: Fix cherry-pick success detection (WordPress/gutenberg#80249)
- Add Table of Contents e2e user story coverage (WordPress/gutenberg#80199)
- Only include icon library SVGs listed as `public` in the Zip file published to GitHub Container Registry for `wordpress-develop` (WordPress/gutenberg#79338)
- fix: set dataviews popover hover text color (WordPress/gutenberg#80105)
- added missing doc (WordPress/gutenberg#80172)
- DataViews: Fix the unintended gap between `list` layout items when `groupBy` is set (WordPress/gutenberg#80254)
- Social Link: Fix stray closing tag in Tumblr icon markup (WordPress/gutenberg#80257)
- DataViews: Fix the `list` layout ignoring some settings when `groupBy` is set (WordPress/gutenberg#80255)
- Icon block: Show text and background color controls by default. (WordPress/gutenberg#80251)
- DataViews: Add shift-click range selection (WordPress/gutenberg#80046)
- UI: Remove unused direction factor CSS property (WordPress/gutenberg#80269)
- theme: Disallow src in published package (WordPress/gutenberg#80213)
- Fix: stale post edit message in modal (WordPress/gutenberg#79997)
- Icons: Validate SVG icons include viewBox (WordPress/gutenberg#80273)
- Remove obsolete __unstable-large size props (WordPress/gutenberg#80081)
- Responsive Editing: support editing pattern styles (WordPress/gutenberg#80233)
- Tab List: Add toolbar buttons to reorder tabs (WordPress/gutenberg#80107)
- Move image editor styles to the block editor package (WordPress/gutenberg#80165)
- Cover/Accordion: Exit on Enter (WordPress/gutenberg#77301)
- Hide color controls for Navigation and Social Icons when viewport states are active (WordPress/gutenberg#80289)
- Icons: Fix collection unregister not removing icons after core added its own registry (WordPress/gutenberg#80292)
- Widget Dashboard: collapse inline attribute controls into a dropdown (WordPress/gutenberg#80208)
- Notes: increase contrast between avatar border colors (WordPress/gutenberg#80285)
- Playlist: Fix track insertion (WordPress/gutenberg#80200)
- Fix: Allow icon labels to wrap with word breaks and no ellipsis (WordPress/gutenberg#80256)
- Dedupe deprecated prop types in composite components (WordPress/gutenberg#80277)
- Core Abilities: Restore the ready promise and lazy-load via dynamic import (WordPress/gutenberg#79155)
- Notes: Replace blur-deselect bookkeeping with useFocusOutside (WordPress/gutenberg#80222)
- UI: Hook Popover into the wp compat overlay slot (WordPress/gutenberg#80278)
- Playlist: Update @SInCE tags to 7.1.0 (WordPress/gutenberg#80317)
- Remove unused useDeprecated36pxDefaultSizeProp helper. (WordPress/gutenberg#80311)
- fix playlist block Dimensions Design (WordPress/gutenberg#80312)
- UI: Keep the compat overlay slot accessible inside Modal (WordPress/gutenberg#80310)
- Theme: Add typography token showcase (WordPress/gutenberg#80212)
- Cover: Create the initial paragraph when the block gains a background (WordPress/gutenberg#80028)
- Notes: Arm the mention kses allowance on REST note creation (WordPress/gutenberg#80221)
- Check for post lock modal and text, not specific title and button (WordPress/gutenberg#79979)
- Worker threads: reject pending RPC calls on worker failure or termination (WordPress/gutenberg#79955)
- RTC: Fix empty revision from peer autosave (WordPress/gutenberg#79911)
- Client Side Media: Honor image_strip_meta and image_max_bit_depth on the client upload path (WordPress/gutenberg#80218)
- Vips/upload-media: consolidate optional params into options objects (WordPress/gutenberg#80330)
- Editor: allow selecting which block styles to apply globally (WordPress/gutenberg#79839)
- Global Styles: Reject non-string custom CSS in the REST controller (WordPress/gutenberg#80338)
- Open inspector sidebar when toggling responsive editing (WordPress/gutenberg#80307)
- Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs (WordPress/gutenberg#80260)
- Fix: Critical error related to simple-git (WordPress/gutenberg#80102)
- Hide block style variations when state is enabled in global styles (WordPress/gutenberg#80341)
- Media REST API: Fix sideload and finalize for EXIF rotated images (WordPress/gutenberg#80295)
- Fix upload snackbar stuck in uploading state on server-side uploads (WordPress/gutenberg#80345)
- Try fixing responsive layout in Nav block (WordPress/gutenberg#80305)
- tools: Remove redundant parseArgs arguments (WordPress/gutenberg#80327)
- Responsive styles: Use viewport dropdown to control states for in-editor global styles sidebar (WordPress/gutenberg#80339)
- Use Add track instead of only Add (WordPress/gutenberg#80336)
- Interactivity API: refactor directives into self-registering modules (WordPress/gutenberg#79975)
- Fix: Critical error websocket-driver fix (WordPress/gutenberg#80348)
- Release: Resolve commander from the test file in the release CLI test (WordPress/gutenberg#80357)
- Release: Extract npm release lifecycle (WordPress/gutenberg#80190)
- Fix multiple MP3 playlist uploads (WordPress/gutenberg#80101)
- Table of Contents: render front-end list from current post headings (WordPress/gutenberg#80318)
- UI: improve component code readability in Storybook by using arrays for children (WordPress/gutenberg#80352)
- Infra: Use devEngines in root package.json and pin npm version in CI (WordPress/gutenberg#80188)
- Automated Testing: Skip type-checking in bundle size comparison build (WordPress/gutenberg#80366)
- Theme: Update colorjs.io dependency and drop bug workaround (WordPress/gutenberg#80272)
- RichTextControl: Replace DOM focus tracking with a single React-tree focus boundary (WordPress/gutenberg#80324)
- Notes: Finish WPDS treatment for mention chips (WordPress/gutenberg#80300)
- Notes: Add placeholders to the RichText fields (WordPress/gutenberg#80296)
- Fix flaky test in `tabs.spec.js` (WordPress/gutenberg#80373)
- Packages: Update exports to avoid deprecated folder export syntax (WordPress/gutenberg#80270)
- Theme: Widen peer dependency ranges to support new versions of Vite, ESBuild, and Stylelint (WordPress/gutenberg#80267)
- Components: Skip polymorphism prop typings on intersection (WordPress/gutenberg#80364)
- Post Content: Use the default block appender for empty content (WordPress/gutenberg#80026)
- Device preview dropdown: use active color for device icon when responsive styles are active (WordPress/gutenberg#80346)
- Fix default aspect ratio for lazy loaded Featured image (WordPress/gutenberg#80386)
- Docs: Add client-side media processing documentation (WordPress/gutenberg#75895)
- Autocompleters: Don't pre-encode mention search terms (WordPress/gutenberg#80377)
- Animated GIF uploads: generate sub-sizes from the first frame, matching core (WordPress/gutenberg#80268)
- Media: Add timeout and size guardrails to client-side GIF to video conversion (WordPress/gutenberg#80379)
- Widget Primitives: Ship as a script module (WordPress/gutenberg#80149)
- SearchControl: Render the suffix only if there's one. (WordPress/gutenberg#80356)
- Custom CSS: Fix cascade order against block style variations (WordPress/gutenberg#80340)
- React 19: add e2e compat test for boolean inert attribute (WordPress/gutenberg#80397)
- Fix post excerpt rendering to conditionally include space before more… (WordPress/gutenberg#70217)
- Add wp-theme as a style dependency of wp-components (WordPress/gutenberg#80362)
- Dashboard Widgets: declarative actions in the widget schema (WordPress/gutenberg#80363)
- @wordpress/ui: Add Button Storybook example for keyboard shortcut composition (WordPress/gutenberg#80353)
- SlotFill: Validate cross-document SCSS module styles (WordPress/gutenberg#80384)
- Components: migrate ConfirmDialog to SCSS module (WordPress/gutenberg#80394)
- SearchControl: Remove redundant conditional and prop. (WordPress/gutenberg#80406)
- Tools: resolve dependencies independently of the node_modules layout (WordPress/gutenberg#80414)
- Components: Migrate ToggleGroupControl to SCSS Modules (WordPress/gutenberg#80381)
- Rich Text: Restore the selection when focus returns to the editable (WordPress/gutenberg#80396)
- RTC: Use requestAnimationFrame for awareness cursor resize redraws (WordPress/gutenberg#79685)
- Remove __shouldNotWarnDeprecated36pxSize internal prop (WordPress/gutenberg#80323)
- Fix upload snackbar double-counting a single HEIC upload in Safari (WordPress/gutenberg#80371)
- Fix Root `.prettierrc.js` override issue (WordPress/gutenberg#80422)
- Fix Color Picker Cursor Shaking Issue (WordPress/gutenberg#80205)
- Storybook: pre-bundle CJS deps (WordPress/gutenberg#80426)
- ContentEditableControl: fix invalid label association with contenteditable div (WordPress/gutenberg#80344)
- Writing flow: use isMultiSelecting for shift+click (WordPress/gutenberg#80286)
- Added Missing Global Documentation (WordPress/gutenberg#80442)
- Editor: Disable canvas resizing while zoomed out (WordPress/gutenberg#80391)
- Misc fixes for WordPress-Develop 7.0 merges (WordPress/gutenberg#75985)
- RTC: Preserve collaborators' unsaved edits when another user saves (WordPress/gutenberg#79936)
- RTC: Disable Quick Edit while a post is being edited (WordPress/gutenberg#80016)
- Storybook: build the resolve specifier as a URL-style string (WordPress/gutenberg#80416)
- Style Book: Restore live global styles updates on the styles route (WordPress/gutenberg#80459)
- Editor: Restore fixed device preview height for mobile and tablet (WordPress/gutenberg#80271)
- Block Supports: Handle nested array block gap values properly (WordPress/gutenberg#80464)
- Block Editor: Guard against non-string spacing preset values (WordPress/gutenberg#80467)
- Move real-time collaboration code to lib/experimental/collaboration (WordPress/gutenberg#80469)
- RTC: Fix deleted-user test on multisite (WordPress/gutenberg#80463)
- Build: add independent react-18 vendor package (WordPress/gutenberg#80367)
- Fix `useHomeEnd` on tabs in mac testing (WordPress/gutenberg#80374)
- Block Editor: Reflect inherited Global Styles values in block inspector controls (WordPress/gutenberg#77894)
- Media: Remove the redundant __heicUploadSupport flag (WordPress/gutenberg#80452)
- Writing flow: fully select the ancestor when a text selection crosses a nesting boundary (WordPress/gutenberg#80462)
- fix: show add block button when editing a template part inside a template (WordPress/gutenberg#78427)
- Autocomplete: Reference the suggestions list with `aria-controls` and `aria-haspopup` (WordPress/gutenberg#80403)
- Dashboard Widgets: Sanitize help link hrefs. (WordPress/gutenberg#80409)
- State control - avoid tertiary variant on toggle to match style of other dropdown toggles (WordPress/gutenberg#80505)
- Widget Dashboard: measure the header fit and document the chrome (WordPress/gutenberg#80423)
- DataViews/Font Library: Give search fields a fixed width to stop layout shift (WordPress/gutenberg#80315)
- Fix crashes when manipulating locked blocks (WordPress/gutenberg#80509)
- RTC: Use str_contains() in WP_Sync_Config type parsing (WordPress/gutenberg#80476)
- Table of Contents: Use str_contains() instead of strpos() check (WordPress/gutenberg#80418)
- Build: Handle project paths containing spaces in dev script (WordPress/gutenberg#80519)
- Components: migrate SearchControl to SCSS module (WordPress/gutenberg#80474)
- Icons: Store the sanitized SVG content when registering an icon (WordPress/gutenberg#80508)
- Resolve Prettier explicitly for isolated layout (WordPress/gutenberg#80529)
- Playlist: Fix playback of tracks served without CORS headers (WordPress/gutenberg#80533)
- Remove unnecessary __next40pxDefaultSize props from form controls (WordPress/gutenberg#80540)
- GitHub workflows: Fix changelog checks for forked PRs (WordPress/gutenberg#80538)
- Redirect editing events to extension handlers under editableRoot (WordPress/gutenberg#80287)
- Writing flow: fully select the items when a selection extends down into a nested item (WordPress/gutenberg#80492)
- Global Styles panels: fix wrong preset committed and shown when two color presets share a hex (WordPress/gutenberg#80497)
- Replaces the `title` attributes used by revision inline diff annotations with `aria-describedby` (WordPress/gutenberg#80440)
- Account for non-lowercase VIDEO tag in render_block filter (WordPress/gutenberg#80537)
- Components: migrate FormTokenField to SCSS module (WordPress/gutenberg#80472)
- Revisions: Specify block level diff status via aria-label (WordPress/gutenberg#77779)
- Notes: Remove "Add note" from the inline styles dropdown (WordPress/gutenberg#80531)
- Global Styles: Resolve per-level heading element styles in block inspector controls (WordPress/gutenberg#80495)
- Notes: Render @ mentions as span chips and narrow the kses class allowance (WordPress/gutenberg#80528)
- Backport from Core: improve icon name unit tests (WordPress/gutenberg#80552)
- Read the contentEditable attribute in ownsSelection, not isContentEditable (WordPress/gutenberg#80549)
- Device type preview: fix collapsing to content height (WordPress/gutenberg#80553)
- Wrap notices in ThemeProvider with 0 corner radius (WordPress/gutenberg#79523)
- Perf Tests: Fix 'Selecting blocks' metric reporting 0 ms (WordPress/gutenberg#80524)
- Global Styles: Limit the inherited value treatment to the Gutenberg plugin (WordPress/gutenberg#80555)
- RTC: Use array_any() for newer-compaction check in polling sync server (WordPress/gutenberg#80522)
- Fix: Update webpack-dev-server to ^5.2.1 to help with dep alerts (WordPress/gutenberg#80347)
- Notes: align floating threads with their inline marker (WordPress/gutenberg#79877)
- WP Build: avoid infinite worker build loop (WordPress/gutenberg#80361)
- Update view config API versioning (WordPress/gutenberg#80319)
- Docs: Update plugin release docs for GitHub's Release label UI (WordPress/gutenberg#80567)
- Release: Require a working GitHub CLI for cherry-picking (WordPress/gutenberg#80568)
- Improve the various Alignment controls props handling (WordPress/gutenberg#63696)
- Reduce duplicated preset utility implementations (WordPress/gutenberg#80245)
- Dashboard Widgets: harden action `href` sanitization (WordPress/gutenberg#80510)
- Notes: Register the inline note format at import time (WordPress/gutenberg#80576)
- Fix preset round-trip test imports after preset utils consolidation (WordPress/gutenberg#80589)
- ExternalLink: Use shared focus ring mixin (WordPress/gutenberg#80573)
- Combobox, Select, SelectControl: Add Group and GroupLabel (WordPress/gutenberg#80574)
- Query Loop: Add translation context to the 'Offset' setting label (WordPress/gutenberg#80582)
- Media: Stop forcing crossorigin on IMG tags in media templates (WordPress/gutenberg#80532)
- GradientPicker: select by slug so two presets sharing a gradient keep their identity (WordPress/gutenberg#80554)
- Media Editor: Show a loading state while the cropped file loads (WordPress/gutenberg#80460)
- Remove default paragraph from tab-panel template (WordPress/gutenberg#80565)
- Global Styles: Resolve link element styles in block inspector controls for blocks that are links (WordPress/gutenberg#80607)
- Math: Use ValidatedTextareaControl for LaTeX input (WordPress/gutenberg#80500)
- Navigation: Fixes `aria-expanded` not updating on hover submenu inside overlay (WordPress/gutenberg#77563)
- Core Data: Move EntitiesSavedState component out of editor (rebase of WordPress/gutenberg#71948) (WordPress/gutenberg#80485)
- Fix: Pullquote custom line height in the editor. (WordPress/gutenberg#80586)
- Block Tools: Fix empty block appender position inside blocks that capture toolbars (WordPress/gutenberg#80592)
- Editor: Avoid unnecessary term re-fetches in FlatTermSelector (WordPress/gutenberg#80623)
- DependencyExtractionWebpackPlugin: Include extracted styles in the asset version hash (WordPress/gutenberg#80601)
- Base styles: Allow overriding focus ring color in outset-ring__focus (WordPress/gutenberg#80587)
- UI: Add Autocomplete.Row primitive (WordPress/gutenberg#80490)
- Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577)
- View config: reject shape-mismatched merges, define empty-array semantics, strip nulls from appended members (WordPress/gutenberg#80571)
- Theme: Update Storybook admin color scheme examples (WordPress/gutenberg#80569)
- Detach core's note mention kses filter in the baseline strip test (WordPress/gutenberg#80656)
- Media REST API: Backport sideload from url path upload size check (WordPress/gutenberg#80659)
- Rich text: remove tabIndex from editable elements again to fix shift+click selection (WordPress/gutenberg#80651)
- Storybook: Remove Emotion as JSX import source (WordPress/gutenberg#80647)
- Gallery: make dynamic mode conversion a single undo level (WordPress/gutenberg#80665)
- Docs: Update iframe guidance for Gutenberg 23.6 (WordPress/gutenberg#80629)
- Background image control: Remove duplicated focus ring (WordPress/gutenberg#80671)
- DataViewsPicker: Add Shift+Click range selection to the `picker-table`, `picker-grid`, and `picker-activity` layouts (WordPress/gutenberg#80413)
- Docs: Require view config filter callbacks to return the container (WordPress/gutenberg#80642)
- Duotone: Dedupe duotone utils into global-styles-engine (WordPress/gutenberg#80598)
- Input: Hide native spin controls for `type="number"` (WordPress/gutenberg#80646)
- Make `useSelectionProps` hook layout agnostic (WordPress/gutenberg#80677)
- Remove redundant @jest-environment jsdom pragma and lint against it (WordPress/gutenberg#80676)
- Base Styles: Remove accent color parameter from input-control (WordPress/gutenberg#80595)
- wp-build: sync the page template preload field list with core-data (WordPress/gutenberg#80648)
- Add progressive-discovery pattern for agent instructions and skills and general guidelines (WordPress/gutenberg#80650)
- Writing flow: extend block selections with shift+arrow when there is no native selection (WordPress/gutenberg#80687)
- Fix cursor position during forward delete of empty blocks (WordPress/gutenberg#77525)
- Global Styles: Extract shared preset management from shadows and font sizes (WordPress/gutenberg#79810)
- Notes: Capture the target block before saving a block-level note (WordPress/gutenberg#80690)
- Rename unit tests, removing `spec.js` to match the convention. (WordPress/gutenberg#80711)
- Used @link for url in inline documentation (WordPress/gutenberg#80716)
- Block Library: Guards against error throwing attribute values (WordPress/gutenberg#80558)
- Theme JSON: Level block-level preset class specificity with :where() (WordPress/gutenberg#80657)
- Notes: Sync the sidebar selection to the inline marker under the caret (WordPress/gutenberg#80610)
- Page List: Use null coalescing operator for parentPageID attribute (WordPress/gutenberg#80728)
- Fix font library navigation page select font size to match DataViews. (WordPress/gutenberg#80617)
- Meta boxes: Match heading styles with Gutenberg panels (WordPress/gutenberg#80670)
- Edit Site: Replace Theme usage in canvas loader with CSS (WordPress/gutenberg#80688)
- Jest: Fix ignore patterns with dots (WordPress/gutenberg#80737)
- Components: Migrate Disabled to SCSS module (WordPress/gutenberg#80643)
- Enhance sandbox component to accept sandbox prop (WordPress/gutenberg#69617)
- Docs: Expand the back-porting to WP Core guide (WordPress/gutenberg#80593)
- Add nvm use instructions to AGENTS.md (WordPress/gutenberg#80755)
- Docs: Clarify agent guidance discovery (WordPress/gutenberg#80753)
- Block Editor: Fix floated blocks overlapping sticky blocks (WordPress/gutenberg#80749)
- Shorten playlist track toolbar button label (WordPress/gutenberg#80759)
- Block supports: Return from layout support before resolving global settings (WordPress/gutenberg#80771)
- Notes: Report save success consistently from note actions (WordPress/gutenberg#80748)
- Dynamic Gallery: Rename toolbar button to Detach and add a modal explaining what will happen (WordPress/gutenberg#80727)
- Docs: Clarify getBlock behavior with inner block controllers (WordPress/gutenberg#80773)
- Update docs for server-side view config filters (WordPress/gutenberg#80744)
- createInterpolateElement: handle unmatched closing tags gracefully (WordPress/gutenberg#80618)
- Components: Remove private Theme component (WordPress/gutenberg#80691)
- Block Editor: Refactor 'URLInput' to function component (WordPress/gutenberg#80721)
- UI: add Dialog vs Drawer design guidance (WordPress/gutenberg#80783)
- Packages: Update date-fns to 4.4.0 (WordPress/gutenberg#80763)
- Theme: Update Color.js to 0.7.1 (WordPress/gutenberg#80762)
- ESLint: Add missing not-recommended components to denylist (WordPress/gutenberg#80754)
- Jest: Update to v30 (breaking) (WordPress/gutenberg#80767)
- Packages: Update memize to 2.1.1 (WordPress/gutenberg#80764)
- ToolsPanel: Migrate styles to an SCSS Module (WordPress/gutenberg#80445)
- RTC: Prevent controlled block synchronization from intercepting undo (WordPress/gutenberg#80503)
- Build Plugin ZIP: don't abort when changelog can't be generated (WordPress/gutenberg#80791)
- RTC: Compact during serialization (WordPress/gutenberg#80707)
- DataForm: Stop card and details validation from hijacking focus (WordPress/gutenberg#80685)
- Only use Flakiness.io in canonical Gutenberg repo. (WordPress/gutenberg#80816)
- Global Styles: Put the inheritance UI behind a Gutenberg experiment (WordPress/gutenberg#80815)
- Add a responsiveEditingEnabled editor setting to hide the Responsive styles option (WordPress/gutenberg#80814)
- iOS: remove jumping hack, add typewriter (WordPress/gutenberg#74596)
- Writing flow: stop the page scrolling on caret moves within blocks taller than the viewport (WordPress/gutenberg#80708)
- List Block: Preserve ordered type on indent (WordPress/gutenberg#75353)
- Block Editor: Try to fix typing performance regression (WordPress/gutenberg#80507)
- Notes: Cancel in-flight hover highlight when focus leaves a note thread (WordPress/gutenberg#80752)
- Make editableRoot a private block setting Symbol, not a public support (WordPress/gutenberg#80820)
- Editor: leave undo to the browser in fields that handle their own undo (WordPress/gutenberg#80768)
- Improve pre-flight npm access checks (WordPress/gutenberg#80334)

Fixes #66065.

git-svn-id: https://develop.svn.wordpress.org/trunk@63533 602fd350-edb4-49c9-b593-d223f7449a82
wporg-sync pushed a commit to WordPress/WordPress that referenced this pull request Sep 8, 2026
This updates the pinned commit hash of the Gutenberg repository from `2872d71cde528d82675f14862a1b84e2b8abbaea` to `5a0417990a9404cc2562cdd35e3054cb0d3e546e` (version `23.7.0`).

A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/2872d71cde528d82675f14862a1b84e2b8abbaea..v23.7.0.

- Release: Fix cherry-pick success detection (WordPress/gutenberg#80249)
- Add Table of Contents e2e user story coverage (WordPress/gutenberg#80199)
- Only include icon library SVGs listed as `public` in the Zip file published to GitHub Container Registry for `wordpress-develop` (WordPress/gutenberg#79338)
- fix: set dataviews popover hover text color (WordPress/gutenberg#80105)
- added missing doc (WordPress/gutenberg#80172)
- DataViews: Fix the unintended gap between `list` layout items when `groupBy` is set (WordPress/gutenberg#80254)
- Social Link: Fix stray closing tag in Tumblr icon markup (WordPress/gutenberg#80257)
- DataViews: Fix the `list` layout ignoring some settings when `groupBy` is set (WordPress/gutenberg#80255)
- Icon block: Show text and background color controls by default. (WordPress/gutenberg#80251)
- DataViews: Add shift-click range selection (WordPress/gutenberg#80046)
- UI: Remove unused direction factor CSS property (WordPress/gutenberg#80269)
- theme: Disallow src in published package (WordPress/gutenberg#80213)
- Fix: stale post edit message in modal (WordPress/gutenberg#79997)
- Icons: Validate SVG icons include viewBox (WordPress/gutenberg#80273)
- Remove obsolete __unstable-large size props (WordPress/gutenberg#80081)
- Responsive Editing: support editing pattern styles (WordPress/gutenberg#80233)
- Tab List: Add toolbar buttons to reorder tabs (WordPress/gutenberg#80107)
- Move image editor styles to the block editor package (WordPress/gutenberg#80165)
- Cover/Accordion: Exit on Enter (WordPress/gutenberg#77301)
- Hide color controls for Navigation and Social Icons when viewport states are active (WordPress/gutenberg#80289)
- Icons: Fix collection unregister not removing icons after core added its own registry (WordPress/gutenberg#80292)
- Widget Dashboard: collapse inline attribute controls into a dropdown (WordPress/gutenberg#80208)
- Notes: increase contrast between avatar border colors (WordPress/gutenberg#80285)
- Playlist: Fix track insertion (WordPress/gutenberg#80200)
- Fix: Allow icon labels to wrap with word breaks and no ellipsis (WordPress/gutenberg#80256)
- Dedupe deprecated prop types in composite components (WordPress/gutenberg#80277)
- Core Abilities: Restore the ready promise and lazy-load via dynamic import (WordPress/gutenberg#79155)
- Notes: Replace blur-deselect bookkeeping with useFocusOutside (WordPress/gutenberg#80222)
- UI: Hook Popover into the wp compat overlay slot (WordPress/gutenberg#80278)
- Playlist: Update @SInCE tags to 7.1.0 (WordPress/gutenberg#80317)
- Remove unused useDeprecated36pxDefaultSizeProp helper. (WordPress/gutenberg#80311)
- fix playlist block Dimensions Design (WordPress/gutenberg#80312)
- UI: Keep the compat overlay slot accessible inside Modal (WordPress/gutenberg#80310)
- Theme: Add typography token showcase (WordPress/gutenberg#80212)
- Cover: Create the initial paragraph when the block gains a background (WordPress/gutenberg#80028)
- Notes: Arm the mention kses allowance on REST note creation (WordPress/gutenberg#80221)
- Check for post lock modal and text, not specific title and button (WordPress/gutenberg#79979)
- Worker threads: reject pending RPC calls on worker failure or termination (WordPress/gutenberg#79955)
- RTC: Fix empty revision from peer autosave (WordPress/gutenberg#79911)
- Client Side Media: Honor image_strip_meta and image_max_bit_depth on the client upload path (WordPress/gutenberg#80218)
- Vips/upload-media: consolidate optional params into options objects (WordPress/gutenberg#80330)
- Editor: allow selecting which block styles to apply globally (WordPress/gutenberg#79839)
- Global Styles: Reject non-string custom CSS in the REST controller (WordPress/gutenberg#80338)
- Open inspector sidebar when toggling responsive editing (WordPress/gutenberg#80307)
- Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs (WordPress/gutenberg#80260)
- Fix: Critical error related to simple-git (WordPress/gutenberg#80102)
- Hide block style variations when state is enabled in global styles (WordPress/gutenberg#80341)
- Media REST API: Fix sideload and finalize for EXIF rotated images (WordPress/gutenberg#80295)
- Fix upload snackbar stuck in uploading state on server-side uploads (WordPress/gutenberg#80345)
- Try fixing responsive layout in Nav block (WordPress/gutenberg#80305)
- tools: Remove redundant parseArgs arguments (WordPress/gutenberg#80327)
- Responsive styles: Use viewport dropdown to control states for in-editor global styles sidebar (WordPress/gutenberg#80339)
- Use Add track instead of only Add (WordPress/gutenberg#80336)
- Interactivity API: refactor directives into self-registering modules (WordPress/gutenberg#79975)
- Fix: Critical error websocket-driver fix (WordPress/gutenberg#80348)
- Release: Resolve commander from the test file in the release CLI test (WordPress/gutenberg#80357)
- Release: Extract npm release lifecycle (WordPress/gutenberg#80190)
- Fix multiple MP3 playlist uploads (WordPress/gutenberg#80101)
- Table of Contents: render front-end list from current post headings (WordPress/gutenberg#80318)
- UI: improve component code readability in Storybook by using arrays for children (WordPress/gutenberg#80352)
- Infra: Use devEngines in root package.json and pin npm version in CI (WordPress/gutenberg#80188)
- Automated Testing: Skip type-checking in bundle size comparison build (WordPress/gutenberg#80366)
- Theme: Update colorjs.io dependency and drop bug workaround (WordPress/gutenberg#80272)
- RichTextControl: Replace DOM focus tracking with a single React-tree focus boundary (WordPress/gutenberg#80324)
- Notes: Finish WPDS treatment for mention chips (WordPress/gutenberg#80300)
- Notes: Add placeholders to the RichText fields (WordPress/gutenberg#80296)
- Fix flaky test in `tabs.spec.js` (WordPress/gutenberg#80373)
- Packages: Update exports to avoid deprecated folder export syntax (WordPress/gutenberg#80270)
- Theme: Widen peer dependency ranges to support new versions of Vite, ESBuild, and Stylelint (WordPress/gutenberg#80267)
- Components: Skip polymorphism prop typings on intersection (WordPress/gutenberg#80364)
- Post Content: Use the default block appender for empty content (WordPress/gutenberg#80026)
- Device preview dropdown: use active color for device icon when responsive styles are active (WordPress/gutenberg#80346)
- Fix default aspect ratio for lazy loaded Featured image (WordPress/gutenberg#80386)
- Docs: Add client-side media processing documentation (WordPress/gutenberg#75895)
- Autocompleters: Don't pre-encode mention search terms (WordPress/gutenberg#80377)
- Animated GIF uploads: generate sub-sizes from the first frame, matching core (WordPress/gutenberg#80268)
- Media: Add timeout and size guardrails to client-side GIF to video conversion (WordPress/gutenberg#80379)
- Widget Primitives: Ship as a script module (WordPress/gutenberg#80149)
- SearchControl: Render the suffix only if there's one. (WordPress/gutenberg#80356)
- Custom CSS: Fix cascade order against block style variations (WordPress/gutenberg#80340)
- React 19: add e2e compat test for boolean inert attribute (WordPress/gutenberg#80397)
- Fix post excerpt rendering to conditionally include space before more… (WordPress/gutenberg#70217)
- Add wp-theme as a style dependency of wp-components (WordPress/gutenberg#80362)
- Dashboard Widgets: declarative actions in the widget schema (WordPress/gutenberg#80363)
- @wordpress/ui: Add Button Storybook example for keyboard shortcut composition (WordPress/gutenberg#80353)
- SlotFill: Validate cross-document SCSS module styles (WordPress/gutenberg#80384)
- Components: migrate ConfirmDialog to SCSS module (WordPress/gutenberg#80394)
- SearchControl: Remove redundant conditional and prop. (WordPress/gutenberg#80406)
- Tools: resolve dependencies independently of the node_modules layout (WordPress/gutenberg#80414)
- Components: Migrate ToggleGroupControl to SCSS Modules (WordPress/gutenberg#80381)
- Rich Text: Restore the selection when focus returns to the editable (WordPress/gutenberg#80396)
- RTC: Use requestAnimationFrame for awareness cursor resize redraws (WordPress/gutenberg#79685)
- Remove __shouldNotWarnDeprecated36pxSize internal prop (WordPress/gutenberg#80323)
- Fix upload snackbar double-counting a single HEIC upload in Safari (WordPress/gutenberg#80371)
- Fix Root `.prettierrc.js` override issue (WordPress/gutenberg#80422)
- Fix Color Picker Cursor Shaking Issue (WordPress/gutenberg#80205)
- Storybook: pre-bundle CJS deps (WordPress/gutenberg#80426)
- ContentEditableControl: fix invalid label association with contenteditable div (WordPress/gutenberg#80344)
- Writing flow: use isMultiSelecting for shift+click (WordPress/gutenberg#80286)
- Added Missing Global Documentation (WordPress/gutenberg#80442)
- Editor: Disable canvas resizing while zoomed out (WordPress/gutenberg#80391)
- Misc fixes for WordPress-Develop 7.0 merges (WordPress/gutenberg#75985)
- RTC: Preserve collaborators' unsaved edits when another user saves (WordPress/gutenberg#79936)
- RTC: Disable Quick Edit while a post is being edited (WordPress/gutenberg#80016)
- Storybook: build the resolve specifier as a URL-style string (WordPress/gutenberg#80416)
- Style Book: Restore live global styles updates on the styles route (WordPress/gutenberg#80459)
- Editor: Restore fixed device preview height for mobile and tablet (WordPress/gutenberg#80271)
- Block Supports: Handle nested array block gap values properly (WordPress/gutenberg#80464)
- Block Editor: Guard against non-string spacing preset values (WordPress/gutenberg#80467)
- Move real-time collaboration code to lib/experimental/collaboration (WordPress/gutenberg#80469)
- RTC: Fix deleted-user test on multisite (WordPress/gutenberg#80463)
- Build: add independent react-18 vendor package (WordPress/gutenberg#80367)
- Fix `useHomeEnd` on tabs in mac testing (WordPress/gutenberg#80374)
- Block Editor: Reflect inherited Global Styles values in block inspector controls (WordPress/gutenberg#77894)
- Media: Remove the redundant __heicUploadSupport flag (WordPress/gutenberg#80452)
- Writing flow: fully select the ancestor when a text selection crosses a nesting boundary (WordPress/gutenberg#80462)
- fix: show add block button when editing a template part inside a template (WordPress/gutenberg#78427)
- Autocomplete: Reference the suggestions list with `aria-controls` and `aria-haspopup` (WordPress/gutenberg#80403)
- Dashboard Widgets: Sanitize help link hrefs. (WordPress/gutenberg#80409)
- State control - avoid tertiary variant on toggle to match style of other dropdown toggles (WordPress/gutenberg#80505)
- Widget Dashboard: measure the header fit and document the chrome (WordPress/gutenberg#80423)
- DataViews/Font Library: Give search fields a fixed width to stop layout shift (WordPress/gutenberg#80315)
- Fix crashes when manipulating locked blocks (WordPress/gutenberg#80509)
- RTC: Use str_contains() in WP_Sync_Config type parsing (WordPress/gutenberg#80476)
- Table of Contents: Use str_contains() instead of strpos() check (WordPress/gutenberg#80418)
- Build: Handle project paths containing spaces in dev script (WordPress/gutenberg#80519)
- Components: migrate SearchControl to SCSS module (WordPress/gutenberg#80474)
- Icons: Store the sanitized SVG content when registering an icon (WordPress/gutenberg#80508)
- Resolve Prettier explicitly for isolated layout (WordPress/gutenberg#80529)
- Playlist: Fix playback of tracks served without CORS headers (WordPress/gutenberg#80533)
- Remove unnecessary __next40pxDefaultSize props from form controls (WordPress/gutenberg#80540)
- GitHub workflows: Fix changelog checks for forked PRs (WordPress/gutenberg#80538)
- Redirect editing events to extension handlers under editableRoot (WordPress/gutenberg#80287)
- Writing flow: fully select the items when a selection extends down into a nested item (WordPress/gutenberg#80492)
- Global Styles panels: fix wrong preset committed and shown when two color presets share a hex (WordPress/gutenberg#80497)
- Replaces the `title` attributes used by revision inline diff annotations with `aria-describedby` (WordPress/gutenberg#80440)
- Account for non-lowercase VIDEO tag in render_block filter (WordPress/gutenberg#80537)
- Components: migrate FormTokenField to SCSS module (WordPress/gutenberg#80472)
- Revisions: Specify block level diff status via aria-label (WordPress/gutenberg#77779)
- Notes: Remove "Add note" from the inline styles dropdown (WordPress/gutenberg#80531)
- Global Styles: Resolve per-level heading element styles in block inspector controls (WordPress/gutenberg#80495)
- Notes: Render @ mentions as span chips and narrow the kses class allowance (WordPress/gutenberg#80528)
- Backport from Core: improve icon name unit tests (WordPress/gutenberg#80552)
- Read the contentEditable attribute in ownsSelection, not isContentEditable (WordPress/gutenberg#80549)
- Device type preview: fix collapsing to content height (WordPress/gutenberg#80553)
- Wrap notices in ThemeProvider with 0 corner radius (WordPress/gutenberg#79523)
- Perf Tests: Fix 'Selecting blocks' metric reporting 0 ms (WordPress/gutenberg#80524)
- Global Styles: Limit the inherited value treatment to the Gutenberg plugin (WordPress/gutenberg#80555)
- RTC: Use array_any() for newer-compaction check in polling sync server (WordPress/gutenberg#80522)
- Fix: Update webpack-dev-server to ^5.2.1 to help with dep alerts (WordPress/gutenberg#80347)
- Notes: align floating threads with their inline marker (WordPress/gutenberg#79877)
- WP Build: avoid infinite worker build loop (WordPress/gutenberg#80361)
- Update view config API versioning (WordPress/gutenberg#80319)
- Docs: Update plugin release docs for GitHub's Release label UI (WordPress/gutenberg#80567)
- Release: Require a working GitHub CLI for cherry-picking (WordPress/gutenberg#80568)
- Improve the various Alignment controls props handling (WordPress/gutenberg#63696)
- Reduce duplicated preset utility implementations (WordPress/gutenberg#80245)
- Dashboard Widgets: harden action `href` sanitization (WordPress/gutenberg#80510)
- Notes: Register the inline note format at import time (WordPress/gutenberg#80576)
- Fix preset round-trip test imports after preset utils consolidation (WordPress/gutenberg#80589)
- ExternalLink: Use shared focus ring mixin (WordPress/gutenberg#80573)
- Combobox, Select, SelectControl: Add Group and GroupLabel (WordPress/gutenberg#80574)
- Query Loop: Add translation context to the 'Offset' setting label (WordPress/gutenberg#80582)
- Media: Stop forcing crossorigin on IMG tags in media templates (WordPress/gutenberg#80532)
- GradientPicker: select by slug so two presets sharing a gradient keep their identity (WordPress/gutenberg#80554)
- Media Editor: Show a loading state while the cropped file loads (WordPress/gutenberg#80460)
- Remove default paragraph from tab-panel template (WordPress/gutenberg#80565)
- Global Styles: Resolve link element styles in block inspector controls for blocks that are links (WordPress/gutenberg#80607)
- Math: Use ValidatedTextareaControl for LaTeX input (WordPress/gutenberg#80500)
- Navigation: Fixes `aria-expanded` not updating on hover submenu inside overlay (WordPress/gutenberg#77563)
- Core Data: Move EntitiesSavedState component out of editor (rebase of WordPress/gutenberg#71948) (WordPress/gutenberg#80485)
- Fix: Pullquote custom line height in the editor. (WordPress/gutenberg#80586)
- Block Tools: Fix empty block appender position inside blocks that capture toolbars (WordPress/gutenberg#80592)
- Editor: Avoid unnecessary term re-fetches in FlatTermSelector (WordPress/gutenberg#80623)
- DependencyExtractionWebpackPlugin: Include extracted styles in the asset version hash (WordPress/gutenberg#80601)
- Base styles: Allow overriding focus ring color in outset-ring__focus (WordPress/gutenberg#80587)
- UI: Add Autocomplete.Row primitive (WordPress/gutenberg#80490)
- Site Editor: Add E2E coverage for view config extensibility (WordPress/gutenberg#80577)
- View config: reject shape-mismatched merges, define empty-array semantics, strip nulls from appended members (WordPress/gutenberg#80571)
- Theme: Update Storybook admin color scheme examples (WordPress/gutenberg#80569)
- Detach core's note mention kses filter in the baseline strip test (WordPress/gutenberg#80656)
- Media REST API: Backport sideload from url path upload size check (WordPress/gutenberg#80659)
- Rich text: remove tabIndex from editable elements again to fix shift+click selection (WordPress/gutenberg#80651)
- Storybook: Remove Emotion as JSX import source (WordPress/gutenberg#80647)
- Gallery: make dynamic mode conversion a single undo level (WordPress/gutenberg#80665)
- Docs: Update iframe guidance for Gutenberg 23.6 (WordPress/gutenberg#80629)
- Background image control: Remove duplicated focus ring (WordPress/gutenberg#80671)
- DataViewsPicker: Add Shift+Click range selection to the `picker-table`, `picker-grid`, and `picker-activity` layouts (WordPress/gutenberg#80413)
- Docs: Require view config filter callbacks to return the container (WordPress/gutenberg#80642)
- Duotone: Dedupe duotone utils into global-styles-engine (WordPress/gutenberg#80598)
- Input: Hide native spin controls for `type="number"` (WordPress/gutenberg#80646)
- Make `useSelectionProps` hook layout agnostic (WordPress/gutenberg#80677)
- Remove redundant @jest-environment jsdom pragma and lint against it (WordPress/gutenberg#80676)
- Base Styles: Remove accent color parameter from input-control (WordPress/gutenberg#80595)
- wp-build: sync the page template preload field list with core-data (WordPress/gutenberg#80648)
- Add progressive-discovery pattern for agent instructions and skills and general guidelines (WordPress/gutenberg#80650)
- Writing flow: extend block selections with shift+arrow when there is no native selection (WordPress/gutenberg#80687)
- Fix cursor position during forward delete of empty blocks (WordPress/gutenberg#77525)
- Global Styles: Extract shared preset management from shadows and font sizes (WordPress/gutenberg#79810)
- Notes: Capture the target block before saving a block-level note (WordPress/gutenberg#80690)
- Rename unit tests, removing `spec.js` to match the convention. (WordPress/gutenberg#80711)
- Used @link for url in inline documentation (WordPress/gutenberg#80716)
- Block Library: Guards against error throwing attribute values (WordPress/gutenberg#80558)
- Theme JSON: Level block-level preset class specificity with :where() (WordPress/gutenberg#80657)
- Notes: Sync the sidebar selection to the inline marker under the caret (WordPress/gutenberg#80610)
- Page List: Use null coalescing operator for parentPageID attribute (WordPress/gutenberg#80728)
- Fix font library navigation page select font size to match DataViews. (WordPress/gutenberg#80617)
- Meta boxes: Match heading styles with Gutenberg panels (WordPress/gutenberg#80670)
- Edit Site: Replace Theme usage in canvas loader with CSS (WordPress/gutenberg#80688)
- Jest: Fix ignore patterns with dots (WordPress/gutenberg#80737)
- Components: Migrate Disabled to SCSS module (WordPress/gutenberg#80643)
- Enhance sandbox component to accept sandbox prop (WordPress/gutenberg#69617)
- Docs: Expand the back-porting to WP Core guide (WordPress/gutenberg#80593)
- Add nvm use instructions to AGENTS.md (WordPress/gutenberg#80755)
- Docs: Clarify agent guidance discovery (WordPress/gutenberg#80753)
- Block Editor: Fix floated blocks overlapping sticky blocks (WordPress/gutenberg#80749)
- Shorten playlist track toolbar button label (WordPress/gutenberg#80759)
- Block supports: Return from layout support before resolving global settings (WordPress/gutenberg#80771)
- Notes: Report save success consistently from note actions (WordPress/gutenberg#80748)
- Dynamic Gallery: Rename toolbar button to Detach and add a modal explaining what will happen (WordPress/gutenberg#80727)
- Docs: Clarify getBlock behavior with inner block controllers (WordPress/gutenberg#80773)
- Update docs for server-side view config filters (WordPress/gutenberg#80744)
- createInterpolateElement: handle unmatched closing tags gracefully (WordPress/gutenberg#80618)
- Components: Remove private Theme component (WordPress/gutenberg#80691)
- Block Editor: Refactor 'URLInput' to function component (WordPress/gutenberg#80721)
- UI: add Dialog vs Drawer design guidance (WordPress/gutenberg#80783)
- Packages: Update date-fns to 4.4.0 (WordPress/gutenberg#80763)
- Theme: Update Color.js to 0.7.1 (WordPress/gutenberg#80762)
- ESLint: Add missing not-recommended components to denylist (WordPress/gutenberg#80754)
- Jest: Update to v30 (breaking) (WordPress/gutenberg#80767)
- Packages: Update memize to 2.1.1 (WordPress/gutenberg#80764)
- ToolsPanel: Migrate styles to an SCSS Module (WordPress/gutenberg#80445)
- RTC: Prevent controlled block synchronization from intercepting undo (WordPress/gutenberg#80503)
- Build Plugin ZIP: don't abort when changelog can't be generated (WordPress/gutenberg#80791)
- RTC: Compact during serialization (WordPress/gutenberg#80707)
- DataForm: Stop card and details validation from hijacking focus (WordPress/gutenberg#80685)
- Only use Flakiness.io in canonical Gutenberg repo. (WordPress/gutenberg#80816)
- Global Styles: Put the inheritance UI behind a Gutenberg experiment (WordPress/gutenberg#80815)
- Add a responsiveEditingEnabled editor setting to hide the Responsive styles option (WordPress/gutenberg#80814)
- iOS: remove jumping hack, add typewriter (WordPress/gutenberg#74596)
- Writing flow: stop the page scrolling on caret moves within blocks taller than the viewport (WordPress/gutenberg#80708)
- List Block: Preserve ordered type on indent (WordPress/gutenberg#75353)
- Block Editor: Try to fix typing performance regression (WordPress/gutenberg#80507)
- Notes: Cancel in-flight hover highlight when focus leaves a note thread (WordPress/gutenberg#80752)
- Make editableRoot a private block setting Symbol, not a public support (WordPress/gutenberg#80820)
- Editor: leave undo to the browser in fields that handle their own undo (WordPress/gutenberg#80768)
- Improve pre-flight npm access checks (WordPress/gutenberg#80334)

Fixes #66065.
Built from https://develop.svn.wordpress.org/trunk@63533


git-svn-id: http://core.svn.wordpress.org/trunk@62709 1a063a9b-81f0-0310-95a4-ce76da25c4cd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backported to WP Core Pull request that has been successfully merged into WP Core [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json [Package] Block editor /packages/block-editor [Type] Bug An existing feature does not function as intended

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

4 participants