Skip to content

Try adding a Grid block variation to Gallery - #81909

Merged
tellthemachines merged 16 commits into
trunkfrom
try/grid-gallery-variation
Aug 28, 2026
Merged

tellthemachines merged 16 commits into
trunkfrom
try/grid-gallery-variation

Conversation

@tellthemachines

@tellthemachines tellthemachines commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor

What?

Closes #42240.

Should also fix #55231!

Adds a Grid Gallery block variation so we can switch between the default custom, non-editable flex layout and a fully customisable grid layout.

The block variation comes with the handy inspector UI for switching between variations:

Screenshot 2026-08-24 at 6 21 35 pm

Layout properties set on the Gallery or its children are preserved across switches, so trying out a variation doesn't wipe out the previous state.

Testing Instructions

  1. Add a Gallery block with a bunch of images to a post.
  2. Try switching between variations
  3. In Grid variation, try changing size of children
  4. Add a Dynamic Gallery and check both layout variations (children shouldn't be editable on this one)
gallery_grids.mp4

Use of AI Tools

used codex/gpt 5.6 sol

@tellthemachines tellthemachines self-assigned this Aug 21, 2026
@tellthemachines tellthemachines added [Type] Enhancement A suggestion for improvement. [Block] Gallery Affects the Gallery Block - used to display groups of images labels Aug 21, 2026
@github-actions github-actions Bot added the [Package] Block library /packages/block-library label Aug 21, 2026
@github-actions

github-actions Bot commented Aug 21, 2026 •

Copy link
Copy Markdown

Size Change: +965 B (+0.01%)

Total Size: 7.92 MB

📦 View Changed
Filename Size Change
build/scripts/block-library/index.min.js 370 kB +278 B (+0.08%)
build/styles/block-library/editor-rtl.css 12.7 kB +24 B (+0.19%)
build/styles/block-library/editor-rtl.min.css 10.4 kB +30 B (+0.29%)
build/styles/block-library/editor.css 12.8 kB +23 B (+0.18%)
build/styles/block-library/editor.min.css 10.4 kB +29 B (+0.28%)
build/styles/block-library/gallery/editor-rtl.css 1.68 kB +36 B (+2.18%)
build/styles/block-library/gallery/editor-rtl.min.css 677 B +33 B (+5.12%) 🔍
build/styles/block-library/gallery/editor.css 1.68 kB +36 B (+2.18%)
build/styles/block-library/gallery/editor.min.css 680 B +33 B (+5.1%) 🔍
build/styles/block-library/gallery/style-rtl.css 3.02 kB +69 B (+2.33%)
build/styles/block-library/gallery/style-rtl.min.css 1.92 kB +53 B (+2.84%)
build/styles/block-library/gallery/style.css 3.02 kB +67 B (+2.27%)
build/styles/block-library/gallery/style.min.css 1.92 kB +51 B (+2.73%)
build/styles/block-library/style-rtl.css 22.5 kB +50 B (+0.22%)
build/styles/block-library/style-rtl.min.css 19 kB +48 B (+0.25%)
build/styles/block-library/style.css 22.6 kB +56 B (+0.25%)
build/styles/block-library/style.min.css 19 kB +49 B (+0.26%)

compressed-size-action

@github-actions

github-actions Bot commented Aug 21, 2026 •

Copy link
Copy Markdown

Flaky tests detected in 435d5a1.
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/33141875131
📝 Reported tests:

Should save the changes in /test/e2e/specs/editor/plugins/wp-editor-meta-box.spec.js, passed after 2 failed attempts.
TimeoutError: page.waitForFunction: Timeout 10000ms exceeded.
    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/plugins/wp-editor-meta-box.spec.js:34:14
TimeoutError: locator.click: Timeout 10000ms exceeded.
Call log:
  - waiting for locator('role=button[name="Visual"i]')

    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/plugins/wp-editor-meta-box.spec.js:33:55

@tellthemachines
tellthemachines force-pushed the try/grid-gallery-variation branch from 3adece0 to 0d12f4e Compare August 24, 2026 00:03

.wp-block-gallery.has-nested-images.is-layout-grid > .blocks-gallery-caption {
grid-column: 1 / -1;
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I kinda wish the caption was its own block, so we could place it wherever we like on the grid. I guess we could always do that later

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

THIS! Captions are one of the most tedious things to remove styling for (the blur, the shadow, the terrible placement) etc. Anything to make them easier to access would be a godsend

@tellthemachines
tellthemachines force-pushed the try/grid-gallery-variation branch from 85c4752 to c36682e Compare August 25, 2026 00:23
@tellthemachines
tellthemachines marked this pull request as ready for review August 25, 2026 00:23
@github-actions

github-actions Bot commented Aug 25, 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.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @intelligence, @filipanoscampos.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

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

Unlinked contributors: intelligence, filipanoscampos.

Co-authored-by: tellthemachines <isabel_brison@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: talldan <talldanwp@git.wordpress.org>
Co-authored-by: glendaviesnz <glendaviesnz@git.wordpress.org>
Co-authored-by: jhmonroe <jhmonroe@git.wordpress.org>
Co-authored-by: daviedR <daviedr@git.wordpress.org>
Co-authored-by: cbirdsong <cbirdsong@git.wordpress.org>

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

"allowJustification": false,
"allowVerticalAlignment": false,
"allowWrap": false,
"allowSizingOnChildren": true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It looks like this addition adds sizing controls for child image blocks in the flex layout, too. From memory I think we're largely hiding image size controls when the image appears in a Gallery block, so I wasn't sure if it's intentional to expose these controls for flex layouts or just for Grid layouts?

In a flex layout for the Gallery block, Fit and Grow do basically the same thing, so at first the controls mightn't seem all that useful. But it gets really interesting if you start playing around with giving individual images in a flex Gallery some percentage based widths. I.e. in this one I've given two blocks in a 3 column gallery a width of 5% and the blocks seems to rearrange pleasingly around it:

Image

So, whether or not this was intentional for the flex variation, I think this might just be a pretty cool feature on its own 😄

Are there any drawbacks in us exposing it here? It also allows users to effectively set an Image block in the flex gallery to span to full width of the container:

Image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Ok so this was accidental but it might actually be a good thing 😄

It could even be a workaround for #41781, though a bit dodgy because you'd have to calculate approximate percentages for each item. But flex-basis does override the width set in those pesky default responsive styles.

I guess the only drawback is that grow doesn't do anything, and for practical purposes there doesn't seem to be much difference between fixed and max either. Currently we don't have a way of providing only some of the options for this control. Perhaps that would be useful?

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.

Perhaps that would be useful?

It could be, but TBH so long as the default "Fit" and at least one of the other controls (in this case Max and Fixed) feel useful, I wouldn't worry about conditionally showing some of the child layout options here.

To the casual passer by, if you click on an inner Image block and go to the styles tab, you see a collapsed Width control that defaults to Fit, and you can select either Max or Fixed and play around with giving it a value, so to me this feels pretty good for now.

So long as we're happy with this feature (and funnily enough, I'm really liking this unexpected feature 😄!) I think we could go with this and see if anyone notices or finds it confusing that grow doesn't do anything and that Max and Fixed are effectively the same in this case.

What do you reckon?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, I'm happy to leave it as it is for now, and we can try hiding the non-working controls later if they're obviously causing confusion. This enables some neat layouts and doesn't break anything, so no reason to remove it.

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

This is testing really well for me so far, and code-wise I think it's nearly there. The main issues I ran into were styling surrounding the Image block captions and the Gallery's caption.

There's a potential bug here for the frecency calculation in the quick block inserter thingie, but I think that's likely something that should be fixed separately as it potentially affects other blocks (i.e. 3rd party blocks doing something similar to this one).

Overall, though, I reckon this is a really good addition, I like the approach of using block variations for it, the backwards compatibility, and using the variation toggles to switch between modes. I think this will give people lots more flexibility while it being an unobtrusive change for folks who like the Gallery block how it is.

// Styles for current version of gallery block.
.wp-block-gallery.has-nested-images {
// Styles for the current Gallery block's custom Flex layout.
.wp-block-gallery.has-nested-images:where(.is-layout-flex) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It looks like a bunch of the rules below apply to the image block to style the caption to appear over the image itself instead of beneath. Is it intentional to remove that for the Grid layout?

I.e. here's how individual image captions look in the flex gallery:

Image

But here's how they look in grid:

Image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

No that wasn't intentional. Lol I remembered to test Gallery captions but not Image captions 🤦
I'll fix it!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Ok so this is a fun one. The absolute positioning in the grid cell can mean the caption still sits outside the image if the image doesn't take up the full height of the cell, I think because its default self-align value in the grid is stretch (so theoretically it does take up the whole cell, even if visually it doesn't):

Screenshot 2026-08-27 at 2 37 18 pm

Setting align-self: start on each image fixes that, but it means the resizers no longer work as expected, because they now align with the image limits, instead of the grid cell's. So for an image taking up 2 rows, we have:

Before After
Screenshot 2026-08-27 at 2 50 03 pm Screenshot 2026-08-27 at 2 50 17 pm

I'm inclined to leave out the align-self: start because the problem can be solved with some curation of grid settings, aspect ratios and image spans, and it would be weird for the resizer to work less well here than on the Grid block.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I see what you mean!

I'm inclined to leave out the align-self: start because the problem can be solved with some curation of grid settings, aspect ratios and image spans

Agreed. IMO I'd leave this for now as folks can show / hide captions as they like while they're working on their gallery, and for the main case of a gallery comprised of similarly shaped images the captions sit well.

I.e. if I were working on a gallery like this, sure it would look a bit off, but I'd then just remove the caption.

Image

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This looks amazing to be able to have the caption BELOW the image (which is what most designers/architects/brands would want) — I have never had a client (or me) want the captions on top of the image with shadow and blur. Would be great to preserve this ability to choose placement of the caption for grid — whether thru a toggle or two buttons. This would save one of the major headaches about the normal grid block

It looks like a bunch of the rules below apply to the image block to style the caption to appear over the image itself instead of beneath. Is it intentional to remove that for the Grid layout?

I.e. here's how individual image captions look in the flex gallery:

Image But here's how they look in grid: Image

Comment on lines +183 to +189
useEffect( () => {
// Variations replace the whole layout object. Carry Grid-only settings
// across a layout type change so switching back restores them.
const previousLayout = previousLayoutRef.current;
previousLayoutRef.current = layout;

if (

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.

Just wondering how important it is for us to preserve the grid layout settings when a user switches between layouts. With the Group block, I think we toss everything out when we toggle through, so the user might be expecting to start from a fresh slate when they change layouts? It's also possible for a user to go back to a previous state via undo, so wasn't sure how much we need this logic.

(This part seems to be working well, though, so this is just a question and not a blocker!)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hmm, my reasoning was we preserve settings when going the other way, because the flex layout has a custom columns attribute that doesn't get wiped, so it felt asymmetrical to wipe out the grid config. I guess we could instead wipe the columns on switch?

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.

Hmm, my reasoning was we preserve settings when going the other way, because the flex layout has a custom columns attribute that doesn't get wiped, so it felt asymmetrical to wipe out the grid config.

Good point! I really don't mind here, it feels good it retaining the values, too, and extra values in the block's attributes don't cause any issues as far as I can tell.

One argument in favour of keeping the conversion you've got here is that conceptually switching between flex and grid for a Gallery block (to a user) isn't switching blocks at all, whereas we're really treating Row and Group as separate blocks in the UI.

So if you're happy with how it's working I'd say we can keep it, and always remove it in a follow-up if anyone finds it causes them friction when switching between layouts.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah I sort of like it because it feels lower stakes to try the other layout if you already configured your gallery.

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.

Same. It's grown on me! 😄

Comment on lines 169 to 173
await expect( blockListBox.getByRole( 'option' ) ).toHaveText( [
'Gallery',
'List',
'Gallery',
'Video',
] );

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'm curious about this change and why it was needed. It seems that adding the variation for the flex layout means that the frecency logic for the block inserter records the id of the block variation for the gallery block instead of just storing the block's name. I.e. the code around:

// If a block variation match is found change the name to be the same with the
// one that is used for block variations in the Inserter (`getItemFromVariation`).
const match = select( blocksStore ).getActiveBlockVariation(
blockName,
attributes
);
if ( match?.name ) {
id += '/' + match.name;
}

I think this goes beyond the scope of this PR, but once this one lands, we might want to double-check / update the logic of how the frecency stuff is calculated to make sure that gallery block insertions don't slip through the cracks. All that said, I actually kinda think it'd be good to explore removing the frecency logic altogether and just have a hard-coded list of blocks for the quick block inserter, but that's off topic here!

In any case, all this is to say that I wouldn't block on this, but it would be good to follow-up on after the fact if it seems like Gallery winds up dropping off the quick block inserter list when it's expected to be there. Overall I think this is very minor, because the Gallery block is still available via the full inserter, slash inserter, and by search.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I'm not sure if this counts but I'm still seeing Gallery in the slash inserter while testing this branch and the one built on it. Might be worth rechecking as a follow-up though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'm not sure if this counts but I'm still seeing Gallery in the slash inserter while testing this branch and the one built on it.

It's a bit hard to test in a testing environment because Gallery also shows up based on its position as one of the default registered blocks, so as a bug, it'd likely only show up on a long-lived site where you've been adding enough other blocks that Gallery gets bumped down the list.

Not a big issue at all, I mostly mentioned it because it's the kind of bug that if you notice well after the fact it'd be hard to figure out why it's happening. But so long as we've got our discussion here, we can find our way back 😄

(Not at all a blocker for this PR IMO)

}
}

:where(.wp-block-gallery.has-nested-images.is-layout-grid) > .blocks-gallery-caption {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is quite low specificity, I think? Is it worth increasing it just in case, or do you think it's very unlikely that folks will have rules that affect this?

Other than that, I notice that the gallery caption is left aligned and doesn't receive the same styles as the flex gallery. I.e. here's how the Grid gallery caption renders:

Image

But here's how the Flex gallery caption renders:

Image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hmm we should probably align it to match, yes.

Regarding specificity I tried to make it sensibly low given how many complaints we've historically had about overly specific block styles, and also reasoning that grid-column is kind of a specialised property (because it only does one thing, and only within the grid layout), so if anyone is setting it for the gallery caption in their theme CSS they probably don't want it overridden 😅

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

This is working pretty well.

My main observation is that it might be hard for users to understand the difference between this and the regular gallery, especially if the regular gallery has balanced rows already. I'm not sure if there's anything we can do to explain it better.

Comment thread packages/block-library/CHANGELOG.md Outdated
### Enhancements

- Columns: Add transforms between Columns and the Row variation that preserve column widths through flex child sizing controls.
- Gallery: Add an opt-in Grid layout while preserving the existing Flex layout for current galleries.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is missing a PR ref

},
{
name: 'gallery-grid',
title: __( 'Grid Gallery' ),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's a nit, but I think it could be called 'Gallery Grid', then when blocks and variations are presented in alphabetical order it's positioned next to the default Gallery.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah that makes sense!

const DEFAULT_BLOCK = { name: 'core/image' };
const EMPTY_ARRAY = [];

function isLayoutObject( value ) {

@talldan talldan Aug 27, 2026 •

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.

Nit: It could just be isObject, the function doesn't reason about the layout at all. I'm not sure if there are existing utils in the package for this, it could be moved to the package's utils folder perhaps.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The gallery block has a utils file, but this is just used locally so I'd keep it here for now. I'll rename it.

if ( hasPreservedGridSetting ) {
previousLayoutRef.current = nextLayout;
__unstableMarkNextChangeAsNotPersistent();
setAttributes( { layout: nextLayout } );

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I notice that undo doesn't really work correctly when toggling between the layouts. To repro toggle back and forth between regular and grid gallery a few times. Then undo the same number of times. When I try there's not the same number of undo steps.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I also notice that sometimes when I adjust layout settings, the post isn't being dirtied, not sure if it's related to these changes or something else (RTC)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Then undo the same number of times

Undo doesn't seem to do anything if you toggle between layouts a few times and return to whichever one was initially set. if you're on the other one, undo reverts to the initially set one and then does nothing else. Is that what you see?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

ok I pushed a fix for this. the non-dirty layout settings changes I couldn't repro, so maybe RTC related?

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.

Looks like it still might be a bit buggy here for the undo steps of the first time a user makes a switch between layouts? For me, if I insert a Gallery block, switch it to Grid and then back to Flex, without having made any other changes, then the undo step doesn't seem to be working correctly:

2026-08-28.11.38.00.mp4

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.

Another option if this useEffect is hard to get right, could be to leave this part of the logic to a follow-up, potentially 🤔

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This seems to be how undo behaviour works for all block attribute changes: if you just toggle something on and off, that doesn't create undo levels. To test, tried:

  • toggling the drop cap on a Paragraph on and off
  • toggling the a text color on a Heading on and off

In both cases, though the undo button becomes active, clicking it does nothing. I'm not sure if this is a bug or a feature 😅 but in any case I'll remove the previous fix so that Gallery is consistent with everything else in not creating undo levels for just toggling one thing on and off.

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.

Seems like a bug 😅

*/
export function isGalleryFlexLayout( layout ) {
const layoutType =
layout && typeof layout === 'object' && ! Array.isArray( layout )

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.

Could reuse the isLayoutObject util here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

ooh wait maybe i'll move it into the gallery utils then

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

thinking about it, shared.js is also kind of a utils file? maybe we should consolidate, but I'll move it here for now.

icon: gallery,
attributes: {
layout: {
type: 'flex',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'm curious if we'd ever consider adding the option to not allow the gallery to wrap? To me it seems like it might be a useful addition. Maybe it's a separate PR thing.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

That probably wouldn't work out with the gallery's custom flex styles, mostly because if you have more images than columns and set it to not wrap, the columns setting is now incorrect.

Plus, with grid layout you can set a number of columns and it won't wrap, so you can achieve the same effect 😄

name: 'gallery-grid',
title: __( 'Grid Gallery' ),
description: __( 'Arrange images in a grid.' ),
icon: grid,

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.

Not sure if we might want to consider using an icon that's different to the regular grid. In List View the two look the same:
Image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I mostly wanted it to be different from the regular gallery one so you can tell them apart in the block switcher. I'm not sure there are that many variations you can do on such a basic icon that would be meaningful 😅

In any case, and also to your initial comment about understanding the difference between grid and regular gallery, I expect this to be well received by more advanced users, theme authors, pattern builders and the like, who have been asking for more flexible gallery layouts for a while, but maybe of less impact to beginner users, and that's ok. I also think it's hard to explain the differences in words to someone who doesn't know CSS, and they'll probably only become clear in trying out both layouts.

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.

Funnily enough, I think the rename you've done to Gallery Grid instead of Grid Gallery helps a lot with the clarity here. Just having Gallery as the first word makes these feel more visually different to me, even if the icon is the same:

image

@tellthemachines
tellthemachines force-pushed the try/grid-gallery-variation branch from 26d431f to 1d1c38b Compare August 28, 2026 00:05
if ( hasPreservedGridSetting ) {
previousLayoutRef.current = nextLayout;
__unstableMarkNextChangeAsNotPersistent();
setAttributes( { layout: nextLayout } );

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.

Looks like it still might be a bit buggy here for the undo steps of the first time a user makes a switch between layouts? For me, if I insert a Gallery block, switch it to Grid and then back to Flex, without having made any other changes, then the undo step doesn't seem to be working correctly:

2026-08-28.11.38.00.mp4

Comment on lines +15 to +20
// Grid items stretch to fill their row's height by default, which leaves the
// figure taller than its image and detaches the absolutely positioned caption
// overlay from the image it should sit on top of.
// .wp-block-gallery.has-nested-images:where(.is-layout-grid) > figure.wp-block-image {
// align-self: start;
// }

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.

Did you mean to remove this rather than comment out?

// Styles for current version of gallery block.
.wp-block-gallery.has-nested-images {
// Styles for the current Gallery block's custom Flex layout.
.wp-block-gallery.has-nested-images:where(.is-layout-flex) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I see what you mean!

I'm inclined to leave out the align-self: start because the problem can be solved with some curation of grid settings, aspect ratios and image spans

Agreed. IMO I'd leave this for now as folks can show / hide captions as they like while they're working on their gallery, and for the main case of a gallery comprised of similarly shaped images the captions sit well.

I.e. if I were working on a gallery like this, sure it would look a bit off, but I'd then just remove the caption.

Image

Comment on lines +132 to +136
// Styles for overlaying image captions, shared between the Flex and Grid layouts.
.wp-block-gallery.has-nested-images {
figure.wp-block-image {
position: relative;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This PR's feeling pretty close to me now. One other thing, I think we can add a margin: 0 rule to this block for the .wp-block-image to zero out the margins, to fix the preview for the Dynamic Gallery variation in the editor? This is the issue:

Image

The reason being that in the editor, the Dynamic Gallery uses a block preview that adds a wrapper, so the layout's own descendent rule doesn't zero out the margins. But, I think we should be able to safely zero out the margin here (we already do for flex layouts elsewhere in the file, but this seems like possibly a natural place to zero out in all cases).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done!

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

Great work here, the latest updates cover everything I'd found! Re-testing:

✅ Dynamic Gallery in post editor with block level captions and block spacing (flex + grid layouts)
✅ Dynamic Gallery in site frontend editor with block level captions and block spacing (flex + grid layouts)
✅ Static Gallery in post editor with image-level captions and border styles (flex + grid layouts)
✅ Static Gallery in site frontend with image-level captions and border styles (flex + grid layouts)

All rendering nicely. Again, I think this is a great feature and nicely added: it's a subtle introduction to a powerful feature that's easy to access, while carefully preserving backwards compatibility for existing users and markup out in the wild.

LGTM! 🚀

@tellthemachines
tellthemachines merged commit a08fc3e into trunk Aug 28, 2026
46 of 47 checks passed
@tellthemachines
tellthemachines deleted the try/grid-gallery-variation branch August 28, 2026 05:08
@github-actions github-actions Bot added this to the Gutenberg 24.0 milestone Aug 28, 2026
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Block] Gallery Affects the Gallery Block - used to display groups of images [Package] Block library /packages/block-library [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Gallery: Allow gallery to have more columns than total images Gallery Block: Use CSS grid instead of flexbox to style the Gallery block

4 participants