From 2b2671d5f2303399d678c21509159802e90a1ea8 Mon Sep 17 00:00:00 2001 From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com> Date: Thu, 16 Jul 2026 09:44:05 +0300 Subject: [PATCH 01/10] fix: scope logo palette inline script to avoid global collisions Wrap the toggle script in an IIFE so `html` and friends no longer leak as page globals, and filter the MutationObserver to `data-neve-theme`. Fixes the `html.getAttribute is not a function` error thrown when a third-party script clobbers the global `html`. Fixes #4541 Co-Authored-By: Claude Fable 5 --- header-footer-grid/Core/Components/Logo.php | 15 +++--- tests/js/logo-toggle-script.test.mjs | 53 +++++++++++++++++++++ 2 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 tests/js/logo-toggle-script.test.mjs diff --git a/header-footer-grid/Core/Components/Logo.php b/header-footer-grid/Core/Components/Logo.php index 0132501238..77dfed2a39 100644 --- a/header-footer-grid/Core/Components/Logo.php +++ b/header-footer-grid/Core/Components/Logo.php @@ -248,8 +248,9 @@ public function toggle_script() { $variants_json = wp_json_encode( $variants ); $script = << errors.push(e)); + const dom = new JSDOM( + '', + { runScripts: 'outside-only', virtualConsole } + ); + dom.window.eval(js); + return { window: dom.window, errors }; +} + +const tick = () => new Promise((r) => setTimeout(r, 0)); + +// 1. No page globals leaked. +{ + const { window } = makePage(); + assert.equal(window.html, undefined, 'script leaks global "html"'); + assert.equal(window.setCurrentTheme, undefined, 'script leaks global "setCurrentTheme"'); +} + +// 2. Survives a clobbered window.html + unrelated root attribute change. +{ + const { window, errors } = makePage(); + window.html = 'not-an-element'; + window.document.documentElement.setAttribute('data-test', '1'); + await tick(); + assert.deepEqual(errors, [], `observer threw: ${errors[0]}`); +} + +// 3. Still swaps the logo on data-neve-theme change (even after the clobber). +{ + const { window, errors } = makePage(); + window.html = 'not-an-element'; + window.document.documentElement.setAttribute('data-neve-theme', 'dark'); + await tick(); + assert.deepEqual(errors, [], `observer threw: ${errors[0]}`); + assert.equal(window.document.querySelector('.neve-site-logo').src, 'http://x/dark.png', 'logo did not swap to dark variant'); +} + +console.log('logo-toggle-script: all assertions passed'); From fbd6d120b08176865e9d21297d3d05079e00621c Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 17:28:35 +0530 Subject: [PATCH 02/10] fix: handle undefined property to prevent error --- assets/js/src/frontend/blog.js | 1 + assets/js/src/frontend/hgf.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/js/src/frontend/blog.js b/assets/js/src/frontend/blog.js index 5cbab5f1ce..6dc0e25b3c 100644 --- a/assets/js/src/frontend/blog.js +++ b/assets/js/src/frontend/blog.js @@ -47,6 +47,7 @@ const masonry = () => { */ const infiniteScroll = () => { if ( + typeof NeveProperties === 'undefined' || NeveProperties.infScroll !== 'enabled' || document.querySelector(postWrapSelector) === null ) { diff --git a/assets/js/src/frontend/hgf.js b/assets/js/src/frontend/hgf.js index ac4f6498a2..070e6d1f59 100644 --- a/assets/js/src/frontend/hgf.js +++ b/assets/js/src/frontend/hgf.js @@ -92,7 +92,8 @@ HFG.prototype.toggleMenuSidebar = function (toggle, target = null) { ); if ( - (!NeveProperties.isCustomize && + ((typeof NeveProperties === 'undefined' || + !NeveProperties.isCustomize) && doc.body.classList.contains(sidebarClasses[0])) || toggle === false ) { From 1287244f2cdb190e3cd5d942853869bd2e9e4e7d Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 17:40:54 +0530 Subject: [PATCH 03/10] fix: improve checks for properties --- assets/js/src/frontend/blog.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/js/src/frontend/blog.js b/assets/js/src/frontend/blog.js index 6dc0e25b3c..16db8bf6f2 100644 --- a/assets/js/src/frontend/blog.js +++ b/assets/js/src/frontend/blog.js @@ -10,7 +10,10 @@ const triggerSelector = '.infinite-scroll-trigger'; * Initialize blog JS. */ export const initBlog = () => { - if (document.querySelector('.blog.nv-index-posts') === null) { + if ( + document.querySelector('.blog.nv-index-posts') === null || + typeof NeveProperties === 'undefined' + ) { return false; } masonry(); @@ -47,7 +50,6 @@ const masonry = () => { */ const infiniteScroll = () => { if ( - typeof NeveProperties === 'undefined' || NeveProperties.infScroll !== 'enabled' || document.querySelector(postWrapSelector) === null ) { From a600276d4dfa4e945f519cb9e07ad06108b7b7cc Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 18:07:56 +0530 Subject: [PATCH 04/10] fix: enhance excerpt handling --- inc/views/partials/excerpt.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/inc/views/partials/excerpt.php b/inc/views/partials/excerpt.php index 8ed1ea284b..4bfa61b92e 100644 --- a/inc/views/partials/excerpt.php +++ b/inc/views/partials/excerpt.php @@ -76,7 +76,10 @@ private function get_excerpt( $length = 25, $post_id = null ) { } if ( has_excerpt() ) { - return apply_filters( 'the_excerpt', get_the_excerpt( $post_id ) ); + $excerpt_more = apply_filters( 'excerpt_more', ' […]' ); + $content = wp_trim_words( get_the_excerpt( $post_id ), $length, $excerpt_more ); + + return apply_filters( 'the_excerpt', $content ); } add_filter( 'excerpt_length', array( $this, 'change_excerpt_length' ), 10 ); From 63800c7da3d65f06dfadc6d41878168f39b97510 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 18:14:08 +0530 Subject: [PATCH 05/10] fix: check given post has excerpt --- inc/views/partials/excerpt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/views/partials/excerpt.php b/inc/views/partials/excerpt.php index 4bfa61b92e..0f2f2501ad 100644 --- a/inc/views/partials/excerpt.php +++ b/inc/views/partials/excerpt.php @@ -75,7 +75,7 @@ private function get_excerpt( $length = 25, $post_id = null ) { return apply_filters( 'the_content', get_the_content( null, false, $post_id ) ); } - if ( has_excerpt() ) { + if ( has_excerpt( $post_id ) ) { $excerpt_more = apply_filters( 'excerpt_more', ' […]' ); $content = wp_trim_words( get_the_excerpt( $post_id ), $length, $excerpt_more ); From b66e0d88a1f1e31bb5d5451a8728d596060dedce Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 18:19:25 +0530 Subject: [PATCH 06/10] fix: escape submenu toggle aria-label attributes --- inc/views/nav_walker.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/inc/views/nav_walker.php b/inc/views/nav_walker.php index cf34c8f71e..9fc01a105b 100644 --- a/inc/views/nav_walker.php +++ b/inc/views/nav_walker.php @@ -151,9 +151,10 @@ public function add_caret( $title, $item, $args, $depth ) { $expand_dropdowns = apply_filters( 'neve_first_level_expanded', false ); $additional_class = $expand_dropdowns && $depth === 0 ? 'dropdown-open' : ''; - $caret = ''; + $toggle_aria_label = __( 'Toggle', 'neve' ) . ' ' . wp_filter_nohtml_kses( $title ); + $caret = ''; if ( $caret_settings['side'] === 'left' ) { $args->before = $args->before . $caret; From 74f0076653b19b904e5e387da4cd71d4ec9d2770 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 19:01:40 +0530 Subject: [PATCH 07/10] fix: remove padding from full-width alignment --- assets/scss/components/main/_gutenberg.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/scss/components/main/_gutenberg.scss b/assets/scss/components/main/_gutenberg.scss index 4ad764368f..f38a092c54 100644 --- a/assets/scss/components/main/_gutenberg.scss +++ b/assets/scss/components/main/_gutenberg.scss @@ -35,7 +35,6 @@ max-width: 100vw; margin-left: calc(50% - 50vw); margin-right: calc(50% - 50vw); - padding: 0 7.5px; } .alignwide { From 3710f36c841aa5f80b31c656feb0a2cd00bfcb90 Mon Sep 17 00:00:00 2001 From: girishpanchal30 Date: Fri, 17 Jul 2026 19:26:35 +0530 Subject: [PATCH 08/10] fix: adjust padding for full-width image alignment --- assets/scss/components/main/_gutenberg.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assets/scss/components/main/_gutenberg.scss b/assets/scss/components/main/_gutenberg.scss index f38a092c54..a16d32fc43 100644 --- a/assets/scss/components/main/_gutenberg.scss +++ b/assets/scss/components/main/_gutenberg.scss @@ -35,6 +35,11 @@ max-width: 100vw; margin-left: calc(50% - 50vw); margin-right: calc(50% - 50vw); + padding: 0 7.5px; +} + +.wp-block-image.alignfull { + padding: 0; } .alignwide { From 91da6ff0c824f2b43928c47a6e3bbe026148c0ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 17:22:46 +0000 Subject: [PATCH 09/10] chore(deps): bump codeinwp/themeisle-sdk from 3.3.54 to 3.3.55 Bumps [codeinwp/themeisle-sdk](https://github.com/Codeinwp/themeisle-sdk) from 3.3.54 to 3.3.55. - [Release notes](https://github.com/Codeinwp/themeisle-sdk/releases) - [Changelog](https://github.com/Codeinwp/themeisle-sdk/blob/v3.3.55/CHANGELOG.md) - [Commits](https://github.com/Codeinwp/themeisle-sdk/compare/v3.3.54...v3.3.55) --- updated-dependencies: - dependency-name: codeinwp/themeisle-sdk dependency-version: 3.3.55 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 8d9b1df441..14bc235f8d 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "codeinwp/themeisle-sdk", - "version": "3.3.54", + "version": "3.3.55", "source": { "type": "git", "url": "https://github.com/Codeinwp/themeisle-sdk.git", - "reference": "095c2d0f1388af0b0196c492a7f79e2fd092dab1" + "reference": "bd601798d209a4bc5962d2a19a22dc6dddf341cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/095c2d0f1388af0b0196c492a7f79e2fd092dab1", - "reference": "095c2d0f1388af0b0196c492a7f79e2fd092dab1", + "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/bd601798d209a4bc5962d2a19a22dc6dddf341cc", + "reference": "bd601798d209a4bc5962d2a19a22dc6dddf341cc", "shasum": "" }, "require-dev": { @@ -36,16 +36,16 @@ "homepage": "https://themeisle.com" } ], - "description": "Themeisle SDK.", + "description": "Themeisle SDK library.", "homepage": "https://github.com/Codeinwp/themeisle-sdk", "keywords": [ "wordpress" ], "support": { "issues": "https://github.com/Codeinwp/themeisle-sdk/issues", - "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.54" + "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.55" }, - "time": "2026-06-23T13:43:47+00:00" + "time": "2026-07-20T10:57:27+00:00" }, { "name": "wptt/webfont-loader", From 97bec0e9669c48aaa8bf52b59b0909668caaf112 Mon Sep 17 00:00:00 2001 From: selul Date: Tue, 21 Jul 2026 13:19:37 +0300 Subject: [PATCH 10/10] chore: remove PR announcer workflow [skip ci] Co-Authored-By: Claude Fable 5 --- .github/workflows/pr-announcer-docs.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .github/workflows/pr-announcer-docs.yml diff --git a/.github/workflows/pr-announcer-docs.yml b/.github/workflows/pr-announcer-docs.yml deleted file mode 100644 index 33e5095cb7..0000000000 --- a/.github/workflows/pr-announcer-docs.yml +++ /dev/null @@ -1,18 +0,0 @@ -on: - pull_request: - types: [closed] - branches: - - 'development' - - 'new/**' -jobs: - pr_announcer: - runs-on: ubuntu-latest - name: Announce pr - steps: - - name: Checking merged commit - uses: Codeinwp/action-pr-merged-announcer@main - env: - GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} - with: - destination_repo: "Codeinwp/docs" - issue_labels: "neve"