diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml
index a79f2eee9315a5..b947f4ff08c602 100644
--- a/.github/workflows/performance.yml
+++ b/.github/workflows/performance.yml
@@ -47,9 +47,9 @@ jobs:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm -v
- - name: Compare performance with trunk
+ - name: Compare performance with base branch
if: github.event_name == 'pull_request'
- run: ./bin/plugin/cli.js perf $GITHUB_SHA trunk --tests-branch $GITHUB_SHA
+ run: ./bin/plugin/cli.js perf $GITHUB_SHA ${{ github.base_ref }} --tests-branch $GITHUB_SHA
- name: Compare performance with current WordPress Core and previous Gutenberg versions
if: github.event_name == 'release'
diff --git a/bin/api-docs/gen-components-docs/index.mjs b/bin/api-docs/gen-components-docs/index.mjs
new file mode 100644
index 00000000000000..e036995b4c4f74
--- /dev/null
+++ b/bin/api-docs/gen-components-docs/index.mjs
@@ -0,0 +1,112 @@
+/**
+ * External dependencies
+ */
+import docgen from 'react-docgen-typescript';
+import glob from 'glob';
+import fs from 'node:fs/promises';
+import path from 'path';
+
+/**
+ * Internal dependencies
+ */
+import { generateMarkdownDocs } from './markdown/index.mjs';
+
+const MANIFEST_GLOB = 'packages/components/src/**/docs-manifest.json';
+
+// For consistency, options should generally match the options used in Storybook.
+const OPTIONS = {
+ shouldExtractLiteralValuesFromEnum: true,
+ shouldRemoveUndefinedFromOptional: true,
+ propFilter: ( prop ) =>
+ prop.parent ? ! /node_modules/.test( prop.parent.fileName ) : true,
+ savePropValueAsString: true,
+};
+
+function getTypeDocsForComponent( {
+ manifestPath,
+ componentFilePath,
+ displayName,
+} ) {
+ const resolvedPath = path.resolve(
+ path.dirname( manifestPath ),
+ componentFilePath
+ );
+
+ const typeDocs = docgen.parse( resolvedPath, OPTIONS );
+
+ if ( typeDocs.length === 0 ) {
+ throw new Error(
+ `react-docgen-typescript could not generate any type docs from ${ resolvedPath }`
+ );
+ }
+
+ const matchingTypeDoc = typeDocs.find(
+ ( obj ) => obj.displayName === displayName
+ );
+
+ if ( typeof matchingTypeDoc === 'undefined' ) {
+ const unmatchedTypeDocs = typeDocs
+ .map( ( obj ) => `\`${ obj.displayName }\`` )
+ .join( ', ' );
+
+ throw new Error(
+ `react-docgen-typescript could not find type docs for ${ displayName } in ${ resolvedPath }. (Found ${ unmatchedTypeDocs })`
+ );
+ }
+
+ return matchingTypeDoc;
+}
+
+async function parseManifest( manifestPath ) {
+ try {
+ return JSON.parse( await fs.readFile( manifestPath, 'utf8' ) );
+ } catch ( e ) {
+ throw new Error(
+ `Error parsing docs manifest at ${ manifestPath }: ${ e.message }`
+ );
+ }
+}
+
+const manifests = glob.sync( MANIFEST_GLOB );
+
+await Promise.all(
+ manifests.map( async ( manifestPath ) => {
+ const manifest = await parseManifest( manifestPath );
+
+ const typeDocs = getTypeDocsForComponent( {
+ manifestPath,
+ componentFilePath: manifest.filePath,
+ displayName: manifest.displayName,
+ } );
+
+ const subcomponentTypeDocs = manifest.subcomponents?.map(
+ ( subcomponent ) => {
+ const docs = getTypeDocsForComponent( {
+ manifestPath,
+ componentFilePath: subcomponent.filePath,
+ displayName: subcomponent.displayName,
+ } );
+
+ if ( subcomponent.preferredDisplayName ) {
+ docs.displayName = subcomponent.preferredDisplayName;
+ }
+
+ return docs;
+ }
+ );
+ const docs = generateMarkdownDocs( { typeDocs, subcomponentTypeDocs } );
+ const outputFile = path.resolve(
+ path.dirname( manifestPath ),
+ './README.md'
+ );
+
+ try {
+ console.log( `Writing docs to ${ outputFile }` );
+ return fs.writeFile( outputFile, docs );
+ } catch ( e ) {
+ throw new Error(
+ `Error writing docs to ${ outputFile }: ${ e.message }`
+ );
+ }
+ } )
+);
diff --git a/bin/api-docs/gen-components-docs/markdown/index.mjs b/bin/api-docs/gen-components-docs/markdown/index.mjs
new file mode 100644
index 00000000000000..126fdf0057b6e5
--- /dev/null
+++ b/bin/api-docs/gen-components-docs/markdown/index.mjs
@@ -0,0 +1,40 @@
+/**
+ * External dependencies
+ */
+import json2md from 'json2md';
+
+/**
+ * Internal dependencies
+ */
+import { generateMarkdownPropsJson } from './props.mjs';
+
+export function generateMarkdownDocs( { typeDocs, subcomponentTypeDocs } ) {
+ const mainDocsJson = [
+ { h1: typeDocs.displayName },
+ '',
+ {
+ p: `
See the WordPress Storybook for more detailed, interactive documentation.
`,
+ },
+ typeDocs.description,
+ ...generateMarkdownPropsJson( typeDocs.props ),
+ ];
+
+ const subcomponentDocsJson = subcomponentTypeDocs?.length
+ ? [
+ { h2: 'Subcomponents' },
+ ...subcomponentTypeDocs.flatMap( ( subcomponentTypeDoc ) => [
+ {
+ h3: subcomponentTypeDoc.displayName,
+ },
+ subcomponentTypeDoc.description,
+ ...generateMarkdownPropsJson( subcomponentTypeDoc.props, {
+ headingLevel: 4,
+ } ),
+ ] ),
+ ]
+ : [];
+
+ return json2md(
+ [ ...mainDocsJson, ...subcomponentDocsJson ].filter( Boolean )
+ );
+}
diff --git a/bin/api-docs/gen-components-docs/markdown/props.mjs b/bin/api-docs/gen-components-docs/markdown/props.mjs
new file mode 100644
index 00000000000000..9d019c4240f008
--- /dev/null
+++ b/bin/api-docs/gen-components-docs/markdown/props.mjs
@@ -0,0 +1,51 @@
+function renderPropType( type ) {
+ const MAX_ENUM_VALUES = 10;
+
+ switch ( type.name ) {
+ case 'enum': {
+ const string = type.value
+ .slice( 0, MAX_ENUM_VALUES )
+ .map( ( { value } ) => value )
+ .join( ' | ' );
+
+ if ( type.value.length > MAX_ENUM_VALUES ) {
+ return `${ string } | ...`;
+ }
+ return string;
+ }
+ default:
+ return type.name;
+ }
+}
+
+export function generateMarkdownPropsJson( props, { headingLevel = 2 } = {} ) {
+ const sortedKeys = Object.keys( props ).sort( ( [ a ], [ b ] ) =>
+ a.localeCompare( b )
+ );
+
+ const propsJson = sortedKeys
+ .flatMap( ( key ) => {
+ const prop = props[ key ];
+
+ if ( prop.description?.includes( '@ignore' ) ) {
+ return null;
+ }
+
+ return [
+ { [ `h${ headingLevel + 1 }` ]: `\`${ key }\`` },
+ prop.description,
+ {
+ ul: [
+ `Type: \`${ renderPropType( prop.type ) }\``,
+ `Required: ${ prop.required ? 'Yes' : 'No' }`,
+ prop.defaultValue &&
+ `Default: \`${ prop.defaultValue.value }\``,
+ ].filter( Boolean ),
+ },
+ ];
+ } )
+ .filter( Boolean );
+
+ return [ { [ `h${ headingLevel }` ]: 'Props' }, ...propsJson ];
+}
+
diff --git a/changelog.txt b/changelog.txt
index b74a541e9cd1ea..77ee60f980c53a 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,239 @@
== Changelog ==
+= 19.5.0-rc.1 =
+
+
+## Changelog
+
+### Enhancements
+
+- Remove the verb Toggle from the Block Inserter button. ([65983](https://github.com/WordPress/gutenberg/pull/65983))
+- Update jsdom to 25.0.1. ([65879](https://github.com/WordPress/gutenberg/pull/65879))
+- Write/Design tool: Persist as a user preference. ([65945](https://github.com/WordPress/gutenberg/pull/65945))
+
+#### Zoom Out
+- Make zoom transition smoother. ([66017](https://github.com/WordPress/gutenberg/pull/66017))
+- Try zooming out when selecting the patterns tab in the inserter. ([65785](https://github.com/WordPress/gutenberg/pull/65785))
+- Update/replace edit button with enter on selection. ([65760](https://github.com/WordPress/gutenberg/pull/65760))
+
+#### Block Editor
+- Cleanup `AutoBlockPreview` render memoization of `BlockList`. ([66060](https://github.com/WordPress/gutenberg/pull/66060))
+- Use shallow memo for prioritized inserter blocks. ([65737](https://github.com/WordPress/gutenberg/pull/65737))
+
+#### Components
+- Add type tokens to storybook. ([65993](https://github.com/WordPress/gutenberg/pull/65993))
+- Storybook: Add stub doc on existing colors. ([65982](https://github.com/WordPress/gutenberg/pull/65982))
+
+#### Icons
+- Update "hidden" icon to be clearer, and invert logic as used in Data Views. ([65914](https://github.com/WordPress/gutenberg/pull/65914))
+- Update cloud upload and add cloud download icon. ([65906](https://github.com/WordPress/gutenberg/pull/65906))
+
+#### Global Styles
+- Improve navigation logic for revisions screen. ([65946](https://github.com/WordPress/gutenberg/pull/65946))
+
+#### Block bindings
+- Register bindings sources in widgets screens. ([65937](https://github.com/WordPress/gutenberg/pull/65937))
+
+#### Block Library
+- Cover Block: Refactor setting panel. ([65432](https://github.com/WordPress/gutenberg/pull/65432))
+
+
+### Bug Fixes
+
+- Add argument with post ID to the editor.savePost hook. ([66165](https://github.com/WordPress/gutenberg/pull/66165))
+- Backport from WordPress Core: improve performance of WP_Theme_JSON::Merge when merging background styles. ([66002](https://github.com/WordPress/gutenberg/pull/66002))
+- BlockCanvas: Fix the height prop and width of the block editor. ([65977](https://github.com/WordPress/gutenberg/pull/65977))
+- Correct capability for the Experiments page. ([66118](https://github.com/WordPress/gutenberg/pull/66118))
+- Fix rich text toolbar corners. ([66163](https://github.com/WordPress/gutenberg/pull/66163))
+- Fix: Add missing `post.slug` dependency to `useMemo`. ([66125](https://github.com/WordPress/gutenberg/pull/66125))
+- Fix: Return result from wp_register_block_template function. ([66102](https://github.com/WordPress/gutenberg/pull/66102))
+- List all active fonts in the typography section. ([65806](https://github.com/WordPress/gutenberg/pull/65806))
+
+#### Zoom Out
+- Exit zoom out when mode is changed. ([65975](https://github.com/WordPress/gutenberg/pull/65975))
+- Fix scaling issues. ([65998](https://github.com/WordPress/gutenberg/pull/65998))
+- Fix zoom reflow by replacing border with padding. ([66012](https://github.com/WordPress/gutenberg/pull/66012))
+- Focus first section root block if no selected block and tabbing to zoom out canvas. ([65843](https://github.com/WordPress/gutenberg/pull/65843))
+- Make zoom out vertical toolbar consistent. ([65627](https://github.com/WordPress/gutenberg/pull/65627))
+- Polish zoom out inserter. ([66110](https://github.com/WordPress/gutenberg/pull/66110))
+- Position scaled html within available container space. ([66034](https://github.com/WordPress/gutenberg/pull/66034))
+- Restores setting zoom out mode to useZoomOut hook. ([65999](https://github.com/WordPress/gutenberg/pull/65999))
+- Use consistent canvas frame spacing on device preview and zoom out. ([66018](https://github.com/WordPress/gutenberg/pull/66018))
+- Zoom layout shift: Second alternate fix. ([66041](https://github.com/WordPress/gutenberg/pull/66041))
+
+#### Block Library
+- Code block: Set LTR direction for RTL languages. ([65891](https://github.com/WordPress/gutenberg/pull/65891))
+- Fix duotone on parallax/repeated featured image cover blocks. ([65929](https://github.com/WordPress/gutenberg/pull/65929))
+- Fix: Embed Block: Match HTML in the editor and frontend. ([65478](https://github.com/WordPress/gutenberg/pull/65478))
+- Hide grid visualizer when grid is template locked or block editing mode is not default. ([66065](https://github.com/WordPress/gutenberg/pull/66065))
+- Post Content Block: Fix conflict between clearFix and focus ring in the editor. ([65364](https://github.com/WordPress/gutenberg/pull/65364))
+- Post Content: Fix display of block support styles. ([66003](https://github.com/WordPress/gutenberg/pull/66003))
+- Post Terms: Fix fatal error when 'get_the_term_list' returns 'WP_Error'. ([65848](https://github.com/WordPress/gutenberg/pull/65848))
+- Query Loop: Fix isControlAllowed and isTemplate combined logic. ([65984](https://github.com/WordPress/gutenberg/pull/65984))
+- Query Loop: Fix query type indicator. ([65877](https://github.com/WordPress/gutenberg/pull/65877))
+- Revert "Update z-index hierarchy". ([66074](https://github.com/WordPress/gutenberg/pull/66074))
+
+#### Block bindings
+- Accept client ID as parameter for `useBlockBindingsUtils`. ([65818](https://github.com/WordPress/gutenberg/pull/65818))
+- Allow label override when it is defined in client registration. ([66160](https://github.com/WordPress/gutenberg/pull/66160))
+- Bootstrap server sources earlier. ([66058](https://github.com/WordPress/gutenberg/pull/66058))
+- Fix: Don't render image when `src` attribute is empty. ([66004](https://github.com/WordPress/gutenberg/pull/66004))
+
+#### Global Styles
+- Always preview style variations using desktop device type. ([66023](https://github.com/WordPress/gutenberg/pull/66023))
+- Improve Navigator usage in typography panel. ([65942](https://github.com/WordPress/gutenberg/pull/65942))
+- Leave screen if current shadow entry gets deleted. ([65935](https://github.com/WordPress/gutenberg/pull/65935))
+- `PaletteEdit`: Dedupe palette element slugs. ([65772](https://github.com/WordPress/gutenberg/pull/65772))
+
+#### Block Editor
+- Fix DropZone class names on drop. ([65798](https://github.com/WordPress/gutenberg/pull/65798))
+- Fix padding appender hook. ([66143](https://github.com/WordPress/gutenberg/pull/66143))
+- Memoize pattern objects returned from getAllowedPatterns. ([66159](https://github.com/WordPress/gutenberg/pull/66159))
+
+#### Components
+- Fix : Secondary Button Transition. ([66045](https://github.com/WordPress/gutenberg/pull/66045))
+- Global Styles: Fix overflow caused by RangeControl tooltip. ([65875](https://github.com/WordPress/gutenberg/pull/65875))
+- ToggleGroupControl: Don't set value on focus after a reset. ([66151](https://github.com/WordPress/gutenberg/pull/66151))
+
+#### Interactivity API
+- Allow "default" suffix values. ([65815](https://github.com/WordPress/gutenberg/pull/65815))
+- Correctly handle lazily added, deeply nested properties with `deepMerge()`. ([65465](https://github.com/WordPress/gutenberg/pull/65465))
+- Improvements to the experimental full-page navigation. ([64067](https://github.com/WordPress/gutenberg/pull/64067))
+
+#### Site Editor
+- Fix site editor back button visual regressions. ([66166](https://github.com/WordPress/gutenberg/pull/66166))
+- Zoom Out: When double clicking a template while zoomed out , reset zoom level instead of showing dialog. ([65963](https://github.com/WordPress/gutenberg/pull/65963))
+
+#### CSS & Styling
+- Editor: Prevent wrapping text when showing icon labels in header. ([66038](https://github.com/WordPress/gutenberg/pull/66038))
+- Update z-index hierarchy. ([65626](https://github.com/WordPress/gutenberg/pull/65626))
+
+#### Data Views
+- Data Views list layout: Revise for improved text truncation. ([65376](https://github.com/WordPress/gutenberg/pull/65376))
+- Fix: Pattern rendering issue. ([66022](https://github.com/WordPress/gutenberg/pull/66022))
+
+#### Extensibility
+- Rename wp_register_block_template() to register_block_template(). ([65958](https://github.com/WordPress/gutenberg/pull/65958))
+
+#### Post Editor
+- Fix "typewriter" spacing style application. ([65885](https://github.com/WordPress/gutenberg/pull/65885))
+
+#### Synced Patterns
+- Pattern block: Ensure consistent editing of overrides in Write Mode. ([65408](https://github.com/WordPress/gutenberg/pull/65408))
+
+
+### Accessibility
+
+#### Post Editor
+- Fix meta boxes accessibility. ([65466](https://github.com/WordPress/gutenberg/pull/65466))
+- Fix navigate regions shortcuts on the back button WP logo slot. ([63611](https://github.com/WordPress/gutenberg/pull/63611))
+- Improve PostURL terminology and accessibility. ([63669](https://github.com/WordPress/gutenberg/pull/63669))
+- Match visible label of search inputs with their actual label. ([65458](https://github.com/WordPress/gutenberg/pull/65458))
+
+#### Components
+- Fixed : Modal dialog: Small improvement for elementShouldBeHidden. ([65941](https://github.com/WordPress/gutenberg/pull/65941))
+- ToggleGroupControl: Don't autoselect option on first group focus. ([65892](https://github.com/WordPress/gutenberg/pull/65892))
+- Tooltip: Add aria-describedby to anchor only if not redundant. ([65989](https://github.com/WordPress/gutenberg/pull/65989))
+
+#### Typography
+- Revert the "Manage fonts" button in Global Styles. ([66107](https://github.com/WordPress/gutenberg/pull/66107))
+
+
+### Performance
+
+#### Interactivity API
+- Leverage scheduler.yield in splitTask when available. ([66001](https://github.com/WordPress/gutenberg/pull/66001))
+
+
+### Documentation
+
+- Add heading level curation documentation. ([66076](https://github.com/WordPress/gutenberg/pull/66076))
+- Components: Set up README auto-generator. ([66035](https://github.com/WordPress/gutenberg/pull/66035))
+- Contrast notes: Update 4.6:1 note with further context. ([66168](https://github.com/WordPress/gutenberg/pull/66168))
+- Data-basics/4-building-a-create-page-form is ready now. ([66100](https://github.com/WordPress/gutenberg/pull/66100))
+- Docs: env: Expand examples of path syntax. ([65972](https://github.com/WordPress/gutenberg/pull/65972))
+- Updated several typos in client-assets.php file. ([66084](https://github.com/WordPress/gutenberg/pull/66084))
+- Use correct label in PHP Backport documentation. ([65908](https://github.com/WordPress/gutenberg/pull/65908))
+- add: Usage examples in core editor documentation. ([63768](https://github.com/WordPress/gutenberg/pull/63768))
+
+
+### Code Quality
+
+- .screen-reader-text CSS update for responsive-block-control style.scss. ([66145](https://github.com/WordPress/gutenberg/pull/66145))
+- Add missing CHANGELOG entries for #64067. ([66120](https://github.com/WordPress/gutenberg/pull/66120))
+- Button: Move to stricter lint rule for 40px size adherence. ([65840](https://github.com/WordPress/gutenberg/pull/65840))
+- Private APIs: Remove obsolete try/catch block. ([65898](https://github.com/WordPress/gutenberg/pull/65898))
+- Remove clip and -webkit-clip for block-library common.scss. ([66144](https://github.com/WordPress/gutenberg/pull/66144))
+- Remove unused select toolbar code. ([65834](https://github.com/WordPress/gutenberg/pull/65834))
+- Simplify logical expression in `InitPatternModal`. ([65922](https://github.com/WordPress/gutenberg/pull/65922))
+- Theme JSON: Remove redundant check and relocate $selectors assignment. ([66154](https://github.com/WordPress/gutenberg/pull/66154))
+- Type the router package. ([65854](https://github.com/WordPress/gutenberg/pull/65854))
+
+#### Global Styles
+- Edit Site: Avoid recomputing variations when no theme variations. ([66137](https://github.com/WordPress/gutenberg/pull/66137))
+- Edit Site: Remove redundant state in `StyleVariationsContainer`. ([66130](https://github.com/WordPress/gutenberg/pull/66130))
+
+#### Block Library
+- Post Terms: Remove unnecessary 'get_the_terms' call. ([65867](https://github.com/WordPress/gutenberg/pull/65867))
+- Query Loop Block: Remove redundant sticky state. ([66126](https://github.com/WordPress/gutenberg/pull/66126))
+
+#### Components
+- Clean up Tabs animation logic. ([65878](https://github.com/WordPress/gutenberg/pull/65878))
+- SearchControl: Deprecate onClose prop. ([65988](https://github.com/WordPress/gutenberg/pull/65988))
+
+#### Post Editor
+- Block Visibility: Add end-to-end test. ([65880](https://github.com/WordPress/gutenberg/pull/65880))
+
+#### Zoom Out
+- Fix components coding standards in Zoom Out Toolbar. ([65858](https://github.com/WordPress/gutenberg/pull/65858))
+
+
+### Tools
+
+#### Testing
+- Add an end-to-end test to check the interactions in write mode. ([65819](https://github.com/WordPress/gutenberg/pull/65819))
+- Composite: Add legacy unit tests to stable version. ([65952](https://github.com/WordPress/gutenberg/pull/65952))
+- Fix end-to-end Storybook configuration. ([66089](https://github.com/WordPress/gutenberg/pull/66089))
+- Tests: Add unit tests for image rendering. ([66010](https://github.com/WordPress/gutenberg/pull/66010))
+- Zoom out: End-to-end test - zoomed out mode zooms the canvas. ([65943](https://github.com/WordPress/gutenberg/pull/65943))
+- e2e: Fix Block Visibility test. ([65939](https://github.com/WordPress/gutenberg/pull/65939))
+
+#### Build Tooling
+- Dedupe npm packages. ([65913](https://github.com/WordPress/gutenberg/pull/65913))
+- Update and align babel dependencies version. ([65949](https://github.com/WordPress/gutenberg/pull/65949))
+- Update node-fetch to 2.7.0. ([65957](https://github.com/WordPress/gutenberg/pull/65957))
+- Update npm lockfile to version 3. ([65923](https://github.com/WordPress/gutenberg/pull/65923))
+- Upgrade browserslist and webcompat data packages. ([65926](https://github.com/WordPress/gutenberg/pull/65926))
+
+
+### Various
+
+- Consistent with block-development-examples data-basics-59c8f8. ([65995](https://github.com/WordPress/gutenberg/pull/65995))
+- Interactivity: Update preact packages. ([66008](https://github.com/WordPress/gutenberg/pull/66008))
+
+#### Patterns
+- Revert "Pattern block: Ensure consistent editing of overrides in Write Mode (#65408)". ([65953](https://github.com/WordPress/gutenberg/pull/65953))
+
+
+## First-time contributors
+
+The following PRs were merged by first-time contributors:
+
+- @AnmolVerma404: Fix: Return result from wp_register_block_template function. ([66102](https://github.com/WordPress/gutenberg/pull/66102))
+- @leemyongpakva: Consistent with block-development-examples data-basics-59c8f8. ([65995](https://github.com/WordPress/gutenberg/pull/65995))
+- @matt-west: Icons: Update cloud upload and add cloud download icon. ([65906](https://github.com/WordPress/gutenberg/pull/65906))
+- @mediaformat: .screen-reader-text CSS update for responsive-block-control style.scss. ([66145](https://github.com/WordPress/gutenberg/pull/66145))
+- @vk17-starlord: Fixed : Modal dialog: Small improvement for elementShouldBeHidden. ([65941](https://github.com/WordPress/gutenberg/pull/65941))
+- @Vrishabhsk: SearchControl: Deprecate onClose prop. ([65988](https://github.com/WordPress/gutenberg/pull/65988))
+
+
+## Contributors
+
+The following contributors merged PRs in this release:
+
+@aaronrobertshaw @afercia @ajlende @akasunil @Aljullu @andrewserong @AnmolVerma404 @ciampo @DaniGuardiola @dhruvang21 @draganescu @getdave @hbhalodia @jameskoster @jasmussen @jeryj @jsnajdr @leemyongpakva @MaggieCabrera @Mamaduka @matiasbenedetto @matt-west @mcsf @mediaformat @michalczaplinski @mikachan @mirka @ndiego @ntsekouras @ramonjd @renatho @richtabor @rmccue @sabernhardt @SantosGuillamot @shail-mehta @sirreal @stokesman @t-hamano @talldan @troychaplin @tyxla @up1512001 @vk17-starlord @Vrishabhsk @westonruter @youknowriad
+
+
= 19.4.0 =
## Changelog
diff --git a/lib/compat/wordpress-6.7/block-templates.php b/lib/compat/wordpress-6.7/block-templates.php
index 65d99ee978efed..acbd0b4981fe29 100644
--- a/lib/compat/wordpress-6.7/block-templates.php
+++ b/lib/compat/wordpress-6.7/block-templates.php
@@ -63,7 +63,7 @@ function unregister_block_template( $template_name ) {
*/
function wp_register_block_template( $template_name, $args = array() ) {
_deprecated_function( __FUNCTION__, 'Gutenberg 19.4.0', 'register_block_template' );
- register_block_template( $template_name, $args );
+ return register_block_template( $template_name, $args );
}
}
diff --git a/package-lock.json b/package-lock.json
index 14b24167aa0a7c..d49fb33f5c7078 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "gutenberg",
- "version": "19.4.0",
+ "version": "19.5.0-rc.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gutenberg",
- "version": "19.4.0",
+ "version": "19.5.0-rc.1",
"hasInstallScript": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -204,6 +204,7 @@
"jest-junit": "13.0.0",
"jest-message-util": "29.6.2",
"jest-watch-typeahead": "2.2.2",
+ "json2md": "2.0.1",
"lerna": "7.1.4",
"lint-staged": "10.0.2",
"make-dir": "3.0.0",
@@ -223,6 +224,7 @@
"progress": "2.0.3",
"puppeteer-core": "23.1.0",
"react": "18.3.1",
+ "react-docgen-typescript": "2.2.2",
"react-dom": "18.3.1",
"react-native": "0.73.3",
"react-native-url-polyfill": "1.1.2",
@@ -29765,6 +29767,13 @@
"node": ">=4"
}
},
+ "node_modules/indento": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz",
+ "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/infer-owner": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
@@ -32488,6 +32497,16 @@
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true
},
+ "node_modules/json2md": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.1.tgz",
+ "integrity": "sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "indento": "^1.1.13"
+ }
+ },
"node_modules/json2php": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.7.tgz",
@@ -43192,6 +43211,7 @@
"resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
"integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"typescript": ">= 4.3.x"
}
@@ -52670,7 +52690,7 @@
},
"packages/a11y": {
"name": "@wordpress/a11y",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -52684,7 +52704,7 @@
},
"packages/annotations": {
"name": "@wordpress/annotations",
- "version": "3.9.0",
+ "version": "3.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -52712,7 +52732,7 @@
},
"packages/api-fetch": {
"name": "@wordpress/api-fetch",
- "version": "7.9.0",
+ "version": "7.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -52726,7 +52746,7 @@
},
"packages/autop": {
"name": "@wordpress/autop",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -52738,7 +52758,7 @@
},
"packages/babel-plugin-import-jsx-pragma": {
"name": "@wordpress/babel-plugin-import-jsx-pragma",
- "version": "5.9.0",
+ "version": "5.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -52751,7 +52771,7 @@
},
"packages/babel-plugin-makepot": {
"name": "@wordpress/babel-plugin-makepot",
- "version": "6.9.0",
+ "version": "6.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -52769,7 +52789,7 @@
},
"packages/babel-preset-default": {
"name": "@wordpress/babel-preset-default",
- "version": "8.9.0",
+ "version": "8.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -54025,7 +54045,7 @@
},
"packages/base-styles": {
"name": "@wordpress/base-styles",
- "version": "5.9.0",
+ "version": "5.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -54035,7 +54055,7 @@
},
"packages/blob": {
"name": "@wordpress/blob",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -54047,7 +54067,7 @@
},
"packages/block-directory": {
"name": "@wordpress/block-directory",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54083,7 +54103,7 @@
},
"packages/block-editor": {
"name": "@wordpress/block-editor",
- "version": "14.4.0",
+ "version": "14.5.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54182,7 +54202,7 @@
},
"packages/block-library": {
"name": "@wordpress/block-library",
- "version": "9.9.0",
+ "version": "9.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54248,7 +54268,7 @@
},
"packages/block-serialization-default-parser": {
"name": "@wordpress/block-serialization-default-parser",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -54260,7 +54280,7 @@
},
"packages/block-serialization-spec-parser": {
"name": "@wordpress/block-serialization-spec-parser",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"pegjs": "^0.10.0",
@@ -54273,7 +54293,7 @@
},
"packages/blocks": {
"name": "@wordpress/blocks",
- "version": "13.9.0",
+ "version": "13.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54327,7 +54347,7 @@
},
"packages/browserslist-config": {
"name": "@wordpress/browserslist-config",
- "version": "6.9.0",
+ "version": "6.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -54337,7 +54357,7 @@
},
"packages/commands": {
"name": "@wordpress/commands",
- "version": "1.9.0",
+ "version": "1.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54510,7 +54530,7 @@
},
"packages/components": {
"name": "@wordpress/components",
- "version": "28.9.0",
+ "version": "28.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@ariakit/react": "^0.4.10",
@@ -54631,7 +54651,7 @@
},
"packages/compose": {
"name": "@wordpress/compose",
- "version": "7.9.0",
+ "version": "7.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54668,7 +54688,7 @@
},
"packages/core-commands": {
"name": "@wordpress/core-commands",
- "version": "1.9.0",
+ "version": "1.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54697,7 +54717,7 @@
},
"packages/core-data": {
"name": "@wordpress/core-data",
- "version": "7.9.0",
+ "version": "7.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54742,7 +54762,7 @@
},
"packages/create-block": {
"name": "@wordpress/create-block",
- "version": "4.52.0",
+ "version": "4.53.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -54770,7 +54790,7 @@
},
"packages/create-block-tutorial-template": {
"name": "@wordpress/create-block-tutorial-template",
- "version": "4.9.0",
+ "version": "4.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -54780,7 +54800,7 @@
},
"packages/customize-widgets": {
"name": "@wordpress/customize-widgets",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54819,7 +54839,7 @@
},
"packages/data": {
"name": "@wordpress/data",
- "version": "10.9.0",
+ "version": "10.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54848,7 +54868,7 @@
},
"packages/data-controls": {
"name": "@wordpress/data-controls",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54866,7 +54886,7 @@
},
"packages/dataviews": {
"name": "@wordpress/dataviews",
- "version": "4.5.0",
+ "version": "4.6.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@ariakit/react": "^0.4.10",
@@ -54923,7 +54943,7 @@
},
"packages/date": {
"name": "@wordpress/date",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54938,7 +54958,7 @@
},
"packages/dependency-extraction-webpack-plugin": {
"name": "@wordpress/dependency-extraction-webpack-plugin",
- "version": "6.9.0",
+ "version": "6.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -54954,7 +54974,7 @@
},
"packages/deprecated": {
"name": "@wordpress/deprecated",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -54967,7 +54987,7 @@
},
"packages/docgen": {
"name": "@wordpress/docgen",
- "version": "2.9.0",
+ "version": "2.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -54989,7 +55009,7 @@
},
"packages/dom": {
"name": "@wordpress/dom",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55002,7 +55022,7 @@
},
"packages/dom-ready": {
"name": "@wordpress/dom-ready",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -55014,7 +55034,7 @@
},
"packages/e2e-test-utils": {
"name": "@wordpress/e2e-test-utils",
- "version": "11.9.0",
+ "version": "11.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55037,7 +55057,7 @@
},
"packages/e2e-test-utils-playwright": {
"name": "@wordpress/e2e-test-utils-playwright",
- "version": "1.9.0",
+ "version": "1.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55065,7 +55085,7 @@
},
"packages/e2e-tests": {
"name": "@wordpress/e2e-tests",
- "version": "8.9.0",
+ "version": "8.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55105,7 +55125,7 @@
},
"packages/edit-post": {
"name": "@wordpress/edit-post",
- "version": "8.9.0",
+ "version": "8.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55152,7 +55172,7 @@
},
"packages/edit-site": {
"name": "@wordpress/edit-site",
- "version": "6.9.0",
+ "version": "6.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55214,7 +55234,7 @@
},
"packages/edit-widgets": {
"name": "@wordpress/edit-widgets",
- "version": "6.9.0",
+ "version": "6.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55258,7 +55278,7 @@
},
"packages/editor": {
"name": "@wordpress/editor",
- "version": "14.9.0",
+ "version": "14.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55320,7 +55340,7 @@
},
"packages/element": {
"name": "@wordpress/element",
- "version": "6.9.0",
+ "version": "6.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55339,7 +55359,7 @@
},
"packages/env": {
"name": "@wordpress/env",
- "version": "10.9.0",
+ "version": "10.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55481,7 +55501,7 @@
},
"packages/escape-html": {
"name": "@wordpress/escape-html",
- "version": "3.9.0",
+ "version": "3.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -55493,7 +55513,7 @@
},
"packages/eslint-plugin": {
"name": "@wordpress/eslint-plugin",
- "version": "21.2.0",
+ "version": "21.3.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55565,7 +55585,7 @@
},
"packages/fields": {
"name": "@wordpress/fields",
- "version": "0.1.0",
+ "version": "0.2.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55601,7 +55621,7 @@
},
"packages/format-library": {
"name": "@wordpress/format-library",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55629,7 +55649,7 @@
},
"packages/hooks": {
"name": "@wordpress/hooks",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -55641,7 +55661,7 @@
},
"packages/html-entities": {
"name": "@wordpress/html-entities",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -55653,7 +55673,7 @@
},
"packages/i18n": {
"name": "@wordpress/i18n",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55673,7 +55693,7 @@
},
"packages/icons": {
"name": "@wordpress/icons",
- "version": "10.9.0",
+ "version": "10.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55687,7 +55707,7 @@
},
"packages/interactivity": {
"name": "@wordpress/interactivity",
- "version": "6.9.0",
+ "version": "6.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@preact/signals": "^1.3.0",
@@ -55700,7 +55720,7 @@
},
"packages/interactivity-router": {
"name": "@wordpress/interactivity-router",
- "version": "2.9.0",
+ "version": "2.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@wordpress/a11y": "file:../a11y",
@@ -55713,7 +55733,7 @@
},
"packages/interface": {
"name": "@wordpress/interface",
- "version": "6.9.0",
+ "version": "7.0.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55742,7 +55762,7 @@
},
"packages/is-shallow-equal": {
"name": "@wordpress/is-shallow-equal",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -55754,7 +55774,7 @@
},
"packages/jest-console": {
"name": "@wordpress/jest-console",
- "version": "8.9.0",
+ "version": "8.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55771,7 +55791,7 @@
},
"packages/jest-preset-default": {
"name": "@wordpress/jest-preset-default",
- "version": "12.9.0",
+ "version": "12.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55789,7 +55809,7 @@
},
"packages/jest-puppeteer-axe": {
"name": "@wordpress/jest-puppeteer-axe",
- "version": "7.9.0",
+ "version": "7.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55812,7 +55832,7 @@
},
"packages/keyboard-shortcuts": {
"name": "@wordpress/keyboard-shortcuts",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55830,7 +55850,7 @@
},
"packages/keycodes": {
"name": "@wordpress/keycodes",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55843,7 +55863,7 @@
},
"packages/lazy-import": {
"name": "@wordpress/lazy-import",
- "version": "2.9.0",
+ "version": "2.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -55858,7 +55878,7 @@
},
"packages/list-reusable-blocks": {
"name": "@wordpress/list-reusable-blocks",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55881,7 +55901,7 @@
},
"packages/media-utils": {
"name": "@wordpress/media-utils",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55897,7 +55917,7 @@
},
"packages/notices": {
"name": "@wordpress/notices",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55914,7 +55934,7 @@
},
"packages/npm-package-json-lint-config": {
"name": "@wordpress/npm-package-json-lint-config",
- "version": "5.9.0",
+ "version": "5.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -55927,7 +55947,7 @@
},
"packages/nux": {
"name": "@wordpress/nux",
- "version": "9.9.0",
+ "version": "9.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55950,7 +55970,7 @@
},
"packages/patterns": {
"name": "@wordpress/patterns",
- "version": "2.9.0",
+ "version": "2.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -55980,7 +56000,7 @@
},
"packages/plugins": {
"name": "@wordpress/plugins",
- "version": "7.9.0",
+ "version": "7.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56003,7 +56023,7 @@
},
"packages/postcss-plugins-preset": {
"name": "@wordpress/postcss-plugins-preset",
- "version": "5.9.0",
+ "version": "5.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -56020,7 +56040,7 @@
},
"packages/postcss-themes": {
"name": "@wordpress/postcss-themes",
- "version": "6.9.0",
+ "version": "6.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -56033,7 +56053,7 @@
},
"packages/preferences": {
"name": "@wordpress/preferences",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56059,7 +56079,7 @@
},
"packages/preferences-persistence": {
"name": "@wordpress/preferences-persistence",
- "version": "2.9.0",
+ "version": "2.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56072,7 +56092,7 @@
},
"packages/prettier-config": {
"name": "@wordpress/prettier-config",
- "version": "4.9.0",
+ "version": "4.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -56085,7 +56105,7 @@
},
"packages/primitives": {
"name": "@wordpress/primitives",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56102,7 +56122,7 @@
},
"packages/priority-queue": {
"name": "@wordpress/priority-queue",
- "version": "3.9.0",
+ "version": "3.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56115,7 +56135,7 @@
},
"packages/private-apis": {
"name": "@wordpress/private-apis",
- "version": "1.9.0",
+ "version": "1.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -56127,7 +56147,7 @@
},
"packages/project-management-automation": {
"name": "@wordpress/project-management-automation",
- "version": "2.9.0",
+ "version": "2.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -56157,7 +56177,7 @@
},
"packages/react-i18n": {
"name": "@wordpress/react-i18n",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56313,7 +56333,7 @@
},
"packages/readable-js-assets-webpack-plugin": {
"name": "@wordpress/readable-js-assets-webpack-plugin",
- "version": "3.9.0",
+ "version": "3.10.0",
"dev": true,
"license": "GPL-2.0-or-later",
"engines": {
@@ -56326,7 +56346,7 @@
},
"packages/redux-routine": {
"name": "@wordpress/redux-routine",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56371,7 +56391,7 @@
},
"packages/reusable-blocks": {
"name": "@wordpress/reusable-blocks",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56398,7 +56418,7 @@
},
"packages/rich-text": {
"name": "@wordpress/rich-text",
- "version": "7.9.0",
+ "version": "7.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56422,7 +56442,7 @@
},
"packages/router": {
"name": "@wordpress/router",
- "version": "1.9.0",
+ "version": "1.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56441,7 +56461,7 @@
},
"packages/scripts": {
"name": "@wordpress/scripts",
- "version": "30.1.0",
+ "version": "30.2.0",
"dev": true,
"license": "GPL-2.0-or-later",
"dependencies": {
@@ -56479,6 +56499,7 @@
"jest-dev-server": "^9.0.1",
"jest-environment-jsdom": "^29.6.2",
"jest-environment-node": "^29.6.2",
+ "json2php": "^0.0.9",
"markdownlint-cli": "^0.31.1",
"merge-deep": "^3.0.3",
"mini-css-extract-plugin": "^2.5.1",
@@ -56704,6 +56725,13 @@
"dev": true,
"license": "MIT"
},
+ "packages/scripts/node_modules/json2php": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz",
+ "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==",
+ "dev": true,
+ "license": "BSD"
+ },
"packages/scripts/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -56897,7 +56925,7 @@
},
"packages/server-side-render": {
"name": "@wordpress/server-side-render",
- "version": "5.9.0",
+ "version": "5.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56923,7 +56951,7 @@
},
"packages/shortcode": {
"name": "@wordpress/shortcode",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56936,7 +56964,7 @@
},
"packages/style-engine": {
"name": "@wordpress/style-engine",
- "version": "2.9.0",
+ "version": "2.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -56949,7 +56977,7 @@
},
"packages/stylelint-config": {
"name": "@wordpress/stylelint-config",
- "version": "23.1.0",
+ "version": "23.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -57068,7 +57096,7 @@
},
"packages/sync": {
"name": "@wordpress/sync",
- "version": "1.9.0",
+ "version": "1.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -57089,7 +57117,7 @@
},
"packages/token-list": {
"name": "@wordpress/token-list",
- "version": "3.9.0",
+ "version": "3.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
@@ -57101,7 +57129,7 @@
},
"packages/undo-manager": {
"name": "@wordpress/undo-manager",
- "version": "1.9.0",
+ "version": "1.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -57114,7 +57142,7 @@
},
"packages/url": {
"name": "@wordpress/url",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -57127,7 +57155,7 @@
},
"packages/viewport": {
"name": "@wordpress/viewport",
- "version": "6.9.0",
+ "version": "6.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -57145,7 +57173,7 @@
},
"packages/warning": {
"name": "@wordpress/warning",
- "version": "3.9.0",
+ "version": "3.10.0",
"license": "GPL-2.0-or-later",
"engines": {
"node": ">=18.12.0",
@@ -57154,7 +57182,7 @@
},
"packages/widgets": {
"name": "@wordpress/widgets",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -57182,7 +57210,7 @@
},
"packages/wordcount": {
"name": "@wordpress/wordcount",
- "version": "4.9.0",
+ "version": "4.10.0",
"license": "GPL-2.0-or-later",
"dependencies": {
"@babel/runtime": "7.25.7"
diff --git a/package.json b/package.json
index 4c071bf746c159..8be1e9cbe3f3a0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gutenberg",
- "version": "19.4.0",
+ "version": "19.5.0-rc.1",
"private": true,
"description": "A new WordPress editor experience.",
"author": "The WordPress Contributors",
@@ -216,6 +216,7 @@
"jest-junit": "13.0.0",
"jest-message-util": "29.6.2",
"jest-watch-typeahead": "2.2.2",
+ "json2md": "2.0.1",
"lerna": "7.1.4",
"lint-staged": "10.0.2",
"make-dir": "3.0.0",
@@ -235,6 +236,7 @@
"progress": "2.0.3",
"puppeteer-core": "23.1.0",
"react": "18.3.1",
+ "react-docgen-typescript": "2.2.2",
"react-dom": "18.3.1",
"react-native": "0.73.3",
"react-native-url-polyfill": "1.1.2",
@@ -282,7 +284,8 @@
"distclean": "git clean --force -d -X",
"docs:api-ref": "node ./bin/api-docs/update-api-docs.js",
"docs:blocks": "node ./bin/api-docs/gen-block-lib-list.js",
- "docs:build": "npm-run-all docs:gen docs:blocks docs:api-ref docs:theme-ref",
+ "docs:build": "npm-run-all docs:components docs:gen docs:blocks docs:api-ref docs:theme-ref",
+ "docs:components": "node ./bin/api-docs/gen-components-docs/index.mjs",
"docs:gen": "node ./docs/tool/index.js",
"docs:theme-ref": "node ./bin/api-docs/gen-theme-reference.mjs",
"env": "wp-env",
@@ -305,7 +308,7 @@
"lint:pkg-json": "wp-scripts lint-pkg-json . 'packages/*/package.json'",
"native": "npm run --prefix packages/react-native-editor",
"other:changelog": "node ./bin/plugin/cli.js changelog",
- "other:check-licenses": "concurrently \"wp-scripts check-licenses --prod --gpl2 --ignore=@react-native-community/cli,@react-native-community/cli-platform-ios,@ampproject/remapping,human-signals,fb-watchman,bser,walker,chrome-launcher,lighthouse-logger,chromium-edge-launcher\" \"wp-scripts check-licenses --dev --ignore=jackspeak,path-scurry,package-json-from-dist\"",
+ "other:check-licenses": "concurrently \"wp-scripts check-licenses --prod --gpl2 --ignore=@react-native-community/cli,@react-native-community/cli-platform-ios,@ampproject/remapping,human-signals,fb-watchman,walker,chrome-launcher,lighthouse-logger,chromium-edge-launcher\" \"wp-scripts check-licenses --dev\"",
"preother:check-local-changes": "npm run docs:build",
"other:check-local-changes": "node ./bin/check-local-changes.js",
"other:cherry-pick": "node ./bin/cherry-pick.mjs",
diff --git a/packages/a11y/CHANGELOG.md b/packages/a11y/CHANGELOG.md
index 7da784818f78c8..08ac31b560ca87 100644
--- a/packages/a11y/CHANGELOG.md
+++ b/packages/a11y/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 4.10.0 (2024-10-16)
+
## 4.9.0 (2024-10-03)
## 4.8.0 (2024-09-19)
diff --git a/packages/a11y/package.json b/packages/a11y/package.json
index 761367e0bb6f45..230005587619f3 100644
--- a/packages/a11y/package.json
+++ b/packages/a11y/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/a11y",
- "version": "4.9.0",
+ "version": "4.10.0",
"description": "Accessibility (a11y) utilities for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/annotations/CHANGELOG.md b/packages/annotations/CHANGELOG.md
index caf30a752bb986..0f4795b11f109a 100644
--- a/packages/annotations/CHANGELOG.md
+++ b/packages/annotations/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 3.10.0 (2024-10-16)
+
## 3.9.0 (2024-10-03)
## 3.8.0 (2024-09-19)
diff --git a/packages/annotations/package.json b/packages/annotations/package.json
index 417d6b22c9fd86..259745c3fd82e2 100644
--- a/packages/annotations/package.json
+++ b/packages/annotations/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/annotations",
- "version": "3.9.0",
+ "version": "3.10.0",
"description": "Annotate content in the Gutenberg editor.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/api-fetch/CHANGELOG.md b/packages/api-fetch/CHANGELOG.md
index 151afa5206c35c..dc654223da9e9f 100644
--- a/packages/api-fetch/CHANGELOG.md
+++ b/packages/api-fetch/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 7.10.0 (2024-10-16)
+
## 7.9.0 (2024-10-03)
## 7.8.0 (2024-09-19)
diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json
index 13d23eaf496115..35fb2da0ec1aad 100644
--- a/packages/api-fetch/package.json
+++ b/packages/api-fetch/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/api-fetch",
- "version": "7.9.0",
+ "version": "7.10.0",
"description": "Utility to make WordPress REST API requests.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/autop/CHANGELOG.md b/packages/autop/CHANGELOG.md
index b56c0ada46a919..0a4a27cfbed808 100644
--- a/packages/autop/CHANGELOG.md
+++ b/packages/autop/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 4.10.0 (2024-10-16)
+
## 4.9.0 (2024-10-03)
## 4.8.0 (2024-09-19)
diff --git a/packages/autop/package.json b/packages/autop/package.json
index 7025f39b7b4a4c..9e2b61ad211cff 100644
--- a/packages/autop/package.json
+++ b/packages/autop/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/autop",
- "version": "4.9.0",
+ "version": "4.10.0",
"description": "WordPress's automatic paragraph functions `autop` and `removep`.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/babel-plugin-import-jsx-pragma/CHANGELOG.md b/packages/babel-plugin-import-jsx-pragma/CHANGELOG.md
index 8f15b849096f66..6935957675b432 100644
--- a/packages/babel-plugin-import-jsx-pragma/CHANGELOG.md
+++ b/packages/babel-plugin-import-jsx-pragma/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 5.10.0 (2024-10-16)
+
## 5.9.0 (2024-10-03)
## 5.8.0 (2024-09-19)
diff --git a/packages/babel-plugin-import-jsx-pragma/package.json b/packages/babel-plugin-import-jsx-pragma/package.json
index 82ced61c51e505..be9dbe0b0fe099 100644
--- a/packages/babel-plugin-import-jsx-pragma/package.json
+++ b/packages/babel-plugin-import-jsx-pragma/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/babel-plugin-import-jsx-pragma",
- "version": "5.9.0",
+ "version": "5.10.0",
"description": "Babel transform plugin for automatically injecting an import to be used as the pragma for the React JSX Transform plugin.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/babel-plugin-makepot/CHANGELOG.md b/packages/babel-plugin-makepot/CHANGELOG.md
index d307791a37424a..7fbb829d65a842 100644
--- a/packages/babel-plugin-makepot/CHANGELOG.md
+++ b/packages/babel-plugin-makepot/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 6.10.0 (2024-10-16)
+
## 6.9.0 (2024-10-03)
## 6.8.0 (2024-09-19)
diff --git a/packages/babel-plugin-makepot/package.json b/packages/babel-plugin-makepot/package.json
index 0877bc9bf10bd8..f88a5257b24c8f 100644
--- a/packages/babel-plugin-makepot/package.json
+++ b/packages/babel-plugin-makepot/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/babel-plugin-makepot",
- "version": "6.9.0",
+ "version": "6.10.0",
"description": "WordPress Babel internationalization (i18n) plugin.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/babel-preset-default/CHANGELOG.md b/packages/babel-preset-default/CHANGELOG.md
index 4237d8266db30c..c787e176059298 100644
--- a/packages/babel-preset-default/CHANGELOG.md
+++ b/packages/babel-preset-default/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 8.10.0 (2024-10-16)
+
### Enhancements
- The bundled `@babel/core` dependency has been updated from requiring `^7.16.0` to requiring `7.25.7` ([#36244](https://github.com/WordPress/gutenberg/pull/36244)).
diff --git a/packages/babel-preset-default/package.json b/packages/babel-preset-default/package.json
index a7eb893c75f016..fb8ae826e55978 100644
--- a/packages/babel-preset-default/package.json
+++ b/packages/babel-preset-default/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/babel-preset-default",
- "version": "8.9.0",
+ "version": "8.10.0",
"description": "Default Babel preset for WordPress development.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/base-styles/CHANGELOG.md b/packages/base-styles/CHANGELOG.md
index 8e92ddeece4d20..7535112c5a5c11 100644
--- a/packages/base-styles/CHANGELOG.md
+++ b/packages/base-styles/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 5.10.0 (2024-10-16)
+
## 5.9.0 (2024-10-03)
## 5.8.0 (2024-09-19)
diff --git a/packages/base-styles/_animations.scss b/packages/base-styles/_animations.scss
index e5bbf863757356..ae5de9a803008c 100644
--- a/packages/base-styles/_animations.scss
+++ b/packages/base-styles/_animations.scss
@@ -41,3 +41,8 @@
@warn "The `edit-post__fade-in-animation` mixin is deprecated. Use `animation__fade-in` instead.";
@include animation__fade-in($speed, $delay);
}
+
+@mixin editor-canvas-resize-animation($additional-transition-rules...) {
+ transition: all 400ms cubic-bezier(0.46, 0.03, 0.52, 0.96), $additional-transition-rules;
+ @include reduce-motion("transition");
+}
diff --git a/packages/base-styles/_colors.scss b/packages/base-styles/_colors.scss
index e65551e48c783c..bba7fd5c8ec141 100644
--- a/packages/base-styles/_colors.scss
+++ b/packages/base-styles/_colors.scss
@@ -8,7 +8,7 @@
$black: #000; // Use only when you truly need pure black. For UI, use $gray-900.
$gray-900: #1e1e1e;
$gray-800: #2f2f2f;
-$gray-700: #757575; // Meets 4.6:1 text contrast against white.
+$gray-700: #757575; // Meets 4.6:1 (4.5:1 is minimum) text contrast against white.
$gray-600: #949494; // Meets 3:1 UI or large text contrast against white.
$gray-400: #ccc;
$gray-300: #ddd; // Used for most borders.
diff --git a/packages/base-styles/package.json b/packages/base-styles/package.json
index b1da65dde47970..04d1bb5e2d41ba 100644
--- a/packages/base-styles/package.json
+++ b/packages/base-styles/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/base-styles",
- "version": "5.9.0",
+ "version": "5.10.0",
"description": "Base SCSS utilities and variables for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/blob/CHANGELOG.md b/packages/blob/CHANGELOG.md
index 1631fe7e0618b3..c168f9698e68bd 100644
--- a/packages/blob/CHANGELOG.md
+++ b/packages/blob/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 4.10.0 (2024-10-16)
+
## 4.9.0 (2024-10-03)
## 4.8.0 (2024-09-19)
diff --git a/packages/blob/package.json b/packages/blob/package.json
index 158eb69e270089..087343d1b33a04 100644
--- a/packages/blob/package.json
+++ b/packages/blob/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/blob",
- "version": "4.9.0",
+ "version": "4.10.0",
"description": "Blob utilities for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/block-directory/CHANGELOG.md b/packages/block-directory/CHANGELOG.md
index 2677ce827c1d69..7c2e092139b0ee 100644
--- a/packages/block-directory/CHANGELOG.md
+++ b/packages/block-directory/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 5.10.0 (2024-10-16)
+
## 5.9.0 (2024-10-03)
## 5.8.0 (2024-09-19)
diff --git a/packages/block-directory/package.json b/packages/block-directory/package.json
index 5d0d489fdeedb5..0b72a7ff2099a1 100644
--- a/packages/block-directory/package.json
+++ b/packages/block-directory/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-directory",
- "version": "5.9.0",
+ "version": "5.10.0",
"description": "Extend editor with block directory features to search, download and install blocks.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/block-editor/CHANGELOG.md b/packages/block-editor/CHANGELOG.md
index 5e3151285966e2..1483fe1da9d5c9 100644
--- a/packages/block-editor/CHANGELOG.md
+++ b/packages/block-editor/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 14.5.0 (2024-10-16)
+
## 14.4.0 (2024-10-03)
## 14.3.0 (2024-09-19)
diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json
index 32b8830fe48db0..92392b4d9563b2 100644
--- a/packages/block-editor/package.json
+++ b/packages/block-editor/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-editor",
- "version": "14.4.0",
+ "version": "14.5.0",
"description": "Generic block editor.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/block-editor/src/components/block-canvas/style.scss b/packages/block-editor/src/components/block-canvas/style.scss
index 9e924cb79bace1..0b37b4dd1447e2 100644
--- a/packages/block-editor/src/components/block-canvas/style.scss
+++ b/packages/block-editor/src/components/block-canvas/style.scss
@@ -4,4 +4,6 @@ iframe[name="editor-canvas"] {
height: 100%;
display: block;
background-color: transparent;
+ // Handles transitions between device previews
+ @include editor-canvas-resize-animation;
}
diff --git a/packages/block-editor/src/components/block-popover/index.js b/packages/block-editor/src/components/block-popover/index.js
index 637ab1cb8a53e0..f01c43ef26a71d 100644
--- a/packages/block-editor/src/components/block-popover/index.js
+++ b/packages/block-editor/src/components/block-popover/index.js
@@ -8,7 +8,6 @@ import clsx from 'clsx';
*/
import { useMergeRefs } from '@wordpress/compose';
import { Popover } from '@wordpress/components';
-import { useSelect } from '@wordpress/data';
import {
forwardRef,
useMemo,
@@ -22,8 +21,6 @@ import {
import { useBlockElement } from '../block-list/use-block-props/use-block-refs';
import usePopoverScroll from './use-popover-scroll';
import { rectUnion, getVisibleElementBounds } from '../../utils/dom';
-import { store as blockEditorStore } from '../../store';
-import { unlock } from '../../lock-unlock';
const MAX_POPOVER_RECOMPUTE_COUNTER = Number.MAX_SAFE_INTEGER;
@@ -77,38 +74,12 @@ function BlockPopover(
};
}, [ selectedElement ] );
- const { isZoomOut, parentSectionBlock, isSectionSelected } = useSelect(
- ( select ) => {
- const {
- isZoomOut: isZoomOutSelector,
- getSectionRootClientId,
- getParentSectionBlock,
- getBlockOrder,
- } = unlock( select( blockEditorStore ) );
-
- return {
- isZoomOut: isZoomOutSelector(),
- parentSectionBlock:
- getParentSectionBlock( clientId ) ?? clientId,
- isSectionSelected: getBlockOrder(
- getSectionRootClientId()
- ).includes( clientId ),
- };
- },
- [ clientId ]
- );
-
- // This element is used to position the zoom out view vertical toolbar
- // correctly, relative to the selected section.
- const parentSectionElement = useBlockElement( parentSectionBlock );
-
const popoverAnchor = useMemo( () => {
if (
// popoverDimensionsRecomputeCounter is by definition always equal or greater
// than 0. This check is only there to satisfy the correctness of the
// exhaustive-deps rule for the `useMemo` hook.
popoverDimensionsRecomputeCounter < 0 ||
- ( isZoomOut && ! parentSectionElement ) ||
! selectedElement ||
( bottomClientId && ! lastSelectedElement )
) {
@@ -117,35 +88,6 @@ function BlockPopover(
return {
getBoundingClientRect() {
- // The zoom out view has a vertical block toolbar that should always
- // be on the edge of the canvas, aligned to the top of the currently
- // selected section. This condition changes the anchor of the toolbar
- // to the section instead of the block to handle blocks that are
- // not full width and nested blocks to keep section height.
- if ( isZoomOut && isSectionSelected ) {
- // Compute the height based on the parent section of the
- // selected block, because the selected block may be
- // shorter than the section.
- const canvasElementRect = getVisibleElementBounds(
- __unstableContentRef.current
- );
- const parentSectionElementRect =
- getVisibleElementBounds( parentSectionElement );
- const anchorHeight =
- parentSectionElementRect.bottom -
- parentSectionElementRect.top;
-
- // Always use the width of the section root element to make sure
- // the toolbar is always on the edge of the canvas.
- const anchorWidth = canvasElementRect.width;
- return new window.DOMRectReadOnly(
- canvasElementRect.left,
- parentSectionElementRect.top,
- anchorWidth,
- anchorHeight
- );
- }
-
return lastSelectedElement
? rectUnion(
getVisibleElementBounds( selectedElement ),
@@ -157,13 +99,9 @@ function BlockPopover(
};
}, [
popoverDimensionsRecomputeCounter,
- isZoomOut,
- parentSectionElement,
selectedElement,
bottomClientId,
lastSelectedElement,
- isSectionSelected,
- __unstableContentRef,
] );
if ( ! selectedElement || ( bottomClientId && ! lastSelectedElement ) ) {
diff --git a/packages/block-editor/src/components/block-toolbar/index.js b/packages/block-editor/src/components/block-toolbar/index.js
index 2ac2cbb12ff352..d6a0985fef3610 100644
--- a/packages/block-editor/src/components/block-toolbar/index.js
+++ b/packages/block-editor/src/components/block-toolbar/index.js
@@ -16,7 +16,7 @@ import {
isReusableBlock,
isTemplatePart,
} from '@wordpress/blocks';
-import { ToolbarGroup } from '@wordpress/components';
+import { ToolbarGroup, ToolbarButton } from '@wordpress/components';
/**
* Internal dependencies
@@ -35,6 +35,7 @@ import { store as blockEditorStore } from '../../store';
import __unstableBlockNameContext from './block-name-context';
import NavigableToolbar from '../navigable-toolbar';
import { useHasBlockToolbar } from './use-has-block-toolbar';
+import Shuffle from './shuffle';
import { unlock } from '../../lock-unlock';
/**
@@ -67,6 +68,7 @@ export function PrivateBlockToolbar( {
isUsingBindings,
hasParentPattern,
hasContentOnlyLocking,
+ showShuffleButton,
} = useSelect( ( select ) => {
const {
getBlockName,
@@ -79,6 +81,7 @@ export function PrivateBlockToolbar( {
getBlockParentsByBlockName,
getTemplateLock,
getParentSectionBlock,
+ isZoomOutMode,
} = unlock( select( blockEditorStore ) );
const selectedBlockClientIds = getSelectedBlockClientIds();
const selectedBlockClientId = selectedBlockClientIds[ 0 ];
@@ -119,6 +122,7 @@ export function PrivateBlockToolbar( {
shouldShowVisualToolbar: isValid && isVisual,
toolbarKey: `${ selectedBlockClientId }${ parentClientId }`,
showParentSelector:
+ ! isZoomOutMode() &&
parentBlockType &&
getBlockEditingMode( parentClientId ) !== 'disabled' &&
hasBlockSupport(
@@ -130,6 +134,7 @@ export function PrivateBlockToolbar( {
isUsingBindings: _isUsingBindings,
hasParentPattern: _hasParentPattern,
hasContentOnlyLocking: _hasTemplateLock,
+ showShuffleButton: isZoomOutMode(),
};
}, [] );
@@ -179,7 +184,7 @@ export function PrivateBlockToolbar( {
key={ toolbarKey }
>
- { ! isMultiToolbar && isLargeViewport && (
+ { showParentSelector && ! isMultiToolbar && isLargeViewport && (
) }
{ ( shouldShowVisualToolbar || isMultiToolbar ) &&
@@ -205,6 +210,14 @@ export function PrivateBlockToolbar( {
{ ! hasContentOnlyLocking &&
shouldShowVisualToolbar &&
isMultiToolbar &&
}
+ { showShuffleButton && (
+
+
+
+ ) }
{ shouldShowVisualToolbar && (
<>
) }
- { showZoomOutToolbar && (
-
- ) }
-
{ /* Used for the inline rich text toolbar. Until this toolbar is combined into BlockToolbar, someone implementing their own BlockToolbar will also need to use this to see the image caption toolbar. */ }
{ ! isZoomOutMode && ! hasFixedToolbar && (
{
const {
getSettings,
- getInsertionPoint,
getBlockOrder,
getSelectionStart,
getSelectedBlockClientId,
getSectionRootClientId,
- isBlockInsertionPointVisible,
} = unlock( select( blockEditorStore ) );
const root = getSectionRootClientId();
return {
hasSelection: !! getSelectionStart().clientId,
- insertionPoint: getInsertionPoint(),
blockOrder: getBlockOrder( root ),
- blockInsertionPointVisible: isBlockInsertionPointVisible(),
sectionRootClientId: root,
setInserterIsOpened:
getSettings().__experimentalSetIsInserterOpened,
@@ -64,41 +58,32 @@ function ZoomOutModeInserters() {
return null;
}
- return [ undefined, ...blockOrder ].map( ( clientId, index ) => {
- const shouldRenderInsertionPoint =
- blockInsertionPointVisible && insertionPoint?.index === index;
+ const previousClientId = selectedBlockClientId;
+ const index = blockOrder.findIndex(
+ ( clientId ) => selectedBlockClientId === clientId
+ );
+ const nextClientId = blockOrder[ index + 1 ];
- const previousClientId = clientId;
- const nextClientId = blockOrder[ index ];
-
- const isSelected =
- selectedBlockClientId === previousClientId ||
- selectedBlockClientId === nextClientId;
-
- return (
-
- { ! shouldRenderInsertionPoint && isSelected && (
- {
- setInserterIsOpened( {
- rootClientId: sectionRootClientId,
- insertionIndex: index,
- tab: 'patterns',
- category: 'all',
- } );
- showInsertionPoint( sectionRootClientId, index, {
- operation: 'insert',
- } );
- } }
- />
- ) }
-
- );
- } );
+ return (
+
+ {
+ setInserterIsOpened( {
+ rootClientId: sectionRootClientId,
+ insertionIndex: index + 1,
+ tab: 'patterns',
+ category: 'all',
+ } );
+ showInsertionPoint( sectionRootClientId, index + 1, {
+ operation: 'insert',
+ } );
+ } }
+ />
+
+ );
}
export default ZoomOutModeInserters;
diff --git a/packages/block-editor/src/components/block-tools/zoom-out-popover.js b/packages/block-editor/src/components/block-tools/zoom-out-popover.js
deleted file mode 100644
index 7a5c2243cf0540..00000000000000
--- a/packages/block-editor/src/components/block-tools/zoom-out-popover.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * External dependencies
- */
-import clsx from 'clsx';
-/**
- * Internal dependencies
- */
-import { PrivateBlockPopover as BlockPopover } from '../block-popover';
-import useBlockToolbarPopoverProps from './use-block-toolbar-popover-props';
-import useSelectedBlockToolProps from './use-selected-block-tool-props';
-import ZoomOutToolbar from './zoom-out-toolbar';
-
-export default function ZoomOutPopover( { clientId, __unstableContentRef } ) {
- const { capturingClientId, isInsertionPointVisible, lastClientId } =
- useSelectedBlockToolProps( clientId );
-
- const popoverProps = useBlockToolbarPopoverProps( {
- contentElement: __unstableContentRef?.current,
- clientId,
- } );
-
- // Override some of the popover props for the zoom-out toolbar.
- const props = {
- ...popoverProps,
- placement: 'left-start',
- flip: false,
- shift: true,
- };
-
- return (
-
-
-
- );
-}
diff --git a/packages/block-editor/src/components/block-tools/zoom-out-toolbar.js b/packages/block-editor/src/components/block-tools/zoom-out-toolbar.js
deleted file mode 100644
index 2b5c6a3e3cea6e..00000000000000
--- a/packages/block-editor/src/components/block-tools/zoom-out-toolbar.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { dragHandle, trash } from '@wordpress/icons';
-import { Button, ToolbarButton } from '@wordpress/components';
-import { useSelect, useDispatch } from '@wordpress/data';
-import { store as blocksStore } from '@wordpress/blocks';
-import { __ } from '@wordpress/i18n';
-
-/**
- * Internal dependencies
- */
-import { store as blockEditorStore } from '../../store';
-import BlockDraggable from '../block-draggable';
-import BlockMover from '../block-mover';
-import Shuffle from '../block-toolbar/shuffle';
-import NavigableToolbar from '../navigable-toolbar';
-
-export default function ZoomOutToolbar( { clientId, __unstableContentRef } ) {
- const selected = useSelect(
- ( select ) => {
- const {
- getBlock,
- getNextBlockClientId,
- getPreviousBlockClientId,
- canRemoveBlock,
- canMoveBlock,
- getSettings,
- } = select( blockEditorStore );
-
- const { __experimentalSetIsInserterOpened: setIsInserterOpened } =
- getSettings();
-
- const { getBlockType } = select( blocksStore );
- const { name } = getBlock( clientId );
- const blockType = getBlockType( name );
- const isBlockTemplatePart =
- blockType?.name === 'core/template-part';
-
- let isNextBlockTemplatePart = false;
- const nextClientId = getNextBlockClientId();
- if ( nextClientId ) {
- const { name: nextName } = getBlock( nextClientId );
- const nextBlockType = getBlockType( nextName );
- isNextBlockTemplatePart =
- nextBlockType?.name === 'core/template-part';
- }
-
- let isPrevBlockTemplatePart = false;
- const prevClientId = getPreviousBlockClientId();
- if ( prevClientId ) {
- const { name: prevName } = getBlock( prevClientId );
- const prevBlockType = getBlockType( prevName );
- isPrevBlockTemplatePart =
- prevBlockType?.name === 'core/template-part';
- }
-
- return {
- isBlockTemplatePart,
- isNextBlockTemplatePart,
- isPrevBlockTemplatePart,
- canRemove: canRemoveBlock( clientId ),
- canMove: canMoveBlock( clientId ),
- setIsInserterOpened,
- };
- },
- [ clientId ]
- );
-
- const {
- isBlockTemplatePart,
- isNextBlockTemplatePart,
- isPrevBlockTemplatePart,
- canRemove,
- canMove,
- } = selected;
-
- const { removeBlock } = useDispatch( blockEditorStore );
-
- const showBlockDraggable = canMove && ! isBlockTemplatePart;
-
- return (
-
- { showBlockDraggable && (
-
- { ( draggableProps ) => (
-
- ) }
-
- ) }
- { ! isBlockTemplatePart && (
-
- ) }
- { canMove && canRemove && (
-
- ) }
-
- { canRemove && ! isBlockTemplatePart && (
- {
- removeBlock( clientId );
- __unstableContentRef.current?.focus();
- } }
- />
- ) }
-
- );
-}
diff --git a/packages/block-editor/src/components/iframe/content.scss b/packages/block-editor/src/components/iframe/content.scss
index 4a0e2d519f914b..1d01f84b5fd1fd 100644
--- a/packages/block-editor/src/components/iframe/content.scss
+++ b/packages/block-editor/src/components/iframe/content.scss
@@ -5,20 +5,16 @@
.block-editor-iframe__html {
transform-origin: top center;
- // 400ms should match the animation speed used in iframe/index.js
- $zoomOutAnimation: all 400ms cubic-bezier(0.46, 0.03, 0.52, 0.96);
-
// We don't want to animate the transform of the translateX because it is used
// to "center" the canvas. Leaving it on causes the canvas to slide around in
// odd ways.
- transition: $zoomOutAnimation, transform 0s scale 0s;
- @include reduce-motion("transition");
+ @include editor-canvas-resize-animation(transform 0s, scale 0s, padding 0s);
&.zoom-out-animation {
// we only want to animate the scaling when entering zoom out. When sidebars
// are toggled, the resizing of the iframe handles scaling the canvas as well,
// and the doubled animations cause very odd animations.
- transition: $zoomOutAnimation, transform 0s;
+ @include editor-canvas-resize-animation(transform 0s);
}
}
@@ -27,10 +23,10 @@
$frame-size: var(--wp-block-editor-iframe-zoom-out-frame-size);
$inner-height: var(--wp-block-editor-iframe-zoom-out-inner-height);
$content-height: var(--wp-block-editor-iframe-zoom-out-content-height);
- $outer-container-width: var(--wp-block-editor-iframe-zoom-out-outer-container-width);
+ $scale-container-width: var(--wp-block-editor-iframe-zoom-out-scale-container-width);
$container-width: var(--wp-block-editor-iframe-zoom-out-container-width, 100vw);
// Apply an X translation to center the scaled content within the available space.
- transform: translateX(calc(( #{$outer-container-width} - #{ $container-width }) / 2 / #{$scale}));
+ transform: translateX(calc((#{$scale-container-width} - #{$container-width}) / 2 / #{$scale}));
scale: #{$scale};
background-color: $gray-300;
diff --git a/packages/block-editor/src/components/iframe/index.js b/packages/block-editor/src/components/iframe/index.js
index b72d86ef8e0f8f..b14514f934fb3e 100644
--- a/packages/block-editor/src/components/iframe/index.js
+++ b/packages/block-editor/src/components/iframe/index.js
@@ -122,7 +122,7 @@ function Iframe( {
}, [] );
const { styles = '', scripts = '' } = resolvedAssets;
const [ iframeDocument, setIframeDocument ] = useState();
- const initialContainerWidth = useRef();
+ const initialContainerWidth = useRef( 0 );
const [ bodyClasses, setBodyClasses ] = useState( [] );
const clearerRef = useBlockSelectionClearer();
const [ before, writingFlowRef, after ] = useWritingFlow();
@@ -247,6 +247,11 @@ function Iframe( {
}
}, [ containerWidth, isZoomedOut ] );
+ const scaleContainerWidth = Math.max(
+ initialContainerWidth.current,
+ containerWidth
+ );
+
const disabledRef = useDisabled( { isDisabled: ! readonly } );
const bodyRef = useMergeRefs( [
useBubbleEvents( iframeDocument ),
@@ -299,17 +304,6 @@ function Iframe( {
useEffect( () => cleanup, [ cleanup ] );
const zoomOutAnimationClassnameRef = useRef( null );
- const handleZoomOutAnimationClassname = () => {
- clearTimeout( zoomOutAnimationClassnameRef.current );
-
- iframeDocument.documentElement.classList.add( 'zoom-out-animation' );
-
- zoomOutAnimationClassnameRef.current = setTimeout( () => {
- iframeDocument.documentElement.classList.remove(
- 'zoom-out-animation'
- );
- }, 400 ); // 400ms should match the animation speed used in components/iframe/content.scss
- };
// Toggle zoom out CSS Classes only when zoom out mode changes. We could add these into the useEffect
// that controls settings the CSS variables, but then we would need to do more work to ensure we're
@@ -320,6 +314,20 @@ function Iframe( {
return;
}
+ const handleZoomOutAnimationClassname = () => {
+ clearTimeout( zoomOutAnimationClassnameRef.current );
+
+ iframeDocument.documentElement.classList.add(
+ 'zoom-out-animation'
+ );
+
+ zoomOutAnimationClassnameRef.current = setTimeout( () => {
+ iframeDocument.documentElement.classList.remove(
+ 'zoom-out-animation'
+ );
+ }, 400 ); // 400ms should match the animation speed used in components/iframe/content.scss
+ };
+
handleZoomOutAnimationClassname();
iframeDocument.documentElement.classList.add( 'is-zoomed-out' );
@@ -349,10 +357,7 @@ function Iframe( {
scale === 'default'
? ( Math.min( containerWidth, maxWidth ) -
parseInt( frameSize ) * 2 ) /
- Math.max(
- initialContainerWidth.current,
- containerWidth
- )
+ scaleContainerWidth
: scale
);
@@ -374,15 +379,10 @@ function Iframe( {
`${ containerWidth }px`
);
iframeDocument.documentElement.style.setProperty(
- '--wp-block-editor-iframe-zoom-out-outer-container-width',
- `${ Math.max( initialContainerWidth.current, containerWidth ) }px`
+ '--wp-block-editor-iframe-zoom-out-scale-container-width',
+ `${ scaleContainerWidth }px`
);
- // iframeDocument.documentElement.style.setProperty(
- // '--wp-block-editor-iframe-zoom-out-outer-container-width',
- // `${ Math.max( initialContainerWidth.current, containerWidth ) }px`
- // );
-
return () => {
iframeDocument.documentElement.style.removeProperty(
'--wp-block-editor-iframe-zoom-out-scale'
@@ -400,7 +400,7 @@ function Iframe( {
'--wp-block-editor-iframe-zoom-out-container-width'
);
iframeDocument.documentElement.style.removeProperty(
- '--wp-block-editor-iframe-zoom-out-outer-container-width'
+ '--wp-block-editor-iframe-zoom-out-scale-container-width'
);
};
}, [
@@ -412,6 +412,7 @@ function Iframe( {
containerWidth,
windowInnerWidth,
isZoomedOut,
+ scaleContainerWidth,
] );
// Make sure to not render the before and after focusable div elements in view
@@ -501,12 +502,8 @@ function Iframe( {
isZoomedOut && 'is-zoomed-out'
) }
style={ {
- '--wp-block-editor-iframe-zoom-out-outer-container-width':
- isZoomedOut &&
- `${ Math.max(
- initialContainerWidth.current,
- containerWidth
- ) }px`,
+ '--wp-block-editor-iframe-zoom-out-scale-container-width':
+ isZoomedOut && `${ scaleContainerWidth }px`,
} }
>
{ iframe }
diff --git a/packages/block-editor/src/components/iframe/style.scss b/packages/block-editor/src/components/iframe/style.scss
index d05be2f3977b9f..5dd30c338057e2 100644
--- a/packages/block-editor/src/components/iframe/style.scss
+++ b/packages/block-editor/src/components/iframe/style.scss
@@ -9,8 +9,8 @@
}
.block-editor-iframe__scale-container.is-zoomed-out {
- $outer-container-width: var(--wp-block-editor-iframe-zoom-out-outer-container-width, 100vw);
- width: $outer-container-width;
+ $scale-container-width: var(--wp-block-editor-iframe-zoom-out-scale-container-width, 100vw);
+ width: $scale-container-width;
// Position the iframe so that it is always aligned with the right side so that
// the scrollbar is always visible on the right side
position: absolute;
diff --git a/packages/block-editor/src/store/private-selectors.js b/packages/block-editor/src/store/private-selectors.js
index c3228980310656..28e0c2bd47b0ca 100644
--- a/packages/block-editor/src/store/private-selectors.js
+++ b/packages/block-editor/src/store/private-selectors.js
@@ -17,6 +17,7 @@ import {
getClientIdsWithDescendants,
isNavigationMode,
getBlockRootClientId,
+ __unstableGetEditorMode,
} from './selectors';
import {
checkAllowListRecursive,
@@ -579,7 +580,7 @@ export const getBlockStyles = createSelector(
* @return {boolean} Is zoom out mode enabled.
*/
export function isZoomOutMode( state ) {
- return state.editorMode === 'zoom-out';
+ return __unstableGetEditorMode( state ) === 'zoom-out';
}
/**
diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js
index 2bfc52118d7ace..57e48442b1070b 100644
--- a/packages/block-editor/src/store/selectors.js
+++ b/packages/block-editor/src/store/selectors.js
@@ -1552,12 +1552,18 @@ export function getTemplateLock( state, rootClientId ) {
* @param {string|Object} blockNameOrType The block type object, e.g., the response
* from the block directory; or a string name of
* an installed block type, e.g.' core/paragraph'.
+ * @param {Set} checkedBlocks Set of block names that have already been checked.
*
* @return {boolean} Whether the given block type is allowed to be inserted.
*/
-const isBlockVisibleInTheInserter = ( state, blockNameOrType ) => {
+const isBlockVisibleInTheInserter = (
+ state,
+ blockNameOrType,
+ checkedBlocks = new Set()
+) => {
let blockType;
let blockName;
+
if ( blockNameOrType && 'object' === typeof blockNameOrType ) {
blockType = blockNameOrType;
blockName = blockNameOrType.name;
@@ -1565,6 +1571,7 @@ const isBlockVisibleInTheInserter = ( state, blockNameOrType ) => {
blockType = getBlockType( blockNameOrType );
blockName = blockNameOrType;
}
+
if ( ! blockType ) {
return false;
}
@@ -1580,11 +1587,22 @@ const isBlockVisibleInTheInserter = ( state, blockNameOrType ) => {
return false;
}
+ if ( checkedBlocks.has( blockName ) ) {
+ return false;
+ }
+
+ checkedBlocks.add( blockName );
+
// If parent blocks are not visible, child blocks should be hidden too.
if ( !! blockType.parent?.length ) {
return blockType.parent.some(
( name ) =>
- isBlockVisibleInTheInserter( state, name ) ||
+ ( blockName !== name &&
+ isBlockVisibleInTheInserter(
+ state,
+ name,
+ checkedBlocks
+ ) ) ||
// Exception for blocks with post-content parent,
// the root level is often consider as "core/post-content".
// This exception should only apply to the post editor ideally though.
diff --git a/packages/block-library/CHANGELOG.md b/packages/block-library/CHANGELOG.md
index 5ffd428b6dbdcf..b3788917cfbb95 100644
--- a/packages/block-library/CHANGELOG.md
+++ b/packages/block-library/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 9.10.0 (2024-10-16)
+
## 9.9.0 (2024-10-03)
## 9.8.0 (2024-09-19)
diff --git a/packages/block-library/package.json b/packages/block-library/package.json
index ba5283aee9da84..e9e76b8018e1d3 100644
--- a/packages/block-library/package.json
+++ b/packages/block-library/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-library",
- "version": "9.9.0",
+ "version": "9.10.0",
"description": "Block library for the WordPress editor.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/block-library/src/common.scss b/packages/block-library/src/common.scss
index c6327692ff02a3..15c2cd52b76aad 100644
--- a/packages/block-library/src/common.scss
+++ b/packages/block-library/src/common.scss
@@ -75,8 +75,6 @@
.screen-reader-text {
border: 0;
- clip: rect(1px, 1px, 1px, 1px);
- -webkit-clip-path: inset(50%);
clip-path: inset(50%);
height: 1px;
margin: -1px;
@@ -89,7 +87,6 @@
.screen-reader-text:focus {
background-color: $gray-300;
- clip: auto !important;
clip-path: none;
color: #444;
display: block;
diff --git a/packages/block-library/src/cover/style.scss b/packages/block-library/src/cover/style.scss
index 41b3acf1833fc0..b2c1fe88440235 100644
--- a/packages/block-library/src/cover/style.scss
+++ b/packages/block-library/src/cover/style.scss
@@ -100,6 +100,12 @@
color: inherit;
// Reset the fixed LTR direction at the root of the block in RTL languages.
/*rtl:raw: direction: rtl; */
+
+ // Reset the z-index to auto when the body has a modal open. So when the
+ // modal is inside the cover, it doesn't create a stacking context.
+ @at-root .has-modal-open & {
+ z-index: auto;
+ }
}
// Position: Top
diff --git a/packages/block-library/src/navigation/edit/index.js b/packages/block-library/src/navigation/edit/index.js
index ae7dd60bd0c5ba..d961f0d8fc93b9 100644
--- a/packages/block-library/src/navigation/edit/index.js
+++ b/packages/block-library/src/navigation/edit/index.js
@@ -73,6 +73,33 @@ import AccessibleDescription from './accessible-description';
import AccessibleMenuDescription from './accessible-menu-description';
import { unlock } from '../../lock-unlock';
+function useResponsiveMenu( navRef ) {
+ const [ isResponsiveMenuOpen, setResponsiveMenuVisibility ] =
+ useState( false );
+
+ useEffect( () => {
+ if ( ! navRef.current ) {
+ return;
+ }
+
+ const htmlElement = navRef.current.ownerDocument.documentElement;
+
+ // Add a `has-modal-open` class to the when the responsive
+ // menu is open. This reproduces the same behavior of the frontend.
+ if ( isResponsiveMenuOpen ) {
+ htmlElement.classList.add( 'has-modal-open' );
+ } else {
+ htmlElement.classList.remove( 'has-modal-open' );
+ }
+
+ return () => {
+ htmlElement?.classList.remove( 'has-modal-open' );
+ };
+ }, [ navRef, isResponsiveMenuOpen ] );
+
+ return [ isResponsiveMenuOpen, setResponsiveMenuVisibility ];
+}
+
function ColorTools( {
textColor,
setTextColor,
@@ -284,8 +311,10 @@ function Navigation( {
__unstableMarkNextChangeAsNotPersistent,
} = useDispatch( blockEditorStore );
+ const navRef = useRef();
+
const [ isResponsiveMenuOpen, setResponsiveMenuVisibility ] =
- useState( false );
+ useResponsiveMenu( navRef );
const [ overlayMenuPreview, setOverlayMenuPreview ] = useState( false );
@@ -367,8 +396,6 @@ function Navigation( {
__unstableMarkNextChangeAsNotPersistent,
] );
- const navRef = useRef();
-
// The standard HTML5 tag for the block wrapper.
const TagName = 'nav';
diff --git a/packages/block-library/src/navigation/editor.scss b/packages/block-library/src/navigation/editor.scss
index 1d37186e4ae98b..2f61a19be2b799 100644
--- a/packages/block-library/src/navigation/editor.scss
+++ b/packages/block-library/src/navigation/editor.scss
@@ -203,6 +203,7 @@ $color-control-label-height: 20px;
.wp-block-navigation .wp-block + .block-list-appender .block-editor-button-block-appender {
background-color: $gray-900;
color: $white;
+ height: $button-size-small;
// This needs specificity to override an inherited padding.
// That source padding in turn has high specificity to protect
diff --git a/packages/block-serialization-default-parser/CHANGELOG.md b/packages/block-serialization-default-parser/CHANGELOG.md
index 4104f5282ce3fb..9b0457333bd7d5 100644
--- a/packages/block-serialization-default-parser/CHANGELOG.md
+++ b/packages/block-serialization-default-parser/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 5.10.0 (2024-10-16)
+
## 5.9.0 (2024-10-03)
## 5.8.0 (2024-09-19)
diff --git a/packages/block-serialization-default-parser/package.json b/packages/block-serialization-default-parser/package.json
index c0cf1286835649..3b159dc3534888 100644
--- a/packages/block-serialization-default-parser/package.json
+++ b/packages/block-serialization-default-parser/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-serialization-default-parser",
- "version": "5.9.0",
+ "version": "5.10.0",
"description": "Block serialization specification parser for WordPress posts.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/block-serialization-spec-parser/CHANGELOG.md b/packages/block-serialization-spec-parser/CHANGELOG.md
index 87c683849585e0..40c93063cafbb7 100644
--- a/packages/block-serialization-spec-parser/CHANGELOG.md
+++ b/packages/block-serialization-spec-parser/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 5.10.0 (2024-10-16)
+
## 5.9.0 (2024-10-03)
## 5.8.0 (2024-09-19)
diff --git a/packages/block-serialization-spec-parser/package.json b/packages/block-serialization-spec-parser/package.json
index 38469f4d295298..49c3ed6c872c73 100644
--- a/packages/block-serialization-spec-parser/package.json
+++ b/packages/block-serialization-spec-parser/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-serialization-spec-parser",
- "version": "5.9.0",
+ "version": "5.10.0",
"description": "Block serialization specification parser for WordPress posts.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/blocks/CHANGELOG.md b/packages/blocks/CHANGELOG.md
index 7e163fec2ad161..73a700428674b2 100644
--- a/packages/blocks/CHANGELOG.md
+++ b/packages/blocks/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 13.10.0 (2024-10-16)
+
## 13.9.0 (2024-10-03)
## 13.8.0 (2024-09-19)
diff --git a/packages/blocks/package.json b/packages/blocks/package.json
index b66d06e7884c4f..9b7665ae9c87d6 100644
--- a/packages/blocks/package.json
+++ b/packages/blocks/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/blocks",
- "version": "13.9.0",
+ "version": "13.10.0",
"description": "Block API for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/blocks/src/api/registration.js b/packages/blocks/src/api/registration.js
index ae12b0cfbcf49d..ef1b6bd20a4cdd 100644
--- a/packages/blocks/src/api/registration.js
+++ b/packages/blocks/src/api/registration.js
@@ -232,6 +232,15 @@ export function registerBlockType( blockNameOrMetadata, settings ) {
return;
}
+ if ( 1 === settings?.parent?.length && name === settings.parent[ 0 ] ) {
+ warning(
+ 'Block "' +
+ name +
+ '" cannot be a parent of itself. Please remove the block name from the parent list.'
+ );
+ return;
+ }
+
if ( ! /^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test( name ) ) {
warning(
'Block names must contain a namespace prefix, include only lowercase alphanumeric characters or dashes, and start with a letter. Example: my-plugin/my-custom-block'
@@ -854,14 +863,6 @@ export const registerBlockBindingsSource = ( source ) => {
}
// Check the `label` property is correct.
- if ( label && existingSource?.label ) {
- warning(
- 'Block bindings "' +
- name +
- '" source label is already defined in the server.'
- );
- return;
- }
if ( ! label && ! existingSource?.label ) {
warning( 'Block bindings source must contain a label.' );
@@ -873,6 +874,10 @@ export const registerBlockBindingsSource = ( source ) => {
return;
}
+ if ( label && existingSource?.label && label !== existingSource?.label ) {
+ warning( 'Block bindings "' + name + '" source label was overriden.' );
+ }
+
// Check the `usesContext` property is correct.
if ( usesContext && ! Array.isArray( usesContext ) ) {
warning( 'Block bindings source usesContext must be an array.' );
diff --git a/packages/blocks/src/api/test/registration.js b/packages/blocks/src/api/test/registration.js
index 99ca6390d2d3b1..656e9471a541b8 100644
--- a/packages/blocks/src/api/test/registration.js
+++ b/packages/blocks/src/api/test/registration.js
@@ -104,6 +104,17 @@ describe( 'blocks', () => {
expect( block ).toBeUndefined();
} );
+ it( 'Should reject blocks with the block name itself as the only parent attribute value', () => {
+ const block = registerBlockType( 'core/test-block', {
+ ...defaultBlockSettings,
+ parent: [ 'core/test-block' ],
+ } );
+ expect( console ).toHaveWarnedWith(
+ 'Block "core/test-block" cannot be a parent of itself. Please remove the block name from the parent list.'
+ );
+ expect( block ).toBeUndefined();
+ } );
+
it( 'should reject blocks with uppercase characters', () => {
const block = registerBlockType( 'Core/Paragraph' );
expect( console ).toHaveWarnedWith(
@@ -1512,20 +1523,38 @@ describe( 'blocks', () => {
expect( getBlockBindingsSource( 'core/testing' ) ).toBeUndefined();
} );
- it( 'should not override label from the server', () => {
+ it( 'should override label from the server', () => {
// Simulate bootstrap source from the server.
registerBlockBindingsSource( {
- name: 'core/server',
+ name: 'core/testing',
label: 'Server label',
} );
// Override the source with a different label in the client.
registerBlockBindingsSource( {
- name: 'core/server',
+ name: 'core/testing',
label: 'Client label',
} );
expect( console ).toHaveWarnedWith(
- 'Block bindings "core/server" source label is already defined in the server.'
+ 'Block bindings "core/testing" source label was overriden.'
);
+ const source = getBlockBindingsSource( 'core/testing' );
+ unregisterBlockBindingsSource( 'core/testing' );
+ expect( source.label ).toEqual( 'Client label' );
+ } );
+
+ it( 'should keep label from the server when not defined in the client', () => {
+ // Simulate bootstrap source from the server.
+ registerBlockBindingsSource( {
+ name: 'core/testing',
+ label: 'Server label',
+ } );
+ // Override the source with a different label in the client.
+ registerBlockBindingsSource( {
+ name: 'core/testing',
+ } );
+ const source = getBlockBindingsSource( 'core/testing' );
+ unregisterBlockBindingsSource( 'core/testing' );
+ expect( source.label ).toEqual( 'Server label' );
} );
// Check the `usesContext` array is correct.
diff --git a/packages/blocks/src/store/reducer.js b/packages/blocks/src/store/reducer.js
index 16594a79271e6c..ac652b91890319 100644
--- a/packages/blocks/src/store/reducer.js
+++ b/packages/blocks/src/store/reducer.js
@@ -403,8 +403,7 @@ export function blockBindingsSources( state = {}, action ) {
return {
...state,
[ action.name ]: {
- // Don't override the label if it's already set.
- label: state[ action.name ]?.label || action.label,
+ label: action.label || state[ action.name ]?.label,
usesContext: getMergedUsesContext(
state[ action.name ]?.usesContext,
action.usesContext
diff --git a/packages/browserslist-config/CHANGELOG.md b/packages/browserslist-config/CHANGELOG.md
index 9dae2564c1a32e..8a2dc5d0ecc484 100644
--- a/packages/browserslist-config/CHANGELOG.md
+++ b/packages/browserslist-config/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 6.10.0 (2024-10-16)
+
## 6.9.0 (2024-10-03)
## 6.8.0 (2024-09-19)
diff --git a/packages/browserslist-config/package.json b/packages/browserslist-config/package.json
index 0c4d314203483b..8b19151e950475 100644
--- a/packages/browserslist-config/package.json
+++ b/packages/browserslist-config/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/browserslist-config",
- "version": "6.9.0",
+ "version": "6.10.0",
"description": "WordPress Browserslist shared configuration.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/commands/CHANGELOG.md b/packages/commands/CHANGELOG.md
index 2b268bd66f404e..c75dbab26739d8 100644
--- a/packages/commands/CHANGELOG.md
+++ b/packages/commands/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+## 1.10.0 (2024-10-16)
+
## 1.9.0 (2024-10-03)
## 1.8.0 (2024-09-19)
diff --git a/packages/commands/package.json b/packages/commands/package.json
index 8c4521da0a34b8..e1529416aa7df7 100644
--- a/packages/commands/package.json
+++ b/packages/commands/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/commands",
- "version": "1.9.0",
+ "version": "1.10.0",
"description": "Handles the commands menu.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 48113f874af3a2..d71f6ba7ce142f 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -4,12 +4,23 @@
### Bug Fixes
+- `ColorPalette`: prevent overflow of custom color button background ([#66152](https://github.com/WordPress/gutenberg/pull/66152)).
+
+### Enhancements
+
+- `PaletteEdit`: use `Item` internally instead of custom styles ([#66164](https://github.com/WordPress/gutenberg/pull/66164)).
+
+## 28.10.0 (2024-10-16)
+
+### Bug Fixes
+
- `Tooltip`: add `aria-describedby` to the anchor only if not redundant ([#65989](https://github.com/WordPress/gutenberg/pull/65989)).
- `PaletteEdit`: dedupe palette element slugs ([#65772](https://github.com/WordPress/gutenberg/pull/65772)).
- `RangeControl`: do not tooltip contents to the DOM when not shown ([#65875](https://github.com/WordPress/gutenberg/pull/65875)).
- `Tabs`: fix skipping indication animation glitch ([#65878](https://github.com/WordPress/gutenberg/pull/65878)).
- `ToggleGroupControl`: Don't autoselect option on first group focus ([#65892](https://github.com/WordPress/gutenberg/pull/65892)).
- `Button`: fix `box-shadow` transition for secondary variation ([#66045](https://github.com/WordPress/gutenberg/pull/66045)).
+- `ToggleGroupControl`: Don't set value on focus after a reset ([#66151](https://github.com/WordPress/gutenberg/pull/66151)).
### Deprecations
diff --git a/packages/components/package.json b/packages/components/package.json
index 0bc1c865299d2d..16c7b6c63c0b18 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/components",
- "version": "28.9.0",
+ "version": "28.10.0",
"description": "UI components for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/components/schemas/docs-manifest.json b/packages/components/schemas/docs-manifest.json
new file mode 100644
index 00000000000000..7d1e40f4f696d7
--- /dev/null
+++ b/packages/components/schemas/docs-manifest.json
@@ -0,0 +1,38 @@
+{
+ "title": "JSON schema for @wordpress/components README manifests",
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "displayName": {
+ "type": "string",
+ "description": "The `displayName` of the component, as determined in code. Used to identify the component in the specified source file."
+ },
+ "filePath": {
+ "type": "string",
+ "description": "The file path where the component is located."
+ },
+ "subcomponents": {
+ "type": "array",
+ "description": "List of subcomponents related to the component.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "displayName": {
+ "type": "string",
+ "description": "The `displayName` of the subcomponent, as determined in code. Used to identify the component in the specified source file."
+ },
+ "preferredDisplayName": {
+ "type": "string",
+ "description": "The display name to use in the README, if it is different from the `displayName` as determined in code."
+ },
+ "filePath": {
+ "type": "string",
+ "description": "The file path where the subcomponent is located."
+ }
+ },
+ "required": [ "displayName", "filePath" ]
+ }
+ }
+ },
+ "required": [ "displayName", "filePath" ]
+}
diff --git a/packages/components/src/alignment-matrix-control/README.md b/packages/components/src/alignment-matrix-control/README.md
index 68ecab6b7adb47..af97e3ae0607cd 100644
--- a/packages/components/src/alignment-matrix-control/README.md
+++ b/packages/components/src/alignment-matrix-control/README.md
@@ -1,12 +1,14 @@
# AlignmentMatrixControl
-AlignmentMatrixControl components enable adjustments to horizontal and vertical alignments for UI.
+
+
+See the WordPress Storybook for more detailed, interactive documentation.
-## Usage
+AlignmentMatrixControl components enable adjustments to horizontal and vertical alignments for UI.
```jsx
-import { useState } from 'react';
import { AlignmentMatrixControl } from '@wordpress/components';
+import { useState } from '@wordpress/element';
const Example = () => {
const [ alignment, setAlignment ] = useState( 'center center' );
@@ -14,63 +16,70 @@ const Example = () => {
return (
setAlignment( newAlignment ) }
+ onChange={ setAlignment }
/>
);
};
```
-
## Props
-The component accepts the following props:
+### `defaultValue`
-### className
+If provided, sets the default alignment value.
-The class that will be added to the classes of the underlying `grid` widget.
-- Type: `string`
-- Required: No
+ - Type: `"center" | "top left" | "top center" | "top right" | "center left" | "center center" | "center right" | "bottom left" | "bottom center" | "bottom right"`
+ - Required: No
+ - Default: `'center center'`
-### id
+### `label`
-Unique ID for the component.
+Accessible label. If provided, sets the `aria-label` attribute of the
+underlying `grid` widget.
-- Type: `string`
-- Required: No
+ - Type: `string`
+ - Required: No
+ - Default: `'Alignment Matrix Control'`
-### label
+### `onChange`
-Accessible label. If provided, sets the `aria-label` attribute of the underlying `grid` widget.
+A function that receives the updated alignment value.
-- Type: `string`
-- Required: No
-- Default: `Alignment Matrix Control`
+ - Type: `(newValue: AlignmentMatrixControlValue) => void`
+ - Required: No
-### defaultValue
+### `value`
-If provided, sets the default alignment value.
+The current alignment value.
-- Type: `AlignmentMatrixControlValue`
-- Required: No
-- Default: `center center`
+ - Type: `"center" | "top left" | "top center" | "top right" | "center left" | "center center" | "center right" | "bottom left" | "bottom center" | "bottom right"`
+ - Required: No
-### value
+### `width`
-The current alignment value.
+If provided, sets the width of the control.
-- Type: `AlignmentMatrixControlValue`
-- Required: No
+ - Type: `number`
+ - Required: No
+ - Default: `92`
-### onChange
+## Subcomponents
-A function that receives the updated alignment value.
+### AlignmentMatrixControl.Icon
-- Type: `( newValue: AlignmentMatrixControlValue ) => void`
-- Required: No
+#### Props
-### width
+##### `disablePointerEvents`
-If provided, sets the width of the control.
+If `true`, disables pointer events on the icon.
- - Type: `number`
+ - Type: `boolean`
- Required: No
- - Default: `92`
+ - Default: `true`
+
+##### `value`
+
+The current alignment value.
+
+ - Type: `"center" | "top left" | "top center" | "top right" | "center left" | "center center" | "center right" | "bottom left" | "bottom center" | "bottom right"`
+ - Required: No
+ - Default: `center`
diff --git a/packages/components/src/alignment-matrix-control/docs-manifest.json b/packages/components/src/alignment-matrix-control/docs-manifest.json
new file mode 100644
index 00000000000000..82ee28f4840c49
--- /dev/null
+++ b/packages/components/src/alignment-matrix-control/docs-manifest.json
@@ -0,0 +1,12 @@
+{
+ "$schema": "../../schemas/docs-manifest.json",
+ "displayName": "AlignmentMatrixControl",
+ "filePath": "./index.tsx",
+ "subcomponents": [
+ {
+ "displayName": "AlignmentMatrixControlIcon",
+ "preferredDisplayName": "AlignmentMatrixControl.Icon",
+ "filePath": "./icon.tsx"
+ }
+ ]
+}
diff --git a/packages/components/src/alignment-matrix-control/types.ts b/packages/components/src/alignment-matrix-control/types.ts
index 0f97c2df3b02bb..e93f412c1f4721 100644
--- a/packages/components/src/alignment-matrix-control/types.ts
+++ b/packages/components/src/alignment-matrix-control/types.ts
@@ -54,6 +54,8 @@ export type AlignmentMatrixControlIconProps = Pick<
* component instead_
*
* The size of the icon.
+ *
+ * @deprecated
* @ignore
* @default 24
*/
diff --git a/packages/components/src/angle-picker-control/README.md b/packages/components/src/angle-picker-control/README.md
index deed41089fdc1d..d9389c6564338f 100644
--- a/packages/components/src/angle-picker-control/README.md
+++ b/packages/components/src/angle-picker-control/README.md
@@ -1,44 +1,56 @@
# AnglePickerControl
-`AnglePickerControl` is a React component to render a UI that allows users to pick an angle.
-Users can choose an angle in a visual UI with the mouse by dragging an angle indicator inside a circle or by directly inserting the desired angle in a text field.
+
-## Usage
+See the WordPress Storybook for more detailed, interactive documentation.
+
+`AnglePickerControl` is a React component to render a UI that allows users to
+pick an angle. Users can choose an angle in a visual UI with the mouse by
+dragging an angle indicator inside a circle or by directly inserting the
+desired angle in a text field.
```jsx
-import { useState } from 'react';
+import { useState } from '@wordpress/element';
import { AnglePickerControl } from '@wordpress/components';
function Example() {
- const [ angle, setAngle ] = useState( 0 );
- return (
-
- );
-};
+ const [ angle, setAngle ] = useState( 0 );
+ return (
+
+ );
+}
```
-
## Props
-The component accepts the following props.
+### `as`
+
+The HTML element or React component to render the component as.
-### `label`: `string`
+ - Type: `"symbol" | "object" | "a" | "abbr" | "address" | "area" | "article" | "aside" | "audio" | "b" | ...`
+ - Required: No
+
+### `label`
Label to use for the angle picker.
-- Required: No
-- Default: `__( 'Angle' )`
+ - Type: `string`
+ - Required: No
+ - Default: `__( 'Angle' )`
-### `value`: `number | string`
+### `onChange`
-The current value of the input. The value represents an angle in degrees and should be a value between 0 and 360.
+A function that receives the new value of the input.
-- Required: Yes
+ - Type: `(value: number) => void`
+ - Required: Yes
-### `onChange`: `( value: number ) => void`
+### `value`
-A function that receives the new value of the input.
+The current value of the input. The value represents an angle in degrees
+and should be a value between 0 and 360.
-- Required: Yes
+ - Type: `string | number`
+ - Required: Yes
diff --git a/packages/components/src/angle-picker-control/docs-manifest.json b/packages/components/src/angle-picker-control/docs-manifest.json
new file mode 100644
index 00000000000000..bcbfb353ac9e32
--- /dev/null
+++ b/packages/components/src/angle-picker-control/docs-manifest.json
@@ -0,0 +1,5 @@
+{
+ "$schema": "../../schemas/docs-manifest.json",
+ "displayName": "AnglePickerControl",
+ "filePath": "./index.tsx"
+}
diff --git a/packages/components/src/button/stories/index.story.tsx b/packages/components/src/button/stories/index.story.tsx
index 2981319cfb3233..808914893de610 100644
--- a/packages/components/src/button/stories/index.story.tsx
+++ b/packages/components/src/button/stories/index.story.tsx
@@ -22,7 +22,8 @@ import './style.css';
import Button from '..';
const meta: Meta< typeof Button > = {
- title: 'Components/Button',
+ title: 'Components/Actions/Button',
+ id: 'components-button',
component: Button,
argTypes: {
// Overrides a limitation of the docgen interpreting our TS types for this as required.
diff --git a/packages/components/src/card/stories/index.story.tsx b/packages/components/src/card/stories/index.story.tsx
index 1d75c044f1e270..03726abbe754ee 100644
--- a/packages/components/src/card/stories/index.story.tsx
+++ b/packages/components/src/card/stories/index.story.tsx
@@ -22,7 +22,8 @@ const meta: Meta< typeof Card > = {
component: Card,
// @ts-expect-error - See https://github.com/storybookjs/storybook/issues/23170
subcomponents: { CardHeader, CardBody, CardDivider, CardMedia, CardFooter },
- title: 'Components/Card',
+ title: 'Components/Containers/Card',
+ id: 'components-card',
argTypes: {
as: {
control: { type: null },
diff --git a/packages/components/src/color-palette/style.scss b/packages/components/src/color-palette/style.scss
index 9d922a8130692a..278aacb22914bb 100644
--- a/packages/components/src/color-palette/style.scss
+++ b/packages/components/src/color-palette/style.scss
@@ -26,10 +26,7 @@ $border-as-box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.2);
&::after {
content: "";
position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
+ inset: $border-width;
z-index: -1;
// The background image creates a checkerboard pattern. Ignore rtlcss to
// make it work both in LTR and RTL.
@@ -41,6 +38,7 @@ $border-as-box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.2);
background-position: 0 0, 24px 24px;
/*rtl:end:ignore*/
background-size: calc(2 * 24px) calc(2 * 24px);
+ border-radius: $radius-medium - $border-width $radius-medium - $border-width 0 0;
}
}
diff --git a/packages/components/src/item-group/stories/index.story.tsx b/packages/components/src/item-group/stories/index.story.tsx
index 473cdfedbf4f12..99309b81ea314f 100644
--- a/packages/components/src/item-group/stories/index.story.tsx
+++ b/packages/components/src/item-group/stories/index.story.tsx
@@ -37,6 +37,8 @@ const Template: StoryFn< typeof ItemGroup > = ( props ) => (
export const Default: StoryFn< typeof ItemGroup > = Template.bind( {} );
Default.args = {
+ isBordered: true,
+ isSeparated: true,
children: (
[
{
@@ -67,6 +69,7 @@ export const NonClickableItems: StoryFn< typeof ItemGroup > = Template.bind(
{}
);
NonClickableItems.args = {
+ ...Default.args,
children: (
[
{
@@ -83,6 +86,7 @@ NonClickableItems.args = {
export const CustomItemSize: StoryFn< typeof ItemGroup > = Template.bind( {} );
CustomItemSize.args = {
+ ...Default.args,
children: (
[
{
@@ -98,9 +102,9 @@ CustomItemSize.args = {
).map( mapPropsToItem ),
};
-export const WithBorder: StoryFn< typeof ItemGroup > = Template.bind( {} );
-WithBorder.args = {
+export const WithoutBorder: StoryFn< typeof ItemGroup > = Template.bind( {} );
+WithoutBorder.args = {
...Default.args,
- isBordered: true,
- isSeparated: true,
+ isBordered: false,
+ isSeparated: false,
};
diff --git a/packages/components/src/navigable-container/stories/navigable-menu.story.tsx b/packages/components/src/navigable-container/stories/navigable-menu.story.tsx
index 9e5f3eedff5289..2ad7e028d6faf1 100644
--- a/packages/components/src/navigable-container/stories/navigable-menu.story.tsx
+++ b/packages/components/src/navigable-container/stories/navigable-menu.story.tsx
@@ -9,7 +9,8 @@ import type { Meta, StoryFn } from '@storybook/react';
import { NavigableMenu } from '..';
const meta: Meta< typeof NavigableMenu > = {
- title: 'Components/NavigableMenu',
+ title: 'Components/Containers/NavigableMenu',
+ id: 'components-navigablemenu',
component: NavigableMenu,
argTypes: {
children: { control: { type: null } },
diff --git a/packages/components/src/navigable-container/stories/tabbable-container.story.tsx b/packages/components/src/navigable-container/stories/tabbable-container.story.tsx
index 3dd090f0b05859..07c87a0c20f1bf 100644
--- a/packages/components/src/navigable-container/stories/tabbable-container.story.tsx
+++ b/packages/components/src/navigable-container/stories/tabbable-container.story.tsx
@@ -9,7 +9,8 @@ import type { Meta, StoryFn } from '@storybook/react';
import { TabbableContainer } from '..';
const meta: Meta< typeof TabbableContainer > = {
- title: 'Components/TabbableContainer',
+ title: 'Components/Containers/TabbableContainer',
+ id: 'components-tabbablecontainer',
component: TabbableContainer,
argTypes: {
children: { control: { type: null } },
diff --git a/packages/components/src/palette-edit/index.tsx b/packages/components/src/palette-edit/index.tsx
index 8bfcb7240b9ea4..570613e5378c10 100644
--- a/packages/components/src/palette-edit/index.tsx
+++ b/packages/components/src/palette-edit/index.tsx
@@ -24,7 +24,7 @@ import Button from '../button';
import { ColorPicker } from '../color-picker';
import { FlexItem } from '../flex';
import { HStack } from '../h-stack';
-import { ItemGroup } from '../item-group';
+import { Item, ItemGroup } from '../item-group';
import { VStack } from '../v-stack';
import GradientPicker from '../gradient-picker';
import ColorPalette from '../color-palette';
@@ -35,7 +35,6 @@ import {
PaletteEditStyles,
PaletteHeading,
IndicatorStyled,
- PaletteItem,
NameContainer,
NameInputControl,
DoneButton,
@@ -213,7 +212,7 @@ function Option< T extends PaletteElement >( {
);
return (
-
+ -
+
);
}
@@ -309,7 +308,7 @@ function PaletteEditListView< T extends PaletteElement >( {
return (
-
+
{ elements.map( ( element, index ) => (