Skip to content

Notes: align floating threads with their inline marker - #79877

Merged
Mamaduka merged 12 commits into
trunkfrom
fix/79875-inline-note-floating-alignment
Jul 22, 2026
Merged

Mamaduka merged 12 commits into
trunkfrom
fix/79875-inline-note-floating-alignment

Conversation

@adamsilverstein

@adamsilverstein adamsilverstein commented Jul 5, 2026 •

Copy link
Copy Markdown
Member

What?

Fixes #79875

Vertically aligns floating note threads with their inline (partial-text) anchor instead of the top of the block. Block-level notes keep the current block alignment.

Why?

Since #78218 users can add notes to a text selection ("inline notes"). The floating board positioned every thread at the top of its block, so a note on text in the middle of a long paragraph rendered far away from the text it annotates.

How?

The floating board reads anchor rects in board-store.getBlockRects(). For each registered thread it now prefers the in-content core/note marker (mark.wp-note[data-id="<note id>"]) inside the block element and falls back to the block rect when there is no marker (block-level notes, deleted markers). The marker is resolved at read time because rich-text re-renders replace the marker element, so caching the element would go stale.

The marker selector construction (including defensive escaping) was previously inlined in note-highlight-styles.js; it is extracted to a shared getNoteMarkerSelector() helper in utils.js so the highlight styles and the floating board target markers consistently.

The pending "New note" form (shown while composing) has no marker yet, so it anchors to the canvas text selection it will attach to (the canvas iframe keeps its selection while focus is in the form), with the same block-rect fallback when the selection is collapsed, outside the block, or absent.

Downstream positioning (calculateNotePositions) is unchanged - it already works on arbitrary rects and keeps handling overlap resolution between threads.

Testing Instructions

Test: https://playground.wordpress.net/gutenberg.html?pr=79877

  1. Create a post with a long paragraph.
  2. Select some text in the middle of the paragraph and add a note. The "New note" form should already align with the selection while composing.
  3. In floating mode, the saved note thread should vertically align with the highlighted text rather than the top of the block.
  4. Add a block-level note (no text selection) - it should still align with the top of the block.
  5. Add notes on different lines of the same paragraph (or as different users) - each thread should align with its own highlight, with overlaps pushed apart as before.

Unit tests:

npm run test:unit -- packages/editor/src/components/collab-sidebar/test/

E2E tests (covers the rendered alignment of the floating thread and of the pending new-note form):

npm run test:e2e -- test/e2e/specs/editor/various/block-notes.spec.js --grep "Floating alignment"

Verified in a local wp-env build by measuring positions: with a note on text in the middle of a long paragraph, the floating thread's computed top equals the marker's top minus the 16px align offset (previously it was the block's top, ~230px higher in the test post), and a block-level note on a second paragraph still computes top as the block's top minus the offset.

Screenshots or screencast

Add note aligns with selection
image

Notes align with sections
image

Notes aligned with selections

aligned.by.selection.mp4

AI Usage

I used Claude code to write the code in this PR. I have reviewed the code and tested the feature manually, capturing the screenshots/screencasts above..

Floating note threads were always anchored to the top of their block, so
a note on a text selection in the middle of a long paragraph rendered far
from the noted text. Read the position of the in-content core/note marker
(mark.wp-note[data-id]) when one exists and fall back to the block rect
for block-level notes, so inline notes vertically align with their anchor.

The marker selector is extracted to a shared helper so the highlight
styles and the floating board target the marker consistently.

Fixes #79875
@adamsilverstein adamsilverstein added [Type] Bug An existing feature does not function as intended [Feature] Notes Phase 3 of the Gutenberg roadmap around block commenting labels Jul 5, 2026
@github-actions github-actions Bot added the [Package] Editor /packages/editor label Jul 5, 2026
@github-actions

github-actions Bot commented Jul 5, 2026 •

Copy link
Copy Markdown

Size Change: +289 B (0%)

Total Size: 7.75 MB

📦 View Changed
Filename Size Change
build/scripts/editor/index.min.js 501 kB +289 B (+0.06%)

compressed-size-action

The New note form shown while composing an inline note has no in-content
marker yet, so it fell back to block alignment. Anchor it to the canvas
text selection it will attach to (the canvas iframe keeps its selection
while focus is in the form), falling back to the block rect when the
selection is collapsed, outside the block, or absent.
@github-actions

github-actions Bot commented Jul 5, 2026 •

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>

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

@github-actions

github-actions Bot commented Jul 5, 2026 •

Copy link
Copy Markdown

Flaky tests detected in 715b0d2.
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/29906516654
📝 Reported issues:

Overlapping notes split a marker into several runs sharing the same
data-id; document that the thread anchors to the first run in document
order, per the behavior comment in getBlockRects().
Assert the full positioning pipeline in a real browser: a saved inline
note's floating thread renders at its marker's line, and the pending
new-note form renders at the text selection it will attach to, rather
than at the block top (#79875).

The tests use a taller viewport so the floating thread fits fully on
screen: when a thread extends below the fold, the browser's
focus-scroll scrolls the floating panel (overflow: hidden still allows
programmatic scrolling) and shifts every thread off its anchor. That
shear predates this branch and needs its own fix; the alignment
contract only holds while the panel is unscrolled.
@adamsilverstein
adamsilverstein requested a review from scruffian July 6, 2026 03:24
@adamsilverstein

Copy link
Copy Markdown
Member Author

@Mamaduka this could use a review as well if you have a chance

@adamsilverstein adamsilverstein added the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Jul 15, 2026
@adamsilverstein adamsilverstein added Backport to WP 7.2 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta and removed Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) labels Jul 17, 2026
@t-hamano t-hamano added the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label Jul 17, 2026
Trunk renamed the pending note form's class from
editor-collab-sidebar-panel__thread to
editor-collab-sidebar-panel__add-note, so the alignment test's locator
no longer matched anything.
adamsilverstein and others added 4 commits July 20, 2026 09:31
Follow-up to the marker anchoring in this branch, from code review.

Anchoring threads to markers made two latent assumptions false:

- The overlap sweep in calculateNotePositions walks outward from the
  anchor assuming tops increase with index. That held while every thread
  in a block shared the block's top, but a pending "new" note anchors to
  the live selection and is spliced in after the block's existing
  threads, so it can sit above a marker that precedes it. Sort by
  measured top so cards are never displaced past their own markers.

- Anchors are read from the DOM, so a position goes stale whenever
  content moves under it. Observe block elements to re-trigger the
  recompute; their sizes are never recorded.

Also measure the pending note's selection with getRectangleFromRange
rather than Range.getBoundingClientRect, so a selection starting at the
end of a line aligns to the line holding the text, and treat a rect with
no area as "no selection" instead of pinning the form to the canvas top.

Document why the marker selector escapes for quoted-string context
instead of using CSS.escape, which is for identifiers and renders the id
7 as `\37 `, and lock the selector to noteFormat with a test.
Board store observed every noted block to re-trigger recompute, needing a
refcounted Set and sync on register/unregister. Replaced with a single
ResizeObserver on `.is-root-container` in `useFloatingBoard`, sharing the
rAF it already schedules. Also catches block insert/remove, and only runs
while floating.

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

Pushed some cleanup changes, but otherwise this looks good to me ✅

Positioning also tests well ✅

@t-hamano

Copy link
Copy Markdown
Contributor

I'm about to start preparing for the release of Gutenberg 23.6 and WP 7.1 Beta3, and I intend to include this PR in both.

@Mamaduka

Copy link
Copy Markdown
Member

Thanks, @t-hamano!

Waiting for CI checks to be green to merge.

@Mamaduka

Copy link
Copy Markdown
Member

Just realized new tests won't pass after #80531, so needed a rebase. There's also a flaky test, which I plan to fix separately. Currently resolved by using a different action.

@Mamaduka
Mamaduka merged commit 389f4d8 into trunk Jul 22, 2026
44 of 47 checks passed
@Mamaduka
Mamaduka deleted the fix/79875-inline-note-floating-alignment branch July 22, 2026 09:51
@github-project-automation github-project-automation Bot moved this from 🔎 Needs Review to ✅ Done in WordPress 7.1 Editor Tasks Jul 22, 2026
let rafId;
const schedule = () => {
window.cancelAnimationFrame( rafId );
rafId = window.requestAnimationFrame( () => {

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.

It's not really that related to this PR, but do we really need the extra rAF here? The ResizeObserver callback runs after layout, but before paint. Layout must be done in order to determine the resized dimensions, and the observer callback has a chance to modify the DOM before a "wrong" version is painted. The scheduling is very similar to useLayoutEffect.

That's exactly what we want here, right? Update the note positions, do a re-render, and only then paint the result.

requestAnimationFrame postpones the setNotePositions update to the next frame. rAF runs before layout, and in the ResizeObserver callback it's too late to squeeze it into the current frame. So it's postponed to the next frame.

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.

Recalc is deferred to a rAF; back-to-back updates collapse into one paint.

This was the original reason for adding rAF. Haven't re-assessed after this change.

I have a small refactoring follow-up in mind and can do it there.

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.

It seems to me, however, that the rAF will have exactly the opposite effect. The back-to-back updates collapse into one paint only if they run directly in the ResizeObserver callback. The callback scheduling has been designed to run before paint. rAF will always lead to two paints, one without updated notePositions, another with updated.

There is a risk that that the setNotePositions will lead to an infinite loop. Update positions, cause a resize, another update of positions, another resize, ... ResizeObserver has a built-in counter to detect this and break the loop. Postponing to rAF will probably cause the same loop, but more spread in time and undetected.

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.

Interesting, and thanks for pointing this out. I'll have a look.

P.S. Before this PR, the schedule didn't run in the ResizeObserver callback.

https://github.com/WordPress/gutenberg/blob/36d0797c0e0ed7a0a41e78a2656b07b02d92e9a9/packages/editor/src/components/collab-sidebar/hooks.js

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I see, that original code comes from #77424 and uses an even more complicated pattern:

  • store that creates an ResizeObserver and fires updates on resizes
  • useSyncExternalStore that uses the store updates to rerender a React component
  • useEffect+rAF + setState that runs on every store update

IMO the last step (useEffect + rAF + setState) is superfluous. The component should react directly to the ResizeObserver updates:

const heights = useSyncExternalStore();
const { offsets, minHeight } = calculateAllOffsets( heights ); // maybe wrap with useMemo

After layout, ResizeObserver fires, that causes a rerender of the component that calls useSyncExternalStore, that component rerenders immediately, even before paint, with updated sizes.

The only thing that's worrying is that we would call store.getBlockRects() inside a render function. A better place for this would be inside the store, inside the ResizeObserver callback. That's a natural place where to safely read DOM dimensions from DOM nodes. The store snapshot can be not only heights, but also the rects.

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.

It took me a while, but here's the follow-up - #83485.

@github-actions github-actions Bot added this to the Gutenberg 23.7 milestone Jul 22, 2026
@github-actions github-actions Bot removed the Backport to WP 7.2 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 22, 2026
gutenbergplugin pushed a commit that referenced this pull request Jul 22, 2026
Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
@github-actions github-actions Bot added the Backported to WP Core Pull request that has been successfully merged into WP Core label Jul 22, 2026
@github-actions

Copy link
Copy Markdown

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

t-hamano added a commit that referenced this pull request Jul 22, 2026
Co-authored-by: adamsilverstein <adamsilverstein@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
@t-hamano

Copy link
Copy Markdown
Contributor

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

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

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

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

Props wildworks.
See #65529.

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

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

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

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


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

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

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

Fixes #66065.

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

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

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

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


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

Labels

Backported to WP Core Pull request that has been successfully merged into WP Core [Feature] Notes Phase 3 of the Gutenberg roadmap around block commenting [Package] Editor /packages/editor [Type] Bug An existing feature does not function as intended

Projects

No open projects

Development

Successfully merging this pull request may close these issues.

Inline comments should align with anchor in floating mode

4 participants