Skip to content

Media Editor: refactor the panel layout - #81840

Merged
ramonjd merged 28 commits into
trunkfrom
try/media-editor-panel-layout
Aug 27, 2026
Merged

ramonjd merged 28 commits into
trunkfrom
try/media-editor-panel-layout

Conversation

@ramonjd

@ramonjd ramonjd commented Aug 19, 2026 •

Copy link
Copy Markdown
Member

What?

Closes #81487, addresses #81121.

Kapture.2026-08-27.at.13.45.29.mp4

Rebuilds the media editor modal's layout so the Details panel is reachable at every viewport, and the sidebar is a little wider.

Specifically:

  • ComplementaryArea and InterfaceSkeleton replaced with a layout the media editor owns.
  • Moved rotate/flip/zoom out of the modal footer. They live in the Crop panel where it docks, and fall back to a row below the canvas under small, where the panel is full screen.
  • Settings panel 280px → --wpds-dimension-surface-width-sm (320px), docked above 600px, full-body below.
  • MediaEditor.ImageControls removed; dead footer z-index removed with its base-styles token.

Why?

#81487 is not a styling bug. ComplementaryArea force-closes itself below small and offers no way back, so the Details fields could not be edited on a phone at all.

Both ComplementaryArea and InterfaceSkeleton are built for the post and site editors, and the media editor didn't use many of their features: no pinning, no distraction-free mode, no secondary sidebar.

How?

The media editor gets its own layout instead of borrowing the post and site editors'.

Testing instructions

Insert an Image block, select it, and open the media editor from the toolbar.

Mobile (390px) — this is #81487

  1. Confirm Details is reachable from the header toggle.
  2. Confirm the panel fills the modal and the canvas is not visible behind it.
  3. Confirm Reset, undo and redo are absent while a panel is open, and return when it closes.
  4. Confirm rotate, flip and zoom sit under the canvas while the panel is closed.

Desktop (1400px)

  1. Confirm the panel is docked open at 320px on the Crop tab.
  2. Confirm the canvas is not squashed, and that the ruler band under it shares the stage grey as one panel with four rounded corners.
  3. Close the panel, resize narrow, resize wide. It should stay closed.
  4. Cancel, reopen. It should be open again.

Around the breakpoint (600px)

  1. Without touching the toggle, resize across 600px. The panel should dock above and fill the body below, and never overflow the modal's right edge.
  2. At tablet widths (700–950px) confirm the canvas stays visible beside an open Crop panel, so cropping and previewing happen together.

Sidebar gutters and scrollbar

  1. With the panel open, confirm the tabs and the fields line up with the canvas edge — 24px in on both sides.
  2. Confirm the rule under the tabs stops at that gutter rather than running to the sidebar edge.
  3. Shrink the window until the fields overflow, and confirm the scrollbar sits against the sidebar edge rather than inset from it.

Non-image media (a PDF or audio file)

  1. Confirm only the Details tab shows — there is no Crop tab, and the panel opens on Details at every width.
  2. Confirm the preview area stays rounded on all four corners: there is no ruler band beneath it to close them.

Full-screen route

(gutenberg-media-editor experiment, admin.php?page=media-editor-wp-admin&p=/media-editor/<id>)

  1. Confirm the same panel behaviour, and that the narrow-width history bar disappears in Details mode rather than leaving an empty gap.

@ramonjd
ramonjd force-pushed the try/media-editor-panel-layout branch from 1a3ea83 to 234f8bb Compare August 20, 2026 01:48
@github-actions

github-actions Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

Size Change: -415 B (-0.01%)

Total Size: 7.92 MB

📦 View Changed
Filename Size Change
build/scripts/editor/index.min.js 580 kB +145 B (+0.02%)
build/styles/editor/style-rtl.css 31.8 kB -167 B (-0.52%)
build/styles/editor/style-rtl.min.css 27.2 kB -109 B (-0.4%)
build/styles/editor/style.css 31.8 kB -172 B (-0.54%)
build/styles/editor/style.min.css 27.2 kB -112 B (-0.41%)

compressed-size-action

@ramonjd
ramonjd force-pushed the try/media-editor-panel-layout branch from 84f8168 to a0ab13d Compare August 21, 2026 04:18
@github-actions github-actions Bot added the [Package] Base styles /packages/base-styles label Aug 21, 2026
@ramonjd ramonjd added [Type] Enhancement A suggestion for improvement. [Feature] Media Anything that impacts the experience of managing media Needs Design Feedback Needs general design feedback. labels Aug 21, 2026
@github-actions

github-actions Bot commented Aug 21, 2026 •

Copy link
Copy Markdown

Flaky tests detected in 33f219d.
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/33042886024
📝 Reported tests:

refuses the drop and uploads nothing in /test/e2e/specs/editor/various/single-file-placeholder-drop.spec.js, passed after 1 failed attempt.
Error: expect(received).toHaveLength(expected)

Expected length: 0
Received length: 2
Received array:  [{"_links": {"about": [{"href": "http://localhost:8889/wp-json/wp/v2/types/attachment"}], "author": [{"embeddable": true, "href": "http://localhost:8889/wp-json/wp/v2/users/1"}], "collection": [{"href": "http://localhost:8889/wp-json/wp/v2/media"}], "curies": [{"href": "https://api.w.org/{rel}", "name": "wp", "templated": true}], "replies": [{"embeddable": true, "href": "http://localhost:8889/wp-json/wp/v2/comments?post=190"}], "self": [{"href": "http://localhost:8889/wp-json/wp/v2/media/190", "targetHints": {"allow": ["GET", "POST", "PUT", "PATCH", "DELETE"]}}], "wp:attached-to": [{"embeddable": true, "href": "http://localhost:8889/wp-json/wp/v2/posts/188", "id": 188, "post_type": "post"}]}, "alt_text": "", "author": 1, "caption": {"rendered": ""}, "class_list": ["post-190", "attachment", "type-attachment", "status-inherit", "hentry", "entry"], "comment_status": "open", "date": "2026-08-27T05:47:42", "date_gmt": "2026-08-27T05:47:42", "description": {"rendered": "<p class=\"attachment\"><a href='http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK-1.png'><img loading=\"lazy\" decoding=\"async\" width=\"10\" height=\"10\" src=\"http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK-1.png\" class=\"attachment-medium size-medium\" alt=\"\" style=\"width:100%;height:100%;max-width:10px;\" /></a></p>
"}, "featured_media": 0, "filename": "10x10_e2e_test_image_z9T8jK-1.png", "filesize": 80, "guid": {"rendered": "http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK-1.png"}, "id": 190, "link": "http://localhost:8889/?attachment_id=190", "media_details": {"file": "2026/08/10x10_e2e_test_image_z9T8jK-1.png", "filesize": 80, "height": 10, "image_meta": {"alt": "", "aperture": "0", "camera": "", "caption": "", "copyright": "", "created_timestamp": "0", "credit": "", "focal_length": "0", "iso": "0", "keywords": [], "orientation": "0", "shutter_speed": "0", "title": ""}, "sizes": {}, "width": 10}, "media_type": "image", "meta": [], "mime_type": "image/png", "modified": "2026-08-27T05:47:42", "modified_gmt": "2026-08-27T05:47:42", "ping_status": "closed", "post": 188, "slug": "10x10_e2e_test_image_z9t8jk-2", "source_url": "http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK-1.png", "status": "inherit", "template": "", "title": {"rendered": "10x10_e2e_test_image_z9T8jK"}, "type": "attachment"}, {"_links": {"about": [{"href": "http://localhost:8889/wp-json/wp/v2/types/attachment"}], "author": [{"embeddable": true, "href": "http://localhost:8889/wp-json/wp/v2/users/1"}], "collection": [{"href": "http://localhost:8889/wp-json/wp/v2/media"}], "curies": [{"href": "https://api.w.org/{rel}", "name": "wp", "templated": true}], "replies": [{"embeddable": true, "href": "http://localhost:8889/wp-json/wp/v2/comments?post=189"}], "self": [{"href": "http://localhost:8889/wp-json/wp/v2/media/189", "targetHints": {"allow": ["GET", "POST", "PUT", "PATCH", "DELETE"]}}], "wp:attached-to": [{"embeddable": true, "href": "http://localhost:8889/wp-json/wp/v2/posts/188", "id": 188, "post_type": "post"}]}, "alt_text": "", "author": 1, "caption": {"rendered": ""}, "class_list": ["post-189", "attachment", "type-attachment", "status-inherit", "hentry", "entry"], "comment_status": "open", "date": "2026-08-27T05:47:41", "date_gmt": "2026-08-27T05:47:41", "description": {"rendered": "<p class=\"attachment\"><a href='http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK.png'><img loading=\"lazy\" decoding=\"async\" width=\"10\" height=\"10\" src=\"http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK.png\" class=\"attachment-medium size-medium\" alt=\"\" style=\"width:100%;height:100%;max-width:10px;\" /></a></p>
"}, "featured_media": 0, "filename": "10x10_e2e_test_image_z9T8jK.png", "filesize": 80, "guid": {"rendered": "http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK.png"}, "id": 189, "link": "http://localhost:8889/?attachment_id=189", "media_details": {"file": "2026/08/10x10_e2e_test_image_z9T8jK.png", "filesize": 80, "height": 10, "image_meta": {"alt": "", "aperture": "0", "camera": "", "caption": "", "copyright": "", "created_timestamp": "0", "credit": "", "focal_length": "0", "iso": "0", "keywords": [], "orientation": "0", "shutter_speed": "0", "title": ""}, "sizes": {}, "width": 10}, "media_type": "image", "meta": [], "mime_type": "image/png", "modified": "2026-08-27T05:47:41", "modified_gmt": "2026-08-27T05:47:41", "ping_status": "closed", "post": 188, "slug": "10x10_e2e_test_image_z9t8jk", "source_url": "http://localhost:8889/wp-content/uploads/2026/08/10x10_e2e_test_image_z9T8jK.png", "status": "inherit", "template": "", "title": {"rendered": "10x10_e2e_test_image_z9T8jK"}, "type": "attachment"}]
    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/various/single-file-placeholder-drop.spec.js:71:45
shows post-locked modal when document size limit is exceeded in /test/e2e/specs/editor/collaboration/http-only/collaboration-document-size-lock.spec.ts, passed after 1 failed attempt.
TimeoutError: locator.waitFor: Timeout 10000ms exceeded.
Call log:
  - waiting for getByRole('button', { name: 'Dismiss this notice' }).filter({ hasText: 'Draft saved' }) to be visible

    at Editor.saveDraft (/home/runner/work/gutenberg/gutenberg/packages/e2e-test-utils-playwright/src/editor/save-draft.ts:16:4)
    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/collaboration/http-only/collaboration-document-size-lock.spec.ts:110:3

@ramonjd

ramonjd commented Aug 21, 2026

Copy link
Copy Markdown
Member Author

Soft ping to @andrewserong to make sure I didn't break the experimental route. 😄

No rush on this. Thanks!

@ramonjd
ramonjd requested review from andrewserong and a balanced review from Copilot August 21, 2026 04:50

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Refactors the media editor layout so Details remains accessible across viewport sizes while image controls stay beneath the canvas.

Changes:

  • Replaces shared editor-shell components with a responsive media-specific layout.
  • Moves crop controls below the canvas and expands the Details panel.
  • Updates dependencies, tests, styles, and public contracts accordingly.

Reviewed changes

Copilot reviewed 18 out of 19 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
routes/media-editor/style.scss Updates toolbar documentation.
routes/media-editor/stage.tsx Hides narrow history toolbar without a canvas.
packages/media-editor/tsconfig.json Adds admin-ui project reference.
packages/media-editor/tsconfig.build.json Adds build reference for admin-ui.
packages/media-editor/src/components/rotation-ruler/style.scss Makes ruler mask surface configurable.
packages/media-editor/src/components/media-form/index.tsx Places alt text first.
packages/media-editor/src/components/media-editor/style.scss Implements the responsive canvas/sidebar layout.
packages/media-editor/src/components/media-editor/index.tsx Rebuilds panel state, controls, and frame contracts.
packages/media-editor/src/components/media-editor-modal/style.scss Simplifies modal footer styling.
packages/media-editor/src/components/media-editor-modal/index.tsx Uses one footer layout.
packages/media-editor/src/components/media-editor-image-controls/test/index.tsx Updates tests for flat controls.
packages/media-editor/src/components/media-editor-image-controls/style.scss Removes obsolete stacked styles.
packages/media-editor/src/components/media-editor-image-controls/index.tsx Removes labelled control mode.
packages/media-editor/src/components/media-editor-crop-panel/test/index.tsx Removes obsolete crop-panel tests.
packages/media-editor/src/components/media-editor-crop-panel/index.tsx Removes the crop panel.
packages/media-editor/package.json Replaces interface dependency with admin-ui.
packages/media-editor/CHANGELOG.md Documents enhancements and breaking changes.
packages/base-styles/_z-index.scss Removes obsolete footer layer.
package-lock.json Updates workspace dependencies.
Suppressed comments (1)

packages/media-editor/src/components/media-editor/index.tsx:419

  • Because layout is now always wide, the full-screen route never takes its narrow branch and always leaves History in the crowded header; the new hasCanvas guard on its narrow toolbar is therefore unreachable. Preserve the existing small-breakpoint signal in this frame contract even though the internal image controls no longer need separate layouts.
	// canvas the full width instead of leaving a panel wedged beside it.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread packages/media-editor/src/components/media-editor/index.tsx Outdated
Comment thread packages/media-editor/src/components/media-editor/index.tsx Outdated
Comment thread packages/media-editor/CHANGELOG.md Outdated
Comment thread packages/media-editor/src/components/media-form/index.tsx Outdated

@andrewserong andrewserong left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The route's looking fine, nothing broken there! 🎉

Image

(Might not get a chance to give this a code review today, but the UX in the route is feeling nice to me 👍, I think the only thing we've lost there is the smooth expand/collapse when opening and closing the sidebar, but not a blocker at all)

Comment thread packages/media-editor/src/components/media-editor/index.tsx
Comment thread packages/media-editor/src/components/media-editor/index.tsx
ramonjd added a commit that referenced this pull request Aug 21, 2026
Hiding it below `small` assumed Shift+Alt+H would still open the modal.
It does not: the media editor registers no shortcut, so the button is
the only way in and hiding it made shortcut help unreachable on a phone.

Reverted. Registering the shortcut is the better fix and belongs in its
own change.

Reported by Copilot on #81840.
@ramonjd ramonjd removed the [Package] Base styles /packages/base-styles label Aug 21, 2026
@ramonjd
ramonjd force-pushed the try/media-editor-panel-layout branch from b9c204c to 1a7bf21 Compare August 24, 2026 03:01
ramonjd added a commit that referenced this pull request Aug 24, 2026
Hiding it below `small` assumed Shift+Alt+H would still open the modal.
It does not: the media editor registers no shortcut, so the button is
the only way in and hiding it made shortcut help unreachable on a phone.

Reverted. Registering the shortcut is the better fix and belongs in its
own change.

Reported by Copilot on #81840.
@github-actions github-actions Bot added the [Package] Base styles /packages/base-styles label Aug 24, 2026
@ramonjd
ramonjd force-pushed the try/media-editor-panel-layout branch from 1a7bf21 to cd6f673 Compare August 24, 2026 06:16
ramonjd added a commit that referenced this pull request Aug 24, 2026
Hiding it below `small` assumed Shift+Alt+H would still open the modal.
It does not: the media editor registers no shortcut, so the button is
the only way in and hiding it made shortcut help unreachable on a phone.

Reverted. Registering the shortcut is the better fix and belongs in its
own change.

Reported by Copilot on #81840.
@ramonjd
ramonjd marked this pull request as ready for review August 24, 2026 07:07
@github-actions

github-actions Bot commented Aug 24, 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: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: fcoveram <fcoveram@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: jordesign <jordesign@git.wordpress.org>

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

@ramonjd ramonjd self-assigned this Aug 24, 2026
@ramonjd
ramonjd requested a review from fcoveram August 24, 2026 07:13
ramonjd and others added 18 commits August 27, 2026 15:33
Putting alt text above title meant changing how `MediaForm` sorts the
caller's fields, which is a DataViews concern rather than a layout one
and not what this PR is about. Reverted to trunk.
Hiding it below `small` assumed Shift+Alt+H would still open the modal.
It does not: the media editor registers no shortcut, so the button is
the only way in and hiding it made shortcut help unreachable on a phone.

Reverted. Registering the shortcut is the better fix and belongs in its
own change.

Reported by Copilot on #81840.
None of the three entries were breaking. `scope` is still accepted and
still compiles; `HistoryActions` rendering nothing under a condition is
not an API change; and `MediaEditor.ImageControls` was added in #81563
and has never shipped, so no released caller can reference it.

The two that describe real API movement move to Enhancements. The
`scope` entry from #81559 goes: it described the same work the
`ComplementaryArea` line above it already covers.
Every other entry in the file cites its pull request; the six added here
did not.
The image controls sit under the canvas at every width, so there is one
layout and `layout` was always `wide`. That made the route's `isNarrow`
permanently false: its history cluster always rendered in the header,
and the under-canvas bar guarded by `isNarrow && isImage && hasCanvas`
never could. `hasCanvas` had no other reader.

Remove both props, the dead bar, its stylesheet rule, and the
base-styles import that rule was the last user of. The modal frame
destructured neither, so the route was the only consumer.

Also drop `MEDIA_EDITOR_SCOPE` from the route. Its comment described
the panel keeping a per-scope open state, which went with
`ComplementaryArea`; nothing reads `scope` now.

Reported by andrewserong on #81840.
256d2fe removed `layout` after finding it always `wide`, but that was
the bug rather than the reason to drop it: an earlier commit had
hard-coded it, which already broke the route's narrow history bar. The
prop itself was doing real work.

Compute it from `useViewportMatch( 'small' )` as trunk does, and restore
the route's bar under the canvas. Below `small` the page header carries
the breadcrumbs, Cancel/Save and the navigation toggle in a row that
does not wrap, so History has nowhere to sit up there.

`hasCanvas` stays removed. Trunk gates the bar on `isNarrow && isImage`
alone, and `HistoryActions` already returns null when a panel covers the
canvas, so a frame checking it repeated that from the outside.

Reported by andrewserong on #81840.
The panel and the canvas share the modal's width at the dock
breakpoint, so 50px off the panel is 50px onto the canvas: the canvas
min-width goes to 490px to claim it, keeping the same margin against
the modal's right edge that the old pair had.

Also correct the comment above the width. It credited #81121 with
reporting fields "wrapping mid-phrase", which the issue does not say;
what it reports is the panel reading as squished at roughly 250px, with
four editable fields stacked above six read-only facts.
Pin the tab strip to the top of the sidebar and give it a rule that
spans the panel. `Tabs.List` sizes itself to its tabs, so a border on it
stopped after the last tab and its padding pushed the labels in from an
already-narrow box; a wrapper carries both instead, so the rule runs the
full width while the tabs line up with the fields below. The pane, not
the sidebar, is now the scroll container, so the strip stays put.

Open on Crop where the panel docks beside the canvas, and on Details
below that, where an open panel replaces the canvas and crop controls
would have nothing to act on. `isImage` resolves after mount, so the
default settles in the effect that already tracks the breakpoint rather
than seeding the initial state.

Stop hiding the Crop panel's transform controls below `small`. That
followed from the sidebar being unreachable there, which this branch
fixes, so the condition took controls out of a panel users can now open.
The flat row under the canvas stays for the panel-closed case; below
`large` an open panel hides the canvas, so the two never coincide.

Fall back to Details when the active tab is not in the list. Saving a
crop moves the editor to a new id, which can resolve as non-image and
leave the panel open on a Crop tab that no longer exists.
Between 600px and 960px the panel took the whole body, so opening Crop
hid the image it acts on: you could not crop and preview at once on a
tablet. The transform controls only fell back to a row under the canvas
below 600px, so that band had neither a docked panel nor the fallback.

The dock line was set when the panel was 400px wide and the canvas asked
for 440px, which together overflowed the modal. At 320px it fits: the
modal is the viewport less a 16px margin either side, so the canvas
keeps ~200px at 600px and ~380px by 782px. Tight at the bottom of that
range, but a preview beside working controls beats no preview at all.

The canvas min-width stays a `large`-only floor — applied lower it would
clip the panel it is meant to sit beside.

`isSmall` and `isWide` now describe the same width, so they collapse
into one: the panel undocks and the transform controls move at a single
breakpoint rather than two that happen to agree.
Switching tabs set `hasChosenPanelRef`, the flag meaning "the user
decided whether the panel is open". Picking Details on a wide screen
then froze the breakpoint following, so dragging the window narrow left
the panel covering the canvas — the #81487 symptom this branch fixes.

Splitting that flag exposed a second bug: with tab switching no longer
freezing it, the default-panel effect reran on resize and overwrote the
chosen tab, so Details -> narrow -> wide landed back on Crop. Track the
two decisions separately: whether the panel is open, and which tab it
shows.

The strip's rule stopped short of the sidebar edges because the gutter
sat on the column holding both the strip and the pane, so the strip
could never reach past it. Move it onto the two children instead: the
rule spans the sidebar and the tabs still line up with the fields.

Drop `showTransformControls`. It encoded the breakpoint split that the
panel docking from `small` removed, and was left with one caller passing
a literal `true` and a default nothing used.

Also correct comments that outlived the changes they described: the dock
breakpoint moved to `small`, the tab panels register rather than all
render, and the modal footer no longer has a narrow variant.
Trunk paints the ruler strip the same grey as the canvas, so the two
read as one panel. This branch had moved it onto the modal's own
background, which is a design question rather than a layout one, and one
worth settling in the panel redesign instead of here.

Trunk's strip was a row, so `flex: 0 1 360px` on the ruler capped its
width. This one is a column, where that basis would cap height instead:
the band stretches and the 360px measure moves inside it, to the ruler
itself. The rotate/flip/zoom row below stays on the modal background.

Split the corner radii between the canvas and the band so the pair reads
as one panel with four rounded corners rather than two stacked cards.
The canvas keeps all four on its own, since non-image media has no band
beneath it, and gives up its bottom two only when one follows.

Also restore the sidebar gutter, the tablist and the panel padding to
what they were before 406636e rearranged them, and give the route's
body the bottom margin the page has no footer to supply.
`data-active-panel` was written on the body and never read: no selector
and no script matched it, and the comment claiming a rule would need it
to tell panels apart described something that never happened.

`--rotation-ruler-surface` had no setter left once the ruler went back
on the canvas grey, so only its fallback ever ran. Reverting the file
leaves it identical to trunk, which drops it from the diff rather than
keeping a hook for a surface change nobody is making.

Condense the changelog to the two entries a consumer has to act on —
`MediaEditor.ImageControls` is gone and `renderFrame` drops `hasCanvas`
— and fold the internal behaviour into the refactor entry. One of the
folded lines still claimed the panel docks above `large`, which stopped
being true when it moved to `small`.

Reported by andrewserong on #81840.
The tab strip was sticky, which meant living inside the scrolling pane,
which in turn put the scroll container on the pane and a gutter on the
column above it. That inset the scrollbar from the sidebar edge and left
the tabs and fields at 16-20px where the canvas sits at 24px.

Trunk avoided both by passing the strip as `ComplementaryArea`'s header,
a slot outside the scrolling body. Do the same structurally: the strip
is a plain sibling above the pane, so it holds its place without joining
the scroller, and the pane spans the sidebar with its gutter as padding
— the scrollbar sits against the edge, outside it.

The strip's own inset is margin rather than padding, so the rule under
it ends where the tabs and fields start instead of running to the edge.

Settle the surrounding spacing at 24px throughout: the modal footer, and
the canvas column's inline margins, which now let the sidebar meet the
canvas and the viewport edge directly. The 24px there comes from the
pane's padding rather than a margin on the sidebar, since a margin would
push the scrollbar back inside.

Reported by andrewserong on #81840.
Between 961px and 1024px the route grew a horizontal scrollbar. The
canvas asked for a 520px floor above `large`, which with the 320px panel
and a 24px gutter needs 864px of body. By viewport that fits, but the
route also carries wp-admin's 160px menu, leaving 805-840px — so neither
column could shrink and the page overflowed instead. At 960px the menu
folds to 36px and the symptom vanished, which is why it looked like a
breakpoint bug.

Make the body a containment context and key the floor to it, so the
canvas measures the room it actually has rather than the viewport. The
modal has no such chrome and is unaffected; any future host gets it right
without knowing to.

The threshold is written as canvas + panel + gutter so it stays honest if
any of the three moves. Verified no overflow at eleven widths from 420px
to 1400px, with the canvas shrinking through the old dead zone rather
than forcing a scrollbar.

Reported by andrewserong on #81840.
`scope` named the `@wordpress/interface` scope that persisted the
sidebar's open state per surface. That went with `ComplementaryArea`, so
the prop has read nothing since; it was kept only so callers passing it
would still compile.

Nothing passes it. `MediaEditor` is a private API, so there is no
external caller to keep compiling either, and the prop can go rather
than sit as a documented no-op.

Reported by andrewserong on #81840.
@ramonjd
ramonjd force-pushed the try/media-editor-panel-layout branch from d99f95d to 33f219d Compare August 27, 2026 05:33
@ramonjd
ramonjd enabled auto-merge (squash) August 27, 2026 05:34
@ramonjd
ramonjd merged commit b200d6d into trunk Aug 27, 2026
44 checks passed
@ramonjd
ramonjd deleted the try/media-editor-panel-layout branch August 27, 2026 06:09
@github-actions github-actions Bot added this to the Gutenberg 24.0 milestone Aug 27, 2026
@fcoveram

Copy link
Copy Markdown
Contributor

Do you mean the crop tools are barely noticeable? So the existence of the "Crop" panel makes it clearer (when the sidebar isn't collapsed). Wondering if we need to explore ways to keep the sidebar, or better put, the existence of the side panels, a permanent fixture in the UI. 🤔

Yes, the crop tools in the panel. A permanent panel sounds an idea worth exploring.

…I think I get you: we can be more panel driven for our tools in desktop. I think we could come up with a design that works in a WordPress context, taking the best of both!

I meant edit controls in panels as in the block editor. The existing heuristic is worth keeping, and we can continue the exploration there before placing controls in other UI regions.

Forgive me, I don't see the relationship with the current Media Library, but I can say that I would not count on the layout being 1:1 between an in-editor media editor and the Media Library view anyway. Since one is about side-wide management and the other about single, in place media editing, I expect there to be mutually exclusive controls, even different panels between the two.

I would like to discuss this approach more to understand the visions all divisions that we have.

If you go to the Media Library now and click on an image, you’ll see editable fields that are pretty much like the block editor’s layout structure. On the other hand, when you go to the block editor, select an image, and click the crop action, the Details tab allows you to modify content that doesn’t relate to the document you’re coming from. IE, alt text in Details tab is different than alt text in Image block.

This example is just to surface what I think you’re also touching on, which is to differentiate between two contexts: one for managing media and another when media is inserted into a document.

Regardless of the above, thanks for revisiting the scope.

@annezazu

Copy link
Copy Markdown
Contributor

What do you think of this @annezazu?

@fcoveram I'm coming to this late due to time off but I wanted to acknowledge I was tagged in this. If you're asking what I think about a design proposal for this area of work (outside of this more code focused refactor), yes please! Let's continue the discussion and please share designs on #81121 so this doesn't get lost in the comments of a PR. Thanks for being game to help here.

ramonjd added a commit that referenced this pull request Aug 31, 2026
The panel layout refactor (#81840) replaced the ComplementaryArea wrapper
with a Tabs panel, so .media-editor__sidebar-panel no longer exists and
the rule that strips PanelBody's border and padding stopped matching.
Target .media-editor__panel, the class the pane now carries.
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 `658c8cbe89db5d90279051d3bb816ca210fe4646 ` (version `23.8.0`) to `5a4cc502d43016f1efa66f8f6d9bd3bb4bb24d85`, which contains the latest changes up until the Node.js version was bumped from 20.x to 24.x.

A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/658c8cbe89db5d90279051d3bb816ca210fe4646..5a4cc502d43016f1efa66f8f6d9bd3bb4bb24d85.

- Menu: Stabilize iframe reload test (WordPress/gutenberg#82081)
- Packages: Recover August 26 npm release metadata (WordPress/gutenberg#82085)
- Storybook: Demonstrate light, dark, and nested themes (WordPress/gutenberg#82039)
- Project Management: Add validation for missing GitHub labels configuration (WordPress/gutenberg#76263)
- Automated Testing: Enforce `.tsx` for all new React files (WordPress/gutenberg#80123)
- UI: Use root theme for portaled overlays (WordPress/gutenberg#82038)
- Menu: Stabilize portaled iframe test (WordPress/gutenberg#82092)
- Theme: Move post-release changelog entry to Unreleased (WordPress/gutenberg#82093)
- Media: Refuse a multi-file drop on a placeholder that takes one file (WordPress/gutenberg#82046)
- Font Library: Keep CSS custom properties unquoted in font previews (WordPress/gutenberg#82010)
- Add "reading settings" link to Front Page template (WordPress/gutenberg#81987)
- Docs: Fix grammar in documentation (WordPress/gutenberg#82032)
- Media Editor: refactor the panel layout (WordPress/gutenberg#81840)
- DataViews layout storybook: action names and primary status (WordPress/gutenberg#82104)
- Make `@wordpress/reusable-blocks` a no-op compatibility package (WordPress/gutenberg#79186)
- Widget Dashboard: add a Policy provider to govern what users may do (WordPress/gutenberg#81967)
- Build Package: Restore Core Boot layout compatibility (WordPress/gutenberg#82112)
- Edit Widgets: Guard canInsertBlockInWidgetArea against an empty block list (WordPress/gutenberg#82107)
- Build: Enforce NodeNext resolution for ESM packages (WordPress/gutenberg#82088)
- UI: Remove unused outset-ring--focus-within-visible class. (WordPress/gutenberg#82077)
- Inserter: Keep the block preview inside the viewport (WordPress/gutenberg#82060)
- Test: Enforce Vitest conventions and CI guardrails (WordPress/gutenberg#81040)
- Editor: Apply the showListViewByDefault preference in the shared editor (WordPress/gutenberg#82119)
- Release: Use CLI runtime for package publishing (WordPress/gutenberg#82122)
- Reusable Blocks: Remove leftover merge conflict markers from the changelog (WordPress/gutenberg#82126)
- chore: Update grep settings and remove comments (WordPress/gutenberg#82121)
- Fix: Content Guidelines: UX/UI Accessibility issues (WordPress/gutenberg#80306)
- Extensible Site Editor: Let menu items be added from the navigation screen (WordPress/gutenberg#82125)
- Navigation: Change WCText to Text (WordPress/gutenberg#82130)
- Storybook: Persist sidebar theme in URL (WordPress/gutenberg#82111)
- Editor assets endpoint: prime the theme JSON resolver before capturing (WordPress/gutenberg#82134)
- Remove unused dependencies across the monorepo (WordPress/gutenberg#82103)
- Update changelog instructions for agents (WordPress/gutenberg#82097)
- Build: Normalize JSX file extensions (WordPress/gutenberg#80990)
- Fix pattern export filenames by normalizing special characters (WordPress/gutenberg#77033)
- Site editor v2: navigation takes view config from endpoint (WordPress/gutenberg#82138)
- Extensible Site Editor: Load media assets before the media fields open (WordPress/gutenberg#82135)
- Site editor v2: pages take view config from endpoint (WordPress/gutenberg#82140)
- Extensible site editor: Add a revisions entry point to the Styles route (WordPress/gutenberg#82142)
- List: outdent an empty middle item without adding an item (WordPress/gutenberg#82011)
- Extensible site editor: Fall back to the raw title in edit route document titles (WordPress/gutenberg#82143)
- Blocks: Make BlockTransform a discriminated union over its type (WordPress/gutenberg#81831)
- Theme: add LightningCSS WPDS token fallback plugin (WordPress/gutenberg#80401)
- UI: Add popupWidth prop to item popup components (WordPress/gutenberg#82087)
- Snackbar: Restart timeout when a notice is recreated (WordPress/gutenberg#81764)
- Media: Report server upload failures in plain language (WordPress/gutenberg#81735)
- Format library: visualise non-breaking spaces (WordPress/gutenberg#74040)
- Bump the github-actions group across 1 directory with 2 updates (WordPress/gutenberg#81932)
- Try adding a Grid block variation to Gallery (WordPress/gutenberg#81909)
- Components: Keep foreign items out of a ToolsPanel menu (WordPress/gutenberg#82127)
- Enable Gallery columns and crop controls in viewport states (WordPress/gutenberg#82003)
- Query: Don't write excludeCurrent into blocks that never had it (WordPress/gutenberg#82147)
- Site title: Add fit-text support. (WordPress/gutenberg#82074)
- Accordion Panel: Reset padding-block when panel is hidden (WordPress/gutenberg#81782)
- Replace npm-run-all with native npm script chaining (WordPress/gutenberg#82166)
- Grid: per-item tile size limits (WordPress/gutenberg#81899)
- Fix: Tabs block: Anchor links in tab panels are not functional (WordPress/gutenberg#81744)
- Validate tsconfig references against declared dependencies (WordPress/gutenberg#82106)
- Performance tests: Build once and shard the suites across parallel CI jobs (WordPress/gutenberg#82160)
- Site Health widget: route the body's review link through the host (WordPress/gutenberg#82066)
- Build: allow wp-theme 2.x peer deps (WordPress/gutenberg#82139)
- Bundled packages: Add a check for transitive private API usage (WordPress/gutenberg#82027)
- List: try to preserve indentation level of children after outdenting+merging their parent (WordPress/gutenberg#82145)
- Block Library: Fix categories block handling of invalid taxonomy (WordPress/gutenberg#82153)
- useViewConfig: don't request the view config twice (WordPress/gutenberg#82141)
- Documentation: Remove invalid references to Babel in packages README (WordPress/gutenberg#82176)
- Automated Testing: Fix failing categories test on trunk (WordPress/gutenberg#82182)
- Jest: Update to 30.5.0 (WordPress/gutenberg#82181)
- Fix: Retain focus and caret position after Backspace undo of a prefix block transform (WordPress/gutenberg#82116)
- Scaffold e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82178)
- Package lock: Deduplicate Jest dependencies (WordPress/gutenberg#82187)
- Components: Migrate remaining JSX files to TypeScript (WordPress/gutenberg#82132)
- Text: Use pretty wrapping by default (WordPress/gutenberg#82133)
- Build Tooling: Add browserslist config for build targeting (WordPress/gutenberg#82179)
- Columns: Fix appender drop zone visibility when dragging into empty column (WordPress/gutenberg#77852)
- Build: Require explicit JSX file extensions (WordPress/gutenberg#82189)
- Icons: Redraw 35 prominent icons with consistent stroke widths (WordPress/gutenberg#78808)
- Test: Classify and enforce unit test environments by filename (WordPress/gutenberg#80991)
- Test: Fix CI failures on trunk (WordPress/gutenberg#82201)
- Fix editor link colour cascade order for nested blocks (WordPress/gutenberg#77833)
- Add New Template: Show the design system focus ring instead of legacy box-shadow rings (WordPress/gutenberg#82164)
- List View: Don’t focus the last Table cell on keyboard activation (WordPress/gutenberg#81964)
- Fix spelling typos in docs and inline comments (WordPress/gutenberg#82217)
- CI: Pin npm version in the private API check job (WordPress/gutenberg#82222)
- Private APIs: Add back '@wordpress/dataviews' to the allowed core modules (WordPress/gutenberg#82221)
- Editor: Mark __unstableSaveForPreview options as optional (WordPress/gutenberg#81858)
- Docs: Explain when the Cover block's overlay controls appear (WordPress/gutenberg#82234)
- Menu: Use Text for item labels and descriptions (WordPress/gutenberg#82237)
- Test: Type pipe's supported array inputs (WordPress/gutenberg#82210)
- Widget Dashboard: keep the plain anchor for an empty-string download (WordPress/gutenberg#82073)
- CI: Read the required npm version from a single source (WordPress/gutenberg#82235)
- Components: Add `defaultShown`, `onShownChange` to `ToolsPanelItem` (WordPress/gutenberg#78010)
- Storybook: Drop unused support for js-as-jsx (WordPress/gutenberg#82192)
-  Math: Declare clientNavigation interactivity support (WordPress/gutenberg#82248)
- Point to docmumentation about release assets (WordPress/gutenberg#82250)
- Change stray `ubuntu-latest` to `ubuntu-24.04`. (WordPress/gutenberg#82156)
- Performance tests: Reuse the plugin an earlier trunk run already built (WordPress/gutenberg#82223)
- Breadcrumb: Add UI component (WordPress/gutenberg#80425)
- Components: Cut the ToolsPanel render cascade (WordPress/gutenberg#82180)
- Fix: alert dialog box cancel button color (WordPress/gutenberg#82261)
- UI: Add Form best practices Storybook page (WordPress/gutenberg#82197)
- Media: Stop claiming "Upload complete" when upload failed (WordPress/gutenberg#81397)
- Boot, Site Editor: Seed content surfaces with default background color (WordPress/gutenberg#81646)
- Format Library: Fix Edit as HTML crash with background-only highlight (WordPress/gutenberg#82215)
- Remove the template activation experiment (WordPress/gutenberg#82241)
- Packages: Add cross-version compatibility skill (WordPress/gutenberg#81890)
- Show the block outline where the grab cursor shows (WordPress/gutenberg#81798)
- DataViews: Scope the search field's fixed width to the default UI search row (WordPress/gutenberg#82128)
- Background image: support setting the image from a URL (WordPress/gutenberg#82230)
- Border Box Control: Try moving the unlink button to the label row, and rename the panel to Borders (WordPress/gutenberg#82163)
- Widget Dashboard: govern Reset to default through the policy (WordPress/gutenberg#82255)
- Media: Attach unattached media to the current post on save/publish (WordPress/gutenberg#81977)
- Widget Dashboard: make the column count a host decision (WordPress/gutenberg#82204)
- Global styles: resolve theme-relative background image URLs for display (WordPress/gutenberg#82242)
- CI: Unify the automation comments into a single PR comment (WordPress/gutenberg#82249)
- Core Data: Convert hooks tests to renderHook and drop JSX (WordPress/gutenberg#82276)
- Release: Map [Type] Flaky Test to the Tools changelog section (WordPress/gutenberg#82078)
- DateTime tests: freeze the clock in the empty-value calendar test (WordPress/gutenberg#82282)
- DataForm: treat combined form fields purely as layout containers (WordPress/gutenberg#82175)
- Global styles engine: return a copy from getResolvedValue instead of mutating (WordPress/gutenberg#82278)
- Test: Migrate Node unit tests to Vitest (WordPress/gutenberg#82211)
- Icons: Redraw 64 icons to be stroke-based. (WordPress/gutenberg#78812)
- Tests: Fix Vitest setup and stale jest types under non-hoisting installs (WordPress/gutenberg#82290)
- UI: Rename Popup `popupWidth` prop to `width` (WordPress/gutenberg#82193)
- Query: Replace the "Reload full page enabled" modal with a snackbar notice (WordPress/gutenberg#82246)
- Project Management: Update CODEOWNERS to reflect current participation (WordPress/gutenberg#82262)
- Editor: Refactor the Options menu to use the Menu component (WordPress/gutenberg#81564)
- UI: Add Field.VisualLabel (WordPress/gutenberg#82095)
- Update Stylelint to v17 and related packages (WordPress/gutenberg#80738)
- Media: keep indexed PNG sub-sizes indexed (WordPress/gutenberg#81884)
- UI: Add Combobox and Autocomplete Status (WordPress/gutenberg#82195)
- UI: Drop Status and Empty live region test assertions (WordPress/gutenberg#82300)
- Project Management: Remove empty entries from CODEOWNERS (WordPress/gutenberg#82292)
- Documentation: Add recommended bulk suppressions configuration for ESLint (WordPress/gutenberg#82303)
- UI: Hide Input field ring when a slot control is focused (WordPress/gutenberg#82257)
- Widgets: Surface debugging details in the ErrorBoundary (WordPress/gutenberg#82099)
- TypeScript: Migrate format-library package to TS (WordPress/gutenberg#79486)
- BorderBoxControl: Make sure the group of controls is associated with the label (WordPress/gutenberg#82279)
- Image block cropping: Sync image size and link destination settings (WordPress/gutenberg#82316)
- Menu: Support multiple item descriptions (WordPress/gutenberg#81825)
- CI: Do not fail the type label check on a newly opened pull request (WordPress/gutenberg#82322)
- UI: Align overlay Trigger props with Base UI (WordPress/gutenberg#81824)
- Gallery block: Fix 'Crop images to fit' broken in editor (WordPress/gutenberg#82318)
- Widget Dashboard: enforce the policy on the staging layer for every instance operation (WordPress/gutenberg#82256)
- DataForm: Communicate the timezone in the datetime control (WordPress/gutenberg#82291)
- Add more e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82239)
- Framework: Error on npm versions older than the required floor (WordPress/gutenberg#82320)
- Document every type for DataViews/DataForm/Field API (WordPress/gutenberg#82326)
- ESLint plugin: remove usage of Babel parser (WordPress/gutenberg#82144)
- DataViews: remove the rich text options from the control config type (WordPress/gutenberg#82330)
- Meta Boxes: Move meta box markup with moveBefore to keep classic editors alive (WordPress/gutenberg#82243)
- Add more e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82327)
- Test: Enforce JavaScript test runner ownership (WordPress/gutenberg#82299)
- DataViews: clamp page after delete (WordPress/gutenberg#82244)
- Stylelint tools: Resolve test config extends from the workspace (WordPress/gutenberg#82336)
- Editor: Deprecate the `as` prop of the plugin menu item components (WordPress/gutenberg#82319)
- Icons: Convert Search icon to strokes (WordPress/gutenberg#82338)
- DataViews: Document that table column styles do not apply to the primary column (WordPress/gutenberg#82238)
- DataViews: add hierarchical levels story (WordPress/gutenberg#82344)
- CI: Add "Required changes from trunk" PR check (WordPress/gutenberg#82272)
- feat: Improve TypeScript definitions in the getEntityRecord function (WordPress/gutenberg#81863)
- Framework: Update Node.js to v24 LTS and npm to v11 (WordPress/gutenberg#80395)
- Revert "Framework: Update Node.js to v24 LTS and npm to v11 (WordPress/gutenberg#80395)" (WordPress/gutenberg#82355)
- UI: Remove ValidityIndicator outer margin (WordPress/gutenberg#82267)
- Span the writing flow focus capture elements over the canvas (WordPress/gutenberg#82354)
- Fields: Hide the slug field for posts without a permalink (WordPress/gutenberg#82341)
- Fix: Responsive horizontal orientation does not override a vertical layout. (WordPress/gutenberg#82364)
- View Config: Move the table column style descriptions to the 7.2 compat layer (WordPress/gutenberg#82372)
- Block Library: Allow themes to override the padding added via background color (WordPress/gutenberg#82024)
- DataViews: Append an ellipsis to action labels that open a dialog (WordPress/gutenberg#81994)
- Pages: require authentication and a capability to render generated standalone pages (WordPress/gutenberg#82254)
- Build/Test Tools: Replace npx with npm exec --no (WordPress/gutenberg#82331)
- Navigation: restore flex-grow on container when accessible label is present (WordPress/gutenberg#78447)
- DOM Ready: Exclude src from published package files (WordPress/gutenberg#77302)
- UI: Support custom targets on Link and Menu.LinkItem (WordPress/gutenberg#82347)
- Escape HTML: Exclude src from published package files (WordPress/gutenberg#77304)
- keycodes: Exclude src from published files (WordPress/gutenberg#77306)
- Packages: Exclude src from block-serialization-default-parser published package (WordPress/gutenberg#77307)
- A11y: Exclude src from published package files (WordPress/gutenberg#77309)
- Packages: Exclude src from autop published package (WordPress/gutenberg#77283)
- Blob: Exclude src from published package files (WordPress/gutenberg#77289)
- Packages: Exclude src from deprecated published package (WordPress/gutenberg#77303)
- fix(list-reusable-blocks): exclude src from published files (WordPress/gutenberg#77305)
- Admin UI: Exclude src from published files and sideEffects (WordPress/gutenberg#77285)
- Standardize 'Back' and 'Go back' labels (WordPress/gutenberg#79211)
- Audio: Update autoplay help text for clarity (WordPress/gutenberg#69978)
- Theme JSON: Avoid rebuilding identical block schemas during sanitization (WordPress/gutenberg#82203)
- Docs: Improve setAttributes updater function wording (WordPress/gutenberg#82405)
- Query Loop: Rename the "Keyword" filter to "Search terms" and add help text (WordPress/gutenberg#82387)
- CI: add a per-workflow status check job and filter paths (WordPress/gutenberg#81015)
- ESLint: Thin use-recommended-components tests (WordPress/gutenberg#82407)
- UI: Fix enabled input placeholder contrast (WordPress/gutenberg#82304)
- Tab trap escape hatch: leave/enter the canvas with Escape/Enter (WordPress/gutenberg#82314)
- List: preserve client IDs on indent, just like outdent (WordPress/gutenberg#59216)
- Templates REST API: prevent fatal error when a null template reaches prepare_item_for_response (WordPress/gutenberg#82374)
- Editor: Refactor the View menu to use the Menu component (WordPress/gutenberg#82321)
- CSS Styling: Cleanup focus outline override for grid component (WordPress/gutenberg#82337)
- E2E: Run the site editor suite against the extensible site editor too (WordPress/gutenberg#82117)
- Fields: Remove unused CSS rule from slug field control (WordPress/gutenberg#77961)
- Fix: Footnote IDs can start with a digit and break CSS selectors (WordPress/gutenberg#82398)
- feat: Introduce 'Add Media' in the block controls for media-text block (WordPress/gutenberg#82420)
- fix: Audio element to have it's own name (WordPress/gutenberg#82389)
- Docs: Update Playground CLI wording (WordPress/gutenberg#77579)
- Upgrade React 19 to 19.2.8, read version from package.json (WordPress/gutenberg#82439)
- Tab Panel: Show focus with outline instead of legacy box-shadow ring (WordPress/gutenberg#82421)
- Editor: Fix disabled and link items of the more menu adapter (WordPress/gutenberg#82428)
- UI: Fix Menu.LinkItem target detection (WordPress/gutenberg#82442)
- SearchableSelect: Add form primitive to @wordpress/ui (WordPress/gutenberg#80961)
- Validated form controls: Use design token for invalid focus rings (WordPress/gutenberg#82410)
- feat: Update layout icons (WordPress/gutenberg#82025)
- Widgets: Replace {TODO} placeholder with PR number in changelog entries (WordPress/gutenberg#82450)
- UI: Remove ESLint ref suppressions and refactor AlertDialog state (WordPress/gutenberg#82131)
- Menu: Align selection indicators and prefix icons with item labels (WordPress/gutenberg#82346)
- ToggleGroupControl: Honor the root disabled prop (WordPress/gutenberg#82259)
- Block Library: Remove the form blocks experiment (WordPress/gutenberg#82451)
- List: indent and outdent multi-selected items with Tab (WordPress/gutenberg#82411)
- CodeRabbit: Only review on request, keep PR descriptions untouched (WordPress/gutenberg#82448)
- Privacy policy page badge: make it visible in Site Editor > Pages and Editor Inspector (WordPress/gutenberg#82422)
- Support `isAny` and `isNone` filter operators for numeric fields. (WordPress/gutenberg#77942)
- UI: Keep focus rings visible in overlay content (WordPress/gutenberg#82443)
- Menu: Correct alignment documentation and changelog (WordPress/gutenberg#82455)
- UI: Name unlabeled form primitive stories (WordPress/gutenberg#82311)
- UI: Re-read the native validity on blur in ControlWithError (WordPress/gutenberg#82376)
- Media Utils: Preserve arrays in multipart form data (WordPress/gutenberg#82353)
- fix: Remove stories from performance tests (WordPress/gutenberg#82459)
- Add the template e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82394)
- UI: Fix Link target detection (WordPress/gutenberg#82447)
- Fix privacy policy page setting unit test on multisite (WordPress/gutenberg#82467)
- UI, DataViews: Give input and selection controls solid backgrounds (WordPress/gutenberg#82391)
- Fix LocationPicker popover alignment with InputGroup (WordPress/gutenberg#82090)
- List: indent and outdent a fully selected list item with Tab (WordPress/gutenberg#82460)
- UI: Fix Minimal Select popup width (WordPress/gutenberg#82461)
- Rich text: resolve owned event listeners once instead of per subscriber (WordPress/gutenberg#80605)
- UI: Keep borderless InputLayout chrome when disabled (WordPress/gutenberg#82468)
- Theme: Cache luminance for contrast checks (WordPress/gutenberg#82445)
- Add promptfoo for testing agent development setup and skills (WordPress/gutenberg#80812)
- wp-env: Fix Docker build errors with Debian Bullseye repositories (WordPress/gutenberg#82478)
- Query Loop: Fall back to `post` when the query has no `postType` (WordPress/gutenberg#82465)
- Block Supports: Bail early in state styles when a block has no style attribute (WordPress/gutenberg#81908)
- CSS Styling: Represent focus with outline for list view component (WordPress/gutenberg#82129)
- Icons: Remove the obsolete forced colors mode hack (WordPress/gutenberg#82481)
- Docs: Remove invalid `@return` tag from the `block_core_social_link_get_services` hook docblock (WordPress/gutenberg#82488)
- Site Editor: Add a root error boundary to prevent a blank screen (WordPress/gutenberg#82486)
- Writing Flow: Bail out of Enter handling when no block is selected (WordPress/gutenberg#82424)
- Docs: Remove the blank line between @PARAM and @return in test docblocks (WordPress/gutenberg#81907)
- List View: Disable block icon colors while the block is selected (WordPress/gutenberg#82498)
- Fix: Restore layout styles for block style variations (WordPress/gutenberg#82335)
- Post slug: prefer server sanitization in the editor (WordPress/gutenberg#78135)
- Media Modal Experiment: Allow filtering by attached to the post, or unattached (WordPress/gutenberg#81974)
- Media editor: Lock the editing tools while a save is running (WordPress/gutenberg#82417)
- DataViews: Restrict the isAll filter operator to array fields (WordPress/gutenberg#82463)
- Media Fields: Pass the field's disabled state to the textarea controls (WordPress/gutenberg#82516)
- Theme: Make chroma capacity caching deterministic (WordPress/gutenberg#82505)
- Global Styles: Remove the color randomizer experiment (WordPress/gutenberg#82452)
- DataViews: Fix Field.sort TypeScript type definition (WordPress/gutenberg#82162)
- Migrate __experimentalText and __experimentalHeading to @wordpress/ui Text in Inspector Popover Header (WordPress/gutenberg#77449)
- Migrate __experimentalText to @wordpress/ui Text in Block switcher bindings hint (WordPress/gutenberg#77366)
- UI: Add Radio form primitive (WordPress/gutenberg#82214)
- Migrate __experimentalText to @wordpress/ui Text in Allowed Blocks Modal (WordPress/gutenberg#78119)
- UI: Add CheckboxControl (WordPress/gutenberg#82213)
- Core Data: Scope revisionId to the entity it is provided for (WordPress/gutenberg#82517)
- Migrate __experimentalText to @wordpress/ui Text in Pattern Overrides Dropdown (WordPress/gutenberg#77492)
- ProgressBar: Respect reduced motion preferences (WordPress/gutenberg#82490)
- Theme: Clarify color seed and warning guarantees (WordPress/gutenberg#82526)
- Theme: Build default ramps before token artifacts (WordPress/gutenberg#82525)
- CodeRabbit: Disable the review status comment (WordPress/gutenberg#82534)
- Project Management: Restore CODEOWNERS exclusions for suppression lists (WordPress/gutenberg#82538)
- Editor: merge duplicate "Enhancements" changelog sections (WordPress/gutenberg#82533)
- UI: Validate compound component context (WordPress/gutenberg#82510)
- Docs: Document isolated worktree setup (WordPress/gutenberg#82524)
- DataForm: render untyped fields without an edit control that are read-only (WordPress/gutenberg#82514)
- API Fetch: Add unregister to remove a registered middleware (WordPress/gutenberg#82408)
- Editor: Show revision data in Post Title component (WordPress/gutenberg#82536)
- Components: Add compound component composition diagnostics (WordPress/gutenberg#82509)
- Fieldset: Fix gap token to match spec (WordPress/gutenberg#75479)
- Test: Migrate deterministic JSDOM tests and harden Vitest isolation (WordPress/gutenberg#82212)
- Release: Make npm publication verification resumable (WordPress/gutenberg#82089)
- Block Library: Use 'useEntityProp' in Site Title and Tagline blocks (WordPress/gutenberg#82518)
- Theme: Migrate Terrazzo modes to resolvers (WordPress/gutenberg#82537)
- Fix auto-capitalization after Enter on iOS Safari (WordPress/gutenberg#82475)
- Update navigation link block name, use a default variation for custom link (WordPress/gutenberg#82375)
- API Fetch: Expose defaultFetchHandler so overrides can restore it (WordPress/gutenberg#82553)
- Core Data: Return a stable record for equivalent `_fields` queries (WordPress/gutenberg#82552)
- API Fetch: Rename defaultFetchHandler parameter to options (WordPress/gutenberg#82588)
- Fields: remove unused custom sort from the author fields (WordPress/gutenberg#82559)
- Fields: Declare the caption, alt text, description and ping status controls through the Field API (WordPress/gutenberg#82539)
- Docs: Align @PARAM tag columns in phpunit/ docblocks (WordPress/gutenberg#81904)
- Docs: Align @PARAM tag columns in lib/ docblocks (WordPress/gutenberg#81902)
- Docs: Align @PARAM tag columns in packages/ docblocks (WordPress/gutenberg#81903)
- Fix help paragraph color contrast ratio in the Connectors page. (WordPress/gutenberg#82378)
- DataViews: Declare transitive dependencies imported by the ./wp bundle (WordPress/gutenberg#81843)
- DataForm: Add a `showPlaceholderIfEmpty` option to the panel layout (WordPress/gutenberg#82527)
- Global Styles UI: migrate revisions Active Badge to UI Badge (WordPress/gutenberg#82560)
- UI: Put overflow on Select.List instead of a nested wrapper (WordPress/gutenberg#82470)
- Editor: migrate post-card-panel Badge to UI Badge (WordPress/gutenberg#82500)
- Fields: migrate page-title Badge to UI Badge (WordPress/gutenberg#82499)
- DataViews: Skip table columns for field ids without a field definition (WordPress/gutenberg#82601)
- View config: remove stale fields from the wp_template default view (WordPress/gutenberg#82602)
- Rich text: restore contenteditable on pointercancel (WordPress/gutenberg#82598)
- Components: Add an Emotion-to-SCSS migration skill and guide (WordPress/gutenberg#82567)

See #66070.

git-svn-id: https://develop.svn.wordpress.org/trunk@63538 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 `658c8cbe89db5d90279051d3bb816ca210fe4646 ` (version `23.8.0`) to `5a4cc502d43016f1efa66f8f6d9bd3bb4bb24d85`, which contains the latest changes up until the Node.js version was bumped from 20.x to 24.x.

A full list of changes included in this commit can be found on GitHub: https://github.com/WordPress/gutenberg/compare/658c8cbe89db5d90279051d3bb816ca210fe4646..5a4cc502d43016f1efa66f8f6d9bd3bb4bb24d85.

- Menu: Stabilize iframe reload test (WordPress/gutenberg#82081)
- Packages: Recover August 26 npm release metadata (WordPress/gutenberg#82085)
- Storybook: Demonstrate light, dark, and nested themes (WordPress/gutenberg#82039)
- Project Management: Add validation for missing GitHub labels configuration (WordPress/gutenberg#76263)
- Automated Testing: Enforce `.tsx` for all new React files (WordPress/gutenberg#80123)
- UI: Use root theme for portaled overlays (WordPress/gutenberg#82038)
- Menu: Stabilize portaled iframe test (WordPress/gutenberg#82092)
- Theme: Move post-release changelog entry to Unreleased (WordPress/gutenberg#82093)
- Media: Refuse a multi-file drop on a placeholder that takes one file (WordPress/gutenberg#82046)
- Font Library: Keep CSS custom properties unquoted in font previews (WordPress/gutenberg#82010)
- Add "reading settings" link to Front Page template (WordPress/gutenberg#81987)
- Docs: Fix grammar in documentation (WordPress/gutenberg#82032)
- Media Editor: refactor the panel layout (WordPress/gutenberg#81840)
- DataViews layout storybook: action names and primary status (WordPress/gutenberg#82104)
- Make `@wordpress/reusable-blocks` a no-op compatibility package (WordPress/gutenberg#79186)
- Widget Dashboard: add a Policy provider to govern what users may do (WordPress/gutenberg#81967)
- Build Package: Restore Core Boot layout compatibility (WordPress/gutenberg#82112)
- Edit Widgets: Guard canInsertBlockInWidgetArea against an empty block list (WordPress/gutenberg#82107)
- Build: Enforce NodeNext resolution for ESM packages (WordPress/gutenberg#82088)
- UI: Remove unused outset-ring--focus-within-visible class. (WordPress/gutenberg#82077)
- Inserter: Keep the block preview inside the viewport (WordPress/gutenberg#82060)
- Test: Enforce Vitest conventions and CI guardrails (WordPress/gutenberg#81040)
- Editor: Apply the showListViewByDefault preference in the shared editor (WordPress/gutenberg#82119)
- Release: Use CLI runtime for package publishing (WordPress/gutenberg#82122)
- Reusable Blocks: Remove leftover merge conflict markers from the changelog (WordPress/gutenberg#82126)
- chore: Update grep settings and remove comments (WordPress/gutenberg#82121)
- Fix: Content Guidelines: UX/UI Accessibility issues (WordPress/gutenberg#80306)
- Extensible Site Editor: Let menu items be added from the navigation screen (WordPress/gutenberg#82125)
- Navigation: Change WCText to Text (WordPress/gutenberg#82130)
- Storybook: Persist sidebar theme in URL (WordPress/gutenberg#82111)
- Editor assets endpoint: prime the theme JSON resolver before capturing (WordPress/gutenberg#82134)
- Remove unused dependencies across the monorepo (WordPress/gutenberg#82103)
- Update changelog instructions for agents (WordPress/gutenberg#82097)
- Build: Normalize JSX file extensions (WordPress/gutenberg#80990)
- Fix pattern export filenames by normalizing special characters (WordPress/gutenberg#77033)
- Site editor v2: navigation takes view config from endpoint (WordPress/gutenberg#82138)
- Extensible Site Editor: Load media assets before the media fields open (WordPress/gutenberg#82135)
- Site editor v2: pages take view config from endpoint (WordPress/gutenberg#82140)
- Extensible site editor: Add a revisions entry point to the Styles route (WordPress/gutenberg#82142)
- List: outdent an empty middle item without adding an item (WordPress/gutenberg#82011)
- Extensible site editor: Fall back to the raw title in edit route document titles (WordPress/gutenberg#82143)
- Blocks: Make BlockTransform a discriminated union over its type (WordPress/gutenberg#81831)
- Theme: add LightningCSS WPDS token fallback plugin (WordPress/gutenberg#80401)
- UI: Add popupWidth prop to item popup components (WordPress/gutenberg#82087)
- Snackbar: Restart timeout when a notice is recreated (WordPress/gutenberg#81764)
- Media: Report server upload failures in plain language (WordPress/gutenberg#81735)
- Format library: visualise non-breaking spaces (WordPress/gutenberg#74040)
- Bump the github-actions group across 1 directory with 2 updates (WordPress/gutenberg#81932)
- Try adding a Grid block variation to Gallery (WordPress/gutenberg#81909)
- Components: Keep foreign items out of a ToolsPanel menu (WordPress/gutenberg#82127)
- Enable Gallery columns and crop controls in viewport states (WordPress/gutenberg#82003)
- Query: Don't write excludeCurrent into blocks that never had it (WordPress/gutenberg#82147)
- Site title: Add fit-text support. (WordPress/gutenberg#82074)
- Accordion Panel: Reset padding-block when panel is hidden (WordPress/gutenberg#81782)
- Replace npm-run-all with native npm script chaining (WordPress/gutenberg#82166)
- Grid: per-item tile size limits (WordPress/gutenberg#81899)
- Fix: Tabs block: Anchor links in tab panels are not functional (WordPress/gutenberg#81744)
- Validate tsconfig references against declared dependencies (WordPress/gutenberg#82106)
- Performance tests: Build once and shard the suites across parallel CI jobs (WordPress/gutenberg#82160)
- Site Health widget: route the body's review link through the host (WordPress/gutenberg#82066)
- Build: allow wp-theme 2.x peer deps (WordPress/gutenberg#82139)
- Bundled packages: Add a check for transitive private API usage (WordPress/gutenberg#82027)
- List: try to preserve indentation level of children after outdenting+merging their parent (WordPress/gutenberg#82145)
- Block Library: Fix categories block handling of invalid taxonomy (WordPress/gutenberg#82153)
- useViewConfig: don't request the view config twice (WordPress/gutenberg#82141)
- Documentation: Remove invalid references to Babel in packages README (WordPress/gutenberg#82176)
- Automated Testing: Fix failing categories test on trunk (WordPress/gutenberg#82182)
- Jest: Update to 30.5.0 (WordPress/gutenberg#82181)
- Fix: Retain focus and caret position after Backspace undo of a prefix block transform (WordPress/gutenberg#82116)
- Scaffold e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82178)
- Package lock: Deduplicate Jest dependencies (WordPress/gutenberg#82187)
- Components: Migrate remaining JSX files to TypeScript (WordPress/gutenberg#82132)
- Text: Use pretty wrapping by default (WordPress/gutenberg#82133)
- Build Tooling: Add browserslist config for build targeting (WordPress/gutenberg#82179)
- Columns: Fix appender drop zone visibility when dragging into empty column (WordPress/gutenberg#77852)
- Build: Require explicit JSX file extensions (WordPress/gutenberg#82189)
- Icons: Redraw 35 prominent icons with consistent stroke widths (WordPress/gutenberg#78808)
- Test: Classify and enforce unit test environments by filename (WordPress/gutenberg#80991)
- Test: Fix CI failures on trunk (WordPress/gutenberg#82201)
- Fix editor link colour cascade order for nested blocks (WordPress/gutenberg#77833)
- Add New Template: Show the design system focus ring instead of legacy box-shadow rings (WordPress/gutenberg#82164)
- List View: Don’t focus the last Table cell on keyboard activation (WordPress/gutenberg#81964)
- Fix spelling typos in docs and inline comments (WordPress/gutenberg#82217)
- CI: Pin npm version in the private API check job (WordPress/gutenberg#82222)
- Private APIs: Add back '@wordpress/dataviews' to the allowed core modules (WordPress/gutenberg#82221)
- Editor: Mark __unstableSaveForPreview options as optional (WordPress/gutenberg#81858)
- Docs: Explain when the Cover block's overlay controls appear (WordPress/gutenberg#82234)
- Menu: Use Text for item labels and descriptions (WordPress/gutenberg#82237)
- Test: Type pipe's supported array inputs (WordPress/gutenberg#82210)
- Widget Dashboard: keep the plain anchor for an empty-string download (WordPress/gutenberg#82073)
- CI: Read the required npm version from a single source (WordPress/gutenberg#82235)
- Components: Add `defaultShown`, `onShownChange` to `ToolsPanelItem` (WordPress/gutenberg#78010)
- Storybook: Drop unused support for js-as-jsx (WordPress/gutenberg#82192)
-  Math: Declare clientNavigation interactivity support (WordPress/gutenberg#82248)
- Point to docmumentation about release assets (WordPress/gutenberg#82250)
- Change stray `ubuntu-latest` to `ubuntu-24.04`. (WordPress/gutenberg#82156)
- Performance tests: Reuse the plugin an earlier trunk run already built (WordPress/gutenberg#82223)
- Breadcrumb: Add UI component (WordPress/gutenberg#80425)
- Components: Cut the ToolsPanel render cascade (WordPress/gutenberg#82180)
- Fix: alert dialog box cancel button color (WordPress/gutenberg#82261)
- UI: Add Form best practices Storybook page (WordPress/gutenberg#82197)
- Media: Stop claiming "Upload complete" when upload failed (WordPress/gutenberg#81397)
- Boot, Site Editor: Seed content surfaces with default background color (WordPress/gutenberg#81646)
- Format Library: Fix Edit as HTML crash with background-only highlight (WordPress/gutenberg#82215)
- Remove the template activation experiment (WordPress/gutenberg#82241)
- Packages: Add cross-version compatibility skill (WordPress/gutenberg#81890)
- Show the block outline where the grab cursor shows (WordPress/gutenberg#81798)
- DataViews: Scope the search field's fixed width to the default UI search row (WordPress/gutenberg#82128)
- Background image: support setting the image from a URL (WordPress/gutenberg#82230)
- Border Box Control: Try moving the unlink button to the label row, and rename the panel to Borders (WordPress/gutenberg#82163)
- Widget Dashboard: govern Reset to default through the policy (WordPress/gutenberg#82255)
- Media: Attach unattached media to the current post on save/publish (WordPress/gutenberg#81977)
- Widget Dashboard: make the column count a host decision (WordPress/gutenberg#82204)
- Global styles: resolve theme-relative background image URLs for display (WordPress/gutenberg#82242)
- CI: Unify the automation comments into a single PR comment (WordPress/gutenberg#82249)
- Core Data: Convert hooks tests to renderHook and drop JSX (WordPress/gutenberg#82276)
- Release: Map [Type] Flaky Test to the Tools changelog section (WordPress/gutenberg#82078)
- DateTime tests: freeze the clock in the empty-value calendar test (WordPress/gutenberg#82282)
- DataForm: treat combined form fields purely as layout containers (WordPress/gutenberg#82175)
- Global styles engine: return a copy from getResolvedValue instead of mutating (WordPress/gutenberg#82278)
- Test: Migrate Node unit tests to Vitest (WordPress/gutenberg#82211)
- Icons: Redraw 64 icons to be stroke-based. (WordPress/gutenberg#78812)
- Tests: Fix Vitest setup and stale jest types under non-hoisting installs (WordPress/gutenberg#82290)
- UI: Rename Popup `popupWidth` prop to `width` (WordPress/gutenberg#82193)
- Query: Replace the "Reload full page enabled" modal with a snackbar notice (WordPress/gutenberg#82246)
- Project Management: Update CODEOWNERS to reflect current participation (WordPress/gutenberg#82262)
- Editor: Refactor the Options menu to use the Menu component (WordPress/gutenberg#81564)
- UI: Add Field.VisualLabel (WordPress/gutenberg#82095)
- Update Stylelint to v17 and related packages (WordPress/gutenberg#80738)
- Media: keep indexed PNG sub-sizes indexed (WordPress/gutenberg#81884)
- UI: Add Combobox and Autocomplete Status (WordPress/gutenberg#82195)
- UI: Drop Status and Empty live region test assertions (WordPress/gutenberg#82300)
- Project Management: Remove empty entries from CODEOWNERS (WordPress/gutenberg#82292)
- Documentation: Add recommended bulk suppressions configuration for ESLint (WordPress/gutenberg#82303)
- UI: Hide Input field ring when a slot control is focused (WordPress/gutenberg#82257)
- Widgets: Surface debugging details in the ErrorBoundary (WordPress/gutenberg#82099)
- TypeScript: Migrate format-library package to TS (WordPress/gutenberg#79486)
- BorderBoxControl: Make sure the group of controls is associated with the label (WordPress/gutenberg#82279)
- Image block cropping: Sync image size and link destination settings (WordPress/gutenberg#82316)
- Menu: Support multiple item descriptions (WordPress/gutenberg#81825)
- CI: Do not fail the type label check on a newly opened pull request (WordPress/gutenberg#82322)
- UI: Align overlay Trigger props with Base UI (WordPress/gutenberg#81824)
- Gallery block: Fix 'Crop images to fit' broken in editor (WordPress/gutenberg#82318)
- Widget Dashboard: enforce the policy on the staging layer for every instance operation (WordPress/gutenberg#82256)
- DataForm: Communicate the timezone in the datetime control (WordPress/gutenberg#82291)
- Add more e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82239)
- Framework: Error on npm versions older than the required floor (WordPress/gutenberg#82320)
- Document every type for DataViews/DataForm/Field API (WordPress/gutenberg#82326)
- ESLint plugin: remove usage of Babel parser (WordPress/gutenberg#82144)
- DataViews: remove the rich text options from the control config type (WordPress/gutenberg#82330)
- Meta Boxes: Move meta box markup with moveBefore to keep classic editors alive (WordPress/gutenberg#82243)
- Add more e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82327)
- Test: Enforce JavaScript test runner ownership (WordPress/gutenberg#82299)
- DataViews: clamp page after delete (WordPress/gutenberg#82244)
- Stylelint tools: Resolve test config extends from the workspace (WordPress/gutenberg#82336)
- Editor: Deprecate the `as` prop of the plugin menu item components (WordPress/gutenberg#82319)
- Icons: Convert Search icon to strokes (WordPress/gutenberg#82338)
- DataViews: Document that table column styles do not apply to the primary column (WordPress/gutenberg#82238)
- DataViews: add hierarchical levels story (WordPress/gutenberg#82344)
- CI: Add "Required changes from trunk" PR check (WordPress/gutenberg#82272)
- feat: Improve TypeScript definitions in the getEntityRecord function (WordPress/gutenberg#81863)
- Framework: Update Node.js to v24 LTS and npm to v11 (WordPress/gutenberg#80395)
- Revert "Framework: Update Node.js to v24 LTS and npm to v11 (WordPress/gutenberg#80395)" (WordPress/gutenberg#82355)
- UI: Remove ValidityIndicator outer margin (WordPress/gutenberg#82267)
- Span the writing flow focus capture elements over the canvas (WordPress/gutenberg#82354)
- Fields: Hide the slug field for posts without a permalink (WordPress/gutenberg#82341)
- Fix: Responsive horizontal orientation does not override a vertical layout. (WordPress/gutenberg#82364)
- View Config: Move the table column style descriptions to the 7.2 compat layer (WordPress/gutenberg#82372)
- Block Library: Allow themes to override the padding added via background color (WordPress/gutenberg#82024)
- DataViews: Append an ellipsis to action labels that open a dialog (WordPress/gutenberg#81994)
- Pages: require authentication and a capability to render generated standalone pages (WordPress/gutenberg#82254)
- Build/Test Tools: Replace npx with npm exec --no (WordPress/gutenberg#82331)
- Navigation: restore flex-grow on container when accessible label is present (WordPress/gutenberg#78447)
- DOM Ready: Exclude src from published package files (WordPress/gutenberg#77302)
- UI: Support custom targets on Link and Menu.LinkItem (WordPress/gutenberg#82347)
- Escape HTML: Exclude src from published package files (WordPress/gutenberg#77304)
- keycodes: Exclude src from published files (WordPress/gutenberg#77306)
- Packages: Exclude src from block-serialization-default-parser published package (WordPress/gutenberg#77307)
- A11y: Exclude src from published package files (WordPress/gutenberg#77309)
- Packages: Exclude src from autop published package (WordPress/gutenberg#77283)
- Blob: Exclude src from published package files (WordPress/gutenberg#77289)
- Packages: Exclude src from deprecated published package (WordPress/gutenberg#77303)
- fix(list-reusable-blocks): exclude src from published files (WordPress/gutenberg#77305)
- Admin UI: Exclude src from published files and sideEffects (WordPress/gutenberg#77285)
- Standardize 'Back' and 'Go back' labels (WordPress/gutenberg#79211)
- Audio: Update autoplay help text for clarity (WordPress/gutenberg#69978)
- Theme JSON: Avoid rebuilding identical block schemas during sanitization (WordPress/gutenberg#82203)
- Docs: Improve setAttributes updater function wording (WordPress/gutenberg#82405)
- Query Loop: Rename the "Keyword" filter to "Search terms" and add help text (WordPress/gutenberg#82387)
- CI: add a per-workflow status check job and filter paths (WordPress/gutenberg#81015)
- ESLint: Thin use-recommended-components tests (WordPress/gutenberg#82407)
- UI: Fix enabled input placeholder contrast (WordPress/gutenberg#82304)
- Tab trap escape hatch: leave/enter the canvas with Escape/Enter (WordPress/gutenberg#82314)
- List: preserve client IDs on indent, just like outdent (WordPress/gutenberg#59216)
- Templates REST API: prevent fatal error when a null template reaches prepare_item_for_response (WordPress/gutenberg#82374)
- Editor: Refactor the View menu to use the Menu component (WordPress/gutenberg#82321)
- CSS Styling: Cleanup focus outline override for grid component (WordPress/gutenberg#82337)
- E2E: Run the site editor suite against the extensible site editor too (WordPress/gutenberg#82117)
- Fields: Remove unused CSS rule from slug field control (WordPress/gutenberg#77961)
- Fix: Footnote IDs can start with a digit and break CSS selectors (WordPress/gutenberg#82398)
- feat: Introduce 'Add Media' in the block controls for media-text block (WordPress/gutenberg#82420)
- fix: Audio element to have it's own name (WordPress/gutenberg#82389)
- Docs: Update Playground CLI wording (WordPress/gutenberg#77579)
- Upgrade React 19 to 19.2.8, read version from package.json (WordPress/gutenberg#82439)
- Tab Panel: Show focus with outline instead of legacy box-shadow ring (WordPress/gutenberg#82421)
- Editor: Fix disabled and link items of the more menu adapter (WordPress/gutenberg#82428)
- UI: Fix Menu.LinkItem target detection (WordPress/gutenberg#82442)
- SearchableSelect: Add form primitive to @wordpress/ui (WordPress/gutenberg#80961)
- Validated form controls: Use design token for invalid focus rings (WordPress/gutenberg#82410)
- feat: Update layout icons (WordPress/gutenberg#82025)
- Widgets: Replace {TODO} placeholder with PR number in changelog entries (WordPress/gutenberg#82450)
- UI: Remove ESLint ref suppressions and refactor AlertDialog state (WordPress/gutenberg#82131)
- Menu: Align selection indicators and prefix icons with item labels (WordPress/gutenberg#82346)
- ToggleGroupControl: Honor the root disabled prop (WordPress/gutenberg#82259)
- Block Library: Remove the form blocks experiment (WordPress/gutenberg#82451)
- List: indent and outdent multi-selected items with Tab (WordPress/gutenberg#82411)
- CodeRabbit: Only review on request, keep PR descriptions untouched (WordPress/gutenberg#82448)
- Privacy policy page badge: make it visible in Site Editor > Pages and Editor Inspector (WordPress/gutenberg#82422)
- Support `isAny` and `isNone` filter operators for numeric fields. (WordPress/gutenberg#77942)
- UI: Keep focus rings visible in overlay content (WordPress/gutenberg#82443)
- Menu: Correct alignment documentation and changelog (WordPress/gutenberg#82455)
- UI: Name unlabeled form primitive stories (WordPress/gutenberg#82311)
- UI: Re-read the native validity on blur in ControlWithError (WordPress/gutenberg#82376)
- Media Utils: Preserve arrays in multipart form data (WordPress/gutenberg#82353)
- fix: Remove stories from performance tests (WordPress/gutenberg#82459)
- Add the template e2e tests for the editor inspector consolidation experiment (WordPress/gutenberg#82394)
- UI: Fix Link target detection (WordPress/gutenberg#82447)
- Fix privacy policy page setting unit test on multisite (WordPress/gutenberg#82467)
- UI, DataViews: Give input and selection controls solid backgrounds (WordPress/gutenberg#82391)
- Fix LocationPicker popover alignment with InputGroup (WordPress/gutenberg#82090)
- List: indent and outdent a fully selected list item with Tab (WordPress/gutenberg#82460)
- UI: Fix Minimal Select popup width (WordPress/gutenberg#82461)
- Rich text: resolve owned event listeners once instead of per subscriber (WordPress/gutenberg#80605)
- UI: Keep borderless InputLayout chrome when disabled (WordPress/gutenberg#82468)
- Theme: Cache luminance for contrast checks (WordPress/gutenberg#82445)
- Add promptfoo for testing agent development setup and skills (WordPress/gutenberg#80812)
- wp-env: Fix Docker build errors with Debian Bullseye repositories (WordPress/gutenberg#82478)
- Query Loop: Fall back to `post` when the query has no `postType` (WordPress/gutenberg#82465)
- Block Supports: Bail early in state styles when a block has no style attribute (WordPress/gutenberg#81908)
- CSS Styling: Represent focus with outline for list view component (WordPress/gutenberg#82129)
- Icons: Remove the obsolete forced colors mode hack (WordPress/gutenberg#82481)
- Docs: Remove invalid `@return` tag from the `block_core_social_link_get_services` hook docblock (WordPress/gutenberg#82488)
- Site Editor: Add a root error boundary to prevent a blank screen (WordPress/gutenberg#82486)
- Writing Flow: Bail out of Enter handling when no block is selected (WordPress/gutenberg#82424)
- Docs: Remove the blank line between @PARAM and @return in test docblocks (WordPress/gutenberg#81907)
- List View: Disable block icon colors while the block is selected (WordPress/gutenberg#82498)
- Fix: Restore layout styles for block style variations (WordPress/gutenberg#82335)
- Post slug: prefer server sanitization in the editor (WordPress/gutenberg#78135)
- Media Modal Experiment: Allow filtering by attached to the post, or unattached (WordPress/gutenberg#81974)
- Media editor: Lock the editing tools while a save is running (WordPress/gutenberg#82417)
- DataViews: Restrict the isAll filter operator to array fields (WordPress/gutenberg#82463)
- Media Fields: Pass the field's disabled state to the textarea controls (WordPress/gutenberg#82516)
- Theme: Make chroma capacity caching deterministic (WordPress/gutenberg#82505)
- Global Styles: Remove the color randomizer experiment (WordPress/gutenberg#82452)
- DataViews: Fix Field.sort TypeScript type definition (WordPress/gutenberg#82162)
- Migrate __experimentalText and __experimentalHeading to @wordpress/ui Text in Inspector Popover Header (WordPress/gutenberg#77449)
- Migrate __experimentalText to @wordpress/ui Text in Block switcher bindings hint (WordPress/gutenberg#77366)
- UI: Add Radio form primitive (WordPress/gutenberg#82214)
- Migrate __experimentalText to @wordpress/ui Text in Allowed Blocks Modal (WordPress/gutenberg#78119)
- UI: Add CheckboxControl (WordPress/gutenberg#82213)
- Core Data: Scope revisionId to the entity it is provided for (WordPress/gutenberg#82517)
- Migrate __experimentalText to @wordpress/ui Text in Pattern Overrides Dropdown (WordPress/gutenberg#77492)
- ProgressBar: Respect reduced motion preferences (WordPress/gutenberg#82490)
- Theme: Clarify color seed and warning guarantees (WordPress/gutenberg#82526)
- Theme: Build default ramps before token artifacts (WordPress/gutenberg#82525)
- CodeRabbit: Disable the review status comment (WordPress/gutenberg#82534)
- Project Management: Restore CODEOWNERS exclusions for suppression lists (WordPress/gutenberg#82538)
- Editor: merge duplicate "Enhancements" changelog sections (WordPress/gutenberg#82533)
- UI: Validate compound component context (WordPress/gutenberg#82510)
- Docs: Document isolated worktree setup (WordPress/gutenberg#82524)
- DataForm: render untyped fields without an edit control that are read-only (WordPress/gutenberg#82514)
- API Fetch: Add unregister to remove a registered middleware (WordPress/gutenberg#82408)
- Editor: Show revision data in Post Title component (WordPress/gutenberg#82536)
- Components: Add compound component composition diagnostics (WordPress/gutenberg#82509)
- Fieldset: Fix gap token to match spec (WordPress/gutenberg#75479)
- Test: Migrate deterministic JSDOM tests and harden Vitest isolation (WordPress/gutenberg#82212)
- Release: Make npm publication verification resumable (WordPress/gutenberg#82089)
- Block Library: Use 'useEntityProp' in Site Title and Tagline blocks (WordPress/gutenberg#82518)
- Theme: Migrate Terrazzo modes to resolvers (WordPress/gutenberg#82537)
- Fix auto-capitalization after Enter on iOS Safari (WordPress/gutenberg#82475)
- Update navigation link block name, use a default variation for custom link (WordPress/gutenberg#82375)
- API Fetch: Expose defaultFetchHandler so overrides can restore it (WordPress/gutenberg#82553)
- Core Data: Return a stable record for equivalent `_fields` queries (WordPress/gutenberg#82552)
- API Fetch: Rename defaultFetchHandler parameter to options (WordPress/gutenberg#82588)
- Fields: remove unused custom sort from the author fields (WordPress/gutenberg#82559)
- Fields: Declare the caption, alt text, description and ping status controls through the Field API (WordPress/gutenberg#82539)
- Docs: Align @PARAM tag columns in phpunit/ docblocks (WordPress/gutenberg#81904)
- Docs: Align @PARAM tag columns in lib/ docblocks (WordPress/gutenberg#81902)
- Docs: Align @PARAM tag columns in packages/ docblocks (WordPress/gutenberg#81903)
- Fix help paragraph color contrast ratio in the Connectors page. (WordPress/gutenberg#82378)
- DataViews: Declare transitive dependencies imported by the ./wp bundle (WordPress/gutenberg#81843)
- DataForm: Add a `showPlaceholderIfEmpty` option to the panel layout (WordPress/gutenberg#82527)
- Global Styles UI: migrate revisions Active Badge to UI Badge (WordPress/gutenberg#82560)
- UI: Put overflow on Select.List instead of a nested wrapper (WordPress/gutenberg#82470)
- Editor: migrate post-card-panel Badge to UI Badge (WordPress/gutenberg#82500)
- Fields: migrate page-title Badge to UI Badge (WordPress/gutenberg#82499)
- DataViews: Skip table columns for field ids without a field definition (WordPress/gutenberg#82601)
- View config: remove stale fields from the wp_template default view (WordPress/gutenberg#82602)
- Rich text: restore contenteditable on pointercancel (WordPress/gutenberg#82598)
- Components: Add an Emotion-to-SCSS migration skill and guide (WordPress/gutenberg#82567)

See #66070.
Built from https://develop.svn.wordpress.org/trunk@63538


git-svn-id: http://core.svn.wordpress.org/trunk@62714 1a063a9b-81f0-0310-95a4-ce76da25c4cd
ramonjd added a commit that referenced this pull request Oct 2, 2026
The panel layout refactor (#81840) replaced the ComplementaryArea wrapper
with a Tabs panel, so .media-editor__sidebar-panel no longer exists and
the rule that strips PanelBody's border and padding stopped matching.
Target .media-editor__panel, the class the pane now carries.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Media Anything that impacts the experience of managing media [Package] Base styles /packages/base-styles [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Media Editor Modal: Details section is missing entirely on mobile viewports

5 participants