Skip to content

Release - #4656

Merged
vytisbulkevicius merged 23 commits into
masterfrom
development
Oct 21, 2026
Merged

Release#4656
vytisbulkevicius merged 23 commits into
masterfrom
development

Conversation

@pirate-bot

@pirate-bot pirate-bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Linked issues

This release will close the following issues once merged:

Public changelog

  • Fixed Customizer freezing when WooCommerce is inactive.
  • Fixed Customizer font previews using local fonts when hosted locally
  • Fixed cart coupon errors sharing the controls row
  • Fixed Customizer colors accepting HTML inside gradient values
  • Fixed block styles overriding theme defaults in the editor.
  • Fixed Customizer error when saving responsive header settings.
  • Fixed letter spacing control handling.
  • Fixed the imported content width metadata.
  • Fixed blank Neve dashboard when link opened Starter Sites tab
  • Added global Customizer toggles to disable header and footer
  • Fixed AMP submenu toggle accessibility
  • Updated dependencies

pirate-bot and others added 4 commits October 7, 2026 12:50
Bumps [codeinwp/themeisle-sdk](https://github.com/Codeinwp/themeisle-sdk) from 3.3.65 to 3.3.66.
- [Release notes](https://github.com/Codeinwp/themeisle-sdk/releases)
- [Commits](Codeinwp/themeisle-sdk@v3.3.65...v3.3.66)

---
updated-dependencies:
- dependency-name: codeinwp/themeisle-sdk
  dependency-version: 3.3.66
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@pirate-bot

pirate-bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator Author

Plugin build for 905b565 is ready 🛎️!

* fix: guard missing woo customizer sections

* test: cover shop template warning
Bumps [codeinwp/themeisle-sdk](https://github.com/Codeinwp/themeisle-sdk) from 3.3.66 to 3.3.67.
- [Release notes](https://github.com/Codeinwp/themeisle-sdk/releases)
- [Commits](Codeinwp/themeisle-sdk@v3.3.66...v3.3.67)

---
updated-dependencies:
- dependency-name: codeinwp/themeisle-sdk
  dependency-version: 3.3.67
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
girishpanchal30 and others added 6 commits October 16, 2026 11:40
* fix: remote font preview handling

* test: isolate local font preview fixtures

* fix: guard missing filesystem in font previews

* fix: skip unconnected filesystem in previews

* fix: skip cached fonts in customizer

* fix: require cached weights before skipping
* fix: wrap cart coupon error notice

* test: harden coupon notice spec setup
* fix: enhance typography styles for block elements

* test: wait for editor canvas iframe

* fix: keep editor typography above core reset

* fix: restore headings on WordPress 5.8

* fix: restore headings

* fix: apply body typography in iframe editor

* fix: keep editor link focus colour
* fix: accept decoded arrays in the HFG JSON sanitizers

Pro conditional headers return stored responsive values already decoded,
so sanitize_responsive_int_json() called json_decode() on an array and
fatalled with a TypeError on PHP 8. Both JSON sanitizers now accept the
array form and reject other non-string input instead of crashing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs: widen the JSON sanitizer param docblocks to mixed

Both sanitizers accept any value and return the default for anything
that is not a JSON string or decoded array.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Fixed letter spacing control handling
Fixed the imported content width metadata
…ab (#4668)

With Starter Sites & Templates active, the Starter Sites tab only has a
url (it links to the onboarding page), but getTabHash() still accepted
#starter-sites, so App rendered tabs[currentTab].render() and crashed
with 'render is not a function', leaving the dashboard blank. Pressing
Back after activating the plugin landed there. Only accept hashes for
tabs that render content; others fall back to the Welcome tab.

Closes #4667


Claude-Session: https://claude.ai/code/session_01WPwFxvA5VPq8sd4EzsNFFA

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#4650)

* feat(customizer): add global header and footer visibility toggles

Add a Disable Header Globally toggle to the Header panel and a Disable
Footer Globally toggle to the Footer panel. Both feed the existing
neve_filter_toggle_content_parts filter, at a priority that runs after
the post meta, so the site wide setting wins.

Move the filter check outside the header element in both templates. The
element used to be printed even when the header was off, which left an
empty wrapper that held only the skip link. The skip link now sits
outside the element, so it survives a disabled header.

The builder panels hide every section they do not name, so both sections
are added to the whitelist in the customizer styles.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(amp): print the amp states outside the header

The states were printed on neve_after_header_hook, which does not run
when the header is off. One of them drives the WooCommerce shop sidebar,
which stays on the page without a header.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test: cover the global header and footer toggles

Add unit tests for the toggle, its precedence over the post meta, the
markup of both templates and the customizer registration. Add end to end
tests, one of which opens the builder panels, because a section can
register and still be hidden by the panel styles.

Complete the WooCommerce stub with the conditional tags, so tests that
render body_class() after the cart tests do not fatal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test: restore the customizer global after each test

The test case restores the hooks and rolls back the database, but it does
not touch $wp_customize. Keep the previous value and put it back, the way
the metabox test does with the REST server.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(customizer): keep the section labels next to their part

Hold the panel, the section title and the control label in one array per
part, in place of two ternaries.

Assert on the toggle structure in the e2e spec, not on the English label.
Check that the stylesheet exists before the test reads it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: trim the comments around the visibility filter

Drop the hook docblock copied into header.php. footer.php documents this
filter and the block theme template carries none.

Keep only the part of the filter docblock a reader cannot infer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style(header): match the skip link markup in both templates

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* style(e2e): use the project spacing in the panel loop

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(amp): keep the scroll to top animations off the header

The animations were printed on `neve_before_header_hook`, which only runs
inside the header element. A header turned off in the customizer took them
with it, and the button stays hidden until an animation shows it.

Print them on `neve_before_header_wrapper_hook`, next to the AMP states.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(amp): give the scroll to top observer an anchor to watch

An `amp-position-observer` watches its own parent when it has no target. Moving
the observer out of the header in 9462899 made the page wrapper its parent, and
the wrapper is never out of the viewport, so the button stayed hidden on every
AMP page.

Print an anchor at the top of the wrapper and point the observer at it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(customizer): move the header and footer toggles into global settings

The toggles no longer get a section each. Disable Header now opens the
General tab of Global Header Settings, where Neve Pro already keeps its
site-wide header controls. Disable Footer lives in a new Global Footer
Settings section, the footer's counterpart, so the two panels match.

The theme mod keys stay neve_disable_header and neve_disable_footer, so
the render filter and saved values are unchanged. Both toggles reuse the
per-page labels and say that page builder headers and footers go too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: add screenshots of the global header and footer settings

docs/ is excluded from the theme build by .distignore. Drop this commit
before merging if the images should not stay in the repository.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(customizer): keep Disable Header on the legacy builder

The toggle was registered only with the new builder's global header
settings, so sites still on the legacy builder lost it. Those sites now
get a Global Header Settings section with the toggle as a plain control.
It has no tabs, so any Neve Pro controls in that section show as before,
and a section Pro registered first is kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(customizer): share the Disable Header setting arguments

Both registrations of neve_disable_header now take default, transport
and sanitize_callback from get_disable_header_setting_args(), so the
legacy and the new builder paths cannot drift apart. The user-since
data provider gets a precise return type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(customizer): name the sanitize callback in the legacy add_setting call

Theme Check reads each $wp_customize->add_setting() call and requires a
sanitize_callback key in it, so passing the shared argument array failed
the check. The legacy call now lists the keys, with values still taken
from get_disable_header_setting_args().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(customizer): add array return types to the Disable Header helpers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(customizer): reuse existing strings for the toggles

The footer section is now titled Footer Options and both toggles drop
their descriptions, so the change adds no strings to translate. Every
label it uses already exists in the theme.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: retake the screenshots after the string reuse

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: keep content hooked around a disabled header, and AMP pagination without the footer

A disabled header skipped neve_before_header_hook and
neve_after_header_hook along with the wrapper. Neve Pro prints its page
header on neve_after_header_hook, so a page that turned its header off
lost the page header too, which development keeps. The hooks now always
run, and the header wrapper prints when the header is on or when the
hooks printed something. An empty wrapper is still dropped. The block
template follows the same rule.

The AMP infinite scroll wraps the footer hooks and removes the regular
pagination, so with the footer off an AMP blog archive had no pagination
at all. The infinite scroll now steps aside when the footer is off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(amp): hide the moved skip link on appended infinite scroll pages

The skip link used to sit inside <header next-page-hide>, so AMP infinite
scroll hid it on the pages it appends. Outside the header it needs its
own attribute, or every appended page adds another focusable skip link.

Tests now also cover whitespace-only hook output and the per-page switch
in the block theme template.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: make the block template tests able to fail

The block template helper never enabled the theme's FSE templates, so the
header part never rendered and the tests passed whatever the template
did. They now turn the templates on and check neve_do_header, and a new
case covers the AMP attribute on the block template skip link.

The shop test is gone: it opened a regular page and never reached the
shop branch, and the rule it checked is covered by the global-over-meta
test. Docblocks of the providers and helpers now give their shapes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: remove the PR screenshots from docs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fixed AMP submenu toggle accessibility
@pirate-bot

Copy link
Copy Markdown
Collaborator Author

🌍 i18n String Review Report

📊 Summary

Category Count
➕ Added 1
➖ Removed 0
🔄 Changed 0
Total 1
➕ Added Strings (1) - Click to expand
String Location Words Suggested Match
Submenu neve/inc/views/nav_walker... 1 No close match
Total 1

@vytisbulkevicius
vytisbulkevicius merged commit 687e3e0 into master Oct 21, 2026
16 of 18 checks passed
@pirate-bot

Copy link
Copy Markdown
Collaborator Author

🎉 This PR is included in version 4.2.17 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@pirate-bot pirate-bot added the released Indicate that an issue has been resolved and released in a particular version of the product. label Oct 21, 2026

This branch was successfully deployed

1 active deployment
staging — 905b565d Deployed Oct 21, 2026 by pirate-bot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released Indicate that an issue has been resolved and released in a particular version of the product.

Projects

None yet

5 participants