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" diff --git a/assets/js/src/frontend/blog.js b/assets/js/src/frontend/blog.js index 5cbab5f1ce..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(); 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 ) { diff --git a/assets/scss/components/main/_gutenberg.scss b/assets/scss/components/main/_gutenberg.scss index 4ad764368f..a16d32fc43 100644 --- a/assets/scss/components/main/_gutenberg.scss +++ b/assets/scss/components/main/_gutenberg.scss @@ -38,6 +38,10 @@ padding: 0 7.5px; } +.wp-block-image.alignfull { + padding: 0; +} + .alignwide { width: 98vw; max-width: 98vw; 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", 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 = <<'; - $caret .= $caret_pictogram; - $caret .= ''; + $toggle_aria_label = __( 'Toggle', 'neve' ) . ' ' . wp_filter_nohtml_kses( $title ); + $caret = ''; if ( $caret_settings['side'] === 'left' ) { $args->before = $args->before . $caret; diff --git a/inc/views/partials/excerpt.php b/inc/views/partials/excerpt.php index 8ed1ea284b..0f2f2501ad 100644 --- a/inc/views/partials/excerpt.php +++ b/inc/views/partials/excerpt.php @@ -75,8 +75,11 @@ private function get_excerpt( $length = 25, $post_id = null ) { return apply_filters( 'the_content', get_the_content( null, false, $post_id ) ); } - if ( has_excerpt() ) { - return apply_filters( 'the_excerpt', get_the_excerpt( $post_id ) ); + if ( has_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 ); diff --git a/tests/js/logo-toggle-script.test.mjs b/tests/js/logo-toggle-script.test.mjs new file mode 100644 index 0000000000..6e3e4894c2 --- /dev/null +++ b/tests/js/logo-toggle-script.test.mjs @@ -0,0 +1,53 @@ +// Behavioral test for the Logo palette inline script (issue #4541). +// Run: node tests/js/logo-toggle-script.test.mjs +import { readFileSync } from 'fs'; +import { strict as assert } from 'assert'; +import { JSDOM, VirtualConsole } from 'jsdom'; + +const php = readFileSync(new URL('../../header-footer-grid/Core/Components/Logo.php', import.meta.url), 'utf8'); +const js = php.match(/<< 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');