Skip to content

Real-time collaboration: Remove block client IDs from Awareness, fix "Show Template" view#75590

Merged
alecgeatches merged 15 commits intoWordPress:trunkfrom
Automattic:add/rtc-relative-block-positioning
Feb 23, 2026
Merged

Real-time collaboration: Remove block client IDs from Awareness, fix "Show Template" view#75590
alecgeatches merged 15 commits intoWordPress:trunkfrom
Automattic:add/rtc-relative-block-positioning

Conversation

@alecgeatches
Copy link
Copy Markdown
Contributor

@alecgeatches alecgeatches commented Feb 16, 2026

What?

Screen.Recording.2026-02-18.at.12.55.33.PM.mov

Shared Awareness in "Show Template" mode

We've tried some other¹ attempts² to address block ID inconsistencies during block cloning so that awareness will continue to work when blocks are cloned, but real-time collaboration code still relies on block client IDs sent between collaborating users.

The key insight of this PR is that Yjs RelativePositions, which we currently use to show a user's cursor within Y.Text, also can be used to share exactly where the selection is within the block hierarchy.

The RelativePosition API returns absolute positions like { type: aSpecificYTextInstance, index: 2 } when converting from relative positions. We can then iterate through aSpecificYTextInstance.parent to find the associated block data, and .parent again to walk up the Yjs block tree. Using just relative positions without block client IDs, we can find where in the block tree a relative selection occurs, and then transform that location into a path (e.g. [2, 0] for the second block, first inner block), and then to a local block client ID. More concretely:

  1. User A clicks into a core/paragraph in block content. Below, this is within the "Inner paragraph" content:

    Screenshot 2026-02-16 at 3 10 20 PM
  2. Changing selection sends a RelativePosition to other peers. This uses internal Yjs markers for tracking location and looks something like this:

    {"type":{"client":2376465319,"clock":219},"tname":null,"item":null,"assoc":0}

    This represents a specific index within a specific Y.Text in the block tree. For example, the RelativePosition above may represent rootBlocks[2].innerBlocks[0].content at index 6.

  3. User B receives the RelativePosition and calls Y.createAbsolutePositionFromRelativePosition() to convert it to a AbsolutePosition. This is converted back into the specific Y.Text instance within the Yjs block tree, which looks something like:

    { type: Y.Text<Instance#123>, index: 6, assoc: 0 }
  4. Now we need to figure out which block this refers to. User B can iterate through .parent on theY.Text instance to find the parent block tree. Using this information and a shared Yjs tree structure, user B can convert the AbsolutePostition to a AbsoluteBlockIndexPath, e.g. [2, 0].

  5. User B uses the path [2, 0] to find rootBlocks[2].innerBlocks[0] and uses that to identify the local client ID of the block.

  6. We can now easily draw the remote position using local block client IDs.

This ensures awareness cursors render correctly even when the local block-editor store uses different clientId values than the Yjs document, such as when "Show Template" mode is enabled.

Why?

Block clientId values are locally generated UUIDs that can differ between collaborators. In normal editing mode this is not usually a problem because each peer's Yjs document and block-editor store share the same IDs. However, when "Show Template" mode is enabled, useBlockSync() clones blocks which creates new internal clientId values in the block-editor store while the Yjs document retains the original external IDs. If user A broadcasts their cursor position including blockId: "abc123", user B may have a completely different local clientId for the same block, causing awareness cursors to fail to render or appear on the wrong block.

Since the existing cursorPosition.relativePosition already lives inside the block's Y.Text in the Yjs document hierarchy, we can navigate up via AbstractType.parent on the receiver side to find the containing block. For the block identity itself, we use tree index paths (e.g. [2, 0, 0] for blocks[2].innerBlocks[0].innerBlocks[0]) to bridge between the Yjs tree and the block-editor store tree. Because both trees share identical structure for post content blocks (same order, same nesting), the same index path can locate the corresponding block in either tree regardless of whether the clientId values match.

To add a bit of complexity, in "Show Template" mode, the block-editor store's getBlocks() returns the full template tree (header, footer, group wrappers, core/post-content, footer template parts, etc.), while the Yjs document only contains the post content blocks. To keep paths aligned so that we can translate between the two hierarchies, the sending side stops its upward walk at the core/post-content boundary, and the receiving side finds the core/post-content block in the template tree and navigates from its inner blocks if present. This ensures paths are always relative to the post content root in both directions.

How?

Block identity is now derived from the cursor position on the receiver side. For SelectionWholeBlock (e.g. a selected image block with no text cursor), there's not a Y.Text, so blockId: string has been replaced with blockPosition: Y.RelativePosition pointing to the block in its parent Y.Array.

Two new shared types were added: AbsoluteBlockIndexPath (a number[] alias representing a tree index path from the post content root to a block) and EditorStoreBlock (a minimal interface for blocks returned by getBlocks()). EditorStoreBlock is largely to avoid an any[] for blocks, but I'm not sure if it should be here.

Testing Instructions

  1. Go to WordPress Admin -> Settings -> Writing, and check the "Enable real-time collaboration" checkbox. Click the "Save Changes" button.
  2. Open two browser tabs editing the same post.
  3. In tab A, click into a paragraph block and verify the cursor appears correctly in tab B.
  4. Add multiple blocks and verify the remote cursor follows in tab B.
  5. Test with nested blocks (e.g. add a Columns block, type in an inner paragraph) and verify the cursor renders correctly in nested blocks.
  6. Select a non-text block (e.g. an Image block) in tab A, and verify the block highlight appears in tab B.
  7. Delete a block that tab B's cursor is in and verify the cursor disappears gracefully (no errors).
  8. Enable "Show Template" mode in one tab (via the editor settings panel). Verify that cursors and block highlights still render correctly in both directions, from the template-mode user to the normal-mode user and vice versa.
  9. Enable "Show Template" in both tabs and ensure cursors still sync.

…en sharing and drawing awareness information
@alecgeatches alecgeatches self-assigned this Feb 16, 2026
@github-actions github-actions bot added [Package] Core data /packages/core-data [Package] Editor /packages/editor labels Feb 16, 2026
@alecgeatches alecgeatches added the [Feature] Real-time Collaboration Phase 3 of the Gutenberg roadmap around real-time collaboration label Feb 18, 2026
@alecgeatches alecgeatches changed the title Real-time collaboration: Remove block client IDs from Awareness implementation, use relative positioning Real-time collaboration: Remove block client IDs from Awareness, fix "Show Template" view Feb 18, 2026
@alecgeatches alecgeatches marked this pull request as ready for review February 18, 2026 19:57
@alecgeatches alecgeatches requested a review from nerrad as a code owner February 18, 2026 19:57
@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 18, 2026

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 <[email protected]>
Co-authored-by: chriszarate <[email protected]>

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

@alecgeatches alecgeatches added the [Type] Bug An existing feature does not function as intended label Feb 18, 2026
@alecgeatches
Copy link
Copy Markdown
Contributor Author

Note for testing: If you're seeing collaborators show up like this:

users-on-top

there's an open PR to address this particular issue in #75700. To apply it, run this locally:

git cherry-pick a1e584016c73874686e73a07d59491a0e8e0c1ab

return (
selection1.blockId ===
( selection2 as SelectionWholeBlock ).blockId
JSON.stringify( selection1.blockPosition ) ===
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I don't love JSON.stringify in the critical path. I know these objects are small and it existed before, but maybe we could write a fast comparison function since we know the type (or should)

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.

Cool, looks like Yjs has a Y.compareRelativePositions export, added in 2098a20.

Copy link
Copy Markdown
Contributor Author

@alecgeatches alecgeatches Feb 23, 2026

Choose a reason for hiding this comment

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

Whoops, also added in 1b4ad08 to address this bit of code. We're no longer JSON.stringifying anything in this file.

Comment on lines +66 to +68
grandparent.get( 'clientId' ) !== undefined
) {
current = grandparent; // It's a block, keep going.
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.

Is there a better signal that this is a block?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

We're iterating over the raw Y.Doc necessarily here to find the block index, so it's somewhat difficult to find "blocks" other than datatype checks. Here, we're looking for a Y.Map that has a set clientId parameter as the basis of a block check, which should be fairly exclusive in our tree. Is there something better you can think of?

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.

Probably ok for now. Maybe block should have it's own Yjs abstract type extending Y.Map. A future improvement

* @param yType - The Yjs block Y.Map to start from.
* @return The index path from root, or null if traversal fails.
*/
export function getBlockPathInYdoc(
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.

it would be good to have unit tests of functions in this new file

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.

This is tested indirectly by test/post-editor-awareness.ts, but it should definitely have some unit tests itself. Will add.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added in 152e50a! The getPath/resolveClientId functions now have explicit tests, and I un-exported the inner functions related to "Show Template" mode but added specific tests for those cases too.

@chriszarate chriszarate added the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Feb 23, 2026
@alecgeatches alecgeatches enabled auto-merge (squash) February 23, 2026 22:50
@alecgeatches alecgeatches merged commit d5add1a into WordPress:trunk Feb 23, 2026
92 of 114 checks passed
@alecgeatches alecgeatches deleted the add/rtc-relative-block-positioning branch February 23, 2026 23:10
@github-actions github-actions bot added this to the Gutenberg 22.7 milestone Feb 23, 2026
@t-hamano
Copy link
Copy Markdown
Contributor

Just to sure, is this PR a bug fix intended for backporting to 7.0? If so, let's add the Backport to WP 7.0 Beta/RC label.

@ockham ockham modified the milestones: Gutenberg 22.7, Gutenberg 22.6 Feb 24, 2026
@ockham
Copy link
Copy Markdown
Contributor

ockham commented Feb 24, 2026

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

ockham pushed a commit that referenced this pull request Feb 24, 2026
…"Show Template" view (#75590)

* Use relative position .parent traversal instead of block client ID when sharing and drawing awareness information

* Fix "Show Template" mode by mapping remote positions into absolute block paths

* Add tests for block resolution for post-editor-awareness

* Remove inner blockPathResolver, use getBlockPathForLocalClientId utility funciton

* Make utility function naming a bit easier to follow - change "getAbsolutePositionIndex()" to "convertSelectionStateToAbsolute()", have it return "localClientId" instead of "blockClientId"

* Move block lookup functions into block-lookup utils file, improve types

* Remove EditorStoreBlock from exported types

* Compare relative positions with Yjs built-in function

* Replace areSelectionsStatesEqual() relative position comparison with compareRelativePositions() as well

* Fix types and tests from crdt-user-selections

* Add a guard to avoid getting blocks when path is empty

* Rename "useConvertSelectionStateToAbsolute" to "useResolvedSelection"

* Add unit tests for getBlockPathInYdoc, resolveBlockClientIdByPath, avoid exporting inner helper functions
@ockham ockham removed the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Feb 24, 2026
@chriszarate chriszarate added the Backport to WP 7.0 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Feb 24, 2026
@github-actions
Copy link
Copy Markdown

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

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

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

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

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

# 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.0 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.

@chriszarate
Copy link
Copy Markdown
Contributor

Sorry for noise, didn't realize a bot actioned the label.

@t-hamano t-hamano removed the Backport to WP 7.0 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Feb 24, 2026
@t-hamano
Copy link
Copy Markdown
Contributor

As this comment indicates, the automatic cherry-pick is failing, so we will need to submit a change equivalent to this PR to the wp/7.0 branch.

alecgeatches added a commit to Automattic/gutenberg that referenced this pull request Feb 25, 2026
…"Show Template" view (WordPress#75590)

* Use relative position .parent traversal instead of block client ID when sharing and drawing awareness information

* Fix "Show Template" mode by mapping remote positions into absolute block paths

* Add tests for block resolution for post-editor-awareness

* Remove inner blockPathResolver, use getBlockPathForLocalClientId utility funciton

* Make utility function naming a bit easier to follow - change "getAbsolutePositionIndex()" to "convertSelectionStateToAbsolute()", have it return "localClientId" instead of "blockClientId"

* Move block lookup functions into block-lookup utils file, improve types

* Remove EditorStoreBlock from exported types

* Compare relative positions with Yjs built-in function

* Replace areSelectionsStatesEqual() relative position comparison with compareRelativePositions() as well

* Fix types and tests from crdt-user-selections

* Add a guard to avoid getting blocks when path is empty

* Rename "useConvertSelectionStateToAbsolute" to "useResolvedSelection"

* Add unit tests for getBlockPathInYdoc, resolveBlockClientIdByPath, avoid exporting inner helper functions
@ellatrix
Copy link
Copy Markdown
Member

ellatrix commented Mar 3, 2026

@t-hamano Did you remove the label by accident? Even if it needs to be back ported manually, the label should stay present so it's tracked. I'm wondering if there's other PRs where the label was removed

alecgeatches added a commit that referenced this pull request Mar 3, 2026
…"Show Template" view (#75590)

* Use relative position .parent traversal instead of block client ID when sharing and drawing awareness information

* Fix "Show Template" mode by mapping remote positions into absolute block paths

* Add tests for block resolution for post-editor-awareness

* Remove inner blockPathResolver, use getBlockPathForLocalClientId utility funciton

* Make utility function naming a bit easier to follow - change "getAbsolutePositionIndex()" to "convertSelectionStateToAbsolute()", have it return "localClientId" instead of "blockClientId"

* Move block lookup functions into block-lookup utils file, improve types

* Remove EditorStoreBlock from exported types

* Compare relative positions with Yjs built-in function

* Replace areSelectionsStatesEqual() relative position comparison with compareRelativePositions() as well

* Fix types and tests from crdt-user-selections

* Add a guard to avoid getting blocks when path is empty

* Rename "useConvertSelectionStateToAbsolute" to "useResolvedSelection"

* Add unit tests for getBlockPathInYdoc, resolveBlockClientIdByPath, avoid exporting inner helper functions
@alecgeatches
Copy link
Copy Markdown
Contributor Author

Opened up a manual PR to backport in #76090.

@chriszarate chriszarate added the Backport to WP 7.0 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Mar 3, 2026
@github-actions github-actions bot removed the Backport to WP 7.0 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Mar 3, 2026
gutenbergplugin pushed a commit that referenced this pull request Mar 3, 2026
…"Show Template" view (#75590)

* Use relative position .parent traversal instead of block client ID when sharing and drawing awareness information

* Fix "Show Template" mode by mapping remote positions into absolute block paths

* Add tests for block resolution for post-editor-awareness

* Remove inner blockPathResolver, use getBlockPathForLocalClientId utility funciton

* Make utility function naming a bit easier to follow - change "getAbsolutePositionIndex()" to "convertSelectionStateToAbsolute()", have it return "localClientId" instead of "blockClientId"

* Move block lookup functions into block-lookup utils file, improve types

* Remove EditorStoreBlock from exported types

* Compare relative positions with Yjs built-in function

* Replace areSelectionsStatesEqual() relative position comparison with compareRelativePositions() as well

* Fix types and tests from crdt-user-selections

* Add a guard to avoid getting blocks when path is empty

* Rename "useConvertSelectionStateToAbsolute" to "useResolvedSelection"

* Add unit tests for getBlockPathInYdoc, resolveBlockClientIdByPath, avoid exporting inner helper functions
@github-actions github-actions bot added the Backported to WP Core Pull request that has been successfully merged into WP Core label Mar 3, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 3, 2026

I just cherry-picked this PR to the wp/7.0 branch to get it included in the next release: 3ae6336

pento pushed a commit to WordPress/wordpress-develop that referenced this pull request Mar 5, 2026
CI run: #11167.

See #64595.

---

I've included a log of the Gutenberg changes with the following command:

git log --reverse --format="- %s" 022d8dd3d461f91b15c1f0410649d3ebb027207f..e499abfb843a43ac88455ca319220c5f181e1cf3 | sed 's|#\([0-9][0-9]*\)|https://github.com/WordPress/gutenberg/pull/\1|g; /github\.com\/WordPress\/gutenberg\/pull/!d' | pbcopy

- Add documentation for contentRole and listView block supports (WordPress/gutenberg#75903)
- Interactivity Router: fix back and forward navigation after refresh (WordPress/gutenberg#75927)
- Real-time collaboration: Fix disconnect dialog on navigate (WordPress/gutenberg#75886)
- Real Time Collab: Throttle syncing for inactive tabs. (WordPress/gutenberg#75843)
- Components: Specify line-height to avoid inheriting default values (WordPress/gutenberg#75880)
- Pattern Editing: Fix sibling blocks to edited pattern not being disabled (WordPress/gutenberg#75994)
- Sync connector PHP behavior with Core backport changes (WordPress/gutenberg#75968)
- Connectors: Avoid manual string concatenation (WordPress/gutenberg#75997)
- DataForm: fix field label for panel (should not be uppercase) (WordPress/gutenberg#75944)
- Views: add support for more overrides (all developer-defined config) (WordPress/gutenberg#75971)
- Use homeUrl instead of siteUrl for link badge evaluations (WordPress/gutenberg#75978)
- DataViews: Right-align `integer` and `number` fields (WordPress/gutenberg#75917)
- Navigation Link: Compare internal links by host instead of origin (WordPress/gutenberg#76015)
- Fix: Skip scaled image sideload for images below big image threshold (WordPress/gutenberg#75990)
- Client side media cherry pick for 7.0 (WordPress/gutenberg#75998)
- Show transform dropdown previews on focus as well as hover (WordPress/gutenberg#75940) (WordPress/gutenberg#75992)
- RTC: Fix syncing of emoji / surrogate pairs (WordPress/gutenberg#76049)
- [Real-time Collaboration] Fix sync issue on refresh (WordPress/gutenberg#76017)
- Real-time collaboration: Improve disconnect dialog (WordPress/gutenberg#75970)
- DataViews: Fix filter toggle flickering when there are locked or primary filters (WordPress/gutenberg#75913) (WordPress/gutenberg#76068)
- Connectors: Dynamically register providers from WP AI Client registry (WordPress/gutenberg#76014)
- PHP-only Blocks: Reflect bound attribute values in inspector controls (WordPress/gutenberg#76040)
- Fix: Set quality and strip metadata in client-side image resize (WordPress/gutenberg#76029)
- RTC: Prevent duplicate poll cycles (WordPress/gutenberg#76059)
- RTC: Fix stale CRDT document persisted on save (WordPress/gutenberg#75975)
- RTC: Disable multiple collaborators if meta boxes are present (WordPress/gutenberg#75939)
- Directly inject styles in overlay to make styles stay consistently mounted (WordPress/gutenberg#75700)
- Real-time collaboration: Fix comment syncing on site editor (WordPress/gutenberg#75746)
- Real-time Collaboration: Bug fix for CRDT user selection and add tests (WordPress/gutenberg#75075)
- RTC: Updates from backport PR (WordPress/gutenberg#75711)
- RTC: Fix undefined array_first() call in sync storage (WordPress/gutenberg#75869)
- RTC: Fix fallthrough for sync update switch statement (WordPress/gutenberg#76060)
- Real-time collaboration: Remove block client IDs from Awareness, fix "Show Template" view (WordPress/gutenberg#75590)
- RTC: Add session activity notifications (WordPress/gutenberg#76065)
- Prevent non-reproducible Sass/CSS builds. (WordPress/gutenberg#76098)
- Block toolbar and context menu: hide pattern actions in Revisions UI (WordPress/gutenberg#76066)
- Try enabling style variation transforms for blocks in contentOnly mode (WordPress/gutenberg#75761)
- Block toolbar: hide styles dropdown in Revisions UI (WordPress/gutenberg#76119)
- Image block: fix lightbox srcset size (WordPress/gutenberg#76092)
- Fix writing flow navigation for annotation style, or any other block with border radius (WordPress/gutenberg#76072)
- Image: Hide 'Set as featured image' for in-editor revisions (WordPress/gutenberg#76123)
- Connectors: Gate unavailable install actions behind install capability (WordPress/gutenberg#75980)
- build: Exclude experimental pages from Core builds (WordPress/gutenberg#76038)
- HTML & Shortcode: Disable viewport visibility support (WordPress/gutenberg#76138)
- RTC: Verify client ID to avoid awareness mutation (WordPress/gutenberg#76056)
- wp-build: Do not remove Core's default script modules registration (WordPress/gutenberg#75705)
- wp-build: Deregister script modules before re-registering (WordPress/gutenberg#75909)
- Remove `! function_exists()` checks from PHP templates (WordPress/gutenberg#76062)
- Connectors: Update page identifier to options-connectors (WordPress/gutenberg#76156)
- Connectors: Align init hook priorities with Core overrides (WordPress/gutenberg#76161)
- Icon Block: Clean up selectors config (WordPress/gutenberg#75786)
- Icons: Fix incorrect icon slug (WordPress/gutenberg#76165)
- RTC: Enable RTC by default (WordPress/gutenberg#75739)
- Rename and visibility modals: gate shortcuts behind canEditBlock to prevent triggering in revisions UI (WordPress/gutenberg#76168)
- Fix: Block style variations not rendering in Site Editor Patterns page (WordPress/gutenberg#76122)
- Client-side media processing: only use media upload provider when not in preview mode (WordPress/gutenberg#76124)
- Notes: Disable for in-editor revisions (WordPress/gutenberg#76180)
- Core Data: Support reading revision data in useEntityProp (fixes footnotes in revisions UI) (WordPress/gutenberg#76106)
- Client-side media processing: Try plumbing invalidation to the block-editor's mediaUpload onSuccess callback (WordPress/gutenberg#76173)
- Connectors: Improve responsive layout on small screens (WordPress/gutenberg#76186)
- Interactivity API: Fix router initialization race condition on Safari/Firefox (WordPress/gutenberg#76053) (WordPress/gutenberg#76191)
- Interactivity: Fix crypto.randomUUID crash in non-secure contexts (WordPress/gutenberg#76151)


git-svn-id: https://develop.svn.wordpress.org/trunk@61843 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request Mar 5, 2026
CI run: WordPress/wordpress-develop#11167.

See #64595.

---

I've included a log of the Gutenberg changes with the following command:

git log --reverse --format="- %s" 022d8dd3d461f91b15c1f0410649d3ebb027207f..e499abfb843a43ac88455ca319220c5f181e1cf3 | sed 's|#\([0-9][0-9]*\)|https://github.com/WordPress/gutenberg/pull/\1|g; /github\.com\/WordPress\/gutenberg\/pull/!d' | pbcopy

- Add documentation for contentRole and listView block supports (WordPress/gutenberg#75903)
- Interactivity Router: fix back and forward navigation after refresh (WordPress/gutenberg#75927)
- Real-time collaboration: Fix disconnect dialog on navigate (WordPress/gutenberg#75886)
- Real Time Collab: Throttle syncing for inactive tabs. (WordPress/gutenberg#75843)
- Components: Specify line-height to avoid inheriting default values (WordPress/gutenberg#75880)
- Pattern Editing: Fix sibling blocks to edited pattern not being disabled (WordPress/gutenberg#75994)
- Sync connector PHP behavior with Core backport changes (WordPress/gutenberg#75968)
- Connectors: Avoid manual string concatenation (WordPress/gutenberg#75997)
- DataForm: fix field label for panel (should not be uppercase) (WordPress/gutenberg#75944)
- Views: add support for more overrides (all developer-defined config) (WordPress/gutenberg#75971)
- Use homeUrl instead of siteUrl for link badge evaluations (WordPress/gutenberg#75978)
- DataViews: Right-align `integer` and `number` fields (WordPress/gutenberg#75917)
- Navigation Link: Compare internal links by host instead of origin (WordPress/gutenberg#76015)
- Fix: Skip scaled image sideload for images below big image threshold (WordPress/gutenberg#75990)
- Client side media cherry pick for 7.0 (WordPress/gutenberg#75998)
- Show transform dropdown previews on focus as well as hover (WordPress/gutenberg#75940) (WordPress/gutenberg#75992)
- RTC: Fix syncing of emoji / surrogate pairs (WordPress/gutenberg#76049)
- [Real-time Collaboration] Fix sync issue on refresh (WordPress/gutenberg#76017)
- Real-time collaboration: Improve disconnect dialog (WordPress/gutenberg#75970)
- DataViews: Fix filter toggle flickering when there are locked or primary filters (WordPress/gutenberg#75913) (WordPress/gutenberg#76068)
- Connectors: Dynamically register providers from WP AI Client registry (WordPress/gutenberg#76014)
- PHP-only Blocks: Reflect bound attribute values in inspector controls (WordPress/gutenberg#76040)
- Fix: Set quality and strip metadata in client-side image resize (WordPress/gutenberg#76029)
- RTC: Prevent duplicate poll cycles (WordPress/gutenberg#76059)
- RTC: Fix stale CRDT document persisted on save (WordPress/gutenberg#75975)
- RTC: Disable multiple collaborators if meta boxes are present (WordPress/gutenberg#75939)
- Directly inject styles in overlay to make styles stay consistently mounted (WordPress/gutenberg#75700)
- Real-time collaboration: Fix comment syncing on site editor (WordPress/gutenberg#75746)
- Real-time Collaboration: Bug fix for CRDT user selection and add tests (WordPress/gutenberg#75075)
- RTC: Updates from backport PR (WordPress/gutenberg#75711)
- RTC: Fix undefined array_first() call in sync storage (WordPress/gutenberg#75869)
- RTC: Fix fallthrough for sync update switch statement (WordPress/gutenberg#76060)
- Real-time collaboration: Remove block client IDs from Awareness, fix "Show Template" view (WordPress/gutenberg#75590)
- RTC: Add session activity notifications (WordPress/gutenberg#76065)
- Prevent non-reproducible Sass/CSS builds. (WordPress/gutenberg#76098)
- Block toolbar and context menu: hide pattern actions in Revisions UI (WordPress/gutenberg#76066)
- Try enabling style variation transforms for blocks in contentOnly mode (WordPress/gutenberg#75761)
- Block toolbar: hide styles dropdown in Revisions UI (WordPress/gutenberg#76119)
- Image block: fix lightbox srcset size (WordPress/gutenberg#76092)
- Fix writing flow navigation for annotation style, or any other block with border radius (WordPress/gutenberg#76072)
- Image: Hide 'Set as featured image' for in-editor revisions (WordPress/gutenberg#76123)
- Connectors: Gate unavailable install actions behind install capability (WordPress/gutenberg#75980)
- build: Exclude experimental pages from Core builds (WordPress/gutenberg#76038)
- HTML & Shortcode: Disable viewport visibility support (WordPress/gutenberg#76138)
- RTC: Verify client ID to avoid awareness mutation (WordPress/gutenberg#76056)
- wp-build: Do not remove Core's default script modules registration (WordPress/gutenberg#75705)
- wp-build: Deregister script modules before re-registering (WordPress/gutenberg#75909)
- Remove `! function_exists()` checks from PHP templates (WordPress/gutenberg#76062)
- Connectors: Update page identifier to options-connectors (WordPress/gutenberg#76156)
- Connectors: Align init hook priorities with Core overrides (WordPress/gutenberg#76161)
- Icon Block: Clean up selectors config (WordPress/gutenberg#75786)
- Icons: Fix incorrect icon slug (WordPress/gutenberg#76165)
- RTC: Enable RTC by default (WordPress/gutenberg#75739)
- Rename and visibility modals: gate shortcuts behind canEditBlock to prevent triggering in revisions UI (WordPress/gutenberg#76168)
- Fix: Block style variations not rendering in Site Editor Patterns page (WordPress/gutenberg#76122)
- Client-side media processing: only use media upload provider when not in preview mode (WordPress/gutenberg#76124)
- Notes: Disable for in-editor revisions (WordPress/gutenberg#76180)
- Core Data: Support reading revision data in useEntityProp (fixes footnotes in revisions UI) (WordPress/gutenberg#76106)
- Client-side media processing: Try plumbing invalidation to the block-editor's mediaUpload onSuccess callback (WordPress/gutenberg#76173)
- Connectors: Improve responsive layout on small screens (WordPress/gutenberg#76186)
- Interactivity API: Fix router initialization race condition on Safari/Firefox (WordPress/gutenberg#76053) (WordPress/gutenberg#76191)
- Interactivity: Fix crypto.randomUUID crash in non-secure contexts (WordPress/gutenberg#76151)

Built from https://develop.svn.wordpress.org/trunk@61843


git-svn-id: http://core.svn.wordpress.org/trunk@61130 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] Real-time Collaboration Phase 3 of the Gutenberg roadmap around real-time collaboration [Package] Core data /packages/core-data [Package] Editor /packages/editor [Type] Bug An existing feature does not function as intended

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants