From e41b9f68c3be62c9a452335a7bc1a5378eee613c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:33:31 -0500 Subject: [PATCH 01/96] Bump undici from 5.28.4 to 5.28.5 (#68816) Bumps [undici](https://github.com/nodejs/undici) from 5.28.4 to 5.28.5. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.28.4...v5.28.5) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: desrosj --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 350fea74ea1b0..38b92c08b9a79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45328,9 +45328,9 @@ } }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" From 30dc8897ecad796f9eb96127943e1866d847d08b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:58:12 -0500 Subject: [PATCH 02/96] Bump http-proxy-middleware from 2.0.6 to 2.0.7 in /platform-docs (#68900) Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.6 to 2.0.7. - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.7/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.7) --- updated-dependencies: - dependency-name: http-proxy-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: desrosj --- platform-docs/package-lock.json | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/platform-docs/package-lock.json b/platform-docs/package-lock.json index ce0969c3928a4..9e26bbe030cd8 100644 --- a/platform-docs/package-lock.json +++ b/platform-docs/package-lock.json @@ -8031,9 +8031,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -13460,12 +13461,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/search-insights": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", - "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", - "peer": true - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -14563,19 +14558,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", From 1405851c007839734b638b6353a87a8760d31664 Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Wed, 5 Feb 2025 17:02:17 +0100 Subject: [PATCH 03/96] Remove block icon from InstalledBlocksPrePublishPanel. (#69046) * Remove block icon from InstalledBlocksPrePublishPanel. * Add inline comment. Co-authored-by: afercia Co-authored-by: Mamaduka --- packages/block-directory/src/plugins/index.js | 3 +++ .../src/plugins/installed-blocks-pre-publish-panel/index.js | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/block-directory/src/plugins/index.js b/packages/block-directory/src/plugins/index.js index 283ff0ea4d271..50418a9944d31 100644 --- a/packages/block-directory/src/plugins/index.js +++ b/packages/block-directory/src/plugins/index.js @@ -13,6 +13,9 @@ import InstalledBlocksPrePublishPanel from './installed-blocks-pre-publish-panel import getInstallMissing from './get-install-missing'; registerPlugin( 'block-directory', { + // The icon is explicitly set to undefined to prevent PluginPrePublishPanel + // from rendering the fallback icon pluginIcon. + icon: undefined, render() { return ( <> diff --git a/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js b/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js index 17630c9904e8b..233f3261c79fc 100644 --- a/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js +++ b/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js @@ -3,7 +3,6 @@ */ import { _n, sprintf } from '@wordpress/i18n'; import { useSelect } from '@wordpress/data'; -import { blockDefault } from '@wordpress/icons'; import { PluginPrePublishPanel } from '@wordpress/editor'; /** @@ -24,7 +23,6 @@ export default function InstalledBlocksPrePublishPanel() { return ( Date: Wed, 5 Feb 2025 16:09:57 +0000 Subject: [PATCH 04/96] Bump cross-spawn from 7.0.3 to 7.0.6 in /platform-docs (#68811) Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6. - [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md) - [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6) --- updated-dependencies: - dependency-name: cross-spawn dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: desrosj --- platform-docs/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platform-docs/package-lock.json b/platform-docs/package-lock.json index 9e26bbe030cd8..d94103323fe79 100644 --- a/platform-docs/package-lock.json +++ b/platform-docs/package-lock.json @@ -5120,9 +5120,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", From 3f0a805c568f92622faf4b71b24eeb5f39b5bca8 Mon Sep 17 00:00:00 2001 From: Hiroshi Urabe Date: Thu, 6 Feb 2025 03:27:58 +0900 Subject: [PATCH 05/96] Refactor font variant components to use useId for checkbox IDs (#69050) Co-authored-by: torounit Co-authored-by: Mamaduka Co-authored-by: t-hamano Co-authored-by: chiilog --- .../font-library-modal/collection-font-variant.js | 14 +++----------- .../font-library-modal/library-font-variant.js | 15 +++------------ 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/packages/edit-site/src/components/global-styles/font-library-modal/collection-font-variant.js b/packages/edit-site/src/components/global-styles/font-library-modal/collection-font-variant.js index 0719cb873f8f7..105c8e9ff81d9 100644 --- a/packages/edit-site/src/components/global-styles/font-library-modal/collection-font-variant.js +++ b/packages/edit-site/src/components/global-styles/font-library-modal/collection-font-variant.js @@ -1,20 +1,14 @@ /** * WordPress dependencies */ -import { - CheckboxControl, - Flex, - privateApis as componentsPrivateApis, -} from '@wordpress/components'; +import { useId } from '@wordpress/element'; +import { CheckboxControl, Flex } from '@wordpress/components'; /** * Internal dependencies */ import { getFontFaceVariantName } from './utils'; import FontDemo from './font-demo'; -import { unlock } from '../../../lock-unlock'; - -const { kebabCase } = unlock( componentsPrivateApis ); function CollectionFontVariant( { face, @@ -31,9 +25,7 @@ function CollectionFontVariant( { }; const displayName = font.name + ' ' + getFontFaceVariantName( face ); - const checkboxId = kebabCase( - `${ font.slug }-${ getFontFaceVariantName( face ) }` - ); + const checkboxId = useId(); return (
diff --git a/packages/edit-site/src/components/global-styles/font-library-modal/library-font-variant.js b/packages/edit-site/src/components/global-styles/font-library-modal/library-font-variant.js index 2f84bd1f2c749..24a1d54871f6b 100644 --- a/packages/edit-site/src/components/global-styles/font-library-modal/library-font-variant.js +++ b/packages/edit-site/src/components/global-styles/font-library-modal/library-font-variant.js @@ -1,12 +1,8 @@ /** * WordPress dependencies */ -import { useContext } from '@wordpress/element'; -import { - CheckboxControl, - Flex, - privateApis as componentsPrivateApis, -} from '@wordpress/components'; +import { useContext, useId } from '@wordpress/element'; +import { CheckboxControl, Flex } from '@wordpress/components'; /** * Internal dependencies @@ -14,9 +10,6 @@ import { import { getFontFaceVariantName } from './utils'; import { FontLibraryContext } from './context'; import FontDemo from './font-demo'; -import { unlock } from '../../../lock-unlock'; - -const { kebabCase } = unlock( componentsPrivateApis ); function LibraryFontVariant( { face, font } ) { const { isFontActivated, toggleActivateFont } = @@ -41,9 +34,7 @@ function LibraryFontVariant( { face, font } ) { }; const displayName = font.name + ' ' + getFontFaceVariantName( face ); - const checkboxId = kebabCase( - `${ font.slug }-${ getFontFaceVariantName( face ) }` - ); + const checkboxId = useId(); return (
From 8b64cb1f005d61f2347c4970ecce7adac78eddd5 Mon Sep 17 00:00:00 2001 From: Joe McGill <801097+joemcgill@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:56:26 -0600 Subject: [PATCH 06/96] Fix installing svn during deploys (#69047) This fixes a permissions error by installing svn into the worker as sudo. Co-authored-by: joemcgill Co-authored-by: Mamaduka --- .github/workflows/upload-release-to-plugin-repo.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload-release-to-plugin-repo.yml b/.github/workflows/upload-release-to-plugin-repo.yml index 8f823a543b826..7d2c780599cdd 100644 --- a/.github/workflows/upload-release-to-plugin-repo.yml +++ b/.github/workflows/upload-release-to-plugin-repo.yml @@ -169,7 +169,7 @@ jobs: steps: - name: Install Subversion run: | - apt-get update -y && apt-get install -y subversion + sudo apt-get update -y && sudo apt-get install -y subversion - name: Check out Gutenberg trunk from WP.org plugin repo run: | @@ -228,7 +228,7 @@ jobs: steps: - name: Install Subversion run: | - apt-get update -y && apt-get install -y subversion + sudo apt-get update -y && sudo apt-get install -y subversion - name: Download and unzip Gutenberg plugin asset into tags folder env: From d01a09eccaf5f87c40daff07536dee04bbc54da7 Mon Sep 17 00:00:00 2001 From: Juzar Bharmal <53657281+Juzar10@users.noreply.github.com> Date: Thu, 6 Feb 2025 11:33:08 +0530 Subject: [PATCH 07/96] Fix: Prevent Errors in Header Processing and Encode URLs Properly (#67780) Unlinked contributors: mafiayemakhfi. Co-authored-by: Juzar10 Co-authored-by: ellatrix Co-authored-by: Mamaduka Co-authored-by: SainathPoojary Co-authored-by: himanshupathak95 Co-authored-by: t-hamano --- .../api-fetch/src/middlewares/preloading.js | 43 ++++++++++++---- .../src/middlewares/test/preloading.js | 51 +++++++++++++++++++ 2 files changed, 85 insertions(+), 9 deletions(-) diff --git a/packages/api-fetch/src/middlewares/preloading.js b/packages/api-fetch/src/middlewares/preloading.js index ac293738513bd..3eaab48dc8392 100644 --- a/packages/api-fetch/src/middlewares/preloading.js +++ b/packages/api-fetch/src/middlewares/preloading.js @@ -68,15 +68,40 @@ function createPreloadingMiddleware( preloadedData ) { * @return {Promise} Promise with the response. */ function prepareResponse( responseData, parse ) { - return Promise.resolve( - parse - ? responseData.body - : new window.Response( JSON.stringify( responseData.body ), { - status: 200, - statusText: 'OK', - headers: responseData.headers, - } ) - ); + if ( parse ) { + return Promise.resolve( responseData.body ); + } + + try { + return Promise.resolve( + new window.Response( JSON.stringify( responseData.body ), { + status: 200, + statusText: 'OK', + headers: responseData.headers, + } ) + ); + } catch { + // See: https://github.com/WordPress/gutenberg/issues/67358#issuecomment-2621163926. + Object.entries( responseData.headers ).forEach( ( [ key, value ] ) => { + if ( key.toLowerCase() === 'link' ) { + responseData.headers[ key ] = value.replace( + /<([^>]+)>/, + ( /** @type {any} */ _, /** @type {string} */ url ) => + `<${ encodeURI( url ) }>` + ); + } + } ); + + return Promise.resolve( + parse + ? responseData.body + : new window.Response( JSON.stringify( responseData.body ), { + status: 200, + statusText: 'OK', + headers: responseData.headers, + } ) + ); + } } export default createPreloadingMiddleware; diff --git a/packages/api-fetch/src/middlewares/test/preloading.js b/packages/api-fetch/src/middlewares/test/preloading.js index 696d8a3764865..a3ffedbdef46d 100644 --- a/packages/api-fetch/src/middlewares/test/preloading.js +++ b/packages/api-fetch/src/middlewares/test/preloading.js @@ -265,6 +265,57 @@ describe( 'Preloading Middleware', () => { expect( secondMiddleware ).toHaveBeenCalledTimes( 1 ); } ); + it( 'should not throw an error when non-ASCII headers are present', async () => { + const noResponseMock = 'undefined' === typeof window.Response; + if ( noResponseMock ) { + window.Response = class { + constructor( body, options ) { + this.body = JSON.parse( body ); + this.headers = options.headers; + + // Check for non-ASCII characters in headers + for ( const [ key, value ] of Object.entries( + this.headers || {} + ) ) { + if ( /[^\x00-\x7F]/.test( value ) ) { + throw new Error( + `Invalid non-ASCII character found in header: ${ key }` + ); + } + } + } + }; + } + + const data = { + body: 'Hello', + headers: { + Link: '; rel="alternate"; type=text/html', + }, + }; + + const preloadedData = { + 'wp/v2/example': data, + }; + + const preloadingMiddleware = + createPreloadingMiddleware( preloadedData ); + + const requestOptions = { + method: 'GET', + path: 'wp/v2/example', + parse: false, + }; + + await expect( + preloadingMiddleware( requestOptions, () => {} ) + ).resolves.not.toThrow(); + + if ( noResponseMock ) { + delete window.Response; + } + } ); + describe.each( [ [ 'GET' ], [ 'OPTIONS' ] ] )( '%s', ( method ) => { describe.each( [ [ 'all empty', {} ], From 269ebe62359fb64bac3d5abcc95dd9bb11609aba Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Thu, 6 Feb 2025 10:29:29 +0400 Subject: [PATCH 08/96] Relocate changelog file for WP#6910 to 6.9 backports (#69068) Co-authored-by: Mamaduka --- backport-changelog/{6.8 => 6.9}/6910.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backport-changelog/{6.8 => 6.9}/6910.md (100%) diff --git a/backport-changelog/6.8/6910.md b/backport-changelog/6.9/6910.md similarity index 100% rename from backport-changelog/6.8/6910.md rename to backport-changelog/6.9/6910.md From 484ace368102a773548a035691673f1a617b252f Mon Sep 17 00:00:00 2001 From: Sean Fisher Date: Thu, 6 Feb 2025 01:32:16 -0500 Subject: [PATCH 09/96] wp-env: Add lifecycleScripts to the schema (#68724) * Add lifecycleScripts to the README * Add lifecycleScripts to the schema/README for @wordpress/env * Adjust from code review feedback Co-authored-by: srtfisher Co-authored-by: t-hamano --- packages/env/README.md | 27 ++++++++++++++------------- schemas/json/wp-env.json | 21 ++++++++++++++++++++- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/packages/env/README.md b/packages/env/README.md index 16bba5cba20c0..fe3e5dea3bf2b 100644 --- a/packages/env/README.md +++ b/packages/env/README.md @@ -479,19 +479,20 @@ You can customize the WordPress installation, plugins and themes that the develo `.wp-env.json` supports fields for options applicable to both the tests and development instances. -| Field | Type | Default | Description | -|--------------------|----------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------| -| `"core"` | `string\|null` | `null` | The WordPress installation to use. If `null` is specified, `wp-env` will use the latest production release of WordPress. | -| `"phpVersion"` | `string\|null` | `null` | The PHP version to use. If `null` is specified, `wp-env` will use the default version used with production release of WordPress. | -| `"plugins"` | `string[]` | `[]` | A list of plugins to install and activate in the environment. | -| `"themes"` | `string[]` | `[]` | A list of themes to install in the environment. | -| `"port"` | `integer` | `8888` (`8889` for the tests instance) | The primary port number to use for the installation. You'll access the instance through the port: 'http://localhost:8888'. | -| `"testsPort"` | `integer` | `8889` | The port number for the test site. You'll access the instance through the port: 'http://localhost:8889'. | -| `"config"` | `Object` | See below. | Mapping of wp-config.php constants to their desired values. | -| `"mappings"` | `Object` | `"{}"` | Mapping of WordPress directories to local directories to be mounted in the WordPress instance. | -| `"mysqlPort"` | `integer` | `null` (randomly assigned) | The MySQL port number to expose. The setting is only available in the `env.development` and `env.tests` objects. | -| `"phpmyadminPort"` | `integer` | `null` | The port number for phpMyAdmin. If provided, you'll access phpMyAdmin through: http://localhost: | -| `"multisite"` | `boolean` | `false` | Whether to set up a multisite installation. | +| Field | Type | Default | Description | +|----------------------|----------------|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------| +| `"core"` | `string\|null` | `null` | The WordPress installation to use. If `null` is specified, `wp-env` will use the latest production release of WordPress. | +| `"phpVersion"` | `string\|null` | `null` | The PHP version to use. If `null` is specified, `wp-env` will use the default version used with production release of WordPress. | +| `"plugins"` | `string[]` | `[]` | A list of plugins to install and activate in the environment. | +| `"themes"` | `string[]` | `[]` | A list of themes to install in the environment. | +| `"port"` | `integer` | `8888` (`8889` for the tests instance) | The primary port number to use for the installation. You'll access the instance through the port: 'http://localhost:8888'. | +| `"testsPort"` | `integer` | `8889` | The port number for the test site. You'll access the instance through the port: 'http://localhost:8889'. | +| `"config"` | `Object` | See below. | Mapping of wp-config.php constants to their desired values. | +| `"mappings"` | `Object` | `"{}"` | Mapping of WordPress directories to local directories to be mounted in the WordPress instance. | +| `"mysqlPort"` | `integer` | `null` (randomly assigned) | The MySQL port number to expose. The setting is only available in the `env.development` and `env.tests` objects. | +| `"phpmyadminPort"` | `integer` | `null` | The port number for phpMyAdmin. If provided, you'll access phpMyAdmin through: http://localhost: | +| `"multisite"` | `boolean` | `false` | Whether to set up a multisite installation. | +| `"lifecycleScripts"` | `Object` | `"{}"` | Mapping of commands that should be executed at certain points in the lifecycle. | _Note: the port number environment variables (`WP_ENV_PORT` and `WP_ENV_TESTS_PORT`) take precedent over the .wp-env.json values._ diff --git a/schemas/json/wp-env.json b/schemas/json/wp-env.json index 5761fb3d87711..2a98cb3d0d263 100644 --- a/schemas/json/wp-env.json +++ b/schemas/json/wp-env.json @@ -119,6 +119,25 @@ "description": "The port number for the test site. You'll access the instance through the port: http://localhost:8889", "type": "integer", "default": 8889 + }, + "lifecycleScripts": { + "description": "Mapping of commands that should be executed at certain points in the lifecycle.", + "type": "object", + "default": {}, + "properties": { + "afterStart": { + "description": "Runs after wp-env start has finished setting up the environment.", + "type": "string" + }, + "afterClean": { + "description": "Runs after wp-env clean has finished cleaning the environment.", + "type": "string" + }, + "afterDestroy": { + "description": "Runs after wp-env destroy has destroyed the environment.", + "type": "string" + } + } } } }, @@ -130,7 +149,7 @@ "$ref": "#/definitions/wpEnvPropertyNames" }, { - "enum": [ "$schema", "env", "testsPort" ] + "enum": [ "$schema", "env", "testsPort", "lifecycleScripts" ] } ] } From 145eecace72b4da118c654daf5e8e54b91fc8170 Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Thu, 6 Feb 2025 09:50:44 +0000 Subject: [PATCH 10/96] Update Changelog for 20.0.1 --- changelog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/changelog.txt b/changelog.txt index 2c54f92fae872..e791d102a6b77 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,14 @@ == Changelog == += 20.0.1 = + +## Changelog + +### Bug Fixes + +- iAPI Router: add missing changelog entry for [#68923](https://github.com/WordPress/gutenberg/pull/68945) + + = 20.2.0 = ## Changelog From d3b89431fd9c34cf88923685d2d59ab3ac61d0c9 Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Thu, 6 Feb 2025 14:05:08 +0100 Subject: [PATCH 11/96] Fix the background, arrowUpLeft, keyboardReturn and square icons. (#69076) * Fix the background, arrowUpLeft and square icons. * Fix keyboardReturn icon. Co-authored-by: afercia Co-authored-by: Mamaduka Co-authored-by: t-hamano --- packages/icons/src/library/arrow-up-left.js | 2 +- packages/icons/src/library/background.js | 2 +- packages/icons/src/library/keyboard-return.js | 2 +- packages/icons/src/library/square.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/icons/src/library/arrow-up-left.js b/packages/icons/src/library/arrow-up-left.js index 1b3686f6ec1e6..7d46e8bbef637 100644 --- a/packages/icons/src/library/arrow-up-left.js +++ b/packages/icons/src/library/arrow-up-left.js @@ -4,7 +4,7 @@ import { SVG, Path } from '@wordpress/primitives'; const arrowUpLeft = ( - + ); diff --git a/packages/icons/src/library/background.js b/packages/icons/src/library/background.js index 173b609354380..388d685b07b8a 100644 --- a/packages/icons/src/library/background.js +++ b/packages/icons/src/library/background.js @@ -4,7 +4,7 @@ import { Path, SVG } from '@wordpress/primitives'; const background = ( - + + ); diff --git a/packages/icons/src/library/square.js b/packages/icons/src/library/square.js index 843a8d2d5261d..40b678f2f0475 100644 --- a/packages/icons/src/library/square.js +++ b/packages/icons/src/library/square.js @@ -4,7 +4,7 @@ import { SVG, Path } from '@wordpress/primitives'; const square = ( - + Date: Thu, 6 Feb 2025 22:40:38 +0900 Subject: [PATCH 12/96] Social Links: Fix appender size in non-iframe editor (#68215) Co-authored-by: t-hamano Co-authored-by: up1512001 Co-authored-by: Mamaduka --- packages/block-library/src/social-links/editor.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/block-library/src/social-links/editor.scss b/packages/block-library/src/social-links/editor.scss index 54a4154659eb2..6b1286c94757d 100644 --- a/packages/block-library/src/social-links/editor.scss +++ b/packages/block-library/src/social-links/editor.scss @@ -100,6 +100,10 @@ .wp-block-social-links .block-list-appender { position: static; // display inline. + .block-editor-inserter { + font-size: inherit; + } + .block-editor-button-block-appender { height: 1.5em; width: 1.5em; From 96b12e5c8571b77e24e4a352094bafebddc35ec8 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Thu, 6 Feb 2025 18:12:51 +0400 Subject: [PATCH 13/96] Quick Inserter: Restore pattern search and insertion (#69028) Unlinked contributors: xpurichan. Co-authored-by: Mamaduka Co-authored-by: t-hamano Co-authored-by: yogeshbhutkar Co-authored-by: fabiankaegy --- .../block-editor/src/components/inserter/quick-inserter.js | 5 ++++- .../block-editor/src/components/inserter/search-results.js | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/block-editor/src/components/inserter/quick-inserter.js b/packages/block-editor/src/components/inserter/quick-inserter.js index 498030a0019dc..baedf91b87a90 100644 --- a/packages/block-editor/src/components/inserter/quick-inserter.js +++ b/packages/block-editor/src/components/inserter/quick-inserter.js @@ -21,6 +21,7 @@ import { store as blockEditorStore } from '../../store'; const SEARCH_THRESHOLD = 6; const SHOWN_BLOCK_TYPES = 6; +const SHOWN_BLOCK_PATTERNS = 2; export default function QuickInserter( { onSelect, @@ -106,7 +107,9 @@ export default function QuickInserter( { rootClientId={ rootClientId } clientId={ clientId } isAppender={ isAppender } - maxBlockPatterns={ 0 } + maxBlockPatterns={ + !! filterValue ? SHOWN_BLOCK_PATTERNS : 0 + } maxBlockTypes={ SHOWN_BLOCK_TYPES } isDraggable={ false } selectBlockOnInsert={ selectBlockOnInsert } diff --git a/packages/block-editor/src/components/inserter/search-results.js b/packages/block-editor/src/components/inserter/search-results.js index 5a5725a3bb08c..c020e86f99a63 100644 --- a/packages/block-editor/src/components/inserter/search-results.js +++ b/packages/block-editor/src/components/inserter/search-results.js @@ -84,7 +84,9 @@ function InserterSearchResults( { ] = useBlockTypesState( destinationRootClientId, onInsertBlocks, isQuick ); const [ patterns, , onClickPattern ] = usePatternsState( onInsertBlocks, - destinationRootClientId + destinationRootClientId, + undefined, + isQuick ); const filteredBlockPatterns = useMemo( () => { From e850c6894da68b70eb689d38f834d93b4c1460c3 Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Thu, 6 Feb 2025 08:13:11 -0700 Subject: [PATCH 14/96] Editor: Add loading state to the 'PostAuthorCombobox' component (#68991) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add loading indicator to author selector * Only show "No items found" when isLoading is false * Remove unitended change * Update packages/components/src/combobox-control/types.ts Co-authored-by: Marco Ciampini * Revert "Only show "No items found" when isLoading is false" This reverts commit 76488c1841a4932a3350c927ea739c4da4b5bbfd. * Only show the suggestion list when the component isn’t loading data * Document `isLoading` prop in readme * Add is loading to Combobox storybook * Match readme description to type.js description * Revert combobox changes --------- Co-authored-by: Marco Ciampini --- packages/editor/src/components/post-author/combobox.js | 4 +++- packages/editor/src/components/post-author/hook.js | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/editor/src/components/post-author/combobox.js b/packages/editor/src/components/post-author/combobox.js index 867eca7947976..9cc6e01f5b82c 100644 --- a/packages/editor/src/components/post-author/combobox.js +++ b/packages/editor/src/components/post-author/combobox.js @@ -17,7 +17,8 @@ export default function PostAuthorCombobox() { const [ fieldValue, setFieldValue ] = useState(); const { editPost } = useDispatch( editorStore ); - const { authorId, authorOptions } = useAuthorsQuery( fieldValue ); + const { authorId, authorOptions, isLoading } = + useAuthorsQuery( fieldValue ); /** * Handle author selection. @@ -51,6 +52,7 @@ export default function PostAuthorCombobox() { onChange={ handleSelect } allowReset={ false } hideLabelFromVision + isLoading={ isLoading } /> ); } diff --git a/packages/editor/src/components/post-author/hook.js b/packages/editor/src/components/post-author/hook.js index f251eba79e180..28c4c126547b8 100644 --- a/packages/editor/src/components/post-author/hook.js +++ b/packages/editor/src/components/post-author/hook.js @@ -14,9 +14,9 @@ import { store as editorStore } from '../../store'; import { AUTHORS_QUERY, BASE_QUERY } from './constants'; export function useAuthorsQuery( search ) { - const { authorId, authors, postAuthor } = useSelect( + const { authorId, authors, postAuthor, isLoading } = useSelect( ( select ) => { - const { getUser, getUsers } = select( coreStore ); + const { getUser, getUsers, isResolving } = select( coreStore ); const { getEditedPostAttribute } = select( editorStore ); const _authorId = getEditedPostAttribute( 'author' ); const query = { ...AUTHORS_QUERY }; @@ -30,6 +30,7 @@ export function useAuthorsQuery( search ) { authorId: _authorId, authors: getUsers( query ), postAuthor: getUser( _authorId, BASE_QUERY ), + isLoading: isResolving( 'getUsers', [ query ] ), }; }, [ search ] @@ -68,5 +69,5 @@ export function useAuthorsQuery( search ) { return [ ...currentAuthor, ...fetchedAuthors ]; }, [ authors, postAuthor ] ); - return { authorId, authorOptions, postAuthor }; + return { authorId, authorOptions, postAuthor, isLoading }; } From c9ee64ad2e5e05ecbc40eb95faa3a0775ae674b1 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Fri, 7 Feb 2025 13:11:19 +0400 Subject: [PATCH 15/96] Exclude Iterator helpers from polyfills (#69070) * Exclude Iterator helpers from polyfills * Use assertEqualSets * Ignore bundled packages Co-authored-by: Mamaduka Co-authored-by: swissspidy --- .../polyfill-exclusions.js | 5 ++ phpunit/script-dependencies-test.php | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 phpunit/script-dependencies-test.php diff --git a/packages/babel-preset-default/polyfill-exclusions.js b/packages/babel-preset-default/polyfill-exclusions.js index ca8c045d12414..9d0d18737540c 100644 --- a/packages/babel-preset-default/polyfill-exclusions.js +++ b/packages/babel-preset-default/polyfill-exclusions.js @@ -28,4 +28,9 @@ module.exports = [ // // @see https://github.com/WordPress/gutenberg/pull/67230 /^es(next)?\.set\./, + // Remove Iterator feature polyfills. + // For the same reasoning as for Set exlusion above, we're excluding all iterator helper polyfills. + // + // @see https://github.com/WordPress/wordpress-develop/pull/8224#issuecomment-2636390007. + /^es(next)?\.iterator\./, ]; diff --git a/phpunit/script-dependencies-test.php b/phpunit/script-dependencies-test.php new file mode 100644 index 0000000000000..66f5c0a7e3dc5 --- /dev/null +++ b/phpunit/script-dependencies-test.php @@ -0,0 +1,48 @@ +registered; + $dependents = array(); + + // Iterate over all registered scripts, finding dependents of the `wp-polyfill` script. + // Based on private `WP_Scripts::get_dependents` method. + foreach ( $registered_scripts as $registered_handle => $args ) { + // Ignore bundled packages, they don't load separate polyfills. + if ( in_array( $registered_handle, $this->bundled_scripts, true ) ) { + continue; + } + + if ( in_array( 'wp-polyfill', $args->deps, true ) ) { + $dependents[] = $registered_handle; + } + } + + // This list should get smaller over time as we remove `wp-polyfill` dependencies. + // If the list update is intentional, please add a comment explaining why. + $expected = array( + 'react', + 'wp-blob', + 'wp-block-editor', + 'wp-block-library', + 'wp-blocks', + 'wp-edit-site', + 'wp-core-data', + 'wp-editor', + 'wp-router', + 'wp-url', + 'wp-widgets', + ); + + $this->assertEqualSets( $expected, $dependents ); + } +} From 194462f974732f18ee25bdacfc29455b969269cd Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Fri, 7 Feb 2025 14:17:09 +0400 Subject: [PATCH 16/96] Editor: Don't use selector shortcuts for the taxonomy queries (#68998) * Editor: Don't use selector shortcuts for the taxonomy queries * Update unit tests Co-authored-by: Mamaduka Co-authored-by: tyxla --- .../maybe-category-panel.js | 8 ++- .../post-publish-panel/maybe-tags-panel.js | 6 ++- .../src/components/post-taxonomies/check.js | 8 +-- .../post-taxonomies/flat-term-selector.js | 4 +- .../hierarchical-term-selector.js | 4 +- .../src/components/post-taxonomies/index.js | 6 ++- .../components/post-taxonomies/test/index.js | 50 ++++++++++++------- 7 files changed, 57 insertions(+), 29 deletions(-) diff --git a/packages/editor/src/components/post-publish-panel/maybe-category-panel.js b/packages/editor/src/components/post-publish-panel/maybe-category-panel.js index 66fdf985cc0d5..d3bca4417dbbf 100644 --- a/packages/editor/src/components/post-publish-panel/maybe-category-panel.js +++ b/packages/editor/src/components/post-publish-panel/maybe-category-panel.js @@ -16,8 +16,12 @@ import { store as editorStore } from '../../store'; function MaybeCategoryPanel() { const hasNoCategory = useSelect( ( select ) => { const postType = select( editorStore ).getCurrentPostType(); - const { canUser, getEntityRecord, getTaxonomy } = select( coreStore ); - const categoriesTaxonomy = getTaxonomy( 'category' ); + const { canUser, getEntityRecord } = select( coreStore ); + const categoriesTaxonomy = getEntityRecord( + 'root', + 'taxonomy', + 'category' + ); const defaultCategoryId = canUser( 'read', { kind: 'root', name: 'site', diff --git a/packages/editor/src/components/post-publish-panel/maybe-tags-panel.js b/packages/editor/src/components/post-publish-panel/maybe-tags-panel.js index 537d62f382805..4fa761ffbf71f 100644 --- a/packages/editor/src/components/post-publish-panel/maybe-tags-panel.js +++ b/packages/editor/src/components/post-publish-panel/maybe-tags-panel.js @@ -36,7 +36,11 @@ const TagsPanel = () => { const MaybeTagsPanel = () => { const { hasTags, isPostTypeSupported } = useSelect( ( select ) => { const postType = select( editorStore ).getCurrentPostType(); - const tagsTaxonomy = select( coreStore ).getTaxonomy( 'post_tag' ); + const tagsTaxonomy = select( coreStore ).getEntityRecord( + 'root', + 'taxonomy', + 'post_tag' + ); const _isPostTypeSupported = tagsTaxonomy?.types?.includes( postType ); const areTagsFetched = tagsTaxonomy !== undefined; const tags = diff --git a/packages/editor/src/components/post-taxonomies/check.js b/packages/editor/src/components/post-taxonomies/check.js index b6b4d4f58e4e6..b89a89a54335d 100644 --- a/packages/editor/src/components/post-taxonomies/check.js +++ b/packages/editor/src/components/post-taxonomies/check.js @@ -20,9 +20,11 @@ import { store as editorStore } from '../../store'; export default function PostTaxonomiesCheck( { children } ) { const hasTaxonomies = useSelect( ( select ) => { const postType = select( editorStore ).getCurrentPostType(); - const taxonomies = select( coreStore ).getTaxonomies( { - per_page: -1, - } ); + const taxonomies = select( coreStore ).getEntityRecords( + 'root', + 'taxonomy', + { per_page: -1 } + ); return taxonomies?.some( ( taxonomy ) => taxonomy.types.includes( postType ) ); diff --git a/packages/editor/src/components/post-taxonomies/flat-term-selector.js b/packages/editor/src/components/post-taxonomies/flat-term-selector.js index 890175534c8b4..eb424e53c58de 100644 --- a/packages/editor/src/components/post-taxonomies/flat-term-selector.js +++ b/packages/editor/src/components/post-taxonomies/flat-term-selector.js @@ -100,10 +100,10 @@ export function FlatTermSelector( { slug, __nextHasNoMarginBottom } ) { ( select ) => { const { getCurrentPost, getEditedPostAttribute } = select( editorStore ); - const { getEntityRecords, getTaxonomy, hasFinishedResolution } = + const { getEntityRecords, getEntityRecord, hasFinishedResolution } = select( coreStore ); const post = getCurrentPost(); - const _taxonomy = getTaxonomy( slug ); + const _taxonomy = getEntityRecord( 'root', 'taxonomy', slug ); const _termIds = _taxonomy ? getEditedPostAttribute( _taxonomy.rest_base ) : EMPTY_ARRAY; diff --git a/packages/editor/src/components/post-taxonomies/hierarchical-term-selector.js b/packages/editor/src/components/post-taxonomies/hierarchical-term-selector.js index ef2019ac3f0f4..0bc4b17ba1aa4 100644 --- a/packages/editor/src/components/post-taxonomies/hierarchical-term-selector.js +++ b/packages/editor/src/components/post-taxonomies/hierarchical-term-selector.js @@ -175,9 +175,9 @@ export function HierarchicalTermSelector( { slug } ) { ( select ) => { const { getCurrentPost, getEditedPostAttribute } = select( editorStore ); - const { getTaxonomy, getEntityRecords, isResolving } = + const { getEntityRecord, getEntityRecords, isResolving } = select( coreStore ); - const _taxonomy = getTaxonomy( slug ); + const _taxonomy = getEntityRecord( 'root', 'taxonomy', slug ); const post = getCurrentPost(); return { diff --git a/packages/editor/src/components/post-taxonomies/index.js b/packages/editor/src/components/post-taxonomies/index.js index dc2345fd6197f..26ef06ee68ab3 100644 --- a/packages/editor/src/components/post-taxonomies/index.js +++ b/packages/editor/src/components/post-taxonomies/index.js @@ -18,7 +18,11 @@ export function PostTaxonomies( { taxonomyWrapper = identity } ) { const { postType, taxonomies } = useSelect( ( select ) => { return { postType: select( editorStore ).getCurrentPostType(), - taxonomies: select( coreStore ).getTaxonomies( { per_page: -1 } ), + taxonomies: select( coreStore ).getEntityRecords( + 'root', + 'taxonomy', + { per_page: -1 } + ), }; }, [] ); const visibleTaxonomies = ( taxonomies ?? [] ).filter( diff --git a/packages/editor/src/components/post-taxonomies/test/index.js b/packages/editor/src/components/post-taxonomies/test/index.js index 1f386f4c2fab1..60f07c5aa417a 100644 --- a/packages/editor/src/components/post-taxonomies/test/index.js +++ b/packages/editor/src/components/post-taxonomies/test/index.js @@ -44,6 +44,19 @@ describe( 'PostTaxonomies', () => { }, }; + const allTaxonomies = [ genresTaxonomy, categoriesTaxonomy ]; + + const hidesUI = [ + genresTaxonomy, + { + ...categoriesTaxonomy, + types: [ 'post', 'page', 'book' ], + visibility: { + show_ui: false, + }, + }, + ]; + beforeEach( () => { jest.spyOn( select( editorStore ), 'getCurrentPost' ).mockReturnValue( { _links: { @@ -70,8 +83,8 @@ describe( 'PostTaxonomies', () => { }, } ); - jest.spyOn( select( coreStore ), 'getTaxonomy' ).mockImplementation( - ( slug ) => { + jest.spyOn( select( coreStore ), 'getEntityRecord' ).mockImplementation( + ( kind, name, slug ) => { switch ( slug ) { case 'category': { return categoriesTaxonomy; @@ -91,8 +104,11 @@ describe( 'PostTaxonomies', () => { select( editorStore ), 'getCurrentPostType' ).mockReturnValue( 'page' ); - jest.spyOn( select( coreStore ), 'getTaxonomies' ).mockReturnValue( - taxonomies + jest.spyOn( + select( coreStore ), + 'getEntityRecords' + ).mockImplementation( ( kind, name ) => + kind === 'root' && name === 'taxonomy' ? taxonomies : null ); const { container } = render( ); @@ -105,10 +121,12 @@ describe( 'PostTaxonomies', () => { select( editorStore ), 'getCurrentPostType' ).mockReturnValue( 'book' ); - jest.spyOn( select( coreStore ), 'getTaxonomies' ).mockReturnValue( [ - genresTaxonomy, - categoriesTaxonomy, - ] ); + jest.spyOn( + select( coreStore ), + 'getEntityRecords' + ).mockImplementation( ( kind, name ) => + kind === 'root' && name === 'taxonomy' ? allTaxonomies : null + ); render( ); @@ -129,16 +147,12 @@ describe( 'PostTaxonomies', () => { select( editorStore ), 'getCurrentPostType' ).mockReturnValue( 'book' ); - jest.spyOn( select( coreStore ), 'getTaxonomies' ).mockReturnValue( [ - genresTaxonomy, - { - ...categoriesTaxonomy, - types: [ 'post', 'page', 'book' ], - visibility: { - show_ui: false, - }, - }, - ] ); + jest.spyOn( + select( coreStore ), + 'getEntityRecords' + ).mockImplementation( ( kind, name ) => + kind === 'root' && name === 'taxonomy' ? hidesUI : null + ); render( ); From d7e8549ac6c8d53552892f285813ca2fe3eb248f Mon Sep 17 00:00:00 2001 From: tomoki shimomura Date: Fri, 7 Feb 2025 19:52:19 +0900 Subject: [PATCH 17/96] Disable Clear button if there's no shadow. (#69092) Co-authored-by: shimotmk Co-authored-by: Mamaduka --- .../src/components/global-styles/shadow-panel-components.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/block-editor/src/components/global-styles/shadow-panel-components.js b/packages/block-editor/src/components/global-styles/shadow-panel-components.js index c335ef29384f4..25da4150a090f 100644 --- a/packages/block-editor/src/components/global-styles/shadow-panel-components.js +++ b/packages/block-editor/src/components/global-styles/shadow-panel-components.js @@ -46,6 +46,8 @@ export function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) { __next40pxDefaultSize variant="tertiary" onClick={ () => onShadowChange( undefined ) } + disabled={ ! shadow } + accessibleWhenDisabled > { __( 'Clear' ) } From 177743059a87db2ba5f11f83dc8964e543bf3a03 Mon Sep 17 00:00:00 2001 From: Yogesh Bhutkar Date: Fri, 7 Feb 2025 16:51:30 +0530 Subject: [PATCH 18/96] Duotone Settings: Add `reset` button and improve toggle rendering in FiltersPanel (#68672) * Duotone Settings: Add reset button and improve toggle rendering in FiltersPanel * refactor: revert usage of `clearable` prop * refactor: hover on button to show `reset` * refactor: remove the usage of `ItemGroup` and add `css` for border * refactor: update button label to 'Reset' and adjust border color in filters panel Co-authored-by: yogeshbhutkar Co-authored-by: t-hamano --- .../components/global-styles/filters-panel.js | 69 +++++++++++++------ .../src/components/global-styles/style.scss | 27 ++++++++ 2 files changed, 75 insertions(+), 21 deletions(-) diff --git a/packages/block-editor/src/components/global-styles/filters-panel.js b/packages/block-editor/src/components/global-styles/filters-panel.js index 64322d0fd5d5c..3aed7255e411b 100644 --- a/packages/block-editor/src/components/global-styles/filters-panel.js +++ b/packages/block-editor/src/components/global-styles/filters-panel.js @@ -9,8 +9,6 @@ import clsx from 'clsx'; import { __experimentalToolsPanel as ToolsPanel, __experimentalToolsPanelItem as ToolsPanelItem, - __experimentalItemGroup as ItemGroup, - __experimentalItem as Item, __experimentalHStack as HStack, __experimentalZStack as ZStack, __experimentalDropdownContentWrapper as DropdownContentWrapper, @@ -21,9 +19,11 @@ import { Dropdown, Flex, FlexItem, + Button, } from '@wordpress/components'; import { __, _x } from '@wordpress/i18n'; -import { useCallback, useMemo } from '@wordpress/element'; +import { useCallback, useMemo, useRef } from '@wordpress/element'; +import { reset as resetIcon } from '@wordpress/icons'; /** * Internal dependencies @@ -117,6 +117,50 @@ const LabeledColorIndicator = ( { indicator, label } ) => ( ); +const renderToggle = + ( duotone, resetDuotone ) => + ( { onToggle, isOpen } ) => { + const duotoneButtonRef = useRef( undefined ); + + const toggleProps = { + onClick: onToggle, + className: clsx( { 'is-open': isOpen } ), + 'aria-expanded': isOpen, + ref: duotoneButtonRef, + }; + + const removeButtonProps = { + onClick: () => { + if ( isOpen ) { + onToggle(); + } + resetDuotone(); + // Return focus to parent button. + duotoneButtonRef.current?.focus(); + }, + className: 'block-editor-panel-duotone-settings__reset', + label: __( 'Reset' ), + }; + + return ( + <> + + { duotone && ( + + ) } + + ); + }; + export default function FiltersPanel( { as: Wrapper = FiltersToolsPanel, value, @@ -182,24 +226,7 @@ export default function FiltersPanel( { { - const toggleProps = { - onClick: onToggle, - className: clsx( { 'is-open': isOpen } ), - 'aria-expanded': isOpen, - }; - - return ( - - - - - - ); - } } + renderToggle={ renderToggle( duotone, resetDuotone ) } renderContent={ () => ( diff --git a/packages/block-editor/src/components/global-styles/style.scss b/packages/block-editor/src/components/global-styles/style.scss index 5684cf9c0d303..3645586f28311 100644 --- a/packages/block-editor/src/components/global-styles/style.scss +++ b/packages/block-editor/src/components/global-styles/style.scss @@ -58,6 +58,11 @@ } } +.block-editor-global-styles-filters-panel__dropdown { + border: 1px solid $gray-300; + border-radius: $radius-small; +} + // These styles are similar to the color palette. .block-editor-global-styles__shadow-indicator { appearance: none; @@ -100,3 +105,25 @@ /*rtl:ignore*/ direction: ltr; } + +.block-editor-panel-duotone-settings__reset { + position: absolute; + right: 0; + top: $grid-unit; + margin: auto $grid-unit auto; + opacity: 0; + @media not (prefers-reduced-motion) { + transition: opacity 0.1s ease-in-out; + } + + .block-editor-global-styles-filters-panel__dropdown:hover &, + &:focus, + &:hover { + opacity: 1; + } + + @media (hover: none) { + // Show reset button on devices that do not support hover. + opacity: 1; + } +} From 594a4d8e0fe4d73de024149744cba1233a4d7046 Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Mon, 10 Feb 2025 07:02:27 +0530 Subject: [PATCH 19/96] Added Missing Global Documentation (#69104) * Added Missing Global Documentation * Fix PHP CS Issue Co-authored-by: shail-mehta Co-authored-by: t-hamano --- lib/experimental/navigation-theme-opt-in.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/experimental/navigation-theme-opt-in.php b/lib/experimental/navigation-theme-opt-in.php index 547aa8b88ea7d..27dbabaf23448 100644 --- a/lib/experimental/navigation-theme-opt-in.php +++ b/lib/experimental/navigation-theme-opt-in.php @@ -29,6 +29,8 @@ * * @see https://core.trac.wordpress.org/ticket/50544 * + * @global WP_Customize_Manager $wp_customize + * * @param int $menu_id ID of the updated menu. * @param int $menu_item_db_id ID of the new menu item. * @param array $args An array of arguments used to update/add the menu item. From aa89fdc9dcb3bf72043883e3818de1ab9dc42a18 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Mon, 10 Feb 2025 08:08:19 +0400 Subject: [PATCH 20/96] Editor: Optimize 'PostAuthorCheck' component data selection (#69105) Co-authored-by: Mamaduka Co-authored-by: t-hamano --- packages/editor/src/components/post-author/check.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/editor/src/components/post-author/check.js b/packages/editor/src/components/post-author/check.js index 0ae7a3963e243..de781038d2dfd 100644 --- a/packages/editor/src/components/post-author/check.js +++ b/packages/editor/src/components/post-author/check.js @@ -23,11 +23,14 @@ import { AUTHORS_QUERY } from './constants'; export default function PostAuthorCheck( { children } ) { const { hasAssignAuthorAction, hasAuthors } = useSelect( ( select ) => { const post = select( editorStore ).getCurrentPost(); - const authors = select( coreStore ).getUsers( AUTHORS_QUERY ); + const canAssignAuthor = post?._links?.[ 'wp:action-assign-author' ] + ? true + : false; return { - hasAssignAuthorAction: - post._links?.[ 'wp:action-assign-author' ] ?? false, - hasAuthors: authors?.length >= 1, + hasAssignAuthorAction: canAssignAuthor, + hasAuthors: canAssignAuthor + ? select( coreStore ).getUsers( AUTHORS_QUERY )?.length >= 1 + : false, }; }, [] ); From 530c61a6aa76c30a09a5bd39132dfa08ceacf26c Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Mon, 10 Feb 2025 08:40:25 +0400 Subject: [PATCH 21/96] Query block: Add option to ignore sticky posts behavior (#69057) * Query block: Add option to ignore sticky posts behavior * Add backport changelog entry Unlinked contributors: keithdevon. Co-authored-by: Mamaduka Co-authored-by: carolinan Co-authored-by: markhowellsmead Co-authored-by: coreyworrell --- backport-changelog/6.8/8265.md | 3 +++ lib/compat/wordpress-6.8/blocks.php | 19 +++++++++++++++-- .../block-library/src/post-template/edit.js | 21 +++++++++++++------ .../edit/inspector-controls/sticky-control.js | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 backport-changelog/6.8/8265.md diff --git a/backport-changelog/6.8/8265.md b/backport-changelog/6.8/8265.md new file mode 100644 index 0000000000000..46fa3f0181051 --- /dev/null +++ b/backport-changelog/6.8/8265.md @@ -0,0 +1,3 @@ +https://github.com/WordPress/wordpress-develop/pull/8265 + +* https://github.com/WordPress/gutenberg/pull/69057 diff --git a/lib/compat/wordpress-6.8/blocks.php b/lib/compat/wordpress-6.8/blocks.php index 1d27215762fe4..2b0fcd19e200e 100644 --- a/lib/compat/wordpress-6.8/blocks.php +++ b/lib/compat/wordpress-6.8/blocks.php @@ -222,15 +222,30 @@ function gutenberg_update_ignored_hooked_blocks_postmeta( $post ) { * Update Query `parents` argument validation for hierarchical post types. * A zero is a valid parent ID for hierarchical post types. Used to display top-level items. * + * Add new handler for `sticky` query argument. + * * @param array $query The query vars. * @param WP_Block $block Block instance. * @return array The filtered query vars. */ -function gutenberg_parents_query_vars_from_query_block( $query, $block ) { +function gutenberg_update_query_vars_from_query_block_6_8( $query, $block ) { if ( ! empty( $block->context['query']['parents'] ) && is_post_type_hierarchical( $query['post_type'] ) ) { $query['post_parent__in'] = array_unique( array_map( 'intval', $block->context['query']['parents'] ) ); } + if ( isset( $block->context['query']['sticky'] ) && ! empty( $block->context['query']['sticky'] ) ) { + if ( 'ignore' === $block->context['query']['sticky'] ) { + $sticky = get_option( 'sticky_posts' ); + + /** + * The core will set `post__not_in` because it asserts that any sticky value other than `only` is `exclude`. + * Let's override that while supporting any `post__not_in` values outside sticky post logic. + */ + $query['post__not_in'] = array_diff( $query['post__not_in'], ! empty( $sticky ) ? $sticky : array() ); + $query['ignore_sticky_posts'] = 1; + } + } + return $query; } -add_filter( 'query_loop_block_query_vars', 'gutenberg_parents_query_vars_from_query_block', 10, 2 ); +add_filter( 'query_loop_block_query_vars', 'gutenberg_update_query_vars_from_query_block_6_8', 10, 2 ); diff --git a/packages/block-library/src/post-template/edit.js b/packages/block-library/src/post-template/edit.js index c58990233f361..35d0a95501a1b 100644 --- a/packages/block-library/src/post-template/edit.js +++ b/packages/block-library/src/post-template/edit.js @@ -177,18 +177,27 @@ export default function PostTemplateEdit( { query.format = format; } - // If sticky is not set, it will return all posts in the results. - // If sticky is set to `only`, it will limit the results to sticky posts only. - // If it is anything else, it will exclude sticky posts from results. For the record the value stored is `exclude`. - if ( sticky ) { + /* + * Handle cases where sticky is set to `exclude` or `only`. + * Which works as a `post__in/post__not_in` query for sticky posts. + */ + if ( sticky && sticky !== 'ignore' ) { query.sticky = sticky === 'only'; } + + if ( sticky === 'ignore' ) { + // Remove any leftover sticky query parameter. + delete query.sticky; + query.ignore_sticky = true; + } + // If `inherit` is truthy, adjust conditionally the query to create a better preview. + let currentPostType = postType; if ( inherit ) { // Change the post-type if needed. if ( templateSlug?.startsWith( 'archive-' ) ) { query.postType = templateSlug.replace( 'archive-', '' ); - postType = query.postType; + currentPostType = query.postType; } else if ( templateCategory ) { query.categories = templateCategory[ 0 ]?.id; } else if ( templateTag ) { @@ -205,7 +214,7 @@ export default function PostTemplateEdit( { } // When we preview Query Loop blocks we should prefer the current // block's postType, which is passed through block context. - const usedPostType = previewPostType || postType; + const usedPostType = previewPostType || currentPostType; return { posts: getEntityRecords( 'postType', usedPostType, { ...query, diff --git a/packages/block-library/src/query/edit/inspector-controls/sticky-control.js b/packages/block-library/src/query/edit/inspector-controls/sticky-control.js index ee7ee31ba977a..f478337998f38 100644 --- a/packages/block-library/src/query/edit/inspector-controls/sticky-control.js +++ b/packages/block-library/src/query/edit/inspector-controls/sticky-control.js @@ -6,6 +6,7 @@ import { __ } from '@wordpress/i18n'; const stickyOptions = [ { label: __( 'Include' ), value: '' }, + { label: __( 'Ignore' ), value: 'ignore' }, { label: __( 'Exclude' ), value: 'exclude' }, { label: __( 'Only' ), value: 'only' }, ]; From 1a0b2fc6cd98ef060181454b224981569d2d969d Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:22:10 +0900 Subject: [PATCH 22/96] e2e: Fix "add new" selector (#69111) * e2e: Fix "add new" selector * Fix "Add new page" selector * Fix "Add new tag" selector * Fix "Add new template" selector * Fix "Add new template" selector * Fix "Add new pattern" selector * Fix "Add new template part" selector * Revert "Add new page" selector Co-authored-by: t-hamano Co-authored-by: Mamaduka --- .../various/block-editor-keyboard-shortcuts.spec.js | 2 +- test/e2e/specs/editor/various/inserting-blocks.spec.js | 2 +- .../e2e/specs/editor/various/pattern-overrides.spec.js | 8 ++++---- test/e2e/specs/editor/various/patterns.spec.js | 10 +++++----- test/e2e/specs/editor/various/taxonomies.spec.js | 8 ++------ test/e2e/specs/editor/various/writing-flow.spec.js | 2 +- .../specs/site-editor/block-style-variations.spec.js | 2 +- test/e2e/specs/site-editor/pages.spec.js | 4 ++-- test/e2e/specs/site-editor/patterns.spec.js | 8 ++++---- .../site-editor/site-editor-url-navigation.spec.js | 8 ++++---- .../specs/site-editor/template-registration.spec.js | 2 +- test/e2e/specs/site-editor/templates.spec.js | 2 +- 12 files changed, 27 insertions(+), 31 deletions(-) diff --git a/test/e2e/specs/editor/various/block-editor-keyboard-shortcuts.spec.js b/test/e2e/specs/editor/various/block-editor-keyboard-shortcuts.spec.js index 967baccfcbe4e..a368d4b7f0251 100644 --- a/test/e2e/specs/editor/various/block-editor-keyboard-shortcuts.spec.js +++ b/test/e2e/specs/editor/various/block-editor-keyboard-shortcuts.spec.js @@ -192,7 +192,7 @@ test.describe( 'Block editor keyboard shortcuts', () => { .getByRole( 'menuitem', { name: 'Create pattern' } ) .click(); await page - .getByRole( 'dialog', { name: 'add new pattern' } ) + .getByRole( 'dialog', { name: 'add pattern' } ) .getByRole( 'textbox', { name: 'Name' } ) .fill( 'hi' ); diff --git a/test/e2e/specs/editor/various/inserting-blocks.spec.js b/test/e2e/specs/editor/various/inserting-blocks.spec.js index 3cc369f75f223..4de9f736ceafa 100644 --- a/test/e2e/specs/editor/various/inserting-blocks.spec.js +++ b/test/e2e/specs/editor/various/inserting-blocks.spec.js @@ -269,7 +269,7 @@ test.describe( 'Inserting blocks (@firefox, @webkit)', () => { .click(); await page.getByRole( 'menuitem', { name: 'Create pattern' } ).click(); const createPatternDialog = page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) diff --git a/test/e2e/specs/editor/various/pattern-overrides.spec.js b/test/e2e/specs/editor/various/pattern-overrides.spec.js index 145fa9a93bab1..d3ebf35761595 100644 --- a/test/e2e/specs/editor/various/pattern-overrides.spec.js +++ b/test/e2e/specs/editor/various/pattern-overrides.spec.js @@ -40,16 +40,16 @@ test.describe( 'Pattern Overrides', () => { await page .getByRole( 'region', { name: 'Patterns content' } ) - .getByRole( 'button', { name: 'add new pattern' } ) + .getByRole( 'button', { name: 'add pattern' } ) .click(); await page - .getByRole( 'menu', { name: 'add new pattern' } ) - .getByRole( 'menuitem', { name: 'add new pattern' } ) + .getByRole( 'menu', { name: 'add pattern' } ) + .getByRole( 'menuitem', { name: 'add pattern' } ) .click(); const createPatternDialog = page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) diff --git a/test/e2e/specs/editor/various/patterns.spec.js b/test/e2e/specs/editor/various/patterns.spec.js index a3af79289f270..f5f73169a0f7f 100644 --- a/test/e2e/specs/editor/various/patterns.spec.js +++ b/test/e2e/specs/editor/various/patterns.spec.js @@ -37,7 +37,7 @@ test.describe( 'Unsynced pattern', () => { await page.getByRole( 'menuitem', { name: 'Create pattern' } ).click(); const createPatternDialog = page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) @@ -136,7 +136,7 @@ test.describe( 'Synced pattern', () => { await page.getByRole( 'menuitem', { name: 'Create pattern' } ).click(); const createPatternDialog = page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) @@ -376,7 +376,7 @@ test.describe( 'Synced pattern', () => { await editor.clickBlockOptionsMenuItem( 'Create pattern' ); const createPatternDialog = page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) @@ -426,7 +426,7 @@ test.describe( 'Synced pattern', () => { await editor.clickBlockOptionsMenuItem( 'Create pattern' ); const createPatternDialog = editor.page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) @@ -610,7 +610,7 @@ test.describe( 'Synced pattern', () => { await editor.clickBlockOptionsMenuItem( 'Create pattern' ); const createPatternDialog = editor.page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) diff --git a/test/e2e/specs/editor/various/taxonomies.spec.js b/test/e2e/specs/editor/various/taxonomies.spec.js index efd8c9c6ee7fe..3c8231facd3b7 100644 --- a/test/e2e/specs/editor/various/taxonomies.spec.js +++ b/test/e2e/specs/editor/various/taxonomies.spec.js @@ -79,9 +79,7 @@ test.describe( 'Taxonomies', () => { const tagName = 'tag-' + generateRandomNumber(); const tags = page.locator( '.components-form-token-field__token-text' ); - await page - .getByRole( 'combobox', { name: 'Add New Tag' } ) - .fill( tagName ); + await page.getByRole( 'combobox', { name: 'Add tag' } ).fill( tagName ); await page.keyboard.press( 'Enter' ); await expect( tags ).toHaveCount( 1 ); @@ -116,9 +114,7 @@ test.describe( 'Taxonomies', () => { const tagName = "tag'-" + generateRandomNumber(); const tags = page.locator( '.components-form-token-field__token-text' ); - await page - .getByRole( 'combobox', { name: 'Add New Tag' } ) - .fill( tagName ); + await page.getByRole( 'combobox', { name: 'Add tag' } ).fill( tagName ); await page.keyboard.press( 'Enter' ); await expect( tags ).toHaveCount( 1 ); diff --git a/test/e2e/specs/editor/various/writing-flow.spec.js b/test/e2e/specs/editor/various/writing-flow.spec.js index 4077d6dcc5820..da3e62e35df53 100644 --- a/test/e2e/specs/editor/various/writing-flow.spec.js +++ b/test/e2e/specs/editor/various/writing-flow.spec.js @@ -1088,7 +1088,7 @@ test.describe( 'Writing Flow (@firefox, @webkit)', () => { await editor.clickBlockOptionsMenuItem( 'Create pattern' ); const createPatternDialog = editor.page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) diff --git a/test/e2e/specs/site-editor/block-style-variations.spec.js b/test/e2e/specs/site-editor/block-style-variations.spec.js index 1fa8972d34d6c..1aa3c576b72c0 100644 --- a/test/e2e/specs/site-editor/block-style-variations.spec.js +++ b/test/e2e/specs/site-editor/block-style-variations.spec.js @@ -302,7 +302,7 @@ class SiteEditorBlockStyleVariations { async function draftNewPage( page ) { await page.getByRole( 'button', { name: 'Pages' } ).click(); - await page.getByRole( 'button', { name: 'Add new page' } ).click(); + await page.getByRole( 'button', { name: 'Add page' } ).click(); await page .locator( 'role=dialog[name="Draft new: page"i]' ) .locator( 'role=textbox[name="title"i]' ) diff --git a/test/e2e/specs/site-editor/pages.spec.js b/test/e2e/specs/site-editor/pages.spec.js index 54f8a64e067cb..1a8ab33b9e884 100644 --- a/test/e2e/specs/site-editor/pages.spec.js +++ b/test/e2e/specs/site-editor/pages.spec.js @@ -5,7 +5,7 @@ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); async function draftNewPage( page ) { await page.getByRole( 'button', { name: 'Pages' } ).click(); - await page.getByRole( 'button', { name: 'Add new page' } ).click(); + await page.getByRole( 'button', { name: 'Add page' } ).click(); await page .locator( 'role=dialog[name="Draft new: page"i]' ) .locator( 'role=textbox[name="title"i]' ) @@ -247,7 +247,7 @@ test.describe( 'Pages', () => { // Create a custom template first. const templateName = 'demo'; await page.getByRole( 'button', { name: 'Templates' } ).click(); - await page.getByRole( 'button', { name: 'Add New Template' } ).click(); + await page.getByRole( 'button', { name: 'Add template' } ).click(); await page .getByRole( 'button', { name: 'A custom template can be manually applied to any post or page.', diff --git a/test/e2e/specs/site-editor/patterns.spec.js b/test/e2e/specs/site-editor/patterns.spec.js index 162ec15146c67..dcb5d8c413877 100644 --- a/test/e2e/specs/site-editor/patterns.spec.js +++ b/test/e2e/specs/site-editor/patterns.spec.js @@ -43,21 +43,21 @@ test.describe( 'Patterns', () => { await expect( patterns.content ).toContainText( 'No results' ); await patterns.content - .getByRole( 'button', { name: 'add new pattern' } ) + .getByRole( 'button', { name: 'add pattern' } ) .click(); const addNewMenuItem = page .getByRole( 'menu', { - name: 'add new pattern', + name: 'add pattern', } ) .getByRole( 'menuitem', { - name: 'add new pattern', + name: 'add pattern', } ); await expect( addNewMenuItem ).toBeFocused(); await addNewMenuItem.click(); const createPatternDialog = page.getByRole( 'dialog', { - name: 'add new pattern', + name: 'add pattern', } ); await createPatternDialog .getByRole( 'textbox', { name: 'Name' } ) diff --git a/test/e2e/specs/site-editor/site-editor-url-navigation.spec.js b/test/e2e/specs/site-editor/site-editor-url-navigation.spec.js index a0cc0af5463ae..580b106022715 100644 --- a/test/e2e/specs/site-editor/site-editor-url-navigation.spec.js +++ b/test/e2e/specs/site-editor/site-editor-url-navigation.spec.js @@ -33,7 +33,7 @@ test.describe( 'Site editor url navigation', () => { await admin.visitSiteEditor(); await page.click( 'role=button[name="Templates"]' ); - await page.click( 'role=button[name="Add New Template"i]' ); + await page.click( 'role=button[name="Add Template"i]' ); await page .getByRole( 'button', { name: 'Single item: Post', @@ -54,10 +54,10 @@ test.describe( 'Site editor url navigation', () => { } ) => { await admin.visitSiteEditor(); await page.click( 'role=button[name="Patterns"i]' ); - await page.click( 'role=button[name="add new pattern"i]' ); + await page.click( 'role=button[name="add pattern"i]' ); await page - .getByRole( 'menu', { name: 'add new pattern' } ) - .getByRole( 'menuitem', { name: 'add new template part' } ) + .getByRole( 'menu', { name: 'add pattern' } ) + .getByRole( 'menuitem', { name: 'add template part' } ) .click(); // Fill in a name in the dialog that pops up. await page.type( 'role=dialog >> role=textbox[name="Name"i]', 'Demo' ); diff --git a/test/e2e/specs/site-editor/template-registration.spec.js b/test/e2e/specs/site-editor/template-registration.spec.js index 9856db9713038..4f35d81737ae2 100644 --- a/test/e2e/specs/site-editor/template-registration.spec.js +++ b/test/e2e/specs/site-editor/template-registration.spec.js @@ -275,7 +275,7 @@ test.describe( 'Block template registration', () => { await admin.visitSiteEditor( { postType: 'wp_template', } ); - await page.getByLabel( 'Add New Template' ).click(); + await page.getByLabel( 'Add template' ).click(); await page.getByRole( 'button', { name: 'Author Archives' } ).click(); await page .getByRole( 'button', { name: 'Author For a specific item' } ) diff --git a/test/e2e/specs/site-editor/templates.spec.js b/test/e2e/specs/site-editor/templates.spec.js index 0c43fa02fc73b..7eeb61ec05746 100644 --- a/test/e2e/specs/site-editor/templates.spec.js +++ b/test/e2e/specs/site-editor/templates.spec.js @@ -14,7 +14,7 @@ test.describe( 'Templates', () => { const templateName = 'demo'; await admin.visitSiteEditor(); await page.getByRole( 'button', { name: 'Templates' } ).click(); - await page.getByRole( 'button', { name: 'Add New Template' } ).click(); + await page.getByRole( 'button', { name: 'Add template' } ).click(); await page .getByRole( 'button', { name: 'A custom template can be manually applied to any post or page.', From 2c8b4824f746e8ec72b24591867cc820e623252e Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <359867+desrosj@users.noreply.github.com> Date: Mon, 10 Feb 2025 09:58:06 -0500 Subject: [PATCH 23/96] Remove `react-native` dependabot group. (#69118) Mobile development is effectively on hold. The two related GitHub Action workflows have been disabled (#67799) because the MacOS 12 runner is now unsupported by GitHub and work is required to make the workflows compatible with newer runner images (see #67595). This removes the `react-native` dependabot group to avoid pull requests from being opened for 3rd party actions that are only used in these workflows since the updates cannot be properly tested. Co-authored-by: desrosj Co-authored-by: dcalhoun Co-authored-by: t-hamano --- .github/dependabot.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 76d1e45e3c6ce..3118fd1000951 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -19,8 +19,4 @@ updates: - 'actions/setup-java' - 'gradle/*' - 'reactivecircus/*' - react-native: - patterns: - - 'actions/setup-java' - - 'gradle/*' - - 'reactivecircus/*' + - 'ruby/setup-ruby' From c8cf3b90f7a034e681cd301769aef548ef6c9c1f Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <359867+desrosj@users.noreply.github.com> Date: Mon, 10 Feb 2025 12:11:42 -0500 Subject: [PATCH 24/96] Further adjust dependabot. (#69122) Co-authored-by: desrosj --- .github/dependabot.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3118fd1000951..a3a2b1214f783 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,12 +11,16 @@ updates: labels: - 'GitHub Actions' - '[Type] Build Tooling' + ignore: + - dependency-name: 'actions/setup-java' + versions: ['*'] + - dependency-name: 'gradle/*' + versions: ['*'] + - dependency-name: 'reactivecircus/*' + versions: ['*'] + - dependency-name: 'ruby/setup-ruby' + versions: ['*'] groups: github-actions: patterns: - '*' - exclude-patterns: - - 'actions/setup-java' - - 'gradle/*' - - 'reactivecircus/*' - - 'ruby/setup-ruby' From 0479a0801241890287572300ae21211a7136b5ae Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Tue, 11 Feb 2025 07:06:08 +0530 Subject: [PATCH 25/96] Enabled Full height in Additional CSS (#68993) * Enabled Full Height in Additional CSS Field * Enabled Full Height in Additional CSS Field * Fixed Border Issue After Full Height * Added Suggested changes Co-authored-by: shail-mehta Co-authored-by: t-hamano Co-authored-by: Rishit30G Co-authored-by: ciampo Co-authored-by: annezazu --- .../edit-site/src/components/global-styles/screen-root.js | 1 + packages/edit-site/src/components/global-styles/style.scss | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/packages/edit-site/src/components/global-styles/screen-root.js b/packages/edit-site/src/components/global-styles/screen-root.js index ce9e4d08daf0a..e15eae1cd3096 100644 --- a/packages/edit-site/src/components/global-styles/screen-root.js +++ b/packages/edit-site/src/components/global-styles/screen-root.js @@ -55,6 +55,7 @@ function ScreenRoot() { return ( diff --git a/packages/edit-site/src/components/global-styles/style.scss b/packages/edit-site/src/components/global-styles/style.scss index 99b1c8c92bbd0..dae6a9df73afe 100644 --- a/packages/edit-site/src/components/global-styles/style.scss +++ b/packages/edit-site/src/components/global-styles/style.scss @@ -228,9 +228,14 @@ } } +.edit-site-global-styles-sidebar__navigator-provider { + height: 100%; +} + .edit-site-global-styles-sidebar__navigator-screen { display: flex; flex-direction: column; + height: 100%; } .edit-site-global-styles-sidebar__navigator-screen .single-column { From e8afdae60760c9978d2733540314ebbcee6a030a Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:37:20 +0900 Subject: [PATCH 26/96] Site Editor: Use the same editor component for all routes (#69093) * Site Editor: Use the same editor component for all routes * Remove MaybeEditor component Co-authored-by: t-hamano Co-authored-by: stokesman Co-authored-by: SainathPoojary Co-authored-by: Mayank-Tripathi32 Co-authored-by: hbhalodia --- .../edit-site/src/components/editor/index.js | 18 ++++++++----- .../index.js => editor/site-preview.js} | 27 +++++-------------- .../src/components/site-editor-routes/home.js | 4 +-- .../site-editor-routes/template-item.js | 6 ++--- .../site-editor-routes/template-part-item.js | 6 ++--- 5 files changed, 27 insertions(+), 34 deletions(-) rename packages/edit-site/src/components/{maybe-editor/index.js => editor/site-preview.js} (74%) diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js index ad88ee07e2150..3a4828d93e911 100644 --- a/packages/edit-site/src/components/editor/index.js +++ b/packages/edit-site/src/components/editor/index.js @@ -23,6 +23,7 @@ import { privateApis as routerPrivateApis } from '@wordpress/router'; import { decodeEntities } from '@wordpress/html-entities'; import { Icon, arrowUpLeft } from '@wordpress/icons'; import { store as blockEditorStore } from '@wordpress/block-editor'; +import { addQueryArgs } from '@wordpress/url'; /** * Internal dependencies @@ -53,7 +54,7 @@ import { useResolveEditedEntity, useSyncDeprecatedEntityIntoState, } from './use-resolve-edited-entity'; -import { addQueryArgs } from '@wordpress/url'; +import SitePreview from './site-preview'; const { Editor, BackButton } = unlock( editorPrivateApis ); const { useHistory, useLocation } = unlock( routerPrivateApis ); @@ -117,7 +118,10 @@ function getNavigationPath( location, postType ) { return addQueryArgs( path, { canvas: undefined } ); } -export default function EditSiteEditor( { isPostsList = false } ) { +export default function EditSiteEditor( { + isHomeRoute = false, + isPostsList = false, +} ) { const disableMotion = useReducedMotion(); const location = useLocation(); const { canvas = 'view' } = location.query; @@ -128,7 +132,7 @@ export default function EditSiteEditor( { isPostsList = false } ) { useSyncDeprecatedEntityIntoState( entity ); const { postType, postId, context } = entity; const { - supportsGlobalStyles, + isBlockBasedTheme, editorCanvasView, currentPostIsTrashed, hasSiteIcon, @@ -140,7 +144,7 @@ export default function EditSiteEditor( { isPostsList = false } ) { const siteData = getEntityRecord( 'root', '__unstableBase', undefined ); return { - supportsGlobalStyles: getCurrentTheme()?.is_block_theme, + isBlockBasedTheme: getCurrentTheme()?.is_block_theme, editorCanvasView: getEditorCanvasContainerView(), currentPostIsTrashed: select( editorStore ).getCurrentPostAttribute( 'status' ) === @@ -244,7 +248,9 @@ export default function EditSiteEditor( { isPostsList = false } ) { duration: disableMotion ? 0 : 0.2, }; - return ( + return ! isBlockBasedTheme && isHomeRoute ? ( + + ) : ( <> ) } - { supportsGlobalStyles && } + { isBlockBasedTheme && } ) } diff --git a/packages/edit-site/src/components/maybe-editor/index.js b/packages/edit-site/src/components/editor/site-preview.js similarity index 74% rename from packages/edit-site/src/components/maybe-editor/index.js rename to packages/edit-site/src/components/editor/site-preview.js index 3ffa5a35b82ef..e53f87bc5b249 100644 --- a/packages/edit-site/src/components/maybe-editor/index.js +++ b/packages/edit-site/src/components/editor/site-preview.js @@ -1,32 +1,19 @@ /** * WordPress dependencies */ - -import { store as coreStore } from '@wordpress/core-data'; -import { useSelect } from '@wordpress/data'; import { __ } from '@wordpress/i18n'; +import { useSelect } from '@wordpress/data'; +import { store as coreStore } from '@wordpress/core-data'; -/** - * Internal dependencies - */ - -import Editor from '../editor'; - -export function MaybeEditor( { showEditor = true } ) { - const { isBlockBasedTheme, siteUrl } = useSelect( ( select ) => { - const { getEntityRecord, getCurrentTheme } = select( coreStore ); +export default function SitePreview() { + const siteUrl = useSelect( ( select ) => { + const { getEntityRecord } = select( coreStore ); const siteData = getEntityRecord( 'root', '__unstableBase' ); - - return { - isBlockBasedTheme: getCurrentTheme()?.is_block_theme, - siteUrl: siteData?.home, - }; + return siteData?.home; }, [] ); // If theme is block based, return the Editor, otherwise return the site preview. - return isBlockBasedTheme || showEditor ? ( - - ) : ( + return ( , - preview: , + preview: , mobile: , }, }; diff --git a/packages/edit-site/src/components/site-editor-routes/template-item.js b/packages/edit-site/src/components/site-editor-routes/template-item.js index 22726f6a5ac43..8ad3ab2b69990 100644 --- a/packages/edit-site/src/components/site-editor-routes/template-item.js +++ b/packages/edit-site/src/components/site-editor-routes/template-item.js @@ -1,7 +1,7 @@ /** * Internal dependencies */ -import { MaybeEditor } from '../maybe-editor'; +import Editor from '../editor'; import SidebarNavigationScreenTemplatesBrowse from '../sidebar-navigation-screen-templates-browse'; export const templateItemRoute = { @@ -9,7 +9,7 @@ export const templateItemRoute = { path: '/wp_template/*postId', areas: { sidebar: , - mobile: , - preview: , + mobile: , + preview: , }, }; diff --git a/packages/edit-site/src/components/site-editor-routes/template-part-item.js b/packages/edit-site/src/components/site-editor-routes/template-part-item.js index e98af337b1c66..a2b21cf23f808 100644 --- a/packages/edit-site/src/components/site-editor-routes/template-part-item.js +++ b/packages/edit-site/src/components/site-editor-routes/template-part-item.js @@ -1,7 +1,7 @@ /** * Internal dependencies */ -import { MaybeEditor } from '../maybe-editor'; +import Editor from '../editor'; import SidebarNavigationScreenPatterns from '../sidebar-navigation-screen-patterns'; export const templatePartItemRoute = { @@ -9,7 +9,7 @@ export const templatePartItemRoute = { path: '/wp_template_part/*postId', areas: { sidebar: , - mobile: , - preview: , + mobile: , + preview: , }, }; From 9b387c839e289c93dd6e91708202e3ab5e6f072f Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Tue, 11 Feb 2025 07:23:45 +0530 Subject: [PATCH 27/96] Fixed: Empty Pattern Overlap in Pattern Title in Dataviews Table Layout (#68997) * Fixed: Empty Pattern Overlap in Dataviews Table Layout * Fix Overlap Issue in RTL * Fix Text Overlap Issue * Fix Overlap Issue in Empty Template Table Layout Co-authored-by: shail-mehta Co-authored-by: t-hamano Co-authored-by: dhruvang21 Co-authored-by: carolinan --- packages/edit-site/src/components/page-patterns/style.scss | 2 ++ packages/edit-site/src/components/page-templates/style.scss | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/edit-site/src/components/page-patterns/style.scss b/packages/edit-site/src/components/page-patterns/style.scss index 8a2d71d87633d..14ad49415a56f 100644 --- a/packages/edit-site/src/components/page-patterns/style.scss +++ b/packages/edit-site/src/components/page-patterns/style.scss @@ -19,6 +19,8 @@ .dataviews-view-table & { width: 96px; flex-grow: 0; + text-wrap: balance; // Fallback for Safari. + text-wrap: pretty; } } diff --git a/packages/edit-site/src/components/page-templates/style.scss b/packages/edit-site/src/components/page-templates/style.scss index 89aa9dd312fb4..a9890fc75c02c 100644 --- a/packages/edit-site/src/components/page-templates/style.scss +++ b/packages/edit-site/src/components/page-templates/style.scss @@ -23,6 +23,8 @@ position: relative; width: 120px; max-height: 160px; + text-wrap: balance; // Fallback for Safari. + text-wrap: pretty; &::after { content: ""; From aaa5aee91df13f21a3ea01bfcee572b88a846596 Mon Sep 17 00:00:00 2001 From: Yogesh Bhutkar Date: Tue, 11 Feb 2025 16:23:38 +0530 Subject: [PATCH 28/96] Update keyboard shortcuts to use `primaryShift+backspace` for block deletion (#69074) * update keyboard shortcuts to use `primaryShift+backspace` for block deletion * fix: simplify condition to skip delete listener for delete key combo Unlinked contributors: Czab1, tjarrettveracode. Co-authored-by: yogeshbhutkar Co-authored-by: t-hamano Co-authored-by: jarekmorawski Co-authored-by: Mamaduka Co-authored-by: talldan Co-authored-by: jasmussen Co-authored-by: dcalhoun --- .../src/components/keyboard-shortcuts/index.js | 2 +- .../rich-text/event-listeners/delete.js | 6 +++--- test/e2e/specs/editor/blocks/navigation.spec.js | 10 +++++----- .../specs/editor/various/block-deletion.spec.js | 2 +- .../specs/editor/various/block-locking.spec.js | 2 +- test/e2e/specs/editor/various/list-view.spec.js | 16 ++++++++++------ test/e2e/specs/site-editor/template-part.spec.js | 2 +- test/e2e/specs/widgets/editing-widgets.spec.js | 2 +- 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/block-editor/src/components/keyboard-shortcuts/index.js b/packages/block-editor/src/components/keyboard-shortcuts/index.js index fcc2cea404375..4d368e6c1d0ab 100644 --- a/packages/block-editor/src/components/keyboard-shortcuts/index.js +++ b/packages/block-editor/src/components/keyboard-shortcuts/index.js @@ -29,7 +29,7 @@ function KeyboardShortcutsRegister() { category: 'block', description: __( 'Remove the selected block(s).' ), keyCombination: { - modifier: 'shift', + modifier: 'primaryShift', character: 'backspace', }, } ); diff --git a/packages/block-editor/src/components/rich-text/event-listeners/delete.js b/packages/block-editor/src/components/rich-text/event-listeners/delete.js index 8373ca3c9f72a..ad59ae8a70d32 100644 --- a/packages/block-editor/src/components/rich-text/event-listeners/delete.js +++ b/packages/block-editor/src/components/rich-text/event-listeners/delete.js @@ -6,7 +6,7 @@ import { isCollapsed, isEmpty } from '@wordpress/rich-text'; export default ( props ) => ( element ) => { function onKeyDown( event ) { - const { keyCode, shiftKey } = event; + const { keyCode, shiftKey, ctrlKey, metaKey } = event; if ( event.defaultPrevented ) { return; @@ -30,8 +30,8 @@ export default ( props ) => ( element ) => { return; } - // Exclude shift+backspace as they are shortcuts for deleting blocks. - if ( shiftKey ) { + // Exclude (command|ctrl)+shift+backspace as they are shortcuts for deleting blocks. + if ( shiftKey && ( ctrlKey || metaKey ) ) { return; } diff --git a/test/e2e/specs/editor/blocks/navigation.spec.js b/test/e2e/specs/editor/blocks/navigation.spec.js index 769e30c99dab3..c04ef78811e06 100644 --- a/test/e2e/specs/editor/blocks/navigation.spec.js +++ b/test/e2e/specs/editor/blocks/navigation.spec.js @@ -276,7 +276,7 @@ test.describe( 'Navigation block', () => { await pageUtils.pressKeys( 'ArrowDown' ); // remove the child link - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); const submenuBlock2 = editor.canvas.getByRole( 'document', { name: 'Block: Submenu', @@ -494,7 +494,7 @@ test.describe( 'Navigation block', () => { await pageUtils.pressKeys( 'ArrowDown', { times: 4 } ); await navigation.checkLabelFocus( 'wordpress.org' ); // Delete the nav link - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); // Focus moved to sibling await navigation.checkLabelFocus( 'Dog' ); // Add a link back so we can delete the first submenu link and see if focus returns to the parent submenu item @@ -507,15 +507,15 @@ test.describe( 'Navigation block', () => { await pageUtils.pressKeys( 'ArrowUp', { times: 2 } ); await navigation.checkLabelFocus( 'Dog' ); // Delete the nav link - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await pageUtils.pressKeys( 'ArrowDown' ); // Focus moved to parent submenu item await navigation.checkLabelFocus( 'example.com' ); // Deleting this should move focus to the sibling item - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await navigation.checkLabelFocus( 'Cat' ); // Deleting with no more siblings should focus the navigation block again - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await expect( navBlock ).toBeFocused(); // Wait until the nav block inserter is visible before we continue. await expect( navBlockInserter ).toBeVisible(); diff --git a/test/e2e/specs/editor/various/block-deletion.spec.js b/test/e2e/specs/editor/various/block-deletion.spec.js index 5e4ead97c986f..f90923c6dc382 100644 --- a/test/e2e/specs/editor/various/block-deletion.spec.js +++ b/test/e2e/specs/editor/various/block-deletion.spec.js @@ -134,7 +134,7 @@ test.describe( 'Block deletion', () => { ).toBeFocused(); // Remove the current paragraph via dedicated keyboard shortcut. - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); // Ensure the last block was removed. await expect.poll( editor.getBlocks ).toMatchObject( [ diff --git a/test/e2e/specs/editor/various/block-locking.spec.js b/test/e2e/specs/editor/various/block-locking.spec.js index b31fc9e2cd140..cf81fede4c31d 100644 --- a/test/e2e/specs/editor/various/block-locking.spec.js +++ b/test/e2e/specs/editor/various/block-locking.spec.js @@ -133,7 +133,7 @@ test.describe( 'Block Locking', () => { ).toBeVisible(); await paragraph.click(); - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await expect.poll( editor.getBlocks ).toMatchObject( [ { diff --git a/test/e2e/specs/editor/various/list-view.spec.js b/test/e2e/specs/editor/various/list-view.spec.js index 17f82ce1b76e3..988683c8d11aa 100644 --- a/test/e2e/specs/editor/various/list-view.spec.js +++ b/test/e2e/specs/editor/various/list-view.spec.js @@ -812,8 +812,8 @@ test.describe( 'List View', () => { // Delete remaining blocks. // Keyboard shortcut should also work. - await pageUtils.pressKeys( 'shift+Backspace' ); - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await expect .poll( listViewUtils.getBlocksWithA11yAttributes, @@ -845,7 +845,7 @@ test.describe( 'List View', () => { { name: 'core/heading', selected: false }, ] ); - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await expect .poll( listViewUtils.getBlocksWithA11yAttributes, @@ -868,7 +868,11 @@ test.describe( 'List View', () => { .getByRole( 'gridcell', { name: 'File' } ) .getByRole( 'link' ) .focus(); - for ( const keys of [ 'Delete', 'Backspace', 'shift+Backspace' ] ) { + for ( const keys of [ + 'Delete', + 'Backspace', + 'primaryShift+Backspace', + ] ) { await pageUtils.pressKeys( keys ); await expect .poll( @@ -1136,7 +1140,7 @@ test.describe( 'List View', () => { optionsForFileMenu, 'Pressing Space should also open the menu dropdown' ).toBeVisible(); - await pageUtils.pressKeys( 'shift+Backspace' ); // Keyboard shortcut for Delete. + await pageUtils.pressKeys( 'primaryShift+Backspace' ); // Keyboard shortcut for Delete. await expect .poll( listViewUtils.getBlocksWithA11yAttributes, @@ -1156,7 +1160,7 @@ test.describe( 'List View', () => { optionsForFileMenu.getByRole( 'menuitem', { name: 'Delete' } ), 'The delete menu item should be hidden for locked blocks' ).toBeHidden(); - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await expect .poll( listViewUtils.getBlocksWithA11yAttributes, diff --git a/test/e2e/specs/site-editor/template-part.spec.js b/test/e2e/specs/site-editor/template-part.spec.js index 9d5c0ca05b0d9..d3feeb866619a 100644 --- a/test/e2e/specs/site-editor/template-part.spec.js +++ b/test/e2e/specs/site-editor/template-part.spec.js @@ -375,7 +375,7 @@ test.describe( 'Template Part', () => { await editor.selectBlocks( siteTitle ); // Remove the default site title block. - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); // Insert a group block with a Site Title block inside. await editor.insertBlock( { diff --git a/test/e2e/specs/widgets/editing-widgets.spec.js b/test/e2e/specs/widgets/editing-widgets.spec.js index f4d160f8a36db..648b04d3e202b 100644 --- a/test/e2e/specs/widgets/editing-widgets.spec.js +++ b/test/e2e/specs/widgets/editing-widgets.spec.js @@ -573,7 +573,7 @@ test.describe( 'Widgets screen', () => { .getByRole( 'document', { name: 'Block: Paragraph' } ) .filter( { hasText: 'Second Paragraph' } ) .focus(); - await pageUtils.pressKeys( 'shift+Backspace' ); + await pageUtils.pressKeys( 'primaryShift+Backspace' ); await widgetsScreen.saveWidgets(); await expect.poll( widgetsScreen.getWidgetAreaBlocks ).toMatchObject( { From ceb88fa467b65ae2e3ce16417b36d3f67665e6f7 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 11 Feb 2025 16:39:23 +0300 Subject: [PATCH 29/96] Editor: Add loading state to the 'PageAttributesParent' component (#69062) Unlinked contributors: mapk, ItsJonQ, MichaelArestad. Co-authored-by: Mamaduka Co-authored-by: karmatosed Co-authored-by: ndiego Co-authored-by: mirka <0mirka00@git.wordpress.org> Co-authored-by: iandunn --- .../src/components/page-attributes/parent.js | 93 +++++++++++-------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/packages/editor/src/components/page-attributes/parent.js b/packages/editor/src/components/page-attributes/parent.js index bd2861766c334..56381f448abc4 100644 --- a/packages/editor/src/components/page-attributes/parent.js +++ b/packages/editor/src/components/page-attributes/parent.js @@ -61,47 +61,63 @@ export const getItemPriority = ( name, searchValue ) => { export function PageAttributesParent() { const { editPost } = useDispatch( editorStore ); const [ fieldValue, setFieldValue ] = useState( false ); - const { isHierarchical, parentPostId, parentPostTitle, pageItems } = - useSelect( - ( select ) => { - const { getPostType, getEntityRecords, getEntityRecord } = - select( coreStore ); - const { getCurrentPostId, getEditedPostAttribute } = - select( editorStore ); - const postTypeSlug = getEditedPostAttribute( 'type' ); - const pageId = getEditedPostAttribute( 'parent' ); - const pType = getPostType( postTypeSlug ); - const postId = getCurrentPostId(); - const postIsHierarchical = pType?.hierarchical ?? false; - const query = { - per_page: 100, - exclude: postId, - parent_exclude: postId, - orderby: 'menu_order', - order: 'asc', - _fields: 'id,title,parent', - }; + const { + isHierarchical, + parentPostId, + parentPostTitle, + pageItems, + isLoading, + } = useSelect( + ( select ) => { + const { + getPostType, + getEntityRecords, + getEntityRecord, + isResolving, + } = select( coreStore ); + const { getCurrentPostId, getEditedPostAttribute } = + select( editorStore ); + const postTypeSlug = getEditedPostAttribute( 'type' ); + const pageId = getEditedPostAttribute( 'parent' ); + const pType = getPostType( postTypeSlug ); + const postId = getCurrentPostId(); + const postIsHierarchical = pType?.hierarchical ?? false; + const query = { + per_page: 100, + exclude: postId, + parent_exclude: postId, + orderby: 'menu_order', + order: 'asc', + _fields: 'id,title,parent', + }; - // Perform a search when the field is changed. - if ( !! fieldValue ) { - query.search = fieldValue; - } + // Perform a search when the field is changed. + if ( !! fieldValue ) { + query.search = fieldValue; + } - const parentPost = pageId - ? getEntityRecord( 'postType', postTypeSlug, pageId ) - : null; + const parentPost = pageId + ? getEntityRecord( 'postType', postTypeSlug, pageId ) + : null; - return { - isHierarchical: postIsHierarchical, - parentPostId: pageId, - parentPostTitle: parentPost ? getTitle( parentPost ) : '', - pageItems: postIsHierarchical - ? getEntityRecords( 'postType', postTypeSlug, query ) - : null, - }; - }, - [ fieldValue ] - ); + return { + isHierarchical: postIsHierarchical, + parentPostId: pageId, + parentPostTitle: parentPost ? getTitle( parentPost ) : '', + pageItems: postIsHierarchical + ? getEntityRecords( 'postType', postTypeSlug, query ) + : null, + isLoading: postIsHierarchical + ? isResolving( 'getEntityRecords', [ + 'postType', + postTypeSlug, + query, + ] ) + : false, + }; + }, + [ fieldValue ] + ); const parentOptions = useMemo( () => { const getOptionsFromTree = ( tree, level = 0 ) => { @@ -187,6 +203,7 @@ export function PageAttributesParent() { onFilterValueChange={ debounce( handleKeydown, 300 ) } onChange={ handleChange } hideLabelFromVision + isLoading={ isLoading } /> ); } From 6e42fc3a3d6be9922dc976662b11a06bf8481ef9 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <359867+desrosj@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:37:08 -0500 Subject: [PATCH 30/96] Try with no versions. (#69144) Co-authored-by: desrosj --- .github/dependabot.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a3a2b1214f783..6353e3478a161 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,13 +13,9 @@ updates: - '[Type] Build Tooling' ignore: - dependency-name: 'actions/setup-java' - versions: ['*'] - dependency-name: 'gradle/*' - versions: ['*'] - dependency-name: 'reactivecircus/*' - versions: ['*'] - dependency-name: 'ruby/setup-ruby' - versions: ['*'] groups: github-actions: patterns: From 4cc312ba7d84510b0d1cd8c06d0fcce3a40c78ea Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers <359867+desrosj@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:13:49 -0500 Subject: [PATCH 31/96] Monitor workflow files in non-default locations. (#69148) In addition to the default `.github/workflows` directory for GitHub Actions workflows, the repo also has a `setup-node` folder containing a composite action. This is not currently monitored by Dependabot for updates. There are several updates to 3rd party actions in this composite action that are needed to avoid problems as a result of upstream changes. This updates the Dependabot configuration to also monitor this directory. Co-authored-by: desrosj --- .github/dependabot.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6353e3478a161..c469ccfd74b55 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,9 @@ version: 2 updates: # Check for updates to GitHub Actions. - package-ecosystem: 'github-actions' - directory: '/' + directories: + - '.github/workflows' + - '.github/setup-node' schedule: interval: 'daily' open-pull-requests-limit: 10 From 298819515218b6847d17c13794f71d33c2345dff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:53:23 +0000 Subject: [PATCH 32/96] Bump the github-actions group across 1 directory with 3 updates (#69149) Bumps the github-actions group with 3 updates in the /.github/setup-node directory: [actions/setup-node](https://github.com/actions/setup-node), [actions/cache](https://github.com/actions/cache) and [actions/upload-artifact](https://github.com/actions/upload-artifact). Updates `actions/setup-node` from 4.0.2 to 4.2.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/60edb5dd545a775178f52524783378180af0d1f8...1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a) Updates `actions/cache` from 4.0.2 to 4.2.0 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0c45773b623bea8c8e75f6c82b208c3cf94ea4f9...1bd1e32a3bdc45362d1e726936510720a7c30a57) Updates `actions/upload-artifact` from 4.3.3 to 4.6.0 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/65462800fd760344b1a7b4382951275a0abb4808...65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: desrosj Co-authored-by: ockham Co-authored-by: swissspidy --- .github/setup-node/action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/setup-node/action.yml b/.github/setup-node/action.yml index a17adfe5f5007..83c4123fbab93 100644 --- a/.github/setup-node/action.yml +++ b/.github/setup-node/action.yml @@ -10,7 +10,7 @@ runs: using: 'composite' steps: - name: Use desired version of Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version-file: '.nvmrc' node-version: ${{ inputs.node-version }} @@ -25,7 +25,7 @@ runs: - name: Cache node_modules id: cache-node_modules - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: path: '**/node_modules' key: node_modules-${{ runner.os }}-${{ runner.arch }}-${{ steps.node-version.outputs.NODE_VERSION }}-${{ hashFiles('package-lock.json') }} @@ -36,7 +36,7 @@ runs: npm ci shell: bash - name: Upload npm logs as an artifact on failure - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 if: failure() with: name: npm-logs From dc40184eb8458926845882a89424c18b3949a223 Mon Sep 17 00:00:00 2001 From: Mayank Tripathi <70465598+Mayank-Tripathi32@users.noreply.github.com> Date: Tue, 11 Feb 2025 23:56:50 +0530 Subject: [PATCH 33/96] Writing Flow: restore early return for no block selection in tab nav hook (#69079) Co-authored-by: Mayank-Tripathi32 Co-authored-by: stokesman Co-authored-by: t-hamano Co-authored-by: singhakanshu00 Co-authored-by: Mamaduka --- .../block-editor/src/components/writing-flow/use-tab-nav.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/block-editor/src/components/writing-flow/use-tab-nav.js b/packages/block-editor/src/components/writing-flow/use-tab-nav.js index 46c40d56fe96d..7f06cfe651db3 100644 --- a/packages/block-editor/src/components/writing-flow/use-tab-nav.js +++ b/packages/block-editor/src/components/writing-flow/use-tab-nav.js @@ -125,6 +125,10 @@ export default function useTabNav() { return; } + if ( ! hasMultiSelection() && ! getSelectedBlockClientId() ) { + return; + } + const isShift = event.shiftKey; const direction = isShift ? 'findPrevious' : 'findNext'; const nextTabbable = focus.tabbable[ direction ]( event.target ); From fe2195e5016a8504f9b214a6911841b87a1fe29f Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Tue, 11 Feb 2025 20:21:39 +0100 Subject: [PATCH 34/96] Core Data: add type for term entity (#69151) Follow-up to #67668, makes it easy to use term types with `getEntityRecords` and the like --- packages/core-data/src/dynamic-entities.ts | 1 + packages/core-data/src/entity-types/index.ts | 3 ++ packages/core-data/src/entity-types/term.ts | 57 ++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 packages/core-data/src/entity-types/term.ts diff --git a/packages/core-data/src/dynamic-entities.ts b/packages/core-data/src/dynamic-entities.ts index 51b579cb0cfcf..7db8865fded64 100644 --- a/packages/core-data/src/dynamic-entities.ts +++ b/packages/core-data/src/dynamic-entities.ts @@ -18,6 +18,7 @@ export type WPEntityTypes< C extends ET.Context = 'edit' > = { Site: ET.Settings< C >; Status: ET.PostStatusObject< C >; Taxonomy: ET.Taxonomy< C >; + Term: ET.Term< C >; Theme: ET.Theme< C >; UnstableBase: ET.UnstableBase< C >; User: ET.User< C >; diff --git a/packages/core-data/src/entity-types/index.ts b/packages/core-data/src/entity-types/index.ts index 68087a74005b2..893de59cde548 100644 --- a/packages/core-data/src/entity-types/index.ts +++ b/packages/core-data/src/entity-types/index.ts @@ -17,6 +17,7 @@ import type { PostRevision } from './post-revision'; import type { Settings } from './settings'; import type { Sidebar } from './sidebar'; import type { Taxonomy } from './taxonomy'; +import type { Term } from './term'; import type { Theme } from './theme'; import type { User } from './user'; import type { Type } from './type'; @@ -46,6 +47,7 @@ export type { Taxonomy, TemplatePartArea, TemplateType, + Term, Theme, Type, Updatable, @@ -105,6 +107,7 @@ export interface PerPackageEntityRecords< C extends Context > { | Settings< C > | Sidebar< C > | Taxonomy< C > + | Term< C > | Theme< C > | User< C > | Type< C > diff --git a/packages/core-data/src/entity-types/term.ts b/packages/core-data/src/entity-types/term.ts new file mode 100644 index 0000000000000..f007832d7e755 --- /dev/null +++ b/packages/core-data/src/entity-types/term.ts @@ -0,0 +1,57 @@ +/** + * Internal dependencies + */ +import type { Context, ContextualField, OmitNevers } from './helpers'; + +import type { BaseEntityRecords as _BaseEntityRecords } from './base-entity-records'; + +declare module './base-entity-records' { + export namespace BaseEntityRecords { + export interface Term< C extends Context > { + /** + * Unique identifier for the term. + */ + id: number; + /** + * Number of published posts for the term. + */ + count: ContextualField< number, 'view' | 'edit', C >; + /** + * HTML description of the term. + */ + description: ContextualField< string, 'view' | 'edit', C >; + /** + * URL of the term. + */ + link: string; + /** + * HTML title for the term. + */ + name: string; + /** + * An alphanumeric identifier for the term unique to its type. + */ + slug: string; + /** + * Type attribution for the term. + */ + taxonomy: string; + /** + * The parent term ID. Only present for hierarchical taxonomies. + */ + parent?: number; + /** + * Meta fields. + */ + meta: ContextualField< + Record< string, string >, + 'view' | 'edit', + C + >; + } + } +} + +export type Term< C extends Context = 'edit' > = OmitNevers< + _BaseEntityRecords.Term< C > +>; From 0740acc08b4034c0d2b60790ae7627fb894f9106 Mon Sep 17 00:00:00 2001 From: Carolina Nymark Date: Wed, 12 Feb 2025 05:04:52 +0100 Subject: [PATCH 35/96] Fix: Site Editor should display a 404 message (#69009) Add a 404 message to the Site Editor. Add a new "notfound" route to the site editor routes. Pass a custom description to SidebarNavigationScreenMain, to display the 404 message on smaller screen widths. Co-authored-by: carolinan Co-authored-by: Mamaduka Co-authored-by: youknowriad Co-authored-by: t-hamano --- .../src/components/layout/style.scss | 4 +++ .../sidebar-navigation-screen-main/index.js | 25 ++++++++++------- .../components/site-editor-routes/index.js | 2 ++ .../components/site-editor-routes/notfound.js | 27 +++++++++++++++++++ 4 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 packages/edit-site/src/components/site-editor-routes/notfound.js diff --git a/packages/edit-site/src/components/layout/style.scss b/packages/edit-site/src/components/layout/style.scss index caf7dd78da4b3..16813e8ac0494 100644 --- a/packages/edit-site/src/components/layout/style.scss +++ b/packages/edit-site/src/components/layout/style.scss @@ -262,6 +262,10 @@ html.canvas-mode-edit-transition::view-transition-group(toggle) { } } +.edit-site-layout__area__404 { + margin: $canvas-padding; +} + .edit-site .components-editor-notices__snackbar { position: fixed; right: 0; diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js b/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js index abcc7183f6604..f4114782853ce 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js @@ -77,7 +77,7 @@ export function MainSidebarNavigationContent( { isBlockBasedTheme = true } ) { ); } -export default function SidebarNavigationScreenMain() { +export default function SidebarNavigationScreenMain( { customDescription } ) { const isBlockBasedTheme = useSelect( ( select ) => select( coreStore ).getCurrentTheme()?.is_block_theme, [] @@ -91,19 +91,24 @@ export default function SidebarNavigationScreenMain() { setEditorCanvasContainerView( undefined ); }, [ setEditorCanvasContainerView ] ); + let description; + if ( customDescription ) { + description = customDescription; + } else if ( isBlockBasedTheme ) { + description = __( + 'Customize the appearance of your website using the block editor.' + ); + } else { + description = __( + 'Explore block styles and patterns to refine your site' + ); + } + return ( , + mobile: ( + + ), + content: ( +

+ { __( '404 (Not Found)' ) } +

+ ), + }, +}; From a50775994dbc2c66051ca871580f77e24b839ed0 Mon Sep 17 00:00:00 2001 From: Yogesh Bhutkar Date: Wed, 12 Feb 2025 15:06:43 +0530 Subject: [PATCH 36/96] Rename `aspect` to `ratio` to carry the `defaultAspect` (#69085) Co-authored-by: yogeshbhutkar Co-authored-by: Mamaduka Co-authored-by: mikinchauhan --- .../src/components/image-editor/aspect-ratio-dropdown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js b/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js index b8432d1669f28..4862acd63d548 100644 --- a/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js +++ b/packages/block-editor/src/components/image-editor/aspect-ratio-dropdown.js @@ -93,7 +93,7 @@ export default function AspectRatioDropdown( { toggleProps } ) { { slug: 'original', name: __( 'Original' ), - aspect: defaultAspect, + ratio: defaultAspect, }, ...( showDefaultRatios ? defaultRatios From 9182d59c4f286a0ead7f5c36f76c49b04f1a2310 Mon Sep 17 00:00:00 2001 From: Himanshu Pathak Date: Wed, 12 Feb 2025 15:23:26 +0530 Subject: [PATCH 37/96] Font Size Picker: Remove Custom option from FontSizePickerSelect dropdown (#69038) * Font Size Picker: Remove Custom option from FontSizePickerSelect dropdown * Test: Fix test - with > 5 homogeneous font sizes * Test: Fix test - with > 5 heterogeneous font sizes * Test: Remove custom option selection test * Changelog: Add entry for FontSizePicker accessibility improvement Co-authored-by: himanshupathak95 Co-authored-by: afercia --- packages/components/CHANGELOG.md | 2 ++ .../font-size-picker-select.tsx | 27 +++---------------- .../src/font-size-picker/test/index.tsx | 26 ++---------------- schemas/json/wp-env.json | 7 ++++- 4 files changed, 14 insertions(+), 48 deletions(-) diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index a36773a8e16d6..4ff01907284a4 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- `FontSizePicker`: Remove Custom option from dropdown to prevent unexpected context changes during keyboard navigation ([#69038](https://github.com/WordPress/gutenberg/pull/69038)). + - `ComboboxControl`: Add an `isLoading` prop to show a loading spinner ([#68990](https://github.com/WordPress/gutenberg/pull/68990)) ## 29.3.0 (2025-01-29) diff --git a/packages/components/src/font-size-picker/font-size-picker-select.tsx b/packages/components/src/font-size-picker/font-size-picker-select.tsx index b33c382f3393e..fcc80355ddd19 100644 --- a/packages/components/src/font-size-picker/font-size-picker-select.tsx +++ b/packages/components/src/font-size-picker/font-size-picker-select.tsx @@ -20,21 +20,8 @@ const DEFAULT_OPTION: FontSizePickerSelectOption = { value: undefined, }; -const CUSTOM_OPTION: FontSizePickerSelectOption = { - key: 'custom', - name: __( 'Custom' ), -}; - const FontSizePickerSelect = ( props: FontSizePickerSelectProps ) => { - const { - __next40pxDefaultSize, - fontSizes, - value, - disableCustomFontSizes, - size, - onChange, - onSelectCustom, - } = props; + const { __next40pxDefaultSize, fontSizes, value, size, onChange } = props; const areAllSizesSameUnit = !! getCommonSizeUnit( fontSizes ); @@ -59,12 +46,10 @@ const FontSizePickerSelect = ( props: FontSizePickerSelectProps ) => { hint, }; } ), - ...( disableCustomFontSizes ? [] : [ CUSTOM_OPTION ] ), ]; - const selectedOption = value - ? options.find( ( option ) => option.value === value ) ?? CUSTOM_OPTION - : DEFAULT_OPTION; + const selectedOption = + options.find( ( option ) => option.value === value ) ?? DEFAULT_OPTION; return ( { }: { selectedItem: FontSizePickerSelectOption; } ) => { - if ( selectedItem === CUSTOM_OPTION ) { - onSelectCustom(); - } else { - onChange( selectedItem.value ); - } + onChange( selectedItem.value ); } } size={ size } /> diff --git a/packages/components/src/font-size-picker/test/index.tsx b/packages/components/src/font-size-picker/test/index.tsx index 34e8ce17c67fa..b3612029df362 100644 --- a/packages/components/src/font-size-picker/test/index.tsx +++ b/packages/components/src/font-size-picker/test/index.tsx @@ -127,7 +127,7 @@ describe( 'FontSizePicker', () => { screen.getByRole( 'combobox', { name: 'Font size' } ) ); const options = screen.getAllByRole( 'option' ); - expect( options ).toHaveLength( 8 ); + expect( options ).toHaveLength( 7 ); expect( options[ 0 ] ).toHaveAccessibleName( 'Default' ); expect( options[ 1 ] ).toHaveAccessibleName( 'Tiny 8' ); expect( options[ 2 ] ).toHaveAccessibleName( 'Small 12' ); @@ -135,7 +135,6 @@ describe( 'FontSizePicker', () => { expect( options[ 4 ] ).toHaveAccessibleName( 'Large 20' ); expect( options[ 5 ] ).toHaveAccessibleName( 'Extra Large 30' ); expect( options[ 6 ] ).toHaveAccessibleName( 'xx-large 40' ); - expect( options[ 7 ] ).toHaveAccessibleName( 'Custom' ); } ); test.each( [ @@ -186,7 +185,6 @@ describe( 'FontSizePicker', () => { } ); - commonSelectTests( fontSizes ); commonTests( fontSizes ); } ); @@ -231,7 +229,7 @@ describe( 'FontSizePicker', () => { screen.getByRole( 'combobox', { name: 'Font size' } ) ); const options = screen.getAllByRole( 'option' ); - expect( options ).toHaveLength( 8 ); + expect( options ).toHaveLength( 7 ); expect( options[ 0 ] ).toHaveAccessibleName( 'Default' ); expect( options[ 1 ] ).toHaveAccessibleName( 'Tiny 8px' ); expect( options[ 2 ] ).toHaveAccessibleName( 'Small 1em' ); @@ -239,7 +237,6 @@ describe( 'FontSizePicker', () => { expect( options[ 4 ] ).toHaveAccessibleName( 'Large' ); expect( options[ 5 ] ).toHaveAccessibleName( 'Extra Large 30px' ); expect( options[ 6 ] ).toHaveAccessibleName( 'xx-large 40px' ); - expect( options[ 7 ] ).toHaveAccessibleName( 'Custom' ); } ); test.each( [ @@ -327,7 +324,6 @@ describe( 'FontSizePicker', () => { } ); - commonSelectTests( fontSizes ); commonTests( fontSizes ); } ); @@ -523,24 +519,6 @@ describe( 'FontSizePicker', () => { ); } - function commonSelectTests( fontSizes: FontSize[] ) { - it( 'shows custom input when Custom is selected', async () => { - const user = userEvent.setup(); - const onChange = jest.fn(); - await render( - - ); - await user.click( - screen.getByRole( 'combobox', { name: 'Font size' } ) - ); - await user.click( - screen.getByRole( 'option', { name: 'Custom' } ) - ); - expect( screen.getByLabelText( 'Custom' ) ).toBeVisible(); - expect( onChange ).not.toHaveBeenCalled(); - } ); - } - function commonTests( fontSizes: FontSize[] ) { it( 'shows custom input when value is unknown', async () => { await render( diff --git a/schemas/json/wp-env.json b/schemas/json/wp-env.json index 2a98cb3d0d263..bc54c6ee9ea2e 100644 --- a/schemas/json/wp-env.json +++ b/schemas/json/wp-env.json @@ -149,7 +149,12 @@ "$ref": "#/definitions/wpEnvPropertyNames" }, { - "enum": [ "$schema", "env", "testsPort", "lifecycleScripts" ] + "enum": [ + "$schema", + "env", + "testsPort", + "lifecycleScripts" + ] } ] } From b1df541497bf07c116ad4b41bb5ae53f57c10c06 Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 12 Feb 2025 12:09:55 +0000 Subject: [PATCH 38/96] Bump plugin version to 20.3.0-rc.1 --- gutenberg.php | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gutenberg.php b/gutenberg.php index de187b8d13af9..58e04e0b9e4f5 100644 --- a/gutenberg.php +++ b/gutenberg.php @@ -5,7 +5,7 @@ * Description: Printing since 1440. This is the development plugin for the block editor, site editor, and other future WordPress core functionality. * Requires at least: 6.6 * Requires PHP: 7.2 - * Version: 20.2.0 + * Version: 20.3.0-rc.1 * Author: Gutenberg Team * Text Domain: gutenberg * diff --git a/package-lock.json b/package-lock.json index 38b92c08b9a79..ce62c6db43564 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gutenberg", - "version": "20.2.0", + "version": "20.3.0-rc.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gutenberg", - "version": "20.2.0", + "version": "20.3.0-rc.1", "hasInstallScript": true, "license": "GPL-2.0-or-later", "workspaces": [ diff --git a/package.json b/package.json index 3d0194fb941bb..5459c72eb1472 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "20.2.0", + "version": "20.3.0-rc.1", "private": true, "description": "A new WordPress editor experience.", "author": "The WordPress Contributors", From 397e56292f3e856775ce2915daaee198c9d1bfab Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 12 Feb 2025 12:36:17 +0000 Subject: [PATCH 39/96] Update Changelog for 20.3.0-rc.1 --- changelog.txt | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/changelog.txt b/changelog.txt index e791d102a6b77..2a1e7d62ed656 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,189 @@ == Changelog == += 20.3.0-rc.1 = + + +## Changelog + +### Enhancements + +- Disable hover animation on preview frame for classic themes. ([68976](https://github.com/WordPress/gutenberg/pull/68976)) + +#### Block Library +- Added discord in social links. ([68848](https://github.com/WordPress/gutenberg/pull/68848)) +- Featured Image block: Use resolution tool component. ([68471](https://github.com/WordPress/gutenberg/pull/68471)) +- Query block: Add option to ignore sticky posts behavior. ([69057](https://github.com/WordPress/gutenberg/pull/69057)) +- RSS: Border & Spacing support. ([66411](https://github.com/WordPress/gutenberg/pull/66411)) + +#### Global Styles +- Disable Clear button if there's no shadow. ([69092](https://github.com/WordPress/gutenberg/pull/69092)) +- Duotone Settings: Add `reset` button and improve toggle rendering in FiltersPanel. ([68672](https://github.com/WordPress/gutenberg/pull/68672)) +- Shadow Panel: Add reset button. ([68981](https://github.com/WordPress/gutenberg/pull/68981)) + +#### Post Editor +- Editor: Add loading state to the 'PageAttributesParent' component. ([69062](https://github.com/WordPress/gutenberg/pull/69062)) +- Editor: Add loading state to the 'PostAuthorCombobox' component. ([68991](https://github.com/WordPress/gutenberg/pull/68991)) +- Editor: Display error message when loading current post fails. ([68999](https://github.com/WordPress/gutenberg/pull/68999)) + +#### Block Editor +- Quick Inserter: Restore pattern search and insertion. ([69028](https://github.com/WordPress/gutenberg/pull/69028)) +- Update keyboard shortcuts to use `primaryShift+backspace` for block deletion. ([69074](https://github.com/WordPress/gutenberg/pull/69074)) + +#### Design Tools +- Archives: Add Color Support. ([68685](https://github.com/WordPress/gutenberg/pull/68685)) +- Categories: Add Color Support. ([68686](https://github.com/WordPress/gutenberg/pull/68686)) + +#### Components +- ComboboxControl: Add an `isLoading` prop to show a loading spinner. ([68990](https://github.com/WordPress/gutenberg/pull/68990)) + + +### Bug Fixes + +- Exclude Iterator helpers from polyfills. ([69070](https://github.com/WordPress/gutenberg/pull/69070)) +- Fix Dependabot ignore statements. ([69144](https://github.com/WordPress/gutenberg/pull/69144)) + +#### Block Editor +- Block popover: Fix scrolling over. ([68075](https://github.com/WordPress/gutenberg/pull/68075)) +- Display root appender when default block is disabled. ([68951](https://github.com/WordPress/gutenberg/pull/68951)) +- Fix regression for root appender logic. ([68994](https://github.com/WordPress/gutenberg/pull/68994)) +- Inserter: Remove block default icon from no results message. ([68693](https://github.com/WordPress/gutenberg/pull/68693)) +- Rename `aspect` property to `ratio` to carry the `defaultAspect` in `AspectRatioDropdown`. ([69085](https://github.com/WordPress/gutenberg/pull/69085)) +- Writing Flow: Restore early return for no block selection in tab nav hook. ([69079](https://github.com/WordPress/gutenberg/pull/69079)) + +#### Site Editor +- Edit Site: Fix Fields package private APIs error. ([68964](https://github.com/WordPress/gutenberg/pull/68964)) +- Fix: Site Editor should display a 404 message. ([69009](https://github.com/WordPress/gutenberg/pull/69009)) +- Use the same editor component for all routes. ([69093](https://github.com/WordPress/gutenberg/pull/69093)) + +#### Global Styles +- Fix: Additional CSS button not working after back navigation. ([68954](https://github.com/WordPress/gutenberg/pull/68954)) +- Fix: Missing 'No blocks found.' message for block search in editor. ([69036](https://github.com/WordPress/gutenberg/pull/69036)) + +#### Block Library +- Query Block: Fix 'parents' argument validation. ([68983](https://github.com/WordPress/gutenberg/pull/68983)) +- Social Links: Fix appender size in non-iframe editor. ([68215](https://github.com/WordPress/gutenberg/pull/68215)) + +#### REST API +- Add support for the 'ignore_sticky_posts' argument. ([68970](https://github.com/WordPress/gutenberg/pull/68970)) +- Fix: Prevent Errors in Header Processing and Encode URLs Properly. ([67780](https://github.com/WordPress/gutenberg/pull/67780)) + +#### Icons +- Fix the background, arrowUpLeft, keyboardReturn and square icons. ([69076](https://github.com/WordPress/gutenberg/pull/69076)) + +#### Font Library +- Refactor font variant components to use useId for checkbox IDs. ([69050](https://github.com/WordPress/gutenberg/pull/69050)) + +#### Block Directory +- Remove block icon from InstalledBlocksPrePublishPanel. ([69046](https://github.com/WordPress/gutenberg/pull/69046)) + +#### DataViews +- Fixed: Empty Pattern Overlap in Pattern Title in Dataviews Table Layout. ([68997](https://github.com/WordPress/gutenberg/pull/68997)) + +#### Media +- Add optional chain to sizes indexing of media details in edit-site. ([68995](https://github.com/WordPress/gutenberg/pull/68995)) + +#### CSS & Styling +- Enabled Full height in Additional CSS. ([68993](https://github.com/WordPress/gutenberg/pull/68993)) + +#### Block hooks +- Fix truncation of post content. ([68926](https://github.com/WordPress/gutenberg/pull/68926)) + +#### Interactivity API +- iAPI Router: Fix CSS rule order in some constructed style sheets. ([68923](https://github.com/WordPress/gutenberg/pull/68923)) + + +### Accessibility + +#### Components +- Font Size Picker: Remove Custom option from FontSizePickerSelect dropdown. ([69038](https://github.com/WordPress/gutenberg/pull/69038)) + +#### Global Styles +- Add missing list role to the list of blocks in the global Styles. ([69027](https://github.com/WordPress/gutenberg/pull/69027)) + +#### Block API +- Block support: Preserve aria-label value in comment delimiter. ([69002](https://github.com/WordPress/gutenberg/pull/69002)) + +#### Block Editor +- [Block Editor]: A11y - Add and Update missing reduce-motion mixing. ([68417](https://github.com/WordPress/gutenberg/pull/68417)) + + +### Performance + +#### Post Editor +- Editor: Don't use selector shortcuts for the taxonomy queries. ([68998](https://github.com/WordPress/gutenberg/pull/68998)) +- Editor: Optimize 'PostAuthorCheck' component data selection. ([69105](https://github.com/WordPress/gutenberg/pull/69105)) + +#### Style Book +- Improve StyleBook resize responsiveness for Classic Theme. ([68980](https://github.com/WordPress/gutenberg/pull/68980)) + + +### Documentation + +- Added Missing Global Documentation. ([69104](https://github.com/WordPress/gutenberg/pull/69104)) +- Changed Inline Document Order. ([68992](https://github.com/WordPress/gutenberg/pull/68992)) +- wp-env: Add lifecycleScripts to the schema. ([68724](https://github.com/WordPress/gutenberg/pull/68724)) + + +### Code Quality + +- Core Data: Add type for term entity. ([69151](https://github.com/WordPress/gutenberg/pull/69151)) +- iAPI Router: Add missing changelog entry for #68923. ([68945](https://github.com/WordPress/gutenberg/pull/68945)) + +#### Block Library +- E2E: Add regression test for spacer block in themes without spacing units. ([68913](https://github.com/WordPress/gutenberg/pull/68913)) +- Navigation Link Block: Use stable variable for underline color styling. ([68953](https://github.com/WordPress/gutenberg/pull/68953)) +- Regenerate block fixtures. ([68982](https://github.com/WordPress/gutenberg/pull/68982)) +- Social Links: Remove redundant reduce-motion mixin. ([69000](https://github.com/WordPress/gutenberg/pull/69000)) + +#### Site Editor +- Fast follow: Redirections of deprecated site editor URLs. ([68971](https://github.com/WordPress/gutenberg/pull/68971)) +- Quality: Remove unused props and styles from SidebarNavigationScreen. ([68972](https://github.com/WordPress/gutenberg/pull/68972)) + +#### Block Editor +- Inserter: Remove unused no-results-icon styles. ([69018](https://github.com/WordPress/gutenberg/pull/69018)) + + +### Tools + +- PR Template: Suggest linking the issue. ([68924](https://github.com/WordPress/gutenberg/pull/68924)) +- Relocate changelog file for WP#6910 to 6.9 backports. ([69068](https://github.com/WordPress/gutenberg/pull/69068)) + +#### Build Tooling +- Fix installing svn during deploys. ([69047](https://github.com/WordPress/gutenberg/pull/69047)) +- Remove `react-native` dependabot group. ([69118](https://github.com/WordPress/gutenberg/pull/69118)) + +#### Testing +- e2e: Fix "add new" selector. ([69111](https://github.com/WordPress/gutenberg/pull/69111)) + + +### Various + +- Remove react-native dependabot group - Take 2. ([69122](https://github.com/WordPress/gutenberg/pull/69122)) + +#### Plugin +- Code Quality: Delete unused function from PHP Sync Issue generation script. ([68947](https://github.com/WordPress/gutenberg/pull/68947)) +- npm scripts: Use `node -p` instead of `echo`. ([68946](https://github.com/WordPress/gutenberg/pull/68946)) + + +## First-time contributors + +The following PRs were merged by first-time contributors: + +- @benazeer-ben: RSS: Border & Spacing support. ([66411](https://github.com/WordPress/gutenberg/pull/66411)) +- @grgar: Add optional chain to sizes indexing of media details in edit-site. ([68995](https://github.com/WordPress/gutenberg/pull/68995)) +- @Gulamdastgir-Momin: Added discord in social links. ([68848](https://github.com/WordPress/gutenberg/pull/68848)) +- @Juzar10: Fix: Prevent Errors in Header Processing and Encode URLs Properly. ([67780](https://github.com/WordPress/gutenberg/pull/67780)) +- @singhakanshu00: Disable hover animation on preview frame for classic themes. ([68976](https://github.com/WordPress/gutenberg/pull/68976)) +- @srtfisher: wp-env: Add lifecycleScripts to the schema. ([68724](https://github.com/WordPress/gutenberg/pull/68724)) + + +## Contributors + +The following contributors merged PRs in this release: + +@adamsilverstein @afercia @akasunil @benazeer-ben @carolinan @DAreRodz @desrosj @ellatrix @grgar @Gulamdastgir-Momin @himanshupathak95 @Infinite-Null @joemcgill @Juzar10 @Mamaduka @Mayank-Tripathi32 @ockham @peterwilsoncc @Rishit30G @SainathPoojary @shail-mehta @shimotmk @singhakanshu00 @srtfisher @swissspidy @t-hamano @torounit @yogeshbhutkar + + = 20.0.1 = ## Changelog From c66d637122aeb9d12334f4c45c6b7565cd66d198 Mon Sep 17 00:00:00 2001 From: Akanshu Singh <61490175+singhakanshu00@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:14:50 +0530 Subject: [PATCH 40/96] fix: Adds margin 0 to social link anchor in editor to remove extra margin coming from classic.css file (#69100) Co-authored-by: singhakanshu00 Co-authored-by: t-hamano Co-authored-by: shail-mehta Co-authored-by: Mamaduka Co-authored-by: carolinan Co-authored-by: luminuu Co-authored-by: viralsampat-multidots --- packages/block-library/src/social-link/editor.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/block-library/src/social-link/editor.scss b/packages/block-library/src/social-link/editor.scss index d61cf7c1a7cf5..af818d82eba49 100644 --- a/packages/block-library/src/social-link/editor.scss +++ b/packages/block-library/src/social-link/editor.scss @@ -16,6 +16,7 @@ height: auto; font-weight: inherit; font-family: inherit; + margin: 0; // This rule ensures social link buttons display correctly in template parts. opacity: 1; From c7aae2ff36e6c2addc0a9905c3713d8307a80869 Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 12 Feb 2025 12:37:42 +0000 Subject: [PATCH 41/96] Update changelog files --- packages/a11y/CHANGELOG.md | 2 ++ packages/a11y/package.json | 2 +- packages/annotations/CHANGELOG.md | 2 ++ packages/annotations/package.json | 2 +- packages/api-fetch/CHANGELOG.md | 2 ++ packages/api-fetch/package.json | 2 +- packages/autop/CHANGELOG.md | 2 ++ packages/autop/package.json | 2 +- packages/babel-plugin-import-jsx-pragma/CHANGELOG.md | 2 ++ packages/babel-plugin-import-jsx-pragma/package.json | 2 +- packages/babel-plugin-makepot/CHANGELOG.md | 2 ++ packages/babel-plugin-makepot/package.json | 2 +- packages/babel-preset-default/CHANGELOG.md | 2 ++ packages/babel-preset-default/package.json | 2 +- packages/base-styles/CHANGELOG.md | 2 ++ packages/base-styles/package.json | 2 +- packages/blob/CHANGELOG.md | 2 ++ packages/blob/package.json | 2 +- packages/block-directory/CHANGELOG.md | 2 ++ packages/block-directory/package.json | 2 +- packages/block-editor/CHANGELOG.md | 2 ++ packages/block-editor/package.json | 2 +- packages/block-library/CHANGELOG.md | 2 ++ packages/block-library/package.json | 2 +- packages/block-serialization-default-parser/CHANGELOG.md | 2 ++ packages/block-serialization-default-parser/package.json | 2 +- packages/block-serialization-spec-parser/CHANGELOG.md | 2 ++ packages/block-serialization-spec-parser/package.json | 2 +- packages/blocks/CHANGELOG.md | 2 ++ packages/blocks/package.json | 2 +- packages/browserslist-config/CHANGELOG.md | 2 ++ packages/browserslist-config/package.json | 2 +- packages/commands/CHANGELOG.md | 2 ++ packages/commands/package.json | 2 +- packages/components/CHANGELOG.md | 2 ++ packages/components/package.json | 2 +- packages/compose/CHANGELOG.md | 2 ++ packages/compose/package.json | 2 +- packages/core-commands/CHANGELOG.md | 2 ++ packages/core-commands/package.json | 2 +- packages/core-data/CHANGELOG.md | 2 ++ packages/core-data/package.json | 2 +- packages/create-block-interactive-template/package.json | 2 +- packages/create-block-tutorial-template/CHANGELOG.md | 2 ++ packages/create-block-tutorial-template/package.json | 2 +- packages/create-block/CHANGELOG.md | 2 ++ packages/create-block/package.json | 2 +- packages/customize-widgets/CHANGELOG.md | 2 ++ packages/customize-widgets/package.json | 2 +- packages/data-controls/CHANGELOG.md | 2 ++ packages/data-controls/package.json | 2 +- packages/data/CHANGELOG.md | 2 ++ packages/data/package.json | 2 +- packages/dataviews/CHANGELOG.md | 2 ++ packages/dataviews/package.json | 2 +- packages/date/CHANGELOG.md | 2 ++ packages/date/package.json | 2 +- packages/dependency-extraction-webpack-plugin/CHANGELOG.md | 2 ++ packages/dependency-extraction-webpack-plugin/package.json | 2 +- packages/deprecated/CHANGELOG.md | 2 ++ packages/deprecated/package.json | 2 +- packages/docgen/CHANGELOG.md | 2 ++ packages/docgen/package.json | 2 +- packages/dom-ready/CHANGELOG.md | 2 ++ packages/dom-ready/package.json | 2 +- packages/dom/CHANGELOG.md | 2 ++ packages/dom/package.json | 2 +- packages/e2e-test-utils-playwright/CHANGELOG.md | 2 ++ packages/e2e-test-utils-playwright/package.json | 2 +- packages/e2e-test-utils/CHANGELOG.md | 2 ++ packages/e2e-test-utils/package.json | 2 +- packages/e2e-tests/CHANGELOG.md | 2 ++ packages/e2e-tests/package.json | 2 +- packages/edit-post/CHANGELOG.md | 2 ++ packages/edit-post/package.json | 2 +- packages/edit-site/CHANGELOG.md | 2 ++ packages/edit-site/package.json | 2 +- packages/edit-widgets/CHANGELOG.md | 2 ++ packages/edit-widgets/package.json | 2 +- packages/editor/CHANGELOG.md | 2 ++ packages/editor/package.json | 2 +- packages/element/CHANGELOG.md | 2 ++ packages/element/package.json | 2 +- packages/env/CHANGELOG.md | 2 ++ packages/env/package.json | 2 +- packages/escape-html/CHANGELOG.md | 2 ++ packages/escape-html/package.json | 2 +- packages/eslint-plugin/CHANGELOG.md | 2 ++ packages/eslint-plugin/package.json | 2 +- packages/fields/CHANGELOG.md | 2 ++ packages/fields/package.json | 2 +- packages/format-library/CHANGELOG.md | 2 ++ packages/format-library/package.json | 2 +- packages/hooks/CHANGELOG.md | 2 ++ packages/hooks/package.json | 2 +- packages/html-entities/CHANGELOG.md | 2 ++ packages/html-entities/package.json | 2 +- packages/i18n/CHANGELOG.md | 2 ++ packages/i18n/package.json | 2 +- packages/icons/CHANGELOG.md | 2 ++ packages/icons/package.json | 2 +- packages/interactivity-router/CHANGELOG.md | 2 ++ packages/interactivity-router/package.json | 2 +- packages/interactivity/CHANGELOG.md | 2 ++ packages/interactivity/package.json | 2 +- packages/interface/CHANGELOG.md | 2 ++ packages/interface/package.json | 2 +- packages/is-shallow-equal/CHANGELOG.md | 2 ++ packages/is-shallow-equal/package.json | 2 +- packages/jest-console/CHANGELOG.md | 2 ++ packages/jest-console/package.json | 2 +- packages/jest-preset-default/CHANGELOG.md | 2 ++ packages/jest-preset-default/package.json | 2 +- packages/jest-puppeteer-axe/CHANGELOG.md | 2 ++ packages/jest-puppeteer-axe/package.json | 2 +- packages/keyboard-shortcuts/CHANGELOG.md | 2 ++ packages/keyboard-shortcuts/package.json | 2 +- packages/keycodes/CHANGELOG.md | 2 ++ packages/keycodes/package.json | 2 +- packages/lazy-import/CHANGELOG.md | 2 ++ packages/lazy-import/package.json | 2 +- packages/list-reusable-blocks/CHANGELOG.md | 2 ++ packages/list-reusable-blocks/package.json | 2 +- packages/media-utils/CHANGELOG.md | 2 ++ packages/media-utils/package.json | 2 +- packages/notices/CHANGELOG.md | 2 ++ packages/notices/package.json | 2 +- packages/npm-package-json-lint-config/CHANGELOG.md | 2 ++ packages/npm-package-json-lint-config/package.json | 2 +- packages/nux/CHANGELOG.md | 2 ++ packages/nux/package.json | 2 +- packages/patterns/CHANGELOG.md | 2 ++ packages/patterns/package.json | 2 +- packages/plugins/CHANGELOG.md | 2 ++ packages/plugins/package.json | 2 +- packages/postcss-plugins-preset/CHANGELOG.md | 2 ++ packages/postcss-plugins-preset/package.json | 2 +- packages/postcss-themes/CHANGELOG.md | 2 ++ packages/postcss-themes/package.json | 2 +- packages/preferences-persistence/CHANGELOG.md | 2 ++ packages/preferences-persistence/package.json | 2 +- packages/preferences/CHANGELOG.md | 2 ++ packages/preferences/package.json | 2 +- packages/prettier-config/CHANGELOG.md | 2 ++ packages/prettier-config/package.json | 2 +- packages/primitives/CHANGELOG.md | 2 ++ packages/primitives/package.json | 2 +- packages/priority-queue/CHANGELOG.md | 2 ++ packages/priority-queue/package.json | 2 +- packages/private-apis/CHANGELOG.md | 2 ++ packages/private-apis/package.json | 2 +- packages/project-management-automation/CHANGELOG.md | 2 ++ packages/project-management-automation/package.json | 2 +- packages/react-i18n/CHANGELOG.md | 2 ++ packages/react-i18n/package.json | 2 +- packages/readable-js-assets-webpack-plugin/CHANGELOG.md | 2 ++ packages/readable-js-assets-webpack-plugin/package.json | 2 +- packages/redux-routine/CHANGELOG.md | 2 ++ packages/redux-routine/package.json | 2 +- packages/reusable-blocks/CHANGELOG.md | 2 ++ packages/reusable-blocks/package.json | 2 +- packages/rich-text/CHANGELOG.md | 2 ++ packages/rich-text/package.json | 2 +- packages/router/CHANGELOG.md | 2 ++ packages/router/package.json | 2 +- packages/scripts/CHANGELOG.md | 2 ++ packages/scripts/package.json | 2 +- packages/server-side-render/CHANGELOG.md | 2 ++ packages/server-side-render/package.json | 2 +- packages/shortcode/CHANGELOG.md | 2 ++ packages/shortcode/package.json | 2 +- packages/style-engine/CHANGELOG.md | 2 ++ packages/style-engine/package.json | 2 +- packages/stylelint-config/CHANGELOG.md | 2 ++ packages/stylelint-config/package.json | 2 +- packages/sync/CHANGELOG.md | 2 ++ packages/sync/package.json | 2 +- packages/token-list/CHANGELOG.md | 2 ++ packages/token-list/package.json | 2 +- packages/undo-manager/CHANGELOG.md | 2 ++ packages/undo-manager/package.json | 2 +- packages/upload-media/CHANGELOG.md | 2 ++ packages/upload-media/package.json | 2 +- packages/url/CHANGELOG.md | 2 ++ packages/url/package.json | 2 +- packages/viewport/CHANGELOG.md | 2 ++ packages/viewport/package.json | 2 +- packages/warning/CHANGELOG.md | 2 ++ packages/warning/package.json | 2 +- packages/widgets/CHANGELOG.md | 2 ++ packages/widgets/package.json | 2 +- packages/wordcount/CHANGELOG.md | 2 ++ packages/wordcount/package.json | 2 +- 193 files changed, 289 insertions(+), 97 deletions(-) diff --git a/packages/a11y/CHANGELOG.md b/packages/a11y/CHANGELOG.md index 1d1cd67af3f9b..fd74179d52ace 100644 --- a/packages/a11y/CHANGELOG.md +++ b/packages/a11y/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/a11y/package.json b/packages/a11y/package.json index a3a82f38284b3..b468b7f1d25c1 100644 --- a/packages/a11y/package.json +++ b/packages/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/a11y", - "version": "4.17.0", + "version": "4.18.0-prerelease", "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 fdcd5be5577ae..4bd66ad29cc8c 100644 --- a/packages/annotations/CHANGELOG.md +++ b/packages/annotations/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 3.18.0 (2025-02-12) + ## 3.17.0 (2025-01-29) ## 3.16.0 (2025-01-15) diff --git a/packages/annotations/package.json b/packages/annotations/package.json index 70af684c11b3d..06428c8b4ec7e 100644 --- a/packages/annotations/package.json +++ b/packages/annotations/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/annotations", - "version": "3.17.0", + "version": "3.18.0-prerelease", "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 9e53a80788570..addb72db662c7 100644 --- a/packages/api-fetch/CHANGELOG.md +++ b/packages/api-fetch/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 7.18.0 (2025-02-12) + ## 7.17.0 (2025-01-29) ## 7.16.0 (2025-01-15) diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json index 43a52dc89fe36..63902ce178f4f 100644 --- a/packages/api-fetch/package.json +++ b/packages/api-fetch/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/api-fetch", - "version": "7.17.0", + "version": "7.18.0-prerelease", "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 edba622956be3..8daf97afc88e2 100644 --- a/packages/autop/CHANGELOG.md +++ b/packages/autop/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/autop/package.json b/packages/autop/package.json index 8c187d2ecedee..5aae1de546b11 100644 --- a/packages/autop/package.json +++ b/packages/autop/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/autop", - "version": "4.17.0", + "version": "4.18.0-prerelease", "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 d74cc123def45..9a8440fe6c493 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.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/babel-plugin-import-jsx-pragma/package.json b/packages/babel-plugin-import-jsx-pragma/package.json index a0003205b6b6b..faf45d04feac2 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.17.0", + "version": "5.18.0-prerelease", "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 b3a1bafe646f6..ce3b825fd0f89 100644 --- a/packages/babel-plugin-makepot/CHANGELOG.md +++ b/packages/babel-plugin-makepot/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/babel-plugin-makepot/package.json b/packages/babel-plugin-makepot/package.json index 20c3957796c3b..78bfa5b9e7db2 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.17.0", + "version": "6.18.0-prerelease", "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 aa827876828c5..625ef7f09e863 100644 --- a/packages/babel-preset-default/CHANGELOG.md +++ b/packages/babel-preset-default/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 8.18.0 (2025-02-12) + ## 8.17.0 (2025-01-29) ## 8.16.0 (2025-01-15) diff --git a/packages/babel-preset-default/package.json b/packages/babel-preset-default/package.json index e1e43984e69f2..7415b665dff86 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.17.0", + "version": "8.18.0-prerelease", "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 e4aceae936710..7c3ef6a48774b 100644 --- a/packages/base-styles/CHANGELOG.md +++ b/packages/base-styles/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/base-styles/package.json b/packages/base-styles/package.json index 63590daa9c178..d510470a55cec 100644 --- a/packages/base-styles/package.json +++ b/packages/base-styles/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/base-styles", - "version": "5.17.0", + "version": "5.18.0-prerelease", "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 be1d924dd4576..2b12b40acd9be 100644 --- a/packages/blob/CHANGELOG.md +++ b/packages/blob/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/blob/package.json b/packages/blob/package.json index 9a0b10a416bec..db87d5ecd2d8a 100644 --- a/packages/blob/package.json +++ b/packages/blob/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/blob", - "version": "4.17.0", + "version": "4.18.0-prerelease", "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 0ac19bd45c864..589ed8b0008d4 100644 --- a/packages/block-directory/CHANGELOG.md +++ b/packages/block-directory/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/block-directory/package.json b/packages/block-directory/package.json index f7750c2e49f17..cfca9dd4cb014 100644 --- a/packages/block-directory/package.json +++ b/packages/block-directory/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-directory", - "version": "5.17.1", + "version": "5.18.0-prerelease", "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 18bb4d23d0a7a..b96bfe7a20b95 100644 --- a/packages/block-editor/CHANGELOG.md +++ b/packages/block-editor/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 14.13.0 (2025-02-12) + ## 14.12.0 (2025-01-29) ## 14.11.0 (2025-01-15) diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json index bb247c1d28356..39d9e747380a9 100644 --- a/packages/block-editor/package.json +++ b/packages/block-editor/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-editor", - "version": "14.12.0", + "version": "14.13.0-prerelease", "description": "Generic block editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/block-library/CHANGELOG.md b/packages/block-library/CHANGELOG.md index 0a0f9ca66f054..b988f7d107fa6 100644 --- a/packages/block-library/CHANGELOG.md +++ b/packages/block-library/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 9.18.0 (2025-02-12) + ## 9.17.0 (2025-01-29) ## 9.16.0 (2025-01-15) diff --git a/packages/block-library/package.json b/packages/block-library/package.json index 87f1171783453..f534ff9538dc1 100644 --- a/packages/block-library/package.json +++ b/packages/block-library/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-library", - "version": "9.17.0", + "version": "9.18.0-prerelease", "description": "Block library for the WordPress editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/block-serialization-default-parser/CHANGELOG.md b/packages/block-serialization-default-parser/CHANGELOG.md index 650eee5b822ba..c6d17488c91f2 100644 --- a/packages/block-serialization-default-parser/CHANGELOG.md +++ b/packages/block-serialization-default-parser/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/block-serialization-default-parser/package.json b/packages/block-serialization-default-parser/package.json index 45718ca769be6..4ed3d2c645d55 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.17.0", + "version": "5.18.0-prerelease", "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 8757648ae3549..d9db0a9c0b54a 100644 --- a/packages/block-serialization-spec-parser/CHANGELOG.md +++ b/packages/block-serialization-spec-parser/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/block-serialization-spec-parser/package.json b/packages/block-serialization-spec-parser/package.json index f188e9cd25660..7dfbfbf97f9f2 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.17.0", + "version": "5.18.0-prerelease", "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 4cf4167097034..b83f66306873e 100644 --- a/packages/blocks/CHANGELOG.md +++ b/packages/blocks/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 14.7.0 (2025-02-12) + ## 14.6.0 (2025-01-29) ## 14.5.0 (2025-01-15) diff --git a/packages/blocks/package.json b/packages/blocks/package.json index 92410b54ba19a..fd1793f7c023a 100644 --- a/packages/blocks/package.json +++ b/packages/blocks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/blocks", - "version": "14.6.0", + "version": "14.7.0-prerelease", "description": "Block API for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/browserslist-config/CHANGELOG.md b/packages/browserslist-config/CHANGELOG.md index 122123b959678..14eb691cc8bb8 100644 --- a/packages/browserslist-config/CHANGELOG.md +++ b/packages/browserslist-config/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/browserslist-config/package.json b/packages/browserslist-config/package.json index 1253719c4724c..5f0a08e96b578 100644 --- a/packages/browserslist-config/package.json +++ b/packages/browserslist-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/browserslist-config", - "version": "6.17.0", + "version": "6.18.0-prerelease", "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 cd8b74233cfeb..4a14b3d3c3c8a 100644 --- a/packages/commands/CHANGELOG.md +++ b/packages/commands/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/commands/package.json b/packages/commands/package.json index 5e2d57f7d92fb..e18bc70f16300 100644 --- a/packages/commands/package.json +++ b/packages/commands/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/commands", - "version": "1.17.0", + "version": "1.18.0-prerelease", "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 4ff01907284a4..15a22ed7578ec 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 29.4.0 (2025-02-12) + - `FontSizePicker`: Remove Custom option from dropdown to prevent unexpected context changes during keyboard navigation ([#69038](https://github.com/WordPress/gutenberg/pull/69038)). - `ComboboxControl`: Add an `isLoading` prop to show a loading spinner ([#68990](https://github.com/WordPress/gutenberg/pull/68990)) diff --git a/packages/components/package.json b/packages/components/package.json index 29a62cd7c49ff..74a93c259f17e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/components", - "version": "29.3.0", + "version": "29.4.0-prerelease", "description": "UI components for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/compose/CHANGELOG.md b/packages/compose/CHANGELOG.md index 99fcb659f8b0e..c8ded48801871 100644 --- a/packages/compose/CHANGELOG.md +++ b/packages/compose/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 7.18.0 (2025-02-12) + ## 7.17.0 (2025-01-29) ## 7.16.0 (2025-01-15) diff --git a/packages/compose/package.json b/packages/compose/package.json index 4e9eb19d13acb..9f2d3f9eb789f 100644 --- a/packages/compose/package.json +++ b/packages/compose/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/compose", - "version": "7.17.0", + "version": "7.18.0-prerelease", "description": "WordPress higher-order components (HOCs).", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/core-commands/CHANGELOG.md b/packages/core-commands/CHANGELOG.md index 6fc42e7161dbc..5e8040c6c0fa4 100644 --- a/packages/core-commands/CHANGELOG.md +++ b/packages/core-commands/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/core-commands/package.json b/packages/core-commands/package.json index aa9fd5653c0b1..74481b20a99fe 100644 --- a/packages/core-commands/package.json +++ b/packages/core-commands/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/core-commands", - "version": "1.17.0", + "version": "1.18.0-prerelease", "description": "WordPress core reusable commands.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/core-data/CHANGELOG.md b/packages/core-data/CHANGELOG.md index a19879790fc70..40d6b0306aab6 100644 --- a/packages/core-data/CHANGELOG.md +++ b/packages/core-data/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 7.18.0 (2025-02-12) + ## 7.17.0 (2025-01-29) ## 7.16.0 (2025-01-15) diff --git a/packages/core-data/package.json b/packages/core-data/package.json index e6f84c7bd15e3..3f77cf43ba2cb 100644 --- a/packages/core-data/package.json +++ b/packages/core-data/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/core-data", - "version": "7.17.0", + "version": "7.18.0-prerelease", "description": "Access to and manipulation of core WordPress entities.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/create-block-interactive-template/package.json b/packages/create-block-interactive-template/package.json index 00f3515c2e289..15a7e9e03778b 100644 --- a/packages/create-block-interactive-template/package.json +++ b/packages/create-block-interactive-template/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/create-block-interactive-template", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "Template for @wordpress/create-block to create interactive blocks with the Interactivity API.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/create-block-tutorial-template/CHANGELOG.md b/packages/create-block-tutorial-template/CHANGELOG.md index 42d82d1a2d289..c65692d09c95e 100644 --- a/packages/create-block-tutorial-template/CHANGELOG.md +++ b/packages/create-block-tutorial-template/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/create-block-tutorial-template/package.json b/packages/create-block-tutorial-template/package.json index 8d6cd268a879b..5cb195d79cc65 100644 --- a/packages/create-block-tutorial-template/package.json +++ b/packages/create-block-tutorial-template/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/create-block-tutorial-template", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "This is a template for @wordpress/create-block that creates an example 'Copyright Date' block. This block is used in the official WordPress block development Quick Start Guide.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/create-block/CHANGELOG.md b/packages/create-block/CHANGELOG.md index 9d9a3e3bce59e..3e01a8f358f9a 100644 --- a/packages/create-block/CHANGELOG.md +++ b/packages/create-block/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.61.0 (2025-02-12) + ## 4.60.0 (2025-01-29) ## 4.59.0 (2025-01-15) diff --git a/packages/create-block/package.json b/packages/create-block/package.json index 477eb0f98dd85..05899ff61a973 100644 --- a/packages/create-block/package.json +++ b/packages/create-block/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/create-block", - "version": "4.60.0", + "version": "4.61.0-prerelease", "description": "Generates PHP, JS and CSS code for registering a block for a WordPress plugin.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/customize-widgets/CHANGELOG.md b/packages/customize-widgets/CHANGELOG.md index afded4c24a04f..b6968613edcda 100644 --- a/packages/customize-widgets/CHANGELOG.md +++ b/packages/customize-widgets/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/customize-widgets/package.json b/packages/customize-widgets/package.json index b30cf8ae4db38..69e684a295bda 100644 --- a/packages/customize-widgets/package.json +++ b/packages/customize-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/customize-widgets", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Widgets blocks in Customizer Module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/data-controls/CHANGELOG.md b/packages/data-controls/CHANGELOG.md index 331beda591a48..d27535c0537dc 100644 --- a/packages/data-controls/CHANGELOG.md +++ b/packages/data-controls/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/data-controls/package.json b/packages/data-controls/package.json index a4045e68fa173..c56c56e8dfd00 100644 --- a/packages/data-controls/package.json +++ b/packages/data-controls/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/data-controls", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "A set of common controls for the @wordpress/data api.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/data/CHANGELOG.md b/packages/data/CHANGELOG.md index 2442244b677de..42360d3a3da21 100644 --- a/packages/data/CHANGELOG.md +++ b/packages/data/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 10.18.0 (2025-02-12) + ## 10.17.0 (2025-01-29) ## 10.16.0 (2025-01-15) diff --git a/packages/data/package.json b/packages/data/package.json index 7a90897d453bd..6c7bf61ef7ca8 100644 --- a/packages/data/package.json +++ b/packages/data/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/data", - "version": "10.17.0", + "version": "10.18.0-prerelease", "description": "Data module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dataviews/CHANGELOG.md b/packages/dataviews/CHANGELOG.md index 8c644d78a9163..5166e76b32369 100644 --- a/packages/dataviews/CHANGELOG.md +++ b/packages/dataviews/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.14.0 (2025-02-12) + ## 4.13.0 (2025-01-29) ## 4.12.0 (2025-01-15) diff --git a/packages/dataviews/package.json b/packages/dataviews/package.json index 60161082ff10d..bc6304932ea83 100644 --- a/packages/dataviews/package.json +++ b/packages/dataviews/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dataviews", - "version": "4.13.0", + "version": "4.14.0-prerelease", "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/date/CHANGELOG.md b/packages/date/CHANGELOG.md index 4790ab7220deb..114af3feb1c34 100644 --- a/packages/date/CHANGELOG.md +++ b/packages/date/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/date/package.json b/packages/date/package.json index b68fd0789a11f..5fc37fb678de1 100644 --- a/packages/date/package.json +++ b/packages/date/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/date", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Date module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dependency-extraction-webpack-plugin/CHANGELOG.md b/packages/dependency-extraction-webpack-plugin/CHANGELOG.md index 1003bccd93d84..480b5e1b52921 100644 --- a/packages/dependency-extraction-webpack-plugin/CHANGELOG.md +++ b/packages/dependency-extraction-webpack-plugin/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/dependency-extraction-webpack-plugin/package.json b/packages/dependency-extraction-webpack-plugin/package.json index 8dee3f6a2a35e..1b49ca829db93 100644 --- a/packages/dependency-extraction-webpack-plugin/package.json +++ b/packages/dependency-extraction-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dependency-extraction-webpack-plugin", - "version": "6.17.0", + "version": "6.18.0-prerelease", "description": "Extract WordPress script dependencies from webpack bundles.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/deprecated/CHANGELOG.md b/packages/deprecated/CHANGELOG.md index e685d814f4c0c..539cb39ccad97 100644 --- a/packages/deprecated/CHANGELOG.md +++ b/packages/deprecated/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/deprecated/package.json b/packages/deprecated/package.json index c1637380b22b7..b27a6ad92206b 100644 --- a/packages/deprecated/package.json +++ b/packages/deprecated/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/deprecated", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "Deprecation utility for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/docgen/CHANGELOG.md b/packages/docgen/CHANGELOG.md index 5279b376fe1c5..eb7e73753d3c2 100644 --- a/packages/docgen/CHANGELOG.md +++ b/packages/docgen/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ## 2.17.0 (2025-01-29) ## 2.16.0 (2025-01-15) diff --git a/packages/docgen/package.json b/packages/docgen/package.json index 9083dcf2e4c9e..4a7e38fa4873d 100644 --- a/packages/docgen/package.json +++ b/packages/docgen/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/docgen", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "Autogenerate public API documentation from exports and JSDoc comments.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dom-ready/CHANGELOG.md b/packages/dom-ready/CHANGELOG.md index 90e953a9416b7..92148075cbca8 100644 --- a/packages/dom-ready/CHANGELOG.md +++ b/packages/dom-ready/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/dom-ready/package.json b/packages/dom-ready/package.json index 9ae59ee939260..c2a1d18fff403 100644 --- a/packages/dom-ready/package.json +++ b/packages/dom-ready/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dom-ready", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "Execute callback after the DOM is loaded.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dom/CHANGELOG.md b/packages/dom/CHANGELOG.md index 83931d4c6e9af..5d17028aca9bb 100644 --- a/packages/dom/CHANGELOG.md +++ b/packages/dom/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/dom/package.json b/packages/dom/package.json index 0c1d83bacbdcf..cc0c140fb4125 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dom", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "DOM utilities module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/e2e-test-utils-playwright/CHANGELOG.md b/packages/e2e-test-utils-playwright/CHANGELOG.md index 4df25e7f9c9e4..481b259efeedb 100644 --- a/packages/e2e-test-utils-playwright/CHANGELOG.md +++ b/packages/e2e-test-utils-playwright/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/e2e-test-utils-playwright/package.json b/packages/e2e-test-utils-playwright/package.json index 010c5077aefe3..6c26b89c816ce 100644 --- a/packages/e2e-test-utils-playwright/package.json +++ b/packages/e2e-test-utils-playwright/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/e2e-test-utils-playwright", - "version": "1.17.0", + "version": "1.18.0-prerelease", "description": "End-To-End (E2E) test utils for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/e2e-test-utils/CHANGELOG.md b/packages/e2e-test-utils/CHANGELOG.md index 2b615ef3784d0..488124de222a4 100644 --- a/packages/e2e-test-utils/CHANGELOG.md +++ b/packages/e2e-test-utils/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 11.18.0 (2025-02-12) + ## 11.17.0 (2025-01-29) ## 11.16.0 (2025-01-15) diff --git a/packages/e2e-test-utils/package.json b/packages/e2e-test-utils/package.json index 03b8ee6e7b8e5..9e18cf83447f2 100644 --- a/packages/e2e-test-utils/package.json +++ b/packages/e2e-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/e2e-test-utils", - "version": "11.17.0", + "version": "11.18.0-prerelease", "description": "End-To-End (E2E) test utils for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/e2e-tests/CHANGELOG.md b/packages/e2e-tests/CHANGELOG.md index fdcedc5da91c3..ebc0b397dd6b7 100644 --- a/packages/e2e-tests/CHANGELOG.md +++ b/packages/e2e-tests/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 8.18.0 (2025-02-12) + ## 8.17.0 (2025-01-29) ## 8.16.0 (2025-01-15) diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 275080914f405..985b6ffd249c2 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/e2e-tests", - "version": "8.17.0", + "version": "8.18.0-prerelease", "description": "End-To-End (E2E) tests for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/edit-post/CHANGELOG.md b/packages/edit-post/CHANGELOG.md index 234a05ca71566..640eae7a0e4b0 100644 --- a/packages/edit-post/CHANGELOG.md +++ b/packages/edit-post/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 8.18.0 (2025-02-12) + ## 8.17.0 (2025-01-29) ## 8.16.0 (2025-01-15) diff --git a/packages/edit-post/package.json b/packages/edit-post/package.json index 0403f1b952eef..dca270186dd39 100644 --- a/packages/edit-post/package.json +++ b/packages/edit-post/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-post", - "version": "8.17.1", + "version": "8.18.0-prerelease", "description": "Edit Post module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/edit-site/CHANGELOG.md b/packages/edit-site/CHANGELOG.md index 0d50909a8d8b7..6e4cef953d03c 100644 --- a/packages/edit-site/CHANGELOG.md +++ b/packages/edit-site/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/edit-site/package.json b/packages/edit-site/package.json index 637032e303e9e..c6965725a4f57 100644 --- a/packages/edit-site/package.json +++ b/packages/edit-site/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-site", - "version": "6.17.1", + "version": "6.18.0-prerelease", "description": "Edit Site Page module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/edit-widgets/CHANGELOG.md b/packages/edit-widgets/CHANGELOG.md index b7b4bfa52be62..aa43f83757c83 100644 --- a/packages/edit-widgets/CHANGELOG.md +++ b/packages/edit-widgets/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/edit-widgets/package.json b/packages/edit-widgets/package.json index f04357aab48f4..48da31f0b132d 100644 --- a/packages/edit-widgets/package.json +++ b/packages/edit-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-widgets", - "version": "6.17.0", + "version": "6.18.0-prerelease", "description": "Widgets Page module for WordPress..", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/editor/CHANGELOG.md b/packages/editor/CHANGELOG.md index 35590b79c75c3..89f375387da66 100644 --- a/packages/editor/CHANGELOG.md +++ b/packages/editor/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 14.18.0 (2025-02-12) + ## 14.17.0 (2025-01-29) ## 14.16.0 (2025-01-15) diff --git a/packages/editor/package.json b/packages/editor/package.json index 3b40e5965b6a3..3e4629bd2dced 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/editor", - "version": "14.17.1", + "version": "14.18.0-prerelease", "description": "Enhanced block editor for WordPress posts.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/element/CHANGELOG.md b/packages/element/CHANGELOG.md index 5300441670dbf..62591286563ca 100644 --- a/packages/element/CHANGELOG.md +++ b/packages/element/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/element/package.json b/packages/element/package.json index d7f3e32155c67..05363845cb944 100644 --- a/packages/element/package.json +++ b/packages/element/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/element", - "version": "6.17.0", + "version": "6.18.0-prerelease", "description": "Element React module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/env/CHANGELOG.md b/packages/env/CHANGELOG.md index 03be7a7bbc56c..a5015f745f3a0 100644 --- a/packages/env/CHANGELOG.md +++ b/packages/env/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 10.18.0 (2025-02-12) + ## 10.17.0 (2025-01-29) ### Enhancements diff --git a/packages/env/package.json b/packages/env/package.json index bdf8766aa5869..7606e1c2028a7 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/env", - "version": "10.17.0", + "version": "10.18.0-prerelease", "description": "A zero-config, self contained local WordPress environment for development and testing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/escape-html/CHANGELOG.md b/packages/escape-html/CHANGELOG.md index 3ec127fd9d5da..686bdc161900a 100644 --- a/packages/escape-html/CHANGELOG.md +++ b/packages/escape-html/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 3.18.0 (2025-02-12) + ## 3.17.0 (2025-01-29) ## 3.16.0 (2025-01-15) diff --git a/packages/escape-html/package.json b/packages/escape-html/package.json index 9a7555c3b32d3..f4c727da62ae4 100644 --- a/packages/escape-html/package.json +++ b/packages/escape-html/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/escape-html", - "version": "3.17.0", + "version": "3.18.0-prerelease", "description": "Escape HTML utils.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 60630bae0e01f..21139f7840cb8 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 22.4.0 (2025-02-12) + ## 22.3.0 (2025-01-29) ## 22.2.0 (2025-01-15) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index c315891896fcc..81898a025d764 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/eslint-plugin", - "version": "22.3.0", + "version": "22.4.0-prerelease", "description": "ESLint plugin for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/fields/CHANGELOG.md b/packages/fields/CHANGELOG.md index 8123d0f3caf11..a210c1064f65c 100644 --- a/packages/fields/CHANGELOG.md +++ b/packages/fields/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 0.10.0 (2025-02-12) + ## 0.9.0 (2025-01-29) ## 0.8.0 (2025-01-15) diff --git a/packages/fields/package.json b/packages/fields/package.json index adc59764b331a..f576a07f3c035 100644 --- a/packages/fields/package.json +++ b/packages/fields/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/fields", - "version": "0.9.0", + "version": "0.10.0-prerelease", "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/format-library/CHANGELOG.md b/packages/format-library/CHANGELOG.md index 222be010c4f1d..f075414e1a8c3 100644 --- a/packages/format-library/CHANGELOG.md +++ b/packages/format-library/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/format-library/package.json b/packages/format-library/package.json index 33ea404cf1476..42cad59ddc018 100644 --- a/packages/format-library/package.json +++ b/packages/format-library/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/format-library", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Format library for the WordPress editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/hooks/CHANGELOG.md b/packages/hooks/CHANGELOG.md index 38183ebd88b8b..4702fc18f98f1 100644 --- a/packages/hooks/CHANGELOG.md +++ b/packages/hooks/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 4fe1add4725bc..e103eba45fea8 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/hooks", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "WordPress hooks library.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/html-entities/CHANGELOG.md b/packages/html-entities/CHANGELOG.md index fd9f1e9f0f7be..845e384b22f3c 100644 --- a/packages/html-entities/CHANGELOG.md +++ b/packages/html-entities/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/html-entities/package.json b/packages/html-entities/package.json index b00d18fbf70b5..4c2a905f1c46d 100644 --- a/packages/html-entities/package.json +++ b/packages/html-entities/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/html-entities", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "HTML entity utilities for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index cdc5a75c6f640..90bc438dcdb48 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 883b75b06bd1f..9b3b08051f58a 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/i18n", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "WordPress internationalization (i18n) library.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/icons/CHANGELOG.md b/packages/icons/CHANGELOG.md index c07908788420e..2b0e895051920 100644 --- a/packages/icons/CHANGELOG.md +++ b/packages/icons/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 10.18.0 (2025-02-12) + ## 10.17.0 (2025-01-29) ## 10.16.0 (2025-01-15) diff --git a/packages/icons/package.json b/packages/icons/package.json index 128dfe44490a0..29fc479af1a32 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/icons", - "version": "10.17.0", + "version": "10.18.0-prerelease", "description": "WordPress Icons package, based on dashicon.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/interactivity-router/CHANGELOG.md b/packages/interactivity-router/CHANGELOG.md index 5213eff2c29f4..bbedead66bc2a 100644 --- a/packages/interactivity-router/CHANGELOG.md +++ b/packages/interactivity-router/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ### Bug Fixes - Fix CSS rule order in some constructed style sheets. ([#68923](https://github.com/WordPress/gutenberg/pull/68923)) diff --git a/packages/interactivity-router/package.json b/packages/interactivity-router/package.json index 9962d60bd2e1d..9c7d9e43c7a7b 100644 --- a/packages/interactivity-router/package.json +++ b/packages/interactivity-router/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/interactivity-router", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "Package that exposes state and actions from the `core/router` store, part of the Interactivity API.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/interactivity/CHANGELOG.md b/packages/interactivity/CHANGELOG.md index ef99d6974d6eb..cbc34cbc18231 100644 --- a/packages/interactivity/CHANGELOG.md +++ b/packages/interactivity/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/interactivity/package.json b/packages/interactivity/package.json index f109c40f43305..66ff1e83202cd 100644 --- a/packages/interactivity/package.json +++ b/packages/interactivity/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/interactivity", - "version": "6.17.0", + "version": "6.18.0-prerelease", "description": "Package that provides a standard and simple way to handle the frontend interactivity of Gutenberg blocks.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/interface/CHANGELOG.md b/packages/interface/CHANGELOG.md index 98c616216900b..ca51ac2a1b4c5 100644 --- a/packages/interface/CHANGELOG.md +++ b/packages/interface/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 9.3.0 (2025-02-12) + ## 9.2.0 (2025-01-29) ## 9.1.0 (2025-01-15) diff --git a/packages/interface/package.json b/packages/interface/package.json index 0cadb6070b9fc..b5b528b46cc81 100644 --- a/packages/interface/package.json +++ b/packages/interface/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/interface", - "version": "9.2.0", + "version": "9.3.0-prerelease", "description": "Interface module for WordPress. The package contains shared functionality across the modern JavaScript-based WordPress screens.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/is-shallow-equal/CHANGELOG.md b/packages/is-shallow-equal/CHANGELOG.md index d36971b392045..deb2aaae6deac 100644 --- a/packages/is-shallow-equal/CHANGELOG.md +++ b/packages/is-shallow-equal/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/is-shallow-equal/package.json b/packages/is-shallow-equal/package.json index d8be6a2c005c2..d088854aa6fba 100644 --- a/packages/is-shallow-equal/package.json +++ b/packages/is-shallow-equal/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/is-shallow-equal", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Test for shallow equality between two objects or arrays.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/jest-console/CHANGELOG.md b/packages/jest-console/CHANGELOG.md index cb017e3a3bc67..fa6b98dfb46ee 100644 --- a/packages/jest-console/CHANGELOG.md +++ b/packages/jest-console/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 8.18.0 (2025-02-12) + ## 8.17.0 (2025-01-29) ## 8.16.0 (2025-01-15) diff --git a/packages/jest-console/package.json b/packages/jest-console/package.json index 78492c7f74ee1..9a97fdf5335fa 100644 --- a/packages/jest-console/package.json +++ b/packages/jest-console/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/jest-console", - "version": "8.17.0", + "version": "8.18.0-prerelease", "description": "Custom Jest matchers for the Console object.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/jest-preset-default/CHANGELOG.md b/packages/jest-preset-default/CHANGELOG.md index dd03a156c395a..7678d8a49aac3 100644 --- a/packages/jest-preset-default/CHANGELOG.md +++ b/packages/jest-preset-default/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 12.18.0 (2025-02-12) + ## 12.17.0 (2025-01-29) ## 12.16.0 (2025-01-15) diff --git a/packages/jest-preset-default/package.json b/packages/jest-preset-default/package.json index b9bc50436ebc7..a6af25fb35b8a 100644 --- a/packages/jest-preset-default/package.json +++ b/packages/jest-preset-default/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/jest-preset-default", - "version": "12.17.0", + "version": "12.18.0-prerelease", "description": "Default Jest preset for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/jest-puppeteer-axe/CHANGELOG.md b/packages/jest-puppeteer-axe/CHANGELOG.md index 31c317a204058..2609ffa6cdac4 100644 --- a/packages/jest-puppeteer-axe/CHANGELOG.md +++ b/packages/jest-puppeteer-axe/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 7.18.0 (2025-02-12) + ## 7.17.0 (2025-01-29) ## 7.16.0 (2025-01-15) diff --git a/packages/jest-puppeteer-axe/package.json b/packages/jest-puppeteer-axe/package.json index dd6ebdf841cba..7275a8b70789c 100644 --- a/packages/jest-puppeteer-axe/package.json +++ b/packages/jest-puppeteer-axe/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/jest-puppeteer-axe", - "version": "7.17.0", + "version": "7.18.0-prerelease", "description": "Axe API integration with Jest and Puppeteer.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/keyboard-shortcuts/CHANGELOG.md b/packages/keyboard-shortcuts/CHANGELOG.md index 2833f565d36aa..970c6e865eefb 100644 --- a/packages/keyboard-shortcuts/CHANGELOG.md +++ b/packages/keyboard-shortcuts/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/keyboard-shortcuts/package.json b/packages/keyboard-shortcuts/package.json index 5aefa31c6c08b..9c66bdb83bf1e 100644 --- a/packages/keyboard-shortcuts/package.json +++ b/packages/keyboard-shortcuts/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/keyboard-shortcuts", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Handling keyboard shortcuts.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/keycodes/CHANGELOG.md b/packages/keycodes/CHANGELOG.md index dd21373711334..6a902d911f0ec 100644 --- a/packages/keycodes/CHANGELOG.md +++ b/packages/keycodes/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/keycodes/package.json b/packages/keycodes/package.json index a1bef731fef7f..4bcbd03f57389 100644 --- a/packages/keycodes/package.json +++ b/packages/keycodes/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/keycodes", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "Keycodes utilities for WordPress. Used to check for keyboard events across browsers/operating systems.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/lazy-import/CHANGELOG.md b/packages/lazy-import/CHANGELOG.md index 2411e89c9cfcf..3e3511261c566 100644 --- a/packages/lazy-import/CHANGELOG.md +++ b/packages/lazy-import/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ## 2.17.0 (2025-01-29) ## 2.16.0 (2025-01-15) diff --git a/packages/lazy-import/package.json b/packages/lazy-import/package.json index 0f18de9cc0cb6..2fd7a758aadcd 100644 --- a/packages/lazy-import/package.json +++ b/packages/lazy-import/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/lazy-import", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "Lazily import a module, installing it automatically if missing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/list-reusable-blocks/CHANGELOG.md b/packages/list-reusable-blocks/CHANGELOG.md index 5a4bd4f9f29e4..7ffc1fcd9bb4b 100644 --- a/packages/list-reusable-blocks/CHANGELOG.md +++ b/packages/list-reusable-blocks/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/list-reusable-blocks/package.json b/packages/list-reusable-blocks/package.json index 92db7b36d0760..1c02807bab8a5 100644 --- a/packages/list-reusable-blocks/package.json +++ b/packages/list-reusable-blocks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/list-reusable-blocks", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Adding Export/Import support to the reusable blocks listing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/media-utils/CHANGELOG.md b/packages/media-utils/CHANGELOG.md index b7d27a0681c4b..9720f3f9ac81f 100644 --- a/packages/media-utils/CHANGELOG.md +++ b/packages/media-utils/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/media-utils/package.json b/packages/media-utils/package.json index 984dcea29c9f4..3f9497f8c6415 100644 --- a/packages/media-utils/package.json +++ b/packages/media-utils/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/media-utils", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "WordPress Media Upload Utils.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/notices/CHANGELOG.md b/packages/notices/CHANGELOG.md index d38828c40a4ff..678edeaf97341 100644 --- a/packages/notices/CHANGELOG.md +++ b/packages/notices/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/notices/package.json b/packages/notices/package.json index c3ca8915eb2e3..7875aac631fcd 100644 --- a/packages/notices/package.json +++ b/packages/notices/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/notices", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "State management for notices.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/npm-package-json-lint-config/CHANGELOG.md b/packages/npm-package-json-lint-config/CHANGELOG.md index 620f409b37b5f..6240050bc156d 100644 --- a/packages/npm-package-json-lint-config/CHANGELOG.md +++ b/packages/npm-package-json-lint-config/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/npm-package-json-lint-config/package.json b/packages/npm-package-json-lint-config/package.json index a99d198f9f081..16f0f3a965fda 100644 --- a/packages/npm-package-json-lint-config/package.json +++ b/packages/npm-package-json-lint-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/npm-package-json-lint-config", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "WordPress npm-package-json-lint shareable configuration.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/nux/CHANGELOG.md b/packages/nux/CHANGELOG.md index f4e5e988fef88..0e77064fb80d7 100644 --- a/packages/nux/CHANGELOG.md +++ b/packages/nux/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 9.18.0 (2025-02-12) + ## 9.17.0 (2025-01-29) ## 9.16.0 (2025-01-15) diff --git a/packages/nux/package.json b/packages/nux/package.json index 70d3fb5cd95fd..bdfa2080a6bb1 100644 --- a/packages/nux/package.json +++ b/packages/nux/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/nux", - "version": "9.17.0", + "version": "9.18.0-prerelease", "description": "NUX (New User eXperience) module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/patterns/CHANGELOG.md b/packages/patterns/CHANGELOG.md index 8f586f1b3ae6b..96b7af1c85bb6 100644 --- a/packages/patterns/CHANGELOG.md +++ b/packages/patterns/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ## 2.17.0 (2025-01-29) ## 2.16.0 (2025-01-15) diff --git a/packages/patterns/package.json b/packages/patterns/package.json index 5300e9c0e907d..c356e55b334c8 100644 --- a/packages/patterns/package.json +++ b/packages/patterns/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/patterns", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "Management of user pattern editing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/plugins/CHANGELOG.md b/packages/plugins/CHANGELOG.md index de23659ea2d06..19203ad557526 100644 --- a/packages/plugins/CHANGELOG.md +++ b/packages/plugins/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 7.18.0 (2025-02-12) + ## 7.17.0 (2025-01-29) ## 7.16.0 (2025-01-15) diff --git a/packages/plugins/package.json b/packages/plugins/package.json index 1ca540e79f96f..719fa669018b6 100644 --- a/packages/plugins/package.json +++ b/packages/plugins/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/plugins", - "version": "7.17.0", + "version": "7.18.0-prerelease", "description": "Plugins module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/postcss-plugins-preset/CHANGELOG.md b/packages/postcss-plugins-preset/CHANGELOG.md index 904557314f5f2..f4843dcef722b 100644 --- a/packages/postcss-plugins-preset/CHANGELOG.md +++ b/packages/postcss-plugins-preset/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/postcss-plugins-preset/package.json b/packages/postcss-plugins-preset/package.json index 9fd2ac28deebc..cf5516f57f213 100644 --- a/packages/postcss-plugins-preset/package.json +++ b/packages/postcss-plugins-preset/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/postcss-plugins-preset", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "PostCSS sharable plugins preset for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/postcss-themes/CHANGELOG.md b/packages/postcss-themes/CHANGELOG.md index a7212372d4aa3..12f435ac16cce 100644 --- a/packages/postcss-themes/CHANGELOG.md +++ b/packages/postcss-themes/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/postcss-themes/package.json b/packages/postcss-themes/package.json index 2756c600a4067..b47caf5a3e17b 100644 --- a/packages/postcss-themes/package.json +++ b/packages/postcss-themes/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/postcss-themes", - "version": "6.17.0", + "version": "6.18.0-prerelease", "description": "PostCSS plugin to generate theme colors.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/preferences-persistence/CHANGELOG.md b/packages/preferences-persistence/CHANGELOG.md index b2606dac7e0b8..891fae3f0ea9e 100644 --- a/packages/preferences-persistence/CHANGELOG.md +++ b/packages/preferences-persistence/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ## 2.17.0 (2025-01-29) ## 2.16.0 (2025-01-15) diff --git a/packages/preferences-persistence/package.json b/packages/preferences-persistence/package.json index 8813cad82f6d4..f3130981c7cef 100644 --- a/packages/preferences-persistence/package.json +++ b/packages/preferences-persistence/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/preferences-persistence", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "Persistence utilities for `wordpress/preferences`.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/preferences/CHANGELOG.md b/packages/preferences/CHANGELOG.md index 7136304f71f4d..7b3031cf84a03 100644 --- a/packages/preferences/CHANGELOG.md +++ b/packages/preferences/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/preferences/package.json b/packages/preferences/package.json index 56778fc4f5f45..fd075bc5ffb48 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/preferences", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "Utilities for managing WordPress preferences.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/prettier-config/CHANGELOG.md b/packages/prettier-config/CHANGELOG.md index 5bbed9a6ec253..8dc0f13d35a61 100644 --- a/packages/prettier-config/CHANGELOG.md +++ b/packages/prettier-config/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index 80a617a8f2bd5..bbae246dba1fd 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/prettier-config", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "WordPress Prettier shared configuration.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/primitives/CHANGELOG.md b/packages/primitives/CHANGELOG.md index ca06f8f317ab4..897fd9bc003d0 100644 --- a/packages/primitives/CHANGELOG.md +++ b/packages/primitives/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/primitives/package.json b/packages/primitives/package.json index 24ba82c2957af..cafd515ecacdf 100644 --- a/packages/primitives/package.json +++ b/packages/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/primitives", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "WordPress cross-platform primitives.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/priority-queue/CHANGELOG.md b/packages/priority-queue/CHANGELOG.md index 54c266542c2a5..9ee8272cebff8 100644 --- a/packages/priority-queue/CHANGELOG.md +++ b/packages/priority-queue/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 3.18.0 (2025-02-12) + ## 3.17.0 (2025-01-29) ## 3.16.0 (2025-01-15) diff --git a/packages/priority-queue/package.json b/packages/priority-queue/package.json index a7c446c7ccf7f..f59103863ea3f 100644 --- a/packages/priority-queue/package.json +++ b/packages/priority-queue/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/priority-queue", - "version": "3.17.0", + "version": "3.18.0-prerelease", "description": "Generic browser priority queue.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/private-apis/CHANGELOG.md b/packages/private-apis/CHANGELOG.md index d64c9e3f07a13..136a5bc225061 100644 --- a/packages/private-apis/CHANGELOG.md +++ b/packages/private-apis/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/private-apis/package.json b/packages/private-apis/package.json index 46d8e742b9183..489755c4b0869 100644 --- a/packages/private-apis/package.json +++ b/packages/private-apis/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/private-apis", - "version": "1.17.0", + "version": "1.18.0-prerelease", "description": "Internal experimental APIs for WordPress core.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/project-management-automation/CHANGELOG.md b/packages/project-management-automation/CHANGELOG.md index 48ffdc4d03138..65339afded4a4 100644 --- a/packages/project-management-automation/CHANGELOG.md +++ b/packages/project-management-automation/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ## 2.17.0 (2025-01-29) ## 2.16.0 (2025-01-15) diff --git a/packages/project-management-automation/package.json b/packages/project-management-automation/package.json index 327df2a6036e1..26bd1a0abf0b5 100644 --- a/packages/project-management-automation/package.json +++ b/packages/project-management-automation/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/project-management-automation", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "GitHub Action that implements various automation to assist with managing the Gutenberg GitHub repository.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/react-i18n/CHANGELOG.md b/packages/react-i18n/CHANGELOG.md index d5bfec54bd5f4..dd21b385ad82e 100644 --- a/packages/react-i18n/CHANGELOG.md +++ b/packages/react-i18n/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/react-i18n/package.json b/packages/react-i18n/package.json index 54a42f88855a7..f0b022d14424a 100644 --- a/packages/react-i18n/package.json +++ b/packages/react-i18n/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/react-i18n", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "React bindings for @wordpress/i18n.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/readable-js-assets-webpack-plugin/CHANGELOG.md b/packages/readable-js-assets-webpack-plugin/CHANGELOG.md index cd2b86202aad2..cab0024f1b29c 100644 --- a/packages/readable-js-assets-webpack-plugin/CHANGELOG.md +++ b/packages/readable-js-assets-webpack-plugin/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 3.18.0 (2025-02-12) + ## 3.17.0 (2025-01-29) ## 3.16.0 (2025-01-15) diff --git a/packages/readable-js-assets-webpack-plugin/package.json b/packages/readable-js-assets-webpack-plugin/package.json index bfd3fb573ca2f..5a15376b24869 100644 --- a/packages/readable-js-assets-webpack-plugin/package.json +++ b/packages/readable-js-assets-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/readable-js-assets-webpack-plugin", - "version": "3.17.0", + "version": "3.18.0-prerelease", "description": "Generate a readable JS file for each JS asset.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/redux-routine/CHANGELOG.md b/packages/redux-routine/CHANGELOG.md index a0cb80b0c0e4c..d9dd064173024 100644 --- a/packages/redux-routine/CHANGELOG.md +++ b/packages/redux-routine/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/redux-routine/package.json b/packages/redux-routine/package.json index 5a75aef5c5a19..e965b90bb7159 100644 --- a/packages/redux-routine/package.json +++ b/packages/redux-routine/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/redux-routine", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Redux middleware for generator coroutines.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/reusable-blocks/CHANGELOG.md b/packages/reusable-blocks/CHANGELOG.md index 7c61ee2f0256f..8ab2f36ff5b54 100644 --- a/packages/reusable-blocks/CHANGELOG.md +++ b/packages/reusable-blocks/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/reusable-blocks/package.json b/packages/reusable-blocks/package.json index e34d36dd4c8b8..b2f09eb1bdda6 100644 --- a/packages/reusable-blocks/package.json +++ b/packages/reusable-blocks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/reusable-blocks", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "Reusable blocks utilities.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/rich-text/CHANGELOG.md b/packages/rich-text/CHANGELOG.md index 137a982adce9e..99dab2b6d7d54 100644 --- a/packages/rich-text/CHANGELOG.md +++ b/packages/rich-text/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 7.18.0 (2025-02-12) + ## 7.17.0 (2025-01-29) ## 7.16.0 (2025-01-15) diff --git a/packages/rich-text/package.json b/packages/rich-text/package.json index 9f7a576813456..d1b873f05f04d 100644 --- a/packages/rich-text/package.json +++ b/packages/rich-text/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/rich-text", - "version": "7.17.0", + "version": "7.18.0-prerelease", "description": "Rich text value and manipulation API.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/router/CHANGELOG.md b/packages/router/CHANGELOG.md index 36ed9891d807e..856f3659685b0 100644 --- a/packages/router/CHANGELOG.md +++ b/packages/router/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/router/package.json b/packages/router/package.json index 9ddd8ef1ab9f2..026d72a3376bb 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/router", - "version": "1.17.0", + "version": "1.18.0-prerelease", "description": "Router API for WordPress pages.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/scripts/CHANGELOG.md b/packages/scripts/CHANGELOG.md index f5ad9b8eb3436..5924f9a938095 100644 --- a/packages/scripts/CHANGELOG.md +++ b/packages/scripts/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 30.11.0 (2025-02-12) + ## 30.10.0 (2025-01-29) ## 30.9.0 (2025-01-15) diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 675c25c0b5480..bf4ed870f2f9e 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/scripts", - "version": "30.10.0", + "version": "30.11.0-prerelease", "description": "Collection of reusable scripts for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/server-side-render/CHANGELOG.md b/packages/server-side-render/CHANGELOG.md index ffb662d503db5..65e86fe2f2539 100644 --- a/packages/server-side-render/CHANGELOG.md +++ b/packages/server-side-render/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 5.18.0 (2025-02-12) + ## 5.17.0 (2025-01-29) ## 5.16.0 (2025-01-15) diff --git a/packages/server-side-render/package.json b/packages/server-side-render/package.json index 70fcfa4997807..dba9e6bfcd461 100644 --- a/packages/server-side-render/package.json +++ b/packages/server-side-render/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/server-side-render", - "version": "5.17.0", + "version": "5.18.0-prerelease", "description": "The component used with WordPress to server-side render a preview of dynamic blocks to display in the editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/shortcode/CHANGELOG.md b/packages/shortcode/CHANGELOG.md index bd36355f27790..5eb36c1395979 100644 --- a/packages/shortcode/CHANGELOG.md +++ b/packages/shortcode/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/shortcode/package.json b/packages/shortcode/package.json index b96126f5c344b..bc163c4888857 100644 --- a/packages/shortcode/package.json +++ b/packages/shortcode/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/shortcode", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "Shortcode module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/style-engine/CHANGELOG.md b/packages/style-engine/CHANGELOG.md index d1d0fc4c95090..5bdb3fa37adfa 100644 --- a/packages/style-engine/CHANGELOG.md +++ b/packages/style-engine/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.18.0 (2025-02-12) + ## 2.17.0 (2025-01-29) ## 2.16.0 (2025-01-15) diff --git a/packages/style-engine/package.json b/packages/style-engine/package.json index 5ce48d4e7da0f..996153170822c 100644 --- a/packages/style-engine/package.json +++ b/packages/style-engine/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/style-engine", - "version": "2.17.0", + "version": "2.18.0-prerelease", "description": "A suite of parsers and compilers for WordPress styles.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/stylelint-config/CHANGELOG.md b/packages/stylelint-config/CHANGELOG.md index dc326ef3b07f7..3d8e93519d175 100644 --- a/packages/stylelint-config/CHANGELOG.md +++ b/packages/stylelint-config/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 23.10.0 (2025-02-12) + ## 23.9.0 (2025-01-29) ## 23.8.0 (2025-01-15) diff --git a/packages/stylelint-config/package.json b/packages/stylelint-config/package.json index 4c6ccffcc0c53..dc4fdbdd3a04f 100644 --- a/packages/stylelint-config/package.json +++ b/packages/stylelint-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/stylelint-config", - "version": "23.9.0", + "version": "23.10.0-prerelease", "description": "stylelint config for WordPress development.", "author": "The WordPress Contributors", "license": "MIT", diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index bbd1aaf688db4..eccfc5a851cd7 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/sync/package.json b/packages/sync/package.json index 45200f2068e3c..59c13cf07c7f5 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/sync", - "version": "1.17.0", + "version": "1.18.0-prerelease", "description": "Sync Data.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/token-list/CHANGELOG.md b/packages/token-list/CHANGELOG.md index 0878eb5989bc5..6aba8cca74cc0 100644 --- a/packages/token-list/CHANGELOG.md +++ b/packages/token-list/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 3.18.0 (2025-02-12) + ## 3.17.0 (2025-01-29) ## 3.16.0 (2025-01-15) diff --git a/packages/token-list/package.json b/packages/token-list/package.json index cb067e63ca787..605ab80b73d55 100644 --- a/packages/token-list/package.json +++ b/packages/token-list/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/token-list", - "version": "3.17.0", + "version": "3.18.0-prerelease", "description": "Constructable, plain JavaScript DOMTokenList implementation, supporting non-browser runtimes.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/undo-manager/CHANGELOG.md b/packages/undo-manager/CHANGELOG.md index da4c45158d651..550a82025d72d 100644 --- a/packages/undo-manager/CHANGELOG.md +++ b/packages/undo-manager/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 1.18.0 (2025-02-12) + ## 1.17.0 (2025-01-29) ## 1.16.0 (2025-01-15) diff --git a/packages/undo-manager/package.json b/packages/undo-manager/package.json index 1cd7f11fdafe2..73bb383635cb2 100644 --- a/packages/undo-manager/package.json +++ b/packages/undo-manager/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/undo-manager", - "version": "1.17.0", + "version": "1.18.0-prerelease", "description": "A small package to manage undo/redo.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/upload-media/CHANGELOG.md b/packages/upload-media/CHANGELOG.md index c877455493a7b..17600b46bce9b 100644 --- a/packages/upload-media/CHANGELOG.md +++ b/packages/upload-media/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 0.3.0 (2025-02-12) + ## 0.2.0 (2025-01-29) ## 0.1.0 (2025-01-15) diff --git a/packages/upload-media/package.json b/packages/upload-media/package.json index 3d4e0171df1f7..d4ff0277d449f 100644 --- a/packages/upload-media/package.json +++ b/packages/upload-media/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/upload-media", - "version": "0.2.0", + "version": "0.3.0-prerelease", "description": "Core media upload logic.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/url/CHANGELOG.md b/packages/url/CHANGELOG.md index eb97783d31cd3..2a24cd002b502 100644 --- a/packages/url/CHANGELOG.md +++ b/packages/url/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/url/package.json b/packages/url/package.json index 9ff808bbe1ef2..dd8e172f1dc15 100644 --- a/packages/url/package.json +++ b/packages/url/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/url", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "WordPress URL utilities.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/viewport/CHANGELOG.md b/packages/viewport/CHANGELOG.md index d5426d9cac711..376a76ae3e882 100644 --- a/packages/viewport/CHANGELOG.md +++ b/packages/viewport/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 6.18.0 (2025-02-12) + ## 6.17.0 (2025-01-29) ## 6.16.0 (2025-01-15) diff --git a/packages/viewport/package.json b/packages/viewport/package.json index 8a4ae23e02a3c..0060baac17268 100644 --- a/packages/viewport/package.json +++ b/packages/viewport/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/viewport", - "version": "6.17.0", + "version": "6.18.0-prerelease", "description": "Viewport module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/warning/CHANGELOG.md b/packages/warning/CHANGELOG.md index 4d39133ca0e5a..b16e6934e2b3b 100644 --- a/packages/warning/CHANGELOG.md +++ b/packages/warning/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 3.18.0 (2025-02-12) + ## 3.17.0 (2025-01-29) ## 3.16.0 (2025-01-15) diff --git a/packages/warning/package.json b/packages/warning/package.json index 098986e2c6c03..9d4a9dd23ea0c 100644 --- a/packages/warning/package.json +++ b/packages/warning/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/warning", - "version": "3.17.0", + "version": "3.18.0-prerelease", "description": "Warning utility for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/widgets/CHANGELOG.md b/packages/widgets/CHANGELOG.md index cac2955edb6b1..85239f3c535b3 100644 --- a/packages/widgets/CHANGELOG.md +++ b/packages/widgets/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 782857be40898..81fdf0f75a905 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/widgets", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "Functionality used by the widgets block editor in the Widgets screen and the Customizer.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/wordcount/CHANGELOG.md b/packages/wordcount/CHANGELOG.md index 03b7132ba4b39..42c87b282a0a5 100644 --- a/packages/wordcount/CHANGELOG.md +++ b/packages/wordcount/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 4.18.0 (2025-02-12) + ## 4.17.0 (2025-01-29) ## 4.16.0 (2025-01-15) diff --git a/packages/wordcount/package.json b/packages/wordcount/package.json index 5fbe5c9d20b82..2494fa07d7529 100644 --- a/packages/wordcount/package.json +++ b/packages/wordcount/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/wordcount", - "version": "4.17.0", + "version": "4.18.0-prerelease", "description": "WordPress word count utility.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", From 13c08d495885da0f1de04829ad445bea25b753b6 Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 12 Feb 2025 12:39:22 +0000 Subject: [PATCH 42/96] chore(release): publish - @wordpress/a11y@4.18.0 - @wordpress/annotations@3.18.0 - @wordpress/api-fetch@7.18.0 - @wordpress/autop@4.18.0 - @wordpress/babel-plugin-import-jsx-pragma@5.18.0 - @wordpress/babel-plugin-makepot@6.18.0 - @wordpress/babel-preset-default@8.18.0 - @wordpress/base-styles@5.18.0 - @wordpress/blob@4.18.0 - @wordpress/block-directory@5.18.0 - @wordpress/block-editor@14.13.0 - @wordpress/block-library@9.18.0 - @wordpress/block-serialization-default-parser@5.18.0 - @wordpress/block-serialization-spec-parser@5.18.0 - @wordpress/blocks@14.7.0 - @wordpress/browserslist-config@6.18.0 - @wordpress/commands@1.18.0 - @wordpress/components@29.4.0 - @wordpress/compose@7.18.0 - @wordpress/core-commands@1.18.0 - @wordpress/core-data@7.18.0 - @wordpress/create-block@4.61.0 - @wordpress/create-block-interactive-template@2.18.0 - @wordpress/create-block-tutorial-template@4.18.0 - @wordpress/customize-widgets@5.18.0 - @wordpress/data@10.18.0 - @wordpress/data-controls@4.18.0 - @wordpress/dataviews@4.14.0 - @wordpress/date@5.18.0 - @wordpress/dependency-extraction-webpack-plugin@6.18.0 - @wordpress/deprecated@4.18.0 - @wordpress/docgen@2.18.0 - @wordpress/dom@4.18.0 - @wordpress/dom-ready@4.18.0 - @wordpress/e2e-test-utils@11.18.0 - @wordpress/e2e-test-utils-playwright@1.18.0 - @wordpress/e2e-tests@8.18.0 - @wordpress/edit-post@8.18.0 - @wordpress/edit-site@6.18.0 - @wordpress/edit-widgets@6.18.0 - @wordpress/editor@14.18.0 - @wordpress/element@6.18.0 - @wordpress/env@10.18.0 - @wordpress/escape-html@3.18.0 - @wordpress/eslint-plugin@22.4.0 - @wordpress/fields@0.10.0 - @wordpress/format-library@5.18.0 - @wordpress/hooks@4.18.0 - @wordpress/html-entities@4.18.0 - @wordpress/i18n@5.18.0 - @wordpress/icons@10.18.0 - @wordpress/interactivity@6.18.0 - @wordpress/interactivity-router@2.18.0 - @wordpress/interface@9.3.0 - @wordpress/is-shallow-equal@5.18.0 - @wordpress/jest-console@8.18.0 - @wordpress/jest-preset-default@12.18.0 - @wordpress/jest-puppeteer-axe@7.18.0 - @wordpress/keyboard-shortcuts@5.18.0 - @wordpress/keycodes@4.18.0 - @wordpress/lazy-import@2.18.0 - @wordpress/list-reusable-blocks@5.18.0 - @wordpress/media-utils@5.18.0 - @wordpress/notices@5.18.0 - @wordpress/npm-package-json-lint-config@5.18.0 - @wordpress/nux@9.18.0 - @wordpress/patterns@2.18.0 - @wordpress/plugins@7.18.0 - @wordpress/postcss-plugins-preset@5.18.0 - @wordpress/postcss-themes@6.18.0 - @wordpress/preferences@4.18.0 - @wordpress/preferences-persistence@2.18.0 - @wordpress/prettier-config@4.18.0 - @wordpress/primitives@4.18.0 - @wordpress/priority-queue@3.18.0 - @wordpress/private-apis@1.18.0 - @wordpress/project-management-automation@2.18.0 - @wordpress/react-i18n@4.18.0 - @wordpress/readable-js-assets-webpack-plugin@3.18.0 - @wordpress/redux-routine@5.18.0 - @wordpress/reusable-blocks@5.18.0 - @wordpress/rich-text@7.18.0 - @wordpress/router@1.18.0 - @wordpress/scripts@30.11.0 - @wordpress/server-side-render@5.18.0 - @wordpress/shortcode@4.18.0 - @wordpress/style-engine@2.18.0 - @wordpress/stylelint-config@23.10.0 - @wordpress/sync@1.18.0 - @wordpress/token-list@3.18.0 - @wordpress/undo-manager@1.18.0 - @wordpress/upload-media@0.3.0 - @wordpress/url@4.18.0 - @wordpress/viewport@6.18.0 - @wordpress/warning@3.18.0 - @wordpress/widgets@4.18.0 - @wordpress/wordcount@4.18.0 --- package-lock.json | 194 +++++++++--------- packages/a11y/package.json | 2 +- packages/annotations/package.json | 2 +- packages/api-fetch/package.json | 2 +- packages/autop/package.json | 2 +- .../package.json | 2 +- packages/babel-plugin-makepot/package.json | 2 +- packages/babel-preset-default/package.json | 2 +- packages/base-styles/package.json | 2 +- packages/blob/package.json | 2 +- packages/block-directory/package.json | 2 +- packages/block-editor/package.json | 2 +- packages/block-library/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- packages/blocks/package.json | 2 +- packages/browserslist-config/package.json | 2 +- packages/commands/package.json | 2 +- packages/components/package.json | 2 +- packages/compose/package.json | 2 +- packages/core-commands/package.json | 2 +- packages/core-data/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- packages/create-block/package.json | 2 +- packages/customize-widgets/package.json | 2 +- packages/data-controls/package.json | 2 +- packages/data/package.json | 2 +- packages/dataviews/package.json | 2 +- packages/date/package.json | 2 +- .../package.json | 2 +- packages/deprecated/package.json | 2 +- packages/docgen/package.json | 2 +- packages/dom-ready/package.json | 2 +- packages/dom/package.json | 2 +- .../e2e-test-utils-playwright/package.json | 2 +- packages/e2e-test-utils/package.json | 2 +- packages/e2e-tests/package.json | 2 +- packages/edit-post/package.json | 2 +- packages/edit-site/package.json | 2 +- packages/edit-widgets/package.json | 2 +- packages/editor/package.json | 2 +- packages/element/package.json | 2 +- packages/env/package.json | 2 +- packages/escape-html/package.json | 2 +- packages/eslint-plugin/package.json | 2 +- packages/fields/package.json | 2 +- packages/format-library/package.json | 2 +- packages/hooks/package.json | 2 +- packages/html-entities/package.json | 2 +- packages/i18n/package.json | 2 +- packages/icons/package.json | 2 +- packages/interactivity-router/package.json | 2 +- packages/interactivity/package.json | 2 +- packages/interface/package.json | 2 +- packages/is-shallow-equal/package.json | 2 +- packages/jest-console/package.json | 2 +- packages/jest-preset-default/package.json | 2 +- packages/jest-puppeteer-axe/package.json | 2 +- packages/keyboard-shortcuts/package.json | 2 +- packages/keycodes/package.json | 2 +- packages/lazy-import/package.json | 2 +- packages/list-reusable-blocks/package.json | 2 +- packages/media-utils/package.json | 2 +- packages/notices/package.json | 2 +- .../npm-package-json-lint-config/package.json | 2 +- packages/nux/package.json | 2 +- packages/patterns/package.json | 2 +- packages/plugins/package.json | 2 +- packages/postcss-plugins-preset/package.json | 2 +- packages/postcss-themes/package.json | 2 +- packages/preferences-persistence/package.json | 2 +- packages/preferences/package.json | 2 +- packages/prettier-config/package.json | 2 +- packages/primitives/package.json | 2 +- packages/priority-queue/package.json | 2 +- packages/private-apis/package.json | 2 +- .../package.json | 2 +- packages/react-i18n/package.json | 2 +- .../package.json | 2 +- packages/redux-routine/package.json | 2 +- packages/reusable-blocks/package.json | 2 +- packages/rich-text/package.json | 2 +- packages/router/package.json | 2 +- packages/scripts/package.json | 2 +- packages/server-side-render/package.json | 2 +- packages/shortcode/package.json | 2 +- packages/style-engine/package.json | 2 +- packages/stylelint-config/package.json | 2 +- packages/sync/package.json | 2 +- packages/token-list/package.json | 2 +- packages/undo-manager/package.json | 2 +- packages/upload-media/package.json | 2 +- packages/url/package.json | 2 +- packages/viewport/package.json | 2 +- packages/warning/package.json | 2 +- packages/widgets/package.json | 2 +- packages/wordcount/package.json | 2 +- 98 files changed, 194 insertions(+), 194 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce62c6db43564..b5bd7ed6c1b7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48711,7 +48711,7 @@ }, "packages/a11y": { "name": "@wordpress/a11y", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -48725,7 +48725,7 @@ }, "packages/annotations": { "name": "@wordpress/annotations", - "version": "3.17.0", + "version": "3.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -48753,7 +48753,7 @@ }, "packages/api-fetch": { "name": "@wordpress/api-fetch", - "version": "7.17.0", + "version": "7.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -48767,7 +48767,7 @@ }, "packages/autop": { "name": "@wordpress/autop", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -48779,7 +48779,7 @@ }, "packages/babel-plugin-import-jsx-pragma": { "name": "@wordpress/babel-plugin-import-jsx-pragma", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -48791,7 +48791,7 @@ }, "packages/babel-plugin-makepot": { "name": "@wordpress/babel-plugin-makepot", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "deepmerge": "^4.3.0", @@ -48808,7 +48808,7 @@ }, "packages/babel-preset-default": { "name": "@wordpress/babel-preset-default", - "version": "8.17.0", + "version": "8.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "7.25.7", @@ -49939,7 +49939,7 @@ }, "packages/base-styles": { "name": "@wordpress/base-styles", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -49948,7 +49948,7 @@ }, "packages/blob": { "name": "@wordpress/blob", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -49960,7 +49960,7 @@ }, "packages/block-directory": { "name": "@wordpress/block-directory", - "version": "5.17.1", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -49996,7 +49996,7 @@ }, "packages/block-editor": { "name": "@wordpress/block-editor", - "version": "14.12.0", + "version": "14.13.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50097,7 +50097,7 @@ }, "packages/block-library": { "name": "@wordpress/block-library", - "version": "9.17.0", + "version": "9.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50163,7 +50163,7 @@ }, "packages/block-serialization-default-parser": { "name": "@wordpress/block-serialization-default-parser", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -50175,7 +50175,7 @@ }, "packages/block-serialization-spec-parser": { "name": "@wordpress/block-serialization-spec-parser", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "pegjs": "^0.10.0", @@ -50188,7 +50188,7 @@ }, "packages/blocks": { "name": "@wordpress/blocks", - "version": "14.6.0", + "version": "14.7.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50242,7 +50242,7 @@ }, "packages/browserslist-config": { "name": "@wordpress/browserslist-config", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -50251,7 +50251,7 @@ }, "packages/commands": { "name": "@wordpress/commands", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50490,7 +50490,7 @@ }, "packages/components": { "name": "@wordpress/components", - "version": "29.3.0", + "version": "29.4.0", "license": "GPL-2.0-or-later", "dependencies": { "@ariakit/react": "^0.4.15", @@ -50581,7 +50581,7 @@ }, "packages/compose": { "name": "@wordpress/compose", - "version": "7.17.0", + "version": "7.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50618,7 +50618,7 @@ }, "packages/core-commands": { "name": "@wordpress/core-commands", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50647,7 +50647,7 @@ }, "packages/core-data": { "name": "@wordpress/core-data", - "version": "7.17.0", + "version": "7.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50692,7 +50692,7 @@ }, "packages/create-block": { "name": "@wordpress/create-block", - "version": "4.60.0", + "version": "4.61.0", "license": "GPL-2.0-or-later", "dependencies": { "@inquirer/prompts": "^7.2.0", @@ -50719,7 +50719,7 @@ }, "packages/create-block-interactive-template": { "name": "@wordpress/create-block-interactive-template", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -50728,7 +50728,7 @@ }, "packages/create-block-tutorial-template": { "name": "@wordpress/create-block-tutorial-template", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -50737,7 +50737,7 @@ }, "packages/customize-widgets": { "name": "@wordpress/customize-widgets", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50775,7 +50775,7 @@ }, "packages/data": { "name": "@wordpress/data", - "version": "10.17.0", + "version": "10.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50804,7 +50804,7 @@ }, "packages/data-controls": { "name": "@wordpress/data-controls", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50822,7 +50822,7 @@ }, "packages/dataviews": { "name": "@wordpress/dataviews", - "version": "4.13.0", + "version": "4.14.0", "license": "GPL-2.0-or-later", "dependencies": { "@ariakit/react": "^0.4.15", @@ -50849,7 +50849,7 @@ }, "packages/date": { "name": "@wordpress/date", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50864,7 +50864,7 @@ }, "packages/dependency-extraction-webpack-plugin": { "name": "@wordpress/dependency-extraction-webpack-plugin", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "json2php": "^0.0.7" @@ -50879,7 +50879,7 @@ }, "packages/deprecated": { "name": "@wordpress/deprecated", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50892,7 +50892,7 @@ }, "packages/docgen": { "name": "@wordpress/docgen", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "7.25.7", @@ -50913,7 +50913,7 @@ }, "packages/dom": { "name": "@wordpress/dom", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50926,7 +50926,7 @@ }, "packages/dom-ready": { "name": "@wordpress/dom-ready", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -50938,7 +50938,7 @@ }, "packages/e2e-test-utils": { "name": "@wordpress/e2e-test-utils", - "version": "11.17.0", + "version": "11.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -50960,7 +50960,7 @@ }, "packages/e2e-test-utils-playwright": { "name": "@wordpress/e2e-test-utils-playwright", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "change-case": "^4.1.2", @@ -50986,7 +50986,7 @@ }, "packages/e2e-tests": { "name": "@wordpress/e2e-tests", - "version": "8.17.0", + "version": "8.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/e2e-test-utils": "file:../e2e-test-utils", @@ -51024,7 +51024,7 @@ }, "packages/edit-post": { "name": "@wordpress/edit-post", - "version": "8.17.1", + "version": "8.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51071,7 +51071,7 @@ }, "packages/edit-site": { "name": "@wordpress/edit-site", - "version": "6.17.1", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51134,7 +51134,7 @@ }, "packages/edit-widgets": { "name": "@wordpress/edit-widgets", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51177,7 +51177,7 @@ }, "packages/editor": { "name": "@wordpress/editor", - "version": "14.17.1", + "version": "14.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51239,7 +51239,7 @@ }, "packages/element": { "name": "@wordpress/element", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51258,7 +51258,7 @@ }, "packages/env": { "name": "@wordpress/env", - "version": "10.17.0", + "version": "10.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@inquirer/prompts": "^7.2.0", @@ -51307,7 +51307,7 @@ }, "packages/escape-html": { "name": "@wordpress/escape-html", - "version": "3.17.0", + "version": "3.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -51319,7 +51319,7 @@ }, "packages/eslint-plugin": { "name": "@wordpress/eslint-plugin", - "version": "22.3.0", + "version": "22.4.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/eslint-parser": "7.25.7", @@ -51388,7 +51388,7 @@ }, "packages/fields": { "name": "@wordpress/fields", - "version": "0.9.0", + "version": "0.10.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51430,7 +51430,7 @@ }, "packages/format-library": { "name": "@wordpress/format-library", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51458,7 +51458,7 @@ }, "packages/hooks": { "name": "@wordpress/hooks", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -51470,7 +51470,7 @@ }, "packages/html-entities": { "name": "@wordpress/html-entities", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -51482,7 +51482,7 @@ }, "packages/i18n": { "name": "@wordpress/i18n", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51502,7 +51502,7 @@ }, "packages/icons": { "name": "@wordpress/icons", - "version": "10.17.0", + "version": "10.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51516,7 +51516,7 @@ }, "packages/interactivity": { "name": "@wordpress/interactivity", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@preact/signals": "^1.3.0", @@ -51529,7 +51529,7 @@ }, "packages/interactivity-router": { "name": "@wordpress/interactivity-router", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "file:../a11y", @@ -51542,7 +51542,7 @@ }, "packages/interface": { "name": "@wordpress/interface", - "version": "9.2.0", + "version": "9.3.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51570,7 +51570,7 @@ }, "packages/is-shallow-equal": { "name": "@wordpress/is-shallow-equal", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -51582,7 +51582,7 @@ }, "packages/jest-console": { "name": "@wordpress/jest-console", - "version": "8.17.0", + "version": "8.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51598,7 +51598,7 @@ }, "packages/jest-preset-default": { "name": "@wordpress/jest-preset-default", - "version": "12.17.0", + "version": "12.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/jest-console": "file:../jest-console", @@ -51615,7 +51615,7 @@ }, "packages/jest-puppeteer-axe": { "name": "@wordpress/jest-puppeteer-axe", - "version": "7.17.0", + "version": "7.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@axe-core/puppeteer": "^4.0.0", @@ -51637,7 +51637,7 @@ }, "packages/keyboard-shortcuts": { "name": "@wordpress/keyboard-shortcuts", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51655,7 +51655,7 @@ }, "packages/keycodes": { "name": "@wordpress/keycodes", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51668,7 +51668,7 @@ }, "packages/lazy-import": { "name": "@wordpress/lazy-import", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "execa": "^4.0.2", @@ -51682,7 +51682,7 @@ }, "packages/list-reusable-blocks": { "name": "@wordpress/list-reusable-blocks", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51705,7 +51705,7 @@ }, "packages/media-utils": { "name": "@wordpress/media-utils", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51722,7 +51722,7 @@ }, "packages/notices": { "name": "@wordpress/notices", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51739,7 +51739,7 @@ }, "packages/npm-package-json-lint-config": { "name": "@wordpress/npm-package-json-lint-config", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -51751,7 +51751,7 @@ }, "packages/nux": { "name": "@wordpress/nux", - "version": "9.17.0", + "version": "9.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51774,7 +51774,7 @@ }, "packages/patterns": { "name": "@wordpress/patterns", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51804,7 +51804,7 @@ }, "packages/plugins": { "name": "@wordpress/plugins", - "version": "7.17.0", + "version": "7.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51828,7 +51828,7 @@ }, "packages/postcss-plugins-preset": { "name": "@wordpress/postcss-plugins-preset", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/base-styles": "file:../base-styles", @@ -51897,7 +51897,7 @@ }, "packages/postcss-themes": { "name": "@wordpress/postcss-themes", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -51909,7 +51909,7 @@ }, "packages/preferences": { "name": "@wordpress/preferences", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51935,7 +51935,7 @@ }, "packages/preferences-persistence": { "name": "@wordpress/preferences-persistence", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51948,7 +51948,7 @@ }, "packages/prettier-config": { "name": "@wordpress/prettier-config", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -51960,7 +51960,7 @@ }, "packages/primitives": { "name": "@wordpress/primitives", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51977,7 +51977,7 @@ }, "packages/priority-queue": { "name": "@wordpress/priority-queue", - "version": "3.17.0", + "version": "3.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -51990,7 +51990,7 @@ }, "packages/private-apis": { "name": "@wordpress/private-apis", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -52002,7 +52002,7 @@ }, "packages/project-management-automation": { "name": "@wordpress/project-management-automation", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@actions/core": "1.9.1", @@ -52030,7 +52030,7 @@ }, "packages/react-i18n": { "name": "@wordpress/react-i18n", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52186,7 +52186,7 @@ }, "packages/readable-js-assets-webpack-plugin": { "name": "@wordpress/readable-js-assets-webpack-plugin", - "version": "3.17.0", + "version": "3.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -52198,7 +52198,7 @@ }, "packages/redux-routine": { "name": "@wordpress/redux-routine", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52241,7 +52241,7 @@ }, "packages/reusable-blocks": { "name": "@wordpress/reusable-blocks", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52268,7 +52268,7 @@ }, "packages/rich-text": { "name": "@wordpress/rich-text", - "version": "7.17.0", + "version": "7.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52292,7 +52292,7 @@ }, "packages/router": { "name": "@wordpress/router", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52313,7 +52313,7 @@ }, "packages/scripts": { "name": "@wordpress/scripts", - "version": "30.10.0", + "version": "30.11.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "7.25.7", @@ -52451,7 +52451,7 @@ }, "packages/server-side-render": { "name": "@wordpress/server-side-render", - "version": "5.17.0", + "version": "5.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52477,7 +52477,7 @@ }, "packages/shortcode": { "name": "@wordpress/shortcode", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52490,7 +52490,7 @@ }, "packages/style-engine": { "name": "@wordpress/style-engine", - "version": "2.17.0", + "version": "2.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52503,7 +52503,7 @@ }, "packages/stylelint-config": { "name": "@wordpress/stylelint-config", - "version": "23.9.0", + "version": "23.10.0", "license": "MIT", "dependencies": { "@stylistic/stylelint-plugin": "^3.0.1", @@ -52614,7 +52614,7 @@ }, "packages/sync": { "name": "@wordpress/sync", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52635,7 +52635,7 @@ }, "packages/token-list": { "name": "@wordpress/token-list", - "version": "3.17.0", + "version": "3.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" @@ -52647,7 +52647,7 @@ }, "packages/undo-manager": { "name": "@wordpress/undo-manager", - "version": "1.17.0", + "version": "1.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52660,7 +52660,7 @@ }, "packages/upload-media": { "name": "@wordpress/upload-media", - "version": "0.2.0", + "version": "0.3.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52687,7 +52687,7 @@ }, "packages/url": { "name": "@wordpress/url", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52700,7 +52700,7 @@ }, "packages/viewport": { "name": "@wordpress/viewport", - "version": "6.17.0", + "version": "6.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52730,7 +52730,7 @@ }, "packages/warning": { "name": "@wordpress/warning", - "version": "3.17.0", + "version": "3.18.0", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -52739,7 +52739,7 @@ }, "packages/widgets": { "name": "@wordpress/widgets", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", @@ -52767,7 +52767,7 @@ }, "packages/wordcount": { "name": "@wordpress/wordcount", - "version": "4.17.0", + "version": "4.18.0", "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7" diff --git a/packages/a11y/package.json b/packages/a11y/package.json index b468b7f1d25c1..bd38351dc08c7 100644 --- a/packages/a11y/package.json +++ b/packages/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/a11y", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Accessibility (a11y) utilities for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/annotations/package.json b/packages/annotations/package.json index 06428c8b4ec7e..f36523a6a6d69 100644 --- a/packages/annotations/package.json +++ b/packages/annotations/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/annotations", - "version": "3.18.0-prerelease", + "version": "3.18.0", "description": "Annotate content in the Gutenberg editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json index 63902ce178f4f..8c6d91542dbd0 100644 --- a/packages/api-fetch/package.json +++ b/packages/api-fetch/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/api-fetch", - "version": "7.18.0-prerelease", + "version": "7.18.0", "description": "Utility to make WordPress REST API requests.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/autop/package.json b/packages/autop/package.json index 5aae1de546b11..aa29e8c277da4 100644 --- a/packages/autop/package.json +++ b/packages/autop/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/autop", - "version": "4.18.0-prerelease", + "version": "4.18.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/package.json b/packages/babel-plugin-import-jsx-pragma/package.json index faf45d04feac2..0752261edc577 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.18.0-prerelease", + "version": "5.18.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/package.json b/packages/babel-plugin-makepot/package.json index 78bfa5b9e7db2..5d81bc61f4d0a 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.18.0-prerelease", + "version": "6.18.0", "description": "WordPress Babel internationalization (i18n) plugin.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/babel-preset-default/package.json b/packages/babel-preset-default/package.json index 7415b665dff86..220d9317ccc1a 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.18.0-prerelease", + "version": "8.18.0", "description": "Default Babel preset for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/base-styles/package.json b/packages/base-styles/package.json index d510470a55cec..c87d3c18e8dc3 100644 --- a/packages/base-styles/package.json +++ b/packages/base-styles/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/base-styles", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Base SCSS utilities and variables for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/blob/package.json b/packages/blob/package.json index db87d5ecd2d8a..85b897653f904 100644 --- a/packages/blob/package.json +++ b/packages/blob/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/blob", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Blob utilities for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/block-directory/package.json b/packages/block-directory/package.json index cfca9dd4cb014..7d9e15bc06940 100644 --- a/packages/block-directory/package.json +++ b/packages/block-directory/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-directory", - "version": "5.18.0-prerelease", + "version": "5.18.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/package.json b/packages/block-editor/package.json index 39d9e747380a9..2a60409071843 100644 --- a/packages/block-editor/package.json +++ b/packages/block-editor/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-editor", - "version": "14.13.0-prerelease", + "version": "14.13.0", "description": "Generic block editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/block-library/package.json b/packages/block-library/package.json index f534ff9538dc1..66d4fdcf9bad5 100644 --- a/packages/block-library/package.json +++ b/packages/block-library/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-library", - "version": "9.18.0-prerelease", + "version": "9.18.0", "description": "Block library for the WordPress editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/block-serialization-default-parser/package.json b/packages/block-serialization-default-parser/package.json index 4ed3d2c645d55..742d5c10804ff 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.18.0-prerelease", + "version": "5.18.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/package.json b/packages/block-serialization-spec-parser/package.json index 7dfbfbf97f9f2..03251c27157ca 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.18.0-prerelease", + "version": "5.18.0", "description": "Block serialization specification parser for WordPress posts.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/blocks/package.json b/packages/blocks/package.json index fd1793f7c023a..8a0dc2f8c03c4 100644 --- a/packages/blocks/package.json +++ b/packages/blocks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/blocks", - "version": "14.7.0-prerelease", + "version": "14.7.0", "description": "Block API for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/browserslist-config/package.json b/packages/browserslist-config/package.json index 5f0a08e96b578..87a9ad4f38972 100644 --- a/packages/browserslist-config/package.json +++ b/packages/browserslist-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/browserslist-config", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "WordPress Browserslist shared configuration.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/commands/package.json b/packages/commands/package.json index e18bc70f16300..27872b34a2979 100644 --- a/packages/commands/package.json +++ b/packages/commands/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/commands", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "Handles the commands menu.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/components/package.json b/packages/components/package.json index 74a93c259f17e..f3c4f655f31a3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/components", - "version": "29.4.0-prerelease", + "version": "29.4.0", "description": "UI components for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/compose/package.json b/packages/compose/package.json index 9f2d3f9eb789f..b8c4aa18863d7 100644 --- a/packages/compose/package.json +++ b/packages/compose/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/compose", - "version": "7.18.0-prerelease", + "version": "7.18.0", "description": "WordPress higher-order components (HOCs).", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/core-commands/package.json b/packages/core-commands/package.json index 74481b20a99fe..01e9fc74967e2 100644 --- a/packages/core-commands/package.json +++ b/packages/core-commands/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/core-commands", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "WordPress core reusable commands.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/core-data/package.json b/packages/core-data/package.json index 3f77cf43ba2cb..b6a3cac623470 100644 --- a/packages/core-data/package.json +++ b/packages/core-data/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/core-data", - "version": "7.18.0-prerelease", + "version": "7.18.0", "description": "Access to and manipulation of core WordPress entities.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/create-block-interactive-template/package.json b/packages/create-block-interactive-template/package.json index 15a7e9e03778b..6501444743372 100644 --- a/packages/create-block-interactive-template/package.json +++ b/packages/create-block-interactive-template/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/create-block-interactive-template", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "Template for @wordpress/create-block to create interactive blocks with the Interactivity API.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/create-block-tutorial-template/package.json b/packages/create-block-tutorial-template/package.json index 5cb195d79cc65..10a5e1277487c 100644 --- a/packages/create-block-tutorial-template/package.json +++ b/packages/create-block-tutorial-template/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/create-block-tutorial-template", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "This is a template for @wordpress/create-block that creates an example 'Copyright Date' block. This block is used in the official WordPress block development Quick Start Guide.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/create-block/package.json b/packages/create-block/package.json index 05899ff61a973..4dd1f6bb537af 100644 --- a/packages/create-block/package.json +++ b/packages/create-block/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/create-block", - "version": "4.61.0-prerelease", + "version": "4.61.0", "description": "Generates PHP, JS and CSS code for registering a block for a WordPress plugin.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/customize-widgets/package.json b/packages/customize-widgets/package.json index 69e684a295bda..dedd5c57b3eaa 100644 --- a/packages/customize-widgets/package.json +++ b/packages/customize-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/customize-widgets", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Widgets blocks in Customizer Module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/data-controls/package.json b/packages/data-controls/package.json index c56c56e8dfd00..732035ece891d 100644 --- a/packages/data-controls/package.json +++ b/packages/data-controls/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/data-controls", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "A set of common controls for the @wordpress/data api.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/data/package.json b/packages/data/package.json index 6c7bf61ef7ca8..afa25b3fae697 100644 --- a/packages/data/package.json +++ b/packages/data/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/data", - "version": "10.18.0-prerelease", + "version": "10.18.0", "description": "Data module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dataviews/package.json b/packages/dataviews/package.json index bc6304932ea83..55f4917f1d2e4 100644 --- a/packages/dataviews/package.json +++ b/packages/dataviews/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dataviews", - "version": "4.14.0-prerelease", + "version": "4.14.0", "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/date/package.json b/packages/date/package.json index 5fc37fb678de1..a26b2e7653a20 100644 --- a/packages/date/package.json +++ b/packages/date/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/date", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Date module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dependency-extraction-webpack-plugin/package.json b/packages/dependency-extraction-webpack-plugin/package.json index 1b49ca829db93..ab2a3f95fae7f 100644 --- a/packages/dependency-extraction-webpack-plugin/package.json +++ b/packages/dependency-extraction-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dependency-extraction-webpack-plugin", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "Extract WordPress script dependencies from webpack bundles.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/deprecated/package.json b/packages/deprecated/package.json index b27a6ad92206b..add1e21d17d0b 100644 --- a/packages/deprecated/package.json +++ b/packages/deprecated/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/deprecated", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Deprecation utility for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/docgen/package.json b/packages/docgen/package.json index 4a7e38fa4873d..6485bb4c08695 100644 --- a/packages/docgen/package.json +++ b/packages/docgen/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/docgen", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "Autogenerate public API documentation from exports and JSDoc comments.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dom-ready/package.json b/packages/dom-ready/package.json index c2a1d18fff403..0e3607ca7cf22 100644 --- a/packages/dom-ready/package.json +++ b/packages/dom-ready/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dom-ready", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Execute callback after the DOM is loaded.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/dom/package.json b/packages/dom/package.json index cc0c140fb4125..3159b9f8ba990 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/dom", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "DOM utilities module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/e2e-test-utils-playwright/package.json b/packages/e2e-test-utils-playwright/package.json index 6c26b89c816ce..66663694405bc 100644 --- a/packages/e2e-test-utils-playwright/package.json +++ b/packages/e2e-test-utils-playwright/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/e2e-test-utils-playwright", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "End-To-End (E2E) test utils for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/e2e-test-utils/package.json b/packages/e2e-test-utils/package.json index 9e18cf83447f2..8fc8109d1c0ec 100644 --- a/packages/e2e-test-utils/package.json +++ b/packages/e2e-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/e2e-test-utils", - "version": "11.18.0-prerelease", + "version": "11.18.0", "description": "End-To-End (E2E) test utils for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 985b6ffd249c2..7fc5a4c022a7c 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/e2e-tests", - "version": "8.18.0-prerelease", + "version": "8.18.0", "description": "End-To-End (E2E) tests for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/edit-post/package.json b/packages/edit-post/package.json index dca270186dd39..3c0ff9d714f82 100644 --- a/packages/edit-post/package.json +++ b/packages/edit-post/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-post", - "version": "8.18.0-prerelease", + "version": "8.18.0", "description": "Edit Post module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/edit-site/package.json b/packages/edit-site/package.json index c6965725a4f57..74d0313524dfa 100644 --- a/packages/edit-site/package.json +++ b/packages/edit-site/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-site", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "Edit Site Page module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/edit-widgets/package.json b/packages/edit-widgets/package.json index 48da31f0b132d..5a1d7e9c77934 100644 --- a/packages/edit-widgets/package.json +++ b/packages/edit-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-widgets", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "Widgets Page module for WordPress..", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/editor/package.json b/packages/editor/package.json index 3e4629bd2dced..0e22a564c61f4 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/editor", - "version": "14.18.0-prerelease", + "version": "14.18.0", "description": "Enhanced block editor for WordPress posts.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/element/package.json b/packages/element/package.json index 05363845cb944..de87f14a255e4 100644 --- a/packages/element/package.json +++ b/packages/element/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/element", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "Element React module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/env/package.json b/packages/env/package.json index 7606e1c2028a7..c55d652d16ded 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/env", - "version": "10.18.0-prerelease", + "version": "10.18.0", "description": "A zero-config, self contained local WordPress environment for development and testing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/escape-html/package.json b/packages/escape-html/package.json index f4c727da62ae4..74f87b4b6d434 100644 --- a/packages/escape-html/package.json +++ b/packages/escape-html/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/escape-html", - "version": "3.18.0-prerelease", + "version": "3.18.0", "description": "Escape HTML utils.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 81898a025d764..e5a94005723ae 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/eslint-plugin", - "version": "22.4.0-prerelease", + "version": "22.4.0", "description": "ESLint plugin for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/fields/package.json b/packages/fields/package.json index f576a07f3c035..3fc981c70d1a2 100644 --- a/packages/fields/package.json +++ b/packages/fields/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/fields", - "version": "0.10.0-prerelease", + "version": "0.10.0", "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/format-library/package.json b/packages/format-library/package.json index 42cad59ddc018..242789018725b 100644 --- a/packages/format-library/package.json +++ b/packages/format-library/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/format-library", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Format library for the WordPress editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/hooks/package.json b/packages/hooks/package.json index e103eba45fea8..ea5ba2ec15cb2 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/hooks", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "WordPress hooks library.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/html-entities/package.json b/packages/html-entities/package.json index 4c2a905f1c46d..4758c77647640 100644 --- a/packages/html-entities/package.json +++ b/packages/html-entities/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/html-entities", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "HTML entity utilities for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 9b3b08051f58a..bb444a8f881f7 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/i18n", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "WordPress internationalization (i18n) library.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/icons/package.json b/packages/icons/package.json index 29fc479af1a32..a40eee4a9a512 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/icons", - "version": "10.18.0-prerelease", + "version": "10.18.0", "description": "WordPress Icons package, based on dashicon.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/interactivity-router/package.json b/packages/interactivity-router/package.json index 9c7d9e43c7a7b..1dfc1ac9464c4 100644 --- a/packages/interactivity-router/package.json +++ b/packages/interactivity-router/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/interactivity-router", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "Package that exposes state and actions from the `core/router` store, part of the Interactivity API.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/interactivity/package.json b/packages/interactivity/package.json index 66ff1e83202cd..53cf888b1a60b 100644 --- a/packages/interactivity/package.json +++ b/packages/interactivity/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/interactivity", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "Package that provides a standard and simple way to handle the frontend interactivity of Gutenberg blocks.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/interface/package.json b/packages/interface/package.json index b5b528b46cc81..9d6c80bbaa85e 100644 --- a/packages/interface/package.json +++ b/packages/interface/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/interface", - "version": "9.3.0-prerelease", + "version": "9.3.0", "description": "Interface module for WordPress. The package contains shared functionality across the modern JavaScript-based WordPress screens.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/is-shallow-equal/package.json b/packages/is-shallow-equal/package.json index d088854aa6fba..dde3b465f0abb 100644 --- a/packages/is-shallow-equal/package.json +++ b/packages/is-shallow-equal/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/is-shallow-equal", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Test for shallow equality between two objects or arrays.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/jest-console/package.json b/packages/jest-console/package.json index 9a97fdf5335fa..5fe48359d639d 100644 --- a/packages/jest-console/package.json +++ b/packages/jest-console/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/jest-console", - "version": "8.18.0-prerelease", + "version": "8.18.0", "description": "Custom Jest matchers for the Console object.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/jest-preset-default/package.json b/packages/jest-preset-default/package.json index a6af25fb35b8a..4e5d5b8b55769 100644 --- a/packages/jest-preset-default/package.json +++ b/packages/jest-preset-default/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/jest-preset-default", - "version": "12.18.0-prerelease", + "version": "12.18.0", "description": "Default Jest preset for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/jest-puppeteer-axe/package.json b/packages/jest-puppeteer-axe/package.json index 7275a8b70789c..ae6a5379f6182 100644 --- a/packages/jest-puppeteer-axe/package.json +++ b/packages/jest-puppeteer-axe/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/jest-puppeteer-axe", - "version": "7.18.0-prerelease", + "version": "7.18.0", "description": "Axe API integration with Jest and Puppeteer.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/keyboard-shortcuts/package.json b/packages/keyboard-shortcuts/package.json index 9c66bdb83bf1e..7f6592ec87f74 100644 --- a/packages/keyboard-shortcuts/package.json +++ b/packages/keyboard-shortcuts/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/keyboard-shortcuts", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Handling keyboard shortcuts.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/keycodes/package.json b/packages/keycodes/package.json index 4bcbd03f57389..bea73ad185cb9 100644 --- a/packages/keycodes/package.json +++ b/packages/keycodes/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/keycodes", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Keycodes utilities for WordPress. Used to check for keyboard events across browsers/operating systems.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/lazy-import/package.json b/packages/lazy-import/package.json index 2fd7a758aadcd..8ece16ebad621 100644 --- a/packages/lazy-import/package.json +++ b/packages/lazy-import/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/lazy-import", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "Lazily import a module, installing it automatically if missing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/list-reusable-blocks/package.json b/packages/list-reusable-blocks/package.json index 1c02807bab8a5..dc8332889546b 100644 --- a/packages/list-reusable-blocks/package.json +++ b/packages/list-reusable-blocks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/list-reusable-blocks", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Adding Export/Import support to the reusable blocks listing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/media-utils/package.json b/packages/media-utils/package.json index 3f9497f8c6415..90c3023e4ef1d 100644 --- a/packages/media-utils/package.json +++ b/packages/media-utils/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/media-utils", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "WordPress Media Upload Utils.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/notices/package.json b/packages/notices/package.json index 7875aac631fcd..444601e732598 100644 --- a/packages/notices/package.json +++ b/packages/notices/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/notices", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "State management for notices.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/npm-package-json-lint-config/package.json b/packages/npm-package-json-lint-config/package.json index 16f0f3a965fda..ffe288165b767 100644 --- a/packages/npm-package-json-lint-config/package.json +++ b/packages/npm-package-json-lint-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/npm-package-json-lint-config", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "WordPress npm-package-json-lint shareable configuration.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/nux/package.json b/packages/nux/package.json index bdfa2080a6bb1..e39643d45021d 100644 --- a/packages/nux/package.json +++ b/packages/nux/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/nux", - "version": "9.18.0-prerelease", + "version": "9.18.0", "description": "NUX (New User eXperience) module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/patterns/package.json b/packages/patterns/package.json index c356e55b334c8..bbe86c12d2d37 100644 --- a/packages/patterns/package.json +++ b/packages/patterns/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/patterns", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "Management of user pattern editing.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/plugins/package.json b/packages/plugins/package.json index 719fa669018b6..77bc059699026 100644 --- a/packages/plugins/package.json +++ b/packages/plugins/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/plugins", - "version": "7.18.0-prerelease", + "version": "7.18.0", "description": "Plugins module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/postcss-plugins-preset/package.json b/packages/postcss-plugins-preset/package.json index cf5516f57f213..5d53c1018acaa 100644 --- a/packages/postcss-plugins-preset/package.json +++ b/packages/postcss-plugins-preset/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/postcss-plugins-preset", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "PostCSS sharable plugins preset for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/postcss-themes/package.json b/packages/postcss-themes/package.json index b47caf5a3e17b..73959bef12ab5 100644 --- a/packages/postcss-themes/package.json +++ b/packages/postcss-themes/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/postcss-themes", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "PostCSS plugin to generate theme colors.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/preferences-persistence/package.json b/packages/preferences-persistence/package.json index f3130981c7cef..b06673bf17be7 100644 --- a/packages/preferences-persistence/package.json +++ b/packages/preferences-persistence/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/preferences-persistence", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "Persistence utilities for `wordpress/preferences`.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/preferences/package.json b/packages/preferences/package.json index fd075bc5ffb48..2ae1a363f8023 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/preferences", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Utilities for managing WordPress preferences.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index bbae246dba1fd..ed2b142a9d905 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/prettier-config", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "WordPress Prettier shared configuration.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/primitives/package.json b/packages/primitives/package.json index cafd515ecacdf..b1dfdf1a07141 100644 --- a/packages/primitives/package.json +++ b/packages/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/primitives", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "WordPress cross-platform primitives.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/priority-queue/package.json b/packages/priority-queue/package.json index f59103863ea3f..24e72b2e6ca60 100644 --- a/packages/priority-queue/package.json +++ b/packages/priority-queue/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/priority-queue", - "version": "3.18.0-prerelease", + "version": "3.18.0", "description": "Generic browser priority queue.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/private-apis/package.json b/packages/private-apis/package.json index 489755c4b0869..e9afd612c85b1 100644 --- a/packages/private-apis/package.json +++ b/packages/private-apis/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/private-apis", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "Internal experimental APIs for WordPress core.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/project-management-automation/package.json b/packages/project-management-automation/package.json index 26bd1a0abf0b5..4d54d5d8dc2f0 100644 --- a/packages/project-management-automation/package.json +++ b/packages/project-management-automation/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/project-management-automation", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "GitHub Action that implements various automation to assist with managing the Gutenberg GitHub repository.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/react-i18n/package.json b/packages/react-i18n/package.json index f0b022d14424a..179ff73c6703b 100644 --- a/packages/react-i18n/package.json +++ b/packages/react-i18n/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/react-i18n", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "React bindings for @wordpress/i18n.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/readable-js-assets-webpack-plugin/package.json b/packages/readable-js-assets-webpack-plugin/package.json index 5a15376b24869..fc4841d2a87b8 100644 --- a/packages/readable-js-assets-webpack-plugin/package.json +++ b/packages/readable-js-assets-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/readable-js-assets-webpack-plugin", - "version": "3.18.0-prerelease", + "version": "3.18.0", "description": "Generate a readable JS file for each JS asset.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/redux-routine/package.json b/packages/redux-routine/package.json index e965b90bb7159..43b6e155df5bd 100644 --- a/packages/redux-routine/package.json +++ b/packages/redux-routine/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/redux-routine", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Redux middleware for generator coroutines.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/reusable-blocks/package.json b/packages/reusable-blocks/package.json index b2f09eb1bdda6..ba0e48edfc828 100644 --- a/packages/reusable-blocks/package.json +++ b/packages/reusable-blocks/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/reusable-blocks", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "Reusable blocks utilities.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/rich-text/package.json b/packages/rich-text/package.json index d1b873f05f04d..ffdb4d3afc99b 100644 --- a/packages/rich-text/package.json +++ b/packages/rich-text/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/rich-text", - "version": "7.18.0-prerelease", + "version": "7.18.0", "description": "Rich text value and manipulation API.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/router/package.json b/packages/router/package.json index 026d72a3376bb..019f00bb33e4e 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/router", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "Router API for WordPress pages.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/scripts/package.json b/packages/scripts/package.json index bf4ed870f2f9e..31cb6f70a10c2 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/scripts", - "version": "30.11.0-prerelease", + "version": "30.11.0", "description": "Collection of reusable scripts for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/server-side-render/package.json b/packages/server-side-render/package.json index dba9e6bfcd461..ad4511d3b4c63 100644 --- a/packages/server-side-render/package.json +++ b/packages/server-side-render/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/server-side-render", - "version": "5.18.0-prerelease", + "version": "5.18.0", "description": "The component used with WordPress to server-side render a preview of dynamic blocks to display in the editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/shortcode/package.json b/packages/shortcode/package.json index bc163c4888857..9da8902e6309c 100644 --- a/packages/shortcode/package.json +++ b/packages/shortcode/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/shortcode", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Shortcode module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/style-engine/package.json b/packages/style-engine/package.json index 996153170822c..9aa95d240eb9e 100644 --- a/packages/style-engine/package.json +++ b/packages/style-engine/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/style-engine", - "version": "2.18.0-prerelease", + "version": "2.18.0", "description": "A suite of parsers and compilers for WordPress styles.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/stylelint-config/package.json b/packages/stylelint-config/package.json index dc4fdbdd3a04f..dbaba3adc7da0 100644 --- a/packages/stylelint-config/package.json +++ b/packages/stylelint-config/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/stylelint-config", - "version": "23.10.0-prerelease", + "version": "23.10.0", "description": "stylelint config for WordPress development.", "author": "The WordPress Contributors", "license": "MIT", diff --git a/packages/sync/package.json b/packages/sync/package.json index 59c13cf07c7f5..871dff74c13a8 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/sync", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "Sync Data.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/token-list/package.json b/packages/token-list/package.json index 605ab80b73d55..440c99d53f21c 100644 --- a/packages/token-list/package.json +++ b/packages/token-list/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/token-list", - "version": "3.18.0-prerelease", + "version": "3.18.0", "description": "Constructable, plain JavaScript DOMTokenList implementation, supporting non-browser runtimes.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/undo-manager/package.json b/packages/undo-manager/package.json index 73bb383635cb2..4024255022d14 100644 --- a/packages/undo-manager/package.json +++ b/packages/undo-manager/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/undo-manager", - "version": "1.18.0-prerelease", + "version": "1.18.0", "description": "A small package to manage undo/redo.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/upload-media/package.json b/packages/upload-media/package.json index d4ff0277d449f..e2b44173b7624 100644 --- a/packages/upload-media/package.json +++ b/packages/upload-media/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/upload-media", - "version": "0.3.0-prerelease", + "version": "0.3.0", "description": "Core media upload logic.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/url/package.json b/packages/url/package.json index dd8e172f1dc15..eff6262667a15 100644 --- a/packages/url/package.json +++ b/packages/url/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/url", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "WordPress URL utilities.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/viewport/package.json b/packages/viewport/package.json index 0060baac17268..00c4ea5c073a3 100644 --- a/packages/viewport/package.json +++ b/packages/viewport/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/viewport", - "version": "6.18.0-prerelease", + "version": "6.18.0", "description": "Viewport module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/warning/package.json b/packages/warning/package.json index 9d4a9dd23ea0c..760a6360f1716 100644 --- a/packages/warning/package.json +++ b/packages/warning/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/warning", - "version": "3.18.0-prerelease", + "version": "3.18.0", "description": "Warning utility for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 81fdf0f75a905..7ac9729e0c541 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/widgets", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "Functionality used by the widgets block editor in the Widgets screen and the Customizer.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/wordcount/package.json b/packages/wordcount/package.json index 2494fa07d7529..34690e0d72dc5 100644 --- a/packages/wordcount/package.json +++ b/packages/wordcount/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/wordcount", - "version": "4.18.0-prerelease", + "version": "4.18.0", "description": "WordPress word count utility.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", From 43f1d78ae288ed8482412b61ee8f01ef4c27ae71 Mon Sep 17 00:00:00 2001 From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:32:50 +0530 Subject: [PATCH 43/96] ESLint: Add rule to prevent usage of the word 'sidebar' in translatable strings (#68894) Co-authored-by: im3dabasia Co-authored-by: tyxla Co-authored-by: afercia Co-authored-by: swissspidy --- .eslintrc.js | 6 ++++++ .../add-custom-generic-template-modal-content.js | 1 + packages/edit-site/src/components/welcome-guide/page.js | 1 + .../edit-widgets/src/components/sidebar/widget-areas.js | 1 + .../components/post-template/create-new-template-modal.js | 1 + packages/editor/src/components/preferences-modal/index.js | 2 +- packages/editor/src/components/sidebar/header.js | 2 +- packages/editor/src/components/sidebar/index.js | 2 +- 8 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6626a55a762d1..d1ee2e1b347df 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,6 +119,12 @@ const restrictedSyntax = [ 'CallExpression[callee.name=/^(__|_x|_n|_nx)$/] > Literal[value=/^toggle\\b/i]', message: "Avoid using the verb 'Toggle' in translatable strings", }, + { + selector: + 'CallExpression[callee.name=/^(__|_x|_n|_nx)$/] > Literal[value=/(? diff --git a/packages/edit-site/src/components/welcome-guide/page.js b/packages/edit-site/src/components/welcome-guide/page.js index 41bb80342280c..f9a26d9959306 100644 --- a/packages/edit-site/src/components/welcome-guide/page.js +++ b/packages/edit-site/src/components/welcome-guide/page.js @@ -57,6 +57,7 @@ export default function WelcomeGuidePage() {

{ __( + // eslint-disable-next-line no-restricted-syntax -- 'sidebar' is a common web design term for layouts 'It’s now possible to edit page content in the site editor. To customise other parts of the page like the header and footer switch to editing the template using the settings sidebar.' ) }

diff --git a/packages/edit-widgets/src/components/sidebar/widget-areas.js b/packages/edit-widgets/src/components/sidebar/widget-areas.js index c7b49c10b9746..c34739fdd4db2 100644 --- a/packages/edit-widgets/src/components/sidebar/widget-areas.js +++ b/packages/edit-widgets/src/components/sidebar/widget-areas.js @@ -33,6 +33,7 @@ export default function WidgetAreas( { selectedWidgetAreaId } ) { let description; if ( ! selectedWidgetArea ) { description = __( + // eslint-disable-next-line no-restricted-syntax -- 'sidebar' is a common web design term for layouts 'Widget Areas are global parts in your site’s layout that can accept blocks. These vary by theme, but are typically parts like your Sidebar or Footer.' ); } else if ( selectedWidgetAreaId === 'wp_inactive_widgets' ) { diff --git a/packages/editor/src/components/post-template/create-new-template-modal.js b/packages/editor/src/components/post-template/create-new-template-modal.js index 69d31b7f8f714..9a89cf385ebab 100644 --- a/packages/editor/src/components/post-template/create-new-template-modal.js +++ b/packages/editor/src/components/post-template/create-new-template-modal.js @@ -126,6 +126,7 @@ export default function CreateNewTemplateModal( { onClose } ) { placeholder={ DEFAULT_TITLE } disabled={ isBusy } help={ __( + // eslint-disable-next-line no-restricted-syntax -- 'sidebar' is a common web design term for layouts 'Describe the template, e.g. "Post with sidebar". A custom template can be manually applied to any post or page.' ) } /> diff --git a/packages/editor/src/components/preferences-modal/index.js b/packages/editor/src/components/preferences-modal/index.js index fcca1b00e9bb2..b848288598698 100644 --- a/packages/editor/src/components/preferences-modal/index.js +++ b/packages/editor/src/components/preferences-modal/index.js @@ -88,7 +88,7 @@ function PreferencesModalContents( { extraSections = {} } ) { scope="core" featureName="showListViewByDefault" help={ __( - 'Opens the List View sidebar by default.' + 'Opens the List View panel by default.' ) } label={ __( 'Always open List View' ) } /> diff --git a/packages/editor/src/components/sidebar/header.js b/packages/editor/src/components/sidebar/header.js index ed2f7f89fe6e7..b5d9aaa26707c 100644 --- a/packages/editor/src/components/sidebar/header.js +++ b/packages/editor/src/components/sidebar/header.js @@ -22,7 +22,7 @@ const SidebarHeader = ( _, ref ) => { return { documentLabel: // translators: Default label for the Document sidebar tab, not selected. - getPostTypeLabel() || _x( 'Document', 'noun, sidebar' ), + getPostTypeLabel() || _x( 'Document', 'noun, panel' ), }; }, [] ); diff --git a/packages/editor/src/components/sidebar/index.js b/packages/editor/src/components/sidebar/index.js index 601bcd8f311bb..6784aafeb57ff 100644 --- a/packages/editor/src/components/sidebar/index.js +++ b/packages/editor/src/components/sidebar/index.js @@ -103,7 +103,7 @@ const SidebarContent = ( { headerClassName="editor-sidebar__panel-tabs" title={ /* translators: button label text should, if possible, be under 16 characters. */ - _x( 'Settings', 'sidebar button label' ) + _x( 'Settings', 'panel button label' ) } toggleShortcut={ keyboardShortcut } icon={ isRTL() ? drawerLeft : drawerRight } From 8baa9f54a8f878bcb09da61849346b8b777cc1d8 Mon Sep 17 00:00:00 2001 From: Alex Chrysovergis <145097920+alexchrysovergis@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:12:11 +0200 Subject: [PATCH 44/96] Fix typo in global styles developer documentation (#69168) --- docs/how-to-guides/themes/global-settings-and-styles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how-to-guides/themes/global-settings-and-styles.md b/docs/how-to-guides/themes/global-settings-and-styles.md index 205a3ee862ce6..359b36b4ad205 100644 --- a/docs/how-to-guides/themes/global-settings-and-styles.md +++ b/docs/how-to-guides/themes/global-settings-and-styles.md @@ -111,7 +111,7 @@ body { ## Specification -This specification is the same for the three different origins that use this format: core, themes, and users. Themes can override core's defaults by creating a file called `theme.json`. Users, via the site editor, will also be able to override theme's or core's preferences via an user interface that is being worked on. +This specification is the same for the three different origins that use this format: core, themes, and users. Themes can override core's defaults by creating a file called `theme.json`. Users, via the site editor, will also be able to override theme's or core's preferences via a user interface that is being worked on. ```json { From e9bb57459b682239d24b2cc903628859f8f24466 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Thu, 13 Feb 2025 09:51:15 +0800 Subject: [PATCH 45/96] Editor: Conditionally enable the new default rendering mode for Pages (#69160) Co-authored-by: Mamaduka Co-authored-by: fabiankaegy Co-authored-by: audrasjb Co-authored-by: swissspidy --- backport-changelog/6.8/8123.md | 1 + lib/compat/wordpress-6.8/post.php | 23 ++++++++--------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/backport-changelog/6.8/8123.md b/backport-changelog/6.8/8123.md index 7955ec7741685..ec1b9f28f6f73 100644 --- a/backport-changelog/6.8/8123.md +++ b/backport-changelog/6.8/8123.md @@ -2,3 +2,4 @@ https://github.com/WordPress/wordpress-develop/pull/8123 * https://github.com/WordPress/gutenberg/pull/68549 * https://github.com/WordPress/gutenberg/pull/68745 +* https://github.com/WordPress/gutenberg/pull/69160 diff --git a/lib/compat/wordpress-6.8/post.php b/lib/compat/wordpress-6.8/post.php index 2477e94f7393c..b205e9dc81b89 100644 --- a/lib/compat/wordpress-6.8/post.php +++ b/lib/compat/wordpress-6.8/post.php @@ -4,23 +4,16 @@ * Set the default editor mode for the page post type to `template-locked`. * * Note: This backports into `create_initial_post_types` in WordPress Core. - * - * @param array $args Array of post type arguments. - * @return array Updated array of post type arguments. */ -function gutenberg_update_page_editor_support( $args ) { - if ( empty( $args['supports'] ) ) { - return $args; +function gutenberg_update_page_editor_support() { + // Avoid enabling the editor for pages when it's not supported. + // This is plugin specific safeguard. + if ( ! post_type_supports( 'page', 'editor' ) ) { + return; } - $editor_support_key = array_search( 'editor', $args['supports'], true ); - if ( false !== $editor_support_key ) { - unset( $args['supports'][ $editor_support_key ] ); - $args['supports']['editor'] = array( - 'default-mode' => 'template-locked', - ); + if ( wp_is_block_theme() ) { + add_post_type_support( 'page', 'editor', array( 'default-mode' => 'template-locked' ) ); } - - return $args; } -add_action( 'register_page_post_type_args', 'gutenberg_update_page_editor_support' ); +add_action( 'init', 'gutenberg_update_page_editor_support' ); From 9ea69df45f3c4363eae46fc07c4544eb97d42f2c Mon Sep 17 00:00:00 2001 From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com> Date: Thu, 13 Feb 2025 08:22:04 +0530 Subject: [PATCH 46/96] ESLint: Improve lint regex for preventing "toggle" word usage in translation ready functions (#68958) * fix: Improve lint regex for toggle word detection * fix: Change strings to use alternate word for toggle Co-authored-by: im3dabasia Co-authored-by: tyxla Co-authored-by: swissspidy Co-authored-by: afercia --- .eslintrc.js | 2 +- packages/block-editor/src/components/tool-selector/index.js | 2 +- packages/block-editor/src/hooks/layout.js | 2 +- .../components/src/mobile/bottom-sheet/switch-cell.native.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d1ee2e1b347df..402c16ec5c80f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -116,7 +116,7 @@ const restrictedSyntax = [ }, { selector: - 'CallExpression[callee.name=/^(__|_x|_n|_nx)$/] > Literal[value=/^toggle\\b/i]', + 'CallExpression[callee.name=/^(__|_x|_n|_nx)$/] > Literal[value=/toggle\\b/i]', message: "Avoid using the verb 'Toggle' in translatable strings", }, { diff --git a/packages/block-editor/src/components/tool-selector/index.js b/packages/block-editor/src/components/tool-selector/index.js index 8c4b5c86c4082..c4c216cbe68a7 100644 --- a/packages/block-editor/src/components/tool-selector/index.js +++ b/packages/block-editor/src/components/tool-selector/index.js @@ -95,7 +95,7 @@ function ToolSelector( props, ref ) {
{ __( - 'Tools provide different sets of interactions for blocks. Toggle between simplified content tools (Write) and advanced visual editing tools (Design).' + 'Tools provide different sets of interactions for blocks. Choose between simplified content tools (Write) and advanced visual editing tools (Design).' ) }
diff --git a/packages/block-editor/src/hooks/layout.js b/packages/block-editor/src/hooks/layout.js index 54a376a0c6a4f..003a680940b97 100644 --- a/packages/block-editor/src/hooks/layout.js +++ b/packages/block-editor/src/hooks/layout.js @@ -257,7 +257,7 @@ function LayoutPanelPure( { 'Nested blocks use content width with options for full and wide widths.' ) : __( - 'Nested blocks will fill the width of this container. Toggle to constrain.' + 'Nested blocks will fill the width of this container.' ) } /> diff --git a/packages/components/src/mobile/bottom-sheet/switch-cell.native.js b/packages/components/src/mobile/bottom-sheet/switch-cell.native.js index 3e00756b1a7dc..0ada3fafc5672 100644 --- a/packages/components/src/mobile/bottom-sheet/switch-cell.native.js +++ b/packages/components/src/mobile/bottom-sheet/switch-cell.native.js @@ -57,7 +57,7 @@ export default function BottomSheetSwitchCell( props ) { accessibilityRole="none" accessibilityHint={ /* translators: accessibility text (hint for switches) */ - __( 'Double tap to toggle setting' ) + __( 'Double tap to change setting' ) } onPress={ onPress } editable={ false } From 322899ec2a1028b3473f760278d32fe5075e8fbe Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Thu, 13 Feb 2025 11:09:11 +0800 Subject: [PATCH 47/96] Plugin: Fix typo for 'ignore_sticky_posts' REST API support (#69171) Co-authored-by: Mamaduka Co-authored-by: swissspidy --- lib/compat/wordpress-6.8/rest-api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compat/wordpress-6.8/rest-api.php b/lib/compat/wordpress-6.8/rest-api.php index fc68077b67f76..f6844184ea610 100644 --- a/lib/compat/wordpress-6.8/rest-api.php +++ b/lib/compat/wordpress-6.8/rest-api.php @@ -80,7 +80,7 @@ function gutenberg_add_default_template_types_to_index( WP_REST_Response $respon * @param WP_Post_Type $post_type Post type object. * @return array */ -function gutenberg_modify_post_collection_paramt( $query_params, WP_Post_Type $post_type ) { +function gutenberg_modify_post_collection_param( $query_params, WP_Post_Type $post_type ) { if ( 'post' === $post_type->name && ! isset( $query_params['ignore_sticky'] ) ) { $query_params['ignore_sticky'] = array( 'description' => __( 'Whether to ignore sticky posts or not.' ), @@ -91,7 +91,7 @@ function gutenberg_modify_post_collection_paramt( $query_params, WP_Post_Type $p return $query_params; } -add_filter( 'rest_post_collection_params', 'gutenberg_modify_post_collection_paramt', 10, 2 ); +add_filter( 'rest_post_collection_params', 'gutenberg_modify_post_collection_param', 10, 2 ); /** * Modify posts query based on `ignore_sticky` parameter. From ad5c6c1a938744af70e506332bb5167293cfb5cb Mon Sep 17 00:00:00 2001 From: Ankit Kumar Shah Date: Thu, 13 Feb 2025 12:49:01 +0530 Subject: [PATCH 48/96] NumberControl: Fix invalid HTML attributes for infinite bounds (#69033) Co-authored-by: Infinite-Null Co-authored-by: hbhalodia Co-authored-by: Mamaduka Co-authored-by: mirka <0mirka00@git.wordpress.org> Co-authored-by: afercia --- packages/components/CHANGELOG.md | 4 ++++ packages/components/src/number-control/index.tsx | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 15a22ed7578ec..38c97f5a31017 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Internal + +- `NumberControl`: Fix invalid HTML attributes for infinite bounds ([#69033](https://github.com/WordPress/gutenberg/pull/69033)). + ## 29.4.0 (2025-02-12) - `FontSizePicker`: Remove Custom option from dropdown to prevent unexpected context changes during keyboard navigation ([#69038](https://github.com/WordPress/gutenberg/pull/69038)). diff --git a/packages/components/src/number-control/index.tsx b/packages/components/src/number-control/index.tsx index 6dd1af4024af7..e890746e275e8 100644 --- a/packages/components/src/number-control/index.tsx +++ b/packages/components/src/number-control/index.tsx @@ -229,8 +229,8 @@ function UnforwardedNumberControl( hideHTMLArrows={ spinControls !== 'native' } isDragEnabled={ isDragEnabled } label={ label } - max={ max } - min={ min } + max={ max === Infinity ? undefined : max } + min={ min === -Infinity ? undefined : min } ref={ mergedRef } required={ required } step={ step } From 2b5e25315bbfeb4d7efe008e9b0d25cf5e2951ac Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Thu, 13 Feb 2025 13:30:03 +0100 Subject: [PATCH 49/96] Improve the EntitiesSavedStates modal dialog design and labeling (#67792) * Move buttons at the bottom when rendered withim a modal dialog. * Refine styling. * Make modal dialog header visible and fix labeling. * Fix label and description when used with modal behavior. * Try modal dialog small size. * Adjust changes list margins. * Use default font size and color for the changes items. * Fix displaying of longer checkbox labels. * Reduce changes count paragraph bottom margin. * Use more generic variant prop. * Polish. * Update variant prop doc. Co-authored-by: afercia Co-authored-by: carolinan Co-authored-by: jameskoster Co-authored-by: jasmussen Co-authored-by: fcoveram Co-authored-by: ciampo Co-authored-by: dhruvang21 Co-authored-by: paaljoachim Co-authored-by: SaxonF --- .../src/components/save-panel/index.js | 24 ++- packages/editor/README.md | 1 + .../entity-record-item.js | 1 + .../entities-saved-states/entity-type-list.js | 6 +- .../components/entities-saved-states/index.js | 156 +++++++++++------- .../entities-saved-states/style.scss | 45 ++++- 6 files changed, 161 insertions(+), 72 deletions(-) diff --git a/packages/edit-site/src/components/save-panel/index.js b/packages/edit-site/src/components/save-panel/index.js index 95ec9b9ffc8c4..0327022b03f2b 100644 --- a/packages/edit-site/src/components/save-panel/index.js +++ b/packages/edit-site/src/components/save-panel/index.js @@ -31,7 +31,11 @@ const { EntitiesSavedStatesExtensible, NavigableRegion } = unlock( privateApis ); const { useLocation } = unlock( routerPrivateApis ); -const EntitiesSavedStatesForPreview = ( { onClose, renderDialog } ) => { +const EntitiesSavedStatesForPreview = ( { + onClose, + renderDialog, + variant, +} ) => { const isDirtyProps = useEntitiesSavedStatesIsDirty(); let activateSaveLabel; if ( isDirtyProps.isDirty ) { @@ -76,22 +80,28 @@ const EntitiesSavedStatesForPreview = ( { onClose, renderDialog } ) => { saveEnabled: true, saveLabel: activateSaveLabel, renderDialog, + variant, } } /> ); }; -const _EntitiesSavedStates = ( { onClose, renderDialog } ) => { +const _EntitiesSavedStates = ( { onClose, renderDialog, variant } ) => { if ( isPreviewingTheme() ) { return ( ); } return ( - + ); }; @@ -130,12 +140,10 @@ export default function SavePanel() { - <_EntitiesSavedStates onClose={ onClose } /> + <_EntitiesSavedStates onClose={ onClose } variant="inline" /> ) : null; } diff --git a/packages/editor/README.md b/packages/editor/README.md index 923345ab5a78c..bbea89105419c 100644 --- a/packages/editor/README.md +++ b/packages/editor/README.md @@ -402,6 +402,7 @@ _Parameters_ - _props_ `Object`: The component props. - _props.close_ `Function`: The function to close the dialog. - _props.renderDialog_ `boolean`: Whether to render the component with modal dialog behavior. +- _props.variant_ `string`: Changes the layout of the component. When an `inline` value is provided, the action buttons are rendered at the end of the component instead of at the start. _Returns_ diff --git a/packages/editor/src/components/entities-saved-states/entity-record-item.js b/packages/editor/src/components/entities-saved-states/entity-record-item.js index e8219c4cca7ae..ba2e93088be93 100644 --- a/packages/editor/src/components/entities-saved-states/entity-record-item.js +++ b/packages/editor/src/components/entities-saved-states/entity-record-item.js @@ -64,6 +64,7 @@ export default function EntityRecordItem( { record, checked, onChange } ) { } checked={ checked } onChange={ onChange } + className="entities-saved-states__change-control" /> { hasPostMetaChanges && ( diff --git a/packages/editor/src/components/entities-saved-states/entity-type-list.js b/packages/editor/src/components/entities-saved-states/entity-type-list.js index 71041dd9aebab..7cdf4c41e0f1f 100644 --- a/packages/editor/src/components/entities-saved-states/entity-type-list.js +++ b/packages/editor/src/components/entities-saved-states/entity-type-list.js @@ -94,7 +94,11 @@ export default function EntityTypeList( { } return ( - + { list.map( ( record ) => { return ( diff --git a/packages/editor/src/components/entities-saved-states/index.js b/packages/editor/src/components/entities-saved-states/index.js index 200473cccff70..c30fea995827d 100644 --- a/packages/editor/src/components/entities-saved-states/index.js +++ b/packages/editor/src/components/entities-saved-states/index.js @@ -1,3 +1,8 @@ +/** + * External dependencies + */ +import clsx from 'clsx'; + /** * WordPress dependencies */ @@ -32,15 +37,21 @@ function identity( values ) { * @param {Object} props The component props. * @param {Function} props.close The function to close the dialog. * @param {boolean} props.renderDialog Whether to render the component with modal dialog behavior. + * @param {string} props.variant Changes the layout of the component. When an `inline` value is provided, the action buttons are rendered at the end of the component instead of at the start. * * @return {React.ReactNode} The rendered component. */ -export default function EntitiesSavedStates( { close, renderDialog } ) { +export default function EntitiesSavedStates( { + close, + renderDialog, + variant, +} ) { const isDirtyProps = useIsDirty(); return ( ); @@ -60,6 +71,7 @@ export default function EntitiesSavedStates( { close, renderDialog } ) { * @param {boolean} props.isDirty Flag indicating if there are dirty entities. * @param {Function} props.setUnselectedEntities Function to set unselected entities. * @param {Array} props.unselectedEntities Array of unselected entities. + * @param {string} props.variant Changes the layout of the component. When an `inline` value is provided, the action buttons are rendered at the end of the component instead of at the start. * * @return {React.ReactNode} The rendered component. */ @@ -74,6 +86,7 @@ export function EntitiesSavedStatesExtensible( { isDirty, setUnselectedEntities, unselectedEntities, + variant = 'default', } ) { const saveButtonRef = useRef(); const { saveDirtyEntities } = unlock( useDispatch( editorStore ) ); @@ -109,83 +122,100 @@ export function EntitiesSavedStatesExtensible( { const [ saveDialogRef, saveDialogProps ] = useDialog( { onClose: () => dismissPanel(), } ); - const dialogLabel = useInstanceId( EntitiesSavedStatesExtensible, 'label' ); - const dialogDescription = useInstanceId( + const dialogLabelId = useInstanceId( + EntitiesSavedStatesExtensible, + 'entities-saved-states__panel-label' + ); + const dialogDescriptionId = useInstanceId( EntitiesSavedStatesExtensible, - 'description' + 'entities-saved-states__panel-description' ); const selectItemsToSaveDescription = !! dirtyEntityRecords.length ? __( 'Select the items you want to save.' ) : undefined; + const isInline = variant === 'inline'; + + const actionButtons = ( + <> + + { __( 'Cancel' ) } + + + saveDirtyEntities( { + onSave, + dirtyEntityRecords, + entitiesToSkip: unselectedEntities, + close, + } ) + } + className="editor-entities-saved-states__save-button" + > + { saveLabel } + + + ); + return (
- - - { __( 'Cancel' ) } - - - saveDirtyEntities( { - onSave, - dirtyEntityRecords, - entitiesToSkip: unselectedEntities, - close, - } ) - } - className="editor-entities-saved-states__save-button" - > - { saveLabel } - - + { ! isInline && ( + + { actionButtons } + + ) }
-
- +
+ { __( 'Are you ready to save?' ) } - { additionalPrompt }
-

- { isDirty - ? createInterpolateElement( - sprintf( - /* translators: %d: number of site changes waiting to be saved. */ - _n( - 'There is %d site change waiting to be saved.', - 'There are %d site changes waiting to be saved.', +

+ { additionalPrompt } +

+ { isDirty + ? createInterpolateElement( + sprintf( + /* translators: %d: number of site changes waiting to be saved. */ + _n( + 'There is %d site change waiting to be saved.', + 'There are %d site changes waiting to be saved.', + dirtyEntityRecords.length + ), dirtyEntityRecords.length ), - dirtyEntityRecords.length - ), - { strong: } - ) - : selectItemsToSaveDescription } -

+ { strong: } + ) + : selectItemsToSaveDescription } +

+
{ sortedPartitionedSavables.map( ( list ) => { @@ -198,6 +228,16 @@ export function EntitiesSavedStatesExtensible( { /> ); } ) } + + { isInline && ( + + { actionButtons } + + ) }
); } diff --git a/packages/editor/src/components/entities-saved-states/style.scss b/packages/editor/src/components/entities-saved-states/style.scss index e2c320678c322..d35feffa69308 100644 --- a/packages/editor/src/components/entities-saved-states/style.scss +++ b/packages/editor/src/components/entities-saved-states/style.scss @@ -16,14 +16,49 @@ } } -.entities-saved-states__description-heading { - font-size: $default-font-size; +.entities-saved-states__panel.is-inline { + .entities-saved-states__text-prompt { + padding: 0; + } + + .entities-saved-states__panel-body { + padding-left: 0; + padding-right: 0; + border: 0; + + > h2 { + margin-left: -1 * $grid-unit-20; + margin-right: -1 * $grid-unit-20; + margin-bottom: 0; + + button { + font-size: $font-size-x-small; + text-transform: uppercase; + } + } + } + + .entities-saved-states__text-prompt--header-wrapper { + display: none; + } + + .entities-saved-states__text-prompt--changes-count { + margin-top: 0; + margin-bottom: $grid-unit-10; + } + + .entities-saved-states__panel-footer { + margin-top: $grid-unit-20; + } +} + +.entities-saved-states__change-control { + flex: 1; } .entities-saved-states__changes { - color: $gray-700; - font-size: $helptext-font-size; - margin: $grid-unit-10 $grid-unit-20 0 $grid-unit-20; + font-size: $default-font-size; + margin: $grid-unit-05 $grid-unit-20 0 $grid-unit-30; list-style: disc; li { From 26ba1a3ecf9e5f194a2b693995956c3677e1ec87 Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:46:45 +0900 Subject: [PATCH 50/96] Site Hub: Navigate correctly in mobile view (#69157) Co-authored-by: t-hamano Co-authored-by: stokesman Co-authored-by: afercia --- .../src/components/site-hub/index.js | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/packages/edit-site/src/components/site-hub/index.js b/packages/edit-site/src/components/site-hub/index.js index 91324356d0197..2c23122ceeaf1 100644 --- a/packages/edit-site/src/components/site-hub/index.js +++ b/packages/edit-site/src/components/site-hub/index.js @@ -28,8 +28,8 @@ import { privateApis as routerPrivateApis } from '@wordpress/router'; import { store as editSiteStore } from '../../store'; import SiteIcon from '../site-icon'; import { unlock } from '../../lock-unlock'; -const { useHistory } = unlock( routerPrivateApis ); import { SidebarNavigationContext } from '../sidebar'; +const { useLocation, useHistory } = unlock( routerPrivateApis ); const SiteHub = memo( forwardRef( ( { isTransparent }, ref ) => { @@ -117,29 +117,25 @@ export default SiteHub; export const SiteHubMobile = memo( forwardRef( ( { isTransparent }, ref ) => { + const { path } = useLocation(); const history = useHistory(); const { navigate } = useContext( SidebarNavigationContext ); - const { dashboardLink, isBlockTheme, homeUrl, siteTitle } = useSelect( - ( select ) => { - const { getSettings } = unlock( select( editSiteStore ) ); - - const { getEntityRecord, getCurrentTheme } = - select( coreStore ); - const _site = getEntityRecord( 'root', 'site' ); - return { - dashboardLink: getSettings().__experimentalDashboardLink, - isBlockTheme: getCurrentTheme()?.is_block_theme, - homeUrl: getEntityRecord( 'root', '__unstableBase' )?.home, - siteTitle: - ! _site?.title && !! _site?.url - ? filterURLForDisplay( _site?.url ) - : _site?.title, - }; - }, - [] - ); + const { dashboardLink, homeUrl, siteTitle } = useSelect( ( select ) => { + const { getSettings } = unlock( select( editSiteStore ) ); + const { getEntityRecord } = select( coreStore ); + const _site = getEntityRecord( 'root', 'site' ); + return { + dashboardLink: getSettings().__experimentalDashboardLink, + homeUrl: getEntityRecord( 'root', '__unstableBase' )?.home, + siteTitle: + ! _site?.title && !! _site?.url + ? filterURLForDisplay( _site?.url ) + : _site?.title, + }; + }, [] ); const { open: openCommandCenter } = useDispatch( commandsStore ); + const isRoot = path === '/'; return (
@@ -160,7 +156,7 @@ export const SiteHubMobile = memo( transform: 'scale(0.5)', borderRadius: 4, } } - { ...( ! isBlockTheme + { ...( isRoot ? { href: dashboardLink, label: __( 'Go to the Dashboard' ), From 4c6306b6410849b5521c9a3838cc987e649a692d Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Thu, 13 Feb 2025 19:07:14 +0530 Subject: [PATCH 51/96] Fix Syntax Issue in Documentation (#69166) Co-authored-by: shail-mehta Co-authored-by: t-hamano Co-authored-by: djcowan Co-authored-by: skorasaurus --- packages/interactivity-router/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/interactivity-router/README.md b/packages/interactivity-router/README.md index efb52e59be2b5..b79e6b310e239 100644 --- a/packages/interactivity-router/README.md +++ b/packages/interactivity-router/README.md @@ -80,7 +80,7 @@ Example:
  • Post 2
  • Post 3
  • - + Page 2
    ``` From 3df54ec6a39b342c20d8598524fd418155c55172 Mon Sep 17 00:00:00 2001 From: Bernie Reiter <96308+ockham@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:07:39 +0100 Subject: [PATCH 52/96] Block Hooks: Fix duplicated insertion in Post Content (#69142) * Block Hooks: Fix duplicated insertion in Post Content * Add backport changelog * Move function def and filters inside conditional Co-authored-by: ockham Co-authored-by: gziolo --- backport-changelog/6.8/8212.md | 1 + lib/compat/wordpress-6.8/blocks.php | 87 +++++++++++++++-------------- 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/backport-changelog/6.8/8212.md b/backport-changelog/6.8/8212.md index a4488d2da99f2..30483af9e7b71 100644 --- a/backport-changelog/6.8/8212.md +++ b/backport-changelog/6.8/8212.md @@ -1,3 +1,4 @@ https://github.com/WordPress/wordpress-develop/pull/8212 * https://github.com/WordPress/gutenberg/pull/68926 +* https://github.com/WordPress/gutenberg/pull/69142 diff --git a/lib/compat/wordpress-6.8/blocks.php b/lib/compat/wordpress-6.8/blocks.php index 2b0fcd19e200e..7fd4237bc81d3 100644 --- a/lib/compat/wordpress-6.8/blocks.php +++ b/lib/compat/wordpress-6.8/blocks.php @@ -77,56 +77,61 @@ function apply_block_hooks_to_content_from_post_object( $content, WP_Post $post add_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object', 8 ); // Remove apply_block_hooks_to_content filter (previously added in Core). remove_filter( 'the_content', 'apply_block_hooks_to_content', 8 ); -} -/** - * Hooks into the REST API response for the Posts endpoint and adds the first and last inner blocks. - * - * @since 6.6.0 - * @since 6.8.0 Support non-`wp_navigation` post types. - * - * @param WP_REST_Response $response The response object. - * @param WP_Post $post Post object. - * @return WP_REST_Response The response object. - */ -function gutenberg_insert_hooked_blocks_into_rest_response( $response, $post ) { - if ( empty( $response->data['content']['raw'] ) ) { - return $response; - } + /** + * Hooks into the REST API response for the Posts endpoint and adds the first and last inner blocks. + * + * @since 6.6.0 + * @since 6.8.0 Support non-`wp_navigation` post types. + * + * @param WP_REST_Response $response The response object. + * @param WP_Post $post Post object. + * @return WP_REST_Response The response object. + */ + function gutenberg_insert_hooked_blocks_into_rest_response( $response, $post ) { + if ( empty( $response->data['content']['raw'] ) ) { + return $response; + } - $response->data['content']['raw'] = apply_block_hooks_to_content_from_post_object( - $response->data['content']['raw'], - $post, - 'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata' - ); + $response->data['content']['raw'] = apply_block_hooks_to_content_from_post_object( + $response->data['content']['raw'], + $post, + 'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata' + ); - // If the rendered content was previously empty, we leave it like that. - if ( empty( $response->data['content']['rendered'] ) ) { - return $response; - } + // If the rendered content was previously empty, we leave it like that. + if ( empty( $response->data['content']['rendered'] ) ) { + return $response; + } - // No need to inject hooked blocks twice. - $priority = has_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object' ); - if ( false !== $priority ) { - remove_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object', $priority ); - } + // No need to inject hooked blocks twice. + $priority = has_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object' ); + if ( false !== $priority ) { + remove_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object', $priority ); + } - /** This filter is documented in wp-includes/post-template.php */ - $response->data['content']['rendered'] = apply_filters( - 'the_content', - $response->data['content']['raw'] - ); + /** This filter is documented in wp-includes/post-template.php */ + $response->data['content']['rendered'] = apply_filters( + 'the_content', + $response->data['content']['raw'] + ); + + // Add back the filter. + if ( false !== $priority ) { + add_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object', $priority ); + } - // Add back the filter. - if ( false !== $priority ) { - add_filter( 'the_content', 'apply_block_hooks_to_content_from_post_object', $priority ); + return $response; } + remove_filter( 'rest_prepare_page', 'insert_hooked_blocks_into_rest_response' ); + add_filter( 'rest_prepare_page', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 ); + + remove_filter( 'rest_prepare_post', 'insert_hooked_blocks_into_rest_response' ); + add_filter( 'rest_prepare_post', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 ); - return $response; + remove_filter( 'rest_prepare_wp_block', 'insert_hooked_blocks_into_rest_response' ); + add_filter( 'rest_prepare_wp_block', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 ); } -add_filter( 'rest_prepare_page', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 ); -add_filter( 'rest_prepare_post', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 ); -add_filter( 'rest_prepare_wp_block', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 ); /** * Updates the wp_postmeta with the list of ignored hooked blocks From a34e9c4ebbe07ddf713bb64bf40bd40709ab6fcb Mon Sep 17 00:00:00 2001 From: Mitchell Austin Date: Fri, 14 Feb 2025 09:08:16 -0800 Subject: [PATCH 53/96] =?UTF-8?q?Site=20editor:=20fix=20back=20link=20from?= =?UTF-8?q?=20=E2=80=9CNavigation=E2=80=9D=20items=20in=20mobile=20web=20(?= =?UTF-8?q?#69192)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: stokesman Co-authored-by: t-hamano --- .../src/components/site-editor-routes/navigation-item.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/edit-site/src/components/site-editor-routes/navigation-item.js b/packages/edit-site/src/components/site-editor-routes/navigation-item.js index 76983d8ff8daa..f8d1563d33c95 100644 --- a/packages/edit-site/src/components/site-editor-routes/navigation-item.js +++ b/packages/edit-site/src/components/site-editor-routes/navigation-item.js @@ -6,7 +6,6 @@ import { privateApis as routerPrivateApis } from '@wordpress/router'; /** * Internal dependencies */ -import { NAVIGATION_POST_TYPE } from '../../utils/constants'; import Editor from '../editor'; import SidebarNavigationScreenNavigationMenu from '../sidebar-navigation-screen-navigation-menu'; import { unlock } from '../../lock-unlock'; @@ -20,9 +19,7 @@ function MobileNavigationItemView() { return canvas === 'edit' ? ( ) : ( - + ); } From 1976565419e62a6924d2c73a3ec4b432701200a9 Mon Sep 17 00:00:00 2001 From: Yogesh Bhutkar Date: Sat, 15 Feb 2025 07:51:52 +0530 Subject: [PATCH 54/96] Media Utils: Restrict file uploads with `multiple` prop in `uploadMedia` and `mediaUpload` (#69175) Co-authored-by: yogeshbhutkar Co-authored-by: swissspidy Co-authored-by: Mayank-Tripathi32 Co-authored-by: t-hamano Co-authored-by: Mamaduka --- .../components/background-image-control/index.js | 7 +------ .../src/components/media-placeholder/index.js | 1 + packages/block-library/src/site-logo/edit.js | 6 +----- packages/editor/README.md | 1 + .../src/components/post-featured-image/index.js | 2 ++ packages/editor/src/utils/media-upload/index.js | 3 +++ packages/media-utils/README.md | 1 + .../media-utils/src/utils/test/upload-media.ts | 14 ++++++++++++++ packages/media-utils/src/utils/upload-media.ts | 9 +++++++++ 9 files changed, 33 insertions(+), 11 deletions(-) diff --git a/packages/block-editor/src/components/background-image-control/index.js b/packages/block-editor/src/components/background-image-control/index.js index 3411d7d3ee8a9..62bffb54218c5 100644 --- a/packages/block-editor/src/components/background-image-control/index.js +++ b/packages/block-editor/src/components/background-image-control/index.js @@ -313,12 +313,6 @@ function BackgroundImageControls( { // Drag and drop callback, restricting image to one. const onFilesDrop = ( filesList ) => { - if ( filesList?.length > 1 ) { - onUploadError( - __( 'Only one image can be used as a background image.' ) - ); - return; - } getSettings().mediaUpload( { allowedTypes: [ IMAGE_BACKGROUND_TYPE ], filesList, @@ -326,6 +320,7 @@ function BackgroundImageControls( { onSelectMedia( image ); }, onError: onUploadError, + multiple: false, } ); }; diff --git a/packages/block-editor/src/components/media-placeholder/index.js b/packages/block-editor/src/components/media-placeholder/index.js index e19e350f959b2..3d6578dcd39c2 100644 --- a/packages/block-editor/src/components/media-placeholder/index.js +++ b/packages/block-editor/src/components/media-placeholder/index.js @@ -227,6 +227,7 @@ export function MediaPlaceholder( { filesList: files, onFileChange: setMedia, onError, + multiple, } ); }; diff --git a/packages/block-library/src/site-logo/edit.js b/packages/block-library/src/site-logo/edit.js index d2d2327736fd7..f1ba371bfb35e 100644 --- a/packages/block-library/src/site-logo/edit.js +++ b/packages/block-library/src/site-logo/edit.js @@ -499,11 +499,6 @@ export default function LogoEdit( { }; const onFilesDrop = ( filesList ) => { - if ( filesList?.length > 1 ) { - onUploadError( __( 'Only one image can be used as a site logo.' ) ); - return; - } - getSettings().mediaUpload( { allowedTypes: ALLOWED_MEDIA_TYPES, filesList, @@ -515,6 +510,7 @@ export default function LogoEdit( { onInitialSelectLogo( image ); }, onError: onUploadError, + multiple: false, } ); }; diff --git a/packages/editor/README.md b/packages/editor/README.md index bbea89105419c..d0140df088845 100644 --- a/packages/editor/README.md +++ b/packages/editor/README.md @@ -501,6 +501,7 @@ _Parameters_ - _$0.onError_ `Function`: Function called when an error happens. - _$0.onFileChange_ `Function`: Function called each time a file or a temporary representation of the file is available. - _$0.onSuccess_ `Function`: Function called after the final representation of the file is available. +- _$0.multiple_ `boolean`: Whether to allow multiple files to be uploaded. ### MediaUploadCheck diff --git a/packages/editor/src/components/post-featured-image/index.js b/packages/editor/src/components/post-featured-image/index.js index acf366506cc41..cf7ba1664b8ba 100644 --- a/packages/editor/src/components/post-featured-image/index.js +++ b/packages/editor/src/components/post-featured-image/index.js @@ -125,6 +125,7 @@ function PostFeaturedImage( { noticeOperations.removeAllNotices(); noticeOperations.createErrorNotice( message ); }, + multiple: false, } ); } @@ -345,6 +346,7 @@ const applyWithDispatch = withDispatch( noticeOperations.removeAllNotices(); noticeOperations.createErrorNotice( message ); }, + multiple: false, } ); }, onRemoveImage() { diff --git a/packages/editor/src/utils/media-upload/index.js b/packages/editor/src/utils/media-upload/index.js index 0d970d91ce745..02b2a039330d6 100644 --- a/packages/editor/src/utils/media-upload/index.js +++ b/packages/editor/src/utils/media-upload/index.js @@ -28,6 +28,7 @@ const noop = () => {}; * @param {Function} $0.onError Function called when an error happens. * @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available. * @param {Function} $0.onSuccess Function called after the final representation of the file is available. + * @param {boolean} $0.multiple Whether to allow multiple files to be uploaded. */ export default function mediaUpload( { additionalData = {}, @@ -37,6 +38,7 @@ export default function mediaUpload( { onError = noop, onFileChange, onSuccess, + multiple = true, } ) { const { getCurrentPost, getEditorSettings } = select( editorStore ); const { @@ -92,5 +94,6 @@ export default function mediaUpload( { onError( message ); }, wpAllowedMimeTypes, + multiple, } ); } diff --git a/packages/media-utils/README.md b/packages/media-utils/README.md index ddf18efb28833..a87aaf89618d9 100644 --- a/packages/media-utils/README.md +++ b/packages/media-utils/README.md @@ -56,6 +56,7 @@ _Parameters_ - _$0.onFileChange_ `UploadMediaArgs[ 'onFileChange' ]`: Function called each time a file or a temporary representation of the file is available. - _$0.wpAllowedMimeTypes_ `UploadMediaArgs[ 'wpAllowedMimeTypes' ]`: List of allowed mime types and file extensions. - _$0.signal_ `UploadMediaArgs[ 'signal' ]`: Abort signal. +- _$0.multiple_ `UploadMediaArgs[ 'multiple' ]`: Whether to allow multiple files to be uploaded. ### validateFileSize diff --git a/packages/media-utils/src/utils/test/upload-media.ts b/packages/media-utils/src/utils/test/upload-media.ts index b5075255ad4c8..ee6276557ed79 100644 --- a/packages/media-utils/src/utils/test/upload-media.ts +++ b/packages/media-utils/src/utils/test/upload-media.ts @@ -196,4 +196,18 @@ describe( 'uploadMedia', () => { ); expect( uploadToServer ).not.toHaveBeenCalled(); } ); + + it( 'should throw error when multiple files are selected in single file upload mode', async () => { + const onError = jest.fn(); + await uploadMedia( { + filesList: [ imageFile, xmlFile ], + onError, + multiple: false, + } ); + + expect( onError ).toHaveBeenCalledWith( + new Error( 'Only one file can be used here.' ) + ); + expect( uploadToServer ).not.toHaveBeenCalled(); + } ); } ); diff --git a/packages/media-utils/src/utils/upload-media.ts b/packages/media-utils/src/utils/upload-media.ts index ff3f718076512..4b600f983c571 100644 --- a/packages/media-utils/src/utils/upload-media.ts +++ b/packages/media-utils/src/utils/upload-media.ts @@ -42,6 +42,8 @@ interface UploadMediaArgs { wpAllowedMimeTypes?: Record< string, string > | null; // Abort signal. signal?: AbortSignal; + // Whether to allow multiple files to be uploaded. + multiple?: boolean; } /** @@ -57,6 +59,7 @@ interface UploadMediaArgs { * @param $0.onFileChange Function called each time a file or a temporary representation of the file is available. * @param $0.wpAllowedMimeTypes List of allowed mime types and file extensions. * @param $0.signal Abort signal. + * @param $0.multiple Whether to allow multiple files to be uploaded. */ export function uploadMedia( { wpAllowedMimeTypes, @@ -67,7 +70,13 @@ export function uploadMedia( { onError, onFileChange, signal, + multiple = true, }: UploadMediaArgs ) { + if ( ! multiple && filesList.length > 1 ) { + onError?.( new Error( __( 'Only one file can be used here.' ) ) ); + return; + } + const validFiles = []; const filesSet: Array< Partial< Attachment > | null > = []; From 388d664a8c3c8deb6d31b5e5e91a8df20a95b2de Mon Sep 17 00:00:00 2001 From: tomoki shimomura Date: Sat, 15 Feb 2025 23:49:55 +0900 Subject: [PATCH 55/96] BorderControl: always show Reset button (#69066) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix #69065 * remove showClearButton props * test * changelog * changelog * changelog * clear → reset * clear → reset * fix --- Co-authored-by: shimotmk Co-authored-by: ciampo Co-authored-by: Mamaduka Co-authored-by: yogeshbhutkar --- packages/components/CHANGELOG.md | 3 +++ .../border-control-dropdown/component.tsx | 20 ++++++++----------- .../border-control-dropdown/hook.ts | 6 +++--- .../components/src/border-control/styles.ts | 14 ++++--------- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 38c97f5a31017..f425baae72617 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +### Enhancement +- `BorderControlDropdown`, `BorderControl`: Reset button is always visible. ([#69066](https://github.com/WordPress/gutenberg/pull/69066)). + ### Internal - `NumberControl`: Fix invalid HTML attributes for infinite bounds ([#69033](https://github.com/WordPress/gutenberg/pull/69033)). diff --git a/packages/components/src/border-control/border-control-dropdown/component.tsx b/packages/components/src/border-control/border-control-dropdown/component.tsx index 707497ae2993c..23ee902df5ffc 100644 --- a/packages/components/src/border-control/border-control-dropdown/component.tsx +++ b/packages/components/src/border-control/border-control-dropdown/component.tsx @@ -157,7 +157,7 @@ const BorderControlDropdown = ( onStyleChange, popoverContentClassName, popoverControlsClassName, - resetButtonClassName, + resetButtonWrapperClassName, size, __unstablePopoverProps, ...otherProps @@ -173,7 +173,7 @@ const BorderControlDropdown = ( enableStyle ); - const showResetButton = color || ( style && style !== 'none' ); + const enableResetButton = color || ( style && style !== 'none' ); const dropdownPosition = __experimentalIsRenderedInSidebar ? 'bottom left' : undefined; @@ -199,9 +199,7 @@ const BorderControlDropdown = ( ); - const renderContent: DropdownComponentProps[ 'renderContent' ] = ( { - onClose, - } ) => ( + const renderContent: DropdownComponentProps[ 'renderContent' ] = () => ( <> @@ -224,22 +222,20 @@ const BorderControlDropdown = ( /> ) } - - { showResetButton && ( - +
    - - ) } +
    +
    ); diff --git a/packages/components/src/border-control/border-control-dropdown/hook.ts b/packages/components/src/border-control/border-control-dropdown/hook.ts index 5366babc266c6..daba828fa64f2 100644 --- a/packages/components/src/border-control/border-control-dropdown/hook.ts +++ b/packages/components/src/border-control/border-control-dropdown/hook.ts @@ -76,8 +76,8 @@ export function useBorderControlDropdown( return cx( styles.borderControlPopoverContent ); }, [ cx ] ); - const resetButtonClassName = useMemo( () => { - return cx( styles.resetButton ); + const resetButtonWrapperClassName = useMemo( () => { + return cx( styles.resetButtonWrapper ); }, [ cx ] ); return { @@ -94,7 +94,7 @@ export function useBorderControlDropdown( onReset, popoverContentClassName, popoverControlsClassName, - resetButtonClassName, + resetButtonWrapperClassName, size, __experimentalIsRenderedInSidebar, }; diff --git a/packages/components/src/border-control/styles.ts b/packages/components/src/border-control/styles.ts index a678b6f362308..0109c0598e85b 100644 --- a/packages/components/src/border-control/styles.ts +++ b/packages/components/src/border-control/styles.ts @@ -147,16 +147,10 @@ export const borderControlPopoverControls = css` export const borderControlPopoverContent = css``; export const borderColorIndicator = css``; -export const resetButton = css` - justify-content: center; - width: 100%; - - /* Override button component styling */ - && { - border-top: ${ CONFIG.borderWidth } solid ${ COLORS.gray[ 400 ] }; - border-top-left-radius: 0; - border-top-right-radius: 0; - } +export const resetButtonWrapper = css` + display: flex; + justify-content: flex-end; + margin-top: 12px; `; export const borderSlider = () => css` From ac992f7caccde5502c07a10d48720a1c1ec83bda Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Mon, 17 Feb 2025 07:24:57 +0530 Subject: [PATCH 56/96] Added missing double quote in number control (#69207) Co-authored-by: shail-mehta Co-authored-by: t-hamano --- packages/components/src/number-control/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/src/number-control/README.md b/packages/components/src/number-control/README.md index 486092790548e..98f38051fcf06 100644 --- a/packages/components/src/number-control/README.md +++ b/packages/components/src/number-control/README.md @@ -4,7 +4,7 @@ This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes.
    -NumberControl is an enhanced HTML [`input[type="number]`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number) element. +NumberControl is an enhanced HTML [`input[type="number"]`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number) element. ## Usage From 31d48d750d74cb7f4e01b77fa875c9a6528253fe Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Mon, 17 Feb 2025 13:45:32 +0800 Subject: [PATCH 57/96] Performance Tests: Update method for creating sample content (#69210) Co-authored-by: Mamaduka Co-authored-by: swissspidy --- .../src/request-utils/pages.ts | 2 +- test/performance/fixtures/perf-utils.ts | 9 +++++++ test/performance/specs/site-editor.spec.js | 26 +++++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/packages/e2e-test-utils-playwright/src/request-utils/pages.ts b/packages/e2e-test-utils-playwright/src/request-utils/pages.ts index 6fe70ef3cb3fd..74f8770e8a796 100644 --- a/packages/e2e-test-utils-playwright/src/request-utils/pages.ts +++ b/packages/e2e-test-utils-playwright/src/request-utils/pages.ts @@ -74,7 +74,7 @@ export async function createPage( const page = await this.rest< Page >( { method: 'POST', path: `/wp/v2/pages`, - params: payload, + data: { ...payload }, } ); return page; diff --git a/test/performance/fixtures/perf-utils.ts b/test/performance/fixtures/perf-utils.ts index 8d23d91ff91bf..6574189b1ab5d 100644 --- a/test/performance/fixtures/perf-utils.ts +++ b/test/performance/fixtures/perf-utils.ts @@ -139,6 +139,15 @@ export class PerfUtils { ); } + /** + * Loads the content of the large post fixture. + */ + async loadContentForLargePost() { + return readFile( + path.join( process.env.ASSETS_PATH!, 'large-post.html' ) + ); + } + /** * Loads blocks from an HTML fixture with given path into the editor canvas. * diff --git a/test/performance/specs/site-editor.spec.js b/test/performance/specs/site-editor.spec.js index 5a0c7f0e95211..57e36a9a4d14d 100644 --- a/test/performance/specs/site-editor.spec.js +++ b/test/performance/specs/site-editor.spec.js @@ -62,12 +62,14 @@ test.describe( 'Site Editor Performance', () => { test.describe( 'Loading', () => { let draftId = null; - test( 'Setup the test page', async ( { admin, perfUtils } ) => { - await admin.createNewPost( { postType: 'page' } ); - await perfUtils.setRenderingMode( 'post-only' ); - await perfUtils.loadBlocksForLargePost(); + test( 'Setup the test page', async ( { requestUtils, perfUtils } ) => { + const content = await perfUtils.loadContentForLargePost(); + const page = await requestUtils.createPage( { + content, + status: 'draft', + } ); - draftId = await perfUtils.saveDraft(); + draftId = page.id; } ); const samples = 10; @@ -121,13 +123,15 @@ test.describe( 'Site Editor Performance', () => { test.describe( 'Typing', () => { let draftId = null; - test( 'Setup the test post', async ( { admin, editor, perfUtils } ) => { - await admin.createNewPost( { postType: 'page' } ); - await perfUtils.setRenderingMode( 'post-only' ); - await perfUtils.loadBlocksForLargePost(); - await editor.insertBlock( { name: 'core/paragraph' } ); + test( 'Setup the test post', async ( { requestUtils, perfUtils } ) => { + const content = await perfUtils.loadContentForLargePost(); + const page = await requestUtils.createPage( { + content: + content + ``, + status: 'draft', + } ); - draftId = await perfUtils.saveDraft(); + draftId = page.id; } ); test( 'Run the test', async ( { admin, perfUtils, metrics, page } ) => { From 590af0a294671566fddb16ea96b15a5a1d95dff0 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Mon, 17 Feb 2025 13:49:33 +0800 Subject: [PATCH 58/96] Editor: Add an extra check before enabling the new default rendering mode for Pages (#69209) * Editor: Add an extra check before enabling the new default rendering mode for Pages * Add backport changelog entry Co-authored-by: Mamaduka Co-authored-by: swissspidy Co-authored-by: fabiankaegy --- backport-changelog/6.8/8123.md | 1 + lib/compat/wordpress-6.8/post.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backport-changelog/6.8/8123.md b/backport-changelog/6.8/8123.md index ec1b9f28f6f73..bef3b35833001 100644 --- a/backport-changelog/6.8/8123.md +++ b/backport-changelog/6.8/8123.md @@ -3,3 +3,4 @@ https://github.com/WordPress/wordpress-develop/pull/8123 * https://github.com/WordPress/gutenberg/pull/68549 * https://github.com/WordPress/gutenberg/pull/68745 * https://github.com/WordPress/gutenberg/pull/69160 +* https://github.com/WordPress/gutenberg/pull/69209 diff --git a/lib/compat/wordpress-6.8/post.php b/lib/compat/wordpress-6.8/post.php index b205e9dc81b89..344cd7e311d0f 100644 --- a/lib/compat/wordpress-6.8/post.php +++ b/lib/compat/wordpress-6.8/post.php @@ -12,7 +12,7 @@ function gutenberg_update_page_editor_support() { return; } - if ( wp_is_block_theme() ) { + if ( wp_is_block_theme() && current_theme_supports( 'block-templates' ) ) { add_post_type_support( 'page', 'editor', array( 'default-mode' => 'template-locked' ) ); } } From 8783607023ba43bc29a1c6a5ed16a8256e623607 Mon Sep 17 00:00:00 2001 From: Jonathan Bossenger Date: Mon, 17 Feb 2025 08:19:43 +0200 Subject: [PATCH 59/96] 65454-Update-block-registration (#65455) Remove notes about block hooks only supporting static theme elements. Fixes #65454 Co-authored-by: jonathanbossenger Co-authored-by: gziolo Co-authored-by: shail-mehta --- docs/reference-guides/block-api/block-registration.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/reference-guides/block-api/block-registration.md b/docs/reference-guides/block-api/block-registration.md index 92be19ee48c9f..a2f9fac64f616 100644 --- a/docs/reference-guides/block-api/block-registration.md +++ b/docs/reference-guides/block-api/block-registration.md @@ -312,10 +312,6 @@ The key is the name of the block (`string`) to hook into, and the value is the p } ``` -It’s crucial to emphasize that the Block Hooks feature is only designed to work with _static_ block-based templates, template parts, and patterns. For patterns, this includes those provided by the theme, from [Block Pattern Directory](https://wordpress.org/patterns/), or from calls to [`register_block_pattern`](https://developer.wordpress.org/reference/functions/register_block_pattern/). - -Block Hooks will not work with post content or patterns crafted by the user, such as synced patterns, or theme templates and template parts that have been modified by the user. - ## Block collections ## `registerBlockCollection` From 6b60dba8e1bcbabc0fd8f5e097dafc02245f4055 Mon Sep 17 00:00:00 2001 From: Sneha Patil <90276347+snehapatil2001@users.noreply.github.com> Date: Mon, 17 Feb 2025 13:55:23 +0530 Subject: [PATCH 60/96] Update template-related messages to improve clarity for custom post types (#67722) Co-authored-by: snehapatil2001 Co-authored-by: youknowriad --- .../src/components/entities-saved-states/entity-type-list.js | 2 +- .../visual-editor/edit-template-blocks-notification.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/editor/src/components/entities-saved-states/entity-type-list.js b/packages/editor/src/components/entities-saved-states/entity-type-list.js index 7cdf4c41e0f1f..fde3e94ff6ed3 100644 --- a/packages/editor/src/components/entities-saved-states/entity-type-list.js +++ b/packages/editor/src/components/entities-saved-states/entity-type-list.js @@ -26,7 +26,7 @@ function getEntityDescription( entity, count ) { : __( 'These changes will affect your whole site.' ); case 'wp_template': return __( - 'This change will affect pages and posts that use this template.' + 'This change will affect other parts of your site that use this template.' ); case 'page': case 'post': diff --git a/packages/editor/src/components/visual-editor/edit-template-blocks-notification.js b/packages/editor/src/components/visual-editor/edit-template-blocks-notification.js index b3f1f0dfc4bbf..9ecb4e414a836 100644 --- a/packages/editor/src/components/visual-editor/edit-template-blocks-notification.js +++ b/packages/editor/src/components/visual-editor/edit-template-blocks-notification.js @@ -94,7 +94,7 @@ export default function EditTemplateBlocksNotification( { contentRef } ) { size="medium" > { __( - 'You’ve tried to select a block that is part of a template, which may be used on other posts and pages. Would you like to edit the template?' + 'You’ve tried to select a block that is part of a template that may be used elsewhere on your site. Would you like to edit the template?' ) } ); From ffe84c3206844819b6e6c2f5b91f322d41ff418b Mon Sep 17 00:00:00 2001 From: Andrea Roenning Date: Mon, 17 Feb 2025 02:26:08 -0600 Subject: [PATCH 61/96] Components: Fix typo for notice color in readme (#69204) Co-authored-by: andreawetzel Co-authored-by: shail-mehta Co-authored-by: Mamaduka --- packages/components/src/notice/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/src/notice/README.md b/packages/components/src/notice/README.md index d2249d0aef76c..1bbf4df0e1170 100644 --- a/packages/components/src/notice/README.md +++ b/packages/components/src/notice/README.md @@ -19,7 +19,7 @@ Notices are color-coded to indicate the type of message being communicated: - **Informational** notices are **blue** by default. - If there is a parent `Theme` component with an `accent` color prop, informational notices will take on that color instead. - **Success** notices are **green.** -- **Warning** notices are **yellow\*\***.\*\* +- **Warning** notices are **yellow.** - **Error** notices are **red.** If an icon is included in the Notice, it should be color-coded to match the Notice state. From eeb0d1b2ac8ce6e5d3349a743dfb00d59c720f4f Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Mon, 17 Feb 2025 01:26:59 -0700 Subject: [PATCH 62/96] Improve display of error returned from the REST API when an unsupported image type is uploaded (#68788) Co-authored-by: adamsilverstein Co-authored-by: Mamaduka --- packages/media-utils/src/utils/upload-media.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/media-utils/src/utils/upload-media.ts b/packages/media-utils/src/utils/upload-media.ts index 4b600f983c571..c7ba9d5dbb90b 100644 --- a/packages/media-utils/src/utils/upload-media.ts +++ b/packages/media-utils/src/utils/upload-media.ts @@ -143,9 +143,16 @@ export function uploadMedia( { // Reset to empty on failure. setAndUpdateFiles( index, null ); - let message; - if ( error instanceof Error ) { - message = error.message; + let message: string; + if ( + typeof error === 'object' && + error !== null && + 'message' in error + ) { + message = + typeof error.message === 'string' + ? error.message + : String( error.message ); } else { message = sprintf( // translators: %s: file name From abeb109f4ee47d7798093c97c6d47494227571d4 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Mon, 17 Feb 2025 10:35:43 +0100 Subject: [PATCH 63/96] Media Utils: Add tests for new error behavior (#69215) Co-authored-by: swissspidy Co-authored-by: Mamaduka --- .../src/utils/test/upload-media.ts | 64 +++++++++++++------ .../media-utils/src/utils/upload-media.ts | 1 + 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/packages/media-utils/src/utils/test/upload-media.ts b/packages/media-utils/src/utils/test/upload-media.ts index ee6276557ed79..66cdeefc53039 100644 --- a/packages/media-utils/src/utils/test/upload-media.ts +++ b/packages/media-utils/src/utils/test/upload-media.ts @@ -26,10 +26,10 @@ describe( 'uploadMedia', () => { jest.clearAllMocks(); } ); - it( 'should do nothing on no files', async () => { + it( 'should do nothing on no files', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { filesList: [], onError, onFileChange, @@ -39,10 +39,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).not.toHaveBeenCalled(); } ); - it( 'should error if allowedTypes contains a partial mime type and the validation fails', async () => { + it( 'should error if allowedTypes contains a partial mime type and the validation fails', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'image' ], filesList: [ xmlFile ], onError, @@ -60,10 +60,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).not.toHaveBeenCalled(); } ); - it( 'should error if allowedTypes contains a complete mime type and the validation fails', async () => { + it( 'should error if allowedTypes contains a complete mime type and the validation fails', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'image/gif' ], filesList: [ imageFile ], onError, @@ -81,10 +81,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).not.toHaveBeenCalled(); } ); - it( 'should work if allowedTypes contains a complete mime type and the validation succeeds', async () => { + it( 'should work if allowedTypes contains a complete mime type and the validation succeeds', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'image/jpeg' ], filesList: [ imageFile ], onError, @@ -96,10 +96,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).toHaveBeenCalled(); } ); - it( 'should error if allowedTypes contains multiple types and the validation fails', async () => { + it( 'should error if allowedTypes contains multiple types and the validation fails', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'video', 'image' ], filesList: [ xmlFile ], onError, @@ -117,10 +117,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).not.toHaveBeenCalled(); } ); - it( 'should work if allowedTypes contains multiple types and the validation succeeds', async () => { + it( 'should work if allowedTypes contains multiple types and the validation succeeds', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'video', 'image' ], filesList: [ imageFile ], onError, @@ -132,10 +132,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).toHaveBeenCalled(); } ); - it( 'should only fail the invalid file and still allow others to succeed when uploading multiple files', async () => { + it( 'should only fail the invalid file and still allow others to succeed when uploading multiple files', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'image' ], filesList: [ imageFile, xmlFile ], onError, @@ -154,10 +154,10 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).toHaveBeenCalledTimes( 1 ); } ); - it( 'should error if the file size is greater than the maximum', async () => { + it( 'should error if the file size is greater than the maximum', () => { const onError = jest.fn(); const onFileChange = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'image' ], filesList: [ imageFile ], maxUploadFileSize: 1, @@ -177,9 +177,9 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).not.toHaveBeenCalled(); } ); - it( 'should call error handler with the correct error object if file type is not allowed for user', async () => { + it( 'should call error handler with the correct error object if file type is not allowed for user', () => { const onError = jest.fn(); - await uploadMedia( { + uploadMedia( { allowedTypes: [ 'image' ], filesList: [ imageFile ], onError, @@ -197,9 +197,9 @@ describe( 'uploadMedia', () => { expect( uploadToServer ).not.toHaveBeenCalled(); } ); - it( 'should throw error when multiple files are selected in single file upload mode', async () => { + it( 'should throw error when multiple files are selected in single file upload mode', () => { const onError = jest.fn(); - await uploadMedia( { + uploadMedia( { filesList: [ imageFile, xmlFile ], onError, multiple: false, @@ -210,4 +210,28 @@ describe( 'uploadMedia', () => { ); expect( uploadToServer ).not.toHaveBeenCalled(); } ); + + it( 'should return error that is not an Error object', () => { + ( uploadToServer as jest.Mock ).mockImplementation( () => { + throw { + code: 'fetch_error', + message: 'You are probably offline.', + }; + } ); + + const onError = jest.fn(); + uploadMedia( { + filesList: [ imageFile ], + onError, + multiple: false, + } ); + + expect( onError ).toHaveBeenCalledWith( + new UploadError( { + code: 'GENERAL', + message: 'You are probably offline.', + file: imageFile, + } ) + ); + } ); } ); diff --git a/packages/media-utils/src/utils/upload-media.ts b/packages/media-utils/src/utils/upload-media.ts index c7ba9d5dbb90b..3b49e317ffb9e 100644 --- a/packages/media-utils/src/utils/upload-media.ts +++ b/packages/media-utils/src/utils/upload-media.ts @@ -143,6 +143,7 @@ export function uploadMedia( { // Reset to empty on failure. setAndUpdateFiles( index, null ); + // @wordpress/api-fetch throws any response that isn't in the 200 range as-is. let message: string; if ( typeof error === 'object' && From ed4df79c7c100dd3eaf59f0b0fe8b3f665695f67 Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:40:07 +0900 Subject: [PATCH 64/96] Post Template Panel: Display popover on the left side of the sidebar (#69134) Place the dropdown inside a PostPanelRow and update the placement from bottom-start to left-start. Co-authored-by: t-hamano Co-authored-by: Mamaduka Co-authored-by: carolinan --- .../components/post-template/block-theme.js | 128 ++++++++++-------- .../components/post-template/classic-theme.js | 46 +++++-- .../src/components/post-template/panel.js | 14 +- 3 files changed, 106 insertions(+), 82 deletions(-) diff --git a/packages/editor/src/components/post-template/block-theme.js b/packages/editor/src/components/post-template/block-theme.js index 62de10a2c715f..6d7f7f787b32f 100644 --- a/packages/editor/src/components/post-template/block-theme.js +++ b/packages/editor/src/components/post-template/block-theme.js @@ -4,12 +4,18 @@ import { useSelect, useDispatch } from '@wordpress/data'; import { decodeEntities } from '@wordpress/html-entities'; import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components'; +import { useState, useMemo } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { useEntityRecord, store as coreStore } from '@wordpress/core-data'; import { check } from '@wordpress/icons'; import { store as noticesStore } from '@wordpress/notices'; import { store as preferencesStore } from '@wordpress/preferences'; +/** + * Internal dependencies + */ +import PostPanelRow from '../post-panel-row'; + /** * Internal dependencies */ @@ -19,11 +25,6 @@ import ResetDefaultTemplate from './reset-default-template'; import { unlock } from '../../lock-unlock'; import CreateNewTemplate from './create-new-template'; -const POPOVER_PROPS = { - className: 'editor-post-template__dropdown', - placement: 'bottom-start', -}; - export default function BlockThemeControl( { id } ) { const { isTemplateHidden, @@ -63,6 +64,21 @@ export default function BlockThemeControl( { id } ) { [] ); + const [ popoverAnchor, setPopoverAnchor ] = useState( null ); + // Memoize popoverProps to avoid returning a new object every time. + const popoverProps = useMemo( + () => ( { + // Anchor the popover to the middle of the entire row so that it doesn't + // move around when the label changes. + anchor: popoverAnchor, + className: 'editor-post-template__dropdown', + placement: 'left-start', + offset: 36, + shift: true, + } ), + [ popoverAnchor ] + ); + if ( ! hasResolved ) { return null; } @@ -90,60 +106,62 @@ export default function BlockThemeControl( { id } ) { } }; return ( - - { ( { onClose } ) => ( - <> - - { canCreateTemplate && ( + + + { ( { onClose } ) => ( + <> + + { canCreateTemplate && ( + { + onNavigateToEntityRecord( { + postId: template.id, + postType: 'wp_template', + } ); + onClose(); + mayShowTemplateEditNotice(); + } } + > + { __( 'Edit template' ) } + + ) } + + + + { canCreateTemplate && ( + + ) } + + { - onNavigateToEntityRecord( { - postId: template.id, - postType: 'wp_template', - } ); - onClose(); - mayShowTemplateEditNotice(); + setRenderingMode( + isTemplateHidden + ? 'template-locked' + : 'post-only' + ); } } > - { __( 'Edit template' ) } + { __( 'Show template' ) } - ) } - - - - { canCreateTemplate && ( - - ) } - - - { - setRenderingMode( - isTemplateHidden - ? 'template-locked' - : 'post-only' - ); - } } - > - { __( 'Show template' ) } - - - - ) } - + + + ) } + + ); } diff --git a/packages/editor/src/components/post-template/classic-theme.js b/packages/editor/src/components/post-template/classic-theme.js index 4345e06211c66..6cef7d1582abd 100644 --- a/packages/editor/src/components/post-template/classic-theme.js +++ b/packages/editor/src/components/post-template/classic-theme.js @@ -16,11 +16,7 @@ import { store as noticesStore } from '@wordpress/notices'; import { store as editorStore } from '../../store'; import CreateNewTemplateModal from './create-new-template-modal'; import { useAllowSwitchingTemplates } from './hooks'; - -const POPOVER_PROPS = { - className: 'editor-post-template__dropdown', - placement: 'bottom-start', -}; +import PostPanelRow from '../post-panel-row'; function PostTemplateToggle( { isOpen, onClick } ) { const templateTitle = useSelect( ( select ) => { @@ -216,17 +212,37 @@ function PostTemplateDropdownContent( { onClose } ) { } function ClassicThemeControl() { + const [ popoverAnchor, setPopoverAnchor ] = useState( null ); + // Memoize popoverProps to avoid returning a new object every time. + const popoverProps = useMemo( + () => ( { + // Anchor the popover to the middle of the entire row so that it doesn't + // move around when the label changes. + anchor: popoverAnchor, + className: 'editor-post-template__dropdown', + placement: 'left-start', + offset: 36, + shift: true, + } ), + [ popoverAnchor ] + ); + return ( - ( - - ) } - renderContent={ ( { onClose } ) => ( - - ) } - /> + + ( + + ) } + renderContent={ ( { onClose } ) => ( + + ) } + /> + ); } diff --git a/packages/editor/src/components/post-template/panel.js b/packages/editor/src/components/post-template/panel.js index 903612ef11ed1..0bc86695fb802 100644 --- a/packages/editor/src/components/post-template/panel.js +++ b/packages/editor/src/components/post-template/panel.js @@ -2,7 +2,6 @@ * WordPress dependencies */ import { useSelect } from '@wordpress/data'; -import { __ } from '@wordpress/i18n'; import { store as coreStore } from '@wordpress/core-data'; /** @@ -11,7 +10,6 @@ import { store as coreStore } from '@wordpress/core-data'; import { store as editorStore } from '../../store'; import ClassicThemeControl from './classic-theme'; import BlockThemeControl from './block-theme'; -import PostPanelRow from '../post-panel-row'; /** * Displays the template controls based on the current editor settings and user permissions. @@ -65,19 +63,11 @@ export default function PostTemplatePanel() { }, [] ); if ( ( ! isBlockTheme || ! canViewTemplates ) && isVisible ) { - return ( - - - - ); + return ; } if ( isBlockTheme && !! templateId ) { - return ( - - - - ); + return ; } return null; } From ce2a651be8f8c735fc8f3247cb37e5ea2a4232cd Mon Sep 17 00:00:00 2001 From: Bernie Reiter <96308+ockham@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:57:10 +0100 Subject: [PATCH 65/96] E2E Tests: Add Block Hooks Test Coverage (#69044) Add end-to-end test coverage for Block Hooks; specifically for insertion into post content, synced patterns, and Navigation blocks. The tests check that hooked blocks are inserted correctly on the frontend, and that any changes made in the editor are persisted and respected. They cover both "normal" insertion (i.e. before or after a given anchor block), and first/last child insertion with the containing block serving as the anchor block (which is when the corresponding post object's post meta is used to store `_wp_ignored_hooked_blocks` data). Co-authored-by: ockham Co-authored-by: gziolo Co-authored-by: Mamaduka --- packages/e2e-tests/plugins/block-hooks.php | 74 +++++ .../specs/editor/plugins/block-hooks.spec.js | 289 ++++++++++++++++++ 2 files changed, 363 insertions(+) create mode 100644 packages/e2e-tests/plugins/block-hooks.php create mode 100644 test/e2e/specs/editor/plugins/block-hooks.spec.js diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php new file mode 100644 index 0000000000000..3490595477055 --- /dev/null +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -0,0 +1,74 @@ + "hooked-block-{$relative_position}-" . str_replace( 'core/', '', $anchor_block['blockName'] ), + ); + $hooked_block['innerContent'] = array( + sprintf( + '

    This block was inserted by the Block Hooks API in the %2$s position next to the %3$s anchor block.

    ', + $hooked_block['attrs']['className'], + $relative_position, + $anchor_block['blockName'] + ), + ); + } + + return $hooked_block; +} +add_filter( 'hooked_block_core/paragraph', 'gutenberg_test_set_hooked_block_inner_html', 10, 4 ); + +function gutenberg_register_wp_ignored_hooked_blocks_meta() { + register_post_meta( + 'post', + '_wp_ignored_hooked_blocks', + array( + 'show_in_rest' => true, + 'single' => true, + 'type' => 'string', + 'auth_callback' => function () { + return current_user_can( 'edit_posts' ); + }, + ) + ); +} +add_action( 'rest_api_init', 'gutenberg_register_wp_ignored_hooked_blocks_meta' ); diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js new file mode 100644 index 0000000000000..ec78db6b3a8fe --- /dev/null +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -0,0 +1,289 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +const dummyBlockContent = ` +

    This is a dummy heading

    + + +

    This is a dummy paragraph.

    +`; + +const getHookedBlockClassName = ( relativePosition, anchorBlock ) => + `hooked-block-${ relativePosition }-${ anchorBlock.replace( + 'core/', + '' + ) }`; + +const getHookedBlockContent = ( relativePosition, anchorBlock ) => + `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; + +test.describe( 'Block Hooks API', () => { + [ + { + name: 'Post Content', + postType: 'post', + blockType: 'core/post-content', + createMethod: 'createPost', + }, + { + name: 'Synced Pattern', + postType: 'wp_block', + blockType: 'core/block', + createMethod: 'createBlock', + }, + ].forEach( ( { name, postType, blockType, createMethod } ) => { + test.describe( `Hooked blocks in ${ name }`, () => { + let postObject, containerPost; + test.beforeAll( async ( { requestUtils } ) => { + postObject = await requestUtils[ createMethod ]( { + title: name, + status: 'publish', + content: dummyBlockContent, + } ); + + await requestUtils.activatePlugin( + 'gutenberg-test-block-hooks' + ); + + if ( postType !== 'post' ) { + // We need a container post to hold our block instance. + containerPost = await requestUtils.createPost( { + title: `Block Hooks in ${ name }`, + status: 'publish', + content: ``, + meta: { + // Prevent Block Hooks from injecting blocks into the container + // post content so they won't distract from the ones injected + // into the block instance. + _wp_ignored_hooked_blocks: '["core/paragraph"]', + }, + } ); + } else { + containerPost = postObject; + } + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( + 'gutenberg-test-block-hooks' + ); + + await requestUtils.deleteAllPosts(); + await requestUtils.deleteAllBlocks(); + } ); + + test( `should insert hooked blocks into ${ name } on frontend`, async ( { + page, + } ) => { + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.entry-content > *' ) + ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + 'dummy-paragraph', + getHookedBlockClassName( 'last_child', blockType ), + ] ); + } ); + + test( `should insert hooked blocks into ${ name } in editor and respect changes made there`, async ( { + admin, + editor, + page, + } ) => { + const expectedHookedBlockAfterHeading = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'after', + 'core/heading' + ), + }, + }; + + const expectedHookedBlockLastChild = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + blockType + ), + }, + }; + + await admin.editPost( postObject.id ); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + { name: 'core/paragraph' }, + expectedHookedBlockLastChild, + ] ); + + const hookedBlock = editor.canvas.getByText( + getHookedBlockContent( 'last_child', blockType ) + ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move up' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + expectedHookedBlockLastChild, + { name: 'core/paragraph' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.entry-content > *' ) + ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + getHookedBlockClassName( 'last_child', blockType ), + 'dummy-paragraph', + ] ); + } ); + } ); + } ); + + test.describe( 'Hooked blocks in Navigation Menu', () => { + let postObject, containerPost; + test.beforeAll( async ( { requestUtils } ) => { + postObject = await requestUtils.createNavigationMenu( { + title: 'Navigation Menu', + status: 'publish', + content: + '', + } ); + + await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); + + // We need a container to hold our Navigation block instance. + // We create a page (instead of a post) so that it will also + // populate the Page List block, which is one of the hooked blocks + // we use in our testing. + containerPost = await requestUtils.createPage( { + title: 'Block Hooks in Navigation Menu', + status: 'publish', + content: ``, + } ); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); + + await requestUtils.deleteAllPages(); + await requestUtils.deleteAllMenus(); + } ); + + test( 'should insert hooked blocks into Navigation Menu on frontend', async ( { + page, + } ) => { + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.wp-block-navigation__container > *' ) + ).toHaveClass( [ + 'wp-block-navigation-item wp-block-home-link', + ' wp-block-navigation-item wp-block-navigation-link', + 'wp-block-page-list', + ] ); + } ); + + test( 'should insert hooked blocks into Navigation Menu in editor and respect changes made there', async ( { + admin, + editor, + page, + } ) => { + await admin.visitSiteEditor( { + postId: postObject.id, + postType: 'wp_navigation', + canvas: 'edit', + } ); + + // Since the Navigation block is a controlled block, we need + // to specify its client ID when calling `getBlocks`. + let navigationBlock = editor.canvas.getByRole( 'document', { + name: 'Block: Navigation', + } ); + let navigationClientId = + await navigationBlock.getAttribute( 'data-block' ); + + await expect + .poll( () => + editor.getBlocks( { + clientId: navigationClientId, + } ) + ) + .toMatchObject( [ + { name: 'core/home-link' }, + { name: 'core/navigation-link' }, + { name: 'core/page-list' }, + ] ); + + const hookedBlock = editor.canvas.getByRole( 'document', { + name: 'Block: Home Link', + } ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move right' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + + navigationBlock = editor.canvas.getByRole( 'document', { + name: 'Block: Navigation', + } ); + navigationClientId = + await navigationBlock.getAttribute( 'data-block' ); + + await expect + .poll( () => + editor.getBlocks( { + clientId: navigationClientId, + } ) + ) + .toMatchObject( [ + { name: 'core/navigation-link' }, + { name: 'core/home-link' }, + { name: 'core/page-list' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.wp-block-navigation__container > *' ) + ).toHaveClass( [ + ' wp-block-navigation-item wp-block-navigation-link', + 'wp-block-navigation-item wp-block-home-link', + 'wp-block-page-list', + ] ); + } ); + } ); +} ); From bdef8a73300512c55e66e7da5c1d773b2f47dd0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20K=C3=A4gy?= Date: Mon, 17 Feb 2025 14:47:25 +0100 Subject: [PATCH 66/96] Generate built CSS file containing the admin color theme CSS custom properties (#69128) Co-authored-by: fabiankaegy Co-authored-by: karmatosed Co-authored-by: t-hamano Co-authored-by: youknowriad --- packages/base-styles/README.md | 4 ++++ packages/base-styles/src/admin-schemes.scss | 1 + 2 files changed, 5 insertions(+) create mode 100644 packages/base-styles/src/admin-schemes.scss diff --git a/packages/base-styles/README.md b/packages/base-styles/README.md index 9c57d91ac5a98..25034c13a977b 100644 --- a/packages/base-styles/README.md +++ b/packages/base-styles/README.md @@ -40,6 +40,10 @@ To make that work with [`sass`](https://www.npmjs.com/package/sass) or [`node-sa } ``` +### CSS Admin Themes + +The package also includes a built version of the output generated by the `wordpress-admin-schemes()` mixin which can be used directly in your project. The CSS file is located at `node_modules/@wordpress/base-styles/build-style/admin-schemes.css`. + ## Contributing to this package This is an individual package that's part of the Gutenberg project. The project is organized as a monorepo. It's made up of multiple self-contained software packages, each with a specific purpose. The packages in this monorepo are published to [npm](https://www.npmjs.com/) and used by [WordPress](https://make.wordpress.org/core/) as well as other software projects. diff --git a/packages/base-styles/src/admin-schemes.scss b/packages/base-styles/src/admin-schemes.scss new file mode 100644 index 0000000000000..9aee5a6aed3c6 --- /dev/null +++ b/packages/base-styles/src/admin-schemes.scss @@ -0,0 +1 @@ +@include wordpress-admin-schemes(); From 7fbba99059313dbf00e43a5e0c2cf62885852f79 Mon Sep 17 00:00:00 2001 From: David Arenas Date: Mon, 17 Feb 2025 15:39:53 +0100 Subject: [PATCH 67/96] iAPI Router: Revert "Handle styles assets on region-based navigation" (#69222) * Revert "iAPI Router: Fix CSS rule order in some constructed style sheets (#68923)" This reverts commit 4aad5e33db303dfd6da3cb1077d37e4d3e9ee794. * Revert "iAPI Router: Handle styles assets on region-based navigation (#67826)" This reverts commit 12f77640cfad82f850a02718e6fe7de41379b8ad. * Add changelog entry --- .../assets/10x10_e2e_test_image_blue.png | Bin 119 -> 0 bytes .../router-styles-blue/block.json | 15 - .../router-styles-blue/render.php | 35 --- .../router-styles-blue/style-from-link.css | 7 - .../router-styles-blue/style.css | 4 - .../assets/10x10_e2e_test_image_green.png | Bin 119 -> 0 bytes .../router-styles-green/block.json | 15 - .../router-styles-green/render.php | 35 --- .../router-styles-green/style-from-link.css | 7 - .../router-styles-green/style.css | 4 - .../assets/10x10_e2e_test_image_red.png | Bin 119 -> 0 bytes .../router-styles-red/block.json | 15 - .../router-styles-red/render.php | 35 --- .../router-styles-red/style-from-link.css | 7 - .../router-styles-red/style.css | 4 - .../router-styles-wrapper/block.json | 16 -- .../router-styles-wrapper/render.php | 87 ------ .../router-styles-wrapper/style-from-link.css | 7 - .../router-styles-wrapper/style.css | 3 - .../router-styles-wrapper/view.asset.php | 9 - .../router-styles-wrapper/view.js | 20 -- packages/interactivity-router/CHANGELOG.md | 4 + .../interactivity-router/src/assets/styles.ts | 80 ------ packages/interactivity-router/src/head.ts | 126 +++++++++ packages/interactivity-router/src/index.ts | 61 ++-- ...-in-referenced-style-sheets-1-chromium.png | Bin 92 -> 0 bytes ...-in-referenced-style-sheets-2-chromium.png | Bin 96 -> 0 bytes ...-in-referenced-style-sheets-3-chromium.png | Bin 96 -> 0 bytes ...-in-referenced-style-sheets-4-chromium.png | Bin 97 -> 0 bytes ...-in-referenced-style-sheets-5-chromium.png | Bin 97 -> 0 bytes .../fixtures/interactivity-utils.ts | 34 +-- .../specs/interactivity/router-styles.spec.ts | 261 ------------------ 32 files changed, 157 insertions(+), 734 deletions(-) delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/assets/10x10_e2e_test_image_blue.png delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/block.json delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/render.php delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style-from-link.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-green/assets/10x10_e2e_test_image_green.png delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-green/block.json delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-green/render.php delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style-from-link.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-red/assets/10x10_e2e_test_image_red.png delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-red/block.json delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-red/render.php delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style-from-link.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/block.json delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/render.php delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style-from-link.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style.css delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.asset.php delete mode 100644 packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.js delete mode 100644 packages/interactivity-router/src/assets/styles.ts create mode 100644 packages/interactivity-router/src/head.ts delete mode 100644 test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-1-chromium.png delete mode 100644 test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-2-chromium.png delete mode 100644 test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-3-chromium.png delete mode 100644 test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-4-chromium.png delete mode 100644 test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-5-chromium.png delete mode 100644 test/e2e/specs/interactivity/router-styles.spec.ts diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/assets/10x10_e2e_test_image_blue.png b/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/assets/10x10_e2e_test_image_blue.png deleted file mode 100644 index c4f8e7c5146d362a505607042039b832115b9dfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xGmzZ=C-xtZVk{1FcVfJGQl}os;VkfoEM{Qf z76xHPhFNnYfP%~cJ|V6Q4FCStKRO8H@_M>BhE&W+PDw~O(#ybbn1TC*g4kN11cRrm KpUXO@geCyWY#fvT diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/block.json b/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/block.json deleted file mode 100644 index 644ea70f74dca..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 2, - "name": "test/router-styles-blue", - "title": "E2E Interactivity tests - router styles - Blue", - "category": "text", - "icon": "heart", - "description": "", - "supports": { - "interactivity": true - }, - "textdomain": "e2e-interactivity", - "viewStyle": "file:./style.css", - "render": "file:./render.php" -} diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/render.php b/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/render.php deleted file mode 100644 index 3f5da308db092..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/render.php +++ /dev/null @@ -1,35 +0,0 @@ - 'blue-block' ) -); -?> -

    >Blue

    diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style-from-link.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style-from-link.css deleted file mode 100644 index f55f12f4d594c..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style-from-link.css +++ /dev/null @@ -1,7 +0,0 @@ -.blue-from-link { - color: rgb(0, 0, 255); -} - -.background-from-link { - background-image: url('./assets/10x10_e2e_test_image_blue.png'); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style.css deleted file mode 100644 index 84d891e90242a..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-blue/style.css +++ /dev/null @@ -1,4 +0,0 @@ -.wp-block-test-router-styles-blue, -.blue { - color: rgb(0, 0, 255); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/assets/10x10_e2e_test_image_green.png b/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/assets/10x10_e2e_test_image_green.png deleted file mode 100644 index 34ec87925d8c5045f71f6d09724db8fa00ff03af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xGmzZ=C-xtZVk{1FcVfJGQl}os;VkfoEM{Qf z76xHPhFNnYfP%~cJ|V6Q{~1i;4y*ujc|BbmLn`JZrz9jC>1ALz%)os@L2NBhg2B_( K&t;ucLK6U;SQ~Hv diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/block.json b/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/block.json deleted file mode 100644 index e2edda625571b..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 2, - "name": "test/router-styles-green", - "title": "E2E Interactivity tests - router styles - Green", - "category": "text", - "icon": "heart", - "description": "", - "supports": { - "interactivity": true - }, - "textdomain": "e2e-interactivity", - "viewStyle": "file:./style.css", - "render": "file:./render.php" -} diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/render.php b/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/render.php deleted file mode 100644 index 4418a2d3ab0f3..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/render.php +++ /dev/null @@ -1,35 +0,0 @@ - 'green-block' ) -); -?> -

    >Green

    diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style-from-link.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style-from-link.css deleted file mode 100644 index b3d7d7b111e52..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style-from-link.css +++ /dev/null @@ -1,7 +0,0 @@ -.green-from-link { - color: rgb(0, 255, 0); -} - -.background-from-link { - background-image: url('./assets/10x10_e2e_test_image_green.png'); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style.css deleted file mode 100644 index 0c457588f625c..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-green/style.css +++ /dev/null @@ -1,4 +0,0 @@ -.wp-block-test-router-styles-green, -.green { - color: rgb(0, 255, 0); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/assets/10x10_e2e_test_image_red.png b/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/assets/10x10_e2e_test_image_red.png deleted file mode 100644 index 3264bf6427c2766e0b2e6cb8c5dc0f88d123e239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xGmzZ=C-xtZVk{1FcVfJGQl}os;VkfoEM{Qf z76xHPhFNnYfP%~cJ|V9E85krVahe0Uyq+$OAr*6yQxX!6^fE9UX5c=dAhs4L!QkoY K=d#Wzp$Pzi{Ti_V diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/block.json b/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/block.json deleted file mode 100644 index 582d7019062c6..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/block.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 2, - "name": "test/router-styles-red", - "title": "E2E Interactivity tests - router styles - Red", - "category": "text", - "icon": "heart", - "description": "", - "supports": { - "interactivity": true - }, - "textdomain": "e2e-interactivity", - "viewStyle": "file:./style.css", - "render": "file:./render.php" -} diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/render.php b/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/render.php deleted file mode 100644 index e8474cf69b825..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/render.php +++ /dev/null @@ -1,35 +0,0 @@ - 'red-block' ) -); -?> -

    >Red

    diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style-from-link.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style-from-link.css deleted file mode 100644 index 0f7d622807989..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style-from-link.css +++ /dev/null @@ -1,7 +0,0 @@ -.red-from-link { - color: rgb(255, 0, 0); -} - -.background-from-link { - background-image: url('./assets/10x10_e2e_test_image_red.png'); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style.css deleted file mode 100644 index eac7e3af16e0b..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-red/style.css +++ /dev/null @@ -1,4 +0,0 @@ -.wp-block-test-router-styles-red, -.red { - color: rgb(255, 0, 0); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/block.json b/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/block.json deleted file mode 100644 index a1a95b4c81e3b..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/block.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://schemas.wp.org/trunk/block.json", - "apiVersion": 2, - "name": "test/router-styles-wrapper", - "title": "E2E Interactivity tests - router styles - Wrapper", - "category": "text", - "icon": "heart", - "description": "", - "supports": { - "interactivity": true - }, - "textdomain": "e2e-interactivity", - "viewScriptModule": "file:./view.js", - "viewStyle": "file:./style.css", - "render": "file:./render.php" -} diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/render.php b/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/render.php deleted file mode 100644 index 683db9eea5c4c..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/render.php +++ /dev/null @@ -1,87 +0,0 @@ - -
    > - -
    - Styles from block styles -

    Red

    -

    Green

    -

    Blue

    -

    All

    -
    - - -
    - Styles from referenced style sheets - - - - - -
    - - -
    - Styles from inline styles -

    Red

    -

    Green

    -

    Blue

    -

    All

    -
    - - -
    - Rule order checker -

    I should remain green

    -
    - - - - - -
    - -
    - - -
    - Client-side navigation -
    -
    diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style-from-link.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style-from-link.css deleted file mode 100644 index 5cf5b34914ee8..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style-from-link.css +++ /dev/null @@ -1,7 +0,0 @@ -.wp-block-test-router-styles-wrapper .order-checker { - color: rgb(255, 0, 0); -} - -.wp-block-test-router-styles-wrapper .order-checker { - color: rgb(0, 255, 0); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style.css b/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style.css deleted file mode 100644 index 12773560c4180..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.wp-block-test-router-styles-wrapper { - color: rgb(160, 12, 60); -} \ No newline at end of file diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.asset.php b/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.asset.php deleted file mode 100644 index bdaec8d1b67a9..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.asset.php +++ /dev/null @@ -1,9 +0,0 @@ - array( - '@wordpress/interactivity', - array( - 'id' => '@wordpress/interactivity-router', - 'import' => 'dynamic', - ), - ), -); diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.js b/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.js deleted file mode 100644 index 5b3b42f2b413e..0000000000000 --- a/packages/e2e-tests/plugins/interactive-blocks/router-styles-wrapper/view.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * WordPress dependencies - */ -import { store } from '@wordpress/interactivity'; - -const { state } = store( 'test/router-styles', { - state: { - clientSideNavigation: false, - }, - actions: { - *navigate( e ) { - e.preventDefault(); - const { actions } = yield import( - '@wordpress/interactivity-router' - ); - yield actions.navigate( e.target.href ); - state.clientSideNavigation = true; - }, - }, -} ); diff --git a/packages/interactivity-router/CHANGELOG.md b/packages/interactivity-router/CHANGELOG.md index bbedead66bc2a..c5fef76464cbf 100644 --- a/packages/interactivity-router/CHANGELOG.md +++ b/packages/interactivity-router/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Bug Fixes + +- Revert "Handle styles assets on region-based navigation". ([#69222](https://github.com/WordPress/gutenberg/pull/69222)) + ## 2.18.0 (2025-02-12) ### Bug Fixes diff --git a/packages/interactivity-router/src/assets/styles.ts b/packages/interactivity-router/src/assets/styles.ts deleted file mode 100644 index 967bed5bb376d..0000000000000 --- a/packages/interactivity-router/src/assets/styles.ts +++ /dev/null @@ -1,80 +0,0 @@ -const cssUrlRegEx = - /url\(\s*(?:(["'])((?:\\.|[^\n\\"'])+)\1|((?:\\.|[^\s,"'()\\])+))\s*\)/g; - -const resolveUrl = ( relativeUrl: string, baseUrl: string ) => { - try { - return new URL( relativeUrl, baseUrl ).toString(); - } catch ( e ) { - return relativeUrl; - } -}; - -const withAbsoluteUrls = ( cssText: string, baseUrl: string ) => - cssText.replace( - cssUrlRegEx, - ( _match, quotes = '', relUrl1, relUrl2 ) => - `url(${ quotes }${ resolveUrl( - relUrl1 || relUrl2, - baseUrl - ) }${ quotes })` - ); - -const styleSheetCache = new Map< string, Promise< CSSStyleSheet > >(); - -const getCachedSheet = async ( - sheetId: string, - factory: () => Promise< CSSStyleSheet > -) => { - if ( ! styleSheetCache.has( sheetId ) ) { - styleSheetCache.set( sheetId, factory() ); - } - return styleSheetCache.get( sheetId ); -}; - -const sheetFromLink = async ( - { id, href, sheet: elementSheet }: HTMLLinkElement, - baseUrl: string -) => { - const sheetId = id || href; - const sheetUrl = resolveUrl( href, baseUrl ); - - if ( elementSheet ) { - return getCachedSheet( sheetId, () => { - const sheet = new CSSStyleSheet(); - for ( let i = 0; i < elementSheet.cssRules.length; i++ ) { - const { cssText } = elementSheet.cssRules[ i ]; - sheet.insertRule( withAbsoluteUrls( cssText, sheetUrl ), i ); - } - return Promise.resolve( sheet ); - } ); - } - return getCachedSheet( sheetId, async () => { - const response = await fetch( href ); - const text = await response.text(); - const sheet = new CSSStyleSheet(); - await sheet.replace( withAbsoluteUrls( text, sheetUrl ) ); - return sheet; - } ); -}; - -const sheetFromStyle = async ( { textContent }: HTMLStyleElement ) => { - const sheetId = textContent; - return getCachedSheet( sheetId, async () => { - const sheet = new CSSStyleSheet(); - await sheet.replace( textContent ); - return sheet; - } ); -}; - -export const generateCSSStyleSheets = ( - doc: Document, - baseUrl: string = ( doc.location || window.location ).href -): Promise< CSSStyleSheet >[] => - [ ...doc.querySelectorAll( 'style,link[rel=stylesheet]' ) ].map( - ( element ) => { - if ( 'LINK' === element.nodeName ) { - return sheetFromLink( element as HTMLLinkElement, baseUrl ); - } - return sheetFromStyle( element as HTMLStyleElement ); - } - ); diff --git a/packages/interactivity-router/src/head.ts b/packages/interactivity-router/src/head.ts new file mode 100644 index 0000000000000..69139348b582f --- /dev/null +++ b/packages/interactivity-router/src/head.ts @@ -0,0 +1,126 @@ +/** + * The cache of prefetched stylesheets and scripts. + */ +export const headElements = new Map< + string, + { tag: HTMLElement; text?: string } +>(); + +/** + * Helper to update only the necessary tags in the head. + * + * @async + * @param newHead The head elements of the new page. + */ +export const updateHead = async ( newHead: HTMLHeadElement[] ) => { + // Helper to get the tag id store in the cache. + const getTagId = ( tag: Element ) => tag.id || tag.outerHTML; + + // Map incoming head tags by their content. + const newHeadMap = new Map< string, Element >(); + for ( const child of newHead ) { + newHeadMap.set( getTagId( child ), child ); + } + + const toRemove: Element[] = []; + + // Detect nodes that should be added or removed. + for ( const child of document.head.children ) { + const id = getTagId( child ); + // Always remove styles and links as they might change. + if ( child.nodeName === 'LINK' || child.nodeName === 'STYLE' ) { + toRemove.push( child ); + } else if ( newHeadMap.has( id ) ) { + newHeadMap.delete( id ); + } else if ( child.nodeName !== 'SCRIPT' && child.nodeName !== 'META' ) { + toRemove.push( child ); + } + } + + await Promise.all( + [ ...headElements.entries() ] + .filter( ( [ , { tag } ] ) => tag.nodeName === 'SCRIPT' ) + .map( async ( [ url ] ) => { + await import( /* webpackIgnore: true */ url ); + } ) + ); + + // Prepare new assets. + const toAppend = [ ...newHeadMap.values() ]; + + // Apply the changes. + toRemove.forEach( ( n ) => n.remove() ); + document.head.append( ...toAppend ); +}; + +/** + * Fetches and processes head assets (stylesheets and scripts) from a specified document. + * + * @async + * @param doc The document from which to fetch head assets. It should support standard DOM querying methods. + * + * @return Returns an array of HTML elements representing the head assets. + */ +export const fetchHeadAssets = async ( + doc: Document +): Promise< HTMLElement[] > => { + const headTags = []; + + // We only want to fetch module scripts because regular scripts (without + // `async` or `defer` attributes) can depend on the execution of other scripts. + // Scripts found in the head are blocking and must be executed in order. + const scripts = doc.querySelectorAll< HTMLScriptElement >( + 'script[type="module"][src]' + ); + + scripts.forEach( ( script ) => { + const src = script.getAttribute( 'src' ); + if ( ! headElements.has( src ) ) { + // add the elements to prefetch the module scripts + const link = doc.createElement( 'link' ); + link.rel = 'modulepreload'; + link.href = src; + document.head.append( link ); + headElements.set( src, { tag: script } ); + } + } ); + + const stylesheets = doc.querySelectorAll< HTMLLinkElement >( + 'link[rel=stylesheet]' + ); + + await Promise.all( + Array.from( stylesheets ).map( async ( tag ) => { + const href = tag.getAttribute( 'href' ); + if ( ! href ) { + return; + } + + if ( ! headElements.has( href ) ) { + try { + const response = await fetch( href ); + const text = await response.text(); + headElements.set( href, { + tag, + text, + } ); + } catch ( e ) { + // eslint-disable-next-line no-console + console.error( e ); + } + } + + const headElement = headElements.get( href ); + const styleElement = doc.createElement( 'style' ); + styleElement.textContent = headElement.text; + + headTags.push( styleElement ); + } ) + ); + + return [ + doc.querySelector( 'title' ), + ...doc.querySelectorAll( 'style' ), + ...headTags, + ]; +}; diff --git a/packages/interactivity-router/src/index.ts b/packages/interactivity-router/src/index.ts index c128ac8a962de..d23a1e644f5be 100644 --- a/packages/interactivity-router/src/index.ts +++ b/packages/interactivity-router/src/index.ts @@ -6,7 +6,7 @@ import { store, privateApis, getConfig } from '@wordpress/interactivity'; /** * Internal dependencies */ -import { generateCSSStyleSheets } from './assets/styles'; +import { fetchHeadAssets, updateHead, headElements } from './head'; const { directivePrefix, @@ -37,18 +37,16 @@ interface PrefetchOptions { interface VdomParams { vdom?: typeof initialVdom; - baseUrl?: string; } interface Page { regions: Record< string, any >; - styles: Promise< CSSStyleSheet >[]; - scriptModules: string[]; + head: HTMLHeadElement[]; title: string; initialData: any; } -type RegionsToVdom = ( dom: Document, params?: VdomParams ) => Page; +type RegionsToVdom = ( dom: Document, params?: VdomParams ) => Promise< Page >; // Check if the navigation mode is full page or region based. const navigationMode: 'regionBased' | 'fullPage' = @@ -75,7 +73,7 @@ const fetchPage = async ( url: string, { html }: { html: string } ) => { html = await res.text(); } const dom = new window.DOMParser().parseFromString( html, 'text/html' ); - return regionsToVdom( dom, { baseUrl: url } ); + return regionsToVdom( dom ); } catch ( e ) { return false; } @@ -83,17 +81,12 @@ const fetchPage = async ( url: string, { html }: { html: string } ) => { // Return an object with VDOM trees of those HTML regions marked with a // `router-region` directive. -const regionsToVdom: RegionsToVdom = ( dom, { vdom, baseUrl } = {} ) => { +const regionsToVdom: RegionsToVdom = async ( dom, { vdom } = {} ) => { const regions = { body: undefined }; - const styles = generateCSSStyleSheets( dom, baseUrl ); - const scriptModules = [ - ...dom.querySelectorAll< HTMLScriptElement >( - 'script[type=module][src]' - ), - ].map( ( s ) => s.src ); - + let head: HTMLElement[]; if ( globalThis.IS_GUTENBERG_PLUGIN ) { if ( navigationMode === 'fullPage' ) { + head = await fetchHeadAssets( dom ); regions.body = vdom ? vdom.get( document.body ) : toVdom( dom.body ); @@ -110,28 +103,15 @@ const regionsToVdom: RegionsToVdom = ( dom, { vdom, baseUrl } = {} ) => { } const title = dom.querySelector( 'title' )?.innerText; const initialData = parseServerData( dom ); - return { regions, styles, scriptModules, title, initialData }; + return { regions, head, title, initialData }; }; // Render all interactive regions contained in the given page. const renderRegions = async ( page: Page ) => { - // Wait for styles and modules to be ready. - await Promise.all( [ - ...page.styles, - ...page.scriptModules.map( - ( src ) => import( /* webpackIgnore: true */ src ) - ), - ] ); - // Replace style sheets. - const sheets = await Promise.all( page.styles ); - window.document - .querySelectorAll( 'style,link[rel=stylesheet]' ) - .forEach( ( element ) => element.remove() ); - window.document.adoptedStyleSheets = sheets; - if ( globalThis.IS_GUTENBERG_PLUGIN ) { if ( navigationMode === 'fullPage' ) { - // Update HTML. + // Once this code is tested and more mature, the head should be updated for region based navigation as well. + await updateHead( page.head ); const fragment = getRegionRootFragment( document.body ); batch( () => { populateServerData( page.initialData ); @@ -189,14 +169,23 @@ window.addEventListener( 'popstate', async () => { // Initialize the router and cache the initial page using the initial vDOM. // Once this code is tested and more mature, the head should be updated for // region based navigation as well. +if ( globalThis.IS_GUTENBERG_PLUGIN ) { + if ( navigationMode === 'fullPage' ) { + // Cache the scripts. Has to be called before fetching the assets. + [].map.call( + document.querySelectorAll( 'script[type="module"][src]' ), + ( script ) => { + headElements.set( script.getAttribute( 'src' ), { + tag: script, + } ); + } + ); + await fetchHeadAssets( document ); + } +} pages.set( getPagePath( window.location.href ), - Promise.resolve( - regionsToVdom( document, { - vdom: initialVdom, - baseUrl: window.location.href, - } ) - ) + Promise.resolve( regionsToVdom( document, { vdom: initialVdom } ) ) ); // Check if the link is valid for client-side navigation. diff --git a/test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-1-chromium.png b/test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-1-chromium.png deleted file mode 100644 index 4bc0f7a6b1dd7010f6e452350e97ea302ddd9e1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^AT~D#6OcT~)9nwW7>k44ofy`glX(f`hk44ofy`glX(f`NO`(AhGbWCMqFn`Pk44ofy`glX(f`NO`(AhGzopr04R|gIsgCw diff --git a/test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-4-chromium.png b/test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-4-chromium.png deleted file mode 100644 index b7c455784e8a425cb06f4d1c3e8397e552ca19c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^AT~D#6OcT~)9nwW7>k44ofy`glX(f`NPD_ChGr8Danc diff --git a/test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-5-chromium.png b/test/e2e/specs/interactivity/__snapshots__/Router-styles-should-support-relative-URLs-in-referenced-style-sheets-5-chromium.png deleted file mode 100644 index b7c455784e8a425cb06f4d1c3e8397e552ca19c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^AT~D#6OcT~)9nwW7>k44ofy`glX(f`NPD_ChGr8Danc diff --git a/test/e2e/specs/interactivity/fixtures/interactivity-utils.ts b/test/e2e/specs/interactivity/fixtures/interactivity-utils.ts index 74436673f10b7..fd850a6e39fae 100644 --- a/test/e2e/specs/interactivity/fixtures/interactivity-utils.ts +++ b/test/e2e/specs/interactivity/fixtures/interactivity-utils.ts @@ -6,30 +6,6 @@ import type { RequestUtils } from '@wordpress/e2e-test-utils-playwright'; type AddPostWithBlockOptions = { alias?: string; attributes?: Record< string, any >; - innerBlocks?: Block[]; -}; - -type Block = [ - type: string, - attributes?: Record< string, any >, - innerBlocks?: Block[], -]; - -const generateBlockMarkup = ( [ - type, - attributes, - innerBlocks, -]: Block ): string => { - const typeAndAttributes = attributes - ? `${ type } ${ JSON.stringify( attributes ) }` - : type; - - if ( ! innerBlocks ) { - return ``; - } - return `${ innerBlocks - .map( generateBlockMarkup ) - .join( '' ) }`; }; export default class InteractivityUtils { @@ -64,7 +40,7 @@ export default class InteractivityUtils { async addPostWithBlock( name: string, - { attributes, alias, innerBlocks }: AddPostWithBlockOptions = {} + { attributes, alias }: AddPostWithBlockOptions = {} ) { const block = attributes ? `${ name } ${ JSON.stringify( attributes ) }` @@ -74,14 +50,8 @@ export default class InteractivityUtils { alias = block; } - const content = generateBlockMarkup( [ - name, - attributes, - innerBlocks, - ] ); - const payload = { - content, + content: ``, status: 'publish' as 'publish', date_gmt: '2023-01-01T00:00:00', title: alias, diff --git a/test/e2e/specs/interactivity/router-styles.spec.ts b/test/e2e/specs/interactivity/router-styles.spec.ts deleted file mode 100644 index c154b5d432d7b..0000000000000 --- a/test/e2e/specs/interactivity/router-styles.spec.ts +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Internal dependencies - */ -import { test, expect } from './fixtures'; - -const COLOR_RED = 'rgb(255, 0, 0)'; -const COLOR_GREEN = 'rgb(0, 255, 0)'; -const COLOR_BLUE = 'rgb(0, 0, 255)'; -const COLOR_WRAPPER = 'rgb(160, 12, 60)'; - -test.describe( 'Router styles', () => { - test.beforeAll( async ( { interactivityUtils: utils } ) => { - await utils.activatePlugins(); - const red = await utils.addPostWithBlock( - 'test/router-styles-wrapper', - { - alias: 'red', - innerBlocks: [ [ 'test/router-styles-red' ] ], - } - ); - const green = await utils.addPostWithBlock( - 'test/router-styles-wrapper', - { - alias: 'green', - innerBlocks: [ [ 'test/router-styles-green' ] ], - } - ); - const blue = await utils.addPostWithBlock( - 'test/router-styles-wrapper', - { - alias: 'blue', - innerBlocks: [ [ 'test/router-styles-blue' ] ], - } - ); - - const all = await utils.addPostWithBlock( - 'test/router-styles-wrapper', - { - alias: 'all', - innerBlocks: [ - [ 'test/router-styles-red' ], - [ 'test/router-styles-green' ], - [ 'test/router-styles-blue' ], - ], - } - ); - - await utils.addPostWithBlock( 'test/router-styles-wrapper', { - alias: 'none', - attributes: { links: { red, green, blue, all } }, - } ); - } ); - - test.beforeEach( async ( { page, interactivityUtils: utils } ) => { - await page.goto( utils.getLink( 'none' ) ); - } ); - - test.afterAll( async ( { interactivityUtils: utils } ) => { - await utils.deactivatePlugins(); - await utils.deleteAllPosts(); - } ); - - test( 'should add and remove styles from style tags', async ( { - page, - } ) => { - const csn = page.getByTestId( 'client-side navigation' ); - const red = page.getByTestId( 'red' ); - const green = page.getByTestId( 'green' ); - const blue = page.getByTestId( 'blue' ); - const all = page.getByTestId( 'all' ); - - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_WRAPPER ); - - await page.getByTestId( 'link red' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_RED ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_RED ); - - await page.getByTestId( 'link green' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_GREEN ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link blue' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_BLUE ); - await expect( all ).toHaveCSS( 'color', COLOR_BLUE ); - - await page.getByTestId( 'link all' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_RED ); - await expect( green ).toHaveCSS( 'color', COLOR_GREEN ); - await expect( blue ).toHaveCSS( 'color', COLOR_BLUE ); - await expect( all ).toHaveCSS( 'color', COLOR_BLUE ); - } ); - - test( 'should add and remove styles from referenced style sheets', async ( { - page, - } ) => { - const csn = page.getByTestId( 'client-side navigation' ); - const red = page.getByTestId( 'red-from-link' ); - const green = page.getByTestId( 'green-from-link' ); - const blue = page.getByTestId( 'blue-from-link' ); - const all = page.getByTestId( 'all-from-link' ); - - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_WRAPPER ); - - await page.getByTestId( 'link red' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_RED ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_RED ); - - await page.getByTestId( 'link green' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_GREEN ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link blue' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_BLUE ); - await expect( all ).toHaveCSS( 'color', COLOR_BLUE ); - - await page.getByTestId( 'link all' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_RED ); - await expect( green ).toHaveCSS( 'color', COLOR_GREEN ); - await expect( blue ).toHaveCSS( 'color', COLOR_BLUE ); - await expect( all ).toHaveCSS( 'color', COLOR_BLUE ); - } ); - - test( 'should support relative URLs in referenced style sheets', async ( { - page, - } ) => { - const csn = page.getByTestId( 'client-side navigation' ); - const background = page.getByTestId( 'background-from-link' ); - - await expect( background ).toHaveScreenshot(); - - await page.getByTestId( 'link red' ).click(); - - await expect( csn ).toBeVisible(); - await expect( background ).toHaveScreenshot(); - - await page.getByTestId( 'link green' ).click(); - - await expect( csn ).toBeVisible(); - await expect( background ).toHaveScreenshot(); - - await page.getByTestId( 'link blue' ).click(); - - await expect( csn ).toBeVisible(); - await expect( background ).toHaveScreenshot(); - - await page.getByTestId( 'link all' ).click(); - - await expect( csn ).toBeVisible(); - await expect( background ).toHaveScreenshot(); - } ); - - test( 'should update style tags with modified content', async ( { - page, - } ) => { - const csn = page.getByTestId( 'client-side navigation' ); - const red = page.getByTestId( 'red-from-inline' ); - const green = page.getByTestId( 'green-from-inline' ); - const blue = page.getByTestId( 'blue-from-inline' ); - const all = page.getByTestId( 'all-from-inline' ); - - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_WRAPPER ); - - await page.getByTestId( 'link red' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_RED ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_RED ); - - await page.getByTestId( 'link green' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_GREEN ); - await expect( blue ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( all ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link blue' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( green ).toHaveCSS( 'color', COLOR_WRAPPER ); - await expect( blue ).toHaveCSS( 'color', COLOR_BLUE ); - await expect( all ).toHaveCSS( 'color', COLOR_BLUE ); - - await page.getByTestId( 'link all' ).click(); - - await expect( csn ).toBeVisible(); - await expect( red ).toHaveCSS( 'color', COLOR_RED ); - await expect( green ).toHaveCSS( 'color', COLOR_GREEN ); - await expect( blue ).toHaveCSS( 'color', COLOR_BLUE ); - await expect( all ).toHaveCSS( 'color', COLOR_BLUE ); - } ); - - test( 'should preserve rule order from referenced style sheets', async ( { - page, - } ) => { - const csn = page.getByTestId( 'client-side navigation' ); - const orderChecker = page.getByTestId( 'order-checker' ); - - await expect( orderChecker ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link red' ).click(); - - await expect( csn ).toBeVisible(); - await expect( orderChecker ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link green' ).click(); - - await expect( csn ).toBeVisible(); - await expect( orderChecker ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link blue' ).click(); - - await expect( csn ).toBeVisible(); - await expect( orderChecker ).toHaveCSS( 'color', COLOR_GREEN ); - - await page.getByTestId( 'link all' ).click(); - - await expect( csn ).toBeVisible(); - await expect( orderChecker ).toHaveCSS( 'color', COLOR_GREEN ); - } ); -} ); From b7d0886b028c373142438eee8007914983511f63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 15:52:21 -0500 Subject: [PATCH 68/96] Bump preactjs/compressed-size-action (#69202) Bumps the github-actions group with 1 update in the /.github/workflows directory: [preactjs/compressed-size-action](https://github.com/preactjs/compressed-size-action). Updates `preactjs/compressed-size-action` from 2.7.0 to 2.8.0 - [Release notes](https://github.com/preactjs/compressed-size-action/releases) - [Commits](https://github.com/preactjs/compressed-size-action/compare/6fa0e7ca017120c754863b31123c5ee2860fd434...946a292cd35bd1088e0d7eb92b69d1a8d5b5d76a) --- updated-dependencies: - dependency-name: preactjs/compressed-size-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: desrosj --- .github/workflows/bundle-size.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bundle-size.yml b/.github/workflows/bundle-size.yml index b967157836a4d..c61fbccb7f71d 100644 --- a/.github/workflows/bundle-size.yml +++ b/.github/workflows/bundle-size.yml @@ -49,7 +49,7 @@ jobs: check-latest: true cache: npm - - uses: preactjs/compressed-size-action@6fa0e7ca017120c754863b31123c5ee2860fd434 # v2.7.0 + - uses: preactjs/compressed-size-action@946a292cd35bd1088e0d7eb92b69d1a8d5b5d76a # v2.8.0 with: repo-token: '${{ secrets.GITHUB_TOKEN }}' pattern: '{build/**/*.min.js,build/**/*.css,build-module/**/*.min.js}' From ef94f5fd4c638fd5d34e1c13d3f1a60464d8fd18 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 18 Feb 2025 11:49:49 +0800 Subject: [PATCH 69/96] REST API: Adds the site reading options to the index (#69106) Co-authored-by: Mamaduka Co-authored-by: peterwilsoncc Co-authored-by: TimothyBJacobs Co-authored-by: t-hamano Co-authored-by: youknowriad Co-authored-by: spacedmonkey Co-authored-by: fabiankaegy --- backport-changelog/6.8/8345.md | 3 ++ lib/compat/wordpress-6.8/preload.php | 37 +++++++++++---------- lib/compat/wordpress-6.8/rest-api.php | 15 +++++++++ packages/core-data/src/entities.js | 3 ++ packages/core-data/src/private-selectors.ts | 35 ++++--------------- test/e2e/specs/site-editor/preload.spec.js | 4 +-- 6 files changed, 50 insertions(+), 47 deletions(-) create mode 100644 backport-changelog/6.8/8345.md diff --git a/backport-changelog/6.8/8345.md b/backport-changelog/6.8/8345.md new file mode 100644 index 0000000000000..cf65cb911195d --- /dev/null +++ b/backport-changelog/6.8/8345.md @@ -0,0 +1,3 @@ +https://github.com/WordPress/wordpress-develop/pull/8345 + +* https://github.com/WordPress/gutenberg/pull/69106 diff --git a/lib/compat/wordpress-6.8/preload.php b/lib/compat/wordpress-6.8/preload.php index 0e887fc081bcb..6a0102f1848ea 100644 --- a/lib/compat/wordpress-6.8/preload.php +++ b/lib/compat/wordpress-6.8/preload.php @@ -36,23 +36,6 @@ function gutenberg_block_editor_preload_paths_6_8( $paths, $context ) { $paths[] = '/wp/v2/settings'; $paths[] = array( '/wp/v2/settings', 'OPTIONS' ); - $paths[] = '/?_fields=' . implode( - ',', - // @see packages/core-data/src/entities.js - array( - 'description', - 'gmt_offset', - 'home', - 'name', - 'site_icon', - 'site_icon_url', - 'site_logo', - 'timezone_string', - 'default_template_part_areas', - 'default_template_types', - 'url', - ) - ); $paths[] = '/wp/v2/templates/lookup?slug=front-page'; $paths[] = '/wp/v2/templates/lookup?slug=home'; } @@ -90,6 +73,26 @@ function gutenberg_block_editor_preload_paths_6_8( $paths, $context ) { // Used by getBlockPatternCategories in useBlockEditorSettings. $paths[] = '/wp/v2/block-patterns/categories'; + $paths[] = '/?_fields=' . implode( + ',', + // @see packages/core-data/src/entities.js + array( + 'description', + 'gmt_offset', + 'home', + 'name', + 'site_icon', + 'site_icon_url', + 'site_logo', + 'timezone_string', + 'default_template_part_areas', + 'default_template_types', + 'url', + 'page_for_posts', + 'page_on_front', + 'show_on_front', + ) + ); } return $paths; } diff --git a/lib/compat/wordpress-6.8/rest-api.php b/lib/compat/wordpress-6.8/rest-api.php index f6844184ea610..f965dbbdda449 100644 --- a/lib/compat/wordpress-6.8/rest-api.php +++ b/lib/compat/wordpress-6.8/rest-api.php @@ -71,6 +71,21 @@ function gutenberg_add_default_template_types_to_index( WP_REST_Response $respon } add_filter( 'rest_index', 'gutenberg_add_default_template_types_to_index' ); +/** + * Adds the site reading options to the REST API index. + * + * @param WP_REST_Response $response REST API response. + * @return WP_REST_Response Modified REST API response. + */ +function gutenberg_add_rest_index_reading_options( WP_REST_Response $response ) { + $response->data['page_for_posts'] = (int) get_option( 'page_for_posts' ); + $response->data['page_on_front'] = (int) get_option( 'page_on_front' ); + $response->data['show_on_front'] = get_option( 'show_on_front' ); + + return $response; +} +add_filter( 'rest_index', 'gutenberg_add_rest_index_reading_options' ); + /** * Adds `ignore_sticky` parameter to the post collection endpoint. * diff --git a/packages/core-data/src/entities.js b/packages/core-data/src/entities.js index 2730cdf3d64bf..a6d3335fa9583 100644 --- a/packages/core-data/src/entities.js +++ b/packages/core-data/src/entities.js @@ -34,6 +34,9 @@ export const rootEntitiesConfig = [ 'default_template_part_areas', 'default_template_types', 'url', + 'page_for_posts', + 'page_on_front', + 'show_on_front', ].join( ',' ), }, // The entity doesn't support selecting multiple records. diff --git a/packages/core-data/src/private-selectors.ts b/packages/core-data/src/private-selectors.ts index fb0401509694e..153e5d3575caa 100644 --- a/packages/core-data/src/private-selectors.ts +++ b/packages/core-data/src/private-selectors.ts @@ -6,12 +6,7 @@ import { createSelector, createRegistrySelector } from '@wordpress/data'; /** * Internal dependencies */ -import { - canUser, - getDefaultTemplateId, - getEntityRecord, - type State, -} from './selectors'; +import { getDefaultTemplateId, getEntityRecord, type State } from './selectors'; import { STORE_NAME } from './name'; import { unlock } from './lock-unlock'; @@ -139,16 +134,9 @@ interface SiteData { export const getHomePage = createRegistrySelector( ( select ) => createSelector( () => { - const canReadSiteData = select( STORE_NAME ).canUser( 'read', { - kind: 'root', - name: 'site', - } ); - if ( ! canReadSiteData ) { - return null; - } const siteData = select( STORE_NAME ).getEntityRecord( 'root', - 'site' + '__unstableBase' ) as SiteData | undefined; if ( ! siteData ) { return null; @@ -168,10 +156,7 @@ export const getHomePage = createRegistrySelector( ( select ) => return { postType: 'wp_template', postId: frontPageTemplateId }; }, ( state ) => [ - canUser( state, 'read', { - kind: 'root', - name: 'site', - } ) && getEntityRecord( state, 'root', 'site' ), + getEntityRecord( state, 'root', '__unstableBase' ), getDefaultTemplateId( state, { slug: 'front-page', } ), @@ -180,16 +165,10 @@ export const getHomePage = createRegistrySelector( ( select ) => ); export const getPostsPageId = createRegistrySelector( ( select ) => () => { - const canReadSiteData = select( STORE_NAME ).canUser( 'read', { - kind: 'root', - name: 'site', - } ); - if ( ! canReadSiteData ) { - return null; - } - const siteData = select( STORE_NAME ).getEntityRecord( 'root', 'site' ) as - | SiteData - | undefined; + const siteData = select( STORE_NAME ).getEntityRecord( + 'root', + '__unstableBase' + ) as SiteData | undefined; return siteData?.show_on_front === 'page' ? normalizePageId( siteData.page_for_posts ) : null; diff --git a/test/e2e/specs/site-editor/preload.spec.js b/test/e2e/specs/site-editor/preload.spec.js index e731e932e3052..b6f9f49aedeb7 100644 --- a/test/e2e/specs/site-editor/preload.spec.js +++ b/test/e2e/specs/site-editor/preload.spec.js @@ -44,11 +44,11 @@ test.describe( 'Preload', () => { // To do: these should all be removed or preloaded. expect( requests ).toEqual( [ + // Seems to be coming from `enableComplementaryArea`. + '/wp/v2/users/me', // There are two separate settings OPTIONS requests. We should fix // so the one for canUser and getEntityRecord are reused. '/wp/v2/settings', - // Seems to be coming from `enableComplementaryArea`. - '/wp/v2/users/me', ] ); } ); } ); From c031b36198add10c77ecc5a4efb7da614dad7394 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 18 Feb 2025 11:58:17 +0800 Subject: [PATCH 70/96] Editor: Avoid a 'flash' when rendering in 'template-locked' mode (#69173) * Editor: Avoid a 'flash' when rendering in 'template-locked' mode * Relocate some checks Co-authored-by: Mamaduka Co-authored-by: fabiankaegy Co-authored-by: Mayank-Tripathi32 --- packages/editor/src/components/provider/index.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/editor/src/components/provider/index.js b/packages/editor/src/components/provider/index.js index dfeaf19a5bd21..0e653228fee62 100644 --- a/packages/editor/src/components/provider/index.js +++ b/packages/editor/src/components/provider/index.js @@ -203,14 +203,17 @@ export const ExperimentalEditorProvider = withRegistryProvider( : undefined; const hasDefaultMode = RENDERING_MODES.includes( _defaultMode ); + // Wait for template resolution when rendering in a `template-locked` mode. + const hasResolvedMode = + hasLoadedPostObject && _defaultMode === 'template-locked' + ? hasTemplate + : true; + return { editorSettings: getEditorSettings(), - isReady: __unstableIsEditorReady() && hasLoadedPostObject, + isReady: __unstableIsEditorReady() && hasResolvedMode, mode: getRenderingMode(), - defaultMode: - hasTemplate && hasDefaultMode - ? _defaultMode - : 'post-only', + defaultMode: hasDefaultMode ? _defaultMode : 'post-only', selection: getEditorSelection(), postTypeEntities: post.type === 'wp_template' From c0f3cd9f9484b650d1d0410b55750081a232e05a Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 18 Feb 2025 12:02:27 +0800 Subject: [PATCH 71/96] Editor: Restore starter content modal (#69081) * Editor: Restore starter content modal * Restore limit to page post type * Add don't show the option to the modal again * Adjust logic for opening modal * Feedback * Don't re-open the starter content modal after closing Preferences Co-authored-by: Mamaduka Co-authored-by: carolinan Co-authored-by: t-hamano Co-authored-by: afercia Co-authored-by: stokesman Co-authored-by: yogeshbhutkar Co-authored-by: andreawetzel Co-authored-by: fabiankaegy --- packages/base-styles/_z-index.scss | 1 + .../inserter/block-patterns-explorer/index.js | 5 +- .../inserter/block-patterns-tab/index.js | 4 +- .../pattern-category-previews.js | 8 +- .../block-patterns-tab/patterns-filter.js | 4 +- .../inserter/category-tabs/index.js | 4 +- .../block-editor/src/hooks/use-zoom-out.js | 12 +- .../components/start-page-options/index.js | 172 +++++++++++++++--- .../components/start-page-options/style.scss | 27 +++ .../various/template-resolution.spec.js | 4 - .../block-style-variations.spec.js | 4 +- test/e2e/specs/site-editor/pages.spec.js | 3 - 12 files changed, 193 insertions(+), 55 deletions(-) diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss index 6f7e3f2f13c30..527f8141d2ec4 100644 --- a/packages/base-styles/_z-index.scss +++ b/packages/base-styles/_z-index.scss @@ -199,6 +199,7 @@ $z-layers: ( // Ensure modal footer actions appear above modal contents ".editor-start-template-options__modal__actions": 1, + ".editor-start-page-options__modal__actions": 1, // Ensure checkbox + actions don't overlap table header ".dataviews-view-table thead": 1, diff --git a/packages/block-editor/src/components/inserter/block-patterns-explorer/index.js b/packages/block-editor/src/components/inserter/block-patterns-explorer/index.js index 2bc41a7176954..93a03ee200497 100644 --- a/packages/block-editor/src/components/inserter/block-patterns-explorer/index.js +++ b/packages/block-editor/src/components/inserter/block-patterns-explorer/index.js @@ -14,8 +14,9 @@ import { usePatternCategories } from '../block-patterns-tab/use-pattern-categori function PatternsExplorer( { initialCategory, rootClientId } ) { const [ searchValue, setSearchValue ] = useState( '' ); - const [ selectedCategory, setSelectedCategory ] = - useState( initialCategory ); + const [ selectedCategory, setSelectedCategory ] = useState( + initialCategory?.name + ); const patternCategories = usePatternCategories( rootClientId ); diff --git a/packages/block-editor/src/components/inserter/block-patterns-tab/index.js b/packages/block-editor/src/components/inserter/block-patterns-tab/index.js index f250ed6f12eba..45db4732aa9c6 100644 --- a/packages/block-editor/src/components/inserter/block-patterns-tab/index.js +++ b/packages/block-editor/src/components/inserter/block-patterns-tab/index.js @@ -70,9 +70,7 @@ function BlockPatternsTab( { ) } { showPatternsExplorer && ( setShowPatternsExplorer( false ) } rootClientId={ rootClientId } diff --git a/packages/block-editor/src/components/inserter/block-patterns-tab/pattern-category-previews.js b/packages/block-editor/src/components/inserter/block-patterns-tab/pattern-category-previews.js index f9af2b6f8c42d..c6ce9ba97d250 100644 --- a/packages/block-editor/src/components/inserter/block-patterns-tab/pattern-category-previews.js +++ b/packages/block-editor/src/components/inserter/block-patterns-tab/pattern-category-previews.js @@ -69,19 +69,19 @@ export function PatternCategoryPreviews( { return false; } - if ( category.name === allPatternsCategory?.name ) { + if ( category.name === allPatternsCategory.name ) { return true; } if ( - category.name === myPatternsCategory?.name && + category.name === myPatternsCategory.name && pattern.type === INSERTER_PATTERN_TYPES.user ) { return true; } if ( - category.name === starterPatternsCategory?.name && + category.name === starterPatternsCategory.name && pattern.blockTypes?.includes( 'core/post-content' ) ) { return true; @@ -149,7 +149,7 @@ export function PatternCategoryPreviews( { level={ 4 } as="div" > - { category?.label } + { category.label } sourceFilter !== 'all' && sourceFilter !== 'user'; const getShouldHideSourcesFilter = ( category ) => { - return category?.name === myPatternsCategory.name; + return category.name === myPatternsCategory.name; }; const PATTERN_SOURCE_MENU_OPTIONS = [ @@ -60,7 +60,7 @@ export function PatternsFilter( { // the user may be confused when switching to another category if the haven't explicitly set // this filter themselves. const currentPatternSourceFilter = - category?.name === myPatternsCategory.name + category.name === myPatternsCategory.name ? INSERTER_PATTERN_TYPES.user : patternSourceFilter; diff --git a/packages/block-editor/src/components/inserter/category-tabs/index.js b/packages/block-editor/src/components/inserter/category-tabs/index.js index 7f5f9ba3f65ad..2f70ea58f2532 100644 --- a/packages/block-editor/src/components/inserter/category-tabs/index.js +++ b/packages/block-editor/src/components/inserter/category-tabs/index.js @@ -65,9 +65,7 @@ function CategoryTabs( { key={ category.name } tabId={ category.name } aria-current={ - category.name === selectedCategory?.name - ? 'true' - : undefined + category === selectedCategory ? 'true' : undefined } > { category.label } diff --git a/packages/block-editor/src/hooks/use-zoom-out.js b/packages/block-editor/src/hooks/use-zoom-out.js index 5c37822eba4b3..adcea8b605aeb 100644 --- a/packages/block-editor/src/hooks/use-zoom-out.js +++ b/packages/block-editor/src/hooks/use-zoom-out.js @@ -2,14 +2,13 @@ * WordPress dependencies */ import { useSelect, useDispatch } from '@wordpress/data'; -import { useEffect, useRef, useContext } from '@wordpress/element'; +import { useEffect, useRef } from '@wordpress/element'; /** * Internal dependencies */ import { store as blockEditorStore } from '../store'; import { unlock } from '../lock-unlock'; -import BlockContext from '../components/block-context'; /** * A hook used to set the editor mode to zoomed out mode, invoking the hook sets the mode. @@ -20,7 +19,6 @@ import BlockContext from '../components/block-context'; * @param {boolean} enabled If we should enter into zoomOut mode or not */ export function useZoomOut( enabled = true ) { - const { postId } = useContext( BlockContext ); const { setZoomLevel, resetZoomLevel } = unlock( useDispatch( blockEditorStore ) ); @@ -39,7 +37,6 @@ export function useZoomOut( enabled = true ) { const controlZoomLevelRef = useRef( false ); const isEnabledRef = useRef( enabled ); - const postIdRef = useRef( postId ); /** * This hook tracks if the zoom state was changed manually by the user via clicking @@ -58,11 +55,6 @@ export function useZoomOut( enabled = true ) { useEffect( () => { isEnabledRef.current = enabled; - // If the user created a new post/page, we should take control of the zoom level. - if ( postIdRef.current !== postId ) { - controlZoomLevelRef.current = true; - } - if ( enabled !== isZoomOut() ) { controlZoomLevelRef.current = true; @@ -79,5 +71,5 @@ export function useZoomOut( enabled = true ) { resetZoomLevel(); } }; - }, [ enabled, isZoomOut, postId, resetZoomLevel, setZoomLevel ] ); + }, [ enabled, isZoomOut, resetZoomLevel, setZoomLevel ] ); } diff --git a/packages/editor/src/components/start-page-options/index.js b/packages/editor/src/components/start-page-options/index.js index 54d956ff06e7c..14d052052e700 100644 --- a/packages/editor/src/components/start-page-options/index.js +++ b/packages/editor/src/components/start-page-options/index.js @@ -1,8 +1,16 @@ /** * WordPress dependencies */ -import { useEffect } from '@wordpress/element'; +import { Flex, FlexItem, Modal, ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { useState, useMemo, useEffect } from '@wordpress/element'; +import { + store as blockEditorStore, + __experimentalBlockPatternsList as BlockPatternsList, +} from '@wordpress/block-editor'; import { useSelect, useDispatch } from '@wordpress/data'; +import { store as coreStore } from '@wordpress/core-data'; +import { __unstableSerializeAndClean } from '@wordpress/blocks'; import { store as preferencesStore } from '@wordpress/preferences'; import { store as interfaceStore } from '@wordpress/interface'; @@ -11,11 +19,132 @@ import { store as interfaceStore } from '@wordpress/interface'; */ import { store as editorStore } from '../../store'; +export function useStartPatterns() { + // A pattern is a start pattern if it includes 'core/post-content' in its blockTypes, + // and it has no postTypes declared and the current post type is page or if + // the current post type is part of the postTypes declared. + const { blockPatternsWithPostContentBlockType, postType } = useSelect( + ( select ) => { + const { getPatternsByBlockTypes, getBlocksByName } = + select( blockEditorStore ); + const { getCurrentPostType, getRenderingMode } = + select( editorStore ); + const rootClientId = + getRenderingMode() === 'post-only' + ? '' + : getBlocksByName( 'core/post-content' )?.[ 0 ]; + return { + blockPatternsWithPostContentBlockType: getPatternsByBlockTypes( + 'core/post-content', + rootClientId + ), + postType: getCurrentPostType(), + }; + }, + [] + ); + + return useMemo( () => { + if ( ! blockPatternsWithPostContentBlockType?.length ) { + return []; + } + + /* + * Filter patterns without postTypes declared if the current postType is page + * or patterns that declare the current postType in its post type array. + */ + return blockPatternsWithPostContentBlockType.filter( ( pattern ) => { + return ( + ( postType === 'page' && ! pattern.postTypes ) || + ( Array.isArray( pattern.postTypes ) && + pattern.postTypes.includes( postType ) ) + ); + } ); + }, [ postType, blockPatternsWithPostContentBlockType ] ); +} + +function PatternSelection( { blockPatterns, onChoosePattern } ) { + const { editEntityRecord } = useDispatch( coreStore ); + const { postType, postId } = useSelect( ( select ) => { + const { getCurrentPostType, getCurrentPostId } = select( editorStore ); + + return { + postType: getCurrentPostType(), + postId: getCurrentPostId(), + }; + }, [] ); + return ( + { + editEntityRecord( 'postType', postType, postId, { + blocks, + content: ( { blocks: blocksForSerialization = [] } ) => + __unstableSerializeAndClean( blocksForSerialization ), + } ); + onChoosePattern(); + } } + /> + ); +} + +function StartPageOptionsModal( { onClose } ) { + const [ showStartPatterns, setShowStartPatterns ] = useState( true ); + const { set: setPreference } = useDispatch( preferencesStore ); + const startPatterns = useStartPatterns(); + const hasStartPattern = startPatterns.length > 0; + + if ( ! hasStartPattern ) { + return null; + } + + function handleClose() { + onClose(); + setPreference( 'core', 'enableChoosePatternModal', showStartPatterns ); + } + + return ( + +
    + +
    + + + { + setShowStartPatterns( newValue ); + } } + /> + + +
    + ); +} + export default function StartPageOptions() { - const { postId, enabled } = useSelect( ( select ) => { + const [ isOpen, setIsOpen ] = useState( false ); + const { isEditedPostDirty, isEditedPostEmpty } = useSelect( editorStore ); + const { isModalActive } = useSelect( interfaceStore ); + const { enabled, postId } = useSelect( ( select ) => { const { getCurrentPostId, getCurrentPostType } = select( editorStore ); - const preferencesModalActive = - select( interfaceStore ).isModalActive( 'editor/preferences' ); const choosePatternModalEnabled = select( preferencesStore ).get( 'core', 'enableChoosePatternModal' @@ -23,36 +152,33 @@ export default function StartPageOptions() { return { postId: getCurrentPostId(), enabled: - choosePatternModalEnabled && - ! preferencesModalActive && - 'page' === getCurrentPostType(), + choosePatternModalEnabled && 'page' === getCurrentPostType(), }; }, [] ); - const { isEditedPostDirty, isEditedPostEmpty } = useSelect( editorStore ); - const { setIsInserterOpened } = useDispatch( editorStore ); + // Note: The `postId` ensures the effect re-runs when pages are switched without remounting the component. + // Examples: changing pages in the List View, creating a new page via Command Palette. useEffect( () => { - if ( ! enabled ) { - return; - } - const isFreshPage = ! isEditedPostDirty() && isEditedPostEmpty(); - if ( isFreshPage ) { - setIsInserterOpened( { - tab: 'patterns', - category: 'core/starter-content', - } ); + // Prevents immediately opening when features is enabled via preferences modal. + const isPreferencesModalActive = isModalActive( 'editor/preferences' ); + if ( ! enabled || ! isFreshPage || isPreferencesModalActive ) { + return; } - // Note: The `postId` ensures the effect re-runs when pages are switched without remounting the component. - // Examples: changing pages in the List View, creating a new page via Command Palette. + // Open the modal after the initial render for a new page. + setIsOpen( true ); }, [ - postId, enabled, - setIsInserterOpened, + postId, isEditedPostDirty, isEditedPostEmpty, + isModalActive, ] ); - return null; + if ( ! isOpen ) { + return null; + } + + return setIsOpen( false ) } />; } diff --git a/packages/editor/src/components/start-page-options/style.scss b/packages/editor/src/components/start-page-options/style.scss index 129d670526c70..e97fc4a9b2cd9 100644 --- a/packages/editor/src/components/start-page-options/style.scss +++ b/packages/editor/src/components/start-page-options/style.scss @@ -1,3 +1,30 @@ +$actions-height: 92px; + +.editor-start-page-options__modal { + .editor-start-page-options__modal__actions { + position: absolute; + bottom: 0; + width: 100%; + height: $actions-height; + background-color: $white; + margin-left: - $grid-unit-40; + margin-right: - $grid-unit-40; + padding-left: $grid-unit-40; + padding-right: $grid-unit-40; + border-top: 1px solid $gray-300; + z-index: z-index(".editor-start-page-options__modal__actions"); + } + + .block-editor-block-patterns-list { + // Since the actions container is positioned absolutely, + // this padding bottom ensures that the content wrapper will properly + // detect overflowing content and start showing scrollbars at the right + // moment. Without this padding, the content would render under the actions + // bar without causing the wrapper to show a scrollbar. + padding-bottom: $actions-height; + } +} + // 2 column masonry layout. .editor-start-page-options__modal-content .block-editor-block-patterns-list { column-count: 2; diff --git a/test/e2e/specs/editor/various/template-resolution.spec.js b/test/e2e/specs/editor/various/template-resolution.spec.js index 82e336feff733..13503ddaf23d5 100644 --- a/test/e2e/specs/editor/various/template-resolution.spec.js +++ b/test/e2e/specs/editor/various/template-resolution.spec.js @@ -55,15 +55,12 @@ test.describe( 'Template resolution', () => { status: 'publish', } ); await admin.editPost( newPage.id ); - await page.locator( 'role=button[name="Block Inserter"i]' ).click(); await editor.openDocumentSettingsSidebar(); await expect( page.getByRole( 'button', { name: 'Template options' } ) ).toHaveText( 'Single Entries' ); await updateSiteSettings( { requestUtils, pageId: newPage.id } ); await page.reload(); - await page.locator( 'role=button[name="Block Inserter"i]' ).click(); - await editor.openDocumentSettingsSidebar(); await expect( page.getByRole( 'button', { name: 'Template options' } ) ).toHaveText( 'Index' ); @@ -84,7 +81,6 @@ test.describe( 'Template resolution', () => { postType: 'page', canvas: 'edit', } ); - await page.locator( 'role=button[name="Block Inserter"i]' ).click(); await editor.openDocumentSettingsSidebar(); await expect( page.getByRole( 'button', { name: 'Template options' } ) diff --git a/test/e2e/specs/site-editor/block-style-variations.spec.js b/test/e2e/specs/site-editor/block-style-variations.spec.js index 1aa3c576b72c0..7fd9b15ca5374 100644 --- a/test/e2e/specs/site-editor/block-style-variations.spec.js +++ b/test/e2e/specs/site-editor/block-style-variations.spec.js @@ -317,7 +317,9 @@ async function draftNewPage( page ) { // Create a Group block with 2 nested Group blocks. async function addPageContent( editor, page ) { - const inserterButton = page.locator( 'role=tab[name="Blocks"i]' ); + const inserterButton = page.locator( + 'role=button[name="Block Inserter"i]' + ); await inserterButton.click(); await page.type( 'role=searchbox[name="Search"i]', 'Group' ); await page.click( diff --git a/test/e2e/specs/site-editor/pages.spec.js b/test/e2e/specs/site-editor/pages.spec.js index 1a8ab33b9e884..8dcf336a1e8ff 100644 --- a/test/e2e/specs/site-editor/pages.spec.js +++ b/test/e2e/specs/site-editor/pages.spec.js @@ -272,7 +272,6 @@ test.describe( 'Pages', () => { // Create new page that has the default template so as to swap it. await draftNewPage( page ); - await page.locator( 'role=button[name="Block Inserter"i]' ).click(); await editor.openDocumentSettingsSidebar(); const templateOptionsButton = page .getByRole( 'region', { name: 'Editor settings' } ) @@ -295,7 +294,6 @@ test.describe( 'Pages', () => { } ); // Now reset, and apply the default template back. - await editor.openDocumentSettingsSidebar(); await templateOptionsButton.click(); const resetButton = page .getByRole( 'menu', { name: 'Template options' } ) @@ -310,7 +308,6 @@ test.describe( 'Pages', () => { editor, } ) => { await draftNewPage( page ); - await page.locator( 'role=button[name="Block Inserter"i]' ).click(); await editor.openDocumentSettingsSidebar(); const templateOptionsButton = page .getByRole( 'region', { name: 'Editor settings' } ) From 22f3a5f8e3ad2264753aa92a9b7c1effd4d5e68e Mon Sep 17 00:00:00 2001 From: Yogesh Bhutkar Date: Tue, 18 Feb 2025 10:00:08 +0530 Subject: [PATCH 72/96] Inserter: Hide drag-and-drop help text on mobile devices when previewing patterns (#69159) Co-authored-by: yogeshbhutkar Co-authored-by: Mamaduka --- packages/block-editor/src/components/inserter/style.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/block-editor/src/components/inserter/style.scss b/packages/block-editor/src/components/inserter/style.scss index 20aa1c288103d..9051441af2cef 100644 --- a/packages/block-editor/src/components/inserter/style.scss +++ b/packages/block-editor/src/components/inserter/style.scss @@ -644,5 +644,10 @@ $block-inserter-tabs-height: 44px; } .block-editor-tabbed-sidebar__tabpanel .block-editor-inserter__help-text { + display: none; padding: 0 $grid-unit-30 $grid-unit-20; + + @include break-mobile { + display: block; + } } From 6049b77dc62d43a95e01d4f8e9e58a7ba1ba962d Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Tue, 18 Feb 2025 06:51:43 +0000 Subject: [PATCH 73/96] Bump plugin version to 20.3.0-rc.2 --- gutenberg.php | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gutenberg.php b/gutenberg.php index 58e04e0b9e4f5..1ef51115ec932 100644 --- a/gutenberg.php +++ b/gutenberg.php @@ -5,7 +5,7 @@ * Description: Printing since 1440. This is the development plugin for the block editor, site editor, and other future WordPress core functionality. * Requires at least: 6.6 * Requires PHP: 7.2 - * Version: 20.3.0-rc.1 + * Version: 20.3.0-rc.2 * Author: Gutenberg Team * Text Domain: gutenberg * diff --git a/package-lock.json b/package-lock.json index b5bd7ed6c1b7e..1c0795c90bcc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gutenberg", - "version": "20.3.0-rc.1", + "version": "20.3.0-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gutenberg", - "version": "20.3.0-rc.1", + "version": "20.3.0-rc.2", "hasInstallScript": true, "license": "GPL-2.0-or-later", "workspaces": [ diff --git a/package.json b/package.json index 5459c72eb1472..2984502a07a5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "20.3.0-rc.1", + "version": "20.3.0-rc.2", "private": true, "description": "A new WordPress editor experience.", "author": "The WordPress Contributors", From 5c6e216da73ebcdc9a73332a251bf6620c151c11 Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Tue, 18 Feb 2025 07:04:34 +0000 Subject: [PATCH 74/96] Update Changelog for 20.3.0-rc.2 --- changelog.txt | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/changelog.txt b/changelog.txt index 2a1e7d62ed656..3a8e2bafd9567 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,189 @@ == Changelog == += 20.3.0-rc.2 = + +## Changelog + +### Enhancements + +- Disable hover animation on preview frame for classic themes. ([68976](https://github.com/WordPress/gutenberg/pull/68976)) + +#### Block Library +- Added discord in social links. ([68848](https://github.com/WordPress/gutenberg/pull/68848)) +- Featured Image block: Use resolution tool component. ([68471](https://github.com/WordPress/gutenberg/pull/68471)) +- Query block: Add option to ignore sticky posts behavior. ([69057](https://github.com/WordPress/gutenberg/pull/69057)) +- RSS: Border & Spacing support. ([66411](https://github.com/WordPress/gutenberg/pull/66411)) + +#### Global Styles +- Disable Clear button if there's no shadow. ([69092](https://github.com/WordPress/gutenberg/pull/69092)) +- Duotone Settings: Add `reset` button and improve toggle rendering in FiltersPanel. ([68672](https://github.com/WordPress/gutenberg/pull/68672)) +- Shadow Panel: Add reset button. ([68981](https://github.com/WordPress/gutenberg/pull/68981)) + +#### Post Editor +- Editor: Add loading state to the 'PageAttributesParent' component. ([69062](https://github.com/WordPress/gutenberg/pull/69062)) +- Editor: Add loading state to the 'PostAuthorCombobox' component. ([68991](https://github.com/WordPress/gutenberg/pull/68991)) +- Editor: Display error message when loading current post fails. ([68999](https://github.com/WordPress/gutenberg/pull/68999)) + +#### Block Editor +- Quick Inserter: Restore pattern search and insertion. ([69028](https://github.com/WordPress/gutenberg/pull/69028)) +- Update keyboard shortcuts to use `primaryShift+backspace` for block deletion. ([69074](https://github.com/WordPress/gutenberg/pull/69074)) + +#### Design Tools +- Archives: Add Color Support. ([68685](https://github.com/WordPress/gutenberg/pull/68685)) +- Categories: Add Color Support. ([68686](https://github.com/WordPress/gutenberg/pull/68686)) + +#### Components +- ComboboxControl: Add an `isLoading` prop to show a loading spinner. ([68990](https://github.com/WordPress/gutenberg/pull/68990)) + + +### Bug Fixes + +- Exclude Iterator helpers from polyfills. ([69070](https://github.com/WordPress/gutenberg/pull/69070)) +- Fix Dependabot ignore statements. ([69144](https://github.com/WordPress/gutenberg/pull/69144)) + +#### Block Editor +- Block popover: Fix scrolling over. ([68075](https://github.com/WordPress/gutenberg/pull/68075)) +- Display root appender when default block is disabled. ([68951](https://github.com/WordPress/gutenberg/pull/68951)) +- Fix regression for root appender logic. ([68994](https://github.com/WordPress/gutenberg/pull/68994)) +- Inserter: Remove block default icon from no results message. ([68693](https://github.com/WordPress/gutenberg/pull/68693)) +- Rename `aspect` property to `ratio` to carry the `defaultAspect` in `AspectRatioDropdown`. ([69085](https://github.com/WordPress/gutenberg/pull/69085)) +- Writing Flow: Restore early return for no block selection in tab nav hook. ([69079](https://github.com/WordPress/gutenberg/pull/69079)) + +#### Site Editor +- Edit Site: Fix Fields package private APIs error. ([68964](https://github.com/WordPress/gutenberg/pull/68964)) +- Fix: Site Editor should display a 404 message. ([69009](https://github.com/WordPress/gutenberg/pull/69009)) +- Use the same editor component for all routes. ([69093](https://github.com/WordPress/gutenberg/pull/69093)) + +#### Global Styles +- Fix: Additional CSS button not working after back navigation. ([68954](https://github.com/WordPress/gutenberg/pull/68954)) +- Fix: Missing 'No blocks found.' message for block search in editor. ([69036](https://github.com/WordPress/gutenberg/pull/69036)) + +#### Block Library +- Query Block: Fix 'parents' argument validation. ([68983](https://github.com/WordPress/gutenberg/pull/68983)) +- Social Links: Fix appender size in non-iframe editor. ([68215](https://github.com/WordPress/gutenberg/pull/68215)) + +#### REST API +- Add support for the 'ignore_sticky_posts' argument. ([68970](https://github.com/WordPress/gutenberg/pull/68970)) +- Fix: Prevent Errors in Header Processing and Encode URLs Properly. ([67780](https://github.com/WordPress/gutenberg/pull/67780)) + +#### Icons +- Fix the background, arrowUpLeft, keyboardReturn and square icons. ([69076](https://github.com/WordPress/gutenberg/pull/69076)) + +#### Font Library +- Refactor font variant components to use useId for checkbox IDs. ([69050](https://github.com/WordPress/gutenberg/pull/69050)) + +#### Block Directory +- Remove block icon from InstalledBlocksPrePublishPanel. ([69046](https://github.com/WordPress/gutenberg/pull/69046)) + +#### DataViews +- Fixed: Empty Pattern Overlap in Pattern Title in Dataviews Table Layout. ([68997](https://github.com/WordPress/gutenberg/pull/68997)) + +#### Media +- Add optional chain to sizes indexing of media details in edit-site. ([68995](https://github.com/WordPress/gutenberg/pull/68995)) + +#### CSS & Styling +- Enabled Full height in Additional CSS. ([68993](https://github.com/WordPress/gutenberg/pull/68993)) + +#### Block hooks +- Fix truncation of post content. ([68926](https://github.com/WordPress/gutenberg/pull/68926)) + +#### Interactivity API +- iAPI Router: Fix CSS rule order in some constructed style sheets. ([68923](https://github.com/WordPress/gutenberg/pull/68923)) +- iAPI Router: Revert "Handle styles assets on region-based navigation" ([69222](https://github.com/WordPress/gutenberg/pull/69222)) + + +### Accessibility + +#### Components +- Font Size Picker: Remove Custom option from FontSizePickerSelect dropdown. ([69038](https://github.com/WordPress/gutenberg/pull/69038)) + +#### Global Styles +- Add missing list role to the list of blocks in the global Styles. ([69027](https://github.com/WordPress/gutenberg/pull/69027)) + +#### Block API +- Block support: Preserve aria-label value in comment delimiter. ([69002](https://github.com/WordPress/gutenberg/pull/69002)) + +#### Block Editor +- [Block Editor]: A11y - Add and Update missing reduce-motion mixing. ([68417](https://github.com/WordPress/gutenberg/pull/68417)) + + +### Performance + +#### Post Editor +- Editor: Don't use selector shortcuts for the taxonomy queries. ([68998](https://github.com/WordPress/gutenberg/pull/68998)) +- Editor: Optimize 'PostAuthorCheck' component data selection. ([69105](https://github.com/WordPress/gutenberg/pull/69105)) + +#### Style Book +- Improve StyleBook resize responsiveness for Classic Theme. ([68980](https://github.com/WordPress/gutenberg/pull/68980)) + + +### Documentation + +- Added Missing Global Documentation. ([69104](https://github.com/WordPress/gutenberg/pull/69104)) +- Changed Inline Document Order. ([68992](https://github.com/WordPress/gutenberg/pull/68992)) +- wp-env: Add lifecycleScripts to the schema. ([68724](https://github.com/WordPress/gutenberg/pull/68724)) + + +### Code Quality + +- Core Data: Add type for term entity. ([69151](https://github.com/WordPress/gutenberg/pull/69151)) +- iAPI Router: Add missing changelog entry for #68923. ([68945](https://github.com/WordPress/gutenberg/pull/68945)) + +#### Block Library +- E2E: Add regression test for spacer block in themes without spacing units. ([68913](https://github.com/WordPress/gutenberg/pull/68913)) +- Navigation Link Block: Use stable variable for underline color styling. ([68953](https://github.com/WordPress/gutenberg/pull/68953)) +- Regenerate block fixtures. ([68982](https://github.com/WordPress/gutenberg/pull/68982)) +- Social Links: Remove redundant reduce-motion mixin. ([69000](https://github.com/WordPress/gutenberg/pull/69000)) + +#### Site Editor +- Fast follow: Redirections of deprecated site editor URLs. ([68971](https://github.com/WordPress/gutenberg/pull/68971)) +- Quality: Remove unused props and styles from SidebarNavigationScreen. ([68972](https://github.com/WordPress/gutenberg/pull/68972)) + +#### Block Editor +- Inserter: Remove unused no-results-icon styles. ([69018](https://github.com/WordPress/gutenberg/pull/69018)) + + +### Tools + +- PR Template: Suggest linking the issue. ([68924](https://github.com/WordPress/gutenberg/pull/68924)) +- Relocate changelog file for WP#6910 to 6.9 backports. ([69068](https://github.com/WordPress/gutenberg/pull/69068)) + +#### Build Tooling +- Fix installing svn during deploys. ([69047](https://github.com/WordPress/gutenberg/pull/69047)) +- Remove `react-native` dependabot group. ([69118](https://github.com/WordPress/gutenberg/pull/69118)) + +#### Testing +- e2e: Fix "add new" selector. ([69111](https://github.com/WordPress/gutenberg/pull/69111)) + + +### Various + +- Remove react-native dependabot group - Take 2. ([69122](https://github.com/WordPress/gutenberg/pull/69122)) + +#### Plugin +- Code Quality: Delete unused function from PHP Sync Issue generation script. ([68947](https://github.com/WordPress/gutenberg/pull/68947)) +- npm scripts: Use `node -p` instead of `echo`. ([68946](https://github.com/WordPress/gutenberg/pull/68946)) + + +## First-time contributors + +The following PRs were merged by first-time contributors: + +- @benazeer-ben: RSS: Border & Spacing support. ([66411](https://github.com/WordPress/gutenberg/pull/66411)) +- @grgar: Add optional chain to sizes indexing of media details in edit-site. ([68995](https://github.com/WordPress/gutenberg/pull/68995)) +- @Gulamdastgir-Momin: Added discord in social links. ([68848](https://github.com/WordPress/gutenberg/pull/68848)) +- @Juzar10: Fix: Prevent Errors in Header Processing and Encode URLs Properly. ([67780](https://github.com/WordPress/gutenberg/pull/67780)) +- @singhakanshu00: Disable hover animation on preview frame for classic themes. ([68976](https://github.com/WordPress/gutenberg/pull/68976)) +- @srtfisher: wp-env: Add lifecycleScripts to the schema. ([68724](https://github.com/WordPress/gutenberg/pull/68724)) + + +## Contributors + +The following contributors merged PRs in this release: + +@adamsilverstein @afercia @akasunil @benazeer-ben @carolinan @DAreRodz @desrosj @ellatrix @grgar @Gulamdastgir-Momin @himanshupathak95 @Infinite-Null @joemcgill @Juzar10 @Mamaduka @Mayank-Tripathi32 @ockham @peterwilsoncc @Rishit30G @SainathPoojary @shail-mehta @shimotmk @singhakanshu00 @srtfisher @swissspidy @t-hamano @torounit @yogeshbhutkar + + = 20.3.0-rc.1 = From 9d1a2ce6c1c52436b722ce5e90d462fcfd05376a Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 18 Feb 2025 15:58:31 +0800 Subject: [PATCH 75/96] Fix preloading e2e test (#69228) --- test/e2e/specs/site-editor/preload.spec.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/e2e/specs/site-editor/preload.spec.js b/test/e2e/specs/site-editor/preload.spec.js index b6f9f49aedeb7..e618d70ca20b9 100644 --- a/test/e2e/specs/site-editor/preload.spec.js +++ b/test/e2e/specs/site-editor/preload.spec.js @@ -46,9 +46,6 @@ test.describe( 'Preload', () => { expect( requests ).toEqual( [ // Seems to be coming from `enableComplementaryArea`. '/wp/v2/users/me', - // There are two separate settings OPTIONS requests. We should fix - // so the one for canUser and getEntityRecord are reused. - '/wp/v2/settings', ] ); } ); } ); From d3a95861935d0a8ec92d9f0685343028769a447d Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Tue, 18 Feb 2025 16:39:10 +0100 Subject: [PATCH 76/96] Cover: Fix placeholder color options keyboard accessibility (#68662) * Render the color options as buttons. * Make circular option picker get a group role and optional label when rendered as buttons. * Adjust tests. * Adjust more tests. * Abstract logic to compute the common props. * Update snapshot. * Fix OptionGroup ARIA role. * Rename. * Adjust tests. * Restore group ARIA role on OptionGroup. * Change Background color label to Overlay color. Co-authored-by: afercia Co-authored-by: ciampo Co-authored-by: Mamaduka Co-authored-by: carolinan Co-authored-by: Mayank-Tripathi32 --- .../test/__snapshots__/control.js.snap | 2 +- .../block-library/src/cover/edit/index.js | 2 + packages/block-library/src/cover/test/edit.js | 12 +++--- .../src/border-box-control/test/index.tsx | 2 +- .../src/border-control/test/index.js | 2 +- .../src/circular-option-picker/README.md | 13 ++++++ .../circular-option-picker.tsx | 2 +- .../src/circular-option-picker/index.tsx | 1 + .../stories/index.story.tsx | 2 +- .../src/circular-option-picker/test/index.tsx | 1 + .../src/circular-option-picker/types.ts | 21 +++++----- .../src/circular-option-picker/utils.tsx | 27 +++++++++++++ .../components/src/color-palette/index.tsx | 40 +++++-------------- .../src/color-palette/test/index.tsx | 2 +- .../src/duotone-picker/duotone-picker.tsx | 38 +++++------------- .../components/src/gradient-picker/index.tsx | 38 +++++------------- test/e2e/specs/editor/blocks/buttons.spec.js | 4 +- test/e2e/specs/editor/blocks/cover.spec.js | 10 ++--- test/e2e/specs/editor/blocks/heading.spec.js | 2 +- .../specs/editor/various/list-view.spec.js | 6 +-- 20 files changed, 109 insertions(+), 118 deletions(-) create mode 100644 packages/components/src/circular-option-picker/utils.tsx diff --git a/packages/block-editor/src/components/color-palette/test/__snapshots__/control.js.snap b/packages/block-editor/src/components/color-palette/test/__snapshots__/control.js.snap index 3d082a14a92bf..eb665ced62079 100644 --- a/packages/block-editor/src/components/color-palette/test/__snapshots__/control.js.snap +++ b/packages/block-editor/src/components/color-palette/test/__snapshots__/control.js.snap @@ -203,7 +203,7 @@ exports[`ColorPaletteControl matches the snapshot 1`] = ` class="components-circular-option-picker" >
    diff --git a/packages/block-library/src/cover/edit/index.js b/packages/block-library/src/cover/edit/index.js index 1eafe99e283eb..b09093e312211 100644 --- a/packages/block-library/src/cover/edit/index.js +++ b/packages/block-library/src/cover/edit/index.js @@ -514,6 +514,8 @@ function CoverEdit( { value={ overlayColor.color } onChange={ onSetOverlayColor } clearable={ false } + asButtons + aria-label={ __( 'Overlay color' ) } />
    diff --git a/packages/block-library/src/cover/test/edit.js b/packages/block-library/src/cover/test/edit.js index 0a18d2cf3f9f8..16695f53f6746 100644 --- a/packages/block-library/src/cover/test/edit.js +++ b/packages/block-library/src/cover/test/edit.js @@ -47,7 +47,7 @@ async function setup( attributes, useCoreBlocks, customSettings ) { async function createAndSelectBlock() { await userEvent.click( - screen.getByRole( 'option', { + screen.getByRole( 'button', { name: 'Black', } ) ); @@ -72,7 +72,7 @@ describe( 'Cover block', () => { test( 'can set overlay color using color picker on block placeholder', async () => { const { container } = await setup(); - const colorPicker = screen.getByRole( 'option', { + const colorPicker = screen.getByRole( 'button', { name: 'Black', } ); await userEvent.click( colorPicker ); @@ -96,7 +96,7 @@ describe( 'Cover block', () => { await setup(); await userEvent.click( - screen.getByRole( 'option', { + screen.getByRole( 'button', { name: 'Black', } ) ); @@ -389,7 +389,7 @@ describe( 'Cover block', () => { describe( 'isDark settings', () => { test( 'should toggle is-light class if background changed from light to dark', async () => { await setup(); - const colorPicker = screen.getByRole( 'option', { + const colorPicker = screen.getByRole( 'button', { name: 'White', } ); await userEvent.click( colorPicker ); @@ -413,7 +413,7 @@ describe( 'Cover block', () => { } ); test( 'should remove is-light class if overlay color is removed', async () => { await setup(); - const colorPicker = screen.getByRole( 'option', { + const colorPicker = screen.getByRole( 'button', { name: 'White', } ); await userEvent.click( colorPicker ); @@ -426,7 +426,7 @@ describe( 'Cover block', () => { } ) ); await userEvent.click( screen.getByText( 'Overlay' ) ); - // The default color is black, so clicking the black color option will remove the background color, + // The default color is black, so clicking the black color button will remove the background color, // which should remove the isDark setting and assign the is-light class. const popupColorPicker = screen.getByRole( 'option', { name: 'White', diff --git a/packages/components/src/border-box-control/test/index.tsx b/packages/components/src/border-box-control/test/index.tsx index fb536656453f4..74501f7fccc7a 100644 --- a/packages/components/src/border-box-control/test/index.tsx +++ b/packages/components/src/border-box-control/test/index.tsx @@ -202,7 +202,7 @@ describe( 'BorderBoxControl', () => { await waitFor( () => expect( screen.getByRole( 'button', { - name: 'Custom color picker.', + name: 'Custom color picker', } ) ).toBeVisible() ); diff --git a/packages/components/src/border-control/test/index.js b/packages/components/src/border-control/test/index.js index ff9007be28f1a..c3e3987ed1351 100644 --- a/packages/components/src/border-control/test/index.js +++ b/packages/components/src/border-control/test/index.js @@ -138,7 +138,7 @@ describe( 'BorderControl', () => { const customColorPicker = getButton( /Custom color picker/ ); const circularOptionPicker = screen.getByRole( 'listbox', { - name: 'Custom color picker.', + name: 'Custom color picker', } ); const colorSwatchButtons = within( circularOptionPicker ).getAllByRole( 'option' ); diff --git a/packages/components/src/circular-option-picker/README.md b/packages/components/src/circular-option-picker/README.md index b6db6f06daf45..8a4d5ac3cf5ca 100644 --- a/packages/components/src/circular-option-picker/README.md +++ b/packages/components/src/circular-option-picker/README.md @@ -93,6 +93,19 @@ Prevents keyboard interaction from wrapping around. Only used when `asButtons` i - Required: No - Default: `true` +### `aria-labelledby`: `string` + +The ID reference list of one or more elements that label the wrapper element. + +- Required: No + +### `aria-label`: `string` + +The label for the wrapper element. Not used if an 'aria-labelledby' is provided. + +- Required: No +- Default: `Custom color picker` + ## Subcomponents ### `CircularOptionPicker.ButtonAction` diff --git a/packages/components/src/circular-option-picker/circular-option-picker.tsx b/packages/components/src/circular-option-picker/circular-option-picker.tsx index 8b6be8cd2215f..c4309ecf4dda3 100644 --- a/packages/components/src/circular-option-picker/circular-option-picker.tsx +++ b/packages/components/src/circular-option-picker/circular-option-picker.tsx @@ -132,7 +132,7 @@ function ButtonsCircularOptionPicker( ); return ( -
    +
    { options } { children } diff --git a/packages/components/src/circular-option-picker/index.tsx b/packages/components/src/circular-option-picker/index.tsx index ef975c21ee654..ef379994b476f 100644 --- a/packages/components/src/circular-option-picker/index.tsx +++ b/packages/components/src/circular-option-picker/index.tsx @@ -9,5 +9,6 @@ export { ButtonAction, DropdownLinkAction, } from './circular-option-picker-actions'; +export { getComputeCircularOptionPickerCommonProps } from './utils'; export default CircularOptionPicker; diff --git a/packages/components/src/circular-option-picker/stories/index.story.tsx b/packages/components/src/circular-option-picker/stories/index.story.tsx index 9d45c9bb92f7d..6b564929fd8eb 100644 --- a/packages/components/src/circular-option-picker/stories/index.story.tsx +++ b/packages/components/src/circular-option-picker/stories/index.story.tsx @@ -131,7 +131,7 @@ WithLoopingDisabled.parameters = { docs: { source: { code: `} />`, diff --git a/packages/components/src/circular-option-picker/test/index.tsx b/packages/components/src/circular-option-picker/test/index.tsx index a6e9f2c45a05c..7d58ed3920f9b 100644 --- a/packages/components/src/circular-option-picker/test/index.tsx +++ b/packages/components/src/circular-option-picker/test/index.tsx @@ -57,6 +57,7 @@ describe( 'CircularOptionPicker', () => { expect( screen.queryByRole( 'listbox' ) ).not.toBeInTheDocument(); expect( screen.queryByRole( 'option' ) ).not.toBeInTheDocument(); + expect( screen.getByRole( 'group' ) ).toBeInTheDocument(); expect( screen.getByRole( 'button' ) ).toBeInTheDocument(); } ); } ); diff --git a/packages/components/src/circular-option-picker/types.ts b/packages/components/src/circular-option-picker/types.ts index 411782aed575b..54fae3ab2e798 100644 --- a/packages/components/src/circular-option-picker/types.ts +++ b/packages/components/src/circular-option-picker/types.ts @@ -40,6 +40,16 @@ type CommonCircularOptionPickerProps = { * The child elements. */ children?: ReactNode; + /** + * The ID reference list of one or more elements that label the wrapper + * element. + */ + 'aria-labelledby'?: string; + /** + * The label for the wrapper element. Defaults to 'Custom color picker'. Not + * used if an 'aria-labelledby' is provided. + */ + 'aria-label'?: string; }; type WithBaseId = { @@ -59,16 +69,7 @@ type FullListboxCircularOptionPickerProps = CommonCircularOptionPickerProps & { * @default true */ loop?: boolean; -} & ( - | { - 'aria-label': string; - 'aria-labelledby'?: never; - } - | { - 'aria-label'?: never; - 'aria-labelledby': string; - } - ); +}; export type ListboxCircularOptionPickerProps = WithBaseId & Omit< FullListboxCircularOptionPickerProps, 'asButtons' >; diff --git a/packages/components/src/circular-option-picker/utils.tsx b/packages/components/src/circular-option-picker/utils.tsx new file mode 100644 index 0000000000000..fcb3b2bcac369 --- /dev/null +++ b/packages/components/src/circular-option-picker/utils.tsx @@ -0,0 +1,27 @@ +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Computes the common props for the CircularOptionPicker. + */ +export function getComputeCircularOptionPickerCommonProps( + asButtons?: boolean, + loop?: boolean, + ariaLabel?: string, + ariaLabelledby?: string +) { + const metaProps = asButtons + ? { asButtons: true } + : { asButtons: false, loop }; + + const labelProps = { + 'aria-labelledby': ariaLabelledby, + 'aria-label': ariaLabelledby + ? undefined + : ariaLabel || __( 'Custom color picker' ), + }; + + return { metaProps, labelProps }; +} diff --git a/packages/components/src/color-palette/index.tsx b/packages/components/src/color-palette/index.tsx index de4e4f4206fe3..eb981e8b9acc7 100644 --- a/packages/components/src/color-palette/index.tsx +++ b/packages/components/src/color-palette/index.tsx @@ -19,7 +19,9 @@ import { useCallback, useMemo, useState, forwardRef } from '@wordpress/element'; */ import Dropdown from '../dropdown'; import { ColorPicker } from '../color-picker'; -import CircularOptionPicker from '../circular-option-picker'; +import CircularOptionPicker, { + getComputeCircularOptionPickerCommonProps, +} from '../circular-option-picker'; import { VStack } from '../v-stack'; import { Truncate } from '../truncate'; import { ColorHeading } from './styles'; @@ -233,7 +235,7 @@ function UnforwardedColorPalette( buttonLabelName, displayValue ) - : __( 'Custom color picker.' ); + : __( 'Custom color picker' ); const paletteCommonProps = { clearColor, @@ -251,33 +253,12 @@ function UnforwardedColorPalette( ); - let metaProps: - | { asButtons: false; loop?: boolean; 'aria-label': string } - | { asButtons: false; loop?: boolean; 'aria-labelledby': string } - | { asButtons: true }; - - if ( asButtons ) { - metaProps = { asButtons: true }; - } else { - const _metaProps: { asButtons: false; loop?: boolean } = { - asButtons: false, - loop, - }; - - if ( ariaLabel ) { - metaProps = { ..._metaProps, 'aria-label': ariaLabel }; - } else if ( ariaLabelledby ) { - metaProps = { - ..._metaProps, - 'aria-labelledby': ariaLabelledby, - }; - } else { - metaProps = { - ..._metaProps, - 'aria-label': __( 'Custom color picker.' ), - }; - } - } + const { metaProps, labelProps } = getComputeCircularOptionPickerCommonProps( + asButtons, + loop, + ariaLabel, + ariaLabelledby + ); return ( @@ -335,6 +316,7 @@ function UnforwardedColorPalette( { ( colors.length > 0 || actions ) && ( { expect( screen.queryByText( colorCode ) ).not.toBeInTheDocument(); expect( screen.getByRole( 'button', { - name: /^Custom color picker.$/, + name: /^Custom color picker$/, } ) ).toBeInTheDocument(); } ); diff --git a/packages/components/src/duotone-picker/duotone-picker.tsx b/packages/components/src/duotone-picker/duotone-picker.tsx index 8764b401c3829..a21d12b73a65c 100644 --- a/packages/components/src/duotone-picker/duotone-picker.tsx +++ b/packages/components/src/duotone-picker/duotone-picker.tsx @@ -13,7 +13,9 @@ import { __, sprintf } from '@wordpress/i18n'; * Internal dependencies */ import ColorListPicker from './color-list-picker'; -import CircularOptionPicker from '../circular-option-picker'; +import CircularOptionPicker, { + getComputeCircularOptionPickerCommonProps, +} from '../circular-option-picker'; import { VStack } from '../v-stack'; import CustomDuotoneBar from './custom-duotone-bar'; @@ -127,33 +129,12 @@ function DuotonePicker( { ); } ); - let metaProps: - | { asButtons: false; loop?: boolean; 'aria-label': string } - | { asButtons: false; loop?: boolean; 'aria-labelledby': string } - | { asButtons: true }; - - if ( asButtons ) { - metaProps = { asButtons: true }; - } else { - const _metaProps: { asButtons: false; loop?: boolean } = { - asButtons: false, - loop, - }; - - if ( ariaLabel ) { - metaProps = { ..._metaProps, 'aria-label': ariaLabel }; - } else if ( ariaLabelledby ) { - metaProps = { - ..._metaProps, - 'aria-labelledby': ariaLabelledby, - }; - } else { - metaProps = { - ..._metaProps, - 'aria-label': __( 'Custom color picker.' ), - }; - } - } + const { metaProps, labelProps } = getComputeCircularOptionPickerCommonProps( + asButtons, + loop, + ariaLabel, + ariaLabelledby + ); const options = unsetable ? [ unsetOption, ...duotoneOptions ] @@ -163,6 +144,7 @@ function DuotonePicker( { ) { ); - let metaProps: - | { asButtons: false; loop?: boolean; 'aria-label': string } - | { asButtons: false; loop?: boolean; 'aria-labelledby': string } - | { asButtons: true }; - - if ( asButtons ) { - metaProps = { asButtons: true }; - } else { - const _metaProps: { asButtons: false; loop?: boolean } = { - asButtons: false, - loop, - }; - - if ( ariaLabel ) { - metaProps = { ..._metaProps, 'aria-label': ariaLabel }; - } else if ( ariaLabelledby ) { - metaProps = { - ..._metaProps, - 'aria-labelledby': ariaLabelledby, - }; - } else { - metaProps = { - ..._metaProps, - 'aria-label': __( 'Custom color picker.' ), - }; - } - } + const { metaProps, labelProps } = getComputeCircularOptionPickerCommonProps( + asButtons, + loop, + ariaLabel, + ariaLabelledby + ); return ( diff --git a/test/e2e/specs/editor/blocks/buttons.spec.js b/test/e2e/specs/editor/blocks/buttons.spec.js index 554bd8947f0bf..7830a934529aa 100644 --- a/test/e2e/specs/editor/blocks/buttons.spec.js +++ b/test/e2e/specs/editor/blocks/buttons.spec.js @@ -324,13 +324,13 @@ test.describe( 'Buttons', () => { await page.click( 'role=region[name="Editor settings"i] >> role=button[name="Text"i]' ); - await page.click( 'role=button[name="Custom color picker."i]' ); + await page.click( 'role=button[name="Custom color picker"i]' ); await page.fill( 'role=textbox[name="Hex color"i]', 'ff0000' ); await page.click( 'role=region[name="Editor settings"i] >> role=button[name="Background"i]' ); - await page.click( 'role=button[name="Custom color picker."i]' ); + await page.click( 'role=button[name="Custom color picker"i]' ); await page.fill( 'role=textbox[name="Hex color"i]', '00ff00' ); // Check the content. diff --git a/test/e2e/specs/editor/blocks/cover.spec.js b/test/e2e/specs/editor/blocks/cover.spec.js index 87c244a7306dc..bee2548c2305d 100644 --- a/test/e2e/specs/editor/blocks/cover.spec.js +++ b/test/e2e/specs/editor/blocks/cover.spec.js @@ -33,7 +33,7 @@ test.describe( 'Cover', () => { } ); // Locate the Black color swatch. - const blackColorSwatch = coverBlock.getByRole( 'option', { + const blackColorSwatch = coverBlock.getByRole( 'button', { name: 'Black', } ); await expect( blackColorSwatch ).toBeVisible(); @@ -105,7 +105,7 @@ test.describe( 'Cover', () => { // Choose a color swatch to transform the placeholder block into // a functioning block. await coverBlock - .getByRole( 'option', { + .getByRole( 'button', { name: 'Black', } ) .click(); @@ -128,7 +128,7 @@ test.describe( 'Cover', () => { name: 'Block: Cover', } ); await coverBlock - .getByRole( 'option', { + .getByRole( 'button', { name: 'Black', } ) .click(); @@ -240,7 +240,7 @@ test.describe( 'Cover', () => { // Choose a color swatch to transform the placeholder block into // a functioning block. await coverBlock - .getByRole( 'option', { + .getByRole( 'button', { name: 'Black', } ) .click(); @@ -266,7 +266,7 @@ test.describe( 'Cover', () => { // Choose a color swatch to transform the placeholder block into // a functioning block. await secondCoverBlock - .getByRole( 'option', { + .getByRole( 'button', { name: 'Black', } ) .click(); diff --git a/test/e2e/specs/editor/blocks/heading.spec.js b/test/e2e/specs/editor/blocks/heading.spec.js index 906095cad9d08..6ff7e11bb334e 100644 --- a/test/e2e/specs/editor/blocks/heading.spec.js +++ b/test/e2e/specs/editor/blocks/heading.spec.js @@ -184,7 +184,7 @@ test.describe( 'Heading', () => { await textColor.click(); await page - .getByRole( 'button', { name: /Custom color picker./i } ) + .getByRole( 'button', { name: /Custom color picker/i } ) .click(); await page diff --git a/test/e2e/specs/editor/various/list-view.spec.js b/test/e2e/specs/editor/various/list-view.spec.js index 988683c8d11aa..98dfe5e304f80 100644 --- a/test/e2e/specs/editor/various/list-view.spec.js +++ b/test/e2e/specs/editor/various/list-view.spec.js @@ -162,10 +162,10 @@ test.describe( 'List View', () => { // make the inner blocks appear. await editor.canvas .getByRole( 'document', { name: 'Block: Cover' } ) - .getByRole( 'listbox', { - name: 'Custom color picker.', + .getByRole( 'group', { + name: 'Overlay color', } ) - .getByRole( 'option' ) + .getByRole( 'button' ) .first() .click(); From 1ede5106fd4b872de8780852f1b9152f218f979d Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Tue, 18 Feb 2025 17:20:23 +0100 Subject: [PATCH 77/96] Fix CSS classes for the post editor iframe body. (#68481) * Fix CSS classes for the post editor iframe body. * Remove canvas loader CSS animation for testing purposes. * Restore canvas loader CSS animation previously removed for testing purposes. * Add test theme and post editor tests. * Add tests for the site editor. Co-authored-by: afercia Co-authored-by: carolinan Co-authored-by: Mamaduka Co-authored-by: ellatrix Co-authored-by: richtabor Co-authored-by: colinduwe --- .../src/components/iframe/index.js | 29 +++---- .../block-editor-dark-background.spec.js | 52 +++++++++++++ .../site-editor-dark-background.spec.js | 75 +++++++++++++++++++ .../darktheme/block-templates/index.html | 11 +++ .../darktheme/block-templates/singular.html | 2 + .../gutenberg-test-themes/darktheme/index.php | 9 +++ .../gutenberg-test-themes/darktheme/style.css | 15 ++++ .../darktheme/theme.json | 10 +++ 8 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 test/e2e/specs/editor/various/block-editor-dark-background.spec.js create mode 100644 test/e2e/specs/site-editor/site-editor-dark-background.spec.js create mode 100644 test/gutenberg-test-themes/darktheme/block-templates/index.html create mode 100644 test/gutenberg-test-themes/darktheme/block-templates/singular.html create mode 100644 test/gutenberg-test-themes/darktheme/index.php create mode 100644 test/gutenberg-test-themes/darktheme/style.css create mode 100644 test/gutenberg-test-themes/darktheme/theme.json diff --git a/packages/block-editor/src/components/iframe/index.js b/packages/block-editor/src/components/iframe/index.js index 3ae01525a8010..8411430dfbdad 100644 --- a/packages/block-editor/src/components/iframe/index.js +++ b/packages/block-editor/src/components/iframe/index.js @@ -131,8 +131,23 @@ function Iframe( { function preventFileDropDefault( event ) { event.preventDefault(); } + + const { ownerDocument } = node; + + // Ideally ALL classes that are added through get_body_class should + // be added in the editor too, which we'll somehow have to get from + // the server in the future (which will run the PHP filters). + setBodyClasses( + Array.from( ownerDocument.body.classList ).filter( + ( name ) => + name.startsWith( 'admin-color-' ) || + name.startsWith( 'post-type-' ) || + name === 'wp-embed-responsive' + ) + ); + function onLoad() { - const { contentDocument, ownerDocument } = node; + const { contentDocument } = node; const { documentElement } = contentDocument; iFrameDocument = contentDocument; @@ -140,18 +155,6 @@ function Iframe( { clearerRef( documentElement ); - // Ideally ALL classes that are added through get_body_class should - // be added in the editor too, which we'll somehow have to get from - // the server in the future (which will run the PHP filters). - setBodyClasses( - Array.from( ownerDocument.body.classList ).filter( - ( name ) => - name.startsWith( 'admin-color-' ) || - name.startsWith( 'post-type-' ) || - name === 'wp-embed-responsive' - ) - ); - contentDocument.dir = ownerDocument.dir; for ( const compatStyle of getCompatibilityStyles() ) { diff --git a/test/e2e/specs/editor/various/block-editor-dark-background.spec.js b/test/e2e/specs/editor/various/block-editor-dark-background.spec.js new file mode 100644 index 0000000000000..dc333f31c7ed9 --- /dev/null +++ b/test/e2e/specs/editor/various/block-editor-dark-background.spec.js @@ -0,0 +1,52 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +test.describe( 'Block editor with dark background theme', () => { + test.beforeAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'darktheme' ); + } ); + + test.beforeEach( async ( { admin } ) => { + await admin.createNewPost(); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'twentytwentyone' ); + } ); + + test.describe( 'Block editor iframe body', () => { + test( 'Should have the is-dark-theme CSS class', async ( { + editor, + } ) => { + const canvasBody = editor.canvas.locator( 'body' ); + + await expect( canvasBody ).toHaveClass( /is-dark-theme/ ); + } ); + } ); +} ); + +test.describe( 'Block editor with light background theme', () => { + test.beforeAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'twentytwentyfour' ); + } ); + + test.beforeEach( async ( { admin } ) => { + await admin.createNewPost(); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'twentytwentyone' ); + } ); + + test.describe( 'Block editor iframe body', () => { + test( 'Should not have the is-dark-theme CSS class', async ( { + editor, + } ) => { + const canvasBody = editor.canvas.locator( 'body' ); + + await expect( canvasBody ).not.toHaveClass( /is-dark-theme/ ); + } ); + } ); +} ); diff --git a/test/e2e/specs/site-editor/site-editor-dark-background.spec.js b/test/e2e/specs/site-editor/site-editor-dark-background.spec.js new file mode 100644 index 0000000000000..1bf49c196bdfc --- /dev/null +++ b/test/e2e/specs/site-editor/site-editor-dark-background.spec.js @@ -0,0 +1,75 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +test.describe( 'Site editor with dark background theme', () => { + test.beforeAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'darktheme' ); + } ); + + test.beforeEach( async ( { admin } ) => { + await admin.visitSiteEditor(); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'twentytwentyone' ); + } ); + + test.describe( 'Site editor iframe body', () => { + test( 'Should have the is-dark-theme CSS class', async ( { + editor, + } ) => { + const canvasBody = editor.canvas.locator( 'body' ); + + await expect( canvasBody ).toHaveClass( /is-dark-theme/ ); + } ); + } ); +} ); + +test.describe( 'Site editor with light background theme and theme variations', () => { + test.beforeAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'twentytwentyfour' ); + } ); + + test.beforeEach( async ( { admin } ) => { + await admin.visitSiteEditor(); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( 'twentytwentyone' ); + } ); + + test.describe( 'Site editor iframe body', () => { + test( 'Should not have the is-dark-theme CSS class', async ( { + editor, + } ) => { + const canvasBody = editor.canvas.locator( 'body' ); + + await expect( canvasBody ).not.toHaveClass( /is-dark-theme/ ); + } ); + + test( 'Should add and remove the is-dark-theme CSS class with dark and light theme variation', async ( { + page, + editor, + } ) => { + // Click "Styles" + await page.getByRole( 'button', { name: 'Styles' } ).click(); + + // Click "Browse styles" + await page.getByRole( 'button', { name: 'Browse styles' } ).click(); + + const canvasBody = editor.canvas.locator( 'body' ); + + // Activate "Maelstrom" Theme Variation. + await page.getByRole( 'button', { name: 'Maelstrom' } ).click(); + + await expect( canvasBody ).toHaveClass( /is-dark-theme/ ); + + // Activate "Ember" Theme Variation. + await page.getByRole( 'button', { name: 'Ember' } ).click(); + + await expect( canvasBody ).not.toHaveClass( /is-dark-theme/ ); + } ); + } ); +} ); diff --git a/test/gutenberg-test-themes/darktheme/block-templates/index.html b/test/gutenberg-test-themes/darktheme/block-templates/index.html new file mode 100644 index 0000000000000..0283daeb54c6f --- /dev/null +++ b/test/gutenberg-test-themes/darktheme/block-templates/index.html @@ -0,0 +1,11 @@ + +
    + + + + +
    + + +

    My awesome paragraph

    + diff --git a/test/gutenberg-test-themes/darktheme/block-templates/singular.html b/test/gutenberg-test-themes/darktheme/block-templates/singular.html new file mode 100644 index 0000000000000..cd05d5fe917fe --- /dev/null +++ b/test/gutenberg-test-themes/darktheme/block-templates/singular.html @@ -0,0 +1,2 @@ + + diff --git a/test/gutenberg-test-themes/darktheme/index.php b/test/gutenberg-test-themes/darktheme/index.php new file mode 100644 index 0000000000000..0c6530acc1aaf --- /dev/null +++ b/test/gutenberg-test-themes/darktheme/index.php @@ -0,0 +1,9 @@ + Date: Wed, 19 Feb 2025 00:03:53 +0530 Subject: [PATCH 78/96] Docs: Add Documentation for Adding Block Variations Using get_block_type_variations Hook (#68434) * Update doc to add PHP strategy to register block variations * Update example code * Add callout with link to relevant blog post --------- Co-authored-by: JuanMa --- .../block-api/block-variations.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/reference-guides/block-api/block-variations.md b/docs/reference-guides/block-api/block-variations.md index 8a0c6b1dd5bd6..8c223e54eea29 100644 --- a/docs/reference-guides/block-api/block-variations.md +++ b/docs/reference-guides/block-api/block-variations.md @@ -60,6 +60,44 @@ wp.blocks.registerBlockVariation( 'core/embed', { } ); ``` +## Registering block variations in PHP + +Block variations can also be registered from PHP using the `get_block_type_variations` filter hook. This approach is particularly useful when you need to dynamically generate variations based on registered post types, taxonomies, or other WordPress data. + +Here's an example of how to register a custom variation for the `core/image` block: + +```php +function my_custom_image_variation( $variations, $block_type ) { + // Only modify variations for the image block + if ( 'core/image' !== $block_type->name ) { + return $variations; + } + + // Add a custom variation + $variations[] = array( + 'name' => 'wide-image', + 'title' => __( 'Wide image', 'textdomain' ), + 'description' => __( 'A wide image', 'textdomain' ), + 'scope' => array( 'inserter' ), + 'isDefault' => false, + 'attributes' => array( + 'align' => 'wide', // Identifies the link type as custom + ), + ); + + return $variations; +} +add_filter( 'get_block_type_variations', 'my_custom_image_variation', 10, 2 ); +``` + +The `get_block_type_variations` filter is called when variations are requested for a block type. It receives two parameters: +- `$variations`: An array of currently registered variations for the block type +- `$block_type`: The full block type object + +Note that variations registered through PHP will be merged with any variations registered through JavaScript using `registerBlockVariation()`. + +
    Check the How to register block variations with PHP blog post for more info about this
    + ## Removing a block variation Block variations can also be easily removed. To do so, use `wp.blocks.unregisterBlockVariation()`. This function accepts the name of the block and the `name` of the variation that should be unregistered. From 90ee09a5d28b68f1e2cd5291709de0da06f7418e Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Wed, 19 Feb 2025 08:34:46 +0100 Subject: [PATCH 79/96] Make navigation block wavy underline more visible on dark backgrounds. (#69004) Co-authored-by: afercia Co-authored-by: Mamaduka Co-authored-by: Rishit30G Co-authored-by: hanneslsm --- .../src/navigation-link/editor.scss | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/packages/block-library/src/navigation-link/editor.scss b/packages/block-library/src/navigation-link/editor.scss index b27c4520921fd..5034c6f909ecd 100644 --- a/packages/block-library/src/navigation-link/editor.scss +++ b/packages/block-library/src/navigation-link/editor.scss @@ -82,30 +82,9 @@ // Draw a wavy underline. .wp-block-navigation-link__placeholder-text { span { - $blur: 10%; - $width: 6%; - $stop1: 30%; - $stop2: 64%; - - --wp-underline-color: var(--wp-admin-theme-color); - - background-image: - linear-gradient(45deg, transparent ($stop1 - $blur), var(--wp-underline-color) $stop1, var(--wp-underline-color) ($stop1 + $width), transparent ($stop1 + $width + $blur)), - linear-gradient(135deg, transparent ($stop2 - $blur), var(--wp-underline-color) $stop2, var(--wp-underline-color) ($stop2 + $width), transparent ($stop2 + $width + $blur)); - background-position: 0 100%; - background-size: 6px 3px; - background-repeat: repeat-x; - - // Since applied to a span, it doesn't change the footprint of the item, - // but it does vertically shift the underline to better align. - padding-bottom: 0.1em; - } - - &.is-invalid, - &.is-draft { - span { - --wp-underline-color: #{$alert-red}; - } + text-decoration: wavy underline; + text-decoration-skip-ink: none; + text-underline-offset: 0.25rem; } } From f017b64dcf58dff5d89a9f00efdd7be956f7a33d Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 19 Feb 2025 11:11:17 +0000 Subject: [PATCH 80/96] Bump plugin version to 20.3.0 --- gutenberg.php | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gutenberg.php b/gutenberg.php index 1ef51115ec932..5814650073768 100644 --- a/gutenberg.php +++ b/gutenberg.php @@ -5,7 +5,7 @@ * Description: Printing since 1440. This is the development plugin for the block editor, site editor, and other future WordPress core functionality. * Requires at least: 6.6 * Requires PHP: 7.2 - * Version: 20.3.0-rc.2 + * Version: 20.3.0 * Author: Gutenberg Team * Text Domain: gutenberg * diff --git a/package-lock.json b/package-lock.json index 1c0795c90bcc9..a8bbafbfc2eb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gutenberg", - "version": "20.3.0-rc.2", + "version": "20.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gutenberg", - "version": "20.3.0-rc.2", + "version": "20.3.0", "hasInstallScript": true, "license": "GPL-2.0-or-later", "workspaces": [ diff --git a/package.json b/package.json index 2984502a07a5d..0737c415f71c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "20.3.0-rc.2", + "version": "20.3.0", "private": true, "description": "A new WordPress editor experience.", "author": "The WordPress Contributors", From 4ad117cdba18f81e8c9756b38d14e02d0ee4cad1 Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:04:09 +0900 Subject: [PATCH 81/96] Site Editor: show pattern category step in navigation for mobile (#69206) Co-authored-by: t-hamano Co-authored-by: stokesman --- .../components/site-editor-routes/patterns.js | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/edit-site/src/components/site-editor-routes/patterns.js b/packages/edit-site/src/components/site-editor-routes/patterns.js index db97c4b5c080f..785528f09afb0 100644 --- a/packages/edit-site/src/components/site-editor-routes/patterns.js +++ b/packages/edit-site/src/components/site-editor-routes/patterns.js @@ -1,8 +1,27 @@ +/** + * WordPress dependencies + */ +import { privateApis as routerPrivateApis } from '@wordpress/router'; + /** * Internal dependencies */ import SidebarNavigationScreenPatterns from '../sidebar-navigation-screen-patterns'; import PagePatterns from '../page-patterns'; +import { unlock } from '../../lock-unlock'; + +const { useLocation } = unlock( routerPrivateApis ); + +function MobilePatternsView() { + const { query = {} } = useLocation(); + const { categoryId } = query; + + return !! categoryId ? ( + + ) : ( + + ); +} export const patternsRoute = { name: 'patterns', @@ -10,6 +29,6 @@ export const patternsRoute = { areas: { sidebar: , content: , - mobile: , + mobile: , }, }; From 099b3a3029ba970d2c1cf6af2ec462983b292a6f Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Wed, 19 Feb 2025 17:35:40 +0530 Subject: [PATCH 82/96] Added Missing Global Documentation in Query Total Block (#69233) * Added Missing Global Documentation * Fix PHPCS Issue Co-authored-by: shail-mehta Co-authored-by: t-hamano --- packages/block-library/src/query-total/index.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/block-library/src/query-total/index.php b/packages/block-library/src/query-total/index.php index ff2ac486727b9..ba99b32460133 100644 --- a/packages/block-library/src/query-total/index.php +++ b/packages/block-library/src/query-total/index.php @@ -10,6 +10,8 @@ * * @since 6.8.0 * + * @global WP_Query $wp_query WordPress Query object. + * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. From 3639ac4843c4cd7f4464ca5e945489f0f5b2e670 Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 19 Feb 2025 12:06:43 +0000 Subject: [PATCH 83/96] Update Changelog for 20.3.0 --- changelog.txt | 186 +------------------------------------------------- 1 file changed, 1 insertion(+), 185 deletions(-) diff --git a/changelog.txt b/changelog.txt index 3a8e2bafd9567..9f6e6f652c2b0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ == Changelog == -= 20.3.0-rc.2 = += 20.3.0 = ## Changelog @@ -184,190 +184,6 @@ The following contributors merged PRs in this release: @adamsilverstein @afercia @akasunil @benazeer-ben @carolinan @DAreRodz @desrosj @ellatrix @grgar @Gulamdastgir-Momin @himanshupathak95 @Infinite-Null @joemcgill @Juzar10 @Mamaduka @Mayank-Tripathi32 @ockham @peterwilsoncc @Rishit30G @SainathPoojary @shail-mehta @shimotmk @singhakanshu00 @srtfisher @swissspidy @t-hamano @torounit @yogeshbhutkar -= 20.3.0-rc.1 = - - -## Changelog - -### Enhancements - -- Disable hover animation on preview frame for classic themes. ([68976](https://github.com/WordPress/gutenberg/pull/68976)) - -#### Block Library -- Added discord in social links. ([68848](https://github.com/WordPress/gutenberg/pull/68848)) -- Featured Image block: Use resolution tool component. ([68471](https://github.com/WordPress/gutenberg/pull/68471)) -- Query block: Add option to ignore sticky posts behavior. ([69057](https://github.com/WordPress/gutenberg/pull/69057)) -- RSS: Border & Spacing support. ([66411](https://github.com/WordPress/gutenberg/pull/66411)) - -#### Global Styles -- Disable Clear button if there's no shadow. ([69092](https://github.com/WordPress/gutenberg/pull/69092)) -- Duotone Settings: Add `reset` button and improve toggle rendering in FiltersPanel. ([68672](https://github.com/WordPress/gutenberg/pull/68672)) -- Shadow Panel: Add reset button. ([68981](https://github.com/WordPress/gutenberg/pull/68981)) - -#### Post Editor -- Editor: Add loading state to the 'PageAttributesParent' component. ([69062](https://github.com/WordPress/gutenberg/pull/69062)) -- Editor: Add loading state to the 'PostAuthorCombobox' component. ([68991](https://github.com/WordPress/gutenberg/pull/68991)) -- Editor: Display error message when loading current post fails. ([68999](https://github.com/WordPress/gutenberg/pull/68999)) - -#### Block Editor -- Quick Inserter: Restore pattern search and insertion. ([69028](https://github.com/WordPress/gutenberg/pull/69028)) -- Update keyboard shortcuts to use `primaryShift+backspace` for block deletion. ([69074](https://github.com/WordPress/gutenberg/pull/69074)) - -#### Design Tools -- Archives: Add Color Support. ([68685](https://github.com/WordPress/gutenberg/pull/68685)) -- Categories: Add Color Support. ([68686](https://github.com/WordPress/gutenberg/pull/68686)) - -#### Components -- ComboboxControl: Add an `isLoading` prop to show a loading spinner. ([68990](https://github.com/WordPress/gutenberg/pull/68990)) - - -### Bug Fixes - -- Exclude Iterator helpers from polyfills. ([69070](https://github.com/WordPress/gutenberg/pull/69070)) -- Fix Dependabot ignore statements. ([69144](https://github.com/WordPress/gutenberg/pull/69144)) - -#### Block Editor -- Block popover: Fix scrolling over. ([68075](https://github.com/WordPress/gutenberg/pull/68075)) -- Display root appender when default block is disabled. ([68951](https://github.com/WordPress/gutenberg/pull/68951)) -- Fix regression for root appender logic. ([68994](https://github.com/WordPress/gutenberg/pull/68994)) -- Inserter: Remove block default icon from no results message. ([68693](https://github.com/WordPress/gutenberg/pull/68693)) -- Rename `aspect` property to `ratio` to carry the `defaultAspect` in `AspectRatioDropdown`. ([69085](https://github.com/WordPress/gutenberg/pull/69085)) -- Writing Flow: Restore early return for no block selection in tab nav hook. ([69079](https://github.com/WordPress/gutenberg/pull/69079)) - -#### Site Editor -- Edit Site: Fix Fields package private APIs error. ([68964](https://github.com/WordPress/gutenberg/pull/68964)) -- Fix: Site Editor should display a 404 message. ([69009](https://github.com/WordPress/gutenberg/pull/69009)) -- Use the same editor component for all routes. ([69093](https://github.com/WordPress/gutenberg/pull/69093)) - -#### Global Styles -- Fix: Additional CSS button not working after back navigation. ([68954](https://github.com/WordPress/gutenberg/pull/68954)) -- Fix: Missing 'No blocks found.' message for block search in editor. ([69036](https://github.com/WordPress/gutenberg/pull/69036)) - -#### Block Library -- Query Block: Fix 'parents' argument validation. ([68983](https://github.com/WordPress/gutenberg/pull/68983)) -- Social Links: Fix appender size in non-iframe editor. ([68215](https://github.com/WordPress/gutenberg/pull/68215)) - -#### REST API -- Add support for the 'ignore_sticky_posts' argument. ([68970](https://github.com/WordPress/gutenberg/pull/68970)) -- Fix: Prevent Errors in Header Processing and Encode URLs Properly. ([67780](https://github.com/WordPress/gutenberg/pull/67780)) - -#### Icons -- Fix the background, arrowUpLeft, keyboardReturn and square icons. ([69076](https://github.com/WordPress/gutenberg/pull/69076)) - -#### Font Library -- Refactor font variant components to use useId for checkbox IDs. ([69050](https://github.com/WordPress/gutenberg/pull/69050)) - -#### Block Directory -- Remove block icon from InstalledBlocksPrePublishPanel. ([69046](https://github.com/WordPress/gutenberg/pull/69046)) - -#### DataViews -- Fixed: Empty Pattern Overlap in Pattern Title in Dataviews Table Layout. ([68997](https://github.com/WordPress/gutenberg/pull/68997)) - -#### Media -- Add optional chain to sizes indexing of media details in edit-site. ([68995](https://github.com/WordPress/gutenberg/pull/68995)) - -#### CSS & Styling -- Enabled Full height in Additional CSS. ([68993](https://github.com/WordPress/gutenberg/pull/68993)) - -#### Block hooks -- Fix truncation of post content. ([68926](https://github.com/WordPress/gutenberg/pull/68926)) - -#### Interactivity API -- iAPI Router: Fix CSS rule order in some constructed style sheets. ([68923](https://github.com/WordPress/gutenberg/pull/68923)) - - -### Accessibility - -#### Components -- Font Size Picker: Remove Custom option from FontSizePickerSelect dropdown. ([69038](https://github.com/WordPress/gutenberg/pull/69038)) - -#### Global Styles -- Add missing list role to the list of blocks in the global Styles. ([69027](https://github.com/WordPress/gutenberg/pull/69027)) - -#### Block API -- Block support: Preserve aria-label value in comment delimiter. ([69002](https://github.com/WordPress/gutenberg/pull/69002)) - -#### Block Editor -- [Block Editor]: A11y - Add and Update missing reduce-motion mixing. ([68417](https://github.com/WordPress/gutenberg/pull/68417)) - - -### Performance - -#### Post Editor -- Editor: Don't use selector shortcuts for the taxonomy queries. ([68998](https://github.com/WordPress/gutenberg/pull/68998)) -- Editor: Optimize 'PostAuthorCheck' component data selection. ([69105](https://github.com/WordPress/gutenberg/pull/69105)) - -#### Style Book -- Improve StyleBook resize responsiveness for Classic Theme. ([68980](https://github.com/WordPress/gutenberg/pull/68980)) - - -### Documentation - -- Added Missing Global Documentation. ([69104](https://github.com/WordPress/gutenberg/pull/69104)) -- Changed Inline Document Order. ([68992](https://github.com/WordPress/gutenberg/pull/68992)) -- wp-env: Add lifecycleScripts to the schema. ([68724](https://github.com/WordPress/gutenberg/pull/68724)) - - -### Code Quality - -- Core Data: Add type for term entity. ([69151](https://github.com/WordPress/gutenberg/pull/69151)) -- iAPI Router: Add missing changelog entry for #68923. ([68945](https://github.com/WordPress/gutenberg/pull/68945)) - -#### Block Library -- E2E: Add regression test for spacer block in themes without spacing units. ([68913](https://github.com/WordPress/gutenberg/pull/68913)) -- Navigation Link Block: Use stable variable for underline color styling. ([68953](https://github.com/WordPress/gutenberg/pull/68953)) -- Regenerate block fixtures. ([68982](https://github.com/WordPress/gutenberg/pull/68982)) -- Social Links: Remove redundant reduce-motion mixin. ([69000](https://github.com/WordPress/gutenberg/pull/69000)) - -#### Site Editor -- Fast follow: Redirections of deprecated site editor URLs. ([68971](https://github.com/WordPress/gutenberg/pull/68971)) -- Quality: Remove unused props and styles from SidebarNavigationScreen. ([68972](https://github.com/WordPress/gutenberg/pull/68972)) - -#### Block Editor -- Inserter: Remove unused no-results-icon styles. ([69018](https://github.com/WordPress/gutenberg/pull/69018)) - - -### Tools - -- PR Template: Suggest linking the issue. ([68924](https://github.com/WordPress/gutenberg/pull/68924)) -- Relocate changelog file for WP#6910 to 6.9 backports. ([69068](https://github.com/WordPress/gutenberg/pull/69068)) - -#### Build Tooling -- Fix installing svn during deploys. ([69047](https://github.com/WordPress/gutenberg/pull/69047)) -- Remove `react-native` dependabot group. ([69118](https://github.com/WordPress/gutenberg/pull/69118)) - -#### Testing -- e2e: Fix "add new" selector. ([69111](https://github.com/WordPress/gutenberg/pull/69111)) - - -### Various - -- Remove react-native dependabot group - Take 2. ([69122](https://github.com/WordPress/gutenberg/pull/69122)) - -#### Plugin -- Code Quality: Delete unused function from PHP Sync Issue generation script. ([68947](https://github.com/WordPress/gutenberg/pull/68947)) -- npm scripts: Use `node -p` instead of `echo`. ([68946](https://github.com/WordPress/gutenberg/pull/68946)) - - -## First-time contributors - -The following PRs were merged by first-time contributors: - -- @benazeer-ben: RSS: Border & Spacing support. ([66411](https://github.com/WordPress/gutenberg/pull/66411)) -- @grgar: Add optional chain to sizes indexing of media details in edit-site. ([68995](https://github.com/WordPress/gutenberg/pull/68995)) -- @Gulamdastgir-Momin: Added discord in social links. ([68848](https://github.com/WordPress/gutenberg/pull/68848)) -- @Juzar10: Fix: Prevent Errors in Header Processing and Encode URLs Properly. ([67780](https://github.com/WordPress/gutenberg/pull/67780)) -- @singhakanshu00: Disable hover animation on preview frame for classic themes. ([68976](https://github.com/WordPress/gutenberg/pull/68976)) -- @srtfisher: wp-env: Add lifecycleScripts to the schema. ([68724](https://github.com/WordPress/gutenberg/pull/68724)) - - -## Contributors - -The following contributors merged PRs in this release: - -@adamsilverstein @afercia @akasunil @benazeer-ben @carolinan @DAreRodz @desrosj @ellatrix @grgar @Gulamdastgir-Momin @himanshupathak95 @Infinite-Null @joemcgill @Juzar10 @Mamaduka @Mayank-Tripathi32 @ockham @peterwilsoncc @Rishit30G @SainathPoojary @shail-mehta @shimotmk @singhakanshu00 @srtfisher @swissspidy @t-hamano @torounit @yogeshbhutkar - - = 20.0.1 = ## Changelog From 8df9b70ce51d1b0892c981b8cb421fa3b26c0106 Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:38:59 +0900 Subject: [PATCH 84/96] Notice: Fix text contrast for dark mode (#69226) Co-authored-by: t-hamano Co-authored-by: carolinan Co-authored-by: ciampo --- packages/components/CHANGELOG.md | 4 ++++ packages/components/src/notice/style.scss | 1 + 2 files changed, 5 insertions(+) diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index f425baae72617..6917427ef1571 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -9,6 +9,10 @@ - `NumberControl`: Fix invalid HTML attributes for infinite bounds ([#69033](https://github.com/WordPress/gutenberg/pull/69033)). +### Bug Fixes + +- `Notice`: Fix text contrast for dark mode ([#69226](https://github.com/WordPress/gutenberg/pull/69226)). + ## 29.4.0 (2025-02-12) - `FontSizePicker`: Remove Custom option from dropdown to prevent unexpected context changes during keyboard navigation ([#69038](https://github.com/WordPress/gutenberg/pull/69038)). diff --git a/packages/components/src/notice/style.scss b/packages/components/src/notice/style.scss index a2d6aca530a93..9cfc2b983a491 100644 --- a/packages/components/src/notice/style.scss +++ b/packages/components/src/notice/style.scss @@ -6,6 +6,7 @@ border-left: 4px solid $components-color-accent; padding: 8px 12px; align-items: center; + color: $gray-900; &.is-dismissible { position: relative; From 8c0db8e5b1dda64c317bbcec86896c675b49b0f9 Mon Sep 17 00:00:00 2001 From: Bernie Reiter <96308+ockham@users.noreply.github.com> Date: Wed, 19 Feb 2025 14:51:48 +0100 Subject: [PATCH 85/96] Block Hooks: Enable first/last child insertion next to Classic block (#69241)x Allow insertion of a hooked block as the first or last child of the Post Content block (and, less importantly, of the Synced Pattern and Navigation blocks). Co-authored-by: ockham Co-authored-by: gziolo Co-authored-by: t-hamano --- backport-changelog/6.8/8212.md | 1 + lib/compat/wordpress-6.8/blocks.php | 30 +++++ .../specs/editor/plugins/block-hooks.spec.js | 121 +++++++++++++++++- 3 files changed, 149 insertions(+), 3 deletions(-) diff --git a/backport-changelog/6.8/8212.md b/backport-changelog/6.8/8212.md index 30483af9e7b71..2a0019eae2809 100644 --- a/backport-changelog/6.8/8212.md +++ b/backport-changelog/6.8/8212.md @@ -2,3 +2,4 @@ https://github.com/WordPress/wordpress-develop/pull/8212 * https://github.com/WordPress/gutenberg/pull/68926 * https://github.com/WordPress/gutenberg/pull/69142 +* https://github.com/WordPress/gutenberg/pull/69241 diff --git a/lib/compat/wordpress-6.8/blocks.php b/lib/compat/wordpress-6.8/blocks.php index 7fd4237bc81d3..ba6d23b2486b8 100644 --- a/lib/compat/wordpress-6.8/blocks.php +++ b/lib/compat/wordpress-6.8/blocks.php @@ -36,6 +36,25 @@ function apply_block_hooks_to_content_from_post_object( $content, WP_Post $post return apply_block_hooks_to_content( $content, $post, $callback ); } + /* + * If the content was created using the classic editor or using a single Classic block + * (`core/freeform`), it might not contain any block markup at all. + * However, we still might need to inject hooked blocks in the first child or last child + * positions of the parent block. To be able to apply the Block Hooks algorithm, we wrap + * the content in a `core/freeform` wrapper block. + */ + if ( ! has_blocks( $content ) ) { + $original_content = $content; + + $content_wrapped_in_classic_block = get_comment_delimited_block_content( + 'core/freeform', + array(), + $content + ); + + $content = $content_wrapped_in_classic_block; + } + $attributes = array(); // If context is a post object, `ignoredHookedBlocks` information is stored in its post meta. @@ -71,6 +90,17 @@ function apply_block_hooks_to_content_from_post_object( $content, WP_Post $post // Finally, we need to remove the temporary wrapper block. $content = remove_serialized_parent_block( $content ); + // If we wrapped the content in a `core/freeform` block, we also need to remove that. + if ( ! empty( $content_wrapped_in_classic_block ) ) { + /* + * We cannot simply use remove_serialized_parent_block() here, + * as that function assumes that the block wrapper is at the top level. + * However, there might now be a hooked block inserted next to it + * (as first or last child of the parent). + */ + $content = str_replace( $content_wrapped_in_classic_block, $original_content, $content ); + } + return $content; } // We need to apply this filter before `do_blocks` (which is hooked to `the_content` at priority 9). diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index ec78db6b3a8fe..969f8ebb7091e 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -3,12 +3,14 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -const dummyBlockContent = ` +const dummyBlocksContent = `

    This is a dummy heading

    This is a dummy paragraph.

    `; +const dummyClassicContent = + '

    This is a dummy heading

    This is a dummy paragraph.

    '; const getHookedBlockClassName = ( relativePosition, anchorBlock ) => `hooked-block-${ relativePosition }-${ anchorBlock.replace( @@ -34,13 +36,13 @@ test.describe( 'Block Hooks API', () => { createMethod: 'createBlock', }, ].forEach( ( { name, postType, blockType, createMethod } ) => { - test.describe( `Hooked blocks in ${ name }`, () => { + test.describe( `Hooked blocks in ${ name } (blocks)`, () => { let postObject, containerPost; test.beforeAll( async ( { requestUtils } ) => { postObject = await requestUtils[ createMethod ]( { title: name, status: 'publish', - content: dummyBlockContent, + content: dummyBlocksContent, } ); await requestUtils.activatePlugin( @@ -162,6 +164,119 @@ test.describe( 'Block Hooks API', () => { ] ); } ); } ); + + test.describe( `Hooked blocks in ${ name } (classic)`, () => { + let postObject, containerPost; + test.beforeAll( async ( { requestUtils } ) => { + postObject = await requestUtils[ createMethod ]( { + title: name, + status: 'publish', + content: dummyClassicContent, + } ); + + await requestUtils.activatePlugin( + 'gutenberg-test-block-hooks' + ); + + if ( postType !== 'post' ) { + // We need a container post to hold our block instance. + containerPost = await requestUtils.createPost( { + title: `Block Hooks in ${ name }`, + status: 'publish', + content: ``, + meta: { + // Prevent Block Hooks from injecting blocks into the container + // post content so they won't distract from the ones injected + // into the block instance. + _wp_ignored_hooked_blocks: '["core/paragraph"]', + }, + } ); + } else { + containerPost = postObject; + } + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( + 'gutenberg-test-block-hooks' + ); + + await requestUtils.deleteAllPosts(); + await requestUtils.deleteAllBlocks(); + } ); + + test( `should insert hooked blocks into ${ name } on frontend`, async ( { + page, + } ) => { + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.entry-content > *' ) + ).toHaveClass( [ + 'dummy-heading', + 'dummy-paragraph', + getHookedBlockClassName( 'last_child', blockType ), + ] ); + } ); + + test( `should insert hooked blocks into ${ name } in editor and respect changes made there`, async ( { + admin, + editor, + page, + } ) => { + const expectedHookedBlockLastChild = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + blockType + ), + }, + }; + + await admin.editPost( postObject.id ); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/freeform' }, + expectedHookedBlockLastChild, + ] ); + + const hookedBlock = editor.canvas.getByText( + getHookedBlockContent( 'last_child', blockType ) + ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move up' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + expectedHookedBlockLastChild, + { name: 'core/freeform' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.entry-content > *' ) + ).toHaveClass( [ + getHookedBlockClassName( 'last_child', blockType ), + 'dummy-heading', + 'dummy-paragraph', + ] ); + } ); + } ); } ); test.describe( 'Hooked blocks in Navigation Menu', () => { From 67a07a721c77eeebf47df43729fcb182ae0ee0cd Mon Sep 17 00:00:00 2001 From: Gutenberg Repository Automation Date: Wed, 19 Feb 2025 18:46:47 +0000 Subject: [PATCH 86/96] Update Changelog for 20.0.2 --- changelog.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/changelog.txt b/changelog.txt index 9f6e6f652c2b0..68e13890ff280 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,13 @@ == Changelog == += 20.0.2 = + +### Bug Fixes + +#### Block Editor +- Fix 'isBlockVisibleInTheInserter' selector helper performance ([68898](https://github.com/WordPress/gutenberg/pull/68898)) + + = 20.3.0 = ## Changelog From 1756bacc6ee76b68f602c4ed2e6bc640b95baec5 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Thu, 20 Feb 2025 19:36:44 +0800 Subject: [PATCH 87/96] Core Data: Allow 'null' as raw attribute value (#69257) Co-authored-by: Mamaduka Co-authored-by: tyxla Co-authored-by: TimothyBJacobs --- packages/core-data/src/selectors.ts | 5 ++- packages/core-data/src/test/selectors.js | 42 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/core-data/src/selectors.ts b/packages/core-data/src/selectors.ts index c31ebc0425464..64ff340afd0c2 100644 --- a/packages/core-data/src/selectors.ts +++ b/packages/core-data/src/selectors.ts @@ -465,7 +465,10 @@ export const getRawEntityRecord = createSelector( // Because edits are the "raw" attribute values, // we return those from record selectors to make rendering, // comparisons, and joins with edits easier. - accumulator[ _key ] = record[ _key ]?.raw ?? record[ _key ]; + accumulator[ _key ] = + record[ _key ]?.raw !== undefined + ? record[ _key ]?.raw + : record[ _key ]; } else { accumulator[ _key ] = record[ _key ]; } diff --git a/packages/core-data/src/test/selectors.js b/packages/core-data/src/test/selectors.js index 4b5e8417ad202..0330865e95957 100644 --- a/packages/core-data/src/test/selectors.js +++ b/packages/core-data/src/test/selectors.js @@ -332,6 +332,48 @@ describe( 'getRawEntityRecord', () => { }, } ); } ); + it( 'should allow `null` as raw value', () => { + const state = deepFreeze( { + entities: { + config: [ + { + kind: 'someKind', + name: 'someName', + rawAttributes: [ 'title' ], + }, + ], + records: { + someKind: { + someName: { + queriedData: { + items: { + default: { + post: { + title: { + raw: null, + rendered: 'Placeholder', + }, + }, + }, + }, + itemIsComplete: { + default: { + post: true, + }, + }, + queries: {}, + }, + }, + }, + }, + }, + } ); + expect( + getRawEntityRecord( state, 'someKind', 'someName', 'post' ) + ).toEqual( { + title: null, + } ); + } ); } ); describe( 'getEntityRecords', () => { From 0f7193c79886abbb0c0132e58897cdd596698a2f Mon Sep 17 00:00:00 2001 From: Ankit Kumar Shah Date: Thu, 20 Feb 2025 18:12:00 +0530 Subject: [PATCH 88/96] Enhance 404 message styling (#69234) * Enhance 404 message styling with Notice component * Improve 404 error message * Remove color style from `.edit-site-layout__area__404` * Update 404 notice implementation with reusable component * Fixed DOM nesting validation error by replacing p with div Co-authored-by: Infinite-Null Co-authored-by: t-hamano Co-authored-by: joedolson Co-authored-by: carolinan --- .../src/components/layout/style.scss | 4 ---- .../sidebar-navigation-screen/index.js | 4 ++-- .../components/site-editor-routes/notfound.js | 19 +++++++++++++++---- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/edit-site/src/components/layout/style.scss b/packages/edit-site/src/components/layout/style.scss index 16813e8ac0494..caf7dd78da4b3 100644 --- a/packages/edit-site/src/components/layout/style.scss +++ b/packages/edit-site/src/components/layout/style.scss @@ -262,10 +262,6 @@ html.canvas-mode-edit-transition::view-transition-group(toggle) { } } -.edit-site-layout__area__404 { - margin: $canvas-padding; -} - .edit-site .components-editor-notices__snackbar { position: fixed; right: 0; diff --git a/packages/edit-site/src/components/sidebar-navigation-screen/index.js b/packages/edit-site/src/components/sidebar-navigation-screen/index.js index 473b28245eaee..f5f7e380467c2 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen/index.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen/index.js @@ -122,9 +122,9 @@ export default function SidebarNavigationScreen( {
    { description && ( -

    +

    { description } -

    +
    ) } { content }
    diff --git a/packages/edit-site/src/components/site-editor-routes/notfound.js b/packages/edit-site/src/components/site-editor-routes/notfound.js index ee15e28e06f25..2a42eb48f10eb 100644 --- a/packages/edit-site/src/components/site-editor-routes/notfound.js +++ b/packages/edit-site/src/components/site-editor-routes/notfound.js @@ -6,8 +6,19 @@ import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import { Notice, __experimentalSpacer as Spacer } from '@wordpress/components'; import SidebarNavigationScreenMain from '../sidebar-navigation-screen-main'; +function NotFoundError() { + return ( + + { __( + 'The requested page could not be found. Please check the URL.' + ) } + + ); +} + export const notFoundRoute = { name: 'notfound', path: '*', @@ -15,13 +26,13 @@ export const notFoundRoute = { sidebar: , mobile: ( } /> ), content: ( -

    - { __( '404 (Not Found)' ) } -

    + + + ), }, }; From c300edfebb48f79f6f0f6643ce04dd73303c5fcb Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Thu, 20 Feb 2025 12:44:27 -0800 Subject: [PATCH 89/96] Introduce `withSyncEvent` action wrapper utility and proxy `event` object whenever it is not used (#68097) * Implement withSyncEvent action wrapper utility. * Prepare Interactivity API infrastructure for awareness of action prior to evaluating it. * Proxy event object when withSyncEvent() is not used. * Ensure generator functions using withSyncEvent() are wrapped correctly to still be recognized as generator functions. * Update Interactivity API documentation to reference withSyncEvent(). * Use withSyncEvent() in all built-in actions that require it. * Minor fixes for withSyncEvent docs. * Clarify documentation. Co-authored-by: Weston Ruter * Enhance withSyncEvent implementation and ensure the sync flag is maintained when proxying functions via withScope. * Add doc block for wrapEventAsync(). * Use more specific types for event proxy handler. * Amend callback in withSyncEvent instead of wrapping it. * Revert "Prepare Interactivity API infrastructure for awareness of action prior to evaluating it." This reverts commit dba93ec4f7bb617d1f12ba1a06acfa39ff33d4b3. * Update evaluate() to no longer invoke functions (except where needed for BC) and move responsibility to the caller. * Export withSyncEvent * Fix evaluate to return scoped function and always reset scope. * Update custom directives for e2e tests to account for evaluate behavior change. * Update release version number in documentation. --------- Co-authored-by: Weston Ruter Co-authored-by: Luis Herranz --- .../interactivity-api/api-reference.md | 46 ++++++- packages/block-library/src/image/view.js | 15 ++- packages/block-library/src/navigation/view.js | 11 +- packages/block-library/src/query/view.js | 11 +- packages/block-library/src/search/view.js | 11 +- .../interactive-blocks/directive-each/view.js | 7 +- .../interactive-blocks/directive-init/view.js | 6 +- .../directive-on-document/view.js | 6 +- .../directive-on-window/view.js | 6 +- .../directive-priorities/view.js | 26 +++- .../interactive-blocks/directive-run/view.js | 8 +- .../directive-watch/view.js | 6 +- .../get-server-context/view.js | 11 +- .../get-server-state/view.js | 11 +- .../router-navigate/view.js | 6 +- .../interactive-blocks/router-regions/view.js | 6 +- .../interactive-blocks/tovdom-islands/view.js | 6 +- packages/interactivity-router/README.md | 7 +- packages/interactivity/src/directives.tsx | 119 ++++++++++++++++-- packages/interactivity/src/hooks.tsx | 25 +++- packages/interactivity/src/index.ts | 1 + packages/interactivity/src/utils.ts | 52 ++++++-- 22 files changed, 334 insertions(+), 69 deletions(-) diff --git a/docs/reference-guides/interactivity-api/api-reference.md b/docs/reference-guides/interactivity-api/api-reference.md index bbbb565684c57..bf2c1370ebcde 100644 --- a/docs/reference-guides/interactivity-api/api-reference.md +++ b/docs/reference-guides/interactivity-api/api-reference.md @@ -873,6 +873,8 @@ const { state } = store( 'myPlugin', { } ); ``` +You may want to add multiple such `yield` points in your action if it is doing a lot of work. + As mentioned above with [`wp-on`](#wp-on), [`wp-on-window`](#wp-on-window), and [`wp-on-document`](#wp-on-document), an async action should be used whenever the `async` versions of the aforementioned directives cannot be used due to the action requiring synchronous access to the `event` object. Synchronous access is required whenever the action needs to call `event.preventDefault()`, `event.stopPropagation()`, or `event.stopImmediatePropagation()`. To ensure that the action code does not contribute to a long task, you may manually yield to the main thread after calling the synchronous event API. For example: ```js @@ -885,16 +887,17 @@ function splitTask() { store( 'myPlugin', { actions: { - handleClick: function* ( event ) { + handleClick: withSyncEvent( function* ( event ) { event.preventDefault(); yield splitTask(); doTheWork(); - }, + } ), }, } ); ``` -You may want to add multiple such `yield` points in your action if it is doing a lot of work. +You may notice the use of the [`withSyncEvent()`](#withsyncevent) utility function in this example. This is necessary due to an ongoing effort to handle store actions asynchronously by default, unless they require synchronous event access (which this example does due to the call to `event.preventDefault()`). Otherwise a deprecation warning will be triggered, and in a future release the behavior will change accordingly. + #### Side Effects @@ -1253,6 +1256,43 @@ store( 'mySliderPlugin', { } ); ``` +### withSyncEvent() + +Actions that require synchronous access to the `event` object need to use the `withSyncEvent()` function to annotate their handler callback. This is necessary due to an ongoing effort to handle store actions asynchronously by default, unless they require synchronous event access. Therefore, as of Gutenberg 20.4 / WordPress 6.8 all actions that require synchronous event access need to use the `withSyncEvent()` function. Otherwise a deprecation warning will be triggered, and in a future release the behavior will change accordingly. + +Only very specific event methods and properties require synchronous access, so it is advised to only use `withSyncEvent()` when necessary. The following event methods and properties require synchronous access: + +* `event.currentTarget` +* `event.preventDefault()` +* `event.stopImmediatePropagation()` +* `event.stopPropagation()` + +Here is an example, where one action requires synchronous event access while the other actions do not: + +```js +// store +import { store, withSyncEvent } from '@wordpress/interactivity'; + +store( 'myPlugin', { + actions: { + // `event.preventDefault()` requires synchronous event access. + preventNavigation: withSyncEvent( ( event ) => { + event.preventDefault(); + } ), + + // `event.target` does not require synchronous event access. + logTarget: ( event ) => { + console.log( 'event target => ', event.target ); + }, + + // Not using `event` at all does not require synchronous event access. + logSomething: () => { + console.log( 'something' ); + }, + }, +} ); +``` + ## Server functions The Interactivity API comes with handy functions that allow you to initialize and reference configuration options on the server. This is necessary to feed the initial data that the Server Directive Processing will use to modify the HTML markup before it's send to the browser. It is also a great way to leverage many of WordPress's APIs, like nonces, AJAX, and translations. diff --git a/packages/block-library/src/image/view.js b/packages/block-library/src/image/view.js index 3c9a729538813..71a492a570b2a 100644 --- a/packages/block-library/src/image/view.js +++ b/packages/block-library/src/image/view.js @@ -1,7 +1,12 @@ /** * WordPress dependencies */ -import { store, getContext, getElement } from '@wordpress/interactivity'; +import { + store, + getContext, + getElement, + withSyncEvent, +} from '@wordpress/interactivity'; /** * Tracks whether user is touching screen; used to differentiate behavior for @@ -128,7 +133,7 @@ const { state, actions, callbacks } = store( }, 450 ); } }, - handleKeydown( event ) { + handleKeydown: withSyncEvent( ( event ) => { if ( state.overlayEnabled ) { // Focuses the close button when the user presses the tab key. if ( event.key === 'Tab' ) { @@ -141,8 +146,8 @@ const { state, actions, callbacks } = store( actions.hideLightbox(); } } - }, - handleTouchMove( event ) { + } ), + handleTouchMove: withSyncEvent( ( event ) => { // On mobile devices, prevents triggering the scroll event because // otherwise the page jumps around when it resets the scroll position. // This also means that closing the lightbox requires that a user @@ -152,7 +157,7 @@ const { state, actions, callbacks } = store( if ( state.overlayEnabled ) { event.preventDefault(); } - }, + } ), handleTouchStart() { isTouching = true; }, diff --git a/packages/block-library/src/navigation/view.js b/packages/block-library/src/navigation/view.js index 9da7ab70d84f3..fd1fe33537b2f 100644 --- a/packages/block-library/src/navigation/view.js +++ b/packages/block-library/src/navigation/view.js @@ -1,7 +1,12 @@ /** * WordPress dependencies */ -import { store, getContext, getElement } from '@wordpress/interactivity'; +import { + store, + getContext, + getElement, + withSyncEvent, +} from '@wordpress/interactivity'; const focusableSelectors = [ 'a[href]', @@ -106,7 +111,7 @@ const { state, actions } = store( actions.openMenu( 'click' ); } }, - handleMenuKeydown( event ) { + handleMenuKeydown: withSyncEvent( ( event ) => { const { type, firstFocusableElement, lastFocusableElement } = getContext(); if ( state.menuOpenedBy.click ) { @@ -137,7 +142,7 @@ const { state, actions } = store( } } } - }, + } ), handleMenuFocusout( event ) { const { modal, type } = getContext(); // If focus is outside modal, and in the document, close menu diff --git a/packages/block-library/src/query/view.js b/packages/block-library/src/query/view.js index e23294a24e02e..fff12b16eac65 100644 --- a/packages/block-library/src/query/view.js +++ b/packages/block-library/src/query/view.js @@ -1,7 +1,12 @@ /** * WordPress dependencies */ -import { store, getContext, getElement } from '@wordpress/interactivity'; +import { + store, + getContext, + getElement, + withSyncEvent, +} from '@wordpress/interactivity'; const isValidLink = ( ref ) => ref && @@ -22,7 +27,7 @@ store( 'core/query', { actions: { - *navigate( event ) { + navigate: withSyncEvent( function* ( event ) { const ctx = getContext(); const { ref } = getElement(); const queryRef = ref.closest( @@ -42,7 +47,7 @@ store( const firstAnchor = `.wp-block-post-template a[href]`; queryRef.querySelector( firstAnchor )?.focus(); } - }, + } ), *prefetch() { const { ref } = getElement(); if ( isValidLink( ref ) ) { diff --git a/packages/block-library/src/search/view.js b/packages/block-library/src/search/view.js index 0e4c462a2e321..617e179b1dc88 100644 --- a/packages/block-library/src/search/view.js +++ b/packages/block-library/src/search/view.js @@ -1,7 +1,12 @@ /** * WordPress dependencies */ -import { store, getContext, getElement } from '@wordpress/interactivity'; +import { + store, + getContext, + getElement, + withSyncEvent, +} from '@wordpress/interactivity'; const { actions } = store( 'core/search', @@ -31,7 +36,7 @@ const { actions } = store( }, }, actions: { - openSearchInput( event ) { + openSearchInput: withSyncEvent( ( event ) => { const ctx = getContext(); const { ref } = getElement(); if ( ! ctx.isSearchInputVisible ) { @@ -39,7 +44,7 @@ const { actions } = store( ctx.isSearchInputVisible = true; ref.parentElement.querySelector( 'input' ).focus(); } - }, + } ), closeSearchInput() { const ctx = getContext(); ctx.isSearchInputVisible = false; diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-each/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-each/view.js index 7577810b6bb87..98fd1fdb5593d 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-each/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-each/view.js @@ -240,7 +240,12 @@ directive( 'priority-2-init', ( { directives: { 'priority-2-init': init }, evaluate } ) => { init.forEach( ( entry ) => { - useInit( () => evaluate( entry ) ); + useInit( () => { + const result = evaluate( entry ); + if ( typeof result === 'function' ) { + result(); + } + } ); } ); }, { priority: 2 } diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-init/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-init/view.js index a8c70a4a90720..c27fe8d534d86 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-init/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-init/view.js @@ -13,7 +13,11 @@ directive( 'show-mock', ( { directives: { 'show-mock': showMock }, element, evaluate } ) => { const entry = showMock.find( ( { suffix } ) => suffix === null ); - if ( ! evaluate( entry ) ) { + const result = evaluate( entry ); + if ( ! result ) { + return null; + } + if ( typeof result === 'function' && ! result() ) { return null; } return element; diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-on-document/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-on-document/view.js index b9689ac978f85..f7918f3c6bf53 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-on-document/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-on-document/view.js @@ -13,7 +13,11 @@ directive( 'show-mock', ( { directives: { 'show-mock': showMock }, element, evaluate } ) => { const entry = showMock.find( ( { suffix } ) => suffix === null ); - if ( ! evaluate( entry ) ) { + const result = evaluate( entry ); + if ( ! result ) { + return null; + } + if ( typeof result === 'function' && ! result() ) { return null; } return element; diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-on-window/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-on-window/view.js index ef72e266e1075..0c29b09e5a70c 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-on-window/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-on-window/view.js @@ -13,7 +13,11 @@ directive( 'show-mock', ( { directives: { 'show-mock': showMock }, element, evaluate } ) => { const entry = showMock.find( ( { suffix } ) => suffix === null ); - if ( ! evaluate( entry ) ) { + const result = evaluate( entry ); + if ( ! result ) { + return null; + } + if ( typeof result === 'function' && ! result() ) { return null; } return element; diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-priorities/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-priorities/view.js index 77f2f25c5f9a4..dd4cad1c32ed6 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-priorities/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-priorities/view.js @@ -58,10 +58,13 @@ directive( */ directive( 'test-attribute', ( { evaluate, element } ) => { executionProof( 'attribute' ); - const attributeValue = evaluate( { + let attributeValue = evaluate( { namespace, value: 'context.attribute', } ); + if ( typeof attributeValue === 'function' ) { + attributeValue = attributeValue(); + } useEffect( () => { element.ref.current.setAttribute( 'data-attribute', attributeValue ); }, [] ); @@ -76,7 +79,10 @@ directive( 'test-text', ( { evaluate, element } ) => { executionProof( 'text' ); - const textValue = evaluate( { namespace, value: 'context.text' } ); + let textValue = evaluate( { namespace, value: 'context.text' } ); + if ( typeof textValue === 'function' ) { + textValue = textValue(); + } element.props.children = h( 'p', { 'data-testid': 'text' }, textValue ); }, { priority: 12 } @@ -92,10 +98,22 @@ directive( ( { evaluate, element } ) => { executionProof( 'children' ); const updateAttribute = () => { - evaluate( { namespace, value: 'actions.updateAttribute' } ); + const result = evaluate( { + namespace, + value: 'actions.updateAttribute', + } ); + if ( typeof result === 'function' ) { + result(); + } }; const updateText = () => { - evaluate( { namespace, value: 'actions.updateText' } ); + const result = evaluate( { + namespace, + value: 'actions.updateText', + } ); + if ( typeof result === 'function' ) { + result(); + } }; element.props.children = h( 'div', diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-run/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-run/view.js index 125ac39204230..3b623baa43a09 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-run/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-run/view.js @@ -22,9 +22,11 @@ directive( evaluate, } ) => { const entry = showChildren.find( ( { suffix } ) => suffix === null ); - return evaluate( entry ) - ? element - : cloneElement( element, { children: null } ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } + return result ? element : cloneElement( element, { children: null } ); }, { priority: 9 } ); diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-watch/view.js b/packages/e2e-tests/plugins/interactive-blocks/directive-watch/view.js index ad035811a0bcd..bb533ef9a208a 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-watch/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-watch/view.js @@ -13,7 +13,11 @@ directive( 'show-mock', ( { directives: { 'show-mock': showMock }, element, evaluate } ) => { const entry = showMock.find( ( { suffix } ) => suffix === null ); - if ( ! evaluate( entry ) ) { + const result = evaluate( entry ); + if ( ! result ) { + return null; + } + if ( typeof result === 'function' && ! result() ) { return null; } return element; diff --git a/packages/e2e-tests/plugins/interactive-blocks/get-server-context/view.js b/packages/e2e-tests/plugins/interactive-blocks/get-server-context/view.js index 83f016e2eac16..d9eb2005cef88 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/get-server-context/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/get-server-context/view.js @@ -1,17 +1,22 @@ /** * WordPress dependencies */ -import { store, getContext, getServerContext } from '@wordpress/interactivity'; +import { + store, + getContext, + getServerContext, + withSyncEvent, +} from '@wordpress/interactivity'; store( 'test/get-server-context', { actions: { - *navigate( e ) { + navigate: withSyncEvent( function* ( e ) { e.preventDefault(); const { actions } = yield import( '@wordpress/interactivity-router' ); yield actions.navigate( e.target.href ); - }, + } ), attemptModification() { try { getServerContext().prop = 'updated from client'; diff --git a/packages/e2e-tests/plugins/interactive-blocks/get-server-state/view.js b/packages/e2e-tests/plugins/interactive-blocks/get-server-state/view.js index db2992ec4a586..23cd0c328aee6 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/get-server-state/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/get-server-state/view.js @@ -1,17 +1,22 @@ /** * WordPress dependencies */ -import { store, getServerState, getContext } from '@wordpress/interactivity'; +import { + store, + getServerState, + getContext, + withSyncEvent, +} from '@wordpress/interactivity'; const { state } = store( 'test/get-server-state', { actions: { - *navigate( e ) { + navigate: withSyncEvent( function* ( e ) { e.preventDefault(); const { actions } = yield import( '@wordpress/interactivity-router' ); yield actions.navigate( e.target.href ); - }, + } ), attemptModification() { try { getServerState().prop = 'updated from client'; diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-navigate/view.js b/packages/e2e-tests/plugins/interactive-blocks/router-navigate/view.js index bd1d6e1164779..266a989ada739 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/router-navigate/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/router-navigate/view.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { store } from '@wordpress/interactivity'; +import { store, withSyncEvent } from '@wordpress/interactivity'; const { state } = store( 'router', { state: { @@ -18,7 +18,7 @@ const { state } = store( 'router', { }, }, actions: { - *navigate( e ) { + navigate: withSyncEvent( function* ( e ) { e.preventDefault(); state.navigations.count += 1; @@ -38,7 +38,7 @@ const { state } = store( 'router', { if ( state.navigations.pending === 0 ) { state.status = 'idle'; } - }, + } ), toggleTimeout() { state.timeout = state.timeout === 10000 ? 0 : 10000; }, diff --git a/packages/e2e-tests/plugins/interactive-blocks/router-regions/view.js b/packages/e2e-tests/plugins/interactive-blocks/router-regions/view.js index f3468eb88aff0..a3a35d792755c 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/router-regions/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/router-regions/view.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { store, getContext } from '@wordpress/interactivity'; +import { store, getContext, withSyncEvent } from '@wordpress/interactivity'; const { state } = store( 'router-regions', { state: { @@ -17,13 +17,13 @@ const { state } = store( 'router-regions', { }, actions: { router: { - *navigate( e ) { + navigate: withSyncEvent( function* ( e ) { e.preventDefault(); const { actions } = yield import( '@wordpress/interactivity-router' ); yield actions.navigate( e.target.href ); - }, + } ), back() { history.back(); }, diff --git a/packages/e2e-tests/plugins/interactive-blocks/tovdom-islands/view.js b/packages/e2e-tests/plugins/interactive-blocks/tovdom-islands/view.js index 8016e931624a1..b4fc12a91a4f2 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/tovdom-islands/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/tovdom-islands/view.js @@ -14,7 +14,11 @@ directive( ( { directives: { 'show-mock': showMock }, element, evaluate } ) => { const entry = showMock.find( ( { suffix } ) => suffix === null ); - if ( ! evaluate( entry ) ) { + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } + if ( ! result ) { element.props.children = h( 'template', null, diff --git a/packages/interactivity-router/README.md b/packages/interactivity-router/README.md index b79e6b310e239..3491ad3b459a4 100644 --- a/packages/interactivity-router/README.md +++ b/packages/interactivity-router/README.md @@ -17,12 +17,13 @@ The package is intended to be imported dynamically in the `view.js` files of int ```js /* view.js */ -import { store } from '@wordpress/interactivity'; +import { store, withSyncEvent } from '@wordpress/interactivity'; // This is how you would typically use the navigate() action in your block. store( 'my-namespace/myblock', { actions: { - *goToPage( e ) { + // The withSyncEvent() utility needs to be used because preventDefault() requires synchronous event access. + goToPage: withSyncEvent( function* ( e ) { e.preventDefault(); // We import the package dynamically to reduce the initial JS bundle size. @@ -31,7 +32,7 @@ store( 'my-namespace/myblock', { '@wordpress/interactivity-router' ); yield actions.navigate( e.target.href ); - }, + } ), }, } ); ``` diff --git a/packages/interactivity/src/directives.tsx b/packages/interactivity/src/directives.tsx index bddd017b1c99d..4568eba013c3b 100644 --- a/packages/interactivity/src/directives.tsx +++ b/packages/interactivity/src/directives.tsx @@ -50,6 +50,54 @@ function deepClone< T >( source: T ): T { return source; } +/** + * Wraps event object to warn about access of synchronous properties and methods. + * + * For all store actions attached to an event listener the event object is proxied via this function, unless the action + * uses the `withSyncEvent()` utility to indicate that it requires synchronous access to the event object. + * + * At the moment, the proxied event only emits warnings when synchronous properties or methods are being accessed. In + * the future this will be changed and result in an error. The current temporary behavior allows implementers to update + * their relevant actions to use `withSyncEvent()`. + * + * For additional context, see https://github.com/WordPress/gutenberg/issues/64944. + * + * @param event Event object. + * @return Proxied event object. + */ +function wrapEventAsync( event: Event ) { + const handler = { + get( target: Event, prop: string | symbol, receiver: any ) { + const value = target[ prop ]; + switch ( prop ) { + case 'currentTarget': + warn( + `Accessing the synchronous event.${ prop } property in a store action without wrapping it in withSyncEvent() is deprecated and will stop working in WordPress 6.9. Please wrap the store action in withSyncEvent().` + ); + break; + case 'preventDefault': + case 'stopImmediatePropagation': + case 'stopPropagation': + warn( + `Using the synchronous event.${ prop }() function in a store action without wrapping it in withSyncEvent() is deprecated and will stop working in WordPress 6.9. Please wrap the store action in withSyncEvent().` + ); + break; + } + if ( value instanceof Function ) { + return function ( this: any, ...args: any[] ) { + return value.apply( + this === receiver ? target : this, + args + ); + }; + } + return value; + }, + }; + + return new Proxy( event, handler ); +} + const newRule = /(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g; const ruleClean = /\/\*[^]*?\*\/| +/g; @@ -102,7 +150,15 @@ const getGlobalEventDirective = ( .forEach( ( entry ) => { const eventName = entry.suffix.split( '--', 1 )[ 0 ]; useInit( () => { - const cb = ( event: Event ) => evaluate( entry, event ); + const cb = ( event: Event ) => { + const result = evaluate( entry ); + if ( typeof result === 'function' ) { + if ( ! result?.sync ) { + event = wrapEventAsync( event ); + } + result( event ); + } + }; const globalVar = type === 'window' ? window : document; globalVar.addEventListener( eventName, cb ); return () => globalVar.removeEventListener( eventName, cb ); @@ -128,7 +184,10 @@ const getGlobalAsyncEventDirective = ( useInit( () => { const cb = async ( event: Event ) => { await splitTask(); - evaluate( entry, event ); + const result = evaluate( entry ); + if ( typeof result === 'function' ) { + result( event ); + } }; const globalVar = type === 'window' ? window : document; globalVar.addEventListener( eventName, cb, { @@ -206,7 +265,10 @@ export default () => { start = performance.now(); } } - const result = evaluate( entry ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } if ( globalThis.IS_GUTENBERG_PLUGIN ) { if ( globalThis.SCRIPT_DEBUG ) { performance.measure( @@ -239,7 +301,10 @@ export default () => { start = performance.now(); } } - const result = evaluate( entry ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } if ( globalThis.IS_GUTENBERG_PLUGIN ) { if ( globalThis.SCRIPT_DEBUG ) { performance.measure( @@ -286,7 +351,13 @@ export default () => { start = performance.now(); } } - evaluate( entry, event ); + const result = evaluate( entry ); + if ( typeof result === 'function' ) { + if ( ! result?.sync ) { + event = wrapEventAsync( event ); + } + result( event ); + } if ( globalThis.IS_GUTENBERG_PLUGIN ) { if ( globalThis.SCRIPT_DEBUG ) { performance.measure( @@ -332,7 +403,10 @@ export default () => { } entries.forEach( async ( entry ) => { await splitTask(); - evaluate( entry, event ); + const result = evaluate( entry ); + if ( typeof result === 'function' ) { + result( event ); + } } ); }; } ); @@ -360,7 +434,10 @@ export default () => { .filter( isNonDefaultDirectiveSuffix ) .forEach( ( entry ) => { const className = entry.suffix; - const result = evaluate( entry ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } const currentClass = element.props.class || ''; const classFinder = new RegExp( `(^|\\s)${ className }(\\s|$)`, @@ -400,7 +477,10 @@ export default () => { directive( 'style', ( { directives: { style }, element, evaluate } ) => { style.filter( isNonDefaultDirectiveSuffix ).forEach( ( entry ) => { const styleProp = entry.suffix; - const result = evaluate( entry ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } element.props.style = element.props.style || {}; if ( typeof element.props.style === 'string' ) { element.props.style = cssStringToObject( element.props.style ); @@ -434,7 +514,10 @@ export default () => { directive( 'bind', ( { directives: { bind }, element, evaluate } ) => { bind.filter( isNonDefaultDirectiveSuffix ).forEach( ( entry ) => { const attribute = entry.suffix; - const result = evaluate( entry ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } element.props[ attribute ] = result; /* @@ -535,7 +618,10 @@ export default () => { } try { - const result = evaluate( entry ); + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } element.props.children = typeof result === 'object' ? null : result.toString(); } catch ( e ) { @@ -545,7 +631,13 @@ export default () => { // data-wp-run directive( 'run', ( { directives: { run }, evaluate } ) => { - run.forEach( ( entry ) => evaluate( entry ) ); + run.forEach( ( entry ) => { + let result = evaluate( entry ); + if ( typeof result === 'function' ) { + result = result(); + } + return result; + } ); } ); // data-wp-each--[item] @@ -567,7 +659,10 @@ export default () => { const [ entry ] = each; const { namespace } = entry; - const iterable = evaluate( entry ); + let iterable = evaluate( entry ); + if ( typeof iterable === 'function' ) { + iterable = iterable(); + } if ( typeof iterable?.[ Symbol.iterator ] !== 'function' ) { return; diff --git a/packages/interactivity/src/hooks.tsx b/packages/interactivity/src/hooks.tsx index 7899e3eafd228..3d75fb03aa728 100644 --- a/packages/interactivity/src/hooks.tsx +++ b/packages/interactivity/src/hooks.tsx @@ -231,6 +231,7 @@ const resolve = ( path: string, namespace: string ) => { // Generate the evaluate function. export const getEvaluate: GetEvaluate = ( { scope } ) => + // TODO: When removing the temporarily remaining `value( ...args )` call below, remove the `...args` parameter too. ( entry, ...args ) => { let { value: path, namespace } = entry; if ( typeof path !== 'string' ) { @@ -241,7 +242,29 @@ export const getEvaluate: GetEvaluate = path[ 0 ] === '!' && !! ( path = path.slice( 1 ) ); setScope( scope ); const value = resolve( path, namespace ); - const result = typeof value === 'function' ? value( ...args ) : value; + // Functions are returned without invoking them. + if ( typeof value === 'function' ) { + // Except if they have a negation operator present, for backward compatibility. + // This pattern is strongly discouraged and deprecated, and it will be removed in a near future release. + // TODO: Remove this condition to effectively ignore negation operator when provided with a function. + if ( hasNegationOperator ) { + warn( + 'Using a function with a negation operator is deprecated and will stop working in WordPress 6.9. Please use derived state instead.' + ); + const functionResult = ! value( ...args ); + resetScope(); + return functionResult; + } + // Reset scope before return and wrap the function so it will still run within the correct scope. + resetScope(); + return ( ...functionArgs: any[] ) => { + setScope( scope ); + const functionResult = value( ...functionArgs ); + resetScope(); + return functionResult; + }; + } + const result = value; resetScope(); return hasNegationOperator ? ! result : result; }; diff --git a/packages/interactivity/src/index.ts b/packages/interactivity/src/index.ts index 9d013e4e744ed..b7d68fd200705 100644 --- a/packages/interactivity/src/index.ts +++ b/packages/interactivity/src/index.ts @@ -27,6 +27,7 @@ export { useCallback, useMemo, splitTask, + withSyncEvent, } from './utils'; export { useState, useRef } from 'preact/hooks'; diff --git a/packages/interactivity/src/utils.ts b/packages/interactivity/src/utils.ts index d894d37a7b84b..7069088a8836b 100644 --- a/packages/interactivity/src/utils.ts +++ b/packages/interactivity/src/utils.ts @@ -30,6 +30,10 @@ declare global { } } +interface SyncAwareFunction extends Function { + sync?: boolean; +} + /** * Executes a callback function after the next frame is rendered. * @@ -135,11 +139,14 @@ export function withScope< ? Promise< Return > : never; export function withScope< Func extends Function >( func: Func ): Func; +export function withScope< Func extends SyncAwareFunction >( func: Func ): Func; export function withScope( func: ( ...args: unknown[] ) => unknown ) { const scope = getScope(); const ns = getNamespace(); + + let wrapped: Function; if ( func?.constructor?.name === 'GeneratorFunction' ) { - return async ( ...args: Parameters< typeof func > ) => { + wrapped = async ( ...args: Parameters< typeof func > ) => { const gen = func( ...args ) as Generator; let value: any; let it: any; @@ -171,17 +178,28 @@ export function withScope( func: ( ...args: unknown[] ) => unknown ) { return value; }; + } else { + wrapped = ( ...args: Parameters< typeof func > ) => { + setNamespace( ns ); + setScope( scope ); + try { + return func( ...args ); + } finally { + resetNamespace(); + resetScope(); + } + }; } - return ( ...args: Parameters< typeof func > ) => { - setNamespace( ns ); - setScope( scope ); - try { - return func( ...args ); - } finally { - resetNamespace(); - resetScope(); - } - }; + + // If function was annotated via `withSyncEvent()`, maintain the annotation. + const syncAware = func as SyncAwareFunction; + if ( syncAware.sync ) { + const syncAwareWrapped = wrapped as SyncAwareFunction; + syncAwareWrapped.sync = true; + return syncAwareWrapped; + } + + return wrapped; } /** @@ -374,3 +392,15 @@ export const isPlainObject = ( typeof candidate === 'object' && candidate.constructor === Object ); + +/** + * Indicates that the passed `callback` requires synchronous access to the event object. + * + * @param callback The event callback. + * @return Altered event callback. + */ +export function withSyncEvent( callback: Function ): SyncAwareFunction { + const syncAware = callback as SyncAwareFunction; + syncAware.sync = true; + return syncAware; +} From afd4d376fe08fdd1825bc9ee6017952c1e744e37 Mon Sep 17 00:00:00 2001 From: Shail Mehta Date: Fri, 21 Feb 2025 15:03:24 +0530 Subject: [PATCH 90/96] Post Comments Count: Add Border Support (#68223) * Post Comments Count: Add Border Support Co-authored-by: shail-mehta Co-authored-by: carolinan --- .../block-library/src/post-comments-count/block.json | 9 ++++++++- .../block-library/src/post-comments-count/style.scss | 4 ++++ packages/block-library/src/style.scss | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 packages/block-library/src/post-comments-count/style.scss diff --git a/packages/block-library/src/post-comments-count/block.json b/packages/block-library/src/post-comments-count/block.json index 796e6e3830236..4b195a8c928e6 100644 --- a/packages/block-library/src/post-comments-count/block.json +++ b/packages/block-library/src/post-comments-count/block.json @@ -39,8 +39,15 @@ "fontSize": true } }, + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true + }, "interactivity": { "clientNavigation": true } - } + }, + "style": "wp-block-post-comments-count" } diff --git a/packages/block-library/src/post-comments-count/style.scss b/packages/block-library/src/post-comments-count/style.scss new file mode 100644 index 0000000000000..c596ec200ab1f --- /dev/null +++ b/packages/block-library/src/post-comments-count/style.scss @@ -0,0 +1,4 @@ +.wp-block-post-comments-count { + // This block has customizable padding, border-box makes that more predictable. + box-sizing: border-box; +} diff --git a/packages/block-library/src/style.scss b/packages/block-library/src/style.scss index c61049c23151b..3c8b8e623cc4d 100644 --- a/packages/block-library/src/style.scss +++ b/packages/block-library/src/style.scss @@ -36,6 +36,7 @@ @import "./post-author/style.scss"; @import "./post-author-biography/style.scss"; @import "./post-comments-form/style.scss"; +@import "./post-comments-count/style.scss"; @import "./post-content/style.scss"; @import "./post-comments-link/style.scss"; @import "./post-date/style.scss"; From 563c89102c50c4972791a403d071fa1cac1119c5 Mon Sep 17 00:00:00 2001 From: Kelly Mears Date: Fri, 21 Feb 2025 08:45:05 -0500 Subject: [PATCH 91/96] docs: correction in plugin-sidebar-0.md (#69268) Code samples correctly identify `PluginSidebar` as requiring the `wp-editor` dependency, but the how-to text still references `wp-edit-post`. Co-authored-by: kellymears Co-authored-by: t-hamano --- docs/how-to-guides/plugin-sidebar-0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how-to-guides/plugin-sidebar-0.md b/docs/how-to-guides/plugin-sidebar-0.md index 76ef54bb9d308..495aa0a1d6b8b 100644 --- a/docs/how-to-guides/plugin-sidebar-0.md +++ b/docs/how-to-guides/plugin-sidebar-0.md @@ -42,7 +42,7 @@ Add the following code to a JavaScript file called `plugin-sidebar.js` and save } )( window.wp, window.React ); ``` -For this code to work, those utilities need to be available in the browser, so you must specify `wp-plugins`, `wp-edit-post`, and `react` as dependencies of your script. +For this code to work, those utilities need to be available in the browser, so you must specify `wp-plugins`, `wp-editor`, and `react` as dependencies of your script. Here is the PHP code to register your script and specify the dependencies: From b6bb01ab60a3c1d027ef910651bb57fd5b5fc777 Mon Sep 17 00:00:00 2001 From: Huub <50170696+huubl@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:50:21 +0100 Subject: [PATCH 92/96] Allow :focus-visible pseudo-selector to be set in theme.json (#68521) * Allow :focus-visible pseudo-selector to be set in theme.json Co-authored-by: huubl Co-authored-by: carolinan Co-authored-by: audrasjb Co-authored-by: joedolson Co-authored-by: sabernhardt Co-authored-by: afercia Co-authored-by: Bovelett --- backport-changelog/6.8/8261.md | 3 +++ .../themes/global-settings-and-styles.md | 2 +- lib/class-wp-theme-json-gutenberg.php | 13 +++++++++---- schemas/json/theme.json | 4 ++++ 4 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 backport-changelog/6.8/8261.md diff --git a/backport-changelog/6.8/8261.md b/backport-changelog/6.8/8261.md new file mode 100644 index 0000000000000..d125d122cb3a4 --- /dev/null +++ b/backport-changelog/6.8/8261.md @@ -0,0 +1,3 @@ +https://github.com/WordPress/wordpress-develop/pull/8261 + +* https://github.com/WordPress/gutenberg/pull/68521 diff --git a/docs/how-to-guides/themes/global-settings-and-styles.md b/docs/how-to-guides/themes/global-settings-and-styles.md index 359b36b4ad205..e0b7653321413 100644 --- a/docs/how-to-guides/themes/global-settings-and-styles.md +++ b/docs/how-to-guides/themes/global-settings-and-styles.md @@ -1034,7 +1034,7 @@ h3 { {% end %} ##### Element pseudo selectors -Pseudo selectors `:hover`, `:focus`, `:visited`, `:active`, `:link`, `:any-link` are supported by Gutenberg. +Pseudo selectors `:hover`, `:focus`, `:focus-visible`, `:visited`, `:active`, `:link`, `:any-link` are supported by Gutenberg. ```json "elements": { diff --git a/lib/class-wp-theme-json-gutenberg.php b/lib/class-wp-theme-json-gutenberg.php index e3186d2d37032..0679dd4283acf 100644 --- a/lib/class-wp-theme-json-gutenberg.php +++ b/lib/class-wp-theme-json-gutenberg.php @@ -563,7 +563,7 @@ class WP_Theme_JSON_Gutenberg { /** * Defines which pseudo selectors are enabled for which elements. * - * The order of the selectors should be: link, any-link, visited, hover, focus, active. + * The order of the selectors should be: link, any-link, visited, hover, focus, focus-visible, active. * This is to ensure the user action (hover, focus and active) styles have a higher * specificity than the visited styles, which in turn have a higher specificity than * the unvisited styles. @@ -573,10 +573,11 @@ class WP_Theme_JSON_Gutenberg { * * @since 6.1.0 * @since 6.2.0 Added support for `:link` and `:any-link`. + * @since 6.8.0 Added support for `:focus-visible`. */ const VALID_ELEMENT_PSEUDO_SELECTORS = array( - 'link' => array( ':link', ':any-link', ':visited', ':hover', ':focus', ':active' ), - 'button' => array( ':link', ':any-link', ':visited', ':hover', ':focus', ':active' ), + 'link' => array( ':link', ':any-link', ':visited', ':hover', ':focus', ':focus-visible', ':active' ), + 'button' => array( ':link', ':any-link', ':visited', ':hover', ':focus', ':focus-visible', ':active' ), ); /** @@ -2931,7 +2932,11 @@ static function ( $split_selector ) use ( $clean_style_variation_selector ) { array_filter( $element_pseudo_allowed, static function ( $pseudo_selector ) use ( $selector ) { - return str_contains( $selector, $pseudo_selector ); + /* + * Check if the pseudo selector is in the current selector, + * ensuring it is not followed by a dash (e.g., :focus should not match :focus-visible). + */ + return preg_match( '/' . preg_quote( $pseudo_selector, '/' ) . '(?!-)/', $selector ) === 1; } ) ); diff --git a/schemas/json/theme.json b/schemas/json/theme.json index 4eec377e3a94b..158b72e648cc2 100644 --- a/schemas/json/theme.json +++ b/schemas/json/theme.json @@ -1713,6 +1713,9 @@ ":focus": { "$ref": "#/definitions/stylesPropertiesComplete" }, + ":focus-visible": { + "$ref": "#/definitions/stylesPropertiesComplete" + }, ":hover": { "$ref": "#/definitions/stylesPropertiesComplete" }, @@ -1729,6 +1732,7 @@ ":active", ":any-link", ":focus", + ":focus-visible", ":hover", ":link", ":visited" From 7afecbf57094533c77642bd6dae4754216ca8e84 Mon Sep 17 00:00:00 2001 From: JuanMa Date: Sat, 22 Feb 2025 03:16:47 +0100 Subject: [PATCH 93/96] Update javascript-in-the-block-editor.md - fix link (#62431) * Update javascript-in-the-block-editor.md - fix link * Fix Links in remaining two files * Revert Changes in javascript-in-the-block-editor.md file * Added Suggested Changes Co-authored-by: juanmaguitar Co-authored-by: shail-mehta Co-authored-by: t-hamano --------- Co-authored-by: shail-mehta --- docs/getting-started/README.md | 2 +- .../fundamentals/javascript-in-the-block-editor.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md index f1b5999ae3147..f37316e3dcc52 100644 --- a/docs/getting-started/README.md +++ b/docs/getting-started/README.md @@ -29,7 +29,7 @@ The WordPress project, and Gutenberg in particular, iterates quickly. Staying up ## Additional resources -For more resources on block development and extending the Block Editor, review the additional sections here in the Block Editor Handbook. Further practical examples are also available in the [block-development-examples](https://github.com/wptrainingteam/block-development-examples) GitHub repository. +For more resources on block development and extending the Block Editor, review the additional sections here in the Block Editor Handbook. Further practical examples are also available in the [block-development-examples](https://github.com/WordPress/block-development-examples) GitHub repository. If you are looking for more educational content, check out [Learn WordPress](https://learn.wordpress.org/), where you can find [tutorials](https://learn.wordpress.org/tutorials/), [courses](https://learn.wordpress.org/courses/), and [online workshops](https://learn.wordpress.org/online-workshops/). Here is a selection of current offerings: diff --git a/docs/getting-started/fundamentals/javascript-in-the-block-editor.md b/docs/getting-started/fundamentals/javascript-in-the-block-editor.md index 4cd7c0b36fe86..717626af5437e 100644 --- a/docs/getting-started/fundamentals/javascript-in-the-block-editor.md +++ b/docs/getting-started/fundamentals/javascript-in-the-block-editor.md @@ -75,7 +75,7 @@ wp.blocks.registerBlockVariation( For scripts that need to run in the Block Editor, make sure you use the [`enqueue_block_editor_assets`](https://developer.wordpress.org/reference/hooks/enqueue_block_editor_assets/) hook coupled with the standard [`wp_enqueue_script`](https://developer.wordpress.org/reference/functions/wp_enqueue_script/) function. -Refer to [Enqueueing assets in the Editor](/docs/how-to-guides/enqueueing-assets-in-the-editor.md) for more information. You can also visit the [block-development-example](https://github.com/wptrainingteam/block-theme-examples/blob/master/example-block-variation/functions.php) GitHub repository for more practical examples. +Refer to [Enqueueing assets in the Editor](/docs/how-to-guides/enqueueing-assets-in-the-editor.md) for more information.
    Open your browser's dev tools and try running wp.data.select('core/editor').getBlocks() in the console when editing a post or when using the Site Editor. This command will return all available blocks. From c3151e8f6209d60e24a21505cf08d8698655e841 Mon Sep 17 00:00:00 2001 From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com> Date: Sun, 23 Feb 2025 12:16:09 +0530 Subject: [PATCH 94/96] Dataviews: Fix alignment issue of "Title" column header (#68840) * fix: Alignment issue of first header in dataviews * fix: Remove span parent of title field * fix: Remove inline css and remove extra css code Co-authored-by: im3dabasia Co-authored-by: t-hamano Co-authored-by: hbhalodia Co-authored-by: ecgan --- .../src/dataviews-layouts/table/index.tsx | 42 +++++++------------ .../src/dataviews-layouts/table/style.scss | 4 +- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/packages/dataviews/src/dataviews-layouts/table/index.tsx b/packages/dataviews/src/dataviews-layouts/table/index.tsx index 8e69e7353ce92..b3789df8fbb68 100644 --- a/packages/dataviews/src/dataviews-layouts/table/index.tsx +++ b/packages/dataviews/src/dataviews-layouts/table/index.tsx @@ -140,12 +140,7 @@ function TableRow< Item >( { } } > { hasBulkActions && ( - +
    ( { { hasBulkActions && ( ( { ) } { hasPrimaryColumn && ( - - { titleField && ( - - ) } - + { titleField && ( + + ) } ) } { columns.map( ( column, index ) => { diff --git a/packages/dataviews/src/dataviews-layouts/table/style.scss b/packages/dataviews/src/dataviews-layouts/table/style.scss index 5a4ac01b566f7..02ccbe4fed7bd 100644 --- a/packages/dataviews/src/dataviews-layouts/table/style.scss +++ b/packages/dataviews/src/dataviews-layouts/table/style.scss @@ -24,6 +24,7 @@ &.dataviews-view-table__checkbox-column { padding-right: 0; + width: 1%; } } tr { @@ -37,8 +38,7 @@ th:first-child { padding-left: $grid-unit-60; - .dataviews-view-table-header-button, - .dataviews-view-table-header { + .dataviews-view-table-header-button { margin-left: - #{$grid-unit-10}; } } From cca7615f3bb1727b1de920c4514a4734ca33f240 Mon Sep 17 00:00:00 2001 From: Rishit Gupta Date: Sun, 23 Feb 2025 13:30:13 +0530 Subject: [PATCH 95/96] Video Block: Disable autoplay when video is not muted (#69232) Co-authored-by: Rishit30G Co-authored-by: Mamaduka Co-authored-by: hanneslsm Co-authored-by: yogeshbhutkar Co-authored-by: Infinite-Null Co-authored-by: carolinan --- .../block-library/src/video/edit-common-settings.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/block-library/src/video/edit-common-settings.js b/packages/block-library/src/video/edit-common-settings.js index 96d59d7e2f726..312586259efe1 100644 --- a/packages/block-library/src/video/edit-common-settings.js +++ b/packages/block-library/src/video/edit-common-settings.js @@ -22,6 +22,7 @@ const VideoSettings = ( { setAttributes, attributes } ) => { const autoPlayHelpText = __( 'Autoplay may cause usability issues for some users.' ); + const getAutoplayHelp = Platform.select( { web: useCallback( ( checked ) => { return checked ? autoPlayHelpText : null; @@ -32,7 +33,11 @@ const VideoSettings = ( { setAttributes, attributes } ) => { const toggleFactory = useMemo( () => { const toggleAttribute = ( attribute ) => { return ( newValue ) => { - setAttributes( { [ attribute ]: newValue } ); + setAttributes( { + [ attribute ]: newValue, + // Set muted when autoplay changes + ...( attribute === 'autoplay' && { muted: newValue } ), + } ); }; }; @@ -56,7 +61,7 @@ const VideoSettings = ( { setAttributes, attributes } ) => { isShownByDefault hasValue={ () => !! autoplay } onDeselect={ () => { - setAttributes( { autoplay: false } ); + setAttributes( { autoplay: false, muted: false } ); } } > { label={ __( 'Muted' ) } onChange={ toggleFactory.muted } checked={ !! muted } + disabled={ autoplay } + help={ + autoplay ? __( 'Muted because of Autoplay.' ) : null + } /> Date: Mon, 24 Feb 2025 06:04:32 +0100 Subject: [PATCH 96/96] Post formats: Make title and description human readable (#69275) * Post formats: Make title and description human readable Co-authored-by: carolinan Co-authored-by: t-hamano Co-authored-by: Mamaduka --- .../wordpress-6.8/block-template-utils.php | 29 +++++++++++++++++++ lib/load.php | 1 + 2 files changed, 30 insertions(+) create mode 100644 lib/compat/wordpress-6.8/block-template-utils.php diff --git a/lib/compat/wordpress-6.8/block-template-utils.php b/lib/compat/wordpress-6.8/block-template-utils.php new file mode 100644 index 0000000000000..6e792f5be886e --- /dev/null +++ b/lib/compat/wordpress-6.8/block-template-utils.php @@ -0,0 +1,29 @@ + $post_format_name ) { + $default_template_types[ 'taxonomy-post_format-post-format-' . $post_format_slug ] = array( + 'title' => sprintf( + /* translators: %s: Post format name. */ + _x( 'Post Format: %s', 'Template name' ), + $post_format_name + ), + 'description' => sprintf( + /* translators: %s: Post format name. */ + __( 'Displays the %s post format archive.' ), + $post_format_name + ), + ); + } + return $default_template_types; +} + +add_filter( 'default_template_types', 'gutenberg_post_format_template_title_description', 10, 1 ); diff --git a/lib/load.php b/lib/load.php index 789c9f9980e9a..769066111fb95 100644 --- a/lib/load.php +++ b/lib/load.php @@ -104,6 +104,7 @@ function gutenberg_is_experiment_enabled( $name ) { require __DIR__ . '/compat/wordpress-6.8/post.php'; require __DIR__ . '/compat/wordpress-6.8/site-editor.php'; require __DIR__ . '/compat/wordpress-6.8/class-gutenberg-rest-user-controller.php'; +require __DIR__ . '/compat/wordpress-6.8/block-template-utils.php'; // Experimental features. require __DIR__ . '/experimental/block-editor-settings-mobile.php';