diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 76d1e45e3c6ce8..a3a2b1214f7835 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -11,16 +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/*'
- react-native:
- patterns:
- - 'actions/setup-java'
- - 'gradle/*'
- - 'reactivecircus/*'
diff --git a/backport-changelog/6.8/8265.md b/backport-changelog/6.8/8265.md
new file mode 100644
index 00000000000000..46fa3f01810514
--- /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 1d27215762fe42..2b0fcd19e200e1 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/lib/experimental/navigation-theme-opt-in.php b/lib/experimental/navigation-theme-opt-in.php
index 547aa8b88ea7d1..27dbabaf234486 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.
diff --git a/packages/babel-preset-default/polyfill-exclusions.js b/packages/babel-preset-default/polyfill-exclusions.js
index ca8c045d124146..9d0d18737540cb 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/packages/block-editor/src/components/global-styles/filters-panel.js b/packages/block-editor/src/components/global-styles/filters-panel.js
index 64322d0fd5d5c9..3aed7255e411b4 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/shadow-panel-components.js b/packages/block-editor/src/components/global-styles/shadow-panel-components.js
index c335ef29384f4d..25da4150a090fa 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' ) }
diff --git a/packages/block-editor/src/components/global-styles/style.scss b/packages/block-editor/src/components/global-styles/style.scss
index 5684cf9c0d3034..3645586f283115 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;
+ }
+}
diff --git a/packages/block-library/src/post-template/edit.js b/packages/block-library/src/post-template/edit.js
index c58990233f3615..35d0a95501a1b2 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 ee7ee31ba977a9..f478337998f388 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' },
];
diff --git a/packages/editor/src/components/post-author/check.js b/packages/editor/src/components/post-author/check.js
index 0ae7a3963e243f..de781038d2dfd5 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,
};
}, [] );
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 66fdf985cc0d55..d3bca4417dbbf8 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 537d62f382805e..4fa761ffbf71fa 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 b6b4d4f58e4e63..b89a89a54335d5 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 890175534c8b4a..eb424e53c58de9 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 ef2019ac3f0f44..0bc4b17ba1aa49 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 dc2345fd6197f7..26ef06ee68ab3b 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 1f386f4c2fab15..60f07c5aa417a6 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( );
diff --git a/phpunit/script-dependencies-test.php b/phpunit/script-dependencies-test.php
new file mode 100644
index 00000000000000..66f5c0a7e3dc57
--- /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 );
+ }
+}
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 967baccfcbe4ef..a368d4b7f02516 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 3cc369f75f2237..4de9f736ceafa1 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 145fa9a93bab13..d3ebf357615950 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 a3af79289f2701..f5f73169a0f7f9 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 efd8c9c6ee7fe0..3c8231facd3b70 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 4077d6dcc58200..da3e62e35df53c 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 1fa8972d34d6c8..1aa3c576b72c05 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 54f8a64e067cbf..1a8ab33b9e8843 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 162ec15146c67e..dcb5d8c413877c 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 a0cc0af5463aed..580b1060227156 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 9856db97130386..4f35d81737ae29 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 0c43fa02fc73b8..7eeb61ec05746d 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.',