Modal media editor now default; React 19 upgrade; responsive block styles
v23.3
“What’s new in Gutenberg…” posts (labeled with the #gutenberg-new tag) are posted following every Gutenberg release on a biweekly basis, showcasing new features included in each release. As a reminder, here’s an overview of different ways to keep up with Gutenberg and the Editor.

What’s New In
Gutenberg 23.3?
Gutenberg 23.3 has been released and is available for download!
This release ships the new modal-based media editor as the default cropping experience, advances the experimental customizable WordPress dashboard with five new widgets and significant layout polish, and upgrades the editor to React 19. Responsive styles now extend to individual block instances, and Notes blocks gain support for multiple discussion threads. Other changes include DataViews adopting @wordpress/theme design tokens, accessibility refinements across the Revisions interface, continued Real-time Collaboration reliability fixes, and broader preload coverage for faster post editor loads.
Table of contents
- Media editor modal becomes the default crop experience
- Experimental customizable WordPress dashboard
- Responsive styles for block instance
- Other Notable Highlights
- Changelog
- First-time contributors
- Contributors
Media editor modal becomes the default crop experience
The Media editor modal replaces the existing inline cropping tool in the Block Editor. The modal pattern keeps the familiar Crop button entry point, and brings freeform and aspect-ratio cropping, flip, fine-grained and snap rotation, and metadata editing into one dedicated workflow. (78653)
Experimental customizable WordPress dashboard
The experimental customizable WordPress dashboard — a widget-based surface available for testing behind an experimental flag in the Gutenberg plugin, allowing users to add, move, resize, and rearrange widgets. It introduces a complete set of widgets — Welcome, Quick Draft, Activity, Site Health, Site Preview, and more — that automatically adapt to different tile sizes. You can fully customize your dashboard by choosing which widgets to display, arranging the layout, adjusting the number of columns, and resizing each widget’s width and height. (77616)
This change is experimental; to give it a try, first go to WP-Admin > Gutenberg > Experiments and enable “New Dashboard experience”.
Responsive styles for block instance
Responsive styles for block instances (78384) building on 23.2’s responsive Global Styles, the Block Style States API extends to the per-instance level (76491). Block instance responsive styles include layout styles (78543) and an Inspector that shows only the relevant settings when a style state is selected. (78280) (78658, 78763, 78670, 78709)
Other Notable Highlights
- Real-time Collaboration improvements — Notes blocks support multiple threads (75147), better handling of oversized payloads (>16 MiB) and connection-loss states (77724), protocol-mismatch error handling (76991), fewer refresh storms when peers edit (78483), and a mobile fix for Edit/Join row actions in the post list (78597).
- DataViews adopts
@wordpress/themedesign tokens (75204) — the first significant in-codebase adoption of the design tokens package. A new “Introduction” Storybook page has been added for the tokens themselves (78449). - Accessibility wins — Image block gains a “Mark as decorative” toggle (78064); Revisions diff markers get higher-contrast stripes and scale with user text-size preferences (78473, 78273, 78393); Breadcrumbs block hides separators from screen readers (78524).
- Performance — Optimized block-supports CSS class rendering (78217), lazy-fetched user pattern categories (78568), shared window listeners across block instances (78310), shared MediaQueryList listener in useMediaQuery (78297), and broader preload coverage on edit-post load (78508, 78565).
- Components migrations — Continued migration of
__experimentalText,__experimentalHStack, and__experimentalVStackto their stable@wordpress/uicounterparts (78155); Tooltip migration progressed across block-editor, editor, and DataViews consumers (78411, 78466, 78470). - React 19 upgrade (61521) — Gutenberg is now built against React 19. Most code keeps working unchanged; plugin authors using removed legacy patterns (string refs, ReactDOM.render fallbacks, defaultProps on function components) should review React’s upgrade notes.
Changelog
Features
Post Editor
- Notes: Support multiple note threads per block. (75147)
Enhancements
Components
- DataViews: Adopt
@wordpress/themedesign tokens. (75204) - Draggable: Scope the clone’s fallback
z-indexto non-slot placements. (78354) - Navigation: Hard deprecate component. (78529)
- Overlays: Extend positioner slot pattern to Popover, Select, Autocomplete. (78168)
- Tabs, TabPanel: Align styles with wp-ui. (78418)
- Tooltip migration: Dataviews consumers (3/5). (78470)
- UI Button: Optimize overflow styles. (78300)
- UI Card: Full bleed as header hero image and content cover. (77856)
- Visually align
Noticefrom@wordpress/componentswithNoticefrom@wordpress/ui. (78231) - [components] Draggable: Migrate clone wrapper to wp compat overlay slot. (78183)
- [ui] Add internal wp compat overlay slot helper. (77851)
- [ui] Autocomplete: Default portal container to the wp compat overlay slot. (78375)
- [ui] Select: Default portal container to the wp compat overlay slot. (78372)
- [ui] Tooltip: Default portal container to the wp compat overlay slot. (78095)
design-system-mcp: Add server instructions for client usage guidance. (78186)design-system-mcp: Updateget_componentsto optionally support multiple names. (78185)
Block Editor
- Add support for layout responsive styles. (78543)
- Add support for pseudo states on single block instances. (76491)
- Block Inserter: Animate inserter button icon to signal open state. (78306)
- Hide block variation selector when style state is selected. (78658)
- Hide wrap by default in flex layout panel. (78269)
- Integrate slug-based color selection in color panel. (78048)
- Migrate pattern list item titles to
Textfrom@wordpress/ui. (77656) - Refactor: Add
extractPresetSlugas a generalized function to extract slugs. (78328) - Tooltip migration: Block-editor + block-directory consumers (1/5). (78411)
- Validate additional CSS on mount. (78682)
Block Library
- Block Style States: Show only supported inspector controls when selecting a style state. (78280)
- Columns: Remove redundant Skip option from layout picker. (78405)
- Hide Cover overlay controls for viewport states. (78763)
- Hide image dimension tools when a state is selected. (78670)
- Home Link: Add missing controls. (76672)
- Move Layout panel into Styles tab so it sits next to Dimensions. (77922)
- Responsive block instance styles. (78384)
Post Editor
- Collab Sidebar: Swap near-identical pink for red in avatar palette. (78299)
- Media Editor: Make the modal the default crop experience. (78653)
- RTC: Provide
PROTOCOL_MISMATCHerror handling. (76991) - Tooltip migration: Editor + edit-post + edit-site consumers (2/5). (78466)
Media
- Image cropper: Round zoom control values and display as percentages. (78757)
- Media Editor Modal: Update the rotation ruler to use a vertical line marker. (78704)
- Media Editor: Remove resize handles toggle from crop panel. (78758)
Dashboard
- Add custom widget dashboard resize handle styling. (78236)
- Dashboard Widgets: Adapt Quick Draft to its tile size with a recent drafts list. (78572)
- Widget dashboard: Skip tile hover elevation while resizing. (78234)
Font Library
- Clarify active variant state in Library tab. (78501)
Guidelines
- Refine access policy. (78296)
Connectors
- Restyle AI plugin callout with pastel background and beak. (78243)
Client Side Media
- Add dimension validation to sideload endpoint. (74903)
Data Layer
- Upgrade to React 19. (61521)
Bug Fixes
Components
@wordpress/ui: Compat overlay slot — viewport-sized containing block. (78441)- DataViews: Fix wrapper height resolution in flex layouts. (76945)
- DataViewsPicker Table: Fix first-click row selection. (78423)
- Fix FormTokenField validation preventing default behavior. (77181)
- IconButton: Fix
focusableWhenDisableddefault. (78526) - Popover: Don’t close when focus moves into the
@wordpress/uicompat overlay slot. (78407) - UI Button: Fix disabled cursor style. (78479)
- UI: Fix item popup typography. (78403)
- UI: Update Autocomplete clear disabled state. (78520)
useCopyToClipboard: Always callonSuccesscallback. (78387)useDialog: Handle Escape via ReactonKeyDownso cascade works through portals. (78433)
Block Library
- Block/Tabs: Fix editor dirty state on reload by removing unnecessary mount-time attribute init. (78339)
- Breadcrumbs block: Hide separator from screen readers. (78524)
- Fix ‘Invalid Date’ when clicking on Now in DateTimePicker on Date Block. (78284)
- Fix Tabs block losing added tabs when the editor is reopened. (78250)
- Fix: Discard unsaved HTML block changes on cancel. (78580)
- Image: Preserve width/height when converting Classic blocks to blocks. (78610)
- Navigation Link: Preserve custom labels during link updates. (77186)
- Navigation: Restore
block_core_navigation_submenu_render_submenu_icon()as deprecated shim. (78484) - Prevent images from appearing squished when only one dimension is set. (70575)
Post Editor
- Editor: Disable Visual Revisions when classic meta boxes are present. (78249)
- Editor: Fix Visual Revisions meta keys overlap. (78156)
- Editor: Use
_n()for revisions countaria-label. (78382) - Fix image upload crashes. (76707)
- Fix: Register user-defined taxonomies after user-defined post types. (78497)
- Fix: Show collaborators when the top toolbar is active. (78049)
- Global styles revisions: Ensure stylebook shows revision previews. (78490)
- Script Loader: Defer single-page admin init until DOMContentLoaded (Trac #65103). (78136)
- Upload Media: Render srcset on the front end for client-side-media uploads. (78359)
Block Editor
- Block Inspector: Hide Styles tab in preview mode. (78230)
- Block Toolbar: Prevent position shifts when using mover control. (77798)
- Fix inconsistencies in feature selector processing part 2: Pseudo block instances. (78326)
- Fix: Properly merge schema during
mergeSchemaspart ingetBlockContentSchemaFromTransforms. (70615) - List View: Place caret at end of block when selecting. (76797)
- Reset zoom level on component unmount. (69087)
- Unset grid span defaults with viewport states enabled. (78709)
Data Layer
- Core Data: Avoid duplicate ID-less entity permission requests. (78262)
- Fix: Disable collab sync when incompatible meta boxes are present. (78145)
- RTC: Fix cursor awareness / presence bug in nested rich text elements. (77673)
- RTC: Fix block refresh on every update when a peer edits within the code editor. (78483)
- RTC: Sync the content even if it’s a function. (76796)
- Real-time Collaboration: Use minimal save payload in
persistCRDTDoc. (77050)
Media
- Media Editor Modal: Only show the crop active state when using keyboard. (78266)
- Media Editor: Anchor cursorless zoom (slider/keyboard) at crop center. (78385)
- Media Editor: Enforce a minimum crop size in the image editor. (78268)
- Media Editor: Scope keyboard shortcuts to the modal. (78322)
- Media Fields: Fix filename truncation with Tooltip. (78453)
Collaboration
- RTC: Fix Edit/Join row action invisible on mobile in post list. (78597)
- RTC: Fix connection lost error modal when
/wp-json/wp-sync/v1/updatesexceeds 16 MiB limit. (77724)
Global Styles
- Fix block preview for responsive style states. (78538)
- Fix inconsistencies in feature selector processing part 1: Global styles. (78276)
Client Side Media
- Upload Media: Stop propagating
-scaledto sub-size filenames. (78038) - VIPS: Remove dead
batchResizeImageandvipsBatchResizeImageexports. (77975)
Paste
- Keep
<img>inside<a>when pasting plain-text HTML. (78015)
Testing
- Tests: Temporarily disable REST index output-format assertions pending Core fix. (78788)
Accessibility
Post Editor
- Image Editor: Focus return after closing image crop modal. (78711)
- Revisions: Increase diff marker stripe contrast to 75% primary color proportion. (78473)
- Revisions: Scale diff markers width with user text-size preference. (78273)
- Revisions: Use CSS outline as secondary non-color indicator for diff blocks. (78393)
Block Library
- Image block: Add “Mark as decorative” toggle for accessibility. (78064)
- Image: Fix missing
aria-labelon lightbox trigger button for single images. (78426)
Performance
- Block supports: Optimize custom CSS class rendering and parsing. (78217)
- Fix performance tests when running against old reference commit. (78288)
Post Editor
- Edit Post: Hoist
setupEditorto run beforeroot.render. (78581) - Edit Post: Consume preload cache before React mount. (78508)
- Editor / Block Editor: Lazy-fetch user pattern categories. (78568)
- Post Taxonomies: Drop redundant
per_page: -1from taxonomy queries. (78569)
Components
- Blocks: Share window listeners across instances (block props, rich text, …). (78310)
- Compose: Share a single change listener per
MediaQueryListinuseMediaQuery. (78297) - Compose: Simplify
subscribeDelegatedListenerroot detection. (78492)
Data Layer
- Core Data: Share parsed blocks cache between resolver and editor hook. (78026)
- Edit Post Preload: Cover remaining bound GET/OPTIONS requests on load. (78565)
Commands
- Core Abilities: Defer fetch until workflow palette opens. (78316)
Experiments
Dashboard
- Add
Quick draftwidget. (78408) - Add chrome UI tools to widgets. (78060)
- Add command palette commands. (78429)
- Add dashboard Activity widget. (78552)
- Add dashboard News widget. (78554)
- Add dashboard Site Health widget. (78555)
- Add dashboard Site Preview widget. (78556)
- Add elevation to widget actionable area. (78563)
- Add missing package file to the Site Preview widget. (78583)
- Add Welcome dashboard widget with adaptive layout and content. (78461)
- Add tooltip explaining disabled menu item. (78344)
- Contain widget body within its tile to prevent page overflow. (78627)
- Dashboard Widgets: Add
content-bleedpresentation variant. (78491) - Fix widget rendering on the masonry grid. (78645)
- Full-size widget inserter. (78390)
- Grid: Animate sibling tiles when layout reflows during drag or resize. (78395)
- Grid: Animate tile removals. (78542)
- Grid: Don’t allow resizing tile beyond min row height or column width. (78402)
- Grid: Hide resize handles and actions while a tile is resizing. (78391)
- Grid: Make resize overlay line solid. (78340)
- Grid: Resize widget and snap resize-placeholder. (78389)
- Grid: Tiled grid overlay. (78373)
- Increase widget spacing with
--wp-grid-gap. (78439) - Layered grid columns and visual layout model picker. (78364)
- Layout settings drawer with grid/masonry models. (78202)
- Migrate Layout settings drawer to
DataForm. (78336) - Mobile improvements. (78522)
- Per-instance widget settings drawer. (78465)
- Polish dashboard drag preview motion, elevation, and drop exit. (78348)
- Prevent pointer events in widget selection. (78681)
- Quick Draft widget: Layout, empty state, and style refinements. (78601)
- Refine widget actionable area toolbar styling. (78578)
- Restrict widget icons to just SVGs (no Dashicons). (78440)
- Round widget drag radius. (78292)
- Scale widget picker previews to fill their card. (78602)
- Seed default layout with bundled widget instances. (78622)
- Small changes to header. (78513)
- Tune default grid settings and starter layout. (78633)
- Use
PagehasPaddingprop for content spacing. (78469) - Use fully-specified
fast-deep-equalimport. (78660) - Welcome widget: Add a subtle shine to the version digits. (78626)
- Welcome widget: Draw the version number in the banner. (78611)
- Widget Types: Declarative presentation hint (full-bleed support). (78209)
- Widget Types: Generic attribute schemas. (78247)
- Widgets: Declare dependencies in a per-widget
package.json. (78463)
Media
- Extract media editor crop options hook. (78263)
- Extract media editor save hook. (78225)
- Media Editor Modal: Add custom datetime view for the sidebar to ensure minimal display of dates. (78265)
- Media Editor Modal: Fix unexpected tab stop on date fields in the Details sidebar. (78454)
- Media Editor Modal: Tighten labels for crop handles toggle. (78703)
- Media Editor Modal: Try placing the save and cancel buttons in the footer. (78708)
- Media Editor: Harden cropper math layer against non-finite inputs. (78321)
- Media Editor: Make zoom floor coverage-aware instead of fixed at 1x. (78222)
- Media editor: Show live crop dimensions during gesture. (78221)
- Refactor media editor crop state into composite reducer. (78480)
Block Library
- Classic Block: Use
get_post()inwp_declare_classic_block_necessary. (78613) - Media: Add undo snackbar for media editor image edits. (78425)
- Update Classic block deprecation notice. (78445)
Post Editor
- Add default term for taxonomies. (78233)
- Add experiment to show admin bar in Post and Site Editor. (77964)
- Media Editor Experiments: Tidy up by removing old pathways to the media editor experiment. (78489)
Block Editor
- Grid: Fix immutability lint warning for React hook. (78431)
- Grid: Visualize columns without outline. (78281)
Documentation
- Docs: Add Workspace Development guide. (78615)
- Docs: Update iframe editor migration guide for WordPress 7.0/7.1. (78401)
- Docs: Update media editor documentation. (78617)
- Theme: Add Tokens “Introduction” Storybook page. (78449)
- Theme: Move token structure descriptions into tokens document. (78438)
- UI Icon: Mark as recommended. (78365)
- Update plugin release documentation and edit for clarity. (78537)
- [ui] Trim verbose comments and prose around the compat overlay slot. (78356)
Code Quality
- Migrate
create-test-block.shto@wordpress/validation-toolsworkspace. (78665)
Components
- Add Badge text overflow end-to-end story. (78589)
- DataViews: Inline
z-indexvalues. (78315) - Menu: Reduce flaky Space key test scope. (78246)
- Modal: Inline header
z-index. (78362) - Move
@emotiondeps out of rootpackage.json. (78687) - RangeControl: Remove erroneous
iconprop from web types. (78444) - Remove deprecated
__experimentalApplyValueToSidesexport. (78528) - Routes: Enforce logical CSS properties in stylesheets. (78291)
- Storybook: Add text overflow end-to-end stories. (78256)
- Theme: Remove and prevent dependency grouping comments. (78573)
- Theme: Update color space registration to avoid side effects. (77653)
- UI Autocomplete: Fix prop types. (78450)
- UI Tabs: Recommend component for use. (78442)
- UI: Add Button variant states end-to-end story. (78634)
Post Editor
- Deduplicate
useGlobalStyleshook code. (78577) - Editor: Inline text editor toolbar
z-index. (78309) - REST: Guard
setAccessible()behind PHP < 8.1 in block-editor settings controller. (78478) - Use
WCIconalias for component Icon imports. (78366) - Use
WCTooltipalias for component Tooltip imports. (78396)
Block Editor
- Fix additional issues with block registration types. (78416)
- Migrate
__experimentalText,__experimentalHStack, and__experimentalVStacktoTextandStack. (78155) - Refactor:
useMemoon elements anduseCallbackis back onresetAllFilter. (78329) - Simplify component ESLint rules and extend to routes/widgets. (78519)
- Update the
BlockAttributetypedef to allow for multi-type attributes. (78517)
Guidelines
- Add
data-slugattribute to settings list items. (78676)
Block Library
- ESLint: Restrict deprecated
__nextHasNoMarginBottomprop. (78579)
Media
- Image editor: Remove unnecessary
__nextHasNoMarginBottomprop. (78530)
Plugin
- Connectors: Move from experimental to
wordpress-7.0compat. (78228)
Data Layer
- Make RTC-related APIs private. (78097)
Tools
- ESLint: Support private API component denylist. (78451)
Testing
- Automated Testing: Allow console logging in all
bin,scripts,toolsfiles. (78312) - Automated Testing: Enable concurrency for ESLint. (78360)
- Automated Testing: Fix and use built-in mechanism for flagging unused disables. (78313)
- Automated Testing: Skip ESLint for bundled library code via ignore patterns. (78314)
e2e-test-utils-playwright: Addsrcto published NPM files. (78847)- Fix flaky end-to-end test with DataView keyboard navigation. (78503)
- Fix flaky media upload save lock test. (78544)
- Fix flaky navigation frontend submenu end-to-end test. (78270)
- Fix flaky tests (
publish-panel.spec.jsfocus assertion before panel close completed). (77893) - Guard PHP unit test to avoid failures on old WP versions. (78547)
- Perf tests: Capture loading durations before
stopTracing(). (78294) - Perf tests: Disable Playwright tracing to remove snapshot overhead. (78295)
- Perf tests: Save Chromium traces as CI artifacts. (77974)
- Performance Tests: Log timestamps, optimize build overhead. (78237)
- Performance tests: Fix template click, delete pages at startup. (78193)
- Post Editor perf test: Remove unwanted actions from timed area. (78323)
- Preload: Backport user global styles entry for classic themes on WP 6.9. (78546)
- RTC: Add command to run in WebSockets mode. (78363)
- Tests: Add
timezone-mocktotest/unit/package.json. (78277) - Tests: Add post-editor preload spec. (78318)
- Tests: Preload spec — track query strings and use an existing draft. (78343)
- WP Editor Meta Box e2e: Wait for TinyMCE init. (78631)
Build Tooling
- (Release): Migrate
bin/plugininto@wordpress/release-toolsworkspace. (77695) - Add cherry-pick script and update release tools in
package.json. (78560) - Build Tools: Move build scripts to
@wordpress/build-scriptsworkspace package. (78509) - Build: Detect stale
node_modulesat build/dev time. (77995) - Build: Remove custom
job_statusoutput in favor of nativeresult. (78208) - Dashboard: Forbid non-module stylesheets in experimental, new widgets. (78496)
- Fix path for license type detection in
license.js. (78245) - Improve GHCR asset publishing and expand trigger events to include
pull_request. (78211) - Move PHP Sync Issue Generator file to
@wordpress/release-tools. (78456) - Publishing packages: Defer pushing tags until lerna publish succeeds. (78253)
- Refactor validation tools and update related scripts. (77522)
- Remove
commander.jsfile from the project. (78400) - Remove dependency used for counting available CPUs. (78593)
- Several improvements to the Dependabot configuration. (78536)
- Stylelint: Add logical properties exemptions. (78252)
- Update browserslist. (78840)
- Widgets: Add TypeScript project configuration. (78467)
wp-build: Replace getter-based exports with data properties. (78303)
First-time contributors
The following PRs were merged by first-time contributors:
- @allilevine: DataViews: Fix wrapper height resolution in flex layouts. (76945)
- @CookieDarb: Build: Remove custom
job_statusoutput in favor of nativeresult. (78208) - @danluu: RTC: Fix connection lost error modal when
/wp-json/wp-sync/v1/updatesexceeds 16 MiB limit. (77724) - @ecairol: Navigation: Restore
block_core_navigation_submenu_render_submenu_icon()as deprecated shim. (78484) - @Raxen001: Migrate
__experimentalText,__experimentalHStack, and__experimentalVStacktoTextandStack. (78155) - @rushikeshmore: Components: Fix FormTokenField validation preventing default behavior. (77181)
- @SteveJonesDev: Image block: Add “Mark as decorative” toggle for accessibility. (78064)
- @taipeicoder: RTC: Fix Edit/Join row action invisible on mobile in post list. (78597)
- @yyppsk: Navigation Link: Preserve custom labels during link updates. (77186)
Contributors
The following contributors merged PRs in this release:
@aagam-shah @adamsilverstein @aduth @alecgeatches @allilevine @andrewserong @chriszarate @chubes4 @ciampo @CookieDarb @danluu @DarkMatter-999 @desrosj @dhruvikpatel18 @dpmehta @ecairol @ellatrix @fushar @gziolo @himanshupathak95 @im3dabasia @Infinite-Null @ingeniumed @jameskoster @joshualip-plaudit @jsnajdr @juanfra @karmatosed @kushagra-goyal-14 @lschuyler @MaggieCabrera @Mamaduka @manzoorwanijk @Mayank-Tripathi32 @mirka @Mustafabharmal @ntsekouras @paulopmt1 @prasadkarmalkar @R1shabh-Gupta @ramonjd @Raxen001 @retrofox @rushikeshmore @scruffian @shrivastavanolo @simison @SteveJonesDev @t-hamano @taipeicoder @talldan @tellthemachines @tyxla @USERSATOSHI @westonruter @yuliyan @yyppsk
Fetched June 3, 2026

