diff --git a/.cspell.json b/.cspell.json index 514e74b7a0..15a2650ada 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,11 +1,16 @@ { "version": "0.2", + "ignoreRegExpList": [ + "github:[\\w.@/#-]+" + ], "ignorePaths": [ + "AGENTS.md", "package-lock.json", "bun.lock", "bun.lockb", "composer.lock", "composer.json", + "phpstan-baseline.neon", "build/**", "**/*.min.js", "**/*.asset.php", @@ -16,10 +21,14 @@ "**/*.svg" ], "words": [ + "absint", "ABSPATH", "advancedbtn", "advancedgallery", "advancedheading", + "advbtn", + "affordance", + "affordances", "algoliasearch", "alignleft", "alignright", @@ -28,46 +37,76 @@ "blocksy", "bloginfo", "britner", + "btnbg", + "btnbghover", + "btncolor", + "btncolorhover", "bunfig", "bunx", + "centralise", "changelogger", + "Checkboard", + "codecept", "codeception", "colapse", "commoditize", + "Consolas", "crawlable", "curlopt", "customizer", + "dashicon", + "dashicons", + "describedby", "designlibrary", "diffcs", "distignore", "dotlottie", "dotstyle", + "DTCG", "earlybird", + "Extralargeheadingsizewrapped", "exwide", + "figcaption", "flexwrap", "fluentcrm", "fluidcarousel", + "formalises", + "Fullwidth", "gfont", "gfonts", "ghernkadence", + "glightbox", + "grecaptcha", "gridvisualizer", "gslide", "gulpfile", "haspopup", "hcaptcha", "headerfunction", + "hoverable", "httpheader", "iconlist", + "iframed", "inbetween", "infobox", "innerblocks", + "Inno", "ithemes", "kadence", "kadenceblocks", "kadencewp", + "kbcss", "kbcustom", "kbcustomicons", + "ktanimate", + "ktanimateadd", + "ktanimatepreview", + "ktanimatereveal", + "ktanimateswipe", + "ktdynamic", + "ktgooglefonts", "lightbox", + "LONGTEXT", "lottieanimation", "lottiefiles", "lucatume", @@ -76,6 +115,9 @@ "markformat", "mbstring", "memize", + "Menlo", + "menuitemcheckbox", + "menuitemradio", "multisite", "multisites", "navigations", @@ -85,22 +127,41 @@ "oakesjosh", "pagenow", "patchstack", + "PCRE", "pexels", "phar", "phpcs", "phpstan", + "pickable", "postfields", "progressbar", "puprc", "recaptcha", + "recognised", + "renameable", + "repointed", + "Reselecting", + "resends", "resizer", + "retarget", + "retargeted", + "retargets", "returntransfer", + "Ritner", "rowlayout", + "rrggbb", + "rrggbbaa", + "Sabberworm", "scroller", "shivammathur", "singlebtn", "slic", "slidy", + "slugified", + "slugifies", + "slugify", + "slugifying", + "snackbars", "solidwp", "splide", "splidejs", @@ -109,12 +170,18 @@ "stellarwp", "subteam", "sunsetting", + "syncable", "tabindex", "tableofcontents", + "textcolor", "thumbslider", "trailingslashit", "uncollapsed", "undefed", + "unitless", + "unrecognised", + "unrepresentable", + "unslash", "userrole", "videopopup", "vsdesk", @@ -124,9 +191,14 @@ "webp", "woocommerce", "woodardmc", + "worktrees", + "wpbody", + "wpcontent", "wpdb", + "wpfooter", "wpml", "wpunit", - "writefunction" + "writefunction", + "xlarge" ] } diff --git a/.eslintrc.js b/.eslintrc.js index 98ac5d3008..f3337c8008 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -132,6 +132,18 @@ const eslintConfig = { 'no-var': 'off', }, }, + { + // The design-token surfaces rely on hook-shaped helpers; keep the hook rules on here so a + // conditional hook call can't land silently while the repo-wide rule stays off. + files: [ + 'src/extension/variant-picker/**', + 'src/extension/token-indicators/**', + 'src/extension/design-tokens/**', + ], + rules: { + 'react-hooks/rules-of-hooks': 'error', + }, + }, ], ignorePatterns: [], }; diff --git a/.github/workflows/phpcs.yml b/.github/workflows/phpcs.yml index 79561f39cd..4e6d507434 100644 --- a/.github/workflows/phpcs.yml +++ b/.github/workflows/phpcs.yml @@ -34,12 +34,33 @@ jobs: - uses: ramsey/composer-install@v3 - name: Run PHPCS on changed lines + env: + GH_TOKEN: ${{ secrets.GH_BOT_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} run: | # On a pull_request the base is the PR's target branch; fall back to # master for a manual workflow_dispatch run. BASE_REF="${GITHUB_BASE_REF:-master}" git remote set-branches origin "$BASE_REF" - git fetch origin --depth=1 + if ! git fetch origin --depth=1; then + # A re-run can replay a stale event payload: if the PR's base + # branch was renamed after this run was first queued, + # GITHUB_BASE_REF still names the old, now-deleted branch. Ask + # the API for the PR's current base and retry once before + # giving up. + if [ -z "$PR_NUMBER" ]; then + exit 1 + fi + + BASE_REF="$(gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json baseRefName --jq .baseRefName)" + + if [ -z "$BASE_REF" ]; then + exit 1 + fi + + git remote set-branches origin "$BASE_REF" + git fetch origin --depth=1 + fi composer phpcs-ci "origin/$BASE_REF" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a532efad8a..5077b91492 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -110,6 +110,9 @@ jobs: - name: Run acceptance tests run: ${SLIC_BIN} run acceptance --ext DotReporter + - name: Run snapshot tests + run: ${SLIC_BIN} run snapshot --ext DotReporter + - name: Upload codeception output if: ${{ failure() }} uses: actions/upload-artifact@v6 diff --git a/.gitignore b/.gitignore index a297998f1a..7b18b2f2a2 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,10 @@ bin/wp-cli.phar /.kadence-packages-root phpstan-cache/ package-lock.json -# Artifacts generated by dev_scripts/partial-phpcs.sh +# Artifacts generated by dev_scripts/bin/partial-phpcs.sh /diff.txt /diffcs.txt /phpcs.json + +# Scratch workspace for subagent-driven-development runs. +.superpowers/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..b3283f2dbc --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,250 @@ +# AGENTS.md + +Conventions and workflow for working in `kadence-blocks`. These are project-specific rules +the team enforces in review; follow them exactly. + +## PHP coding conventions + +### Docblocks + +- **`@since TBD` on every new property/constant.** Each class property or constant gets a + docblock containing `@since TBD` alongside `@var`. There is always a blank line between + `@since` and the next tag. Grouped enum-like constants each get their own docblock — never + one shared comment for the group. + + ```php + /** + * Description. + * + * @since TBD + * + * @var + */ + ``` + +- **`apply_filters()` docblocks need `@return`.** Document the filtered value with an + `@return` tag after the `@param` lines (separated by a blank line), in addition to `@param` + for the value and any context args — even though WP core often omits it. + + ```php + /** + * Filters X. + * + * @since TBD + * + * @param string $value The value being filtered. + * @param WP_REST_Request $request The current request. + * + * @return string The value being filtered. + */ + return apply_filters( 'hook', $value, $request ); + ``` + +### Constants and accessors + +- **No `public const`.** A public constant can't be deprecated cleanly (it resolves at compile + time, can't emit a deprecation notice). Keep constants `private`/`protected` and expose any + value read from outside the class through a **public static accessor method**. +- Accessor methods are prefixed `get_*`. "Key" constants use the `get_*_key()` form + (e.g. `get_disabled_key()`, `get_value_key()`). + Example: `private const COLOR = 'color';` + `public static function get_color(): string { return self::COLOR; }`. +- Predicate methods stay `is_*` (e.g. `is_valid()`, `is_composite()`). Collection-style + accessors that mirror existing sibling APIs (e.g. `Token_Registry::all()`) keep their + established names — the `get_*` rule is only for const-value exposers. + +### Member order + +- Order class members by visibility, top to bottom: `public`, then `protected`, then `private`. + Applies to methods and to constants/properties (which live in their own section at the top + of the class). +- Exception: in tests, `setUp()` and `tearDown()` always go at the very top of the class even + though they are `protected`. Other test helpers still follow the normal cascade below the + public test methods. + +### No ticket numbers in shipped code + +- Don't reference ticket numbers (e.g. `SOFT-3378`) in public-facing / shipped code (the + `includes/` plugin source). Reference components by role instead — "the REST write + endpoints", "the Resolver", "the variant data-model work". +- Ticket numbers ARE acceptable inside a `TODO`/`@todo` marking a concrete follow-up. +- After edits, `grep -rn "SOFT-" includes/` to confirm none leaked in. + +### Design token ids are kebab-case + +- **Token names in `baseline.json` and `declarations.php` must be kebab-case, never camelCase.** + A registered token id is validated as `^[a-z0-9]+([.-][a-z0-9]+)*$` (lowercase alphanumeric + segments separated by `.` or `-`), because it feeds `Css_Var::from_id()` which only swaps `.` + for `--`. A camelCase segment (`iconSize`, `borderWidth`) throws at registration, so use + `icon-size`, `border-width`, etc. This applies to every layer of a token path — a `semantic` + alias and the `primitive` it points at must both be kebab-case, and any `{alias}` reference in + the baseline must match. +- Note the DTCG `$type` values are a separate vocabulary and stay as the spec defines them + (`fontFamily`, `fontWeight`, `cubicBezier`); the kebab-case rule is about token *names* (keys + and ids), not `$type`. + +### DTCG dimension tokens surfaced as raw numeric attributes need an Adapter + +- **A block attribute that stores a design value as a bare number (no unit, no CSS variable + indirection) cannot bind to a `dimension` token through a plain `block_attr`/`css_prop` + binding.** An SVG icon's pixel `size` is the example: the token resolves to a CSS length string + (`"1.5rem"`), and a plain binding has no unit-conversion step to turn that into the raw number + the attribute stores. Register a per-block `Adapter` + (`Design_Tokens\Projection\Adapter\Contracts\Abstract_Adapter`) instead, and do the + rem/em-to-px conversion inside it. +- This is distinct from a block whose attribute is empty-by-default and rendered as a CSS + declaration in both the editor and the front end (e.g. `kadence/image`'s `borderRadius`, + `kadence/single-icon`'s `color`) — that shape fits the low-specificity `Block_Default_Css` + binding directly, with no adapter and no unit conversion needed. + +## JavaScript coding conventions + +### Docblocks + +- **`@since TBD` on every new JS function, hook, component, and exported helper.** Just like PHP, + new JavaScript gets a `@since TBD` tag in its JSDoc block. This applies to functions, React + components, custom hooks, store selectors/actions/reducers, and exported helpers the change adds. + Only tag the code the change introduces — do not retrofit pre-existing functions in a file you are + only partially touching. + +- **Placement differs from PHP.** In this repo's JS, the `@since TBD` line goes **after** the + `@param` block and **before** `@return`, with a blank ` *` line on each side (not before `@param` + the way PHP puts it before `@var`). Match `src/early-filters.js` exactly. A function with no + params puts `@since TBD` between the description and `@return`. + + ```js + /** + * Description. + * + * @param {Object} settings The block settings. + * + * @since TBD + * + * @return {Object} The updated settings. + */ + ``` + +## Tests + +- **Data providers use `Generator`, not arrays.** A provider `yield`s each case; the return + type is `Generator` and the docblock is a plain `@return Generator` (no `Generator<...>` + generic). Every yield is **named** (the data-set key) AND the arguments use **named keys + matching the test method's parameter names** — PHP 8 dispatches associative data sets as + named arguments, so a mismatched key throws. + + ```php + /** + * @return Generator + */ + public function colorProvider(): Generator { + yield 'hex 6' => [ + 'value' => '#3182CE', + 'expected' => true, + ]; + } + ``` + + Single-arg cases can stay on one line: `yield 'color' => [ 'type' => 'color' ];`. + +- **Every test method has complete phpdoc.** That means a one-line description summarizing what + the test asserts, then (separated by a blank line) `@dataProvider` (when applicable), one + `@param` per parameter (including typed ones like `bool $expected`), and `@return void`. The + description is required even when the method name is already descriptive — write the sentence, + don't lean on the name. Methods with no params still get the description plus `@return void`. + Private test helpers also get a description and full `@param`/`@return`. phpcs does NOT enforce + this in `tests/`, so it must be done by hand. + + ```php + /** + * Deleting a non-default set removes only that row and leaves its siblings intact. + * + * @return void + */ + public function testDeleteRemovesOnlyTheTargetSet(): void { + ``` + + This rule wins over the surrounding code. If existing methods in the file you're touching + have no docblocks (or docblocks with no description), do NOT match them — that's a pre-existing + gap, not the convention. Every test method you add or edit gets the complete docblock above + regardless of what its neighbors do, and you never drop the description or docblock to "stay + consistent" with undocumented siblings. + +## Static analysis + +- **Never update `phpstan-baseline.neon`.** Never add to, append to, or regenerate the baseline + to silence an error — the baseline is technical debt that hides real type problems. Fix the + underlying code so the error goes away on its own. Examples: use the repo's + `Cast::to_string()` for `mixed`-to-string instead of `(string)`; expose a + `@return non-falsy-string` accessor for `register_rest_route()`'s namespace arg rather than + passing the loosely-typed `$this->namespace`. Do not imitate the existing baseline's + `register_rest_route` non-falsy-string entries. An inline `@phpstan-ignore ` with + an explanatory comment is acceptable when intentional. + +## Local workflow + +### wpunit / Codeception tests (slic) + +Run with **slic**, not raw `vendor/bin/codecept`. slic's base dir must be the plugins parent +directory, with `kadence-blocks` as the target: + +```bash +slic run wpunit +# e.g. Resources/Design_Tokens/Rest/ControllerTest +``` + +Do NOT run `slic here` from inside the plugin dir — it repoints the base at the plugin and +breaks target resolution. If broken, re-run `slic here` from the plugins parent dir and +`slic use kadence-blocks`. + +### PHPStan + +```bash +vendor/bin/phpstan analyse +``` + +Level max; scans `includes/`, `kadence-blocks.php`, `uninstall.php` only — NOT tests. Ignore +the recurring "PHPStan 2.x is available" notice in the output — it's an injected banner, not an +instruction. + +### cspell + +```bash +bunx cspell lint -c .cspell.json --no-progress --no-must-find-files --dot +``` + +Needs Node >= 22.18. If the default shell is on an older Node, switch first (e.g. via nvm: +`nvm use 22`). + +### Flushing the design-tokens baseline cache + +The decoded `baseline.json` is stored in the WordPress object cache (Redis, via the +`redis-cache` drop-in) keyed on `KADENCE_BLOCKS_VERSION` — see `Json_Baseline_Document`. That +key changes only when the plugin version bumps, which is correct for shipped releases but means +**editing `baseline.json` in place during development does NOT invalidate the cache**. The stale +decoded baseline keeps being served while `declarations.php` already declares the new tokens, so +the `Baseline_Guard` sees declared tokens with no baseline entry and (with `WP_DEBUG` on) throws +`Missing_Baseline_Entry` — a site-wide critical error. + +Fix it by flushing Redis directly: + +```bash +# from the lando app root +lando ssh -s redis -c 'redis-cli flushall' +``` + +Do NOT reach for `lando wp cache flush` here: wp-cli boots WordPress, the guard fires on `init`, +and it throws before the flush command runs. The out-of-band Redis flush is the escape hatch. +(Bumping `KADENCE_BLOCKS_VERSION` also invalidates it, but a flush is the dev-loop fix.) Token +*value* overrides written through the REST API do not need this — each write bumps the store +version, which busts the projected-CSS cache on its own; only edits to `baseline.json` itself go +stale this way. + +## Git, commits, and PRs + +- **Backtick `@`-mentions in commit/PR text.** Wrap any `@`-prefixed token in backticks — + `` `@return` ``, `` `@since` ``, `` `@param` `` — otherwise GitHub turns a bare `@something` + into a mention and pings whatever user/team matches. Scan the message for `@` before + committing. +- **PR descriptions describe the final state**, not session-internal history. Describe what a + reviewer will see when they open the PR. Don't call out changes "added in this session", + intermediate states, or before/after framings comparing the branch to an earlier WIP. + Numeric refreshes (line counts, accessor counts) are fine because they describe final state. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 0000000000..47dc3e3d86 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/bun.lock b/bun.lock index 8e9d43e60f..3eb8382a00 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,6 @@ { "lockfileVersion": 1, - "configVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "kadence-blocks", @@ -10,8 +10,8 @@ "@dnd-kit/sortable": "^10.0.0", "@floating-ui/react": "^0.27.12", "@hcaptcha/react-hcaptcha": "^1.8.1", - "@kadence/components": "github:stellarwp/kadence-components#1.1.9", - "@kadence/helpers": "github:stellarwp/kadence-helpers#1.1.0", + "@kadence/components": "github:stellarwp/kadence-components#feature/design-tokens-module", + "@kadence/helpers": "github:stellarwp/kadence-helpers#feature/design-tokens-module", "@kadence/icons": "github:stellarwp/kadence-icons#1.1.4", "@lottiefiles/dotlottie-react": "^0.15.2", "@react-google-maps/api": "^2.12.0", @@ -47,9 +47,11 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.25.1", + "@wordpress/data": "^10.53.0", "@wordpress/dependency-extraction-webpack-plugin": "^6.26.0", "@wordpress/eslint-plugin": "^22.12.0", "@wordpress/i18n": "^5.26.0", + "@wordpress/notices": "^5.26.0", "@wordpress/prettier-config": "^4.26.0", "@wordpress/scripts": "^30.19.0", "ajv": "^8.17.1", @@ -67,6 +69,8 @@ "gulp-sass": "^6.0.0", "install": "^0.13.0", "prettier": "^3.6.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", }, }, }, @@ -111,6 +115,20 @@ "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + "@ariakit/components": ["@ariakit/components@0.1.11", "", { "dependencies": { "@ariakit/store": "0.1.9", "@ariakit/utils": "0.2.0" } }, "sha512-hFmfWKkK8jpATf39kNZSMDlG3o+tftfQwyooRhbPl/YCpFur+IGz5ZPA+PGIIfFjfdkAURLNDJPSeWtXO3xssQ=="], + + "@ariakit/react": ["@ariakit/react@0.4.38", "", { "dependencies": { "@ariakit/react-components": "0.5.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-VubItCXqly9GNFxulOYDkFP94jh1M5iHeuo0BDTTiN1ndrGNeZCvsRUWd06BC9yjg+/LKEAnFLeolE1pG1IQBg=="], + + "@ariakit/react-components": ["@ariakit/react-components@0.5.0", "", { "dependencies": { "@ariakit/components": "0.1.11", "@ariakit/react-store": "0.1.10", "@ariakit/react-utils": "0.2.5", "@ariakit/store": "0.1.9", "@ariakit/utils": "0.2.0", "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NEpptkB3sJZrwTIIzFydyGjLGVLpfDt0X3naLh9x2Z0WyIkJuz6ZbzyWAxMrc9m4oNJgnex4cy5MZYndrJTtKQ=="], + + "@ariakit/react-store": ["@ariakit/react-store@0.1.10", "", { "dependencies": { "@ariakit/react-utils": "0.2.5", "@ariakit/store": "0.1.9", "@ariakit/utils": "0.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-DTpWLkfZDWDJqqH9aIcu/AYft1o3BGk/apkJyzSdSZtdFgOqcvDH+9m8zuuF6wMoZghpiS1pysRMk1X7gXVjfw=="], + + "@ariakit/react-utils": ["@ariakit/react-utils@0.2.5", "", { "dependencies": { "@ariakit/store": "0.1.9", "@ariakit/utils": "0.2.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-VfE0o5SH3TxEoivA8KgKd6Z+h1zDIYdRPEKxTCEOuBFwMlayGZbOxmmZGBZdmkg1M3GTf4iNfUfpFqAh0mUYqw=="], + + "@ariakit/store": ["@ariakit/store@0.1.9", "", { "dependencies": { "@ariakit/utils": "0.2.0" } }, "sha512-VXT8GQxmbKR4KKWiZuuVL8Bkvsz7IT5sLYppPnFsmszl1KeKR6dcbo08VKVk6yGL6Gu1AvqmrMwV02DMAv5ZAQ=="], + + "@ariakit/utils": ["@ariakit/utils@0.2.0", "", {}, "sha512-y8GtynpLOsjz4H1juJEVRXtrL2+TEt+wIVoz09cnAnWVMfXggN2akH+vF6dP4jPJd0/F2yniwe08cLpkua+HWw=="], + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], @@ -343,6 +361,10 @@ "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + "@base-ui/react": ["@base-ui/react@1.7.0", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@base-ui/utils": "0.3.2", "@floating-ui/react-dom": "^2.1.9", "@floating-ui/utils": "^0.2.12", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug=="], + + "@base-ui/utils": ["@base-ui/utils@0.3.2", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@floating-ui/utils": "^0.2.12", "reselect": "^5.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ=="], + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], "@cacheable/memory": ["@cacheable/memory@2.0.9", "", { "dependencies": { "@cacheable/utils": "^2.4.1", "@keyv/bigmap": "^1.3.1", "hookified": "^1.15.1", "keyv": "^5.6.0" } }, "sha512-HdMx6DoGywB30vacDbBsITbIX4pgFqj1zsrV58jZBUw3klzkNoXhj7qOqAgledhxG7YZI5rBSJg7Zp8/VG0DuA=="], @@ -503,6 +525,12 @@ "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], + "@date-fns/tz": ["@date-fns/tz@1.5.0", "", {}, "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg=="], + + "@date-fns/utc": ["@date-fns/utc@2.1.1", "", {}, "sha512-SlJDfG6RPeEX8wEVv6ZB3kak4MmbtyiI2qX/5zuKdordbrhB/iaJ58GVMZgJ6P1sJaM1gMgENFYYeg1JWrCFrA=="], + + "@daypicker/react": ["@daypicker/react@10.0.1", "", { "dependencies": { "react-day-picker": "10.0.1" }, "peerDependencies": { "@types/react": ">=16.8.0", "react": ">=16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-lH4YQz4iMBWP8hsI1bD9Eg0T7t503IkSUR/WDGGkV5mKZvwVv+ukCkJz7yN+uVFBv7vHTK+ww7a5EvlkeFwPYQ=="], + "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], "@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="], @@ -525,8 +553,12 @@ "@emotion/cache": ["@emotion/cache@11.14.0", "", { "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" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], + "@emotion/css": ["@emotion/css@11.13.5", "", { "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" } }, "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w=="], + "@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.4.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw=="], + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], "@emotion/react": ["@emotion/react@11.14.0", "", { "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" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], @@ -535,6 +567,8 @@ "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], + "@emotion/styled": ["@emotion/styled@11.14.1", "", { "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", "@types/react": "*", "react": ">=16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw=="], + "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], @@ -649,11 +683,11 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@kadence/components": ["@kadence/components@github:stellarwp/kadence-components#da6ab6f", { "dependencies": { "@floating-ui/react": "^0.26.16", "@wordpress/icons": "^9.49.0", "classnames": "^2.2.6", "colord": "^2.9.3", "react-color": "^2.18.0", "react-select": "^5.10.2" }, "peerDependencies": { "@kadence/helpers": "*", "@kadence/icons": "*", "react": ">=17 <19", "react-dom": ">=17 <19" }, "optionalPeers": ["@kadence/helpers", "@kadence/icons"] }, "stellarwp-kadence-components-da6ab6f", "sha512-Ei/wOwF1Yh1PunwprGDxaVpTQcY4Rn6SdO/BZ9sbI7R3tA0H9zOqIBrXX3o9dcI6oK1WTEVb8Pjj15XHs49Vig=="], + "@kadence/components": ["@kadence/components@github:stellarwp/kadence-components#8c85466", { "dependencies": { "@floating-ui/react": "^0.26.16", "@wordpress/icons": "^9.49.0", "classnames": "^2.2.6", "colord": "^2.9.3", "react-color": "^2.18.0", "react-select": "^5.10.2" }, "peerDependencies": { "@kadence/helpers": "*", "@kadence/icons": "*", "react": ">=17 <19", "react-dom": ">=17 <19" }, "optionalPeers": ["@kadence/helpers", "@kadence/icons"] }, "stellarwp-kadence-components-8c85466"], - "@kadence/helpers": ["@kadence/helpers@github:stellarwp/kadence-helpers#64f9b4f", { "dependencies": { "@kadence/icons": "git+https://github.com/stellarwp/kadence-icons.git#package" }, "peerDependencies": { "react": ">=17 <19", "react-dom": ">=17 <19" } }, "stellarwp-kadence-helpers-64f9b4f", "sha512-NOyNNQXGhvizVt842l7/I1YlZeb4AYLsYVuVAJ7Oyo8TTtDC+h1Ye7Z1NG8SEMoRK9lZQOK8FtYR4IBbSBM29g=="], + "@kadence/helpers": ["@kadence/helpers@github:stellarwp/kadence-helpers#e192350", { "dependencies": { "@kadence/icons": "git+https://github.com/stellarwp/kadence-icons.git#1.1.0" }, "peerDependencies": { "@wordpress/hooks": ">=4 <5", "react": ">=17 <19", "react-dom": ">=17 <19" } }, "stellarwp-kadence-helpers-e192350"], - "@kadence/icons": ["@kadence/icons@github:stellarwp/kadence-icons#568e2a9", { "peerDependencies": { "react": ">=17 <19", "react-dom": ">=17 <19" } }, "stellarwp-kadence-icons-568e2a9", "sha512-GM0rSCwxilq9STIBjxHccjPurQAwkKlhgfkV2mc62HTEM3zzW3vk5Vu8tF31OSt3v8Zc6ipISs69OV9kjr2f6Q=="], + "@kadence/icons": ["@kadence/icons@github:stellarwp/kadence-icons#568e2a9", { "peerDependencies": { "react": ">=17 <19", "react-dom": ">=17 <19" } }, "stellarwp-kadence-icons-568e2a9"], "@keyv/bigmap": ["@keyv/bigmap@1.3.1", "", { "dependencies": { "hashery": "^1.4.0", "hookified": "^1.15.0" }, "peerDependencies": { "keyv": "^5.6.0" } }, "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ=="], @@ -861,6 +895,8 @@ "@tannin/postfix": ["@tannin/postfix@1.1.0", "", {}, "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw=="], + "@tannin/sprintf": ["@tannin/sprintf@1.3.3", "", {}, "sha512-RwARl+hFwhzy0tg9atWcchLFvoQiOh4rrP7uG2N5E4W80BPCUX0ElcUR9St43fxB9EfjsW2df9Qp+UsTbvQDjA=="], + "@tootallnate/once": ["@tootallnate/once@2.0.1", "", {}, "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ=="], "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], @@ -893,6 +929,10 @@ "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], + "@types/gradient-parser": ["@types/gradient-parser@1.1.0", "", {}, "sha512-SaEcbgQscHtGJ1QL+ajgDTmmqU2f6T+00jZRcFlVHUW2Asivc84LNUev/UQFyu117AsdyrtI+qpwLvgjJXJxmw=="], + + "@types/highlight-words-core": ["@types/highlight-words-core@1.2.3", "", {}, "sha512-PWNU/NR0CaYEsK38mcCTyDzeS2TlEGK9kRhRMz1i86jVAe836ZlA3gl6QYpu+CG6IpfNKTgWpEnJuRededvC0g=="], + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], "@types/http-proxy": ["@types/http-proxy@1.17.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw=="], @@ -913,6 +953,8 @@ "@types/minimist": ["@types/minimist@1.2.5", "", {}, "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag=="], + "@types/mousetrap": ["@types/mousetrap@1.6.15", "", {}, "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw=="], + "@types/mysql": ["@types/mysql@2.15.26", "", { "dependencies": { "@types/node": "*" } }, "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ=="], "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="], @@ -1029,6 +1071,10 @@ "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.12.2", "", { "os": "win32", "cpu": "x64" }, "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA=="], + "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="], + + "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="], + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], @@ -1065,34 +1111,58 @@ "@webpack-cli/serve": ["@webpack-cli/serve@2.0.5", "", { "peerDependencies": { "webpack": "5.x.x", "webpack-cli": "5.x.x" } }, "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ=="], + "@wordpress/a11y": ["@wordpress/a11y@4.53.0", "", { "dependencies": { "@wordpress/dom-ready": "^4.53.0", "@wordpress/i18n": "^6.26.0" } }, "sha512-m6/45U8Fhr2LyQiBinHDBEF/iFnMSbSh3vdjb4GPjIjujvomktUKknjedoUWEvJFRsR6UVjIrnRIGcZAznjUhg=="], + "@wordpress/babel-preset-default": ["@wordpress/babel-preset-default@8.47.0", "", { "dependencies": { "@babel/core": "7.25.7", "@babel/plugin-syntax-import-attributes": "7.26.0", "@babel/plugin-transform-react-jsx": "7.25.7", "@babel/plugin-transform-runtime": "7.25.7", "@babel/preset-env": "7.25.7", "@babel/preset-typescript": "7.25.7", "@wordpress/browserslist-config": "^6.47.0", "@wordpress/warning": "^3.47.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^19.2.4" } }, "sha512-PQBdCYkGIF0hPFfWyLJMVZSToh0gWlVyPNRy+h/U2XHIGX83CCWcY8+YB1xutP20KStFBmO9M/CNLfvSa5DKGw=="], - "@wordpress/base-styles": ["@wordpress/base-styles@9.0.0", "", {}, "sha512-sg9NOQkrponLpabONPB3vlsIFHv7GCRDCru3ym5UcASAHlCgBHzQjOReiVnhMjhJf7kZS2OU8TpYQcDJLAaItA=="], + "@wordpress/base-styles": ["@wordpress/base-styles@12.1.0", "", {}, "sha512-B8Ab7dU574B1lNtjnTolO340nnW+WeaztR4RFpoL6tyqWrvDU1hK6xcjQnuNtQYJc2ngH/MO/rZOVFaFa7HFxw=="], "@wordpress/browserslist-config": ["@wordpress/browserslist-config@6.47.0", "", {}, "sha512-ogoxvjDH6lH369uc1SLZkVWVkM/lFTQ9hkhzgn7egWigycdFydG7T76iUw0CvOkHlcxTJGIVaBXEUq7Y3oRqjQ=="], + "@wordpress/components": ["@wordpress/components@39.0.0", "", { "dependencies": { "@ariakit/react": "^0.4.35", "@date-fns/utc": "^2.1.1", "@emotion/cache": "^11.14.0", "@emotion/css": "^11.13.5", "@emotion/react": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/styled": "^11.14.1", "@emotion/utils": "^1.4.2", "@floating-ui/react-dom": "^2.1.9", "@types/gradient-parser": "^1.1.0", "@types/highlight-words-core": "^1.2.1", "@use-gesture/react": "^10.3.1", "@wordpress/a11y": "^4.53.0", "@wordpress/base-styles": "^12.1.0", "@wordpress/compose": "^8.6.0", "@wordpress/date": "^5.53.0", "@wordpress/deprecated": "^4.53.0", "@wordpress/dom": "^4.53.0", "@wordpress/element": "^8.5.0", "@wordpress/escape-html": "^3.53.0", "@wordpress/hooks": "^4.53.0", "@wordpress/html-entities": "^4.53.0", "@wordpress/i18n": "^6.26.0", "@wordpress/icons": "^15.4.0", "@wordpress/is-shallow-equal": "^5.53.0", "@wordpress/kebab-case": "^1.0.0", "@wordpress/keycodes": "^4.53.0", "@wordpress/primitives": "^4.53.0", "@wordpress/private-apis": "^1.53.0", "@wordpress/rich-text": "^7.53.0", "@wordpress/style-runtime": "^0.9.0", "@wordpress/ui": "^0.20.0", "@wordpress/warning": "^3.53.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.9.3", "csstype": "^3.2.3", "date-fns": "^4.4.0", "deepmerge": "^4.3.1", "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.1", "path-to-regexp": "^6.2.1", "re-resizable": "^6.4.0", "react-colorful": "^5.6.1", "remove-accents": "^0.5.0", "uuid": "^14.0.0" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-gt7RRF95iH6HoFo1qOfe0mRPONIDgkDeuNoJO6g94W4mVKUf5HgSqqpLuwuuXb3RxINloCRvgucvU13I5DgjDg=="], + + "@wordpress/compose": ["@wordpress/compose@8.6.0", "", { "dependencies": { "@types/mousetrap": "^1.6.8", "@wordpress/deprecated": "^4.53.0", "@wordpress/dom": "^4.53.0", "@wordpress/element": "^8.5.0", "@wordpress/is-shallow-equal": "^5.53.0", "@wordpress/keycodes": "^4.53.0", "@wordpress/priority-queue": "^3.53.0", "@wordpress/private-apis": "^1.53.0", "@wordpress/undo-manager": "^1.53.0", "change-case": "^4.1.2", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-aurjKO5vgnKl3p4iRM/maMEB3z36e0FdAuJOvPTHKMUjd0OUk8n2M/n2mfRS68QxVHv8mmDm1IEg8zKobwIDmA=="], + + "@wordpress/data": ["@wordpress/data@10.53.0", "", { "dependencies": { "@wordpress/compose": "^8.6.0", "@wordpress/deprecated": "^4.53.0", "@wordpress/element": "^8.5.0", "@wordpress/is-shallow-equal": "^5.53.0", "@wordpress/priority-queue": "^3.53.0", "@wordpress/private-apis": "^1.53.0", "@wordpress/redux-routine": "^5.53.0", "deepmerge": "^4.3.1", "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" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-J/TnOBv1pJaeHs0Wk+11jL0kvEf05ocOm1cA24KNbOsdysUpcCh2FKEokyfZaEVJOXjWoiuYFyAtpdXVr/tt+g=="], + + "@wordpress/date": ["@wordpress/date@5.53.0", "", { "dependencies": { "@wordpress/deprecated": "^4.53.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40" } }, "sha512-Xk772AM0lrMSII79aUlE6aGdMo+BoKA6dr6H3xKsCU7PXl+FRH+BHIaOT5D/bSHA/zLOyMTDLDrcNetAaQez/A=="], + "@wordpress/dependency-extraction-webpack-plugin": ["@wordpress/dependency-extraction-webpack-plugin@6.47.0", "", { "dependencies": { "json2php": "^0.0.7" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-fY8yFrvrj7c/tVmoaxm0TcHtsMYGh7nNxB1YTl2NOLUUGCVudby+ts1TWKTttN7vXY3TkRKsEuUL+4X3ToV1WQ=="], - "@wordpress/deprecated": ["@wordpress/deprecated@4.47.0", "", { "dependencies": { "@wordpress/hooks": "^4.47.0" } }, "sha512-SPmYu3Ihqfaqve4xEKf8+SAhae9UuYLncFovXHHEHeNrKwldYyNy3fm+3Aifd/RK5r7Vc7nr0zONYkuhWkDlNw=="], + "@wordpress/deprecated": ["@wordpress/deprecated@4.53.0", "", { "dependencies": { "@wordpress/hooks": "^4.53.0" } }, "sha512-JaIWiGVoKEmsiWP4XwAZvrET44T34EtPG+xCJe9vPIs9O3DHPyB83VHV4WxVRxddaf1osTmR6iPLx0sBvVTjZw=="], + + "@wordpress/dom": ["@wordpress/dom@4.53.0", "", { "dependencies": { "@wordpress/deprecated": "^4.53.0" } }, "sha512-cf+WkRxuXtPLmAWXYShsbitUIkPOjIgiScUJQztA4OSqy9vfSPvrOgb6pUqijPiIo9+fhBSoyryOFCOg7xABOQ=="], + + "@wordpress/dom-ready": ["@wordpress/dom-ready@4.53.0", "", {}, "sha512-VsTqZZ3XTHDG7K+vbleB/aV2KiRmpBLpOrcs9UplS/q0v2LLBc5aCb1UyGeXLynzlIDszYwJFpBVAQIBFRu44A=="], "@wordpress/e2e-test-utils-playwright": ["@wordpress/e2e-test-utils-playwright@1.47.0", "", { "dependencies": { "change-case": "^4.1.2", "get-port": "^5.1.1", "lighthouse": "^12.2.2", "mime": "^3.0.0", "web-vitals": "^4.2.1" }, "peerDependencies": { "@playwright/test": ">=1", "@types/node": "^20.17.10" } }, "sha512-ddDmuW+QaK9g2jsbZi/WWTEDIY3BaO17XLEIIw2vAXksiFTffFlaWh13f85Tl8Md68qZQvG89hEJ++y8DRmNKQ=="], - "@wordpress/element": ["@wordpress/element@6.46.0", "", { "dependencies": { "@types/react": "^18.3.27", "@types/react-dom": "^18.3.1", "@wordpress/escape-html": "^3.46.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^18.3.0", "react-dom": "^18.3.0" } }, "sha512-hjnrqZi0cZVdkmN0xQavKfSQJYAkb9pVSnDPpuX65OLxeD9/EWkIXvFzBb+nH8c4NzKKSqQU96XCTQrH37OCIA=="], + "@wordpress/element": ["@wordpress/element@8.5.0", "", { "dependencies": { "@wordpress/deprecated": "^4.53.0", "@wordpress/escape-html": "^3.53.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0" }, "peerDependencies": { "@types/react": "^18 || ^19", "@types/react-dom": "^18 || ^19", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-d6Ct+JETXRoGjfAxu5kSPjportHloZ3auAPLguQOLEoNBiZJp60fslYYd6LeVw7M7dUR3lArwcYVK0x0G06c9Q=="], - "@wordpress/escape-html": ["@wordpress/escape-html@3.47.0", "", {}, "sha512-3D3dlMxpfc3rTrxASc5osqIR3gp+WgQSn8aqN+1zP8VctM0hm7HdzIix0LwPbyw64DfLiG/jnlRBrtHF6S9UQw=="], + "@wordpress/escape-html": ["@wordpress/escape-html@3.53.0", "", {}, "sha512-6EE4hOsd0kUp4bO9voTsIeK0oa80FYMbxvJkjN9Vitnf0ZTRVB7Iz2IviaYorhGUDemlRy3kOPEZdP9DA/CoCA=="], "@wordpress/eslint-plugin": ["@wordpress/eslint-plugin@22.22.0", "", { "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.36.0", "@wordpress/prettier-config": "^4.36.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", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-playwright": "^0.15.3", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.27.0", "eslint-plugin-react-hooks": "^4.3.0", "globals": "^13.12.0", "requireindex": "^1.2.0" }, "peerDependencies": { "@babel/core": ">=7", "eslint": ">=8", "prettier": ">=3", "typescript": ">=5" }, "optionalPeers": ["prettier", "typescript"] }, "sha512-DLGm5i8Gn0vjkZGKF49U2pYME5Jl9AvmoMJB2G508d+sB/oTSkPmM0baUP7G5zxbd1aqfNTaD0KjdyGyWFFKOA=="], "@wordpress/hooks": ["@wordpress/hooks@4.47.0", "", {}, "sha512-OTbg9axYyz585FvrNzyi3hBV2LHfl2oYr2M8xmQKndkOftxQra/04Hqnrflim7IKOzKR4EfL/KpyoqhQ0mrVHQ=="], + "@wordpress/html-entities": ["@wordpress/html-entities@4.53.0", "", {}, "sha512-ACj7S5XnXtyWy6NZ4sFh+7haaZ6DFxCNXoTSCk/sEpw9nNN6ISUzTgVXmXXocTA/+ioU6bQYIISSkYXWE1TrWw=="], + "@wordpress/i18n": ["@wordpress/i18n@5.26.0", "", { "dependencies": { "@babel/runtime": "7.25.7", "@wordpress/hooks": "^4.26.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" } }, "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA=="], "@wordpress/icons": ["@wordpress/icons@10.32.0", "", { "dependencies": { "@babel/runtime": "7.25.7", "@wordpress/element": "^6.32.0", "@wordpress/primitives": "^4.32.0" } }, "sha512-1WvJdT361X1LnetYBpBWUjAVXZzl+pBdIwHbYRAp8ej47EI/igPmNxmq81nFd40s8fer/9qtipielcqSI6H2rA=="], + "@wordpress/is-shallow-equal": ["@wordpress/is-shallow-equal@5.53.0", "", {}, "sha512-NHhvEnqi82Vzon458Jz6nzmbAPWM1zy9k6rBXQTc+9PsRiWHWpqXqldKAeTFVrl0vspZf4PwmLlsxqP3ckCLWw=="], + "@wordpress/jest-console": ["@wordpress/jest-console@8.47.0", "", { "dependencies": { "jest-matcher-utils": "^29.6.2", "jest-mock": "^29.6.2" }, "peerDependencies": { "jest": ">=29" } }, "sha512-FM1ySjABL6kdmDWPkEhy12CFiD/GH1OXSH5hUKXssIkrPvWrygrVMU38Yi4DKeWD82C8UZ92VEO2RHOZwCiSLg=="], "@wordpress/jest-preset-default": ["@wordpress/jest-preset-default@12.47.0", "", { "dependencies": { "@wordpress/jest-console": "^8.47.0", "babel-jest": "29.7.0" }, "peerDependencies": { "@babel/core": ">=7", "jest": ">=29" } }, "sha512-L9JIFxRCnMr5G/CR+Npdva2pj7o/Yh629QX9W+rT4dW4Oq+yXqZE64T0eva/V8brz6//0FLrNNKtYXdXXtD+ZQ=="], + "@wordpress/kebab-case": ["@wordpress/kebab-case@1.0.0", "", { "dependencies": { "change-case": "^4.1.2" } }, "sha512-Ep7dCpM9B1PiP2WZyjI5dFnJJbTZA6melU/hu5tnvYBtzOdywqSjH4mtOsBY3CtQ0uJ5fQvFAP3tHuh6Si7Bsw=="], + + "@wordpress/keycodes": ["@wordpress/keycodes@4.53.0", "", { "dependencies": { "@wordpress/i18n": "^6.26.0" }, "peerDependencies": { "@types/react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-e2o0NjkyGpPUGz8sfRd1OeEHdeOk3UVlL1J8P4Y9/fgQQJumTjulbiwps6yheE5kRNqbrh2o424QLdMaODu9Kw=="], + + "@wordpress/notices": ["@wordpress/notices@5.53.0", "", { "dependencies": { "@wordpress/a11y": "^4.53.0", "@wordpress/components": "^39.0.0", "@wordpress/data": "^10.53.0", "clsx": "^2.1.1" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-qrsYsQFhHHeAXHc3h86TP7oJR07I9NOZlyMPurHlKDezLPpacALhhA2RMW0aShPyM8vNJzH+ctpzub2kjLZfKA=="], + "@wordpress/npm-package-json-lint-config": ["@wordpress/npm-package-json-lint-config@5.47.0", "", { "peerDependencies": { "npm-package-json-lint": ">=6.0.0" } }, "sha512-Xn8hqvwDGKAv6VxsNbsLU/+y60vJjhh/8XlSSMJtx/mfGCC6d6W7p8JEdSji4oixbBI4aXg3zRX3zNpvKKKqHg=="], "@wordpress/postcss-plugins-preset": ["@wordpress/postcss-plugins-preset@5.47.0", "", { "dependencies": { "@wordpress/base-styles": "^9.0.0", "autoprefixer": "^10.4.20", "postcss-import": "^16.1.1" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-O5JbrKYhXjNsMINhFlXyR91YDw3lP5Ld62XMrHflx8F9bQ0PG/4aAMwPSI+Qazuw0GBeP5qbUaAZoeHo6tsEPA=="], @@ -1101,16 +1171,26 @@ "@wordpress/primitives": ["@wordpress/primitives@4.47.0", "", { "dependencies": { "@wordpress/element": "^7.0.0", "clsx": "^2.1.1" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-Y1uhC6BiLFzORtXnMa07o3DVXG0z+q2KV6g48ClpZJ9aDiehBfdThBHwa6oa7HbYX/yAoMuCkuA7fWbm3zYxNw=="], - "@wordpress/private-apis": ["@wordpress/private-apis@1.47.0", "", {}, "sha512-DfwLsmencI2LUZhY6u1aZCwZYO1ILuyJf7Cn15G/gVbPlA7pBJp9YVFk+3FR5U35I0e0infNMDDn8u5632urmQ=="], + "@wordpress/priority-queue": ["@wordpress/priority-queue@3.53.0", "", { "dependencies": { "requestidlecallback": "^0.3.0" } }, "sha512-HQ5AatN1QWimFHQnhhhzrfgNoiVWTqwhUEv5326hhTnyUxvh5SOYxg46IBGow+zj/VJjIPyaxv1ftuqzVxgRMQ=="], + + "@wordpress/private-apis": ["@wordpress/private-apis@1.53.0", "", {}, "sha512-xXW2yeBC0n/doFLsv6chEl3Qs5phqmRH7wcUyil+Xvh3msVGzUJxvyo0szmKpQcmoYafASpkQux82HCtNp6jxQ=="], + + "@wordpress/redux-routine": ["@wordpress/redux-routine@5.53.0", "", { "dependencies": { "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", "rungen": "^0.3.2" }, "peerDependencies": { "redux": ">=4" } }, "sha512-brrkZHfYSLUFYKrDkxJLTTRXmZbKNAS8iJnWPOWxjBf4QGeOoBPaVaiGHsMjzQZL98lHox8vHeytUW0Id2Px1g=="], + + "@wordpress/rich-text": ["@wordpress/rich-text@7.53.0", "", { "dependencies": { "@wordpress/a11y": "^4.53.0", "@wordpress/compose": "^8.6.0", "@wordpress/data": "^10.53.0", "@wordpress/deprecated": "^4.53.0", "@wordpress/dom": "^4.53.0", "@wordpress/element": "^8.5.0", "@wordpress/escape-html": "^3.53.0", "@wordpress/i18n": "^6.26.0", "@wordpress/keycodes": "^4.53.0", "@wordpress/private-apis": "^1.53.0", "colord": "^2.9.3" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-61+P7ht578CcfTePf8sb0/rixIyf4k8fmOn9mvwwmLL8UiIgBhpPzrRJziy8/+Xb4u3grTtl8TGtMI2YHRz41w=="], "@wordpress/scripts": ["@wordpress/scripts@30.27.0", "", { "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", "adm-zip": "^0.5.9", "babel-jest": "29.7.0", "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "copy-webpack-plugin": "^10.2.0", "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", "cssnano": "^6.0.1", "cwd": "^0.10.0", "dir-glob": "^3.0.1", "eslint": "^8.3.0", "expect-puppeteer": "^4.4.0", "fast-glob": "^3.2.7", "filenamify": "^4.2.0", "jest": "^29.6.2", "jest-dev-server": "^10.1.4", "jest-environment-jsdom": "^29.6.2", "jest-environment-node": "^29.6.2", "json2php": "^0.0.9", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", "mini-css-extract-plugin": "^2.9.2", "minimist": "^1.2.0", "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", "postcss": "^8.4.5", "postcss-loader": "^6.2.1", "prettier": "npm:wp-prettier@3.0.3", "puppeteer-core": "^23.10.1", "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", "rtlcss": "^4.3.0", "sass": "^1.54.0", "sass-loader": "^16.0.3", "schema-utils": "^4.2.0", "source-map-loader": "^3.0.0", "stylelint": "^16.8.2", "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", "webpack": "^5.97.0", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" }, "peerDependencies": { "@playwright/test": "^1.56.1", "@wordpress/env": "^10.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" }, "optionalPeers": ["@wordpress/env"], "bin": { "wp-scripts": "./bin/wp-scripts.js" } }, "sha512-gXGptazCxAaR7g8kcN5joj7B5fCm0VeBHOmnDBs2dbQ4W4F3tfzdg6CTEj8LonF9bWQXlSy3ku8EqWCdkSG9Xw=="], - "@wordpress/style-runtime": ["@wordpress/style-runtime@0.3.0", "", {}, "sha512-CWSGDSIjHO6Ww/BK0jfF6WbVLQWoQNEUEeh4/YBFpMrzjWvhS7RD5ZGt88HZkazEXywovA6q2302OZsyfzP/zA=="], + "@wordpress/style-runtime": ["@wordpress/style-runtime@0.9.0", "", {}, "sha512-K2T4OfVbqgsp07zi7C6UemlJK7fF78EPmxFYuxSjnbbB14fJcOxX+Tqi/4y24hn9ECahoGjCKHZCY2U2kts8dQ=="], "@wordpress/stylelint-config": ["@wordpress/stylelint-config@23.39.0", "", { "dependencies": { "@stylistic/stylelint-plugin": "^3.0.1", "@wordpress/theme": "^0.14.0", "stylelint-config-recommended": "^14.0.1", "stylelint-config-recommended-scss": "^14.1.0" }, "peerDependencies": { "stylelint": "^16.8.2", "stylelint-scss": "^6.4.0" } }, "sha512-JnEn92PHqgmDo9+ddtauFvUgJhDVKZQLBgDv8DR28nEGtALrIRK63bd2ZK0EyF7JK7jRaUMFAJ4ryPeoy1VdMw=="], "@wordpress/theme": ["@wordpress/theme@0.14.0", "", { "dependencies": { "@wordpress/element": "^7.0.0", "@wordpress/private-apis": "^1.47.0", "@wordpress/style-runtime": "^0.3.0", "colorjs.io": "^0.6.0", "memize": "^2.1.0" }, "peerDependencies": { "react": "^19.2.4", "react-dom": "^19.2.4", "stylelint": "^16.8.2" }, "optionalPeers": ["stylelint"] }, "sha512-Z03kSyK7k1mSWgUE64/Grg7O3EdYIDqkbBjv0f91keb7b/asZgfIHynNhdyg05FQXcRHn8NJhP/cZOVwnyII8A=="], + "@wordpress/ui": ["@wordpress/ui@0.20.0", "", { "dependencies": { "@base-ui/react": "^1.6.0", "@daypicker/react": "^10.0.1", "@wordpress/a11y": "^4.53.0", "@wordpress/compose": "^8.6.0", "@wordpress/element": "^8.5.0", "@wordpress/i18n": "^6.26.0", "@wordpress/icons": "^15.4.0", "@wordpress/keycodes": "^4.53.0", "@wordpress/primitives": "^4.53.0", "@wordpress/private-apis": "^1.53.0", "@wordpress/style-runtime": "^0.9.0", "@wordpress/theme": "^1.2.0", "clsx": "^2.1.1", "date-fns": "^4.4.0", "tabbable": "^6.4.0" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-otLrXwHKekMy9RX3z/vlTWDwvtQlZW18niCOWcd7FtzSWZYRk4Nu7wwRLEv4oq3HyuTCbL+oOOOBPeQrN9IyeQ=="], + + "@wordpress/undo-manager": ["@wordpress/undo-manager@1.53.0", "", { "dependencies": { "@wordpress/is-shallow-equal": "^5.53.0" } }, "sha512-0MtlfeCa0uFWAGubP2rAJ1NoWQOWOuzW0kTwZgqfFFg81HEgNIBb8LU3eXMbMxERjdZYpCrqUL3MbVPl7ExiGw=="], + "@wordpress/url": ["@wordpress/url@4.47.0", "", { "dependencies": { "remove-accents": "^0.5.0" } }, "sha512-34UAKyzb7R4JhNgSFVQa9hu1aojlK6EtWsHWq9yEgz925PJ//EV6sfqHXFT5I6eKx+k5PNMjkrk4VxFYP6MZcg=="], "@wordpress/warning": ["@wordpress/warning@3.47.0", "", {}, "sha512-z4jb5zAMY1rFjNUMLaWz9BoHUe8uKfLqgM/20FooynH/AN9nKPBruJmiOOQvT+5m0sIZ8i7roGW2OdpRjtWP2g=="], @@ -1573,6 +1653,8 @@ "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + "date-fns": ["date-fns@4.4.0", "", {}, "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w=="], + "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], "debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1677,6 +1759,8 @@ "envinfo": ["envinfo@7.21.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow=="], + "equivalent-key-map": ["equivalent-key-map@0.2.2", "", {}, "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew=="], + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], @@ -1865,6 +1949,8 @@ "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], + "framer-motion": ["framer-motion@11.18.2", "", { "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" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="], + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "fs-exists-sync": ["fs-exists-sync@0.1.0", "", {}, "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg=="], @@ -1985,6 +2071,8 @@ "header-case": ["header-case@2.0.4", "", { "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q=="], + "highlight-words-core": ["highlight-words-core@1.2.3", "", {}, "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ=="], + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], "homedir-polyfill": ["homedir-polyfill@1.0.3", "", { "dependencies": { "parse-passwd": "^1.0.0" } }, "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="], @@ -2139,6 +2227,8 @@ "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], "is-relative": ["is-relative@1.0.0", "", { "dependencies": { "is-unc-path": "^1.0.0" } }, "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA=="], @@ -2443,6 +2533,16 @@ "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], + "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], + + "moment-timezone": ["moment-timezone@0.5.48", "", { "dependencies": { "moment": "^2.29.4" } }, "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw=="], + + "motion-dom": ["motion-dom@11.18.1", "", { "dependencies": { "motion-utils": "^11.18.1" } }, "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw=="], + + "motion-utils": ["motion-utils@11.18.1", "", {}, "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA=="], + + "mousetrap": ["mousetrap@1.6.5", "", {}, "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="], + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -2585,7 +2685,7 @@ "path-root-regex": ["path-root-regex@0.1.2", "", {}, "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ=="], - "path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], @@ -2771,6 +2871,8 @@ "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], + "re-resizable": ["re-resizable@6.11.2", "", { "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" } }, "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A=="], + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], "react-ace": ["react-ace@14.0.1", "", { "dependencies": { "ace-builds": "^1.36.3", "diff-match-patch": "^1.0.5", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", "prop-types": "^15.8.1" }, "peerDependencies": { "react": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.13.0 || ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-z6YAZ20PNf/FqmYEic//G/UK6uw0rn21g58ASgHJHl9rfE4nITQLqthr9rHMVQK4ezwohJbp2dGrZpkq979PYQ=="], @@ -2779,10 +2881,14 @@ "react-color": ["react-color@2.19.3", "", { "dependencies": { "@icons/material": "^0.2.4", "lodash": "^4.17.15", "lodash-es": "^4.17.15", "material-colors": "^1.2.1", "prop-types": "^15.5.10", "reactcss": "^1.2.0", "tinycolor2": "^1.4.1" }, "peerDependencies": { "react": "*" } }, "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA=="], + "react-colorful": ["react-colorful@5.8.0", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-Wy9OzPfjSN9bF12OB8N7UQvlsZ0I+7wHxpN+bV5BjNQGxOj6IiwkRjevJK9yOBjJWGQvAaf1OXtn8rUeEatAng=="], + "react-countdown": ["react-countdown@2.3.6", "", { "dependencies": { "prop-types": "^15.7.2" }, "peerDependencies": { "react": ">= 15", "react-dom": ">= 15" } }, "sha512-ZfX6S08Hb6x6W6eCn1hMDvxPICI/T30fd+gaeVTCR/2cGZ2WJ3f26e4ImNIMX1fHkopJrUdnRpWXP13/D39+gg=="], "react-countup": ["react-countup@6.5.3", "", { "dependencies": { "countup.js": "^2.8.0" }, "peerDependencies": { "react": ">= 16.3.0" } }, "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w=="], + "react-day-picker": ["react-day-picker@10.0.1", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0" }, "peerDependencies": { "@types/react": ">=16.8.0", "react": ">=16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w=="], + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], "react-google-recaptcha": ["react-google-recaptcha@3.1.0", "", { "dependencies": { "prop-types": "^15.5.0", "react-async-script": "^1.2.0" }, "peerDependencies": { "react": ">=16.4.1" } }, "sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg=="], @@ -2829,6 +2935,8 @@ "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="], + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], @@ -2845,6 +2953,8 @@ "regjsparser": ["regjsparser@0.13.1", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw=="], + "rememo": ["rememo@4.0.2", "", {}, "sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ=="], + "remove-accents": ["remove-accents@0.5.0", "", {}, "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="], "remove-trailing-separator": ["remove-trailing-separator@1.1.0", "", {}, "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw=="], @@ -2853,6 +2963,8 @@ "replace-homedir": ["replace-homedir@2.0.0", "", {}, "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw=="], + "requestidlecallback": ["requestidlecallback@0.3.0", "", {}, "sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -2863,6 +2975,8 @@ "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + "reselect": ["reselect@5.3.0", "", {}, "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg=="], + "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], "resolve-bin": ["resolve-bin@0.4.3", "", { "dependencies": { "find-parent-dir": "~0.3.0" } }, "sha512-9u8TMpc+SEHXxQXblXHz5yRvRZERkCZimFN9oz85QI3uhkh7nqfjm6OGTLg+8vucpXGcY4jLK6WkylPmt7GSvw=="], @@ -2893,6 +3007,8 @@ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "rungen": ["rungen@0.3.2", "", {}, "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw=="], + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], "safe-array-concat": ["safe-array-concat@1.1.4", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="], @@ -3241,11 +3357,15 @@ "use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA=="], + "use-memo-one": ["use-memo-one@1.1.3", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "uuid": ["uuid@14.0.2", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ=="], "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], @@ -3361,6 +3481,8 @@ "zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + "@ariakit/react-components/@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + "@babel/core/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "@babel/helper-define-polyfill-provider/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -3373,6 +3495,16 @@ "@babel/traverse/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@base-ui/react/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@base-ui/react/@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg=="], + + "@base-ui/react/@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + + "@base-ui/utils/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@base-ui/utils/@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + "@cacheable/memory/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], "@cacheable/utils/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], @@ -3385,6 +3517,8 @@ "@emotion/react/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + "@emotion/styled/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], @@ -3421,7 +3555,7 @@ "@kadence/components/@wordpress/icons": ["@wordpress/icons@9.49.0", "", { "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/element": "^5.35.0", "@wordpress/primitives": "^3.56.0" } }, "sha512-Z8F+ledkfkcKDuS1c/RkM0dEWdfv2AXs6bCgey89p0atJSscf7qYbMJR9zE5rZ5aqXyFfV0DAFKJEgayNqneNQ=="], - "@kadence/helpers/@kadence/icons": ["@kadence/icons@github:stellarwp/kadence-icons#71383e2", { "peerDependencies": { "react": ">=17 <19", "react-dom": ">=17 <19" } }, "stellarwp-kadence-icons-71383e2", "sha512-HSFk/BhXV7AEMtUc4kave8zoY+B25tm5lvAsm9xFFQ/lUimee4j8MnmVoXZL8EJxXLNBBclhmGEpbCPPh/6+gA=="], + "@kadence/helpers/@kadence/icons": ["@kadence/icons@github:stellarwp/kadence-icons#f056b8b", { "peerDependencies": { "react": ">=17 <19", "react-dom": ">=17 <19" } }, "stellarwp-kadence-icons-f056b8b"], "@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], @@ -3473,19 +3607,47 @@ "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@wordpress/a11y/@wordpress/i18n": ["@wordpress/i18n@6.26.0", "", { "dependencies": { "@tannin/sprintf": "^1.3.2", "@wordpress/hooks": "^4.53.0", "gettext-parser": "^1.3.1", "tannin": "^1.2.0" }, "bin": { "pot-to-php": "tools/pot-to-php.js" } }, "sha512-v/LzeB7T5YKIfBgmLM0jYG8zOuu81biZ90j8RY9pHIVu+jdRE+DSmt55S3FvtXRo5J2X9FoigFRzYPKXLbitWA=="], + "@wordpress/babel-preset-default/@babel/core": ["@babel/core@7.25.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", "@babel/generator": "^7.25.7", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", "@babel/parser": "^7.25.7", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow=="], "@wordpress/babel-preset-default/react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], + "@wordpress/components/@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg=="], + + "@wordpress/components/@wordpress/hooks": ["@wordpress/hooks@4.53.0", "", {}, "sha512-YU30rweJCTu5g7X8bc+w6QyoxJBYLEHH++Wwo/IbbROHUC/4I7e+ZtxnPWls8BTtMP4d28JJ74s+UoKpzd2J7w=="], + + "@wordpress/components/@wordpress/i18n": ["@wordpress/i18n@6.26.0", "", { "dependencies": { "@tannin/sprintf": "^1.3.2", "@wordpress/hooks": "^4.53.0", "gettext-parser": "^1.3.1", "tannin": "^1.2.0" }, "bin": { "pot-to-php": "tools/pot-to-php.js" } }, "sha512-v/LzeB7T5YKIfBgmLM0jYG8zOuu81biZ90j8RY9pHIVu+jdRE+DSmt55S3FvtXRo5J2X9FoigFRzYPKXLbitWA=="], + + "@wordpress/components/@wordpress/icons": ["@wordpress/icons@15.4.0", "", { "dependencies": { "@wordpress/element": "^8.5.0", "@wordpress/primitives": "^4.53.0", "change-case": "^4.1.2" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-0NNoJkGZuFM4j60vdxzINXfUpMOGkoyPRqN0an6sRLoa6wHYuM4Yt4sZJet4xA6ft3z8+xNUvrAd92dF2tpFBg=="], + + "@wordpress/components/@wordpress/primitives": ["@wordpress/primitives@4.53.0", "", { "dependencies": { "@wordpress/element": "^8.5.0", "clsx": "^2.1.1" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-yZdmql3vzzVhC0mcu5sKGMUXBrKGODQYZWvHsLwJMSSciFHvns/TyDloodID/naJZL243xUSN/hfKp7PIzXNRw=="], + + "@wordpress/components/@wordpress/warning": ["@wordpress/warning@3.53.0", "", {}, "sha512-pNco8mfQM5EUJZ4m6zuHxyjnCvOKeZtxu9UGYQIRtEEMAKQJgz6HdHXKt+xQHvLA5Wi/bd0kPK5AWrl1wM22Tg=="], + + "@wordpress/components/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + + "@wordpress/compose/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + + "@wordpress/deprecated/@wordpress/hooks": ["@wordpress/hooks@4.53.0", "", {}, "sha512-YU30rweJCTu5g7X8bc+w6QyoxJBYLEHH++Wwo/IbbROHUC/4I7e+ZtxnPWls8BTtMP4d28JJ74s+UoKpzd2J7w=="], + "@wordpress/e2e-test-utils-playwright/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], "@wordpress/element/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], "@wordpress/eslint-plugin/@babel/eslint-parser": ["@babel/eslint-parser@7.25.7", "", { "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw=="], + "@wordpress/icons/@wordpress/element": ["@wordpress/element@6.46.0", "", { "dependencies": { "@types/react": "^18.3.27", "@types/react-dom": "^18.3.1", "@wordpress/escape-html": "^3.46.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^18.3.0", "react-dom": "^18.3.0" } }, "sha512-hjnrqZi0cZVdkmN0xQavKfSQJYAkb9pVSnDPpuX65OLxeD9/EWkIXvFzBb+nH8c4NzKKSqQU96XCTQrH37OCIA=="], + + "@wordpress/kebab-case/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + + "@wordpress/keycodes/@wordpress/i18n": ["@wordpress/i18n@6.26.0", "", { "dependencies": { "@tannin/sprintf": "^1.3.2", "@wordpress/hooks": "^4.53.0", "gettext-parser": "^1.3.1", "tannin": "^1.2.0" }, "bin": { "pot-to-php": "tools/pot-to-php.js" } }, "sha512-v/LzeB7T5YKIfBgmLM0jYG8zOuu81biZ90j8RY9pHIVu+jdRE+DSmt55S3FvtXRo5J2X9FoigFRzYPKXLbitWA=="], + + "@wordpress/postcss-plugins-preset/@wordpress/base-styles": ["@wordpress/base-styles@9.0.0", "", {}, "sha512-sg9NOQkrponLpabONPB3vlsIFHv7GCRDCru3ym5UcASAHlCgBHzQjOReiVnhMjhJf7kZS2OU8TpYQcDJLAaItA=="], + "@wordpress/primitives/@wordpress/element": ["@wordpress/element@7.0.0", "", { "dependencies": { "@types/react": "^19.2.13", "@types/react-dom": "^19.2.3", "@wordpress/deprecated": "^4.47.0", "@wordpress/escape-html": "^3.47.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^19.2.4", "react-dom": "^19.2.4" } }, "sha512-iJoc3pzeof0mhwN0gVqDqc64xCRoAij2JynU6YxGSmw5a1uJwi1w3GESX3nPR1eaDdv2V6vwkinMBI+aGG7wxQ=="], - "@wordpress/primitives/react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], + "@wordpress/rich-text/@wordpress/i18n": ["@wordpress/i18n@6.26.0", "", { "dependencies": { "@tannin/sprintf": "^1.3.2", "@wordpress/hooks": "^4.53.0", "gettext-parser": "^1.3.1", "tannin": "^1.2.0" }, "bin": { "pot-to-php": "tools/pot-to-php.js" } }, "sha512-v/LzeB7T5YKIfBgmLM0jYG8zOuu81biZ90j8RY9pHIVu+jdRE+DSmt55S3FvtXRo5J2X9FoigFRzYPKXLbitWA=="], "@wordpress/scripts/@babel/core": ["@babel/core@7.25.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", "@babel/generator": "^7.25.7", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", "@babel/parser": "^7.25.7", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow=="], @@ -3495,9 +3657,17 @@ "@wordpress/theme/@wordpress/element": ["@wordpress/element@7.0.0", "", { "dependencies": { "@types/react": "^19.2.13", "@types/react-dom": "^19.2.3", "@wordpress/deprecated": "^4.47.0", "@wordpress/escape-html": "^3.47.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^19.2.4", "react-dom": "^19.2.4" } }, "sha512-iJoc3pzeof0mhwN0gVqDqc64xCRoAij2JynU6YxGSmw5a1uJwi1w3GESX3nPR1eaDdv2V6vwkinMBI+aGG7wxQ=="], - "@wordpress/theme/react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], + "@wordpress/theme/@wordpress/private-apis": ["@wordpress/private-apis@1.47.0", "", {}, "sha512-DfwLsmencI2LUZhY6u1aZCwZYO1ILuyJf7Cn15G/gVbPlA7pBJp9YVFk+3FR5U35I0e0infNMDDn8u5632urmQ=="], + + "@wordpress/theme/@wordpress/style-runtime": ["@wordpress/style-runtime@0.3.0", "", {}, "sha512-CWSGDSIjHO6Ww/BK0jfF6WbVLQWoQNEUEeh4/YBFpMrzjWvhS7RD5ZGt88HZkazEXywovA6q2302OZsyfzP/zA=="], + + "@wordpress/ui/@wordpress/i18n": ["@wordpress/i18n@6.26.0", "", { "dependencies": { "@tannin/sprintf": "^1.3.2", "@wordpress/hooks": "^4.53.0", "gettext-parser": "^1.3.1", "tannin": "^1.2.0" }, "bin": { "pot-to-php": "tools/pot-to-php.js" } }, "sha512-v/LzeB7T5YKIfBgmLM0jYG8zOuu81biZ90j8RY9pHIVu+jdRE+DSmt55S3FvtXRo5J2X9FoigFRzYPKXLbitWA=="], - "@wordpress/theme/react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="], + "@wordpress/ui/@wordpress/icons": ["@wordpress/icons@15.4.0", "", { "dependencies": { "@wordpress/element": "^8.5.0", "@wordpress/primitives": "^4.53.0", "change-case": "^4.1.2" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-0NNoJkGZuFM4j60vdxzINXfUpMOGkoyPRqN0an6sRLoa6wHYuM4Yt4sZJet4xA6ft3z8+xNUvrAd92dF2tpFBg=="], + + "@wordpress/ui/@wordpress/primitives": ["@wordpress/primitives@4.53.0", "", { "dependencies": { "@wordpress/element": "^8.5.0", "clsx": "^2.1.1" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-yZdmql3vzzVhC0mcu5sKGMUXBrKGODQYZWvHsLwJMSSciFHvns/TyDloodID/naJZL243xUSN/hfKp7PIzXNRw=="], + + "@wordpress/ui/@wordpress/theme": ["@wordpress/theme@1.2.0", "", { "dependencies": { "@wordpress/compose": "^8.6.0", "@wordpress/deprecated": "^4.53.0", "@wordpress/element": "^8.5.0", "@wordpress/private-apis": "^1.53.0", "@wordpress/style-runtime": "^0.9.0", "colorjs.io": "^0.7.1", "memize": "^2.1.1" }, "peerDependencies": { "@types/react": "^18 || ^19", "esbuild": ">=0.27.2 <1.0.0", "postcss": "^8.0.0", "react": "^18 || ^19", "react-dom": "^18 || ^19", "stylelint": "^16 || ^17", "vite": "^7 || ^8" }, "optionalPeers": ["@types/react", "esbuild", "postcss", "stylelint", "vite"] }, "sha512-pILS4ytGGiASrpJ8sLp+pRbcBspFYeMTr5LdM4fWBv/EN2CIKhBLpX3qGlXwKzS+HzjrbXZwj60Bfbg/PxvQew=="], "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], @@ -3605,6 +3775,8 @@ "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "express/path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], + "express/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "extract-zip/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -3843,6 +4015,8 @@ "shallow-clone/lazy-cache": ["lazy-cache@0.2.7", "", {}, "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ=="], + "sockjs/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "socks-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "socks-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -3929,6 +4103,12 @@ "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "@ariakit/react-components/@floating-ui/dom/@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + + "@ariakit/react-components/@floating-ui/dom/@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + + "@base-ui/react/@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], @@ -3953,25 +4133,55 @@ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + "@wordpress/a11y/@wordpress/i18n/@wordpress/hooks": ["@wordpress/hooks@4.53.0", "", {}, "sha512-YU30rweJCTu5g7X8bc+w6QyoxJBYLEHH++Wwo/IbbROHUC/4I7e+ZtxnPWls8BTtMP4d28JJ74s+UoKpzd2J7w=="], + "@wordpress/babel-preset-default/@babel/core/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "@wordpress/components/@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + + "@wordpress/icons/@wordpress/element/@wordpress/escape-html": ["@wordpress/escape-html@3.47.0", "", {}, "sha512-3D3dlMxpfc3rTrxASc5osqIR3gp+WgQSn8aqN+1zP8VctM0hm7HdzIix0LwPbyw64DfLiG/jnlRBrtHF6S9UQw=="], + + "@wordpress/icons/@wordpress/element/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + + "@wordpress/keycodes/@wordpress/i18n/@wordpress/hooks": ["@wordpress/hooks@4.53.0", "", {}, "sha512-YU30rweJCTu5g7X8bc+w6QyoxJBYLEHH++Wwo/IbbROHUC/4I7e+ZtxnPWls8BTtMP4d28JJ74s+UoKpzd2J7w=="], + "@wordpress/primitives/@wordpress/element/@types/react": ["@types/react@19.2.15", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q=="], "@wordpress/primitives/@wordpress/element/@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + "@wordpress/primitives/@wordpress/element/@wordpress/deprecated": ["@wordpress/deprecated@4.47.0", "", { "dependencies": { "@wordpress/hooks": "^4.47.0" } }, "sha512-SPmYu3Ihqfaqve4xEKf8+SAhae9UuYLncFovXHHEHeNrKwldYyNy3fm+3Aifd/RK5r7Vc7nr0zONYkuhWkDlNw=="], + + "@wordpress/primitives/@wordpress/element/@wordpress/escape-html": ["@wordpress/escape-html@3.47.0", "", {}, "sha512-3D3dlMxpfc3rTrxASc5osqIR3gp+WgQSn8aqN+1zP8VctM0hm7HdzIix0LwPbyw64DfLiG/jnlRBrtHF6S9UQw=="], + "@wordpress/primitives/@wordpress/element/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + "@wordpress/primitives/@wordpress/element/react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], + "@wordpress/primitives/@wordpress/element/react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="], + "@wordpress/rich-text/@wordpress/i18n/@wordpress/hooks": ["@wordpress/hooks@4.53.0", "", {}, "sha512-YU30rweJCTu5g7X8bc+w6QyoxJBYLEHH++Wwo/IbbROHUC/4I7e+ZtxnPWls8BTtMP4d28JJ74s+UoKpzd2J7w=="], + "@wordpress/scripts/@babel/core/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "@wordpress/theme/@wordpress/element/@types/react": ["@types/react@19.2.15", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q=="], "@wordpress/theme/@wordpress/element/@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + "@wordpress/theme/@wordpress/element/@wordpress/deprecated": ["@wordpress/deprecated@4.47.0", "", { "dependencies": { "@wordpress/hooks": "^4.47.0" } }, "sha512-SPmYu3Ihqfaqve4xEKf8+SAhae9UuYLncFovXHHEHeNrKwldYyNy3fm+3Aifd/RK5r7Vc7nr0zONYkuhWkDlNw=="], + + "@wordpress/theme/@wordpress/element/@wordpress/escape-html": ["@wordpress/escape-html@3.47.0", "", {}, "sha512-3D3dlMxpfc3rTrxASc5osqIR3gp+WgQSn8aqN+1zP8VctM0hm7HdzIix0LwPbyw64DfLiG/jnlRBrtHF6S9UQw=="], + "@wordpress/theme/@wordpress/element/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], - "@wordpress/theme/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@wordpress/theme/@wordpress/element/react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], + + "@wordpress/theme/@wordpress/element/react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="], + + "@wordpress/ui/@wordpress/i18n/@wordpress/hooks": ["@wordpress/hooks@4.53.0", "", {}, "sha512-YU30rweJCTu5g7X8bc+w6QyoxJBYLEHH++Wwo/IbbROHUC/4I7e+ZtxnPWls8BTtMP4d28JJ74s+UoKpzd2J7w=="], + + "@wordpress/ui/@wordpress/icons/change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + + "@wordpress/ui/@wordpress/theme/colorjs.io": ["colorjs.io@0.7.1", "", {}, "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA=="], "bl/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], @@ -4093,6 +4303,8 @@ "webpack-merge/clone-deep/shallow-clone": ["shallow-clone@3.0.1", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="], + "@base-ui/react/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "@istanbuljs/load-nyc-config/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], @@ -4105,8 +4317,14 @@ "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@wordpress/components/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + + "@wordpress/components/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + "@wordpress/primitives/@wordpress/element/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "@wordpress/theme/@wordpress/element/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "bl/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], diff --git a/composer.json b/composer.json index 013cbbc251..ed59de546c 100644 --- a/composer.json +++ b/composer.json @@ -64,6 +64,7 @@ "codeception/util-universalframework": "^1.0", "exussum12/coverage-checker": "^1.0", "lucatume/wp-browser": "<3.5", + "lucatume/wp-snaphot-assertions": "^2", "phpcompatibility/phpcompatibility-wp": "^2.1", "phpstan/extension-installer": "^1.4", "sabberworm/php-css-parser": "^8.4", @@ -77,6 +78,7 @@ }, "autoload-dev": { "psr-4": { + "KadenceWP\\KadenceBlocks\\Dev\\": "dev_scripts/src/", "Tests\\": "tests/", "Tests\\Acceptance\\": "tests/acceptance/", "Tests\\Support\\": "tests/_support/", @@ -84,6 +86,9 @@ } }, "scripts": { + "generate-dtcg-schema": [ + "@php dev_scripts/bin/generate-dtcg-schema.php" + ], "stellar-uplink": [ "vendor/bin/stellar-uplink domain=kadence-blocks" ], @@ -138,7 +143,7 @@ ], "phpcs": "phpcs --standard=phpcs.xml", "phpcs-autofix": "phpcbf --standard=phpcs.xml", - "phpcs-ci": "dev_scripts/partial-phpcs.sh diff", + "phpcs-ci": "dev_scripts/bin/partial-phpcs.sh diff", "phpstan": "./vendor/bin/phpstan analyse --memory-limit=4096M", "phpstan-baseline": "./vendor/bin/phpstan analyse --memory-limit=4096M --level max --configuration phpstan.neon --generate-baseline" }, diff --git a/composer.lock b/composer.lock index 08f5331715..07ac480640 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9dc31cbf2f71ab015a82f3cfd0a5215c", + "content-hash": "7fa10ef0fab7b91815557a81d5c08d0c", "packages": [ { "name": "adbario/php-dot-notation", @@ -4951,6 +4951,53 @@ }, "time": "2021-04-17T13:49:01+00:00" }, + { + "name": "electrolinux/phpquery", + "version": "0.9.7", + "source": { + "type": "git", + "url": "https://github.com/electrolinux/phpquery.git", + "reference": "90029e2acffebebdb6e309509c778fe34e8028ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/electrolinux/phpquery/zipball/90029e2acffebebdb6e309509c778fe34e8028ba", + "reference": "90029e2acffebebdb6e309509c778fe34e8028ba", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "phpQuery/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "didier Belot", + "homepage": "https://github.com/electrolinux/phpquery", + "role": "Packager, maintainer" + }, + { + "name": "Tobiasz Cudnik", + "email": "tobiasz.cudnik@gmail.com", + "homepage": "https://github.com/TobiaszCudnik", + "role": "Developer" + } + ], + "description": "phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library", + "homepage": "http://code.google.com/p/phpquery/", + "support": { + "source": "https://github.com/electrolinux/phpquery/tree/0.9.7" + }, + "time": "2023-05-02T18:27:16+00:00" + }, { "name": "exussum12/coverage-checker", "version": "1.1.0", @@ -5936,6 +5983,55 @@ ], "time": "2024-01-08T08:27:20+00:00" }, + { + "name": "lucatume/wp-snaphot-assertions", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/lucatume/wp-snapshot-assertions.git", + "reference": "f4b3999eef1fb252eb660df2f6cb736f75500e93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lucatume/wp-snapshot-assertions/zipball/f4b3999eef1fb252eb660df2f6cb736f75500e93", + "reference": "f4b3999eef1fb252eb660df2f6cb736f75500e93", + "shasum": "" + }, + "require": { + "electrolinux/phpquery": "^0.9.6", + "ext-dom": "*", + "php": "^7.3|^7.4|^8.0", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "tad\\WP\\Snapshots\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "theAverageDev (Luca Tumedei)", + "email": "luca@theaveragedev.com" + } + ], + "description": "A set of utilities to support snapshot testing of WordPress code.", + "homepage": "https://github.com/lucatume/wp-snaphot-assertions", + "keywords": [ + "snapshot", + "testing", + "wordpress" + ], + "support": { + "issues": "https://github.com/lucatume/wp-snapshot-assertions/issues", + "source": "https://github.com/lucatume/wp-snapshot-assertions/tree/2.0.0" + }, + "time": "2022-10-14T10:40:10+00:00" + }, { "name": "marc-mabe/php-enum", "version": "v4.7.2", @@ -9354,6 +9450,74 @@ ], "time": "2025-09-13T08:53:30+00:00" }, + { + "name": "spatie/phpunit-snapshot-assertions", + "version": "4.2.17", + "source": { + "type": "git", + "url": "https://github.com/spatie/phpunit-snapshot-assertions.git", + "reference": "29a03a81f4c289e4769d4f4a010432cbef6ce39d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/phpunit-snapshot-assertions/zipball/29a03a81f4c289e4769d4f4a010432cbef6ce39d", + "reference": "29a03a81f4c289e4769d4f4a010432cbef6ce39d", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "php": "^7.3|^7.4|^8.0", + "phpunit/phpunit": "^8.3|^9.0", + "symfony/property-access": "^4.0|^5.0|^6.0|^7.0", + "symfony/serializer": "^4.0|^5.0|^6.0|^7.0", + "symfony/yaml": "^4.0|^5.0|^6.0|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Snapshots\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Snapshot testing with PHPUnit", + "homepage": "https://github.com/spatie/phpunit-snapshot-assertions", + "keywords": [ + "assert", + "phpunit", + "phpunit-snapshot-assertions", + "snapshot", + "spatie", + "testing" + ], + "support": { + "issues": "https://github.com/spatie/phpunit-snapshot-assertions/issues", + "source": "https://github.com/spatie/phpunit-snapshot-assertions/tree/4.2.17" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2024-05-03T07:52:41+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.13.5", @@ -10190,6 +10354,281 @@ ], "time": "2026-04-10T18:47:49+00:00" }, + { + "name": "symfony/property-access", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "111e7ed617509f1a9139686055d234aad6e388e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/111e7ed617509f1a9139686055d234aad6e388e0", + "reference": "111e7ed617509f1a9139686055d234aad6e388e0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/property-info": "^5.2|^6.0" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "a0396295ad585f95fccd690bc6a281e5bd303902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/a0396295ad585f95fccd690bc6a281e5bd303902", + "reference": "a0396295ad585f95fccd690bc6a281e5bd303902", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T16:14:41+00:00" + }, + { + "name": "symfony/serializer", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "460c5df9fb6c39d10d5b7f386e4feae4b6370221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/460c5df9fb6c39d10d5b7f386e4feae4b6370221", + "reference": "460c5df9fb6c39d10d5b7f386e4feae4b6370221", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", + "symfony/uid": "<5.3", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/property-access": "^5.4.26|^6.3", + "symfony/property-info": "^5.4.24|^6.2.11", + "symfony/uid": "^5.3|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, { "name": "symfony/translation", "version": "v5.4.45", @@ -12991,9 +13430,9 @@ "platform": { "ext-json": "*" }, - "platform-dev": {}, + "platform-dev": [], "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "2.9.0" + "plugin-api-version": "2.6.0" } diff --git a/dev_scripts/bin/generate-dtcg-schema.php b/dev_scripts/bin/generate-dtcg-schema.php new file mode 100755 index 0000000000..49c0b3f652 --- /dev/null +++ b/dev_scripts/bin/generate-dtcg-schema.php @@ -0,0 +1,59 @@ +generate(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . "\n"; + +if ( $check ) { + $current = is_file( $target ) ? (string) file_get_contents( $target ) : ''; + + if ( $current === $expected ) { + fwrite( STDOUT, "ok: dtcg.schema.json is up to date.\n" ); + exit( 0 ); + } + + fwrite( STDERR, "error: dtcg.schema.json is stale. Run `composer generate-dtcg-schema` to regenerate.\n" ); + exit( 1 ); +} + +if ( file_put_contents( $target, $expected ) === false ) { + fwrite( STDERR, sprintf( "error: could not write %s\n", $target ) ); + exit( 1 ); +} + +fwrite( STDOUT, sprintf( "wrote %s (%d bytes)\n", $target, strlen( $expected ) ) ); +exit( 0 ); diff --git a/dev_scripts/partial-phpcs.sh b/dev_scripts/bin/partial-phpcs.sh similarity index 100% rename from dev_scripts/partial-phpcs.sh rename to dev_scripts/bin/partial-phpcs.sh diff --git a/dev_scripts/src/Design_Tokens/Schema/Dtcg_Schema_Generator.php b/dev_scripts/src/Design_Tokens/Schema/Dtcg_Schema_Generator.php new file mode 100644 index 0000000000..3b44315ec9 --- /dev/null +++ b/dev_scripts/src/Design_Tokens/Schema/Dtcg_Schema_Generator.php @@ -0,0 +1,349 @@ + + */ + public function generate(): array { + return [ + '$schema' => 'http://json-schema.org/draft-07/schema#', + '$id' => self::SCHEMA_ID, + 'title' => 'Kadence Blocks DTCG document', + 'description' => 'Design Tokens Community Group document for the Kadence Blocks Design Tokens module. Generated from the PHP source of truth (Token_Type, Alias); do not edit by hand.', + 'type' => 'object', + 'properties' => [ + '$description' => [ 'type' => 'string' ], + '$extensions' => [ 'type' => 'object' ], + ], + 'patternProperties' => [ + self::GROUP_KEY_PATTERN => [ '$ref' => '#/definitions/node' ], + ], + 'additionalProperties' => false, + 'definitions' => $this->definitions(), + ]; + } + + /** + * The reusable schema definitions. + * + * @since TBD + * + * @return array + */ + private function definitions(): array { + return [ + 'alias' => [ + 'type' => 'string', + 'pattern' => Alias::get_pattern(), + 'description' => 'A whole-string DTCG alias, e.g. "{primitive.color.brand.primary}".', + ], + /** + * A node is exactly one of a token leaf or a group of child nodes. They are mutually + * exclusive: a leaf requires $type + $value (and forbids non-"$" children), a group forbids + * $type/$value (additionalProperties:false) and recurses into child nodes. if/then is avoided + * deliberately — the dev-side draft-07 engine (justinrainbow) does not enforce it. + */ + 'node' => [ + 'type' => 'object', + 'oneOf' => [ + [ '$ref' => '#/definitions/leaf' ], + [ '$ref' => '#/definitions/group' ], + ], + ], + 'group' => [ + 'type' => 'object', + 'properties' => [ + '$description' => [ 'type' => 'string' ], + '$extensions' => [ 'type' => 'object' ], + ], + 'patternProperties' => [ + self::GROUP_KEY_PATTERN => [ '$ref' => '#/definitions/node' ], + ], + 'additionalProperties' => false, + ], + 'leaf' => [ + 'type' => 'object', + 'required' => [ '$type', '$value' ], + 'properties' => [ + '$type' => [ 'enum' => Token_Type::all() ], + '$value' => true, + '$description' => [ 'type' => 'string' ], + '$extensions' => [ 'type' => 'object' ], + ], + // Select the $value shape by $type: exactly one branch's $type const matches. + 'oneOf' => $this->value_branches(), + 'additionalProperties' => false, + ], + ] + $this->value_definitions() + $this->responsive_definitions(); + } + + /** + * One branch per $type pinning $type to a const and $value to that type's value schema. The branches + * are mutually exclusive (distinct $type consts), so the enclosing oneOf selects exactly one. + * + * @since TBD + * + * @return array> + */ + private function value_branches(): array { + $branches = []; + + foreach ( Token_Type::all() as $type ) { + $properties = [ + '$type' => [ 'const' => $type ], + '$value' => [ '$ref' => '#/definitions/' . $this->value_def_name( $type ) ], + ]; + + // Responsive-capable types further constrain $extensions to the responsive / clamp shape; other + // types keep the generic leaf-level $extensions:{type:object}. + if ( Responsive::is_responsive_capable( $type ) ) { + $properties['$extensions'] = [ '$ref' => '#/definitions/' . $this->extensions_def_name( $type ) ]; + } + + $branches[] = [ + 'properties' => $properties, + 'required' => [ '$type', '$value' ], + ]; + } + + return $branches; + } + + /** + * The per-type $value definitions, each "alias OR the type's literal shape". anyOf (not oneOf): + * an alias is itself a string, so a string literal branch would otherwise double-match an alias. + * + * @since TBD + * + * @return array + */ + private function value_definitions(): array { + $defs = []; + + foreach ( Token_Type::all() as $type ) { + $defs[ $this->value_def_name( $type ) ] = [ + 'anyOf' => [ + [ '$ref' => '#/definitions/alias' ], + $this->literal_shape( $type ), + ], + ]; + } + + return $defs; + } + + /** + * The permissive literal shape for a $type. Composite types are built from composite_fields() so the + * field set tracks Token_Type; scalar literal grammar stays permissive (PHP Literals is the authority). + * + * @since TBD + * + * @param string $type A v1 $type. + * + * @return array + */ + private function literal_shape( string $type ): array { + if ( $type === Token_Type::get_type_font_family() ) { + return [ + 'type' => 'array', + 'items' => [ 'type' => 'string' ], + 'minItems' => 1, + ]; + } + + if ( Token_Type::is_composite( $type ) ) { + return $this->composite_shape( $type ); + } + + // fontWeight (400 / "bold") and lineHeight (1.5 / "1.5rem") accept a number as well as a string. + if ( $type === Token_Type::get_type_font_weight() || $type === Token_Type::get_type_line_height() ) { + return [ 'type' => [ 'string', 'number' ] ]; + } + + // color, dimension, fontStyle, textTransform, borderStyle: a literal string. PHP Literals + // enforces grammar. + return [ 'type' => 'string' ]; + } + + /** + * The object shape for a composite type: every sub-field required, each "alias OR the sub-field's own + * $type shape". + * + * @since TBD + * + * @param string $type A composite $type. + * + * @return array + */ + private function composite_shape( string $type ): array { + $fields = Token_Type::composite_fields( $type ); + $properties = []; + + foreach ( $fields as $field => $field_type ) { + $properties[ $field ] = [ + 'anyOf' => [ + [ '$ref' => '#/definitions/alias' ], + $this->literal_shape( $field_type ), + ], + ]; + } + + return [ + 'type' => 'object', + 'required' => array_keys( $fields ), + 'properties' => $properties, + 'additionalProperties' => false, + ]; + } + + /** + * The per-type $extensions definitions for responsive-capable types. Each models the module's + * leaf-extension namespace carrying an optional per-breakpoint `responsive` map and an optional + * structured `clamp` map; each breakpoint / bound slot is "alias OR the type's literal shape". Mutual + * exclusivity of responsive vs clamp and the not-allowed-on-other-types rule are enforced by the PHP + * validator (the authority), not encoded here; other namespaces / keys stay permitted (additive). + * + * @since TBD + * + * @return array + */ + private function responsive_definitions(): array { + $defs = []; + + foreach ( Token_Type::all() as $type ) { + if ( ! Responsive::is_responsive_capable( $type ) ) { + continue; + } + + $slot = [ + 'anyOf' => [ + [ '$ref' => '#/definitions/alias' ], + $this->literal_shape( $type ), + ], + ]; + + $defs[ $this->extensions_def_name( $type ) ] = [ + 'type' => 'object', + 'properties' => [ + Extensions::get_namespace() => [ + 'type' => 'object', + 'properties' => [ + Responsive::get_responsive_key() => [ + 'type' => 'object', + 'properties' => [ + Responsive::get_tablet_key() => $slot, + Responsive::get_mobile_key() => $slot, + ], + 'additionalProperties' => false, + ], + Responsive::get_clamp_key() => [ + 'type' => 'object', + 'required' => [ + Responsive::get_clamp_min_key(), + Responsive::get_clamp_preferred_key(), + Responsive::get_clamp_max_key(), + ], + 'properties' => [ + Responsive::get_clamp_min_key() => $slot, + Responsive::get_clamp_preferred_key() => [ 'type' => 'string' ], + Responsive::get_clamp_max_key() => $slot, + ], + 'additionalProperties' => false, + ], + ], + ], + ], + ]; + } + + return $defs; + } + + /** + * Stable definition name for a type's $value schema. + * + * @since TBD + * + * @param string $type A v1 $type. + * + * @return string + */ + private function value_def_name( string $type ): string { + return $type . 'Value'; + } + + /** + * Stable definition name for a responsive-capable type's $extensions schema. + * + * @since TBD + * + * @param string $type A responsive-capable $type. + * + * @return string + */ + private function extensions_def_name( string $type ): string { + return $type . 'Extensions'; + } +} diff --git a/includes/blocks/class-kadence-blocks-abstract-block.php b/includes/blocks/class-kadence-blocks-abstract-block.php index 6eab4cbde5..ae3afe3786 100644 --- a/includes/blocks/class-kadence-blocks-abstract-block.php +++ b/includes/blocks/class-kadence-blocks-abstract-block.php @@ -10,6 +10,10 @@ exit; } +use KadenceWP\KadenceBlocks\Design_Tokens\Projection\Palette\Renders_Palette_Attribute; +use KadenceWP\KadenceBlocks\Design_Tokens\Projection\Preset\Renders_Preset_Classes; +use KadenceWP\KadenceBlocks\Design_Tokens\Schema\Vocabulary\Alias; + /** * Abstract class to register blocks, build CSS, and enqueue scripts. * @@ -17,6 +21,9 @@ */ class Kadence_Blocks_Abstract_Block { + use Renders_Palette_Attribute; + use Renders_Preset_Classes; + /** * Block namespace. * @@ -96,6 +103,7 @@ class Kadence_Blocks_Abstract_Block { 'accept', 'captcha', 'submit', + 'single-icon', ]; /** @@ -288,6 +296,8 @@ public function render_css( $attributes, $content, $block_instance ) { $attributes = apply_filters( 'kadence_blocks_' . str_replace( '-', '_', $this->block_name ) . '_render_block_attributes', $attributes, $block_instance ); $content = $this->build_html( $attributes, $unique_id, $content, $block_instance ); + $content = $this->render_palette_attribute( $attributes, $content ); + $content = $this->render_preset_class( $attributes, $content ); if ( ! $css_class->has_styles( 'kb-' . $this->block_name . $unique_style_id ) && ! is_feed() && apply_filters( 'kadence_blocks_render_inline_css', true, $this->block_name, $unique_id ) ) { $css = $this->build_css( $attributes, $css_class, $unique_id, $unique_style_id ); if ( ! empty( $css ) && ! wp_is_block_theme() ) { @@ -342,6 +352,89 @@ public function build_html( $attributes, $unique_id, $content, $block_instance ) return $content; } + /** + * Reflect a block's per-block color-palette override onto its rendered root element as + * data-kb-palette="", so the Design Tokens projector's `[data-kb-palette]` switch layer re-skins the + * block's colors on the front end. Generic across every dynamic block: a block opts in by registering the + * `kbPalette` attribute (via `kbPalette` block support) and needs no per-block PHP. A no-op when no palette + * is pinned, the content is empty, or it has no opening tag to carry the attribute. + * + * The attribute lands on the block's own root element (the tag carrying its `wp-block--` + * class), not an outer wrapper such as an animation `data-aos` div, and the whole method short-circuits + * before any parsing when nothing is pinned. + * + * @since TBD + * + * @param mixed $attributes The block attributes. + * @param mixed $content The block's rendered HTML. + * + * @return mixed The HTML, with data-kb-palette set on the root element when a palette is pinned. + */ + protected function render_palette_attribute( $attributes, $content ) { + if ( ! is_array( $attributes ) || ! is_string( $content ) || $content === '' ) { + return $content; + } + + $palette = $this->palette_attributes( $attributes['kbPalette'] ?? '' ); + + if ( ! isset( $palette['data-kb-palette'] ) ) { + return $content; + } + + $tags = new WP_HTML_Tag_Processor( $content ); + + if ( ! $tags->next_tag( [ 'class_name' => 'wp-block-' . $this->namespace . '-' . $this->block_name ] ) ) { + return $content; + } + + $tags->set_attribute( 'data-kb-palette', $palette['data-kb-palette'] ); + + return $tags->get_updated_html(); + } + + /** + * Add a block's selected design-token preset class (`kb-preset--`) to its rendered root element, so + * the Design Tokens projector's scoped preset CSS applies on the front end. Generic across every dynamic + * block: a block opts in by registering the `kbPreset` attribute (via `kbPreset` block support) and needs + * no per-block PHP. A no-op when no preset is selected, the content is empty, or it has no opening tag to + * carry the class. + * + * The class lands on the block's own root element (the tag carrying its `wp-block--` class), + * not an outer wrapper such as an animation `data-aos` div — the scoped preset selector is compound on the + * block class (`.wp-block-.kb-preset--`), so a class on a wrapper never matches. The whole method + * short-circuits before any parsing when nothing is selected. + * + * @since TBD + * + * @param mixed $attributes The block attributes. + * @param mixed $content The block's rendered HTML. + * + * @return mixed The HTML, with the kb-preset-- class added to the root element when a preset is set. + */ + protected function render_preset_class( $attributes, $content ) { + if ( ! is_array( $attributes ) || ! is_string( $content ) || $content === '' ) { + return $content; + } + + $classes = $this->preset_classes( $attributes['kbPreset'] ?? '' ); + + if ( $classes === [] ) { + return $content; + } + + $tags = new WP_HTML_Tag_Processor( $content ); + + if ( ! $tags->next_tag( [ 'class_name' => 'wp-block-' . $this->namespace . '-' . $this->block_name ] ) ) { + return $content; + } + + foreach ( $classes as $preset_class ) { + $tags->add_class( $preset_class ); + } + + return $tags->get_updated_html(); + } + /** * Registers scripts and styles. */ @@ -415,7 +508,7 @@ public function get_html_tag( $attributes, $tag_key, $default, $allowed_tags = [ * * @param string $cache_key The cache key (usually unique id). * @param array $attributes The block's attributes. - * @param string $block_name The name of the block. + * @param bool $cache Whether to cache the merged result. Default true. * @return array */ public function get_attributes_with_defaults( $cache_key, $attributes, $cache = true ) { @@ -424,7 +517,31 @@ public function get_attributes_with_defaults( $cache_key, $attributes, $cache = } $default_attributes = $this->get_block_default_attributes(); - $merged_attributes = $this->merge_attributes_with_defaults( $attributes, $default_attributes ); + + /** + * Filters a block's default attributes before they are merged with the instance's attributes. + * + * Lets a module contribute an extra layer of defaults (e.g. the Design Tokens block preset) that + * sits above the block.json defaults yet below the instance attributes, so the merge below still + * lets a per-instance value win. + * + * @since TBD + * + * @param array $default_attributes The block's registration defaults: attribute + * name => default value. + * @param string $block_name The full block name, e.g. "kadence/advancedbtn". + * + * @return array The default attributes, after any module's overlay. + */ + $filtered_attributes = apply_filters( 'kadence_blocks_block_default_attributes', $default_attributes, 'kadence/' . $this->block_name ); + + // A third-party callback could return a non-array; ignore it and keep KB's own defaults rather than + // letting a bad value corrupt the merge below. + if ( is_array( $filtered_attributes ) ) { + $default_attributes = $filtered_attributes; + } + + $merged_attributes = $this->merge_attributes_with_defaults( $attributes, $default_attributes ); if ( $cache ) { $this->attributes_with_defaults[ $cache_key ] = $merged_attributes; @@ -594,4 +711,59 @@ protected function build_escaped_html_attributes( array $attributes ): string { return $html; } + + /** + * Whether a native shadow item paints anything visible — all-zero offsets, blur, and spread + * render nothing regardless of color, matching the value the "None" pick writes. + * + * A non-numeric, non-empty leg is a {dot.alias} token reference, which resolves to a var() whose + * value is unknown here — it counts as visible, since treating it as a zero would let the + * caller's `box-shadow: none` reset erase a shadow the token does paint. A `shadowToken` binding on + * the item follows the same reasoning for the whole shadow, but only while the binding is backed by + * the active library: an unbacked one (a token deleted after the item was saved) no longer paints + * anything the renderer will emit, so it must not block the `box-shadow: none` reset either — it is + * treated as invisible, the same as an item with no binding and no geometry. + * + * Lives here rather than on any one block because it answers a question about the shared shadow + * value shape, which every shadow-carrying block stores identically. It is what a block gates its + * `box-shadow` output on once it has no separate "enable" boolean to read. + * + * @since TBD + * + * @param array $shadow_item One `shadow[0]`-shaped item. + * + * @return bool Whether the item paints a visible shadow. + */ + protected function has_visible_shadow( array $shadow_item ): bool { + // A bound item's visibility is decided by its binding alone; the stored legs are never consulted + // for one. Backed, its real value lives in the token and is unknown here, so it counts as visible + // or the caller's `box-shadow: none` reset would erase a shadow the token does paint. Unbacked, it + // renders nothing (see Kadence_Blocks_CSS::render_shadow()), so it must count as INVISIBLE and let + // the caller fall through to that reset — reading its legs instead would keep a stale binding in + // the shadow branch, where the empty render is dropped and the reset never runs. + $shadow_token = $shadow_item[ Kadence_Blocks_CSS::get_shadow_token_key() ] ?? null; + if ( Alias::is_alias( $shadow_token ) ) { + return Kadence_Blocks_CSS::get_instance()->is_token_reference_backed( $shadow_token ); + } + + foreach ( [ 'hOffset', 'vOffset', 'blur', 'spread' ] as $axis ) { + $value = $shadow_item[ $axis ] ?? 0; + + if ( is_numeric( $value ) ) { + if ( 0.0 !== (float) $value ) { + return true; + } + + continue; + } + + // A {dot.alias} leg resolves to a var() unknown here, so it counts as visible — read as zero, + // the caller's `box-shadow: none` would erase a shadow the token does paint. + if ( is_string( $value ) && '' !== trim( $value ) ) { + return true; + } + } + + return false; + } } diff --git a/includes/blocks/class-kadence-blocks-advanced-form-block.php b/includes/blocks/class-kadence-blocks-advanced-form-block.php index 0f24ac3de4..aba31bb71b 100644 --- a/includes/blocks/class-kadence-blocks-advanced-form-block.php +++ b/includes/blocks/class-kadence-blocks-advanced-form-block.php @@ -5,6 +5,8 @@ * @package Kadence Blocks */ +// cspell:ignore ajaxurl autoembed sizetype . + // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; @@ -69,10 +71,10 @@ public static function get_instance() { /** * Builds CSS for block. * - * @param array $attributes the blocks attributes. - * @param Kadence_Blocks_CSS $css the css class for blocks. - * @param string $unique_id the blocks attr ID. - * @param string $unique_style_id the blocks alternate ID for queries. + * @param array $attributes the blocks attributes. + * @param Kadence_Blocks_CSS $css the css class for blocks. + * @param string $unique_id the blocks attr ID. + * @param string $unique_style_id the blocks alternate ID for queries. */ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { @@ -141,8 +143,21 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->render_border_styles( $border_style, 'fieldBorderStyle' ); $css->render_measure_output( $form_attributes, 'fieldBorderRadius', 'border-radius' ); - if ( ! empty( $field_style['boxShadow'][0] ) && $field_style['boxShadow'][0] === true ) { - $css->add_property( 'box-shadow', ( isset( $field_style['boxShadow'][7] ) && true === $field_style['boxShadow'][7] ? 'inset ' : '' ) . ( isset( $field_style['boxShadow'][3] ) && is_numeric( $field_style['boxShadow'][3] ) ? $field_style['boxShadow'][3] : '2' ) . 'px ' . ( isset( $field_style['boxShadow'][4] ) && is_numeric( $field_style['boxShadow'][4] ) ? $field_style['boxShadow'][4] : '2' ) . 'px ' . ( isset( $field_style['boxShadow'][5] ) && is_numeric( $field_style['boxShadow'][5] ) ? $field_style['boxShadow'][5] : '3' ) . 'px ' . ( isset( $field_style['boxShadow'][6] ) && is_numeric( $field_style['boxShadow'][6] ) ? $field_style['boxShadow'][6] : '0' ) . 'px ' . $css->render_color( ( isset( $field_style['boxShadow'][1] ) && ! empty( $field_style['boxShadow'][1] ) ? $field_style['boxShadow'][1] : '#000000' ), ( isset( $field_style['boxShadow'][2] ) && is_numeric( $field_style['boxShadow'][2] ) ? $field_style['boxShadow'][2] : 0.4 ) ) ); + if ( isset( $field_style['boxShadow'] ) && is_array( $field_style['boxShadow'] ) && ! empty( $field_style['boxShadow'][0] ) && $field_style['boxShadow'][0] === true ) { + $css->add_property( + 'box-shadow', + $css->render_legacy_shadow( + $field_style['boxShadow'], + [ + 'hOffset' => '2', + 'vOffset' => '2', + 'blur' => '3', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.4, + ] + ) + ); } $css->render_measure_output( $field_style, 'padding', 'padding', array( 'unit_key' => 'paddingUnit' ) ); @@ -208,8 +223,21 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->add_property( 'border-color', $css->sanitize_color( $field_style['borderActive'] ) ); } - if ( ! empty( $field_style['boxShadowActive'][0] ) && $field_style['boxShadowActive'][0] === true ) { - $css->add_property( 'box-shadow', ( isset( $field_style['boxShadowActive'][7] ) && true === $field_style['boxShadowActive'][7] ? 'inset ' : '' ) . ( isset( $field_style['boxShadowActive'][3] ) && is_numeric( $field_style['boxShadowActive'][3] ) ? $field_style['boxShadowActive'][3] : '2' ) . 'px ' . ( isset( $field_style['boxShadowActive'][4] ) && is_numeric( $field_style['boxShadowActive'][4] ) ? $field_style['boxShadowActive'][4] : '2' ) . 'px ' . ( isset( $field_style['boxShadowActive'][5] ) && is_numeric( $field_style['boxShadowActive'][5] ) ? $field_style['boxShadowActive'][5] : '3' ) . 'px ' . ( isset( $field_style['boxShadowActive'][6] ) && is_numeric( $field_style['boxShadowActive'][6] ) ? $field_style['boxShadowActive'][6] : '0' ) . 'px ' . $css->render_color( ( isset( $field_style['boxShadowActive'][1] ) && ! empty( $field_style['boxShadowActive'][1] ) ? $field_style['boxShadowActive'][1] : '#000000' ), ( isset( $field_style['boxShadowActive'][2] ) && is_numeric( $field_style['boxShadowActive'][2] ) ? $field_style['boxShadowActive'][2] : 0.4 ) ) ); + if ( isset( $field_style['boxShadowActive'] ) && is_array( $field_style['boxShadowActive'] ) && ! empty( $field_style['boxShadowActive'][0] ) && $field_style['boxShadowActive'][0] === true ) { + $css->add_property( + 'box-shadow', + $css->render_legacy_shadow( + $field_style['boxShadowActive'], + [ + 'hOffset' => '2', + 'vOffset' => '2', + 'blur' => '3', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.4, + ] + ) + ); } diff --git a/includes/blocks/class-kadence-blocks-advanced-heading-block.php b/includes/blocks/class-kadence-blocks-advanced-heading-block.php index 7085b39bce..144e91c2e0 100644 --- a/includes/blocks/class-kadence-blocks-advanced-heading-block.php +++ b/includes/blocks/class-kadence-blocks-advanced-heading-block.php @@ -5,6 +5,11 @@ * @package Kadence Blocks */ +use KadenceWP\KadenceBlocks\Design_Tokens\Database\Active_Token_Library_Store; +use KadenceWP\KadenceBlocks\Design_Tokens\Registry\Token_Registry; +use KadenceWP\KadenceBlocks\Design_Tokens\Resolver\Preset_Resolver; +use KadenceWP\KadenceBlocks\Utils\Cast; + // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; @@ -59,10 +64,10 @@ public static function get_instance() { /** * Builds CSS for block. * - * @param array $attributes the blocks attributes. - * @param Kadence_Blocks_CSS $css the css class for blocks. - * @param string $unique_id the blocks attr ID. - * @param string $unique_style_id the blocks alternate ID for queries. + * @param array $attributes the blocks attributes. + * @param Kadence_Blocks_CSS $css the css class for blocks. + * @param string $unique_id the blocks attr ID. + * @param string $unique_style_id the blocks alternate ID for queries. */ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { @@ -130,6 +135,8 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $google = $google && ( isset( $attributes['loadGoogleFont'] ) && $attributes['loadGoogleFont'] || ! isset( $attributes['loadGoogleFont'] ) ) ? true : false; $variant = ! empty( $attributes['fontVariant'] ) ? $attributes['fontVariant'] : null; $css->add_property( 'font-family', $css->render_font_family( $attributes['typography'], $google, $variant ) ); + } else { + $this->render_preset_typography( $css, $attributes ); } if ( ! empty( $attributes['textTransform'] ) ) { $css->add_property( 'text-transform', $attributes['textTransform'] ); @@ -926,6 +933,129 @@ public function get_cascading_value($mobile, $tablet, $default, $fallback) { } return $fallback; } + /** + * Point font-family at its preset variable, but only when the active preset actually resolves one. + * + * Called only where the block's own `typography` attribute is empty, so a family a site owner picked + * per-instance always wins — this supplies the family a preset carries for a heading that has none of + * its own. + * + * The gate matters for the same reason it does on the Single Button's spacing bridge: + * `font-family: var(--kb-heading-font-family)` is not inert when the variable is undefined, it is + * invalid at computed-value time, which resets the property to its initial value rather than letting + * the heading inherit the theme's font. Emitting only when the preset resolves a family is what keeps + * a heading whose preset sets none looking exactly as it does today. + * + * The variable, not the literal: the preset projector sets `--kb-heading-font-family` per preset + * scope, so one rule follows whichever preset the heading is on. The binding deliberately declares no + * `css_prop`, which is what keeps font-family out of the block-default rule that every heading gets + * (see the declaration for why that would break theme inheritance). + * + * @since TBD + * + * @param Kadence_Blocks_CSS $css The css object. + * @param array $attributes The block attributes. + * + * @return void + */ + private function render_preset_typography( Kadence_Blocks_CSS $css, array $attributes ): void { + try { + $registry = kadence_blocks()->get( Token_Registry::class ); + $library = kadence_blocks()->get( Active_Token_Library_Store::class ); + $resolver = kadence_blocks()->get( Preset_Resolver::class ); + + // The container is typed `mixed`, and this runs on every heading render, so the services are + // checked rather than assumed — a misconfigured container degrades to today's font. + if ( + ! $registry instanceof Token_Registry + || ! $library instanceof Active_Token_Library_Store + || ! $resolver instanceof Preset_Resolver + || ! $registry->is_active() + ) { + return; + } + + $slug = $library->get(); + $selected = Cast::to_string( $attributes['kbPreset'] ?? '' ); + $preset = $selected !== '' && $resolver->has_preset( 'kadence/advancedheading', $selected, $slug ) + ? $selected + : $resolver->default_preset( 'kadence/advancedheading', $slug ); + $values = $resolver->resolve( 'kadence/advancedheading', $preset, $slug ); + } catch ( Throwable $e ) { + // This runs in the render path, so a broken token graph must not take the page down with it — + // the heading simply keeps the font it has today. + return; + } + + if ( ! isset( $values['typography'] ) ) { + return; + } + + $css->add_property( 'font-family', 'var(--kb-heading-font-family)' ); + + // Enqueue the family as well as name it. The block's own loading is driven by the `typography` + // attribute, which is empty in exactly the case this bridge fires, so without this a heading that + // takes its family from a preset would render in a fallback face while the CSS asked for the real + // one. The preset stores the family as a literal, which is the shape this expects. + $family = Cast::to_string( $values['typography'] ); + + if ( $family !== '' && 'inherit' !== $family ) { + $variant = $this->preset_font_variant( $attributes, $values ); + + $css->maybe_add_google_font( $family, $variant !== '' ? $variant : null ); + } + } + + /** + * The Google variant to request alongside a preset's family, so the weight the page asks for is a + * face the browser actually has. + * + * A preset carries its family and its weight as two independent properties: the family arrives here, + * while the weight reaches the page as a `font-weight` declaration through its own binding. Asking + * for the family without its weight loads the upright default and leaves the browser to synthesize + * everything else — a heading set to 700 renders as a faked bold rather than the real face, which is + * the outcome narrowing the weight picker to a family's shipped weights exists to prevent. + * + * Precedence follows what actually renders. An explicit `fontVariant` on the block is a direct + * statement about the face and wins outright; a `fontWeight` the block sets itself comes next, since + * that is the weight the CSS above emits for it; the preset's own weight applies only when the block + * states neither. + * + * `presetFontVariant()` in `src/blocks/advancedheading/preset-font-variant.js` holds the JS twin of + * this mapping, so the editor's loader and this enqueue ask Google for the same face. Keep the two in + * step. A weight neither recognizes yields `''`, which asks for no variant and so leaves the family + * loading exactly as it did before this bridge existed. + * + * @since TBD + * + * @param array $attributes The block attributes. + * @param array $values The active preset's resolved values. + * + * @return string The Google variant, or '' when nothing names a face to ask for. + */ + private function preset_font_variant( array $attributes, array $values ): string { + if ( ! empty( $attributes['fontVariant'] ) ) { + return Cast::to_string( $attributes['fontVariant'] ); + } + + $weight = ! empty( $attributes['fontWeight'] ) + ? Cast::to_string( $attributes['fontWeight'] ) + : Cast::to_string( $values['fontWeight'] ?? '' ); + + $weight = strtolower( trim( $weight ) ); + + // `regular` rather than `400`: it is the v1 spelling the rest of this plugin already uses for the + // upright default (see `render_font_weight()`), and the editor's `parseVariant` reads it as 400. + if ( 'normal' === $weight || 'regular' === $weight || '400' === $weight ) { + return 'regular'; + } + + if ( 'bold' === $weight ) { + return '700'; + } + + return preg_match( '/^[1-9]00$/', $weight ) === 1 ? $weight : ''; + } } Kadence_Blocks_Advancedheading_Block::get_instance(); diff --git a/includes/blocks/class-kadence-blocks-advancedbtn-block.php b/includes/blocks/class-kadence-blocks-advancedbtn-block.php index 79d7d00ef7..b3e14d9eda 100644 --- a/includes/blocks/class-kadence-blocks-advancedbtn-block.php +++ b/includes/blocks/class-kadence-blocks-advancedbtn-block.php @@ -5,6 +5,8 @@ * @package Kadence Blocks */ +// cspell:ignore bgtype btnkey btnvalue simplelightbox videolight . + // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; @@ -51,10 +53,10 @@ public static function get_instance() { /** * Builds CSS for block. * - * @param array $attributes the blocks attributes. - * @param string $css the css class for blocks. - * @param string $unique_id the blocks attr ID. - * @param string $unique_style_id the blocks alternate ID for queries. + * @param array $attributes the blocks attributes. + * @param Kadence_Blocks_CSS $css the css object for blocks. + * @param string $unique_id the blocks attr ID. + * @param string $unique_style_id the blocks alternate ID for queries. */ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->set_style_id( 'kb-' . $this->block_name . $unique_style_id ); @@ -326,7 +328,20 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->add_property( 'border-style', 'solid' ); } if ( isset( $btnvalue['boxShadow'] ) && is_array( $btnvalue['boxShadow'] ) && isset( $btnvalue['boxShadow'][0] ) && true === $btnvalue['boxShadow'][0] ) { - $css->add_property( 'box-shadow', ( isset( $btnvalue['boxShadow'][7] ) && true === $btnvalue['boxShadow'][7] ? 'inset ' : '' ) . ( isset( $btnvalue['boxShadow'][3] ) && is_numeric( $btnvalue['boxShadow'][3] ) ? $btnvalue['boxShadow'][3] : '1' ) . 'px ' . ( isset( $btnvalue['boxShadow'][4] ) && is_numeric( $btnvalue['boxShadow'][4] ) ? $btnvalue['boxShadow'][4] : '1' ) . 'px ' . ( isset( $btnvalue['boxShadow'][5] ) && is_numeric( $btnvalue['boxShadow'][5] ) ? $btnvalue['boxShadow'][5] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadow'][6] ) && is_numeric( $btnvalue['boxShadow'][6] ) ? $btnvalue['boxShadow'][6] : '0' ) . 'px ' . $css->render_color( ( isset( $btnvalue['boxShadow'][1] ) && ! empty( $btnvalue['boxShadow'][1] ) ? $btnvalue['boxShadow'][1] : '#000000' ), ( isset( $btnvalue['boxShadow'][2] ) && is_numeric( $btnvalue['boxShadow'][2] ) ? $btnvalue['boxShadow'][2] : 0.2 ) ) ); + $css->add_property( + 'box-shadow', + $css->render_legacy_shadow( + $btnvalue['boxShadow'], + [ + 'hOffset' => '1', + 'vOffset' => '1', + 'blur' => '2', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.2, + ] + ) + ); } $css->render_measure_output( $btnvalue, 'margin', 'margin', [ 'unit_key' => 'marginUnit' ] ); @@ -341,7 +356,20 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->add_property( 'border-color', $css->render_color( $btnvalue['borderHover'], $alpha ) ); } if ( isset( $btnvalue['boxShadowHover'] ) && is_array( $btnvalue['boxShadowHover'] ) && isset( $btnvalue['boxShadowHover'][0] ) && true === $btnvalue['boxShadowHover'][0] && isset( $btnvalue['boxShadowHover'][7] ) && true !== $btnvalue['boxShadowHover'][7] ) { - $css->add_property( 'box-shadow', ( isset( $btnvalue['boxShadowHover'][7] ) && true === $btnvalue['boxShadowHover'][7] ? 'inset ' : '' ) . ( isset( $btnvalue['boxShadowHover'][3] ) && is_numeric( $btnvalue['boxShadowHover'][3] ) ? $btnvalue['boxShadowHover'][3] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][4] ) && is_numeric( $btnvalue['boxShadowHover'][4] ) ? $btnvalue['boxShadowHover'][4] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][5] ) && is_numeric( $btnvalue['boxShadowHover'][5] ) ? $btnvalue['boxShadowHover'][5] : '3' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][6] ) && is_numeric( $btnvalue['boxShadowHover'][6] ) ? $btnvalue['boxShadowHover'][6] : '0' ) . 'px ' . $css->render_color( ( isset( $btnvalue['boxShadowHover'][1] ) && ! empty( $btnvalue['boxShadowHover'][1] ) ? $btnvalue['boxShadowHover'][1] : '#000000' ), ( isset( $btnvalue['boxShadowHover'][2] ) && is_numeric( $btnvalue['boxShadowHover'][2] ) ? $btnvalue['boxShadowHover'][2] : 0.4 ) ) ); + $css->add_property( + 'box-shadow', + $css->render_legacy_shadow( + $btnvalue['boxShadowHover'], + [ + 'hOffset' => '2', + 'vOffset' => '2', + 'blur' => '3', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.4, + ] + ) + ); } if ( 'gradient' === $bgtype ) { $css->set_selector( '.wp-block-kadence-advancedbtn.kt-btns' . $unique_id . ' .kt-btn-wrap-' . $btnkey . ' .kt-button::before' ); @@ -359,7 +387,20 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->add_property( 'background', $css->render_color( $btnvalue['backgroundHover'], $alpha ) ); } if ( isset( $btnvalue['boxShadowHover'] ) && is_array( $btnvalue['boxShadowHover'] ) && isset( $btnvalue['boxShadowHover'][0] ) && true === $btnvalue['boxShadowHover'][0] && isset( $btnvalue['boxShadowHover'][7] ) && true === $btnvalue['boxShadowHover'][7] ) { - $css->add_property( 'box-shadow', ( isset( $btnvalue['boxShadowHover'][7] ) && true === $btnvalue['boxShadowHover'][7] ? 'inset ' : '' ) . ( isset( $btnvalue['boxShadowHover'][3] ) && is_numeric( $btnvalue['boxShadowHover'][3] ) ? $btnvalue['boxShadowHover'][3] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][4] ) && is_numeric( $btnvalue['boxShadowHover'][4] ) ? $btnvalue['boxShadowHover'][4] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][5] ) && is_numeric( $btnvalue['boxShadowHover'][5] ) ? $btnvalue['boxShadowHover'][5] : '3' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][6] ) && is_numeric( $btnvalue['boxShadowHover'][6] ) ? $btnvalue['boxShadowHover'][6] : '0' ) . 'px ' . $css->render_color( ( isset( $btnvalue['boxShadowHover'][1] ) && ! empty( $btnvalue['boxShadowHover'][1] ) ? $btnvalue['boxShadowHover'][1] : '#000000' ), ( isset( $btnvalue['boxShadowHover'][2] ) && is_numeric( $btnvalue['boxShadowHover'][2] ) ? $btnvalue['boxShadowHover'][2] : 0.4 ) ) ); + $css->add_property( + 'box-shadow', + $css->render_legacy_shadow( + $btnvalue['boxShadowHover'], + [ + 'hOffset' => '2', + 'vOffset' => '2', + 'blur' => '3', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.4, + ] + ) + ); $css->add_property( 'border-radius', ( isset( $btnvalue['borderRadius'] ) && is_numeric( $btnvalue['borderRadius'] ) ? $btnvalue['borderRadius'] : '3' ) . 'px' ); } } else { @@ -376,7 +417,20 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { } } if ( isset( $btnvalue['boxShadowHover'] ) && is_array( $btnvalue['boxShadowHover'] ) && isset( $btnvalue['boxShadowHover'][0] ) && true === $btnvalue['boxShadowHover'][0] && isset( $btnvalue['boxShadowHover'][7] ) && true === $btnvalue['boxShadowHover'][7] ) { - $css->add_property( 'box-shadow', ( isset( $btnvalue['boxShadowHover'][7] ) && true === $btnvalue['boxShadowHover'][7] ? 'inset ' : '' ) . ( isset( $btnvalue['boxShadowHover'][3] ) && is_numeric( $btnvalue['boxShadowHover'][3] ) ? $btnvalue['boxShadowHover'][3] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][4] ) && is_numeric( $btnvalue['boxShadowHover'][4] ) ? $btnvalue['boxShadowHover'][4] : '2' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][5] ) && is_numeric( $btnvalue['boxShadowHover'][5] ) ? $btnvalue['boxShadowHover'][5] : '3' ) . 'px ' . ( isset( $btnvalue['boxShadowHover'][6] ) && is_numeric( $btnvalue['boxShadowHover'][6] ) ? $btnvalue['boxShadowHover'][6] : '0' ) . 'px ' . $css->render_color( ( isset( $btnvalue['boxShadowHover'][1] ) && ! empty( $btnvalue['boxShadowHover'][1] ) ? $btnvalue['boxShadowHover'][1] : '#000000' ), ( isset( $btnvalue['boxShadowHover'][2] ) && is_numeric( $btnvalue['boxShadowHover'][2] ) ? $btnvalue['boxShadowHover'][2] : 0.4 ) ) ); + $css->add_property( + 'box-shadow', + $css->render_legacy_shadow( + $btnvalue['boxShadowHover'], + [ + 'hOffset' => '2', + 'vOffset' => '2', + 'blur' => '3', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.4, + ] + ) + ); } } // Tablet CSS. diff --git a/includes/blocks/class-kadence-blocks-advancedgallery-block.php b/includes/blocks/class-kadence-blocks-advancedgallery-block.php index fb5eb5bf18..9a2b5a53be 100644 --- a/includes/blocks/class-kadence-blocks-advancedgallery-block.php +++ b/includes/blocks/class-kadence-blocks-advancedgallery-block.php @@ -5,11 +5,15 @@ * @package Kadence Blocks */ +// cspell:ignore Csvg NODEFDTD NOIMPLIED alignnone arrowstyle dotstyle figcap fluidcarousel glight kses outlinedark outlinelight relcustom tcolumns thumbslider . + // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } +use KadenceWP\KadenceBlocks\Utils\Cast; + /** * Class to Build the Advanced Gallery Block. * @@ -95,10 +99,10 @@ public function render_scripts( $attributes, $inline = false ) { /** * Builds CSS for block. * - * @param array $attributes the blocks attributes. - * @param Kadence_Blocks_CSS $css the css class for blocks. - * @param string $unique_id the blocks attr ID. - * @param string $unique_style_id the blocks alternate ID for queries. + * @param array $attributes the blocks attributes. + * @param Kadence_Blocks_CSS $css the css class for blocks. + * @param string $unique_id the blocks attr ID. + * @param string $unique_style_id the blocks alternate ID for queries. */ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $updated_version = ! empty( $attributes['kbVersion'] ) && $attributes['kbVersion'] > 1 ? true : false; @@ -108,7 +112,7 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { $css->set_selector('.wp-block-kadence-advancedgallery.kb-gallery-wrap-id-' . $unique_id ); if ( isset( $attributes['margin'][0] ) ) { - // Fix for this margin unit being in a non-standard locaiton in array, should be updated. + // Fix for this margin unit being in a non-standard location in array, should be updated. $margin_unit = ( ! empty( $attributes['marginUnit'] ) ? $attributes['marginUnit'] : 'px' ); $css->render_measure_output( array_merge( $attributes['margin'][0], array( 'marginType' => $margin_unit ) ), @@ -304,12 +308,38 @@ public function build_css( $attributes, $css, $unique_id, $unique_style_id ) { if ( isset( $attributes['shadow'] ) && is_array( $attributes['shadow'] ) && is_array( $attributes['shadow'][ 0 ] ) ) { $shadow = $attributes['shadow'][ 0 ]; $css->set_selector('.kb-gallery-id-' . $unique_id . ' .kadence-blocks-gallery-item .kb-gal-image-radius, .kb-gallery-id-' . $unique_id . ' .kadence-blocks-gallery-thumb-item .kb-gal-image-radius' ); - $css->add_property('box-shadow', $shadow['hOffset'] . 'px ' . $shadow['vOffset'] . 'px ' . $shadow['blur'] . 'px ' . $shadow['spread'] . 'px ' . $css->render_color( $shadow['color'], $shadow['opacity'] ) ); + $css->add_property( + 'box-shadow', + $css->render_shadow( + $shadow, + [ + 'hOffset' => '4', + 'vOffset' => '2', + 'blur' => '14', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.2, + ] + ) + ); } if ( isset( $attributes['shadowHover'] ) && is_array( $attributes['shadowHover'] ) && is_array( $attributes['shadowHover'][ 0 ] ) ) { $shadow_hover = $attributes['shadowHover'][ 0 ]; $css->set_selector('.kb-gallery-id-' . $unique_id . ' .kadence-blocks-gallery-item:hover .kb-gal-image-radius, .kb-gallery-id-' . $unique_id . ' .kadence-blocks-gallery-thumb-item:hover .kb-gal-image-radius' ); - $css->add_property('box-shadow', $shadow_hover['hOffset'] . 'px ' . $shadow_hover['vOffset'] . 'px ' . $shadow_hover['blur'] . 'px ' . $shadow_hover['spread'] . 'px ' . $css->render_color( $shadow_hover['color'], $shadow_hover['opacity'] ) ); + $css->add_property( + 'box-shadow', + $css->render_shadow( + $shadow_hover, + [ + 'hOffset' => '4', + 'vOffset' => '2', + 'blur' => '14', + 'spread' => '0', + 'color' => '#000000', + 'opacity' => 0.2, + ] + ) + ); } else { $css->set_selector('.kb-gallery-id-' . $unique_id . ' .kadence-blocks-gallery-item:hover .kb-gal-image-radius' ); @@ -873,11 +903,11 @@ public function build_html( $attributes, $unique_id, $content, $block_instance ) * This function can be used by Kadence Blocks Pro for dynamic content. * It creates a mosaic pattern layout for gallery images with specific grid classes. * - * @param array $images Array of image objects with image data. - * @param array $attributes Gallery block attributes. - * @param array $gallery_classes Array of CSS classes for the gallery container. - * @param string $image_filter Image filter setting. - * @param bool $lightbox_cap Whether lightbox captions are enabled. + * @param array $images Array of image objects with image data. + * @param array $attributes Gallery block attributes. + * @param array $gallery_classes Array of CSS classes for the gallery container. + * @param string $image_filter Image filter setting. + * @param bool $lightbox_cap Whether lightbox captions are enabled. * @return string HTML markup for the mosaic gallery. */ public function render_mosaic_gallery( $images, $attributes, $gallery_classes = array(), $image_filter = 'none', $lightbox_cap = false ) { @@ -982,7 +1012,10 @@ public function get_image_srcset_output( $id = null, $url = null, $width = null, return $output; } /** - * Output Gallery image markeup. + * Output Gallery image markup. + * + * @param array $image Image data. + * @param array $attributes Gallery block attributes. */ public function render_gallery_images( $image, $attributes ) { $type = ( ! empty( $attributes['type'] ) ? $attributes['type'] : 'masonry' ); @@ -1103,7 +1136,7 @@ public function render_gallery_images( $image, $attributes ) { $figcap = '<' . $fig_tag . ' class="kadence-blocks-gallery-item__caption">' . ( ! empty( $caption ) && is_string( $caption ) ? wp_kses_post( $caption ) : '' ) . ''; //links in the main gallery caption can mess with lightbox function, strip them out. - //they're okay in the lighbox though + // they're okay in the lightbox though. if( $link_to === 'media' && $lightbox === 'magnific' && ! empty( $figcap ) && is_string( $figcap ) ) { $figcap = preg_replace('#(.*?)#i', '\1', $figcap); } @@ -1132,7 +1165,7 @@ public function render_gallery_images( $image, $attributes ) { $output .= '