Skip to content
Merged

Release #4656

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1b98ed4
Sync branch [skip ci]
pirate-bot Oct 7, 2026
423c58e
Sync branch [skip ci]
pirate-bot Oct 7, 2026
83d8938
Sync branch [skip ci]
pirate-bot Oct 13, 2026
cfbe949
chore(deps): bump codeinwp/themeisle-sdk from 3.3.65 to 3.3.66 (#4655)
dependabot[bot] Oct 13, 2026
a834ed9
Fixed missing woo customizer sections (#4654)
girishpanchal30 Oct 13, 2026
74abc1b
chore(deps): bump codeinwp/themeisle-sdk from 3.3.66 to 3.3.67 (#4657)
dependabot[bot] Oct 15, 2026
646eacc
fix: improve letter spacing control handling
girishpanchal30 Oct 16, 2026
f10d452
fix: keep partial negative input
girishpanchal30 Oct 16, 2026
a0f94df
test: cover cleared field blur
girishpanchal30 Oct 16, 2026
6450331
fix: sanitize imported content width meta
girishpanchal30 Oct 16, 2026
61fc818
test: tighten contained width assertion
girishpanchal30 Oct 16, 2026
464ae16
Fixed remote font preview handling (#4661)
girishpanchal30 Oct 17, 2026
fabc68e
Fixed cart coupon error notice (#4659)
girishpanchal30 Oct 18, 2026
20ca614
fix: enhance AMP submenu toggle accessibility
girishpanchal30 Oct 19, 2026
a431c7c
test: share submenu menu fixture
girishpanchal30 Oct 19, 2026
1827309
Fixed gradient color values (#4666)
girishpanchal30 Oct 19, 2026
5577039
Fixed typography styles for block elements (#4664)
girishpanchal30 Oct 19, 2026
4fc71b1
fix: accept decoded arrays in the HFG JSON sanitizers (#4662)
HardeepAsrani Oct 20, 2026
8ce6a2a
Merge pull request #4660 from Codeinwp/bugfix/pro/3282
vytisbulkevicius Oct 20, 2026
717aeb8
Merge pull request #4663 from Codeinwp/bugfix/pro/3292
vytisbulkevicius Oct 20, 2026
b322f4a
fix: open the Welcome tab when the dashboard hash names a link-only t…
selul Oct 20, 2026
a4aab63
feat(customizer): disable the header and the footer for the whole sit…
selul Oct 21, 2026
905b565
Merge pull request #4665 from Codeinwp/bugfix/pro/3289
vytisbulkevicius Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions assets/apps/components/src/Common/SingleSizingInput.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import PropTypes from 'prop-types';
import { useState } from '@wordpress/element';

const SingleSizingInput = ({
type,
Expand All @@ -10,20 +11,25 @@ const SingleSizingInput = ({
label,
disabled,
}) => {
// Partial input like "-" reads as empty; rendering 0 would erase it.
const [isEmptyInput, setIsEmptyInput] = useState(false);

return (
<div className="nv-sizing-item">
<input
style={disabled ? { backgroundColor: '#dddddd' } : {}}
disabled={disabled}
type="number"
className={type ? type + '-input' : ''}
value={value}
value={isEmptyInput ? '' : value}
min={min}
max={max}
step={step}
onChange={(e) =>
onChange(type, e.target.value === '' ? 0 : e.target.value)
}
onChange={(e) => {
setIsEmptyInput(e.target.value === '');
onChange(type, e.target.value === '' ? 0 : e.target.value);
}}
onBlur={() => setIsEmptyInput(false)}
/>
{label && (
<label className="label" htmlFor={type + '-input'}>
Expand Down
14 changes: 12 additions & 2 deletions assets/apps/components/src/Controls/Sizing.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ import { __ } from '@wordpress/i18n';
import { mapValues } from 'lodash';
import { Button, Tooltip } from '@wordpress/components';

/**
* @param {string|number|null|undefined} value Control value or default.
* @return {boolean} Whether the value is unset.
*/
const isEmptyValue = (value) =>
value === '' || value === null || value === undefined;

const SizingControl = ({
noLinking,
options,
Expand Down Expand Up @@ -61,8 +68,11 @@ const SizingControl = ({

const hasSetValues = () => {
if (typeof defaults !== 'object') {
// eslint-disable-next-line eqeqeq
return parseFloat(defaults) != parseFloat(options[0].value);
const current = options[0].value;
if (isEmptyValue(defaults) || isEmptyValue(current)) {
return isEmptyValue(defaults) !== isEmptyValue(current);
}
return parseFloat(defaults) !== parseFloat(current);
}
return (
options.filter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,14 @@ ul[id^="sub-accordion-panel-hfg_"] {
}

#accordion-section-neve_header_presets,
#accordion-section-neve_footer_copyright_section {
#accordion-section-neve_footer_copyright_section,
#accordion-section-neve_global_footer_settings {
margin-top: 20px;
}

// Only some sites get the copyright section; when it is there, the two form one group.
#accordion-section-neve_footer_copyright_section
+ #accordion-section-neve_global_footer_settings {
margin-top: 0;
}
}
16 changes: 8 additions & 8 deletions assets/apps/customizer-controls/src/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -316,9 +316,8 @@ const bindDataAttrQuickLinks = () => {
};
const checkHasElementorTemplates = () => {
if (NeveReactCustomize.elementor.hasElementorShopTemplate) {
window.wp.customize
.section('woocommerce_product_catalog')
.notifications.add(
window.wp.customize.section('woocommerce_product_catalog', (section) =>
section.notifications.add(
new window.wp.customize.Notification(
'neve-custom-elementor-shop-template',
{
Expand All @@ -329,13 +328,13 @@ const checkHasElementorTemplates = () => {
),
}
)
);
)
);
}

if (NeveReactCustomize.elementor.hasElementorProductTemplate) {
window.wp.customize
.section('neve_single_product_layout')
.notifications.add(
window.wp.customize.section('neve_single_product_layout', (section) =>
section.notifications.add(
new window.wp.customize.Notification(
'neve-custom-elementor-product-template',
{
Expand All @@ -346,7 +345,8 @@ const checkHasElementorTemplates = () => {
),
}
)
);
)
);
}
};

Expand Down
3 changes: 2 additions & 1 deletion assets/apps/customizer-controls/src/scss/_general.scss
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@


#sub-accordion-panel-hfg_header #accordion-section-neve_header_presets,
#sub-accordion-panel-hfg_footer #accordion-section-neve_footer_copyright_section {
#sub-accordion-panel-hfg_footer #accordion-section-neve_footer_copyright_section,
#sub-accordion-panel-hfg_footer #accordion-section-neve_global_footer_settings {
display: list-item !important;
}

Expand Down
6 changes: 1 addition & 5 deletions assets/apps/customizer-controls/src/typeface/Typeface.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,11 +260,7 @@ const Typeface = (props) => {
label={__('Letter Spacing', 'neve')}
step={0.1}
default={defaultLS[currentDevice]}
value={
letterSpacing && letterSpacing[currentDevice]
? letterSpacing[currentDevice]
: ''
}
value={letterSpacing[currentDevice] ?? ''}
max={20}
min={-5}
units={['px']}
Expand Down
3 changes: 2 additions & 1 deletion assets/apps/dashboard/src/utils/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ const getTabHash = () => {

hash = hash.substring(1);

if (!tabs[hash]?.render && !tabs[hash]?.url) {
// Tabs with only a `url` are links (e.g. Starter Sites once the plugin is active), not content.
if (!tabs[hash]?.render) {
return null;
}

Expand Down
1 change: 1 addition & 0 deletions assets/scss/components/compat/woocommerce/_cart.scss
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

.woocommerce-cart table.cart td.actions .coupon {
display: flex;
flex-wrap: wrap;
}

//</editor-fold>
Expand Down
39 changes: 28 additions & 11 deletions assets/scss/components/editor/_typography.scss
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
@import "../main/global-colors";
@import "../main/variables";

// In the iframed editor the wrapper is the body itself.
main,
body &,
&:is(body),
body & p {
color: var(--nv-text-color);
font-size: var(--bodyfontsize);
Expand Down Expand Up @@ -52,21 +54,30 @@ h5,
h6 {
margin-bottom: $spacing-lg;
margin-top: 0;

&.wp-block,
& {
font-family: var(--headingsfontfamily, var(--bodyfontfamily));
color: var(--headingcolor, inherit);
}
}

$headings: [h1,h2,h3,h4,h5,h6];

@each $heading in $headings {
#{$heading} {
// One class still outranks these; the html prefix ties core's editor reset.
// WP 5.5-5.8 core heading styles are (0,1,1); those body classes outrank them.
@at-root html :where(.editor-styles-wrapper),
.branch-5-5 .editor-styles-wrapper,
.branch-5-6 .editor-styles-wrapper,
.branch-5-7 .editor-styles-wrapper,
.branch-5-8 .editor-styles-wrapper {

h1,
h2,
h3,
h4,
h5,
h6 {
font-family: var(--headingsfontfamily, var(--bodyfontfamily));
color: var(--headingcolor, inherit);
}

&.wp-block,
& {
@each $heading in $headings {
#{$heading} {
font-size: var(--#{$heading}fontsize);
font-weight: var(--#{$heading}fontweight);
line-height: var(--#{$heading}lineheight);
Expand Down Expand Up @@ -209,9 +220,15 @@ pre:not(.CodeMirror-line) {


// === Links === //
a:not(.wp-block-button__link) {
@at-root html :where(.editor-styles-wrapper) a:where(:not(.wp-block-button__link)) {
color: var(--nv-primary-accent);

// wp-admin's common.css loads in the editor and colours these at (0,1,1).
&:focus,
&:active {
color: var(--nv-primary-accent);
}

&:hover {
color: var(--nv-secondary-accent);
text-decoration: none;
Expand Down
12 changes: 6 additions & 6 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 26 additions & 0 deletions e2e-tests/fixtures/customizer/typography/letter-spacing-reset.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"neve_typeface_general": {
"fontSize": {
"suffix": {
"mobile": "px",
"tablet": "px",
"desktop": "px"
},
"mobile": 15,
"tablet": 16,
"desktop": 16
},
"lineHeight": {
"mobile": 1.6,
"tablet": 1.6,
"desktop": 1.7
},
"letterSpacing": {
"mobile": 0,
"tablet": "0",
"desktop": 0
},
"fontWeight": "400",
"textTransform": "none"
}
}
19 changes: 19 additions & 0 deletions e2e-tests/specs/admin/dashboard-tab-hash.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { test, expect } from '@playwright/test';

test.describe('Dashboard tab from the URL hash', () => {
test('a hash naming a link-only tab opens the Welcome tab', async ({
page,
}) => {
const errors: string[] = [];
page.on('pageerror', (error) => errors.push(error.message));

// "Get Neve Pro" is a link, not a tab with content. "Starter Sites" is
// the same once the Starter Sites plugin is active.
await page.goto('wp-admin/admin.php?page=neve-welcome#get-neve-pro');

await expect(
page.getByRole('link', { name: 'Go to Customizer' })
).toBeVisible();
expect(errors).toEqual([]);
});
});
Loading
Loading