Commit 8ca0794483a for woocommerce
commit 8ca0794483a3fda1ea090a84d2d4d31f9fb6aad4
Author: Daniel Mallory <daniel.mallory@automattic.com>
Date: Tue Oct 27 14:48:00 2026 +0000
Add an experimental payment settings screen with an offline PM example (#70007)
* feat(settings): Add the experimental payment settings screen with a cheque example
Show a settings form at /settings/$page when a woo_settings_payments
entity with that name is registered through addEntities(). The form
reads its label and fields from the entity config, its layout from View
Config, and saves or discards the one record with core-data.
Cheque is the Core example, on the existing v3 payment gateways
endpoint. Loading the wp-build output moves into AdminScreens, and
PaymentSettingsScreen moves to Internal\Admin\Screens\Settings.
The views catalog moves to 2.0.0 to match DataForm 20, so the lockfile
is pnpm's output as written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(settings): Name the payment settings record in the save review panel
The Cmd+S review panel listed the cheque settings as "Untitled" because the
entity config had no getTitle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(settings): Keep payment settings actions on screen on small viewports
The admin-ui Page header doesn't wrap or shrink its actions, so on phones
the Save button sat past the right edge. Below the medium breakpoint the
Save and Discard buttons now render under the form instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Remove the unused script module registration
The admin-screens build registers no script modules, so loading the build
file is all AdminScreens::load() needs to do.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(settings): Remove a test that only covers core-data edit tracking
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Remove the payment settings route loader
The stage already loads the record with useEntityRecord and shows a spinner
until it arrives, so preloading it in the route only duplicated that.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(settings): Show the payment settings loading state inside the page
While the record or form layout loaded, the spinner and load errors rendered
outside the admin-ui Page, in the top-left corner. The Page and breadcrumb now
render straight away, with the spinner or error in the content column.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(settings): Remove admin notices from the payment settings screen
The generated page hides admin notices with CSS, but notices that set their
own inline display, such as Square's, showed until the app covered them.
The screen now removes notice callbacks before they print, as the existing
Payments settings page does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(settings): Add the instructions field to the cheque settings example
The v3 payment gateways endpoint returns instructions inside `settings` as
a field description with a `value`, but saves the plain value. The field
reads either shape and writes `settings.instructions`, so a save sends only
that setting.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(settings): Remove the payment settings entity tests
They covered core-data's handling of the entity config and a small field
mapping on the example page, which saving in the browser already checks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(settings): Remove the payment settings route test
The route only registers the entities and rejects pages without one, which
loading an unknown page in the browser already shows. Jest now passes when
admin-screens has no tests, as other packages in the monorepo do.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Use the monorepo's type overrides in admin-screens
Replace the tsconfig `paths` mapping with the internal-build type overrides
for @wordpress/data and @wordpress/core-data, as email-editor does. The
imports name each override's index file because admin-screens uses Bundler
module resolution, which doesn't resolve the export's directory.
Adding internal-build makes admin-screens a TypeScript project in the
monorepo, so the pnpmfile sets `composite` and the project references.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Remove the resolution selector types from the settings stage
core-data's own types now cover the settings record's resolution error. The
View Config check is gone too: the private getViewConfig selector isn't in
the pinned core-data types, and the screen always has a layout when its
flag is on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Load the admin screens build from AdminScreens
AdminScreens now loads the wp-build output itself, in admin requests and
only while the renamed `experimental-admin-screens` flag is on, so screens
no longer load it. Checking the flag there keeps the build's script handles
and its generated full-screen page off sites with the flag off. The build
file is only loaded when it exists, so a development build that skips
admin-screens no longer breaks the admin.
PaymentSettingsScreen removes the generated full-screen page when it isn't
available, for example without the View Config API. `@since` tags use
11.3.0, the release this foundation is meant for.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Register payment settings fields in the editor field registry
Fields were extra properties on the core-data entity config. They now live
in `entity-fields/src/<collection>/<field>/field.ts`, following the layout
of Gutenberg's entity-fields folder (WordPress/gutenberg#84933), and the
route registers them with the editor's private `registerEntityField`. The
stage reads them back with `getEntityFields`.
The public `registerEntityField` in @wordpress/editor is switched off in
WordPress 7.1 core, so this uses the private store until the server-side
Entity Fields API lands. A Jest test runs against the real editor store,
so it fails if WordPress renames or removes those private actions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(settings): Describe where payment settings fields live
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Move entity fields out of src
entity-fields is a folder inside admin-screens, not a package with its own
build like Gutenberg's, so it doesn't need a src level. Jest now compiles
it alongside the routes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore(settings): Ignore the recommended components lint on the payment settings screen
The repo-wide rule flags Button and Notice from @wordpress/ui. Allowing
them properly needs the allowUseWithCaution option and newer packages,
so ignore it on this experimental screen for now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Type the cheque settings record
The cheque fields used the generic settings record, so the instructions
field needed casts to read its value. Give cheque its own record type
and let registerEntityFields take fields of any record type.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(settings): Remove the payment settings field registry test
It mostly tested the editor store's field registry rather than our
code, and that code moves to the Field Collection API before release.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(settings): Note the field registry wrapper is temporary
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(settings): Explain the absolute Payments breadcrumb URL
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Use a generic class for the settings content column
Nothing in the column's styles is specific to payments, so other
settings screens can use the same class.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs(settings): Remove the payment settings section from the admin screens README
Documentation can follow once the screen is public.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Drop the View Config check from the payment settings screen
The screen only goes live once WordPress 7.1, which adds View Config, is
the minimum supported version, so it doesn't need to handle WordPress
without it. That also removes the code that turned off wp-build's
full-screen page in that case.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(settings): Remove the admin screens build loading test
It passed without the build present and skipped itself otherwise, so it
didn't check the flag in practice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test(settings): Remove the cheque View Config test
It repeated the layout array from the code rather than checking how the
form behaves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* refactor(settings): Rename the payment settings screen to the settings screen
The screen will host more than payment settings, so drop "payment" from
the PHP class, the wp-build route and the page. The page ID is
wc-settings-screen because wc-settings is the classic Settings page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore(deps): Update the lockfile for the admin screens dependencies
Trunk's lockfile was taken in the merge; this adds the admin-screens
dependencies and the @wordpress/views 2.0.0 catalog change as pnpm
wrote them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
diff --git a/plugins/woocommerce/admin-screens/README.md b/plugins/woocommerce/admin-screens/README.md
new file mode 100644
index 00000000000..765b8a792d1
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/README.md
@@ -0,0 +1,10 @@
+# Admin screens
+
+Experimental admin pages built with wp-build, DataForm and core-data. Each folder in `routes/` is a wp-build route.
+
+```sh
+pnpm --filter=@woocommerce/plugin-woocommerce build:project:admin-screens
+pnpm --filter=@woocommerce/plugin-woocommerce watch:build:project:admin-screens
+```
+
+The build writes to `plugins/woocommerce/assets/client/routes`.
diff --git a/plugins/woocommerce/admin-screens/babel.config.js b/plugins/woocommerce/admin-screens/babel.config.js
new file mode 100644
index 00000000000..19c3ba4114a
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/babel.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: './node_modules/@woocommerce/internal-js-tests/babel.config.js',
+};
diff --git a/plugins/woocommerce/admin-screens/entity-fields/cheque/description/field.ts b/plugins/woocommerce/admin-screens/entity-fields/cheque/description/field.ts
new file mode 100644
index 00000000000..d210c78549c
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/cheque/description/field.ts
@@ -0,0 +1,21 @@
+/**
+ * External dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import type { Field } from '@wordpress/dataviews';
+import type { ChequeSettings } from '../types';
+
+export const field: Field< ChequeSettings > = {
+ id: 'description',
+ type: 'text',
+ Edit: 'textarea',
+ label: __( 'Description', 'woocommerce' ),
+ description: __(
+ 'Payment method description that the customer will see during checkout.',
+ 'woocommerce'
+ ),
+};
diff --git a/plugins/woocommerce/admin-screens/entity-fields/cheque/enabled/field.ts b/plugins/woocommerce/admin-screens/entity-fields/cheque/enabled/field.ts
new file mode 100644
index 00000000000..b94d69c9004
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/cheque/enabled/field.ts
@@ -0,0 +1,17 @@
+/**
+ * External dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import type { Field } from '@wordpress/dataviews';
+import type { ChequeSettings } from '../types';
+
+export const field: Field< ChequeSettings > = {
+ id: 'enabled',
+ type: 'boolean',
+ Edit: 'toggle',
+ label: __( 'Enable check payments', 'woocommerce' ),
+};
diff --git a/plugins/woocommerce/admin-screens/entity-fields/cheque/index.ts b/plugins/woocommerce/admin-screens/entity-fields/cheque/index.ts
new file mode 100644
index 00000000000..c6b266fd720
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/cheque/index.ts
@@ -0,0 +1,22 @@
+/**
+ * Fields of the cheque settings page, in the order the form shows them.
+ */
+
+/**
+ * Internal dependencies
+ */
+import type { Field } from '@wordpress/dataviews';
+import type { ChequeSettings } from './types';
+import { field as enabled } from './enabled/field';
+import { field as title } from './title/field';
+import { field as description } from './description/field';
+import { field as instructions } from './instructions/field';
+
+const fields: Field< ChequeSettings >[] = [
+ enabled,
+ title,
+ description,
+ instructions,
+];
+
+export default fields;
diff --git a/plugins/woocommerce/admin-screens/entity-fields/cheque/instructions/field.ts b/plugins/woocommerce/admin-screens/entity-fields/cheque/instructions/field.ts
new file mode 100644
index 00000000000..cad24737d05
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/cheque/instructions/field.ts
@@ -0,0 +1,28 @@
+/**
+ * External dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import type { Field } from '@wordpress/dataviews';
+import type { ChequeSettings } from '../types';
+
+export const field: Field< ChequeSettings > = {
+ id: 'instructions',
+ type: 'text',
+ Edit: 'textarea',
+ label: __( 'Instructions', 'woocommerce' ),
+ description: __(
+ 'Instructions that will be added to the thank you page and emails.',
+ 'woocommerce'
+ ),
+ getValue: ( { item } ) => {
+ const setting = item.settings.instructions;
+ return typeof setting === 'string' ? setting : ( setting?.value ?? '' );
+ },
+ setValue: ( { value } ) => ( {
+ settings: { instructions: String( value ) },
+ } ),
+};
diff --git a/plugins/woocommerce/admin-screens/entity-fields/cheque/title/field.ts b/plugins/woocommerce/admin-screens/entity-fields/cheque/title/field.ts
new file mode 100644
index 00000000000..0683167ef34
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/cheque/title/field.ts
@@ -0,0 +1,20 @@
+/**
+ * External dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import type { Field } from '@wordpress/dataviews';
+import type { ChequeSettings } from '../types';
+
+export const field: Field< ChequeSettings > = {
+ id: 'title',
+ type: 'text',
+ label: __( 'Title', 'woocommerce' ),
+ description: __(
+ 'Payment method name that the customer will see during checkout.',
+ 'woocommerce'
+ ),
+};
diff --git a/plugins/woocommerce/admin-screens/entity-fields/cheque/types.ts b/plugins/woocommerce/admin-screens/entity-fields/cheque/types.ts
new file mode 100644
index 00000000000..f9447f163cc
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/cheque/types.ts
@@ -0,0 +1,10 @@
+export interface ChequeSettings {
+ id: string;
+ enabled: boolean;
+ title: string;
+ description: string;
+ settings: {
+ // The endpoint returns `{ value }` but takes the plain value, so edited records hold a string.
+ instructions?: string | { value: string };
+ };
+}
diff --git a/plugins/woocommerce/admin-screens/entity-fields/types.ts b/plugins/woocommerce/admin-screens/entity-fields/types.ts
new file mode 100644
index 00000000000..4114bdecadc
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/entity-fields/types.ts
@@ -0,0 +1,8 @@
+/**
+ * External dependencies
+ */
+import type { Field } from '@wordpress/dataviews';
+
+export type SettingsRecord = Record< string, unknown >;
+
+export type SettingsField = Field< SettingsRecord >;
diff --git a/plugins/woocommerce/admin-screens/eslint.config.mjs b/plugins/woocommerce/admin-screens/eslint.config.mjs
index e98e6062322..2138940d708 100644
--- a/plugins/woocommerce/admin-screens/eslint.config.mjs
+++ b/plugins/woocommerce/admin-screens/eslint.config.mjs
@@ -43,6 +43,19 @@ export default [
rules: {
...rulesOf( tseslint.configs[ 'flat/strict-type-checked' ] ),
...rulesOf( tseslint.configs[ 'flat/stylistic-type-checked' ] ),
+ // The router expects notFound() and redirect() results to be thrown.
+ '@typescript-eslint/only-throw-error': [
+ 'error',
+ {
+ allow: [
+ {
+ from: 'package',
+ package: '@tanstack/router-core',
+ name: [ 'NotFoundError', 'Redirect' ],
+ },
+ ],
+ },
+ ],
},
},
{
diff --git a/plugins/woocommerce/admin-screens/jest.config.js b/plugins/woocommerce/admin-screens/jest.config.js
new file mode 100644
index 00000000000..2ca4435f1eb
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/jest.config.js
@@ -0,0 +1,35 @@
+const presetDir = './node_modules/@woocommerce/internal-js-tests';
+// eslint-disable-next-line @typescript-eslint/no-require-imports -- Jest loads this config as CommonJS.
+const preset = require( `${ presetDir }/jest-preset.js` );
+
+// ESM-only packages that @wordpress/editor imports, on top of those the preset transforms.
+const esmModules = [ 'client-zip' ];
+
+module.exports = {
+ rootDir: __dirname,
+ roots: [ '<rootDir>' ],
+ preset: `<rootDir>/${ presetDir }`,
+ transformIgnorePatterns: preset.transformIgnorePatterns.map( ( pattern ) =>
+ pattern.replace(
+ '(?:\\.pnpm|',
+ `(?:\\.pnpm|${ esmModules.join( '|' ) }|`
+ )
+ ),
+ transform: {
+ ...preset.transform,
+ ...Object.fromEntries(
+ esmModules.map( ( name ) => [
+ `node_modules/${ name }/.*\\.js$`,
+ 'babel-jest',
+ ] )
+ ),
+ // The shared preset does not transform wp-build routes or entity fields.
+ '(?:routes|entity-fields)/.*\\.[jt]sx?$': [
+ 'ts-jest',
+ {
+ tsconfig: `<rootDir>/${ presetDir }/tsconfig-jest.json`,
+ diagnostics: false,
+ },
+ ],
+ },
+};
diff --git a/plugins/woocommerce/admin-screens/package.json b/plugins/woocommerce/admin-screens/package.json
index 48d4c20bedc..e3233bcda50 100644
--- a/plugins/woocommerce/admin-screens/package.json
+++ b/plugins/woocommerce/admin-screens/package.json
@@ -4,6 +4,7 @@
"scripts": {
"build": "rm -rf build ../assets/client/routes && mkdir -p ../assets/client/routes && ln -s ../assets/client/routes build && wp-build",
"lint": "eslint . && tsc --project tsconfig.json",
+ "test:js": "jest --config ./jest.config.js --passWithNoTests",
"watch:build": "rm -rf build ../assets/client/routes && mkdir -p ../assets/client/routes && ln -s ../assets/client/routes build && wp-build --watch"
},
"config": {
@@ -13,23 +14,51 @@
"changes": [
"**/*.{ts,tsx,mjs,json}"
]
- }
+ },
+ "tests": [
+ {
+ "name": "JavaScript",
+ "command": "test:js",
+ "changes": [
+ "**/*.{ts,tsx,js,scss,json}"
+ ],
+ "events": [
+ "pull_request",
+ "push"
+ ]
+ }
+ ]
}
},
"dependencies": {
"@wordpress/admin-ui": "catalog:wp-bundled",
+ "@wordpress/components": "catalog:wp-min",
+ "@wordpress/compose": "catalog:wp-min",
+ "@wordpress/core-data": "catalog:wp-min",
+ "@wordpress/data": "catalog:wp-min",
+ "@wordpress/dataviews": "catalog:wp-bundled",
+ "@wordpress/editor": "catalog:wp-min",
"@wordpress/i18n": "catalog:wp-min",
+ "@wordpress/private-apis": "catalog:wp-min",
"@wordpress/route": "catalog:wp-min",
+ "@wordpress/ui": "catalog:wp-bundled",
+ "@wordpress/views": "catalog:wp-bundled",
"react": "18.3.x",
"react-dom": "18.3.x"
},
"devDependencies": {
+ "@types/jest": "29.5.x",
"@types/react": "18.3.x",
"@typescript-eslint/eslint-plugin": "^8.63.0",
"@woocommerce/eslint-config": "workspace:*",
+ "@woocommerce/internal-build": "workspace:*",
+ "@woocommerce/internal-js-tests": "workspace:*",
"@wordpress/browserslist-config": "next",
"@wordpress/build": "catalog:tooling",
"eslint": "^10.0.0",
+ "jest": "29.5.x",
+ "jest-environment-jsdom": "29.5.x",
+ "ts-jest": "29.1.x",
"typescript": "5.7.x"
},
"browserslist": [
@@ -42,7 +71,7 @@
"handlePrefix": "wc-routes",
"pages": [
{
- "id": "wc-payment-settings",
+ "id": "wc-settings-screen",
"capability": "manage_woocommerce"
}
]
diff --git a/plugins/woocommerce/admin-screens/routes/payment-settings/stage.tsx b/plugins/woocommerce/admin-screens/routes/payment-settings/stage.tsx
deleted file mode 100644
index 98c252079fa..00000000000
--- a/plugins/woocommerce/admin-screens/routes/payment-settings/stage.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * External dependencies
- */
-import { Page } from '@wordpress/admin-ui';
-import { __ } from '@wordpress/i18n';
-import { useParams } from '@wordpress/route';
-
-function SettingsStage() {
- // useParams() is untyped without a registered router.
- const { page }: { page?: string } = useParams( { strict: false } );
-
- return (
- <Page
- title={ __( 'Payment settings', 'woocommerce' ) }
- showSidebarToggle={ false }
- hasPadding
- >
- <code>{ page }</code>
- </Page>
- );
-}
-
-export const stage = SettingsStage;
diff --git a/plugins/woocommerce/admin-screens/routes/settings/entities.ts b/plugins/woocommerce/admin-screens/routes/settings/entities.ts
new file mode 100644
index 00000000000..52646632a09
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/routes/settings/entities.ts
@@ -0,0 +1,35 @@
+/**
+ * External dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+export const ENTITY_KIND = 'woo_settings_payments';
+
+/**
+ * A core-data entity config for a settings page. The page's URL segment is the entity name and
+ * its record ID, and its fields are registered separately in `entity-fields/`.
+ */
+export interface SettingsEntityConfig {
+ kind: string;
+ name: string;
+ baseURL: string;
+ key: string;
+ label: string;
+ getTitle: () => string;
+}
+
+/**
+ * Describe Core's example page, which uses the existing v3 payment gateways endpoint.
+ */
+export function getCoreEntities(): SettingsEntityConfig[] {
+ return [
+ {
+ kind: ENTITY_KIND,
+ name: 'cheque',
+ baseURL: '/wc/v3/payment_gateways',
+ key: 'id',
+ label: __( 'Check payments', 'woocommerce' ),
+ getTitle: () => __( 'Check payments', 'woocommerce' ),
+ },
+ ];
+}
diff --git a/plugins/woocommerce/admin-screens/routes/settings/entity-fields.ts b/plugins/woocommerce/admin-screens/routes/settings/entity-fields.ts
new file mode 100644
index 00000000000..fa14da9a4da
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/routes/settings/entity-fields.ts
@@ -0,0 +1,60 @@
+/**
+ * External dependencies
+ */
+import { dispatch } from '@wordpress/data';
+import { store as editorStore } from '@wordpress/editor';
+import type { Field } from '@wordpress/dataviews';
+import { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';
+
+/**
+ * Internal dependencies
+ */
+import type { SettingsField } from '../../entity-fields/types';
+
+// The editor's field registry is private. This logic will be replaced once the Field Collection API is available.
+const { unlock } = __dangerousOptInToUnstableAPIsOnlyForCoreModules(
+ 'I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.',
+ '@wordpress/routes'
+);
+
+interface EntityFieldActions {
+ registerEntityField: < Item >(
+ kind: string,
+ name: string,
+ field: Field< Item >
+ ) => void;
+}
+
+interface EntityFieldSelectors {
+ getEntityFields: ( kind: string, name: string ) => SettingsField[];
+}
+
+/**
+ * Add fields to an entity in the editor's field registry.
+ */
+export function registerEntityFields< Item >(
+ kind: string,
+ name: string,
+ fields: Field< Item >[]
+): void {
+ const { registerEntityField } = unlock< EntityFieldActions >(
+ dispatch( editorStore )
+ );
+ fields.forEach( ( field ) => {
+ registerEntityField( kind, name, field );
+ } );
+}
+
+/**
+ * Read an entity's fields from the editor store's selectors.
+ */
+export function getEntityFields(
+ editorSelectors: unknown,
+ kind: string,
+ name: string
+): SettingsField[] {
+ return unlock< EntityFieldSelectors >( editorSelectors ).getEntityFields(
+ kind,
+ name
+ );
+}
diff --git a/plugins/woocommerce/admin-screens/routes/payment-settings/package.json b/plugins/woocommerce/admin-screens/routes/settings/package.json
similarity index 60%
rename from plugins/woocommerce/admin-screens/routes/payment-settings/package.json
rename to plugins/woocommerce/admin-screens/routes/settings/package.json
index 1aac7873414..474bf69d3f8 100644
--- a/plugins/woocommerce/admin-screens/routes/payment-settings/package.json
+++ b/plugins/woocommerce/admin-screens/routes/settings/package.json
@@ -1,6 +1,6 @@
{
"route": {
"path": "/settings/$page",
- "page": "wc-payment-settings"
+ "page": "wc-settings-screen"
}
}
diff --git a/plugins/woocommerce/admin-screens/routes/settings/route.tsx b/plugins/woocommerce/admin-screens/routes/settings/route.tsx
new file mode 100644
index 00000000000..0cf7962c19a
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/routes/settings/route.tsx
@@ -0,0 +1,26 @@
+/**
+ * External dependencies
+ */
+import { store as coreStore } from '@wordpress/core-data';
+import { dispatch, select } from '@wordpress/data';
+import { notFound } from '@wordpress/route';
+
+/**
+ * Internal dependencies
+ */
+import chequeFields from '../../entity-fields/cheque';
+import { ENTITY_KIND, getCoreEntities } from './entities';
+import { registerEntityFields } from './entity-fields';
+
+export const route = {
+ beforeLoad: async ( { params }: { params: { page?: string } } ) => {
+ await dispatch( coreStore ).addEntities( getCoreEntities() );
+ registerEntityFields( ENTITY_KIND, 'cheque', chequeFields );
+ if (
+ ! params.page ||
+ ! select( coreStore ).getEntityConfig( ENTITY_KIND, params.page )
+ ) {
+ throw notFound();
+ }
+ },
+};
diff --git a/plugins/woocommerce/admin-screens/routes/settings/stage.tsx b/plugins/woocommerce/admin-screens/routes/settings/stage.tsx
new file mode 100644
index 00000000000..891400bf399
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/routes/settings/stage.tsx
@@ -0,0 +1,220 @@
+/**
+ * External dependencies
+ */
+import { Breadcrumbs, Page } from '@wordpress/admin-ui';
+import { Spinner } from '@wordpress/components';
+import { useViewportMatch } from '@wordpress/compose';
+import { store as coreStore, useEntityRecord } from '@wordpress/core-data';
+import { useSelect } from '@wordpress/data';
+import { store as editorStore } from '@wordpress/editor';
+import { DataForm, useFormValidity } from '@wordpress/dataviews';
+import type { Form } from '@wordpress/dataviews';
+import { __ } from '@wordpress/i18n';
+import { useParams } from '@wordpress/route';
+// eslint-disable-next-line @wordpress/use-recommended-components -- Fine on this experimental screen until the repo enables allowUseWithCaution.
+import { Button, Notice, Stack } from '@wordpress/ui';
+import { useViewConfig } from '@wordpress/views';
+import { useState } from 'react';
+
+/**
+ * Internal dependencies
+ */
+import type { SettingsRecord } from '../../entity-fields/types';
+import { ENTITY_KIND } from './entities';
+import type { SettingsEntityConfig } from './entities';
+import { getEntityFields } from './entity-fields';
+import './style.scss';
+
+const EMPTY_FORM: Form = { fields: [] };
+
+/**
+ * Use REST error messages without assuming requests reject with Error instances.
+ */
+function getErrorMessage( error: unknown, fallback: string ): string {
+ return typeof error === 'object' &&
+ error !== null &&
+ 'message' in error &&
+ typeof error.message === 'string' &&
+ error.message !== ''
+ ? error.message
+ : fallback;
+}
+
+/**
+ * Render and save one settings entity using WordPress entity and form APIs.
+ */
+function SettingsForm( { config }: { config: SettingsEntityConfig } ) {
+ const { kind, name, label } = config;
+ const { record, editedRecord, hasEdits, edit, save } =
+ useEntityRecord< SettingsRecord >( kind, name, name );
+ const isNarrow = useViewportMatch( 'medium', '<' );
+ const { form } = useViewConfig( { kind, name } );
+ const [ notice, setNotice ] = useState< {
+ status: 'success' | 'error';
+ message: string;
+ } >();
+ const { fields, isSaving, loadError } = useSelect(
+ ( select ) => {
+ const core = select( coreStore );
+ return {
+ fields: getEntityFields( select( editorStore ), kind, name ),
+ isSaving: core.isSavingEntityRecord( kind, name, name ),
+ loadError: core.getResolutionError( 'getEntityRecord', [
+ kind,
+ name,
+ name,
+ ] ),
+ };
+ },
+ [ kind, name ]
+ );
+ const data = editedRecord as SettingsRecord | undefined;
+ const { validity, isValid } = useFormValidity(
+ data ?? {},
+ fields,
+ form ?? EMPTY_FORM
+ );
+ const saveSettings = async () => {
+ if ( isSaving || ! hasEdits || ! isValid ) {
+ return;
+ }
+ setNotice( undefined );
+ try {
+ await save();
+ setNotice( {
+ status: 'success',
+ message: __( 'Settings saved.', 'woocommerce' ),
+ } );
+ } catch ( error ) {
+ setNotice( {
+ status: 'error',
+ message: getErrorMessage(
+ error,
+ __( 'Unable to save settings.', 'woocommerce' )
+ ),
+ } );
+ }
+ };
+ const hasLoadError = !! loadError;
+ const isReady = ! hasLoadError && !! data && !! form;
+ // Breadcrumbs link through the router, which only leaves the screen for an absolute URL.
+ const paymentsUrl = new URL(
+ 'admin.php?page=wc-settings&tab=checkout',
+ window.location.href
+ ).toString();
+ const formActions = (
+ <Stack direction="row" gap="sm" justify="end">
+ <Button
+ variant="outline"
+ size="compact"
+ disabled={ isSaving || ! hasEdits }
+ onClick={ () => {
+ if ( record ) {
+ edit( record );
+ setNotice( undefined );
+ }
+ } }
+ >
+ { __( 'Discard changes', 'woocommerce' ) }
+ </Button>
+ <Button
+ variant="solid"
+ size="compact"
+ loading={ isSaving }
+ disabled={ isSaving || ! hasEdits || ! isValid }
+ onClick={ () => void saveSettings() }
+ >
+ { __( 'Save changes', 'woocommerce' ) }
+ </Button>
+ </Stack>
+ );
+ return (
+ <Page
+ ariaLabel={ label }
+ breadcrumbs={
+ <Breadcrumbs
+ items={ [
+ {
+ label: __( 'Payments', 'woocommerce' ),
+ to: paymentsUrl,
+ },
+ { label },
+ ] }
+ />
+ }
+ showSidebarToggle={ false }
+ hasPadding
+ // The Page header doesn't wrap its actions, so they move below the form on small screens.
+ actions={ isReady && ! isNarrow ? formActions : undefined }
+ >
+ <Stack
+ direction="column"
+ gap="lg"
+ className="woocommerce-settings__content"
+ >
+ { hasLoadError && (
+ <Notice.Root intent="error">
+ <Notice.Description>
+ { getErrorMessage(
+ loadError,
+ __( 'Unable to load settings.', 'woocommerce' )
+ ) }
+ </Notice.Description>
+ </Notice.Root>
+ ) }
+ { ! hasLoadError && ! isReady && (
+ <Stack direction="row" justify="center">
+ <Spinner />
+ </Stack>
+ ) }
+ { notice && (
+ <Notice.Root intent={ notice.status }>
+ <Notice.Description>
+ { notice.message }
+ </Notice.Description>
+ <Notice.CloseIcon
+ onClick={ () => {
+ setNotice( undefined );
+ } }
+ />
+ </Notice.Root>
+ ) }
+ { isReady && (
+ <DataForm
+ data={ data }
+ fields={ fields }
+ form={ form }
+ validity={ validity }
+ onChange={ ( edits ) => {
+ if ( ! isSaving ) {
+ setNotice( undefined );
+ edit( edits );
+ }
+ } }
+ />
+ ) }
+ { isReady && isNarrow && formActions }
+ </Stack>
+ </Page>
+ );
+}
+
+/**
+ * Show the settings entity whose name matches the route, as registered with addEntities().
+ */
+function SettingsStage() {
+ const { page }: { page?: string } = useParams( { strict: false } );
+ const config = useSelect(
+ ( select ) =>
+ page
+ ? ( select( coreStore ).getEntityConfig( ENTITY_KIND, page ) as
+ SettingsEntityConfig | undefined )
+ : undefined,
+ [ page ]
+ );
+ return config ? (
+ <SettingsForm key={ config.name } config={ config } />
+ ) : null;
+}
+
+export const stage = SettingsStage;
diff --git a/plugins/woocommerce/admin-screens/routes/settings/style.scss b/plugins/woocommerce/admin-screens/routes/settings/style.scss
new file mode 100644
index 00000000000..7fa92acf2e7
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/routes/settings/style.scss
@@ -0,0 +1,7 @@
+// admin-ui's Page has no width option, so this matches the column Core's own settings pages use.
+.woocommerce-settings__content {
+ box-sizing: border-box;
+ margin-inline: auto;
+ max-width: 680px;
+ width: 100%;
+}
diff --git a/plugins/woocommerce/admin-screens/tsconfig.json b/plugins/woocommerce/admin-screens/tsconfig.json
index 6982764205e..794440ca67e 100644
--- a/plugins/woocommerce/admin-screens/tsconfig.json
+++ b/plugins/woocommerce/admin-screens/tsconfig.json
@@ -17,8 +17,15 @@
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true,
"noUnusedLocals": true,
- "noUnusedParameters": true
+ "noUnusedParameters": true,
+ "composite": true
},
- "include": [ "**/*.ts", "**/*.tsx" ],
- "exclude": [ "node_modules" ]
+ "include": [
+ "**/*.ts",
+ "**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules"
+ ],
+ "references": []
}
diff --git a/plugins/woocommerce/admin-screens/typings/monorepo-enhancements.d.ts b/plugins/woocommerce/admin-screens/typings/monorepo-enhancements.d.ts
new file mode 100644
index 00000000000..c87fc2fb941
--- /dev/null
+++ b/plugins/woocommerce/admin-screens/typings/monorepo-enhancements.d.ts
@@ -0,0 +1,2 @@
+import '@woocommerce/internal-build/type-overrides/@wordpress/data/index.js';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data/index.js';
diff --git a/plugins/woocommerce/changelog/add-payment-settings-screen-foundation b/plugins/woocommerce/changelog/add-payment-settings-screen-foundation
new file mode 100644
index 00000000000..a57e2099660
--- /dev/null
+++ b/plugins/woocommerce/changelog/add-payment-settings-screen-foundation
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+Comment: Add an experimental, flag-gated payment settings screen with a cheque example; no merchant-facing change.
+
diff --git a/plugins/woocommerce/client/admin/config/core.json b/plugins/woocommerce/client/admin/config/core.json
index d8cccacd8ee..5dc251e1112 100644
--- a/plugins/woocommerce/client/admin/config/core.json
+++ b/plugins/woocommerce/client/admin/config/core.json
@@ -6,6 +6,6 @@
"store-alerts": true,
"rest-api-v4": false,
"order-detail-redesign": false,
- "payment-settings-screen": false
+ "experimental-admin-screens": false
}
}
diff --git a/plugins/woocommerce/client/admin/config/development.json b/plugins/woocommerce/client/admin/config/development.json
index 35f8ee9f838..7aa016a2b76 100644
--- a/plugins/woocommerce/client/admin/config/development.json
+++ b/plugins/woocommerce/client/admin/config/development.json
@@ -6,6 +6,6 @@
"store-alerts": true,
"rest-api-v4": false,
"order-detail-redesign": false,
- "payment-settings-screen": true
+ "experimental-admin-screens": true
}
}
diff --git a/plugins/woocommerce/includes/class-woocommerce.php b/plugins/woocommerce/includes/class-woocommerce.php
index 1cfa3cf2c3e..85a2b024b14 100644
--- a/plugins/woocommerce/includes/class-woocommerce.php
+++ b/plugins/woocommerce/includes/class-woocommerce.php
@@ -38,7 +38,9 @@ use Automattic\WooCommerce\Internal\Email\DeferredEmailQueue;
use Automattic\WooCommerce\Internal\Email\EmailLogger;
use Automattic\WooCommerce\Internal\Admin\Marketplace;
use Automattic\WooCommerce\Internal\Admin\OrderMilestoneEasterEgg;
-use Automattic\WooCommerce\Internal\Admin\Settings\PaymentSettingsScreen;
+use Automattic\WooCommerce\Internal\Admin\Screens\AdminScreens;
+use Automattic\WooCommerce\Internal\Admin\Screens\Settings\ChequeSettings;
+use Automattic\WooCommerce\Internal\Admin\Screens\Settings\SettingsScreen;
use Automattic\WooCommerce\Proxies\LegacyProxy;
use Automattic\WooCommerce\Utilities\{LoggingUtil, TimeUtil};
use Automattic\WooCommerce\Internal\Logging\OrderLogsCleanupHelper;
@@ -414,7 +416,9 @@ final class WooCommerce {
$container->get( OrderMilestoneEasterEgg::class );
$container->get( CustomerEmailVerification::class );
$container->get( OrderLogsCleanupHelper::class );
- $container->get( PaymentSettingsScreen::class );
+ $container->get( AdminScreens::class );
+ $container->get( ChequeSettings::class );
+ $container->get( SettingsScreen::class );
$container->get( AbilitiesTracking::class );
$container->get( OpenGraph::class );
diff --git a/plugins/woocommerce/src/Internal/Admin/Screens/AdminScreens.php b/plugins/woocommerce/src/Internal/Admin/Screens/AdminScreens.php
new file mode 100644
index 00000000000..7303da66c50
--- /dev/null
+++ b/plugins/woocommerce/src/Internal/Admin/Screens/AdminScreens.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Loads the admin screens built with wp-build.
+ */
+
+declare( strict_types=1 );
+
+namespace Automattic\WooCommerce\Internal\Admin\Screens;
+
+use Automattic\WooCommerce\Admin\Features\Features;
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * Loads the wp-build output in `assets/client/routes`, which defines the generated page, route and
+ * script module functions of every page that `admin-screens` builds.
+ *
+ * @internal
+ */
+class AdminScreens {
+
+ /**
+ * Feature flag that controls the experimental admin screens until they are released.
+ */
+ public const FEATURE_FLAG = 'experimental-admin-screens';
+
+ /**
+ * Register hooks.
+ *
+ * @internal
+ */
+ public function __construct() {
+ add_action( 'init', array( $this, 'handle_init' ) );
+ }
+
+ /**
+ * Load the build output in admin requests while the flag is on.
+ *
+ * @internal
+ *
+ * @since 11.3.0
+ */
+ public function handle_init(): void {
+ if ( ! is_admin() || ! Features::is_enabled( self::FEATURE_FLAG ) ) {
+ return;
+ }
+
+ // Development builds that only watch the admin client don't produce this file.
+ $build_file = $this->get_build_file();
+ if ( is_readable( $build_file ) ) {
+ require_once $build_file;
+ }
+ }
+
+ /**
+ * Path to the wp-build entry point.
+ *
+ * @return string
+ */
+ private function get_build_file(): string {
+ return WC_ABSPATH . 'assets/client/routes/build.php';
+ }
+}
diff --git a/plugins/woocommerce/src/Internal/Admin/Screens/Settings/ChequeSettings.php b/plugins/woocommerce/src/Internal/Admin/Screens/Settings/ChequeSettings.php
new file mode 100644
index 00000000000..a800103ebb1
--- /dev/null
+++ b/plugins/woocommerce/src/Internal/Admin/Screens/Settings/ChequeSettings.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Form layout for the experimental cheque settings screen.
+ *
+ * @package WooCommerce\Internal\Admin\Screens\Settings
+ */
+
+declare( strict_types=1 );
+
+namespace Automattic\WooCommerce\Internal\Admin\Screens\Settings;
+
+use Automattic\WooCommerce\Admin\Features\Features;
+use Automattic\WooCommerce\Internal\Admin\Screens\AdminScreens;
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * Supplies the cheque example's layout through WordPress View Config.
+ *
+ * @internal
+ */
+final class ChequeSettings {
+
+ /**
+ * Register the layout.
+ *
+ * @internal
+ */
+ public function __construct() {
+ add_filter( 'get_entity_view_config_woo_settings_payments_cheque', array( $this, 'handle_get_entity_view_config_woo_settings_payments_cheque' ) );
+ }
+
+ /**
+ * Set the fields shown by the cheque form.
+ *
+ * @internal
+ *
+ * @since 11.3.0
+ * @param mixed $config View Config object supplied by WordPress.
+ * @return mixed
+ */
+ public function handle_get_entity_view_config_woo_settings_payments_cheque( $config ) {
+ if ( ! Features::is_enabled( AdminScreens::FEATURE_FLAG ) || ! is_object( $config ) || ! is_callable( array( $config, 'merge' ) ) ) {
+ return $config;
+ }
+ return $config->merge(
+ array(
+ 'form' => array(
+ 'fields' => array(
+ array(
+ 'id' => 'general',
+ 'label' => __( 'General', 'woocommerce' ),
+ 'layout' => array(
+ 'type' => 'card',
+ 'isCollapsible' => false,
+ ),
+ 'children' => array( 'enabled', 'title', 'description', 'instructions' ),
+ ),
+ ),
+ ),
+ ),
+ 1
+ );
+ }
+}
diff --git a/plugins/woocommerce/src/Internal/Admin/Settings/PaymentSettingsScreen.php b/plugins/woocommerce/src/Internal/Admin/Screens/Settings/SettingsScreen.php
similarity index 65%
rename from plugins/woocommerce/src/Internal/Admin/Settings/PaymentSettingsScreen.php
rename to plugins/woocommerce/src/Internal/Admin/Screens/Settings/SettingsScreen.php
index 0e85727b588..8b78ee1a635 100644
--- a/plugins/woocommerce/src/Internal/Admin/Settings/PaymentSettingsScreen.php
+++ b/plugins/woocommerce/src/Internal/Admin/Screens/Settings/SettingsScreen.php
@@ -1,40 +1,33 @@
<?php
/**
- * Loads the experimental payment settings screen.
+ * Loads the experimental settings screen.
*/
declare( strict_types=1 );
-namespace Automattic\WooCommerce\Internal\Admin\Settings;
+namespace Automattic\WooCommerce\Internal\Admin\Screens\Settings;
use Automattic\WooCommerce\Admin\Features\Features;
+use Automattic\WooCommerce\Internal\Admin\Screens\AdminScreens;
defined( 'ABSPATH' ) || exit;
/**
- * Registers the wp-build admin page for payment gateway settings screens.
- *
- * This class is the only code that loads the build output in
- * `assets/client/routes`, which defines wp-build's generated functions.
+ * Registers the wp-build admin page for settings screens.
*
* @internal
*/
-final class PaymentSettingsScreen {
+final class SettingsScreen {
/**
* Admin page slug. wp-build's generated code only loads its assets on this page.
*/
- public const PAGE_SLUG = 'wc-payment-settings-wp-admin';
-
- /**
- * Feature flag that controls the screen until it is released.
- */
- private const FEATURE_FLAG = 'payment-settings-screen';
+ public const PAGE_SLUG = 'wc-settings-screen-wp-admin';
/**
* Name of the render function generated by wp-build.
*/
- private const RENDER_FUNCTION = 'woocommerce_routes_wc_payment_settings_wp_admin_render_page';
+ private const RENDER_FUNCTION = 'woocommerce_routes_wc_settings_screen_wp_admin_render_page';
/**
* Register hooks.
@@ -46,7 +39,7 @@ final class PaymentSettingsScreen {
}
/**
- * Load the generated page when the screen is available.
+ * Register the page when the screen is available.
*
* @internal
*/
@@ -55,26 +48,23 @@ final class PaymentSettingsScreen {
return;
}
- require_once $this->get_build_file();
add_action( 'admin_menu', array( $this, 'handle_admin_menu' ) );
add_action( 'admin_head', array( $this, 'handle_admin_head' ) );
add_filter( 'submenu_file', array( $this, 'handle_submenu_file' ) );
+ add_action( 'in_admin_header', array( $this, 'handle_in_admin_header' ), PHP_INT_MAX );
}
/**
* Whether the screen can be used on this site.
*
- * It needs the feature flag, WordPress's View Config and Fields APIs, and the build output.
+ * It needs the admin screens feature flag.
*
* @since 11.3.0
*
* @return bool
*/
public function is_available(): bool {
- return Features::is_enabled( self::FEATURE_FLAG )
- && function_exists( 'wp_get_entity_view_config' )
- && ( class_exists( 'WP_Fields_Registry' ) || class_exists( 'Gutenberg_Fields_Registry' ) )
- && is_readable( $this->get_build_file() );
+ return Features::is_enabled( AdminScreens::FEATURE_FLAG );
}
/**
@@ -89,8 +79,8 @@ final class PaymentSettingsScreen {
add_submenu_page(
'woocommerce',
- __( 'Payment settings', 'woocommerce' ),
- __( 'Payment settings', 'woocommerce' ),
+ __( 'Settings', 'woocommerce' ),
+ __( 'Settings', 'woocommerce' ),
'manage_woocommerce',
self::PAGE_SLUG,
array( $this, 'render_page' )
@@ -133,21 +123,29 @@ final class PaymentSettingsScreen {
}
/**
- * Whether the current admin request is for the screen.
+ * Remove admin notices from the screen before they print.
*
- * @return bool
+ * The page's CSS hides them, but notices that set their own inline display still flash before
+ * the app covers them.
+ *
+ * @internal
+ *
+ * @since 11.3.0
*/
- private function is_current_page(): bool {
- // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Only compares the page slug.
- return isset( $_GET['page'] ) && self::PAGE_SLUG === $_GET['page'];
+ public function handle_in_admin_header(): void {
+ if ( $this->is_current_page() ) {
+ remove_all_actions( 'admin_notices' );
+ remove_all_actions( 'all_admin_notices' );
+ }
}
/**
- * Path to the wp-build entry point.
+ * Whether the current admin request is for the screen.
*
- * @return string
+ * @return bool
*/
- private function get_build_file(): string {
- return WC_ABSPATH . 'assets/client/routes/build.php';
+ private function is_current_page(): bool {
+ // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Only compares the page slug.
+ return isset( $_GET['page'] ) && self::PAGE_SLUG === $_GET['page'];
}
}
diff --git a/plugins/woocommerce/tests/php/src/Internal/Admin/Screens/Settings/SettingsScreenTest.php b/plugins/woocommerce/tests/php/src/Internal/Admin/Screens/Settings/SettingsScreenTest.php
new file mode 100644
index 00000000000..ea25207a7a9
--- /dev/null
+++ b/plugins/woocommerce/tests/php/src/Internal/Admin/Screens/Settings/SettingsScreenTest.php
@@ -0,0 +1,62 @@
+<?php
+declare( strict_types = 1 );
+
+namespace Automattic\WooCommerce\Tests\Internal\Admin\Screens\Settings;
+
+use Automattic\WooCommerce\Internal\Admin\Screens\Settings\SettingsScreen;
+use WC_Unit_Test_Case;
+
+/**
+ * Tests for the SettingsScreen class.
+ */
+class SettingsScreenTest extends WC_Unit_Test_Case {
+
+ /**
+ * The System Under Test.
+ *
+ * @var SettingsScreen
+ */
+ private $sut;
+
+ /**
+ * Set up test fixtures.
+ */
+ public function setUp(): void {
+ parent::setUp();
+ $this->sut = new SettingsScreen();
+ add_action( 'admin_notices', '__return_null' );
+ add_action( 'all_admin_notices', '__return_null' );
+ }
+
+ /**
+ * Tear down test fixtures.
+ */
+ public function tearDown(): void {
+ unset( $_GET['page'] );
+ parent::tearDown();
+ }
+
+ /**
+ * @testdox Should remove admin notices on the settings screen.
+ */
+ public function test_removes_admin_notices_on_the_screen(): void {
+ $_GET['page'] = 'wc-settings-screen-wp-admin';
+
+ $this->sut->handle_in_admin_header();
+
+ $this->assertFalse( has_action( 'admin_notices' ), 'admin_notices callbacks should be removed' );
+ $this->assertFalse( has_action( 'all_admin_notices' ), 'all_admin_notices callbacks should be removed' );
+ }
+
+ /**
+ * @testdox Should keep admin notices on other admin pages.
+ */
+ public function test_keeps_admin_notices_on_other_pages(): void {
+ $_GET['page'] = 'wc-settings';
+
+ $this->sut->handle_in_admin_header();
+
+ $this->assertNotFalse( has_action( 'admin_notices', '__return_null' ), 'admin_notices callbacks should stay' );
+ $this->assertNotFalse( has_action( 'all_admin_notices', '__return_null' ), 'all_admin_notices callbacks should stay' );
+ }
+}
diff --git a/plugins/woocommerce/tsconfig.json b/plugins/woocommerce/tsconfig.json
index f0251618df4..ed6e905f5d9 100644
--- a/plugins/woocommerce/tsconfig.json
+++ b/plugins/woocommerce/tsconfig.json
@@ -1,6 +1,9 @@
{
"extends": "../../tsconfig.base.json",
"references": [
+ {
+ "path": "admin-screens"
+ },
{
"path": "client/admin"
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b12bd49147b..ece613bfcec 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -79,6 +79,9 @@ catalogs:
'@wordpress/ui':
specifier: 0.17.0
version: 0.17.0
+ '@wordpress/views':
+ specifier: 2.0.0
+ version: 2.0.0
wp-min:
'@types/wordpress__block-editor':
specifier: 15.0.6
@@ -242,7 +245,6 @@ patchedDependencies:
path: bin/patches/@wordpress__edit-site@5.15.0.patch
importers:
-
.:
dependencies:
'@babel/core':
@@ -2760,13 +2762,40 @@ importers:
dependencies:
'@wordpress/admin-ui':
specifier: catalog:wp-bundled
- version: 2.5.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ version: 2.5.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@4.4.0)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/components':
+ specifier: catalog:wp-min
+ version: 30.6.5(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/compose':
+ specifier: catalog:wp-min
+ version: 7.33.1(@types/react@18.3.28)(react@18.3.1)
+ '@wordpress/core-data':
+ specifier: catalog:wp-min
+ version: 7.33.9(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@4.4.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/data':
+ specifier: catalog:wp-min
+ version: 10.33.1(@types/react@18.3.28)(react@18.3.1)
+ '@wordpress/dataviews':
+ specifier: catalog:wp-bundled
+ version: 20.0.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/editor':
+ specifier: catalog:wp-min
+ version: 14.33.11(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
'@wordpress/i18n':
specifier: catalog:wp-min
version: 6.6.1
+ '@wordpress/private-apis':
+ specifier: ^1.33.1
+ version: 1.48.1
'@wordpress/route':
specifier: catalog:wp-min
version: 0.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/ui':
+ specifier: catalog:wp-bundled
+ version: 0.17.0(@date-fns/tz@1.5.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@4.4.0)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/views':
+ specifier: catalog:wp-bundled
+ version: 2.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
react:
specifier: 18.3.x
version: 18.3.1
@@ -2774,6 +2803,9 @@ importers:
specifier: 18.3.x
version: 18.3.1(react@18.3.1)
devDependencies:
+ '@types/jest':
+ specifier: 29.5.x
+ version: 29.5.14
'@types/react':
specifier: 18.3.x
version: 18.3.28
@@ -2783,6 +2815,12 @@ importers:
'@woocommerce/eslint-config':
specifier: workspace:*
version: link:../../../tools/eslint-config
+ '@woocommerce/internal-build':
+ specifier: workspace:*
+ version: link:../../../packages/js/internal-build
+ '@woocommerce/internal-js-tests':
+ specifier: workspace:*
+ version: link:../../../packages/js/internal-js-tests
'@wordpress/browserslist-config':
specifier: next
version: 6.43.1-next.v.202604091042.0
@@ -2792,6 +2830,15 @@ importers:
eslint:
specifier: ^10.0.0
version: 10.7.0(jiti@2.6.1)
+ jest:
+ specifier: 29.5.x
+ version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
+ jest-environment-jsdom:
+ specifier: 29.5.x
+ version: 29.5.0
+ ts-jest:
+ specifier: 29.1.x
+ version: 29.1.5(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(esbuild@0.27.7)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
typescript:
specifier: 5.7.x
version: 5.7.3
@@ -4343,7 +4390,6 @@ importers:
version: 32.6.0(@playwright/test@1.63.0)(@swc/core@1.15.24)(@types/node@24.12.2)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(@types/webpack@4.41.40)(@wordpress/env@11.17.0(@types/node@24.12.2))(esbuild@0.27.7)(eslint-import-resolver-webpack@0.13.11)(file-loader@6.2.0(webpack@5.97.1))(jiti@2.6.1)(node-notifier@8.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.100.0)(stylelint-scss@6.14.0(stylelint@16.26.1(typescript@5.7.3)))(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))(type-fest@4.41.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)
packages:
-
'@actions/core@2.0.3':
resolution: {integrity: sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==}
@@ -7687,27 +7733,54 @@ packages:
'@types/react':
optional: true
+ '@react-spring/animated@10.1.2':
+ resolution: {integrity: sha512-yAsQ/bbp6+vko7WNCI1M00c6KLE9XKTGCrgRhQqS4JcK3oF5qBV4rHYrQEprvEvYXxt+1H5FsLS2eVValEPfFw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/animated@9.7.5':
resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-spring/core@10.1.2':
+ resolution: {integrity: sha512-lPGOAg0V+PV3ucopOajD+YCxoe8twALqAeG4c/+sqVjBsyUNNdx8qfz/DcNSPKA8PV3+AyQELlCxlDfap9cmBQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/core@9.7.5':
resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-spring/rafz@10.1.2':
+ resolution: {integrity: sha512-KC6vSFZyPnRJ2rXqipV9QqR4SaYbYXjvKfdYKWipNK2mWuV79gr20WmpVUOsTiEHGRY3WSOdWCHN+P9Pdaqb7Q==}
+
'@react-spring/rafz@9.7.5':
resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==}
+ '@react-spring/shared@10.1.2':
+ resolution: {integrity: sha512-47/8bNQ/o0uEmxEnPBuERlC29VSqiTn5P9ln9tUMSVkYKYxBtouYE686F5kAGj+eHRPoNCw7drxWE9nv2d1LMw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/shared@9.7.5':
resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ '@react-spring/types@10.1.2':
+ resolution: {integrity: sha512-G4CWowmVPz+rDG1y9QRVq/prZNxiNwQaHC0kgT/MgY6jAGgdRgTV4VThpvJDwWvUitk3xZB4soP4d36fjeQ09g==}
+
'@react-spring/types@9.7.5':
resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==}
+ '@react-spring/web@10.1.2':
+ resolution: {integrity: sha512-KxDB3zaDqy9qFsu7fdxjyraAxweHH4k5TW5WGT/OuMK6hKaxSDfhrQfRBzfFaSVvMBf+NghbJFanllV4ia6i7A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@react-spring/web@9.7.5':
resolution: {integrity: sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==}
peerDependencies:
@@ -8376,6 +8449,12 @@ packages:
'@types/doctrine@0.0.9':
resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
+ '@types/dom-mediacapture-transform@0.1.12':
+ resolution: {integrity: sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==}
+
+ '@types/dom-webcodecs@0.1.13':
+ resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==}
+
'@types/dompurify@2.4.0':
resolution: {integrity: sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==}
@@ -9030,6 +9109,10 @@ packages:
resolution: {integrity: sha512-RyEEY5C1XGLxJnluYFGVz4xFiw0jFjwL9Oiu4rDZjCGcxyu0sD6HPBcG6sIRpFKv062cwLccwpCeD8rc8U6Ctg==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/api-fetch@7.57.0':
+ resolution: {integrity: sha512-NM9whtviaDmHmoJORHCZ1TqDRiC0nPooN/IqGEwfr2nX1X8F6d4hvOceiOZJJDTXQzdJoun5c9oUNQ4IrABQ4w==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/autop@3.16.0':
resolution: {integrity: sha512-cepLM41mF1h7f2JIU12XhLLfep1R0DNkI0gM2GoVzp0DlM0qSnJVuU93R75wTnR0OTija0cVVPUovt+gBWIR2Q==}
engines: {node: '>=12'}
@@ -9042,6 +9125,10 @@ packages:
resolution: {integrity: sha512-vMOdHhXIv559fYsg72AnWACblxZdojIerVeWxlX7a/ptoZK8MjqA0ZVhFsHezTBqdfiFyoRtiRECSFYLXWlSZg==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/autop@4.57.0':
+ resolution: {integrity: sha512-qDnGKl9zdGYFPeFXetG7DGjhHLQW2GVlNYqFW2CjSwysRy6lACTGmyvRyGIOdm1EYeDBt5o0mvQxVPnh1TRo9A==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/babel-preset-default@8.43.1-next.v.202604091042.0':
resolution: {integrity: sha512-eteOrBePS4uxe0CezIp/SF5iskQd1F5JmYnjcw+B1DCHr+yZIxNkaGkWQS+aM7RPq2mD7eEJPedNQICs/JaB5A==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -9089,6 +9176,10 @@ packages:
resolution: {integrity: sha512-iK3dtZu/UtnYpKfQ2aGZM2xrLXK5ff88QNU77XlraipaGV/C7zK2M0+sWY6cVL50TfMR7VX9prZ2XCpE5aRzSg==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/blob@4.57.0':
+ resolution: {integrity: sha512-t1ghgANfEzzSSNyPEIWE8PDX+wgvtzxkQX9yYG8o7jeDDqRS3aveKJS8226HkISqt7pAg+JN7iS7MaoQWT5Fuw==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/block-editor@12.26.0':
resolution: {integrity: sha512-wkBP37hB6Fb1AaUIjry6S3LlFrjnVq3Seg8ktZPLozDv2cyODs/ym8+wjv8TR/aiuSWdk0dZZywYMNc+vHEfEg==}
engines: {node: '>=12'}
@@ -9110,6 +9201,17 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
+ '@wordpress/block-editor@18.1.0':
+ resolution: {integrity: sha512-sBoxUAXNGz/yiEOhbzR0nSmkTIiQSlK5Pi/l5+cy0c+XffslX/rgGjHWgKoh5orJtmS2if5HYPvB8nnKSe8sfQ==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@wordpress/block-library@8.35.0':
resolution: {integrity: sha512-Cb0n8gh3wK+aFwbPjhyrJpHoe7mqszi8FsxJtw9e37lxwax323pdc5G2YcsfEpfGs7fJnoJ9CA8GfKPqzpdVAw==}
engines: {node: '>=12'}
@@ -9132,6 +9234,10 @@ packages:
resolution: {integrity: sha512-REsjN6tT2lXekrjuiu2O0+FYW13QHhy23j7C458zzSjpYcxROtl/T8AozOJYRvG9SkdC9Og3PkEP/9/nGC4IVw==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/block-serialization-default-parser@5.57.0':
+ resolution: {integrity: sha512-gxqS1TIMiWcIIsPTPdvztOZNEl7+TkVJ5WHk8BWOe2+WsaEcjL44heSceDl873+WZQ1RIAOBdHDyds8h4FjiaQ==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/blocks@12.35.0':
resolution: {integrity: sha512-BwjMca4aGuttu3C0nLLpt6MBg6IBCogA6ulGTyg+0YdKnwac52k+2wfersqAem8AFgG0hTDwrIpLsWLxpF9dtg==}
engines: {node: '>=12'}
@@ -9150,6 +9256,20 @@ packages:
peerDependencies:
react: ^18.0.0
+ '@wordpress/blocks@16.2.0':
+ resolution: {integrity: sha512-Ga1MWeUNUSs3pDdiBL4uTrdt0mVnnx+eE83LZOweqjxeVmsqWjg1cwsOUrI+eDos1ffxeYqzgI+uxsSJ4mkcjQ==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ '@types/react-dom': ^18 || ^19
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@wordpress/browserslist-config@6.43.1-next.v.202604091042.0':
resolution: {integrity: sha512-2TLfCnjfVy6CBR6vwYlMRPrxHeGPrEF2OeKIUZd5hQhDeYP7s+u5iczEWw2F6acaIaJ3S8amO7lcoh3Q6APfWw==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -9204,6 +9324,13 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
+ '@wordpress/commands@1.57.0':
+ resolution: {integrity: sha512-3RuolvhR3+jeTlYgb/PAQfRCAKOBPTLuvnggnH5XLShE1qKzTjJugXgWdcrquym9VP3b4TSgs5YHxDrwjmGv3w==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+
'@wordpress/components@14.2.0':
resolution: {integrity: sha512-a06jjuBQMcIyrfXBfk4Hyu9BLQkT1rQm3tbOIE9Ur/cV8K0os0DrMUPZlNZ37IeOORzXhz89/L5mopvRttGLJQ==}
engines: {node: '>=12'}
@@ -9381,6 +9508,17 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
+ '@wordpress/core-data@8.2.0':
+ resolution: {integrity: sha512-X4Zqu/0RpSc0xvFGz1jk9st6IMWZk6jvg0MFlie0Hjr/Dci3XSrUtokKg6TCbGZqdgzmDIi8UNT5nU4/LbrFoQ==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@wordpress/data-controls@4.33.1':
resolution: {integrity: sha512-+gD47q6WuZ2MYMxwUBwBTYACMayrZoyG6W6OR1Q2ggOfkmoQb4OlxEWJPdCIC8GxJJwVh8ej9HjzzI3S/tDsJg==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -9676,6 +9814,20 @@ packages:
resolution: {integrity: sha512-jpMnDkAE1stcoSV19hyet0b2wySMz1kaplNivruKwUyQilkQRIhqlJFiEKBVt513m9I9CbEPA0WKcTpfqJxIMA==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/global-styles-engine@1.24.0':
+ resolution: {integrity: sha512-gr6/lc6pWi7SjpmLwsRiJJfUOY4Xp3poyfouLD7+2QbA2bK7m2yhUWx9FR6T7YMGAG5fgUKQq5pQgiQkC5iyag==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ '@types/react-dom': ^18 || ^19
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@wordpress/hooks@3.58.0':
resolution: {integrity: sha512-9LB0ZHnZRQlORttux9t/xbAskF+dk2ujqzPGsVzc92mSKpQP3K2a5Wy74fUnInguB1vLUNHT6nrNdkVom5qX1Q==}
engines: {node: '>=12'}
@@ -9795,6 +9947,17 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
+ '@wordpress/image-cropper@1.21.0':
+ resolution: {integrity: sha512-v+vbwKih9Wwfn713BNMLAROxxfylqha4Vn/bcrKK+a8RplZrgtTcsMbWx2DTMlG9lzQhv6on9+eC6v/M3Cdi/w==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@wordpress/interactivity-router@1.8.0':
resolution: {integrity: sha512-i2Lb9008DmPyh/DyCWhvVkwUha2zhLqPfBtMAUQuwes2prDLyl8FnWVS6bwXXYpu6qKkLhFz6hzXt3O988u53Q==}
engines: {node: '>=12'}
@@ -9819,6 +9982,10 @@ packages:
resolution: {integrity: sha512-Qc+VoBt2XNoOuVMZwjQtZJ8iQfh7mJsSjPlxzSMyYRHGPa+WqfWO50LY/vyXYPs5s5FoMsb3S64ty/p//1DI2w==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/interactivity@7.0.0':
+ resolution: {integrity: sha512-VIYgydqUiKq+KNzSPqbJyCcDdDUqChdWksyOJ496h6/F1/dVMYe9sA9KABSXpVh1TgDaXGr48UgVdD7EtBSiAw==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/interface@10.3.0':
resolution: {integrity: sha512-Ehkb0ozNkEdB2VXbXoRjDqiJStAJTBeS0nRam3km66kpKnl4x0doJXhQHkNJtWj3Oz73sMIpFH5FFNRnJV1bBw==}
engines: {node: '>=18.12.0'}
@@ -9908,6 +10075,20 @@ packages:
peerDependencies:
react: ^18.0.0
+ '@wordpress/keyboard-shortcuts@5.57.0':
+ resolution: {integrity: sha512-vmA9pHbrZvI9jZHEU7rqjFIwuyEUR0azuPtgjvMXB00FXiQIjCdEWJCJSdpAzKdSJPiZmqgan7//ypjyd00k1g==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ '@types/react-dom': ^18 || ^19
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@wordpress/keycodes@3.58.0':
resolution: {integrity: sha512-Q/LRKpx8ndzuHlkxSQ2BD+NTYYKQPIneNNMng8hTAfyU7RFwXpqj06HpeOFGh4XIdPKCs/8hmucoLJRmmLmZJA==}
engines: {node: '>=12'}
@@ -9976,6 +10157,20 @@ packages:
peerDependencies:
react: ^18.0.0
+ '@wordpress/notices@5.57.0':
+ resolution: {integrity: sha512-h9JgAqeO3jlnfxRHrn9VwxYmBTWaShLTBGepAQdRqnkc54WteYAW+3lkKUTc8ORIKTwKsKbg8ncyelrf6Jdw6w==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ '@types/react-dom': ^18 || ^19
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@wordpress/npm-package-json-lint-config@5.51.0':
resolution: {integrity: sha512-N/cywmYSBv+wfhu4Zq0RmhC/G4RCm1BgQCIPDbUmd1bvNwjd489is+YItBdKSS2NqePVRV9DwCAl8+Jb7D1nqA==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -10309,6 +10504,10 @@ packages:
resolution: {integrity: sha512-zfOz45verEOIf3YIE4zOlMcQoZ2za+OFuJ4SKE+nmglUFLmF2I0iLGlNQO0BNLPI26+krSVZ8kclzJRaB5Z6Kw==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/shortcode@4.57.0':
+ resolution: {integrity: sha512-FQvDTVC6XS/Q8RYxgCLCo/akf/UlgUwHvI8zga0bzKzyuyXHprx4ujQkGO8w4uM4uDSxLVaO/ISYW9KGSNvhpA==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/style-engine@1.41.0':
resolution: {integrity: sha512-aM5bbJn6m8SHRotCoh/fSGuIB0MQJoVFBjpzIDoUDQ1KlO7CbY+fj9daDV1FZPMNv0h0ZEFWZ+y7Gv/CERypMA==}
engines: {node: '>=12'}
@@ -10321,6 +10520,15 @@ packages:
resolution: {integrity: sha512-biMD3eTjoUj5hlmA261kLAlgCN/bjxeeRe7XFrjG/bxQErmYp+hmMSejNTuLpg3j8I11eQ3Vo0iRCjGzn4xFEQ==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/style-engine@2.57.0':
+ resolution: {integrity: sha512-CmBwZjdWJkqOlPIkEgbyOczd8jn7hrg/lwXhNji0ICs4IgZFh6bk1z10njFFs02v4rBh/rJ0OWUBDrc+C6LtsQ==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@wordpress/style-runtime@0.12.0':
resolution: {integrity: sha512-qCEKNYAGyJ3II+EQS4HNDbwPwddPUf1Pf3C7dSqqEuM9x0zbQm4/uZlf9i8CyV2k7ul9MzHeVjzIYlI+IuXEvA==}
engines: {node: '>=20.10.0'}
@@ -10356,6 +10564,10 @@ packages:
resolution: {integrity: sha512-RLPTX9f7KdGPyzYDyxwMdnPTEqcAskjOt6AVEb/XJ0gzBmbtqxnoQVrBk/cVcKjaIPTAg2lJkM82RnvnopmoQw==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/sync@2.0.0':
+ resolution: {integrity: sha512-dnYTt9zlC7ugCkoreknK1qTsx87XmfwYIWlPMRr6o8TmSXTzPPNeeMJCW3GEJIO+Sf32GtBq7QjGEpEm2Man6w==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/theme@0.11.0':
resolution: {integrity: sha512-jXilt+3codfAEFRHvLpnULeOaaycwJByyv+m/TIlspZ4r0l4X9iA1KL7GkXOHz2AJWWvS7FUnS/GHBuIrUgAWg==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -10450,6 +10662,10 @@ packages:
resolution: {integrity: sha512-hFAqE8xmTpq/4IVs3AHXxVA2FTrQ2BcOQHsdXJ9kELfcazTZWZsPU2hampfIGYZzyzLnTX06dUubuuy2++LUSQ==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/token-list@3.57.0':
+ resolution: {integrity: sha512-K8CNdJRHjQzKAL0HYSxab/pNJVQZTv0xV/cbssaf2WwiDy3jVCNvWGg7S886rRPr2yLgoVMhv12B6IAhJ1SSFw==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/ui@0.11.0':
resolution: {integrity: sha512-V1R3CTQ8MltuajZ53PCHGe9mmRwyx1RpjHA2wWOv+79dV0qQ1Y/psL0YTMY4eteL4SNAlBcjJVP66zD5O6yF8Q==}
engines: {node: '>=20.10.0', npm: '>=10.2.3'}
@@ -10515,6 +10731,17 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
+ '@wordpress/upload-media@0.42.0':
+ resolution: {integrity: sha512-uDN+5d4fkR4iph36H5vX0OaQgQ+myZKoZjhcqhZ/ZXbo/mgsyv8D4wTzRPENCQ033M/Cu1J5kQhSLXQQh0Xx2Q==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@wordpress/url@3.59.0':
resolution: {integrity: sha512-GxvoMjYCav0w4CiX0i0h3qflrE/9rhLIZg5aPCQjbrBdwTxYR3Exfw0IJYcmVaTKXQOUU8fOxlDxULsbLmKe9w==}
engines: {node: '>=12'}
@@ -10527,6 +10754,14 @@ packages:
resolution: {integrity: sha512-EiTMmEwotXY4Cu6casJ10HEe0ocsdVujkm1iZyA0vvu2qtR5IIQqlSVGxDx96cJBP6cB2b8x2ebGLWfnwow4/Q==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/url@4.57.0':
+ resolution: {integrity: sha512-2y8No4z7GNlrNjR7hUTThSG7hVRDAQixwFxPj8JUydjMS9nv02PBgZhy7XakFXVZFw2PsmajTW56+BdQFKp96A==}
+ engines: {node: '>=18.12.0'}
+
+ '@wordpress/video-conversion@0.8.0':
+ resolution: {integrity: sha512-z4hw+G/DgrMe6O3c4YoQCg8FhqGO0Fj1iHpFhviSvI7IHShR/CaoyPbxSi7HfTXr8HuX5yNe4VDD4VOCZnFYlQ==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/viewport@5.35.0':
resolution: {integrity: sha512-iCIVbFcA1CzGXEVu5COoi6DRdh3m3zEMWOYKKqF1C7W/LhZnTNRsHOZbHq0tv7MOkwx0Nl7+hDJlPRM0B3fb7A==}
engines: {node: '>=12'}
@@ -10563,10 +10798,28 @@ packages:
resolution: {integrity: sha512-6Lqw+XDOZfBBawWDCpJP3mKdxpcWSXyVfRnpHJWMsEcXm067m9MXEmZv21nRsqVGi6D6bzOeLGF5fvlD1arqag==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/views@2.0.0':
+ resolution: {integrity: sha512-lXeIA1DFlfJ1237yiNkVVmS6SQpW4289Y0Ieh3KmfUxuJYa7SyavSELMFF5pU51X6DdOOj8E7s8h2Vbw1usr4w==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ '@types/react': 18.3.x
+ '@types/react-dom': ^18 || ^19
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@wordpress/vips@2.1.1':
resolution: {integrity: sha512-3NvM0Bk4xrNhYI8Xgn9+dphE3FbJANhe9aNoU1J/Wqmqt3EpUJY5KoykFkfpHJWbdiLohSMkKIyVylGMdHpP7g==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/vips@4.3.0':
+ resolution: {integrity: sha512-yGvJ/qKTD9PpoUdUpXctQxcdYyewiSltror2NTSn0G+fHYJyH2U5NQG5/VwBEioMJt6fzTeUhIYspY7A0045fQ==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/warning@2.58.0':
resolution: {integrity: sha512-9bZlORhyMY2nbWozeyC5kqJsFzEPP4DCLhGmjtbv+YWGHttUrxUZEfrKdqO+rUODA8rP5zeIly1nCQOUnkw4Lg==}
engines: {node: '>=12'}
@@ -10601,6 +10854,10 @@ packages:
resolution: {integrity: sha512-/IdYqxbvAFgAf3O72lUj5ybeWMglG2dYwL8wz17koSHqH5XKlbIQrNGvz4XIvQueiewd4MvLOqIFt2TVHHU6/A==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+ '@wordpress/worker-threads@1.17.0':
+ resolution: {integrity: sha512-Pnw5u+BmiY5fNsoyUi7+99BmncNXalhu7nWos83TLX1RSxyWunTouUZagbq0La+DLoc4ogYhJNVtLfMygvwsEw==}
+ engines: {node: '>=18.12.0'}
+
'@wordpress/worker-threads@1.8.1':
resolution: {integrity: sha512-xrVypgVxciFPyc704/0fdQ6bf5BZrf2EXtTPQ4BSU0ylnvfSvgvTCYWdVzlI4VySq+FNfHgLHTCxKiKT23CrSQ==}
engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -15477,6 +15734,11 @@ packages:
resolution: {integrity: sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==}
engines: {node: '>=12'}
+ marked@18.1.1:
+ resolution: {integrity: sha512-zEGgrtUG8crk+TrMacJSVABU4DYDDkS8uqgU3ohrn/2fW9C2AEfUrO3m6IhpIpQpl7YcVpiXXC9cSMWDANT3dg==}
+ engines: {node: '>= 20'}
+ hasBin: true
+
marky@1.3.0:
resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==}
@@ -15520,6 +15782,9 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
+ mediabunny@1.62.1:
+ resolution: {integrity: sha512-lYzeerDwo9QLhBCipqQDXOSV7InvaIFplllZQviPO5rPwH+IUr8M1uvumk1olIUgMRGkPiInRriv25WFErUgMw==}
+
memfs@3.5.3:
resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
engines: {node: '>= 4.0.0'}
@@ -19425,6 +19690,10 @@ packages:
resolution: {integrity: sha512-nhkqUNJDUymImoXGrVfImC4wzIFTb9KfBpAngb7dcEQNPP1gVTx4+WL3VVVDSXQpMsyeacsQDOx0+DM33Rpurg==}
engines: {node: '>=16.4.0'}
+ wasm-vips@0.0.18:
+ resolution: {integrity: sha512-AJyCvxZj/3qceKNnh+YyEobu/IaJFoPN7x7SxyyHmYBS3kASMqJqxQEuN0ZHKQDWsCJ8armfx4Tq3uKrNc+nMA==}
+ engines: {node: '>=17.0.0'}
+
watchpack@2.5.1:
resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
engines: {node: '>=10.13.0'}
@@ -19890,7 +20159,6 @@ packages:
resolution: {integrity: sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==}
snapshots:
-
'@actions/core@2.0.3':
dependencies:
'@actions/exec': 2.0.0
@@ -24595,12 +24863,25 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.28
+ '@react-spring/animated@10.1.2(react@18.3.1)':
+ dependencies:
+ '@react-spring/shared': 10.1.2(react@18.3.1)
+ '@react-spring/types': 10.1.2
+ react: 18.3.1
+
'@react-spring/animated@9.7.5(react@18.3.1)':
dependencies:
'@react-spring/shared': 9.7.5(react@18.3.1)
'@react-spring/types': 9.7.5
react: 18.3.1
+ '@react-spring/core@10.1.2(react@18.3.1)':
+ dependencies:
+ '@react-spring/animated': 10.1.2(react@18.3.1)
+ '@react-spring/shared': 10.1.2(react@18.3.1)
+ '@react-spring/types': 10.1.2
+ react: 18.3.1
+
'@react-spring/core@9.7.5(react@18.3.1)':
dependencies:
'@react-spring/animated': 9.7.5(react@18.3.1)
@@ -24608,16 +24889,36 @@ snapshots:
'@react-spring/types': 9.7.5
react: 18.3.1
+ '@react-spring/rafz@10.1.2': {}
+
'@react-spring/rafz@9.7.5': {}
+ '@react-spring/shared@10.1.2(react@18.3.1)':
+ dependencies:
+ '@react-spring/rafz': 10.1.2
+ '@react-spring/types': 10.1.2
+ react: 18.3.1
+
'@react-spring/shared@9.7.5(react@18.3.1)':
dependencies:
'@react-spring/rafz': 9.7.5
'@react-spring/types': 9.7.5
react: 18.3.1
+ '@react-spring/types@10.1.2': {}
+
'@react-spring/types@9.7.5': {}
+ '@react-spring/web@10.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@react-spring/animated': 10.1.2(react@18.3.1)
+ '@react-spring/core': 10.1.2(react@18.3.1)
+ '@react-spring/shared': 10.1.2(react@18.3.1)
+ '@react-spring/types': 10.1.2
+ csstype: 3.2.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
'@react-spring/web@9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@react-spring/animated': 9.7.5(react@18.3.1)
@@ -25543,6 +25844,12 @@ snapshots:
'@types/doctrine@0.0.9': {}
+ '@types/dom-mediacapture-transform@0.1.12':
+ dependencies:
+ '@types/dom-webcodecs': 0.1.13
+
+ '@types/dom-webcodecs@0.1.13': {}
+
'@types/dompurify@2.4.0':
dependencies:
'@types/trusted-types': 2.0.7
@@ -26401,6 +26708,12 @@ snapshots:
'@wordpress/private-apis': 1.48.1
'@wordpress/url': 4.48.1
+ '@wordpress/api-fetch@7.57.0':
+ dependencies:
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/private-apis': 1.48.1
+ '@wordpress/url': 4.57.0
+
'@wordpress/autop@3.16.0':
dependencies:
'@babel/runtime': 7.29.10
@@ -26411,6 +26724,8 @@ snapshots:
'@wordpress/autop@4.48.1': {}
+ '@wordpress/autop@4.57.0': {}
+
'@wordpress/babel-preset-default@8.43.1-next.v.202604091042.0':
dependencies:
'@babel/core': 7.25.7
@@ -26465,6 +26780,8 @@ snapshots:
'@wordpress/blob@4.48.1': {}
+ '@wordpress/blob@4.57.0': {}
+
'@wordpress/block-editor@12.26.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.29.10
@@ -26790,6 +27107,71 @@ snapshots:
- supports-color
- vite
+ '@wordpress/block-editor@18.1.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+ dependencies:
+ '@react-spring/web': 10.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/a11y': 4.57.0
+ '@wordpress/base-styles': 13.3.0
+ '@wordpress/blob': 4.57.0
+ '@wordpress/block-serialization-default-parser': 5.57.0
+ '@wordpress/blocks': 16.2.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/commands': 1.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/components': 42.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/compose': 8.10.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/dataviews': 20.0.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/date': 5.57.0
+ '@wordpress/deprecated': 4.57.0
+ '@wordpress/dom': 4.57.0
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/global-styles-engine': 1.24.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/hooks': 4.57.0
+ '@wordpress/html-entities': 4.57.0
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/icons': 18.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/image-cropper': 1.21.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/interactivity': 7.0.0
+ '@wordpress/is-shallow-equal': 5.57.0
+ '@wordpress/kebab-case': 1.4.0
+ '@wordpress/keyboard-shortcuts': 5.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/keycodes': 4.57.0(@types/react@18.3.28)
+ '@wordpress/notices': 5.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/preferences': 4.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/priority-queue': 3.57.0
+ '@wordpress/private-apis': 1.48.1
+ '@wordpress/react-inert-value': 1.0.0(@types/react@18.3.28)(react@18.3.1)
+ '@wordpress/rich-text': 7.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/style-engine': 2.57.0(@types/react@18.3.28)
+ '@wordpress/token-list': 3.57.0
+ '@wordpress/ui': 0.24.0(@date-fns/tz@1.5.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/upload-media': 0.42.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/url': 4.57.0
+ '@wordpress/warning': 3.57.0
+ change-case: 4.1.2
+ clsx: 2.1.1
+ colord: 2.10.0
+ diff: 8.0.4
+ fast-deep-equal: 3.1.3
+ parsel-js: 1.2.2
+ postcss: 8.5.26
+ postcss-prefix-selector: 1.16.1(postcss@8.5.26)
+ postcss-urlrebase: 1.4.0(postcss@8.5.26)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-easy-crop: 5.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ remove-accents: 0.5.0
+ optionalDependencies:
+ '@types/react': 18.3.28
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - '@emotion/is-prop-valid'
+ - '@types/react-dom'
+ - esbuild
+ - lightningcss
+ - stylelint
+ - supports-color
+ - vite
+
'@wordpress/block-library@8.35.0(@emotion/is-prop-valid@1.4.0)(@preact/signals-core@1.14.1)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.29.10
@@ -26912,6 +27294,8 @@ snapshots:
'@wordpress/block-serialization-default-parser@5.48.1': {}
+ '@wordpress/block-serialization-default-parser@5.57.0': {}
+
'@wordpress/blocks@12.35.0(react@18.3.1)':
dependencies:
'@babel/runtime': 7.29.10
@@ -27011,6 +27395,41 @@ snapshots:
- '@types/react-dom'
- react-dom
+ '@wordpress/blocks@16.2.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@wordpress/autop': 4.57.0
+ '@wordpress/blob': 4.57.0
+ '@wordpress/block-serialization-default-parser': 5.57.0
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/deprecated': 4.57.0
+ '@wordpress/dom': 4.57.0
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/hooks': 4.57.0
+ '@wordpress/html-entities': 4.57.0
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/is-shallow-equal': 5.57.0
+ '@wordpress/keycodes': 4.57.0(@types/react@18.3.28)
+ '@wordpress/private-apis': 1.48.1
+ '@wordpress/rich-text': 7.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/shortcode': 4.57.0
+ '@wordpress/warning': 3.57.0
+ change-case: 4.1.2
+ colord: 2.10.0
+ fast-deep-equal: 3.1.3
+ hpq: 1.4.0
+ is-plain-object: 5.1.0
+ marked: 18.1.1
+ memize: 2.1.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 19.3.1
+ remove-accents: 0.5.0
+ simple-html-tokenizer: 0.5.11
+ uuid: 14.0.0
+ optionalDependencies:
+ '@types/react': 18.3.28
+ '@types/react-dom': 18.3.7(@types/react@18.3.28)
+
'@wordpress/browserslist-config@6.43.1-next.v.202604091042.0': {}
'@wordpress/browserslist-config@6.56.0': {}
@@ -27161,6 +27580,34 @@ snapshots:
- supports-color
- vite
+ '@wordpress/commands@1.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+ dependencies:
+ '@wordpress/base-styles': 13.3.0
+ '@wordpress/components': 42.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/icons': 18.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/keyboard-shortcuts': 5.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/keycodes': 4.57.0(@types/react@18.3.28)
+ '@wordpress/preferences': 4.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/private-apis': 1.48.1
+ clsx: 2.1.1
+ cmdk: 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - '@emotion/is-prop-valid'
+ - '@types/react'
+ - '@types/react-dom'
+ - esbuild
+ - lightningcss
+ - postcss
+ - stylelint
+ - supports-color
+ - vite
+
'@wordpress/components@14.2.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react-with-direction@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(reakit-utils@0.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(redux@4.2.1)':
dependencies:
'@babel/runtime': 7.29.10
@@ -28462,6 +28909,49 @@ snapshots:
- supports-color
- vite
+ '@wordpress/core-data@8.2.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+ dependencies:
+ '@wordpress/api-fetch': 7.57.0
+ '@wordpress/base-styles': 13.3.0
+ '@wordpress/block-editor': 18.1.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/blocks': 16.2.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/components': 42.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/compose': 8.10.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/deprecated': 4.57.0
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/global-styles-engine': 1.24.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/html-entities': 4.57.0
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/icons': 18.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/notices': 5.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/private-apis': 1.48.1
+ '@wordpress/rich-text': 7.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/sync': 2.0.0
+ '@wordpress/undo-manager': 1.57.0
+ '@wordpress/url': 4.57.0
+ '@wordpress/warning': 3.57.0
+ change-case: 4.1.2
+ clsx: 2.1.1
+ equivalent-key-map: 0.2.2
+ fast-deep-equal: 3.1.3
+ memize: 2.1.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ uuid: 14.0.0
+ optionalDependencies:
+ '@types/react': 18.3.28
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - '@emotion/is-prop-valid'
+ - '@types/react-dom'
+ - esbuild
+ - lightningcss
+ - postcss
+ - stylelint
+ - supports-color
+ - vite
+
'@wordpress/data-controls@4.33.1(@types/react@18.3.28)(react@18.3.1)':
dependencies:
'@wordpress/api-fetch': 7.33.1
@@ -29471,6 +29961,24 @@ snapshots:
- react
- react-dom
+ '@wordpress/global-styles-engine@1.24.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@wordpress/blocks': 16.2.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/private-apis': 1.48.1
+ '@wordpress/style-engine': 2.57.0(@types/react@18.3.28)
+ colord: 2.10.0
+ deepmerge: 4.3.1
+ fast-deep-equal: 3.1.3
+ is-plain-object: 5.1.0
+ memize: 2.1.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ '@types/react-dom': 18.3.7(@types/react@18.3.28)
+
'@wordpress/hooks@3.58.0':
dependencies:
'@babel/runtime': 7.29.10
@@ -29642,6 +30150,28 @@ snapshots:
- stylelint
- supports-color
+ '@wordpress/image-cropper@1.21.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+ dependencies:
+ '@wordpress/components': 42.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/i18n': 6.30.0
+ dequal: 2.0.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-easy-crop: 5.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - '@emotion/is-prop-valid'
+ - '@types/react-dom'
+ - esbuild
+ - lightningcss
+ - postcss
+ - stylelint
+ - supports-color
+ - vite
+
'@wordpress/interactivity-router@1.8.0(@preact/signals-core@1.14.1)':
dependencies:
'@wordpress/interactivity': 5.7.0(@preact/signals-core@1.14.1)
@@ -29680,6 +30210,12 @@ snapshots:
'@preact/signals': 1.3.4(preact@10.29.1)
preact: 10.29.1
+ '@wordpress/interactivity@7.0.0':
+ dependencies:
+ '@preact/signals': 1.3.4(preact@10.29.1)
+ '@preact/signals-core': 1.14.1
+ preact: 10.29.1
+
'@wordpress/interface@10.3.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
dependencies:
'@wordpress/admin-ui': 2.12.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
@@ -29887,6 +30423,17 @@ snapshots:
- '@types/react-dom'
- react-dom
+ '@wordpress/keyboard-shortcuts@5.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/keycodes': 4.57.0(@types/react@18.3.28)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ '@types/react-dom': 18.3.7(@types/react@18.3.28)
+
'@wordpress/keycodes@3.58.0':
dependencies:
'@babel/runtime': 7.29.10
@@ -30083,6 +30630,27 @@ snapshots:
- stylelint
- supports-color
+ '@wordpress/notices@5.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+ dependencies:
+ '@wordpress/a11y': 4.57.0
+ '@wordpress/components': 42.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ clsx: 2.1.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ '@types/react-dom': 18.3.7(@types/react@18.3.28)
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - '@emotion/is-prop-valid'
+ - esbuild
+ - lightningcss
+ - postcss
+ - stylelint
+ - supports-color
+ - vite
+
'@wordpress/npm-package-json-lint-config@5.51.0(npm-package-json-lint@6.4.0(typescript@5.7.3))':
dependencies:
npm-package-json-lint: 6.4.0(typescript@5.7.3)
@@ -31056,6 +31624,10 @@ snapshots:
dependencies:
memize: 2.1.1
+ '@wordpress/shortcode@4.57.0':
+ dependencies:
+ memize: 2.1.1
+
'@wordpress/style-engine@1.41.0':
dependencies:
'@babel/runtime': 7.29.10
@@ -31070,6 +31642,12 @@ snapshots:
'@types/react': 18.3.28
change-case: 4.1.2
+ '@wordpress/style-engine@2.57.0(@types/react@18.3.28)':
+ dependencies:
+ change-case: 4.1.2
+ optionalDependencies:
+ '@types/react': 18.3.28
+
'@wordpress/style-runtime@0.12.0': {}
'@wordpress/style-runtime@0.13.0': {}
@@ -31126,6 +31704,16 @@ snapshots:
y-protocols: 1.0.7(yjs@13.6.30)
yjs: 13.6.30
+ '@wordpress/sync@2.0.0':
+ dependencies:
+ '@wordpress/api-fetch': 7.57.0
+ '@wordpress/hooks': 4.57.0
+ diff: 8.0.4
+ fast-deep-equal: 3.1.3
+ lib0: 0.2.117
+ y-protocols: 1.0.7(yjs@13.6.30)
+ yjs: 13.6.30
+
'@wordpress/theme@0.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
dependencies:
'@wordpress/element': 6.45.0
@@ -31255,6 +31843,8 @@ snapshots:
'@wordpress/token-list@3.48.1': {}
+ '@wordpress/token-list@3.57.0': {}
+
'@wordpress/ui@0.11.0(@date-fns/tz@1.5.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
dependencies:
'@base-ui/react': 1.8.0(@date-fns/tz@1.5.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -31640,6 +32230,25 @@ snapshots:
- supports-color
- vite
+ '@wordpress/upload-media@0.42.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@wordpress/blob': 4.57.0
+ '@wordpress/compose': 8.10.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/i18n': 6.30.0
+ '@wordpress/private-apis': 1.48.1
+ '@wordpress/url': 4.57.0
+ '@wordpress/video-conversion': 0.8.0
+ '@wordpress/vips': 4.3.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ uuid: 14.0.0
+ optionalDependencies:
+ '@types/react': 18.3.28
+ transitivePeerDependencies:
+ - '@types/react-dom'
+
'@wordpress/url@3.59.0':
dependencies:
'@babel/runtime': 7.29.10
@@ -31653,6 +32262,15 @@ snapshots:
dependencies:
remove-accents: 0.5.0
+ '@wordpress/url@4.57.0':
+ dependencies:
+ remove-accents: 0.5.0
+
+ '@wordpress/video-conversion@0.8.0':
+ dependencies:
+ '@wordpress/worker-threads': 1.17.0
+ mediabunny: 1.62.1
+
'@wordpress/viewport@5.35.0(react@18.3.1)':
dependencies:
'@babel/runtime': 7.29.10
@@ -31740,11 +32358,40 @@ snapshots:
- supports-color
- vite
+ '@wordpress/views@2.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+ dependencies:
+ '@wordpress/core-data': 8.2.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/data': 10.57.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/dataviews': 20.0.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/element': 9.0.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@wordpress/preferences': 4.57.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(esbuild@0.27.7)(postcss@8.5.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+ '@wordpress/private-apis': 1.48.1
+ dequal: 2.0.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ '@types/react-dom': 18.3.7(@types/react@18.3.28)
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - '@emotion/is-prop-valid'
+ - esbuild
+ - lightningcss
+ - postcss
+ - stylelint
+ - supports-color
+ - vite
+
'@wordpress/vips@2.1.1':
dependencies:
'@wordpress/worker-threads': 1.8.1
wasm-vips: 0.0.17
+ '@wordpress/vips@4.3.0':
+ dependencies:
+ '@wordpress/worker-threads': 1.17.0
+ wasm-vips: 0.0.18
+
'@wordpress/warning@2.58.0': {}
'@wordpress/warning@3.33.1': {}
@@ -31785,6 +32432,10 @@ snapshots:
'@wordpress/wordcount@4.48.1': {}
+ '@wordpress/worker-threads@1.17.0':
+ dependencies:
+ comctx: 1.6.1
+
'@wordpress/worker-threads@1.8.1':
dependencies:
comctx: 1.6.1
@@ -37767,6 +38418,8 @@ snapshots:
dependencies:
markdown-it: 12.3.2
+ marked@18.1.1: {}
+
marky@1.3.0: {}
math-intrinsics@1.1.0: {}
@@ -37807,6 +38460,11 @@ snapshots:
media-typer@0.3.0: {}
+ mediabunny@1.62.1:
+ dependencies:
+ '@types/dom-mediacapture-transform': 0.1.12
+ '@types/dom-webcodecs': 0.1.13
+
memfs@3.5.3:
dependencies:
fs-monkey: 1.1.0
@@ -41660,6 +42318,25 @@ snapshots:
babel-jest: 29.7.0(@babel/core@7.25.7)
esbuild: 0.27.7
+ ts-jest@29.1.5(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(esbuild@0.27.7)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3):
+ dependencies:
+ bs-logger: 0.2.6
+ fast-json-stable-stringify: 2.1.0
+ jest: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
+ jest-util: 29.7.0
+ json5: 2.2.3
+ lodash.memoize: 4.1.2
+ make-error: 1.3.6
+ semver: 7.8.5
+ typescript: 5.7.3
+ yargs-parser: 21.1.1
+ optionalDependencies:
+ '@babel/core': 7.29.7
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.29.7)
+ esbuild: 0.27.7
+
ts-jest@29.1.5(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(esbuild@0.27.7)(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3):
dependencies:
bs-logger: 0.2.6
@@ -42119,6 +42796,8 @@ snapshots:
wasm-vips@0.0.17: {}
+ wasm-vips@0.0.18: {}
+
watchpack@2.5.1:
dependencies:
glob-to-regexp: 0.4.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index b9f30afe810..048e07c544f 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -67,7 +67,7 @@ catalogs:
'@wordpress/theme': 0.17.0
'@wordpress/ui': 0.17.0
'@wordpress/undo-manager': 1.33.1
- '@wordpress/views': 1.0.8
+ '@wordpress/views': 2.0.0
'@wordpress/base-styles': 6.9.1
# Shared build tooling used across workspace packages.