Skip to content

RTC: Add separate doc persistence endpoint#78891

Merged
alecgeatches merged 23 commits into
trunkfrom
add/rtc-doc-persistence-endpoint
Jun 8, 2026
Merged

RTC: Add separate doc persistence endpoint#78891
alecgeatches merged 23 commits into
trunkfrom
add/rtc-doc-persistence-endpoint

Conversation

@alecgeatches

@alecgeatches alecgeatches commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

What?

Closes #78867.

Add a new wp-sync/v1/save endpoint for persisting a CRDT doc outside of a regular post save.

Why?

@jsnajdr called out two undesirable behaviors with the current CRDT persistence setup in #78799:

  1. When entities are loaded, we may determine the server-side CRDT document is out of sync with editor content during getEntityRecord(), and then trigger a subsequent saveEntityRecord() in order to update the CRDT post meta. This get operation side effect is unexpected, and has additional side effects both in the editor and on the server:

    saveEntityRecord, the REST endpoint, and the server-side PHP wp_update_post have the semantics that the user really saved a new version of the post, and modified it in some meaningful way. But saving the CRDT document is just a RTC bookkeeping, the user is not really saving anything. It's triggered even by purely read-only actions.

    In wp-data, saveEntityRecord makes the UI think that the post is really saving, and it disables the "Publish" button for a moment, for example.

    wp_update_post calls many popular filters and actions that plugins hook into, and the assumption is that we're saving a post.

    It also changes a post's modified date, which can be incorrect when post content was not saved and only the CRDT meta was updated. We just want to update a persisted CRDT doc, not all of these other actions to occur.

  2. We send no-op { id } save for non-persisted entities like categories due to a bug:

    It seems there is a case where the payload is too small and doesn't even include the CRDT doc. Sometimes when creating a new post I see a request to update a category, where the payload includes only the id:

    POST /wp/v2/categories/1 { id: 1 }
    

    This is triggered by a getEntityRecord( 'taxonomy', 'category' ) read.

How?

When we're just saving CRDT document snapshots, use the new dedicated wp-sync/v1/save REST endpoint and not the saveEntityRecord save flow. Directly updating meta avoids wp_update_post(), post-save hooks, editor save UI state, and post_modified changes for bookkeeping-only CRDT repairs.

The sync config has a new supportsPersistence flag so we don't need to guess at which entities should receive an update. Unsupported entity rooms such as categories are rejected for CRDT doc persistence and also skipped client side.

On the client side, saveCRDTDoc() serializes the current Yjs document via the sync manager and posts it to /wp-sync/v1/save. Saves are queued per room so a slower, older serialized snapshot cannot complete after a newer one and overwrite it.

An important note: User-initiated post saves (e.g. clicking the "Save" button) still include the CRDT doc in the normal post save payload as before. This is explained in the existing prePersistPostType() call:

// Add meta for the persisted CRDT document during real post saves so the
// saved post and CRDT snapshot are committed in the same request. We don't
// want a post save to fail but a CRDT update to succeed or vice versa.
// CRDT repair uses /wp-sync/v1/save to avoid post-save side effects.
if ( persistedRecord ) {

Change to waitForConvergence() in E2E test

A small change in behavior worth calling out. Before, on every CRDT save (user-facing or side-effect caused), every user would re-fetch the _crdt_document meta locally. This no longer happens when a side-effect CRDT repair hits /wp-sync/v1/save.

The e2e utility function waitForConvergence() was added as part of fuzzer testing in #77666, and previously had an includeCrdtDocument key that was causing a test failure in collaboration-title-reload.spec.ts. The test failure was specifically due to the includeCrdtDocument: true flag only used in this test, and was failing because the page was checking for stale record?.meta?._crdt_document convergence.

This was removed. Previously this worked because a CRDT doc repair generated a "Save" event, which caused all other peers to re-fetch the document from the server. I briefly tried a separate persistedAt flag to make all other users refetch in the background, but after some investigation it's unnecessary.

After the background CRDT repair persists through /wp-sync/v1/save, the server-side document is correct and users have no need to refetch. The _crdt_document meta is otherwise unused in an already active session. The new CRDT doc is still available when a post is loaded from scratch, and explicit post saves still persist the CRDT doc through normal post meta. But once a browser has an active Yjs document, the in-browser source of truth is the Yjs document and editor state, not the local entity record's _crdt_document field. So we don't need to force-refresh _crdt_document as we did before.

Testing Instructions

General testing instructions. This will affect a few processes, so some all-around RTC testing would be helpful.

  1. Enable real-time collaboration in Settings -> Writing.
  2. Open a post in the editor with network tools enabled.
  3. Make an edit and save. Confirm the post save still succeeds, sending a POST to wp/v2/posts/<post_id>.
  4. Open the same post in another browser session and confirm RTC edits still sync.

CRDT repairs

  1. To test a CRDT repair, keep the post open in two browsers and use WPCLI to append some content to the post. Below, replace the ID in $post_id = <ID>; with the actual post ID:

    // Replace <ID> with the post ID
    npm run wp-env run cli wp eval '$post_id = <ID>; $p = get_post($post_id); wp_update_post(["ID" => $post_id, "post_content" => $p->post_content . "\n\n<!-- wp:paragraph -->\n<p>Updated content</p>\n<!-- /wp:paragraph -->"]);'
  2. Refresh one of the browsers. After loading, you should see a wp-sync/v1/save request and NOT a request to wp/v2/posts/<post_id>. The modified content from DB should be loaded onto the page. The new content should sync between both browsers:

    repair-sync.mov
  3. Refresh the other browser and ensure that the "Updated content" block is still included in post content.

Automated coverage

npm run test:unit -- packages/core-data/src/utils/test/save-crdt-doc.js packages/core-data/src/test/resolvers.js packages/sync/src/test/manager.ts
npm run test:unit:php:base -- phpunit/tests/collaboration/wpSyncSaveServer.php phpunit/tests/collaboration/wpSyncConfig.php phpunit/tests/collaboration/restAutosavesController.php

Use of AI Tools

AI assistance: Yes
Tool(s): Codex
Used for: The whole process.

@alecgeatches alecgeatches self-assigned this Jun 2, 2026
@alecgeatches alecgeatches added [Type] Task Issues or PRs that have been broken down into an individual action to take [Feature] Real-time Collaboration Phase 3 of the Gutenberg roadmap around real-time collaboration labels Jun 2, 2026
@alecgeatches alecgeatches added the No Core Sync Required Indicates that any changes do not need to be synced to WordPress Core label Jun 2, 2026
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown

Size Change: +171 B (0%)

Total Size: 8.44 MB

📦 View Changed
Filename Size Change
build/scripts/block-editor/index.min.js 380 kB +4 B (0%)
build/scripts/core-data/index.min.js 31.7 kB +167 B (+0.53%)

compressed-size-action

…groundCRDTSnapshot' which determine whether other clients show a "X user saved" and re-fetch entities
…meta without notifying other users like a user-facing save
…ver round-trip each time the server-side doc is updated as it isn't necessary other than test assertions

if ( get_post_meta( $post_id, self::CRDT_DOC_META_KEY, true ) !== $doc ) {
$updated = update_post_meta( $post_id, self::CRDT_DOC_META_KEY, $doc );
if ( false === $updated ) {

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.

update_post_meta internally does the check whether old value is equal to the new value, we don't need to do it separately.

The return value is false in case of equality. That also means that the false return value can't be treated as a strict error. An is_wp_error check on the return value is probably better.

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 didn't know about that behavior without the $prev_value flag! However, it looks like update_post_meta() and the internal update_metadata() function both return int|bool and not a WP_Error. Overall this makes it a bit confusing, as $updated will be false if the document fails to save, but also if the document is the same as already saved. A WP_Error would be much better.

I pushed a change in 3aa0658 that avoids the get_post_meta() call unless we receive false first and then need to differentiate whether the meta change represents an error or a same-value change.

__( 'You do not have permission to persist this document.', 'gutenberg' ),
array( 'status' => rest_authorization_required_code() )
);
}

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.

This check is already done in permission_callback, handle_request should only do the business logic.

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.

Good catch, fixed in ee8bfeb.

} );

return { promise, resolve, reject };
}

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.

There is a native Promise.withResolvers helper for this.

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 fixed this in b2095bf, but ended up reverting it back in cb9c492. I was seeing test failures related to withResolvers():

https://github.com/WordPress/gutenberg/actions/runs/26975840218/job/79602551098?pr=78891

Error: TypeError: Promise.withResolvers is not a function

This passes locally, but it appears we only run CI JS unit tests on node 20, which doesn't have withResolvers().

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.

Oh, there is Node.js 20 🙁 Let's do it some other day then, when we upgrade Node.

async function flushPromises() {
for ( let index = 0; index < 5; index++ ) {
await Promise.resolve();
}

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.

await new Promise( r => setTimeout( 0, r ) ) is a more reliable way to do this flush. It will resolve only after all microtasks have reliably run, no matter what is the count.

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.

Fixed this and the above withResolvers note in b2095bf, thanks!

*/
public function validate_request( WP_REST_Request $request ) {
$body = $request->get_body();
if ( is_string( $body ) && strlen( $body ) > self::MAX_BODY_SIZE ) {

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.

The MAX_BODY_SIZE is already declared in the args option of register_rest_route. The default validate_callback implementation should therefore do the check, it doesn't need to be implemented separately.

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown

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

@alecgeatches
alecgeatches marked this pull request as ready for review June 4, 2026 21:52
@github-actions

github-actions Bot commented Jun 4, 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: alecgeatches <alecgeatches@git.wordpress.org>
Co-authored-by: jsnajdr <jsnajdr@git.wordpress.org>

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

@alecgeatches

Copy link
Copy Markdown
Contributor Author

@danluu Just wanted to note a test change made in this PR from the fuzzer-added tests in #77666, see "Change to waitForConvergence() in E2E test" in the PR description.

In short, in addition to checking the live blocks for convergence, we were checking a local _crdt_document meta value. This PR removes CRDT repairs from the normal post save path, so we don't otherwise require all users to refetch that value as before. I don't think checking that local meta adds any value, as we already update the server copy and bundle the CRDT doc from live state on save. Fixing it requires re-adding the "everybody refetches" logic that is unnecessary otherwise.

@alecgeatches

Copy link
Copy Markdown
Contributor Author

@jsnajdr Thank you for the review notes above! I've addressed them and finalized the PR and description for review. I'll also want to get a couple of other RTC folks in here to do general testing as well.

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

Let's ship :shipit: This will fix many existing issues.

} );

return { promise, resolve, reject };
}

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.

Oh, there is Node.js 20 🙁 Let's do it some other day then, when we upgrade Node.

return new WP_REST_Response(
array(
'room' => $room,
),

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.

We don't really use the response, do we? It could be left empty.

Also, wrapping in new WP_REST_Response and 200 status is probably redundant: that's the default behavior. In the default case we only need to return the response array.

$doc = $request['doc'];

$updated = update_post_meta( $post_id, self::CRDT_DOC_META_KEY, $doc );
if ( false === $updated && get_post_meta( $post_id, self::CRDT_DOC_META_KEY, true ) !== $doc ) {

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.

Looking at usages of update_post_meta in the WordPress codebase, the return value is mostly not checked at all 🤷‍♂️ It's probably quite hard for the update to fail. 🙂

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.

Okay, good to know. I left in the defensive check for now, and ideally we rarely or never hit that code path anyway.

@alecgeatches
alecgeatches merged commit 05bf6da into trunk Jun 8, 2026
41 checks passed
@alecgeatches
alecgeatches deleted the add/rtc-doc-persistence-endpoint branch June 8, 2026 16:31
@alecgeatches

Copy link
Copy Markdown
Contributor Author

@jsnajdr Addressed the WP_REST_Response comment above and merged!

@github-actions github-actions Bot added this to the Gutenberg 23.4 milestone Jun 8, 2026
@ramonjd ramonjd added [Type] Enhancement A suggestion for improvement. and removed [Type] Task Issues or PRs that have been broken down into an individual action to take labels Jun 10, 2026
pento pushed a commit to WordPress/wordpress-develop that referenced this pull request Jun 30, 2026
This updates the pinned commit hash of the Gutenberg repository from `14db4ab9395a9e96430eed678e4288a59eecbd15 ` (version `23.3.0`) to `14db4ab9395a9e96430eed678e4288a59eecbd15` (version `23.4.0`).

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

The following commits are included:
- Hide image dimension tools when a state is selected (WordPress/gutenberg#78670)
- Changed labels to consistently use Patterns in favor of Block patterns (WordPress/gutenberg#56880)
- Fix: Restrict parent page API search to post titles only (WordPress/gutenberg#78683)
- Update AGENTS.md to mention additional pitfalls: (WordPress/gutenberg#78718)
- Docs: Fix big_image_size_threshold xref typo (WordPress/gutenberg#76299)
- Compose: Fully deprecate the 'pure' HoC (WordPress/gutenberg#78674)
- Common CSS: avoid false-positive border-style on custom properties (WordPress/gutenberg#77476)
- Compose: Fix SSR crash in useMediaQuery and useViewportMatch (WordPress/gutenberg#78725)
- CI: Skip plugin repo release when SVN tag already exists (WordPress/gutenberg#78476)
- Dashboard: Hello Dolly (WordPress/gutenberg#78648)
- UI: `Tooltip.Provider` — forward upstream `closeDelay` and `timeout` props (WordPress/gutenberg#78642)
- Compose: Support React 19 ref callback cleanups in `useMergeRefs` (WordPress/gutenberg#78685)
- Add copilot-instructions.md file (WordPress/gutenberg#78584)
- Dashboard: show ghost widgets visually & allow easy removal (WordPress/gutenberg#78502)
- Bump fast-xml-builder from 1.0.0 to 1.2.0 (WordPress/gutenberg#78272)
- Bump actions/stale (WordPress/gutenberg#78745)
- Bump fast-xml-parser from 4.5.0 to 4.5.6 (WordPress/gutenberg#77167)
- Bump actions/github-script from 8.0.0 to 9.0.0 in /.github/workflows (WordPress/gutenberg#78591)
- @wordpress/theme: deduplicate addFallbackToVar helper (WordPress/gutenberg#78666)
- Add Combobox primitives (WordPress/gutenberg#78399)
- Editor: Fix keyboard activation of the template actions preview (WordPress/gutenberg#78641)
- Theme: drop `density` support from `@wordpress/theme` (WordPress/gutenberg#78741)
- Tooltip migration: fields + media-editor + media-fields + global-styles-ui (4/5) (WordPress/gutenberg#78691)
- List View: Expose block visibility label to assistive technology (WordPress/gutenberg#78640)
- Hide paragraph Drop cap control when a state is selected (WordPress/gutenberg#78672)
- Image cropper: round zoom control values and display as percentages (WordPress/gutenberg#78757)
- Media Editor Modal: Try placing the save and cancel buttons in the footer (WordPress/gutenberg#78708)
- Unset grid span defaults with viewport states enabled (WordPress/gutenberg#78709)
- Media Editor: Remove resize handles toggle from crop panel (WordPress/gutenberg#78758)
- Image Editor: focus return after closing image crop modal (WordPress/gutenberg#78711)
- Add dashboard Events widget (WordPress/gutenberg#78553)
- Writing flow: Delete at end of nested list item should merge into next block (WordPress/gutenberg#78742)
- RTC: Re-render collaborators overlay when the block tree changes (WordPress/gutenberg#78636)
- Dashboard: rename `widget-types` to `widget-primitives` and consolidate the widget contract (WordPress/gutenberg#78749)
- Fix Gutenberg plugin assuming its directory is named "gutenberg" (WordPress/gutenberg#78705)
- Codemods: Remove one-shot Tooltip migration codemod (WordPress/gutenberg#78669)
- Dashboard: rename `WidgetChrome` to `DashboardWidgetChrome` (WordPress/gutenberg#78751)
- Paragraph: Strip stale block-support classes from className during align attribute migration (WordPress/gutenberg#78731)
- Global Styles: Fix CSS not applying to Custom CSS textarea in Advanced panel (WordPress/gutenberg#78773)
- scripts: Use require.resolve for SVG loaders to fix pnpm compat (WordPress/gutenberg#78777)
- Post list: Remove close button from Quick Edit drawer (WordPress/gutenberg#78730)
- Revert "Gate client-side media processing as plugin-only (WordPress/gutenberg#76700)" (WordPress/gutenberg#76751)
- Tooltip migration: boot consumers + shell-level Tooltip.Provider (5/5) (WordPress/gutenberg#78692)
- Dashboard: replace `surface` with `host` in widget contract docs (WordPress/gutenberg#78778)
- Shortcode block: Fix editor crash when selecting transform menu (WordPress/gutenberg#78770)
- Make `@wordpress/nux` a no-op compatibility package (WordPress/gutenberg#77773)
- Tests: Temporarily disable REST index output-format assertions (WordPress/gutenberg#78788)
- Hide Cover overlay controls for viewport states (WordPress/gutenberg#78763)
- Fix type of `$block_instance` parameter in `block_core_image_render_lightbox()` (WordPress/gutenberg#78790)
- TypeScript: Migrate server-side-render package to TS (WordPress/gutenberg#71383)
- feat: Migrate performance results to tools release (WordPress/gutenberg#78761)
- wp-build: Fix black flash on wp-admin pages before hydration (WordPress/gutenberg#78493)
- Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)
- Dashboard: Use Howdy greeting for page title (WordPress/gutenberg#78740)
- Block Editor: Refactor Inserter to a function component (WordPress/gutenberg#78766)
- Dashboard: Move layout settings to customize toolbar (WordPress/gutenberg#78738)
- Build: update changelog (WordPress/gutenberg#78807)
- Icons: rename timeToRead to time (WordPress/gutenberg#78804)
- RTC: Prevent slower polling filters (WordPress/gutenberg#78811)
- Button.Icon: Fix clipped icons (WordPress/gutenberg#78614)
- Bump docker/login-action (WordPress/gutenberg#78819)
- RTC: Return forbidden rooms together (WordPress/gutenberg#78748)
- Update browserslist (WordPress/gutenberg#78840)
- Try allowing transforms to a variation of another block (WordPress/gutenberg#78713)
- Elements: Guard against non-string className in render filter (WordPress/gutenberg#78841)
- e2e-test-utils-playwright: add src to published NPM files (WordPress/gutenberg#78847)
- Editor: Refactor 'PostPublishButton' into function component (WordPress/gutenberg#78737)
- Dashboard: Promote WidgetRender into widget-primitives (WordPress/gutenberg#78821)
- Notes: Show default avatar in the indicator when user avatars are disabled (WordPress/gutenberg#78849)
- Revert "Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)" (WordPress/gutenberg#78854)
- Media: Send Document-Isolation-Policy header on the site preview frame (WordPress/gutenberg#78404)
- Revert navigation morph & playlist commits pushed directly to trunk (WordPress/gutenberg#78857)
- Fix Update button staying active when changes are reverted. (WordPress/gutenberg#78567)
- Docs: Fix and improve documentation (WordPress/gutenberg#78686)
- Abilities: Add validation tests pinning behavior for WP-specific schema keywords (WordPress/gutenberg#78783)
- Tools: migrate docs/tool into tools/docs workspace (WordPress/gutenberg#78870)
- Dashboard: Fix Add widget error on non-secure HTTP origins (WordPress/gutenberg#78850)
- Docs: Fix @wordpress/data README fragment links (WordPress/gutenberg#78866)
- bin: Remove obsolete bin/setup-local-env.sh (WordPress/gutenberg#78871)
- Boot navigation: wrap items in a list role for valid listitem semantics (WordPress/gutenberg#78829)
- wp-build: Document generated page hooks per WordPress standards. (WordPress/gutenberg#78826)
- Update CODEOWNERS for tooling directories (WordPress/gutenberg#78874)
- Block Visibility: Keep hide-everywhere working after a block opts out of visibility support (WordPress/gutenberg#78780)
- Dashboard: Replace grid row height controls with size presets. (WordPress/gutenberg#78735)
- Prevent font-size propagation in Navigation items causing `em` compounding (WordPress/gutenberg#77419)
- Media Editor Modal: Reorder details fields so the editable regular layout fields appear at the top (WordPress/gutenberg#78792)
- Fix media editor sidebar close button label (WordPress/gutenberg#78895)
- Dashboard: event widget iteration (WordPress/gutenberg#78815)
- Playlist Block: Add visualization style selector (WordPress/gutenberg#76147)
- [Content Types]: Fix extra Page padding causing vertical scrollbar (WordPress/gutenberg#78661)
- Remove migrated dependencies from root package.json (WordPress/gutenberg#78813)
- Packages: Declare missing `@types/react` dependency (WordPress/gutenberg#78882)
- Fix collapsed experiment cards not stretching to full width (WordPress/gutenberg#78910)
- Element: add polyfills for render, hydrate, unmountComponentAtNode (WordPress/gutenberg#78899)
- Revert "wp-build: Replace getter-based exports with data properties" (WordPress/gutenberg#78917)
- React: add ReactCurrentOwner polyfill (WordPress/gutenberg#78923)
- Fix playlist metadata edits recreating player (WordPress/gutenberg#78876)
- Media Editor: Fix sidebar overflowing the modal between the small and medium breakpoints (WordPress/gutenberg#78931)
- Media: Move client-side media compat file to wordpress-7.1 directory (WordPress/gutenberg#78852)
- env: Replace extract-zip with adm-zip to fix hang on Node 24.16 (WordPress/gutenberg#78828)
- Media Editor: refactor modal layout (WordPress/gutenberg#78896)
- Optimize wp-env source downloads with Git partial clones (WordPress/gutenberg#78918)
- Fix: Escape URLs in block render functions using `esc_url()` (WordPress/gutenberg#78912)
- Blocks: Allow the Login/out block as an inner block in the Navigation Submenu block (WordPress/gutenberg#75497)
- Fix sprintf format specifiers in post-date and read-more blocks (WordPress/gutenberg#78933)
- Refactor: Remove jest/test deps from root package.json (WordPress/gutenberg#78801)
- Upload Media: Add retry with exponential backoff and network resilience (WordPress/gutenberg#76765)
- Build Scripts: Fix Windows path handling in dev script (WordPress/gutenberg#78939)
- Revert React 19 upgrade (WordPress/gutenberg#78940)
- Fix: block auto-complete for AI API Keys in Connectors (WordPress/gutenberg#78946)
- Dashboard: Opinionated grid columns with container breakpoints (WordPress/gutenberg#78732)
- Skip including inactive or experimental routes when building for WordPress Core (WordPress/gutenberg#76715)
- RTC: Fix Yjs undo manager to update UI state when undo stack changes (WordPress/gutenberg#78864)
- Storybook: Enhance Theme Provider example with admin-ui Page. (WordPress/gutenberg#78814)
- RTC: Fix CRDT deferred updates resulting in jumbled typing (WordPress/gutenberg#78756)
- Add playlist track length setting (WordPress/gutenberg#78954)
- Add aspect ratio control to media editor mobile toolbar (WordPress/gutenberg#78935)
- Media Editor: Replace the zoom slider with +/- buttons (WordPress/gutenberg#78928)
- Use omit-unchanged for compressed-size-action (WordPress/gutenberg#78976)
- DataViewsPicker: Add a new `pickerActivity` layout (WordPress/gutenberg#78941)
- refactor: move babel dependencies to workspace configuration (WordPress/gutenberg#78974)
- feat: Migrate the browserlintrc file to `packages/postcss-plugins-preset` (WordPress/gutenberg#78764)
- Storybook: Declare workspace dependencies for theme example story. (WordPress/gutenberg#78979)
- Refactor: Move React dependencies from root to workspaces (WordPress/gutenberg#78981)
- UI: Update `@base-ui/react` to `1.5.0` (WordPress/gutenberg#78448)
- ui/AlertDialog: Fix footer layout style override (WordPress/gutenberg#78953)
- Font Library: Fix focus issue when navigating (WordPress/gutenberg#78671)
- Docs: Auto-generate per-block API reference pages from block.json (WordPress/gutenberg#77612)
- Patterns: fix focus loss when dismissing Create pattern dialog (WordPress/gutenberg#78957)
- Show media upload progress in a snackbar (WordPress/gutenberg#77249)
- Upload Media: Gate very large images out of client-side processing (WordPress/gutenberg#78949)
- Media: Add UltraHDR (ISO 21496-1) gain map support (WordPress/gutenberg#74873)
- Site Editor: Apply the user's admin color scheme (WordPress/gutenberg#78397)
- Navigation Link: fix duplicate block html attributes in editor (WordPress/gutenberg#78973)
- Added Missing Global Documentation (WordPress/gutenberg#78997)
- Post Revisions: Upgrade `diff` from v4 to v8 (WordPress/gutenberg#77992)
- Theme: Increase stroke1 contrast target to 2.9 (WordPress/gutenberg#77599)
- Tooltip: Use md border radius for portaled popups. (WordPress/gutenberg#78983)
- Framework: Remove invalid stale nested npm package references (WordPress/gutenberg#79014)
- Theme package: Add element size design tokens (WordPress/gutenberg#76545)
- Inserter: use forwardRef for refs (WordPress/gutenberg#79006)
- RTC: Add separate doc persistence endpoint (WordPress/gutenberg#78891)
- DataViews: Add DataViews components to components manifest (WordPress/gutenberg#78960)
- Media Editor: Keep crop handles operable on large images (WordPress/gutenberg#79011)
- Media editor: tweak paddings and margins (WordPress/gutenberg#79009)
- Media Editor: Remove lag when toggling the sidebar (WordPress/gutenberg#79024)
- Elements: Align class name parsing with custom CSS implementation (WordPress/gutenberg#79023)
- CI: Suppress lint:js warnings on static checks (WordPress/gutenberg#79025)
- Remove React Native implementation, framework, and dependencies (WordPress/gutenberg#78747)
- e2e-test-utils-playwright: start transpiling again, but faster (WordPress/gutenberg#79026)
- CI: Remove Validate Gradle Wrapper workflow (WordPress/gutenberg#79030)
- Remove dead native code branches from Platform usages (WordPress/gutenberg#79031)
- Remove orphaned README files for deleted native-only components (WordPress/gutenberg#79035)
- Remove orphaned mobile bug report issue template (WordPress/gutenberg#79038)
- Inserter: Fix error being thrown for spoken message when inserting default/direct block (WordPress/gutenberg#79004)
- Editor: Remove dead native guard in block removal warnings (WordPress/gutenberg#79039)
- Preserve nested list when deleting a selection across sibling list items (WordPress/gutenberg#78776)
- Remove platform-docs Docusaurus site (WordPress/gutenberg#79034)
- Align dependency versions across workspaces (WordPress/gutenberg#77954)
- RichText: Remove dead native-only prop filtering (WordPress/gutenberg#79037)
- Navigable Container: Hoist getFocusableContext out of the component (WordPress/gutenberg#79029)
- Tools: Lint dependency version consistency with Syncpack (WordPress/gutenberg#77950)
- Extract entity view config into a filterable API (WordPress/gutenberg#78977)
- Rich text: use subscribeDelegatedListener for element event listeners (WordPress/gutenberg#79047)
- theme/ThemeProvider: rename `color.bg` prop to `color.background` (WordPress/gutenberg#79007)
- Format Library: Migrate to recommended `@wordpress/ui` components (WordPress/gutenberg#79059)
- Syncpack: ban `classnames` from being reintroduced (WordPress/gutenberg#79061)
- UI: Update CSS cascade layers to use nesting (WordPress/gutenberg#78959)
- Docs: Remove stale mobile references from tooling and primitives docs (WordPress/gutenberg#79041)
- Release: Drop mobile-specific changelog omit rules (WordPress/gutenberg#79042)
- Bump actions/checkout (WordPress/gutenberg#79033)
- `ColorPalette`: don't render when custom colors disabled and no colors passed (WordPress/gutenberg#72402)
- Bump minimatch and lerna (WordPress/gutenberg#76750)
- Image block: don't show crop icon while image is uploading (WordPress/gutenberg#79103)
- Add React 19 as an experimental flag (WordPress/gutenberg#79077)
- Media modal: small tweak to gutters (WordPress/gutenberg#79168)
- Add more React internals polyfills (WordPress/gutenberg#79142)
- Media editor modal: Fix keyboard resizing for locked aspect-ratio crops (WordPress/gutenberg#79207)
- Fix responsive element styles front end output (WordPress/gutenberg#79135) (WordPress/gutenberg#79215)

Props adamsilverstein, jorbin, westonruter, wildworks.
Fixes #65368.

git-svn-id: https://develop.svn.wordpress.org/trunk@62584 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request Jun 30, 2026
This updates the pinned commit hash of the Gutenberg repository from `14db4ab9395a9e96430eed678e4288a59eecbd15 ` (version `23.3.0`) to `14db4ab9395a9e96430eed678e4288a59eecbd15` (version `23.4.0`).

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

The following commits are included:
- Hide image dimension tools when a state is selected (WordPress/gutenberg#78670)
- Changed labels to consistently use Patterns in favor of Block patterns (WordPress/gutenberg#56880)
- Fix: Restrict parent page API search to post titles only (WordPress/gutenberg#78683)
- Update AGENTS.md to mention additional pitfalls: (WordPress/gutenberg#78718)
- Docs: Fix big_image_size_threshold xref typo (WordPress/gutenberg#76299)
- Compose: Fully deprecate the 'pure' HoC (WordPress/gutenberg#78674)
- Common CSS: avoid false-positive border-style on custom properties (WordPress/gutenberg#77476)
- Compose: Fix SSR crash in useMediaQuery and useViewportMatch (WordPress/gutenberg#78725)
- CI: Skip plugin repo release when SVN tag already exists (WordPress/gutenberg#78476)
- Dashboard: Hello Dolly (WordPress/gutenberg#78648)
- UI: `Tooltip.Provider` — forward upstream `closeDelay` and `timeout` props (WordPress/gutenberg#78642)
- Compose: Support React 19 ref callback cleanups in `useMergeRefs` (WordPress/gutenberg#78685)
- Add copilot-instructions.md file (WordPress/gutenberg#78584)
- Dashboard: show ghost widgets visually & allow easy removal (WordPress/gutenberg#78502)
- Bump fast-xml-builder from 1.0.0 to 1.2.0 (WordPress/gutenberg#78272)
- Bump actions/stale (WordPress/gutenberg#78745)
- Bump fast-xml-parser from 4.5.0 to 4.5.6 (WordPress/gutenberg#77167)
- Bump actions/github-script from 8.0.0 to 9.0.0 in /.github/workflows (WordPress/gutenberg#78591)
- @wordpress/theme: deduplicate addFallbackToVar helper (WordPress/gutenberg#78666)
- Add Combobox primitives (WordPress/gutenberg#78399)
- Editor: Fix keyboard activation of the template actions preview (WordPress/gutenberg#78641)
- Theme: drop `density` support from `@wordpress/theme` (WordPress/gutenberg#78741)
- Tooltip migration: fields + media-editor + media-fields + global-styles-ui (4/5) (WordPress/gutenberg#78691)
- List View: Expose block visibility label to assistive technology (WordPress/gutenberg#78640)
- Hide paragraph Drop cap control when a state is selected (WordPress/gutenberg#78672)
- Image cropper: round zoom control values and display as percentages (WordPress/gutenberg#78757)
- Media Editor Modal: Try placing the save and cancel buttons in the footer (WordPress/gutenberg#78708)
- Unset grid span defaults with viewport states enabled (WordPress/gutenberg#78709)
- Media Editor: Remove resize handles toggle from crop panel (WordPress/gutenberg#78758)
- Image Editor: focus return after closing image crop modal (WordPress/gutenberg#78711)
- Add dashboard Events widget (WordPress/gutenberg#78553)
- Writing flow: Delete at end of nested list item should merge into next block (WordPress/gutenberg#78742)
- RTC: Re-render collaborators overlay when the block tree changes (WordPress/gutenberg#78636)
- Dashboard: rename `widget-types` to `widget-primitives` and consolidate the widget contract (WordPress/gutenberg#78749)
- Fix Gutenberg plugin assuming its directory is named "gutenberg" (WordPress/gutenberg#78705)
- Codemods: Remove one-shot Tooltip migration codemod (WordPress/gutenberg#78669)
- Dashboard: rename `WidgetChrome` to `DashboardWidgetChrome` (WordPress/gutenberg#78751)
- Paragraph: Strip stale block-support classes from className during align attribute migration (WordPress/gutenberg#78731)
- Global Styles: Fix CSS not applying to Custom CSS textarea in Advanced panel (WordPress/gutenberg#78773)
- scripts: Use require.resolve for SVG loaders to fix pnpm compat (WordPress/gutenberg#78777)
- Post list: Remove close button from Quick Edit drawer (WordPress/gutenberg#78730)
- Revert "Gate client-side media processing as plugin-only (WordPress/gutenberg#76700)" (WordPress/gutenberg#76751)
- Tooltip migration: boot consumers + shell-level Tooltip.Provider (5/5) (WordPress/gutenberg#78692)
- Dashboard: replace `surface` with `host` in widget contract docs (WordPress/gutenberg#78778)
- Shortcode block: Fix editor crash when selecting transform menu (WordPress/gutenberg#78770)
- Make `@wordpress/nux` a no-op compatibility package (WordPress/gutenberg#77773)
- Tests: Temporarily disable REST index output-format assertions (WordPress/gutenberg#78788)
- Hide Cover overlay controls for viewport states (WordPress/gutenberg#78763)
- Fix type of `$block_instance` parameter in `block_core_image_render_lightbox()` (WordPress/gutenberg#78790)
- TypeScript: Migrate server-side-render package to TS (WordPress/gutenberg#71383)
- feat: Migrate performance results to tools release (WordPress/gutenberg#78761)
- wp-build: Fix black flash on wp-admin pages before hydration (WordPress/gutenberg#78493)
- Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)
- Dashboard: Use Howdy greeting for page title (WordPress/gutenberg#78740)
- Block Editor: Refactor Inserter to a function component (WordPress/gutenberg#78766)
- Dashboard: Move layout settings to customize toolbar (WordPress/gutenberg#78738)
- Build: update changelog (WordPress/gutenberg#78807)
- Icons: rename timeToRead to time (WordPress/gutenberg#78804)
- RTC: Prevent slower polling filters (WordPress/gutenberg#78811)
- Button.Icon: Fix clipped icons (WordPress/gutenberg#78614)
- Bump docker/login-action (WordPress/gutenberg#78819)
- RTC: Return forbidden rooms together (WordPress/gutenberg#78748)
- Update browserslist (WordPress/gutenberg#78840)
- Try allowing transforms to a variation of another block (WordPress/gutenberg#78713)
- Elements: Guard against non-string className in render filter (WordPress/gutenberg#78841)
- e2e-test-utils-playwright: add src to published NPM files (WordPress/gutenberg#78847)
- Editor: Refactor 'PostPublishButton' into function component (WordPress/gutenberg#78737)
- Dashboard: Promote WidgetRender into widget-primitives (WordPress/gutenberg#78821)
- Notes: Show default avatar in the indicator when user avatars are disabled (WordPress/gutenberg#78849)
- Revert "Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)" (WordPress/gutenberg#78854)
- Media: Send Document-Isolation-Policy header on the site preview frame (WordPress/gutenberg#78404)
- Revert navigation morph & playlist commits pushed directly to trunk (WordPress/gutenberg#78857)
- Fix Update button staying active when changes are reverted. (WordPress/gutenberg#78567)
- Docs: Fix and improve documentation (WordPress/gutenberg#78686)
- Abilities: Add validation tests pinning behavior for WP-specific schema keywords (WordPress/gutenberg#78783)
- Tools: migrate docs/tool into tools/docs workspace (WordPress/gutenberg#78870)
- Dashboard: Fix Add widget error on non-secure HTTP origins (WordPress/gutenberg#78850)
- Docs: Fix @wordpress/data README fragment links (WordPress/gutenberg#78866)
- bin: Remove obsolete bin/setup-local-env.sh (WordPress/gutenberg#78871)
- Boot navigation: wrap items in a list role for valid listitem semantics (WordPress/gutenberg#78829)
- wp-build: Document generated page hooks per WordPress standards. (WordPress/gutenberg#78826)
- Update CODEOWNERS for tooling directories (WordPress/gutenberg#78874)
- Block Visibility: Keep hide-everywhere working after a block opts out of visibility support (WordPress/gutenberg#78780)
- Dashboard: Replace grid row height controls with size presets. (WordPress/gutenberg#78735)
- Prevent font-size propagation in Navigation items causing `em` compounding (WordPress/gutenberg#77419)
- Media Editor Modal: Reorder details fields so the editable regular layout fields appear at the top (WordPress/gutenberg#78792)
- Fix media editor sidebar close button label (WordPress/gutenberg#78895)
- Dashboard: event widget iteration (WordPress/gutenberg#78815)
- Playlist Block: Add visualization style selector (WordPress/gutenberg#76147)
- [Content Types]: Fix extra Page padding causing vertical scrollbar (WordPress/gutenberg#78661)
- Remove migrated dependencies from root package.json (WordPress/gutenberg#78813)
- Packages: Declare missing `@types/react` dependency (WordPress/gutenberg#78882)
- Fix collapsed experiment cards not stretching to full width (WordPress/gutenberg#78910)
- Element: add polyfills for render, hydrate, unmountComponentAtNode (WordPress/gutenberg#78899)
- Revert "wp-build: Replace getter-based exports with data properties" (WordPress/gutenberg#78917)
- React: add ReactCurrentOwner polyfill (WordPress/gutenberg#78923)
- Fix playlist metadata edits recreating player (WordPress/gutenberg#78876)
- Media Editor: Fix sidebar overflowing the modal between the small and medium breakpoints (WordPress/gutenberg#78931)
- Media: Move client-side media compat file to wordpress-7.1 directory (WordPress/gutenberg#78852)
- env: Replace extract-zip with adm-zip to fix hang on Node 24.16 (WordPress/gutenberg#78828)
- Media Editor: refactor modal layout (WordPress/gutenberg#78896)
- Optimize wp-env source downloads with Git partial clones (WordPress/gutenberg#78918)
- Fix: Escape URLs in block render functions using `esc_url()` (WordPress/gutenberg#78912)
- Blocks: Allow the Login/out block as an inner block in the Navigation Submenu block (WordPress/gutenberg#75497)
- Fix sprintf format specifiers in post-date and read-more blocks (WordPress/gutenberg#78933)
- Refactor: Remove jest/test deps from root package.json (WordPress/gutenberg#78801)
- Upload Media: Add retry with exponential backoff and network resilience (WordPress/gutenberg#76765)
- Build Scripts: Fix Windows path handling in dev script (WordPress/gutenberg#78939)
- Revert React 19 upgrade (WordPress/gutenberg#78940)
- Fix: block auto-complete for AI API Keys in Connectors (WordPress/gutenberg#78946)
- Dashboard: Opinionated grid columns with container breakpoints (WordPress/gutenberg#78732)
- Skip including inactive or experimental routes when building for WordPress Core (WordPress/gutenberg#76715)
- RTC: Fix Yjs undo manager to update UI state when undo stack changes (WordPress/gutenberg#78864)
- Storybook: Enhance Theme Provider example with admin-ui Page. (WordPress/gutenberg#78814)
- RTC: Fix CRDT deferred updates resulting in jumbled typing (WordPress/gutenberg#78756)
- Add playlist track length setting (WordPress/gutenberg#78954)
- Add aspect ratio control to media editor mobile toolbar (WordPress/gutenberg#78935)
- Media Editor: Replace the zoom slider with +/- buttons (WordPress/gutenberg#78928)
- Use omit-unchanged for compressed-size-action (WordPress/gutenberg#78976)
- DataViewsPicker: Add a new `pickerActivity` layout (WordPress/gutenberg#78941)
- refactor: move babel dependencies to workspace configuration (WordPress/gutenberg#78974)
- feat: Migrate the browserlintrc file to `packages/postcss-plugins-preset` (WordPress/gutenberg#78764)
- Storybook: Declare workspace dependencies for theme example story. (WordPress/gutenberg#78979)
- Refactor: Move React dependencies from root to workspaces (WordPress/gutenberg#78981)
- UI: Update `@base-ui/react` to `1.5.0` (WordPress/gutenberg#78448)
- ui/AlertDialog: Fix footer layout style override (WordPress/gutenberg#78953)
- Font Library: Fix focus issue when navigating (WordPress/gutenberg#78671)
- Docs: Auto-generate per-block API reference pages from block.json (WordPress/gutenberg#77612)
- Patterns: fix focus loss when dismissing Create pattern dialog (WordPress/gutenberg#78957)
- Show media upload progress in a snackbar (WordPress/gutenberg#77249)
- Upload Media: Gate very large images out of client-side processing (WordPress/gutenberg#78949)
- Media: Add UltraHDR (ISO 21496-1) gain map support (WordPress/gutenberg#74873)
- Site Editor: Apply the user's admin color scheme (WordPress/gutenberg#78397)
- Navigation Link: fix duplicate block html attributes in editor (WordPress/gutenberg#78973)
- Added Missing Global Documentation (WordPress/gutenberg#78997)
- Post Revisions: Upgrade `diff` from v4 to v8 (WordPress/gutenberg#77992)
- Theme: Increase stroke1 contrast target to 2.9 (WordPress/gutenberg#77599)
- Tooltip: Use md border radius for portaled popups. (WordPress/gutenberg#78983)
- Framework: Remove invalid stale nested npm package references (WordPress/gutenberg#79014)
- Theme package: Add element size design tokens (WordPress/gutenberg#76545)
- Inserter: use forwardRef for refs (WordPress/gutenberg#79006)
- RTC: Add separate doc persistence endpoint (WordPress/gutenberg#78891)
- DataViews: Add DataViews components to components manifest (WordPress/gutenberg#78960)
- Media Editor: Keep crop handles operable on large images (WordPress/gutenberg#79011)
- Media editor: tweak paddings and margins (WordPress/gutenberg#79009)
- Media Editor: Remove lag when toggling the sidebar (WordPress/gutenberg#79024)
- Elements: Align class name parsing with custom CSS implementation (WordPress/gutenberg#79023)
- CI: Suppress lint:js warnings on static checks (WordPress/gutenberg#79025)
- Remove React Native implementation, framework, and dependencies (WordPress/gutenberg#78747)
- e2e-test-utils-playwright: start transpiling again, but faster (WordPress/gutenberg#79026)
- CI: Remove Validate Gradle Wrapper workflow (WordPress/gutenberg#79030)
- Remove dead native code branches from Platform usages (WordPress/gutenberg#79031)
- Remove orphaned README files for deleted native-only components (WordPress/gutenberg#79035)
- Remove orphaned mobile bug report issue template (WordPress/gutenberg#79038)
- Inserter: Fix error being thrown for spoken message when inserting default/direct block (WordPress/gutenberg#79004)
- Editor: Remove dead native guard in block removal warnings (WordPress/gutenberg#79039)
- Preserve nested list when deleting a selection across sibling list items (WordPress/gutenberg#78776)
- Remove platform-docs Docusaurus site (WordPress/gutenberg#79034)
- Align dependency versions across workspaces (WordPress/gutenberg#77954)
- RichText: Remove dead native-only prop filtering (WordPress/gutenberg#79037)
- Navigable Container: Hoist getFocusableContext out of the component (WordPress/gutenberg#79029)
- Tools: Lint dependency version consistency with Syncpack (WordPress/gutenberg#77950)
- Extract entity view config into a filterable API (WordPress/gutenberg#78977)
- Rich text: use subscribeDelegatedListener for element event listeners (WordPress/gutenberg#79047)
- theme/ThemeProvider: rename `color.bg` prop to `color.background` (WordPress/gutenberg#79007)
- Format Library: Migrate to recommended `@wordpress/ui` components (WordPress/gutenberg#79059)
- Syncpack: ban `classnames` from being reintroduced (WordPress/gutenberg#79061)
- UI: Update CSS cascade layers to use nesting (WordPress/gutenberg#78959)
- Docs: Remove stale mobile references from tooling and primitives docs (WordPress/gutenberg#79041)
- Release: Drop mobile-specific changelog omit rules (WordPress/gutenberg#79042)
- Bump actions/checkout (WordPress/gutenberg#79033)
- `ColorPalette`: don't render when custom colors disabled and no colors passed (WordPress/gutenberg#72402)
- Bump minimatch and lerna (WordPress/gutenberg#76750)
- Image block: don't show crop icon while image is uploading (WordPress/gutenberg#79103)
- Add React 19 as an experimental flag (WordPress/gutenberg#79077)
- Media modal: small tweak to gutters (WordPress/gutenberg#79168)
- Add more React internals polyfills (WordPress/gutenberg#79142)
- Media editor modal: Fix keyboard resizing for locked aspect-ratio crops (WordPress/gutenberg#79207)
- Fix responsive element styles front end output (WordPress/gutenberg#79135) (WordPress/gutenberg#79215)

Props adamsilverstein, jorbin, westonruter, wildworks.
Fixes #65368.
Built from https://develop.svn.wordpress.org/trunk@62584


git-svn-id: http://core.svn.wordpress.org/trunk@61864 1a063a9b-81f0-0310-95a4-ce76da25c4cd
KhushalSainS pushed a commit to KhushalSainS/wordpress-develop that referenced this pull request Jul 1, 2026
This updates the pinned commit hash of the Gutenberg repository from `14db4ab9395a9e96430eed678e4288a59eecbd15 ` (version `23.3.0`) to `14db4ab9395a9e96430eed678e4288a59eecbd15` (version `23.4.0`).

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

The following commits are included:
- Hide image dimension tools when a state is selected (WordPress/gutenberg#78670)
- Changed labels to consistently use Patterns in favor of Block patterns (WordPress/gutenberg#56880)
- Fix: Restrict parent page API search to post titles only (WordPress/gutenberg#78683)
- Update AGENTS.md to mention additional pitfalls: (WordPress/gutenberg#78718)
- Docs: Fix big_image_size_threshold xref typo (WordPress/gutenberg#76299)
- Compose: Fully deprecate the 'pure' HoC (WordPress/gutenberg#78674)
- Common CSS: avoid false-positive border-style on custom properties (WordPress/gutenberg#77476)
- Compose: Fix SSR crash in useMediaQuery and useViewportMatch (WordPress/gutenberg#78725)
- CI: Skip plugin repo release when SVN tag already exists (WordPress/gutenberg#78476)
- Dashboard: Hello Dolly (WordPress/gutenberg#78648)
- UI: `Tooltip.Provider` — forward upstream `closeDelay` and `timeout` props (WordPress/gutenberg#78642)
- Compose: Support React 19 ref callback cleanups in `useMergeRefs` (WordPress/gutenberg#78685)
- Add copilot-instructions.md file (WordPress/gutenberg#78584)
- Dashboard: show ghost widgets visually & allow easy removal (WordPress/gutenberg#78502)
- Bump fast-xml-builder from 1.0.0 to 1.2.0 (WordPress/gutenberg#78272)
- Bump actions/stale (WordPress/gutenberg#78745)
- Bump fast-xml-parser from 4.5.0 to 4.5.6 (WordPress/gutenberg#77167)
- Bump actions/github-script from 8.0.0 to 9.0.0 in /.github/workflows (WordPress/gutenberg#78591)
- @wordpress/theme: deduplicate addFallbackToVar helper (WordPress/gutenberg#78666)
- Add Combobox primitives (WordPress/gutenberg#78399)
- Editor: Fix keyboard activation of the template actions preview (WordPress/gutenberg#78641)
- Theme: drop `density` support from `@wordpress/theme` (WordPress/gutenberg#78741)
- Tooltip migration: fields + media-editor + media-fields + global-styles-ui (4/5) (WordPress/gutenberg#78691)
- List View: Expose block visibility label to assistive technology (WordPress/gutenberg#78640)
- Hide paragraph Drop cap control when a state is selected (WordPress/gutenberg#78672)
- Image cropper: round zoom control values and display as percentages (WordPress/gutenberg#78757)
- Media Editor Modal: Try placing the save and cancel buttons in the footer (WordPress/gutenberg#78708)
- Unset grid span defaults with viewport states enabled (WordPress/gutenberg#78709)
- Media Editor: Remove resize handles toggle from crop panel (WordPress/gutenberg#78758)
- Image Editor: focus return after closing image crop modal (WordPress/gutenberg#78711)
- Add dashboard Events widget (WordPress/gutenberg#78553)
- Writing flow: Delete at end of nested list item should merge into next block (WordPress/gutenberg#78742)
- RTC: Re-render collaborators overlay when the block tree changes (WordPress/gutenberg#78636)
- Dashboard: rename `widget-types` to `widget-primitives` and consolidate the widget contract (WordPress/gutenberg#78749)
- Fix Gutenberg plugin assuming its directory is named "gutenberg" (WordPress/gutenberg#78705)
- Codemods: Remove one-shot Tooltip migration codemod (WordPress/gutenberg#78669)
- Dashboard: rename `WidgetChrome` to `DashboardWidgetChrome` (WordPress/gutenberg#78751)
- Paragraph: Strip stale block-support classes from className during align attribute migration (WordPress/gutenberg#78731)
- Global Styles: Fix CSS not applying to Custom CSS textarea in Advanced panel (WordPress/gutenberg#78773)
- scripts: Use require.resolve for SVG loaders to fix pnpm compat (WordPress/gutenberg#78777)
- Post list: Remove close button from Quick Edit drawer (WordPress/gutenberg#78730)
- Revert "Gate client-side media processing as plugin-only (WordPress/gutenberg#76700)" (WordPress/gutenberg#76751)
- Tooltip migration: boot consumers + shell-level Tooltip.Provider (5/5) (WordPress/gutenberg#78692)
- Dashboard: replace `surface` with `host` in widget contract docs (WordPress/gutenberg#78778)
- Shortcode block: Fix editor crash when selecting transform menu (WordPress/gutenberg#78770)
- Make `@wordpress/nux` a no-op compatibility package (WordPress/gutenberg#77773)
- Tests: Temporarily disable REST index output-format assertions (WordPress/gutenberg#78788)
- Hide Cover overlay controls for viewport states (WordPress/gutenberg#78763)
- Fix type of `$block_instance` parameter in `block_core_image_render_lightbox()` (WordPress/gutenberg#78790)
- TypeScript: Migrate server-side-render package to TS (WordPress/gutenberg#71383)
- feat: Migrate performance results to tools release (WordPress/gutenberg#78761)
- wp-build: Fix black flash on wp-admin pages before hydration (WordPress/gutenberg#78493)
- Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)
- Dashboard: Use Howdy greeting for page title (WordPress/gutenberg#78740)
- Block Editor: Refactor Inserter to a function component (WordPress/gutenberg#78766)
- Dashboard: Move layout settings to customize toolbar (WordPress/gutenberg#78738)
- Build: update changelog (WordPress/gutenberg#78807)
- Icons: rename timeToRead to time (WordPress/gutenberg#78804)
- RTC: Prevent slower polling filters (WordPress/gutenberg#78811)
- Button.Icon: Fix clipped icons (WordPress/gutenberg#78614)
- Bump docker/login-action (WordPress/gutenberg#78819)
- RTC: Return forbidden rooms together (WordPress/gutenberg#78748)
- Update browserslist (WordPress/gutenberg#78840)
- Try allowing transforms to a variation of another block (WordPress/gutenberg#78713)
- Elements: Guard against non-string className in render filter (WordPress/gutenberg#78841)
- e2e-test-utils-playwright: add src to published NPM files (WordPress/gutenberg#78847)
- Editor: Refactor 'PostPublishButton' into function component (WordPress/gutenberg#78737)
- Dashboard: Promote WidgetRender into widget-primitives (WordPress/gutenberg#78821)
- Notes: Show default avatar in the indicator when user avatars are disabled (WordPress/gutenberg#78849)
- Revert "Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)" (WordPress/gutenberg#78854)
- Media: Send Document-Isolation-Policy header on the site preview frame (WordPress/gutenberg#78404)
- Revert navigation morph & playlist commits pushed directly to trunk (WordPress/gutenberg#78857)
- Fix Update button staying active when changes are reverted. (WordPress/gutenberg#78567)
- Docs: Fix and improve documentation (WordPress/gutenberg#78686)
- Abilities: Add validation tests pinning behavior for WP-specific schema keywords (WordPress/gutenberg#78783)
- Tools: migrate docs/tool into tools/docs workspace (WordPress/gutenberg#78870)
- Dashboard: Fix Add widget error on non-secure HTTP origins (WordPress/gutenberg#78850)
- Docs: Fix @wordpress/data README fragment links (WordPress/gutenberg#78866)
- bin: Remove obsolete bin/setup-local-env.sh (WordPress/gutenberg#78871)
- Boot navigation: wrap items in a list role for valid listitem semantics (WordPress/gutenberg#78829)
- wp-build: Document generated page hooks per WordPress standards. (WordPress/gutenberg#78826)
- Update CODEOWNERS for tooling directories (WordPress/gutenberg#78874)
- Block Visibility: Keep hide-everywhere working after a block opts out of visibility support (WordPress/gutenberg#78780)
- Dashboard: Replace grid row height controls with size presets. (WordPress/gutenberg#78735)
- Prevent font-size propagation in Navigation items causing `em` compounding (WordPress/gutenberg#77419)
- Media Editor Modal: Reorder details fields so the editable regular layout fields appear at the top (WordPress/gutenberg#78792)
- Fix media editor sidebar close button label (WordPress/gutenberg#78895)
- Dashboard: event widget iteration (WordPress/gutenberg#78815)
- Playlist Block: Add visualization style selector (WordPress/gutenberg#76147)
- [Content Types]: Fix extra Page padding causing vertical scrollbar (WordPress/gutenberg#78661)
- Remove migrated dependencies from root package.json (WordPress/gutenberg#78813)
- Packages: Declare missing `@types/react` dependency (WordPress/gutenberg#78882)
- Fix collapsed experiment cards not stretching to full width (WordPress/gutenberg#78910)
- Element: add polyfills for render, hydrate, unmountComponentAtNode (WordPress/gutenberg#78899)
- Revert "wp-build: Replace getter-based exports with data properties" (WordPress/gutenberg#78917)
- React: add ReactCurrentOwner polyfill (WordPress/gutenberg#78923)
- Fix playlist metadata edits recreating player (WordPress/gutenberg#78876)
- Media Editor: Fix sidebar overflowing the modal between the small and medium breakpoints (WordPress/gutenberg#78931)
- Media: Move client-side media compat file to wordpress-7.1 directory (WordPress/gutenberg#78852)
- env: Replace extract-zip with adm-zip to fix hang on Node 24.16 (WordPress/gutenberg#78828)
- Media Editor: refactor modal layout (WordPress/gutenberg#78896)
- Optimize wp-env source downloads with Git partial clones (WordPress/gutenberg#78918)
- Fix: Escape URLs in block render functions using `esc_url()` (WordPress/gutenberg#78912)
- Blocks: Allow the Login/out block as an inner block in the Navigation Submenu block (WordPress/gutenberg#75497)
- Fix sprintf format specifiers in post-date and read-more blocks (WordPress/gutenberg#78933)
- Refactor: Remove jest/test deps from root package.json (WordPress/gutenberg#78801)
- Upload Media: Add retry with exponential backoff and network resilience (WordPress/gutenberg#76765)
- Build Scripts: Fix Windows path handling in dev script (WordPress/gutenberg#78939)
- Revert React 19 upgrade (WordPress/gutenberg#78940)
- Fix: block auto-complete for AI API Keys in Connectors (WordPress/gutenberg#78946)
- Dashboard: Opinionated grid columns with container breakpoints (WordPress/gutenberg#78732)
- Skip including inactive or experimental routes when building for WordPress Core (WordPress/gutenberg#76715)
- RTC: Fix Yjs undo manager to update UI state when undo stack changes (WordPress/gutenberg#78864)
- Storybook: Enhance Theme Provider example with admin-ui Page. (WordPress/gutenberg#78814)
- RTC: Fix CRDT deferred updates resulting in jumbled typing (WordPress/gutenberg#78756)
- Add playlist track length setting (WordPress/gutenberg#78954)
- Add aspect ratio control to media editor mobile toolbar (WordPress/gutenberg#78935)
- Media Editor: Replace the zoom slider with +/- buttons (WordPress/gutenberg#78928)
- Use omit-unchanged for compressed-size-action (WordPress/gutenberg#78976)
- DataViewsPicker: Add a new `pickerActivity` layout (WordPress/gutenberg#78941)
- refactor: move babel dependencies to workspace configuration (WordPress/gutenberg#78974)
- feat: Migrate the browserlintrc file to `packages/postcss-plugins-preset` (WordPress/gutenberg#78764)
- Storybook: Declare workspace dependencies for theme example story. (WordPress/gutenberg#78979)
- Refactor: Move React dependencies from root to workspaces (WordPress/gutenberg#78981)
- UI: Update `@base-ui/react` to `1.5.0` (WordPress/gutenberg#78448)
- ui/AlertDialog: Fix footer layout style override (WordPress/gutenberg#78953)
- Font Library: Fix focus issue when navigating (WordPress/gutenberg#78671)
- Docs: Auto-generate per-block API reference pages from block.json (WordPress/gutenberg#77612)
- Patterns: fix focus loss when dismissing Create pattern dialog (WordPress/gutenberg#78957)
- Show media upload progress in a snackbar (WordPress/gutenberg#77249)
- Upload Media: Gate very large images out of client-side processing (WordPress/gutenberg#78949)
- Media: Add UltraHDR (ISO 21496-1) gain map support (WordPress/gutenberg#74873)
- Site Editor: Apply the user's admin color scheme (WordPress/gutenberg#78397)
- Navigation Link: fix duplicate block html attributes in editor (WordPress/gutenberg#78973)
- Added Missing Global Documentation (WordPress/gutenberg#78997)
- Post Revisions: Upgrade `diff` from v4 to v8 (WordPress/gutenberg#77992)
- Theme: Increase stroke1 contrast target to 2.9 (WordPress/gutenberg#77599)
- Tooltip: Use md border radius for portaled popups. (WordPress/gutenberg#78983)
- Framework: Remove invalid stale nested npm package references (WordPress/gutenberg#79014)
- Theme package: Add element size design tokens (WordPress/gutenberg#76545)
- Inserter: use forwardRef for refs (WordPress/gutenberg#79006)
- RTC: Add separate doc persistence endpoint (WordPress/gutenberg#78891)
- DataViews: Add DataViews components to components manifest (WordPress/gutenberg#78960)
- Media Editor: Keep crop handles operable on large images (WordPress/gutenberg#79011)
- Media editor: tweak paddings and margins (WordPress/gutenberg#79009)
- Media Editor: Remove lag when toggling the sidebar (WordPress/gutenberg#79024)
- Elements: Align class name parsing with custom CSS implementation (WordPress/gutenberg#79023)
- CI: Suppress lint:js warnings on static checks (WordPress/gutenberg#79025)
- Remove React Native implementation, framework, and dependencies (WordPress/gutenberg#78747)
- e2e-test-utils-playwright: start transpiling again, but faster (WordPress/gutenberg#79026)
- CI: Remove Validate Gradle Wrapper workflow (WordPress/gutenberg#79030)
- Remove dead native code branches from Platform usages (WordPress/gutenberg#79031)
- Remove orphaned README files for deleted native-only components (WordPress/gutenberg#79035)
- Remove orphaned mobile bug report issue template (WordPress/gutenberg#79038)
- Inserter: Fix error being thrown for spoken message when inserting default/direct block (WordPress/gutenberg#79004)
- Editor: Remove dead native guard in block removal warnings (WordPress/gutenberg#79039)
- Preserve nested list when deleting a selection across sibling list items (WordPress/gutenberg#78776)
- Remove platform-docs Docusaurus site (WordPress/gutenberg#79034)
- Align dependency versions across workspaces (WordPress/gutenberg#77954)
- RichText: Remove dead native-only prop filtering (WordPress/gutenberg#79037)
- Navigable Container: Hoist getFocusableContext out of the component (WordPress/gutenberg#79029)
- Tools: Lint dependency version consistency with Syncpack (WordPress/gutenberg#77950)
- Extract entity view config into a filterable API (WordPress/gutenberg#78977)
- Rich text: use subscribeDelegatedListener for element event listeners (WordPress/gutenberg#79047)
- theme/ThemeProvider: rename `color.bg` prop to `color.background` (WordPress/gutenberg#79007)
- Format Library: Migrate to recommended `@wordpress/ui` components (WordPress/gutenberg#79059)
- Syncpack: ban `classnames` from being reintroduced (WordPress/gutenberg#79061)
- UI: Update CSS cascade layers to use nesting (WordPress/gutenberg#78959)
- Docs: Remove stale mobile references from tooling and primitives docs (WordPress/gutenberg#79041)
- Release: Drop mobile-specific changelog omit rules (WordPress/gutenberg#79042)
- Bump actions/checkout (WordPress/gutenberg#79033)
- `ColorPalette`: don't render when custom colors disabled and no colors passed (WordPress/gutenberg#72402)
- Bump minimatch and lerna (WordPress/gutenberg#76750)
- Image block: don't show crop icon while image is uploading (WordPress/gutenberg#79103)
- Add React 19 as an experimental flag (WordPress/gutenberg#79077)
- Media modal: small tweak to gutters (WordPress/gutenberg#79168)
- Add more React internals polyfills (WordPress/gutenberg#79142)
- Media editor modal: Fix keyboard resizing for locked aspect-ratio crops (WordPress/gutenberg#79207)
- Fix responsive element styles front end output (WordPress/gutenberg#79135) (WordPress/gutenberg#79215)

Props adamsilverstein, jorbin, westonruter, wildworks.
Fixes #65368.

git-svn-id: https://develop.svn.wordpress.org/trunk@62584 602fd350-edb4-49c9-b593-d223f7449a82
SteelWagstaff pushed a commit to SteelWagstaff/wordpress-develop that referenced this pull request Jul 2, 2026
This updates the pinned commit hash of the Gutenberg repository from `14db4ab9395a9e96430eed678e4288a59eecbd15 ` (version `23.3.0`) to `14db4ab9395a9e96430eed678e4288a59eecbd15` (version `23.4.0`).

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

The following commits are included:
- Hide image dimension tools when a state is selected (WordPress/gutenberg#78670)
- Changed labels to consistently use Patterns in favor of Block patterns (WordPress/gutenberg#56880)
- Fix: Restrict parent page API search to post titles only (WordPress/gutenberg#78683)
- Update AGENTS.md to mention additional pitfalls: (WordPress/gutenberg#78718)
- Docs: Fix big_image_size_threshold xref typo (WordPress/gutenberg#76299)
- Compose: Fully deprecate the 'pure' HoC (WordPress/gutenberg#78674)
- Common CSS: avoid false-positive border-style on custom properties (WordPress/gutenberg#77476)
- Compose: Fix SSR crash in useMediaQuery and useViewportMatch (WordPress/gutenberg#78725)
- CI: Skip plugin repo release when SVN tag already exists (WordPress/gutenberg#78476)
- Dashboard: Hello Dolly (WordPress/gutenberg#78648)
- UI: `Tooltip.Provider` — forward upstream `closeDelay` and `timeout` props (WordPress/gutenberg#78642)
- Compose: Support React 19 ref callback cleanups in `useMergeRefs` (WordPress/gutenberg#78685)
- Add copilot-instructions.md file (WordPress/gutenberg#78584)
- Dashboard: show ghost widgets visually & allow easy removal (WordPress/gutenberg#78502)
- Bump fast-xml-builder from 1.0.0 to 1.2.0 (WordPress/gutenberg#78272)
- Bump actions/stale (WordPress/gutenberg#78745)
- Bump fast-xml-parser from 4.5.0 to 4.5.6 (WordPress/gutenberg#77167)
- Bump actions/github-script from 8.0.0 to 9.0.0 in /.github/workflows (WordPress/gutenberg#78591)
- @wordpress/theme: deduplicate addFallbackToVar helper (WordPress/gutenberg#78666)
- Add Combobox primitives (WordPress/gutenberg#78399)
- Editor: Fix keyboard activation of the template actions preview (WordPress/gutenberg#78641)
- Theme: drop `density` support from `@wordpress/theme` (WordPress/gutenberg#78741)
- Tooltip migration: fields + media-editor + media-fields + global-styles-ui (4/5) (WordPress/gutenberg#78691)
- List View: Expose block visibility label to assistive technology (WordPress/gutenberg#78640)
- Hide paragraph Drop cap control when a state is selected (WordPress/gutenberg#78672)
- Image cropper: round zoom control values and display as percentages (WordPress/gutenberg#78757)
- Media Editor Modal: Try placing the save and cancel buttons in the footer (WordPress/gutenberg#78708)
- Unset grid span defaults with viewport states enabled (WordPress/gutenberg#78709)
- Media Editor: Remove resize handles toggle from crop panel (WordPress/gutenberg#78758)
- Image Editor: focus return after closing image crop modal (WordPress/gutenberg#78711)
- Add dashboard Events widget (WordPress/gutenberg#78553)
- Writing flow: Delete at end of nested list item should merge into next block (WordPress/gutenberg#78742)
- RTC: Re-render collaborators overlay when the block tree changes (WordPress/gutenberg#78636)
- Dashboard: rename `widget-types` to `widget-primitives` and consolidate the widget contract (WordPress/gutenberg#78749)
- Fix Gutenberg plugin assuming its directory is named "gutenberg" (WordPress/gutenberg#78705)
- Codemods: Remove one-shot Tooltip migration codemod (WordPress/gutenberg#78669)
- Dashboard: rename `WidgetChrome` to `DashboardWidgetChrome` (WordPress/gutenberg#78751)
- Paragraph: Strip stale block-support classes from className during align attribute migration (WordPress/gutenberg#78731)
- Global Styles: Fix CSS not applying to Custom CSS textarea in Advanced panel (WordPress/gutenberg#78773)
- scripts: Use require.resolve for SVG loaders to fix pnpm compat (WordPress/gutenberg#78777)
- Post list: Remove close button from Quick Edit drawer (WordPress/gutenberg#78730)
- Revert "Gate client-side media processing as plugin-only (WordPress/gutenberg#76700)" (WordPress/gutenberg#76751)
- Tooltip migration: boot consumers + shell-level Tooltip.Provider (5/5) (WordPress/gutenberg#78692)
- Dashboard: replace `surface` with `host` in widget contract docs (WordPress/gutenberg#78778)
- Shortcode block: Fix editor crash when selecting transform menu (WordPress/gutenberg#78770)
- Make `@wordpress/nux` a no-op compatibility package (WordPress/gutenberg#77773)
- Tests: Temporarily disable REST index output-format assertions (WordPress/gutenberg#78788)
- Hide Cover overlay controls for viewport states (WordPress/gutenberg#78763)
- Fix type of `$block_instance` parameter in `block_core_image_render_lightbox()` (WordPress/gutenberg#78790)
- TypeScript: Migrate server-side-render package to TS (WordPress/gutenberg#71383)
- feat: Migrate performance results to tools release (WordPress/gutenberg#78761)
- wp-build: Fix black flash on wp-admin pages before hydration (WordPress/gutenberg#78493)
- Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)
- Dashboard: Use Howdy greeting for page title (WordPress/gutenberg#78740)
- Block Editor: Refactor Inserter to a function component (WordPress/gutenberg#78766)
- Dashboard: Move layout settings to customize toolbar (WordPress/gutenberg#78738)
- Build: update changelog (WordPress/gutenberg#78807)
- Icons: rename timeToRead to time (WordPress/gutenberg#78804)
- RTC: Prevent slower polling filters (WordPress/gutenberg#78811)
- Button.Icon: Fix clipped icons (WordPress/gutenberg#78614)
- Bump docker/login-action (WordPress/gutenberg#78819)
- RTC: Return forbidden rooms together (WordPress/gutenberg#78748)
- Update browserslist (WordPress/gutenberg#78840)
- Try allowing transforms to a variation of another block (WordPress/gutenberg#78713)
- Elements: Guard against non-string className in render filter (WordPress/gutenberg#78841)
- e2e-test-utils-playwright: add src to published NPM files (WordPress/gutenberg#78847)
- Editor: Refactor 'PostPublishButton' into function component (WordPress/gutenberg#78737)
- Dashboard: Promote WidgetRender into widget-primitives (WordPress/gutenberg#78821)
- Notes: Show default avatar in the indicator when user avatars are disabled (WordPress/gutenberg#78849)
- Revert "Icons: maintain absolute stroke-width regardless of icon-size (WordPress/gutenberg#78774)" (WordPress/gutenberg#78854)
- Media: Send Document-Isolation-Policy header on the site preview frame (WordPress/gutenberg#78404)
- Revert navigation morph & playlist commits pushed directly to trunk (WordPress/gutenberg#78857)
- Fix Update button staying active when changes are reverted. (WordPress/gutenberg#78567)
- Docs: Fix and improve documentation (WordPress/gutenberg#78686)
- Abilities: Add validation tests pinning behavior for WP-specific schema keywords (WordPress/gutenberg#78783)
- Tools: migrate docs/tool into tools/docs workspace (WordPress/gutenberg#78870)
- Dashboard: Fix Add widget error on non-secure HTTP origins (WordPress/gutenberg#78850)
- Docs: Fix @wordpress/data README fragment links (WordPress/gutenberg#78866)
- bin: Remove obsolete bin/setup-local-env.sh (WordPress/gutenberg#78871)
- Boot navigation: wrap items in a list role for valid listitem semantics (WordPress/gutenberg#78829)
- wp-build: Document generated page hooks per WordPress standards. (WordPress/gutenberg#78826)
- Update CODEOWNERS for tooling directories (WordPress/gutenberg#78874)
- Block Visibility: Keep hide-everywhere working after a block opts out of visibility support (WordPress/gutenberg#78780)
- Dashboard: Replace grid row height controls with size presets. (WordPress/gutenberg#78735)
- Prevent font-size propagation in Navigation items causing `em` compounding (WordPress/gutenberg#77419)
- Media Editor Modal: Reorder details fields so the editable regular layout fields appear at the top (WordPress/gutenberg#78792)
- Fix media editor sidebar close button label (WordPress/gutenberg#78895)
- Dashboard: event widget iteration (WordPress/gutenberg#78815)
- Playlist Block: Add visualization style selector (WordPress/gutenberg#76147)
- [Content Types]: Fix extra Page padding causing vertical scrollbar (WordPress/gutenberg#78661)
- Remove migrated dependencies from root package.json (WordPress/gutenberg#78813)
- Packages: Declare missing `@types/react` dependency (WordPress/gutenberg#78882)
- Fix collapsed experiment cards not stretching to full width (WordPress/gutenberg#78910)
- Element: add polyfills for render, hydrate, unmountComponentAtNode (WordPress/gutenberg#78899)
- Revert "wp-build: Replace getter-based exports with data properties" (WordPress/gutenberg#78917)
- React: add ReactCurrentOwner polyfill (WordPress/gutenberg#78923)
- Fix playlist metadata edits recreating player (WordPress/gutenberg#78876)
- Media Editor: Fix sidebar overflowing the modal between the small and medium breakpoints (WordPress/gutenberg#78931)
- Media: Move client-side media compat file to wordpress-7.1 directory (WordPress/gutenberg#78852)
- env: Replace extract-zip with adm-zip to fix hang on Node 24.16 (WordPress/gutenberg#78828)
- Media Editor: refactor modal layout (WordPress/gutenberg#78896)
- Optimize wp-env source downloads with Git partial clones (WordPress/gutenberg#78918)
- Fix: Escape URLs in block render functions using `esc_url()` (WordPress/gutenberg#78912)
- Blocks: Allow the Login/out block as an inner block in the Navigation Submenu block (WordPress/gutenberg#75497)
- Fix sprintf format specifiers in post-date and read-more blocks (WordPress/gutenberg#78933)
- Refactor: Remove jest/test deps from root package.json (WordPress/gutenberg#78801)
- Upload Media: Add retry with exponential backoff and network resilience (WordPress/gutenberg#76765)
- Build Scripts: Fix Windows path handling in dev script (WordPress/gutenberg#78939)
- Revert React 19 upgrade (WordPress/gutenberg#78940)
- Fix: block auto-complete for AI API Keys in Connectors (WordPress/gutenberg#78946)
- Dashboard: Opinionated grid columns with container breakpoints (WordPress/gutenberg#78732)
- Skip including inactive or experimental routes when building for WordPress Core (WordPress/gutenberg#76715)
- RTC: Fix Yjs undo manager to update UI state when undo stack changes (WordPress/gutenberg#78864)
- Storybook: Enhance Theme Provider example with admin-ui Page. (WordPress/gutenberg#78814)
- RTC: Fix CRDT deferred updates resulting in jumbled typing (WordPress/gutenberg#78756)
- Add playlist track length setting (WordPress/gutenberg#78954)
- Add aspect ratio control to media editor mobile toolbar (WordPress/gutenberg#78935)
- Media Editor: Replace the zoom slider with +/- buttons (WordPress/gutenberg#78928)
- Use omit-unchanged for compressed-size-action (WordPress/gutenberg#78976)
- DataViewsPicker: Add a new `pickerActivity` layout (WordPress/gutenberg#78941)
- refactor: move babel dependencies to workspace configuration (WordPress/gutenberg#78974)
- feat: Migrate the browserlintrc file to `packages/postcss-plugins-preset` (WordPress/gutenberg#78764)
- Storybook: Declare workspace dependencies for theme example story. (WordPress/gutenberg#78979)
- Refactor: Move React dependencies from root to workspaces (WordPress/gutenberg#78981)
- UI: Update `@base-ui/react` to `1.5.0` (WordPress/gutenberg#78448)
- ui/AlertDialog: Fix footer layout style override (WordPress/gutenberg#78953)
- Font Library: Fix focus issue when navigating (WordPress/gutenberg#78671)
- Docs: Auto-generate per-block API reference pages from block.json (WordPress/gutenberg#77612)
- Patterns: fix focus loss when dismissing Create pattern dialog (WordPress/gutenberg#78957)
- Show media upload progress in a snackbar (WordPress/gutenberg#77249)
- Upload Media: Gate very large images out of client-side processing (WordPress/gutenberg#78949)
- Media: Add UltraHDR (ISO 21496-1) gain map support (WordPress/gutenberg#74873)
- Site Editor: Apply the user's admin color scheme (WordPress/gutenberg#78397)
- Navigation Link: fix duplicate block html attributes in editor (WordPress/gutenberg#78973)
- Added Missing Global Documentation (WordPress/gutenberg#78997)
- Post Revisions: Upgrade `diff` from v4 to v8 (WordPress/gutenberg#77992)
- Theme: Increase stroke1 contrast target to 2.9 (WordPress/gutenberg#77599)
- Tooltip: Use md border radius for portaled popups. (WordPress/gutenberg#78983)
- Framework: Remove invalid stale nested npm package references (WordPress/gutenberg#79014)
- Theme package: Add element size design tokens (WordPress/gutenberg#76545)
- Inserter: use forwardRef for refs (WordPress/gutenberg#79006)
- RTC: Add separate doc persistence endpoint (WordPress/gutenberg#78891)
- DataViews: Add DataViews components to components manifest (WordPress/gutenberg#78960)
- Media Editor: Keep crop handles operable on large images (WordPress/gutenberg#79011)
- Media editor: tweak paddings and margins (WordPress/gutenberg#79009)
- Media Editor: Remove lag when toggling the sidebar (WordPress/gutenberg#79024)
- Elements: Align class name parsing with custom CSS implementation (WordPress/gutenberg#79023)
- CI: Suppress lint:js warnings on static checks (WordPress/gutenberg#79025)
- Remove React Native implementation, framework, and dependencies (WordPress/gutenberg#78747)
- e2e-test-utils-playwright: start transpiling again, but faster (WordPress/gutenberg#79026)
- CI: Remove Validate Gradle Wrapper workflow (WordPress/gutenberg#79030)
- Remove dead native code branches from Platform usages (WordPress/gutenberg#79031)
- Remove orphaned README files for deleted native-only components (WordPress/gutenberg#79035)
- Remove orphaned mobile bug report issue template (WordPress/gutenberg#79038)
- Inserter: Fix error being thrown for spoken message when inserting default/direct block (WordPress/gutenberg#79004)
- Editor: Remove dead native guard in block removal warnings (WordPress/gutenberg#79039)
- Preserve nested list when deleting a selection across sibling list items (WordPress/gutenberg#78776)
- Remove platform-docs Docusaurus site (WordPress/gutenberg#79034)
- Align dependency versions across workspaces (WordPress/gutenberg#77954)
- RichText: Remove dead native-only prop filtering (WordPress/gutenberg#79037)
- Navigable Container: Hoist getFocusableContext out of the component (WordPress/gutenberg#79029)
- Tools: Lint dependency version consistency with Syncpack (WordPress/gutenberg#77950)
- Extract entity view config into a filterable API (WordPress/gutenberg#78977)
- Rich text: use subscribeDelegatedListener for element event listeners (WordPress/gutenberg#79047)
- theme/ThemeProvider: rename `color.bg` prop to `color.background` (WordPress/gutenberg#79007)
- Format Library: Migrate to recommended `@wordpress/ui` components (WordPress/gutenberg#79059)
- Syncpack: ban `classnames` from being reintroduced (WordPress/gutenberg#79061)
- UI: Update CSS cascade layers to use nesting (WordPress/gutenberg#78959)
- Docs: Remove stale mobile references from tooling and primitives docs (WordPress/gutenberg#79041)
- Release: Drop mobile-specific changelog omit rules (WordPress/gutenberg#79042)
- Bump actions/checkout (WordPress/gutenberg#79033)
- `ColorPalette`: don't render when custom colors disabled and no colors passed (WordPress/gutenberg#72402)
- Bump minimatch and lerna (WordPress/gutenberg#76750)
- Image block: don't show crop icon while image is uploading (WordPress/gutenberg#79103)
- Add React 19 as an experimental flag (WordPress/gutenberg#79077)
- Media modal: small tweak to gutters (WordPress/gutenberg#79168)
- Add more React internals polyfills (WordPress/gutenberg#79142)
- Media editor modal: Fix keyboard resizing for locked aspect-ratio crops (WordPress/gutenberg#79207)
- Fix responsive element styles front end output (WordPress/gutenberg#79135) (WordPress/gutenberg#79215)

Props adamsilverstein, jorbin, westonruter, wildworks.
Fixes #65368.

git-svn-id: https://develop.svn.wordpress.org/trunk@62584 602fd350-edb4-49c9-b593-d223f7449a82
@t-hamano t-hamano added the Needs Dev Note Requires a developer note for a major WordPress release cycle label Jul 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Real-time Collaboration Phase 3 of the Gutenberg roadmap around real-time collaboration Needs Dev Note Requires a developer note for a major WordPress release cycle No Core Sync Required Indicates that any changes do not need to be synced to WordPress Core [Package] Core data /packages/core-data [Package] Sync [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RTC: Move background CRDT document persistence out of entity saves

4 participants