From 2acd6084d7caf1fa75036f32b5c131e394cca30b Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 15:07:19 -0700 Subject: [PATCH 01/39] Get asset compiling setup with proper webpack config --- package-lock.json | 37 +++++++++++++++++++++++++++++++++++-- package.json | 7 +++++-- webpack.config.js | 12 ++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 webpack.config.js diff --git a/package-lock.json b/package-lock.json index 3a44df60..13e6a68d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,13 @@ "version": "0.1.0", "license": "GPL-2.0-or-later", "devDependencies": { + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", "@wordpress/prettier-config": "^4.31.0", - "@wordpress/scripts": "^30.26.0" + "@wordpress/scripts": "^30.26.0", + "typescript": "^5.4.5" }, "engines": { "node": ">=20.10.0", @@ -4918,6 +4921,12 @@ "@types/pg": "*" } }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -4930,6 +4939,25 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/react": { + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -8518,6 +8546,12 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, "node_modules/cwd": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", @@ -20401,7 +20435,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index d68487d6..d4cdcfe3 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ ], "scripts": { "plugin-zip": "wp-scripts plugin-zip", - "build": "echo 'Building...'", + "build": "wp-scripts build", "wp-env": "wp-env", "lint:php": "wp-env run tests-cli --env-cwd=wp-content/plugins/ai composer run-script lint", "lint:php:fix": "wp-env run tests-cli --env-cwd=wp-content/plugins/ai composer run-script format", @@ -22,10 +22,13 @@ "lint:js": "wp-scripts lint-js" }, "devDependencies": { + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", "@wordpress/prettier-config": "^4.31.0", - "@wordpress/scripts": "^30.26.0" + "@wordpress/scripts": "^30.26.0", + "typescript": "^5.4.5" }, "engines": { "node": ">=20.10.0", diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..0e08c01c --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,12 @@ +const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); +const path = require( 'path' ); + +const webpackConfig = { + ...defaultConfig, + entry: { + ...defaultConfig.entry(), + 'features/title-generation': './src/features/title-generation/index.js' + }, +}; + +module.exports = webpackConfig; From cbd8a469cd7b56d5fd0c71f5d5c196f6d831da00 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 15:07:35 -0700 Subject: [PATCH 02/39] Add a class that can be used to load assets --- includes/AssetLoader.php | 108 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 includes/AssetLoader.php diff --git a/includes/AssetLoader.php b/includes/AssetLoader.php new file mode 100644 index 00000000..8827a7e6 --- /dev/null +++ b/includes/AssetLoader.php @@ -0,0 +1,108 @@ + array(), + 'version' => filemtime( $script_path ), + ); + } + + wp_enqueue_script( + 'ai_' . $handle, + $script_url, + $asset_data['dependencies'], + $asset_data['version'], + true + ); + } + + /** + * Enqueue a style using a style path and its asset metadata. + * + * @since 0.1.0 + * + * @param string $handle The handle for the style. + * @param string $file_name The script file name. + */ + public static function enqueue_style( string $handle, string $file_name ): void { + $style_path = WP_AI_DIR . 'build/' . $file_name . '.css'; + $style_url = AI_PLUGIN_URL . 'build/' . $file_name . '.css'; + $style_asset_path = $style_path . '.asset.php'; + + if ( file_exists( $style_asset_path ) ) { + $asset_data = require $style_asset_path; + } else { + $asset_data = array( + 'dependencies' => array(), + 'version' => filemtime( $style_path ), + ); + } + + wp_enqueue_style( + 'ai_' . $handle, + $style_url, + array(), + $asset_data['version'] + ); + } + + /** + * Localize data for an enqueued script. + * + * This method allows passing PHP data to JavaScript using `wp_localize_script()`. + * It must be called after the script has been enqueued using `enqueue_script()`. + * + * @since 0.1.0 + * + * @param string $handle The script handle used in `enqueue_script()` (without prefix). + * @param string $object_name The name of the JavaScript object to contain the data. + * @param array $data The data to localize. + */ + public static function localize_script( string $handle, string $object_name, array $data ): void { + wp_localize_script( + 'ai_' . $handle, + 'ai_' . $object_name, + $data + ); + } +} From c37a85b1524d04a47c6a52b3ad4c23d670238b65 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 15:17:46 -0700 Subject: [PATCH 03/39] Add the structure needed in the src directory --- src/features/title-generation/index.tsx | 5 +++++ src/index.js | 0 webpack.config.js | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/features/title-generation/index.tsx create mode 100644 src/index.js diff --git a/src/features/title-generation/index.tsx b/src/features/title-generation/index.tsx new file mode 100644 index 00000000..3c3ee973 --- /dev/null +++ b/src/features/title-generation/index.tsx @@ -0,0 +1,5 @@ +document.addEventListener( 'DOMContentLoaded', initialize ); + +function initialize() { + console.log( 'Title generation feature initialized!' ); +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..e69de29b diff --git a/webpack.config.js b/webpack.config.js index 0e08c01c..484f613d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -5,7 +5,7 @@ const webpackConfig = { ...defaultConfig, entry: { ...defaultConfig.entry(), - 'features/title-generation': './src/features/title-generation/index.js' + 'features/title-generation': './src/features/title-generation/index.tsx' }, }; From 443b29d39bb59273007a7d77e9716b515cd4df63 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 15:18:04 -0700 Subject: [PATCH 04/39] Load the assets in our feature --- .../Title_Generation/Title_Generation.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/includes/Features/Title_Generation/Title_Generation.php b/includes/Features/Title_Generation/Title_Generation.php index 819ed4e4..1b93650d 100644 --- a/includes/Features/Title_Generation/Title_Generation.php +++ b/includes/Features/Title_Generation/Title_Generation.php @@ -7,6 +7,7 @@ namespace WordPress\AI\Features\Title_Generation; +use WordPress\AI\AssetLoader; use WordPress\AI\API_Request; use WordPress\AI\Abilities\Title_Generation as Title_Generation_Ability; use WordPress\AI\Abstracts\Abstract_Feature; @@ -40,6 +41,7 @@ protected function load_feature_metadata(): array { */ public function register(): void { add_action( 'wp_abilities_api_init', array( $this, 'register_abilities' ) ); + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); } /** @@ -104,4 +106,37 @@ static function ( $key, $value ) { return $response; } + + /** + * Enqueues and localizes the admin script. + * + * @since 0.1.0 + * + * @param string $hook_suffix The current admin page hook suffix. + */ + public function enqueue_assets( string $hook_suffix ): void { + // Load asset in new post and edit post screens only. + if ( 'post.php' !== $hook_suffix && 'post-new.php' !== $hook_suffix ) { + return; + } + + $screen = get_current_screen(); + + // Load the assets only if the post type supports titles and is not an attachment. + if ( + ! post_type_supports( $screen->post_type, 'title' ) || + in_array( $screen->post_type, [ 'attachment' ], true ) + ) { + return; + } + + AssetLoader::enqueue_script( 'title_generation', 'features/title-generation' ); + AssetLoader::localize_script( + 'title_generation', + 'title_generation_data', + array( + 'enabled' => $this->is_enabled(), + ) + ); + } } From b7c395b5d7ce146da36cb2fa27c299456063b961 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 15:18:58 -0700 Subject: [PATCH 05/39] Rename file --- includes/{AssetLoader.php => Asset_Loader.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename includes/{AssetLoader.php => Asset_Loader.php} (100%) diff --git a/includes/AssetLoader.php b/includes/Asset_Loader.php similarity index 100% rename from includes/AssetLoader.php rename to includes/Asset_Loader.php From ef41f6298545b3b22d4356da9c155c7e09e89c02 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 15:19:55 -0700 Subject: [PATCH 06/39] Rename everywhere --- includes/Asset_Loader.php | 6 +++--- includes/Features/Title_Generation/Title_Generation.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/includes/Asset_Loader.php b/includes/Asset_Loader.php index 8827a7e6..cf58d5b8 100644 --- a/includes/Asset_Loader.php +++ b/includes/Asset_Loader.php @@ -1,6 +1,6 @@ Date: Thu, 6 Nov 2025 16:18:11 -0700 Subject: [PATCH 07/39] Add base structure to modify the post title block and add in a custom toolbar --- package-lock.json | 3387 ++++++++++++++++- package.json | 10 + .../components/TitleToolbar.tsx | 141 + src/features/title-generation/index.tsx | 38 +- src/features/title-generation/utils/casing.ts | 99 + 5 files changed, 3497 insertions(+), 178 deletions(-) create mode 100644 src/features/title-generation/components/TitleToolbar.tsx create mode 100644 src/features/title-generation/utils/casing.ts diff --git a/package-lock.json b/package-lock.json index 13e6a68d..d002b33c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,21 @@ "name": "ai", "version": "0.1.0", "license": "GPL-2.0-or-later", + "dependencies": { + "@wordpress/icons": "^11.1.0" + }, "devDependencies": { "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", + "@types/wordpress__blocks": "^12.5.18", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", + "@wordpress/hooks": "^4.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", "typescript": "^5.4.5" @@ -35,6 +45,44 @@ "node": ">=6.0.0" } }, + "node_modules/@ariakit/core": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.16.tgz", + "integrity": "sha512-nPJ0Be8d5ZvRApYGqdLMuYUjP7ktkPmTPOXyZFw+0Illk8LKgF3Q74ctVGuoQurJNDsANXcewzlyXK4vyIAGTA==", + "dev": true + }, + "node_modules/@ariakit/react": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.19.tgz", + "integrity": "sha512-n6q8leSQWXMk4vhcZlpnj8cIlAY0n+1bvVTwHvaVfmec4LjW49MFKkJRZd1AiV+SE73nkxPwSL3IbaS4p1aRxQ==", + "dev": true, + "dependencies": { + "@ariakit/react-core": "0.4.19" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ariakit" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@ariakit/react-core": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.19.tgz", + "integrity": "sha512-Aj+fu4pMyPXtlBghI+E7KSWItqJkbAqEhut3DlsFAjK9fQdHE+e1tQJG1PtnoEdD9BExkJWQ6R4M5a9HkEhqPA==", + "dev": true, + "dependencies": { + "@ariakit/core": "0.4.16", + "@floating-ui/dom": "^1.0.0", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -1866,6 +1914,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -2068,6 +2125,12 @@ "@csstools/css-tokenizer": "^3.0.1" } }, + "node_modules/@date-fns/tz": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", + "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", + "dev": true + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -2087,6 +2150,192 @@ "url": "https://github.com/sponsors/JounQin" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/css": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.5.tgz", + "integrity": "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==", + "dev": true, + "dependencies": { + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "dev": true + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "dev": true + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "dev": true, + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "dev": true + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "dev": true + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "dev": true + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "dev": true + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -2235,6 +2484,44 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "dev": true, + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dev": true, + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "dev": true + }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", @@ -4151,118 +4438,631 @@ "node": ">=10" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "dev": true }, - "node_modules/@sentry/core": { - "version": "9.46.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", - "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "dev": true, - "engines": { - "node": ">=18" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@sentry/node": { - "version": "9.46.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.46.0.tgz", - "integrity": "sha512-pRLqAcd7GTGvN8gex5FtkQR5Mcol8gOy1WlyZZFq4rBbVtMbqKOQRhohwqnb+YrnmtFpj7IZ7KNDo077MvNeOQ==", + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "dev": true, - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.30.1", - "@opentelemetry/core": "^1.30.1", - "@opentelemetry/instrumentation": "^0.57.2", - "@opentelemetry/instrumentation-amqplib": "^0.46.1", - "@opentelemetry/instrumentation-connect": "0.43.1", - "@opentelemetry/instrumentation-dataloader": "0.16.1", - "@opentelemetry/instrumentation-express": "0.47.1", - "@opentelemetry/instrumentation-fs": "0.19.1", - "@opentelemetry/instrumentation-generic-pool": "0.43.1", - "@opentelemetry/instrumentation-graphql": "0.47.1", - "@opentelemetry/instrumentation-hapi": "0.45.2", - "@opentelemetry/instrumentation-http": "0.57.2", - "@opentelemetry/instrumentation-ioredis": "0.47.1", - "@opentelemetry/instrumentation-kafkajs": "0.7.1", - "@opentelemetry/instrumentation-knex": "0.44.1", - "@opentelemetry/instrumentation-koa": "0.47.1", - "@opentelemetry/instrumentation-lru-memoizer": "0.44.1", - "@opentelemetry/instrumentation-mongodb": "0.52.0", - "@opentelemetry/instrumentation-mongoose": "0.46.1", - "@opentelemetry/instrumentation-mysql": "0.45.1", - "@opentelemetry/instrumentation-mysql2": "0.45.2", - "@opentelemetry/instrumentation-pg": "0.51.1", - "@opentelemetry/instrumentation-redis-4": "0.46.1", - "@opentelemetry/instrumentation-tedious": "0.18.1", - "@opentelemetry/instrumentation-undici": "0.10.1", - "@opentelemetry/resources": "^1.30.1", - "@opentelemetry/sdk-trace-base": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.34.0", - "@prisma/instrumentation": "6.11.1", - "@sentry/core": "9.46.0", - "@sentry/node-core": "9.46.0", - "@sentry/opentelemetry": "9.46.0", - "import-in-the-middle": "^1.14.2", - "minimatch": "^9.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@sentry/node-core": { - "version": "9.46.0", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.46.0.tgz", - "integrity": "sha512-XRVu5pqoklZeh4wqhxCLZkz/ipoKhitctgEFXX9Yh1e1BoHM2pIxT52wf+W6hHM676TFmFXW3uKBjsmRM3AjgA==", + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "dev": true, + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "dev": true, "dependencies": { - "@sentry/core": "9.46.0", - "@sentry/opentelemetry": "9.46.0", - "import-in-the-middle": "^1.14.2" - }, - "engines": { - "node": ">=18" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", - "@opentelemetry/core": "^1.30.1 || ^2.0.0", - "@opentelemetry/instrumentation": ">=0.57.1 <1", - "@opentelemetry/resources": "^1.30.1 || ^2.0.0", - "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", - "@opentelemetry/semantic-conventions": "^1.34.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@sentry/opentelemetry": { - "version": "9.46.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.46.0.tgz", - "integrity": "sha512-w2zTxqrdmwRok0cXBoh+ksXdGRUHUZhlpfL/H2kfTodOL+Mk8rW72qUmfqQceXoqgbz8UyK8YgJbyt+XS5H4Qg==", + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "dev": true, "dependencies": { - "@sentry/core": "9.46.0" - }, - "engines": { - "node": ">=18" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", - "@opentelemetry/core": "^1.30.1 || ^2.0.0", - "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", - "@opentelemetry/semantic-conventions": "^1.34.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "dev": true, + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "dev": true, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "dev": true, + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "dev": true, + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "dev": true, + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "dev": true, + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "dev": true, + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "dev": true, + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "dev": true, + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "dev": true, + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "dev": true, + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "dev": true, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "dev": true, + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "dev": true, + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "dev": true, + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "dev": true, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "dev": true, + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "dev": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "dev": true + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "dev": true, + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "dev": true + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "dev": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@sentry/core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", + "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.46.0.tgz", + "integrity": "sha512-pRLqAcd7GTGvN8gex5FtkQR5Mcol8gOy1WlyZZFq4rBbVtMbqKOQRhohwqnb+YrnmtFpj7IZ7KNDo077MvNeOQ==", + "dev": true, + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1", + "@opentelemetry/core": "^1.30.1", + "@opentelemetry/instrumentation": "^0.57.2", + "@opentelemetry/instrumentation-amqplib": "^0.46.1", + "@opentelemetry/instrumentation-connect": "0.43.1", + "@opentelemetry/instrumentation-dataloader": "0.16.1", + "@opentelemetry/instrumentation-express": "0.47.1", + "@opentelemetry/instrumentation-fs": "0.19.1", + "@opentelemetry/instrumentation-generic-pool": "0.43.1", + "@opentelemetry/instrumentation-graphql": "0.47.1", + "@opentelemetry/instrumentation-hapi": "0.45.2", + "@opentelemetry/instrumentation-http": "0.57.2", + "@opentelemetry/instrumentation-ioredis": "0.47.1", + "@opentelemetry/instrumentation-kafkajs": "0.7.1", + "@opentelemetry/instrumentation-knex": "0.44.1", + "@opentelemetry/instrumentation-koa": "0.47.1", + "@opentelemetry/instrumentation-lru-memoizer": "0.44.1", + "@opentelemetry/instrumentation-mongodb": "0.52.0", + "@opentelemetry/instrumentation-mongoose": "0.46.1", + "@opentelemetry/instrumentation-mysql": "0.45.1", + "@opentelemetry/instrumentation-mysql2": "0.45.2", + "@opentelemetry/instrumentation-pg": "0.51.1", + "@opentelemetry/instrumentation-redis-4": "0.46.1", + "@opentelemetry/instrumentation-tedious": "0.18.1", + "@opentelemetry/instrumentation-undici": "0.10.1", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-trace-base": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@prisma/instrumentation": "6.11.1", + "@sentry/core": "9.46.0", + "@sentry/node-core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", + "import-in-the-middle": "^1.14.2", + "minimatch": "^9.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node-core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.46.0.tgz", + "integrity": "sha512-XRVu5pqoklZeh4wqhxCLZkz/ipoKhitctgEFXX9Yh1e1BoHM2pIxT52wf+W6hHM676TFmFXW3uKBjsmRM3AjgA==", + "dev": true, + "dependencies": { + "@sentry/core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", + "import-in-the-middle": "^1.14.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/resources": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.46.0.tgz", + "integrity": "sha512-w2zTxqrdmwRok0cXBoh+ksXdGRUHUZhlpfL/H2kfTodOL+Mk8rW72qUmfqQceXoqgbz8UyK8YgJbyt+XS5H4Qg==", + "dev": true, + "dependencies": { + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "engines": { @@ -4587,6 +5387,43 @@ "node": ">=10" } }, + "node_modules/@tannin/compile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", + "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", + "dev": true, + "dependencies": { + "@tannin/evaluate": "^1.2.0", + "@tannin/postfix": "^1.1.0" + } + }, + "node_modules/@tannin/evaluate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", + "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==", + "dev": true + }, + "node_modules/@tannin/plural-forms": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", + "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", + "dev": true, + "dependencies": { + "@tannin/compile": "^1.1.0" + } + }, + "node_modules/@tannin/postfix": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", + "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==", + "dev": true + }, + "node_modules/@tannin/sprintf": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@tannin/sprintf/-/sprintf-1.3.3.tgz", + "integrity": "sha512-RwARl+hFwhzy0tg9atWcchLFvoQiOh4rrP7uG2N5E4W80BPCUX0ElcUR9St43fxB9EfjsW2df9Qp+UsTbvQDjA==", + "dev": true + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -4773,6 +5610,18 @@ "@types/node": "*" } }, + "node_modules/@types/gradient-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-1.1.0.tgz", + "integrity": "sha512-SaEcbgQscHtGJ1QL+ajgDTmmqU2f6T+00jZRcFlVHUW2Asivc84LNUev/UQFyu117AsdyrtI+qpwLvgjJXJxmw==", + "dev": true + }, + "node_modules/@types/highlight-words-core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/highlight-words-core/-/highlight-words-core-1.2.1.tgz", + "integrity": "sha512-9VZUA5omXBfn+hDxFjUDu1FOJTBM3LmvqfDey+Z6Aa8B8/JmF5SMj6FBrjfgJ/Q3YXOZd3qyTDfJyMZSs/wCUA==", + "dev": true + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", @@ -4862,6 +5711,12 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, + "node_modules/@types/mousetrap": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz", + "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==", + "dev": true + }, "node_modules/@types/mysql": { "version": "2.15.26", "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", @@ -4924,8 +5779,7 @@ "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==" }, "node_modules/@types/qs": { "version": "6.14.0", @@ -4943,7 +5797,6 @@ "version": "18.3.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", - "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4953,7 +5806,6 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -5045,15 +5897,517 @@ "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", "dev": true, "dependencies": { - "@types/node": "*" + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "node_modules/@types/wordpress__blocks": { + "version": "12.5.18", + "resolved": "https://registry.npmjs.org/@types/wordpress__blocks/-/wordpress__blocks-12.5.18.tgz", + "integrity": "sha512-KDugvZn2fEd1mIyYSE4j0QS4vkXOyz1r4akFrnUyJBoIBVQNqDopqXW2qX7kIrTXk9MydWZpdReNDg2Me02s4g==", + "dev": true, + "dependencies": { + "@types/react": "^18", + "@wordpress/components": "^27.2.0", + "@wordpress/data": "^9.13.0", + "@wordpress/element": "^5.0.0", + "@wordpress/shortcode": "^4.14.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@ariakit/core": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.3.11.tgz", + "integrity": "sha512-+MnOeqnA4FLI/7vqsZLbZQHHN4ofd9kvkNjz44fNi0gqmD+ZbMWiDkFAvZII75dYnxYw5ZPpWjA4waK22VBWig==", + "dev": true + }, + "node_modules/@types/wordpress__blocks/node_modules/@ariakit/react": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.3.14.tgz", + "integrity": "sha512-h71BPMZ2eW+E2ESbdYxSAEMR1DozYzd5eHE5IOzGd9Egi5u7EZxqmuW4CXVXZ1Y6vbaDMV3SudgPh7iHS/ArFw==", + "dev": true, + "dependencies": { + "@ariakit/react-core": "0.3.14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ariakit" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@ariakit/react-core": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.3.14.tgz", + "integrity": "sha512-16Qj6kDPglpdWtU5roY9q+G66naOjauTY5HvUIaL2aLY0187ATaRrABIKoMMzTtJyhvsud4jFlzivz+/zCQ8yw==", + "dev": true, + "dependencies": { + "@ariakit/core": "0.3.11", + "@floating-ui/dom": "^1.0.0", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@types/gradient-parser": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-0.1.3.tgz", + "integrity": "sha512-XDbrTSBlQV9nxE1GiDL3FaOPy4G/KaJkhDutBX48Kg8CYZMBARyyDFGCWfWJn4pobmInmwud1xxH7VJMAr0CKQ==", + "dev": true + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/a11y": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.58.0.tgz", + "integrity": "sha512-7NnJKl4+pxP6kV/jvXaJcZZCGzW7zaj6YeMnyjUd96cH4ta1ykBIveWgejerFOGsbK+88FnStcxSFj+dbDXs/w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/dom-ready": "^3.58.0", + "@wordpress/i18n": "^4.58.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/components": { + "version": "27.6.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-27.6.0.tgz", + "integrity": "sha512-f+fXENkgrPs5GLo2yu9fEAdVX0KriEatRcjDUyw0+DbNbJR62sCdDtGdhJRW4jPUUoUowxaGO0y4+jvQWxnbyg==", + "dev": true, + "dependencies": { + "@ariakit/react": "^0.3.12", + "@babel/runtime": "^7.16.0", + "@emotion/cache": "^11.7.1", + "@emotion/css": "^11.7.1", + "@emotion/react": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/styled": "^11.6.0", + "@emotion/utils": "^1.0.0", + "@floating-ui/react-dom": "^2.0.8", + "@types/gradient-parser": "0.1.3", + "@types/highlight-words-core": "1.2.1", + "@use-gesture/react": "^10.3.1", + "@wordpress/a11y": "^3.58.0", + "@wordpress/compose": "^6.35.0", + "@wordpress/date": "^4.58.0", + "@wordpress/deprecated": "^3.58.0", + "@wordpress/dom": "^3.58.0", + "@wordpress/element": "^5.35.0", + "@wordpress/escape-html": "^2.58.0", + "@wordpress/hooks": "^3.58.0", + "@wordpress/html-entities": "^3.58.0", + "@wordpress/i18n": "^4.58.0", + "@wordpress/icons": "^9.49.0", + "@wordpress/is-shallow-equal": "^4.58.0", + "@wordpress/keycodes": "^3.58.0", + "@wordpress/primitives": "^3.56.0", + "@wordpress/private-apis": "^0.40.0", + "@wordpress/rich-text": "^6.35.0", + "@wordpress/warning": "^2.58.0", + "change-case": "^4.1.2", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "date-fns": "^3.6.0", + "deepmerge": "^4.3.0", + "downshift": "^6.0.15", + "fast-deep-equal": "^3.1.3", + "framer-motion": "^11.1.9", + "gradient-parser": "^0.1.5", + "highlight-words-core": "^1.2.2", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0", + "path-to-regexp": "^6.2.1", + "re-resizable": "^6.4.0", + "react-colorful": "^5.3.1", + "remove-accents": "^0.5.0", + "use-lilius": "^2.0.5", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/compose": { + "version": "6.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-6.35.0.tgz", + "integrity": "sha512-PfruhCxxxJokDQHc2YBgerEiHV7BIxQk9g5vU4/f9X/0PBQWUTuxOzSFcAba03vnjfAgtPTSMp50T50hcJwXfA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@types/mousetrap": "^1.6.8", + "@wordpress/deprecated": "^3.58.0", + "@wordpress/dom": "^3.58.0", + "@wordpress/element": "^5.35.0", + "@wordpress/is-shallow-equal": "^4.58.0", + "@wordpress/keycodes": "^3.58.0", + "@wordpress/priority-queue": "^2.58.0", + "@wordpress/undo-manager": "^0.18.0", + "change-case": "^4.1.2", + "clipboard": "^2.0.11", + "mousetrap": "^1.6.5", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/data": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-9.28.0.tgz", + "integrity": "sha512-EDPpZdkngdoW7EMzPpGj0BmNcr7syJO67pgTODtN/4XFIdYL2RKzFyn3nlLBKhX17UsE/ALq9WdijacH4QJ9qw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/compose": "^6.35.0", + "@wordpress/deprecated": "^3.58.0", + "@wordpress/element": "^5.35.0", + "@wordpress/is-shallow-equal": "^4.58.0", + "@wordpress/priority-queue": "^2.58.0", + "@wordpress/private-apis": "^0.40.0", + "@wordpress/redux-routine": "^4.58.0", + "deepmerge": "^4.3.0", + "equivalent-key-map": "^0.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "redux": "^4.1.2", + "rememo": "^4.0.2", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/date": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.58.0.tgz", + "integrity": "sha512-yFT7DU0H9W0lsDytMaVMmjho08X1LeBMIQMppxdtKB04Ujx58hVh7gtunOsstUQ7pVg23nE2eLaVfx5JOdjzAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/deprecated": "^3.58.0", + "moment": "^2.29.4", + "moment-timezone": "^0.5.40" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/deprecated": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.58.0.tgz", + "integrity": "sha512-knweE2lLEUxWRr6A48sHiO0ww5pPybGe2NVIZVq/y7EaYCMdpy6gYA0ZdVqMKZvtxKKqicJfwigcn+hinsTvUQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/hooks": "^3.58.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/dom": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.58.0.tgz", + "integrity": "sha512-t3xSr/nqekj2qwUGRAqSeGx6116JOBxzI+VBiUfZrjGEnuyKdLelXDEeYtcwbb7etMkj/6F60/NB7GTl5IwizQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/deprecated": "^3.58.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/dom-ready": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.58.0.tgz", + "integrity": "sha512-sDgRPjNBToRKgYrpwvMRv2Yc7/17+sp8hm/rRnbubwb+d/DbGkK4Tc/r4sNLSZCqUAtcBXq9uk1lzvhge3QUSg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/element": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-5.35.0.tgz", + "integrity": "sha512-puswpGcIdS+0A2g28uHriMkZqqRCmzFczue5Tk99VNtzBdehyk7Ae+DZ4xw5yT6GqYai8NTqv6MRwCB78uh5Mw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@types/react": "^18.2.79", + "@types/react-dom": "^18.2.25", + "@wordpress/escape-html": "^2.58.0", + "change-case": "^4.1.2", + "is-plain-object": "^5.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/escape-html": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.58.0.tgz", + "integrity": "sha512-9YJXMNfzkrhHEVP1jFEhgijbZqW8Mt3NHIMZjIQoWtBf7QE86umpYpGGBXzYC0YlpGTRGzZTBwYaqFKxjeaSgA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/hooks": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.58.0.tgz", + "integrity": "sha512-9LB0ZHnZRQlORttux9t/xbAskF+dk2ujqzPGsVzc92mSKpQP3K2a5Wy74fUnInguB1vLUNHT6nrNdkVom5qX1Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/html-entities": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.58.0.tgz", + "integrity": "sha512-FU7b6QZdwTCuLKq6wCl0IZqqOMcMRxMcekVVytzTse7hYk9dvL1qQL/U4eQ/CNyKqiT9u7fb5NKTQILOzoolVQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/i18n": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.58.0.tgz", + "integrity": "sha512-VfvS3BWv/RDjRKD6PscIcvYfWKnGJcI/DEqyDgUMhxCM6NRwoL478CsUKTiGJIymeyRodNRfprdcF086DpGKYw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/hooks": "^3.58.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "sprintf-js": "^1.1.1", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/icons": { + "version": "9.49.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.49.0.tgz", + "integrity": "sha512-Z8F+ledkfkcKDuS1c/RkM0dEWdfv2AXs6bCgey89p0atJSscf7qYbMJR9zE5rZ5aqXyFfV0DAFKJEgayNqneNQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/element": "^5.35.0", + "@wordpress/primitives": "^3.56.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/is-shallow-equal": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.58.0.tgz", + "integrity": "sha512-NH2lbXo/6ix1t4Zu9UBXpXNtoLwSaYmIRSyDH34XNb0ic8a7yjEOhYWVW3LTfSCv9dJVyxlM5TJPtL85q7LdeQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/keycodes": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.58.0.tgz", + "integrity": "sha512-Q/LRKpx8ndzuHlkxSQ2BD+NTYYKQPIneNNMng8hTAfyU7RFwXpqj06HpeOFGh4XIdPKCs/8hmucoLJRmmLmZJA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/i18n": "^4.58.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/primitives": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.56.0.tgz", + "integrity": "sha512-NXBq1ODjl6inMWx/l7KCbATcjdoeIOqYeL9i9alqdAfWeKx1EH9PIvKWylIkqZk7erXxCxldiRkuyjTtwjNBxw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/element": "^5.35.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/priority-queue": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.58.0.tgz", + "integrity": "sha512-W+qCS8HJWsXG8gE6yK/H/IObowcghPrQMM3cQHtfd/U05yFNU1Bd/fbj3AO1fVRztktS47lIpi9m3ll1evPEHA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "requestidlecallback": "^0.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/private-apis": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-0.40.0.tgz", + "integrity": "sha512-ZX/9Y8eA3C3K6LOj32bHFj+9tNV819CBd8+chqMmmlvQRcTngiuXbMbnSdZnnAr1gLQgNpH9PJ60dIwJnGSEtQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/redux-routine": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.58.0.tgz", + "integrity": "sha512-r0mMWFeJr93yPy2uY/M5+gdUUYj0Zu8+21OFFb5hyQ0z7UHIa3IdgQxzCaTbV1LDA1ZYJrjHeCnA6s4gNHjA2Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "rungen": "^0.3.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "redux": ">=4" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/rich-text": { + "version": "6.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-6.35.0.tgz", + "integrity": "sha512-h6/XftSqo9UQZebuNZyLfOVu+ButBLITW/BILsKeJhSpmM19VNdz8UhVGLp+xQPE+/GPCIMJrhhqipISDfc2Ig==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/a11y": "^3.58.0", + "@wordpress/compose": "^6.35.0", + "@wordpress/data": "^9.28.0", + "@wordpress/deprecated": "^3.58.0", + "@wordpress/element": "^5.35.0", + "@wordpress/escape-html": "^2.58.0", + "@wordpress/i18n": "^4.58.0", + "@wordpress/keycodes": "^3.58.0", + "memize": "^2.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/undo-manager": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-0.18.0.tgz", + "integrity": "sha512-upbzPEToa095XG+2JXLHaolF1LfXEMFS0lNMYV37myoUS+eZ7/tl9Gx+yU2+OqWy57TMwx33NlWUX/n+ynzPRw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@wordpress/is-shallow-equal": "^4.58.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/@wordpress/warning": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.58.0.tgz", + "integrity": "sha512-9bZlORhyMY2nbWozeyC5kqJsFzEPP4DCLhGmjtbv+YWGHttUrxUZEfrKdqO+rUODA8rP5zeIly1nCQOUnkw4Lg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/gradient-parser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz", + "integrity": "sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/wordpress__blocks/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "node_modules/@types/wordpress__blocks/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.9.2" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "node_modules/@types/wordpress__blocks/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, + "node_modules/@types/wordpress__blocks/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -5439,6 +6793,24 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "dev": true + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dev": true, + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -5629,6 +7001,44 @@ } } }, + "node_modules/@wordpress/a11y": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.34.0.tgz", + "integrity": "sha512-l4/Q1nnLMi1nQJWl4y3Rdr9zQnxYgGqL0ZJwz1vOI8qqSO2Uug8wVCrVIsKIuUQHuD+ya/Q5hqQIedXKAdTvsQ==", + "dev": true, + "dependencies": { + "@wordpress/dom-ready": "^4.34.0", + "@wordpress/i18n": "^6.7.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/api-fetch": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.34.0.tgz", + "integrity": "sha512-A/q260VbsEP+oo0LzbQJwZ43P3cOl0FYhcO8WBpTGdNN/TYEO12shtjYZZOP6lOnFLkyAMrPKoAGrWS/V6Nq7Q==", + "dev": true, + "dependencies": { + "@wordpress/i18n": "^6.7.0", + "@wordpress/url": "^4.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/autop": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.34.0.tgz", + "integrity": "sha512-qSF/FUYz8msmNYokIFIr2VYUHmf2Xqmed1Sk8g4Zz+Mg1EMyzd1e74WmKHD6MVAqwhBgfwrXGcBH467FsnsMCQ==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/babel-preset-default": { "version": "8.33.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.33.0.tgz", @@ -5840,15 +7250,156 @@ } }, "node_modules/@wordpress/base-styles": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.9.0.tgz", - "integrity": "sha512-z3WCO0EdVWrXkEn6QXlFQZoKyPxplIctOWTqG8KPLtdHa0gqXhF+gaNxwGg6Ao2ac4sqoFSBcKPhXgE/08jK7g==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.10.0.tgz", + "integrity": "sha512-Dw/1Om7Kv9YXvN6RaSOmzq2id1MrHZ+rUS2uHNkadeF3Jv+W0Zewl9iCBJarB6Nf72GMkktPwpaRrwhc6zPLIg==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/blob": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.34.0.tgz", + "integrity": "sha512-Y2yr2WTJcVs47jNPa5PcThpY1/2OoZKRum7up7HJQgA0P50xznxIf3u5J6IsUvHNWT7QXkyvB5hXhCaFIySc/Q==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/block-editor": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-15.7.0.tgz", + "integrity": "sha512-jbeWyRU93eUQA2fqgpFNS2eD57TmrJZh4EGg5kfZYfjaU3t8fdg4AwLvzmTfYyS174Pkf/dHzpRPWEpWLI67mw==", + "dev": true, + "dependencies": { + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.6.0", + "@react-spring/web": "^9.4.5", + "@wordpress/a11y": "^4.34.0", + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/blob": "^4.34.0", + "@wordpress/block-serialization-default-parser": "^5.34.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/commands": "^1.34.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/date": "^5.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/dom": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/escape-html": "^3.34.0", + "@wordpress/global-styles-engine": "^1.1.0", + "@wordpress/hooks": "^4.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "@wordpress/keyboard-shortcuts": "^5.34.0", + "@wordpress/keycodes": "^4.34.0", + "@wordpress/notices": "^5.34.0", + "@wordpress/preferences": "^4.34.0", + "@wordpress/priority-queue": "^3.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/rich-text": "^7.34.0", + "@wordpress/style-engine": "^2.34.0", + "@wordpress/token-list": "^3.34.0", + "@wordpress/upload-media": "^0.19.0", + "@wordpress/url": "^4.34.0", + "@wordpress/warning": "^3.34.0", + "@wordpress/wordcount": "^4.34.0", + "change-case": "^4.1.2", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "deepmerge": "^4.3.0", + "diff": "^4.0.2", + "fast-deep-equal": "^3.1.3", + "memize": "^2.1.0", + "parsel-js": "^1.1.2", + "postcss": "^8.4.21", + "postcss-prefix-selector": "^1.16.0", + "postcss-urlrebase": "^1.4.0", + "react-autosize-textarea": "^7.1.0", + "react-easy-crop": "^5.0.6", + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/block-serialization-default-parser": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.34.0.tgz", + "integrity": "sha512-fQeTtiyCzZWez1b3rRN6DhY7gA6UZLiQbZgiVPQH8xQ36nFPV2U3MkVDI7oHajRJ1RyBQKHcmAhA3bseHQD/2w==", "dev": true, "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" } }, + "node_modules/@wordpress/blocks": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-15.7.0.tgz", + "integrity": "sha512-XsPgPn3PKMd017S0AgzHOw6MAahYKbULh5gXjdOTFJTCFDlL6TkCcLEJYbYqY8NAVlm4OF2tF0MR4Bb1bxcrpg==", + "dev": true, + "dependencies": { + "@wordpress/autop": "^4.34.0", + "@wordpress/blob": "^4.34.0", + "@wordpress/block-serialization-default-parser": "^5.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/dom": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/hooks": "^4.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/rich-text": "^7.34.0", + "@wordpress/shortcode": "^4.34.0", + "@wordpress/warning": "^3.34.0", + "change-case": "^4.1.2", + "colord": "^2.7.0", + "fast-deep-equal": "^3.1.3", + "hpq": "^1.3.0", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0", + "react-is": "^18.3.0", + "remove-accents": "^0.5.0", + "showdown": "^1.9.1", + "simple-html-tokenizer": "^0.5.7", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/blocks/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/browserslist-config": { "version": "6.33.0", "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.33.0.tgz", @@ -5859,6 +7410,184 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/commands": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.34.0.tgz", + "integrity": "sha512-ppd0y6WBJMOiQzzXS6UuqHC7G5NqsBPhhygxoeWJlfpaiKjgKxi0tMruN81uRV/ORyhYTT8U3Hz4aFSn4pi47w==", + "dev": true, + "dependencies": { + "@wordpress/base-styles": "^6.10.0", + "@wordpress/components": "^30.7.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/keyboard-shortcuts": "^5.34.0", + "@wordpress/private-apis": "^1.34.0", + "clsx": "^2.1.1", + "cmdk": "^1.0.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/components": { + "version": "30.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.7.0.tgz", + "integrity": "sha512-LlXjicK7zXnwmFSTnxByVwL+Muh4QGcqunxlBg3+Ni8yLtQyTKb6yS8wGUCE7USGEMOlEX1NYvp6i3DOZk1tiw==", + "dev": true, + "dependencies": { + "@ariakit/react": "^0.4.15", + "@emotion/cache": "^11.7.1", + "@emotion/css": "^11.7.1", + "@emotion/react": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/styled": "^11.6.0", + "@emotion/utils": "^1.0.0", + "@floating-ui/react-dom": "2.0.8", + "@types/gradient-parser": "1.1.0", + "@types/highlight-words-core": "1.2.1", + "@use-gesture/react": "^10.3.1", + "@wordpress/a11y": "^4.34.0", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/date": "^5.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/dom": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/escape-html": "^3.34.0", + "@wordpress/hooks": "^4.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "@wordpress/keycodes": "^4.34.0", + "@wordpress/primitives": "^4.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/rich-text": "^7.34.0", + "@wordpress/warning": "^3.34.0", + "change-case": "^4.1.2", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "date-fns": "^3.6.0", + "deepmerge": "^4.3.0", + "fast-deep-equal": "^3.1.3", + "framer-motion": "^11.15.0", + "gradient-parser": "1.1.1", + "highlight-words-core": "^1.2.2", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0", + "path-to-regexp": "^6.2.1", + "re-resizable": "^6.4.0", + "react-colorful": "^5.3.1", + "react-day-picker": "^9.7.0", + "remove-accents": "^0.5.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/components/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "node_modules/@wordpress/components/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@wordpress/compose": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.34.0.tgz", + "integrity": "sha512-gCgsU/VB8mvP9WqzOJLpd9p6ErTBC9qMhP9HQWnmW/SiYm0mhmNaknyr1viu4QYDlMeTVsCycNiP+MacUDCUzg==", + "dev": true, + "dependencies": { + "@types/mousetrap": "^1.6.8", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/dom": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "@wordpress/keycodes": "^4.34.0", + "@wordpress/priority-queue": "^3.34.0", + "@wordpress/undo-manager": "^1.34.0", + "change-case": "^4.1.2", + "clipboard": "^2.0.11", + "mousetrap": "^1.6.5", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/data": { + "version": "10.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.34.0.tgz", + "integrity": "sha512-3xk2NHweks8TLHyhTnMuIXTV2IVBCcejpGMTJeAayLoh0i/G+285EMz7O1t6fIu3u5uXCd/vQdJ2ewLTiIqXiQ==", + "dev": true, + "dependencies": { + "@wordpress/compose": "^7.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "@wordpress/priority-queue": "^3.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/redux-routine": "^5.34.0", + "deepmerge": "^4.3.0", + "equivalent-key-map": "^0.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "redux": "^5.0.1", + "rememo": "^4.0.2", + "use-memo-one": "^1.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/date": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.34.0.tgz", + "integrity": "sha512-0HbuRIL8b1KtpAU1ANG58iY07p9m0+jGUDpJCvJlPOQiCP0nDDLws9C5vTPrRiJnosxj6elyHtyt4LQnHAFJRA==", + "dev": true, + "dependencies": { + "@wordpress/deprecated": "^4.34.0", + "moment": "^2.29.4", + "moment-timezone": "^0.5.40" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/dependency-extraction-webpack-plugin": { "version": "6.33.0", "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.33.0.tgz", @@ -5881,6 +7610,42 @@ "integrity": "sha512-dnSoUiLAoVaMXxFsVi4CrPVYMKOuDBXTghXSmMINX44RZ8WM9cXlY7UqrQnlAcODCVO7FV3+8t/5nDKAjimLfg==", "dev": true }, + "node_modules/@wordpress/deprecated": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.34.0.tgz", + "integrity": "sha512-SuQX1CX97dBVPmN33zdzdjkBHajkOpr1WUdLfiP5aR8xS9CAlyMJgfYygBxFZeMKmsbBYENDVJtrulw4lPvkKw==", + "dev": true, + "dependencies": { + "@wordpress/hooks": "^4.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/dom": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.34.0.tgz", + "integrity": "sha512-W2gk4kkjhEHBLg/6nrJJ4QfvRguuzAx83S8UXS4tYtcYKh5vCzzcDPv8hN3cMS75R5nZBBzHgNfquS5iDhSXOA==", + "dev": true, + "dependencies": { + "@wordpress/deprecated": "^4.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/dom-ready": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.34.0.tgz", + "integrity": "sha512-LclbzuGRtDkF/NrygvnjtO+hcQsnq/iC+iEa78KvHJXQB8daWvrImgqhsD99K53e8AeUwtUFPFwLac5Co14jOg==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/e2e-test-utils-playwright": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.33.0.tgz", @@ -5902,6 +7667,24 @@ "@playwright/test": ">=1" } }, + "node_modules/@wordpress/element": { + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.34.0.tgz", + "integrity": "sha512-WoCBhGa7fTd9NB0B1XS+hF64vmglI90tEskQxxfqtgby1IiLj7TjG+zyVeW1UdrKja3zSAhZTqZc1wjpEtbcoQ==", + "dependencies": { + "@types/react": "^18.2.79", + "@types/react-dom": "^18.2.25", + "@wordpress/escape-html": "^3.34.0", + "change-case": "^4.1.2", + "is-plain-object": "^5.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/env": { "version": "10.33.0", "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.33.0.tgz", @@ -5929,6 +7712,15 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/escape-html": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.34.0.tgz", + "integrity": "sha512-uDkh9w970Lnh43GTw/8csw0BkWY08tzYo2gqIF1I26N7YnpwRbVnv1Swet8PFvv8YDxpfejWBFfA7so4nciKfw==", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/eslint-plugin": { "version": "22.19.0", "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.19.0.tgz", @@ -5957,44 +7749,128 @@ "node": ">=18.12.0", "npm": ">=8.19.2" }, - "peerDependencies": { - "@babel/core": ">=7", - "eslint": ">=8", - "prettier": ">=3", - "typescript": ">=5" + "peerDependencies": { + "@babel/core": ">=7", + "eslint": ">=8", + "prettier": ">=3", + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@wordpress/global-styles-engine": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/global-styles-engine/-/global-styles-engine-1.1.0.tgz", + "integrity": "sha512-YQd2G17LLACAB2qg4JtUJM928MbR42lIThO5LaLA/O0QsjQX2RCRIr40wWRtFk0shyO12EyOXbkMMCR191vjOg==", + "dev": true, + "dependencies": { + "@wordpress/blocks": "^15.7.0", + "@wordpress/data": "^10.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/style-engine": "^2.34.0", + "colord": "^2.9.2", + "deepmerge": "^4.3.0", + "fast-deep-equal": "^3.1.3", + "is-plain-object": "^5.0.0", + "memize": "^2.1.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/hooks": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.34.0.tgz", + "integrity": "sha512-uZcgAMDhf6OzYCUoDqq//wYsfC7yx+XUd2av07aROn8SKTkWRfu7zweJHsOBmK0TkCx976ELoL/SZZfHPcj3aw==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/html-entities": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.34.0.tgz", + "integrity": "sha512-TYYNhGbHEAuVH48Q5+Muy1Bc1G32yK+4btLhkiQOtRXfa/p7f+3bUMe1/t3wgdmU1hM//wS6dsJ2wvXa9rBCeA==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/i18n": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.7.0.tgz", + "integrity": "sha512-156R15kz17WkFJ0mtoVt9ByFvt4i9zcstFiXC1HjMKr3zV1DZSplvcJeNJTENJBRX8sE+Be0NPevaC8LCodjgw==", + "dev": true, + "dependencies": { + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.34.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - }, - "typescript": { - "optional": true - } + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" } }, - "node_modules/@wordpress/eslint-plugin/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, + "node_modules/@wordpress/icons": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-11.1.0.tgz", + "integrity": "sha512-N61MEoI9dU3fDQu7tdY1/kUSOhERyAnKHcVDWl3KWNFDuNuelnoUCMSckNV4T1Jz/M+2Mkov/J39Mroqo782zQ==", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@wordpress/element": "^6.34.0", + "@wordpress/primitives": "^4.34.0" }, "engines": { - "node": ">=10" + "node": ">=18.12.0", + "npm": ">=8.19.2" } }, - "node_modules/@wordpress/eslint-plugin/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/@wordpress/is-shallow-equal": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.34.0.tgz", + "integrity": "sha512-p401k9SahwMOlmQq9DsKnfpHbax6QtE1hB6qTS/1VfhKLYy/DHc43OKafrwGB5G+rHntrsBNsO9r63DRcl4bbQ==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=18.12.0", + "npm": ">=8.19.2" } }, "node_modules/@wordpress/jest-console": { @@ -6031,6 +7907,54 @@ "jest": ">=29" } }, + "node_modules/@wordpress/keyboard-shortcuts": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.34.0.tgz", + "integrity": "sha512-sgVHlzfBil7wY43i+htdm1Rqayt4spNeewGFsm7KlMPOw5IIvZNcNzE8dH6Ycao8YOgM3Mx1tzdjRROGXforYA==", + "dev": true, + "dependencies": { + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/keycodes": "^4.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/keycodes": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.34.0.tgz", + "integrity": "sha512-x/Z+tbcics353Kc1oymrWrnQ8BErpYk112yncli0VXYPGa1OYDoYiUs2Fh49wWXorlx3Dtw6mI+hbiJ14gGp7g==", + "dev": true, + "dependencies": { + "@wordpress/i18n": "^6.7.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/notices": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.34.0.tgz", + "integrity": "sha512-uwH4vthr/rI15Xg8cvp6d18yAHAA+HiYKHLu0RsftF5bdecD1tnUGtmpb9FlO4ydVkISBSKbbPWXvt4O0uTLGg==", + "dev": true, + "dependencies": { + "@wordpress/a11y": "^4.34.0", + "@wordpress/data": "^10.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/@wordpress/npm-package-json-lint-config": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.33.0.tgz", @@ -6062,6 +7986,33 @@ "postcss": "^8.0.0" } }, + "node_modules/@wordpress/preferences": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.34.0.tgz", + "integrity": "sha512-YWxO/llEaewLujBgluIxrn1SpeP2vmoR48DpKFx6n6NOLkS03XyyqlyuAQNsNCefV9AiUbiHxIyyGivlPbIsig==", + "dev": true, + "dependencies": { + "@wordpress/a11y": "^4.34.0", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/private-apis": "^1.34.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@wordpress/prettier-config": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.33.0.tgz", @@ -6075,6 +8026,88 @@ "prettier": ">=3" } }, + "node_modules/@wordpress/primitives": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.34.0.tgz", + "integrity": "sha512-6M/xFse9Da6oC+EZKGGOVCvbX/f5OOw539lyhugnS0sQ+NIWNvvwDh6VW1bCaWQ6uaZDUYbbQeD6Ax97NQuV+w==", + "dependencies": { + "@wordpress/element": "^6.34.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/priority-queue": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.34.0.tgz", + "integrity": "sha512-6qxUP36bvSTvKkxoOhfSPmMZbSt4eCt5diQEugW9LXCuHA6lfWQ2sh1tWWzKpLD9zQCzeYIeVqA1jYHjbO929Q==", + "dev": true, + "dependencies": { + "requestidlecallback": "^0.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/private-apis": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.34.0.tgz", + "integrity": "sha512-6AgwgkVZOlXu6kJpQrAtC5WiRfUfxCu/oOKMeN3m8YddJTKj8eRNO7hHfQa0TCOZi7dEEtnnmrREMb0EFIzmPQ==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/redux-routine": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.34.0.tgz", + "integrity": "sha512-OYODJsho0wwCGrzEutelzBQpWHDS0quwJPGqx4TIWgoBnQtObcPyeqXDMGDJXfAFYP1KT3iE7hsU280EASxpng==", + "dev": true, + "dependencies": { + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "rungen": "^0.3.2" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "redux": ">=4" + } + }, + "node_modules/@wordpress/rich-text": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.34.0.tgz", + "integrity": "sha512-zlzrxCFrUjG4wBrEhK7CNXc8vk5Ynq5GE/BC4dXJtk+/EgFNaFtZmusJdHnJSJx46WPeBcDjZk4W7ozAbXzaiA==", + "dev": true, + "dependencies": { + "@wordpress/a11y": "^4.34.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/escape-html": "^3.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/keycodes": "^4.34.0", + "colord": "2.9.3", + "memize": "^2.1.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/@wordpress/scripts": { "version": "30.26.0", "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.26.0.tgz", @@ -6160,6 +8193,32 @@ } } }, + "node_modules/@wordpress/shortcode": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.34.0.tgz", + "integrity": "sha512-J2G7WY0qGwMDHlPH7lEaHWwCz9eoLY5KB9v2htAmSp+hCLyD/Xw2sk8Cdn77TMbyoF2G/vJxRQwJOC+tWQQAYQ==", + "dev": true, + "dependencies": { + "memize": "^2.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/style-engine": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.34.0.tgz", + "integrity": "sha512-GRw6+BweSE90ZOfhzS5Ny6uV6guBp7dW6OtOIlfCjiLNv8yIbBmy8kdy+nuIGjVtr49JKWWHjNYX3+gng4gHZg==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/stylelint-config": { "version": "23.25.0", "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.25.0.tgz", @@ -6179,10 +8238,95 @@ "stylelint-scss": "^6.4.0" } }, + "node_modules/@wordpress/token-list": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.34.0.tgz", + "integrity": "sha512-Je13FkjGNg6OcJdD3dC02c4ifi9lAIPLtBy7KsxODt7HHXYiNSl2tURwrXq/3tW0Y8bhr5K/ZldpBpJKk9Hp7g==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/undo-manager": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.34.0.tgz", + "integrity": "sha512-NQ/LGpaFoEYCKA0Uyg7RO04wx1MF27Jdv2S2tS81sFUO2/L0FJKyW1AQptx7SGEMIxgH9Sn4XIOdsQmLE4nGww==", + "dev": true, + "dependencies": { + "@wordpress/is-shallow-equal": "^5.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/upload-media": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@wordpress/upload-media/-/upload-media-0.19.0.tgz", + "integrity": "sha512-FQHFZlwFkXP/bpNjl3pXqHQN41A/W0oXWSEYnneGMc8AHjC+53ADtcaTQ2HRyWPEy4gB4C1Ovf4iSwLd8rE54Q==", + "dev": true, + "dependencies": { + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/blob": "^4.34.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/preferences": "^4.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/url": "^4.34.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/upload-media/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@wordpress/url": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.34.0.tgz", + "integrity": "sha512-gsBKwOQsn2bxcQjMnrHqKNgvSpSimP7fCOKbSoi+ALYmqybECLtadWTQJi/nNk06xzQrcX10xIhykJs3mks4yg==", + "dev": true, + "dependencies": { + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/warning": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.33.0.tgz", - "integrity": "sha512-LzYgKfxgK5YEpTu4zHPCDzw+kH5hYCrKRK/joK8S9booy5ERvzRCPrISMwrmAKTD9esYF82+IEHhW0/qsjxPsw==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.34.0.tgz", + "integrity": "sha512-WemuVXjaekzCDsWbDPj/RZSy44mIjPIy35DaoJgfLcgkXMH2GRBRSomhZMkWyGatD39vdXm0nqe95LsLDqrwCg==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/wordcount": { + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.34.0.tgz", + "integrity": "sha512-Pa/xioeKMHgE3sia0LFQC5d6O+YAio+O8ZncKbn18tZYm/mCQzOFwXWsY6MO+UjXczL+HjG5AgBW1XNVpW2M3A==", "dev": true, "engines": { "node": ">=18.12.0", @@ -6514,6 +8658,18 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -6797,6 +8953,12 @@ "postcss": "^8.1.0" } }, + "node_modules/autosize": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", + "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==", + "dev": true + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -6910,6 +9072,46 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", @@ -7438,7 +9640,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -7527,7 +9728,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -7554,7 +9754,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -7739,6 +9938,17 @@ "node": ">= 12" } }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dev": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -7839,6 +10049,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "dev": true, + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7971,6 +10205,18 @@ } ] }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", + "dev": true + }, + "node_modules/computed-style": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8023,7 +10269,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -8549,8 +10794,7 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cwd": { "version": "0.10.0", @@ -8645,6 +10889,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-jalali": { + "version": "4.1.0-0", + "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz", + "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", + "dev": true + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -8864,6 +11124,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -8911,12 +11177,27 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "dev": true + }, "node_modules/devtools-protocol": { "version": "0.0.1507524", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz", "integrity": "sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w==", "dev": true }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -9046,7 +11327,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -9079,6 +11359,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/downshift": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.12.tgz", + "integrity": "sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.14.8", + "compute-scroll-into-view": "^1.0.17", + "prop-types": "^15.7.2", + "react-is": "^17.0.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "react": ">=16.12.0" + } + }, + "node_modules/downshift/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -9153,6 +11455,27 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -9221,6 +11544,12 @@ "node": ">=4" } }, + "node_modules/equivalent-key-map": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", + "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -10823,6 +13152,12 @@ "find-process": "bin/find-process.js" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -11040,6 +13375,33 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "dev": true, + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -11173,6 +13535,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -11288,6 +13659,16 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/gettext-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", + "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", + "dev": true, + "dependencies": { + "encoding": "^0.1.12", + "safe-buffer": "^5.1.1" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -11435,6 +13816,15 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dev": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -11478,6 +13868,15 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/gradient-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", + "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -11605,12 +14004,32 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, + "node_modules/highlight-words-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", + "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==", + "dev": true + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -11671,6 +14090,12 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpq": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz", + "integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg==", + "dev": true + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -12513,7 +14938,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12524,6 +14948,12 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -13578,8 +16008,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -14091,6 +16520,18 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/line-height": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", + "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", + "dev": true, + "dependencies": { + "computed-style": "~0.1.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -14284,7 +16725,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -14296,7 +16736,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -14592,6 +17031,12 @@ "node": ">= 4.0.0" } }, + "node_modules/memize": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.1.tgz", + "integrity": "sha512-8Nl+i9S5D6KXnruM03Jgjb+LwSupvR13WBr4hJegaaEyobvowCVupi79y2WSiWvO1mzBWxPwEYE5feCe8vyA5w==", + "dev": true + }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -14902,6 +17347,48 @@ "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", "dev": true }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "dev": true, + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "dev": true, + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "dev": true + }, + "node_modules/mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==", + "dev": true + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -14991,7 +17478,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -15082,6 +17568,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", + "dev": true + }, "node_modules/npm-bundled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", @@ -15744,7 +18236,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -15819,6 +18310,22 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/parsel-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parsel-js/-/parsel-js-1.2.2.tgz", + "integrity": "sha512-AVJMlwQ4bL2Y0VvYJGk+Fp7eX4SCH2uFoNApmn4yKWACUewZ+alwW3tyoe1r5Z3aLYQTuAuPZIyGghMfO/Tlxw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/LeaVerou" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/leaverou" + } + ] + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15832,7 +18339,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -15842,7 +18348,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -16693,6 +19198,15 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", + "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, "node_modules/postcss-reduce-initial": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", @@ -16826,6 +19340,18 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-urlrebase": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/postcss-urlrebase/-/postcss-urlrebase-1.4.0.tgz", + "integrity": "sha512-rRaxMmWvXrn8Rk1PqsxmaJwldRHsr0WbbASKKCZYxXwotHkM/5X/6IrwaEe8pdzpbNGCEY86yhYMN0MhgOkADA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.3.0" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -17296,11 +19822,20 @@ "node": ">=0.10.0" } }, + "node_modules/re-resizable": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", + "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", + "dev": true, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -17308,33 +19843,170 @@ "node": ">=0.10.0" } }, + "node_modules/react-autosize-textarea": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz", + "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==", + "dev": true, + "dependencies": { + "autosize": "^4.0.2", + "line-height": "^0.3.1", + "prop-types": "^15.5.6" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-day-picker": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.11.1.tgz", + "integrity": "sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw==", + "dev": true, + "dependencies": { + "@date-fns/tz": "^1.4.1", + "date-fns": "^4.1.0", + "date-fns-jalali": "^4.1.0-0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-day-picker/node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^18.3.1" + } + }, + "node_modules/react-easy-crop": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.5.3.tgz", + "integrity": "sha512-iKwFTnAsq+IVuyF6N0Q3zjRx9DG1NMySkwWxVfM/xAOeHYH1vhvM+V2kFiq5HOIQGWouITjfltCx54mbDpMpmA==", + "dev": true, + "dependencies": { + "normalize-wheel": "^1.0.1", + "tslib": "^2.0.1" + }, + "peerDependencies": { + "react": ">=16.4.0", + "react-dom": ">=16.4.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "dev": true, + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "dev": true, + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "dev": true, + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/read-cache": { @@ -17476,6 +20148,12 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "dev": true + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -17571,6 +20249,24 @@ "regjsparser": "bin/parser" } }, + "node_modules/rememo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz", + "integrity": "sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ==", + "dev": true + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "dev": true + }, + "node_modules/requestidlecallback": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz", + "integrity": "sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17626,6 +20322,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "node_modules/requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -17858,6 +20560,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rungen": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz", + "integrity": "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw==", + "dev": true + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -18019,8 +20727,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "peer": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -18078,6 +20784,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -18161,7 +20873,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -18255,6 +20966,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -18382,6 +21099,225 @@ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", "dev": true }, + "node_modules/showdown": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", + "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", + "dev": true, + "dependencies": { + "yargs": "^14.2" + }, + "bin": { + "showdown": "bin/showdown.js" + } + }, + "node_modules/showdown/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/showdown/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/showdown/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/showdown/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/showdown/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/showdown/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/showdown/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/showdown/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/showdown/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/showdown/node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -18504,6 +21440,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/simple-html-tokenizer": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz", + "integrity": "sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==", + "dev": true + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -18564,7 +21506,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -19659,6 +22600,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "dev": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19840,6 +22787,15 @@ "node": ">=8" } }, + "node_modules/tannin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", + "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", + "dev": true, + "dependencies": { + "@tannin/plural-forms": "^1.1.0" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -20118,6 +23074,12 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true + }, "node_modules/tldts-core": { "version": "7.0.17", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz", @@ -20274,8 +23236,7 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -20575,7 +23536,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -20584,7 +23544,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -20653,6 +23612,80 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-lilius": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/use-lilius/-/use-lilius-2.0.5.tgz", + "integrity": "sha512-IbPjJe4T6B0zQV6ahftVtHvCAxi6RAuDpEcO8TmnHh4nBtx7JbGdpbgXWOUj/9YjrzEbdT/lW7JWcBVbX3MbrA==", + "dev": true, + "dependencies": { + "date-fns": "^3.6.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "dev": true, + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -21410,6 +24443,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", diff --git a/package.json b/package.json index d4cdcfe3..8d734a05 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,15 @@ "devDependencies": { "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", + "@types/wordpress__blocks": "^12.5.18", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", + "@wordpress/hooks": "^4.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", "typescript": "^5.4.5" @@ -33,5 +40,8 @@ "engines": { "node": ">=20.10.0", "npm": ">=10.2.3" + }, + "dependencies": { + "@wordpress/icons": "^11.1.0" } } diff --git a/src/features/title-generation/components/TitleToolbar.tsx b/src/features/title-generation/components/TitleToolbar.tsx new file mode 100644 index 00000000..195790fc --- /dev/null +++ b/src/features/title-generation/components/TitleToolbar.tsx @@ -0,0 +1,141 @@ +/** + * Title toolbar component for generating and transforming post titles. + * + * @package WordPress\AI + */ + +import * as React from 'react'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { + ToolbarGroup, + ToolbarButton, + DropdownMenu, + MenuGroup, + MenuItem, +} from '@wordpress/components'; +import { update, chevronDown } from '@wordpress/icons'; +import { useState } from '@wordpress/element'; +import { toSentenceCase, toTitleCase } from '../utils/casing'; + +/** + * Placeholder function for title generation API call. + * + * @param {string} content - The post content to generate title from. + * @return {Promise} A promise that resolves to the generated title. + */ +async function generateTitle( content: string ): Promise< string > { + // TODO: Connect to actual API endpoint + // For now, return a placeholder + return Promise.resolve( 'Generated Title' ); +} + +/** + * TitleToolbar component. + * + * Provides Generate/Re-generate button and casing options dropdown. + * + * @return {JSX.Element} The toolbar component. + */ +export default function TitleToolbar(): JSX.Element { + const title = useSelect( ( select ) => { + return select( 'core/editor' ).getEditedPostAttribute( 'title' ) || ''; + }, [] ); + + const content = useSelect( ( select ) => { + return select( 'core/editor' ).getEditedPostContent() || ''; + }, [] ); + + const { editPost } = useDispatch( 'core/editor' ); + + const [ isGenerating, setIsGenerating ] = useState( false ); + + const hasTitle = title.trim().length > 0; + const buttonLabel = hasTitle ? 'Re-generate' : 'Generate'; + + /** + * Handles the generate/re-generate button click. + */ + const handleGenerate = async () => { + setIsGenerating( true ); + try { + const generatedTitle = await generateTitle( content ); + editPost( { title: generatedTitle } ); + } catch ( error ) { + // TODO: Handle error appropriately + console.error( 'Error generating title:', error ); + } finally { + setIsGenerating( false ); + } + }; + + /** + * Handles casing option selection from dropdown. + * + * @param {string} casingType - The casing type to apply ('sentence' or 'title'). + */ + const handleCasingChange = ( casingType: string ) => { + if ( ! hasTitle ) { + return; + } + + let transformedTitle: string; + if ( casingType === 'sentence' ) { + transformedTitle = toSentenceCase( title ); + } else if ( casingType === 'title' ) { + transformedTitle = toTitleCase( title ); + } else { + return; + } + + editPost( { title: transformedTitle } ); + }; + + return ( + + + { buttonLabel } + + { hasTitle && ( + + { ( { onClose } ) => ( + <> + + { + handleCasingChange( 'sentence' ); + onClose(); + } } + > + Sentence Case + + { + handleCasingChange( 'title' ); + onClose(); + } } + > + Title Case + + + + ) } + + ) } + + ); +} + diff --git a/src/features/title-generation/index.tsx b/src/features/title-generation/index.tsx index 3c3ee973..d0c411c6 100644 --- a/src/features/title-generation/index.tsx +++ b/src/features/title-generation/index.tsx @@ -1,5 +1,35 @@ -document.addEventListener( 'DOMContentLoaded', initialize ); +/** + * Title generation feature plugin registration. + * + * @package WordPress\AI + */ -function initialize() { - console.log( 'Title generation feature initialized!' ); -} +import * as React from 'react'; +import { addFilter } from '@wordpress/hooks'; +import { createHigherOrderComponent } from '@wordpress/compose'; +import { BlockControls } from '@wordpress/block-editor'; +import TitleToolbar from './components/TitleToolbar'; + +// Use filter to add toolbar to post-title block +const withTitleToolbar = createHigherOrderComponent( + ( BlockEdit ) => { + return ( props: any ) => { + // Check if this is the post-title block + if ( props.name !== 'core/post-title' ) { + return ; + } + + return ( + <> + + + + + + ); + }; + }, + 'withTitleToolbar' +); + +addFilter( 'editor.BlockEdit', 'ai/title-generation', withTitleToolbar ); diff --git a/src/features/title-generation/utils/casing.ts b/src/features/title-generation/utils/casing.ts new file mode 100644 index 00000000..0cf1b4eb --- /dev/null +++ b/src/features/title-generation/utils/casing.ts @@ -0,0 +1,99 @@ +/** + * Casing transformation utilities for title generation. + * + * @package WordPress\AI + */ + +/** + * Converts a title to sentence case (first letter capitalized, rest lowercase). + * + * @param {string} title - The title to transform. + * @return {string} The title in sentence case. + */ +export function toSentenceCase( title: string ): string { + if ( ! title || title.trim().length === 0 ) { + return title; + } + + const trimmed = title.trim(); + return trimmed.charAt( 0 ).toUpperCase() + trimmed.slice( 1 ).toLowerCase(); +} + +/** + * Converts a title to title case (major words capitalized). + * + * Articles, prepositions, and conjunctions are lowercase unless they're the first word. + * + * @param {string} title - The title to transform. + * @return {string} The title in title case. + */ +export function toTitleCase( title: string ): string { + if ( ! title || title.trim().length === 0 ) { + return title; + } + + // Words that should remain lowercase (unless they're the first word) + const lowercaseWords = [ + 'a', + 'an', + 'the', + 'and', + 'but', + 'or', + 'nor', + 'for', + 'so', + 'yet', + 'at', + 'by', + 'in', + 'of', + 'on', + 'to', + 'up', + 'as', + 'is', + 'if', + 'it', + 'from', + 'with', + 'into', + 'onto', + 'over', + 'under', + 'after', + 'before', + 'during', + 'through', + 'via', + ]; + + const words = title.trim().split( /\s+/ ); + const titleCaseWords = words.map( ( word, index ) => { + // Remove punctuation for comparison + const wordLower = word.toLowerCase().replace( /[^\w]/g, '' ); + + // Always capitalize first word, or if word is not in lowercase list + if ( index === 0 || ! lowercaseWords.includes( wordLower ) ) { + return capitalizeWord( word ); + } + + return word.toLowerCase(); + } ); + + return titleCaseWords.join( ' ' ); +} + +/** + * Capitalizes the first letter of a word while preserving the rest. + * + * @param {string} word - The word to capitalize. + * @return {string} The capitalized word. + */ +function capitalizeWord( word: string ): string { + if ( ! word || word.length === 0 ) { + return word; + } + + return word.charAt( 0 ).toUpperCase() + word.slice( 1 ).toLowerCase(); +} From 25e759785e6dd5e303e889141f75376d8956eb3d Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 6 Nov 2025 17:05:30 -0700 Subject: [PATCH 08/39] Add the same toolbar when not in template mode (when the title isn't a block) --- package-lock.json | 25 ++ package.json | 1 + .../components/TitleToolbarWrapper.tsx | 224 ++++++++++++++++++ src/features/title-generation/index.tsx | 9 + 4 files changed, 259 insertions(+) create mode 100644 src/features/title-generation/components/TitleToolbarWrapper.tsx diff --git a/package-lock.json b/package-lock.json index d002b33c..ec9de132 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", "@wordpress/hooks": "^4.34.0", + "@wordpress/plugins": "^7.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", "typescript": "^5.4.5" @@ -7968,6 +7969,30 @@ "npm-package-json-lint": ">=6.0.0" } }, + "node_modules/@wordpress/plugins": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.34.0.tgz", + "integrity": "sha512-GYhDxPMgni9S9q0l3aQX8TxqQwHTytZ/X/W9YNdSgSvPRj0Kg4pcac+iLR1Obc/Mm5oxTsAZarS8itysjqFonQ==", + "dev": true, + "dependencies": { + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/hooks": "^4.34.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "memize": "^2.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@wordpress/postcss-plugins-preset": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.33.0.tgz", diff --git a/package.json b/package.json index 8d734a05..61d2efa5 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", "@wordpress/hooks": "^4.34.0", + "@wordpress/plugins": "^7.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", "typescript": "^5.4.5" diff --git a/src/features/title-generation/components/TitleToolbarWrapper.tsx b/src/features/title-generation/components/TitleToolbarWrapper.tsx new file mode 100644 index 00000000..5b0e0be1 --- /dev/null +++ b/src/features/title-generation/components/TitleToolbarWrapper.tsx @@ -0,0 +1,224 @@ +/** + * Title toolbar wrapper component for normal editing mode. + * + * This component uses DOM manipulation to attach the toolbar to the title field + * in normal editing mode (non-template mode). + * + * @package WordPress\AI + */ + +import * as React from 'react'; +import { useEffect } from '@wordpress/element'; +import { createRoot } from 'react-dom/client'; +import TitleToolbar from './TitleToolbar'; + +/** + * TitleToolbarWrapper component. + * + * Attaches the toolbar to the title field in normal editing mode. + * + * @return {JSX.Element} The wrapper component. + */ +export default function TitleToolbarWrapper(): JSX.Element { + useEffect( () => { + let isAttached = false; + let retryTimeout: NodeJS.Timeout | null = null; + let root: ReturnType< typeof createRoot > | null = null; + let observer: MutationObserver | null = null; + let titleInput: HTMLElement | null = null; + let toolbarContainer: HTMLElement | null = null; + let focusHandler: ( ( e: Event ) => void ) | null = null; + let blurHandler: ( ( e: Event ) => void ) | null = null; + + // Find the editor iframe + const getEditorDocument = (): Document | null => { + // Try to find the iframe that contains the editor + const iframe = document.querySelector( + 'iframe[name="editor-canvas"], iframe.wp-block-editor-iframe__iframe' + ) as HTMLIFrameElement | null; + + if ( iframe && iframe.contentDocument ) { + return iframe.contentDocument; + } + + return null; + }; + + // Show/hide toolbar based on focus + const showToolbar = () => { + if ( toolbarContainer ) { + toolbarContainer.style.display = 'flex'; + } + }; + + const hideToolbar = () => { + if ( toolbarContainer ) { + toolbarContainer.style.display = 'none'; + } + }; + + // Wait for the editor to be ready + const findAndAttachToolbar = () => { + // Don't try if already attached + if ( isAttached ) { + return; + } + + const editorDoc = getEditorDocument(); + if ( ! editorDoc ) { + // Editor iframe not found yet, try again after a short delay + if ( ! retryTimeout ) { + let retryCount = 0; + const maxRetries = 20; + const retry = () => { + if ( retryCount < maxRetries && ! isAttached ) { + retryCount++; + retryTimeout = setTimeout( () => { + retryTimeout = null; + findAndAttachToolbar(); + if ( ! isAttached && retryCount < maxRetries ) { + retry(); + } + }, 200 ); + } + }; + retry(); + } + return; + } + + // Check if toolbar already exists in the editor document + if ( editorDoc.querySelector( '.ai-title-toolbar-container' ) ) { + isAttached = true; + return; + } + + // Find the title field container in normal editing mode + const selectors = [ + '.editor-post-title__input', + ]; + + let foundTitleInput: HTMLElement | null = null; + for ( const selector of selectors ) { + foundTitleInput = editorDoc.querySelector( selector ) as HTMLElement; + if ( foundTitleInput ) { + break; + } + } + + if ( ! foundTitleInput ) { + // Title field not found yet, try again after a short delay + if ( ! retryTimeout ) { + let retryCount = 0; + const maxRetries = 10; + const retry = () => { + if ( retryCount < maxRetries && ! isAttached ) { + retryCount++; + retryTimeout = setTimeout( () => { + retryTimeout = null; + findAndAttachToolbar(); + if ( ! isAttached && retryCount < maxRetries ) { + retry(); + } + }, 200 ); + } + }; + retry(); + } + return; + } + + titleInput = foundTitleInput; + + // Check if we've already attached the toolbar to this element + if ( titleInput.parentElement?.querySelector( '.ai-title-toolbar-container' ) ) { + isAttached = true; + return; + } + + // Find the container that wraps the title input + const titleContainer = titleInput.parentElement; + + if ( ! titleContainer ) { + return; + } + + // Create a container for our toolbar + toolbarContainer = editorDoc.createElement( 'div' ); + toolbarContainer.className = 'ai-title-toolbar-container'; + toolbarContainer.style.cssText = + 'display: none; position: relative; background: #fff; z-index: 1000;'; + + // Insert into the title container (before the input) + titleContainer.insertBefore( toolbarContainer, titleInput ); + + // Render the toolbar into the container + root = createRoot( toolbarContainer ); + root.render( ); + + // Add focus/blur handlers + focusHandler = () => showToolbar(); + blurHandler = () => hideToolbar(); + + titleInput.addEventListener( 'focus', focusHandler ); + titleInput.addEventListener( 'blur', blurHandler ); + + isAttached = true; + }; + + // Start looking for the title field after a short delay to ensure iframe is ready + const initialTimeout = setTimeout( () => { + findAndAttachToolbar(); + }, 100 ); + + // Also listen for DOM changes in the editor iframe + // But only check if we haven't attached yet + const setupObserver = () => { + const editorDoc = getEditorDocument(); + if ( editorDoc && ! observer ) { + observer = new MutationObserver( () => { + if ( ! isAttached && ! editorDoc.querySelector( '.ai-title-toolbar-container' ) ) { + findAndAttachToolbar(); + } + } ); + + observer.observe( editorDoc.body, { + childList: true, + subtree: true, + } ); + } + }; + + // Try to set up observer after a delay to ensure iframe is loaded + const observerTimeout = setTimeout( setupObserver, 500 ); + + // Cleanup function + return () => { + if ( observer ) { + observer.disconnect(); + } + if ( retryTimeout ) { + clearTimeout( retryTimeout ); + } + clearTimeout( initialTimeout ); + clearTimeout( observerTimeout ); + + // Remove event listeners + if ( titleInput && focusHandler && blurHandler ) { + titleInput.removeEventListener( 'focus', focusHandler ); + titleInput.removeEventListener( 'blur', blurHandler ); + } + + // Clean up toolbar + if ( toolbarContainer && root ) { + root.unmount(); + toolbarContainer.remove(); + } + }; + }, [] ); + + // This component doesn't render anything itself + // It uses useEffect to attach to the DOM + return <>; +} + diff --git a/src/features/title-generation/index.tsx b/src/features/title-generation/index.tsx index d0c411c6..037d4727 100644 --- a/src/features/title-generation/index.tsx +++ b/src/features/title-generation/index.tsx @@ -5,11 +5,14 @@ */ import * as React from 'react'; +import { registerPlugin } from '@wordpress/plugins'; import { addFilter } from '@wordpress/hooks'; import { createHigherOrderComponent } from '@wordpress/compose'; import { BlockControls } from '@wordpress/block-editor'; import TitleToolbar from './components/TitleToolbar'; +import TitleToolbarWrapper from './components/TitleToolbarWrapper'; +// For template editing mode (when title is a block) // Use filter to add toolbar to post-title block const withTitleToolbar = createHigherOrderComponent( ( BlockEdit ) => { @@ -33,3 +36,9 @@ const withTitleToolbar = createHigherOrderComponent( ); addFilter( 'editor.BlockEdit', 'ai/title-generation', withTitleToolbar ); + +// For normal editing mode (when title is not a block) +// Register a plugin that uses DOM manipulation to attach toolbar +registerPlugin( 'ai-title-generation-normal-mode', { + render: TitleToolbarWrapper, +} ); From 273c189352f1bef5d241bdbdb1432f4ffc45df93 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 09:29:37 -0700 Subject: [PATCH 09/39] Update comment --- src/features/title-generation/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/title-generation/index.tsx b/src/features/title-generation/index.tsx index 037d4727..98b5cd1c 100644 --- a/src/features/title-generation/index.tsx +++ b/src/features/title-generation/index.tsx @@ -12,7 +12,7 @@ import { BlockControls } from '@wordpress/block-editor'; import TitleToolbar from './components/TitleToolbar'; import TitleToolbarWrapper from './components/TitleToolbarWrapper'; -// For template editing mode (when title is a block) +// For template preview mode (when title is a block) // Use filter to add toolbar to post-title block const withTitleToolbar = createHigherOrderComponent( ( BlockEdit ) => { From de5fadf5d760bed59b91a79c19275db34aa08bb6 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 11:19:25 -0700 Subject: [PATCH 10/39] Add a new wrapper around our toolbar and the title input. Add proper styling on this and the toolbar to get things positioned correctly. Fix lint errors --- package-lock.json | 2 + package.json | 2 + .../components/TitleToolbar.tsx | 10 +- .../components/TitleToolbarWrapper.tsx | 150 +++++++++++++++--- src/features/title-generation/index.tsx | 41 +++-- src/features/title-generation/utils/casing.ts | 2 - webpack.config.js | 4 +- 7 files changed, 156 insertions(+), 55 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec9de132..527483ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,8 @@ "@wordpress/plugins": "^7.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "typescript": "^5.4.5" }, "engines": { diff --git a/package.json b/package.json index 61d2efa5..54aeb254 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "@wordpress/plugins": "^7.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "typescript": "^5.4.5" }, "engines": { diff --git a/src/features/title-generation/components/TitleToolbar.tsx b/src/features/title-generation/components/TitleToolbar.tsx index 195790fc..288df5dc 100644 --- a/src/features/title-generation/components/TitleToolbar.tsx +++ b/src/features/title-generation/components/TitleToolbar.tsx @@ -1,10 +1,8 @@ /** * Title toolbar component for generating and transforming post titles. - * - * @package WordPress\AI */ -import * as React from 'react'; +import React from 'react'; import { useSelect, useDispatch } from '@wordpress/data'; import { ToolbarGroup, @@ -20,10 +18,9 @@ import { toSentenceCase, toTitleCase } from '../utils/casing'; /** * Placeholder function for title generation API call. * - * @param {string} content - The post content to generate title from. * @return {Promise} A promise that resolves to the generated title. */ -async function generateTitle( content: string ): Promise< string > { +async function generateTitle(): Promise< string > { // TODO: Connect to actual API endpoint // For now, return a placeholder return Promise.resolve( 'Generated Title' ); @@ -62,7 +59,7 @@ export default function TitleToolbar(): JSX.Element { editPost( { title: generatedTitle } ); } catch ( error ) { // TODO: Handle error appropriately - console.error( 'Error generating title:', error ); + console.error( 'Error generating title:', error ); // eslint-disable-line no-console } finally { setIsGenerating( false ); } @@ -138,4 +135,3 @@ export default function TitleToolbar(): JSX.Element { ); } - diff --git a/src/features/title-generation/components/TitleToolbarWrapper.tsx b/src/features/title-generation/components/TitleToolbarWrapper.tsx index 5b0e0be1..bc0ff53c 100644 --- a/src/features/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/features/title-generation/components/TitleToolbarWrapper.tsx @@ -3,11 +3,9 @@ * * This component uses DOM manipulation to attach the toolbar to the title field * in normal editing mode (non-template mode). - * - * @package WordPress\AI */ -import * as React from 'react'; +import React from 'react'; import { useEffect } from '@wordpress/element'; import { createRoot } from 'react-dom/client'; import TitleToolbar from './TitleToolbar'; @@ -19,7 +17,7 @@ import TitleToolbar from './TitleToolbar'; * * @return {JSX.Element} The wrapper component. */ -export default function TitleToolbarWrapper(): JSX.Element { +function TitleToolbarWrapper(): JSX.Element { useEffect( () => { let isAttached = false; let retryTimeout: NodeJS.Timeout | null = null; @@ -27,8 +25,11 @@ export default function TitleToolbarWrapper(): JSX.Element { let observer: MutationObserver | null = null; let titleInput: HTMLElement | null = null; let toolbarContainer: HTMLElement | null = null; + let wrapperContainer: HTMLElement | null = null; let focusHandler: ( ( e: Event ) => void ) | null = null; - let blurHandler: ( ( e: Event ) => void ) | null = null; + let blurHandler: ( ( e: FocusEvent ) => void ) | null = null; + let toolbarFocusHandler: ( ( e: Event ) => void ) | null = null; + let toolbarBlurHandler: ( ( e: Event ) => void ) | null = null; // Find the editor iframe const getEditorDocument = (): Document | null => { @@ -44,6 +45,38 @@ export default function TitleToolbarWrapper(): JSX.Element { return null; }; + // Check if focus is on title input or toolbar + const isFocusedOnTitleOrToolbar = (): boolean => { + const editorDoc = getEditorDocument(); + if ( ! editorDoc ) { + return false; + } + + const activeElement = editorDoc.activeElement as HTMLElement | null; + if ( ! activeElement ) { + return false; + } + + // Check if focus is on title input + if ( + activeElement === titleInput || + titleInput?.contains( activeElement ) + ) { + return true; + } + + // Check if focus is on toolbar or any element within it + if ( + toolbarContainer && + ( activeElement === toolbarContainer || + toolbarContainer.contains( activeElement ) ) + ) { + return true; + } + + return false; + }; + // Show/hide toolbar based on focus const showToolbar = () => { if ( toolbarContainer ) { @@ -57,6 +90,15 @@ export default function TitleToolbarWrapper(): JSX.Element { } }; + // Check focus state and show/hide toolbar accordingly + const updateToolbarVisibility = () => { + if ( isFocusedOnTitleOrToolbar() ) { + showToolbar(); + } else { + hideToolbar(); + } + }; + // Wait for the editor to be ready const findAndAttachToolbar = () => { // Don't try if already attached @@ -87,20 +129,20 @@ export default function TitleToolbarWrapper(): JSX.Element { return; } - // Check if toolbar already exists in the editor document - if ( editorDoc.querySelector( '.ai-title-toolbar-container' ) ) { + // Check if toolbar wrapper already exists in the editor document + if ( editorDoc.querySelector( '.ai-title-toolbar-wrapper' ) ) { isAttached = true; return; } // Find the title field container in normal editing mode - const selectors = [ - '.editor-post-title__input', - ]; + const selectors = [ '.editor-post-title__input' ]; let foundTitleInput: HTMLElement | null = null; for ( const selector of selectors ) { - foundTitleInput = editorDoc.querySelector( selector ) as HTMLElement; + foundTitleInput = editorDoc.querySelector( + selector + ) as HTMLElement; if ( foundTitleInput ) { break; } @@ -131,7 +173,7 @@ export default function TitleToolbarWrapper(): JSX.Element { titleInput = foundTitleInput; // Check if we've already attached the toolbar to this element - if ( titleInput.parentElement?.querySelector( '.ai-title-toolbar-container' ) ) { + if ( titleInput.closest( '.ai-title-toolbar-wrapper' ) ) { isAttached = true; return; } @@ -143,26 +185,69 @@ export default function TitleToolbarWrapper(): JSX.Element { return; } + // Store the next sibling before we move the title input + const nextSibling = titleInput.nextSibling; + + // Create a wrapper container that will hold both the toolbar and the title input + wrapperContainer = editorDoc.createElement( 'div' ); + wrapperContainer.className = 'ai-title-toolbar-wrapper'; + wrapperContainer.style.cssText = 'position: relative;'; + // Create a container for our toolbar toolbarContainer = editorDoc.createElement( 'div' ); toolbarContainer.className = 'ai-title-toolbar-container'; toolbarContainer.style.cssText = - 'display: none; position: relative; background: #fff; z-index: 1000;'; + 'display: none; position: absolute; z-index: 1000; top: -60px;'; - // Insert into the title container (before the input) - titleContainer.insertBefore( toolbarContainer, titleInput ); + // Append the toolbar container to the wrapper + wrapperContainer.appendChild( toolbarContainer ); + + // Move the title input into the wrapper container + wrapperContainer.appendChild( titleInput ); + + // Insert the wrapper container where the title input was + titleContainer.insertBefore( wrapperContainer, nextSibling ); // Render the toolbar into the container root = createRoot( toolbarContainer ); root.render( ); - // Add focus/blur handlers - focusHandler = () => showToolbar(); - blurHandler = () => hideToolbar(); + // Add focus/blur handlers for title input + focusHandler = () => { + showToolbar(); + }; + + blurHandler = () => { + // Use a small delay to check where focus moved to + // This allows focus to move to toolbar elements before we check + setTimeout( () => { + updateToolbarVisibility(); + }, 10 ); + }; titleInput.addEventListener( 'focus', focusHandler ); titleInput.addEventListener( 'blur', blurHandler ); + // Add focus/blur handlers for toolbar container + toolbarFocusHandler = () => { + showToolbar(); + }; + + toolbarBlurHandler = () => { + // Use a small delay to check where focus moved to + setTimeout( () => { + updateToolbarVisibility(); + }, 10 ); + }; + + toolbarContainer.addEventListener( 'focusin', toolbarFocusHandler ); + toolbarContainer.addEventListener( 'focusout', toolbarBlurHandler ); + + // Check initial focus state + if ( editorDoc.activeElement === titleInput ) { + showToolbar(); + } + isAttached = true; }; @@ -177,7 +262,10 @@ export default function TitleToolbarWrapper(): JSX.Element { const editorDoc = getEditorDocument(); if ( editorDoc && ! observer ) { observer = new MutationObserver( () => { - if ( ! isAttached && ! editorDoc.querySelector( '.ai-title-toolbar-container' ) ) { + if ( + ! isAttached && + ! editorDoc.querySelector( '.ai-title-toolbar-wrapper' ) + ) { findAndAttachToolbar(); } } ); @@ -208,10 +296,29 @@ export default function TitleToolbarWrapper(): JSX.Element { titleInput.removeEventListener( 'focus', focusHandler ); titleInput.removeEventListener( 'blur', blurHandler ); } + if ( + toolbarContainer && + toolbarFocusHandler && + toolbarBlurHandler + ) { + toolbarContainer.removeEventListener( + 'focusin', + toolbarFocusHandler + ); + toolbarContainer.removeEventListener( + 'focusout', + toolbarBlurHandler + ); + } - // Clean up toolbar - if ( toolbarContainer && root ) { + // Clean up toolbar and wrapper + if ( root ) { root.unmount(); + } + if ( wrapperContainer ) { + wrapperContainer.remove(); + } else if ( toolbarContainer ) { + // Fallback: if wrapper wasn't created, just remove toolbar toolbarContainer.remove(); } }; @@ -222,3 +329,4 @@ export default function TitleToolbarWrapper(): JSX.Element { return <>; } +export { TitleToolbarWrapper }; diff --git a/src/features/title-generation/index.tsx b/src/features/title-generation/index.tsx index 98b5cd1c..7b90d3ff 100644 --- a/src/features/title-generation/index.tsx +++ b/src/features/title-generation/index.tsx @@ -1,39 +1,34 @@ /** * Title generation feature plugin registration. - * - * @package WordPress\AI */ -import * as React from 'react'; +import React from 'react'; import { registerPlugin } from '@wordpress/plugins'; import { addFilter } from '@wordpress/hooks'; import { createHigherOrderComponent } from '@wordpress/compose'; import { BlockControls } from '@wordpress/block-editor'; import TitleToolbar from './components/TitleToolbar'; -import TitleToolbarWrapper from './components/TitleToolbarWrapper'; +import { TitleToolbarWrapper } from './components/TitleToolbarWrapper'; // For template preview mode (when title is a block) // Use filter to add toolbar to post-title block -const withTitleToolbar = createHigherOrderComponent( - ( BlockEdit ) => { - return ( props: any ) => { - // Check if this is the post-title block - if ( props.name !== 'core/post-title' ) { - return ; - } +const withTitleToolbar = createHigherOrderComponent( ( BlockEdit ) => { + return ( props: any ) => { + // Check if this is the post-title block + if ( props.name !== 'core/post-title' ) { + return ; + } - return ( - <> - - - - - - ); - }; - }, - 'withTitleToolbar' -); + return ( + <> + + + + + + ); + }; +}, 'withTitleToolbar' ); addFilter( 'editor.BlockEdit', 'ai/title-generation', withTitleToolbar ); diff --git a/src/features/title-generation/utils/casing.ts b/src/features/title-generation/utils/casing.ts index 0cf1b4eb..c8fcfbba 100644 --- a/src/features/title-generation/utils/casing.ts +++ b/src/features/title-generation/utils/casing.ts @@ -1,7 +1,5 @@ /** * Casing transformation utilities for title generation. - * - * @package WordPress\AI */ /** diff --git a/webpack.config.js b/webpack.config.js index 484f613d..92030d1c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,11 +1,11 @@ const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); -const path = require( 'path' ); const webpackConfig = { ...defaultConfig, entry: { ...defaultConfig.entry(), - 'features/title-generation': './src/features/title-generation/index.tsx' + 'features/title-generation': + './src/features/title-generation/index.tsx', }, }; From b2973b1c546295952199464781e5591540ad8b78 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 11:46:25 -0700 Subject: [PATCH 11/39] Keep toolbar open if sub-menu is open --- .../title-generation/components/TitleToolbarWrapper.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/features/title-generation/components/TitleToolbarWrapper.tsx b/src/features/title-generation/components/TitleToolbarWrapper.tsx index bc0ff53c..de0fc5a6 100644 --- a/src/features/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/features/title-generation/components/TitleToolbarWrapper.tsx @@ -66,10 +66,12 @@ function TitleToolbarWrapper(): JSX.Element { } // Check if focus is on toolbar or any element within it + // Also check if dropdown menu is open (button with is-opened class) if ( toolbarContainer && ( activeElement === toolbarContainer || - toolbarContainer.contains( activeElement ) ) + toolbarContainer.contains( activeElement ) || + toolbarContainer.querySelector( '.components-dropdown-menu .is-opened' ) ) ) { return true; } From 74d9adb1b3c45fb3c302ac8a8fa9f531bb6d208c Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 11:56:34 -0700 Subject: [PATCH 12/39] Remove react-dom. Ensure strings are translated --- package-lock.json | 2 +- package.json | 2 +- .../title-generation/components/TitleToolbar.tsx | 9 +++++---- .../title-generation/components/TitleToolbarWrapper.tsx | 3 +-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 527483ed..2138419a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,11 +23,11 @@ "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", "@wordpress/hooks": "^4.34.0", + "@wordpress/i18n": "^6.7.0", "@wordpress/plugins": "^7.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", "react": "^18.3.1", - "react-dom": "^18.3.1", "typescript": "^5.4.5" }, "engines": { diff --git a/package.json b/package.json index 54aeb254..812c50f3 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,11 @@ "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", "@wordpress/hooks": "^4.34.0", + "@wordpress/i18n": "^6.7.0", "@wordpress/plugins": "^7.34.0", "@wordpress/prettier-config": "^4.31.0", "@wordpress/scripts": "^30.26.0", "react": "^18.3.1", - "react-dom": "^18.3.1", "typescript": "^5.4.5" }, "engines": { diff --git a/src/features/title-generation/components/TitleToolbar.tsx b/src/features/title-generation/components/TitleToolbar.tsx index 288df5dc..6e46e71b 100644 --- a/src/features/title-generation/components/TitleToolbar.tsx +++ b/src/features/title-generation/components/TitleToolbar.tsx @@ -13,6 +13,7 @@ import { } from '@wordpress/components'; import { update, chevronDown } from '@wordpress/icons'; import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; import { toSentenceCase, toTitleCase } from '../utils/casing'; /** @@ -47,7 +48,7 @@ export default function TitleToolbar(): JSX.Element { const [ isGenerating, setIsGenerating ] = useState( false ); const hasTitle = title.trim().length > 0; - const buttonLabel = hasTitle ? 'Re-generate' : 'Generate'; + const buttonLabel = hasTitle ? __( 'Re-generate', 'ai' ) : __( 'Generate', 'ai' ); /** * Handles the generate/re-generate button click. @@ -110,14 +111,14 @@ export default function TitleToolbar(): JSX.Element { > { ( { onClose } ) => ( <> - + { handleCasingChange( 'sentence' ); onClose(); } } > - Sentence Case + { __( 'Sentence Case', 'ai' ) } { @@ -125,7 +126,7 @@ export default function TitleToolbar(): JSX.Element { onClose(); } } > - Title Case + { __( 'Title Case', 'ai' ) } diff --git a/src/features/title-generation/components/TitleToolbarWrapper.tsx b/src/features/title-generation/components/TitleToolbarWrapper.tsx index de0fc5a6..01d24577 100644 --- a/src/features/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/features/title-generation/components/TitleToolbarWrapper.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { useEffect } from '@wordpress/element'; -import { createRoot } from 'react-dom/client'; +import { createRoot, useEffect } from '@wordpress/element'; import TitleToolbar from './TitleToolbar'; /** From 078bf4bb956aed24f0fca04fd0d22e4b6a711d63 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 14:39:54 -0700 Subject: [PATCH 13/39] Wire up the title generation API request --- .../Title_Generation/Title_Generation.php | 1 + package-lock.json | 743 +++++++++++++++++- package.json | 2 + .../components/TitleToolbar.tsx | 155 ++-- .../components/TitleToolbarWrapper.tsx | 214 +++-- src/features/title-generation/index.tsx | 13 +- 6 files changed, 973 insertions(+), 155 deletions(-) diff --git a/includes/Features/Title_Generation/Title_Generation.php b/includes/Features/Title_Generation/Title_Generation.php index 6313eb2b..34a30771 100644 --- a/includes/Features/Title_Generation/Title_Generation.php +++ b/includes/Features/Title_Generation/Title_Generation.php @@ -136,6 +136,7 @@ public function enqueue_assets( string $hook_suffix ): void { 'title_generation_data', array( 'enabled' => $this->is_enabled(), + 'path' => 'wp-abilities/v1/abilities/ai/title-generation/run', ) ); } diff --git a/package-lock.json b/package-lock.json index 2138419a..8381dd56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,12 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", + "@wordpress/api-fetch": "^7.34.0", "@wordpress/block-editor": "^15.7.0", "@wordpress/components": "^30.7.0", "@wordpress/compose": "^7.34.0", "@wordpress/data": "^10.34.0", + "@wordpress/editor": "^14.34.0", "@wordpress/element": "^6.34.0", "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", @@ -5879,6 +5881,15 @@ "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", "dev": true }, + "node_modules/@types/simple-peer": { + "version": "9.11.9", + "resolved": "https://registry.npmjs.org/@types/simple-peer/-/simple-peer-9.11.9.tgz", + "integrity": "sha512-6Gdl7TSS5oh9nuwKD4Pl8cSmaxWycYeZz9HLnJBNvIwWjZuGVsmHe9RwW3+9RxfhC1aIR9Z83DvaJoMw6rhkbg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", @@ -7018,6 +7029,22 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/admin-ui": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@wordpress/admin-ui/-/admin-ui-1.2.0.tgz", + "integrity": "sha512-6+sxKyjjr0CacE7vFD2+vt8qoYR8hqwZf5Sxg5k3uJuXnmYvafqz8vILGg6bYMgOCTT8wy/5MexWijQ6S2le3Q==", + "dev": true, + "dependencies": { + "@wordpress/base-styles": "^6.10.0", + "@wordpress/components": "^30.7.0", + "@wordpress/element": "^6.34.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/api-fetch": { "version": "7.34.0", "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.34.0.tgz", @@ -7547,6 +7574,56 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/core-data": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.34.0.tgz", + "integrity": "sha512-7qiseCbHxqkKcwK1LKZJDOihJsU9VpJlQRQg5HZvTrI6it9l2cRpZMFpuUbeK9gf9T2AuBgfyM6BGjl0G890mw==", + "dev": true, + "dependencies": { + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/is-shallow-equal": "^5.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/rich-text": "^7.34.0", + "@wordpress/sync": "^1.34.0", + "@wordpress/undo-manager": "^1.34.0", + "@wordpress/url": "^4.34.0", + "@wordpress/warning": "^3.34.0", + "change-case": "^4.1.2", + "equivalent-key-map": "^0.2.2", + "fast-deep-equal": "^3.1.3", + "memize": "^2.1.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/core-data/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/data": { "version": "10.34.0", "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.34.0.tgz", @@ -7576,6 +7653,52 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/dataviews": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-10.2.0.tgz", + "integrity": "sha512-Kwt5tB4SRkyWFVVqgGNraRajNm5lACObrzLV1f2A2343dQ88cgiS5iukI9qdhzy7CiGIHN7UrQaFbpDoTtOKAA==", + "dev": true, + "dependencies": { + "@ariakit/react": "^0.4.15", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/date": "^5.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/keycodes": "^4.34.0", + "@wordpress/primitives": "^4.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/url": "^4.34.0", + "@wordpress/warning": "^3.34.0", + "clsx": "^2.1.1", + "colord": "^2.7.0", + "date-fns": "^4.1.0", + "deepmerge": "4.3.1", + "fast-deep-equal": "^3.1.3", + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/dataviews/node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/@wordpress/date": { "version": "5.34.0", "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.34.0.tgz", @@ -7670,6 +7793,83 @@ "@playwright/test": ">=1" } }, + "node_modules/@wordpress/editor": { + "version": "14.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.34.0.tgz", + "integrity": "sha512-AYfJ/6VbEP+5qTloo23b2NNzAp2/grwDUmjDSeFMUvA0PT2GCu+6LBMxb+y3rSSz83jVmP5hhI8TBAS7rNn8QQ==", + "dev": true, + "dependencies": { + "@floating-ui/react-dom": "2.0.8", + "@wordpress/a11y": "^4.34.0", + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/blob": "^4.34.0", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/commands": "^1.34.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/core-data": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/dataviews": "^10.2.0", + "@wordpress/date": "^5.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/dom": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/fields": "^0.26.0", + "@wordpress/global-styles-engine": "^1.1.0", + "@wordpress/global-styles-ui": "^1.1.0", + "@wordpress/hooks": "^4.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/interface": "^9.19.0", + "@wordpress/keyboard-shortcuts": "^5.34.0", + "@wordpress/keycodes": "^4.34.0", + "@wordpress/media-utils": "^5.34.0", + "@wordpress/notices": "^5.34.0", + "@wordpress/patterns": "^2.34.0", + "@wordpress/plugins": "^7.34.0", + "@wordpress/preferences": "^4.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/reusable-blocks": "^5.34.0", + "@wordpress/rich-text": "^7.34.0", + "@wordpress/server-side-render": "^6.10.0", + "@wordpress/url": "^4.34.0", + "@wordpress/warning": "^3.34.0", + "@wordpress/wordcount": "^4.34.0", + "change-case": "^4.1.2", + "client-zip": "^2.4.5", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "fast-deep-equal": "^3.1.3", + "memize": "^2.1.0", + "react-autosize-textarea": "^7.1.0", + "remove-accents": "^0.5.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/editor/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/element": { "version": "6.34.0", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.34.0.tgz", @@ -7792,6 +7992,49 @@ "node": ">= 6" } }, + "node_modules/@wordpress/fields": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.26.0.tgz", + "integrity": "sha512-lV3Va+gyqw+Kig+fLHwZnvU/JssjEM0ZECSqgWwy1c5QPmjhwVt/BAzoL+XN7Hq+H7HBJghmBGYAK46QnJ7+DA==", + "dev": true, + "dependencies": { + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/blob": "^4.34.0", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/core-data": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/dataviews": "^10.2.0", + "@wordpress/date": "^5.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/hooks": "^4.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/media-utils": "^5.34.0", + "@wordpress/notices": "^5.34.0", + "@wordpress/patterns": "^2.34.0", + "@wordpress/primitives": "^4.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/router": "^1.34.0", + "@wordpress/url": "^4.34.0", + "@wordpress/warning": "^3.34.0", + "change-case": "4.1.2", + "client-zip": "^2.4.5", + "clsx": "2.1.1", + "remove-accents": "^0.5.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/@wordpress/global-styles-engine": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@wordpress/global-styles-engine/-/global-styles-engine-1.1.0.tgz", @@ -7813,6 +8056,41 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/global-styles-ui": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/global-styles-ui/-/global-styles-ui-1.1.0.tgz", + "integrity": "sha512-cqrtm+6CHj+LqNLsbysfocZ26E1zmYnyaz5VDSRKo5i9QJ7aP5ZbK+q2lTYMXwRs8tCCM/T8P2MZUBJQwUdoHw==", + "dev": true, + "dependencies": { + "@wordpress/a11y": "^4.34.0", + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/core-data": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/date": "^5.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/global-styles-engine": "^1.1.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/keycodes": "^4.34.0", + "@wordpress/private-apis": "^1.34.0", + "change-case": "^4.1.2", + "classnames": "^2.3.2", + "clsx": "^2.1.0", + "colord": "^2.7.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@wordpress/hooks": { "version": "4.34.0", "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.34.0.tgz", @@ -7866,6 +8144,35 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/interface": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-9.19.0.tgz", + "integrity": "sha512-jngW8S/YPdjH62hH7fxvPaUVSO8MqcQaQW5ORoYmi0ZIbM9D1kTbfcWU6vPNzvT79wDScoQkpBFSzUZyafmZpA==", + "dev": true, + "dependencies": { + "@wordpress/a11y": "^4.34.0", + "@wordpress/admin-ui": "^1.2.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/plugins": "^7.34.0", + "@wordpress/preferences": "^4.34.0", + "@wordpress/viewport": "^6.34.0", + "clsx": "^2.1.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@wordpress/is-shallow-equal": { "version": "5.34.0", "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.34.0.tgz", @@ -7941,6 +8248,27 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/media-utils": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.34.0.tgz", + "integrity": "sha512-AqOvXCVRobeHsjPCIMobdQHiSYzslYB1lgjerEkRzJ6cKkzrP4t7/Lt4vDuEAiOix9Fs/Ly+XccFxVGoB2iCqg==", + "dev": true, + "dependencies": { + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/blob": "^4.34.0", + "@wordpress/components": "^30.7.0", + "@wordpress/core-data": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/dataviews": "^10.2.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/private-apis": "^1.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/notices": { "version": "5.34.0", "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.34.0.tgz", @@ -7954,21 +8282,52 @@ "node": ">=18.12.0", "npm": ">=8.19.2" }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@wordpress/npm-package-json-lint-config": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.33.0.tgz", - "integrity": "sha512-XejRL8yPGoBVY44gvfH2A2STzFDUjzT7inxhsqzZWYgpMtDNjgdrRN6fgA1GP1nyQx0iRg28r/vapjFCWCA+5w==", - "dev": true, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@wordpress/npm-package-json-lint-config": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.33.0.tgz", + "integrity": "sha512-XejRL8yPGoBVY44gvfH2A2STzFDUjzT7inxhsqzZWYgpMtDNjgdrRN6fgA1GP1nyQx0iRg28r/vapjFCWCA+5w==", + "dev": true, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "npm-package-json-lint": ">=6.0.0" + } + }, + "node_modules/@wordpress/patterns": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.34.0.tgz", + "integrity": "sha512-2t3e5aH/i/60dsJoXXWiXnjW6Nk2WathmW3PhSZwBB4T/lII50QGN7alANpBZC64ogaJaFjNC9gYyELlDjrICQ==", + "dev": true, + "dependencies": { + "@wordpress/a11y": "^4.34.0", + "@wordpress/base-styles": "^6.10.0", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/core-data": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/html-entities": "^4.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/notices": "^5.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/url": "^4.34.0" + }, "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" }, "peerDependencies": { - "npm-package-json-lint": ">=6.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/@wordpress/plugins": { @@ -8110,6 +8469,34 @@ "redux": ">=4" } }, + "node_modules/@wordpress/reusable-blocks": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.34.0.tgz", + "integrity": "sha512-fZdJ3f/bMdg1MF+Wpjv6iC4bcMWuUQYANfwHbdPr0i0xNDp2Vob0bAvNPtFBkj7gO2P1TwDcvEli9YVAp3zMQQ==", + "dev": true, + "dependencies": { + "@wordpress/base-styles": "^6.10.0", + "@wordpress/block-editor": "^15.7.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/core-data": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", + "@wordpress/notices": "^5.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/url": "^4.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@wordpress/rich-text": { "version": "7.34.0", "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.34.0.tgz", @@ -8135,6 +8522,27 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/router": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/router/-/router-1.34.0.tgz", + "integrity": "sha512-BBgVmuDenNLaupLpyHu+yb6gDUmjguNQw9h6Q5d0kFCU0I/3GjU5xUVo+ll50WO+nc3kFx/bDw7UPJfTteT+DQ==", + "dev": true, + "dependencies": { + "@wordpress/compose": "^7.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/private-apis": "^1.34.0", + "@wordpress/url": "^4.34.0", + "history": "^5.3.0", + "route-recognizer": "^0.3.4" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/@wordpress/scripts": { "version": "30.26.0", "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.26.0.tgz", @@ -8220,6 +8628,31 @@ } } }, + "node_modules/@wordpress/server-side-render": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-6.10.0.tgz", + "integrity": "sha512-9D2UkJ2f554XBmG5k4hSAkuf2hW5iEM+s47tWoC+BmEwtYNo/hTJ+XmcG7OgixSs9xVCXkEvI2pMancSY0tAQg==", + "dev": true, + "dependencies": { + "@wordpress/api-fetch": "^7.34.0", + "@wordpress/blocks": "^15.7.0", + "@wordpress/components": "^30.7.0", + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/deprecated": "^4.34.0", + "@wordpress/element": "^6.34.0", + "@wordpress/i18n": "^6.7.0", + "@wordpress/url": "^4.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@wordpress/shortcode": { "version": "4.34.0", "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.34.0.tgz", @@ -8265,6 +8698,28 @@ "stylelint-scss": "^6.4.0" } }, + "node_modules/@wordpress/sync": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.34.0.tgz", + "integrity": "sha512-utnmAuxL3CRcPJ84A4mKSRMzLqlLzxspQdFXhXypEHjSe3voKONs/jVGSBoHKyovBrdANzS2Ey8Xh7meqD8NTQ==", + "dev": true, + "dependencies": { + "@types/simple-peer": "^9.11.5", + "@wordpress/hooks": "^4.34.0", + "@wordpress/url": "^4.34.0", + "import-locals": "^2.0.0", + "lib0": "^0.2.42", + "simple-peer": "^9.11.0", + "y-indexeddb": "~9.0.11", + "y-protocols": "^1.0.5", + "y-webrtc": "~10.2.5", + "yjs": "~13.6.6" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/token-list": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.34.0.tgz", @@ -8340,6 +8795,24 @@ "npm": ">=8.19.2" } }, + "node_modules/@wordpress/viewport": { + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-6.34.0.tgz", + "integrity": "sha512-oOMo4a8nW2yHDC1nGgPtHRTT8bLmgVA/jPb8BfKDh0YTD713QlQpkQ9+sU3+QnpODgKYHMSAEcbhJ0o7teStWg==", + "dev": true, + "dependencies": { + "@wordpress/compose": "^7.34.0", + "@wordpress/data": "^10.34.0", + "@wordpress/element": "^6.34.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, "node_modules/@wordpress/warning": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.34.0.tgz", @@ -9932,6 +10405,12 @@ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "dev": true + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -9965,6 +10444,12 @@ "node": ">= 12" } }, + "node_modules/client-zip": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.5.0.tgz", + "integrity": "sha512-ydG4nDZesbFurnNq0VVCp/yyomIBh+X/1fZPI/P24zbnG4dtC4tQAfI5uQsomigsUMeiRO2wiTPizLWQh+IAyQ==", + "dev": true + }, "node_modules/clipboard": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", @@ -11577,6 +12062,12 @@ "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==", "dev": true }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -13529,6 +14020,12 @@ "node": ">=6.9.0" } }, + "node_modules/get-browser-rtc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", + "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==", + "dev": true + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -14042,6 +14539,15 @@ "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==", "dev": true }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -14516,6 +15022,12 @@ "node": ">=8" } }, + "node_modules/import-locals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-locals/-/import-locals-2.0.0.tgz", + "integrity": "sha512-1/bPE89IZhyf7dr5Pkz7b4UyVXy5pEt7PTEfye15UEn3AK8+2zwcDCfKk9Pwun4ltfhOSszOrReSsFcDKw/yoA==", + "dev": true + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -15183,6 +15695,16 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "dev": true, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -16289,6 +16811,27 @@ "node": ">= 0.8.0" } }, + "node_modules/lib0": { + "version": "0.2.114", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.114.tgz", + "integrity": "sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==", + "dev": true, + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/lighthouse": { "version": "12.8.2", "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.2.tgz", @@ -20522,6 +21065,12 @@ "node": ">=10.0.0" } }, + "node_modules/route-recognizer": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz", + "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==", + "dev": true + }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -21473,6 +22022,96 @@ "integrity": "sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==", "dev": true }, + "node_modules/simple-peer": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", + "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "buffer": "^6.0.3", + "debug": "^4.3.2", + "err-code": "^3.0.1", + "get-browser-rtc": "^1.1.0", + "queue-microtask": "^1.2.3", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/simple-peer/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/simple-peer/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/simple-peer/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/simple-peer/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -24666,6 +25305,73 @@ "node": ">=0.4" } }, + "node_modules/y-indexeddb": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.12.tgz", + "integrity": "sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==", + "dev": true, + "dependencies": { + "lib0": "^0.2.74" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-protocols": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", + "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", + "dev": true, + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/y-webrtc": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.6.tgz", + "integrity": "sha512-1kZ4YYwksFZi8+l8mTebVX9vW6Q5MnqxMkvNU700X5dBE38usurt/JgeXSIQRpK3NwUYYb9y63Jn9FMpMH6/vA==", + "dev": true, + "dependencies": { + "lib0": "^0.2.42", + "simple-peer": "^9.11.0", + "y-protocols": "^1.0.6" + }, + "bin": { + "y-webrtc-signaling": "bin/server.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "optionalDependencies": { + "ws": "^8.14.2" + }, + "peerDependencies": { + "yjs": "^13.6.8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -24750,6 +25456,23 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/yjs": { + "version": "13.6.27", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", + "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", + "dev": true, + "dependencies": { + "lib0": "^0.2.99" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 812c50f3..70e1eb87 100644 --- a/package.json +++ b/package.json @@ -25,10 +25,12 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", + "@wordpress/api-fetch": "^7.34.0", "@wordpress/block-editor": "^15.7.0", "@wordpress/components": "^30.7.0", "@wordpress/compose": "^7.34.0", "@wordpress/data": "^10.34.0", + "@wordpress/editor": "^14.34.0", "@wordpress/element": "^6.34.0", "@wordpress/env": "^10.33.0", "@wordpress/eslint-plugin": "^22.17.0", diff --git a/src/features/title-generation/components/TitleToolbar.tsx b/src/features/title-generation/components/TitleToolbar.tsx index 6e46e71b..83dcc772 100644 --- a/src/features/title-generation/components/TitleToolbar.tsx +++ b/src/features/title-generation/components/TitleToolbar.tsx @@ -2,8 +2,11 @@ * Title toolbar component for generating and transforming post titles. */ +/** + * External Dependencies. + */ import React from 'react'; -import { useSelect, useDispatch } from '@wordpress/data'; +import apiFetch from '@wordpress/api-fetch'; import { ToolbarGroup, ToolbarButton, @@ -11,20 +14,40 @@ import { MenuGroup, MenuItem, } from '@wordpress/components'; -import { update, chevronDown } from '@wordpress/icons'; +import { dispatch, useSelect, useDispatch } from '@wordpress/data'; +import { PostTypeSupportCheck } from '@wordpress/editor'; import { useState } from '@wordpress/element'; +import { update, chevronDown } from '@wordpress/icons'; import { __ } from '@wordpress/i18n'; + +/** + * Internal Dependencies. + */ import { toSentenceCase, toTitleCase } from '../utils/casing'; +const { ai_title_generation_data } = window as any; + /** - * Placeholder function for title generation API call. + * Generates a title for the given post ID and content. * + * @param {number} postId - The ID of the post to generate a title for. + * @param {string} content - The content of the post to generate a title for. * @return {Promise} A promise that resolves to the generated title. */ -async function generateTitle(): Promise< string > { - // TODO: Connect to actual API endpoint - // For now, return a placeholder - return Promise.resolve( 'Generated Title' ); +async function generateTitle( postId: number, content: string ): Promise< string > { + return apiFetch( { + path: ai_title_generation_data?.path, + method: 'POST', + data: { input: { post_id: postId, content, n: 1 } }, + } ).then( ( response ) => { + if ( response && typeof response === 'object' && 'titles' in response ) { + return ( response.titles as string[] )[0]; + } + + return ''; + } ).catch( ( error ) => { + throw new Error( `Error generating title: ${error.message}` ); + } ); } /** @@ -34,13 +57,22 @@ async function generateTitle(): Promise< string > { * * @return {JSX.Element} The toolbar component. */ -export default function TitleToolbar(): JSX.Element { +export default function TitleToolbar(): JSX.Element | null { + // Ensure the feature is enabled. + if ( ! ai_title_generation_data?.enabled ) { + return null; + } + + const postId = useSelect( ( select ) => { + return ( select( 'core/editor' ) as any ).getCurrentPostId() ?? 0; + }, [] ); + const title = useSelect( ( select ) => { - return select( 'core/editor' ).getEditedPostAttribute( 'title' ) || ''; + return ( select( 'core/editor' ) as any ).getEditedPostAttribute( 'title' ) || ''; }, [] ); const content = useSelect( ( select ) => { - return select( 'core/editor' ).getEditedPostContent() || ''; + return ( select( 'core/editor' ) as any ).getEditedPostContent() || ''; }, [] ); const { editPost } = useDispatch( 'core/editor' ); @@ -55,12 +87,19 @@ export default function TitleToolbar(): JSX.Element { */ const handleGenerate = async () => { setIsGenerating( true ); + ( dispatch( 'core/notices' ) as any ).removeNotice( 'ai_title_generation_error' ); + try { - const generatedTitle = await generateTitle( content ); + const generatedTitle = await generateTitle( postId, content ); editPost( { title: generatedTitle } ); } catch ( error ) { - // TODO: Handle error appropriately - console.error( 'Error generating title:', error ); // eslint-disable-line no-console + ( dispatch( 'core/notices' ) as any ).createErrorNotice( + error, + { + id: 'ai_title_generation_error', + isDismissible: true + } + ); } finally { setIsGenerating( false ); } @@ -89,50 +128,52 @@ export default function TitleToolbar(): JSX.Element { }; return ( - - - { buttonLabel } - - { hasTitle && ( - + + - { ( { onClose } ) => ( - <> - - { - handleCasingChange( 'sentence' ); - onClose(); - } } - > - { __( 'Sentence Case', 'ai' ) } - - { - handleCasingChange( 'title' ); - onClose(); - } } - > - { __( 'Title Case', 'ai' ) } - - - - ) } - - ) } - + { buttonLabel } + + { hasTitle && ( + + { ( { onClose } ) => ( + <> + + { + handleCasingChange( 'sentence' ); + onClose(); + } } + > + { __( 'Sentence Case', 'ai' ) } + + { + handleCasingChange( 'title' ); + onClose(); + } } + > + { __( 'Title Case', 'ai' ) } + + + + ) } + + ) } + + ); } diff --git a/src/features/title-generation/components/TitleToolbarWrapper.tsx b/src/features/title-generation/components/TitleToolbarWrapper.tsx index 01d24577..4e729843 100644 --- a/src/features/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/features/title-generation/components/TitleToolbarWrapper.tsx @@ -5,8 +5,15 @@ * in normal editing mode (non-template mode). */ +/** + * External Dependencies. + */ import React from 'react'; import { createRoot, useEffect } from '@wordpress/element'; + +/** + * Internal Dependencies. + */ import TitleToolbar from './TitleToolbar'; /** @@ -19,8 +26,9 @@ import TitleToolbar from './TitleToolbar'; function TitleToolbarWrapper(): JSX.Element { useEffect( () => { let isAttached = false; - let retryTimeout: NodeJS.Timeout | null = null; let root: ReturnType< typeof createRoot > | null = null; + let removeTitleListeners: ( () => void ) | null = null; + let removeToolbarListeners: ( () => void ) | null = null; let observer: MutationObserver | null = null; let titleInput: HTMLElement | null = null; let toolbarContainer: HTMLElement | null = null; @@ -44,6 +52,79 @@ function TitleToolbarWrapper(): JSX.Element { return null; }; + // Create a reusable retry function + const createRetry = ( + checkFn: () => boolean, + callback: () => void, + maxRetries: number, + delay: number = 200 + ): ( () => void ) => { + let retryCount = 0; + let timeoutId: NodeJS.Timeout | null = null; + + const retry = () => { + if ( retryCount < maxRetries && ! isAttached ) { + retryCount++; + timeoutId = setTimeout( () => { + timeoutId = null; + if ( checkFn() ) { + callback(); + } else { + retry(); + } + }, delay ); + } + }; + + // Store timeout ID for cleanup + const start = () => { + if ( ! timeoutId ) { + retry(); + } + }; + + const cancel = () => { + if ( timeoutId ) { + clearTimeout( timeoutId ); + timeoutId = null; + } + }; + + return start; + }; + + // Create reusable focus/blur handlers + const createFocusBlurHandlers = ( + onFocus: () => void, + onBlur: () => void, + blurDelay: number = 10 + ) => { + return { + focus: onFocus, + blur: () => { + setTimeout( onBlur, blurDelay ); + }, + }; + }; + + // Setup event listeners on an element + const setupEventListeners = ( + element: HTMLElement, + handlers: { focus: () => void; blur: () => void }, + useFocusIn: boolean = false + ) => { + const focusEvent = useFocusIn ? 'focusin' : 'focus'; + const blurEvent = useFocusIn ? 'focusout' : 'blur'; + + element.addEventListener( focusEvent, handlers.focus ); + element.addEventListener( blurEvent, handlers.blur ); + + return () => { + element.removeEventListener( focusEvent, handlers.focus ); + element.removeEventListener( blurEvent, handlers.blur ); + }; + }; + // Check if focus is on title input or toolbar const isFocusedOnTitleOrToolbar = (): boolean => { const editorDoc = getEditorDocument(); @@ -109,24 +190,13 @@ function TitleToolbarWrapper(): JSX.Element { const editorDoc = getEditorDocument(); if ( ! editorDoc ) { - // Editor iframe not found yet, try again after a short delay - if ( ! retryTimeout ) { - let retryCount = 0; - const maxRetries = 20; - const retry = () => { - if ( retryCount < maxRetries && ! isAttached ) { - retryCount++; - retryTimeout = setTimeout( () => { - retryTimeout = null; - findAndAttachToolbar(); - if ( ! isAttached && retryCount < maxRetries ) { - retry(); - } - }, 200 ); - } - }; - retry(); - } + // Editor iframe not found yet, retry + const retryEditor = createRetry( + () => getEditorDocument() !== null, + findAndAttachToolbar, + 20 + ); + retryEditor(); return; } @@ -150,24 +220,19 @@ function TitleToolbarWrapper(): JSX.Element { } if ( ! foundTitleInput ) { - // Title field not found yet, try again after a short delay - if ( ! retryTimeout ) { - let retryCount = 0; - const maxRetries = 10; - const retry = () => { - if ( retryCount < maxRetries && ! isAttached ) { - retryCount++; - retryTimeout = setTimeout( () => { - retryTimeout = null; - findAndAttachToolbar(); - if ( ! isAttached && retryCount < maxRetries ) { - retry(); - } - }, 200 ); + // Title field not found yet, retry + const retryTitle = createRetry( + () => { + const doc = getEditorDocument(); + if ( ! doc ) { + return false; } - }; - retry(); - } + return !! doc.querySelector( '.editor-post-title__input' ); + }, + findAndAttachToolbar, + 10 + ); + retryTitle(); return; } @@ -213,36 +278,30 @@ function TitleToolbarWrapper(): JSX.Element { root = createRoot( toolbarContainer ); root.render( ); - // Add focus/blur handlers for title input - focusHandler = () => { - showToolbar(); - }; - - blurHandler = () => { - // Use a small delay to check where focus moved to - // This allows focus to move to toolbar elements before we check - setTimeout( () => { - updateToolbarVisibility(); - }, 10 ); - }; - - titleInput.addEventListener( 'focus', focusHandler ); - titleInput.addEventListener( 'blur', blurHandler ); - - // Add focus/blur handlers for toolbar container - toolbarFocusHandler = () => { - showToolbar(); - }; - - toolbarBlurHandler = () => { - // Use a small delay to check where focus moved to - setTimeout( () => { - updateToolbarVisibility(); - }, 10 ); - }; - - toolbarContainer.addEventListener( 'focusin', toolbarFocusHandler ); - toolbarContainer.addEventListener( 'focusout', toolbarBlurHandler ); + // Create and attach focus/blur handlers for title input + const titleHandlers = createFocusBlurHandlers( + showToolbar, + updateToolbarVisibility + ); + focusHandler = titleHandlers.focus; + blurHandler = titleHandlers.blur; + removeTitleListeners = setupEventListeners( + titleInput, + titleHandlers + ); + + // Create and attach focus/blur handlers for toolbar container + const toolbarHandlers = createFocusBlurHandlers( + showToolbar, + updateToolbarVisibility + ); + toolbarFocusHandler = toolbarHandlers.focus; + toolbarBlurHandler = toolbarHandlers.blur; + removeToolbarListeners = setupEventListeners( + toolbarContainer, + toolbarHandlers, + true // Use focusin/focusout for toolbar + ); // Check initial focus state if ( editorDoc.activeElement === titleInput ) { @@ -286,30 +345,15 @@ function TitleToolbarWrapper(): JSX.Element { if ( observer ) { observer.disconnect(); } - if ( retryTimeout ) { - clearTimeout( retryTimeout ); - } clearTimeout( initialTimeout ); clearTimeout( observerTimeout ); // Remove event listeners - if ( titleInput && focusHandler && blurHandler ) { - titleInput.removeEventListener( 'focus', focusHandler ); - titleInput.removeEventListener( 'blur', blurHandler ); + if ( removeTitleListeners ) { + removeTitleListeners(); } - if ( - toolbarContainer && - toolbarFocusHandler && - toolbarBlurHandler - ) { - toolbarContainer.removeEventListener( - 'focusin', - toolbarFocusHandler - ); - toolbarContainer.removeEventListener( - 'focusout', - toolbarBlurHandler - ); + if ( removeToolbarListeners ) { + removeToolbarListeners(); } // Clean up toolbar and wrapper diff --git a/src/features/title-generation/index.tsx b/src/features/title-generation/index.tsx index 7b90d3ff..75852916 100644 --- a/src/features/title-generation/index.tsx +++ b/src/features/title-generation/index.tsx @@ -2,11 +2,18 @@ * Title generation feature plugin registration. */ +/** + * External Dependencies. + */ import React from 'react'; -import { registerPlugin } from '@wordpress/plugins'; -import { addFilter } from '@wordpress/hooks'; -import { createHigherOrderComponent } from '@wordpress/compose'; import { BlockControls } from '@wordpress/block-editor'; +import { createHigherOrderComponent } from '@wordpress/compose'; +import { addFilter } from '@wordpress/hooks'; +import { registerPlugin } from '@wordpress/plugins'; + +/** + * Internal Dependencies. + */ import TitleToolbar from './components/TitleToolbar'; import { TitleToolbarWrapper } from './components/TitleToolbarWrapper'; From 394e44714db97b43d3dabcff59236c412b0bee31 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 14:47:25 -0700 Subject: [PATCH 14/39] Add a method to build the REST API path --- includes/Abstracts/Abstract_Ability.php | 12 ++++++++++++ .../Features/Title_Generation/Title_Generation.php | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/includes/Abstracts/Abstract_Ability.php b/includes/Abstracts/Abstract_Ability.php index b0c493ab..9c7eb332 100644 --- a/includes/Abstracts/Abstract_Ability.php +++ b/includes/Abstracts/Abstract_Ability.php @@ -83,6 +83,18 @@ protected function category(): string { return 'ai-experiments'; } + /** + * Returns the REST API path of the ability. + * + * @since 0.1.0 + * + * @param string $feature_id The ID of the feature. + * @return string The path of the ability. + */ + public static function path( string $feature_id = '' ): string { + return 'wp-abilities/v1/abilities/ai/' . $feature_id . '/run'; + } + /** * Returns the input schema of the ability. * diff --git a/includes/Features/Title_Generation/Title_Generation.php b/includes/Features/Title_Generation/Title_Generation.php index 34a30771..e6378168 100644 --- a/includes/Features/Title_Generation/Title_Generation.php +++ b/includes/Features/Title_Generation/Title_Generation.php @@ -136,7 +136,7 @@ public function enqueue_assets( string $hook_suffix ): void { 'title_generation_data', array( 'enabled' => $this->is_enabled(), - 'path' => 'wp-abilities/v1/abilities/ai/title-generation/run', + 'path' => Title_Generation_Ability::path( $this->get_id() ), ) ); } From 9c574d9c98feb9b050fcd81d31196e02f8de73b8 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 7 Nov 2025 15:12:40 -0700 Subject: [PATCH 15/39] Add better loading state. Fix lint errors --- includes/Asset_Loader.php | 2 +- .../Title_Generation/Title_Generation.php | 2 +- .../components/TitleToolbar.tsx | 75 ++++++++++++------- .../components/TitleToolbarWrapper.tsx | 23 ++---- 4 files changed, 54 insertions(+), 48 deletions(-) diff --git a/includes/Asset_Loader.php b/includes/Asset_Loader.php index cf58d5b8..e3c5af69 100644 --- a/includes/Asset_Loader.php +++ b/includes/Asset_Loader.php @@ -101,7 +101,7 @@ public static function enqueue_style( string $handle, string $file_name ): void public static function localize_script( string $handle, string $object_name, array $data ): void { wp_localize_script( 'ai_' . $handle, - 'ai_' . $object_name, + 'ai' . $object_name, $data ); } diff --git a/includes/Features/Title_Generation/Title_Generation.php b/includes/Features/Title_Generation/Title_Generation.php index e6378168..87c0b7d0 100644 --- a/includes/Features/Title_Generation/Title_Generation.php +++ b/includes/Features/Title_Generation/Title_Generation.php @@ -133,7 +133,7 @@ public function enqueue_assets( string $hook_suffix ): void { Asset_Loader::enqueue_script( 'title_generation', 'features/title-generation' ); Asset_Loader::localize_script( 'title_generation', - 'title_generation_data', + 'TitleGenerationData', array( 'enabled' => $this->is_enabled(), 'path' => Title_Generation_Ability::path( $this->get_id() ), diff --git a/src/features/title-generation/components/TitleToolbar.tsx b/src/features/title-generation/components/TitleToolbar.tsx index 83dcc772..49283dda 100644 --- a/src/features/title-generation/components/TitleToolbar.tsx +++ b/src/features/title-generation/components/TitleToolbar.tsx @@ -25,29 +25,40 @@ import { __ } from '@wordpress/i18n'; */ import { toSentenceCase, toTitleCase } from '../utils/casing'; -const { ai_title_generation_data } = window as any; +const { aiTitleGenerationData } = window as any; /** * Generates a title for the given post ID and content. * - * @param {number} postId - The ID of the post to generate a title for. + * TODO: Handle multiple titles. + * + * @param {number} postId - The ID of the post to generate a title for. * @param {string} content - The content of the post to generate a title for. * @return {Promise} A promise that resolves to the generated title. */ -async function generateTitle( postId: number, content: string ): Promise< string > { +async function generateTitle( + postId: number, + content: string +): Promise< string > { return apiFetch( { - path: ai_title_generation_data?.path, + path: aiTitleGenerationData?.path, method: 'POST', data: { input: { post_id: postId, content, n: 1 } }, - } ).then( ( response ) => { - if ( response && typeof response === 'object' && 'titles' in response ) { - return ( response.titles as string[] )[0]; - } - - return ''; - } ).catch( ( error ) => { - throw new Error( `Error generating title: ${error.message}` ); - } ); + } ) + .then( ( response ) => { + if ( + response && + typeof response === 'object' && + 'titles' in response + ) { + return ( response.titles as string[] )[ 0 ]; + } + + return ''; + } ) + .catch( ( error ) => { + throw new Error( `Error generating title: ${ error.message }` ); + } ); } /** @@ -58,17 +69,16 @@ async function generateTitle( postId: number, content: string ): Promise< string * @return {JSX.Element} The toolbar component. */ export default function TitleToolbar(): JSX.Element | null { - // Ensure the feature is enabled. - if ( ! ai_title_generation_data?.enabled ) { - return null; - } - const postId = useSelect( ( select ) => { return ( select( 'core/editor' ) as any ).getCurrentPostId() ?? 0; }, [] ); const title = useSelect( ( select ) => { - return ( select( 'core/editor' ) as any ).getEditedPostAttribute( 'title' ) || ''; + return ( + ( select( 'core/editor' ) as any ).getEditedPostAttribute( + 'title' + ) || '' + ); }, [] ); const content = useSelect( ( select ) => { @@ -80,26 +90,27 @@ export default function TitleToolbar(): JSX.Element | null { const [ isGenerating, setIsGenerating ] = useState( false ); const hasTitle = title.trim().length > 0; - const buttonLabel = hasTitle ? __( 'Re-generate', 'ai' ) : __( 'Generate', 'ai' ); + const buttonLabel = hasTitle + ? __( 'Re-generate', 'ai' ) + : __( 'Generate', 'ai' ); /** * Handles the generate/re-generate button click. */ const handleGenerate = async () => { setIsGenerating( true ); - ( dispatch( 'core/notices' ) as any ).removeNotice( 'ai_title_generation_error' ); + ( dispatch( 'core/notices' ) as any ).removeNotice( + 'ai_title_generation_error' + ); try { const generatedTitle = await generateTitle( postId, content ); editPost( { title: generatedTitle } ); } catch ( error ) { - ( dispatch( 'core/notices' ) as any ).createErrorNotice( - error, - { - id: 'ai_title_generation_error', - isDismissible: true - } - ); + ( dispatch( 'core/notices' ) as any ).createErrorNotice( error, { + id: 'ai_title_generation_error', + isDismissible: true, + } ); } finally { setIsGenerating( false ); } @@ -127,6 +138,11 @@ export default function TitleToolbar(): JSX.Element | null { editPost( { title: transformedTitle } ); }; + // Ensure the feature is enabled. + if ( ! aiTitleGenerationData?.enabled ) { + return null; + } + return ( @@ -135,10 +151,11 @@ export default function TitleToolbar(): JSX.Element | null { label={ buttonLabel } onClick={ handleGenerate } disabled={ isGenerating } + isBusy={ isGenerating } > { buttonLabel } - { hasTitle && ( + { hasTitle && ! isGenerating && ( void ) | null = null; - let blurHandler: ( ( e: FocusEvent ) => void ) | null = null; - let toolbarFocusHandler: ( ( e: Event ) => void ) | null = null; - let toolbarBlurHandler: ( ( e: Event ) => void ) | null = null; // Find the editor iframe const getEditorDocument = (): Document | null => { @@ -83,13 +79,6 @@ function TitleToolbarWrapper(): JSX.Element { } }; - const cancel = () => { - if ( timeoutId ) { - clearTimeout( timeoutId ); - timeoutId = null; - } - }; - return start; }; @@ -151,7 +140,9 @@ function TitleToolbarWrapper(): JSX.Element { toolbarContainer && ( activeElement === toolbarContainer || toolbarContainer.contains( activeElement ) || - toolbarContainer.querySelector( '.components-dropdown-menu .is-opened' ) ) + toolbarContainer.querySelector( + '.components-dropdown-menu .is-opened' + ) ) ) { return true; } @@ -227,7 +218,9 @@ function TitleToolbarWrapper(): JSX.Element { if ( ! doc ) { return false; } - return !! doc.querySelector( '.editor-post-title__input' ); + return !! doc.querySelector( + '.editor-post-title__input' + ); }, findAndAttachToolbar, 10 @@ -283,8 +276,6 @@ function TitleToolbarWrapper(): JSX.Element { showToolbar, updateToolbarVisibility ); - focusHandler = titleHandlers.focus; - blurHandler = titleHandlers.blur; removeTitleListeners = setupEventListeners( titleInput, titleHandlers @@ -295,8 +286,6 @@ function TitleToolbarWrapper(): JSX.Element { showToolbar, updateToolbarVisibility ); - toolbarFocusHandler = toolbarHandlers.focus; - toolbarBlurHandler = toolbarHandlers.blur; removeToolbarListeners = setupEventListeners( toolbarContainer, toolbarHandlers, From 854925380edfd0931c9d230d2bf0b0b0395a1965 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Thu, 13 Nov 2025 14:41:28 -0700 Subject: [PATCH 16/39] Update doc --- includes/Asset_Loader.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/includes/Asset_Loader.php b/includes/Asset_Loader.php index e3c5af69..df3e3e70 100644 --- a/includes/Asset_Loader.php +++ b/includes/Asset_Loader.php @@ -13,13 +13,15 @@ * @package WordPress\AI */ +declare( strict_types=1 ); + namespace WordPress\AI; /** * Class Asset_Loader * * A utility class for registering and enqueuing assets (scripts and styles) - * in a WordPress plugin or theme, with support for asset metadata files. + * with support for asset metadata files. * * @since 0.1.0 */ From d07365fdf1feb4bbf4e183cafc1f0a3f9e5bd7b5 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 14 Nov 2025 11:33:36 -0700 Subject: [PATCH 17/39] Fix lint issues --- includes/Asset_Loader.php | 4 ++-- includes/Features/Title_Generation/Title_Generation.php | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/includes/Asset_Loader.php b/includes/Asset_Loader.php index df3e3e70..bf83f0ba 100644 --- a/includes/Asset_Loader.php +++ b/includes/Asset_Loader.php @@ -41,7 +41,7 @@ public static function enqueue_script( string $handle, string $file_name ): void $script_asset_path = $script_path . '.asset.php'; if ( file_exists( $script_asset_path ) ) { - $asset_data = require $script_asset_path; + $asset_data = require $script_asset_path; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable } else { $asset_data = array( 'dependencies' => array(), @@ -72,7 +72,7 @@ public static function enqueue_style( string $handle, string $file_name ): void $style_asset_path = $style_path . '.asset.php'; if ( file_exists( $style_asset_path ) ) { - $asset_data = require $style_asset_path; + $asset_data = require $style_asset_path; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable } else { $asset_data = array( 'dependencies' => array(), diff --git a/includes/Features/Title_Generation/Title_Generation.php b/includes/Features/Title_Generation/Title_Generation.php index 9ea8650f..bbac9379 100644 --- a/includes/Features/Title_Generation/Title_Generation.php +++ b/includes/Features/Title_Generation/Title_Generation.php @@ -9,9 +9,9 @@ namespace WordPress\AI\Features\Title_Generation; -use WordPress\AI\Asset_Loader; use WordPress\AI\Abilities\Title_Generation\Title_Generation as Title_Generation_Ability; use WordPress\AI\Abstracts\Abstract_Feature; +use WordPress\AI\Asset_Loader; /** * Title generation feature. @@ -78,8 +78,9 @@ public function enqueue_assets( string $hook_suffix ): void { // Load the assets only if the post type supports titles and is not an attachment. if ( + ! $screen || ! post_type_supports( $screen->post_type, 'title' ) || - in_array( $screen->post_type, [ 'attachment' ], true ) + in_array( $screen->post_type, array( 'attachment' ), true ) ) { return; } From 1d98d495851fb407f8a4d5ba0b916d22785b34d4 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 14 Nov 2025 12:35:35 -0700 Subject: [PATCH 18/39] Switch from making direct API requests to the Ability endpoint to using the executeAbility function --- includes/Abstracts/Abstract_Ability.php | 12 - .../Title_Generation/Title_Generation.php | 1 - package-lock.json | 538 ++++++++++++++---- package.json | 1 - .../components/TitleToolbar.tsx | 10 +- 5 files changed, 433 insertions(+), 129 deletions(-) diff --git a/includes/Abstracts/Abstract_Ability.php b/includes/Abstracts/Abstract_Ability.php index 2f41d456..a8bbe456 100644 --- a/includes/Abstracts/Abstract_Ability.php +++ b/includes/Abstracts/Abstract_Ability.php @@ -54,18 +54,6 @@ protected function category(): string { return 'ai-experiments'; } - /** - * Returns the REST API path of the ability. - * - * @since 0.1.0 - * - * @param string $feature_id The ID of the feature. - * @return string The path of the ability. - */ - public static function path( string $feature_id = '' ): string { - return 'wp-abilities/v1/abilities/ai/' . $feature_id . '/run'; - } - /** * Returns the input schema of the ability. * diff --git a/includes/Features/Title_Generation/Title_Generation.php b/includes/Features/Title_Generation/Title_Generation.php index bbac9379..a4cbdf67 100644 --- a/includes/Features/Title_Generation/Title_Generation.php +++ b/includes/Features/Title_Generation/Title_Generation.php @@ -91,7 +91,6 @@ public function enqueue_assets( string $hook_suffix ): void { 'TitleGenerationData', array( 'enabled' => $this->is_enabled(), - 'path' => Title_Generation_Ability::path( $this->get_id() ), ) ); } diff --git a/package-lock.json b/package-lock.json index 6caa4516..1f1e9279 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", - "@wordpress/api-fetch": "^7.34.0", "@wordpress/block-editor": "^15.7.0", "@wordpress/components": "^30.7.0", "@wordpress/compose": "^7.34.0", @@ -3592,6 +3591,126 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@keyv/serialize": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", @@ -5966,9 +6085,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true, "license": "MIT" }, @@ -10541,6 +10660,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -12082,17 +12217,34 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/default-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.3.0.tgz", + "integrity": "sha512-Qq68+VkJlc8tjnPV1i7HtbIn7ohmjZa88qUvHMIK0ZKUXMCuV45cT7cEXALPUmeXCe0q1DWQkQTemHVaLIFSrg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defaults": { @@ -14532,13 +14684,6 @@ "node": ">=0.10.0" } }, - "node_modules/fs-monkey": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", - "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", - "dev": true, - "license": "Unlicense" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -14834,6 +14979,23 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -15488,6 +15650,16 @@ "node": ">=10.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", @@ -16062,6 +16234,41 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -16095,6 +16302,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -18290,16 +18510,22 @@ } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", + "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", "dev": true, - "license": "Unlicense", + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "^1.0.4" + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/memize": { @@ -19433,17 +19659,21 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -21888,6 +22118,19 @@ "node": ">=12.0.0" } }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-con": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz", @@ -24606,6 +24849,23 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/third-party-web": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.27.0.tgz", @@ -24761,6 +25021,23 @@ "node": ">=12" } }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -25676,79 +25953,106 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -25759,15 +26063,17 @@ } } }, - "node_modules/webpack-dev-server/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/webpack-dev-server/node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/webpack-dev-server/node_modules/chokidar": { @@ -25795,26 +26101,17 @@ "fsevents": "~2.3.2" } }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-server/node_modules/glob-parent": { @@ -25830,17 +26127,23 @@ "node": ">= 6" } }, - "node_modules/webpack-dev-server/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-server/node_modules/readdirp": { @@ -25856,23 +26159,6 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -26266,6 +26552,38 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", diff --git a/package.json b/package.json index 0c4014af..90fa1882 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", - "@wordpress/api-fetch": "^7.34.0", "@wordpress/block-editor": "^15.7.0", "@wordpress/components": "^30.7.0", "@wordpress/compose": "^7.34.0", diff --git a/src/features/title-generation/components/TitleToolbar.tsx b/src/features/title-generation/components/TitleToolbar.tsx index 49283dda..8b32f71f 100644 --- a/src/features/title-generation/components/TitleToolbar.tsx +++ b/src/features/title-generation/components/TitleToolbar.tsx @@ -6,7 +6,7 @@ * External Dependencies. */ import React from 'react'; -import apiFetch from '@wordpress/api-fetch'; +import { executeAbility } from '@wordpress/abilities'; import { ToolbarGroup, ToolbarButton, @@ -40,10 +40,10 @@ async function generateTitle( postId: number, content: string ): Promise< string > { - return apiFetch( { - path: aiTitleGenerationData?.path, - method: 'POST', - data: { input: { post_id: postId, content, n: 1 } }, + return executeAbility( 'ai/title-generation', { + content, + post_id: postId, + candidates: 1, } ) .then( ( response ) => { if ( From 47813187e5cdcdbc84274e985e6bb71de769b16a Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Fri, 14 Nov 2025 13:15:17 -0700 Subject: [PATCH 19/39] Ensure the build directory ends up in our final release --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 90fa1882..182c68b4 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "description": "WordPress AI Experiments", "license": "GPL-2.0-or-later", "files": [ + "build", "includes", "vendor", "README.md", From b770588e7fc0082775e8c62a7e3e48a93f77d918 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Wed, 19 Nov 2025 10:14:48 -0700 Subject: [PATCH 20/39] Remove casing options for now --- .../components/TitleToolbar.tsx | 74 +------------- .../title-generation/utils/casing.ts | 97 ------------------- 2 files changed, 3 insertions(+), 168 deletions(-) delete mode 100644 src/experiments/title-generation/utils/casing.ts diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 12dcbf8a..9608efd7 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -7,24 +7,13 @@ */ import React from 'react'; import { executeAbility } from '@wordpress/abilities'; -import { - ToolbarGroup, - ToolbarButton, - DropdownMenu, - MenuGroup, - MenuItem, -} from '@wordpress/components'; +import { ToolbarGroup, ToolbarButton } from '@wordpress/components'; import { dispatch, useSelect, useDispatch } from '@wordpress/data'; import { PostTypeSupportCheck } from '@wordpress/editor'; import { useState } from '@wordpress/element'; -import { update, chevronDown } from '@wordpress/icons'; +import { update } from '@wordpress/icons'; import { __ } from '@wordpress/i18n'; -/** - * Internal Dependencies. - */ -import { toSentenceCase, toTitleCase } from '../utils/casing'; - const { aiTitleGenerationData } = window as any; /** @@ -64,7 +53,7 @@ async function generateTitle( /** * TitleToolbar component. * - * Provides Generate/Re-generate button and casing options dropdown. + * Provides Generate/Re-generate button. * * @return {JSX.Element} The toolbar component. */ @@ -116,28 +105,6 @@ export default function TitleToolbar(): JSX.Element | null { } }; - /** - * Handles casing option selection from dropdown. - * - * @param {string} casingType - The casing type to apply ('sentence' or 'title'). - */ - const handleCasingChange = ( casingType: string ) => { - if ( ! hasTitle ) { - return; - } - - let transformedTitle: string; - if ( casingType === 'sentence' ) { - transformedTitle = toSentenceCase( title ); - } else if ( casingType === 'title' ) { - transformedTitle = toTitleCase( title ); - } else { - return; - } - - editPost( { title: transformedTitle } ); - }; - // Ensure the experiment is enabled. if ( ! aiTitleGenerationData?.enabled ) { return null; @@ -155,41 +122,6 @@ export default function TitleToolbar(): JSX.Element | null { > { buttonLabel } - { hasTitle && ! isGenerating && ( - - { ( { onClose } ) => ( - <> - - { - handleCasingChange( 'sentence' ); - onClose(); - } } - > - { __( 'Sentence Case', 'ai' ) } - - { - handleCasingChange( 'title' ); - onClose(); - } } - > - { __( 'Title Case', 'ai' ) } - - - - ) } - - ) } ); diff --git a/src/experiments/title-generation/utils/casing.ts b/src/experiments/title-generation/utils/casing.ts deleted file mode 100644 index c8fcfbba..00000000 --- a/src/experiments/title-generation/utils/casing.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Casing transformation utilities for title generation. - */ - -/** - * Converts a title to sentence case (first letter capitalized, rest lowercase). - * - * @param {string} title - The title to transform. - * @return {string} The title in sentence case. - */ -export function toSentenceCase( title: string ): string { - if ( ! title || title.trim().length === 0 ) { - return title; - } - - const trimmed = title.trim(); - return trimmed.charAt( 0 ).toUpperCase() + trimmed.slice( 1 ).toLowerCase(); -} - -/** - * Converts a title to title case (major words capitalized). - * - * Articles, prepositions, and conjunctions are lowercase unless they're the first word. - * - * @param {string} title - The title to transform. - * @return {string} The title in title case. - */ -export function toTitleCase( title: string ): string { - if ( ! title || title.trim().length === 0 ) { - return title; - } - - // Words that should remain lowercase (unless they're the first word) - const lowercaseWords = [ - 'a', - 'an', - 'the', - 'and', - 'but', - 'or', - 'nor', - 'for', - 'so', - 'yet', - 'at', - 'by', - 'in', - 'of', - 'on', - 'to', - 'up', - 'as', - 'is', - 'if', - 'it', - 'from', - 'with', - 'into', - 'onto', - 'over', - 'under', - 'after', - 'before', - 'during', - 'through', - 'via', - ]; - - const words = title.trim().split( /\s+/ ); - const titleCaseWords = words.map( ( word, index ) => { - // Remove punctuation for comparison - const wordLower = word.toLowerCase().replace( /[^\w]/g, '' ); - - // Always capitalize first word, or if word is not in lowercase list - if ( index === 0 || ! lowercaseWords.includes( wordLower ) ) { - return capitalizeWord( word ); - } - - return word.toLowerCase(); - } ); - - return titleCaseWords.join( ' ' ); -} - -/** - * Capitalizes the first letter of a word while preserving the rest. - * - * @param {string} word - The word to capitalize. - * @return {string} The capitalized word. - */ -function capitalizeWord( word: string ): string { - if ( ! word || word.length === 0 ) { - return word; - } - - return word.charAt( 0 ).toUpperCase() + word.slice( 1 ).toLowerCase(); -} From c39bd1c8cb17b607b5f553c6d139b7527b0e2313 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Wed, 19 Nov 2025 11:16:42 -0700 Subject: [PATCH 21/39] Allow multiple titles to be generated and show those in a modal. Allow users to choose what title they want and edit it first if desired. Set the title as the post title and trigger autosave --- .../components/TitleToolbar.tsx | 171 +++++++++++++++--- 1 file changed, 145 insertions(+), 26 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 9608efd7..2abc5ff9 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -7,8 +7,16 @@ */ import React from 'react'; import { executeAbility } from '@wordpress/abilities'; -import { ToolbarGroup, ToolbarButton } from '@wordpress/components'; -import { dispatch, useSelect, useDispatch } from '@wordpress/data'; +import { + Button, + Flex, + FlexItem, + Modal, + TextareaControl, + ToolbarGroup, + ToolbarButton +} from '@wordpress/components'; +import { dispatch, select, useSelect, useDispatch } from '@wordpress/data'; import { PostTypeSupportCheck } from '@wordpress/editor'; import { useState } from '@wordpress/element'; import { update } from '@wordpress/icons'; @@ -17,22 +25,79 @@ import { __ } from '@wordpress/i18n'; const { aiTitleGenerationData } = window as any; /** - * Generates a title for the given post ID and content. + * Renders the generated title data with editable textareas. * - * TODO: Handle multiple titles. + * @param {Object} props - Component props. + * @param {string[]} props.data - The array of titles to render. + * @param {Function} props.onDataChange - Callback to update the data array. + * @param {Function} props.onSelect - Callback when a title is selected. + * @return {JSX.Element | null} The rendered data. + */ +function RenderData( { + data: dataToRender, + onDataChange, + onSelect +}: { + data: string[]; + onDataChange: ( newData: string[] ) => void; + onSelect: ( title: string, index: number ) => void; +} ): JSX.Element | null { + if ( ! dataToRender || dataToRender.length === 0 ) { + return null; + } + + return ( + + { dataToRender.map( ( title: string, i: number ) => { + return ( + + { + onDataChange( dataToRender.map( ( item, index ) => + index === i ? value : item + ) ); + } } + __nextHasNoMarginBottom + /> + + + ); + } ) } + + ); +} + +/** + * Generates titles for the given post ID and content. * * @param {number} postId - The ID of the post to generate a title for. * @param {string} content - The content of the post to generate a title for. - * @return {Promise} A promise that resolves to the generated title. + * @return {Promise} A promise that resolves to the generated titles. */ -async function generateTitle( +async function generateTitles( postId: number, content: string -): Promise< string > { +): Promise< string[] > { return executeAbility( 'ai/title-generation', { content, post_id: postId, - candidates: 1, } ) .then( ( response ) => { if ( @@ -40,13 +105,13 @@ async function generateTitle( typeof response === 'object' && 'titles' in response ) { - return ( response.titles as string[] )[ 0 ]; + return response.titles as string[]; } - return ''; + return []; } ) .catch( ( error ) => { - throw new Error( `Error generating title: ${ error.message }` ); + throw new Error( `Error generating titles: ${ error.message }` ); } ); } @@ -62,6 +127,10 @@ export default function TitleToolbar(): JSX.Element | null { return ( select( 'core/editor' ) as any ).getCurrentPostId() ?? 0; }, [] ); + const postType = useSelect( ( select ) => { + return ( select( 'core/editor' ) as any ).getCurrentPostType() || ''; + }, [] ); + const title = useSelect( ( select ) => { return ( ( select( 'core/editor' ) as any ).getEditedPostAttribute( @@ -77,6 +146,14 @@ export default function TitleToolbar(): JSX.Element | null { const { editPost } = useDispatch( 'core/editor' ); const [ isGenerating, setIsGenerating ] = useState( false ); + const [ isOpen, setOpen ] = useState( false ); + const [ data, setData ] = useState< string[] >( [] ); + + const openModal = () => setOpen( true ); + const closeModal = () => { + setOpen( false ); + setData( [] ); + }; const hasTitle = title.trim().length > 0; const buttonLabel = hasTitle @@ -93,36 +170,78 @@ export default function TitleToolbar(): JSX.Element | null { ); try { - const generatedTitle = await generateTitle( postId, content ); - editPost( { title: generatedTitle } ); - } catch ( error ) { + const generatedTitles = await generateTitles( postId, content ); + setData( generatedTitles ); + openModal(); + } catch ( error: any ) { ( dispatch( 'core/notices' ) as any ).createErrorNotice( error, { id: 'ai_title_generation_error', isDismissible: true, } ); + setData( [] ); } finally { setIsGenerating( false ); } }; + /** + * Handles selecting a title. + * + * @param {string} selectedTitle - The selected title. + * @param {number} index - The index of the selected title. + */ + const handleSelectTitle = async ( selectedTitle: string, index: number ) => { + const isDirty = select( 'core/editor' ).isEditedPostDirty(); + editPost( { + title: selectedTitle, + } ); + closeModal(); + if ( ! isDirty ) { + await ( dispatch( 'core' ) as any ).saveEditedEntityRecord( + 'postType', + postType, + postId + ); + } + }; + // Ensure the experiment is enabled. if ( ! aiTitleGenerationData?.enabled ) { return null; } return ( - - - + + + + { buttonLabel } + + + + { isOpen && ( + - { buttonLabel } - - - + { data && ( + + ) } + + ) } + ); } From 1f1154016f9b817b753ebd6c7cb3a77c83600cc9 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Wed, 19 Nov 2025 11:30:39 -0700 Subject: [PATCH 22/39] Fix all JS lint issues. Turn our JS linting workflow on --- .github/workflows/test.yml | 1 - src/experiments/example-experiment/index.tsx | 2 +- .../components/TitleToolbar.tsx | 193 ++++++++---------- .../components/TitleToolbarWrapper.tsx | 128 ++++++------ src/experiments/title-generation/index.tsx | 18 +- webpack.config.js | 2 +- 6 files changed, 160 insertions(+), 184 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ebf6d8a7..9037efde 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -260,7 +260,6 @@ jobs: permissions: contents: read timeout-minutes: 20 - if: false # Temporarily disabled steps: - name: Checkout repository diff --git a/src/experiments/example-experiment/index.tsx b/src/experiments/example-experiment/index.tsx index d098662a..7bdd0d96 100644 --- a/src/experiments/example-experiment/index.tsx +++ b/src/experiments/example-experiment/index.tsx @@ -6,7 +6,7 @@ import { __ } from '@wordpress/i18n'; import './index.scss'; const ExampleExperiment = () => { - return
{ __( 'Example Experiment', 'ai' ) }
; + return
{__('Example Experiment', 'ai')}
; }; export default ExampleExperiment; diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 2abc5ff9..5556c1e5 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -1,5 +1,5 @@ /** - * Title toolbar component for generating and transforming post titles. + * Title toolbar component for generating post titles. */ /** @@ -14,9 +14,9 @@ import { Modal, TextareaControl, ToolbarGroup, - ToolbarButton + ToolbarButton, } from '@wordpress/components'; -import { dispatch, select, useSelect, useDispatch } from '@wordpress/data'; +import { dispatch, select, useDispatch } from '@wordpress/data'; import { PostTypeSupportCheck } from '@wordpress/editor'; import { useState } from '@wordpress/element'; import { update } from '@wordpress/icons'; @@ -27,59 +27,54 @@ const { aiTitleGenerationData } = window as any; /** * Renders the generated title data with editable textareas. * - * @param {Object} props - Component props. - * @param {string[]} props.data - The array of titles to render. - * @param {Function} props.onDataChange - Callback to update the data array. - * @param {Function} props.onSelect - Callback when a title is selected. + * @param {Object} props Component props. + * @param {string[]} props.data The array of titles to render. + * @param {Function} props.onDataChange Callback to update the data array. + * @param {Function} props.onSelect Callback when a title is selected. * @return {JSX.Element | null} The rendered data. */ -function RenderData( { +function RenderData({ data: dataToRender, onDataChange, - onSelect + onSelect, }: { data: string[]; - onDataChange: ( newData: string[] ) => void; - onSelect: ( title: string, index: number ) => void; -} ): JSX.Element | null { - if ( ! dataToRender || dataToRender.length === 0 ) { + onDataChange: (newData: string[]) => void; + onSelect: (title: string, index: number) => void; +}): JSX.Element | null { + if (!dataToRender || dataToRender.length === 0) { return null; } return ( - - { dataToRender.map( ( title: string, i: number ) => { + + {dataToRender.map((title: string, i: number) => { return ( - + { - onDataChange( dataToRender.map( ( item, index ) => - index === i ? value : item - ) ); - } } + value={title} + onChange={(value: string) => { + onDataChange( + dataToRender.map((item, index) => + index === i ? value : item + ) + ); + }} __nextHasNoMarginBottom /> ); - } ) } + })} ); } @@ -87,19 +82,19 @@ function RenderData( { /** * Generates titles for the given post ID and content. * - * @param {number} postId - The ID of the post to generate a title for. - * @param {string} content - The content of the post to generate a title for. + * @param {number} postId The ID of the post to generate a title for. + * @param {string} content The content of the post to generate a title for. * @return {Promise} A promise that resolves to the generated titles. */ async function generateTitles( postId: number, content: string -): Promise< string[] > { - return executeAbility( 'ai/title-generation', { +): Promise { + return executeAbility('ai/title-generation', { content, post_id: postId, - } ) - .then( ( response ) => { + }) + .then((response) => { if ( response && typeof response === 'object' && @@ -109,10 +104,10 @@ async function generateTitles( } return []; - } ) - .catch( ( error ) => { - throw new Error( `Error generating titles: ${ error.message }` ); - } ); + }) + .catch((error) => { + throw new Error(`Error generating titles: ${error.message}`); + }); } /** @@ -123,81 +118,65 @@ async function generateTitles( * @return {JSX.Element} The toolbar component. */ export default function TitleToolbar(): JSX.Element | null { - const postId = useSelect( ( select ) => { - return ( select( 'core/editor' ) as any ).getCurrentPostId() ?? 0; - }, [] ); - - const postType = useSelect( ( select ) => { - return ( select( 'core/editor' ) as any ).getCurrentPostType() || ''; - }, [] ); - - const title = useSelect( ( select ) => { - return ( - ( select( 'core/editor' ) as any ).getEditedPostAttribute( - 'title' - ) || '' - ); - }, [] ); - - const content = useSelect( ( select ) => { - return ( select( 'core/editor' ) as any ).getEditedPostContent() || ''; - }, [] ); + const postId = select('core/editor').getCurrentPostId(); + const postType = select('core/editor').getCurrentPostType(); + const content = select('core/editor').getEditedPostContent(); + const title = select('core/editor').getEditedPostAttribute('title'); - const { editPost } = useDispatch( 'core/editor' ); + const { editPost } = useDispatch('core/editor'); - const [ isGenerating, setIsGenerating ] = useState( false ); - const [ isOpen, setOpen ] = useState( false ); - const [ data, setData ] = useState< string[] >( [] ); + const [isGenerating, setIsGenerating] = useState(false); + const [isOpen, setOpen] = useState(false); + const [data, setData] = useState([]); - const openModal = () => setOpen( true ); + const openModal = () => setOpen(true); const closeModal = () => { - setOpen( false ); - setData( [] ); + setOpen(false); + setData([]); }; const hasTitle = title.trim().length > 0; const buttonLabel = hasTitle - ? __( 'Re-generate', 'ai' ) - : __( 'Generate', 'ai' ); + ? __('Re-generate', 'ai') + : __('Generate', 'ai'); /** * Handles the generate/re-generate button click. */ const handleGenerate = async () => { - setIsGenerating( true ); - ( dispatch( 'core/notices' ) as any ).removeNotice( + setIsGenerating(true); + (dispatch('core/notices') as any).removeNotice( 'ai_title_generation_error' ); try { - const generatedTitles = await generateTitles( postId, content ); - setData( generatedTitles ); + const generatedTitles = await generateTitles(postId, content); + setData(generatedTitles); openModal(); - } catch ( error: any ) { - ( dispatch( 'core/notices' ) as any ).createErrorNotice( error, { + } catch (error: any) { + (dispatch('core/notices') as any).createErrorNotice(error, { id: 'ai_title_generation_error', isDismissible: true, - } ); - setData( [] ); + }); + setData([]); } finally { - setIsGenerating( false ); + setIsGenerating(false); } }; /** * Handles selecting a title. * - * @param {string} selectedTitle - The selected title. - * @param {number} index - The index of the selected title. + * @param {string} selectedTitle The selected title. */ - const handleSelectTitle = async ( selectedTitle: string, index: number ) => { - const isDirty = select( 'core/editor' ).isEditedPostDirty(); - editPost( { + const handleSelectTitle = async (selectedTitle: string) => { + const isDirty = select('core/editor').isEditedPostDirty(); + editPost({ title: selectedTitle, - } ); + }); closeModal(); - if ( ! isDirty ) { - await ( dispatch( 'core' ) as any ).saveEditedEntityRecord( + if (!isDirty) { + await (dispatch('core') as any).saveEditedEntityRecord( 'postType', postType, postId @@ -206,7 +185,7 @@ export default function TitleToolbar(): JSX.Element | null { }; // Ensure the experiment is enabled. - if ( ! aiTitleGenerationData?.enabled ) { + if (!aiTitleGenerationData?.enabled) { return null; } @@ -215,33 +194,33 @@ export default function TitleToolbar(): JSX.Element | null { - { buttonLabel } + {buttonLabel} - { isOpen && ( + {isOpen && ( - { data && ( + {data && ( - ) } + )} - ) } + )} ); } diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index 8f45d9c9..fb91e347 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -24,11 +24,11 @@ import TitleToolbar from './TitleToolbar'; * @return {JSX.Element} The wrapper component. */ function TitleToolbarWrapper(): JSX.Element { - useEffect( () => { + useEffect(() => { let isAttached = false; - let root: ReturnType< typeof createRoot > | null = null; - let removeTitleListeners: ( () => void ) | null = null; - let removeToolbarListeners: ( () => void ) | null = null; + let root: ReturnType | null = null; + let removeTitleListeners: (() => void) | null = null; + let removeToolbarListeners: (() => void) | null = null; let observer: MutationObserver | null = null; let titleInput: HTMLElement | null = null; let toolbarContainer: HTMLElement | null = null; @@ -41,7 +41,7 @@ function TitleToolbarWrapper(): JSX.Element { 'iframe[name="editor-canvas"], iframe.wp-block-editor-iframe__iframe' ) as HTMLIFrameElement | null; - if ( iframe && iframe.contentDocument ) { + if (iframe && iframe.contentDocument) { return iframe.contentDocument; } @@ -54,27 +54,27 @@ function TitleToolbarWrapper(): JSX.Element { callback: () => void, maxRetries: number, delay: number = 200 - ): ( () => void ) => { + ): (() => void) => { let retryCount = 0; let timeoutId: NodeJS.Timeout | null = null; const retry = () => { - if ( retryCount < maxRetries && ! isAttached ) { + if (retryCount < maxRetries && !isAttached) { retryCount++; - timeoutId = setTimeout( () => { + timeoutId = setTimeout(() => { timeoutId = null; - if ( checkFn() ) { + if (checkFn()) { callback(); } else { retry(); } - }, delay ); + }, delay); } }; // Store timeout ID for cleanup const start = () => { - if ( ! timeoutId ) { + if (!timeoutId) { retry(); } }; @@ -91,7 +91,7 @@ function TitleToolbarWrapper(): JSX.Element { return { focus: onFocus, blur: () => { - setTimeout( onBlur, blurDelay ); + setTimeout(onBlur, blurDelay); }, }; }; @@ -105,31 +105,31 @@ function TitleToolbarWrapper(): JSX.Element { const focusEvent = useFocusIn ? 'focusin' : 'focus'; const blurEvent = useFocusIn ? 'focusout' : 'blur'; - element.addEventListener( focusEvent, handlers.focus ); - element.addEventListener( blurEvent, handlers.blur ); + element.addEventListener(focusEvent, handlers.focus); + element.addEventListener(blurEvent, handlers.blur); return () => { - element.removeEventListener( focusEvent, handlers.focus ); - element.removeEventListener( blurEvent, handlers.blur ); + element.removeEventListener(focusEvent, handlers.focus); + element.removeEventListener(blurEvent, handlers.blur); }; }; // Check if focus is on title input or toolbar const isFocusedOnTitleOrToolbar = (): boolean => { const editorDoc = getEditorDocument(); - if ( ! editorDoc ) { + if (!editorDoc) { return false; } const activeElement = editorDoc.activeElement as HTMLElement | null; - if ( ! activeElement ) { + if (!activeElement) { return false; } // Check if focus is on title input if ( activeElement === titleInput || - titleInput?.contains( activeElement ) + titleInput?.contains(activeElement) ) { return true; } @@ -138,11 +138,11 @@ function TitleToolbarWrapper(): JSX.Element { // Also check if dropdown menu is open (button with is-opened class) if ( toolbarContainer && - ( activeElement === toolbarContainer || - toolbarContainer.contains( activeElement ) || + (activeElement === toolbarContainer || + toolbarContainer.contains(activeElement) || toolbarContainer.querySelector( '.components-dropdown-menu .is-opened' - ) ) + )) ) { return true; } @@ -152,20 +152,20 @@ function TitleToolbarWrapper(): JSX.Element { // Show/hide toolbar based on focus const showToolbar = () => { - if ( toolbarContainer ) { + if (toolbarContainer) { toolbarContainer.style.display = 'flex'; } }; const hideToolbar = () => { - if ( toolbarContainer ) { + if (toolbarContainer) { toolbarContainer.style.display = 'none'; } }; // Check focus state and show/hide toolbar accordingly const updateToolbarVisibility = () => { - if ( isFocusedOnTitleOrToolbar() ) { + if (isFocusedOnTitleOrToolbar()) { showToolbar(); } else { hideToolbar(); @@ -175,12 +175,12 @@ function TitleToolbarWrapper(): JSX.Element { // Wait for the editor to be ready const findAndAttachToolbar = () => { // Don't try if already attached - if ( isAttached ) { + if (isAttached) { return; } const editorDoc = getEditorDocument(); - if ( ! editorDoc ) { + if (!editorDoc) { // Editor iframe not found yet, retry const retryEditor = createRetry( () => getEditorDocument() !== null, @@ -192,35 +192,33 @@ function TitleToolbarWrapper(): JSX.Element { } // Check if toolbar wrapper already exists in the editor document - if ( editorDoc.querySelector( '.ai-title-toolbar-wrapper' ) ) { + if (editorDoc.querySelector('.ai-title-toolbar-wrapper')) { isAttached = true; return; } // Find the title field container in normal editing mode - const selectors = [ '.editor-post-title__input' ]; + const selectors = ['.editor-post-title__input']; let foundTitleInput: HTMLElement | null = null; - for ( const selector of selectors ) { + for (const selector of selectors) { foundTitleInput = editorDoc.querySelector( selector ) as HTMLElement; - if ( foundTitleInput ) { + if (foundTitleInput) { break; } } - if ( ! foundTitleInput ) { + if (!foundTitleInput) { // Title field not found yet, retry const retryTitle = createRetry( () => { const doc = getEditorDocument(); - if ( ! doc ) { + if (!doc) { return false; } - return !! doc.querySelector( - '.editor-post-title__input' - ); + return !!doc.querySelector('.editor-post-title__input'); }, findAndAttachToolbar, 10 @@ -232,7 +230,7 @@ function TitleToolbarWrapper(): JSX.Element { titleInput = foundTitleInput; // Check if we've already attached the toolbar to this element - if ( titleInput.closest( '.ai-title-toolbar-wrapper' ) ) { + if (titleInput.closest('.ai-title-toolbar-wrapper')) { isAttached = true; return; } @@ -240,7 +238,7 @@ function TitleToolbarWrapper(): JSX.Element { // Find the container that wraps the title input const titleContainer = titleInput.parentElement; - if ( ! titleContainer ) { + if (!titleContainer) { return; } @@ -248,28 +246,28 @@ function TitleToolbarWrapper(): JSX.Element { const nextSibling = titleInput.nextSibling; // Create a wrapper container that will hold both the toolbar and the title input - wrapperContainer = editorDoc.createElement( 'div' ); + wrapperContainer = editorDoc.createElement('div'); wrapperContainer.className = 'ai-title-toolbar-wrapper'; wrapperContainer.style.cssText = 'position: relative;'; // Create a container for our toolbar - toolbarContainer = editorDoc.createElement( 'div' ); + toolbarContainer = editorDoc.createElement('div'); toolbarContainer.className = 'ai-title-toolbar-container'; toolbarContainer.style.cssText = 'display: none; position: absolute; z-index: 1000; top: -60px;'; // Append the toolbar container to the wrapper - wrapperContainer.appendChild( toolbarContainer ); + wrapperContainer.appendChild(toolbarContainer); // Move the title input into the wrapper container - wrapperContainer.appendChild( titleInput ); + wrapperContainer.appendChild(titleInput); // Insert the wrapper container where the title input was - titleContainer.insertBefore( wrapperContainer, nextSibling ); + titleContainer.insertBefore(wrapperContainer, nextSibling); // Render the toolbar into the container - root = createRoot( toolbarContainer ); - root.render( ); + root = createRoot(toolbarContainer); + root.render(); // Create and attach focus/blur handlers for title input const titleHandlers = createFocusBlurHandlers( @@ -293,7 +291,7 @@ function TitleToolbarWrapper(): JSX.Element { ); // Check initial focus state - if ( editorDoc.activeElement === titleInput ) { + if (editorDoc.activeElement === titleInput) { showToolbar(); } @@ -301,62 +299,62 @@ function TitleToolbarWrapper(): JSX.Element { }; // Start looking for the title field after a short delay to ensure iframe is ready - const initialTimeout = setTimeout( () => { + const initialTimeout = setTimeout(() => { findAndAttachToolbar(); - }, 100 ); + }, 100); // Also listen for DOM changes in the editor iframe // But only check if we haven't attached yet const setupObserver = () => { const editorDoc = getEditorDocument(); - if ( editorDoc && ! observer ) { - observer = new MutationObserver( () => { + if (editorDoc && !observer) { + observer = new MutationObserver(() => { if ( - ! isAttached && - ! editorDoc.querySelector( '.ai-title-toolbar-wrapper' ) + !isAttached && + !editorDoc.querySelector('.ai-title-toolbar-wrapper') ) { findAndAttachToolbar(); } - } ); + }); - observer.observe( editorDoc.body, { + observer.observe(editorDoc.body, { childList: true, subtree: true, - } ); + }); } }; // Try to set up observer after a delay to ensure iframe is loaded - const observerTimeout = setTimeout( setupObserver, 500 ); + const observerTimeout = setTimeout(setupObserver, 500); // Cleanup function return () => { - if ( observer ) { + if (observer) { observer.disconnect(); } - clearTimeout( initialTimeout ); - clearTimeout( observerTimeout ); + clearTimeout(initialTimeout); + clearTimeout(observerTimeout); // Remove event listeners - if ( removeTitleListeners ) { + if (removeTitleListeners) { removeTitleListeners(); } - if ( removeToolbarListeners ) { + if (removeToolbarListeners) { removeToolbarListeners(); } // Clean up toolbar and wrapper - if ( root ) { + if (root) { root.unmount(); } - if ( wrapperContainer ) { + if (wrapperContainer) { wrapperContainer.remove(); - } else if ( toolbarContainer ) { + } else if (toolbarContainer) { // Fallback: if wrapper wasn't created, just remove toolbar toolbarContainer.remove(); } }; - }, [] ); + }, []); // This component doesn't render anything itself // It uses useEffect to attach to the DOM diff --git a/src/experiments/title-generation/index.tsx b/src/experiments/title-generation/index.tsx index c859d60b..a41c951c 100644 --- a/src/experiments/title-generation/index.tsx +++ b/src/experiments/title-generation/index.tsx @@ -19,28 +19,28 @@ import { TitleToolbarWrapper } from './components/TitleToolbarWrapper'; // For template preview mode (when title is a block) // Use filter to add toolbar to post-title block -const withTitleToolbar = createHigherOrderComponent( ( BlockEdit ) => { - return ( props: any ) => { +const withTitleToolbar = createHigherOrderComponent((BlockEdit) => { + return (props: any) => { // Check if this is the post-title block - if ( props.name !== 'core/post-title' ) { - return ; + if (props.name !== 'core/post-title') { + return ; } return ( <> - + ); }; -}, 'withTitleToolbar' ); +}, 'withTitleToolbar'); -addFilter( 'editor.BlockEdit', 'ai/title-generation', withTitleToolbar ); +addFilter('editor.BlockEdit', 'ai/title-generation', withTitleToolbar); // For normal editing mode (when title is not a block) // Register a plugin that uses DOM manipulation to attach toolbar -registerPlugin( 'ai-title-generation-normal-mode', { +registerPlugin('ai-title-generation-normal-mode', { render: TitleToolbarWrapper, -} ); +}); diff --git a/webpack.config.js b/webpack.config.js index 75e8e6f9..d282a98f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,4 @@ -const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); +const defaultConfig = require('@wordpress/scripts/config/webpack.config'); const webpackConfig = { ...defaultConfig, From 0390cd4f81a42c767cbadd583691180daff2e9fe Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 12:48:35 -0700 Subject: [PATCH 23/39] Remove autosave of title after selection --- .../title-generation/components/TitleToolbar.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 5556c1e5..f304572c 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -170,18 +170,10 @@ export default function TitleToolbar(): JSX.Element | null { * @param {string} selectedTitle The selected title. */ const handleSelectTitle = async (selectedTitle: string) => { - const isDirty = select('core/editor').isEditedPostDirty(); editPost({ title: selectedTitle, }); closeModal(); - if (!isDirty) { - await (dispatch('core') as any).saveEditedEntityRecord( - 'postType', - postType, - postId - ); - } }; // Ensure the experiment is enabled. From dea4acbfed3baed20f4bfea27a8809d510e247e0 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 12:55:05 -0700 Subject: [PATCH 24/39] Rename variables to be more specific --- .../components/TitleToolbar.tsx | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index f304572c..95fae815 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -27,28 +27,28 @@ const { aiTitleGenerationData } = window as any; /** * Renders the generated title data with editable textareas. * - * @param {Object} props Component props. - * @param {string[]} props.data The array of titles to render. - * @param {Function} props.onDataChange Callback to update the data array. - * @param {Function} props.onSelect Callback when a title is selected. - * @return {JSX.Element | null} The rendered data. + * @param {Object} props Component props. + * @param {string[]} props.titles The array of titles to render. + * @param {Function} props.onTitleChange Callback to update the title array. + * @param {Function} props.onSelect Callback when a title is selected. + * @return {JSX.Element | null} The rendered titles. */ -function RenderData({ - data: dataToRender, - onDataChange, +function TitleOptionsList({ + titles: titlesToRender, + onTitleChange, onSelect, }: { - data: string[]; - onDataChange: (newData: string[]) => void; + titles: string[]; + onTitleChange: (newTitle: string[]) => void; onSelect: (title: string, index: number) => void; }): JSX.Element | null { - if (!dataToRender || dataToRender.length === 0) { + if (!titlesToRender || titlesToRender.length === 0) { return null; } return ( - {dataToRender.map((title: string, i: number) => { + {titlesToRender.map((title: string, i: number) => { return ( { - onDataChange( - dataToRender.map((item, index) => + onTitleChange( + titlesToRender.map((item, index) => index === i ? value : item ) ); @@ -127,12 +127,12 @@ export default function TitleToolbar(): JSX.Element | null { const [isGenerating, setIsGenerating] = useState(false); const [isOpen, setOpen] = useState(false); - const [data, setData] = useState([]); + const [titles, setTitles] = useState([]); const openModal = () => setOpen(true); const closeModal = () => { setOpen(false); - setData([]); + setTitles([]); }; const hasTitle = title.trim().length > 0; @@ -151,14 +151,14 @@ export default function TitleToolbar(): JSX.Element | null { try { const generatedTitles = await generateTitles(postId, content); - setData(generatedTitles); + setTitles(generatedTitles); openModal(); } catch (error: any) { (dispatch('core/notices') as any).createErrorNotice(error, { id: 'ai_title_generation_error', isDismissible: true, }); - setData([]); + setTitles([]); } finally { setIsGenerating(false); } @@ -204,10 +204,10 @@ export default function TitleToolbar(): JSX.Element | null { size="medium" className="ai-title-generation-modal" > - {data && ( - )} From 63c9934d5f6b99be6960c34c66352fb30ac0902b Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 12:58:58 -0700 Subject: [PATCH 25/39] Create a new component for a single title option --- .../components/TitleToolbar.tsx | 84 +++++++++++++------ 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 95fae815..daa0bb65 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -24,6 +24,48 @@ import { __ } from '@wordpress/i18n'; const { aiTitleGenerationData } = window as any; +/** + * Renders a single title option. + * + * @param {Object} props Component props. + * @param {string} props.title The title value to display. + * @param {number} props.index The index of this title in the array. + * @param {Function} props.onChange Callback to update this title's value. + * @param {Function} props.onSelect Callback when this title is selected. + * @return {JSX.Element} The rendered title option. + */ +function TitleOption({ + title, + index, + onChange, + onSelect, +}: { + title: string; + index: number; + onChange: (value: string) => void; + onSelect: (title: string, index: number) => void; +}): JSX.Element { + return ( + + + + + ); +} + /** * Renders the generated title data with editable textareas. * @@ -48,33 +90,21 @@ function TitleOptionsList({ return ( - {titlesToRender.map((title: string, i: number) => { - return ( - - { - onTitleChange( - titlesToRender.map((item, index) => - index === i ? value : item - ) - ); - }} - __nextHasNoMarginBottom - /> - - - ); - })} + {titlesToRender.map((title: string, i: number) => ( + { + onTitleChange( + titlesToRender.map((item, index) => + index === i ? value : item + ) + ); + }} + onSelect={onSelect} + /> + ))} ); } From 88c8fa2dca1fc00e7983e776fe010931e84a9ba8 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 13:01:14 -0700 Subject: [PATCH 26/39] Add proper type --- src/experiments/title-generation/components/TitleToolbar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index daa0bb65..d92444ec 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -155,8 +155,8 @@ export default function TitleToolbar(): JSX.Element | null { const { editPost } = useDispatch('core/editor'); - const [isGenerating, setIsGenerating] = useState(false); - const [isOpen, setOpen] = useState(false); + const [isGenerating, setIsGenerating] = useState(false); + const [isOpen, setOpen] = useState(false); const [titles, setTitles] = useState([]); const openModal = () => setOpen(true); From cf8cdd69d72c836d8cc6781d161a81f6064ada6e Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 13:04:23 -0700 Subject: [PATCH 27/39] Extract the createRetry function out of the component --- .../components/TitleToolbarWrapper.tsx | 77 +++++++++++-------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index fb91e347..7007803e 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -16,6 +16,49 @@ import { createRoot, useEffect } from '@wordpress/element'; */ import TitleToolbar from './TitleToolbar'; +/** + * Creates a reusable retry function that will attempt to execute a callback + * when a condition is met, retrying up to a maximum number of times. + * + * @param {Function} checkFn Function that returns true when condition is met. + * @param {Function} callback Function to execute when condition is met. + * @param {number} maxRetries Maximum number of retry attempts. + * @param {number} delay Delay in milliseconds between retries. + * @return {Function} A function that starts the retry process. + */ +function createRetry( + checkFn: () => boolean, + callback: () => void, + maxRetries: number, + delay: number = 200 +): (() => void) { + let retryCount = 0; + let timeoutId: NodeJS.Timeout | null = null; + + const retry = () => { + if (retryCount < maxRetries) { + retryCount++; + timeoutId = setTimeout(() => { + timeoutId = null; + if (checkFn()) { + callback(); + } else { + retry(); + } + }, delay); + } + }; + + // Store timeout ID for cleanup + const start = () => { + if (!timeoutId) { + retry(); + } + }; + + return start; +} + /** * TitleToolbarWrapper component. * @@ -48,40 +91,6 @@ function TitleToolbarWrapper(): JSX.Element { return null; }; - // Create a reusable retry function - const createRetry = ( - checkFn: () => boolean, - callback: () => void, - maxRetries: number, - delay: number = 200 - ): (() => void) => { - let retryCount = 0; - let timeoutId: NodeJS.Timeout | null = null; - - const retry = () => { - if (retryCount < maxRetries && !isAttached) { - retryCount++; - timeoutId = setTimeout(() => { - timeoutId = null; - if (checkFn()) { - callback(); - } else { - retry(); - } - }, delay); - } - }; - - // Store timeout ID for cleanup - const start = () => { - if (!timeoutId) { - retry(); - } - }; - - return start; - }; - // Create reusable focus/blur handlers const createFocusBlurHandlers = ( onFocus: () => void, From 36fecbac1aa43b1b9bebdd6dce0efc93383c05af Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 13:05:34 -0700 Subject: [PATCH 28/39] Extract the createFocusBlurHandlers function out of the component --- .../components/TitleToolbarWrapper.tsx | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index 7007803e..8a8df525 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -59,6 +59,27 @@ function createRetry( return start; } +/** + * Creates reusable focus/blur event handlers with optional delay on blur. + * + * @param {Function} onFocus Function to call on focus event. + * @param {Function} onBlur Function to call on blur event. + * @param {number} blurDelay Delay in milliseconds before calling onBlur. + * @return {Object} Object with focus and blur handler functions. + */ +function createFocusBlurHandlers( + onFocus: () => void, + onBlur: () => void, + blurDelay: number = 10 +): { focus: () => void; blur: () => void } { + return { + focus: onFocus, + blur: () => { + setTimeout(onBlur, blurDelay); + }, + }; +} + /** * TitleToolbarWrapper component. * @@ -91,20 +112,6 @@ function TitleToolbarWrapper(): JSX.Element { return null; }; - // Create reusable focus/blur handlers - const createFocusBlurHandlers = ( - onFocus: () => void, - onBlur: () => void, - blurDelay: number = 10 - ) => { - return { - focus: onFocus, - blur: () => { - setTimeout(onBlur, blurDelay); - }, - }; - }; - // Setup event listeners on an element const setupEventListeners = ( element: HTMLElement, From 378116f187322a3262df4da0ed4ef72b53d1abbe Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 13:07:00 -0700 Subject: [PATCH 29/39] Extract the setupEventListeners function out of the component --- .../components/TitleToolbarWrapper.tsx | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index 8a8df525..1442c8d6 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -80,6 +80,31 @@ function createFocusBlurHandlers( }; } +/** + * Sets up focus and blur event listeners on an element and returns a cleanup function. + * + * @param {HTMLElement} element The element to attach listeners to. + * @param {Object} handlers Object containing focus and blur handler functions. + * @param {boolean} useFocusIn Whether to use focusin/focusout instead of focus/blur. + * @return {Function} Cleanup function to remove the event listeners. + */ +function setupEventListeners( + element: HTMLElement, + handlers: { focus: () => void; blur: () => void }, + useFocusIn: boolean = false +): () => void { + const focusEvent = useFocusIn ? 'focusin' : 'focus'; + const blurEvent = useFocusIn ? 'focusout' : 'blur'; + + element.addEventListener(focusEvent, handlers.focus); + element.addEventListener(blurEvent, handlers.blur); + + return () => { + element.removeEventListener(focusEvent, handlers.focus); + element.removeEventListener(blurEvent, handlers.blur); + }; +} + /** * TitleToolbarWrapper component. * @@ -112,24 +137,6 @@ function TitleToolbarWrapper(): JSX.Element { return null; }; - // Setup event listeners on an element - const setupEventListeners = ( - element: HTMLElement, - handlers: { focus: () => void; blur: () => void }, - useFocusIn: boolean = false - ) => { - const focusEvent = useFocusIn ? 'focusin' : 'focus'; - const blurEvent = useFocusIn ? 'focusout' : 'blur'; - - element.addEventListener(focusEvent, handlers.focus); - element.addEventListener(blurEvent, handlers.blur); - - return () => { - element.removeEventListener(focusEvent, handlers.focus); - element.removeEventListener(blurEvent, handlers.blur); - }; - }; - // Check if focus is on title input or toolbar const isFocusedOnTitleOrToolbar = (): boolean => { const editorDoc = getEditorDocument(); From ef1b11254543990697bdfc7b3cfa0a97e3a6a2a0 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 13:09:39 -0700 Subject: [PATCH 30/39] Disconnect the observer when no longer needed --- .../title-generation/components/TitleToolbarWrapper.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index 1442c8d6..ec520cc9 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -331,12 +331,15 @@ function TitleToolbarWrapper(): JSX.Element { const setupObserver = () => { const editorDoc = getEditorDocument(); if (editorDoc && !observer) { - observer = new MutationObserver(() => { + observer = new MutationObserver((mutations, obs) => { if ( !isAttached && !editorDoc.querySelector('.ai-title-toolbar-wrapper') ) { findAndAttachToolbar(); + } else if (isAttached) { + // Disconnect observer once toolbar is attached + obs.disconnect(); } }); From 587233cf953a58f5ed65e2aa452f665b78361279 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 13:16:18 -0700 Subject: [PATCH 31/39] Fix lint errors --- .../title-generation/components/TitleToolbar.tsx | 1 - .../components/TitleToolbarWrapper.tsx | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index d92444ec..08abf5cd 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -149,7 +149,6 @@ async function generateTitles( */ export default function TitleToolbar(): JSX.Element | null { const postId = select('core/editor').getCurrentPostId(); - const postType = select('core/editor').getCurrentPostType(); const content = select('core/editor').getEditedPostContent(); const title = select('core/editor').getEditedPostAttribute('title'); diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index ec520cc9..4ef952cd 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -31,7 +31,7 @@ function createRetry( callback: () => void, maxRetries: number, delay: number = 200 -): (() => void) { +): () => void { let retryCount = 0; let timeoutId: NodeJS.Timeout | null = null; @@ -83,9 +83,11 @@ function createFocusBlurHandlers( /** * Sets up focus and blur event listeners on an element and returns a cleanup function. * - * @param {HTMLElement} element The element to attach listeners to. - * @param {Object} handlers Object containing focus and blur handler functions. - * @param {boolean} useFocusIn Whether to use focusin/focusout instead of focus/blur. + * @param {HTMLElement} element The element to attach listeners to. + * @param {Object} handlers Object containing focus and blur handler functions. + * @param {Function} handlers.focus Callback to handle focus event. + * @param {Function} handlers.blur Callback to handle blur event. + * @param {boolean} useFocusIn Whether to use focusin/focusout instead of focus/blur. * @return {Function} Cleanup function to remove the event listeners. */ function setupEventListeners( From f755562af83ba596f9675c4bafef8ab8f8b85c1d Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 20:43:24 -0700 Subject: [PATCH 32/39] Add new eslint config file. Change structure of prettier config file --- .eslintrc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ .prettierrc | 1 + .prettierrc.cjs | 30 ------------------------------ 3 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 .eslintrc create mode 100644 .prettierrc delete mode 100644 .prettierrc.cjs diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..197334cc --- /dev/null +++ b/.eslintrc @@ -0,0 +1,47 @@ +{ + "extends": [ "plugin:@wordpress/eslint-plugin/recommended" ], + "rules": { + // React best practices + "react/jsx-boolean-value": "error", + "react/jsx-curly-brace-presence": [ + "error", + { "props": "never", "children": "never" } + ], + + // WordPress-specific rules, lifted from gutenberg + "@wordpress/dependency-group": "error", + "@wordpress/data-no-store-string-literals": "error", + "@wordpress/wp-global-usage": "error", + "@wordpress/react-no-unsafe-timeout": "error", + "@wordpress/i18n-hyphenated-range": "error", + "@wordpress/i18n-no-flanking-whitespace": "error", + "@wordpress/i18n-text-domain": [ + "error", + { + "allowedTextDomain": "ai" + } + ], + "@wordpress/no-unsafe-wp-apis": "off", + "import/default": "error", + "import/named": "error" + }, + "overrides": [ + { + "files": [ "**/*.ts?(x)" ], + "rules": { + "@typescript-eslint/consistent-type-imports": [ + "error", + { + "prefer": "type-imports", + "disallowTypeAnnotations": false + } + ], + "@typescript-eslint/no-shadow": "error", + "no-shadow": "off", + "jsdoc/require-param": "off", + "jsdoc/require-param-type": "off", + "jsdoc/require-returns-type": "off" + } + } + ] +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..23537657 --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +"@wordpress/prettier-config" diff --git a/.prettierrc.cjs b/.prettierrc.cjs deleted file mode 100644 index 966ae862..00000000 --- a/.prettierrc.cjs +++ /dev/null @@ -1,30 +0,0 @@ -const wpConfig = require( '@wordpress/prettier-config' ); - -/** - * @see https://prettier.io/docs/configuration - * @type {import("prettier").Config} - */ -const config = { - ...wpConfig, - overrides: [ - ...wpConfig.overrides, - // Only override where WordPress config conflicts with .editorconfig - { - files: '*.md', - options: { - tabWidth: 2, - useTabs: false, - }, - }, - { - files: [ '*.yml', '*.yaml' ], - options: { - tabWidth: 2, - useTabs: false, - singleQuote: true, - }, - }, - ], -}; - -module.exports = config; From eb8f5233c0c0e0c7d58183bf35e9fa058c0ebc5c Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 20:43:45 -0700 Subject: [PATCH 33/39] Move packages to dependencies --- package-lock.json | 1708 ++++++++++++++++++++++++++++++--------------- package.json | 28 +- 2 files changed, 1177 insertions(+), 559 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0622c602..448f96a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,27 +9,29 @@ "version": "0.1.0", "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/icons": "^11.1.0" - }, - "devDependencies": { - "@types/react": "^18.2.47", - "@types/react-dom": "^18.2.18", - "@types/wordpress__blocks": "^12.5.18", "@wordpress/block-editor": "^15.7.0", "@wordpress/components": "^30.7.0", "@wordpress/compose": "^7.34.0", "@wordpress/data": "^10.34.0", "@wordpress/editor": "^14.34.0", "@wordpress/element": "^6.34.0", - "@wordpress/env": "^10.34.0", - "@wordpress/eslint-plugin": "^22.20.0", - "@wordpress/hooks": "^4.34.0", + "@wordpress/hooks": "^4.35.0", "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", "@wordpress/plugins": "^7.34.0", - "@wordpress/prettier-config": "^4.34.0", - "@wordpress/scripts": "^30.27.0", "react": "^18.3.1", - "typescript": "^5.4.5", + "typescript": "^5.9.3" + }, + "devDependencies": { + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@types/wordpress__blocks": "^12.5.18", + "@wordpress/env": "^10.34.0", + "@wordpress/eslint-plugin": "^22.21.0", + "@wordpress/prettier-config": "^4.34.0", + "@wordpress/scripts": "^31.0.0", + "eslint-import-resolver-typescript": "^4.4.4", + "prettier": "^3.6.2", "webpack-remove-empty-scripts": "^1.1.1" }, "engines": { @@ -53,14 +55,12 @@ "version": "0.4.16", "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.16.tgz", "integrity": "sha512-nPJ0Be8d5ZvRApYGqdLMuYUjP7ktkPmTPOXyZFw+0Illk8LKgF3Q74ctVGuoQurJNDsANXcewzlyXK4vyIAGTA==", - "dev": true, "license": "MIT" }, "node_modules/@ariakit/react": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.19.tgz", "integrity": "sha512-n6q8leSQWXMk4vhcZlpnj8cIlAY0n+1bvVTwHvaVfmec4LjW49MFKkJRZd1AiV+SE73nkxPwSL3IbaS4p1aRxQ==", - "dev": true, "license": "MIT", "dependencies": { "@ariakit/react-core": "0.4.19" @@ -78,7 +78,6 @@ "version": "0.4.19", "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.19.tgz", "integrity": "sha512-Aj+fu4pMyPXtlBghI+E7KSWItqJkbAqEhut3DlsFAjK9fQdHE+e1tQJG1PtnoEdD9BExkJWQ6R4M5a9HkEhqPA==", - "dev": true, "license": "MIT", "dependencies": { "@ariakit/core": "0.4.16", @@ -92,7 +91,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.27.1", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -159,7 +157,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -251,7 +248,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -271,7 +267,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -362,7 +357,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -370,7 +364,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -411,7 +404,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -1360,6 +1352,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1453,6 +1447,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", + "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", "dev": true, "license": "MIT", "dependencies": { @@ -1786,7 +1782,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1794,7 +1789,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1807,7 +1801,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -1824,7 +1817,6 @@ }, "node_modules/@babel/types": { "version": "7.28.5", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1839,41 +1831,40 @@ "dev": true, "license": "MIT" }, - "node_modules/@cacheable/memoize": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@cacheable/utils": "^2.0.3" - } - }, "node_modules/@cacheable/memory": { - "version": "2.0.4", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.5.tgz", + "integrity": "sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.2.0", + "@cacheable/utils": "^2.3.0", "@keyv/bigmap": "^1.1.0", "hookified": "^1.12.2", - "keyv": "^5.5.3" + "keyv": "^5.5.4" } }, "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { - "version": "1.1.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", + "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.12.2" + "hashery": "^1.2.0", + "hookified": "^1.13.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "keyv": "^5.5.3" + "keyv": "^5.5.4" } }, "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.5.3", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1881,15 +1872,20 @@ } }, "node_modules/@cacheable/utils": { - "version": "2.2.0", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==", "dev": true, "license": "MIT", "dependencies": { - "keyv": "^5.5.3" + "hashery": "^1.2.0", + "keyv": "^5.5.4" } }, "node_modules/@cacheable/utils/node_modules/keyv": { - "version": "5.5.3", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1898,6 +1894,8 @@ }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "funding": [ { @@ -1919,6 +1917,8 @@ }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, "funding": [ { @@ -1937,6 +1937,8 @@ }, "node_modules/@csstools/media-query-list-parser": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", "dev": true, "funding": [ { @@ -1961,7 +1963,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", - "dev": true, "license": "MIT" }, "node_modules/@discoveryjs/json-ext": { @@ -1974,6 +1975,8 @@ }, "node_modules/@dual-bundle/import-meta-resolve": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", "dev": true, "license": "MIT", "funding": { @@ -1981,11 +1984,44 @@ "url": "https://github.com/sponsors/JounQin" } }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", @@ -2005,14 +2041,12 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, "license": "MIT" }, "node_modules/@emotion/babel-plugin/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -2022,7 +2056,6 @@ "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "dev": true, "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", @@ -2036,7 +2069,6 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.5.tgz", "integrity": "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==", - "dev": true, "license": "MIT", "dependencies": { "@emotion/babel-plugin": "^11.13.5", @@ -2050,14 +2082,12 @@ "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "dev": true, "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", - "dev": true, "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -2067,14 +2097,12 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "dev": true, "license": "MIT" }, "node_modules/@emotion/react": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -2099,7 +2127,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "dev": true, "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", @@ -2113,14 +2140,12 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "dev": true, "license": "MIT" }, "node_modules/@emotion/styled": { "version": "11.14.1", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -2144,14 +2169,12 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "dev": true, "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "dev": true, "license": "MIT", "peerDependencies": { "react": ">=16.8.0" @@ -2161,14 +2184,12 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "dev": true, "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "dev": true, "license": "MIT" }, "node_modules/@es-joy/jsdoccomment": { @@ -2290,7 +2311,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "dev": true, "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.10" @@ -2300,7 +2320,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "dev": true, "license": "MIT", "dependencies": { "@floating-ui/core": "^1.7.3", @@ -2311,7 +2330,6 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dev": true, "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.1" @@ -2325,11 +2343,12 @@ "version": "0.2.10", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "dev": true, "license": "MIT" }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", + "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==", "dev": true, "license": "MIT", "dependencies": { @@ -2341,6 +2360,8 @@ }, "node_modules/@formatjs/fast-memoize": { "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", + "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2349,6 +2370,8 @@ }, "node_modules/@formatjs/icu-messageformat-parser": { "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz", + "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2359,6 +2382,8 @@ }, "node_modules/@formatjs/icu-skeleton-parser": { "version": "1.8.16", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz", + "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2368,6 +2393,8 @@ }, "node_modules/@formatjs/intl-localematcher": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", + "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", "dev": true, "license": "MIT", "dependencies": { @@ -3191,7 +3218,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -3209,7 +3235,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -3226,12 +3251,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3348,6 +3371,8 @@ }, "node_modules/@keyv/serialize": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, "license": "MIT" }, @@ -3369,6 +3394,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "dev": true, @@ -3411,6 +3449,8 @@ }, "node_modules/@opentelemetry/api": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3419,6 +3459,8 @@ }, "node_modules/@opentelemetry/api-logs": { "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3430,6 +3472,8 @@ }, "node_modules/@opentelemetry/context-async-hooks": { "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3441,6 +3485,8 @@ }, "node_modules/@opentelemetry/core": { "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3455,6 +3501,8 @@ }, "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3463,6 +3511,8 @@ }, "node_modules/@opentelemetry/instrumentation": { "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3482,6 +3532,8 @@ }, "node_modules/@opentelemetry/instrumentation-amqplib": { "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", + "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3498,6 +3550,8 @@ }, "node_modules/@opentelemetry/instrumentation-connect": { "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.1.tgz", + "integrity": "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3515,6 +3569,8 @@ }, "node_modules/@opentelemetry/instrumentation-dataloader": { "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.1.tgz", + "integrity": "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3529,6 +3585,8 @@ }, "node_modules/@opentelemetry/instrumentation-express": { "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.1.tgz", + "integrity": "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3545,6 +3603,8 @@ }, "node_modules/@opentelemetry/instrumentation-fs": { "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.1.tgz", + "integrity": "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3560,6 +3620,8 @@ }, "node_modules/@opentelemetry/instrumentation-generic-pool": { "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.1.tgz", + "integrity": "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3574,6 +3636,8 @@ }, "node_modules/@opentelemetry/instrumentation-graphql": { "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.1.tgz", + "integrity": "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3588,6 +3652,8 @@ }, "node_modules/@opentelemetry/instrumentation-hapi": { "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.2.tgz", + "integrity": "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3604,6 +3670,8 @@ }, "node_modules/@opentelemetry/instrumentation-http": { "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.2.tgz", + "integrity": "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3622,6 +3690,8 @@ }, "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3630,6 +3700,8 @@ }, "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3641,6 +3713,8 @@ }, "node_modules/@opentelemetry/instrumentation-ioredis": { "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.1.tgz", + "integrity": "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3657,6 +3731,8 @@ }, "node_modules/@opentelemetry/instrumentation-kafkajs": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.1.tgz", + "integrity": "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3672,6 +3748,8 @@ }, "node_modules/@opentelemetry/instrumentation-knex": { "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.1.tgz", + "integrity": "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3687,6 +3765,8 @@ }, "node_modules/@opentelemetry/instrumentation-koa": { "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.1.tgz", + "integrity": "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3703,6 +3783,8 @@ }, "node_modules/@opentelemetry/instrumentation-lru-memoizer": { "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.1.tgz", + "integrity": "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3717,6 +3799,8 @@ }, "node_modules/@opentelemetry/instrumentation-mongodb": { "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.52.0.tgz", + "integrity": "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3732,6 +3816,8 @@ }, "node_modules/@opentelemetry/instrumentation-mongoose": { "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.1.tgz", + "integrity": "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3748,6 +3834,8 @@ }, "node_modules/@opentelemetry/instrumentation-mysql": { "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.1.tgz", + "integrity": "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3764,6 +3852,8 @@ }, "node_modules/@opentelemetry/instrumentation-mysql2": { "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.2.tgz", + "integrity": "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3780,6 +3870,8 @@ }, "node_modules/@opentelemetry/instrumentation-pg": { "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.1.tgz", + "integrity": "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3799,6 +3891,8 @@ }, "node_modules/@opentelemetry/instrumentation-redis-4": { "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.1.tgz", + "integrity": "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3815,6 +3909,8 @@ }, "node_modules/@opentelemetry/instrumentation-tedious": { "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.1.tgz", + "integrity": "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3831,6 +3927,8 @@ }, "node_modules/@opentelemetry/instrumentation-undici": { "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.1.tgz", + "integrity": "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3846,6 +3944,8 @@ }, "node_modules/@opentelemetry/instrumentation/node_modules/semver": { "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3857,6 +3957,8 @@ }, "node_modules/@opentelemetry/redis-common": { "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3865,6 +3967,8 @@ }, "node_modules/@opentelemetry/resources": { "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3880,6 +3984,8 @@ }, "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3888,6 +3994,8 @@ }, "node_modules/@opentelemetry/sdk-trace-base": { "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3904,6 +4012,8 @@ }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3912,6 +4022,8 @@ }, "node_modules/@opentelemetry/semantic-conventions": { "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", + "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3920,6 +4032,8 @@ }, "node_modules/@opentelemetry/sql-common": { "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3988,6 +4102,8 @@ }, "node_modules/@paulirish/trace_engine": { "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.59.tgz", + "integrity": "sha512-439NUzQGmH+9Y017/xCchBP9571J4bzhpcNhrxorf7r37wcyJZkgUfrUsRL3xl+JDcZ6ORhoFCzCw98c6S3YHw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3995,13 +4111,6 @@ "third-party-web": "latest" } }, - "node_modules/@paulirish/trace_engine/node_modules/third-party-web": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.28.0.tgz", - "integrity": "sha512-4P798O67JmIKRJfJ1HSOkIsZrx2+FuaN2jTQX+imHXFPbGp17KSMDabYxrRT011B3gBzaoHFhUkBlEkNZN8vuQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "dev": true, @@ -4022,21 +4131,6 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@playwright/test": { - "version": "1.56.1", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "playwright": "1.56.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.17", "dev": true, @@ -4093,7 +4187,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.2.tgz", "integrity": "sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==", - "dev": true, "license": "MIT", "dependencies": { "@preact/signals-core": "^1.7.0" @@ -4110,7 +4203,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.12.1.tgz", "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==", - "dev": true, "license": "MIT", "funding": { "type": "opencollective", @@ -4119,6 +4211,8 @@ }, "node_modules/@prisma/instrumentation": { "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.11.1.tgz", + "integrity": "sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4183,14 +4277,12 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "dev": true, "license": "MIT" }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4206,7 +4298,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4222,7 +4313,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.3", @@ -4259,7 +4349,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.3" @@ -4283,7 +4372,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.3", @@ -4311,7 +4399,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.3" @@ -4335,7 +4422,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4351,7 +4437,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", @@ -4377,7 +4462,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.3" @@ -4401,7 +4485,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" @@ -4420,7 +4503,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.1.3", @@ -4445,7 +4527,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.3" @@ -4469,7 +4550,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", @@ -4494,7 +4574,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.4" @@ -4518,7 +4597,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -4537,7 +4615,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -4556,7 +4633,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4572,7 +4648,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", @@ -4592,7 +4667,6 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" @@ -4611,7 +4685,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" @@ -4630,7 +4703,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4646,7 +4718,6 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "dev": true, "license": "MIT", "dependencies": { "@react-spring/shared": "~9.7.5", @@ -4660,7 +4731,6 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "dev": true, "license": "MIT", "dependencies": { "@react-spring/animated": "~9.7.5", @@ -4679,14 +4749,12 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "dev": true, "license": "MIT" }, "node_modules/@react-spring/shared": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "dev": true, "license": "MIT", "dependencies": { "@react-spring/rafz": "~9.7.5", @@ -4700,14 +4768,12 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "dev": true, "license": "MIT" }, "node_modules/@react-spring/web": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", - "dev": true, "license": "MIT", "dependencies": { "@react-spring/animated": "~9.7.5", @@ -4726,7 +4792,9 @@ "license": "MIT" }, "node_modules/@sentry/core": { - "version": "9.46.0", + "version": "9.47.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.47.1.tgz", + "integrity": "sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw==", "dev": true, "license": "MIT", "engines": { @@ -4734,7 +4802,9 @@ } }, "node_modules/@sentry/node": { - "version": "9.46.0", + "version": "9.47.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.47.1.tgz", + "integrity": "sha512-CDbkasBz3fnWRKSFs6mmaRepM2pa+tbZkrqhPWifFfIkJDidtVW40p6OnquTvPXyPAszCnDZRnZT14xyvNmKPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4768,9 +4838,9 @@ "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.34.0", "@prisma/instrumentation": "6.11.1", - "@sentry/core": "9.46.0", - "@sentry/node-core": "9.46.0", - "@sentry/opentelemetry": "9.46.0", + "@sentry/core": "9.47.1", + "@sentry/node-core": "9.47.1", + "@sentry/opentelemetry": "9.47.1", "import-in-the-middle": "^1.14.2", "minimatch": "^9.0.0" }, @@ -4779,12 +4849,14 @@ } }, "node_modules/@sentry/node-core": { - "version": "9.46.0", + "version": "9.47.1", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.47.1.tgz", + "integrity": "sha512-7TEOiCGkyShJ8CKtsri9lbgMCbB+qNts2Xq37itiMPN2m+lIukK3OX//L8DC5nfKYZlgikrefS63/vJtm669hQ==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "9.46.0", - "@sentry/opentelemetry": "9.46.0", + "@sentry/core": "9.47.1", + "@sentry/opentelemetry": "9.47.1", "import-in-the-middle": "^1.14.2" }, "engines": { @@ -4801,11 +4873,13 @@ } }, "node_modules/@sentry/opentelemetry": { - "version": "9.46.0", + "version": "9.47.1", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.47.1.tgz", + "integrity": "sha512-STtFpjF7lwzeoedDJV+5XA6P89BfmFwFftmHSGSe3UTI8z8IoiR5yB6X2vCjSPvXlfeOs13qCNNCEZyznxM8Xw==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "9.46.0" + "@sentry/core": "9.47.1" }, "engines": { "node": ">=18" @@ -4857,6 +4931,8 @@ }, "node_modules/@stylistic/stylelint-plugin": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.3.tgz", + "integrity": "sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==", "dev": true, "license": "MIT", "dependencies": { @@ -5216,7 +5292,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", - "dev": true, "license": "MIT", "dependencies": { "@tannin/evaluate": "^1.2.0", @@ -5227,14 +5302,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==", - "dev": true, "license": "MIT" }, "node_modules/@tannin/plural-forms": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", - "dev": true, "license": "MIT", "dependencies": { "@tannin/compile": "^1.1.0" @@ -5244,14 +5317,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==", - "dev": true, "license": "MIT" }, "node_modules/@tannin/sprintf": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@tannin/sprintf/-/sprintf-1.3.3.tgz", "integrity": "sha512-RwARl+hFwhzy0tg9atWcchLFvoQiOh4rrP7uG2N5E4W80BPCUX0ElcUR9St43fxB9EfjsW2df9Qp+UsTbvQDjA==", - "dev": true, "license": "MIT" }, "node_modules/@tootallnate/once": { @@ -5275,6 +5346,17 @@ "node": ">=10.13.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, @@ -5414,14 +5496,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-1.1.0.tgz", "integrity": "sha512-SaEcbgQscHtGJ1QL+ajgDTmmqU2f6T+00jZRcFlVHUW2Asivc84LNUev/UQFyu117AsdyrtI+qpwLvgjJXJxmw==", - "dev": true, "license": "MIT" }, "node_modules/@types/highlight-words-core": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/highlight-words-core/-/highlight-words-core-1.2.1.tgz", "integrity": "sha512-9VZUA5omXBfn+hDxFjUDu1FOJTBM3LmvqfDey+Z6Aa8B8/JmF5SMj6FBrjfgJ/Q3YXOZd3qyTDfJyMZSs/wCUA==", - "dev": true, "license": "MIT" }, "node_modules/@types/http-cache-semantics": { @@ -5498,6 +5578,8 @@ }, "node_modules/@types/minimist": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, "license": "MIT" }, @@ -5505,11 +5587,12 @@ "version": "1.6.15", "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz", "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==", - "dev": true, "license": "MIT" }, "node_modules/@types/mysql": { "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5518,7 +5601,6 @@ }, "node_modules/@types/node": { "version": "24.10.0", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -5534,16 +5616,19 @@ }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", - "dev": true, "license": "MIT" }, "node_modules/@types/pg": { "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", "dev": true, "license": "MIT", "dependencies": { @@ -5554,6 +5639,8 @@ }, "node_modules/@types/pg-pool": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5650,6 +5737,8 @@ }, "node_modules/@types/shimmer": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", "dev": true, "license": "MIT" }, @@ -5657,7 +5746,6 @@ "version": "9.11.9", "resolved": "https://registry.npmjs.org/@types/simple-peer/-/simple-peer-9.11.9.tgz", "integrity": "sha512-6Gdl7TSS5oh9nuwKD4Pl8cSmaxWycYeZz9HLnJBNvIwWjZuGVsmHe9RwW3+9RxfhC1aIR9Z83DvaJoMw6rhkbg==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -5678,6 +5766,8 @@ }, "node_modules/@types/tedious": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", "dev": true, "license": "MIT", "dependencies": { @@ -6475,27 +6565,294 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@use-gesture/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", - "dev": true, "license": "MIT" }, "node_modules/@use-gesture/react": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "dev": true, "license": "MIT", "dependencies": { "@use-gesture/core": "10.3.1" @@ -6680,7 +7037,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.35.0.tgz", "integrity": "sha512-37DeBnBU20lLpQjwAZx0fkPsrrXT4COMSRhZOiFifv7wCiNW1DIukfqReAc/yZ6x0wOtqXKA3n905D8zm5NF5A==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/dom-ready": "^4.35.0", @@ -6695,7 +7051,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@wordpress/admin-ui/-/admin-ui-1.3.0.tgz", "integrity": "sha512-LUe1crA9qbnT7rMlHaWbA3KlCQgzNxAwWiVHenSPkkp8mHoFKqRAHRIGFgmb+bWe8GnxHMBTasoUXCaWYMtfAw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/base-styles": "^6.11.0", @@ -6712,7 +7067,6 @@ "version": "7.35.0", "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.35.0.tgz", "integrity": "sha512-jWIhNUVYkUOsVLvGodBhzLe4DR+gCNmh7sm91Vce/79M+DXMtEFLc8jHJ5kXKudnPPTzy29KF1ZzZJ9rm9sqRQ==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/i18n": "^6.8.0", @@ -6727,7 +7081,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.35.0.tgz", "integrity": "sha512-Tpfl9BOgrOl+SpPDcOA77qotuJIzO7umqlSU4YgBFxxvOQM2L/+dJhBhzngfLKUoF9jcm7j12e7M9X9X216w+Q==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -6735,7 +7088,9 @@ } }, "node_modules/@wordpress/babel-preset-default": { - "version": "8.34.0", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.35.0.tgz", + "integrity": "sha512-mQc07JeNzulxEq0HHFor4hbKSvF2D81NKfsuFeZGGRCSD7hKJwQsknrzgUmrfRKn8Bb8p+yglw2TVQ6mN+gnwg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -6745,8 +7100,8 @@ "@babel/plugin-transform-runtime": "7.25.7", "@babel/preset-env": "7.25.7", "@babel/preset-typescript": "7.25.7", - "@wordpress/browserslist-config": "^6.34.0", - "@wordpress/warning": "^3.34.0", + "@wordpress/browserslist-config": "^6.35.0", + "@wordpress/warning": "^3.35.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^18.3.0" @@ -6758,6 +7113,8 @@ }, "node_modules/@wordpress/babel-preset-default/node_modules/@babel/core": { "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, "license": "MIT", "dependencies": { @@ -6789,7 +7146,6 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.11.0.tgz", "integrity": "sha512-olV27w/QCztQj7xs/WssxrGJh7jyI+dVsQBw1p+LOo+XxRhFq6MvcUH6vEBXpU78ICtlqEx/uR3eYwEy1hQhUw==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -6800,7 +7156,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.35.0.tgz", "integrity": "sha512-8b+A6in2dH+PPhGGI84GwNPyi8mxXUgsTsBG9Ey/WCYRFWXJmqhkgTUnZIi4PvieJbmmAILI9oyfMPSfeAb0sg==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -6811,7 +7166,6 @@ "version": "15.8.0", "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-15.8.0.tgz", "integrity": "sha512-R9Nh7A5a9HFebNllLztVMSRS3bsyG8H7y+hmztF3+YdtQqLO0SVdkiaYrx3mPEUnmzd88dERpLfMOFtzCDUVwg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@emotion/react": "^11.7.1", @@ -6876,22 +7230,10 @@ "react-dom": "^18.0.0" } }, - "node_modules/@wordpress/block-editor/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/block-serialization-default-parser": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.35.0.tgz", "integrity": "sha512-uLUGNu7Jj7Nk67vkDfAZeNTjLMUuD3PXlWW+75M641wTzGtMrrHSKTNHGoo7W4LyykaDmgfiTToZAu0REIgbJg==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -6902,7 +7244,6 @@ "version": "15.8.0", "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-15.8.0.tgz", "integrity": "sha512-2PpklyJiRvrh7ozH+TTUQr/X0HmpemgG3z4tDi1XX+dDe10FJCvihTJa+/D9sbZQFk1zDJUzN1Kdr0elsGkRpA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/autop": "^4.35.0", @@ -6940,22 +7281,10 @@ "react": "^18.0.0" } }, - "node_modules/@wordpress/blocks/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/blocks/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6966,7 +7295,9 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.34.0", + "version": "6.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.35.0.tgz", + "integrity": "sha512-Y9BGxIJblHC8ChezNNLZoF8TWj52zuBVBF58t3tUrqnEE80L7eV4A+v0nOqQr6hNjVIdqI6RdWiCB6qmvm3CzQ==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -6978,7 +7309,6 @@ "version": "1.35.0", "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.35.0.tgz", "integrity": "sha512-a4NTHMRKq+Hk0sBg1eFPk4CiMGqJkWyilml2M4Sk1bT3xFCMBmXaYWtC+k82e5EzmyU/W+b+/sctHkb8m3eeeg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/base-styles": "^6.11.0", @@ -7005,7 +7335,6 @@ "version": "30.8.0", "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-30.8.0.tgz", "integrity": "sha512-lVcPXXeip41K6VmvVLkIPPbhsfIn5QZ9AFozkPEZPDOcpFvvYTnT4hDRM5+Pi9xrO2TOGhbXoJmYlFjAx19xSw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@ariakit/react": "^0.4.15", @@ -7064,29 +7393,16 @@ "react-dom": "^18.0.0" } }, - "node_modules/@wordpress/components/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/components/node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, "license": "MIT" }, "node_modules/@wordpress/components/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -7100,7 +7416,6 @@ "version": "7.35.0", "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.35.0.tgz", "integrity": "sha512-UUQ31Rfi+KFfqT5wkbTgq0nMh+QfbLvshhm30+EGr8R3bYziHhfLKhIL2YQXf4MIX4owOFdKgbAt4GFeVI24ng==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@types/mousetrap": "^1.6.8", @@ -7128,7 +7443,6 @@ "version": "7.35.0", "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.35.0.tgz", "integrity": "sha512-fR85hKuiruHfx0G579SY5KySsb2+Rjfk3DKx4Zp21cYCOTu1a0/9vlIebuO9n1r8GplcelAFseAYoZP4OXaFLA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/api-fetch": "^7.35.0", @@ -7162,22 +7476,10 @@ "react-dom": "^18.0.0" } }, - "node_modules/@wordpress/core-data/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/core-data/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -7191,7 +7493,6 @@ "version": "10.35.0", "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.35.0.tgz", "integrity": "sha512-rAhyjbnDI9lOPBiJITDOwHJd8+WNmkurqwMJYDjJRqCYAl/mPx9vy6JIgIkyRWQQNiGYrCAv1z6qLqS2Cypg3Q==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/compose": "^7.35.0", @@ -7221,7 +7522,6 @@ "version": "10.3.0", "resolved": "https://registry.npmjs.org/@wordpress/dataviews/-/dataviews-10.3.0.tgz", "integrity": "sha512-7mBcW4Vris+8Be3ESUPkhe85AwAbwO+2ocvi4UDF6jEzeyH7GQxq+1k4Lq4vAc+pNBf0IehZV598+qs8nk9j2w==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@ariakit/react": "^0.4.15", @@ -7254,22 +7554,10 @@ "react-dom": "^18.0.0" } }, - "node_modules/@wordpress/dataviews/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/dataviews/node_modules/date-fns": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -7280,7 +7568,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.35.0.tgz", "integrity": "sha512-xXJf703MtQCbgoAT1DSwRu+iWcgb6UFAoBnnzq8ohZCICsBxEGOOr+EAgblvFSNPV3MCtUOr98zRCAuGon3Gqw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/deprecated": "^4.35.0", @@ -7293,7 +7580,9 @@ } }, "node_modules/@wordpress/dependency-extraction-webpack-plugin": { - "version": "6.34.0", + "version": "6.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.35.0.tgz", + "integrity": "sha512-HytyG+9vh2u+EM9YRM5xEtP1YDjU73Q+GdQ1j2k/OUd/A6NNmln5dk+1rzvXHYUrn5wogomcJTHDD6vBFSX3aw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7309,6 +7598,8 @@ }, "node_modules/@wordpress/dependency-extraction-webpack-plugin/node_modules/json2php": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.7.tgz", + "integrity": "sha512-dnSoUiLAoVaMXxFsVi4CrPVYMKOuDBXTghXSmMINX44RZ8WM9cXlY7UqrQnlAcODCVO7FV3+8t/5nDKAjimLfg==", "dev": true, "license": "BSD" }, @@ -7316,7 +7607,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.35.0.tgz", "integrity": "sha512-+TruZtmDxRfVw02c1de7ofGC3CrcaPCUXCCbwfP6ruy1zM3IC3rtJfyTbqKPqO1y4uI+9Kqe5VEobqRKT3HQSg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/hooks": "^4.35.0" @@ -7330,7 +7620,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.35.0.tgz", "integrity": "sha512-mM/8m548RaWtkBonpCYHprXgyVFjKcFJWyHfWZz17j01xIbzBq+//cR/Lff86EiEuwynedqlFoEJUcgvPkrJZw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/deprecated": "^4.35.0" @@ -7344,7 +7633,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.35.0.tgz", "integrity": "sha512-u8ifPAFsIAkBG3ehcZdnt+b3t2S0gD3dyDMKgl+GO95wq6kJFqo/NYNQqsjeYUMOFX7cL9D0F2gxiBB4D/AQIA==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -7352,12 +7640,13 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.34.0", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.35.0.tgz", + "integrity": "sha512-xGuMP7fIGPEA2GuLAbPlJEd0vTnGhDIJ0LfOv+xdrIiJCfdt0e7Rz0qxHyvhbQIx0lfpzi1No/qRUBCzlPwDCg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "change-case": "^4.1.2", - "form-data": "^4.0.0", "get-port": "^5.1.1", "lighthouse": "^12.2.2", "mime": "^3.0.0", @@ -7375,7 +7664,6 @@ "version": "14.35.0", "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-14.35.0.tgz", "integrity": "sha512-H2nvTPjClZ7IEnXKXBlRQYm7pJBymL3dxfkqkN234L/rXPETXvn5AA37Wmmjjv+5AKdT5VxmwhaNDxtsJEJl1g==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@floating-ui/react-dom": "2.0.8", @@ -7436,22 +7724,10 @@ "react-dom": "^18.0.0" } }, - "node_modules/@wordpress/editor/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/editor/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -7517,17 +7793,20 @@ } }, "node_modules/@wordpress/eslint-plugin": { - "version": "22.20.0", + "version": "22.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.21.0.tgz", + "integrity": "sha512-CvX26FcnpiSmN2ASVfFXA5OoqV7GWM6Ifxye1W+bfBYVgcaT3fO75WiGcTYHHqQM/6W1VxXAoyInLpluMtmejg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/eslint-parser": "7.25.7", "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^6.4.1", - "@wordpress/babel-preset-default": "^8.34.0", - "@wordpress/prettier-config": "^4.34.0", + "@wordpress/babel-preset-default": "^8.35.0", + "@wordpress/prettier-config": "^4.35.0", "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^8.3.0", + "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.25.2", "eslint-plugin-jest": "^27.4.3", "eslint-plugin-jsdoc": "^46.4.6", @@ -7562,7 +7841,6 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/@wordpress/fields/-/fields-0.27.0.tgz", "integrity": "sha512-enirbHCAH3uiLGtv2XnMFMRouUPvx8KxO+GYMUyojm+fgacfw1gfEB4UBTjRVKs6NepzldS+FLIDvE7uZ6ximg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/api-fetch": "^7.35.0", @@ -7602,22 +7880,10 @@ "react": "^18.0.0" } }, - "node_modules/@wordpress/fields/node_modules/@wordpress/warning": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", - "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", - "dev": true, - "license": "GPL-2.0-or-later", - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/global-styles-engine": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@wordpress/global-styles-engine/-/global-styles-engine-1.2.0.tgz", "integrity": "sha512-Bg+oaSkhDzPgefMkAVqMjItSya990wQwXbt8zdiZQFdEoSeyA5FvMWL55ESR01f6hcoUCM+6r8OfUenuDI1nuw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/blocks": "^15.8.0", @@ -7639,7 +7905,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@wordpress/global-styles-ui/-/global-styles-ui-1.2.0.tgz", "integrity": "sha512-v4zIbzs9PFWIf6KzMfjz5cSPxCT+ILfMWUyTes3Z9/y5Bh9tmreN6p+wMnj3u8ashJh4ENBbZPIx2AMw/uPeoA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.35.0", @@ -7675,7 +7940,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.35.0.tgz", "integrity": "sha512-PQcAv/zfMYn5sPScOWDu1vgYkyHaDFt7+1IHvwR0RGE0AdQrdnKjvm6VJ4ALugA+zvJZkBZxLk5Gm+NZGAWIMg==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -7686,7 +7950,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.35.0.tgz", "integrity": "sha512-43K8viPNNWUxmCKfKN2Dx/TgJitbGeGCfWBj0aloRoeqOUeEuDkWoak+XiIrJKpwYHTYhqtePl7COMWPzwkqbw==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -7697,7 +7960,6 @@ "version": "6.8.0", "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.8.0.tgz", "integrity": "sha512-lNMjf0VXWm2qzkEI+v1psvb26FN+B32sO6nLOFxs5Lay/E0WVqCw31DiRw8nETlzVwsMheO+iy0lCSOLvg+jog==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@tannin/sprintf": "^1.3.2", @@ -7732,7 +7994,6 @@ "version": "6.35.0", "resolved": "https://registry.npmjs.org/@wordpress/interactivity/-/interactivity-6.35.0.tgz", "integrity": "sha512-EVnmHNFHHgGGr5n7wl5cLkvkvfpWp06d2CIVfebJmsVKkZyIEpXGuG9LdTWv3dMjP6nlRmPX2VNVejswMeER8A==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@preact/signals": "^1.3.0", @@ -7747,7 +8008,6 @@ "version": "9.20.0", "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-9.20.0.tgz", "integrity": "sha512-Iuqn/fh2ZwQ4bOSbbbBxNNN/t70XN1WICNW4MJWolucqYTqzTmBdOoKzceBgfNQIN4E2953Vjnl/qn9zjhw9ew==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.35.0", @@ -7777,7 +8037,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.35.0.tgz", "integrity": "sha512-ooM/QFzxu8Ueqsv0D/z0+X6grbVws3GFMSxdM12eZO1B0/x6JPAtq4msZkoxqeQ4zoR0ghYHFXzv3k+Ch1tsFw==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -7785,7 +8044,9 @@ } }, "node_modules/@wordpress/jest-console": { - "version": "8.34.0", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.35.0.tgz", + "integrity": "sha512-2iwlAdL1+BogegHZtLJZ1p3EGz8Hts/yPQkj1rgDr6ydQ28VJ04W0MJqDCL0bcJPCnBUeS//WsG5eJZ114AVdA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7800,11 +8061,13 @@ } }, "node_modules/@wordpress/jest-preset-default": { - "version": "12.34.0", + "version": "12.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.35.0.tgz", + "integrity": "sha512-Hl49ATqb6KQ+Tld+xIpoZ9ZJ0wmC6ZhXdSR+owqSIzY1rK8bEf9X/HZguJf7mG2O06V4XhVjP7WAYCD5PnkZEA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/jest-console": "^8.34.0", + "@wordpress/jest-console": "^8.35.0", "babel-jest": "29.7.0" }, "engines": { @@ -7820,7 +8083,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.35.0.tgz", "integrity": "sha512-RD5LiguBORTOmW6iGMVtJ8OXReKK0LO1ZdTiDf0sIjTV9Z++O+OQzfknA7ViZhysqHOqNVdK/laFpiDuizppGw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/data": "^10.35.0", @@ -7839,7 +8101,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.35.0.tgz", "integrity": "sha512-+cvb9I4VorJRUsPC4C/2e0QWMz8hkjQIvjz3BjTkIXyWlxsSRSk/+a/YCrfyyA5ysuR9PgwKxxI7/ZaAPvOC6w==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/i18n": "^6.8.0" @@ -7853,7 +8114,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-5.35.0.tgz", "integrity": "sha512-9PT5/f5bLNJINnBe5QlQZaeQ9Uvwnedxt2LhIzwlaxdXO1FQYKNK85QfeUo3KC6R8N5aQNPBWjQVPYQ9SorarQ==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/api-fetch": "^7.35.0", @@ -7876,7 +8136,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.35.0.tgz", "integrity": "sha512-AIyBM7rtlCG6X2kSR2eRG64Cs0llfXXpecD4EU0+vjUSQU/gBzlL/UUNwt69fe6RdbZEmsQkQmJ8WQk8YfAMIA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.35.0", @@ -7891,7 +8150,9 @@ } }, "node_modules/@wordpress/npm-package-json-lint-config": { - "version": "5.34.0", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.35.0.tgz", + "integrity": "sha512-6r4zTE69ocIusDBB4VEgh5ZW4F3eywTb7KmnOJfbCtN3YuR1w8Nss332TPU8+utd16wpO5CawbTC99Mpuh0PQA==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -7906,7 +8167,6 @@ "version": "2.35.0", "resolved": "https://registry.npmjs.org/@wordpress/patterns/-/patterns-2.35.0.tgz", "integrity": "sha512-BGUPL0itljXaHORThOSDctGV82/52xgkfFuuaDC2ECZa1odOR4HxSol1qiPIHtfH2gL4nFNMAmr6WqXloGBs7Q==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.35.0", @@ -7938,7 +8198,6 @@ "version": "7.35.0", "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-7.35.0.tgz", "integrity": "sha512-idNlIINRyDN0riMTRPlB91LBgPz/yJTDbwMGByQV8c470TS1HCO/kuGGQ8e/xwj1XNTcUO4dzPVSyHFYFK3BkA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/components": "^30.8.0", @@ -7960,11 +8219,13 @@ } }, "node_modules/@wordpress/postcss-plugins-preset": { - "version": "5.34.0", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.35.0.tgz", + "integrity": "sha512-rt5umnJ98xR559O42nBYDSBV7NsRjkTDk4ZQ+kpQOa5zQ46FikE+7AYrKWpFwpCCZutcADwa4tsHbKBZhy2NRw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/base-styles": "^6.10.0", + "@wordpress/base-styles": "^6.11.0", "autoprefixer": "^10.4.20", "postcss-import": "^16.1.1" }, @@ -7980,7 +8241,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.35.0.tgz", "integrity": "sha512-y0z2F2ZAVIJou/7lcFIVaSFmETUgZOfPdFKUBRJ3LoA8wm0RGUg1ZnFcNA4zT9E6K0b6YqsqgNsVT70XvGsQXg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.35.0", @@ -8005,7 +8265,9 @@ } }, "node_modules/@wordpress/prettier-config": { - "version": "4.34.0", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.35.0.tgz", + "integrity": "sha512-9mCz8po5Fc324ZPZzT2CHfL/PfXn16ezKKWJPNWAyoN4niwRWCsku4RHHhGO14pM+IYjSH0XS2ylLx3xmuuXjw==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -8037,7 +8299,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.35.0.tgz", "integrity": "sha512-kLdPx09CnPMPUL5hI/3SUgbBVEka20iWBxM2pvwJGrn3bleY0WxGqLtoUksn6yQds9d7jjS5cKoBYxY1H8MHgg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "requestidlecallback": "^0.3.0" @@ -8051,7 +8312,6 @@ "version": "1.35.0", "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.35.0.tgz", "integrity": "sha512-gpwYCAuWSjSps7KnmPfUSdJUf5iq8P0ln1eZPcnjs3IwRDUrKW9eUrO0jID+XUsi63qi5c+lv9UkwI8M8C9c5A==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -8062,7 +8322,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.35.0.tgz", "integrity": "sha512-qc3MLyPWzpujvrP1wVg3xCAuZF+BItGSIIOikMk6xLN63FlNRxjh88gZ65evjU47Ik5KOjYqx3bt/GFdmzJOxw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "is-plain-object": "^5.0.0", @@ -8081,7 +8340,6 @@ "version": "5.35.0", "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-5.35.0.tgz", "integrity": "sha512-hXbLMHKX8ZASpnp85sJFevYQbDFC+qY50pz8T8DbHYP3z4QkVXHUeeQhOsKyr/Vp+FPI5kblh4H/XnkErHgLvw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/base-styles": "^6.11.0", @@ -8110,7 +8368,6 @@ "version": "7.35.0", "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.35.0.tgz", "integrity": "sha512-GhR9unaSAeVd2UQ6/WgYyAfP/xSE4VD43XuxY6hV4LaU0Qobi/N38Pamkln4eMhORcY8RzNQSkpFX27Nj/fxTQ==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/a11y": "^4.35.0", @@ -8136,7 +8393,6 @@ "version": "1.35.0", "resolved": "https://registry.npmjs.org/@wordpress/router/-/router-1.35.0.tgz", "integrity": "sha512-FZ70FFX9NzMusINP4aXYl4ajyFt8SiNkmkWhHBl/qigdedv1M8msHFGObYYr1rOHf4b6AyzJs6Zdz4gTPegdpw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/compose": "^7.35.0", @@ -8155,23 +8411,25 @@ } }, "node_modules/@wordpress/scripts": { - "version": "30.27.0", + "version": "31.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-31.0.0.tgz", + "integrity": "sha512-ojXSYDyx+vN5D5vFak8xdahAW/s03WX6Egcecxmj9I7Ha9CLLuSBsMUzIuaA1cjxPUNXiu2kQD0s6OEVXxuOVQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.34.0", - "@wordpress/browserslist-config": "^6.34.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.34.0", - "@wordpress/e2e-test-utils-playwright": "^1.34.0", - "@wordpress/eslint-plugin": "^22.20.0", - "@wordpress/jest-preset-default": "^12.34.0", - "@wordpress/npm-package-json-lint-config": "^5.34.0", - "@wordpress/postcss-plugins-preset": "^5.34.0", - "@wordpress/prettier-config": "^4.34.0", - "@wordpress/stylelint-config": "^23.26.0", + "@wordpress/babel-preset-default": "^8.35.0", + "@wordpress/browserslist-config": "^6.35.0", + "@wordpress/dependency-extraction-webpack-plugin": "^6.35.0", + "@wordpress/e2e-test-utils-playwright": "^1.35.0", + "@wordpress/eslint-plugin": "^22.21.0", + "@wordpress/jest-preset-default": "^12.35.0", + "@wordpress/npm-package-json-lint-config": "^5.35.0", + "@wordpress/postcss-plugins-preset": "^5.35.0", + "@wordpress/prettier-config": "^4.35.0", + "@wordpress/stylelint-config": "^23.27.0", "adm-zip": "^0.5.9", "babel-jest": "29.7.0", "babel-loader": "9.2.1", @@ -8286,7 +8544,6 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-6.11.0.tgz", "integrity": "sha512-87bk762NaavWnFHysZe4R4+WOXmef2ltMKzO3VJoUlskml3WJpzOjIOGbefaXXX8HZyD7+hW0Uk5Q7NZ6OxysQ==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/api-fetch": "^7.35.0", @@ -8312,7 +8569,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.35.0.tgz", "integrity": "sha512-+7dcPxBeee9LLwhS88MoNuLndoQQxwyQLlXCzWX0Min6YLWFXd0b+hmsRUlOE7qzbuZbHyW3mCk8ot9p3xK3sw==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "memize": "^2.0.1" @@ -8326,7 +8582,6 @@ "version": "2.35.0", "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.35.0.tgz", "integrity": "sha512-HfnxMwTgpdNI54Zwh5BTDJPikBPawRyOMw1cIu7z24DThiwADaefBbI2RFinT3DyneKqwzo3Az5wKatgxBrmZQ==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "change-case": "^4.1.2" @@ -8337,7 +8592,9 @@ } }, "node_modules/@wordpress/stylelint-config": { - "version": "23.26.0", + "version": "23.27.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.27.0.tgz", + "integrity": "sha512-xe3UIUjCt4iNAZ0EkWCzsJ4/CCyiUuP1pswDV5Aw+KTGmmxsbyTrjuqPUZo8wBo5GkG30SysKCXy+vM0G3g3kA==", "dev": true, "license": "MIT", "dependencies": { @@ -8358,7 +8615,6 @@ "version": "1.35.0", "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.35.0.tgz", "integrity": "sha512-2q7gYcw7fB5csO4LC12ZMe9UYoTCbmU+lTN4sdgmVr1bGs2Zm4Xm1ZAtq1wfrmVNYR10WysK+qKNxxyegNbWSg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@types/simple-peer": "^9.11.5", @@ -8381,7 +8637,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.35.0.tgz", "integrity": "sha512-IQGnoS580BhrEtr9CzcFjl5XcxI0Q7UMx55rl4R3NKiZ+mPk3zFwXztogPvffSUIcw5mg73iNEfoN6EJFoa87g==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -8392,7 +8647,6 @@ "version": "1.35.0", "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.35.0.tgz", "integrity": "sha512-WyJWGLhLvkB2FF/o+QmgAoPo3NTEi5HQDwYbSEpw1pUZm7W3U/QwcaW6cWW3D/9OUtnHY4kfMGxrI5del2tYyA==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/is-shallow-equal": "^5.35.0" @@ -8406,7 +8660,6 @@ "version": "0.20.0", "resolved": "https://registry.npmjs.org/@wordpress/upload-media/-/upload-media-0.20.0.tgz", "integrity": "sha512-EFQz8pHK2fh6c0JP3dEPeuIy8SYF7f1YmjpMvMO37y25da92w5RARECAiBXncyopc6zUmW/X6PySlT72DA8kKQ==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/api-fetch": "^7.35.0", @@ -8433,7 +8686,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -8447,7 +8699,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.35.0.tgz", "integrity": "sha512-h6KK0OePnc64T50BwVWmQb7xmcMW0XDtfh+1m/a0tlzXGLU4TnBjUUs+a0h0y6Tdla14lc2BtbLJLFwky06vbg==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "remove-accents": "^0.5.0" @@ -8461,7 +8712,6 @@ "version": "6.35.0", "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-6.35.0.tgz", "integrity": "sha512-q1SOTErt2nMT2CrwPuNRrKoJn2uj/fhMBe/tMOacyoG2bHJLvyY+XsCQwVc/Hgu7dANOYUtx2wLbuO5Mc+Hr6Q==", - "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/compose": "^7.35.0", @@ -8477,8 +8727,9 @@ } }, "node_modules/@wordpress/warning": { - "version": "3.34.0", - "dev": true, + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.35.0.tgz", + "integrity": "sha512-2UGZuHenf84UHdotBxv9ZCtlsFIy5u4QTUPBnx1gH4N9zEuJs+JiCtlOzgcl0JzT3xFK5y3cXLLVqlhf8tDMBQ==", "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -8489,7 +8740,6 @@ "version": "4.35.0", "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.35.0.tgz", "integrity": "sha512-Qzs7z4fRtx2gZQ9d09ISmO+b5ZhZc82zBG3BdlVxDQK/PtlY0TdpFnBEtn7BxOv+WUHP8dJ1eG1p9qsXrxMSRg==", - "dev": true, "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", @@ -8553,6 +8803,8 @@ }, "node_modules/acorn-import-attributes": { "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8625,6 +8877,8 @@ }, "node_modules/ajv-errors": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8677,6 +8931,8 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { @@ -8794,7 +9050,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -8978,6 +9233,8 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "license": "MIT", "engines": { @@ -9002,6 +9259,8 @@ }, "node_modules/astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "license": "MIT", "engines": { @@ -9023,6 +9282,8 @@ }, "node_modules/atomically": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.1.0.tgz", + "integrity": "sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9031,7 +9292,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.21", + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", "dev": true, "funding": [ { @@ -9049,9 +9312,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -9070,7 +9333,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==", - "dev": true, "license": "MIT" }, "node_modules/available-typed-arrays": { @@ -9182,7 +9444,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -9362,7 +9623,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "dev": true, "funding": [ { "type": "github", @@ -9609,16 +9869,17 @@ } }, "node_modules/cacheable": { - "version": "2.1.1", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.2.0.tgz", + "integrity": "sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/memoize": "^2.0.3", - "@cacheable/memory": "^2.0.3", - "@cacheable/utils": "^2.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3", - "qified": "^0.5.0" + "@cacheable/memory": "^2.0.5", + "@cacheable/utils": "^2.3.0", + "hookified": "^1.13.0", + "keyv": "^5.5.4", + "qified": "^0.5.2" } }, "node_modules/cacheable-lookup": { @@ -9647,7 +9908,9 @@ } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.3", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9700,7 +9963,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -9727,6 +9989,8 @@ }, "node_modules/camelcase-keys": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -9743,6 +10007,8 @@ }, "node_modules/camelcase-keys/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -9751,6 +10017,8 @@ }, "node_modules/camelcase-keys/node_modules/quick-lru": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, "license": "MIT", "engines": { @@ -9889,6 +10157,8 @@ }, "node_modules/chrome-launcher": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.2.1.tgz", + "integrity": "sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9947,7 +10217,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "dev": true, "license": "MIT" }, "node_modules/cli-cursor": { @@ -9984,14 +10253,12 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.5.0.tgz", "integrity": "sha512-ydG4nDZesbFurnNq0VVCp/yyomIBh+X/1fZPI/P24zbnG4dtC4tQAfI5uQsomigsUMeiRO2wiTPizLWQh+IAyQ==", - "dev": true, "license": "MIT" }, "node_modules/clipboard": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "dev": true, "license": "MIT", "dependencies": { "good-listener": "^1.2.2", @@ -10086,7 +10353,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", @@ -10131,7 +10397,6 @@ }, "node_modules/colord": { "version": "2.9.3", - "dev": true, "license": "MIT" }, "node_modules/colorette": { @@ -10241,8 +10506,7 @@ "node_modules/computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", - "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==", - "dev": true + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -10265,6 +10529,8 @@ }, "node_modules/configstore": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.1.0.tgz", + "integrity": "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10423,7 +10689,9 @@ } }, "node_modules/core-js": { - "version": "3.46.0", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10461,7 +10729,6 @@ }, "node_modules/cosmiconfig": { "version": "7.1.0", - "dev": true, "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -10509,6 +10776,8 @@ }, "node_modules/csp_evaluator": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.5.tgz", + "integrity": "sha512-EL/iN9etCTzw/fBnp0/uj0f5BOOGvZut2mzsiiBZ/FdT6gFQCKRO/tmcKOxn5drWZ2Ndm/xBb1SI4zwWbGtmIw==", "dev": true, "license": "Apache-2.0" }, @@ -10525,6 +10794,8 @@ }, "node_modules/css-functions-list": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, "license": "MIT", "engines": { @@ -10593,6 +10864,8 @@ }, "node_modules/css-tree": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { @@ -10845,7 +11118,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -10856,7 +11128,6 @@ "version": "4.1.0-0", "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz", "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", - "dev": true, "license": "MIT" }, "node_modules/debounce": { @@ -10866,7 +11137,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -10882,7 +11152,6 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10890,6 +11159,8 @@ }, "node_modules/decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "license": "MIT", "dependencies": { @@ -10905,6 +11176,8 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "license": "MIT", "engines": { @@ -10969,7 +11242,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11038,6 +11310,8 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", "engines": { @@ -11085,7 +11359,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, "license": "MIT" }, "node_modules/depd": { @@ -11134,7 +11407,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "dev": true, "license": "MIT" }, "node_modules/devtools-protocol": { @@ -11146,7 +11418,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -11287,6 +11558,8 @@ }, "node_modules/dot-prop": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11301,6 +11574,8 @@ }, "node_modules/dot-prop/node_modules/type-fest": { "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -11403,7 +11678,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "^0.6.2" @@ -11413,7 +11687,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -11444,6 +11717,8 @@ }, "node_modules/enquirer": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11467,6 +11742,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -11488,19 +11765,16 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==", - "dev": true, "license": "MIT" }, "node_modules/err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", - "dev": true, "license": "MIT" }, "node_modules/error-ex": { "version": "1.3.4", - "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -11695,7 +11969,6 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -11798,6 +12071,31 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -11816,6 +12114,40 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", + "dev": true, + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, "node_modules/eslint-module-utils": { "version": "2.12.1", "dev": true, @@ -12686,7 +13018,6 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, "license": "MIT" }, "node_modules/fast-diff": { @@ -12929,7 +13260,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true, "license": "MIT" }, "node_modules/find-up": { @@ -13076,18 +13406,22 @@ }, "node_modules/forwarded-parse": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", "dev": true, "license": "MIT" }, "node_modules/fraction.js": { - "version": "4.3.7", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -13095,7 +13429,6 @@ "version": "11.18.2", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", - "dev": true, "license": "MIT", "dependencies": { "motion-dom": "^11.18.1", @@ -13154,7 +13487,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13207,12 +13539,10 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==", - "dev": true, "license": "MIT" }, "node_modules/get-caller-file": { "version": "2.0.5", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -13245,7 +13575,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -13261,6 +13590,8 @@ }, "node_modules/get-port": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, "license": "MIT", "engines": { @@ -13320,7 +13651,20 @@ "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, "node_modules/get-uri": { @@ -13340,7 +13684,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", - "dev": true, "license": "MIT", "dependencies": { "encoding": "^0.1.12", @@ -13504,6 +13847,8 @@ }, "node_modules/globjoin": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true, "license": "MIT" }, @@ -13511,7 +13856,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", - "dev": true, "license": "MIT", "dependencies": { "delegate": "^3.1.2" @@ -13561,7 +13905,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.1.1.tgz", "integrity": "sha512-Hu0YfNU+38EsTmnUfLXUKFMXq9yz7htGYpF4x+dlbBhUCvIvzLt0yVLT/gJRmvLKFJdqNFrz4eKkIUjIXSr7Tw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13592,6 +13935,8 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, "license": "MIT", "engines": { @@ -13667,9 +14012,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hashery": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.2.0.tgz", + "integrity": "sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -13690,14 +14047,12 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==", - "dev": true, "license": "MIT" }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.6" @@ -13707,7 +14062,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -13717,7 +14071,6 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, "node_modules/homedir-polyfill": { @@ -13732,12 +14085,16 @@ } }, "node_modules/hookified": { - "version": "1.12.2", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", + "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", "dev": true, "license": "MIT" }, "node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "license": "ISC", "dependencies": { @@ -13749,6 +14106,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { @@ -13760,6 +14119,8 @@ }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, @@ -13778,7 +14139,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz", "integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg==", - "dev": true, "license": "MIT" }, "node_modules/html-encoding-sniffer": { @@ -13814,6 +14174,8 @@ }, "node_modules/html-tags": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, "license": "MIT", "engines": { @@ -13850,6 +14212,8 @@ }, "node_modules/http-link-header": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", + "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", "dev": true, "license": "MIT", "engines": { @@ -13978,7 +14342,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "dev": true, "funding": [ { "type": "github", @@ -14036,6 +14399,8 @@ }, "node_modules/image-ssim": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", + "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", "dev": true, "license": "MIT" }, @@ -14046,7 +14411,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -14061,7 +14425,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -14069,6 +14432,8 @@ }, "node_modules/import-in-the-middle": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14111,7 +14476,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-locals/-/import-locals-2.0.0.tgz", "integrity": "sha512-1/bPE89IZhyf7dr5Pkz7b4UyVXy5pEt7PTEfye15UEn3AK8+2zwcDCfKk9Pwun4ltfhOSszOrReSsFcDKw/yoA==", - "dev": true, "license": "MIT" }, "node_modules/imurmurhash": { @@ -14124,6 +14488,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -14141,7 +14507,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -14172,6 +14537,8 @@ }, "node_modules/intl-messageformat": { "version": "10.7.18", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz", + "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14199,6 +14566,8 @@ }, "node_modules/irregular-plurals": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, "license": "MIT", "engines": { @@ -14223,7 +14592,6 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "dev": true, "license": "MIT" }, "node_modules/is-async-function": { @@ -14303,6 +14671,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "dev": true, @@ -14316,7 +14707,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -14361,6 +14751,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -14578,7 +14970,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, "license": "MIT" }, "node_modules/is-regex": { @@ -14681,6 +15072,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -14740,6 +15133,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -14771,7 +15166,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", - "dev": true, "license": "MIT", "funding": { "type": "GitHub Sponsors ❤", @@ -15466,11 +15860,15 @@ }, "node_modules/jpeg-js": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/js-library-detector": { "version": "6.7.0", + "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", + "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", "dev": true, "license": "MIT", "engines": { @@ -15547,7 +15945,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -15563,7 +15960,6 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -15648,6 +16044,8 @@ }, "node_modules/known-css-properties": { "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", "dev": true, "license": "MIT" }, @@ -15715,7 +16113,6 @@ "version": "0.2.114", "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.114.tgz", "integrity": "sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==", - "dev": true, "license": "MIT", "dependencies": { "isomorphic.js": "^0.2.4" @@ -15735,6 +16132,8 @@ }, "node_modules/lighthouse": { "version": "12.8.2", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.2.tgz", + "integrity": "sha512-+5SKYzVaTFj22MgoYDPNrP9tlD2/Ay7j3SxPSFD9FpPyVxGr4UtOQGKyrdZ7wCmcnBaFk0mCkPfARU3CsE0nvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -15777,6 +16176,8 @@ }, "node_modules/lighthouse-logger": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz", + "integrity": "sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -15786,11 +16187,15 @@ }, "node_modules/lighthouse-stack-packs": { "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", "dev": true, "license": "Apache-2.0" }, "node_modules/lighthouse/node_modules/@puppeteer/browsers": { "version": "2.10.13", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", + "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -15811,6 +16216,8 @@ }, "node_modules/lighthouse/node_modules/extract-zip": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -15829,16 +16236,18 @@ } }, "node_modules/lighthouse/node_modules/puppeteer-core": { - "version": "24.29.1", + "version": "24.31.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.31.0.tgz", + "integrity": "sha512-pnAohhSZipWQoFpXuGV7xCZfaGhqcBR9C4pVrU0QSrcMi7tQMH9J9lDBqBvyMAHQqe8HCARuREqFuVKRQOgTvg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.13", - "chromium-bidi": "10.5.1", + "chromium-bidi": "11.0.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1521046", "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.3.8", + "webdriver-bidi-protocol": "0.3.9", "ws": "^8.18.3" }, "engines": { @@ -15846,7 +16255,9 @@ } }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "10.5.1", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", + "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -15859,11 +16270,15 @@ }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1521046", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz", + "integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -15884,6 +16299,8 @@ }, "node_modules/lighthouse/node_modules/semver": { "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -15895,6 +16312,8 @@ }, "node_modules/lighthouse/node_modules/ws": { "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", "engines": { @@ -15915,6 +16334,8 @@ }, "node_modules/lighthouse/node_modules/zod": { "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", "funding": { @@ -15936,7 +16357,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", - "dev": true, "license": "MIT", "dependencies": { "computed-style": "~0.1.3" @@ -15947,7 +16367,6 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, "license": "MIT" }, "node_modules/linkify-it": { @@ -16001,6 +16420,8 @@ }, "node_modules/lodash-es": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "dev": true, "license": "MIT" }, @@ -16021,6 +16442,8 @@ }, "node_modules/lodash.truncate": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, "license": "MIT" }, @@ -16031,6 +16454,8 @@ }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -16058,6 +16483,8 @@ }, "node_modules/lookup-closest-locale": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", + "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", "dev": true, "license": "MIT" }, @@ -16129,6 +16556,8 @@ }, "node_modules/map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, "license": "MIT", "engines": { @@ -16264,6 +16693,8 @@ }, "node_modules/marky": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "dev": true, "license": "Apache-2.0" }, @@ -16277,6 +16708,8 @@ }, "node_modules/mathml-tag-names": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, "license": "MIT", "funding": { @@ -16286,6 +16719,8 @@ }, "node_modules/mdn-data": { "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, "license": "CC0-1.0" }, @@ -16323,11 +16758,12 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.1.tgz", "integrity": "sha512-8Nl+i9S5D6KXnruM03Jgjb+LwSupvR13WBr4hJegaaEyobvowCVupi79y2WSiWvO1mzBWxPwEYE5feCe8vyA5w==", - "dev": true, "license": "MIT" }, "node_modules/meow": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16353,6 +16789,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -16364,6 +16802,8 @@ }, "node_modules/meow/node_modules/yargs-parser": { "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", "engines": { @@ -16406,6 +16846,8 @@ }, "node_modules/metaviewport-parser": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz", + "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", "dev": true, "license": "MIT" }, @@ -16431,6 +16873,8 @@ }, "node_modules/mime": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, "license": "MIT", "bin": { @@ -16477,6 +16921,8 @@ }, "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, "license": "MIT", "engines": { @@ -16531,6 +16977,8 @@ }, "node_modules/minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "license": "MIT", "dependencies": { @@ -16544,6 +16992,8 @@ }, "node_modules/minimist-options/node_modules/is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "license": "MIT", "engines": { @@ -16552,6 +17002,8 @@ }, "node_modules/minimist-options/node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { @@ -16604,6 +17056,8 @@ }, "node_modules/module-details-from-path": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", "dev": true, "license": "MIT" }, @@ -16611,7 +17065,6 @@ "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "dev": true, "license": "MIT", "engines": { "node": "*" @@ -16621,7 +17074,6 @@ "version": "0.5.48", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", - "dev": true, "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -16634,7 +17086,6 @@ "version": "11.18.1", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", - "dev": true, "license": "MIT", "dependencies": { "motion-utils": "^11.18.1" @@ -16644,14 +17095,12 @@ "version": "11.18.1", "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", - "dev": true, "license": "MIT" }, "node_modules/mousetrap": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==", - "dev": true, "license": "Apache-2.0 WITH LLVM-exception" }, "node_modules/mrmime": { @@ -16664,7 +17113,6 @@ }, "node_modules/ms": { "version": "2.1.3", - "dev": true, "license": "MIT" }, "node_modules/multicast-dns": { @@ -16689,7 +17137,6 @@ }, "node_modules/nanoid": { "version": "3.3.11", - "dev": true, "funding": [ { "type": "github", @@ -16704,6 +17151,22 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -16764,6 +17227,8 @@ }, "node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16778,6 +17243,8 @@ }, "node_modules/normalize-package-data/node_modules/semver": { "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -16797,6 +17264,8 @@ }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { @@ -16818,7 +17287,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", - "dev": true, "license": "BSD-3-Clause" }, "node_modules/npm-bundled": { @@ -16836,6 +17304,8 @@ }, "node_modules/npm-package-json-lint": { "version": "6.4.0", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-6.4.0.tgz", + "integrity": "sha512-cuXAJJB1Rdqz0UO6w524matlBqDBjcNt7Ru+RDIu4y6RI1gVqiWBnylrK8sPRk81gGBA0X8hJbDXolVOoTc+sA==", "dev": true, "license": "MIT", "dependencies": { @@ -16867,11 +17337,15 @@ }, "node_modules/npm-package-json-lint/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/npm-package-json-lint/node_modules/cosmiconfig": { "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", "dependencies": { @@ -16896,7 +17370,9 @@ } }, "node_modules/npm-package-json-lint/node_modules/js-yaml": { - "version": "4.1.0", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -16908,11 +17384,15 @@ }, "node_modules/npm-package-json-lint/node_modules/jsonc-parser": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, "node_modules/npm-package-json-lint/node_modules/semver": { "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -16924,6 +17404,8 @@ }, "node_modules/npm-package-json-lint/node_modules/type-fest": { "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -16979,7 +17461,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17137,6 +17618,8 @@ }, "node_modules/open": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17377,7 +17860,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -17460,7 +17942,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -17471,11 +17952,12 @@ }, "node_modules/parse-cache-control": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", "dev": true }, "node_modules/parse-json": { "version": "5.2.0", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -17524,7 +18006,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/parsel-js/-/parsel-js-1.2.2.tgz", "integrity": "sha512-AVJMlwQ4bL2Y0VvYJGk+Fp7eX4SCH2uFoNApmn4yKWACUewZ+alwW3tyoe1r5Z3aLYQTuAuPZIyGghMfO/Tlxw==", - "dev": true, "funding": [ { "type": "individual", @@ -17587,7 +18068,6 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -17617,7 +18097,6 @@ }, "node_modules/path-type": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -17630,6 +18109,8 @@ }, "node_modules/pg-int8": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "dev": true, "license": "ISC", "engines": { @@ -17638,11 +18119,15 @@ }, "node_modules/pg-protocol": { "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "dev": true, "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "dev": true, "license": "MIT", "dependencies": { @@ -17658,7 +18143,6 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -17674,6 +18158,8 @@ }, "node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", "engines": { @@ -17778,51 +18264,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/playwright": { - "version": "1.56.1", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "playwright-core": "1.56.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.56.1", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/plur": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, "license": "MIT", "dependencies": { @@ -17845,7 +18290,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "dev": true, "funding": [ { "type": "opencollective", @@ -17963,6 +18407,8 @@ }, "node_modules/postcss-import": { "version": "16.1.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.1.tgz", + "integrity": "sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18011,6 +18457,8 @@ }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true, "license": "MIT" }, @@ -18328,7 +18776,6 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", - "dev": true, "license": "MIT", "peerDependencies": { "postcss": ">4 <9" @@ -18365,11 +18812,15 @@ }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true, "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -18395,6 +18846,8 @@ }, "node_modules/postcss-scss": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", "dev": true, "funding": [ { @@ -18463,7 +18916,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/postcss-urlrebase/-/postcss-urlrebase-1.4.0.tgz", "integrity": "sha512-rRaxMmWvXrn8Rk1PqsxmaJwldRHsr0WbbASKKCZYxXwotHkM/5X/6IrwaEe8pdzpbNGCEY86yhYMN0MhgOkADA==", - "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -18474,11 +18926,12 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, "license": "MIT" }, "node_modules/postgres-array": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "dev": true, "license": "MIT", "engines": { @@ -18487,6 +18940,8 @@ }, "node_modules/postgres-bytea": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "dev": true, "license": "MIT", "engines": { @@ -18495,6 +18950,8 @@ }, "node_modules/postgres-date": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "dev": true, "license": "MIT", "engines": { @@ -18503,6 +18960,8 @@ }, "node_modules/postgres-interval": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18516,7 +18975,6 @@ "version": "10.27.2", "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", - "dev": true, "license": "MIT", "funding": { "type": "opencollective", @@ -18533,9 +18991,10 @@ }, "node_modules/prettier": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -18608,7 +19067,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -18618,7 +19076,6 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", - "dev": true, "license": "MIT" }, "node_modules/proxy-addr": { @@ -18769,11 +19226,13 @@ "license": "MIT" }, "node_modules/qified": { - "version": "0.5.1", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz", + "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.12.2" + "hookified": "^1.13.0" }, "engines": { "node": ">=20" @@ -18800,7 +19259,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "dev": true, "funding": [ { "type": "github", @@ -18830,7 +19288,6 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -18873,7 +19330,6 @@ "version": "6.11.2", "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", - "dev": true, "license": "MIT", "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", @@ -18894,7 +19350,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz", "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==", - "dev": true, "license": "MIT", "dependencies": { "autosize": "^4.0.2", @@ -18910,7 +19365,6 @@ "version": "5.6.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "dev": true, "license": "MIT", "peerDependencies": { "react": ">=16.8.0", @@ -18921,7 +19375,6 @@ "version": "9.11.1", "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.11.1.tgz", "integrity": "sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw==", - "dev": true, "license": "MIT", "dependencies": { "@date-fns/tz": "^1.4.1", @@ -18943,7 +19396,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -18965,7 +19417,6 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.5.3.tgz", "integrity": "sha512-iKwFTnAsq+IVuyF6N0Q3zjRx9DG1NMySkwWxVfM/xAOeHYH1vhvM+V2kFiq5HOIQGWouITjfltCx54mbDpMpmA==", - "dev": true, "license": "MIT", "dependencies": { "normalize-wheel": "^1.0.1", @@ -18978,7 +19429,6 @@ }, "node_modules/react-is": { "version": "18.3.1", - "dev": true, "license": "MIT" }, "node_modules/react-refresh": { @@ -18993,7 +19443,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "dev": true, "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.7", @@ -19019,7 +19468,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "dev": true, "license": "MIT", "dependencies": { "react-style-singleton": "^2.2.2", @@ -19042,7 +19490,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "dev": true, "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", @@ -19063,6 +19510,8 @@ }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "license": "MIT", "dependencies": { @@ -19071,6 +19520,8 @@ }, "node_modules/read-pkg": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", "dependencies": { @@ -19085,6 +19536,8 @@ }, "node_modules/read-pkg-up": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "license": "MIT", "dependencies": { @@ -19101,6 +19554,8 @@ }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -19109,11 +19564,15 @@ }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -19125,6 +19584,8 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -19133,6 +19594,8 @@ }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -19178,6 +19641,8 @@ }, "node_modules/redent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "license": "MIT", "dependencies": { @@ -19192,7 +19657,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "dev": true, "license": "MIT" }, "node_modules/reflect.getprototypeof": { @@ -19287,26 +19751,22 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz", "integrity": "sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ==", - "dev": true, "license": "MIT" }, "node_modules/remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "dev": true, "license": "MIT" }, "node_modules/requestidlecallback": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz", "integrity": "sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ==", - "dev": true, "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19322,6 +19782,8 @@ }, "node_modules/require-in-the-middle": { "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19337,7 +19799,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, "license": "ISC" }, "node_modules/requireindex": { @@ -19355,7 +19816,6 @@ }, "node_modules/resolve": { "version": "1.22.11", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -19416,6 +19876,16 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.3", "dev": true, @@ -19518,6 +19988,8 @@ }, "node_modules/robots-parser": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", + "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", "dev": true, "license": "MIT", "engines": { @@ -19528,7 +20000,6 @@ "version": "0.3.4", "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz", "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==", - "dev": true, "license": "MIT" }, "node_modules/rtlcss": { @@ -19607,7 +20078,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz", "integrity": "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw==", - "dev": true, "license": "MIT" }, "node_modules/rxjs": { @@ -19643,7 +20113,6 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, "license": "MIT" }, "node_modules/safe-push-apply": { @@ -19684,7 +20153,6 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -19816,7 +20284,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", - "dev": true, "license": "MIT" }, "node_modules/select-hose": { @@ -20004,7 +20471,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, "license": "ISC" }, "node_modules/set-function-length": { @@ -20120,6 +20586,8 @@ }, "node_modules/shimmer": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", "dev": true, "license": "BSD-2-Clause" }, @@ -20127,7 +20595,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "yargs": "^14.2" @@ -20140,7 +20607,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -20150,7 +20616,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -20163,7 +20628,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -20173,7 +20637,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^3.1.0", @@ -20185,7 +20648,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -20195,21 +20657,18 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, "license": "MIT" }, "node_modules/showdown/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, "license": "MIT" }, "node_modules/showdown/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^3.0.0" @@ -20222,7 +20681,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -20232,7 +20690,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^3.0.0", @@ -20246,7 +20703,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -20262,7 +20718,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.0.0" @@ -20275,7 +20730,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -20285,7 +20739,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^7.0.1", @@ -20300,7 +20753,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" @@ -20313,7 +20765,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.0", @@ -20328,14 +20779,12 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, "license": "ISC" }, "node_modules/showdown/node_modules/yargs": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, "license": "MIT", "dependencies": { "cliui": "^5.0.0", @@ -20355,7 +20804,6 @@ "version": "15.0.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dev": true, "license": "ISC", "dependencies": { "camelcase": "^5.0.0", @@ -20459,14 +20907,12 @@ "version": "0.5.11", "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz", "integrity": "sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==", - "dev": true, "license": "MIT" }, "node_modules/simple-peer": { "version": "9.11.1", "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", - "dev": true, "funding": [ { "type": "github", @@ -20496,7 +20942,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "funding": [ { "type": "github", @@ -20521,7 +20966,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -20560,6 +21004,8 @@ }, "node_modules/slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20645,7 +21091,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -20713,6 +21158,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20722,6 +21169,8 @@ }, "node_modules/spdx-correct/node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -20791,6 +21240,8 @@ }, "node_modules/speedline-core": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", + "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", "dev": true, "license": "MIT", "dependencies": { @@ -20807,6 +21258,16 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "dev": true, @@ -20863,7 +21324,6 @@ }, "node_modules/string_decoder": { "version": "1.1.1", - "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -21060,6 +21520,8 @@ }, "node_modules/strip-indent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21101,6 +21563,8 @@ }, "node_modules/stubborn-fs": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-2.0.0.tgz", + "integrity": "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==", "dev": true, "license": "MIT", "dependencies": { @@ -21109,11 +21573,15 @@ }, "node_modules/stubborn-utils": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stubborn-utils/-/stubborn-utils-1.0.2.tgz", + "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==", "dev": true, "license": "MIT" }, "node_modules/style-search": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true, "license": "ISC" }, @@ -21133,7 +21601,9 @@ } }, "node_modules/stylelint": { - "version": "16.25.0", + "version": "16.26.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.0.tgz", + "integrity": "sha512-Y/3AVBefrkqqapVYH3LBF5TSDZ1kw+0XpdKN2KchfuhMK6lQ85S4XOG4lIZLcrcS4PWBmvcY6eS2kCQFz0jukQ==", "dev": true, "funding": [ { @@ -21160,7 +21630,7 @@ "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.4", + "file-entry-cache": "^11.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -21195,6 +21665,8 @@ }, "node_modules/stylelint-config-recommended": { "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", "dev": true, "funding": [ { @@ -21216,6 +21688,8 @@ }, "node_modules/stylelint-config-recommended-scss": { "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", "dev": true, "license": "MIT", "dependencies": { @@ -21238,6 +21712,8 @@ }, "node_modules/stylelint-scss": { "version": "6.12.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", + "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", "dev": true, "license": "MIT", "dependencies": { @@ -21259,16 +21735,22 @@ }, "node_modules/stylelint-scss/node_modules/known-css-properties": { "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", "dev": true, "license": "MIT" }, "node_modules/stylelint-scss/node_modules/mdn-data": { "version": "2.25.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.25.0.tgz", + "integrity": "sha512-T2LPsjgUE/tgMmRXREVmwsux89DwWfNjiynOeXuLd2mX6jphGQ2YE3Ukz7LQ2VOFKiVZU/Ee1GqzHiipZCjymw==", "dev": true, "license": "CC0-1.0" }, "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", "dependencies": { @@ -21281,6 +21763,8 @@ }, "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -21303,6 +21787,8 @@ }, "node_modules/stylelint/node_modules/@csstools/selector-specificity": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "dev": true, "funding": [ { @@ -21324,16 +21810,22 @@ }, "node_modules/stylelint/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true, "license": "MIT" }, "node_modules/stylelint/node_modules/cosmiconfig": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { @@ -21358,25 +21850,31 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.1.4", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", + "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.13" + "flat-cache": "^6.1.19" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.18", + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", + "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^2.1.0", + "cacheable": "^2.2.0", "flatted": "^3.3.3", - "hookified": "^1.12.0" + "hookified": "^1.13.0" } }, "node_modules/stylelint/node_modules/global-modules": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "license": "MIT", "dependencies": { @@ -21388,6 +21886,8 @@ }, "node_modules/stylelint/node_modules/global-prefix": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "license": "MIT", "dependencies": { @@ -21401,6 +21901,8 @@ }, "node_modules/stylelint/node_modules/ignore": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -21408,7 +21910,9 @@ } }, "node_modules/stylelint/node_modules/js-yaml": { - "version": "4.1.0", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -21420,6 +21924,8 @@ }, "node_modules/stylelint/node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { @@ -21428,6 +21934,8 @@ }, "node_modules/stylelint/node_modules/meow": { "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "license": "MIT", "engines": { @@ -21439,6 +21947,8 @@ }, "node_modules/stylelint/node_modules/postcss-selector-parser": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", "dependencies": { @@ -21451,6 +21961,8 @@ }, "node_modules/stylelint/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -21462,6 +21974,8 @@ }, "node_modules/stylelint/node_modules/write-file-atomic": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -21476,7 +21990,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "dev": true, "license": "MIT" }, "node_modules/supports-color": { @@ -21492,6 +22005,8 @@ }, "node_modules/supports-hyperlinks": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", "dependencies": { @@ -21507,7 +22022,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -21523,6 +22037,8 @@ }, "node_modules/svg-tags": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, "node_modules/svgo": { @@ -21595,6 +22111,8 @@ }, "node_modules/table": { "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -21610,6 +22128,8 @@ }, "node_modules/table/node_modules/ajv": { "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { @@ -21625,6 +22145,8 @@ }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -21632,7 +22154,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", - "dev": true, "license": "MIT", "dependencies": { "@tannin/plural-forms": "^1.1.0" @@ -21888,6 +22409,8 @@ }, "node_modules/third-party-web": { "version": "0.27.0", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.27.0.tgz", + "integrity": "sha512-h0JYX+dO2Zr3abCQpS6/uFjujaOjA1DyDzGQ41+oFn9VW/ARiq9g5ln7qEP9+BTzDpOMyIfsfj4OvfgXAsMUSA==", "dev": true, "license": "MIT" }, @@ -21905,20 +22428,71 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tldts-core": { - "version": "7.0.17", + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", "dev": true, "license": "MIT" }, "node_modules/tldts-icann": { - "version": "7.0.17", + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.0.19.tgz", + "integrity": "sha512-PZgda8E2cXMNa7QlBbiZh3vcS8UaPTDRIBmcGPDlujSMtQLrzjvikeJxzQSqWxn3muaMJ7BsC+aL464Yl2I6cA==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.17" + "tldts-core": "^7.0.19" } }, "node_modules/tmpl": { @@ -22003,6 +22577,8 @@ }, "node_modules/trim-newlines": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, "license": "MIT", "engines": { @@ -22216,7 +22792,8 @@ }, "node_modules/typescript": { "version": "5.9.3", - "dev": true, + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -22259,7 +22836,6 @@ }, "node_modules/undici-types": { "version": "7.16.0", - "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -22314,6 +22890,41 @@ "node": ">= 0.8" } }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.4", "dev": true, @@ -22421,7 +23032,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -22457,7 +23067,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "dev": true, "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -22467,7 +23076,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "dev": true, "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", @@ -22490,7 +23098,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "dev": true, "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -22498,7 +23105,6 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/utils-merge": { @@ -22532,6 +23138,8 @@ }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -22541,6 +23149,8 @@ }, "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22550,6 +23160,8 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", "engines": { @@ -22631,11 +23243,15 @@ }, "node_modules/web-vitals": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/webdriver-bidi-protocol": { - "version": "0.3.8", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz", + "integrity": "sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==", "dev": true, "license": "Apache-2.0" }, @@ -23124,6 +23740,8 @@ }, "node_modules/when-exit": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.5.tgz", + "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==", "dev": true, "license": "MIT" }, @@ -23211,7 +23829,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, "license": "ISC" }, "node_modules/which-typed-array": { @@ -23301,7 +23918,7 @@ }, "node_modules/ws": { "version": "8.18.3", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -23349,6 +23966,8 @@ }, "node_modules/xdg-basedir": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "license": "MIT", "engines": { @@ -23373,6 +23992,8 @@ }, "node_modules/xtend": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "license": "MIT", "engines": { @@ -23383,7 +24004,6 @@ "version": "9.0.12", "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.12.tgz", "integrity": "sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==", - "dev": true, "license": "MIT", "dependencies": { "lib0": "^0.2.74" @@ -23404,7 +24024,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", - "dev": true, "license": "MIT", "dependencies": { "lib0": "^0.2.85" @@ -23425,7 +24044,6 @@ "version": "10.2.6", "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.6.tgz", "integrity": "sha512-1kZ4YYwksFZi8+l8mTebVX9vW6Q5MnqxMkvNU700X5dBE38usurt/JgeXSIQRpK3NwUYYb9y63Jn9FMpMH6/vA==", - "dev": true, "license": "MIT", "dependencies": { "lib0": "^0.2.42", @@ -23464,7 +24082,6 @@ }, "node_modules/yaml": { "version": "1.10.2", - "dev": true, "license": "ISC", "engines": { "node": ">= 6" @@ -23508,7 +24125,6 @@ "version": "13.6.27", "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", - "dev": true, "license": "MIT", "dependencies": { "lib0": "^0.2.99" diff --git a/package.json b/package.json index 40c75539..df809d78 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "description": "AI experiments and capabilities for WordPress.", "license": "GPL-2.0-or-later", "repository": { - "type": "git", - "url": "git+https://github.com/WordPress/ai.git" - }, + "type": "git", + "url": "git+https://github.com/WordPress/ai.git" + }, "files": [ "build", "includes", @@ -32,25 +32,27 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", + "@wordpress/env": "^10.34.0", + "@wordpress/eslint-plugin": "^22.21.0", + "@wordpress/prettier-config": "^4.34.0", + "@wordpress/scripts": "^31.0.0", + "eslint-import-resolver-typescript": "^4.4.4", + "prettier": "^3.6.2", + "webpack-remove-empty-scripts": "^1.1.1" + }, + "dependencies": { "@wordpress/block-editor": "^15.7.0", "@wordpress/components": "^30.7.0", "@wordpress/compose": "^7.34.0", "@wordpress/data": "^10.34.0", "@wordpress/editor": "^14.34.0", "@wordpress/element": "^6.34.0", - "@wordpress/env": "^10.34.0", - "@wordpress/eslint-plugin": "^22.20.0", - "@wordpress/hooks": "^4.34.0", + "@wordpress/hooks": "^4.35.0", "@wordpress/i18n": "^6.7.0", + "@wordpress/icons": "^11.1.0", "@wordpress/plugins": "^7.34.0", - "@wordpress/prettier-config": "^4.34.0", - "@wordpress/scripts": "^30.27.0", "react": "^18.3.1", - "typescript": "^5.4.5", - "webpack-remove-empty-scripts": "^1.1.1" - }, - "dependencies": { - "@wordpress/icons": "^11.1.0" + "typescript": "^5.9.3" }, "overrides": { "webpack-dev-server@<=5.2.0": ">=5.2.1" From fc4d17891c0f6f016d1809f9603e8d4e0134db09 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 20:54:25 -0700 Subject: [PATCH 34/39] Fix new lint errors --- package-lock.json | 68 +++++++++++++++++++ package.json | 1 + src/experiments/example-experiment/index.tsx | 14 +++- .../components/TitleToolbar.tsx | 21 +++--- .../components/TitleToolbarWrapper.tsx | 8 ++- src/experiments/title-generation/index.tsx | 8 ++- webpack.config.js | 10 +-- 7 files changed, 111 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 448f96a7..6b0f7f57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@wordpress/hooks": "^4.35.0", "@wordpress/i18n": "^6.7.0", "@wordpress/icons": "^11.1.0", + "@wordpress/notices": "^5.35.0", "@wordpress/plugins": "^7.34.0", "react": "^18.3.1", "typescript": "^5.9.3" @@ -4131,6 +4132,23 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@playwright/test": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.17", "dev": true, @@ -18264,6 +18282,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/playwright": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright-core": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", diff --git a/package.json b/package.json index df809d78..eff80ffd 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@wordpress/hooks": "^4.35.0", "@wordpress/i18n": "^6.7.0", "@wordpress/icons": "^11.1.0", + "@wordpress/notices": "^5.35.0", "@wordpress/plugins": "^7.34.0", "react": "^18.3.1", "typescript": "^5.9.3" diff --git a/src/experiments/example-experiment/index.tsx b/src/experiments/example-experiment/index.tsx index 7bdd0d96..780b6870 100644 --- a/src/experiments/example-experiment/index.tsx +++ b/src/experiments/example-experiment/index.tsx @@ -1,12 +1,20 @@ -// Placeholder used as an example. - +/** + * External dependencies + */ import React from 'react'; + +/** + * WordPress dependencies + */ import { __ } from '@wordpress/i18n'; +/** + * Internal dependencies + */ import './index.scss'; const ExampleExperiment = () => { - return
{__('Example Experiment', 'ai')}
; + return
{ __( 'Example Experiment', 'ai' ) }
; }; export default ExampleExperiment; diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 08abf5cd..48bf690d 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -3,9 +3,13 @@ */ /** - * External Dependencies. + * External dependencies */ import React from 'react'; + +/** + * WordPress dependencies + */ import { executeAbility } from '@wordpress/abilities'; import { Button, @@ -17,10 +21,11 @@ import { ToolbarButton, } from '@wordpress/components'; import { dispatch, select, useDispatch } from '@wordpress/data'; -import { PostTypeSupportCheck } from '@wordpress/editor'; +import { store as editorStore, PostTypeSupportCheck } from '@wordpress/editor'; import { useState } from '@wordpress/element'; import { update } from '@wordpress/icons'; import { __ } from '@wordpress/i18n'; +import { store as noticesStore } from '@wordpress/notices'; const { aiTitleGenerationData } = window as any; @@ -148,11 +153,11 @@ async function generateTitles( * @return {JSX.Element} The toolbar component. */ export default function TitleToolbar(): JSX.Element | null { - const postId = select('core/editor').getCurrentPostId(); - const content = select('core/editor').getEditedPostContent(); - const title = select('core/editor').getEditedPostAttribute('title'); + const postId = select(editorStore).getCurrentPostId(); + const content = select(editorStore).getEditedPostContent(); + const title = select(editorStore).getEditedPostAttribute('title'); - const { editPost } = useDispatch('core/editor'); + const { editPost } = useDispatch(editorStore); const [isGenerating, setIsGenerating] = useState(false); const [isOpen, setOpen] = useState(false); @@ -174,7 +179,7 @@ export default function TitleToolbar(): JSX.Element | null { */ const handleGenerate = async () => { setIsGenerating(true); - (dispatch('core/notices') as any).removeNotice( + (dispatch(noticesStore) as any).removeNotice( 'ai_title_generation_error' ); @@ -183,7 +188,7 @@ export default function TitleToolbar(): JSX.Element | null { setTitles(generatedTitles); openModal(); } catch (error: any) { - (dispatch('core/notices') as any).createErrorNotice(error, { + (dispatch(noticesStore) as any).createErrorNotice(error, { id: 'ai_title_generation_error', isDismissible: true, }); diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index 4ef952cd..798284a1 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -6,13 +6,17 @@ */ /** - * External Dependencies. + * External dependencies */ import React from 'react'; + +/** + * WordPress dependencies + */ import { createRoot, useEffect } from '@wordpress/element'; /** - * Internal Dependencies. + * Internal dependencies */ import TitleToolbar from './TitleToolbar'; diff --git a/src/experiments/title-generation/index.tsx b/src/experiments/title-generation/index.tsx index a41c951c..d5ff233f 100644 --- a/src/experiments/title-generation/index.tsx +++ b/src/experiments/title-generation/index.tsx @@ -3,16 +3,20 @@ */ /** - * External Dependencies. + * External dependencies */ import React from 'react'; + +/** + * WordPress dependencies + */ import { BlockControls } from '@wordpress/block-editor'; import { createHigherOrderComponent } from '@wordpress/compose'; import { addFilter } from '@wordpress/hooks'; import { registerPlugin } from '@wordpress/plugins'; /** - * Internal Dependencies. + * Internal dependencies */ import TitleToolbar from './components/TitleToolbar'; import { TitleToolbarWrapper } from './components/TitleToolbarWrapper'; diff --git a/webpack.config.js b/webpack.config.js index d86d5981..607d2980 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,10 +1,12 @@ -// WordPress webpack config. +/** + * WordPress dependencies + */ const defaultConfig = require('@wordpress/scripts/config/webpack.config'); -// Plugins. +/** + * External dependencies + */ const RemoveEmptyScriptsPlugin = require('webpack-remove-empty-scripts'); - -// Utilities. const path = require('path'); // Extend the default webpack config. From 4b89dea780d94cdacae88d194a91b66fc95deefb Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Mon, 24 Nov 2025 21:06:27 -0700 Subject: [PATCH 35/39] Remove auto formatting in our JS lint test so we can see failures --- .github/workflows/test.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9037efde..ab3273c3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -277,8 +277,5 @@ jobs: - name: Install NPM dependencies run: npm ci - - name: Run Prettier format check - run: npm run format - - name: Run JavaScript linting run: npm run lint:js From 277c054a0142a6ae8c7342e9ba844923a030e0af Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Tue, 25 Nov 2025 12:41:14 -0700 Subject: [PATCH 36/39] Remove dependencies we don't need to ensure wp-prettier is installed --- package-lock.json | 345 +--------------------------------------------- package.json | 8 +- 2 files changed, 9 insertions(+), 344 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b0f7f57..e9f219bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,19 +20,15 @@ "@wordpress/icons": "^11.1.0", "@wordpress/notices": "^5.35.0", "@wordpress/plugins": "^7.34.0", - "react": "^18.3.1", - "typescript": "^5.9.3" + "react": "^18.3.1" }, "devDependencies": { "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", "@wordpress/env": "^10.34.0", - "@wordpress/eslint-plugin": "^22.21.0", - "@wordpress/prettier-config": "^4.34.0", "@wordpress/scripts": "^31.0.0", - "eslint-import-resolver-typescript": "^4.4.4", - "prettier": "^3.6.2", + "typescript": "^5.9.3", "webpack-remove-empty-scripts": "^1.1.1" }, "engines": { @@ -1985,40 +1981,6 @@ "url": "https://github.com/sponsors/JounQin" } }, - "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -3395,19 +3357,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "dev": true, @@ -5364,17 +5313,6 @@ "node": ">=10.13.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, @@ -6592,34 +6530,6 @@ "dev": true, "license": "ISC" }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", @@ -6634,233 +6544,6 @@ "darwin" ] }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@use-gesture/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", @@ -8543,21 +8226,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@wordpress/scripts/node_modules/prettier": { - "name": "wp-prettier", - "version": "3.0.3", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/@wordpress/server-side-render": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-6.11.0.tgz", @@ -19058,11 +18726,11 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "name": "wp-prettier", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz", + "integrity": "sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -22862,6 +22530,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index eff80ffd..fb8b80fd 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,8 @@ "@types/react-dom": "^18.2.18", "@types/wordpress__blocks": "^12.5.18", "@wordpress/env": "^10.34.0", - "@wordpress/eslint-plugin": "^22.21.0", - "@wordpress/prettier-config": "^4.34.0", "@wordpress/scripts": "^31.0.0", - "eslint-import-resolver-typescript": "^4.4.4", - "prettier": "^3.6.2", + "typescript": "^5.9.3", "webpack-remove-empty-scripts": "^1.1.1" }, "dependencies": { @@ -52,8 +49,7 @@ "@wordpress/icons": "^11.1.0", "@wordpress/notices": "^5.35.0", "@wordpress/plugins": "^7.34.0", - "react": "^18.3.1", - "typescript": "^5.9.3" + "react": "^18.3.1" }, "overrides": { "webpack-dev-server@<=5.2.0": ">=5.2.1" From c02047edd4efed800aa67153a8ebca9a15a015a4 Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Tue, 25 Nov 2025 12:43:59 -0700 Subject: [PATCH 37/39] Lint fixes --- .../components/TitleToolbar.tsx | 148 +++++++++--------- .../components/TitleToolbarWrapper.tsx | 128 +++++++-------- src/experiments/title-generation/index.tsx | 18 +-- webpack.config.js | 10 +- 4 files changed, 153 insertions(+), 151 deletions(-) diff --git a/src/experiments/title-generation/components/TitleToolbar.tsx b/src/experiments/title-generation/components/TitleToolbar.tsx index 48bf690d..c252eed8 100644 --- a/src/experiments/title-generation/components/TitleToolbar.tsx +++ b/src/experiments/title-generation/components/TitleToolbar.tsx @@ -39,7 +39,7 @@ const { aiTitleGenerationData } = window as any; * @param {Function} props.onSelect Callback when this title is selected. * @return {JSX.Element} The rendered title option. */ -function TitleOption({ +function TitleOption( { title, index, onChange, @@ -47,25 +47,25 @@ function TitleOption({ }: { title: string; index: number; - onChange: (value: string) => void; - onSelect: (title: string, index: number) => void; -}): JSX.Element { + onChange: ( value: string ) => void; + onSelect: ( title: string, index: number ) => void; +} ): JSX.Element { return ( ); @@ -80,36 +80,36 @@ function TitleOption({ * @param {Function} props.onSelect Callback when a title is selected. * @return {JSX.Element | null} The rendered titles. */ -function TitleOptionsList({ +function TitleOptionsList( { titles: titlesToRender, onTitleChange, onSelect, }: { titles: string[]; - onTitleChange: (newTitle: string[]) => void; - onSelect: (title: string, index: number) => void; -}): JSX.Element | null { - if (!titlesToRender || titlesToRender.length === 0) { + onTitleChange: ( newTitle: string[] ) => void; + onSelect: ( title: string, index: number ) => void; +} ): JSX.Element | null { + if ( ! titlesToRender || titlesToRender.length === 0 ) { return null; } return ( - {titlesToRender.map((title: string, i: number) => ( + { titlesToRender.map( ( title: string, i: number ) => ( { + key={ `title-${ i }` } + title={ title } + index={ i } + onChange={ ( value: string ) => { onTitleChange( - titlesToRender.map((item, index) => + titlesToRender.map( ( item, index ) => index === i ? value : item ) ); - }} - onSelect={onSelect} + } } + onSelect={ onSelect } /> - ))} + ) ) } ); } @@ -124,12 +124,12 @@ function TitleOptionsList({ async function generateTitles( postId: number, content: string -): Promise { - return executeAbility('ai/title-generation', { +): Promise< string[] > { + return executeAbility( 'ai/title-generation', { content, post_id: postId, - }) - .then((response) => { + } ) + .then( ( response ) => { if ( response && typeof response === 'object' && @@ -139,10 +139,10 @@ async function generateTitles( } return []; - }) - .catch((error) => { - throw new Error(`Error generating titles: ${error.message}`); - }); + } ) + .catch( ( error ) => { + throw new Error( `Error generating titles: ${ error.message }` ); + } ); } /** @@ -153,48 +153,48 @@ async function generateTitles( * @return {JSX.Element} The toolbar component. */ export default function TitleToolbar(): JSX.Element | null { - const postId = select(editorStore).getCurrentPostId(); - const content = select(editorStore).getEditedPostContent(); - const title = select(editorStore).getEditedPostAttribute('title'); + const postId = select( editorStore ).getCurrentPostId(); + const content = select( editorStore ).getEditedPostContent(); + const title = select( editorStore ).getEditedPostAttribute( 'title' ); - const { editPost } = useDispatch(editorStore); + const { editPost } = useDispatch( editorStore ); - const [isGenerating, setIsGenerating] = useState(false); - const [isOpen, setOpen] = useState(false); - const [titles, setTitles] = useState([]); + const [ isGenerating, setIsGenerating ] = useState< boolean >( false ); + const [ isOpen, setOpen ] = useState< boolean >( false ); + const [ titles, setTitles ] = useState< string[] >( [] ); - const openModal = () => setOpen(true); + const openModal = () => setOpen( true ); const closeModal = () => { - setOpen(false); - setTitles([]); + setOpen( false ); + setTitles( [] ); }; const hasTitle = title.trim().length > 0; const buttonLabel = hasTitle - ? __('Re-generate', 'ai') - : __('Generate', 'ai'); + ? __( 'Re-generate', 'ai' ) + : __( 'Generate', 'ai' ); /** * Handles the generate/re-generate button click. */ const handleGenerate = async () => { - setIsGenerating(true); - (dispatch(noticesStore) as any).removeNotice( + setIsGenerating( true ); + ( dispatch( noticesStore ) as any ).removeNotice( 'ai_title_generation_error' ); try { - const generatedTitles = await generateTitles(postId, content); - setTitles(generatedTitles); + const generatedTitles = await generateTitles( postId, content ); + setTitles( generatedTitles ); openModal(); - } catch (error: any) { - (dispatch(noticesStore) as any).createErrorNotice(error, { + } catch ( error: any ) { + ( dispatch( noticesStore ) as any ).createErrorNotice( error, { id: 'ai_title_generation_error', isDismissible: true, - }); - setTitles([]); + } ); + setTitles( [] ); } finally { - setIsGenerating(false); + setIsGenerating( false ); } }; @@ -203,15 +203,15 @@ export default function TitleToolbar(): JSX.Element | null { * * @param {string} selectedTitle The selected title. */ - const handleSelectTitle = async (selectedTitle: string) => { - editPost({ + const handleSelectTitle = async ( selectedTitle: string ) => { + editPost( { title: selectedTitle, - }); + } ); closeModal(); }; // Ensure the experiment is enabled. - if (!aiTitleGenerationData?.enabled) { + if ( ! aiTitleGenerationData?.enabled ) { return null; } @@ -220,33 +220,33 @@ export default function TitleToolbar(): JSX.Element | null { - {buttonLabel} + { buttonLabel } - {isOpen && ( + { isOpen && ( - {titles && ( + { titles && ( - )} + ) } - )} + ) } ); } diff --git a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx index 798284a1..694a79cd 100644 --- a/src/experiments/title-generation/components/TitleToolbarWrapper.tsx +++ b/src/experiments/title-generation/components/TitleToolbarWrapper.tsx @@ -40,22 +40,22 @@ function createRetry( let timeoutId: NodeJS.Timeout | null = null; const retry = () => { - if (retryCount < maxRetries) { + if ( retryCount < maxRetries ) { retryCount++; - timeoutId = setTimeout(() => { + timeoutId = setTimeout( () => { timeoutId = null; - if (checkFn()) { + if ( checkFn() ) { callback(); } else { retry(); } - }, delay); + }, delay ); } }; // Store timeout ID for cleanup const start = () => { - if (!timeoutId) { + if ( ! timeoutId ) { retry(); } }; @@ -79,7 +79,7 @@ function createFocusBlurHandlers( return { focus: onFocus, blur: () => { - setTimeout(onBlur, blurDelay); + setTimeout( onBlur, blurDelay ); }, }; } @@ -102,12 +102,12 @@ function setupEventListeners( const focusEvent = useFocusIn ? 'focusin' : 'focus'; const blurEvent = useFocusIn ? 'focusout' : 'blur'; - element.addEventListener(focusEvent, handlers.focus); - element.addEventListener(blurEvent, handlers.blur); + element.addEventListener( focusEvent, handlers.focus ); + element.addEventListener( blurEvent, handlers.blur ); return () => { - element.removeEventListener(focusEvent, handlers.focus); - element.removeEventListener(blurEvent, handlers.blur); + element.removeEventListener( focusEvent, handlers.focus ); + element.removeEventListener( blurEvent, handlers.blur ); }; } @@ -119,11 +119,11 @@ function setupEventListeners( * @return {JSX.Element} The wrapper component. */ function TitleToolbarWrapper(): JSX.Element { - useEffect(() => { + useEffect( () => { let isAttached = false; - let root: ReturnType | null = null; - let removeTitleListeners: (() => void) | null = null; - let removeToolbarListeners: (() => void) | null = null; + let root: ReturnType< typeof createRoot > | null = null; + let removeTitleListeners: ( () => void ) | null = null; + let removeToolbarListeners: ( () => void ) | null = null; let observer: MutationObserver | null = null; let titleInput: HTMLElement | null = null; let toolbarContainer: HTMLElement | null = null; @@ -136,7 +136,7 @@ function TitleToolbarWrapper(): JSX.Element { 'iframe[name="editor-canvas"], iframe.wp-block-editor-iframe__iframe' ) as HTMLIFrameElement | null; - if (iframe && iframe.contentDocument) { + if ( iframe && iframe.contentDocument ) { return iframe.contentDocument; } @@ -146,19 +146,19 @@ function TitleToolbarWrapper(): JSX.Element { // Check if focus is on title input or toolbar const isFocusedOnTitleOrToolbar = (): boolean => { const editorDoc = getEditorDocument(); - if (!editorDoc) { + if ( ! editorDoc ) { return false; } const activeElement = editorDoc.activeElement as HTMLElement | null; - if (!activeElement) { + if ( ! activeElement ) { return false; } // Check if focus is on title input if ( activeElement === titleInput || - titleInput?.contains(activeElement) + titleInput?.contains( activeElement ) ) { return true; } @@ -167,11 +167,11 @@ function TitleToolbarWrapper(): JSX.Element { // Also check if dropdown menu is open (button with is-opened class) if ( toolbarContainer && - (activeElement === toolbarContainer || - toolbarContainer.contains(activeElement) || + ( activeElement === toolbarContainer || + toolbarContainer.contains( activeElement ) || toolbarContainer.querySelector( '.components-dropdown-menu .is-opened' - )) + ) ) ) { return true; } @@ -181,20 +181,20 @@ function TitleToolbarWrapper(): JSX.Element { // Show/hide toolbar based on focus const showToolbar = () => { - if (toolbarContainer) { + if ( toolbarContainer ) { toolbarContainer.style.display = 'flex'; } }; const hideToolbar = () => { - if (toolbarContainer) { + if ( toolbarContainer ) { toolbarContainer.style.display = 'none'; } }; // Check focus state and show/hide toolbar accordingly const updateToolbarVisibility = () => { - if (isFocusedOnTitleOrToolbar()) { + if ( isFocusedOnTitleOrToolbar() ) { showToolbar(); } else { hideToolbar(); @@ -204,12 +204,12 @@ function TitleToolbarWrapper(): JSX.Element { // Wait for the editor to be ready const findAndAttachToolbar = () => { // Don't try if already attached - if (isAttached) { + if ( isAttached ) { return; } const editorDoc = getEditorDocument(); - if (!editorDoc) { + if ( ! editorDoc ) { // Editor iframe not found yet, retry const retryEditor = createRetry( () => getEditorDocument() !== null, @@ -221,33 +221,35 @@ function TitleToolbarWrapper(): JSX.Element { } // Check if toolbar wrapper already exists in the editor document - if (editorDoc.querySelector('.ai-title-toolbar-wrapper')) { + if ( editorDoc.querySelector( '.ai-title-toolbar-wrapper' ) ) { isAttached = true; return; } // Find the title field container in normal editing mode - const selectors = ['.editor-post-title__input']; + const selectors = [ '.editor-post-title__input' ]; let foundTitleInput: HTMLElement | null = null; - for (const selector of selectors) { + for ( const selector of selectors ) { foundTitleInput = editorDoc.querySelector( selector ) as HTMLElement; - if (foundTitleInput) { + if ( foundTitleInput ) { break; } } - if (!foundTitleInput) { + if ( ! foundTitleInput ) { // Title field not found yet, retry const retryTitle = createRetry( () => { const doc = getEditorDocument(); - if (!doc) { + if ( ! doc ) { return false; } - return !!doc.querySelector('.editor-post-title__input'); + return !! doc.querySelector( + '.editor-post-title__input' + ); }, findAndAttachToolbar, 10 @@ -259,7 +261,7 @@ function TitleToolbarWrapper(): JSX.Element { titleInput = foundTitleInput; // Check if we've already attached the toolbar to this element - if (titleInput.closest('.ai-title-toolbar-wrapper')) { + if ( titleInput.closest( '.ai-title-toolbar-wrapper' ) ) { isAttached = true; return; } @@ -267,7 +269,7 @@ function TitleToolbarWrapper(): JSX.Element { // Find the container that wraps the title input const titleContainer = titleInput.parentElement; - if (!titleContainer) { + if ( ! titleContainer ) { return; } @@ -275,28 +277,28 @@ function TitleToolbarWrapper(): JSX.Element { const nextSibling = titleInput.nextSibling; // Create a wrapper container that will hold both the toolbar and the title input - wrapperContainer = editorDoc.createElement('div'); + wrapperContainer = editorDoc.createElement( 'div' ); wrapperContainer.className = 'ai-title-toolbar-wrapper'; wrapperContainer.style.cssText = 'position: relative;'; // Create a container for our toolbar - toolbarContainer = editorDoc.createElement('div'); + toolbarContainer = editorDoc.createElement( 'div' ); toolbarContainer.className = 'ai-title-toolbar-container'; toolbarContainer.style.cssText = 'display: none; position: absolute; z-index: 1000; top: -60px;'; // Append the toolbar container to the wrapper - wrapperContainer.appendChild(toolbarContainer); + wrapperContainer.appendChild( toolbarContainer ); // Move the title input into the wrapper container - wrapperContainer.appendChild(titleInput); + wrapperContainer.appendChild( titleInput ); // Insert the wrapper container where the title input was - titleContainer.insertBefore(wrapperContainer, nextSibling); + titleContainer.insertBefore( wrapperContainer, nextSibling ); // Render the toolbar into the container - root = createRoot(toolbarContainer); - root.render(); + root = createRoot( toolbarContainer ); + root.render( ); // Create and attach focus/blur handlers for title input const titleHandlers = createFocusBlurHandlers( @@ -320,7 +322,7 @@ function TitleToolbarWrapper(): JSX.Element { ); // Check initial focus state - if (editorDoc.activeElement === titleInput) { + if ( editorDoc.activeElement === titleInput ) { showToolbar(); } @@ -328,65 +330,65 @@ function TitleToolbarWrapper(): JSX.Element { }; // Start looking for the title field after a short delay to ensure iframe is ready - const initialTimeout = setTimeout(() => { + const initialTimeout = setTimeout( () => { findAndAttachToolbar(); - }, 100); + }, 100 ); // Also listen for DOM changes in the editor iframe // But only check if we haven't attached yet const setupObserver = () => { const editorDoc = getEditorDocument(); - if (editorDoc && !observer) { - observer = new MutationObserver((mutations, obs) => { + if ( editorDoc && ! observer ) { + observer = new MutationObserver( ( mutations, obs ) => { if ( - !isAttached && - !editorDoc.querySelector('.ai-title-toolbar-wrapper') + ! isAttached && + ! editorDoc.querySelector( '.ai-title-toolbar-wrapper' ) ) { findAndAttachToolbar(); - } else if (isAttached) { + } else if ( isAttached ) { // Disconnect observer once toolbar is attached obs.disconnect(); } - }); + } ); - observer.observe(editorDoc.body, { + observer.observe( editorDoc.body, { childList: true, subtree: true, - }); + } ); } }; // Try to set up observer after a delay to ensure iframe is loaded - const observerTimeout = setTimeout(setupObserver, 500); + const observerTimeout = setTimeout( setupObserver, 500 ); // Cleanup function return () => { - if (observer) { + if ( observer ) { observer.disconnect(); } - clearTimeout(initialTimeout); - clearTimeout(observerTimeout); + clearTimeout( initialTimeout ); + clearTimeout( observerTimeout ); // Remove event listeners - if (removeTitleListeners) { + if ( removeTitleListeners ) { removeTitleListeners(); } - if (removeToolbarListeners) { + if ( removeToolbarListeners ) { removeToolbarListeners(); } // Clean up toolbar and wrapper - if (root) { + if ( root ) { root.unmount(); } - if (wrapperContainer) { + if ( wrapperContainer ) { wrapperContainer.remove(); - } else if (toolbarContainer) { + } else if ( toolbarContainer ) { // Fallback: if wrapper wasn't created, just remove toolbar toolbarContainer.remove(); } }; - }, []); + }, [] ); // This component doesn't render anything itself // It uses useEffect to attach to the DOM diff --git a/src/experiments/title-generation/index.tsx b/src/experiments/title-generation/index.tsx index d5ff233f..09115ad6 100644 --- a/src/experiments/title-generation/index.tsx +++ b/src/experiments/title-generation/index.tsx @@ -23,28 +23,28 @@ import { TitleToolbarWrapper } from './components/TitleToolbarWrapper'; // For template preview mode (when title is a block) // Use filter to add toolbar to post-title block -const withTitleToolbar = createHigherOrderComponent((BlockEdit) => { - return (props: any) => { +const withTitleToolbar = createHigherOrderComponent( ( BlockEdit ) => { + return ( props: any ) => { // Check if this is the post-title block - if (props.name !== 'core/post-title') { - return ; + if ( props.name !== 'core/post-title' ) { + return ; } return ( <> - + ); }; -}, 'withTitleToolbar'); +}, 'withTitleToolbar' ); -addFilter('editor.BlockEdit', 'ai/title-generation', withTitleToolbar); +addFilter( 'editor.BlockEdit', 'ai/title-generation', withTitleToolbar ); // For normal editing mode (when title is not a block) // Register a plugin that uses DOM manipulation to attach toolbar -registerPlugin('ai-title-generation-normal-mode', { +registerPlugin( 'ai-title-generation-normal-mode', { render: TitleToolbarWrapper, -}); +} ); diff --git a/webpack.config.js b/webpack.config.js index 607d2980..49a296e9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,13 +1,13 @@ /** * WordPress dependencies */ -const defaultConfig = require('@wordpress/scripts/config/webpack.config'); +const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); /** * External dependencies */ -const RemoveEmptyScriptsPlugin = require('webpack-remove-empty-scripts'); -const path = require('path'); +const RemoveEmptyScriptsPlugin = require( 'webpack-remove-empty-scripts' ); +const path = require( 'path' ); // Extend the default webpack config. module.exports = { @@ -37,8 +37,8 @@ module.exports = { // Removes the empty `.js` files generated by webpack but // sets it after WP has generated its `*.asset.php` file. - new RemoveEmptyScriptsPlugin({ + new RemoveEmptyScriptsPlugin( { stage: RemoveEmptyScriptsPlugin.STAGE_AFTER_PROCESS_PLUGINS, - }), + } ), ], }; From fb62804ac106c6ce3494468d2688d4291774bf1d Mon Sep 17 00:00:00 2001 From: Darin Kotter Date: Tue, 25 Nov 2025 16:09:40 -0700 Subject: [PATCH 38/39] Revert back to old prettier file --- .prettierrc | 1 - .prettierrc.cjs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) delete mode 100644 .prettierrc create mode 100644 .prettierrc.cjs diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 23537657..00000000 --- a/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -"@wordpress/prettier-config" diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 00000000..966ae862 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,30 @@ +const wpConfig = require( '@wordpress/prettier-config' ); + +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +const config = { + ...wpConfig, + overrides: [ + ...wpConfig.overrides, + // Only override where WordPress config conflicts with .editorconfig + { + files: '*.md', + options: { + tabWidth: 2, + useTabs: false, + }, + }, + { + files: [ '*.yml', '*.yaml' ], + options: { + tabWidth: 2, + useTabs: false, + singleQuote: true, + }, + }, + ], +}; + +module.exports = config; From 77ac717a6cd8a183c531fabc1dedf4bf970e0c9b Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Tue, 25 Nov 2025 22:12:34 -0600 Subject: [PATCH 39/39] Update minimum required WordPress version to 6.8 --- ai.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai.php b/ai.php index 4feb95da..1f6e8497 100644 --- a/ai.php +++ b/ai.php @@ -12,7 +12,7 @@ * Plugin URI: https://github.com/WordPress/ai * Description: AI experiments and capabilities for WordPress. * Version: 0.1.0 - * Requires at least: 6.9 + * Requires at least: 6.8 * Requires PHP: 7.4 * Author: WordPress.org Contributors * Author URI: https://make.wordpress.org/ai/