Skip to content

Fix upload hang when converting long animated GIFs: decode only the first frame for still outputs - #80260

Merged
adamsilverstein merged 6 commits into
trunkfrom
fix/80259-gif-poster-hang
Jul 16, 2026
Merged

adamsilverstein merged 6 commits into
trunkfrom
fix/80259-gif-poster-hang

Conversation

@adamsilverstein

@adamsilverstein adamsilverstein commented Jul 14, 2026 •

Copy link
Copy Markdown
Member

What?

Fixes #80259.

Uploading a long animated GIF with client-side media processing enabled hung forever: endless spinner, upload never completing, no console errors. Any GIF whose frame count × frame height exceeds 65,500 px triggered the hang - easy to hit with screen recordings (the reported sample is a 2.2 MB, 769-frame GIF).

Why?

After a successful GIF → video conversion, a static first-frame poster is sideloaded as a companion (animated_video_poster). Generating that poster runs convertImageFormat (GIF → JPEG) in @wordpress/vips, which loaded animation-capable inputs with [n=-1] (all frames) regardless of the output format. libvips represents an all-frames load as one vertical strip frames × height pixels tall - 1517 × 657,495 px for the reported sample.

Saving that strip as JPEG fails (libjpeg's maximum image dimension is 65,500 px), and inside the image worker that failure kills a libvips worker pthread without unwinding, so the RPC call never settles. The poster sideload stays pending forever, the parent item's finalize gate never closes, and the UI spins indefinitely.

Two secondary defects compounded this:

  • Even when the strip could be saved (short GIFs), the "poster" was the entire film strip rather than the first frame, contrary to the code's intent.
  • If a wasm failure does surface synchronously, it throws a WebAssembly.Exception, which is not an Error and has no message. The worker RPC reply only carries the error message string, so the main thread mistook the failure for a successful undefined result instead of a rejection.

How?

  • @wordpress/vips: convertImageFormat now only loads all frames when the output format also supports animation. A still output (JPEG poster) decodes just the first frame - no giant strip, correct single-frame poster, and poster generation drops from ~seconds/hang to ~0.1 s. compressImage (same input/output type) and rotateImage keep the all-frames behavior for animated formats.
  • @wordpress/worker-threads: expose() now normalizes thrown values that are not Error instances (or carry an empty message) - e.g. WebAssembly.Exception, thrown strings - into an Error with a non-empty message, so every worker failure reaches the main thread as a promise rejection. Without this, such failures are indistinguishable from a successful undefined result. (Complementary to Worker threads: reject pending RPC calls on worker failure or termination #79955, which rejects pending calls when the worker itself dies.)

With the poster failure gone and failures propagating as rejections, the existing upload-queue error handling does the right thing: a failed companion sideload cancels silently and the parent GIF attachment finalizes normally (the "fall back to a regular upload" behavior).

Empirically verified in isolated browser harnesses (wasm-vips 0.0.18): first-frame load converts the previously-hanging sample in 0.1 s (1517×855, 46 KB JPEG), while the all-frames load reproducibly throws/hangs.

Testing Instructions

Test in WordPress Playground

  1. Enable client-side media processing (default) in a cross-origin-isolated environment.
  2. Insert an Image block and upload a long animated GIF (sample attached to GIF to video conversion: upload hangs forever when a GIF's frames x height exceeds the JPEG dimension limit #80259, or any GIF with frames × height > 65,500, e.g. a 700-frame 100×100 GIF).
  3. Before this change: the spinner never stops. After: the upload completes, the attachment carries animated_video and animated_video_poster companions, and the poster is a single frame with the GIF's dimensions.

Automated coverage:

  • New e2e test completes the upload of a long animated GIF and produces a single-frame poster with a synthetic 700-frame 100×100 fixture (~97 KB). It times out on trunk (hang reproduced) and passes with this fix, including asserting the poster's dimensions.
  • New unit tests: convertImageFormat frame-loading matrix (GIF→JPEG, GIF→WebP, GIF→GIF, still→still) and worker RPC error propagation (Error, non-Error, empty-message, thrown string).
npm run test:unit -- packages/vips/src/test/convert-image-format.ts packages/worker-threads/src/test/error-propagation.test.ts
npm run test:e2e -- test/e2e/specs/editor/various/gif-to-video.spec.js

…l format

Loading an animated GIF with n=-1 for a still output (e.g. the JPEG
poster generated after GIF-to-video conversion) produces one vertical
strip image frames x height pixels tall. For long GIFs that exceeds
libjpeg's 65,500 px dimension limit, and the resulting failure inside
the image worker hung the upload queue forever. It also made the
poster a film strip of all frames instead of the intended first frame.

See #80259
The RPC reply only carries the error message string. A worker method
throwing a value without a message (a WebAssembly.Exception from wasm,
a thrown string, or an Error with an empty message) produced a reply
the main thread treated as a successful undefined result, so failures
silently resolved instead of rejecting. Normalize every thrown value to
an Error with a non-empty message before it reaches the RPC layer.

See #80259
A synthetic 700-frame 100x100 GIF keeps the fixture small while its
frames x height (70,000 px) exceeds the 65,500 px JPEG dimension limit
that made poster generation hang the upload queue. The test asserts the
upload completes and the poster is a single frame with the GIF's own
dimensions rather than a film strip.

Fixes #80259
@github-actions

github-actions Bot commented Jul 14, 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: adamsilverstein <adamsilverstein@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>

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

@adamsilverstein adamsilverstein added [Type] Bug An existing feature does not function as intended [Feature] Client Side Media Media processing in the browser with WASM labels Jul 14, 2026
@github-actions

github-actions Bot commented Jul 14, 2026 •

Copy link
Copy Markdown

Size Change: +493 B (+0.01%)

Total Size: 7.72 MB

📦 View Changed
Filename Size Change
build/modules/video-conversion/worker.min.js 83.4 kB +192 B (+0.23%)
build/modules/vips/worker.min.js 3.69 MB +301 B (+0.01%)

compressed-size-action

@adamsilverstein

Copy link
Copy Markdown
Member Author

I verified manually that this fixes uploading the Tabs-block.gif test image (although the transcode to video was a bit slow)

@github-actions

github-actions Bot commented Jul 15, 2026 •

Copy link
Copy Markdown

Flaky tests detected in 5f50607.
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/29466329317
📝 Reported issues:

@andrewserong andrewserong 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.

Thanks for looking into a fix! Code-wise this makes sense to me as a fix, but in practice when I attempt to upload larger GIFs they still appear to get stuck in the uploading state:

Image

I'm attempting to upload fairly raw GIFs generated by Gifox, and they're large in both pixel dimensions and filesize (e.g. 20mb). Interestingly, Github won't let me upload either, but Github fails gracefully with an error, whereas the editor gets stuck in that loading state.

Once it's stuck in that state, subsequent uploads appear to also fail and don't trigger the uploading snackbar. And nothing gets logged to the browser console either 🤔


I've tested a couple more images in case it helps.

This one of Jack Nicholson appears to fail in the same way:

Image

This one that includes transparency doesn't fail (I assume because in this case we're skipping the video conversion?)

Image

Let me know if there's anything more I can test!

Comment on lines -58 to +122
// Create the provide function using defineProxy with the target.
const [ provide ] = defineProxy( () => target, {
// Create the provide function using defineProxy with the target,
// normalizing thrown values so every failure reaches the main
// thread as a rejection.
const [ provide ] = defineProxy( () => withNormalizedErrors( target ), {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This might be a nitpicky comment, but withNormalizedErrors now creates a new object and copies keys over to it. Should we flag in the docs that this means that target must be a flat object of own methods (i.e. not a class instance where the methods from the class would be expected to be available, but won't be on a fresh object as the class methods are not exposed by Object.keys()).

I'm mostly asking this because worker-threads is a separate package, and so I wasn't sure how general purpose it's meant to be, versus our specific use case of vips.

@andrewserong

Copy link
Copy Markdown
Contributor

I threw the problem I ran into at a Claude instance, and the suggestions sound valid. I think the main issue I was running into might have been that the GIFs I'm uploading are big enough that they get resized, too? Here's the notes from a Claude review:

  1. Cap the animated decode in resizeImage the way the poster fix caps convertImageFormat — bound frameCount × pageHeight against the encoder/decoder limit and fall back
    to first-frame (or refuse) when it would overflow, instead of unconditionally n=-1.
  1. Make a wedged worker recoverable — this is the real systemic gap. Add a per-call timeout (or re-enable a heartbeat) at the worker-threads RPC layer, and terminate + recreate the worker on timeout so one bad call can't poison the queue for everything behind it. This would have turned this entire bug into a surfaced error.
  1. Pass maxDimensions to convertGifToVideo so large GIFs downscale below encoder limits rather than stalling the video path.

What do you reckon?

@adamsilverstein adamsilverstein self-assigned this Jul 15, 2026
@adamsilverstein adamsilverstein added the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Jul 15, 2026
@adamsilverstein

adamsilverstein commented Jul 15, 2026 •

Copy link
Copy Markdown
Member Author

I'm attempting to upload fairly raw GIFs generated by Gifox, and they're large in both pixel dimensions and filesize (e.g. 20mb). Interestingly, Github won't let me upload either, but Github fails gracefully with an error, whereas the editor gets stuck in that loading state.

Once it's stuck in that state, subsequent uploads appear to also fail and don't trigger the uploading snackbar. And nothing gets logged to the browser console either 🤔

Thanks for the continued testing. Seems like we need to add some additional guardrails here. I'll use your test images to see if I can debug the exact point of failure further. Your suggestions sound good, I suspect we need:

  • A maximum size for GIFs that will get converted (likely W x H x frames)
  • A timeout: if the image isn't converted in X seconds, time out, keeping only the original upload
  • Possibly better progress tracking, if we know how many frames X of Y, maybe we should expose that as a percentage somewhere?

@adamsilverstein

Copy link
Copy Markdown
Member Author

This one of Jack Nicholson appears to fail in the same way:

@andrewserong GitHub converts this to a PNG from your upload, I'm not sure how to get to your original. I'll see if I can find it online. Putting images in a zip is a workaround for this issue.

@adamsilverstein

Copy link
Copy Markdown
Member Author

@andrewserong I wasn't able to reproduce the failures you describe yet using the Playground link: https://playground.wordpress.net/?gutenberg-pr=80260

I tested with several very large GIFs from https://commons.wikimedia.org/wiki/Category:Animated_GIF_files_between_50_MP_and_100_MP

I got successful video conversions even for the >40MB weather animation (although it took a while).

Can you zip up and share some of your specific failing images and I will try to reproduce. Maybe something is different about them.

@adamsilverstein

Copy link
Copy Markdown
Member Author

We may want to show a conversion progress indicator of some sort since this process can take quite some time and it might look like the upload has hung when in fact the conversion is still going on.

I opened a separate issue to track this: #80325

…-hang

# Conflicts:
#	packages/worker-threads/CHANGELOG.md
@andrewserong

Copy link
Copy Markdown
Contributor

Thanks Adam, I'll re-test today to see if I can reproduce again, there's always the chance I was doing something wrong! I was testing locally, but not using Playground. I'd assumed Playground still didn't work for client-side media processing, but has that changed?

Here's a few of my GIFs as zips:

Jack Nicholson Reaction GIF.gif.zip

mild-panic-intensifies.gif.zip

2026-07-10 14.44.24.gif.zip

@andrewserong

Copy link
Copy Markdown
Contributor

I'll re-test today to see if I can reproduce again

Okay, this is interesting.

The Jack Nicholson one is testing okay for me today locally, and I thought that the larger GIF was failing during upload... it turns out that it seems it's the long processing issue. I left it running in my browser, and it turns out it managed to finish eventually... after 30 minutes 😅

In case it helps: I'm running a MacBook Air, so my computer isn't the most powerful. I'm wondering if there's something a bit intermittent / particular to the resources of the user's browser when this is happening?

We may want to show a conversion progress indicator of some sort since this process can take quite some time and it might look like the upload has hung when in fact the conversion is still going on.

I wonder if it would also make sense to bail after a threshold? Once conversion takes longer than a perceived "fairly quick" amount of time, the conversion feature itself ceases to be useful. Which is to say: client-side video processing is a compelling feature and idea, but if it takes too long, I'd probably ask the question of whether or not this is worth it at all 🤔

(Not meaning to be critical of the feature, just putting myself in the shoes of the average user wondering why their upload is taking so long)

@adamsilverstein
adamsilverstein enabled auto-merge (squash) July 16, 2026 02:21
@andrewserong

Copy link
Copy Markdown
Contributor

I'm also on an Air, but the latest model with maxed ram so might work better for me because of those.

I'm on an M4 Air, 32gb RAM, but when I was testing yesterday, I was also running 3x WP environments and dozens of browser tabs, so may have stretched my resources a little thin.

yes it has changed! Client-side media works in playground since

Fantastic! That's good to know and will make testing simpler 😄

possibly yes - I was thinking that as well originally.
I'm also working on a "progress bar" for the processing phase, since we know exactly how much is complete (eg. we know its X of Y frames so can show an accurate percentage or progress bar). maybe this could have an explicit cancel mechanism as well. I feel like with a solid progress indicator its fine it if takes a long time to process?

That's a good point. For me, I think it comes back to the expectation for the majority user case. If I've uploaded an image, do I expect it to handle conversion? If so (and this is an argument for your modal PR) then yes, if there's an accurate progress bar, that seems to mitigate things for me.

However, if the conversion is going to take many minutes, or in the case of the large screengrab I shared, 30 minutes, I'd say we're way past the threshold of usefulness. If it's going to take 30 minutes, there are better tools for conversion than directly in the block editor — i.e. for that case, someone should either be using a managed video service for conversion (that can happen server-side without the browser window being open) or converting themselves prior to upload.

I guess what I'm trying to say is: is there a heuristic we can use to determine "good enough" for this conversion feature so that it's active when it's most useful, but doesn't apply when things are above a threshold of some kind? I'm not too sure how we'd do this, but from the user side of things, if we can bail if the file that's being upload is beyond a threshold, I think that'd be the right way to fix it. Kind of like a soft rejection, e.g. "too big too convert, upload file as-is" or something like that 🤔

thanks for sharing those. merging for now and we can keep iterating to see if we can improve performance or UX.

Absolutely, this discussion convinces me that there's more to explore here in follow-ups. My vote would be: through this WP Beta phase, let's do what we can to make this feature feel really nice and stable, but keeping in mind that if it still feels flaky we might need to reconsider its inclusion.

Thanks for all the back and forth here!

@adamsilverstein
adamsilverstein merged commit ee1bdb8 into trunk Jul 16, 2026
42 checks passed
@adamsilverstein
adamsilverstein deleted the fix/80259-gif-poster-hang branch July 16, 2026 02:54
@github-actions github-actions Bot added this to the Gutenberg 23.7 milestone Jul 16, 2026
@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 16, 2026
@github-actions

Copy link
Copy Markdown

There was a conflict while trying to cherry-pick the commit to the wp/7.1 branch. Please resolve the conflict manually and create a PR to the wp/7.1 branch.

PRs to wp/7.1 are similar to PRs to trunk, but you should base your PR on the wp/7.1 branch instead of trunk.

# Checkout the wp/7.1 branch instead of trunk.
git checkout wp/7.1

# Create a new branch for your PR.
git checkout -b my-branch

# Cherry-pick the commit.
git cherry-pick ee1bdb84ebdf1e2a59bf9d63ebe07cf32e96e4ca

# Check which files have conflicts.
git status

# Resolve the conflict...
# Add the resolved files to the staging area.
git status
git add .
git cherry-pick --continue

# Push the branch to the repository
git push origin my-branch

# Create a PR and set the base to the wp/7.1 branch.
# See https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request.

@adamsilverstein

Copy link
Copy Markdown
Member Author

I cherry picked these changes in #80342

@adamsilverstein

Copy link
Copy Markdown
Member Author

I wonder if it would also make sense to bail after a threshold? Once conversion takes longer than a perceived "fairly quick" amount of time, the conversion feature itself ceases to be useful.

I'm going to open an Issue/PR to add this, otherwise this feature might feel broken when users try it with very large GIFs. we can reconsider if we merge a progress bar.

For now I will silently fail only the video conversion part - falling back to the already uploaded original GIF file.

@adamsilverstein

Copy link
Copy Markdown
Member Author

@andrewserong I testing 2026-07-10 14.44.24.gif.zip it does take an extra-ordinary amount of time to process. with the progress bar (#80325), I see all frames are processed and then the spinner continues to show uploading in progress and it goes on and on.

This image is a good candidate for further debugging, I'm not clear why its hanging, the video conversion seems to only take around 10 seconds for me locally.

@adamsilverstein

Copy link
Copy Markdown
Member Author

Root-caused the hang with 2026-07-10 14.44.24.gif (2554×1676 × 800 frames = 3.4 gigapixels). The conversion itself is not the hang - three things compound after it:

  1. Sub-size grind: every animated sub-size re-decodes all 800 frames in wasm-vips (~80-90 s each, more for the larger sizes), so medium_large/large/1536x1536/2048x2048 grind for tens of minutes while the snackbar shows "uploading". Fixed by Client-side media: generate animated image sub-sizes from the first frame only, matching core #80268 (first-frame sub-sizes, matching core) - with it a sub-size takes ~2 s.
  2. Blocked cancellation: cancelItem awaited a cancel RPC that the busy vips worker cannot answer (it is synchronously blocked inside wasm), so cancelled items stayed in the queue and kept the parent unfinalized. Fixed in Media: Add timeout and size guardrails to client-side GIF to video conversion #80379.
  3. Starved follow-up uploads: any subsequent upload's transparency check queues behind the grind in the same worker, so later uploads appear to silently do nothing - matching @andrewserong's report. Same root cause; Client-side media: generate animated image sub-sizes from the first frame only, matching core #80268 removes the grind. In one test the tab crashed outright under the load, which would explain the "nothing gets logged" case.

#80379 also adds the guardrails from #80376: this GIF now skips video conversion in ~0.1 s (11× over the new 300 MP pixel budget) with a SCRIPT_DEBUG console diagnostic, and conversions that do start are abandoned after 30 s.

adamsilverstein added a commit that referenced this pull request Jul 17, 2026
…irst frame for still outputs (#80260) (#80342)

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

Copy link
Copy Markdown
Contributor

This PR was backported to the wp/7.1 branch by #80342.

@t-hamano t-hamano added Backported to WP Core Pull request that has been successfully merged into WP Core and removed Backport to WP 7.1 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta labels Jul 17, 2026
@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 20, 2026
@jasmussen

Copy link
Copy Markdown
Contributor

I wonder if it would also make sense to bail after a threshold? Once conversion takes longer than a perceived "fairly quick" amount of time, the conversion feature itself ceases to be useful. Which is to say: client-side video processing is a compelling feature and idea, but if it takes too long, I'd probably ask the question of whether or not this is worth it at all 🤔

possibly yes - I was thinking that as well originally.

It's a tricky one. We're definitely entering that space of media management for which big players in the space, like Google and Proton Drive, have a dedicated tray that sits in the bottom of the screen. Think UploadProgressSnackbar, but permanent and when you click it it opens a list of files that are being processed (uploaded, or in our case, converted). This UI affords showing contextual errors: which file failed (e.g. what happens if you upload two big GIFs in a row quickly one after another), and options to retry upload, or in our case, retry conversion. Often times there will even be an "Errors" dedicated screen with a list of which uploads failed.

We might eventually want something like this for the Media Library, which could coexist inside the editor situationally. But not today: it's a big undertaking.

So my question is: what is the simplest thing we can do? If it's to bail with a Notice suggesting you retry, perhaps that's the path forward.

@adamsilverstein

Copy link
Copy Markdown
Member Author

So my question is: what is the simplest thing we can do? If it's to bail with a Notice suggesting you retry, perhaps that's the path forward.

For now, we silently fall back to the existing server upload route when the video conversion process appears to fail because it times out without completing. So the user gets what they currently get: their uploaded GIF. If SCRIPT_DEBUG is enabled an error also shows in the console, but for the average user the main side effect is they don't get the video conversion.

entering that space of media management for which big players in the space, like Google and Proton Drive

I agree and it sounds neat to incorporate some of the media library features directly into the editor. Since both will enable media uploads and a queue, it makes sense to share components and logic for things like progress indicators, batches, status, etc. I love this long term vision!

One difference for media with WordPress vs. the other systems like docs: we have our existing server processing pipeline to fall back on. This provides a reliable (battle-tested!) failsafe that while not quite as good as what client-side media enables, is still better than showing an error and blocking users.

t-hamano pushed a commit that referenced this pull request Jul 21, 2026
…irst frame for still outputs (#80260) (#80342)

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
pento pushed a commit to WordPress/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] Client Side Media Media processing in the browser with WASM [Type] Bug An existing feature does not function as intended

Projects

None yet

Development

Successfully merging this pull request may close these issues.

GIF to video conversion: upload hangs forever when a GIF's frames x height exceeds the JPEG dimension limit

4 participants