/*
Theme Name: BlankSlate
Theme URI: https://opencollective.com/blankslate
Author: Web Guy
Author URI: https://opencollective.com/blankslate#section-contributors
Description: Donate: https://opencollective.com/blankslate. Learn: https://blankslate.me/. BlankSlate is the definitive WordPress boilerplate starter theme. I've carefully constructed the most clean and minimalist theme possible for designers and developers to use as a base to build websites for clients or to build completely custom themes from scratch. Clean, simple, unstyled, semi-minified, unformatted, and valid code, SEO-friendly, jQuery-enabled, no programmer comments, standardized and as white label as possible, and most importantly, the CSS is reset for cross-browser-compatability, with no intrusive visual CSS styles added whatsoever. A perfect skeleton theme. For support and suggestions, go to: https://github.com/webguyio/blankslate/issues. Thank you.
Tags: accessibility-ready, one-column, two-columns, custom-menu, featured-images, microformats, sticky-post, threaded-comments, translation-ready
Version: 2026
Requires at least: 5.2
Tested up to: 6.8
Requires PHP: 7.4
License: GNU General Public License v3 or Later
License URI: https://www.gnu.org/licenses/gpl.html
Text Domain: blankslate

BlankSlate WordPress Theme 2011-2026
BlankSlate is distributed under the terms of the GNU GPL
*/

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}html{scroll-behavior:smooth}body{line-height:1}a{text-decoration-skip-ink:auto}a[href^="tel"]{color:inherit;text-decoration:none}button{outline:0}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}q{display:inline;font-style:italic}q:before{content:'"';font-style:normal}q:after{content:'"';font-style:normal}textarea,input[type="text"],input[type="button"],input[type="submit"],input[type="reset"],input[type="search"],input[type="password"]{appearance:none;border-radius:0}input[type="search"]{appearance:textfield}table{border-collapse:collapse;border-spacing:0}th,td{padding:2px}big{font-size:120%}small,sup,sub{font-size:80%}sup{vertical-align:super}sub{vertical-align:sub}dd{margin-left:20px}kbd,tt{font-family:courier;font-size:12px}ins{text-decoration:underline}del,strike,s{text-decoration:line-through}dt{font-weight:bold}address,cite,var{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
/* Stops Chrome/Android from auto-inflating font sizes on narrow screens ("font boosting" /
   text-size-adjust). This is Android-Chrome-specific behaviour, not present in iOS Safari —
   which is exactly why a narrow Android phone (e.g. Galaxy S8) can render every page looking
   "zoomed in" while a wider iPhone shows no problem at all: iOS never applies this boosting,
   Android applies it more aggressively the narrower the screen is. Locking it to 100% forces
   text to always render at the size the CSS actually specifies. */
html {
	-webkit-text-size-adjust: 100%;
	-moz-text-size-adjust: 100%;
	-ms-text-size-adjust: 100%;
	text-size-adjust: 100%;
	/* Scales the ENTIRE rendered page 5% larger — text, images, spacing, layout, all of it — the
	   same way the browser's own Ctrl/Cmd-+ zoom does, rather than just bumping a base font-size
	   (which wouldn't touch anything set in fixed px, and most of this theme is). `zoom` is a
	   long-standing Chrome/Safari/Edge property that Firefox also picked up in 2024 (v126+), so
	   this now behaves consistently across current browsers. */
	zoom: 1.05;
}

.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;word-break:normal}
.screen-reader-text:focus{background-color:#f7f7f7;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto!important;clip-path:none;color:#007acc;display:block;font-size:14px;font-size:.875rem;font-weight:700;height:auto;right:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}
.skip-link{left:-9999rem;top:2.5rem;z-index:999999999;text-decoration:underline}
.skip-link:focus{display:block;left:6px;top:7px;font-size:14px;font-weight:600;text-decoration:none;line-height:normal;padding:15px 23px 14px;z-index:100000;right:auto}
.visually-hidden:not(:focus):not(:active), .form-allowed-tags:not(:focus):not(:active){position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);white-space:nowrap}

/* =========================================================
   Evolution Vaping — Custom Site Styles
   Brand tokens per Evolution_Brand_Pack_2023
   ========================================================= */

:root {
	--evo-purple-haze: #7c79d9;
	--evo-quality-sneaks: #6a2bc6;
	--evo-skate-n-destroy: #a92f78;
	--evo-yorkie: #d53586;
	--evo-builders-brew: #b9803d;
	--evo-orange-ya-glad: #dc852d;
	--evo-vintage-days: #daaf96;
	--evo-burnt-cotton: #2a2724;
	--evo-defeater: #191816;
	--evo-cloud: #fbefef;

	--evo-magenta: var(--evo-yorkie);

	--evo-body-font: 'Montserrat', Arial, sans-serif;
	--evo-subtitle-font: 'Barlow Condensed', Arial, sans-serif;
	--evo-heading-font: 'Anton', Impact, sans-serif; /* placeholder for Owners XWide Black — swap once webfont files are supplied */
	--evo-graffiti-font: 'Permanent Marker', cursive;

	/* Matches the .evo-cart-drawer width exactly so #evo-page-shift shrinks by precisely the
	   amount the drawer takes up — see "Cart drawer" section below. */
	--evo-cart-drawer-width: min(420px, 92vw);

	/* A genuine, fixed white for product photography specifically — deliberately NOT one of the
	   --evo-glass-* variables below, since those are translucent and swap to a dark tint in dark
	   mode. Most product photos are transparent-background PNGs; sitting them on a dark glass
	   backdrop let the dark tint show through the transparent areas, which looked like a
	   rendering fault rather than a design choice. Every product-image container in this file
	   uses this one variable, so product photography always sits on plain white regardless of
	   which theme mode the visitor has picked — matching the plain white backdrop the photos
	   were actually shot on. */
	--evo-product-image-bg: #ffffff;
}

/* =========================================================
   Evolution Vaping — Glass theme system (light/dark toggle)
   Every "surface" component in this file (header, cards, cart, forms, buttons) pulls its
   background/border/shadow/text colour from these variables instead of a hardcoded colour, so
   flipping the toggle (see .evo-theme-toggle in the header, and the inline script in
   footer.php that sets data-evo-theme on <html>) re-themes the whole site consistently. Dark
   is the default/fallback (matches the brand's existing dark header/footer mood); the switch
   remembers the visitor's choice in localStorage, defaulting to their OS-level preference the
   first time they land on the site. */
:root,
[data-evo-theme='dark'] {
	--evo-page-bg: #0e0d0c;
	--evo-glass-bg: rgba(46, 43, 40, 0.55);
	--evo-glass-bg-strong: rgba(25, 24, 22, 0.82);
	--evo-glass-bg-solid: rgba(25, 24, 22, 0.96);
	--evo-glass-border: rgba(255, 255, 255, 0.14);
	--evo-glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.45);
	--evo-glass-glow: 0 0 46px rgba(106, 43, 198, 0.4);
	--evo-glass-text: var(--evo-cloud);
	--evo-glass-input-bg: rgba(255, 255, 255, 0.07);
	--evo-glass-blur: blur(20px) saturate(180%);
	--evo-glass-blob-opacity: 0.55;
	/* Dark red reads fine on the light cards these were designed against, but goes muddy and
	   low-contrast on dark glass — brighter in dark mode, same hue family. */
	--evo-error-red: #ff6b6b;
	--evo-error-red-strong: #ff4d4d;
}

[data-evo-theme='light'] {
	/* Plain white rather than the previous warm/pinkish off-white (#f3efec) — the body::before
	   "glow" blobs below (purple/magenta/orange, matching the promo header's own brand gradient)
	   are untouched, so the glow still shows through exactly as before; only the flat base colour
	   underneath it changed. */
	--evo-page-bg: #ffffff;
	--evo-glass-bg: rgba(255, 255, 255, 0.55);
	--evo-glass-bg-strong: rgba(255, 255, 255, 0.85);
	--evo-glass-bg-solid: rgba(255, 255, 255, 0.96);
	--evo-glass-border: rgba(25, 24, 22, 0.1);
	--evo-glass-shadow: 0 8px 32px rgba(25, 24, 22, 0.12);
	--evo-glass-glow: 0 0 46px rgba(106, 43, 198, 0.22);
	--evo-glass-text: var(--evo-defeater);
	--evo-glass-input-bg: rgba(25, 24, 22, 0.045);
	--evo-glass-blur: blur(20px) saturate(180%);
	/* Was 0.3 — over the new pure-white page background (was the old off-white #f3efec) the same
	   glow read as a much more noticeable pink/purple wash than intended. Turned down so it's
	   only a faint trace, closer to plain white, rather than removed outright. */
	--evo-glass-blob-opacity: 0.1;
	--evo-error-red: #a12525;
	--evo-error-red-strong: #720e0e;
}

/* --evo-quality-sneaks (the deep #6a2bc6 purple used everywhere for headings, prices, links,
   etc.) reads fine on the light theme's near-white cards, but is low-contrast and hard to read
   on the dark theme's near-black backgrounds — the same issue already fixed one-off for the
   cart item price (.wc-block-cart-item__prices/__total further down). Rather than hunting down
   every individual selector that uses it, overriding the variable itself here (dark mode only)
   swaps every one of those uses over to the lighter lavender-blue already used for that cart
   price fix (--evo-purple-haze) in one place. Light mode is untouched. */
[data-evo-theme='dark'] {
	--evo-quality-sneaks: var(--evo-purple-haze);
}

body {
	background: var(--evo-page-bg);
	transition: background-color 0.3s ease;
}

/* Soft blurred colour blobs fixed behind the whole page — the "glow" every frosted panel sits
   on top of. Lives on a pseudo-element (not on <body> itself) so it can't turn <body> into a
   containing block for the fixed cart drawer/toast (a filter/backdrop-filter/transform on an
   actual ancestor element would do that and break their fixed positioning — see the cart
   drawer notes below). Fixed + negative z-index keeps it behind all real content everywhere. */
body::before {
	content: '';
	position: fixed;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	background:
		radial-gradient(circle at 12% 18%, rgba(106, 43, 198, 0.55), transparent 45%),
		radial-gradient(circle at 88% 12%, rgba(213, 53, 134, 0.45), transparent 45%),
		radial-gradient(circle at 50% 92%, rgba(220, 133, 45, 0.3), transparent 50%);
	filter: blur(70px);
	opacity: var(--evo-glass-blob-opacity);
	transition: opacity 0.3s ease;
}

/* Shared "pop" for every solid purple CTA button/badge on the site — layers a soft glow shadow
   behind the button and lifts it slightly on hover, on top of whatever background-color/shape
   each one already has. Purely additive (box-shadow/transform), so it can't break any existing
   button's layout, sizing, or click target. */
.evo-header-search__view-all,
.quick-shop__card-button,
.evo-contact__submit,
.woocommerce-MyAccount-navigation-link.is-active a,
.woocommerce-account .button,
.woocommerce-account .woocommerce-Address-title a.edit,
.evo-quick-order__add-btn,
.evo-quick-order-summary__push,
.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button.checkout,
.wc-block-cart__submit-button,
.wc-block-cart .wc-block-components-button,
.wholesale-hero__cta,
.wholesale-form__submit,
.evo-returns-contact__button {
	box-shadow: var(--evo-glass-glow);
	transition: background-color 0.15s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.evo-header-search__view-all:hover,
.quick-shop__card:hover .quick-shop__card-button,
.quick-shop__card:focus-visible .quick-shop__card-button,
.evo-contact__submit:hover,
.woocommerce-account .button:hover,
.woocommerce-account .woocommerce-Address-title a.edit:hover,
.evo-quick-order__add-btn:hover,
.evo-quick-order-summary__push:hover,
.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button.checkout:hover,
.wc-block-cart__submit-button:hover,
.wc-block-cart .wc-block-components-button:hover,
.wholesale-hero__cta:hover,
.wholesale-form__submit:hover,
.evo-returns-contact__button:hover {
	transform: translateY(-2px);
}

* { box-sizing: border-box; }

/* ---------- Global mobile safety net ----------
   Applies sitewide, on every page/template, present and future. Stops any image, video,
   embed, or table (including ones pasted into post/product content) from ever overflowing
   the viewport width on a small screen, and catches any stray element that still does. */

img,
svg,
video,
iframe,
embed,
object {
	max-width: 100%;
	height: auto;
}

table {
	max-width: 100%;
}

@media (max-width: 640px) {
	table:not(.variations) {
		display: block;
		overflow-x: auto;
		-webkit-overflow-scrolling: touch;
	}

	/* Several of our inputs/selects render below 16px (search box, shop filter dropdowns,
	   newsletter email, quantity box). Below 16px, iOS/WebKit auto-zooms the whole page in
	   when the field is focused — and if a link is clicked or a filter auto-submits while
	   still zoomed, that zoomed-in scale carries over onto the next page. Forcing 16px here
	   stops the zoom from ever triggering in the first place. */
	input,
	select,
	textarea {
		font-size: 16px !important;
	}
}

body {
	font-family: var(--evo-body-font);
	margin: 0;
	/* Safety-net fallback: anything WooCommerce/WordPress renders that this theme doesn't
	   explicitly style (login form, lost/reset password, review form, order-received page, and
	   any future gap) inherits this instead of the browser's default black text, so it's never
	   invisible against the dark theme's near-black page background. Anything that DOES have its
	   own explicit color rule elsewhere simply overrides this as normal. */
	color: var(--evo-glass-text);
}

/* ---------- Global page width: every ordinary page (posts, pages, archives, search, 404) ----------
   .site-content is the wrapper header.php/footer.php add around everything except WooCommerce
   pages (which get their own #primary.content-area from WooCommerce) and the front page (whose
   promo/hero sections are deliberately full-width). Styling both here keeps every page on the
   site — blog, shop, cart, checkout, account, single post — at the same consistent, readable,
   centred width that scales with the screen, from phones up through ultra-wide monitors.
   Search results also render via WooCommerce's #primary.content-area wrapper (see search.php),
   but is_woocommerce() (and so the "woocommerce-page" body class) doesn't cover is_search(), so
   it's matched here via WordPress's own "search"/"search-results" body classes instead. */

/* Same 1500px + 28/18/12px formula as the header (.site-header__inner) and the homepage's own
   Quick Shop/Latest Products sections (.quick-shop, .latest-products) — used here so every
   ordinary page (posts, blog index, 404, search) and every WooCommerce page (shop, cart,
   checkout, account) lines up with the same edges as the homepage and header, instead of each
   using its own separate width formula. A flat max-width (not vw/clamp-based) also avoids the
   mobile-overflow bug clamp(760px, 82vw, 1300px) used to cause here: that formula had a 760px
   FLOOR — below ~927px viewport width, 82vw came out smaller than that floor, so clamp() fell
   back to 760px regardless of how narrow the actual screen was, forcing real horizontal overflow
   on phones. 1500px has no such floor — it's just an upper bound, so the page is always exactly
   as wide as the viewport (minus padding) below that. */
.site-content,
.woocommerce-page #primary.content-area,
.search #primary.content-area {
	max-width: none;
	margin-left: auto;
	margin-right: auto;
	padding-left: 28px;
	padding-right: 28px;
	padding-bottom: 48px;
}

@media (max-width: 960px) {
	.site-content,
	.woocommerce-page #primary.content-area,
	.search #primary.content-area {
		padding-left: 18px;
		padding-right: 18px;
	}
}

@media (max-width: 640px) {
	.site-content,
	.woocommerce-page #primary.content-area,
	.search #primary.content-area {
		padding-bottom: 32px;
	}
}

@media (max-width: 400px) {
	.site-content,
	.woocommerce-page #primary.content-area,
	.search #primary.content-area {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* ---------- Blog post reading column ----------
   .site-content above is deliberately full-bleed (edge-to-edge with fixed
   gutters) for every ordinary page, since some pages (tables, wide embeds)
   want the extra room. A single blog post reads better as a narrower
   centred column though — same convention already used by page-about.php
   (.evo-about-mission), page-gdpr.php (.evo-gdpr-body) and page-terms-
   conditions.php (.evo-terms-tabs-section): a max-width + margin:0 auto on
   an inner wrapper, not a change to .site-content itself (which stays
   full-bleed for the shop/cart/checkout/account pages that also use it).
   Scoped to actual blog posts only (is_singular('post') in entry-content.php
   adds this class) — ordinary Pages using the generic template are
   untouched. */
.entry-content--blog {
	max-width: 820px;
	margin-left: auto;
	margin-right: auto;
}

/* ---------- Blog landing page (index.php "Posts page" + archive.php category/
   tag archives) ----------
   Both templates wrap their post loop in .evo-blog-grid — the same reused
   card grid for the main blog index and any category/tag archive, so they
   look consistent. Reuses the same "glass card" convention already used for
   the WooCommerce product grid (--evo-glass-bg/-border/-shadow/-glow) for
   visual consistency with the rest of the site, rather than inventing a new
   card style. Was previously completely unstyled — the loop just printed
   plain stacked <article> blocks with no grid, no card, no image cropping,
   relying entirely on the global reset. */
.evo-blog-grid {
	display: grid;
	grid-template-columns: repeat( 3, 1fr );
	gap: 28px;
	max-width: 1200px;
	margin: 0 auto 40px;
	padding: 0 28px;
}

@media ( max-width: 900px ) {
	.evo-blog-grid {
		grid-template-columns: repeat( 2, 1fr );
		padding: 0 18px;
	}
}

@media ( max-width: 600px ) {
	.evo-blog-grid {
		grid-template-columns: 1fr;
		padding: 0 12px;
		gap: 20px;
	}
}

.evo-blog-grid article {
	background: var(--evo-glass-bg);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 8px;
	box-shadow: var(--evo-glass-shadow);
	overflow: hidden;
	transition: transform 0.2s ease, box-shadow 0.2s ease;
	display: flex;
	flex-direction: column;
}

.evo-blog-grid article:hover {
	transform: translateY(-4px);
	box-shadow: var(--evo-glass-glow);
}

.evo-blog-grid article header {
	padding: 18px 20px 0;
}

.evo-blog-grid .entry-title {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 19px;
	line-height: 1.35;
	margin: 0;
	/* Clamps every card title to 2 lines regardless of length, so cards in
	   the same row stay the same height whether a post title is short or
	   long. */
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.evo-blog-grid .entry-title a {
	color: var(--evo-glass-text);
	text-decoration: none;
}

.evo-blog-grid .post-edit-link {
	display: inline-block;
	margin-top: 6px;
	font-family: var(--evo-body-font);
	font-size: 11px;
	color: var(--evo-glass-text);
	opacity: 0.6;
}

.evo-blog-grid .entry-meta {
	margin-top: 8px;
	font-family: var(--evo-body-font);
	font-size: 12px;
	color: var(--evo-glass-text);
	opacity: 0.65;
}

.evo-blog-grid .entry-meta a {
	color: inherit;
	text-decoration: none;
}

.evo-blog-grid .entry-summary {
	padding: 16px 20px 20px;
	display: flex;
	flex-direction: column;
	flex: 1;
}

.evo-blog-grid .entry-summary__image {
	display: block;
	line-height: 0;
}

.evo-blog-grid .entry-summary__image img {
	width: 100%;
	height: 200px;
	object-fit: cover;
	display: block;
}

.evo-blog-grid .entry-summary__excerpt {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	opacity: 0.85;
	margin-top: 4px;
	/* Clamps the excerpt to 3 lines for the same "equal card heights"
	   reason as the title clamp above. */
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.evo-blog-grid .entry-summary__more {
	display: inline-block;
	margin-top: 14px;
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 13px;
	color: var(--evo-quality-sneaks);
	text-decoration: none;
}

.evo-blog-grid .entry-summary__more:hover {
	text-decoration: underline;
}

/* Blog index/archive title block (archive.php's own <header>) — was plain
   unstyled text, same reset issue as everywhere else. */
.evo-blog-archive-header {
	max-width: 1200px;
	margin: 40px auto 32px;
	padding: 0 28px;
	text-align: center;
}

.evo-blog-archive-header .entry-title {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 32px;
	color: var(--evo-glass-text);
	margin: 0;
}

.evo-blog-archive-header .archive-meta {
	margin-top: 10px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

/* Prev/newer post pagination (nav-below.php's the_posts_navigation()) — WP
   core's own default markup/classes, previously completely unstyled. */
.posts-navigation {
	max-width: 1200px;
	margin: 0 auto 60px;
	padding: 0 28px;
}

.posts-navigation .nav-links {
	display: flex;
	justify-content: space-between;
	gap: 16px;
	border-top: 1px solid var(--evo-glass-border);
	padding-top: 20px;
}

.posts-navigation .nav-links a {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	text-decoration: none;
	display: inline-flex;
	align-items: center;
	gap: 6px;
}

.posts-navigation .nav-links a:hover {
	color: var(--evo-quality-sneaks);
}

/* ---------- Blog post header (badge, title, byline) ----------
   Was completely unstyled and left-aligned at the page edge — the theme's
   global reset strips h1 back to plain inherited text, and edit_post_link()/
   entry-meta.php print raw, unstyled markup by default. Matches your old
   Bloggle blog header layout: a small "Blogs" pill, the title, then
   "Written by: X | date | Time to read Y min" — centered and constrained to
   the same 820px column as the featured image and body text below it, so
   the top of the page reads as one aligned unit instead of a plain block
   stuck in the top-left corner. */
.entry-header--blog {
	max-width: 820px;
	margin: 32px auto 24px;
	text-align: center;
}

.entry-header--blog__badge {
	margin-bottom: 14px;
}

.entry-header--blog__badge a {
	display: inline-block;
	padding: 5px 14px;
	border: 1px solid var(--evo-glass-border);
	border-radius: 4px;
	background: var(--evo-glass-bg);
	font-family: var(--evo-body-font);
	font-size: 12px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.75;
	text-decoration: none;
}

.entry-header--blog .entry-title {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 32px;
	line-height: 1.25;
	color: var(--evo-glass-text);
	margin: 0;
}

.entry-header--blog .entry-title a {
	color: inherit;
	text-decoration: none;
}

/* Admin-only "Edit This" (edit_post_link()) — never seen by a real customer,
   but tidied to match the muted treatment used elsewhere on the site rather
   than the raw default blue underlined link. */
.entry-header--blog .post-edit-link {
	display: inline-block;
	margin-top: 8px;
	font-family: var(--evo-body-font);
	font-size: 12px;
	color: var(--evo-glass-text);
	opacity: 0.6;
}

.entry-header--blog .entry-meta {
	margin-top: 12px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

.entry-header--blog .entry-meta a {
	color: inherit;
	text-decoration: none;
}

.entry-header--blog .entry-meta a:hover {
	text-decoration: underline;
}

/* ---------- Blog post featured image ----------
   Rendered in entry-content.php as a sibling right before .entry-content--blog
   opens, so it isn't subject to that div's own text/paragraph styling — but
   matches its exact width and centering (max-width: 820px, margin: 0 auto)
   so the image lines up flush with the text column underneath it, same as
   the reference layout (image the same width as the title/content, not
   stretched edge-to-edge of the page). A fixed height with object-fit:cover
   means any image you set as the featured image gets cropped to fill this
   banner rather than distorting or leaving empty space, regardless of its
   original aspect ratio. */
.entry-featured-image {
	max-width: 820px;
	height: 400px;
	overflow: hidden;
	margin: 0 auto 30px;
}

.entry-featured-image a {
	display: block;
	width: 100%;
	height: 100%;
}

.entry-featured-image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* ---------- Blog post content typography ----------
   Same problem as .woocommerce-Tabs-panel--description further down: the theme's global reset
   (style.css line 20) strips h1-h6/p/ul/ol/li/hr back to plain unstyled inherited text —
   margin:0, font-size:100%, list-style:none, the lot. That's invisible for Gutenberg's own
   Paragraph/Heading/List blocks because core's block-library CSS restyles those specific block
   classes independently. It is NOT invisible for raw HTML pasted into the Embed Code block
   (e.g. copied straight from a Bloggle export) — that's bare <h1>/<h2>/<p>/<ul> with no block
   classes attached, so nothing restyles it and it renders as flat, unstyled body text (reported
   as "headers are being stripped" — they're not stripped, just unstyled).
   Scoped to .entry-content--blog specifically (not .entry-content generally, and not the reset
   itself) so this only ever touches real blog post reading columns — same scoping principle as
   every other exception already carved out of the reset in this file (Tabs panel, etc).
   Font is the body font, not --evo-heading-font ('Anton', a heavy all-caps display face meant
   for big marketing headlines) — inline article subheadings need to read at paragraph scale,
   not shout like a hero banner. */
.entry-content--blog {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
	font-size: 16px;
	line-height: 1.7;
}

.entry-content--blog p {
	margin: 0 0 18px;
}

.entry-content--blog h1,
.entry-content--blog h2,
.entry-content--blog h3,
.entry-content--blog h4,
.entry-content--blog h5,
.entry-content--blog h6 {
	font-weight: 700;
	line-height: 1.3;
	margin: 34px 0 16px;
	color: var(--evo-glass-text);
}

/* The post title itself is already rendered as a real <h1 class="entry-title"> above this div
   (see entry.php) — a second <h1> pasted in via Embed Code is a duplicate-H1 SEO/semantics
   issue, separate from this styling fix. Sized the same as h2 as a safety net so it doesn't
   look broken if it happens, but pasted content should ideally start at H2 going forward. */
.entry-content--blog h1 {
	font-size: 28px;
}

.entry-content--blog h2 {
	font-size: 28px;
}

.entry-content--blog h3 {
	font-size: 22px;
}

.entry-content--blog h4 {
	font-size: 18px;
}

.entry-content--blog h5,
.entry-content--blog h6 {
	font-size: 16px;
}

.entry-content--blog strong,
.entry-content--blog b {
	font-weight: 700;
}

.entry-content--blog em,
.entry-content--blog i {
	font-style: italic;
}

.entry-content--blog ul,
.entry-content--blog ol {
	margin: 0 0 18px;
	padding-left: 22px;
}

.entry-content--blog ul {
	list-style: disc;
}

.entry-content--blog ol {
	list-style: decimal;
}

.entry-content--blog li {
	margin-bottom: 8px;
}

.entry-content--blog hr {
	border: none;
	border-top: 1px solid var(--evo-glass-border);
	margin: 30px 0;
}

.entry-content--blog a {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

.entry-content--blog img {
	max-width: 100%;
	height: auto;
}

.entry-content--blog table {
	width: 100%;
	border-collapse: collapse;
	margin: 0 0 24px;
}

.entry-content--blog th,
.entry-content--blog td {
	padding: 10px 12px;
	border: 1px solid var(--evo-glass-border);
	text-align: left;
}

.entry-content--blog blockquote {
	margin: 0 0 18px;
	padding: 4px 20px;
	border-left: 3px solid var(--evo-quality-sneaks);
	font-style: italic;
}

.screen-reader-text {
	position: absolute;
	left: -9999px;
}

/* ---------- Product category pages: align with the header's own content edges ----------
   The site-wide wrapper above uses a different max-width/padding formula (clamp-based) than
   the header's own container (.site-header__inner / .site-header__utility-inner — max-width
   1500px, plus fixed 28/18/12px padding at the same three breakpoints below) — on category
   archives specifically, match the header's numbers instead so the sidebar+grid layout lines
   up exactly with the logo on the left and the cart icon on the right. */
.tax-product_cat #primary.content-area {
	max-width: none;
	padding-left: 28px;
	padding-right: 28px;
}

@media (max-width: 960px) {
	.tax-product_cat #primary.content-area {
		padding-left: 18px;
		padding-right: 18px;
	}
}

@media (max-width: 400px) {
	.tax-product_cat #primary.content-area {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* ---------- Product grid cards (shop / category / search results) ----------
   WooCommerce supplies the grid's column widths itself (woocommerce-layout.css), so this only
   adds the visual "glass card" treatment on top of li.product — background, blur, border,
   shadow, hover lift — without touching any of the layout/width rules that already work. */

/* Category/brand archives run a 6-per-row grid (see the loop_shop_columns filter in
   functions.php). WooCommerce's own woocommerce-layout.css ships a ".columns-6 li.product" width
   rule (13.5%) but — checked against the real stylesheet with Playwright — its float-based math
   doesn't actually work: width (13.5%) + the base rule's margin-right (3.8%, never reduced for
   higher column counts) adds up to 17.3% per card, and 6 of those is 103.8%, past 100%, so the
   6th card silently wraps to a new row every time instead of sitting on the same one. (The same
   sum-over-100% problem turns out to already exist at every column count core defines — 4 columns
   is 103.4%, 5 is 103.75% — so this wasn't introduced by going to 6, just newly exposed by it.)
   Converting to a real CSS grid sidesteps the percentage math entirely: exact equal columns, a
   fixed gap that's actually subtracted from the available width instead of tacked on afterwards,
   and native row-wrapping with no clear/nth-child trick needed. Scoped to .columns-6 specifically
   (the class this archive type's loop_shop_columns filter always produces), so the shop page's
   own grid — a different column count, untouched — isn't affected. Once a grid container takes
   over, "float" on a grid item box computes to "none" per spec regardless of what any other
   stylesheet (including WooCommerce's own smallscreen.css) says — so the responsive step-downs
   below take full ownership of every breakpoint themselves rather than assuming core's
   float-based mobile collapse still applies underneath. */
.woocommerce ul.products.columns-6,
.woocommerce-page ul.products.columns-6,
.search ul.products.columns-6 {
	display: grid;
	grid-template-columns: repeat(6, 1fr);
	gap: 24px;
}

/* When either slide-out drawer (cart OR login) AND the category filters panel are BOTH open at
   the same time, the page has shrunk for the drawer (#evo-page-shift's own margin-right) AND
   lost ~290px of width to the inline filters sidebar — squeeze from 6 columns down to 5 rather
   than leaving 6 uncomfortably narrow. evo-cart-drawer-open and evo-login-drawer-open are set in
   footer.php, evo-filters-panel-open in the wp_footer script below
   (evo_category_filter_sidebar_open()) — all plain body classes, so as soon as the drawer closes
   or the filters panel closes this stops matching and the base rule above (6 columns) applies
   again automatically, no extra JS needed for the "revert" half of this. Both drawers shrink
   #evo-page-shift by the exact same --evo-cart-drawer-width, and JS only ever allows one drawer
   open at once, so the login-drawer variant below squeezes by the same amount for the same
   reason — it was just missing here, leaving 6 columns uncomfortably narrow whenever the login
   drawer (rather than the cart drawer) was the one open alongside the filters panel. Guarded to
   the same width range the un-squeezed 6-column rule actually governs (above 1024px) so it can't
   fight with the tablet/mobile column counts just below, which already have their own fixed
   3/2-column layouts regardless of drawer state. .woocommerce/.woocommerce-page/.search are
   themselves body classes here (WooCommerce puts them on <body>, not a wrapper div) — chained
   directly onto body rather than as a separate descendant, same way the base 6-column rule's own
   ".woocommerce ul.products" effectively targets body's own class further out. */
@media (min-width: 1025px) {
	body.evo-cart-drawer-open.evo-filters-panel-open.woocommerce ul.products.columns-6,
	body.evo-cart-drawer-open.evo-filters-panel-open.woocommerce-page ul.products.columns-6,
	body.evo-cart-drawer-open.evo-filters-panel-open.search ul.products.columns-6,
	body.evo-login-drawer-open.evo-filters-panel-open.woocommerce ul.products.columns-6,
	body.evo-login-drawer-open.evo-filters-panel-open.woocommerce-page ul.products.columns-6,
	body.evo-login-drawer-open.evo-filters-panel-open.search ul.products.columns-6 {
		grid-template-columns: repeat(5, 1fr);
		gap: 20px;
	}
}

/* WooCommerce's own clearfix (ul.products::before/::after, content:" "/clear:both — needed for
   the old float layout) generates a real, empty box. A grid container treats that box as an
   actual grid item, silently claiming the first track and pushing every real product one slot
   to the right (so only 5 of 6 fit on row 1). Removing the generated content neutralises it —
   nothing about the clearfix is needed once the container is a grid anyway. */
.woocommerce ul.products.columns-6::before,
.woocommerce ul.products.columns-6::after,
.woocommerce-page ul.products.columns-6::before,
.woocommerce-page ul.products.columns-6::after,
.search ul.products.columns-6::before,
.search ul.products.columns-6::after {
	content: none;
}

.woocommerce ul.products.columns-6 li.product,
.woocommerce-page ul.products.columns-6 li.product,
.search ul.products.columns-6 li.product {
	width: auto;
	float: none;
	margin: 0;
}

@media (max-width: 1024px) {
	.woocommerce ul.products.columns-6,
	.woocommerce-page ul.products.columns-6,
	.search ul.products.columns-6 {
		grid-template-columns: repeat(3, 1fr);
		gap: 20px;
	}
}

@media (max-width: 767px) {
	.woocommerce ul.products.columns-6,
	.woocommerce-page ul.products.columns-6,
	.search ul.products.columns-6 {
		grid-template-columns: repeat(2, 1fr);
		gap: 16px;
	}
}

/* Square, not rounded — matches the squared-off treatment already used elsewhere on the site
   (Shop dropdown subcategory tiles, homepage "vaping level"/"visit our stores" images) rather
   than the fully-rounded 20px card this used to have. */
.woocommerce ul.products li.product,
.woocommerce-page ul.products li.product,
.search ul.products li.product {
	position: relative;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	padding: 16px !important;
	transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.woocommerce ul.products li.product:hover,
.woocommerce-page ul.products li.product:hover,
.search ul.products li.product:hover {
	transform: translateY(-4px);
	box-shadow: var(--evo-glass-glow);
}

.woocommerce ul.products li.product img,
.woocommerce-page ul.products li.product img,
.search ul.products li.product img {
	border-radius: 0;
	/* Most product photos are transparent-background PNGs — without this, dark-mode's page
	   background shows through the transparent areas instead of the plain white the photos were
	   shot on. background-color on an <img> itself paints exactly the transparent pixels, so a
	   fully opaque photo is completely unaffected. */
	background-color: var(--evo-product-image-bg);
}

.woocommerce ul.products li.product .woocommerce-loop-product__title,
.woocommerce-page ul.products li.product .woocommerce-loop-product__title,
.search ul.products li.product .woocommerce-loop-product__title {
	color: var(--evo-glass-text);
}

/* Bigger and bolder than the default — was easy to miss sitting quietly below the star rating
   at regular body-text size/weight. Now reads as clearly as the product title above it. */
.woocommerce ul.products li.product .price,
.woocommerce-page ul.products li.product .price,
.search ul.products li.product .price {
	display: block;
	margin: 8px 0 2px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 22px;
	color: var(--evo-quality-sneaks);
}

/* On-sale products: the crossed-out original price stays small/muted so the new price (still
   the large, bold text above) is unambiguously the one that matters. */
.woocommerce ul.products li.product .price del,
.woocommerce-page ul.products li.product .price del,
.search ul.products li.product .price del {
	font-size: 14px;
	font-weight: 500;
	opacity: 0.6;
	margin-right: 8px;
}

.woocommerce ul.products li.product .price ins,
.woocommerce-page ul.products li.product .price ins,
.search ul.products li.product .price ins {
	text-decoration: none;
}

/* ---------- Product card badges (Sale / Best Seller / New / Low Stock) ----------
   See evo_render_product_badges() in functions.php — at most one "status" badge (top-left,
   dark) plus an independent Sale badge (top-right, red), stacked absolutely over the card
   (li.product now has position: relative, above) so they never affect the card's own layout. */
.evo-product-badges {
	position: absolute;
	top: 12px;
	left: 12px;
	right: 12px;
	z-index: 2;
	display: flex;
	justify-content: space-between;
	align-items: flex-start;
	gap: 8px;
	pointer-events: none;
}

.evo-product-badge {
	display: inline-block;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	line-height: 1.4;
	padding: 4px 9px;
	border-radius: 0;
	color: var(--evo-cloud);
	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
}

.evo-product-badge--sale {
	background-color: #e11f26;
	margin-left: auto;
}

.evo-product-badge--bestseller {
	background-color: var(--evo-yorkie);
}

.evo-product-badge--new {
	background-color: var(--evo-quality-sneaks);
}

.evo-product-badge--low-stock {
	background-color: #b5730a;
}

.evo-product-badge--coming-soon {
	background-color: var(--evo-burnt-cotton);
}

/* ---------- Review stars (Lipscore) ----------
   Real widget once a Lipscore Site ID is set (Appearance > Customize > Lipscore Reviews) — see
   evo_render_product_card_rating() in functions.php. Until then, a neutral placeholder row
   (greyed stars, no invented number) keeps the card layout final today and needs no CSS change
   when the real feed is switched on later. */
.evo-product-rating {
	display: flex;
	align-items: center;
	gap: 4px;
	margin: 6px 0;
	font-size: 12px;
	color: var(--evo-glass-text);
	opacity: 0.85;
}

.evo-product-rating__stars {
	letter-spacing: 1px;
	color: var(--evo-yorkie);
}

.evo-product-rating--placeholder .evo-product-rating__stars {
	color: var(--evo-glass-border);
}

.evo-product-rating__count {
	font-size: 11px;
	opacity: 0.8;
}

/* "Quick Shop" trigger — replaces WooCommerce's default Add to Cart/Select Options link on every
   product card (this loop, search results, WooCommerce's own related/upsell/cross-sell blocks —
   see the woocommerce_loop_add_to_cart_link filter in functions.php — and the homepage sliders,
   styled separately just below). Opens the Quick Shop modal instead of adding to cart directly or
   navigating away, so a customer never has to leave the grid they're browsing. */
/* !important throughout this rule: WooCommerce's own bundled CSS has a more specific
   ".woocommerce button.button" rule (2 classes + an element vs. this button's 1 class) that
   otherwise wins on any page wrapped in ".woocommerce" (shop/category/search) and forces its
   own small grey default button back — which is why this button looked right on the homepage
   slider (no ".woocommerce" ancestor there) but reverted to WooCommerce's default style on
   category pages. Same fix already used elsewhere in this file (e.g. the li.product card
   padding above) for the same kind of core-CSS specificity clash. */
.evo-quick-shop-btn {
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	width: 100% !important;
	margin-top: 10px !important;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border: none !important;
	border-radius: 999px !important;
	padding: 10px 18px !important;
	cursor: pointer;
	box-shadow: var(--evo-glass-glow);
	transition: background-color 0.15s ease, transform 0.15s ease;
}

.evo-quick-shop-btn:hover,
.evo-quick-shop-btn:focus-visible {
	background-color: var(--evo-yorkie) !important;
	transform: translateY(-2px);
}

/* Out of Stock card label (evo_quick_shop_button_html() in functions.php) — same button look as
   Quick Shop (same base class, deliberately unchanged) but rendered as a plain <span>, not a
   <button>, with pointer-events disabled here so the hover lift/colour-change above can never
   trigger on something that isn't actually clickable. Dimmed via opacity alone rather than a
   different colour, so it still reads as "the same button, just inactive" rather than a
   different control. */
.evo-quick-shop-btn--disabled {
	opacity: 0.6;
	cursor: not-allowed;
	pointer-events: none;
}

/* ---------- Header: utility bar (purple) / main row (logo, search, cart) / nav row ---------- */

/* The whole header — USP/trust bar, main row (logo/search/cart), and nav row — is one single
   sticky, frosted glass unit. It stays pinned to the top of the viewport and the page scrolls
   underneath it, reading as true glass against the blurred colour blobs from body::before.
   backdrop-filter is applied to this element itself (not to an ancestor of it), so it doesn't
   affect its own sticky positioning — only a filter/transform on an ANCESTOR of a sticky/fixed
   element breaks it, which is why neither #evo-page-shift nor any wrapper above this one is
   ever touched with those properties. */
.site-header {
	background: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	color: var(--evo-glass-text);
	position: sticky;
	top: 0;
	z-index: 100;
	/* Full outline (was border-bottom only) around the whole header's outer edge, per the
	   client's request to outline the main menu header, the promo slider, and the combined
	   Quick Shop + Brands section as three distinct framed blocks down the homepage. */
	border: 1px solid var(--evo-glass-border);
	transition: background-color 0.3s ease, color 0.3s ease;
}

/* Trust messaging + Contact Us/Login/theme toggle — brand gradient glass strip at the very top
   of the sticky header, above the main row. Its own gradient sits on top of the shared glass
   background from .site-header above. */
.site-header__utility {
	background-image: linear-gradient(90deg, rgba(106, 43, 198, 0.85), rgba(213, 53, 134, 0.75));
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
}

.site-header__utility-inner {
	max-width: none;
	margin: 0 auto;
	display: flex;
	align-items: center;
	justify-content: space-between;
	/* +5% (was 16px) — part of the sitewide "header 5% bigger" pass. */
	gap: 17px;
	/* Thinner bar (was 8px top/bottom) — .trust-bar__list below also has its own vertical
	   padding, so the two were stacking to make this thicker than it needed to be.
	   Horizontal padding +5% (was 28px) as part of the same header-wide bump. */
	padding: 2px 29px;
}

.site-header__utility-trust {
	flex: 1 1 auto;
	min-width: 0;
}

.site-header__utility-links {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	/* +5% (was 12px), part of the header-wide bump. */
	gap: 13px;
	white-space: nowrap;
}

.site-header__utility-links a {
	font-family: var(--evo-subtitle-font);
	color: var(--evo-cloud);
	text-decoration: none;
	font-weight: 600;
	/* +5% (was 13px). */
	font-size: 14px;
	letter-spacing: 0.03em;
	text-transform: uppercase;
}

.site-header__utility-links a:hover,
.site-header__utility-links a:focus-visible {
	color: var(--evo-glass-text);
}

/* Light/dark theme toggle — sits in the utility bar next to Contact Us/Login. A plain button
   (not a checkbox) toggling aria-pressed; footer.php's inline script flips data-evo-theme on
   <html> and swaps which icon shows. Kept simple/pill-shaped rather than a full iOS-style
   switch to match the rest of the site's pill-button language. */
.evo-theme-toggle {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* +5% (was 30px), part of the header-wide bump. */
	width: 32px;
	height: 32px;
	border-radius: 50%;
	border: 1px solid rgba(255, 255, 255, 0.35);
	background: rgba(255, 255, 255, 0.12);
	color: var(--evo-cloud);
	cursor: pointer;
	flex-shrink: 0;
	transition: background-color 0.15s ease, transform 0.15s ease;
}

.evo-theme-toggle:hover,
.evo-theme-toggle:focus-visible {
	background: rgba(255, 255, 255, 0.22);
	transform: scale(1.05);
}

.evo-theme-toggle svg {
	display: block;
}

/* Sun/moon are both always in the DOM; only one shows at a time depending on the current
   theme, avoiding any icon swap flash. */
.evo-theme-toggle__sun,
.evo-theme-toggle__moon {
	display: none;
}

[data-evo-theme='dark'] .evo-theme-toggle__sun {
	display: block;
}

[data-evo-theme='light'] .evo-theme-toggle__moon {
	display: block;
}

/* Two-row main area: logo sits on the left and spans both rows; top row is search (centre) and
   account/cart (right); bottom row is the nav (Shop, Wholesale, About, Contact Us, Quick Order),
   centred underneath the search bar — see the client's wireframe. Named grid-template-areas
   (rather than relying on source order, like before) is what lets the logo span both rows
   cleanly: repeating "logo" in both rows of the same first column merges it into one area. */
.site-header__inner {
	max-width: none;
	margin: 0 auto;
	display: grid;
	grid-template-columns: auto 1fr auto;
	grid-template-rows: auto auto;
	grid-template-areas:
		"logo search actions"
		"logo nav    quicklinks";
	align-items: center;
	/* +5% (was 22px), part of the header-wide bump. */
	column-gap: 23px;
	row-gap: 8px;
	/* Sized up (was 11px 31px) to match the now much larger Shop menu underneath it — see the
	   nav text/logo/icon bumps below too.
	   Vertical padding trimmed from 15px down to 6px (horizontal 36px untouched) so the logo
	   (see .site-header__logo-img below, bumped from 42px to 60px) can grow into that freed-up
	   space. Bottom padding bumped up a little (was the same 6px as the top) now that the nav
	   row sits inside this box too, so it isn't flush against the header's own bottom edge.
	   Horizontal padding +5% (was 36px) as part of the same header-wide bump. */
	padding: 10px 38px 14px;
	position: relative;
}

/* Shrink-on-scroll (see the scroll listener in header.php, near the end of the file): scrolling
   down past a small threshold adds .site-header--compact to #site-header, which drops the nav
   row (Shop/Wholesale/About/Contact Us/Quick Order) and the New In/Coming Soon quick-links row
   entirely, collapsing .site-header__inner back down to the single top row — logo, search,
   Account/Cart — same as it is on a fresh page load before any scrolling. Scrolling back up (or
   returning near the top of the page) removes the class again.

   min-width: 961px, deliberately: mobile's .site-header__nav-group is the hamburger TOGGLE
   BUTTON, not a nav row with somewhere else to go — hiding it here would remove the only way to
   ever open the mobile menu, and overriding grid-template-areas back to this desktop shape would
   fight mobile's own "toggle logo actions" template (see the max-width: 960px block further
   down) and strand the toggle button with no named area to sit in. Gating this to desktop/
   tablet avoids both — mobile still gets the .site-header__utility collapse below (that one
   really is universal), just not this part. */
@media (min-width: 961px) {
	/* max-height + opacity (like .site-header__utility below) instead of instantly changing
	   grid-template-rows/areas or using display: none — both of those snap immediately with no
	   way to animate them, so they were fighting the trust bar's own smooth collapse just below
	   and reading as a jittery, uncoordinated double-step shrink instead of one clean motion.
	   grid-template-rows is left as "auto auto" at all times now — once this row's own content
	   collapses to (near) zero height via max-height, the "auto" track sizing just follows it
	   down smoothly on its own, no separate snap needed. 80px is comfortably taller than this
	   row's real content ever gets, so nothing clips on the way down (same idea as the trust
	   bar's own 60px a little further down). */
	.site-header__nav-group {
		max-height: 80px;
		opacity: 1;
		transition: max-height 0.25s ease, opacity 0.2s ease, margin 0.25s ease;
	}

	.site-header--compact .site-header__nav-group {
		max-height: 0;
		opacity: 0;
		margin-top: 0;
		margin-bottom: 0;
		overflow: hidden;
		pointer-events: none;
	}
}

/* The trust-badge strip above the main row collapses too — max-height + opacity (rather than
   display: none) so it's an actual smooth shrink rather than an instant jump-cut. 60px is
   comfortably taller than the bar's real content ever gets, so nothing clips on the way down. */
.site-header__utility {
	max-height: 60px;
	opacity: 1;
	overflow: hidden;
	transition: max-height 0.25s ease, opacity 0.2s ease, padding 0.25s ease;
}

.site-header--compact .site-header__utility {
	max-height: 0;
	opacity: 0;
	pointer-events: none;
}

.site-header__nav-group {
	grid-area: nav;
	justify-self: center;
	display: flex;
	align-items: center;
	/* Dropdown submenus (see .site-header__nav-list .sub-menu below) anchor to THIS element
	   rather than to the "Shop" <li> itself or the whole header bar — since nav-group is
	   centred within the same grid column the search bar uses (both justify-self: center in
	   .site-header__inner's "search" column), anchoring here is what makes the dropdown (and
	   its own square-tile flyouts) share the exact same centre line as the search bar above it,
	   regardless of how wide the nav row or the dropdown's own contents happen to be. */
	position: relative;
}

/* Desktop: the "Primary" nav sits inline in the main row (this replaces the old separate nav
   row entirely — the client wanted one unified full-width header row). Mobile keeps the exact
   same overlay/dropdown behaviour it always had (see the max-width: 960px rules further down),
   just anchored under .site-header__nav-group instead of a dedicated .site-header__nav-row. */
.site-header__nav {
	display: flex;
	align-items: center;
	/* +5% (was 28px), part of the header-wide bump. */
	gap: 29px;
	padding: 0;
}

/* A site owner can add this class to a menu item (Appearance > Menus > Screen Options >
   CSS Classes) to highlight it in pink, e.g. for a Sale/Clearance link. */
.site-header__nav-list .menu-item-highlight > a {
	color: var(--evo-yorkie);
}

.site-header__nav-list {
	list-style: none;
	display: flex;
	/* +5% (was 28px), part of the header-wide bump. */
	gap: 29px;
	margin: 0;
	padding: 0;
}

/* > (direct child) rather than a descendant selector — otherwise this would also match the
   nested .evo-shop-menu__item rows inside the Shop flyout (they're <li> too, several levels
   down), forcing them inline-flex and flattening that vertical category list into a single
   horizontal row. Only the top-level Shop/Wholesale/About items should get this. */
.site-header__nav-list > li {
	/* Flex so the link and its .site-header__submenu-toggle chevron (Shop only) sit on the
	   same vertical center line — without this they're just two inline-level elements each
	   aligning to their own baseline/vertical-align, which is what made the chevron look
	   out of line with the nav text. */
	display: inline-flex;
	align-items: center;
	/* No position: relative here (deliberately) — that's what lets the "Shop" dropdown's
	   .sub-menu (further down) skip past this <li> and anchor to .site-header__nav-group
	   instead, so it centres on the search bar's centre line rather than on "Shop" itself. */
}

.site-header__nav-list a {
	font-family: var(--evo-subtitle-font);
	color: var(--evo-glass-text);
	text-decoration: none;
	font-weight: 600;
	/* +5% (was 18px), part of the header-wide bump. */
	font-size: 19px;
	letter-spacing: 0.5px;
	text-transform: uppercase;
	position: relative;
	padding: 9px 0;
	transition: color 0.15s ease;
}

.site-header__nav-list a::after {
	content: '';
	position: absolute;
	left: 0;
	bottom: 0;
	width: 0;
	height: 2px;
	background: var(--evo-yorkie);
	transition: width 0.15s ease;
}

.site-header__nav-list a:hover::after,
.site-header__nav-list a:focus-visible::after {
	width: 100%;
}

.site-header__nav-list a:hover,
.site-header__nav-list a:focus-visible,
.site-header__nav-list li.current-menu-item > a,
.site-header__nav-list li.current_page_item > a,
.site-header__nav-list li.current-menu-ancestor > a {
	color: var(--evo-yorkie);
}

.site-header__nav-list a:focus-visible {
	outline: 2px solid var(--evo-yorkie);
	outline-offset: 4px;
}

/* Left column, spanning both grid rows (see .site-header__inner's grid-template-areas) so it
   reads as one tall block beside the shorter search/nav column next to it. No card/pill chrome
   any more — it's a single wordmark graphic now, not an icon + separately-styled text combo, so
   it just sits on the header's own glass background. */
.site-header__logo {
	grid-area: logo;
	justify-self: start;
	display: flex;
	align-items: center;
}

.site-header__logo-link {
	display: flex;
	align-items: center;
	text-decoration: none;
}

/* Two versions of the same logo (see images/evo-logo-light-mode.png and
   evo-logo-dark-mode.png) sit stacked in the markup; only one shows at a time depending on
   the current theme — same "both in the DOM, toggle with display" convention already used
   for the sun/moon icons in the theme toggle button, so switching themes never needs to wait
   on a fresh image request.
   Bumped from 42px to 60px, paired with .site-header__inner's vertical padding coming down
   from 15px to 6px above — the header row's total height stays put (~72px), but the logo now
   fills most of it instead of sitting small in the middle of a lot of padding.
   +5% again on top of that (was 60px) as part of the header-wide bump. */
.site-header__logo-img {
	max-height: 63px;
	width: auto;
	display: none;
}

[data-evo-theme='light'] .site-header__logo-img--light,
[data-evo-theme='dark'] .site-header__logo-img--dark {
	display: block;
}

.site-header__actions {
	grid-area: actions;
	justify-self: end;
	display: flex;
	align-items: center;
	/* +5% (was 26px), part of the header-wide bump. */
	gap: 27px;
}

/* Desktop-only compact search pill's own grid slot, top-centre between the logo and the
   account/cart icons (see .site-header__inner's grid-template-areas above) — the magnifying
   glass button lives inside the pill itself rather than being a separate icon that opens a
   panel below the header. */
.site-header__search-group {
	grid-area: search;
	justify-self: center;
}

.site-header__search-inline {
	display: flex;
	align-items: center;
	gap: 4px;
	background: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	/* Left padding +5% (was 16px), part of the header-wide bump. */
	padding: 4px 4px 4px 17px;
	position: relative;
}

.site-header__search-inline input[type='search'] {
	border: none;
	background: transparent;
	outline: none;
	color: var(--evo-glass-text);
	font-family: var(--evo-body-font);
	/* +5% (was 13px). */
	font-size: 14px;
	/* Wider (was 130px) — the live results dropdown's width matches this pill (see
	   .evo-header-search-results below), so a narrow pill was clipping full product titles
	   down to "Title…" with an ellipsis. +5% again (was 300px) as part of the header-wide bump. */
	width: 315px;
	min-width: 0;
}

.site-header__search-inline input[type='search']::placeholder {
	color: var(--evo-glass-text);
	opacity: 0.5;
}

.site-header__search-inline button {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* +5% (was 30px), part of the header-wide bump. */
	width: 32px;
	height: 32px;
	border-radius: 50%;
	border: none;
	background: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.site-header__search-inline button:hover,
.site-header__search-inline button:focus-visible {
	background-color: var(--evo-yorkie);
}

.site-header__search-toggle,
.site-header__icon-link {
	background: none;
	border: none;
	color: var(--evo-glass-text);
	cursor: pointer;
	position: relative;
	display: inline-flex;
	align-items: center;
	padding: 4px;
}

.site-header__search-toggle:hover,
.site-header__icon-link:hover,
.site-header__search-toggle:focus-visible,
.site-header__icon-link:focus-visible {
	color: var(--evo-orange-ya-glad);
	outline: none;
}

/* Desktop: the inline pill above replaces the icon + expandable panel entirely — hide both. */
@media (min-width: 961px) {
	.site-header__search-toggle,
	.site-header__search-bar {
		display: none !important;
	}
}

/* Mobile/tablet: keep the original icon + expandable panel below the header; the inline pill
   is desktop-only. */
@media (max-width: 960px) {
	.site-header__search-inline {
		display: none;
	}
}

/* Cart: icon (with count badge) + "Cart" label, always visible. */
.site-header__cart {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	color: var(--evo-glass-text);
	text-decoration: none;
}

.site-header__cart:hover,
.site-header__cart:focus-visible {
	color: var(--evo-orange-ya-glad);
}

.site-header__cart-icon {
	position: relative;
	display: inline-flex;
}

.site-header__cart-label {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	/* +5% (was 18px), part of the header-wide bump. */
	font-size: 19px;
	letter-spacing: 0.03em;
	text-transform: uppercase;
}

.site-header__cart-count {
	position: absolute;
	/* Offsets nudged out slightly (were -8px/-10px) to match the badge growing below. */
	top: -8px;
	right: -11px;
	background: var(--evo-yorkie);
	color: var(--evo-cloud);
	/* +5% (was 13px). */
	font-size: 14px;
	font-weight: 700;
	line-height: 1;
	border-radius: 50%;
	/* +5% (was 20px). */
	min-width: 21px;
	height: 21px;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 2px;
}

/* My Account/Login — icon + visible text label (matches the wireframe's "account" text) on
   every screen size; the label itself hides below 960px the same way .site-header__cart-label
   already does, leaving just the icon on mobile. */
.site-header__account-icon {
	gap: 8px;
}

.site-header__account-label {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	/* +5% (was 18px), part of the header-wide bump. */
	font-size: 19px;
	letter-spacing: 0.03em;
	text-transform: uppercase;
}

.site-header__menu-toggle {
	display: none;
	background: none;
	border: none;
	flex-direction: column;
	gap: 5px;
	padding: 6px;
	cursor: pointer;
}

.site-header__menu-toggle-bar {
	display: block;
	width: 22px;
	height: 2px;
	background: var(--evo-glass-text);
}

.site-header__search-bar {
	position: relative;
	/* Explicit z-index (not just position:relative) so this — and the live results dropdown
	   inside it — reliably stacks above the nav row below it. The mobile nav menu and this
	   search bar also now close one another via JS (see header.php) so the two overlays can
	   no longer both be open at once, but this stays as a second line of defence. */
	z-index: 120;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border-top: 1px solid var(--evo-glass-border);
}

.site-header__search-bar[hidden] {
	display: none;
}

/* Dark, gradient-bordered pill treatment for the expandable search bar's input row — sits
   inset within the dropdown panel rather than running edge-to-edge. */
.site-header__search-form {
	max-width: none;
	margin: 10px 16px;
	display: flex;
	flex-direction: row-reverse;
	align-items: center;
	background-image: linear-gradient(var(--evo-glass-bg-strong), var(--evo-glass-bg-strong)),
		linear-gradient(90deg, var(--evo-quality-sneaks), var(--evo-yorkie));
	background-origin: border-box;
	background-clip: padding-box, border-box;
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid transparent;
	border-radius: 999px;
	padding: 4px 18px 4px 4px;
}

.site-header__search-form input[type='search'] {
	flex: 1;
	min-width: 0;
	border: none;
	background: transparent;
	color: var(--evo-glass-text);
	padding: 10px 4px;
	font-family: var(--evo-body-font);
	font-size: 14px;
}

.site-header__search-form input[type='search']::placeholder {
	color: var(--evo-glass-text);
	opacity: 0.45;
}

.site-header__search-form input[type='search']:focus {
	outline: none;
}

.site-header__search-form button {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	border: none;
	background: transparent;
	color: var(--evo-glass-text);
	opacity: 0.55;
	cursor: pointer;
	transition: opacity 0.15s ease;
}

.site-header__search-form button:hover,
.site-header__search-form button:focus-visible {
	opacity: 1;
}

/* ---------- Header live search results (appears under either search bar as you type) ---------- */

.evo-header-search-results {
	display: none;
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	margin-top: 10px;
	/* Near-solid, not the lighter glass used for decorative panels — this floats directly over
	   whatever's below it in normal document flow (the nav row's own menu labels on mobile),
	   and at the lighter glass opacity that underlying text was visibly bleeding through the
	   results list, garbling both. This needs to read as a clean, fully separate layer. */
	background: var(--evo-glass-bg-solid);
	-webkit-backdrop-filter: blur(20px) saturate(140%);
	backdrop-filter: blur(20px) saturate(140%);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	overflow: hidden;
	z-index: 250;
	text-align: left;
}

.evo-header-search-results.is-open {
	display: block;
}

.evo-header-search__list {
	list-style: none;
	margin: 0;
	padding: 6px;
	max-height: 360px;
	overflow-y: auto;
}

.evo-header-search__item a {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px;
	border-radius: 0;
	text-decoration: none;
	transition: background-color 0.15s ease;
}

.evo-header-search__item a:hover,
.evo-header-search__item a:focus-visible {
	background: rgba(128, 128, 128, 0.15);
}

.evo-header-search__item img {
	width: 44px;
	height: 44px;
	object-fit: cover;
	background-color: var(--evo-product-image-bg);
	border-radius: 0;
	flex-shrink: 0;
}

.evo-header-search__item-info {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.evo-header-search__item-name {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	/* Wraps onto a second line instead of truncating with an ellipsis (was overflow:hidden +
	   nowrap) — combined with the wider search pill above, full product titles stay readable
	   even when they're long. */
	overflow-wrap: break-word;
	white-space: normal;
}

.evo-header-search__item-price {
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-quality-sneaks);
}

/* The purple used for the price elsewhere reads fine on light cards, but this dropdown sits on
   a near-solid dark panel in dark mode — white matches the product name above it instead. */
[data-evo-theme='dark'] .evo-header-search__item-price {
	color: var(--evo-glass-text);
}

.evo-header-search__empty {
	margin: 0;
	padding: 20px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	opacity: 0.7;
	text-align: center;
}

.evo-header-search__view-all {
	display: block;
	text-align: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background: var(--evo-quality-sneaks);
	text-decoration: none;
	padding: 12px;
}

.evo-header-search__view-all:hover,
.evo-header-search__view-all:focus-visible {
	background: var(--evo-yorkie);
}

/* ---------- Dropdown submenus ---------- */

.site-header__nav-list .sub-menu {
	list-style: none;
	margin: 0;
	padding: 0;
	position: absolute;
	/* top: 100% resolves against .site-header__nav-group (position: relative — see that rule
	   above; none of the elements in between — the <li>, .site-header__nav-list, .site-header__
	   nav — have position set, so it skips past all of them), opening flush under the whole nav
	   row. left: 50% + translateX(-50%) below then centres the panel on nav-group's own centre
	   line — which, since nav-group sits in the same centred grid column as the search bar (see
	   .site-header__inner), is the search bar's centre too, regardless of how wide this panel's
	   own row of items or the nav row above it turn out to be. */
	top: 100%;
	left: 50%;
	/* Without an explicit width, an absolutely-positioned box with left: 50% (and no right)
	   gets its "available width" calculated as only HALF the containing block — the browser
	   works this out before the translateX(-50%) transform below is applied, since transforms
	   are purely visual and don't feed back into layout sizing. That's what was squeezing this
	   row and wrapping every label onto multiple lines despite there visibly being plenty of
	   room either side once centred. width: max-content sidesteps that entirely — sizes to
	   exactly what the row of labels needs, ignoring the (wrongly halved) available-width cap. */
	width: max-content;
	/* Horizontal row of items (Coming Soon, New In, Vape Kits, ...) rather than the old
	   vertical list — .evo-shop-menu is the only .sub-menu on the site in practice, so this
	   lives here alongside the generic positioning rules rather than as its own selector. */
	display: flex;
	flex-direction: row;
	align-items: stretch;
	background: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border-top: 2px solid var(--evo-yorkie);
	box-shadow: var(--evo-glass-shadow);
	opacity: 0;
	visibility: hidden;
	transform: translateX(-50%) translateY(6px);
	transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;
	z-index: 200;
}

/* Click-only: opens via the .is-open class (toggled by .site-header__submenu-toggle's click
   handler in header.php) or by keyboard focus landing inside it — no longer on mouse hover. */
.site-header__nav-list li.is-open > .sub-menu,
.site-header__nav-list li:focus-within > .sub-menu {
	opacity: 1;
	visibility: visible;
	transform: translateX(-50%) translateY(0);
}

.site-header__nav-list .sub-menu li {
	border-right: 1px solid rgba(255, 255, 255, 0.06);
	/* Belt-and-braces alongside width: max-content above — keeps each box sized to its own
	   label at all times rather than letting flex's default shrink behaviour compress it. */
	flex-shrink: 0;
}

.site-header__nav-list .sub-menu li:last-child {
	border-right: none;
}

.site-header__nav-list .sub-menu a {
	display: block;
	/* Bigger rows (was 13px 20px / 15.4px) so this panel reads as a proper full-size menu, not
	   a compact list. +5% again (was 20px 26px / 17px) as part of the header-wide bump. */
	padding: 21px 27px;
	/* Keeps every label ("Pods and Coils", "Tanks and RDAs/RTAs", ...) on one line — inherited
	   by .evo-shop-menu__link's own <span> below it too, since white-space is an inherited
	   property. */
	white-space: nowrap;
	text-transform: none;
	font-weight: 500;
	font-size: 18px;
	letter-spacing: 0;
}

.site-header__nav-list .sub-menu a::after {
	display: none;
}

/* ---------- Shop dropdown, level 2 — square category tiles, opens below, centred on the
   search bar ----------
   The level-1 panel is now a horizontal row (see .sub-menu above), so this now opens straight
   down instead of out to the side. Rows with no subcategories (New In, Coming Soon, or any
   expandable item that happens to have none yet) never get the "has-children" class, so none of
   this applies to them — they stay a plain link.

   Deliberately no position: relative on .evo-shop-menu__item (below) — that would make each row
   its own positioning context, so the flyout would open centred under whichever row you hover
   (drifting left/right depending on which item, rather than staying put). Leaving the row
   unpositioned means .evo-shop-menu__flyout's position: absolute instead resolves against the
   next positioned ancestor up: .evo-shop-menu itself (already position: absolute AND centred on
   .site-header__nav-group — see the generic .sub-menu rule above). So every row's flyout opens
   from the exact same spot — centred on the search bar, same as the level-1 panel above it —
   regardless of which row triggered it. */
.evo-shop-menu__item {
}

.evo-shop-menu__link {
	display: flex;
	align-items: center;
	justify-content: space-between;
	/* +5% (was 10px), part of the header-wide bump. */
	gap: 11px;
}

/* Hovering anywhere on the row — the label text, this chevron, or the gap between them, since
   :hover on a parent is true whenever any descendant is hovered — opens the flyout below (see
   .evo-shop-menu__item:hover > .evo-shop-menu__flyout further down); a plain left-click on the
   row still navigates straight to the category page as normal. Desktop only: hidden in favour
   of the dedicated .evo-shop-menu__expand button on mobile (see the max-width: 960px block
   further down), since there's no hover there to open the flyout with. */
.evo-shop-menu__chevron {
	flex-shrink: 0;
	color: var(--evo-glass-text);
	opacity: 0.6;
	transition: transform 0.15s ease, opacity 0.15s ease;
}

.evo-shop-menu__item:hover > .evo-shop-menu__link .evo-shop-menu__chevron,
.evo-shop-menu__item:focus-within > .evo-shop-menu__link .evo-shop-menu__chevron {
	opacity: 1;
	transform: translateX(2px);
}

/* Mobile-only tap target — hidden on desktop, where hovering the row (see .evo-shop-menu__chevron
   above) opens the flyout instead. Shown again in the max-width: 960px block further down. */
.evo-shop-menu__expand {
	display: none;
}

.evo-shop-menu__flyout {
	position: absolute;
	/* Opens flush under .evo-shop-menu, the shared level-1 panel (top: 100%, same pattern as
	   that panel's own positioning against .site-header__nav-group above), centred on it via
	   left: 50% + translateX(-50%) below — since .evo-shop-menu is itself centred on the search
	   bar, every flyout lands in that exact same spot regardless of which row triggered it,
	   rather than sliding out sideways or drifting to whichever item you're hovering. No fixed
	   height to match any more either: this panel just grows downward to whatever height its
	   own tiles need. */
	top: 100%;
	left: 50%;
	/* max-content (the default for an absolutely-positioned element with only left/top set, not
	   also right — no explicit width rule needed) sizes to whatever the single horizontal row
	   of tiles actually needs (see .evo-shop-menu__grid below — flex, nowrap, no wrapping to a
	   second row), so it never clips or leaves dead space regardless of how many subcategories a
	   given parent has.

	   --evo-shop-flyout-maxw (set by JS, see evoFitShopFlyouts() in header.php) caps this so a
	   centred panel doesn't spill past either edge of the header itself — JS measures the live
	   gap from the search bar's centre to the nearer of the header's own left/right edges,
	   shrinks --evo-shop-tile-size (used below and on .evo-shop-menu__tile) so the row of tiles
	   fits on its own first. Only if tiles are already at their smallest sensible size and it's
	   still too tight does JS also set this max-width, at which point .is-scrollable (below)
	   kicks in so the row scrolls internally instead of the panel spilling past the header's
	   edge. Defaults to none so nothing is capped before JS runs (or if JS fails for any reason
	   — falls back to the old max-content-only behaviour). */
	max-width: var(--evo-shop-flyout-maxw, none);
	background: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border-top: 2px solid var(--evo-yorkie);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	/* +5% (was 36px), part of the header-wide bump. */
	padding: 38px;
	display: flex;
	align-items: center;
	opacity: 0;
	visibility: hidden;
	transform: translateX(-50%) translateY(6px);
	transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;
	z-index: 210;
}

/* Scroll button — only present in the DOM/visible once JS (evoFitShopFlyouts) has determined
   the tile row still doesn't fit even at its smallest allowed size, and has put
   .evo-shop-menu__grid into horizontal-scroll mode (see .is-scrollable below). A real <button>
   (see header.php) that advances the row on click (see evoShopFlyoutScrollBtn in header.php's
   JS) — deliberately chunky and high-contrast rather than a subtle hint, since a faint glass
   circle was easy to miss against busy tile photos. The border colour is
   var(--evo-glass-text), which is already the one variable in this file that's black in light
   mode and (near-)white in dark mode (see the [data-evo-theme] blocks near the top), so this
   automatically gets a solid black ring in light mode / white ring in dark mode for free. */
.evo-shop-menu__scroll-hint {
	position: absolute;
	top: 50%;
	right: 14px;
	transform: translateY(-50%);
	display: none;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	border-radius: 50%;
	background: var(--evo-glass-bg-strong);
	border: 3px solid var(--evo-glass-text);
	box-shadow: var(--evo-glass-shadow);
	color: var(--evo-glass-text);
	padding: 0;
	cursor: pointer;
	z-index: 2;
	transition: opacity 0.15s ease, transform 0.15s ease, background-color 0.15s ease, color 0.15s ease;
}

.evo-shop-menu__flyout.is-scrollable .evo-shop-menu__scroll-hint {
	display: flex;
}

/* Inverts on hover/focus (solid fill instead of an outline) so the button reads as clickable,
   not just decorative — --evo-page-bg is the matching theme-flipped opposite of
   --evo-glass-text (light background in light mode, dark background in dark mode), so the
   icon stays legible against the now-solid fill either way. */
.evo-shop-menu__scroll-hint:hover,
.evo-shop-menu__scroll-hint:focus-visible {
	background: var(--evo-glass-text);
	color: var(--evo-page-bg);
	transform: translateY(-50%) scale(1.06);
}

/* Faded (and click-disabled) once a user has scrolled the row all the way to its end — no
   more content to advance to (see the grid's scroll listener in header.php, which toggles
   this class). */
.evo-shop-menu__flyout.is-scrollable.is-scrolled-end .evo-shop-menu__scroll-hint {
	opacity: 0;
	pointer-events: none;
}

/* Mirrors .evo-shop-menu__scroll-hint above — same button, same trigger (.is-scrollable), just
   the opposite direction and side (left, not right; arrow pointing left, not right — see the
   SVG in header.php). Starts faded the same way .evo-shop-menu__scroll-hint fades once
   scrolled to the end (below), rather than always-visible like that button — the row always
   opens scrolled to its start (see evoFitShopFlyouts()/evoResetFlyoutScroll() in header.php),
   so there's nothing to go back to yet until the visitor has actually scrolled forward. */
.evo-shop-menu__scroll-back {
	position: absolute;
	top: 50%;
	left: 14px;
	transform: translateY(-50%);
	display: none;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	border-radius: 50%;
	background: var(--evo-glass-bg-strong);
	border: 3px solid var(--evo-glass-text);
	box-shadow: var(--evo-glass-shadow);
	color: var(--evo-glass-text);
	padding: 0;
	cursor: pointer;
	z-index: 2;
	transition: opacity 0.15s ease, transform 0.15s ease, background-color 0.15s ease, color 0.15s ease;
}

.evo-shop-menu__flyout.is-scrollable .evo-shop-menu__scroll-back {
	display: flex;
}

.evo-shop-menu__scroll-back:hover,
.evo-shop-menu__scroll-back:focus-visible {
	background: var(--evo-glass-text);
	color: var(--evo-page-bg);
	transform: translateY(-50%) scale(1.06);
}

/* Faded (and click-disabled) while still at the row's start — see the comment on
   .evo-shop-menu__scroll-back above. .is-scrolled-start is added up front (so this is the
   default state the moment the row becomes scrollable) and removed again by the same scroll
   listener in header.php the instant it's scrolled away from the start. */
.evo-shop-menu__flyout.is-scrollable.is-scrolled-start .evo-shop-menu__scroll-back {
	opacity: 0;
	pointer-events: none;
}

/* Opens on hover (desktop — see .evo-shop-menu__chevron above) or keyboard focus landing
   inside it. .is-open is mobile's click-to-expand trigger instead (toggled by
   .evo-shop-menu__expand's click handler in header.php, since phones have no hover) — mostly
   moot here since the max-width: 960px block further down replaces this whole rule for mobile
   anyway, but kept for parity with that block. */
.evo-shop-menu__item:hover > .evo-shop-menu__flyout,
.evo-shop-menu__item.is-open > .evo-shop-menu__flyout,
.evo-shop-menu__item:focus-within > .evo-shop-menu__flyout {
	opacity: 1;
	visibility: visible;
	transform: translateX(-50%) translateY(0);
}

/* flex + nowrap (not a grid) by default — one horizontal row, however many subcategories
   there are, as long as they fit at a sensible size (see evoFitShopFlyouts() in header.php).
   Only switches to an actual (2-row) grid via .is-stacked below, once that JS decides a single
   row can't fit everything at a readable size any more. */
.evo-shop-menu__grid {
	display: flex;
	flex-wrap: nowrap;
	/* +5% (was 26px), part of the header-wide bump. */
	gap: 27px;
	/* Lets the grid shrink below its content's natural width instead of forcing the flex-item
	   default (min-width: auto), which would otherwise stop .evo-shop-menu__flyout's max-width
	   cap (see above) from ever actually taking effect. max-width: 100% keeps it from spilling
	   past the flyout's own padding box; overflow-x only actually scrolls once .is-scrollable
	   is added (see below) — plain overflow: visible the rest of the time so nothing clips
	   during the shrink-to-fit sizing JS does first. */
	min-width: 0;
	max-width: 100%;
	overflow: visible;
}

/* Once evoFitShopFlyouts() (header.php) decides a single row would have to shrink tiles below
   a readable size to fit within the header's own width, it reflows into two rows instead —
   stacking tiles 2 high (grid-auto-flow: column fills each column top-to-bottom before starting
   the next one, i.e. tile 1 and 2 share the first column, 3 and 4 the second, and so on) rather
   than shrinking further or scrolling. There's no fixed height to fit inside any more (the
   panel just drops below the shared level-1 row and grows downward as needed — see
   .evo-shop-menu__flyout above), so JS only has to size --evo-shop-tile-size against the
   available width here. Same
   gap as the flex version above (grid honours the shorthand identically), so no separate gap
   rule is needed here.

   min-width: 961px, matching the max-width: 960px mobile block further down: this class only
   ever gets added by desktop's flyout-fitting logic in practice (mobile's flyout measures as
   zero-size while closed, so the JS bails out before ever touching it — see evoFitShopFlyouts()
   in header.php), but two classes (0,2,0) would otherwise still outrank mobile's own plain
   .evo-shop-menu__grid rule (0,1,0) and silently break its fixed 2-column phone layout in the
   one-in-a-million case that it didn't. Gating this behind the same breakpoint removes that
   possibility outright rather than relying on the JS bail-out alone. */
@media (min-width: 961px) {
	.evo-shop-menu__grid.is-stacked {
		display: grid;
		grid-template-rows: repeat(2, auto);
		grid-auto-flow: column;
		grid-auto-columns: max-content;
	}
}

.evo-shop-menu__flyout.is-scrollable .evo-shop-menu__grid {
	overflow-x: auto;
	overflow-y: hidden;
	/* The scroll button + drag-to-scroll (see evoFitShopFlyouts/evoEnableShopFlyoutDrag in
	   header.php) are the intended way to move this row now, so the native scrollbar track
	   is hidden entirely rather than just thinned — it was reading as a stray grey bar under
	   the tiles. Cross-browser: Firefox/Edge via scrollbar-width, Chrome/Safari via the
	   ::-webkit-scrollbar rule below. */
	scrollbar-width: none;
	-ms-overflow-style: none;
	/* Lets our own JS drag-handling own left/right gestures instead of fighting the browser's
	   default touch-scroll/zoom handling, while still leaving vertical page-scroll gestures
	   (a finger swipe that starts on this row but really means to scroll the page) alone. */
	touch-action: pan-y;
	cursor: grab;
}

.evo-shop-menu__flyout.is-scrollable .evo-shop-menu__grid::-webkit-scrollbar {
	display: none;
}

.evo-shop-menu__flyout.is-scrollable .evo-shop-menu__grid.is-dragging {
	cursor: grabbing;
	/* Stops the tile labels/images highlighting like selected text mid-drag. */
	user-select: none;
}

/* Belt-and-braces alongside draggable="false" in the markup (see header.php) and the
   dragstart preventDefault in the JS: stops the browser's own native "drag this image/link"
   behaviour from ever engaging over a tile, which was hijacking the pointer mid-gesture and
   was the reason drag-to-scroll only ever seemed to work in one direction. */
.evo-shop-menu__tile,
.evo-shop-menu__tile-image {
	-webkit-user-drag: none;
	user-drag: none;
}

.evo-shop-menu__tile {
	position: relative;
	display: flex;
	align-items: flex-start;
	flex: 0 0 auto;
	aspect-ratio: 1 / 1;
	/* Bumped up from 190px along with the rest of the menu (see the panel/row changes above)
	   — bigger tiles fill the taller flyout properly instead of leaving it looking sparse.
	   +5% again (was 260px) as part of the header-wide bump.

	   Now driven by --evo-shop-tile-size (JS custom property, see evoFitShopFlyouts() in
	   header.php) rather than a bare value: 273px is only the fallback/default used before JS
	   runs or if there's plenty of room. When the full row of tiles at 273px would reach past
	   the cart icon, JS shrinks this one variable — width, height and (via the aspect-ratio
	   above) the image inside all shrink together automatically, since everything here is
	   driven off the same custom property. */
	width: var(--evo-shop-tile-size, 273px);
	/* Explicit height alongside aspect-ratio, not relying on aspect-ratio alone: this tile is a
	   flex item nested two levels deep (.evo-shop-menu__grid, itself a flex item inside
	   .evo-shop-menu__flyout's align-items: center), and its only "content" is an absolutely
	   positioned image — which doesn't contribute to auto-height the way in-flow content would.
	   Some browsers resolve the flex cross-size before applying aspect-ratio in that situation,
	   which was leaving the tile a bit shorter than a true square and the image (sized off
	   the tile's own height at 100%) shrinking to match — read as "the photo doesn't fill the
	   square". A definite height removes the ambiguity outright. Kept equal to width above via
	   the same custom property, so it stays a true square whatever size JS lands on. */
	height: var(--evo-shop-tile-size, 273px);
	/* Belt-and-braces floor: even if JS hasn't run yet (or somehow computes something odd),
	   the tile never renders smaller than this — matches the MIN_TILE_SIZE floor in JS, past
	   which JS switches to horizontal scroll instead of shrinking further. */
	min-width: 200px;
	min-height: 200px;
	border-radius: 0;
	overflow: hidden;
	text-decoration: none;
	background-color: var(--evo-defeater);
	border: 1px solid rgba(255, 255, 255, 0.14);
	box-shadow: 0 6px 16px rgba(0, 0, 0, 0.22);
	transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.evo-shop-menu__tile:hover,
.evo-shop-menu__tile:focus-visible {
	transform: translateY(-3px);
	box-shadow: 0 10px 22px rgba(0, 0, 0, 0.28);
}

/* Tiles without their own uploaded/category image still get this purple radial-gradient
   backdrop, but keep the same top-aligned, full-width label treatment as tiles that do have
   an image (align-items: flex-start is inherited from .evo-shop-menu__tile above, not
   overridden here any more) — so every tile looks consistent regardless of whether an image
   has been set for that category yet. */
.evo-shop-menu__tile:not(:has(.evo-shop-menu__tile-image)) {
	background-image: radial-gradient(circle at 30% 20%, rgba(106, 43, 198, 0.55) 0%, rgba(106, 43, 198, 0) 50%);
}

/* Specificity bump (was the bare .evo-shop-menu__tile-image class alone) plus !important on the
   three properties that matter: WooCommerce's own default frontend stylesheet ships a same-or-
   higher-specificity image rule (scoped via the .woocommerce body class present on every shop
   page) that was winning the cascade for `height` on this element — the browser was resolving it
   back to `auto`, so the <img> box itself stopped short of the tile's bottom edge instead of
   stretching to inset: 0, and the tile's own dark background showed through underneath (visible
   as a flat dark band, confirmed via the element picker: clicking that band selected the tile
   itself, not the image, proving the image's own box — not just its content — fell short).
   object-fit: cover only controls how a photo is CROPPED within its box; it can't compensate for
   the box itself being the wrong size, hence needing the fix here rather than there. */
.evo-shop-menu__tile .evo-shop-menu__tile-image {
	display: block;
	position: absolute;
	inset: 0;
	width: 100% !important;
	height: 100% !important;
	object-fit: cover !important;
}

.evo-shop-menu__tile-label {
	/* Pinned with top/left/right: 0 directly against the tile itself (its nearest positioned
	   ancestor), rather than relying on width: 100% inside the flex layout above — that left
	   the shadow reading as slightly inset instead of running flush to all three edges. This
	   guarantees the gradient always starts exactly at the tile's own top edge and reaches
	   completely across to its left and right edges, regardless of the tile's own box model. */
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	z-index: 1;
	/* +5% (was 18px 16px 30px), part of the header-wide bump. */
	padding: 19px 17px 32px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	/* Bigger and tighter-lined than before (was 12.5px) — the gradient below sizes itself off
	   this element's own height, so as the text grows to 2 lines on longer category names,
	   the dark shadow area grows to fill along with it automatically. +5% again (was 20px). */
	font-size: 21px;
	line-height: 1.15;
	letter-spacing: 0.01em;
	text-transform: uppercase;
	color: var(--evo-cloud);
	background: linear-gradient(180deg, rgba(0, 0, 0, 0.72) 0%, rgba(0, 0, 0, 0) 100%);
}

/* Visible at every width now (used to be mobile-only) — this is the click target that opens
   the "Shop" dropdown; hover no longer opens it (see .site-header__nav-list li.is-open >
   .sub-menu below). Mobile overrides this further down into a bigger absolutely-positioned
   tap target sized to the full-width row it sits in. */
.site-header__submenu-toggle {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin-left: 6px;
	background: none;
	border: none;
	color: var(--evo-glass-text);
	cursor: pointer;
	padding: 6px;
	transition: transform 0.2s ease, color 0.15s ease;
}

.site-header__submenu-toggle:hover,
.site-header__submenu-toggle:focus-visible {
	color: var(--evo-orange-ya-glad);
}

.menu-item-has-children.is-open > .site-header__submenu-toggle {
	transform: rotate(180deg);
}

/* ---------- Promo banner (auto-sliding) ---------- */

.promo-banner {
	position: relative;
	overflow: hidden;
	width: 100%;
	/* Height now tracks width via aspect-ratio (was a flat vh value) — that's what makes this
	   properly "reactive to screen size": at any browser width the box keeps the same
	   landscape shape instead of an independent, arbitrarily tall/narrow height that a raw vh
	   unit produces on unusual window shapes (which was what made object-fit: cover crop so
	   much off the sides before). max-height still caps it on very wide/short screens, and
	   min-height floors it on narrow/tall ones. Full site width — no side gaps, edge-to-edge
	   like every other section on this page.
	   -5% height at any given width: was a flat 2/1 (height = width ÷ 2); 2/0.95 keeps the
	   same width side of the ratio but scales the height side down 5% (width ÷ 2 × 0.95), so
	   the banner stays just as "reactive to screen size" as before, only shorter. max-height/
	   min-height trimmed 5% to match (were 85vh/420px). */
	aspect-ratio: 2 / 0.95;
	max-height: 80.75vh;
	min-height: 399px;
	background: var(--evo-defeater);
	/* Outer-edge outline only — see the matching note on .site-header above. */
	border: 1px solid var(--evo-glass-border);
}

.promo-banner__track {
	position: relative;
	width: 100%;
	height: 100%;
}

.promo-banner__slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.7s ease;
}

.promo-banner__slide.is-active {
	opacity: 1;
	visibility: visible;
	z-index: 1;
}

.promo-banner__slide a,
.promo-banner__slide img {
	display: block;
	width: 100%;
	height: 100%;
}

/* cover — now that the box keeps a consistent landscape shape at every width (aspect-ratio
   above, instead of an independent vh height), cover can fill the whole box completely with no
   letterboxed gaps, without the extreme edge-cropping a very tall/narrow box was causing
   before. Recommended upload size for a good middle ground: roughly 1920x960px. */
.promo-banner__slide img {
	object-fit: cover;
}

@media (prefers-reduced-motion: reduce) {
	.promo-banner__slide {
		transition: none;
	}
}

.promo-banner__dots {
	position: absolute;
	bottom: 20px;
	left: 50%;
	transform: translateX(-50%);
	display: flex;
	gap: 8px;
	z-index: 5;
}

.promo-banner__dot {
	width: 9px;
	height: 9px;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.4);
	border: none;
	padding: 0;
	cursor: pointer;
	transition: background 0.15s ease, transform 0.15s ease;
}

.promo-banner__dot.is-active {
	background: var(--evo-cloud);
	transform: scale(1.2);
}

.promo-banner__dot:focus-visible {
	outline: 2px solid var(--evo-cloud);
	outline-offset: 2px;
}

.promo-banner__arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	background: rgba(25, 24, 22, 0.4);
	-webkit-backdrop-filter: blur(12px) saturate(160%);
	backdrop-filter: blur(12px) saturate(160%);
	color: var(--evo-cloud);
	border: 1px solid rgba(255, 255, 255, 0.25);
	border-radius: 50%;
	width: 40px;
	height: 40px;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	z-index: 5;
	transition: background 0.15s ease;
}

.promo-banner__arrow:hover,
.promo-banner__arrow:focus-visible {
	background: rgba(25, 24, 22, 0.8);
	outline: none;
}

.promo-banner__arrow--prev {
	left: 20px;
}

.promo-banner__arrow--next {
	right: 20px;
}

/* ---------- Category-page promotional banner (carousel) ----------
   10 September 2026 — added at Martin's request: a promotion (either "Give a free product" or
   "Bundle deal") can carry a banner image targeted at specific product categories, only visible
   to the same customer groups the promotion itself already applies to (see inc/promotion-
   category-banners.php). Same fade/dots/arrows/autoplay mechanics as .promo-banner above
   (deliberately reused rather than a second carousel technique) — kept as its own separate class
   name throughout, rather than sharing .promo-banner's, so this can never collide with the
   homepage slider if both happen to render on the same page. Shorter/wider aspect ratio than the
   homepage hero, since this sits above a category's filter bar and product grid rather than
   being the whole top of the page. */
.evo-category-banner {
	position: relative;
	overflow: hidden;
	width: 100%;
	aspect-ratio: 3.6 / 1;
	max-height: 320px;
	min-height: 120px;
	background: var(--evo-defeater);
	border: 1px solid var(--evo-glass-border);
	border-radius: 12px;
	margin-bottom: 24px;
}

.evo-category-banner__track {
	position: relative;
	width: 100%;
	height: 100%;
}

.evo-category-banner__slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.7s ease;
}

.evo-category-banner__slide.is-active {
	opacity: 1;
	visibility: visible;
	z-index: 1;
}

.evo-category-banner__slide,
.evo-category-banner__slide img {
	display: block;
	width: 100%;
	height: 100%;
}

.evo-category-banner__slide img {
	object-fit: cover;
}

@media (prefers-reduced-motion: reduce) {
	.evo-category-banner__slide {
		transition: none;
	}
}

.evo-category-banner__dots {
	position: absolute;
	bottom: 12px;
	left: 50%;
	transform: translateX(-50%);
	display: flex;
	gap: 8px;
	z-index: 5;
}

.evo-category-banner__dot {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.4);
	border: none;
	padding: 0;
	cursor: pointer;
	transition: background 0.15s ease, transform 0.15s ease;
}

.evo-category-banner__dot.is-active {
	background: var(--evo-cloud);
	transform: scale(1.2);
}

.evo-category-banner__dot:focus-visible {
	outline: 2px solid var(--evo-cloud);
	outline-offset: 2px;
}

.evo-category-banner__arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	background: rgba(25, 24, 22, 0.4);
	-webkit-backdrop-filter: blur(12px) saturate(160%);
	backdrop-filter: blur(12px) saturate(160%);
	color: var(--evo-cloud);
	border: 1px solid rgba(255, 255, 255, 0.25);
	border-radius: 50%;
	width: 34px;
	height: 34px;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	z-index: 5;
	transition: background 0.15s ease;
}

.evo-category-banner__arrow:hover,
.evo-category-banner__arrow:focus-visible {
	background: rgba(25, 24, 22, 0.8);
	outline: none;
}

.evo-category-banner__arrow--prev {
	left: 14px;
}

.evo-category-banner__arrow--next {
	right: 14px;
}

@media (max-width: 640px) {
	.evo-category-banner {
		aspect-ratio: 2 / 1;
		min-height: 100px;
		margin-bottom: 16px;
		border-radius: 8px;
	}

	.evo-category-banner__arrow {
		width: 28px;
		height: 28px;
	}
}

/* ---------- Newsletter signup block ---------- */

/* ---------- Newsletter signup ----------
   Rebuilt as a single centred column (was a 2-column row: text on the left, email field on the
   right) — text alignment now matches the centred "What's Your Vaping Level?" section above it,
   full-bleed/wider like the other homepage sections (max-width: none), with much bigger type and
   a shorter, narrower centred pill form underneath instead of a full-width row. */
.newsletter-block {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 28px;
	/* Was a hardcoded var(--evo-defeater) — always near-black regardless of theme, which is why
	   this section stayed black even in light mode. --evo-glass-bg-solid already flips between
	   the two (near-black in dark mode, near-white in light mode) exactly like every other
	   "solid surface" on the site, so this now follows the toggle like it should. */
	background: var(--evo-glass-bg-solid);
	padding: 64px 32px;
}

.newsletter-block__eyebrow {
	display: block;
	font-family: var(--evo-heading-font);
	/* 2.5x the original 30px. */
	font-size: 75px;
	line-height: 1.1;
	letter-spacing: 1px;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	text-transform: uppercase;
}

.newsletter-block__heading {
	margin: 0;
	font-family: var(--evo-body-font);
	font-weight: 500;
	font-size: 20px;
	line-height: 1.5;
	/* Was the fixed off-white --evo-cloud — invisible on the now-light background in light mode.
	   --evo-glass-text already flips light/dark same as the background above. */
	color: var(--evo-glass-text);
	max-width: 640px;
}

.newsletter-block__form {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	width: 100%;
	max-width: 460px;
}

.newsletter-block__form input[type='email'] {
	flex: 1 1 auto;
	min-width: 0;
	background: var(--evo-glass-input-bg);
	/* Always shows the accent-coloured outline now (was a neutral border that only turned this
	   colour on focus/click). */
	border: 1.5px solid var(--evo-quality-sneaks);
	border-radius: 999px;
	/* Shorter pill (was 14px top/bottom) — slimmer vertical footprint. */
	padding: 9px 22px;
	/* Was the fixed off-white --evo-cloud — same reasoning as .newsletter-block__heading above. */
	color: var(--evo-glass-text);
	font-family: var(--evo-body-font);
	font-size: 14px;
}

.newsletter-block__form input[type='email']::placeholder {
	/* Was a fixed white — invisible against the now-light input background in light mode.
	   Matches the same theme-aware placeholder pattern used on the header search inputs. */
	color: var(--evo-glass-text);
	opacity: 0.5;
}

.newsletter-block__form input[type='email']:focus {
	outline: none;
}

.newsletter-block__form button {
	flex: 0 0 auto;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	/* Shorter pill, matching the email field above. */
	padding: 9px 26px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.newsletter-block__form button:hover,
.newsletter-block__form button:focus-visible {
	background-color: var(--evo-yorkie);
}

/* ---------- Useful Links (footer, above the legal footer) ----------
   The "ESTD 2014" emblem lived in the newsletter block before the wireframe rebuild — its
   markup/values were moved here rather than deleted since the wireframe still shows it. */

/* Three columns now — links stacked on the left, the logo/heading centred in the middle, and
   the awards image on the right (was a 2-column layout with the logo tucked under the link
   list on the left and only the right column reserved for an image). */
.useful-links {
	max-width: none;
	margin: 0 auto;
	padding: 48px 28px;
	display: grid;
	grid-template-columns: 1fr 1.1fr 1fr;
	align-items: center;
	gap: 32px;
}

.useful-links__list {
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 14px;
	margin: 0;
	padding: 0;
}

.useful-links__list a {
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	text-decoration: none;
}

.useful-links__list a:hover,
.useful-links__list a:focus-visible {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

.useful-links__center {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 18px;
}

.useful-links__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 24px;
	margin: 0;
}

.useful-links__emblem {
	display: flex;
	flex-direction: column;
	align-items: center;
}

/* Two stacked images (see the comment in footer.php) — both share this base width, only one
   is display: block at a time depending on [data-evo-theme], same pattern as
   .site-header__logo-img. Centred via .useful-links__emblem's align-items: center above (the
   two source PNGs were cropped with even padding on both sides, so centring the image element
   itself keeps the crest visually centred under the "Useful Links" heading too). */
.useful-links__emblem-logo {
	width: 120px;
	height: auto;
	display: none;
}

[data-evo-theme='light'] .useful-links__emblem-logo--light,
[data-evo-theme='dark'] .useful-links__emblem-logo--dark {
	display: block;
}

/* No background box any more — was a glass panel behind the single collage image; now holds a
   plain 2x2 grid of up to 4 individually-uploaded award images sitting directly on the page. */
.useful-links__media {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 14px;
	max-width: 280px;
	margin: 0 auto;
}

.useful-links__award-image {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	object-fit: contain;
}

.useful-links__media-image {
	display: block;
	width: 100%;
	height: auto;
	max-width: 320px;
	object-fit: contain;
	grid-column: 1 / -1;
}

@media (max-width: 720px) {
	.useful-links {
		grid-template-columns: 1fr;
		text-align: center;
	}

	.useful-links__list {
		align-items: center;
	}
}

/* ---------- Responsive ---------- */

@media (max-width: 960px) {
	/* Mobile drops back to the original single-row layout — hamburger toggle, logo, action
	   icons — rather than the desktop's two-row grid (logo spanning both rows, search/nav
	   below it): there's no room for a permanently-visible search pill or inline nav next to a
	   full-width logo at this width, so the pill's wrapper is hidden outright below (the icon +
	   expandable panel it's paired with already covers search here) and the nav becomes the
	   existing hamburger dropdown instead, which now includes Contact Us alongside Shop,
	   Wholesale, About, and Quick Order (it used to live in the actions row and hide below this
	   same breakpoint — now it's just another item in that dropdown, same as the rest). */
	.site-header__inner {
		grid-template-columns: auto 1fr auto;
		grid-template-areas: "toggle logo actions";
		/* Vertical padding trimmed (was 12px) to match the desktop logo bump — this range still
		   inherits the base 60px logo (no separate override until the 400px breakpoint below),
		   so shrinking the padding here the same way keeps this row's total height the same as
		   it was at 42px logo + 12px padding, instead of growing taller. */
		padding: 3px 18px;
	}

	.site-header__search-group {
		display: none;
	}

	/* The Account text label is dropped on mobile to keep the action row from overflowing next
	   to the hamburger toggle — the account icon and cart icon/label stay. */
	.site-header__account-label {
		display: none;
	}

	.site-header__nav-group {
		grid-area: toggle;
		justify-self: start;
		position: static;
	}

	.site-header__nav {
		display: none;
		position: absolute;
		top: 100%;
		left: 0;
		right: 0;
		/* Near-solid fill — floating directly over busy page graphics when expanded, this menu
		   needs to read clearly rather than let much of what's behind it show through. Blur is
		   kept as a small amount of glass "character" on the hairline edge, not for see-through
		   transparency. */
		background: var(--evo-glass-bg-solid);
		-webkit-backdrop-filter: blur(20px) saturate(140%);
		backdrop-filter: blur(20px) saturate(140%);
		border-top: 1px solid var(--evo-glass-border);
		box-shadow: var(--evo-glass-shadow);
		padding: 0;
		/* The menu itself now scrolls when its content (e.g. a long Shop subcategory list) is
		   taller than the screen, instead of having no height limit of its own — which meant the
		   page underneath scrolled to reveal more of the menu rather than the menu scrolling.
		   Paired with body.evo-nav-open below, which stops the page behind from scrolling at
		   all while this is open. */
		max-height: 80vh;
		overflow-y: auto;
		-webkit-overflow-scrolling: touch;
	}

	/* Background page can't scroll while the mobile menu is open — see the matching
	   document.body.classList.toggle('evo-nav-open', ...) in header.php. */
	body.evo-nav-open {
		overflow: hidden;
	}

	.site-header__nav.is-open {
		display: flex;
		flex-direction: column;
	}

	.site-header__nav-list {
		flex-direction: column;
		gap: 0;
		padding: 8px 20px 16px;
		width: 100%;
	}

	.site-header__nav-list--shop-first {
		padding-bottom: 0;
	}

	.site-header__nav-list li {
		/* Overrides the desktop inline-flex — mobile rows need to stack full-width, each with
		   its own border-bottom divider, not size-to-content like a desktop nav item. */
		display: block;
		border-bottom: 1px solid var(--evo-glass-border);
		position: relative;
	}

	.site-header__nav-list a,
	.site-header__nav-list .sub-menu a {
		/* The second, more specific selector above is required, not decorative: the base rule
		   ".site-header__nav-list .sub-menu a" (2 classes + element = higher specificity than
		   ".site-header__nav-list a" alone) sets display: block + white-space: nowrap, and
		   specificity always wins regardless of media query or source order. Without repeating
		   that exact selector here, this whole block was silently losing to the base rule on
		   phones — the real cause of the "mobile styling still wrong" report: sub-menu row
		   labels stayed nowrap and overflowed sideways instead of wrapping/sizing to 100%.
		   !important on the three properties below as a belt-and-braces on top of that selector
		   fix — this is a mobile-only reset block whose entire job is to beat a desktop rule
		   that's structurally guaranteed to sit earlier in the file, so there's no future rule
		   this could accidentally clobber; it just guarantees these three always win here. */
		display: flex !important;
		width: 100% !important;
		padding: 14px 44px 14px 0;
		/* Resets desktop's white-space: nowrap (see .site-header__nav-list .sub-menu a in the
		   base rules) — mobile rows are full-width, not a horizontal bar, so a long label like
		   "Tanks and RDAs/RTAs" should wrap normally here rather than risk overflowing a narrow
		   phone screen. */
		white-space: normal !important;
	}

	.site-header__menu-toggle {
		display: flex;
	}

	.site-header__submenu-toggle {
		display: flex;
		align-items: center;
		justify-content: center;
		position: absolute;
		top: 0;
		right: 0;
		width: 44px;
		height: 48px;
		transition: transform 0.2s ease;
	}

	.menu-item-has-children.is-open .site-header__submenu-toggle {
		transform: rotate(180deg);
	}

	.site-header__nav-list .sub-menu {
		position: static !important;
		/* Desktop's width: max-content (see the base rule) would otherwise carry over here too
		   and shrink this back to a narrow, content-sized box instead of the full-width vertical
		   list mobile actually wants. !important because this is the one rule directly fighting
		   the base rule's width: max-content — reported as still squeezed narrow on a real phone
		   even after matching this selector's specificity, so this pins it down for certain
		   rather than leaving room for some other rule to sneak back in. */
		width: 100% !important;
		max-width: none !important;
		flex-direction: column !important;
		opacity: 1;
		visibility: visible;
		/* This is the actual root cause of the "mobile styling still wrong" reports: the
		   unconditional ".site-header__nav-list li.is-open > .sub-menu { transform: translateX
		   (-50%) translateY(0); }" rule further up (needed on desktop/tablet to keep the panel
		   centred once open) has higher specificity than this selector, so a plain "transform:
		   none" here was losing to it even though "position: static" and "width: 100%" right
		   above were winning fine. Confirmed live in DevTools: the row's own label <span> was
		   rendering shifted a full half-width to the left of where its row actually is — exactly
		   what translateX(-50%) on a now-full-width mobile panel would do, dragging the label off
		   the left edge of the screen while the row's right-aligned chevron/button stayed just
		   inside it. !important forces this to actually win. */
		transform: none !important;
		box-shadow: none;
		border-top: none;
		background: rgba(128, 128, 128, 0.08);
		display: none;
	}

	.menu-item-has-children.is-open > .sub-menu {
		display: block !important;
	}

	/* Shop dropdown, level 2, on phones: the desktop hover-flyout becomes a tap-to-expand
	   panel that opens inline below its row (no room to open sideways on a narrow screen).
	   The inline chevron is hidden in favour of the dedicated .evo-shop-menu__expand button,
	   which mirrors .site-header__submenu-toggle above but only within the Shop panel. */
	.evo-shop-menu__chevron {
		display: none;
	}

	.evo-shop-menu__expand {
		display: flex;
		align-items: center;
		justify-content: center;
		position: absolute;
		top: 0;
		right: 0;
		width: 44px;
		height: 48px;
		background: none;
		border: none;
		color: var(--evo-glass-text);
		cursor: pointer;
		transition: transform 0.2s ease;
	}

	.evo-shop-menu__item.is-open .evo-shop-menu__expand {
		transform: rotate(90deg);
	}

	.evo-shop-menu__flyout {
		position: static !important;
		opacity: 1;
		visibility: visible;
		/* Same fix as .site-header__nav-list .sub-menu above: the unconditional ".evo-shop-menu
		   __item.is-open > .evo-shop-menu__flyout { transform: translateX(-50%) translateY(0); }"
		   rule further up outranks a plain "transform: none" here, so this panel's whole tile
		   grid was rendering shifted half its own width off-screen too — the "big blank block"
		   you saw when Vape Kits was expanded was this, not a missing-content bug. */
		transform: none !important;
		box-shadow: none;
		border-top: none;
		border-radius: 0;
		margin-left: 0;
		width: 100%;
		/* Defensive reset of the base rule's max-width: var(--evo-shop-flyout-maxw, none) — that
		   custom property is set by desktop-only JS (evoFitShopFlyouts() in header.php), but
		   belt-and-braces here in case it's ever left stale on a mobile-width viewport; without
		   this, a small leftover value would squeeze this panel into a narrow strip stuck to the
		   left instead of the full-width accordion it's meant to be. */
		max-width: none;
		background: rgba(128, 128, 128, 0.08);
		padding: 12px 20px 16px;
		display: none;
	}

	.evo-shop-menu__item.is-open > .evo-shop-menu__flyout {
		display: block;
	}

	/* Level-2 tiles on phones (13 August 2026): redesigned from a 2-column grid of square photo
	   tiles into a single column of rounded pills, with a round photo badge overlapping the left
	   end of every pill (no more left/right alternating — simplified to one consistent layout
	   per your feedback). Desktop/tablet's square image-tile flyout above this block is
	   completely untouched — this only applies at this breakpoint. */
	.evo-shop-menu__grid {
		display: flex;
		flex-direction: column;
		/* Extra left room so the overlapping photo badge (see .evo-shop-menu__tile-image below —
		   it pokes out past the pill's own edge) doesn't get visually cut off by the flyout
		   panel's own edge on a narrow phone. */
		padding: 0 0 0 14px;
		gap: 22px;
	}

	.evo-shop-menu__tile,
	.evo-shop-menu__tile:not(:has(.evo-shop-menu__tile-image)) {
		width: 100%;
		height: auto;
		aspect-ratio: auto;
		/* Desktop's min-width/min-height: 200px floor (see the base rule) was sized for a square
		   photo tile and has no place on a full-width pill row. */
		min-width: 0;
		min-height: 64px;
		display: flex;
		align-items: center;
		border: none;
		border-radius: 999px;
		/* Lets the photo badge (position: absolute, see below) sit outside the pill's own left
		   edge instead of being cropped at it — the base rule's overflow: hidden exists for the
		   desktop square photo tile and isn't wanted here. */
		overflow: visible;
		/* Left padding cleared past the badge image (58px wide, offset -14px, so it reaches
		   ~44px in from the pill's own left edge) plus a little breathing room, so the label
		   text never sits under the photo. !important because ".site-header__nav-list a" (an
		   older, unconditional rule every link inside the whole Shop menu structure sits under,
		   including these tiles) sets its own "padding: 9px 0" with higher specificity than a
		   plain ".evo-shop-menu__tile" selector — it was quietly winning and wiping out this
		   padding entirely, which is what let the label text creep left underneath the photo
		   instead of sitting clear of it. */
		padding: 10px 26px 10px 52px !important;
		/* !important: the base rule's own radial-gradient fallback (for categories with no
		   uploaded photo) is a more specific selector and would otherwise show through faintly
		   behind this flat pill colour instead of being fully replaced by it. */
		background: linear-gradient(90deg, var(--evo-quality-sneaks), var(--evo-yorkie)) !important;
		box-shadow: 0 6px 14px rgba(106, 43, 198, 0.4);
	}

	.evo-shop-menu__tile:active {
		/* Simple press feedback for touch, replacing desktop's hover lift (which doesn't fire on
		   a phone anyway). */
		transform: scale(0.97);
	}

	/* The photo becomes a round badge overlapping the pill's left end (like the reference image)
	   instead of filling the whole tile as a background — position: absolute overrides the base
	   rule's inset: 0 (which stretched it edge-to-edge across the square desktop tile). Negative
	   left pulls it half outside the pill itself; the white ring plus drop shadow is what makes
	   it read as "sitting on top of" the pill rather than cut into it. Categories with no
	   uploaded photo just show the plain pill with no badge. */
	.evo-shop-menu__tile .evo-shop-menu__tile-image {
		position: absolute !important;
		/* No "inset" shorthand here — it sets top/right/bottom/left all at once, which was
		   silently overriding the specific top/left values below even though they're declared
		   later, because "inset: auto !important" makes every property it expands to important
		   too, and importance always wins regardless of order. That was the actual bug behind
		   the photo landing in the wrong spot on every attempt so far — confirmed live via
		   DevTools showing "top: 3px" instead of the 50% this rule intends. Setting top/left
		   directly with their own !important instead avoids the shorthand trap entirely. */
		top: 50% !important;
		right: auto !important;
		bottom: auto !important;
		left: -14px !important;
		transform: translateY(-50%);
		width: 58px !important;
		height: 58px !important;
		border-radius: 50%;
		object-fit: cover !important;
		border: 3px solid #ffffff;
		box-shadow: 0 4px 10px rgba(0, 0, 0, 0.35);
		z-index: 2;
	}

	.evo-shop-menu__tile-label {
		/* Overrides the base rule's absolute pin (top/left/right: 0) and dark gradient scrim,
		   which existed to keep a photo caption readable over a busy full-bleed image — not
		   needed here since the label now just sits directly on the pill's own solid gradient. */
		position: static;
		top: auto;
		left: auto;
		right: auto;
		z-index: auto;
		padding: 0;
		background: none;
		flex: 1 1 auto;
		font-size: 14px;
		text-align: center;
		color: #ffffff;
	}

	/* Portrait-ish shape on mobile (was a flat 70vh) — matches the separate "mobile image" field
	   on each slide (recommended upload: roughly 1080x1350px), so cover fills the box cleanly
	   here too instead of cropping a landscape-shaped box down from a portrait photo.
	   -5% height here too (was 4/5, 70vh, 420px), same reasoning as the desktop rule above. */
	.promo-banner {
		aspect-ratio: 4 / 4.75;
		max-height: 66.5vh;
		min-height: 399px;
	}

	.promo-banner__arrow {
		width: 32px;
		height: 32px;
	}

	.newsletter-block {
		padding: 44px 20px;
		gap: 20px;
	}

	.newsletter-block__eyebrow {
		font-size: 42px;
	}

	.newsletter-block__heading {
		max-width: none;
		font-size: 16px;
	}

	.newsletter-block__form {
		flex-direction: column;
		max-width: 320px;
	}

	.newsletter-block__form input[type='email'],
	.newsletter-block__form button {
		width: 100%;
	}
}

@media (max-width: 400px) {
	/* The header's icon row (search/account/cart) plus the logo and menu toggle need a bit
	   more width than very narrow phones (Galaxy S8 at 360px and similar) have to give — they
	   were overflowing the header, which forced the whole page wider than the viewport on
	   those specific screens (fine on a wider phone like iPhone 14 Pro Max at 430px, broken on
	   a narrower one). Tightening gaps/padding, and dropping the "Cart" text label down to just
	   the icon, reclaims enough room. */
	.site-header__inner {
		gap: 10px;
		/* Vertical padding trimmed from 10px to 5px, paired with the logo bump below (26px ->
		   36px) — same "same total row height, bigger logo, less padding" trade as the two
		   breakpoints above, so this narrowest header doesn't grow either. */
		padding: 5px 12px;
	}

	.site-header__actions {
		gap: 10px;
	}

	.site-header__cart-label {
		display: none;
	}

	.site-header__logo-img {
		max-height: 36px;
	}
}

/* ---------- Customer group pricing hint (Wholesale / Wholesale VIP / Sub Distro) ---------- */

.evo-wholesale-hint {
	margin: 12px 0 22px;
	font-family: var(--evo-subtitle-font);
	font-size: 17px;
	letter-spacing: 0.02em;
}

.evo-wholesale-hint a {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
	font-weight: 600;
}

.evo-wholesale-hint a:hover {
	color: var(--evo-yorkie);
}

/* Trade customer groups (already signed in, don't need this hint) get this instead of the real
   message — same box, same margin, just invisible, so the layout doesn't shift up/down compared
   to how a Retail visitor sees the exact same product. */
.evo-wholesale-hint--reserved {
	visibility: hidden;
}

/* ---------- "Buy more, save more" quantity tier table (product page, B2B only, 20 August 2026)
   — see evolution_vaping_render_product_tier_pricing_table() in inc/b2b-pricing.php. ---------- */
.evo-tier-pricing {
	margin: 16px 0 22px;
	padding: 16px 18px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
}

.evo-tier-pricing__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 14px;
	margin: 0 0 10px;
	color: var(--evo-quality-sneaks);
}

.evo-tier-price-table {
	width: 100%;
	border-collapse: collapse;
}

.evo-tier-price-table th {
	text-align: left;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-weight: 700;
	opacity: 0.65;
	padding: 4px 8px;
}

.evo-tier-price-row td {
	padding: 6px 8px;
	font-size: 14px;
	border-top: 1px solid var(--evo-glass-border);
	transition: background-color 0.15s ease, color 0.15s ease;
}

.evo-tier-price-row td:last-child {
	font-weight: 700;
}

/* The band matching whatever quantity is currently in the qty box — kept in sync live by
   assets/js/tier-pricing.js as the customer types a new quantity or picks a different
   Colour/Flavour. */
.evo-tier-price-row.is-current td {
	background: var(--evo-quality-sneaks);
	/* !important — same reasoning as every other pill/highlight text colour in this file (see
	   the note on .evo-orders-table__invoice-link): guarantees this stays readable regardless of
	   whatever other text-colour rule the rest of the product page content applies to a <td>. */
	color: var(--evo-cloud) !important;
}

/* ---------- Trust bar (stars / free delivery / same day dispatch) — now lives inside the
   header's purple utility bar (site-header__utility), styled here since it's unchanged. ---------- */

.trust-bar__list {
	max-width: none;
	margin: 0 auto;
	list-style: none;
	/* Thinner (was 10px top/bottom, on top of the wrapper's own padding above). */
	padding: 4px 28px;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 10px 32px;
}

.trust-bar__badge {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	/* Slightly smaller (was 14px) to match the thinner bar. */
	font-size: 13px;
	letter-spacing: 0.02em;
	color: #ffffff;
	white-space: nowrap;
}

.trust-bar__badge svg {
	color: var(--evo-cloud);
	flex-shrink: 0;
}

.trust-bar__badge--rating {
	background: var(--evo-defeater);
	color: var(--evo-purple-haze);
	border: 1px solid rgba(255, 255, 255, 0.15);
	border-radius: 999px;
	/* Slimmer pill (was 6px 16px). */
	padding: 3px 14px;
	text-transform: uppercase;
	font-size: 12px;
	font-weight: 700;
}

.trust-bar__badge--rating span {
	color: var(--evo-purple-haze);
}

.trust-bar__badge-text-short {
	display: none;
}

/* Mobile trust bar: instead of trying to squeeze all three badges (rating + delivery +
   dispatch) into one cramped line, or dropping one, they run as a continuous, seamlessly
   looping marquee — the group of badges is duplicated back-to-back and animated left; once
   the first copy has scrolled fully out of view the second is in exactly the same place, so
   the loop reads as endless. */
.trust-bar__marquee {
	display: none;
	overflow: hidden;
}

.trust-bar__marquee-track {
	display: flex;
	width: max-content;
	animation: evo-trust-marquee 22s linear infinite;
}

.trust-bar__marquee-group {
	display: flex;
	align-items: center;
	flex-shrink: 0;
	gap: 28px;
	padding-right: 28px;
}

@keyframes evo-trust-marquee {
	from {
		transform: translateX(0);
	}
	to {
		transform: translateX(-50%);
	}
}

@media (prefers-reduced-motion: reduce) {
	.trust-bar__marquee-track {
		animation: none;
	}
}

@media (max-width: 640px) {
	.trust-bar__list {
		display: none;
	}

	.trust-bar__marquee {
		display: block;
		/* Thinner (was 8px top/bottom), matching the desktop bar. */
		padding: 3px 0;
	}

	.trust-bar__marquee .trust-bar__badge {
		font-size: 12px;
	}
}

/* ---------- Brands strip (homepage, under the promo banner) ----------
   Horizontally scrolling row of brand logos pulled from WooCommerce's native Brands taxonomy;
   any brand with no logo shows the literal word "BRAND" per the client's instruction. */

.brands-strip {
	max-width: none;
	margin: 0 auto;
	/* Tightened up (was 40px 28px 32px, then 22px 28px 18px) — less empty space below the
	   logos before the section's border-bottom. */
	padding: 22px 28px 10px;
	/* Left/right continue the outline started by .quick-shop right above (no gap or margin
	   between the two sections, so the lines run unbroken); border-bottom closes off the
	   shared box here, at the bottom of this section. */
	border-left: 1px solid var(--evo-glass-border);
	border-right: 1px solid var(--evo-glass-border);
	border-bottom: 1px solid var(--evo-glass-border);
}

.brands-strip__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0 0 14px;
	text-align: center;
}

.brands-strip__track {
	display: flex;
	align-items: center;
	justify-content: center;
	/* Wider than before (was 28px) so the logos spread out and fill the now full-width row a
	   bit more, rather than clustering tightly together. */
	gap: 48px;
	overflow-x: auto;
	/* Trimmed down (was 8px) — this was just leftover space for a scrollbar that never shows
	   anyway (scrollbar-width: none below), so it was only adding unnecessary gap under the
	   logos. */
	padding-bottom: 2px;
	scrollbar-width: none;
}

.brands-strip__track::-webkit-scrollbar {
	display: none;
}

/* No outline/box any more — the tile has no fixed size, background, or border of its own; it
   just shrink-wraps to whatever size the uploaded image renders at (full image shown, never
   cropped — see object-fit: contain below), capped by a max height/width so one huge upload
   can't dominate the row. The text-only "BRAND" placeholder is the one exception, since
   there's no image there to size around, so it keeps its own small pill styling. */
.brands-strip__item {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	height: 80px;
	max-width: 200px;
	transition: transform 0.2s ease;
}

.brands-strip__item:hover,
.brands-strip__item:focus-visible {
	transform: translateY(-3px);
}

.brands-strip__item img {
	width: auto;
	height: 100%;
	max-width: 100%;
	object-fit: contain;
	display: block;
}

/* Auto-adapts every logo to whichever theme is active, regardless of whether the image the
   site owner uploaded happens to be a light or a dark graphic. brightness(0) first flattens
   the logo to solid black no matter its original colour, then dark mode adds invert(1) to
   flip that to solid white — so a light logo reads dark in light mode, and a dark logo reads
   light in dark mode, automatically, with no need to upload two versions of each one. */
[data-evo-theme='light'] .brands-strip__item img {
	filter: brightness(0);
}

[data-evo-theme='dark'] .brands-strip__item img {
	filter: brightness(0) invert(1);
}

/* The "BRAND" text placeholder (shown when a term/tile has no image) keeps a small bordered
   pill of its own, since there's no image here to size the tile around. */
.brands-strip__item:has(.brands-strip__placeholder) {
	padding: 12px 20px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
}

.brands-strip__placeholder {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	letter-spacing: 0.08em;
	font-size: 13px;
	color: var(--evo-glass-text);
}

@media (max-width: 480px) {
	.brands-strip {
		padding: 16px 16px 12px;
	}

	/* Stacked 2-column block instead of a horizontal scroller on mobile — every brand shows at
	   once (no swiping needed to see them all). */
	.brands-strip__track {
		display: grid;
		grid-template-columns: repeat(2, 1fr);
		justify-items: center;
		align-items: center;
		gap: 20px 12px;
		overflow-x: visible;
		padding-bottom: 0;
	}

	.brands-strip__item {
		height: 64px;
		max-width: 150px;
		width: 100%;
	}

	.brands-strip__item:has(.brands-strip__placeholder) {
		padding: 8px 14px;
	}
}

/* ---------- Quick Shop tiles (homepage, under the promo banner) ---------- */

.quick-shop {
	max-width: none;
	margin: 0 auto;
	/* Taller now (was 48px 28px 40px) — closer to the vertical breathing room used by Visit Our
	   Stores/Testimonials, so the whole section reads as a similar height to them. */
	padding: 56px 28px 56px;
	/* Line break under Best Sellers, separating it from Visit Our Stores below (was no
	   border-bottom at all here). */
	border-top: 1px solid var(--evo-glass-border);
	border-left: 1px solid var(--evo-glass-border);
	border-right: 1px solid var(--evo-glass-border);
	border-bottom: 1px solid var(--evo-glass-border);
}

.quick-shop__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0 0 24px;
}

/* True single-row carousel now (used to be a grid of up to 4 tiles chunked into "pages" of 4,
   each page a 2x2 square) — up to 10 .quick-shop__card tiles sit directly in .quick-shop__track
   as one horizontally-scrolling row, same convention as .latest-products__viewport elsewhere on
   this page. Prev/next arrows only render in the markup once there are more than 3 tiles, since
   fewer than that already fits/scrolls fine within the capped viewport width without them. */
.quick-shop__viewport {
	position: relative;
	display: flex;
	align-items: center;
	gap: 12px;
}

.quick-shop__track {
	flex: 1 1 auto;
	display: flex;
	gap: 20px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
}

.quick-shop__track::-webkit-scrollbar {
	display: none;
}

.quick-shop__arrow {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: 50%;
	border: 1px solid var(--evo-glass-border);
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	color: var(--evo-quality-sneaks);
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
}

.quick-shop__arrow:hover,
.quick-shop__arrow:focus-visible {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

.quick-shop__card {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	overflow: hidden;
	/* Fixed width + aspect-ratio (was min-height: 220px, sized by the old 2x2 grid's 50%
	   columns) — now that cards sit in a single scrolling row instead of a grid, they need
	   their own explicit square size. flex: 0 0 auto keeps them from stretching/shrinking to
	   fill the row, and scroll-snap-align (moved here from the now-removed .quick-shop__page)
	   is what makes each card snap into place as you scroll. */
	flex: 0 0 auto;
	width: 220px;
	aspect-ratio: 1 / 1;
	scroll-snap-align: start;
	/* Squared off (was 20px) — sharp corners so these read as true squares rather than rounded
	   tiles, per client request. */
	border-radius: 0;
	padding: 24px;
	text-decoration: none;
	background-color: var(--evo-defeater);
	background-image: radial-gradient(circle at 22% 20%, rgba(106, 43, 198, 0.65) 0%, rgba(106, 43, 198, 0) 45%),
		radial-gradient(circle at 85% 90%, rgba(213, 53, 134, 0.35) 0%, rgba(213, 53, 134, 0) 50%);
	background-size: 220% 220%, 220% 220%;
	background-position: 0% 0%, 100% 100%;
	border: 1px solid rgba(255, 255, 255, 0.14);
	box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25);
	transition: transform 0.2s ease, box-shadow 0.2s ease;
	animation: evo-quick-shop-shimmer 7s ease-in-out infinite;
}

@keyframes evo-quick-shop-shimmer {
	0%, 100% {
		background-position: 0% 0%, 100% 100%;
	}
	50% {
		background-position: 30% 30%, 70% 70%;
	}
}

@media (prefers-reduced-motion: reduce) {
	.quick-shop__card {
		animation: none;
	}
}

.quick-shop__card:hover,
.quick-shop__card:focus-visible {
	transform: translateY(-4px);
	box-shadow: 0 12px 26px rgba(0, 0, 0, 0.14);
}

/* Darkens the lower portion of the card so the title/button (still pinned to the bottom-left
   via justify-content: flex-end above) stay readable now that a full product photo can sit
   right behind them, instead of the small floating corner cutout this used to be. Sits above
   .quick-shop__card-image (plain DOM/paint order — this pseudo-element always paints after
   real children with the same stacking level) but below the title/button, which keep their
   own z-index: 1. */
.quick-shop__card::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(0, 0, 0, 0) 35%, rgba(0, 0, 0, 0.75) 100%);
	pointer-events: none;
}

/* Fills the entire button edge-to-edge now (was a small rotated cutout pinned to the top-right
   corner) — still the same category/product photo pulled by evo_get_quick_shop_category_image()
   in functions.php, just styled to cover the whole card like a background image. */
.quick-shop__card-image {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	pointer-events: none;
}

.quick-shop__card-title {
	position: relative;
	z-index: 1;
	font-family: var(--evo-graffiti-font);
	font-weight: 400;
	font-size: 26px;
	line-height: 1.15;
	color: var(--evo-purple-haze);
	-webkit-text-stroke: 1px #fff;
	text-shadow:
		-1.5px -1.5px 0 #fff,
		 1.5px -1.5px 0 #fff,
		-1.5px  1.5px 0 #fff,
		 1.5px  1.5px 0 #fff,
		 0     -1.5px 0 #fff,
		 0      1.5px 0 #fff,
		-1.5px  0     0 #fff,
		 1.5px  0     0 #fff;
	margin-bottom: 14px;
	max-width: 70%;
}

.quick-shop__card-button {
	position: relative;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 10px 20px;
	transition: background-color 0.15s ease;
}

.quick-shop__card:hover .quick-shop__card-button,
.quick-shop__card:focus-visible .quick-shop__card-button {
	background-color: var(--evo-yorkie);
}

/* Desktop/tablet only (min-width matches exactly where the mobile override further down takes
   over, at 480px) — sizes cards up a bit from the 220px mobile default. .quick-shop__viewport
   itself is no longer capped/centred here (it was max-width: 760px + margin: 0 auto) — it now
   just fills the full width of its parent .quick-shop section, matching the rest of the
   full-bleed page. */
@media (min-width: 481px) {
	/* Bigger card on tablet/desktop than the 220px mobile default — aspect-ratio: 1/1 already
	   lives on the base rule now, so it doesn't need repeating here. Bumped up again (was
	   300px) as part of making the whole section taller/bigger to match Visit Our
	   Stores/Testimonials. */
	.quick-shop__card {
		width: 380px;
	}

	/* Scaled up to match the bigger card above (was 26px). */
	.quick-shop__card-title {
		font-size: 30px;
	}
}

@media (max-width: 480px) {
	/* More room under the cards before the line break (was 4px — the line sat right against
	   the last card). */
	.quick-shop {
		padding: 36px 16px 32px;
	}

	.quick-shop__viewport {
		gap: 6px;
	}

	.quick-shop__arrow {
		width: 34px;
		height: 34px;
	}

	/* 2 rows instead of 1 on mobile, still a horizontally-scrolling slider — grid-auto-flow:
	   column lays cards out column-by-column (top+bottom card per column). Each column is sized
	   to exactly half the track's own width (minus half the gap), so two columns together — a
	   "section" of 4 cards — fill the screen edge-to-edge with nothing cropped or peeking in
	   from the next section. */
	.quick-shop__track {
		display: grid;
		grid-auto-flow: column;
		grid-template-rows: repeat(2, auto);
		grid-auto-columns: calc(50% - 6px);
		gap: 12px;
		scroll-snap-type: x mandatory;
	}

	.quick-shop__card {
		/* No fixed width any more — stretches to fill its grid column (see grid-auto-columns
		   above), with aspect-ratio: 1/1 from the base rule keeping it square. */
		width: auto;
		border-radius: 0;
		padding: 14px;
		/* Turn off the default per-card snap point from the base rule — only the first column of
		   each 2-column section below becomes a snap target, so a swipe or arrow click jumps a
		   whole section (4 cards) at a time instead of stopping halfway through one. */
		scroll-snap-align: none;
	}

	/* :nth-child(4n+1) lands on card 1, 5, 9, 13... — the top card of the left-hand column of
	   every 2-column section, since 2 rows share each column in DOM order (1,2 = col 1; 3,4 =
	   col 2; 5,6 = col 3 = start of the next section; etc). scroll-snap-stop: always stops a fast
	   swipe from skipping over a section entirely. */
	.quick-shop__card:nth-child(4n+1) {
		scroll-snap-align: start;
		scroll-snap-stop: always;
	}

	.quick-shop__card-title {
		font-size: 18px;
		margin-bottom: 10px;
		max-width: 80%;
	}

	.quick-shop__card-button {
		font-size: 11px;
		padding: 7px 14px;
	}
}

/* ---------- Visit our stores ----------
   Split layout — same 2-column grid as .vaping-level below, just reversed: image/slider first
   (left), heading + button second (right), instead of text-left/image-right. Was a single
   centred column with no image at all. */

.visit-stores {
	max-width: none;
	margin: 0 auto;
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: center;
	gap: 32px;
	padding: 56px 28px;
}

.visit-stores__content {
	text-align: center;
}

.visit-stores__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0 0 24px;
}

.visit-stores__button {
	display: inline-flex;
	align-items: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 14px 36px;
	transition: background-color 0.15s ease;
}

.visit-stores__button:hover,
.visit-stores__button:focus-visible {
	background-color: var(--evo-yorkie);
}

.visit-stores__extra-text {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	max-width: 420px;
	margin: 20px auto 0;
}

.visit-stores__media {
	display: flex;
	align-items: center;
	justify-content: center;
	/* A real height (was min-height) — the slider's slides are absolutely positioned/stacked
	   (see .visit-stores__slide below) and need a definite height to fill via height: 100%;
	   min-height doesn't give percentage-height children anything to resolve against, which was
	   collapsing every slide/image down to 0px tall and invisible. */
	height: 420px;
	border-radius: 0;
	overflow: hidden;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
}

.visit-stores__media-placeholder {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
}

/* The slider itself — same single-slide-at-a-time carousel pattern as .promo-banner at the top
   of the page (dots + prev/next arrows + autoplay via JS in front-page-content.php), scoped to
   its own classes here so the two sliders' JS/CSS never collide. */
.visit-stores__slider {
	position: relative;
	overflow: hidden;
	width: 100%;
	height: 100%;
}

.visit-stores__track {
	position: relative;
	width: 100%;
	height: 100%;
}

.visit-stores__slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.7s ease;
}

.visit-stores__slide.is-active {
	opacity: 1;
	visibility: visible;
	z-index: 1;
}

.visit-stores__slide img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

@media (prefers-reduced-motion: reduce) {
	.visit-stores__slide {
		transition: none;
	}
}

.visit-stores__dots {
	position: absolute;
	bottom: 16px;
	left: 50%;
	transform: translateX(-50%);
	display: flex;
	gap: 8px;
	z-index: 5;
}

.visit-stores__dot {
	width: 9px;
	height: 9px;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.4);
	border: none;
	padding: 0;
	cursor: pointer;
	transition: background 0.15s ease, transform 0.15s ease;
}

.visit-stores__dot.is-active {
	background: var(--evo-cloud);
	transform: scale(1.2);
}

.visit-stores__dot:focus-visible {
	outline: 2px solid var(--evo-cloud);
	outline-offset: 2px;
}

.visit-stores__arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	background: rgba(25, 24, 22, 0.4);
	-webkit-backdrop-filter: blur(12px) saturate(160%);
	backdrop-filter: blur(12px) saturate(160%);
	color: var(--evo-cloud);
	border: 1px solid rgba(255, 255, 255, 0.25);
	border-radius: 50%;
	width: 36px;
	height: 36px;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	z-index: 5;
	transition: background 0.15s ease;
}

.visit-stores__arrow:hover,
.visit-stores__arrow:focus-visible {
	background: rgba(25, 24, 22, 0.8);
	outline: none;
}

.visit-stores__arrow--prev {
	left: 16px;
}

.visit-stores__arrow--next {
	right: 16px;
}

@media (max-width: 720px) {
	.visit-stores {
		grid-template-columns: 1fr;
	}
}

/* ---------- Lipscore testimonials (placeholder — real widget not connected yet) ---------- */

/* Full-bleed section (was max-width: 900px directly on .testimonials, which made the border
   below only span a narrow centred line instead of the full page width) — the actual text
   content is now constrained/centred by .testimonials__inner instead, so the line break spans
   edge-to-edge like the site's other dividers while the copy itself stays a readable width. */
.testimonials {
	max-width: none;
	/* margin-bottom is the actual gap BELOW the line (before the next section starts) — padding
	   only controls the space ABOVE the line, inside this section, so it was pushing the line
	   itself further down without adding any breathing room after it, which is why the line
	   still sat right against the image below. */
	margin: 0 auto 48px;
	padding: 0 28px;
	text-align: center;
	/* Line break under Lipscore Testimonials, separating it from "What's Your Vaping Level?"
	   below. */
	border-bottom: 1px solid var(--evo-glass-border);
	padding-bottom: 56px;
}

.testimonials__inner {
	max-width: 900px;
	margin: 0 auto;
}

.testimonials__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 26px;
	margin: 0 0 12px;
}

.testimonials__stars {
	font-size: 26px;
	letter-spacing: 6px;
	color: var(--evo-quality-sneaks);
	margin-bottom: 12px;
}

.testimonials__placeholder {
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	margin: 0;
}

/* ---------- "What's Your Vaping Level?" split CTA (placeholder media) ---------- */

.vaping-level {
	max-width: none;
	margin: 0 auto 56px;
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: center;
	gap: 32px;
	padding: 0 28px;
}

.vaping-level__content {
	text-align: center;
}

.vaping-level__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 28px;
	margin: 0 0 24px;
}

.vaping-level__button {
	display: inline-flex;
	align-items: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 14px 36px;
	transition: background-color 0.15s ease;
}

.vaping-level__button:hover,
.vaping-level__button:focus-visible {
	background-color: var(--evo-yorkie);
}

.vaping-level__extra-text {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	max-width: 420px;
	margin: 20px auto 0;
}

.vaping-level__media {
	display: flex;
	align-items: center;
	justify-content: center;
	/* Matches .visit-stores__media exactly, so the two split-image sections are the same size. */
	height: 420px;
	border-radius: 0;
	overflow: hidden;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
}

.vaping-level__media-placeholder {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
}

.vaping-level__media-image {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

@media (max-width: 720px) {
	.vaping-level {
		grid-template-columns: 1fr;
	}
}

/* ---------- Latest Products slider ---------- */

.latest-products {
	max-width: none;
	margin: 0 auto;
	padding: 48px 28px 56px;
}

/* Line break under the Coming Soon carousel specifically (not Latest Products, which shares
   this same .latest-products class/markup) — targeted by its unique section id so the divider
   sits only between Coming Soon and Visit Our Stores below it. */
#evo-hp-slider-coming-soon {
	border-bottom: 1px solid var(--evo-glass-border);
}

.latest-products__header {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px 20px;
	margin-bottom: 24px;
}

.latest-products__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0;
}

.latest-products__shop-link {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	text-decoration: underline;
	white-space: nowrap;
}

.latest-products__shop-link:hover {
	color: var(--evo-quality-sneaks);
}

/* ---------- Breadcrumb navigation (Home / Category / Product) ----------
   Was WooCommerce's own unstyled default (small grey text, left-aligned, browser-default link
   underlines) — its actual core rules are ".woocommerce .woocommerce-breadcrumb" (margin/padding)
   and ".woocommerce ... .woocommerce-breadcrumb" / "...breadcrumb a" (font-size/color, 2 classes
   each), which are AS specific or MORE specific than a plain ".woocommerce-breadcrumb" override —
   confirmed by testing against WooCommerce's actual stylesheet, where a same-specificity first
   attempt here lost the cascade and still showed core's grey. ".woocommerce-breadcrumb" is
   deliberately repeated below (valid CSS — a class listed twice in one compound selector counts
   twice for specificity) to reliably outrank core's rules on conflicting properties, rather than
   depending on stylesheet load order. Same 1300px + 28/18/12px responsive padding formula as
   .woocommerce div.product just below it on product pages, so the two line up. */
.woocommerce-breadcrumb.woocommerce-breadcrumb {
	max-width: 1300px;
	margin: 0 auto;
	padding: 24px 28px;
	text-align: center;
	font-family: var(--evo-subtitle-font);
	font-size: 13px;
	font-weight: 600;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	opacity: 0.75;
}

.woocommerce-breadcrumb.woocommerce-breadcrumb a {
	color: var(--evo-glass-text);
	text-decoration: none;
	transition: color 0.15s ease;
}

.woocommerce-breadcrumb.woocommerce-breadcrumb a:hover,
.woocommerce-breadcrumb.woocommerce-breadcrumb a:focus-visible {
	color: var(--evo-yorkie);
}

@media (max-width: 960px) {
	.woocommerce-breadcrumb.woocommerce-breadcrumb {
		padding-left: 18px;
		padding-right: 18px;
	}
}

@media (max-width: 400px) {
	.woocommerce-breadcrumb.woocommerce-breadcrumb {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* ---------- Product category / tag archive page title (matches Latest Products heading) ---------- */

.woocommerce-products-header__title.page-title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0 0 24px;
	text-align: center;
}

/* ---------- Category page: "Additional information" + FAQs (bottom of every category archive) ----------
   Rendered by evo_render_category_faq_and_info_section() in functions.php, hooked after the
   product grid and its pagination — see that function for exactly when each half shows/hides.
   The FAQ accordion reuses the same native <details>/<summary> + glass-card + chevron technique
   as the Returns & Refunds FAQ (.evo-returns-faq__*) for visual consistency, just under its own
   .evo-category-faq__* classes since it's a separate, per-category data source. Same 820px
   reading-width cap as that FAQ block too, since this is long-form text content, not a full-width
   layout element. */

/* Separator between the product grid above and the Additional information/FAQ block below.
   Sits as a sibling of .evo-category-extra (inside #primary.content-area, which has no
   max-width of its own — see .site-content) rather than inside it, so it spans the full page
   width like the grid above it instead of being capped to the 820px reading column. */
.evo-category-extra__divider {
	width: 100%;
	height: 0;
	margin: 40px 0 0;
	border: none;
	border-top: 1px solid var(--evo-glass-border);
}

/* Boxed glass-card treatment (matches .evo-category-faq__item and the other glass surfaces
   across the site — --evo-glass-bg/--evo-glass-border/--evo-glass-blur all already flip
   automatically between the dark/light [data-evo-theme] variants defined near the top of this
   file, so this needs no separate light-mode override of its own).
   margin-top adds a small gap between the divider above and this box's own top edge; the
   padding-top below adds a second, smaller gap between that top edge and the heading text
   itself — together these are the "gap between the line and the title" this box was missing.
   Row layout (side-by-side Additional information + FAQs) is the default/desktop behaviour
   here — see the max-width: 960px override further down for the stacked mobile/tablet version. */
.evo-category-extra {
	max-width: 1100px;
	margin: 28px auto 0;
	padding: 36px 40px 64px;
	display: flex;
	flex-direction: row;
	align-items: flex-start;
	gap: 40px;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border-radius: 0;
}

/* Lets each side share the row evenly (row layout only — see .evo-category-extra above); harmless
   on the stacked mobile/tablet layout too since flex-grow along the main (vertical) axis there
   would only matter if the two blocks needed to fill a fixed-height container, which they don't. */
.evo-category-extra__block {
	flex: 1 1 0;
	min-width: 0;
}

.evo-category-extra__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 24px;
	margin: 0 0 18px;
}

/* Additional information now renders raw admin-entered HTML (see wp_kses_post() in
   evo_render_category_faq_and_info_section() in functions.php) rather than plain lines split into
   <p> tags — pasted markup can be a bare mix of headings/text/<br> with no wrapping <p> at all
   (this is the exact shape of the reference content this was built against), so the base
   font/color/line-height lives on the container itself, not just on <p>, and next to it are
   fallback styles for the common tags that kind of markup brings with it (headings, links, lists).
   Any inline style="" attribute in the pasted HTML still wins over these (that's the whole point
   of allowing HTML here) — these are just sane defaults for whatever the pasted markup doesn't
   already style itself. */
.evo-category-extra__body {
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-category-extra__body p {
	margin: 0 0 14px;
}

.evo-category-extra__body p:last-child {
	margin-bottom: 0;
}

.evo-category-extra__body h1,
.evo-category-extra__body h2,
.evo-category-extra__body h3,
.evo-category-extra__body h4,
.evo-category-extra__body h5,
.evo-category-extra__body h6 {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	color: var(--evo-quality-sneaks);
	line-height: 1.3;
	margin: 0 0 12px;
}

.evo-category-extra__body a {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

.evo-category-extra__body a:hover,
.evo-category-extra__body a:focus-visible {
	color: var(--evo-yorkie);
}

.evo-category-extra__body ul,
.evo-category-extra__body ol {
	margin: 0 0 14px;
	padding-left: 22px;
}

.evo-category-extra__body img {
	max-width: 100%;
	height: auto;
}

.evo-category-faq__list {
	display: flex;
	flex-direction: column;
	gap: 14px;
}

.evo-category-faq__item {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	overflow: hidden;
}

.evo-category-faq__question {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	/* Vertical padding trimmed slightly (was 20px) to offset the larger font-size below —
	   keeps this row's overall closed height exactly the same as before rather than growing
	   the accordion taller now that the label text itself is bigger. */
	padding: 19px 24px;
	cursor: pointer;
	list-style: none;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	/* Bumped up from 15px for readability — see the padding comment above for how the row
	   height was kept unchanged despite this. */
	font-size: 18px;
	color: var(--evo-quality-sneaks);
	transition: color 0.15s ease;
}

.evo-category-faq__question::-webkit-details-marker {
	display: none;
}

.evo-category-faq__question:hover,
.evo-category-faq__question:focus-visible {
	color: var(--evo-yorkie);
}

.evo-category-faq__question-text {
	flex: 1 1 auto;
}

.evo-category-faq__chevron {
	flex: 0 0 auto;
	width: 16px;
	height: 16px;
	background-color: currentColor;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	transition: transform 0.2s ease;
}

.evo-category-faq__item[open] .evo-category-faq__chevron {
	transform: rotate(180deg);
}

.evo-category-faq__item[open] .evo-category-faq__question {
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.evo-category-faq__answer {
	padding: 4px 24px 22px;
}

.evo-category-faq__answer p {
	margin: 0 0 12px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-category-faq__answer p:last-child {
	margin-bottom: 0;
}

@media (max-width: 960px) {
	.evo-category-extra {
		/* Back to a single stacked column below desktop — the side-by-side row above needs
		   more width than a tablet/phone viewport can spare for two comfortably readable
		   columns. max-width also drops back closer to the original single-column "reading
		   width" now that it's one column again, not two sharing 1100px.

		   align-items: stretch overrides the desktop row's flex-start — that value made sense
		   there (each column just sized to its own content height, not stretched to match the
		   taller one), but with flex-direction now column the cross-axis flips to horizontal,
		   so flex-start there was instead shrinking each block (and everything inside it,
		   including the FAQ accordion items) down to its own content width and leaving dead
		   space on the right — this makes them fill the full box width again. */
		flex-direction: column;
		align-items: stretch;
		max-width: 820px;
		padding: 24px 18px 48px;
	}

	.evo-category-extra__block {
		/* Cancels the row layout's flex-grow — in a stacked column each block should just be
		   its own natural height, not stretch to match the taller of the two. */
		flex: 0 1 auto;
	}
}

@media (max-width: 640px) {
	.evo-category-extra__divider {
		margin-top: 28px;
	}

	.evo-category-extra {
		margin-top: 20px;
		padding: 20px 18px 40px;
		gap: 28px;
	}

	.evo-category-extra__heading {
		font-size: 20px;
	}

	.evo-category-faq__question {
		padding: 16px 18px;
		/* Bumped from 14px along with the desktop size above — the chevron icon next to it is
		   a fixed 16px, which happens to still be the taller of the two at this size, so the
		   padding above didn't need adjusting to keep the row's closed height unchanged. */
		font-size: 16px;
	}

	.evo-category-faq__answer {
		padding: 4px 18px 18px;
	}
}

@media (max-width: 400px) {
	.evo-category-extra {
		padding: 12px 12px 36px;
	}
}

/* ---------- Single product page title (H1) ----------
   Changed to --evo-glass-text (14 August 2026) to match the mobile product hero card's title
   (.evo-product-hero__title, further down this file), which is black/near-black rather than
   purple — was purple here on desktop only, an inconsistency you asked to have corrected rather
   than kept. Markup is WooCommerce core's own <h1 class="product_title entry-title">, untouched —
   this is styling only. */
.woocommerce div.product .product_title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-glass-text);
	font-size: 36px;
	line-height: 1.15;
	margin: 0 0 14px;
	text-align: left;
}

/* ---------- Single product page price ----------
   Changed to --evo-quality-sneaks/purple (14 August 2026) to match the mobile product hero
   card's price (.evo-product-hero__price, further down this file) — was --evo-glass-text
   (near-black) here on desktop only, the reverse inconsistency to the title above; both are now
   corrected to the same convention on both breakpoints. Scoped to div.product specifically so
   this doesn't touch the shop/category grid card price, which already uses this same purple
   separately (see .woocommerce ul.products li.product .price above). */
.woocommerce div.product p.price {
	font-weight: 700;
	font-size: 26px;
	color: var(--evo-quality-sneaks);
}

/* On-sale: keep the crossed-out original price small/muted, same convention as the grid cards,
   so the bold current price (inherits the rule above) still reads as the one that matters. */
.woocommerce div.product p.price del {
	opacity: 0.6;
	font-weight: 500;
}

.woocommerce div.product p.price ins {
	text-decoration: none;
}

/* ---------- Single product page: hide SKU + Categories + Tags under Add to Cart ----------
   WooCommerce core's own .product_meta block (SKU / Categories / Tags — see
   woocommerce_template_single_meta(), hooked to woocommerce_single_product_summary) renders
   below the add-to-cart button. Tags are hidden here too (28 Aug 2026) — they're only used
   internally for Smart Collections rule matching / reporting / discounts, not meant to be
   customer-facing. Still fully functional for that internal matching since this only hides
   the CSS display, it doesn't unhook the tags themselves. */
.woocommerce div.product .product_meta .sku_wrapper,
.woocommerce div.product .product_meta .posted_in,
.woocommerce div.product .product_meta .tagged_as {
	display: none;
}

/* ---------- Shop filter bar: Brand / Price range / Alphabetical (replaces default sorting dropdown) ---------- */

.evo-shop-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 10px 28px;
	max-width: 920px;
	margin: 0 auto 32px;
	padding: 14px 24px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	text-align: center;
}

.evo-shop-toolbar .woocommerce-result-count {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 13px;
	color: var(--evo-glass-text);
	white-space: nowrap;
}

.evo-shop-filters {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 10px 20px;
	margin: 0;
}

.evo-shop-filters__label {
	display: inline-block;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	margin-right: 8px;
	white-space: nowrap;
}

.evo-shop-filters__form {
	display: flex;
	align-items: center;
}

.evo-shop-filters__form select {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 13px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 8px 32px 8px 16px;
	min-width: 0;
	max-width: 160px;
}

.evo-shop-filters__form select:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

/* Same fix as .evo-category-filters__select above — the native option-list popup needs an
   explicit solid background/text colour or it renders unreadable (light-on-light) in dark
   mode in some browsers, since it's not part of the page's own glass compositing. */
.evo-shop-filters__form select option {
	background-color: var(--evo-glass-bg-solid);
	color: var(--evo-glass-text);
}

/* Custom price range slider — auto-filters on release, spans the full store price range */
.evo-shop-filters__price {
	display: flex;
	align-items: center;
	gap: 10px;
	min-width: 0;
}

.evo-price-slider {
	position: relative;
	width: 170px;
	height: 16px;
	margin-top: 20px;
}

.evo-price-slider__track {
	position: absolute;
	top: 50%;
	left: 0;
	right: 0;
	height: 4px;
	background: rgba(128, 128, 128, 0.35);
	border-radius: 999px;
	transform: translateY(-50%);
}

.evo-price-slider__range {
	position: absolute;
	top: 0;
	height: 100%;
	background: var(--evo-quality-sneaks);
	border-radius: 999px;
}

.evo-price-slider__input {
	position: absolute;
	top: 50%;
	left: 0;
	width: 100%;
	height: 16px;
	margin: 0;
	transform: translateY(-50%);
	background: transparent;
	pointer-events: none;
	-webkit-appearance: none;
	appearance: none;
}

.evo-price-slider__input::-webkit-slider-runnable-track {
	-webkit-appearance: none;
	background: transparent;
	height: 4px;
}

.evo-price-slider__input::-moz-range-track {
	background: transparent;
	height: 4px;
	border: none;
}

.evo-price-slider__input::-webkit-slider-thumb {
	-webkit-appearance: none;
	pointer-events: auto;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background: var(--evo-yorkie);
	border: 2px solid var(--evo-cloud);
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
	cursor: pointer;
	margin-top: 0;
}

.evo-price-slider__input::-moz-range-thumb {
	pointer-events: auto;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background: var(--evo-yorkie);
	border: 2px solid var(--evo-cloud);
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
	cursor: pointer;
}

.evo-price-slider__tooltip {
	position: absolute;
	top: -22px;
	transform: translateX(-50%);
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 11px;
	color: var(--evo-cloud);
	background: var(--evo-defeater);
	padding: 2px 8px;
	border-radius: 999px;
	white-space: nowrap;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.15s ease;
}

.evo-price-slider__tooltip.is-visible {
	opacity: 1;
}

@media (max-width: 640px) {
	.evo-shop-toolbar {
		flex-direction: column;
		align-items: stretch;
		padding: 16px 20px;
	}

	.evo-shop-filters {
		flex-direction: column;
		align-items: stretch;
		width: 100%;
	}

	.evo-shop-filters__form {
		justify-content: space-between;
	}

	.evo-shop-filters__form select,
	.evo-shop-filters__price,
	.evo-price-slider {
		width: 100%;
	}

	.evo-shop-filters__form select {
		max-width: none;
	}
}

/* ---------- Product category & brand filters (Brand / attributes / price) ----------
   A "Show Filters" button sits in a toolbar right above the product grid (right-aligned, so it
   lands above the grid's top-right corner) and pops open an inline filters panel to the LEFT of
   the grid — a plain sibling column in the page's own flow (.evo-category-layout), in the site's
   own card/glass styling, not a fixed-position overlay. The button's label swaps to "Hide Filters"
   while it's open (see the wp_footer script in functions.php). Category and brand archives only
   (see evo_uses_sidebar_filters() in functions.php) — the shop page, product tags, and search keep
   the original top-toolbar Brand select + price slider (.evo-shop-toolbar above). Brand archives
   don't get the Brand checkbox group itself (you're already looking at one brand's products), just
   Sort/attributes/Price. */

.evo-category-toolbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin: 0 0 24px;
}

.evo-category-toolbar__count {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 13px;
	color: var(--evo-glass-text);
	opacity: 0.75;
}

.evo-category-toolbar__count .woocommerce-result-count {
	margin: 0;
}

.evo-category-toolbar__actions {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-shrink: 0;
}

/* "Make it obvious" — a solid brand-gradient pill, same treatment the old Apply Filters button
   used, rather than a quiet outline/ghost button. */
.evo-category-toolbar__filters-btn {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	flex-shrink: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background: linear-gradient(90deg, var(--evo-quality-sneaks), var(--evo-yorkie));
	border: none;
	border-radius: 999px;
	padding: 13px 24px;
	cursor: pointer;
	transition: box-shadow 0.2s ease, transform 0.2s ease;
}

.evo-category-toolbar__filters-btn:hover,
.evo-category-toolbar__filters-btn:focus-visible {
	box-shadow: var(--evo-glass-glow);
	transform: translateY(-1px);
}

.evo-category-toolbar__filters-btn svg {
	flex-shrink: 0;
}

/* "Clear Filters" — same pill shape/type treatment as "Show/Hide Filters" right next to it, but
   outlined rather than solid-filled, so the two read as a related pair while still keeping Show/
   Hide Filters as the visually primary action. */
.evo-category-toolbar__clear-btn {
	display: inline-flex;
	align-items: center;
	flex-shrink: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	text-decoration: none;
	color: var(--evo-glass-text);
	background-color: transparent;
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 12px 22px;
	cursor: pointer;
	transition: border-color 0.2s ease, transform 0.2s ease;
}

.evo-category-toolbar__clear-btn:hover,
.evo-category-toolbar__clear-btn:focus-visible {
	border-color: var(--evo-quality-sneaks);
	transform: translateY(-1px);
}

/* ---------- Main-category subcategory filter tiles ----------
   Sits right under the category's own description text, above the result-count/Show Filters
   toolbar (see evo_render_category_subcategory_filters() in functions.php) — one small square
   tile per subcategory, using the exact same category-thumbnail image and label treatment as the
   header's Shop flyout tile for that subcategory (.evo-shop-menu__tile/__tile-image/__tile-label
   above — same square aspect-ratio, image object-fit: cover, top-left gradient-scrim label in the
   same subtitle font/weight/case), just sized down to fit a filter row instead of the flyout's own
   big tile grid. Categories without an uploaded thumbnail fall back to the flyout's own purple
   radial-gradient tile background so every tile looks intentional either way. Clicking a tile
   filters the grid down to that subcategory; the active tile gets a solid pink ring + pink label
   backdrop (a solid pink fill would just hide the photo). "Reset Filter" is a separate, plainly-
   styled text control, not one of the pink-eligible tiles. Only ever rendered on the 5 top-level
   categories flagged "expandable" on the Shop Menu settings page — every other category/brand
   archive is untouched. */
.evo-category-subcat-filters {
	margin: 0 0 24px;
}

.evo-category-subcat-filters__row {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	justify-content: center;
	gap: 10px;
}

.evo-category-subcat-filters__pill {
	position: relative;
	display: flex;
	align-items: flex-start;
	flex: 0 0 auto;
	width: 112px;
	height: 112px;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	text-decoration: none;
	background-color: var(--evo-defeater);
	border: 1px solid rgba(255, 255, 255, 0.14);
	box-shadow: 0 6px 16px rgba(0, 0, 0, 0.22);
	transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}

/* Same "no uploaded image yet" fallback backdrop as the flyout tile, kept in sync with it. */
.evo-category-subcat-filters__pill:not(:has(.evo-category-subcat-filters__pill-image)) {
	background-image: radial-gradient(circle at 30% 20%, rgba(106, 43, 198, 0.55) 0%, rgba(106, 43, 198, 0) 50%);
}

.evo-category-subcat-filters__pill:hover,
.evo-category-subcat-filters__pill:focus-visible {
	transform: translateY(-3px);
	box-shadow: 0 10px 22px rgba(0, 0, 0, 0.28);
}

/* Same specificity bump + !important as .evo-shop-menu__tile-image above, and for the same
   reason — WooCommerce's own default frontend stylesheet (loaded via the .woocommerce body class
   on every shop page) was winning the cascade for `height` on the bare .evo-category-subcat-
   filters__pill-image class, so the photo's own box fell short of the tile's bottom edge and the
   tile's dark background showed through underneath it. */
.evo-category-subcat-filters__pill .evo-category-subcat-filters__pill-image {
	display: block;
	position: absolute;
	inset: 0;
	width: 100% !important;
	height: 100% !important;
	object-fit: cover !important;
}

.evo-category-subcat-filters__pill-label {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	z-index: 1;
	padding: 10px 10px 18px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	line-height: 1.12;
	letter-spacing: 0.01em;
	text-transform: uppercase;
	color: var(--evo-cloud);
	background: linear-gradient(180deg, rgba(0, 0, 0, 0.72) 0%, rgba(0, 0, 0, 0) 100%);
}

.evo-category-subcat-filters__pill.is-active {
	border-color: var(--evo-yorkie);
	box-shadow: 0 0 0 2px var(--evo-yorkie), 0 10px 22px rgba(0, 0, 0, 0.28);
}

.evo-category-subcat-filters__pill.is-active .evo-category-subcat-filters__pill-label {
	background: linear-gradient(180deg, var(--evo-yorkie) 0%, rgba(213, 53, 134, 0) 100%);
}

.evo-category-subcat-filters__reset {
	display: inline-flex;
	align-items: center;
	flex-shrink: 0;
	align-self: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	text-decoration: none;
	color: var(--evo-glass-text);
	opacity: 0.65;
	background-color: transparent;
	border: 1.5px solid transparent;
	border-radius: 999px;
	padding: 10px 16px;
	cursor: pointer;
	white-space: nowrap;
	transition: opacity 0.2s ease, border-color 0.2s ease;
}

.evo-category-subcat-filters__reset:hover,
.evo-category-subcat-filters__reset:focus-visible {
	opacity: 1;
	border-color: var(--evo-glass-border);
}

@media (max-width: 640px) {
	.evo-category-subcat-filters__row {
		gap: 8px;
	}

	.evo-category-subcat-filters__pill {
		width: 84px;
		height: 84px;
	}

	.evo-category-subcat-filters__pill-label {
		padding: 7px 7px 12px;
		font-size: 11px;
	}

	.evo-category-subcat-filters__reset {
		font-size: 11px;
		padding: 8px 14px;
	}
}

/* ---------- Inline filters panel + product grid layout ----------
   .evo-category-layout is a plain flex row: the filters panel (a sibling column, not an overlay)
   on the left, the product grid + pagination (.evo-category-main) taking up the rest. The panel
   is hidden by default (display: none — takes up no space, no stray flex gap) and only appears
   once "Show Filters" adds .is-open (see the wp_footer script in functions.php); when it's
   closed, .evo-category-main is simply the only flex child, so the grid is full-width exactly
   like the shop page. Uses the same "glass card" surface as the rest of the site instead of the
   old drawer's fixed-position panel. */
.evo-category-layout {
	display: flex;
	align-items: flex-start;
	gap: 28px;
}

.evo-category-filters {
	display: none;
	flex: 0 0 260px;
	width: 260px;
	box-sizing: border-box;
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 12px;
	padding: 24px;
	color: var(--evo-glass-text);
}

.evo-category-filters.is-open {
	display: block;
}

.evo-category-filters__panel-title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
	line-height: 1.3;
	margin: 0 0 18px;
}

.evo-category-main {
	flex: 1 1 0%;
	min-width: 0;
}

.evo-category-filters__form {
	display: flex;
	flex-direction: column;
	gap: 22px;
}

.evo-category-filters__group {
	display: flex;
	flex-direction: column;
	gap: 10px;
	padding-bottom: 18px;
	border-bottom: 1px solid var(--evo-glass-border);
}

.evo-category-filters__group:last-of-type {
	border-bottom: none;
	padding-bottom: 0;
}

.evo-category-filters__heading {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-glass-text);
}

.evo-category-filters__select {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 13px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 8px 12px;
	width: 100%;
	box-sizing: border-box;
}

.evo-category-filters__select:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

/* The <select> itself picks up the theme colours fine, but the native dropdown *list* that
   opens on click is rendered by the OS/browser outside the page's own translucent glass
   styling — without this, some browsers (Chrome on Windows especially) paint that list with
   light/white text on a light/white background regardless of theme, making it unreadable in
   dark mode. Giving the options an explicit, solid (not translucent) background fixes it. */
.evo-category-filters__select option {
	background-color: var(--evo-glass-bg-solid);
	color: var(--evo-glass-text);
}

.evo-category-filters__options {
	display: flex;
	flex-direction: column;
	gap: 8px;
	max-height: 220px;
	overflow-y: auto;
}

.evo-category-filters__option {
	display: flex;
	align-items: center;
	gap: 9px;
	font-family: var(--evo-body-font);
	font-size: 13px;
	font-weight: 500;
	color: var(--evo-glass-text);
	cursor: pointer;
}

.evo-category-filters__option input[type='checkbox'] {
	width: 16px;
	height: 16px;
	flex-shrink: 0;
	accent-color: var(--evo-quality-sneaks);
	cursor: pointer;
}

.evo-category-filters__price {
	display: flex;
	gap: 12px;
}

.evo-category-filters__price-field {
	flex: 1;
	display: flex;
	flex-direction: column;
	gap: 6px;
	font-family: var(--evo-subtitle-font);
	font-size: 11px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.75;
}

.evo-category-filters__price-field input {
	font-family: var(--evo-body-font);
	font-size: 13px;
	font-weight: 600;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 8px 10px;
	width: 100%;
	box-sizing: border-box;
}

.evo-category-filters__price-field input:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

@media (max-width: 960px) {
	/* Below this width there isn't enough room left for a 260px filters column beside the grid
	   without squeezing the products uncomfortably narrow — the panel instead stacks full-width
	   above the grid when it's open, same inline "pop out" behaviour, just vertical instead of
	   side-by-side. */
	.evo-category-layout {
		flex-direction: column;
	}

	.evo-category-filters {
		flex: 1 1 auto;
		width: 100%;
	}
}

@media (max-width: 640px) {
	.evo-category-toolbar {
		flex-wrap: wrap;
	}

	.evo-category-toolbar__actions {
		flex-wrap: wrap;
		width: 100%;
	}

	.evo-category-toolbar__filters-btn,
	.evo-category-toolbar__clear-btn {
		flex: 1 1 auto;
		justify-content: center;
	}

	.evo-category-filters {
		padding: 18px;
	}
}

.latest-products__viewport {
	position: relative;
	display: flex;
	align-items: center;
	gap: 12px;
}

.latest-products__track {
	display: flex;
	gap: 24px;
	list-style: none;
	margin: 0;
	padding: 4px 4px 12px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
}

.latest-products__track::-webkit-scrollbar {
	display: none;
}

.latest-products__item {
	flex: 0 0 auto;
	width: 220px;
	scroll-snap-align: start;
	display: flex;
	flex-direction: column;
}

.latest-products__image {
	display: block;
	background: var(--evo-product-image-bg);
	border: 1px solid var(--evo-glass-border);
	aspect-ratio: 1 / 1;
	overflow: hidden;
	margin-bottom: 14px;
}

.latest-products__image img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.latest-products__title {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	line-height: 1.4;
	color: var(--evo-glass-text);
	text-decoration: none;
	margin-bottom: 6px;
}

.latest-products__title:hover {
	color: var(--evo-quality-sneaks);
}

.latest-products__price {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 15px;
	color: var(--evo-quality-sneaks);
}

.latest-products__quick-shop {
	margin-top: 10px;
}

.latest-products__price del {
	color: var(--evo-glass-text);
	opacity: 0.5;
	font-weight: 500;
	margin-right: 6px;
}

.latest-products__arrow {
	flex-shrink: 0;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 50%;
	width: 40px;
	height: 40px;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--evo-glass-text);
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
}

.latest-products__arrow:hover,
.latest-products__arrow:focus-visible {
	background: var(--evo-defeater);
	color: var(--evo-cloud);
	outline: none;
}

@media (max-width: 640px) {
	.latest-products {
		padding: 36px 20px 40px;
	}

	.latest-products__item {
		width: 160px;
	}

	.latest-products__arrow {
		display: none;
	}
}

/* ---------- Legal footer (compliance / registered office / age warning) ---------- */

.legal-footer {
	background: #262626;
	color: #b3b3b3;
	text-align: center;
	padding: 24px 20px;
	font-family: var(--evo-body-font);
}

.legal-footer p {
	margin: 0 0 8px;
	font-size: 12px;
	line-height: 1.6;
	max-width: 760px;
	margin-left: auto;
	margin-right: auto;
}

.legal-footer p:last-child {
	margin-bottom: 0;
}

.legal-footer__copyright {
	font-weight: 600;
}

/* ---------- Product page: short (mini) description ---------- */

.woocommerce-product-details__short-description {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	max-width: 380px;
	margin: 10px 0 18px;
}

.woocommerce-product-details__short-description p {
	margin: 0 0 8px;
}

.woocommerce-product-details__short-description p:last-child {
	margin-bottom: 0;
}

.woocommerce-product-details__short-description strong,
.woocommerce-product-details__short-description b {
	font-weight: 700;
}

/* ---------- Product page: full description tab ----------
   The theme's base stylesheet (BlankSlate) resets ALL default typography
   sitewide on purpose (no bold, no margins, no list styles) — see the
   reset block at the top of this file. Product descriptions are plain
   HTML written by hand and rely on normal browser formatting, so restore
   sensible defaults here, scoped to the description tab only. Uses a
   class (not #tab-description) so any custom <style> a product's own
   description embeds — e.g. .product-feature-card h4 — still wins,
   since it loads later in the page and matches at equal specificity. */

.woocommerce-Tabs-panel--description {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
	font-size: 15px;
	line-height: 1.65;
}

.woocommerce-Tabs-panel--description p {
	margin: 0 0 16px;
}

.woocommerce-Tabs-panel--description h1,
.woocommerce-Tabs-panel--description h2,
.woocommerce-Tabs-panel--description h3,
.woocommerce-Tabs-panel--description h4,
.woocommerce-Tabs-panel--description h5,
.woocommerce-Tabs-panel--description h6 {
	font-weight: 700;
	line-height: 1.3;
	margin: 30px 0 14px;
}

.woocommerce-Tabs-panel--description h3 {
	font-size: 22px;
}

.woocommerce-Tabs-panel--description h4 {
	font-size: 17px;
}

.woocommerce-Tabs-panel--description strong,
.woocommerce-Tabs-panel--description b {
	font-weight: 700;
}

.woocommerce-Tabs-panel--description em,
.woocommerce-Tabs-panel--description i {
	font-style: italic;
}

.woocommerce-Tabs-panel--description ul,
.woocommerce-Tabs-panel--description ol {
	margin: 0 0 16px;
	padding-left: 22px;
}

.woocommerce-Tabs-panel--description ul {
	list-style: disc;
}

.woocommerce-Tabs-panel--description ol {
	list-style: decimal;
}

.woocommerce-Tabs-panel--description li {
	margin-bottom: 6px;
}

.woocommerce-Tabs-panel--description hr {
	border: none;
	border-top: 1px solid var(--evo-glass-border);
	margin: 30px 0;
}

.woocommerce-Tabs-panel--description a {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

/* ---------- Product page: "Key Features" cards embedded in product descriptions ----------
   Every product description carries its own <style> block for .product-features-grid /
   .product-feature-card (baked in by whatever template was used to write the description),
   hardcoded to one fixed colour scheme — #000 background, #fff text — regardless of site theme.
   That per-product <style> renders further down the page than this stylesheet, so at equal CSS
   specificity it always won, which is exactly why these boxes stayed solid black even after
   switching to light mode. !important on just the colour-related properties forces every one of
   these cards, on every product, to follow the site's light/dark toggle instead — their layout
   (grid columns, padding, border-radius, gap, spacing) is left alone since that part was fine. */
.product-feature-card {
	background: var(--evo-glass-bg-strong) !important;
	border-color: var(--evo-glass-border) !important;
	border-left-color: var(--evo-quality-sneaks) !important;
}

.product-feature-card h4 {
	color: var(--evo-quality-sneaks) !important;
}

.product-feature-card p {
	color: var(--evo-glass-text) !important;
}

/* ---------- Product page: highlights ----------
   Was a single narrow column capped at 320px regardless of how much room the summary column
   actually had — on a 600px+ wide column that left roughly half the available width empty and
   made each item's icon/text read small next to all that space. Now a 2-up grid that fills the
   full summary column width, with everything inside each item sized up to match. */

.product-highlights {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 14px;
	margin: 0 0 26px;
}

.product-highlights__item {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 16px 18px;
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
	background: var(--evo-glass-bg);
}

.product-highlights__icon {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 38px;
	height: 38px;
}

.product-highlights__icon img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

/* Stands in for the icon whenever a highlight has a title/subtitle but no icon image uploaded
   (see evo_render_product_highlights() in functions.php) — a stylised 4-point sparkle in the
   site's own purple gradient, rather than leaving that row's icon slot empty and unaligned with
   the others. */
.product-highlights__icon--placeholder {
	width: 26px;
	height: 26px;
	background-image: linear-gradient(135deg, var(--evo-purple-haze), var(--evo-magenta));
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%203l1.6%205.4L19%2010l-5.4%201.6L12%2017l-1.6-5.4L5%2010l5.4-1.6L12%203z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%203l1.6%205.4L19%2010l-5.4%201.6L12%2017l-1.6-5.4L5%2010l5.4-1.6L12%203z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E");
}

.product-highlights__text {
	display: flex;
	flex-direction: column;
	line-height: 1.3;
}

.product-highlights__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	letter-spacing: 0.03em;
	text-transform: uppercase;
	color: var(--evo-glass-text);
}

.product-highlights__subtitle {
	font-family: var(--evo-body-font);
	font-size: 13.5px;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

@media (max-width: 640px) {
	.product-highlights {
		grid-template-columns: 1fr;
	}

	.woocommerce-product-details__short-description {
		max-width: 100%;
	}
}

/* ---------- Product page: narrow + centre the whole product area ----------
   .woocommerce div.product wraps the image/summary card AND the description tabs beneath it, so
   constraining it once here narrows and centres both consistently. Same 1500px + 28/18/12px
   formula used site-wide (see .site-content) — matches the header, homepage sections, and every
   other page instead of its own separate width. */

.woocommerce div.product {
	/* Actually capped (unlike the site's other "max-width: none" wrappers, which rely on their
	   own inner sections each declaring their own width) — on a wide/ultra-wide monitor this
	   whole product area was stretching edge-to-edge with nothing to stop it, so the image (a
	   fixed % of that huge width) sat large and hard against the left edge with a wall of empty
	   space to the right where the summary column's flex-grow had nothing worth filling it with.
	   Capping the whole card here keeps it a sensible, centred size regardless of screen width. */
	max-width: 1300px;
	margin-left: auto;
	margin-right: auto;
	padding-left: 28px;
	padding-right: 28px;
}

@media (min-width: 641px) {
	/* Side-by-side stays — just via flex instead of WooCommerce's own float:left/right 48%/48%
	   split, so the image can be a specific (smaller) size instead of a fixed percentage, and the
	   summary column reliably fills whatever's left next to it. div.product also wraps the
	   description tabs, related products, and recently-viewed sections underneath this pair (see
	   the comment above) — flex-wrap: wrap plus flex-basis: 100% on each of those below keeps them
	   each on their own full-width row rather than trying to squeeze in beside the image.

	   The gallery + summary pair now actually lives one level deeper, inside the .evo-product-card
	   box (see the card styling further down and the wrapper opened/closed in functions.php), so
	   .evo-product-card — not div.images/div.summary directly — is div.product's flex item here;
	   it's given the same flex-wrap/gap/side-by-side treatment so the two columns inside it line
	   up exactly as before, just with the box's own padding around them. */
	.woocommerce div.product {
		display: flex;
		flex-wrap: wrap;
		align-items: flex-start;
		gap: 40px;
	}

	.evo-product-card {
		flex: 1 1 100%;
		max-width: 100%;
		display: flex;
		flex-wrap: wrap;
		align-items: flex-start;
		gap: 40px;
	}

	.woocommerce div.product div.images {
		float: none;
		/* Was 38% — that left the gallery noticeably smaller than the summary column next to it,
		   so the whole card read as visually left-heavy/off-centre even though the row itself is
		   centred (see .woocommerce div.product's margin: 0 auto above). Bigger image, smaller gap
		   to the title/summary, balances the two columns instead. */
		flex: 0 0 46%;
		max-width: 46%;
		margin: 0;
	}

	.woocommerce div.product div.images img {
		width: 100%;
		background-color: var(--evo-product-image-bg);
	}

	.woocommerce div.product div.summary {
		float: none;
		flex: 1 1 0;
		width: auto;
		max-width: none;
		margin: 0;
	}

	.woocommerce div.product .woocommerce-tabs,
	.woocommerce div.product .upsells.products,
	.woocommerce div.product .related.products,
	.woocommerce div.product .evo-recently-viewed {
		flex: 1 1 100%;
		max-width: 100%;
	}
}

/* ---------- Related Products + Recently Viewed section headings (single product page) ----------
   Previously ran with no separation at all from whatever sat above them, and WooCommerce's own
   "Related products" <h2> printed as fully unstyled default text (the sitewide CSS reset at the
   top of this file strips h1-h6 back to plain inherited text/size). A full-width divider now
   sits above each section with room before its heading, and both headings match the site's
   standard section-heading treatment used everywhere else (page titles, "Latest Products" on the
   homepage) — heading-font, uppercase, brand purple, 30px — instead of two different,
   inconsistent-with-the-rest-of-the-site styles. */
.related.products {
	border-top: 1.5px solid var(--evo-glass-border);
	margin-top: 48px;
	padding-top: 40px;
}

.related.products h2 {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0 0 24px;
}

@media (max-width: 960px) {
	.woocommerce div.product {
		padding-left: 18px;
		padding-right: 18px;
	}
}

@media (max-width: 640px) {
	.woocommerce div.product div.images {
		max-width: 100%;
	}

	.woocommerce div.product .variations td.value select {
		min-width: 0;
		width: 100%;
	}
}

@media (max-width: 400px) {
	.woocommerce div.product {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* ---------- Product page: gallery + summary boxed in their own opaque card ----------
   The page-wide "glow" (body::before, see near the top of this file) is a fixed, blurred blob
   layer sitting behind every page at a negative z-index — every semi-transparent glass panel on
   the site normally shows it through. The product page's own image+summary area is wrapped in a
   new .evo-product-card container (opened/closed in functions.php around just the gallery and
   summary — NOT the description tabs, upsells, related products or recently-viewed sections
   further down div.product, which stay outside this box and keep sitting on the glow same as
   before) so it can be pulled out of that effect: a plain, fully opaque white panel in light mode
   and fully opaque black in dark mode. An opaque background here is all that's needed to block
   the blob — normal-flow content always paints over a negative z-index fixed sibling regardless
   of the blob's own z-index, so nothing further (no extra isolation/stacking-context rule) is
   required. Square (sharp, non-rounded) corners are deliberate too, so the card reads as a plain
   flat box rather than matching the rounded glass panels used everywhere else on the site. */
.evo-product-card {
	background: #ffffff;
	border-radius: 0;
	padding: 32px;
	margin: 0 0 40px;
}

[data-evo-theme='dark'] .evo-product-card {
	background: #000000;
}

@media (max-width: 640px) {
	.evo-product-card {
		padding: 20px;
	}
}

/* ---------- Product page: variation selectors + quantity box (chunky, rounded, left-aligned) ---------- */

.woocommerce div.product .variations {
	width: auto;
	margin: 0 0 20px;
	border-collapse: separate;
}

.woocommerce div.product .variations tr {
	display: block;
	margin-bottom: 16px;
}

.woocommerce div.product .variations tr:last-child {
	margin-bottom: 0;
}

.woocommerce div.product .variations td.value {
	display: block;
	text-align: left;
	padding: 0;
	width: auto;
	line-height: normal;
}

/* Its own explicit flex row (14 August 2026) rather than relying on the label and the stock badge
   footer.php's JS adds next to it (see evoGetVariationStockBadge()) just happening to line up
   inline on their own — that's what left the badge stranded on its own line below "Colour" instead
   of sitting beside it. */
.woocommerce div.product .variations th.label {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 10px;
	text-align: left;
	padding: 0;
	width: auto;
	line-height: normal;
}

.woocommerce div.product .variations th.label label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	margin-bottom: 8px;
	display: inline-block;
}

.woocommerce div.product .variations td.value select {
	display: inline-block;
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 12px 44px 12px 20px;
	min-width: 200px;
	max-width: 100%;
	margin-right: 0;
}

.woocommerce div.product .variations td.value select:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

/* Same fix as the shop/category filter selects — the native option-list popup needs an explicit
   solid background/text colour or it renders unreadable (dark-on-dark) in dark mode, since it's
   not part of the page's own glass compositing. */
.woocommerce div.product .variations td.value select option {
	background-color: var(--evo-glass-bg-solid);
	color: var(--evo-glass-text);
}

.woocommerce div.product .variations .reset_variations {
	display: inline-block;
	margin-top: 10px;
	font-family: var(--evo-subtitle-font);
	font-size: 12px;
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

/* Stock count / low-stock notice — see evo_filter_stock_html() in functions.php. Retail/guest
   customers only ever see the low-stock variant (5 units or fewer); trade customer groups always
   see the plain-count variant. Both replace WooCommerce's unstyled default "512 in stock" text,
   with real spacing around them so they read as their own line rather than crowding the price or
   qty selector above/below. */
.evo-stock-notice {
	display: inline-flex;
	align-items: center;
	margin: 4px 0 20px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	letter-spacing: 0.03em;
}

/* Qualified with the same .woocommerce div.product p.stock ancestor chain WooCommerce's own core
   CSS uses for its default color:#958e09 / font-size:.92em — a plain .evo-stock-notice--low class
   selector has fewer classes than that core rule and loses regardless of source order, which is
   why the text was rendering in WooCommerce's default olive/green instead of ours. */
.woocommerce div.product p.stock.evo-stock-notice--wholesale {
	font-size: 13px;
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 8px 18px;
}

/* Once footer.php's JS relocates the stock pill to sit right next to the attribute label (e.g.
   "Colour") — see the found_variation handler there — it needs different spacing to actually sit
   inline on that row instead of keeping the standalone-block margin from .evo-stock-notice above
   (4px 0 20px) — that 20px bottom margin made sense when this sat on its own line further down
   the page, not shoulder-to-shoulder with a short table label. Targets .evo-variation-stock-badge
   (the fixed wrapper footer.php's JS creates, see evoGetVariationStockBadge()) rather than the
   stock element directly, since that wrapper — not WooCommerce's own copy — is what actually ends
   up sitting next to the label now (14 August 2026, corrected). */
.woocommerce div.product .variations th.label .evo-variation-stock-badge .evo-stock-notice {
	margin: 0;
	font-size: 11px;
	padding: 5px 12px;
}

/* WooCommerce's own copy of this block (see the big comment on evoGetVariationStockBadge() in
   footer.php for why relocating it directly kept going wrong) is hidden outright everywhere it can
   appear, rather than shown and then hidden again per-context — the fixed badge next to the label
   is the only copy that's ever actually visible now. */
.woocommerce div.product .woocommerce-variation-availability {
	display: none;
}

/* Plain red text, no pill/background — a bright, saturated red rather than the theme's muted
   --evo-error-red (that's tuned for quiet form-error text, too soft to read as urgent here), same
   fixed shade in both light and dark mode so it stays obvious either way. */
.woocommerce div.product p.stock.evo-stock-notice--low {
	font-size: 15px;
	font-weight: 800;
	color: #e2131b;
}

.woocommerce div.product form.cart,
.woocommerce div.product .single_variation_wrap {
	text-align: left;
}

/* WooCommerce's own add-to-cart form always renders its OWN separate price box the moment a
   Colour/Flavour is picked (.woocommerce-variation-price, inside .single_variation_wrap) — in
   EVERY context that form appears in this theme (the real single-product page, the Quick Shop
   modal, and the mobile Options Sheet, which reuses Quick Shop's own markup), there's already a
   price shown higher up (the page's own price, or .evo-quick-shop-modal__price) that these two
   forms hide/show alongside. Left visible, this duplicated that price in an entirely different,
   unbranded style the moment a variation was selected — see footer.php for the JS that updates
   the ORIGINAL price element instead, so there's only ever one price on screen (14 August 2026). */
.woocommerce div.product .woocommerce-variation-price {
	display: none;
}

/* Quantity + Add to Cart sit in one row, stretched to the same height (align-items: stretch),
   and the button grows to fill whatever space the compact quantity stepper doesn't use — was
   previously two independently-sized inline elements (a small pill input, a plain unstyled
   WooCommerce button) that never lined up or filled the row. Scoped with :not(.variations_form)
   so this doesn't touch the layout of the variations <table> above it for variable products —
   .woocommerce-variation-add-to-cart below is their equivalent quantity+button row. */
.woocommerce div.product form.cart:not(.variations_form),
.woocommerce div.product .woocommerce-variation-add-to-cart {
	display: flex;
	align-items: stretch;
	flex-wrap: wrap;
	gap: 12px;
}

/* Quantity stepper — per client reference: three separate square, rounded-corner boxes
   ([ − ] [ number ] [ + ]) each with its own gradient ring border, instead of one merged pill.
   The − / + buttons themselves are injected by evo_render_quantity_stepper_minus_button() /
   evo_render_quantity_stepper_plus_button() in functions.php (single product page only, via
   WooCommerce's own woocommerce_before/after_quantity_input_field hooks — no template override
   needed), and evo_output_quantity_stepper_script() wires up their click behaviour. */
.woocommerce div.product form.cart .quantity,
.evo-quick-order__quantity,
.evolution-cart-qty {
	float: none;
	display: inline-flex;
	align-items: stretch;
	gap: 6px;
	vertical-align: middle;
	margin: 0;
}

/* The gradient ring on each box is the double-background trick: an inner solid fill painted only
   into the padding-box, with the gradient behind it filling the full border-box — so the
   gradient only ever shows through the border's own thickness, rounded corners included. Same
   purple → magenta → vintage stops as the brand logo's gradient elsewhere on the site, just
   swapping its "→ orange" for "→ vintage" to land on the softer/muted tone in the reference.
   Also reused as-is on the Quick Order page's per-row qty stepper (.evo-quick-order__quantity)
   for trade accounts, and the cart drawer's per-item stepper (.evolution-cart-qty, see
   inc/cart-drawer-quantity.php + inc/cart-drawer-layout.php for its smaller-size override) — same
   widget, same markup shape (.quantity > .qty + .evo-qty-btn), just different pages/contexts. */
.woocommerce div.product form.cart .quantity .qty,
.woocommerce div.product form.cart .quantity .evo-qty-btn,
.evo-quick-order__quantity .qty,
.evo-quick-order__quantity .evo-qty-btn,
.evolution-cart-qty .qty,
.evolution-cart-qty .evo-qty-btn {
	width: 46px;
	border: 2px solid transparent;
	border-radius: 12px;
	background:
		linear-gradient(var(--evo-glass-bg-solid), var(--evo-glass-bg-solid)) padding-box,
		linear-gradient(135deg, var(--evo-purple-haze), var(--evo-magenta), var(--evo-vintage-days)) border-box;
}

.woocommerce div.product form.cart .quantity .qty,
.evo-quick-order__quantity .qty,
.evolution-cart-qty .qty {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 15px;
	/* Fixed neutral grey rather than --evo-glass-text — the reference uses one muted icon/text
	   colour regardless of light/dark, so the colourful gradient ring stays the focal point. */
	color: #707070;
	padding: 4px;
	text-align: center;
	/* The +/- buttons replace the native number spinner arrows, which otherwise still show up
	   alongside them. */
	-moz-appearance: textfield;
}

.woocommerce div.product form.cart .quantity .qty::-webkit-outer-spin-button,
.woocommerce div.product form.cart .quantity .qty::-webkit-inner-spin-button,
.evo-quick-order__quantity .qty::-webkit-outer-spin-button,
.evo-quick-order__quantity .qty::-webkit-inner-spin-button,
.evolution-cart-qty .qty::-webkit-outer-spin-button,
.evolution-cart-qty .qty::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

.woocommerce div.product form.cart .quantity .qty:focus,
.evo-quick-order__quantity .qty:focus,
.evolution-cart-qty .qty:focus {
	outline: none;
	border-color: transparent;
}

.evo-qty-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: #707070;
	font-size: 18px;
	line-height: 1;
	cursor: pointer;
	transition: opacity 0.15s ease;
}

.evo-qty-btn:hover,
.evo-qty-btn:focus-visible {
	opacity: 0.7;
	outline: none;
}

/* Add to Cart — soft lavender pill per the client reference (distinct from the vivid purple
   used for other site buttons — this is a deliberately lighter/pastel treatment scoped to just
   this control). flex: 1 1 auto lets it grow next to the (compact, fixed-width) quantity stepper
   rather than shrinking to its own text width, but max-width caps that growth at half the row. */
.woocommerce div.product form.cart .button,
.woocommerce div.product .woocommerce-variation-add-to-cart .button {
	flex: 1 1 auto;
	max-width: 50%;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: #d0beec;
	border: none;
	border-radius: 999px;
	padding: 14px 36px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

/* Darker shade within the same lavender family on hover — var(--evo-yorkie) (used for the site's
   other, vivid-purple buttons) is a bright magenta and would jump jarringly against this pastel
   button. */
.woocommerce div.product form.cart .button:hover,
.woocommerce div.product form.cart .button:focus-visible,
.woocommerce div.product .woocommerce-variation-add-to-cart .button:hover,
.woocommerce div.product .woocommerce-variation-add-to-cart .button:focus-visible {
	background-color: var(--evo-purple-haze);
}

/* WooCommerce core fades this button to 25% opacity while its own "loading" class is on during
   the AJAX add-to-cart request, and to 50% (plus a hardcoded purple, for .alt buttons like this
   one) once :disabled — both read as the button "fading" rather than staying one solid colour.
   Our selector here is more specific than core's own (core wraps most of its own selector in
   :where(), which is why this wins without needing !important), so it stays the same solid
   lavender in every state. */
.woocommerce div.product form.cart .button.loading,
.woocommerce div.product form.cart .button.disabled,
.woocommerce div.product form.cart .button:disabled,
.woocommerce div.product .woocommerce-variation-add-to-cart .button.loading,
.woocommerce div.product .woocommerce-variation-add-to-cart .button.disabled,
.woocommerce div.product .woocommerce-variation-add-to-cart .button:disabled {
	opacity: 1;
	background-color: #d0beec;
	color: var(--evo-cloud);
}

/* ---------- Product page: shipping timescale note (under quantity/Add to Cart) ----------
   See evo_render_shipping_timescale_note() in functions.php — a static, site-wide dispatch-cutoff
   reminder, same message on every product. Sits directly under the Add to Cart row itself, ahead
   of the Lipscore reviews section's own top border below, so it reads as part of the purchase
   decision rather than a separate content block. */
.evo-shipping-note {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 8px 0 0;
	font-family: var(--evo-body-font);
	font-size: 13px;
	font-weight: 600;
	color: var(--evo-glass-text);
}

.evo-shipping-note__icon {
	flex: 0 0 auto;
	width: 16px;
	height: 16px;
	background-color: var(--evo-quality-sneaks);
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M1%203h15v13H1z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20d%3D%22M16%208h4l3%203v5h-7V8z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Ccircle%20cx%3D%225.5%22%20cy%3D%2218.5%22%20r%3D%222.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%3Ccircle%20cx%3D%2218.5%22%20cy%3D%2218.5%22%20r%3D%222.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%3C%2Fsvg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M1%203h15v13H1z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20d%3D%22M16%208h4l3%203v5h-7V8z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Ccircle%20cx%3D%225.5%22%20cy%3D%2218.5%22%20r%3D%222.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%3Ccircle%20cx%3D%2218.5%22%20cy%3D%2218.5%22%20r%3D%222.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%3C%2Fsvg%3E");
}

@media (max-width: 640px) {
	.evo-shipping-note {
		font-size: 12px;
	}
}

/* ---------- Product page: Lipscore reviews section (under quantity/Add to Cart) ----------
   See evo_render_product_reviews_section() in functions.php. Placeholder star styling matches
   the same "not connected yet" pattern already used for the product-card rating widget
   (.evo-product-rating--placeholder) and the homepage testimonials section. */
.evo-product-reviews {
	margin-top: 20px;
	padding-top: 20px;
	border-top: 1px solid var(--evo-glass-border);
}

.evo-product-reviews__placeholder {
	display: flex;
	align-items: center;
	gap: 10px;
}

.evo-product-reviews__stars {
	font-size: 16px;
	letter-spacing: 2px;
	color: var(--evo-glass-border);
}

.evo-product-reviews__text {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-glass-text);
	opacity: 0.75;
}

/* ---------- Product page: Description / Additional information / Reviews tabs ----------
   WooCommerce's own markup + JS (core's frontend.js already handles the click-to-switch
   behaviour and toggling li.active/.panel — nothing to wire up here), just restyled: the default
   off-white boxed tabs (see ul.tabs li / .active in WooCommerce's own stylesheet) swapped for the
   same underlined-tab-nav + glass-card-panel pattern already used for the Terms/Privacy tabs
   (.evo-terms-tabs__* — see page-terms-conditions.php) elsewhere on the site. */
.woocommerce div.product .woocommerce-tabs {
	margin: 40px 0 0;
}

/* Fully self-contained rather than a partial override of WooCommerce core's layout (display,
   list-style, the :before bottom-border trick it uses to let active tabs "connect" to the white
   panel below) — safer than assuming those particular mechanics stay unchanged, and simpler
   since our tabs don't need that overlap trick (no background colour change between tabs). */
.woocommerce div.product .woocommerce-tabs ul.tabs {
	display: flex;
	flex-wrap: wrap;
	list-style: none;
	margin: 0 0 24px;
	padding: 0;
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.woocommerce div.product .woocommerce-tabs ul.tabs:before {
	content: none;
}

.woocommerce div.product .woocommerce-tabs ul.tabs li {
	display: block;
	background-color: transparent;
	border: none;
	margin: 0 24px 0 0;
	padding: 0;
}

.woocommerce div.product .woocommerce-tabs ul.tabs li a {
	display: inline-block;
	text-decoration: none;
	padding: 14px 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	border-bottom: 2.5px solid transparent;
	transition: color 0.15s ease, border-color 0.15s ease;
}

.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover {
	color: var(--evo-quality-sneaks);
}

.woocommerce div.product .woocommerce-tabs ul.tabs li.active {
	background: transparent;
	border-bottom-color: transparent;
}

.woocommerce div.product .woocommerce-tabs ul.tabs li.active a {
	color: var(--evo-quality-sneaks);
	border-bottom-color: var(--evo-quality-sneaks);
}

.woocommerce div.product .woocommerce-tabs .panel {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 32px 36px;
}

/* :where(...) below — the Description panel is where product-specific custom HTML lives (e.g.
   the "key features" boxes some products have, each with its own hand-authored background/text
   colours meant to work together). :where() gives these fallback defaults ZERO specificity, so
   ANY styling already on that content — even a single plain class, or a bare tag selector — wins
   automatically instead of being clobbered by our (otherwise fairly specific) selectors here.
   These rules only ever apply to plain, unstyled description text with nothing of its own. */
:where(.woocommerce div.product .woocommerce-tabs .panel > h2:first-child) {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 22px;
	margin: 0 0 16px;
}

:where(.woocommerce div.product .woocommerce-tabs .panel p),
:where(.woocommerce div.product .woocommerce-tabs .panel li),
:where(.woocommerce div.product .woocommerce-tabs .panel dt),
:where(.woocommerce div.product .woocommerce-tabs .panel dd) {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

/* Additional information tab — the attribute/dimensions table */
.woocommerce div.product .woocommerce-tabs table.shop_attributes {
	width: 100%;
	border-collapse: collapse;
}

.woocommerce div.product .woocommerce-tabs table.shop_attributes th,
.woocommerce div.product .woocommerce-tabs table.shop_attributes td {
	padding: 12px 0;
	border-bottom: 1px solid var(--evo-glass-border);
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	text-align: left;
	background: none;
}

.woocommerce div.product .woocommerce-tabs table.shop_attributes th {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	width: 30%;
}

/* Additional information tab — Barcode list (added 8 Sep 2026, one "Value = Barcode" line per
   variation — see evo_build_barcode_additional_info_html() in functions.php). Plain stacked
   lines rather than default bullets, since this is reference data, not a real list of options. */
.woocommerce div.product .woocommerce-tabs .evo-additional-info-list {
	list-style: none;
	margin: 0;
	padding: 0;
}

.woocommerce div.product .woocommerce-tabs .evo-additional-info-list li {
	line-height: 1.6;
}

/* Reviews tab — comment list + the "Add a review" form */
.woocommerce div.product .woocommerce-tabs #comments .commentlist,
.woocommerce div.product .woocommerce-tabs .comment-form-rating,
.woocommerce div.product .woocommerce-tabs .comment-form-comment,
.woocommerce div.product .woocommerce-tabs .comment-form-author,
.woocommerce div.product .woocommerce-tabs .comment-form-email {
	margin: 0 0 20px;
}

.woocommerce div.product .woocommerce-tabs #review_form label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	display: inline-block;
	margin-bottom: 8px;
}

.woocommerce div.product .woocommerce-tabs #review_form input[type="text"],
.woocommerce div.product .woocommerce-tabs #review_form input[type="email"] {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 12px 20px;
	width: 100%;
	max-width: 360px;
}

.woocommerce div.product .woocommerce-tabs #review_form textarea {
	font-family: var(--evo-body-font);
	font-weight: 500;
	font-size: 15px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 14px 20px;
	width: 100%;
	resize: vertical;
}

.woocommerce div.product .woocommerce-tabs #review_form input:focus,
.woocommerce div.product .woocommerce-tabs #review_form textarea:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

.woocommerce div.product .woocommerce-tabs #review_form .form-submit input {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 14px 32px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.woocommerce div.product .woocommerce-tabs #review_form .form-submit input:hover,
.woocommerce div.product .woocommerce-tabs #review_form .form-submit input:focus-visible {
	background-color: var(--evo-yorkie);
}

/* Description tab: auto-accordion by heading (see evo_render_description_accordion() in
   functions.php) — content ahead of the first heading (Rule 3's "no headings" case never reaches
   here, this is only the leading-intro case) stays as plain panel text above the accordion; each
   heading-led section below it becomes its own glass-card drop-down, same native
   <details>/<summary> + chevron technique already used for the Returns & Refunds FAQ
   (.evo-returns-faq__*). Typography inside these sections (p/li/dt/dd) already picks up the
   :where(...panel p) rule above — a descendant selector, so it reaches into the accordion body
   too — keeping the same zero-specificity protection for any client custom "key features" boxes
   nested inside a section. */
.evo-description-intro {
	margin: 0 0 20px;
}

.evo-description-accordion {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.evo-description-accordion__item {
	background: var(--evo-glass-bg-strong);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	overflow: hidden;
}

.evo-description-accordion__summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding: 18px 20px;
	cursor: pointer;
	list-style: none;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 18px;
	color: var(--evo-quality-sneaks);
	transition: color 0.15s ease;
}

.evo-description-accordion__summary::-webkit-details-marker {
	display: none;
}

.evo-description-accordion__summary:hover,
.evo-description-accordion__summary:focus-visible {
	color: var(--evo-yorkie);
}

.evo-description-accordion__heading {
	flex: 1 1 auto;
}

.evo-description-accordion__icon {
	flex: 0 0 auto;
	width: 16px;
	height: 16px;
	background-color: currentColor;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	transition: transform 0.2s ease;
}

.evo-description-accordion__item[open] .evo-description-accordion__icon {
	transform: rotate(180deg);
}

.evo-description-accordion__item[open] .evo-description-accordion__summary {
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.evo-description-accordion__body {
	padding: 4px 20px 20px;
}

/* "What's in the Box" (added 8 Sep 2026) — its own .evo-description-accordion wrapper, rendered
   as a sibling block directly after the description one (see evo_render_package_contents_accordion()
   in functions.php), so it just needs its own top spacing to match the gap: 12px used between
   items inside a single accordion — everything else (__item/__summary/__body/etc.) is already
   shared with the description accordion above for a consistent look. */
.evo-package-contents-accordion {
	margin-top: 12px;
}

.evo-whats-in-box__list {
	padding-left: 20px;
}

@media (max-width: 640px) {
	.woocommerce div.product .woocommerce-tabs ul.tabs li {
		margin-right: 16px;
	}

	.woocommerce div.product .woocommerce-tabs ul.tabs li a {
		font-size: 12px;
	}

	.evo-description-accordion__summary {
		padding: 16px 16px;
		font-size: 16px;
	}

	.evo-description-accordion__body {
		padding: 4px 16px 16px;
	}

	.woocommerce div.product .woocommerce-tabs .panel {
		padding: 24px 20px;
	}
}

/* ---------- Contact Us form ---------- */

.evo-contact {
	max-width: 640px;
	margin: 0 auto;
}

.evo-contact .header {
	text-align: center;
	margin-top: 32px;
	margin-bottom: 12px;
}

/* Matches the product category / tag archive page title styling */
.evo-contact .entry-title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0;
}

/* Short editable message under the title — edited via the normal page content editor */
.evo-contact__intro {
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	margin-bottom: 32px;
}

.evo-contact__intro p:last-child {
	margin-bottom: 0;
}

.evo-contact__call {
	text-align: center;
	margin: 0 0 32px;
}

.evo-contact__call a {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 16px;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	text-decoration: none;
}

.evo-contact__call a:hover,
.evo-contact__call a:focus-visible {
	color: var(--evo-yorkie);
}

.evo-contact__success {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: #1e6b3c;
	background: #eaf7ef;
	border: 1.5px solid #b8e2c6;
	border-radius: 0;
	padding: 20px 24px;
	text-align: center;
}

.evo-contact__errors {
	background: #fdecec;
	border: 1.5px solid #f3b9b9;
	border-radius: 0;
	padding: 16px 24px;
	margin-bottom: 24px;
}

.evo-contact__errors ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.evo-contact__errors li {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-error-red);
}

.evo-contact__errors li + li {
	margin-top: 6px;
}

.evo-contact__form {
	display: flex;
	flex-direction: column;
	gap: 20px;
}

.evo-contact__honeypot {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.evo-contact__row {
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.evo-contact__row label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.evo-contact__row input {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 14px 22px;
}

.evo-contact__row textarea {
	font-family: var(--evo-body-font);
	font-weight: 500;
	font-size: 15px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 16px 22px;
	resize: vertical;
}

.evo-contact__row input:focus,
.evo-contact__row textarea:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

.evo-contact__submit {
	align-self: flex-start;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 14px 36px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-contact__submit:hover,
.evo-contact__submit:focus-visible {
	background-color: var(--evo-yorkie);
}

@media (max-width: 640px) {
	.evo-contact__submit {
		width: 100%;
		text-align: center;
	}
}

/* ---------- My Account navigation ----------
   A proper left-hand sidebar — Address Book / My Orders / Account Management / Logout — sitting
   beside the tab content rather than WooCommerce's plain bullet list (or this site's previous
   icon-grid above the content). An earlier version of this made .entry-content a flex row, but
   that depends on the nav/content actually being its direct flex children, which wasn't holding
   up reliably. Sidestepping that entirely by keeping WooCommerce's own proven mechanism —
   float the nav left with a fixed width, then offset the content with margin-left instead of
   floating it — since this only depends on nav/content being adjacent siblings (confirmed via
   the my-account shortcode template), not on any particular parent cooperating. The offset is
   nav width + gap, recalculated at each breakpoint below. */

.woocommerce-account .entry-content::after {
	content: '';
	display: table;
	clear: both;
}

.woocommerce-account .woocommerce-MyAccount-navigation {
	float: left;
	width: 240px;
	margin: 0;
}

/* WooCommerce's core CSS floats this right at 68% width — instead this just clears the float
   and gets pushed clear of the nav with a margin-left equal to nav width (240px) + gap (32px). */
.woocommerce-account .woocommerce-MyAccount-content {
	width: auto;
	float: none;
	margin-left: 272px;
}

.woocommerce-account .woocommerce-MyAccount-navigation ul {
	display: flex;
	flex-direction: column;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}

.woocommerce-MyAccount-navigation-link {
	margin: 0;
}

.woocommerce-MyAccount-navigation-link a {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	gap: 14px;
	text-align: left;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13.5px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 16px 18px;
	text-decoration: none;
	transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, transform 0.15s ease;
}

.woocommerce-MyAccount-navigation-link a::before {
	content: '';
	display: block;
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	background-color: currentColor;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
}

.woocommerce-MyAccount-navigation-link--orders a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M3%207l9-4%209%204-9%204-9-4z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M3%207v10l9%204%209-4V7%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M12%2011v10%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M3%207l9-4%209%204-9%204-9-4z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M3%207v10l9%204%209-4V7%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M12%2011v10%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link--edit-address a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2021s-7-6.5-7-11a7%207%200%201%201%2014%200c0%204.5-7%2011-7%2011z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2210%22%20r%3D%222.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2021s-7-6.5-7-11a7%207%200%201%201%2014%200c0%204.5-7%2011-7%2011z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2210%22%20r%3D%222.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link--account-management a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%228%22%20r%3D%224%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M4%2020c0-4%203.5-6%208-6s8%202%208%206%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%228%22%20r%3D%224%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M4%2020c0-4%203.5-6%208-6s8%202%208%206%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link--customer-logout a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M15%203h4a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201h-4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M10%2017l5-5-5-5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M15%2012H3%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M15%203h4a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201h-4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M10%2017l5-5-5-5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M15%2012H3%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
}

/* Added — these three tabs had no icon rule at all, so they inherited only
   the shared solid 22x22 currentColor box above with nothing to mask it
   into a shape, rendering as plain black (or white, on the active purple
   background) squares. */
.woocommerce-MyAccount-navigation-link--available-promotions a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.59%2013.41L13.41%2020.59a2%202%200%200%201-2.82%200L2%2012V2h10l8.59%208.59a2%202%200%200%201%200%202.82z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Ccircle%20cx%3D%227%22%20cy%3D%227%22%20r%3D%221.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.59%2013.41L13.41%2020.59a2%202%200%200%201-2.82%200L2%2012V2h10l8.59%208.59a2%202%200%200%201%200%202.82z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Ccircle%20cx%3D%227%22%20cy%3D%227%22%20r%3D%221.5%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link--wishlist a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.84%204.61a5.5%205.5%200%200%200-7.78%200L12%205.67l-1.06-1.06a5.5%205.5%200%200%200-7.78%207.78l1.06%201.06L12%2021.23l7.78-7.78%201.06-1.06a5.5%205.5%200%200%200%200-7.78z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.84%204.61a5.5%205.5%200%200%200-7.78%200L12%205.67l-1.06-1.06a5.5%205.5%200%200%200-7.78%207.78l1.06%201.06L12%2021.23l7.78-7.78%201.06-1.06a5.5%205.5%200%200%200%200-7.78z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link--sales-rep-portal a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Crect%20x%3D%222%22%20y%3D%227%22%20width%3D%2220%22%20height%3D%2214%22%20rx%3D%222%22%20ry%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M16%2021V5a2%202%200%200%200-2-2h-4a2%202%200%200%200-2%202v16%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Crect%20x%3D%222%22%20y%3D%227%22%20width%3D%2220%22%20height%3D%2214%22%20rx%3D%222%22%20ry%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M16%2021V5a2%202%200%200%200-2-2h-4a2%202%200%200%200-2%202v16%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
}

/* Added — same reason as the three above (Available Promotions/Wishlist/Sales Rep Portal): no
   icon rule existed at all for these two tabs, so they rendered as plain solid squares. Price
   Requests gets a speech-bubble ("message"/request) icon; Wholesale Account gets an ID-card icon
   (a little business-account card rather than the plain single-person icon already used for
   Account Management, so the two don't look identical in the rail). */
.woocommerce-MyAccount-navigation-link--price-requests a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M21%2015a2%202%200%200%201-2%202H7l-4%204V5a2%202%200%200%201%202-2h14a2%202%200%200%201%202%202z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M21%2015a2%202%200%200%201-2%202H7l-4%204V5a2%202%200%200%201%202-2h14a2%202%200%200%201%202%202z%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link--wholesale-account a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Crect%20x%3D%222%22%20y%3D%225%22%20width%3D%2220%22%20height%3D%2214%22%20rx%3D%222%22%20ry%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Ccircle%20cx%3D%228%22%20cy%3D%2212%22%20r%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M14%2010h4M14%2014h4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Crect%20x%3D%222%22%20y%3D%225%22%20width%3D%2220%22%20height%3D%2214%22%20rx%3D%222%22%20ry%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Ccircle%20cx%3D%228%22%20cy%3D%2212%22%20r%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M14%2010h4M14%2014h4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3C/svg%3E");
}

/* Added — Credit Account tab (inc/credit-ledger.php) had no icon rule, same square-icon gap as
   the tabs above. Simple credit-card shape so it reads distinctly from the Wholesale Account
   ID-card icon. */
.woocommerce-MyAccount-navigation-link--credit-account a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Crect%20x%3D%222%22%20y%3D%225%22%20width%3D%2220%22%20height%3D%2214%22%20rx%3D%222%22%20ry%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M2%2010h20%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M6%2015h4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Crect%20x%3D%222%22%20y%3D%225%22%20width%3D%2220%22%20height%3D%2214%22%20rx%3D%222%22%20ry%3D%222%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M2%2010h20%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22/%3E%3Cpath%20d%3D%22M6%2015h4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22/%3E%3C/svg%3E");
}

/* Added — Bulk Order (CSV) tab (inc/customer-bulk-order.php) had no icon rule, same square-icon
   gap as the tabs above. Upload arrow (into a tray) rather than a plain document, since the core
   action on this tab is uploading a file, not just viewing one. */
.woocommerce-MyAccount-navigation-link--bulk-order-csv a::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2015V3%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M7%208l5-5%205%205%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M4%2015v4a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2v-4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2015V3%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M7%208l5-5%205%205%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M4%2015v4a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2v-4%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
}

.woocommerce-MyAccount-navigation-link a:hover,
.woocommerce-MyAccount-navigation-link a:focus-visible {
	border-color: var(--evo-yorkie);
	color: var(--evo-yorkie);
	transform: translateX(2px);
}

.woocommerce-MyAccount-navigation-link.is-active a {
	background-color: var(--evo-quality-sneaks);
	border-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

/* Mobile icon-rail flyout toggle ("Expand Menu" / "Collapse Menu") — its own <li> at the bottom
   of the nav list (see woocommerce/myaccount/navigation.php), styled to match every tab above it
   exactly so it reads as part of the same rail rather than a separate control bolted on. Hidden
   completely outside the 640px breakpoint below, where it's the only way to open the rail out. */
.evo-account-nav-toggle-item {
	display: none;
}

.evo-account-nav-toggle {
	display: flex;
	width: 100%;
	flex-direction: row;
	align-items: center;
	justify-content: flex-start;
	gap: 14px;
	text-align: left;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13.5px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 16px 18px;
	cursor: pointer;
	transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.evo-account-nav-toggle:hover,
.evo-account-nav-toggle:focus-visible {
	border-color: var(--evo-yorkie);
	color: var(--evo-yorkie);
}

.evo-account-nav-toggle__icon {
	display: flex;
	flex: 0 0 auto;
}

.evo-account-nav-toggle__icon svg {
	transition: transform 0.2s ease;
}

.evo-account-nav-toggle[aria-expanded="true"] .evo-account-nav-toggle__icon svg {
	transform: rotate(180deg);
}

/* Mobile: the sidebar used to stay permanently visible next to the content as a squeezed column
   of icon-only tiles (down to 92px wide at the smallest breakpoint), which left very little room
   for the content itself — see the My Orders table needing all the width it can get. It's now a
   narrower icon-only rail by default, and tapping the arrow at the bottom slides it open wider —
   like a drawer — to reveal each tab's label next to its icon.
   The rail sits at position: absolute the whole time (both collapsed and expanded), never
   float: left, specifically so opening it is just a width change on one already-absolutely-
   positioned box — nothing swaps from being "in the page flow" to "floating over it" partway
   through, which is what caused the icons to visibly jump/resize on open before. Content next to
   it always has the same margin-left regardless of state, since the rail never pushes it either
   way. Every row's icon sits at the exact same fixed offset from the left edge in both states —
   only the label (wrapped in its own .evo-account-nav-label span by the template override)
   grows in from width: 0 alongside the rail — so the icons themselves never move or resize, only
   the panel grows out from behind/around them, same as a drawer opening. */
@media (max-width: 640px) {
	.woocommerce-account .entry-content {
		position: relative;
	}

	.evo-account-nav-toggle-item {
		display: block;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation {
		float: none;
		position: absolute;
		top: 0;
		left: 0;
		width: 60px;
		z-index: 20;
		overflow: hidden;
		/* Plain page background, not the pinkish-cream --evo-cloud used for button text elsewhere
		   — this just needs to be an opaque backing so page content can't show through the rail
		   while it's closed, not a colour of its own. */
		background-color: var(--evo-page-bg);
		box-shadow: 0 8px 24px rgba(20, 8, 40, 0);
		transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s ease;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation.is-expanded {
		width: 220px;
		z-index: 40;
		box-shadow: 0 8px 24px rgba(20, 8, 40, 0.28);
	}

	/* .entry-content itself still has its own 18px left padding at this width (see further down
	   this file) which a position: absolute rail ignores but normal-flow content like this doesn't
	   — so this margin-left is short of the rail's own 60px width by roughly that same 18px, to
	   land content just past the rail's right edge instead of leaving a much bigger gap than
	   intended (60px rail + a real 18px padding + this margin would otherwise stack up to a ~76px
	   gap, not the ~16px one actually wanted here).
	   Address Book and Account Management need their own copy of this same selector, at the same
	   body.evo-account-addresses/evo-account-management + .woocommerce-MyAccount-content
	   specificity as the 720px-cap rule further down this file that centres their content column
	   with margin-left/margin-right: auto — otherwise that rule (a higher-specificity match than
	   the plain one below) wins on those two tabs specifically and overrides margin-left back to
	   auto, which is what let the rail sit on top of their text rather than beside it. */
	body.evo-account-addresses.woocommerce-account .woocommerce-MyAccount-content,
	body.evo-account-management.woocommerce-account .woocommerce-MyAccount-content,
	.woocommerce-account .woocommerce-MyAccount-content {
		margin-left: 52px;
		width: auto;
		float: none;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation ul {
		gap: 6px;
		width: 220px;
	}

	.woocommerce-MyAccount-navigation-link a,
	.evo-account-nav-toggle {
		flex-direction: row;
		justify-content: flex-start;
		align-items: center;
		gap: 14px;
		padding: 14px 16px 14px 18px;
		white-space: nowrap;
	}

	.woocommerce-MyAccount-navigation-link a::before,
	.evo-account-nav-toggle__icon {
		width: 20px;
		height: 20px;
		flex: 0 0 20px;
	}

	/* The row itself (icon + label) never changes width or wraps — it's the rail container above
	   that's actually doing the "drawer" motion, via its own width transition + overflow: hidden
	   clipping everything past whatever width it's currently at. That's what keeps every icon
	   pinned at a fixed offset from the left edge throughout: the label here just needs to fade
	   in once there's room to see it, not animate its own size too (animating both at once was
	   what made the icons look like they were resizing/jumping). Slight delay on fade-in so the
	   label only starts appearing once the rail's mostly finished opening, rather than smearing
	   past the still-narrow visible edge. */
	.evo-account-nav-label {
		display: inline-block;
		opacity: 0;
		vertical-align: middle;
		transition: opacity 0.15s ease;
	}

	.woocommerce-MyAccount-navigation.is-expanded .evo-account-nav-label {
		opacity: 1;
		transition-delay: 0.15s;
	}
}

/* ---------- My Account content ----------
   The My Account page is a plain WordPress Page with a shortcode, so it never picks up the
   same width/padding as the shop and category pages the way WooCommerce's own archive
   templates do — this reapplies the exact same values here so it lines up. Also styles the
   tab content itself (Addresses, Orders, Account details etc.) so paragraphs, headings and
   inputs are easy to read and every link/button matches the site's pill-button style. */

/* Same 1500px + 28/18/12px formula used site-wide (see .site-content) — matches the header,
   homepage sections, and category pages instead of using its own separate width. */
.woocommerce-account .entry-content {
	/* Actually capped — was "none" (unbounded) like several other wrappers on the site, which on
	   an ultra-wide monitor let the sidebar+content pair stretch edge-to-edge with the content
	   column growing far wider than anything inside it actually needed. See the same fix on the
	   single-product page for the full explanation. Also contains the floated nav sidebar (see
	   the ::after clearfix above) so its own height doesn't collapse to 0. */
	max-width: 1400px;
	margin-left: auto;
	margin-right: auto;
	padding-left: 28px;
	padding-right: 28px;
	padding-bottom: 48px;
}

@media (max-width: 960px) {
	.woocommerce-account .entry-content {
		padding-left: 18px;
		padding-right: 18px;
	}
}

@media (max-width: 640px) {
	.woocommerce-account .entry-content {
		padding-bottom: 32px;
	}
}

@media (max-width: 400px) {
	.woocommerce-account .entry-content {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* Page title ("My account") — was completely unstyled (plain default heading), unlike every
   other page on the site which scopes its own .header/.entry-title treatment to match the
   product category/tag archive title look. Brings it in line with those. */
.woocommerce-account .header {
	text-align: center;
	margin-top: 32px;
	margin-bottom: 24px;
}

.woocommerce-account .entry-title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 30px;
	margin: 0;
}

/* Admin-only "Edit This" link (edit_post_link()) — only ever visible to a logged-in admin
   previewing the page, never a real customer, but left tidy/muted rather than the raw default
   blue link jammed against the title. */
.woocommerce-account .header .post-edit-link {
	display: inline-block;
	margin-top: 8px;
	font-family: var(--evo-body-font);
	font-size: 12px;
	color: var(--evo-glass-text);
	opacity: 0.6;
}

/* Dashboard/tab content — was just plain text floating directly on the page background, out of
   step with every other section on the site using a bordered glass card. Wraps the tab's own
   content (Dashboard intro text, Orders table, Addresses, Account details) in the same glass
   treatment used elsewhere (Wholesale tier cards, mission section, etc.), while leaving the
   icon-grid nav above it (.woocommerce-MyAccount-navigation) and .entry-content's width alone. */
.woocommerce-account .woocommerce-MyAccount-content {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 32px 28px;
}

.woocommerce-MyAccount-content p {
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	margin: 0 0 16px;
}

.woocommerce-MyAccount-content p:last-child {
	margin-bottom: 0;
}

/* Inline links inside the dashboard text/tables ("recent orders", "shipping and billing
   addresses", "Log out", pagination, etc.) — were plain default browser blue, now match the
   site's brand link colour. Buttons, the Address "Edit" pill link, and the My Orders
   Invoice/Credit Note buttons are excluded since they're already styled as solid pill buttons
   elsewhere (this rule's higher specificity was otherwise overriding their own text colour —
   purple-on-purple, invisible — hence .evo-orders-table__invoice-link being added to the
   exclusion list on 19 August 2026). Same issue, same fix, for the Sales Rep Portal's "Log in as"
   button on 20 August 2026 — .evo-sales-rep-portal__switch added for the same reason. */
.woocommerce-MyAccount-content a:not(.button):not(.edit):not(.evo-orders-table__invoice-link):not(.evo-sales-rep-portal__switch) {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

.woocommerce-MyAccount-content a:not(.button):not(.edit):not(.evo-orders-table__invoice-link):not(.evo-sales-rep-portal__switch):hover,
.woocommerce-MyAccount-content a:not(.button):not(.edit):not(.evo-orders-table__invoice-link):not(.evo-sales-rep-portal__switch):focus-visible {
	color: var(--evo-yorkie);
}

.woocommerce-MyAccount-content h2,
.woocommerce-MyAccount-content h3 {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	font-size: 17px;
	margin: 0 0 12px;
}

.woocommerce-MyAccount-content label {
	display: inline-block;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	margin-bottom: 6px;
}

.woocommerce-MyAccount-content .input-text,
.woocommerce-MyAccount-content select {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 12px 20px;
}

.woocommerce-MyAccount-content .input-text:focus,
.woocommerce-MyAccount-content select:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

/* Every link/button in My Account (Edit address, Pay, View, Cancel, Save changes, pagination,
   Add New Address) matches the same solid pill button used across the rest of the site.
   !important throughout: WooCommerce's own bundled CSS has a more specific ".woocommerce
   button.button"/".woocommerce a.button" rule (2 classes + an element vs. this rule's 2 classes,
   no element) that otherwise wins and forces its own small grey default button back — the same
   specificity clash already fixed for the Quick Shop button on product cards. */
.woocommerce-account .button,
.woocommerce-account .woocommerce-Address-title a.edit {
	display: inline-block !important;
	font-family: var(--evo-subtitle-font);
	font-weight: 700 !important;
	font-size: 13px !important;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border: none !important;
	border-radius: 999px !important;
	padding: 10px 22px !important;
	text-decoration: none;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.woocommerce-account .button:hover,
.woocommerce-account .button:focus-visible,
.woocommerce-account .woocommerce-Address-title a.edit:hover,
.woocommerce-account .woocommerce-Address-title a.edit:focus-visible {
	background-color: var(--evo-yorkie) !important;
	color: var(--evo-cloud) !important;
}

/* Address Book and Account Management — capped a bit narrower than the full content column
   (itself already narrowed by the sidebar) since both are really just a simple form/card list,
   not a wide grid — reads more comfortably than stretching edge to edge. My Orders is
   deliberately NOT included here any more: its redesigned list (order number/date/shipping
   address per row) wants the full content column's width instead of a 640px cap. Body classes
   added via evo_account_endpoint_body_class() in functions.php, since WooCommerce doesn't add
   its own per-tab body class. */
body.evo-account-addresses .woocommerce-MyAccount-content,
body.evo-account-management .woocommerce-MyAccount-content {
	max-width: 720px;
	margin-left: auto;
	margin-right: auto;
}

/* Account Details' password-change section — bare browser fieldset/legend by default. Styled
   to read as its own section heading, matching the rest of the site's uppercase subtitle style
   (e.g. .evo-address-book__heading, .woocommerce-MyAccount-content h2/h3) rather than a boxed
   HTML fieldset. */
body.evo-account-details fieldset {
	display: flex;
	flex-direction: column;
	gap: 16px;
	border: none;
	margin: 0;
	padding: 24px 0 0;
	border-top: 1px solid var(--evo-glass-border);
}

/* The fieldset is itself a flex item of .woocommerce-EditAccountForm now (see the flex+gap rule
   below), so its own legend needs to sit above the gap-managed rows rather than counting as one —
   order keeps it first regardless of source order, though it already is. */
body.evo-account-details fieldset legend {
	order: -1;
}

body.evo-account-details fieldset legend {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	font-size: 15px;
	padding: 0;
	margin-bottom: 16px;
}

/* WooCommerce's default two-column form-row-first/form-row-last float (47%/48%) reads as
   cramped once the form is capped to 640px — stacking to one column matches the single-column
   rhythm every other form on the site uses (Contact Us, the address book's own add/edit form).
   WooCommerce also gives .form-row-first its own "clear: left" (needed to clear the old float
   layout when several first/last pairs stack), which was left over here with nothing to clear —
   the browser still reserves space for it, leaving an oversized gap above Last Name. Clearing
   that (and the matching float:right clear WC puts on some themes' .form-row-last) removes it. */
body.evo-account-details .woocommerce-EditAccountForm .form-row-first,
body.evo-account-details .woocommerce-EditAccountForm .form-row-last {
	width: 100%;
	float: none;
	clear: none;
}

/* 20 August 2026 — after two rounds of chasing this gap row-by-row (first between First/Last
   Name, then it reappeared between Last Name/Display Name the moment the first spot was patched)
   the pattern itself is the real clue: every fix made the gap move to the next sibling rather than
   closing it, and DevTools kept selecting the whole <form> when inspecting the empty space rather
   than any row inside it. That's the signature of margin collapsing — adjacent <p> rows' vertical
   margins merging into a single shared gap that belongs to neither element, so nothing in the
   cascade shows an explicit height/min-height because there isn't one; it's a browser layout
   artifact, not a set value. Rather than patch it row-by-row again, switching the form itself to a
   flex column with `gap` sidesteps margin collapsing entirely — flex containers never collapse
   child margins, and `gap` handles the spacing directly instead. Rows keep margin: 0 so the two
   spacing mechanisms don't stack. */
body.evo-account-details .woocommerce-EditAccountForm {
	display: flex;
	flex-direction: column;
	gap: 16px;
}

body.evo-account-details .woocommerce-EditAccountForm .form-row {
	display: block;
	height: auto !important;
	min-height: 0 !important;
	margin: 0;
	padding: 0;
}

/* Leftover WooCommerce float-layout clearfix — ::before/::after pseudo-elements forced to
   display: table, only ever needed to stop a cleared float collapsing the row's height back. With
   float: none everywhere on this form (see the form-row-first/-last rule above) there's nothing
   left for it to clear, so it's dead weight either way; removed outright. */
body.evo-account-details .woocommerce-EditAccountForm .form-row::before,
body.evo-account-details .woocommerce-EditAccountForm .form-row::after {
	content: none !important;
	display: none !important;
}

/* Same leftover-clearfix reasoning for WooCommerce's own <div class="clear"></div> markup between
   rows (see form-edit-account.php in the WooCommerce plugin) — hidden outright since float: none
   everywhere means it has nothing to clear. */
body.evo-account-details .woocommerce-EditAccountForm .clear {
	display: none !important;
}

/* Direct children of the form that aren't .form-row (the "Save changes" button's wrapping <p>) —
   still plain UA-default <p> margin otherwise, which would add on top of the flex gap above. */
body.evo-account-details .woocommerce-EditAccountForm > p {
	margin: 0;
}

/* Addresses tab — each address as its own clear card.
   WooCommerce's own CSS puts float:left/right + width:48% directly on each .woocommerce-Address
   card (not just the wrapper), so it has to be neutralised here too — otherwise the cards
   fight between the old float layout and this one depending on whether the wrapping
   .woocommerce-Addresses div even renders (it's skipped entirely if shipping is disabled). */
.woocommerce-Addresses {
	display: flex;
	flex-wrap: wrap;
	gap: 28px;
	margin-top: 12px;
}

.woocommerce-Address {
	float: none !important;
	width: 100% !important;
	max-width: 100%;
	flex: 1 1 300px;
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	padding: 28px;
}

.woocommerce-Address-title {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 20px;
}

.woocommerce-Address-title h2 {
	margin: 0;
	font-size: 15px;
	line-height: 1.5;
}

.woocommerce-Address address {
	font-style: normal;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.8;
	color: var(--evo-glass-text);
}

@media (max-width: 640px) {
	.woocommerce-Address {
		flex-basis: 100%;
	}

	.woocommerce-Address-title {
		flex-wrap: wrap;
	}
}

/* Orders tab — readable table typography */
.woocommerce-orders-table {
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
}

.woocommerce-orders-table th {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	font-size: 12px;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
}

.woocommerce-orders-table td,
.woocommerce-orders-table th {
	padding: 12px 10px;
}

/* ---------- Login / Register / Lost & Reset password ----------
   WooCommerce renders these via its own core templates whenever a logged-out visitor lands on
   My Account (or the dedicated lost/reset-password flow) -- entirely bypassing the
   .woocommerce-MyAccount-content wrapper above, which only exists once logged in. With no theme
   selector targeting this markup, it fell back to the browser's plain default text/inputs with
   no card background at all -- black-on-near-black, invisible in dark mode. This gives it the
   same glass-card treatment and readable colors as the rest of My Account. */

.woocommerce-account #customer_login {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 24px;
	max-width: 900px;
	margin: 0 auto;
}

.woocommerce-account #customer_login > div {
	flex: 1 1 340px;
}

.woocommerce-account .woocommerce-form-login,
.woocommerce-account .woocommerce-form-register,
.woocommerce-account .woocommerce-ResetPassword {
	max-width: 420px;
	margin: 0 auto;
	padding: 28px;
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
}

.woocommerce-account #customer_login h2,
.woocommerce-account .entry-content > h2 {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	font-size: 17px;
	text-align: center;
	margin: 0 0 16px;
}

.woocommerce-account .woocommerce-form-login p,
.woocommerce-account .woocommerce-form-register p,
.woocommerce-account .woocommerce-ResetPassword p {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.woocommerce-account .woocommerce-form-login label,
.woocommerce-account .woocommerce-form-register label,
.woocommerce-account .woocommerce-ResetPassword label {
	display: inline-block;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	margin-bottom: 6px;
}

.woocommerce-account .woocommerce-form-login label.woocommerce-form-login__rememberme {
	display: flex;
	align-items: center;
	gap: 8px;
	text-transform: none;
	font-weight: 600;
	margin-bottom: 0;
}

.woocommerce-account .woocommerce-form-login .input-text,
.woocommerce-account .woocommerce-form-register .input-text,
.woocommerce-account .woocommerce-ResetPassword .input-text {
	width: 100%;
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 12px 20px;
}

.woocommerce-account .woocommerce-form-login .input-text:focus,
.woocommerce-account .woocommerce-form-register .input-text:focus,
.woocommerce-account .woocommerce-ResetPassword .input-text:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

.woocommerce-account .woocommerce-LostPassword a,
.woocommerce-account .woocommerce-form-register a {
	color: var(--evo-quality-sneaks);
	font-weight: 600;
}

@media (max-width: 640px) {
	.woocommerce-account .woocommerce-form-login,
	.woocommerce-account .woocommerce-form-register,
	.woocommerce-account .woocommerce-ResetPassword {
		padding: 22px;
	}
}

/* ---------- Address book (multiple saved billing/shipping addresses) ---------- */

/* Divider line + extra breathing room above "Shipping Addresses" — now that the whole Addresses
   tab sits inside one glass card (.woocommerce-MyAccount-content), Billing and Shipping needed
   their own clear break between them rather than just a heading with margin-top. */
.evo-address-book__heading {
	margin-top: 48px;
	padding-top: 32px;
	border-top: 1.5px solid var(--evo-glass-border);
}

.evo-address-book__heading:first-of-type {
	margin-top: 12px;
	padding-top: 0;
	border-top: none;
}

.evo-address-book__default-badge {
	display: inline-block;
	vertical-align: middle;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 10px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 4px 11px;
	margin-left: 10px;
}

/* Divider + extra top space before the Set as Default/Delete links — previously these sat
   right under the address text with only a small gap and no visual break, which is what read
   as crowded. The border-top matches the same divider treatment already used between the
   Billing/Shipping headings above. */
.evo-address-book__card-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 24px;
	margin-top: 22px;
	padding-top: 18px;
	border-top: 1px solid var(--evo-glass-border);
}

.evo-address-book__set-default,
.evo-address-book__delete {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	text-decoration: underline;
}

.evo-address-book__set-default {
	color: var(--evo-quality-sneaks);
}

.evo-address-book__set-default:hover {
	color: var(--evo-yorkie);
}

.evo-address-book__delete {
	color: var(--evo-error-red);
}

.evo-address-book__delete:hover {
	color: var(--evo-error-red-strong);
}

.evo-address-book__add {
	margin-top: 24px;
}

.evo-address-book__form {
	max-width: 640px;
	margin-top: 8px;
}

/* 20 August 2026 — same float-driven gap bug as Account Management (see the equivalent comment
   on body.evo-account-details .woocommerce-EditAccountForm above): woocommerce_form_field() spits
   out the same old .form-row-first/-last 47%-float pair here, and a huge empty gap was opening up
   after them before Country/Region. Rather than patch the float/clear mechanics again, this
   container skips floats entirely — flex-wrap lets the first/last pair share a line naturally
   (2-up via flex-basis) while every form-row-wide field always starts its own new line, and gap
   handles all the spacing so there's no margin-collapse case left to go wrong. */
.evo-address-book__fields {
	display: flex;
	flex-wrap: wrap;
	gap: 16px 24px;
	margin-bottom: 20px;
}

.evo-address-book__fields .form-row {
	margin: 0;
	width: auto;
	float: none;
	clear: none;
}

.evo-address-book__fields .form-row-first,
.evo-address-book__fields .form-row-last {
	flex: 1 1 220px;
}

.evo-address-book__fields .form-row-wide {
	flex: 1 1 100%;
}

.evo-address-book__default-check {
	display: flex;
	align-items: center;
	gap: 10px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	margin-bottom: 24px;
}

.evo-address-book__default-check input[type='checkbox'] {
	width: 18px;
	height: 18px;
}

.evo-address-book__form-actions {
	display: flex;
	align-items: center;
	gap: 20px;
}

.evo-address-book__cancel {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	text-decoration: underline;
}

.evo-address-book__cancel:hover {
	color: var(--evo-yorkie);
}


/* My Orders search (20 August 2026) — same pill-input treatment as .evo-quick-order__search-field
   for visual consistency. Purely a live client-side filter (see assets/js/orders-search.js); rows
   that don't match get .is-hidden rather than being removed. */
.evo-orders-search {
	display: flex;
	flex-direction: column;
	gap: 6px;
	max-width: 420px;
	margin-bottom: 20px;
}

.evo-orders-search__label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.evo-orders-search__input {
	font-family: var(--evo-body-font);
	font-size: 15px;
	padding: 10px 16px;
	border-radius: 999px;
	border: 1.5px solid var(--evo-glass-border);
	background-color: var(--evo-glass-input-bg);
	color: var(--evo-glass-text);
	width: 100%;
	box-sizing: border-box;
}

.evo-orders-search__input:focus {
	outline: none;
	border-color: var(--evo-yorkie);
}

.evo-orders-search__empty {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
	opacity: 0.75;
	margin-bottom: 16px;
}

.evo-orders-table__row.is-hidden {
	display: none;
}

/* ---------- My Orders (redesigned list) ----------
   Order number / date / value / status / invoice download, laid out in each row as a "card" <div>
   (see woocommerce/myaccount/orders.php) containing an inner <a> that wraps everything except the
   invoice download link — clicking anywhere on the row goes to the order's details page, except
   the separate Download Invoice link, which can't live inside that same <a> (a link can't nest
   inside another link) so it sits alongside it instead. */
.evo-orders-table {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.evo-orders-table__row--head {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 0 20px 4px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

.evo-orders-table__row {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 18px 20px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}

.evo-orders-table__row:hover,
.evo-orders-table__row:focus-within {
	transform: translateY(-2px);
	box-shadow: var(--evo-glass-glow);
	border-color: var(--evo-yorkie);
}

.evo-orders-table__row-link {
	/* Fixed, not flex-growing, so its total width is exactly the sum of its own (also fixed-width)
	   cells below — this is what keeps Invoice/Credit Note starting at the same X position on
	   every row, rather than Status (previously flex: 1 1 auto) swallowing whatever space was
	   left over on a given row and pushing everything after it further right. */
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	gap: 20px;
	text-decoration: none;
	color: var(--evo-glass-text);
}

.evo-orders-table__cell {
	font-family: var(--evo-body-font);
	font-size: 14px;
}

.evo-orders-table__cell--number {
	flex: 0 0 110px;
	font-weight: 700;
	color: var(--evo-quality-sneaks);
}

.evo-orders-table__cell--date {
	flex: 0 0 150px;
}

.evo-orders-table__cell--value {
	flex: 0 0 110px;
	font-weight: 600;
}

.evo-orders-table__cell--status {
	/* Fixed width (was flex: 1 1 auto) — that let Status swallow all the row's leftover space,
	   which is exactly what pushed Invoice/Credit Note away from it with a big gap. */
	flex: 0 0 140px;
}

.evo-orders-table__cell--invoice {
	flex: 0 0 150px;
}

/* Real, solid CTA-style buttons (19 August 2026 — previously a flat outlined/ghost box that
   read as more of a tag than something clickable) matching the same fill/pill/glow language
   used for every other primary button on the site (see .woocommerce-account .button). */
.evo-orders-table__invoice-link {
	display: inline-block;
	padding: 10px 20px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	text-decoration: none;
	white-space: nowrap;
	/* !important here — and on every other pill/button color declaration in this file — on
	   purpose (20 August 2026). This class-of-bug (a pill button's own text color getting
	   overridden by the generic .woocommerce-MyAccount-content a color rule further down, making
	   the text invisible against its own matching background) has now recurred three times, each
	   time needing that generic rule's :not() exclusion list extended for one more class. Rather
	   than extend that list a fourth time and leave the same trap for the next pill button, every
	   pill/button-style color declaration in the theme is now !important, so it always wins
	   regardless of what else targets plain "a" tags elsewhere in the stylesheet — no exclusion
	   list entry required, ever again, for a new button that uses this same pattern. */
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	transition: background-color 0.15s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.evo-orders-table__invoice-link:hover,
.evo-orders-table__invoice-link:focus-visible {
	background-color: var(--evo-yorkie);
	color: var(--evo-cloud) !important;
	box-shadow: var(--evo-glass-glow);
	transform: translateY(-2px);
}

/* "All Credit Notes (.zip)" uses the inverse fill (yorkie base, quality-sneaks on hover) so it
   visually reads as a distinct, secondary action from the individual document downloads above it. */
.evo-orders-table__invoice-link--all {
	background-color: var(--evo-yorkie);
}

.evo-orders-table__invoice-link--all:hover,
.evo-orders-table__invoice-link--all:focus-visible {
	background-color: var(--evo-quality-sneaks);
}

/* ---------- Credit Note control ----------
   Sits on the same row as the Download Invoice button, right after it, in its own
   "Credit Note" column (a dash when the order has no refund, a single download link for one
   credit note, or each one stacked as its own link plus "All Credit Notes (.zip)" underneath
   once there's more than one — originally a dropdown + Download button, changed to stacked
   links on 19 August 2026 for consistency with every other button on this page) — built inline
   in woocommerce/myaccount/orders.php. The equivalent control on the single order-view page
   uses evolution_vaping_render_order_credit_memos_block() in inc/credit-memos.php instead —
   same data and same stacked-links approach, just plain WooCommerce .button styling there
   since it isn't sitting inside this row layout (see .evolution-order-credit-memo-link--stacked
   further down). */
.evo-orders-table__cell--credit-note {
	/* Grows to take up whatever's left in the row, but its own content always starts at the same
	   fixed X position right after Invoice, since every column before it is fixed-width. */
	flex: 1 1 200px;
	display: flex;
	align-items: center;
}

.evo-credit-note-list {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 6px;
}

.evolution-order-credit-memo-link {
	margin: 0;
}

.evolution-order-credit-memo-link--stacked {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 8px;
}

/* ---------- Order confirmation (thank-you) page ----------
   10 September 2026 — Martin flagged this page as needing work: it was pure default WooCommerce
   styling — no card background, a plain unstyled "Thank you" message, and the Order number/Date/
   Email/Total/Payment method row rendering with the browser's own default list styling, no brand
   fonts or colours. The order-details TABLE further down the page was already redesigned (see the
   "Single order-view" section right below this one) since that template partial is shared with My
   Account → View Order — but nothing ever styled the wrapper/heading/overview specific to THIS
   page, since .woocommerce-order only exists here (the <div> checkout/thankyou.php wraps
   everything in) — My Account's equivalent wrapper is .woocommerce-MyAccount-content, a
   completely different element. Matches the same glass-card values used there so both pages read
   as one consistent design rather than two different levels of finish. */
.woocommerce-order {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 32px 28px;
	margin: 32px 0;
}

@media (max-width: 640px) {
	.woocommerce-order {
		padding: 22px 18px;
		margin: 20px 0;
	}
}

/* The "Thank you. Your order has been received." message — was a plain, unstyled paragraph, easy
   to miss as the actual confirmation of a successful order. A small checkmark badge plus a proper
   heading size/weight makes this read as the headline moment it should be. */
.woocommerce-order .woocommerce-thankyou-order-received {
	display: flex;
	align-items: center;
	gap: 12px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 20px;
	color: var(--evo-glass-text);
	margin: 0 0 24px;
	padding: 0 0 24px;
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.woocommerce-order .woocommerce-thankyou-order-received::before {
	content: '\2713';
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	background: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
	font-size: 16px;
	font-weight: 700;
}

/* The failed-payment branch of the same template (order-received.php isn't reached at all in
   this case — thankyou.php shows its own error notice + Pay/My account buttons instead). Given
   the same card/heading treatment as the success message above, just in the site's existing
   error colour rather than invented specially for this one notice. */
.woocommerce-order .woocommerce-thankyou-order-failed {
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-error-red-strong);
	margin: 0 0 20px;
}

.woocommerce-order .woocommerce-thankyou-order-failed-actions {
	margin: 0 0 24px;
}

.woocommerce-order .button {
	display: inline-block;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 10px 22px;
	text-decoration: none;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.woocommerce-order .button + .button {
	margin-left: 10px;
}

.woocommerce-order .button:hover,
.woocommerce-order .button:focus-visible {
	background-color: var(--evo-yorkie);
	color: var(--evo-cloud);
}

/* Order number/Date/Email/Total/Payment method — was WooCommerce's own default list styling
   (browser default font, no colour). Laid out as a row of small labelled stats instead, matching
   the same small-caps label + bold value shape used everywhere else on the site (My Account
   labels, Customer Pricing, Credit Account, etc.). */
.woocommerce-order .woocommerce-order-overview {
	display: flex;
	flex-wrap: wrap;
	gap: 20px 40px;
	list-style: none;
	margin: 0 0 32px;
	padding: 0;
	border: none;
}

.woocommerce-order .woocommerce-order-overview li {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	opacity: 0.65;
	border: none;
	padding: 0;
	margin: 0;
}

.woocommerce-order .woocommerce-order-overview li::before {
	content: none;
}

.woocommerce-order .woocommerce-order-overview li strong {
	display: block;
	margin-top: 4px;
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 15px;
	text-transform: none;
	letter-spacing: normal;
	color: var(--evo-glass-text);
	opacity: 1;
}

@media (max-width: 640px) {
	.woocommerce-order .woocommerce-order-overview {
		gap: 14px 28px;
		margin-bottom: 24px;
	}
}

/* "Order details" heading — same treatment as .woocommerce-MyAccount-content h2 gets on My
   Account's own View Order page, duplicated here rather than combined into one shared selector
   since the two live under two completely different wrapper elements. */
.woocommerce-order .woocommerce-order-details__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	font-size: 17px;
	margin: 0 0 12px;
}

/* ---------- Single order-view: order details table ----------
   20 August 2026 — previously plain default WooCommerce styling: no product image on any line,
   fairly loose default padding/line-height (9px/12px, 1.5em — WooCommerce's own core CSS), and a
   product's name, quantity, and any variation meta all running at the same size with nothing to
   visually anchor each line. Redesigned for a tighter, more deliberate read: a small product
   thumbnail on the left of every line (added via woocommerce/order/order-details-item.php, which
   otherwise duplicates the core template exactly), and a clear size hierarchy — bold product name,
   smaller/muted quantity, smaller/muted variation meta below that. */
/* No dedicated rule needed for .woocommerce-order-details__title (the "Order details" <h2>) — it's
   already covered by the generic .woocommerce-MyAccount-content h2 rule above. */
/* 20 August 2026 — the six added columns (Qty/Unit Ex VAT/VAT/Total Ex VAT/VAT/Total) were left to
   the browser's own auto-sizing, which packs each one only as wide as its own content needs —
   fine for a 2-column table, but with seven columns it left things looking uneven/crowded rather
   than evenly spaced. table-layout: fixed plus an explicit width on the thead cells (which is what
   a fixed-layout table actually uses to lock every column's width, tbody/tfoot included) fixes
   this: Product keeps roughly the width it already had, and the other six now split the remaining
   space evenly between them instead of each grabbing only what its own content needs. */
.woocommerce-table--order-details {
	border-color: var(--evo-glass-border);
	font-family: var(--evo-body-font);
	font-size: 13px;
	table-layout: fixed;
	width: 100%;
}

.woocommerce-table--order-details th.woocommerce-table__product-name {
	width: 34%;
}

.woocommerce-table--order-details th.evo-order-table__cell {
	width: 11%;
}

.woocommerce-table--order-details thead th {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.7;
	background-color: var(--evo-glass-bg);
	padding: 10px 16px;
}

.woocommerce-table--order-details td,
.woocommerce-table--order-details tfoot th {
	border-color: var(--evo-glass-border);
	padding: 10px 16px;
	line-height: 1.4;
	font-size: 13px;
}

/* 20 August 2026 — Subtotal/Shipping/Refund/Total/Payment method previously left-aligned like
   the line items above them, which (since the label sits in the wide "Product" column and the
   value in the much narrower "Total" column) left a big empty gap between the two — label pinned
   to the far left, value off on its own near the right edge. Right-aligning both closes that gap:
   the label now sits right up against its own column's edge, immediately next to the value, the
   two reading as one tight right-hand block the way a printed invoice usually lays out its
   totals, rather than spanning the row edge-to-edge. */
.woocommerce-table--order-details tfoot tr:not(.evo-order-note-row) th,
.woocommerce-table--order-details tfoot tr:not(.evo-order-note-row) td {
	font-family: var(--evo-body-font);
	font-weight: 700;
	text-align: right;
}

/* 20 August 2026 — the totals rows inherited the same 10px vertical padding as the product lines
   above them, which (with seven of them now — Total Ex VAT through Payment method) read as too
   spaced out. Tightened just for tfoot rows; the product lines above keep their own padding. */
.woocommerce-table--order-details tfoot th,
.woocommerce-table--order-details tfoot td {
	padding: 1px 16px;
	line-height: 1.1;
}

/* Trimmed further still: dropping the border between each totals row (kept only above the very
   first one, to separate the whole block from the product lines above it) removes another couple
   of pixels of implied gap per row on top of the padding above. */
.woocommerce-table--order-details tfoot tr:not(:first-child) th,
.woocommerce-table--order-details tfoot tr:not(:first-child) td {
	border-top: none;
}

/* The customer note row (see .evo-order-note-row, added by the theme's own
   woocommerce/order/order-details.php override) is excluded from the right-align above — a block
   of free-text notes reads badly right-aligned, especially once it wraps onto more than one line —
   so it keeps the table's normal left alignment instead. */
.woocommerce-table--order-details tfoot .evo-order-note-row td {
	text-align: left;
	font-weight: 400;
}

.evo-order-item {
	display: flex;
	align-items: center;
	gap: 12px;
}

.evo-order-item__thumb {
	flex: 0 0 auto;
	display: block;
	width: 44px;
	height: 44px;
	border-radius: 8px;
	overflow: hidden;
	background-color: var(--evo-product-image-bg);
	border: 1px solid var(--evo-glass-border);
}

.evo-order-item__thumb img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.evo-order-item__info {
	min-width: 0;
}

.evo-order-item__info a {
	font-weight: 600;
	color: var(--evo-glass-text);
	text-decoration: none;
}

.evo-order-item__info a:hover,
.evo-order-item__info a:focus-visible {
	color: var(--evo-yorkie);
}

.evo-order-item__info .wc-item-meta {
	margin: 4px 0 0;
	padding: 0;
	list-style: none;
	font-size: 11px;
	opacity: 0.65;
}

.evo-order-item__info .wc-item-meta li {
	display: inline;
	margin-right: 8px;
}

/* 20 August 2026 — Qty was previously run inline into the product name ("Product name × 2"); now
   its own column, along with a full per-line VAT breakdown (Unit Cost Ex VAT, VAT per unit, line
   Total Ex VAT, line VAT) ahead of the existing combined line Total. Every one of these — including
   the existing Total column — is right-aligned, matching the same right-aligned treatment given to
   the Subtotal/Total rows below in the table's footer, so every number on the page (per-line and
   totals alike) lines up consistently down the right-hand side rather than some being left-aligned
   and some right. VAT columns are visually de-emphasised (smaller, muted) relative to the two
   headline figures — Total Ex VAT and the complete line Total — since they're supporting detail,
   not what a customer's eye should land on first. */
.woocommerce-table--order-details thead th.evo-order-table__cell,
.woocommerce-table--order-details td.evo-order-table__cell {
	text-align: right;
}

.evo-order-table__cell.evo-order-table__unit-vat,
.evo-order-table__cell.evo-order-table__line-vat {
	font-size: 12px;
	opacity: 0.65;
	font-weight: 400;
}

.evo-order-table__cell.evo-order-table__qty {
	font-weight: 600;
}

/* Hidden by default — only shown at the same width the table below switches to its cut-down
   mobile view, so it's clear on a phone that the extra VAT detail hasn't disappeared, just isn't
   shown on a small screen. See woocommerce/order/order-details.php. */
.evo-order-mobile-note {
	display: none;
}

@media (max-width: 640px) {
	/* 20 August 2026 — a full seven-column, seven-row breakdown has no realistic reading on a
	   phone, so mobile now shows a deliberately reduced view instead of trying to cram everything
	   in: each line item collapses to one tight row (thumbnail, name, qty, total price only — the
	   four VAT/unit-cost columns are hidden outright, not stacked underneath), and the totals
	   section below is cut down to just Total Ex VAT, Total Inc VAT, Shipping Costs, and Payment
	   method. The note above the table (.evo-order-mobile-note) makes clear this is a simplified
	   view rather than the whole thing. */
	.evo-order-mobile-note {
		display: block;
		font-family: var(--evo-body-font);
		font-size: 12px;
		color: var(--evo-glass-text);
		opacity: 0.7;
		margin: 0 0 10px;
	}

	.woocommerce-table--order-details thead {
		display: none;
	}

	.woocommerce-table--order-details,
	.woocommerce-table--order-details tbody {
		display: block;
		width: 100% !important;
	}

	/* Each product line becomes one tight flex row — thumbnail + name grow to fill the space,
	   Qty and the final Total sit fixed-width at the end — rather than every column stacking as
	   its own full-width block line, which is what made this feel like it needed compressing in
	   the first place. */
	.woocommerce-table--order-details tbody tr.order_item {
		display: flex;
		align-items: center;
		gap: 8px;
		width: 100%;
		padding: 8px 0;
	}

	.woocommerce-table--order-details tbody tr.order_item td {
		border-top: none;
		padding: 0;
	}

	.woocommerce-table--order-details td.woocommerce-table__product-name {
		flex: 1 1 auto;
		min-width: 0;
	}

	.evo-order-item {
		gap: 8px;
	}

	.evo-order-item__thumb {
		width: 34px;
		height: 34px;
	}

	.evo-order-item__info a {
		font-size: 13px;
	}

	/* Variation attributes (colour/strength/etc., normally listed under the name) are hidden here
	   too — this store's product titles already spell out strength/flavour themselves (see any
	   product name in the screenshots this was designed against), so keeping just image/title/qty/
	   total per the brief doesn't lose any identifying information. */
	.evo-order-item__info .wc-item-meta {
		display: none;
	}

	/* The four VAT/unit-cost columns (Unit Cost Ex VAT, VAT per unit, line Total Ex VAT, line VAT)
	   have no room on a phone-width row and are supporting detail anyway — the note above the
	   table already says as much, rather than trying to also stack them underneath each line. */
	.woocommerce-table--order-details td.evo-order-table__unit-ex-vat,
	.woocommerce-table--order-details td.evo-order-table__unit-vat,
	.woocommerce-table--order-details td.evo-order-table__line-ex-vat,
	.woocommerce-table--order-details td.evo-order-table__line-vat {
		display: none;
	}

	.woocommerce-table--order-details td.evo-order-table__qty {
		flex: 0 0 auto;
		font-size: 12px;
		opacity: 0.75;
	}

	/* Qty already reads clearly as "×2" without the usual "Qty: " label prefix every other cell
	   gets — one less word on an already tight row. */
	.woocommerce-table--order-details td.evo-order-table__qty::before {
		content: '\00d7\0020';
	}

	.woocommerce-table--order-details td.woocommerce-table__product-total {
		flex: 0 0 auto;
		font-weight: 700;
	}

	/* Totals section — cut down to the four rows asked for (Total Ex VAT, Total Inc VAT, Shipping
	   Costs, Payment method); Total VAT, Shipping VAT, and — on a refunded order — Refunds/Subtotal
	   are hidden here rather than shown, per the same "keep mobile to the essentials" brief as the
	   product lines above. Each remaining row is its own flex line (label left, value right) on
	   one line rather than stacking label-then-value across two, for the tightest possible read. */
	.woocommerce-table--order-details tfoot,
	.woocommerce-table--order-details tfoot tr,
	.woocommerce-table--order-details tfoot th,
	.woocommerce-table--order-details tfoot td {
		display: block;
		width: 100% !important;
	}

	.woocommerce-table--order-details tfoot th,
	.woocommerce-table--order-details tfoot td {
		border-top: none;
		padding: 2px 0;
	}

	/* Only the four rows kept on mobile (Total Ex VAT/Total Inc VAT/Shipping Costs/Payment method)
	   get the compact "label ................ value" single-line treatment — the Note and Actions
	   rows (free text / buttons) stay block-stacked, same as they'd naturally read on their own. */
	.woocommerce-table--order-details tfoot tr.evo-order-total-ex-vat-row,
	.woocommerce-table--order-details tfoot tr.evo-order-shipping-cost-row,
	.woocommerce-table--order-details tfoot tr.evo-order-total-inc-vat-row,
	.woocommerce-table--order-details tfoot tr.evo-order-payment-method-row {
		display: flex;
		justify-content: space-between;
		align-items: baseline;
		width: 100%;
	}

	.woocommerce-table--order-details tfoot tr.evo-order-total-ex-vat-row th,
	.woocommerce-table--order-details tfoot tr.evo-order-total-ex-vat-row td,
	.woocommerce-table--order-details tfoot tr.evo-order-shipping-cost-row th,
	.woocommerce-table--order-details tfoot tr.evo-order-shipping-cost-row td,
	.woocommerce-table--order-details tfoot tr.evo-order-total-inc-vat-row th,
	.woocommerce-table--order-details tfoot tr.evo-order-total-inc-vat-row td,
	.woocommerce-table--order-details tfoot tr.evo-order-payment-method-row th,
	.woocommerce-table--order-details tfoot tr.evo-order-payment-method-row td {
		display: inline;
		width: auto !important;
		padding: 0;
	}

	.woocommerce-table--order-details tfoot .evo-order-total-vat-row,
	.woocommerce-table--order-details tfoot .evo-order-shipping-vat-row,
	.woocommerce-table--order-details tfoot .evo-order-refunds-row,
	.woocommerce-table--order-details tfoot .evo-order-net-subtotal-row {
		display: none;
	}
}

/* ---------- Order-view actions bar (Order Again / Download Invoice / Credit Note(s)) ----------
   20 August 2026 — these three previously printed as separate <p> elements straight onto the
   page (Order Again is WooCommerce core; the other two are inc/invoicing.php and
   inc/credit-memos.php, all three hooked onto woocommerce_order_details_after_order_table), each
   getting its own default <p> top/bottom margin — the combined effect read as a long, loosely
   spaced list of buttons rather than one coherent set of actions. A wrapper is now printed around
   all three (see evolution_vaping_open/close_order_actions_bar() in inc/invoicing.php) purely so
   this can turn them into one flex row that wraps tidily on narrow screens — the buttons
   themselves are untouched, already using the same solid pill style as everywhere else in My
   Account (see .woocommerce-account .button above). */
.evo-order-actions-bar {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: 12px;
	margin-top: 20px;
}

.evo-order-actions-bar > .woocommerce-order-again,
.evo-order-actions-bar > .evolution-order-invoice-link,
.evo-order-actions-bar > .evolution-order-credit-memo-link {
	margin: 0;
}

/* ---------- B2B "Downloads" card (Download Invoice / Credit Note / Media Files) ----------
   20 August 2026 — a separate, B2B-only card underneath the actions bar above (see
   inc/order-downloads.php) — deliberately its own boxed section rather than folded into that bar,
   since it's meant to read as a short, fixed list of exactly three download options rather than
   growing with however many refunds an order's had, the way the Credit Note button(s) in the
   actions bar above can. */
.evo-order-downloads {
	margin-top: 20px;
	padding: 20px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
}

.evo-order-downloads__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	font-size: 15px;
	margin: 0 0 14px;
}

.evo-order-downloads__list {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

.evo-order-downloads__link {
	display: inline-block;
	-webkit-appearance: none;
	appearance: none;
	padding: 10px 20px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	text-decoration: none;
	white-space: nowrap;
	/* -webkit-appearance/appearance: none above resets the browser's own default <button> chrome
	   (background/border) since the credit-note picker trigger is a real <button> element, not an
	   <a> — without it some browsers render their own button face underneath/instead of the
	   background-color set below. !important (20 August 2026) — see the matching note on .evo-orders-table__invoice-link
	   further up; this is a <button> in one case (the credit-note picker trigger) and an <a> in
	   the other two (Invoice / Media Files), and the generic MyAccount link-color rule only
	   targets "a", so without !important the two anchor versions render with invisible
	   purple-on-purple text while the button version looks fine — same underlying trap, now
	   closed for good rather than patched with another exclusion-list entry. */
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	cursor: pointer;
	transition: background-color 0.15s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.evo-order-downloads__link:hover,
.evo-order-downloads__link:focus-visible {
	background-color: var(--evo-yorkie);
	color: var(--evo-cloud) !important;
	box-shadow: var(--evo-glass-glow);
	transform: translateY(-2px);
}

/* ---------- "Downloadable Content" product tab (B2B only) ----------
   8 September 2026 — see inc/product-downloads.php. Reuses the same pill-link visual language as
   the order-page Downloads card above (.evo-order-downloads__link), just laid out as a simple
   list rather than a flex row, since this tab only ever has exactly two links. */
.evo-downloadable-content__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

.evo-downloadable-content__link {
	display: inline-block;
	padding: 10px 20px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	text-decoration: none;
	white-space: nowrap;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	transition: background-color 0.15s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.evo-downloadable-content__link:hover,
.evo-downloadable-content__link:focus-visible {
	background-color: var(--evo-yorkie);
	color: var(--evo-cloud) !important;
	box-shadow: var(--evo-glass-glow);
	transform: translateY(-2px);
}

/* "Check stock in store" trigger + popup (inc/lightspeed-stock-check.php) — added 8 September
   2026. B2C/guest only; sits right next to the existing .evo-variation-stock-badge for variable
   products (same anchor point, see assets/js/lightspeed-stock-check.js), or just under Add to Cart
   for simple products. Same show/hide-via-.is-open, backdrop + centred glass panel pattern as
   .evo-credit-note-picker/.evo-quick-shop-modal elsewhere on the site. */
.evo-stock-check-trigger {
	display: none; /* Shown via JS once a variation is selected (variable products), or always-on inline for simple products via the --simple modifier below. */
	margin-left: 10px;
	font-size: 13px;
	font-weight: 600;
	text-decoration: underline;
	cursor: pointer;
	white-space: nowrap;
	color: var(--evo-quality-sneaks);
}

.evo-stock-check-trigger--simple {
	display: inline-block;
	margin-left: 0;
	margin-top: 10px;
}

.evo-stock-check-modal {
	position: fixed;
	inset: 0;
	/* Needs to sit above the mobile "product hero" bottom sheet (.evo-product-hero-sheet,
	   z-index: 10050) it's triggered from — 700 (the site's usual modal z-index) rendered
	   correctly underneath it, invisible, on mobile. Also clears the joke Calculator/Share sheet
	   (9200/9300) for the same reason, since either could be open at the same time in theory. */
	z-index: 10100;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 20px;
	visibility: hidden;
	opacity: 0;
	transition: opacity 0.2s ease, visibility 0s linear 0.2s;
}

.evo-stock-check-modal.is-open {
	visibility: visible;
	opacity: 1;
	transition: opacity 0.2s ease;
}

.evo-stock-check__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(10, 8, 16, 0.6);
	-webkit-backdrop-filter: blur(4px);
	backdrop-filter: blur(4px);
}

.evo-stock-check__box {
	position: relative;
	width: 100%;
	max-width: 380px;
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	padding: 28px;
	color: var(--evo-glass-text);
	transform: scale(0.9);
	transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.evo-stock-check-modal.is-open .evo-stock-check__box {
	transform: scale(1);
}

.evo-stock-check__close {
	position: absolute;
	top: 12px;
	right: 12px;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	border: 1px solid var(--evo-glass-border);
	background-color: var(--evo-glass-bg);
	color: var(--evo-glass-text) !important;
	cursor: pointer;
	font-size: 18px;
	line-height: 1;
	padding: 0;
}

.evo-stock-check__close:hover,
.evo-stock-check__close:focus-visible {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud) !important;
}

.evo-stock-check__box h3 {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 15px;
	margin: 0 0 16px;
	color: var(--evo-quality-sneaks);
}

.evo-stock-check__box label {
	display: block;
	font-size: 13px;
	font-weight: 600;
	margin-bottom: 6px;
}

.evo-stock-check__box select {
	width: 100%;
	background-color: var(--evo-glass-input-bg);
	border: 1px solid var(--evo-glass-border);
	color: var(--evo-glass-text);
	padding: 10px 12px;
	margin-bottom: 16px;
}

/* Same fix as .evo-shop-filters__form select above — the native option-list popup needs an
   explicit solid background/text colour or it renders unreadable (light-on-light) in dark
   mode in some browsers, since it's not part of the page's own glass compositing. */
.evo-stock-check__box select option {
	background-color: var(--evo-glass-bg-solid);
	color: var(--evo-glass-text);
}

.evo-stock-check__result {
	min-height: 24px;
}

.evo-stock-check__result p {
	margin: 0;
	font-weight: 600;
}

.evo-stock-check__loading {
	opacity: 0.7;
	font-weight: 400 !important;
}

.evo-stock-check__in-stock {
	color: #1a7f37;
}

[data-evo-theme='dark'] .evo-stock-check__in-stock {
	color: #4caf50;
}

.evo-stock-check__out-of-stock,
.evo-stock-check__error {
	color: var(--evo-error-red);
}

.evo-stock-check__unknown {
	font-weight: 400 !important;
	opacity: 0.8;
}

.evo-stock-check__disclaimer {
	margin: 16px 0 0;
	font-size: 12px;
	opacity: 0.7;
}

body.evo-stock-check-open {
	overflow: hidden;
}

/* Same 767px breakpoint used site-wide for the product page (e.g. the sticky Add to Cart bar) —
   a smaller trigger link, and the popup itself drops to the bottom of the screen as a sheet rather
   than a centred card, so it can never overlap that sticky bar or feel cramped on a small screen. */
@media (max-width: 767px) {
	.evo-stock-check-trigger {
		font-size: 12px;
	}

	.evo-stock-check-modal {
		align-items: flex-end;
		padding: 0;
	}

	.evo-stock-check__box {
		max-width: none;
		width: 100%;
		border-radius: 16px 16px 0 0;
		padding: 24px 20px calc(24px + env(safe-area-inset-bottom, 0px));
	}
}

/* Credit-note picker popup — only actually printed in the page when an order has more than one
   credit note (see inc/order-downloads.php); same show/hide-via-.is-open, backdrop + centred
   panel pattern as .evo-quick-shop-modal elsewhere on the site, just a plain list of links rather
   than a product form. */
.evo-credit-note-picker {
	position: fixed;
	inset: 0;
	z-index: 700;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 20px;
	visibility: hidden;
	opacity: 0;
	transition: opacity 0.2s ease, visibility 0s linear 0.2s;
}

.evo-credit-note-picker.is-open {
	visibility: visible;
	opacity: 1;
	transition: opacity 0.2s ease;
}

.evo-credit-note-picker__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(10, 8, 16, 0.6);
	-webkit-backdrop-filter: blur(4px);
	backdrop-filter: blur(4px);
}

.evo-credit-note-picker__panel {
	position: relative;
	width: 100%;
	max-width: 360px;
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	padding: 28px;
	color: var(--evo-glass-text);
	transform: scale(0.9);
	transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.evo-credit-note-picker.is-open .evo-credit-note-picker__panel {
	transform: scale(1);
}

.evo-credit-note-picker__close {
	position: absolute;
	top: 12px;
	right: 12px;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	border: 1px solid var(--evo-glass-border);
	background-color: var(--evo-glass-bg);
	color: var(--evo-glass-text) !important;
	cursor: pointer;
	font-size: 18px;
	line-height: 1;
	padding: 0;
}

.evo-credit-note-picker__close:hover,
.evo-credit-note-picker__close:focus-visible {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud) !important;
}

.evo-credit-note-picker__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 15px;
	margin: 0 0 16px;
	color: var(--evo-quality-sneaks);
}

.evo-credit-note-picker__list {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 10px;
}

@media (max-width: 480px) {
	.evo-order-downloads {
		padding: 16px;
	}

	.evo-order-downloads__link {
		flex: 1 1 100%;
		text-align: center;
	}
}

.evo-order-status-badge {
	display: inline-block;
	padding: 5px 14px;
	border-radius: 999px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	white-space: nowrap;
	color: var(--evo-glass-text);
	background: var(--evo-glass-input-bg);
	border: 1px solid var(--evo-glass-border);
}

.evo-order-status-badge--completed {
	color: var(--evo-quality-sneaks);
	border-color: var(--evo-quality-sneaks);
}

.evo-order-status-badge--processing {
	color: var(--evo-orange-ya-glad);
	border-color: var(--evo-orange-ya-glad);
}

.evo-order-status-badge--on-hold,
.evo-order-status-badge--pending {
	color: var(--evo-builders-brew);
	border-color: var(--evo-builders-brew);
}

.evo-order-status-badge--cancelled,
.evo-order-status-badge--failed,
.evo-order-status-badge--refunded {
	color: var(--evo-error-red);
	border-color: var(--evo-error-red);
}


@media (max-width: 640px) {
	.evo-orders-table__row--head {
		display: none;
	}

	.evo-orders-table__row {
		flex-wrap: wrap;
		gap: 4px 20px;
		padding: 16px 18px;
	}

	.evo-orders-table__row-link {
		flex-wrap: wrap;
		gap: 4px 20px;
	}

	.evo-orders-table__cell {
		flex-basis: 100%;
	}

	.evo-orders-table__cell--invoice {
		flex-basis: 100%;
		margin-top: 6px;
	}

	.evo-orders-table__invoice-link {
		display: block;
		text-align: center;
	}

	.evo-orders-table__cell--credit-note {
		/* Overrides the desktop display: flex; align-items: center (see the base rule further up)
		   which put the "Credit Note" label as a side-by-side flex item next to the buttons rather
		   than stacked above them like Invoice's label — plain block display here lets the shared
		   .evo-orders-table__cell::before label rule (further down) stack above normally, and lets
		   its child (the single link, or .evo-credit-note-list's stack of them) become a real
		   block-level child that can actually stretch to the cell's full width below, rather than
		   being sized to its own content as a flex item. */
		display: block;
		flex-basis: 100%;
		margin-top: 6px;
	}

	.evo-orders-table__cell--credit-note > .evo-orders-table__invoice-link {
		display: block;
		width: 100%;
		box-sizing: border-box;
		text-align: center;
	}

	.evo-credit-note-list {
		align-items: stretch;
	}

	.evo-credit-note-list .evo-orders-table__invoice-link {
		display: block;
		text-align: center;
	}

	.evo-orders-table__cell::before {
		content: attr(data-label);
		display: block;
		font-family: var(--evo-subtitle-font);
		font-weight: 700;
		font-size: 10px;
		text-transform: uppercase;
		letter-spacing: 0.04em;
		color: var(--evo-glass-text);
		opacity: 0.6;
		margin-bottom: 2px;
	}
}

/* ---------- My Account: Price Requests ----------
   Same div-based row/card pattern as My Orders above (see evolution_vaping_render_price_requests_
   account_content() in inc/price-requests.php) — a normal columned row on desktop, restyled on
   mobile (19 August 2026) into a deliberately compact stacked card: the product name on its own
   line, then You Requested/Date/Status/Notes each as one small "Label: value" line underneath,
   since a customer could have quite a few of these to scroll through on one screen. */
.evo-price-requests-table {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.evo-price-requests-table__row--head {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 0 20px 4px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

.evo-price-requests-table__row {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 16px 20px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	font-family: var(--evo-body-font);
	font-size: 14px;
}

.evo-price-requests-table__cell--product {
	flex: 1 1 200px;
	min-width: 0;
}

.evo-price-requests-table__cell--requested {
	flex: 0 0 110px;
	font-weight: 600;
}

.evo-price-requests-table__cell--accepted-price {
	flex: 0 0 120px;
	font-weight: 600;
	color: var(--evo-quality-sneaks);
}

.evo-price-requests-table__cell--date {
	flex: 0 0 110px;
}

.evo-price-requests-table__cell--status {
	flex: 0 0 100px;
}

.evo-price-requests-table__cell--notes {
	flex: 1 1 160px;
	min-width: 0;
}

.evolution-price-request-status {
	font-weight: 700;
}

.evolution-price-request-status--pending {
	color: #a67c00;
}

.evolution-price-request-status--accepted {
	color: #2a8a3d;
}

.evolution-price-request-status--denied {
	color: #a33;
}

@media (max-width: 640px) {
	.evo-price-requests-table__row--head {
		display: none;
	}

	/* Compact card: small padding/gap throughout (this is the "pretty small" bit — there can be
	   several of these on one account, so it's deliberately tighter than the My Orders cards). */
	.evo-price-requests-table__row {
		flex-direction: column;
		align-items: stretch;
		gap: 2px;
		padding: 10px 14px;
	}

	/* The real bug behind the huge gaps: each cell still carried its desktop flex: 1 1 200px /
	   flex: 0 0 110px etc. (see the un-prefixed --product/--requested/--date/--status/--notes
	   rules above), where that flex-basis controls WIDTH in a row. The row above just switched to
	   flex-direction: column, and on a column-direction flex item, that exact same flex-basis
	   controls HEIGHT instead — so every cell was being forced to a minimum height of 100-200px,
	   which is the whitespace that showed up. Resetting flex to none here (same specificity as
	   those rules, but later in the file so it wins) lets every cell size to its own actual
	   content height instead. */
	.evo-price-requests-table__cell {
		flex: none;
		font-size: 12px;
		line-height: 1.5;
	}

	/* Product title reads as the card's heading — bigger/bolder than the rest, and, unlike every
	   other cell below, no "Label:" prefix in front of it (handled by the ::before rule further
	   down excluding this one cell specifically). */
	.evo-price-requests-table__cell--product {
		font-size: 13px;
		font-weight: 700;
		color: var(--evo-quality-sneaks);
		margin-bottom: 2px;
	}

	.evo-price-requests-table__cell--product small {
		display: block;
		font-size: 11px;
		font-weight: 400;
		color: var(--evo-glass-text);
		opacity: 0.75;
	}

	/* Everything except the product title renders as one small "Label: value" line — an inline
	   prefix rather than My Orders' own stacked label-above-value treatment, to keep each row as
	   short/scannable as possible. */
	.evo-price-requests-table__cell:not(.evo-price-requests-table__cell--product)::before {
		content: attr(data-label) ": ";
		font-weight: 700;
		opacity: 0.65;
	}
}

/* ---------- Sales Rep Portal (My Account, staff-only) ----------
   Previously plain unstyled HTML (a bare <table>, default inputs, a hardcoded green "Log in as"
   link) injected via its own inline <style> block in inc/sales-rep-portal.php rather than living
   here with the rest of the design system — moved here and redesigned to match the same pill
   inputs (.evo-quick-order__search-field) and glass-card table rows (.evo-orders-table) used
   everywhere else in My Account, 20 August 2026. */
.evo-sales-rep-portal__intro {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	opacity: 0.85;
	margin: 0 0 20px;
	max-width: 640px;
}

.evo-sales-rep-portal__search {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	gap: 12px;
	margin: 0 0 24px;
}

.evo-sales-rep-portal__search-field {
	display: flex;
	flex-direction: column;
	gap: 6px;
	flex: 1 1 260px;
}

.evo-sales-rep-portal__group-field {
	display: flex;
	flex-direction: column;
	gap: 6px;
	flex: 0 1 200px;
}

.evo-sales-rep-portal__search-label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.evo-sales-rep-portal__search-field input,
.evo-sales-rep-portal__group-field select {
	font-family: var(--evo-body-font);
	font-size: 15px;
	padding: 10px 16px;
	border-radius: 999px;
	border: 1.5px solid var(--evo-glass-border);
	background-color: var(--evo-glass-input-bg);
	color: var(--evo-glass-text);
	width: 100%;
	box-sizing: border-box;
}

.evo-sales-rep-portal__search-field input:focus,
.evo-sales-rep-portal__group-field select:focus {
	outline: none;
	border-color: var(--evo-yorkie);
}

/* Native option-list popup needs an explicit solid background/text colour or it renders
   unreadable (dark-on-dark) in dark mode — same fix as every other <select> on the site. */
.evo-sales-rep-portal__group-field select option {
	background-color: var(--evo-glass-bg-solid);
	color: var(--evo-glass-text);
}

.evo-sales-rep-portal__search-submit {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 12px 26px;
	cursor: pointer;
	white-space: nowrap;
	transition: background-color 0.15s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.evo-sales-rep-portal__search-submit:hover,
.evo-sales-rep-portal__search-submit:focus-visible {
	background-color: var(--evo-yorkie);
	box-shadow: var(--evo-glass-glow);
	transform: translateY(-2px);
}

.evo-sales-rep-portal__empty {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
	opacity: 0.75;
}

/* Same glass-card row treatment as .evo-orders-table / .evo-price-requests-table. */
.evo-sales-rep-portal-table {
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.evo-sales-rep-portal-table__row--head {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 0 20px 4px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

.evo-sales-rep-portal-table__row {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 10px 20px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}

.evo-sales-rep-portal-table__row:not(.evo-sales-rep-portal-table__row--head):hover {
	transform: translateY(-2px);
	box-shadow: var(--evo-glass-glow);
	border-color: var(--evo-yorkie);
}

.evo-sales-rep-portal-table__cell {
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
}

.evo-sales-rep-portal-table__cell--business {
	flex: 1 1 200px;
	font-weight: 700;
}

.evo-sales-rep-portal-table__cell--contact {
	flex: 1 1 260px;
	line-height: 1.35;
}

.evo-sales-rep-portal-table__email {
	display: block;
	font-size: 12px;
	opacity: 0.7;
}

.evo-sales-rep-portal-table__cell--group {
	flex: 0 0 120px;
}

.evo-sales-rep-portal-table__cell--credit {
	flex: 0 0 140px;
	font-size: 13px;
}

.evo-sales-rep-portal-table__cell--action {
	flex: 0 0 110px;
	text-align: right;
}

.evo-sales-rep-portal-badge {
	display: inline-block;
	padding: 4px 12px;
	border-radius: 999px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	background-color: var(--evo-glass-input-bg);
	border: 1px solid var(--evo-glass-border);
	color: var(--evo-glass-text);
}

.evo-sales-rep-portal-badge--stop {
	background-color: #b32d2e;
	border-color: #b32d2e;
	color: #fff;
}

.evo-sales-rep-portal__switch {
	display: inline-block;
	padding: 6px 16px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	text-decoration: none;
	white-space: nowrap;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	transition: background-color 0.15s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.evo-sales-rep-portal__switch:hover,
.evo-sales-rep-portal__switch:focus-visible {
	background-color: var(--evo-yorkie);
	box-shadow: var(--evo-glass-glow);
	transform: translateY(-2px);
}

.evo-sales-rep-portal__pagination {
	margin-top: 20px;
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}

.evo-sales-rep-portal__page-link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 36px;
	height: 36px;
	padding: 0 10px;
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-decoration: none;
	color: var(--evo-glass-text);
	transition: border-color 0.15s ease, background-color 0.15s ease, color 0.15s ease;
}

.evo-sales-rep-portal__page-link:hover {
	border-color: var(--evo-yorkie);
}

.evo-sales-rep-portal__page-link.is-current {
	background-color: var(--evo-quality-sneaks);
	border-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

@media (max-width: 640px) {
	.evo-sales-rep-portal-table__row--head {
		display: none;
	}

	.evo-sales-rep-portal-table__row {
		flex-direction: column;
		align-items: stretch;
		gap: 8px;
	}

	.evo-sales-rep-portal-table__cell {
		flex: none;
	}

	.evo-sales-rep-portal-table__cell--action {
		text-align: left;
	}

	.evo-sales-rep-portal-table__cell[data-label]:not([data-label=""])::before {
		content: attr(data-label) ": ";
		display: block;
		font-family: var(--evo-subtitle-font);
		font-weight: 700;
		font-size: 10px;
		text-transform: uppercase;
		letter-spacing: 0.04em;
		opacity: 0.6;
		margin-bottom: 2px;
	}
}

/* ---------- Account Management (Your Details / Close Your Account / Need Help) ---------- */
.evo-account-management__section {
	margin-bottom: 36px;
	padding-bottom: 36px;
	border-bottom: 1px solid var(--evo-glass-border);
}

.evo-account-management__section:last-child {
	margin-bottom: 0;
	padding-bottom: 0;
	border-bottom: none;
}

.evo-account-management__heading {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	font-size: 17px;
	margin: 0 0 10px;
}

.evo-account-management__intro {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	margin: 0 0 18px;
}

.evo-account-management__closure-button {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-error-red);
	border: none;
	border-radius: 999px;
	padding: 12px 24px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-account-management__closure-button:hover {
	background-color: var(--evo-error-red-strong);
}

.evo-account-management__success {
	font-family: var(--evo-body-font);
	font-size: 14px;
	font-weight: 600;
	color: var(--evo-quality-sneaks);
	margin: 0;
}

/* ---------- Checkout: "use a different saved address" picker ---------- */

.evo-checkout-saved-addresses {
	margin-bottom: 20px;
}

.evo-checkout-saved-addresses__toggle {
	background: none;
	border: none;
	padding: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
	cursor: pointer;
}

.evo-checkout-saved-addresses__toggle:hover {
	color: var(--evo-yorkie);
}

.evo-checkout-saved-addresses__list {
	display: none;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 14px;
}

.evo-checkout-saved-addresses__option {
	display: flex;
	flex-direction: column;
	gap: 4px;
	text-align: left;
	max-width: 260px;
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 14px 18px;
	cursor: pointer;
	transition: border-color 0.15s ease;
}

.evo-checkout-saved-addresses__option:hover,
.evo-checkout-saved-addresses__option:focus-visible {
	border-color: var(--evo-quality-sneaks);
}

.evo-checkout-saved-addresses__option.is-default {
	border-color: var(--evo-quality-sneaks);
}

.evo-checkout-saved-addresses__option-name {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var(--evo-glass-text);
}

.evo-checkout-saved-addresses__option-address {
	font-family: var(--evo-body-font);
	font-size: 13px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	opacity: 0.8;
}

/* ---------- Quick Order page (search/browse + staged order, trade customers only) ---------- */
/* The old homepage banner button (.evo-quick-order-banner) was removed — Quick Order now lives
   as a normal nav link in the header (see header.php), styled the same as Shop/Wholesale/About
   rather than as its own standalone button. */

/* Same 1500px width used site-wide (see .site-content) so this lines up with every other page
   instead of using its own separate (narrower) width. */
.evo-quick-order {
	max-width: none;
	margin: 0 auto;
	padding: 32px 28px 60px;
}

@media (max-width: 960px) {
	.evo-quick-order {
		padding-left: 18px;
		padding-right: 18px;
	}
}

.evo-quick-order__denied {
	max-width: 640px;
	margin: 60px auto;
	padding: 0 20px;
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 15px;
	color: var(--evo-glass-text);
}

.evo-quick-order .header {
	text-align: center;
	margin-top: 12px;
	margin-bottom: 12px;
}

.evo-quick-order .entry-title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0;
}

.evo-quick-order__intro {
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	margin-bottom: 24px;
}

.evo-quick-order__controls {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	gap: 20px;
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	padding: 20px 24px;
	margin-bottom: 28px;
}

/* Mobile-only toggle bar — hidden on desktop, where the search/category controls are always
   visible. Same "Filters" collapse pattern as the product category sidebar. */
.evo-quick-order__filters-toggle {
	display: none;
	width: 100%;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 14px 20px;
	margin-bottom: 16px;
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	cursor: pointer;
}

.evo-quick-order__filters-toggle svg {
	transition: transform 0.2s ease;
	flex-shrink: 0;
}

.evo-quick-order__filters-toggle[aria-expanded='true'] svg {
	transform: rotate(180deg);
}

.evo-quick-order__search-field,
.evo-quick-order__category-field,
.evo-quick-order__brand-field {
	display: flex;
	flex-direction: column;
	gap: 6px;
	flex: 1 1 260px;
}

.evo-quick-order__search-field label,
.evo-quick-order__category-field label,
.evo-quick-order__brand-field label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.evo-quick-order__search-field input,
.evo-quick-order__category-field select,
.evo-quick-order__brand-field select {
	font-family: var(--evo-body-font);
	font-size: 15px;
	padding: 10px 14px;
	border-radius: 999px;
	border: 1.5px solid var(--evo-glass-border);
	background-color: var(--evo-glass-input-bg);
	color: var(--evo-glass-text);
}

/* Native option-list popup needs an explicit solid background/text colour — same fix as the
   product variation select and the shop/category filter selects — or it renders unreadable
   (dark-on-dark) in dark mode, since it's not part of the page's own glass compositing. */
.evo-quick-order__category-field select option,
.evo-quick-order__brand-field select option {
	background-color: var(--evo-glass-bg-solid);
	color: var(--evo-glass-text);
}

/* Small outlined pill — same treatment as .evo-category-toolbar__clear-btn (the category-page
   "Clear Filters" button) but sized down, since this sits inline with the search/category/brand
   fields rather than as its own toolbar row. */
.evo-quick-order__reset-btn {
	display: inline-flex;
	align-items: center;
	flex-shrink: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	background-color: transparent;
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 10px 18px;
	cursor: pointer;
	transition: border-color 0.2s ease, transform 0.2s ease;
}

.evo-quick-order__reset-btn:hover,
.evo-quick-order__reset-btn:focus-visible {
	border-color: var(--evo-quality-sneaks);
	transform: translateY(-1px);
}

.evo-quick-order__layout {
	display: grid;
	/* Single column — the "Your Order" staging panel is disabled/hidden below (redundant now
	   that "Add" goes straight to the real cart, and the Horizon side cart already covers
	   reviewing what's in there), so the results grid gets the full width on every screen size. */
	grid-template-columns: minmax(0, 1fr);
	gap: 28px;
	align-items: start;
}

.evo-quick-order__results,
.evo-quick-order__summary {
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	padding: 20px;
}

/* Disabled/hidden for now — every "Add" click goes straight to the real cart (see the JS below
   and evo_quick_order_ajax_add_direct() in functions.php) rather than staging into this panel
   first, since the Horizon side cart already gives a full, editable view of what's in the cart.
   The markup/AJAX endpoints behind it (evo_quick_order_ajax_add/update/remove/push_to_cart in
   functions.php) are left in place, just unused, in case this comes back later. */
.evo-quick-order__summary {
	display: none;
}

.evo-quick-order__summary h2 {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
	margin: 0 0 16px;
}

.evo-quick-order__placeholder,
.evo-quick-order__empty {
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	opacity: 0.8;
	text-align: center;
	padding: 24px 8px;
	margin: 0;
}

.evo-quick-order-summary__table {
	width: 100%;
	border-collapse: collapse;
}

.evo-quick-order-summary__table th {
	text-align: left;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	padding: 0 8px 10px;
}

.evo-quick-order-summary__table td {
	padding: 10px 8px;
	border-top: 1px solid var(--evo-glass-border);
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	vertical-align: middle;
}

/* Results list — replaced the old flat <table> (11 August 2026): a simple product, or a variable
   product with only one purchasable variation, is a single "row"; a variable product with 2+
   variations becomes a collapsible "group" instead (native <details>/<summary>, no JS needed to
   expand/collapse — same pattern as .evo-description-accordion elsewhere in this file), so the
   parent product's name isn't repeated on every single line any more. .evo-quick-order__row is
   used both for a standalone product and for each variation nested inside an expanded group —
   this exact class name is also what page-quick-order.php's Add-button click handler looks for
   via .closest(), so don't rename it without updating that too. */
.evo-quick-order__list {
	display: flex;
	flex-direction: column;
	gap: 4px;
}

/* Same column widths reused across the header, every group's summary line, and every row, purely
   so they all line up — this isn't a shared CSS Grid container (a group's rows live one DOM level
   deeper, inside <details>), just three separate grids with identical track sizes. */
.evo-quick-order__header-row,
.evo-quick-order__group-summary,
.evo-quick-order__row {
	display: grid;
	grid-template-columns: 56px 1fr 110px 110px 130px 150px 90px;
	align-items: center;
	gap: 10px;
}

.evo-quick-order__header-row {
	padding: 0 8px 10px;
}

.evo-quick-order__header-row .evo-quick-order__col {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.evo-quick-order__row {
	padding: 10px 8px;
	border-top: 1px solid var(--evo-glass-border);
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
}

.evo-quick-order__group {
	border-top: 1px solid var(--evo-glass-border);
}

/* Zebra striping so a long list of products doesn't blur into one continuous block — every other
   top-level entry (a standalone row, or a whole collapsible group including its expanded
   contents) gets a faint tint. Targets direct children of .evo-quick-order__list only, by
   position rather than type, so a mix of rows and groups still alternates correctly regardless of
   which is which; variation rows nested inside an open group are unaffected (they're not direct
   children of .list, and already have their own --evo-glass-bg-strong "recessed" background to
   read as nested). Uses the same theme-aware variable everything else on this page uses, so the
   stripe is a light tint in light mode and a dark tint in dark mode automatically — no separate
   dark-mode override needed. */
.evo-quick-order__list > .evo-quick-order__row:nth-child(even),
.evo-quick-order__list > .evo-quick-order__group:nth-child(even) {
	background-color: var(--evo-glass-bg);
}

/* --evo-glass-bg is white-on-white in light mode (rgba(255,255,255,0.55)), which reads fine
   against dark mode's near-black page but is invisible against light mode's white one. Overriding
   with a dark, low-opacity tint here instead — same rgb as --evo-defeater/--evo-glass-border in
   light mode, just a touch stronger than the border's 0.1 so the stripe is actually visible. */
[data-evo-theme='light'] .evo-quick-order__list > .evo-quick-order__row:nth-child(even),
[data-evo-theme='light'] .evo-quick-order__list > .evo-quick-order__group:nth-child(even) {
	background-color: rgba(25, 24, 22, 0.08);
}

.evo-quick-order__group-summary {
	padding: 10px 8px;
	cursor: pointer;
	list-style: none;
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
}

.evo-quick-order__group-summary::-webkit-details-marker {
	display: none;
}

/* Each variation's row, nested inside the expanded group body — no background of its own any
   more, so the zebra colour set on the parent .evo-quick-order__group (above) shows straight
   through and every row inside a "grey" group reads as the same grey as its own summary line,
   rather than a separate shade. The first row still skips its own top border since the group
   header above already has one. */
.evo-quick-order__group-body .evo-quick-order__row:first-child {
	border-top: none;
}

.evo-quick-order__group--none-in-stock .evo-quick-order__group-name,
.evo-quick-order__group--none-in-stock .evo-quick-order__group-meta {
	opacity: 0.6;
}

.evo-quick-order__group-name {
	display: block;
	font-weight: 600;
}

.evo-quick-order__group-meta {
	display: block;
	font-size: 12px;
	opacity: 0.75;
	margin-top: 2px;
}

.evo-quick-order__row-option {
	font-weight: 500;
}

/* Same chevron treatment as .evo-description-accordion__icon elsewhere in this file — reused
   rather than redrawn, so every collapsible section on the site rotates the same way. */
.evo-quick-order__group-chevron {
	display: inline-block;
	width: 16px;
	height: 16px;
	background-color: currentColor;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	transition: transform 0.2s ease;
}

.evo-quick-order__group[open] .evo-quick-order__group-chevron {
	transform: rotate(180deg);
}

.evo-quick-order__col--price {
	font-family: var(--evo-subtitle-font);
	font-weight: 800;
	font-size: 17px;
	color: var(--evo-quality-sneaks);
}

.evo-quick-order__col--sku {
	font-family: var(--evo-subtitle-font);
	font-size: 12px;
	opacity: 0.75;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.evo-quick-order__col--action {
	text-align: right;
}

.evo-quick-order__thumb img {
	width: 44px;
	height: 44px;
	object-fit: cover;
	background-color: var(--evo-product-image-bg);
	border-radius: 0;
	display: block;
}

.evo-quick-order__name a {
	color: var(--evo-glass-text);
	text-decoration: none;
	font-weight: 600;
}

.evo-quick-order__name a:hover {
	color: var(--evo-quality-sneaks);
}

/* .evo-quick-order__qty-input itself is now styled by the shared product-page stepper rules
   above (.evo-quick-order__quantity .qty) — this flat-box style is only still used by the
   staged-order summary panel's qty input, which is currently hidden (see .evo-quick-order__summary
   above) but left styled in case that panel comes back. */
.evo-quick-order-summary__qty {
	width: 64px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	padding: 6px 8px;
	border-radius: 0;
	border: 1.5px solid var(--evo-glass-border);
	text-align: center;
}

.evo-quick-order__add-btn,
.evo-quick-order-summary__push {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 8px 18px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-quick-order-summary__push {
	width: 100%;
	margin-top: 16px;
	padding: 12px 18px;
	font-size: 13px;
}

.evo-quick-order__add-btn:hover,
.evo-quick-order__add-btn:focus-visible,
.evo-quick-order-summary__push:hover,
.evo-quick-order-summary__push:focus-visible {
	background-color: var(--evo-yorkie);
}

.evo-quick-order__add-btn:disabled,
.evo-quick-order-summary__push:disabled {
	opacity: 0.6;
	cursor: default;
}

.evo-quick-order__out-of-stock {
	font-family: var(--evo-body-font);
	font-size: 12px;
	color: var(--evo-glass-text);
	opacity: 0.6;
	font-style: italic;
}

.evo-quick-order__stock {
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 12px;
	white-space: nowrap;
	color: var(--evo-glass-text);
	opacity: 0.75;
}

.evo-quick-order__stock--none {
	color: var(--evo-quality-sneaks);
	opacity: 0.85;
}

.evo-quick-order-summary__remove {
	background: none;
	border: none;
	color: var(--evo-glass-text);
	opacity: 0.6;
	font-size: 18px;
	line-height: 1;
	cursor: pointer;
	padding: 0 4px;
}

.evo-quick-order-summary__remove:hover,
.evo-quick-order-summary__remove:focus-visible {
	color: var(--evo-quality-sneaks);
	opacity: 1;
}

@media (max-width: 640px) {
	.evo-quick-order {
		max-width: 100%;
		padding: 24px 16px 40px;
	}

	.evo-quick-order__filters-toggle {
		display: flex;
	}

	.evo-quick-order__controls {
		display: none;
		flex-direction: column;
		align-items: stretch;
		margin-bottom: 20px;
	}

	.evo-quick-order__controls.is-open {
		display: flex;
	}

	/* .evo-quick-order__search-field/__category-field/__brand-field use `flex: 1 1 260px` for the
	   desktop row layout, where 260px is a *width* basis. Once the parent switches to
	   flex-direction: column above, that same 260px becomes a *height* basis instead — inflating
	   each field to ~260px tall and creating a huge gap between them. Reset to auto so each field
	   is only as tall as its label + input. */
	.evo-quick-order__search-field,
	.evo-quick-order__category-field,
	.evo-quick-order__brand-field {
		flex: 1 1 auto;
	}

	.evo-quick-order__category-field,
	.evo-quick-order__brand-field {
		padding-top: 16px;
		border-top: 1px solid var(--evo-glass-border);
	}

	/* Small pill button would otherwise stay left-aligned and cramped once the row above becomes
	   a stacked column — center it with a bit of breathing room instead. */
	.evo-quick-order__reset-btn {
		align-self: center;
		margin-top: 16px;
	}

	/* The 7-column grid used at desktop width doesn't fit a phone screen — every row/summary
	   line switches to a wrapping flex layout instead (column labels hidden; each cell reads
	   fine on its own without them at this size). */
	.evo-quick-order__header-row {
		display: none;
	}

	.evo-quick-order__group-summary,
	.evo-quick-order__row {
		display: flex;
		flex-wrap: wrap;
		align-items: center;
		gap: 8px;
		padding: 10px 0;
	}

	.evo-quick-order__col {
		padding: 0;
	}

	.evo-quick-order__col--action {
		text-align: left;
		margin-left: auto;
	}

	/* border-top on .evo-quick-order__row/.evo-quick-order__group themselves (set at the top of
	   this file, not per-cell) still applies fine here — no extra rule needed just because the
	   layout switched from grid to flex. */
}


/* ---------- Cart drawer (Horizon-style slide-out cart) ----------
   No dark overlay: instead, #evo-page-shift (wraps everything from just inside <body> to just
   before </body> — see header.php/footer.php) shrinks by exactly the drawer's width, so the
   drawer slides into freed-up space rather than covering the page. The site stays fully usable
   (scrollable, clickable) the whole time the drawer is open — there's deliberately no
   "body.evo-cart-drawer-open { overflow: hidden }" scroll-lock here. */

#evo-page-shift {
	transition: margin-right 0.3s ease;
}

body.evo-cart-drawer-open #evo-page-shift {
	margin-right: var(--evo-cart-drawer-width);
}

.evo-cart-drawer {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	width: var(--evo-cart-drawer-width);
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border-left: 1px solid var(--evo-glass-border);
	box-shadow: -8px 0 32px rgba(0, 0, 0, 0.25);
	transform: translateX(100%);
	transition: transform 0.3s ease;
	z-index: 501;
	display: flex;
	flex-direction: column;
	/* Safety net, same reasoning as the cart page panels below — anything WooCommerce's own
	   mini-cart markup colours itself (that we haven't explicitly restyled) inherits this
	   instead of staying dark-on-dark in dark mode. */
	color: var(--evo-glass-text);
}

.evo-cart-drawer.is-open {
	transform: translateX(0);
}

.evo-cart-drawer__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 44px 24px 20px;
	border-bottom: 1.5px solid var(--evo-glass-border);
	flex-shrink: 0;
}

.evo-cart-drawer__title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
	line-height: 1.3;
	margin: 0;
}

.evo-cart-drawer__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border: none;
	background-color: transparent;
	color: var(--evo-glass-text);
	border-radius: 50%;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-cart-drawer__close:hover,
.evo-cart-drawer__close:focus-visible {
	background-color: rgba(128, 128, 128, 0.18);
}

.evo-cart-drawer__body {
	flex: 1 1 auto;
	display: flex;
	flex-direction: column;
	/* Was "overflow: hidden" — harmless with only a few cart items, but .widget_shopping_cart_content
	   (mini-cart items + total + checkout button) isn't itself a flex/bounded-height container, so
	   .woocommerce-mini-cart's own flex/overflow-y:auto below never actually gets a chance to kick
	   in; a cart with enough items (or with the "You Might Also Like" row below now added) simply
	   overflowed the drawer's fixed height and got clipped — checkout button included. Scrolling the
	   whole body as one unit is the simple, robust fix: every cart size just becomes reachable by
	   scrolling, recommendations included. */
	overflow-x: hidden;
	overflow-y: auto;
	padding: 20px 24px;
}

.evo-cart-drawer__body .woocommerce-mini-cart {
	flex: 1 1 auto;
	overflow-y: auto;
	list-style: none;
	margin: 0 0 16px;
	padding: 0;
}

.evo-cart-drawer__body .woocommerce-mini-cart-item {
	position: relative;
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 14px 0;
	border-bottom: 1px solid var(--evo-glass-border);
}

.evo-cart-drawer__body .woocommerce-mini-cart-item:first-child {
	padding-top: 0;
}

/* 14 August 2026: retired 3 rules that used to live here — a generic
   ".woocommerce-mini-cart-item a:not(.remove)" (font/flex styling for a
   single anchor wrapping image+title together), a bare "img" sizing rule
   (56px), and a bare ".quantity" rule (display:block, dimmed text). All
   three were written for WooCommerce's STOCK mini-cart markup, from
   before this drawer's item row was restructured (see mini-cart.php +
   inc/cart-drawer-layout.php) into separate image/title anchors and a
   proper quantity stepper. Left in place, their higher specificity
   (2 classes + a pseudo-class/element) was silently overriding the
   newer, more specific ".evolution-cart-item__title", ".evolution-
   cart-item__image img", and ".evolution-cart-qty" rules that are
   actually meant to control this now — most visibly, the title text's
   size was staying locked at a hardcoded 14px no matter what font-size
   was set on its wrapping .evolution-cart-item__title div, since that
   14px was declared directly on the <a> itself. Removed rather than
   patched around, since nothing in the current markup needs them any
   more. */

.evo-cart-drawer__body .woocommerce-mini-cart-item .remove {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	flex-shrink: 0;
	border-radius: 50%;
	color: var(--evo-glass-text) !important;
	opacity: 0.5;
	text-decoration: none !important;
	font-size: 18px;
	line-height: 1;
	transition: opacity 0.15s ease, background-color 0.15s ease;
}

.evo-cart-drawer__body .woocommerce-mini-cart-item .remove:hover {
	opacity: 1;
	background-color: rgba(128, 128, 128, 0.14);
	color: var(--evo-quality-sneaks) !important;
}

.evo-cart-drawer__body .woocommerce-mini-cart__empty-message {
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 14px;
	color: var(--evo-glass-text);
	opacity: 0.8;
	margin: auto;
	padding: 40px 8px;
}

.evo-cart-drawer__body .woocommerce-mini-cart__total {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: space-between;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	color: var(--evo-glass-text);
	border-top: 1.5px solid var(--evo-glass-border);
	padding-top: 16px;
	margin: 0 0 14px;
}

/* Trade-customer VAT breakdown, directly above the View Cart/Checkout buttons — see
   evo_mini_cart_tax_breakdown() in functions.php. For these 4 B2B groups, WooCommerce's own
   Subtotal line (up near the item list) is removed entirely (evo_suppress_default_subtotal_for_b2b(),
   same file) — Excl. VAT and VAT are shown small/muted here, with the genuine inc-VAT Subtotal as
   the bold, headline final row right next to the buttons, rather than a separate ex-VAT figure
   sitting apart from the tax breakdown further up. */
.evo-cart-drawer__body .evo-mini-cart-tax-breakdown {
	flex-shrink: 0;
	margin: 0 0 14px;
	border-top: 1.5px solid var(--evo-glass-border);
	padding-top: 12px;
}

.evo-cart-drawer__body .evo-mini-cart-tax-breakdown__row {
	display: flex;
	justify-content: space-between;
	font-family: var(--evo-body-font);
	font-size: 14px;
	font-weight: 500;
	line-height: 1.5;
	color: var(--evo-glass-text);
	opacity: 0.75;
	margin: 0 0 6px;
}

.evo-cart-drawer__body .evo-mini-cart-tax-breakdown__row--subtotal {
	font-family: var(--evo-subtitle-font);
	font-size: 16px;
	font-weight: 700;
	opacity: 1;
	margin: 10px 0 0;
	padding-top: 10px;
	border-top: 1px dashed var(--evo-glass-border);
}

.evo-cart-drawer__body .woocommerce-mini-cart__buttons {
	flex-shrink: 0;
	display: flex;
	gap: 10px;
	margin: 0;
	padding: 0;
}

.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button {
	flex: 1 1 50%;
	text-align: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	border-radius: 999px;
	padding: 12px 16px;
	text-decoration: none;
	transition: background-color 0.15s ease;
}

.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button:not(.checkout) {
	background-color: rgba(128, 128, 128, 0.16);
	color: var(--evo-glass-text);
}

.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button:not(.checkout):hover {
	background-color: rgba(128, 128, 128, 0.18);
}

.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button.checkout {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

.evo-cart-drawer__body .woocommerce-mini-cart__buttons .button.checkout:hover {
	background-color: var(--evo-yorkie);
}

/* Destructive action — deliberately muted/understated and separated from the two primary
   buttons above (View Cart / Checkout) so it doesn't compete with them, given a confirm()
   prompt already guards against accidental clicks (see footer.php). */
.evo-clear-cart-button {
	display: block;
	width: 100%;
	margin-top: 10px;
	padding: 10px;
	background: none;
	border: none;
	font-family: var(--evo-subtitle-font);
	font-size: 13px;
	font-weight: 600;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	text-align: center;
	color: var(--evo-glass-text);
	opacity: 0.55;
	cursor: pointer;
	transition: color 0.15s ease, opacity 0.15s ease;
	flex-shrink: 0;
}

.evo-clear-cart-button:hover,
.evo-clear-cart-button:focus-visible {
	color: var(--evo-skate-n-destroy);
}

.evo-clear-cart-button:disabled {
	opacity: 0.5;
	cursor: default;
}

/* ---------- Cart drawer recommendations ("You Might Also Like") ----------
   Sits below the mini-cart's own View Cart/Checkout buttons (see evo_render_cart_recommendations()
   in functions.php) as a compact horizontally-scrolling row — the drawer is only ~420px wide, not
   enough for a real grid, so this borrows the same horizontal-track convention already used by
   .latest-products__track on the homepage rather than inventing a new pattern. Reuses
   .evo-quick-shop-btn (just sized down) so "add to cart" behaves identically to every other
   product card on the site. flex-shrink: 0 keeps it from being squeezed by the now-scrollable
   .evo-cart-drawer__body above. */
.evo-cart-recommendations {
	flex-shrink: 0;
}

.evo-cart-recommendations:empty {
	display: none;
}

.evo-cart-recommendations__heading {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-glass-text);
	opacity: 0.75;
	margin: 0 0 12px;
	padding-top: 16px;
	border-top: 1px solid var(--evo-glass-border);
}

.evo-cart-recommendations__track {
	display: flex;
	gap: 12px;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	padding: 0 0 4px;
	margin: 0;
	list-style: none;
	scrollbar-width: none;
}

.evo-cart-recommendations__track::-webkit-scrollbar {
	display: none;
}

/* Sized as a fraction of the track's own width (not a fixed pixel value) so exactly 3 cards
   always fit with no partial/cut-off card at the right edge — the drawer itself isn't a fixed
   width (min(420px, 92vw) on desktop, 100% of the viewport on phones — see .evo-cart-drawer and
   its @media overrides below), so a hardcoded px width fit perfectly at one drawer width and got
   sliced off at another. Scrolling still reveals the 4th/5th/6th card same as before; only the
   at-rest view (no partial slice) changes. */
.evo-cart-recommendations__card {
	flex: 0 0 calc((100% - 24px) / 3);
	width: calc((100% - 24px) / 3);
	scroll-snap-align: start;
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.evo-cart-recommendations__media {
	display: block;
	aspect-ratio: 1 / 1;
	background-color: var(--evo-product-image-bg);
	border: 1px solid var(--evo-glass-border);
	overflow: hidden;
}

.evo-cart-recommendations__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.evo-cart-recommendations__name {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 12px;
	font-weight: 600;
	line-height: 1.35;
	max-height: 2.7em;
	overflow: hidden;
}

.evo-cart-recommendations__name a {
	color: var(--evo-glass-text);
	text-decoration: none;
}

.evo-cart-recommendations__price {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	color: var(--evo-glass-text);
}

.evo-cart-recommendations__price .amount {
	color: inherit;
}

.evo-cart-recommendations__quick-shop {
	font-size: 11px !important;
	padding: 8px 10px !important;
	margin-top: 2px !important;
}

@media (max-width: 480px) {
	/* Narrower drawer on small phones — keeps a real sliver of the shunted page visible/usable
	   rather than the drawer eating the entire viewport. Overriding the shared var (rather than
	   .evo-cart-drawer directly) keeps the drawer width and the #evo-page-shift shrink amount
	   in sync automatically. */
	:root {
		--evo-cart-drawer-width: min(320px, 82vw);
	}
}

@media (max-width: 640px) {
	/* Mobile gets separate behaviour from desktop/tablet. The shunt/shrink approach (page
	   squeezes sideways to make room for the drawer) only works while there's enough width left
	   over for the squeezed page to still be comfortably usable — on phones that "leftover"
	   space is too narrow and the shrink just squashes the whole site uncomfortably instead.
	   So on mobile the drawer opens as a normal full-screen panel over the top of the site
	   (no shrinking, no visible page underneath) and stays open until the customer closes it
	   themselves — same close controls as desktop (X button, Escape, or View Cart/Checkout). */
	body.evo-cart-drawer-open #evo-page-shift {
		margin-right: 0;
	}

	/* Site underneath is fully covered, so lock its scroll while the drawer is open. */
	body.evo-cart-drawer-open {
		overflow: hidden;
	}

	.evo-cart-drawer {
		width: 100%;
	}
}

/* ---------- Login drawer (Horizon-style slide-out login) ----------
   Same mechanic as the cart drawer above — shares --evo-cart-drawer-width and the
   #evo-page-shift shrink — just docked with its own body class so the two never fight over
   the shrink amount (JS enforces only one open at a time anyway). Content is WooCommerce's own
   stock login form output (see footer.php), which normally renders as a two-column
   login/register layout on the full My Account page — narrowed here to a single stacked
   column since the drawer itself is much narrower than a full page. */

body.evo-login-drawer-open #evo-page-shift {
	margin-right: var(--evo-cart-drawer-width);
}

.evo-login-drawer {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	width: var(--evo-cart-drawer-width);
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border-left: 1px solid var(--evo-glass-border);
	box-shadow: -8px 0 32px rgba(0, 0, 0, 0.25);
	transform: translateX(100%);
	transition: transform 0.3s ease;
	z-index: 501;
	display: flex;
	flex-direction: column;
	color: var(--evo-glass-text);
}

.evo-login-drawer.is-open {
	transform: translateX(0);
}

.evo-login-drawer__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 44px 24px 20px;
	border-bottom: 1.5px solid var(--evo-glass-border);
	flex-shrink: 0;
}

.evo-login-drawer__title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
	line-height: 1.3;
	margin: 0;
}

.evo-login-drawer__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border: none;
	background-color: transparent;
	color: var(--evo-glass-text);
	border-radius: 50%;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-login-drawer__close:hover,
.evo-login-drawer__close:focus-visible {
	background-color: rgba(128, 128, 128, 0.18);
}

.evo-login-drawer__body {
	flex: 1 1 auto;
	overflow-y: auto;
	padding: 24px;
}

/* This drawer's markup is WooCommerce's plain global login form (woocommerce_login_form() in
   footer.php pulls in global/form-login.php) — NOT the #customer_login/.u-columns wrapper the
   full My Account page gets, so those selectors never matched anything here and none of this
   styling was ever applying. Worse, on any page carrying the woocommerce-page body class (shop,
   category, product, cart, checkout, account — i.e. most of the site) WooCommerce's own layout
   stylesheet floats .form-row-first/.form-row-last into a 47%/47% two-column grid, which is
   exactly the side-by-side layout this drawer was meant to avoid. The #evo-login-drawer ID below
   matches the real .form-row-first / .form-row-last classes (the username/password rows) and
   out-specifies WooCommerce's float rule so the two fields stack into a single column instead.
   Scoped to -first/-last rather than every .form-row so it doesn't reach the plain .form-row
   used further down for the remember-me/submit row — that one intentionally keeps its own
   (non-uppercase, flex) label styling from .woocommerce-form__label-for-checkbox below. */
#evo-login-drawer .form-row-first,
#evo-login-drawer .form-row-last {
	width: 100%;
	float: none;
	clear: none;
	margin: 0 0 16px;
}

/* Tabs added 18 Aug 2026 so this drawer can also handle B2C self-service "Create an account"
   alongside the existing login form — two buttons, two panels, both already in the DOM (see
   footer.php), toggled purely by JS adding/removing [hidden] and .is-active. */
.evo-login-drawer__tabs {
	display: flex;
	gap: 4px;
	padding: 0 24px;
	margin-top: 20px;
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.evo-login-drawer__tab {
	flex: 1;
	background: none;
	border: none;
	padding: 10px 4px 14px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	opacity: 0.6;
	cursor: pointer;
	border-bottom: 2px solid transparent;
	margin-bottom: -1.5px;
	transition: opacity 0.15s ease, border-color 0.15s ease;
}

.evo-login-drawer__tab:hover {
	opacity: 0.85;
}

.evo-login-drawer__tab.is-active {
	opacity: 1;
	border-bottom-color: var(--evo-quality-sneaks);
	color: var(--evo-quality-sneaks);
}

.evo-login-drawer__panel[hidden] {
	display: none;
}

/* The register form's fields use .form-row-wide (single-column, unlike login's
   .form-row-first/-last pair) — extending the same label/width treatment to it here rather
   than duplicating the rules above. */
#evo-login-drawer .form-row-wide {
	width: 100%;
	float: none;
	clear: none;
	margin: 0 0 16px;
}

.evo-login-drawer__body .form-row-first label,
.evo-login-drawer__body .form-row-last label,
.evo-login-drawer__body .form-row-wide label {
	display: block;
	margin: 0 0 8px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.evo-login-drawer__body .required {
	color: var(--evo-error-red);
	text-decoration: none;
}

.evo-login-drawer__body input.input-text {
	width: 100%;
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 13px 20px;
}

.evo-login-drawer__body input.input-text:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

.evo-login-drawer__body .woocommerce-form__label-for-checkbox {
	display: flex;
	align-items: center;
	gap: 8px;
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-glass-text);
	margin: 0 0 20px;
	cursor: pointer;
}

.evo-login-drawer__body .woocommerce-form__input-checkbox {
	width: 16px;
	height: 16px;
	margin: 0;
}

.evo-login-drawer__body button[type='submit'] {
	width: 100%;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 14px 24px;
	cursor: pointer;
	transition: background-color 0.15s ease;
	box-shadow: var(--evo-glass-glow);
}

.evo-login-drawer__body button[type='submit']:hover,
.evo-login-drawer__body button[type='submit']:focus-visible {
	background-color: var(--evo-yorkie);
}

.evo-login-drawer__body .lost_password {
	margin: 14px 0 0;
	text-align: center;
}

.evo-login-drawer__body .lost_password a,
.evo-login-drawer__body .woocommerce-privacy-policy-text a {
	color: var(--evo-quality-sneaks);
	text-decoration: none;
	font-family: var(--evo-body-font);
	font-size: 13px;
}

.evo-login-drawer__body .lost_password a:hover,
.evo-login-drawer__body .woocommerce-privacy-policy-text a:hover {
	color: var(--evo-yorkie);
	text-decoration: underline;
}

.evo-login-drawer__body .woocommerce-privacy-policy-text p {
	font-size: 12px;
	line-height: 1.6;
	color: var(--evo-glass-text);
	opacity: 0.8;
	margin: 14px 0 0;
}

.evo-login-drawer__body .woocommerce-error {
	list-style: none;
	margin: 0 0 20px;
	padding: 14px 18px;
	background: #fdecec;
	border: 1.5px solid #f3b9b9;
	border-radius: 0;
	font-family: var(--evo-body-font);
	font-size: 13px;
	font-weight: 600;
	color: var(--evo-error-red);
}

@media (max-width: 640px) {
	body.evo-login-drawer-open #evo-page-shift {
		margin-right: 0;
	}

	body.evo-login-drawer-open {
		overflow: hidden;
	}

	.evo-login-drawer {
		width: 100%;
	}
}

/* ---------- Add-to-cart toast (Horizon-style) ----------
   Fixed to the viewport (outside #evo-page-shift, like the drawer), bottom-centered so it never
   collides with the drawer's right-docked position. Hidden by default via opacity/transform +
   pointer-events, faded in/out — see window.evoShowCartToast() in footer.php for the 3s timer. */

.evo-cart-toast {
	position: fixed;
	left: 50%;
	bottom: 28px;
	transform: translate(-50%, 12px);
	display: flex;
	align-items: center;
	gap: 10px;
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	color: var(--evo-glass-text);
	padding: 14px 22px;
	border-radius: 999px;
	box-shadow: var(--evo-glass-shadow);
	font-family: var(--evo-subtitle-font);
	font-weight: 600;
	font-size: 15px;
	letter-spacing: 0.02em;
	opacity: 0;
	pointer-events: none;
	z-index: 600;
	transition: opacity 0.25s ease, transform 0.25s ease;
}

.evo-cart-toast.is-visible {
	opacity: 1;
	transform: translate(-50%, 0);
}

.evo-cart-toast__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	flex-shrink: 0;
	border-radius: 50%;
	background-color: var(--evo-yorkie);
	color: var(--evo-cloud);
}

@media (max-width: 480px) {
	.evo-cart-toast {
		left: 16px;
		right: 16px;
		bottom: 16px;
		transform: translateY(12px);
		max-width: none;
	}

	.evo-cart-toast.is-visible {
		transform: translateY(0);
	}
}

/* =========================================================
   Evolution Vaping — Quick Shop modal
   A dimmed dialog overlay (unlike the cart drawer/toast above, which never dim the page) —
   opens from a "Quick Shop" button on any product card (see functions.php for the button
   markup and AJAX handler). Body scroll locks while it's open since, unlike the drawer, this
   really is meant to be a focused, modal popup rather than something you keep browsing behind.
   z-index sits above both the drawer (501) and the toast (600), since either could already be
   visible when Quick Shop is opened. ========================================================= */

body.evo-quick-shop-open {
	overflow: hidden;
}

.evo-quick-shop-modal {
	position: fixed;
	inset: 0;
	z-index: 700;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 20px;
	visibility: hidden;
	opacity: 0;
	transition: opacity 0.2s ease, visibility 0s linear 0.2s;
}

.evo-quick-shop-modal.is-open {
	visibility: visible;
	opacity: 1;
	transition: opacity 0.2s ease;
}

.evo-quick-shop-modal__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(10, 8, 16, 0.6);
	-webkit-backdrop-filter: blur(4px);
	backdrop-filter: blur(4px);
}

.evo-quick-shop-modal__panel {
	position: relative;
	width: 100%;
	max-width: 560px;
	max-height: 88vh;
	overflow-y: auto;
	background-color: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	padding: 32px;
	color: var(--evo-glass-text);
	/* "Bubble pop" open — a slight overshoot on scale reads as a lively pop rather than a flat
	   fade, without being so bouncy it feels slow or distracting. */
	transform: scale(0.9);
	transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.evo-quick-shop-modal.is-open .evo-quick-shop-modal__panel {
	transform: scale(1);
}

.evo-quick-shop-modal__close {
	position: absolute;
	top: 16px;
	right: 16px;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	border: 1px solid var(--evo-glass-border);
	background-color: var(--evo-glass-bg);
	color: var(--evo-glass-text);
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
	z-index: 1;
}

.evo-quick-shop-modal__close:hover,
.evo-quick-shop-modal__close:focus-visible {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

.evo-quick-shop-modal__loading {
	display: none;
	align-items: center;
	justify-content: center;
	padding: 60px 0;
}

.evo-quick-shop-modal__loading.is-visible {
	display: flex;
}

.evo-quick-shop-modal__spinner {
	width: 32px;
	height: 32px;
	border-radius: 50%;
	border: 3px solid var(--evo-glass-border);
	border-top-color: var(--evo-quality-sneaks);
	animation: evo-quick-shop-spin 0.7s linear infinite;
}

@keyframes evo-quick-shop-spin {
	to {
		transform: rotate(360deg);
	}
}

.evo-quick-shop-modal__body {
	display: flex;
	gap: 28px;
}

.evo-quick-shop-modal__body:empty {
	display: none;
}

/* Was 40% — that only left the info column (title/price/variation/qty/button) enough width for
   the Add to Cart button to wrap its own text across two or three lines instead of sitting on one
   row next to the quantity stepper like it does on the full product page (see the qty/button
   size overrides below, which claw back a bit more of that width too). */
.evo-quick-shop-modal__media {
	flex: 0 0 30%;
}

.evo-quick-shop-modal__media img {
	width: 100%;
	height: auto;
	border-radius: 0;
	border: 1px solid var(--evo-glass-border);
	background-color: var(--evo-product-image-bg);
}

.evo-quick-shop-modal__info {
	flex: 1 1 auto;
	min-width: 0;
	/* Reset — .woocommerce is added purely so the injected add-to-cart form picks up all the
	   existing single-product-page CSS (variation selects, quantity box, buttons, the dark-mode
	   option-list fix, etc.); it isn't meant to bring any of WooCommerce's own page-layout
	   styles along with it. */
	width: auto;
	float: none;
}

.evo-quick-shop-modal__title {
	margin: 0 0 8px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-size: 18px;
	line-height: 1.3;
}

.evo-quick-shop-modal__title a {
	color: var(--evo-glass-text);
	text-decoration: none;
}

.evo-quick-shop-modal__title a:hover {
	color: var(--evo-quality-sneaks);
}

.evo-quick-shop-modal__price {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 20px;
	color: var(--evo-quality-sneaks);
	margin-bottom: 18px;
}

.evo-quick-shop-modal__price del {
	color: var(--evo-glass-text);
	opacity: 0.5;
	font-weight: 500;
	margin-right: 6px;
}

.evo-quick-shop-modal__error {
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-error-red);
	margin: 10px 0 0;
}

/* The injected form's own variation table/quantity box/button already inherit all their sizing
   from the existing .woocommerce div.product rules — this just tightens up the bit of spacing
   specific to sitting inside a compact modal instead of a full product page. */
.evo-quick-shop-modal__info .variations {
	margin-bottom: 16px;
}

.evo-quick-shop-modal__info .woocommerce-variation-add-to-cart {
	margin-top: 4px;
}

/* The main product page's quantity boxes + Add to Cart button are sized for a much wider column
   than this modal's info side ever has — even after giving that column more room above, the
   button's normal 36px horizontal padding at 14px font still wrapped "Add to Cart" across
   multiple lines. Slightly smaller quantity boxes and tighter button padding/font-size (modal
   only — the main product page is untouched) keep everything on one row, text on one line. */
.evo-quick-shop-modal__info.woocommerce div.product form.cart .quantity .qty,
.evo-quick-shop-modal__info.woocommerce div.product form.cart .quantity .evo-qty-btn {
	width: 38px;
}

.evo-quick-shop-modal__info.woocommerce div.product form.cart .button,
.evo-quick-shop-modal__info.woocommerce div.product .woocommerce-variation-add-to-cart .button {
	max-width: none;
	padding: 14px 18px;
	font-size: 13px;
	white-space: nowrap;
}

@media (max-width: 640px) {
	.evo-quick-shop-modal {
		padding: 0;
		align-items: flex-end;
	}

	.evo-quick-shop-modal__panel {
		max-width: none;
		width: 100%;
		max-height: 92vh;
		border-radius: 0;
		padding: 24px 20px 28px;
		transform: translateY(100%);
		transition: transform 0.25s ease;
	}

	.evo-quick-shop-modal.is-open .evo-quick-shop-modal__panel {
		transform: translateY(0);
	}

	.evo-quick-shop-modal__body {
		flex-direction: column;
		gap: 18px;
	}

	.evo-quick-shop-modal__media {
		flex: none;
		max-width: 200px;
		margin: 0 auto;
	}
}

/* =========================================================
   Evolution Vaping — Cart page (Horizon-style)
   IMPORTANT: this site's Cart page uses the WooCommerce CART BLOCK (Gutenberg block, rendered
   via src/Blocks/BlockTypes/Cart.php + React hydration on the frontend), NOT the classic
   [woocommerce_cart] shortcode/cart.php template. Its markup is completely different
   (.wc-block-cart, .wc-block-cart-items, .wc-block-components-*, etc.) — confirmed from the
   plugin's own compiled assets/client/blocks/cart.css and packages-style.css, since no live
   browser was available to inspect the rendered DOM directly. All selectors below are taken
   verbatim from those files, not guessed.

   Still true from earlier investigation: the Cart page is a plain WordPress Page (page.php),
   not one of WooCommerce's own archive templates, and evo_is_wc_managed_page() means
   header.php/footer.php don't add their own #content/#main wrapper here — so .entry-content
   remains the only real width-constraining wrapper that exists in the DOM. Unlike the earlier
   attempt, this does NOT turn .entry-content into a grid/flex container — the Cart block already
   has its own internal two-column layout (.wc-block-components-sidebar-layout, using a CSS
   container query to collapse to one column) and fighting it by imposing another layout system
   on its parent risked breaking that responsiveness. .entry-content is just centered here, full
   stop, and every other rule below styles the block's own real classes.
   ========================================================= */

.woocommerce-cart .header {
	text-align: center;
	margin-top: 32px;
	margin-bottom: 12px;
}

/* Trade-customer VAT breakdown rows (Wholesale / Wholesale VIP / Sub Distro) added above the
   cart/checkout Total row — kept visually secondary so the actual Total row still reads as the
   one figure that matters. */
.evo-cart-tax-breakdown th,
.evo-cart-tax-breakdown td {
	font-weight: 400;
	font-size: 0.9em;
	opacity: 0.75;
}

.evo-cart-tax-breakdown--vat th,
.evo-cart-tax-breakdown--vat td {
	padding-bottom: 12px !important;
	border-bottom: 1px solid rgba(0, 0, 0, 0.08);
}

.woocommerce-cart .entry-title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0;
}

/* Same 1500px + 28/18/12px formula used site-wide (see .site-content) — matches the header,
   homepage sections, and every other page instead of using its own separate (narrower) width. */
.woocommerce-cart .entry-content {
	max-width: none;
	margin-left: auto;
	margin-right: auto;
	padding-left: 28px;
	padding-right: 28px;
	padding-bottom: 64px;
}

@media (max-width: 960px) {
	.woocommerce-cart .entry-content {
		padding-left: 18px;
		padding-right: 18px;
	}
}

@media (max-width: 640px) {
	.woocommerce-cart .entry-content {
		padding-bottom: 32px;
	}
}

@media (max-width: 400px) {
	.woocommerce-cart .entry-content {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* ---------- Items list (left/main column) ---------- */

.wc-block-cart__main {
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	padding: 8px 24px;
	/* Safety net: the Cart block itself hardcodes dark text colours on things we haven't
	   explicitly restyled (shipping/tax rows, quantity input text, etc). Setting a default
	   colour here lets it inherit down to anything without its own more specific colour rule,
	   instead of staying unreadably dark once this panel goes translucent-dark in dark mode. */
	color: var(--evo-glass-text);
}

.wc-block-cart-items {
	width: 100%;
}

.wc-block-cart-items__row {
	padding: 20px 0 !important;
}

/* Divider between items — previously every row just ran straight into the next with nothing but
   padding, so a multi-item cart read as one unbroken block. Skips the very first row so it
   doesn't double up with the panel's own top edge. */
.wc-block-cart-items__row:not(:first-child) {
	border-top: 1px solid var(--evo-glass-border);
}

/* Subtle hover tint so a row reads as its own interactive unit — same restrained treatment as
   the rest of the site rather than a hard highlight. */
.wc-block-cart-items__row:hover {
	background-color: var(--evo-glass-input-bg);
}

.wc-block-cart-item__image img {
	border-radius: 0;
	background-color: var(--evo-product-image-bg);
}

.wc-block-components-product-name {
	font-family: var(--evo-body-font);
	font-weight: 600;
	color: var(--evo-glass-text);
	text-decoration: none;
}

.wc-block-components-product-name:hover {
	color: var(--evo-quality-sneaks);
}

.wc-block-cart-item__prices,
.wc-block-cart-item__total {
	font-family: var(--evo-body-font);
	color: var(--evo-quality-sneaks);
	font-weight: 700;
}

/* The brand purple above (--evo-quality-sneaks, a deep #6a2bc6) reads fine on the light theme's
   near-white card background, but on the dark theme's near-black one it's low-contrast and easy
   to miss. Swaps to the lighter lavender purple already used elsewhere on dark surfaces
   (--evo-purple-haze) instead of going all the way to plain white, so each item's price/subtotal
   still reads as a price (not body text) while actually being easy to read. */
[data-evo-theme='dark'] .wc-block-cart-item__prices,
[data-evo-theme='dark'] .wc-block-cart-item__total {
	color: var(--evo-purple-haze);
}

.wc-block-components-quantity-selector {
	border-color: var(--evo-glass-border);
	border-radius: 999px;
	overflow: hidden;
}

.wc-block-components-quantity-selector .wc-block-components-quantity-selector__input {
	font-family: var(--evo-body-font);
}

.wc-block-cart-item__remove-link {
	color: var(--evo-glass-text) !important;
	opacity: 0.55;
}

.wc-block-cart-item__remove-link:hover {
	color: var(--evo-skate-n-destroy) !important;
}

/* ---------- Order summary (right/sidebar column) ---------- */

.wc-block-cart__sidebar {
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	padding: 28px 24px;
	/* Same safety net as .wc-block-cart__main — totals/coupon rows the block styles itself
	   otherwise stay dark-on-dark once this panel goes translucent. */
	color: var(--evo-glass-text);
}

.wc-block-components-totals-item {
	font-family: var(--evo-body-font);
	font-size: 14px;
}

.wc-block-components-totals-footer-item .wc-block-components-totals-item__label,
.wc-block-components-totals-footer-item .wc-block-components-totals-item__value {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
}

/* "Estimated total" — same low-contrast brand-purple-on-dark-background issue as the per-item
   prices above, but called out on its own here since the user asked for this one specifically
   to go all the way to white rather than a lighter purple. */
[data-evo-theme='dark'] .wc-block-components-totals-footer-item .wc-block-components-totals-item__label,
[data-evo-theme='dark'] .wc-block-components-totals-footer-item .wc-block-components-totals-item__value {
	color: var(--evo-cloud);
}

.wc-block-components-panel__button {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	color: var(--evo-glass-text);
}

.wc-block-components-totals-coupon .wc-block-components-totals-item__label,
.wc-block-components-totals-coupon .wc-block-components-panel__button {
	color: var(--evo-quality-sneaks);
}

/* "Add a coupon" toggle + its label, in dark mode — same reasoning as "Estimated total" above. */
[data-evo-theme='dark'] .wc-block-components-totals-coupon .wc-block-components-totals-item__label,
[data-evo-theme='dark'] .wc-block-components-totals-coupon .wc-block-components-panel__button {
	color: var(--evo-cloud);
}

.wc-block-components-text-input input,
.wc-block-components-totals-coupon input {
	border-radius: 999px !important;
}

/* Proceed to Checkout button — matches the site's pill-button pattern used everywhere else
   (My Account, mini-cart drawer, etc). */
.wc-block-cart__submit-button,
.wc-block-cart .wc-block-components-button {
	font-family: var(--evo-subtitle-font) !important;
	font-weight: 700 !important;
	font-size: 15px !important;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border-radius: 999px !important;
	border: none !important;
	padding: 16px 24px !important;
}

.wc-block-cart__submit-button:hover,
.wc-block-cart .wc-block-components-button:hover {
	color: var(--evo-cloud) !important;
	background-color: var(--evo-yorkie) !important;
}

.wc-block-cart__submit-button .wc-block-components-button__text,
.wc-block-cart .wc-block-components-button .wc-block-components-button__text {
	color: inherit !important;
}

/* ---------- Cross-sells ("You may be interested in…") ---------- */

.wp-block-woocommerce-cart-cross-sells-block h2 {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 24px;
	text-align: center;
}

/* ---------- Empty cart state ---------- */

.wc-block-cart__empty-cart__title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-align: center;
}

.wc-block-cart__empty-cart__title + p {
	text-align: center;
	color: var(--evo-glass-text);
	opacity: 0.75;
}

.woocommerce-cart .entry-content a {
	color: var(--evo-quality-sneaks);
}

/* "Browse store" / return-to-shop link on the empty cart — was inheriting no button styling at
   all, so it just sat there as a plain text link. Matches the site's pill-button pattern. */
.wc-block-cart__empty-cart .wc-block-components-button {
	font-family: var(--evo-subtitle-font) !important;
	font-weight: 700 !important;
	font-size: 15px !important;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border-radius: 999px !important;
	border: none !important;
	padding: 16px 24px !important;
	text-decoration: none !important;
	display: inline-block;
	margin: 12px auto 0;
}

.wc-block-cart__empty-cart .wc-block-components-button:hover {
	background-color: var(--evo-yorkie) !important;
}

.wc-block-cart__empty-cart {
	text-align: center;
	padding: 48px 24px;
}

/* ---------- Wholesale page (page-wholesale.php) ---------- */

.wholesale-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 20px;
	padding: 64px 28px 56px;
}

.wholesale-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 44px;
	line-height: 1.1;
}

.wholesale-hero__subheading {
	margin: 0;
	max-width: 680px;
	font-family: var(--evo-body-font);
	font-weight: 500;
	font-size: 17px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.wholesale-hero__cta {
	display: inline-flex;
	align-items: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 16px 40px;
	text-decoration: none;
	transition: background-color 0.15s ease;
}

.wholesale-hero__cta:hover,
.wholesale-hero__cta:focus-visible {
	background-color: var(--evo-yorkie);
}

.wholesale-tiers {
	max-width: none;
	margin: 0 auto;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 24px;
	padding: 0 28px 56px;
}

.wholesale-tiers__card {
	display: flex;
	flex-direction: column;
	gap: 12px;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	backdrop-filter: var(--evo-glass-blur);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	padding: 28px 26px;
	text-align: center;
}

.wholesale-tiers__name {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 22px;
}

.wholesale-tiers__desc {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.wholesale-steps {
	max-width: none;
	margin: 0 auto;
	text-align: center;
	padding: 0 28px 56px;
	border-top: 1px solid var(--evo-glass-border);
	padding-top: 48px;
}

.wholesale-steps__heading {
	margin: 0 0 32px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 28px;
}

.wholesale-steps__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 28px;
	max-width: 1000px;
	margin: 0 auto;
}

.wholesale-steps__step {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 10px;
}

.wholesale-steps__number {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: 50%;
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 18px;
	box-shadow: var(--evo-glass-glow);
}

.wholesale-steps__step h3 {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 16px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
}

.wholesale-steps__step p {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.wholesale-form-section {
	max-width: 640px;
	margin: 0 auto;
	padding: 48px 28px 64px;
	border-top: 1px solid var(--evo-glass-border);
	/* Fallback for jumps that don't go through the JS smooth-scroll (direct #wholesale-form
	   links, keyboard/fragment navigation) — keeps the heading clear of the sticky header.
	   The JS handler measures the header's real height for the actual button click. */
	scroll-margin-top: 140px;
}

.wholesale-form-section__heading {
	text-align: center;
	margin: 0 0 28px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 28px;
}

.wholesale-form__success {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: #1e6b3c;
	background: #eaf7ef;
	border: 1.5px solid #b8e2c6;
	border-radius: 0;
	padding: 20px 24px;
	text-align: center;
}

.wholesale-form__errors {
	background: #fdecec;
	border: 1.5px solid #f3b9b9;
	border-radius: 0;
	padding: 16px 24px;
	margin-bottom: 24px;
}

.wholesale-form__errors ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.wholesale-form__errors li {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-error-red);
}

.wholesale-form__errors li + li {
	margin-top: 6px;
}

.wholesale-form {
	display: flex;
	flex-direction: column;
	gap: 20px;
}

.wholesale-form__honeypot {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.wholesale-form__row-group {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 20px;
}

.wholesale-form__row {
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.wholesale-form__row label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
}

.wholesale-form__row input,
.wholesale-form__row select {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 14px 22px;
}

.wholesale-form__row textarea {
	font-family: var(--evo-body-font);
	font-weight: 500;
	font-size: 15px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 16px 22px;
	resize: vertical;
}

.wholesale-form__row input:focus,
.wholesale-form__row select:focus,
.wholesale-form__row textarea:focus {
	outline: none;
	border-color: var(--evo-quality-sneaks);
}

.wholesale-form__submit {
	align-self: flex-start;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 14px 36px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.wholesale-form__submit:hover,
.wholesale-form__submit:focus-visible {
	background-color: var(--evo-yorkie);
}

.wholesale-hero__tagline {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var(--evo-yorkie);
}

.wholesale-categories {
	max-width: none;
	margin: 0 auto;
	text-align: center;
	padding: 0 28px 56px;
}

.wholesale-categories__heading {
	margin: 0 0 24px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 26px;
}

.wholesale-categories__list {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 12px 14px;
	max-width: 960px;
	margin: 0 auto;
	padding: 0;
	list-style: none;
}

.wholesale-categories__item {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 10px 20px;
}

.wholesale-categories__item a {
	color: var(--evo-quality-sneaks);
	text-decoration: none;
}

.wholesale-categories__item a:hover,
.wholesale-categories__item a:focus-visible {
	color: var(--evo-yorkie);
	text-decoration: underline;
}

.wholesale-categories__sep {
	margin: 0 4px;
	color: var(--evo-glass-text);
	opacity: 0.6;
}

.wholesale-logistics {
	max-width: none;
	margin: 0 auto;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 24px;
	padding: 0 28px 56px;
	border-top: 1px solid var(--evo-glass-border);
	padding-top: 48px;
}

.wholesale-logistics__col {
	text-align: center;
}

.wholesale-logistics__heading {
	margin: 0 0 16px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 16px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
}

.wholesale-logistics__list {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.wholesale-logistics__list li {
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.5;
	color: var(--evo-glass-text);
}

.wholesale-managers {
	max-width: none;
	margin: 0 auto;
	text-align: center;
	padding: 0 28px 56px;
}

.wholesale-managers__heading {
	margin: 0 0 12px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 26px;
}

.wholesale-managers__intro {
	max-width: 640px;
	margin: 0 auto 32px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.wholesale-managers__grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 24px;
	max-width: 1000px;
	margin: 0 auto;
}

.wholesale-managers__card {
	display: flex;
	flex-direction: column;
	gap: 6px;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	padding: 24px 22px;
}

.wholesale-managers__name {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 18px;
	color: var(--evo-glass-text);
}

.wholesale-managers__role {
	margin: 0 0 8px;
	font-family: var(--evo-body-font);
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
}

.wholesale-managers__contact {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 14px;
}

.wholesale-managers__contact a {
	color: var(--evo-glass-text);
	text-decoration: none;
}

.wholesale-managers__contact a:hover,
.wholesale-managers__contact a:focus-visible {
	color: var(--evo-yorkie);
	text-decoration: underline;
}

.wholesale-managers__label {
	display: block;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	opacity: 0.6;
}

.wholesale-visit {
	max-width: none;
	margin: 0 auto;
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 32px;
	padding: 0 28px 56px;
	border-top: 1px solid var(--evo-glass-border);
	padding-top: 48px;
	text-align: center;
}

.wholesale-visit__heading {
	margin: 0 0 16px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 22px;
}

.wholesale-visit__address,
.wholesale-visit__text {
	margin: 0 0 16px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.wholesale-visit__link {
	display: inline-flex;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-quality-sneaks);
	text-decoration: none;
}

.wholesale-visit__link:hover,
.wholesale-visit__link:focus-visible {
	color: var(--evo-yorkie);
	text-decoration: underline;
}

.wholesale-visit__phone a {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 16px;
	color: var(--evo-glass-text);
	text-decoration: none;
}

.wholesale-visit__phone a:hover,
.wholesale-visit__phone a:focus-visible {
	color: var(--evo-yorkie);
}

@media (max-width: 720px) {
	.wholesale-tiers {
		grid-template-columns: 1fr;
	}

	.wholesale-steps__grid {
		grid-template-columns: 1fr;
		gap: 32px;
	}

	.wholesale-logistics {
		grid-template-columns: 1fr;
		gap: 32px;
	}

	.wholesale-managers__grid {
		grid-template-columns: 1fr;
	}

	.wholesale-visit {
		grid-template-columns: 1fr;
	}

	.wholesale-form__row-group {
		grid-template-columns: 1fr;
	}

	.wholesale-hero__title {
		font-size: 32px;
	}

	.wholesale-form__submit {
		width: 100%;
		text-align: center;
	}
}

/* ---------- About Us page (page-about.php) ---------- */

.evo-about-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 64px 28px 48px;
}

.evo-about-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 44px;
	line-height: 1.1;
}

.evo-about-hero__tagline {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var(--evo-yorkie);
}

.evo-about-mission {
	max-width: 760px;
	margin: 0 auto;
	text-align: center;
	padding: 0 28px 56px;
}

.evo-about-mission__heading {
	margin: 0 0 20px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 28px;
}

.evo-about-mission__text {
	margin: 0 0 18px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-about-mission__text:last-child {
	margin-bottom: 0;
}

.evo-about-timeline {
	max-width: none;
	margin: 0 auto;
	padding: 48px 28px 64px;
	border-top: 1px solid var(--evo-glass-border);
}

.evo-about-timeline__heading {
	text-align: center;
	margin: 0 0 40px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
}

.evo-about-timeline__list {
	max-width: 760px;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	gap: 0;
	position: relative;
}

.evo-about-timeline__list::before {
	content: '';
	position: absolute;
	left: 74px;
	top: 6px;
	bottom: 6px;
	width: 2px;
	background: var(--evo-glass-border);
}

.evo-about-timeline__item {
	display: grid;
	grid-template-columns: 90px 1fr;
	gap: 20px;
	padding: 20px 0;
	position: relative;
}

.evo-about-timeline__year {
	position: relative;
	z-index: 1;
	display: flex;
	align-items: flex-start;
	justify-content: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 8px 6px;
	height: fit-content;
	box-shadow: var(--evo-glass-glow);
	text-align: center;
	white-space: nowrap;
}

.evo-about-timeline__body p {
	margin: 0 0 10px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.65;
	color: var(--evo-glass-text);
}

.evo-about-timeline__body p:last-child {
	margin-bottom: 0;
}

@media (max-width: 640px) {
	.evo-about-hero__title {
		font-size: 32px;
	}

	.evo-about-timeline__list::before {
		left: 34px;
	}

	.evo-about-timeline__item {
		grid-template-columns: 64px 1fr;
		gap: 14px;
	}

	.evo-about-timeline__year {
		font-size: 12px;
		padding: 6px 4px;
	}
}

/* ---------- Returns & Refunds page (page-returns-refunds.php) ----------
   Same hero pattern as the About Us page (title + centred intro copy), then an FAQ-style
   accordion built on native <details>/<summary> — expands with no JS, and stays keyboard/
   screen-reader accessible for free. Each item is its own glass card; the chevron rotates via
   the browser's native [open] state instead of a JS-toggled class. */

.evo-returns-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 16px;
	padding: 64px 28px 40px;
}

.evo-returns-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 40px;
	line-height: 1.1;
}

.evo-returns-hero__intro {
	max-width: 720px;
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-returns-faq {
	max-width: 820px;
	margin: 0 auto;
	padding: 0 28px 56px;
}

.evo-returns-faq__list {
	display: flex;
	flex-direction: column;
	gap: 14px;
}

.evo-returns-faq__item {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	overflow: hidden;
}

.evo-returns-faq__question {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding: 20px 24px;
	cursor: pointer;
	list-style: none;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	color: var(--evo-quality-sneaks);
	transition: color 0.15s ease;
}

.evo-returns-faq__question::-webkit-details-marker {
	display: none;
}

.evo-returns-faq__question:hover,
.evo-returns-faq__question:focus-visible {
	color: var(--evo-yorkie);
}

.evo-returns-faq__question-text {
	flex: 1 1 auto;
}

.evo-returns-faq__chevron {
	flex: 0 0 auto;
	width: 16px;
	height: 16px;
	background-color: currentColor;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M6%209l6%206%206-6%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E");
	transition: transform 0.2s ease;
}

.evo-returns-faq__item[open] .evo-returns-faq__chevron {
	transform: rotate(180deg);
}

.evo-returns-faq__item[open] .evo-returns-faq__question {
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.evo-returns-faq__answer {
	padding: 4px 24px 22px;
}

.evo-returns-faq__answer p {
	margin: 0 0 12px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-returns-faq__answer p:last-child {
	margin-bottom: 0;
}

.evo-returns-contact {
	max-width: 720px;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 20px;
	padding: 0 28px 72px;
}

.evo-returns-contact__text {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.evo-returns-contact__button {
	display: inline-flex;
	align-items: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 16px 40px;
	text-decoration: none;
	transition: background-color 0.15s ease;
}

.evo-returns-contact__button:hover,
.evo-returns-contact__button:focus-visible {
	background-color: var(--evo-yorkie);
}

@media (max-width: 640px) {
	.evo-returns-hero__title {
		font-size: 30px;
	}

	.evo-returns-faq__question {
		padding: 16px 18px;
		font-size: 14px;
	}

	.evo-returns-faq__answer {
		padding: 4px 18px 18px;
	}

	.evo-returns-contact__button {
		width: 100%;
		text-align: center;
		justify-content: center;
	}
}

/* ---------- Age Verification page (page-age-verification.php) ----------
   A plain legal/compliance page — same hero pattern as About Us/Returns & Refunds, then every
   section (heading + body paragraphs) sits inside one continuous glass card rather than
   separate boxes, since this reads as a single policy document rather than a list of
   independent, browsable items. */

.evo-age-verify-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 64px 28px 40px;
}

.evo-age-verify-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 40px;
	line-height: 1.1;
}

.evo-age-verify-hero__tagline {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var(--evo-yorkie);
}

.evo-age-verify-sections {
	max-width: 780px;
	margin: 0 auto;
	padding: 0 28px 64px;
}

.evo-age-verify-sections__card {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 40px 40px 8px;
}

.evo-age-verify-section {
	padding-bottom: 32px;
	margin-bottom: 32px;
	border-bottom: 1px solid var(--evo-glass-border);
}

.evo-age-verify-section:last-child {
	padding-bottom: 0;
	margin-bottom: 0;
	border-bottom: none;
}

.evo-age-verify-section__heading {
	margin: 0 0 14px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
}

.evo-age-verify-section__text {
	margin: 0 0 12px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-age-verify-section__text:last-child {
	margin-bottom: 0;
}

@media (max-width: 640px) {
	.evo-age-verify-hero__title {
		font-size: 30px;
	}

	.evo-age-verify-sections__card {
		padding: 28px 24px 4px;
	}

	.evo-age-verify-section__heading {
		font-size: 18px;
	}
}

/* ---------- GDPR page (page-gdpr.php) ----------
   Same hero + single-card layout as the Age Verification page. The intro/closing paragraphs
   (evo-gdpr-section--intro/--closing) skip the divider line so they read as bookends around
   the numbered sections rather than sections in their own right. evo-legal-list styles the
   bullet lists a section body can produce (see evo_render_legal_body_text() in functions.php)
   — reused by any future legal page that needs the same "- " bullet convention. */

.evo-gdpr-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 64px 28px 40px;
}

.evo-gdpr-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 40px;
	line-height: 1.1;
}

.evo-gdpr-hero__tagline {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var(--evo-yorkie);
}

.evo-gdpr-body {
	max-width: 780px;
	margin: 0 auto;
	padding: 0 28px 64px;
}

.evo-gdpr-body__card {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 40px 40px 8px;
}

.evo-gdpr-section {
	padding-bottom: 32px;
	margin-bottom: 32px;
	border-bottom: 1px solid var(--evo-glass-border);
}

.evo-gdpr-section:last-child {
	padding-bottom: 0;
	margin-bottom: 0;
	border-bottom: none;
}

.evo-gdpr-section--intro,
.evo-gdpr-section--closing {
	border-bottom: none;
	padding-bottom: 0;
}

.evo-gdpr-section--intro {
	margin-bottom: 8px;
}

.evo-gdpr-section__heading {
	margin: 0 0 14px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
}

.evo-gdpr-section p {
	margin: 0 0 12px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-gdpr-section p:last-child {
	margin-bottom: 0;
}

.evo-legal-list {
	margin: 0 0 12px;
	padding-left: 20px;
	list-style: disc;
}

.evo-legal-list li {
	margin: 0 0 10px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.7;
	color: var(--evo-glass-text);
}

.evo-legal-list li:last-child {
	margin-bottom: 0;
}

.evo-legal-list li::marker {
	color: var(--evo-quality-sneaks);
}

@media (max-width: 640px) {
	.evo-gdpr-hero__title {
		font-size: 30px;
	}

	.evo-gdpr-body__card {
		padding: 28px 24px 4px;
	}

	.evo-gdpr-section__heading {
		font-size: 18px;
	}
}

/* ---------- Terms & Conditions / Privacy Policy page (page-terms-conditions.php) ----------
   Same hero as the other legal pages, then a 2-tab switcher (Terms & Conditions / Privacy
   Policy) built with hidden radio inputs + the ~ sibling combinator — no JS needed, and with
   the Terms radio checked by default the content is still fully present and readable even if
   CSS fails to load. Body typography is deliberately tighter/smaller than the GDPR/Age
   Verification pages: this is one continuous numbered legal document (clauses down to
   4.3.9), not a handful of short sections, so it reads more like a real terms page and less
   like padded marketing copy. */

.evo-terms-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 64px 28px 32px;
}

.evo-terms-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 40px;
	line-height: 1.1;
}

.evo-terms-hero__intro {
	max-width: 640px;
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.evo-terms-tabs-section {
	max-width: 860px;
	margin: 0 auto;
	padding: 0 28px 64px;
}

.evo-terms-tabs__radio {
	position: absolute;
	opacity: 0;
	pointer-events: none;
}

.evo-terms-tabs__nav {
	display: flex;
	gap: 8px;
	margin-bottom: 24px;
	border-bottom: 1.5px solid var(--evo-glass-border);
}

.evo-terms-tabs__tab {
	display: inline-block;
	padding: 14px 22px;
	margin-bottom: -1.5px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-glass-text);
	border-bottom: 2.5px solid transparent;
	cursor: pointer;
	transition: color 0.15s ease, border-color 0.15s ease;
}

.evo-terms-tabs__tab:hover {
	color: var(--evo-quality-sneaks);
}

#evo-terms-tab-terms:checked ~ .evo-terms-tabs__nav .evo-terms-tabs__tab--terms,
#evo-terms-tab-privacy:checked ~ .evo-terms-tabs__nav .evo-terms-tabs__tab--privacy {
	color: var(--evo-quality-sneaks);
	border-bottom-color: var(--evo-quality-sneaks);
}

.evo-terms-tabs__panel {
	display: none;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 32px 36px;
}

#evo-terms-tab-terms:checked ~ .evo-terms-tabs__panel--terms,
#evo-terms-tab-privacy:checked ~ .evo-terms-tabs__panel--privacy {
	display: block;
}

.evo-terms-tabs__panel p {
	margin: 0 0 10px;
	font-family: var(--evo-body-font);
	font-size: 13.5px;
	line-height: 1.65;
	color: var(--evo-glass-text);
}

.evo-terms-tabs__panel p:last-child {
	margin-bottom: 0;
}

.evo-terms-tabs__panel .evo-legal-list {
	margin: 0 0 10px;
	padding-left: 20px;
	list-style: disc;
}

.evo-terms-tabs__panel .evo-legal-list li {
	margin: 0 0 8px;
	font-family: var(--evo-body-font);
	font-size: 13.5px;
	line-height: 1.65;
	color: var(--evo-glass-text);
}

.evo-terms-tabs__panel .evo-legal-list li:last-child {
	margin-bottom: 0;
}

.evo-terms-tabs__panel .evo-legal-list li::marker {
	color: var(--evo-quality-sneaks);
}

.evo-terms-tabs__panel a {
	color: var(--evo-quality-sneaks);
	text-decoration: underline;
}

.evo-terms-tabs__panel a:hover,
.evo-terms-tabs__panel a:focus-visible {
	color: var(--evo-yorkie);
}

@media (max-width: 640px) {
	.evo-terms-hero__title {
		font-size: 30px;
	}

	.evo-terms-tabs__nav {
		gap: 0;
	}

	.evo-terms-tabs__tab {
		flex: 1 1 0;
		text-align: center;
		padding: 12px 10px;
		font-size: 12px;
	}

	.evo-terms-tabs__panel {
		padding: 24px 20px;
	}
}

/* ---------- Our Stores page (page-our-stores.php) ---------- */

.evo-stores-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 10px;
	padding: 56px 28px 32px;
}

.evo-stores-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 40px;
	line-height: 1.1;
}

.evo-stores-hero__tagline {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 15px;
	color: var(--evo-glass-text);
}

.evo-stores-controls {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 20px;
	padding: 0 28px 40px;
}

.evo-stores-finder {
	display: flex;
	align-items: center;
	gap: 4px;
	background: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 6px 6px 6px 22px;
	width: 100%;
	max-width: 460px;
}

.evo-stores-finder input {
	flex: 1 1 auto;
	min-width: 0;
	border: none;
	background: transparent;
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	padding: 10px 0;
}

.evo-stores-finder input:focus {
	outline: none;
}

.evo-stores-finder__submit {
	flex-shrink: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 12px 22px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-stores-finder__submit:hover,
.evo-stores-finder__submit:focus-visible {
	background-color: var(--evo-yorkie);
}

.evo-stores-finder__message {
	margin: 0;
	min-height: 18px;
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-glass-text);
	text-align: center;
}

.evo-stores-filters {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 10px;
}

.evo-stores-filters__chip {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 9px 20px;
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.evo-stores-filters__chip:hover,
.evo-stores-filters__chip:focus-visible {
	border-color: var(--evo-quality-sneaks);
}

.evo-stores-filters__chip.is-active {
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border-color: var(--evo-quality-sneaks);
}

.evo-stores-empty {
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 15px;
	color: var(--evo-glass-text);
	padding: 0 28px 56px;
}

.evo-stores-grid {
	max-width: none;
	margin: 0 auto;
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
	gap: 28px;
	padding: 0 28px 64px;
}

.evo-store-card {
	display: flex;
	flex-direction: column;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	overflow: hidden;
}

.evo-store-card__media {
	position: relative;
	height: 180px;
	background: var(--evo-glass-bg-strong);
}

.evo-store-card__media img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.evo-store-card__media-placeholder {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	color: var(--evo-glass-text);
	opacity: 0.4;
}

/* what3words badge — small red square overlay, top-right of the store photo, echoing
   what3words' own "///" branding. Purely a link out to the store's what3words address; the
   words themselves are only in the title tooltip, not shown on the card face. */
.evo-store-card__w3w {
	position: absolute;
	top: 12px;
	right: 12px;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	background-color: #e11f26;
	color: var(--evo-cloud);
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	border-radius: 0;
	text-decoration: none;
	box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
}

.evo-store-card__body {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 22px 22px 24px;
}

.evo-store-card__name {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 22px;
}

.evo-store-card__badges {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

.evo-store-card__badge {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-quality-sneaks);
	background: rgba(106, 43, 198, 0.12);
	border: 1px solid rgba(106, 43, 198, 0.25);
	border-radius: 999px;
	padding: 5px 12px;
}

.evo-store-card__desc {
	margin: 0;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.evo-store-card__address {
	margin: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	color: var(--evo-glass-text);
}

.evo-store-card__distance {
	display: inline-block;
	align-self: flex-start;
	margin: -4px 0 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-cloud);
	background-color: var(--evo-yorkie);
	border-radius: 999px;
	padding: 4px 12px;
}

.evo-store-card__hours {
	display: flex;
	flex-direction: column;
	gap: 4px;
	background: var(--evo-glass-input-bg);
	border-left: 3px solid var(--evo-quality-sneaks);
	border-radius: 0;
	padding: 12px 16px;
}

.evo-store-card__hours strong {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	margin-bottom: 2px;
}

.evo-store-card__hours span {
	display: block;
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-glass-text);
	opacity: 0.9;
}

.evo-store-card__actions {
	display: flex;
	flex-direction: column;
	gap: 10px;
	margin-top: 4px;
}

.evo-store-card__call,
.evo-store-card__directions {
	display: flex;
	align-items: center;
	justify-content: center;
	text-align: center;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	border-radius: 999px;
	padding: 13px 20px;
	text-decoration: none;
	transition: background-color 0.15s ease, color 0.15s ease;
}

.evo-store-card__call {
	color: var(--evo-quality-sneaks);
	background: transparent;
	border: 1.5px solid var(--evo-quality-sneaks);
}

.evo-store-card__call:hover,
.evo-store-card__call:focus-visible {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

.evo-store-card__call--disabled {
	color: var(--evo-glass-text);
	border-color: var(--evo-glass-border);
	opacity: 0.6;
	cursor: default;
}

.evo-store-card__call--disabled:hover {
	background-color: transparent;
	color: var(--evo-glass-text);
}

.evo-store-card__directions {
	color: var(--evo-cloud);
	background-color: var(--evo-burnt-cotton);
	border: 1.5px solid var(--evo-burnt-cotton);
}

.evo-store-card__directions:hover,
.evo-store-card__directions:focus-visible {
	background-color: var(--evo-defeater);
	border-color: var(--evo-defeater);
}

@media (max-width: 480px) {
	.evo-stores-hero__title {
		font-size: 30px;
	}

	.evo-stores-finder {
		max-width: 100%;
	}

	.evo-stores-grid {
		grid-template-columns: 1fr;
	}
}

/* ---------- Vape Finder page (page-vape-finder.php) ---------- */

.vape-finder-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 56px 28px 40px;
}

.vape-finder-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 40px;
	line-height: 1.1;
}

.vape-finder-hero__intro {
	margin: 0;
	max-width: 560px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.vape-finder-quiz {
	max-width: 640px;
	margin: 0 auto 64px;
	padding: 40px 32px;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	text-align: center;
}

.vape-finder-quiz__progress {
	display: flex;
	justify-content: center;
	gap: 10px;
	margin-bottom: 28px;
}

.vape-finder-quiz__dot {
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background: var(--evo-glass-border);
	transition: background-color 0.2s ease;
}

.vape-finder-quiz__dot.is-active {
	background-color: var(--evo-quality-sneaks);
	box-shadow: var(--evo-glass-glow);
}

.vape-finder-quiz__question {
	margin: 0 0 28px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 22px;
	line-height: 1.3;
}

.vape-finder-quiz__answers {
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.vape-finder-quiz__answer {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	background-color: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 18px 24px;
	cursor: pointer;
	text-align: center;
	transition: background-color 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
}

.vape-finder-quiz__answer:hover,
.vape-finder-quiz__answer:focus-visible {
	border-color: var(--evo-quality-sneaks);
	background-color: rgba(106, 43, 198, 0.12);
	transform: translateY(-2px);
}

.vape-finder-quiz__back {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	margin-top: 28px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--evo-glass-text);
	background: none;
	border: none;
	cursor: pointer;
	opacity: 0.7;
}

.vape-finder-quiz__back:hover,
.vape-finder-quiz__back:focus-visible {
	opacity: 1;
	color: var(--evo-quality-sneaks);
}

.vape-finder-result {
	max-width: none;
	margin: 0 auto;
	padding: 0 28px 64px;
	text-align: center;
}

/* Belt-and-suspenders: guarantees both outcome sections stay fully hidden until the quiz JS
   reveals one of them, regardless of any other CSS on the page that might otherwise win out
   over the plain [hidden] attribute's default browser behaviour. */
.vape-finder-result[hidden] {
	display: none !important;
}

.vape-finder-result__heading {
	margin: 0 0 12px;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 32px;
}

.vape-finder-result__intro {
	max-width: 560px;
	margin: 0 auto 36px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.vape-finder-result__empty {
	font-family: var(--evo-body-font);
	font-size: 15px;
	color: var(--evo-glass-text);
	margin-bottom: 32px;
}

.vape-finder-result__grid {
	max-width: 1100px;
	margin: 0 auto 36px;
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 24px;
}

.vape-finder-product-card {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 10px;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	padding: 24px 20px;
	text-align: center;
}

.vape-finder-product-card__media {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	aspect-ratio: 1 / 1;
	background: var(--evo-product-image-bg);
	border-radius: 0;
	overflow: hidden;
}

.vape-finder-product-card__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	padding: 12px;
}

.vape-finder-product-card__name {
	margin: 4px 0 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 15px;
	color: var(--evo-glass-text);
}

.vape-finder-product-card__name a {
	color: inherit;
	text-decoration: none;
}

.vape-finder-product-card__name a:hover,
.vape-finder-product-card__name a:focus-visible {
	color: var(--evo-quality-sneaks);
}

.vape-finder-product-card__price {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 15px;
	color: var(--evo-quality-sneaks);
}

.vape-finder-product-card .evo-quick-shop-btn {
	width: 100%;
	margin-top: 4px;
	font-family: var(--evo-subtitle-font);
	font-weight: 700 !important;
	font-size: 13px !important;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border: none !important;
	border-radius: 999px !important;
	padding: 12px 18px !important;
}

.vape-finder-product-card .evo-quick-shop-btn:hover,
.vape-finder-product-card .evo-quick-shop-btn:focus-visible {
	background-color: var(--evo-yorkie) !important;
}

.vape-finder-result__restart {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-quality-sneaks);
	background: none;
	border: 1.5px solid var(--evo-quality-sneaks);
	border-radius: 999px;
	padding: 12px 28px;
	cursor: pointer;
	transition: background-color 0.15s ease, color 0.15s ease;
}

.vape-finder-result__restart:hover,
.vape-finder-result__restart:focus-visible {
	background-color: var(--evo-quality-sneaks);
	color: var(--evo-cloud);
}

@media (max-width: 640px) {
	.vape-finder-hero__title {
		font-size: 30px;
	}

	.vape-finder-quiz {
		padding: 28px 20px;
	}

	.vape-finder-quiz__question {
		font-size: 19px;
	}
}

/* ---------- Age verification gate ----------
   Visible by default; hidden the instant <html> carries .evo-age-verified — set either by the
   pre-paint cookie check in header.php's <head> (returning visitor, no flash at all) or by the
   "Yes" button's click handler in footer.php (first-time visitor). Locking body scroll the same
   way (html:not(.evo-age-verified) body) means there's only one source of truth for both. */
html:not(.evo-age-verified) body {
	overflow: hidden;
}

.evo-age-gate {
	position: fixed;
	inset: 0;
	z-index: 9999;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 24px;
	background-color: var(--evo-defeater);
	background-image: radial-gradient(circle at 30% 20%, rgba(106, 43, 198, 0.35), transparent 55%),
		radial-gradient(circle at 80% 80%, rgba(213, 53, 134, 0.3), transparent 55%);
}

html.evo-age-verified .evo-age-gate {
	display: none;
}

.evo-age-gate__panel {
	width: 100%;
	max-width: 420px;
	text-align: center;
	background: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	padding: 40px 32px;
}

.evo-age-gate__logo {
	width: 64px;
	height: auto;
	margin: 0 auto 20px;
	display: block;
}

.evo-age-gate__heading {
	font-family: var(--evo-subtitle-font);
	font-weight: 800;
	font-size: 24px;
	/* Was hardcoded to --evo-cloud (off-white) — read fine against the panel's dark background
	   in dark mode, but in light mode the panel itself turns near-white too, leaving pale text
	   on a pale background. --evo-glass-text already flips dark/light per theme, same as every
	   other glass panel on the site. */
	color: var(--evo-glass-text);
	margin-bottom: 12px;
}

.evo-age-gate__text {
	font-size: 14px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	opacity: 0.85;
	margin-bottom: 28px;
}

.evo-age-gate__actions {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.evo-age-gate__confirm,
.evo-age-gate__decline {
	width: 100%;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	padding: 14px 20px;
	border-radius: 999px;
	cursor: pointer;
	transition: background-color 0.15s ease, transform 0.15s ease, color 0.15s ease;
}

.evo-age-gate__confirm {
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
}

.evo-age-gate__confirm:hover,
.evo-age-gate__confirm:focus-visible {
	background-color: var(--evo-yorkie);
	transform: translateY(-2px);
}

.evo-age-gate__decline {
	color: var(--evo-glass-text);
	background: none;
	border: 1.5px solid var(--evo-glass-border);
}

.evo-age-gate__decline:hover,
.evo-age-gate__decline:focus-visible {
	border-color: var(--evo-glass-text);
}

/* ---------- "Notify Me" card link (out-of-stock products) ----------
   Reuses the Quick Shop button's base look (same class) but as a plain link through to the
   product page's real notify-me form, rather than opening the modal. */
.evo-quick-shop-btn--notify {
	background-color: var(--evo-burnt-cotton) !important;
}

.evo-quick-shop-btn--notify:hover,
.evo-quick-shop-btn--notify:focus-visible {
	background-color: var(--evo-defeater) !important;
}

/* ---------- Back-in-stock notify me form (single product page) ----------
   Only ever rendered while a product is out of stock — see evo_render_notify_me_form(). */
.evo-notify-me {
	margin-top: 18px;
	padding: 18px;
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1px solid var(--evo-glass-border);
	border-radius: 0;
}

.evo-notify-me__intro {
	font-size: 14px;
	color: var(--evo-glass-text);
	margin-bottom: 12px;
}

.evo-notify-me__form {
	display: flex;
	gap: 10px;
	flex-wrap: wrap;
}

.evo-notify-me__form input[type="email"] {
	flex: 1 1 220px;
	min-width: 0;
	padding: 12px 14px;
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	background: var(--evo-glass-bg-strong);
	color: var(--evo-glass-text);
	font-size: 14px;
}

.evo-notify-me__form button {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 12px 22px;
	cursor: pointer;
	white-space: nowrap;
	transition: background-color 0.15s ease;
}

.evo-notify-me__form button:hover,
.evo-notify-me__form button:focus-visible {
	background-color: var(--evo-yorkie);
}

.evo-notify-me__message {
	margin-top: 10px;
	font-size: 13px;
	color: var(--evo-quality-sneaks);
}

/* ---------- Recently Viewed (single product page) ----------
   Sits below WooCommerce's own Related Products block. Cards reuse .vape-finder-product-card
   wholesale (see functions.php) — same square, glass-styled card already built for the Vape
   Finder page, just in a differently-headed grid. Divider + heading treatment now matches
   .related.products above exactly — see the comment on that rule further up this file. */
.evo-recently-viewed {
	max-width: 1280px;
	margin: 48px auto 0;
	padding: 40px 24px 0;
	border-top: 1.5px solid var(--evo-glass-border);
}

.evo-recently-viewed__heading {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	font-size: 30px;
	margin: 0 0 24px;
}

/* Was a fixed 4-column grid with its own 960px/480px breakpoints — now matches the category-page
   product grid exactly (6 columns desktop, same gap sizes and breakpoints as the .columns-6 rules
   further up this file), per the "mirror category layout" request covering both Related Products
   and this Recently Viewed row. */
.evo-recently-viewed__grid {
	display: grid;
	grid-template-columns: repeat(6, 1fr);
	gap: 24px;
}

@media (max-width: 1024px) {
	.evo-recently-viewed__grid {
		grid-template-columns: repeat(3, 1fr);
		gap: 20px;
	}
}

@media (max-width: 767px) {
	.evo-recently-viewed__grid {
		grid-template-columns: repeat(2, 1fr);
		gap: 16px;
	}
}

/* ---------- Sticky mobile add-to-cart bar (single product page) ----------
   Mobile only — desktop shoppers already have the real add-to-cart form in view without needing
   to scroll far, so the bar is never rendered visible above 767px regardless of .is-visible. */
.evo-sticky-atc {
	display: none;
}

@media (max-width: 767px) {
	.evo-sticky-atc {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 500;
		display: flex;
		align-items: center;
		gap: 12px;
		padding: 10px 14px;
		background: var(--evo-glass-bg-strong);
		-webkit-backdrop-filter: var(--evo-glass-blur);
		backdrop-filter: var(--evo-glass-blur);
		border-top: 1px solid var(--evo-glass-border);
		box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.25);
		transform: translateY(100%);
		transition: transform 0.25s ease;
	}

	.evo-sticky-atc.is-visible {
		transform: translateY(0);
	}
}

.evo-sticky-atc__media {
	flex: 0 0 auto;
	width: 44px;
	height: 44px;
	background-color: var(--evo-product-image-bg);
	overflow: hidden;
}

.evo-sticky-atc__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.evo-sticky-atc__info {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.evo-sticky-atc__name {
	font-size: 12px;
	font-weight: 600;
	color: var(--evo-glass-text);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.evo-sticky-atc__price {
	font-size: 13px;
	font-weight: 700;
	color: var(--evo-quality-sneaks);
}

.evo-sticky-atc__button {
	flex: 0 0 auto;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 12px 20px;
	cursor: pointer;
	white-space: nowrap;
}

/* ---------- Brands page (page-brands.php) ----------
   A directory grid of every WooCommerce Brand (Products > Brands), unlike the homepage
   .brands-strip above — that one flattens every logo to a black/white silhouette to keep a thin
   strip visually calm; this dedicated page instead shows each logo in its own full colour, which
   is what a customer actually browsing-by-brand expects to see (matches the reference layout:
   logo tile on top, brand name centered underneath). */

.evo-brands-hero {
	max-width: none;
	margin: 0 auto;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 64px 28px 40px;
}

.evo-brands-hero__title {
	margin: 0;
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	color: var(--evo-quality-sneaks);
	text-shadow: 0 0 18px rgba(106, 43, 198, 0.5);
	font-size: 44px;
	line-height: 1.1;
}

.evo-brands-hero__intro {
	max-width: 640px;
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
	color: var(--evo-glass-text);
}

.evo-brands-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
	gap: 28px;
	max-width: 1200px;
	margin: 0 auto;
	padding: 0 28px 64px;
}

.evo-brands-grid__item {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 12px;
	text-decoration: none;
}

.evo-brands-grid__item:hover .evo-brands-grid__image,
.evo-brands-grid__item:focus-visible .evo-brands-grid__image {
	transform: translateY(-4px);
	box-shadow: var(--evo-glass-glow);
}

/* Square tile — the image fills it edge to edge (no inner padding/whitespace), scaling up or
   down as needed to match the box exactly, whatever the logo's own native proportions are. */
.evo-brands-grid__image {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	background-color: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	border-radius: 0;
	transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.evo-brands-grid__image img {
	width: 100%;
	height: 100%;
	object-fit: fill;
	display: block;
}

.evo-brands-grid__placeholder {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	letter-spacing: 0.06em;
	font-size: 13px;
	text-align: center;
	padding: 0 12px;
	color: var(--evo-glass-text);
	opacity: 0.7;
}

.evo-brands-grid__name {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-align: center;
	color: var(--evo-glass-text);
}

.evo-brands-empty {
	max-width: 640px;
	margin: 0 auto;
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 15px;
	color: var(--evo-glass-text);
	opacity: 0.8;
	padding: 0 28px 64px;
}

@media (max-width: 640px) {
	.evo-brands-hero {
		padding: 48px 20px 32px;
	}

	.evo-brands-hero__title {
		font-size: 32px;
	}

	.evo-brands-grid {
		grid-template-columns: repeat(2, 1fr);
		gap: 18px;
		padding: 0 20px 48px;
	}
}

/* =========================================================
   Evolution Vaping — Product page: mobile "hero" card + swipe/arrow navigation
   Phones (max-width: 960px, matching every other mobile/desktop split already used in this
   file): the usual gallery + title + price + add-to-cart block is hidden, and a compact card
   (see .evo-product-hero) takes its place instead — nothing else on the page changes, the full
   description, reviews and related products lower down the page are completely unaffected.
   Desktop/tablet (min-width: 961px): the page looks exactly as before, just with a small prev/
   next arrow either side of the product title — see .evo-product-hero-arrows.
   ========================================================= */

@media (max-width: 960px) {
	body.single-product .woocommerce-product-gallery,
	body.single-product .summary.entry-summary {
		display: none;
	}

	/* Fix (13 August 2026): hiding the gallery/summary above left their shared parent,
	   .evo-product-card, still in the page — with no visible children left inside it, it
	   collapsed down to just its own padding (20px top + 20px bottom on phones), which is
	   opaque black in dark mode / white in light mode (see .evo-product-card further up this
	   file — that's deliberate there, to block the page's glow blob behind the real desktop
	   gallery). On mobile that left a plain black (or white) bar with nothing in it sitting
	   between the hero card's Add to Cart/Show Options button and the description tabs
	   underneath. Hiding the card itself here removes that bar entirely — nothing inside it
	   was ever visible on mobile anyway, so this has no other effect. */
	body.single-product .evo-product-card {
		display: none;
	}

	/* The sticky "scroll back up to the add-to-cart form" bar (see .evo-sticky-atc) no longer
	   makes sense on phones now that the form it scrolls you back up to is hidden here — the new
	   hero's own Add to Cart/Show Options button replaces it. Left in the theme files rather than
	   removed (same as the header shrink-on-scroll feature elsewhere in this file), in case it's
	   ever wanted again if this section changes in future. */
	body.single-product .evo-sticky-atc {
		display: none !important;
	}
}

@media (min-width: 961px) {
	.evo-product-hero,
	.evo-product-hero-sheet {
		display: none !important;
	}
}

.evo-product-hero {
	padding: 8px 20px 28px;
	transition: opacity 0.14s ease, transform 0.14s ease;
}

.evo-product-hero.is-leaving {
	opacity: 0;
	transform: scale(0.98);
}

.evo-product-hero__media {
	width: 100%;
	aspect-ratio: 1 / 1;
	border-radius: 20px;
	overflow: hidden;
	background: var(--evo-product-image-bg);
	margin-bottom: 10px;
}

.evo-product-hero__image {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* A subtle, continuously-animating hint above the title so the swipe gesture isn't invisible —
   the two arrows drift outward and back in a slow loop, like a little "swipe this way" nudge,
   rather than sitting still and hoping someone tries swiping the title by chance. Hidden
   entirely (see .is-hidden, toggled in footer.php) when there's genuinely nothing to swipe to
   either direction. */
.evo-product-hero__swipe-hint {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 6px;
	margin-bottom: 6px;
	font-family: var(--evo-subtitle-font);
	font-size: 11px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var(--evo-quality-sneaks);
	opacity: 0.8;
	transition: opacity 0.2s ease;
}

.evo-product-hero__swipe-hint.is-hidden {
	opacity: 0;
	visibility: hidden;
}

.evo-product-hero__swipe-hint-arrow {
	display: inline-block;
	font-size: 13px;
	line-height: 1;
}

.evo-product-hero__swipe-hint-arrow:first-child {
	animation: evoSwipeHintNudgeLeft 1.8s ease-in-out infinite;
}

.evo-product-hero__swipe-hint-arrow:last-child {
	/* Drifts the opposite way to the left-hand arrow (see the two separate keyframes below,
	   rather than just playing the same one in reverse — a reverse-played symmetric animation
	   looks identical to playing it forward), so the two arrows nudge apart and back together
	   rather than both drifting the same direction — reads much more like "swipe either way". */
	animation: evoSwipeHintNudgeRight 1.8s ease-in-out infinite;
}

@keyframes evoSwipeHintNudgeLeft {
	0%, 100% {
		transform: translateX(0);
		opacity: 0.6;
	}
	50% {
		transform: translateX(-4px);
		opacity: 1;
	}
}

@keyframes evoSwipeHintNudgeRight {
	0%, 100% {
		transform: translateX(0);
		opacity: 0.6;
	}
	50% {
		transform: translateX(4px);
		opacity: 1;
	}
}

.evo-product-hero__title-row {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	touch-action: pan-y;
}

.evo-product-hero__title {
	font-family: var(--evo-heading-font);
	font-size: 22px;
	margin: 0;
	text-align: center;
	color: var(--evo-glass-text);
	user-select: none;
}

.evo-product-hero__chevron {
	font-size: 22px;
	line-height: 1;
	color: var(--evo-quality-sneaks);
	opacity: 0.6;
	flex: 0 0 auto;
}

.evo-product-hero__chevron.is-disabled {
	opacity: 0.15;
}

.evo-product-hero__price {
	text-align: center;
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 16px;
	color: var(--evo-quality-sneaks);
	margin-top: 6px;
}

.evo-product-hero__teaser {
	text-align: center;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.5;
	color: var(--evo-glass-text);
	opacity: 0.75;
	margin: 10px 0 0;
}

.evo-product-hero__read-more {
	display: inline-block;
	margin-left: 4px;
	font-weight: 700;
	color: var(--evo-quality-sneaks);
	opacity: 1;
	text-decoration: underline;
	white-space: nowrap;
}

.evo-product-hero__cta {
	display: flex !important;
	align-items: center;
	justify-content: center;
	width: 100%;
	margin-top: 18px !important;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 14px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border: none !important;
	border-radius: 999px !important;
	padding: 14px 20px !important;
}

/* ---------- Desktop/tablet prev/next arrows either side of the real product title ---------- */

.evo-product-hero-arrows {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 14px;
}

.evo-product-hero__arrow {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	flex: 0 0 auto;
	border-radius: 50%;
	font-size: 20px;
	line-height: 1;
	text-decoration: none;
	color: var(--evo-quality-sneaks);
	background: var(--evo-glass-bg-strong);
	transition: background 0.15s ease;
}

.evo-product-hero__arrow:hover {
	background: var(--evo-glass-bg-solid);
}

.evo-product-hero__arrow.is-disabled {
	opacity: 0.25;
	pointer-events: none;
}

@media (max-width: 960px) {
	.evo-product-hero-arrows {
		display: none;
	}
}

/* ---------- The half-screen "options" sheet (mobile only — see .evo-product-hero-sheet above) ---------- */

.evo-product-hero-sheet {
	position: fixed;
	inset: 0;
	z-index: 10050;
	visibility: hidden;
	pointer-events: none;
}

.evo-product-hero-sheet.is-open {
	visibility: visible;
	pointer-events: auto;
}

.evo-product-hero-sheet__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(0, 0, 0, 0.5);
	opacity: 0;
	transition: opacity 0.2s ease;
}

.evo-product-hero-sheet.is-open .evo-product-hero-sheet__backdrop {
	opacity: 1;
}

.evo-product-hero-sheet__panel {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	max-height: 65vh;
	overflow-y: auto;
	background: var(--evo-glass-bg-solid);
	border-radius: 22px 22px 0 0;
	padding: 14px 20px 28px;
	transform: translateY(100%);
	transition: transform 0.25s ease;
}

.evo-product-hero-sheet.is-open .evo-product-hero-sheet__panel {
	transform: translateY(0);
}

.evo-product-hero-sheet__handle {
	display: block;
	width: 40px;
	height: 4px;
	border-radius: 999px;
	background: var(--evo-glass-border);
	margin: 0 auto 14px;
}

.evo-product-hero-sheet__close {
	position: absolute;
	top: 14px;
	right: 16px;
	width: 32px;
	height: 32px;
	border: none;
	border-radius: 50%;
	background: var(--evo-glass-bg-strong);
	color: var(--evo-glass-text);
	display: flex;
	align-items: center;
	justify-content: center;
}

.evo-product-hero-sheet__loading {
	display: none;
	justify-content: center;
	padding: 30px 0;
}

.evo-product-hero-sheet__loading.is-visible {
	display: flex;
}

.evo-product-hero-sheet__spinner {
	width: 26px;
	height: 26px;
	border-radius: 50%;
	border: 3px solid rgba(0, 0, 0, 0.1);
	border-top-color: var(--evo-quality-sneaks);
	animation: evoHeroSheetSpin 0.7s linear infinite;
}

@keyframes evoHeroSheetSpin {
	to {
		transform: rotate(360deg);
	}
}

.evo-product-hero-sheet__body .evo-quick-shop-modal__media {
	width: 120px;
	height: 120px;
	background-color: var(--evo-product-image-bg);
	border-radius: 16px;
	overflow: hidden;
	margin: 0 auto 14px;
}

.evo-product-hero-sheet__body .evo-quick-shop-modal__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.evo-product-hero-sheet__body .evo-quick-shop-modal__title {
	text-align: center;
	font-family: var(--evo-heading-font);
	font-size: 18px;
	margin: 0 0 6px;
}

.evo-product-hero-sheet__body .evo-quick-shop-modal__title a {
	color: var(--evo-glass-text);
	text-decoration: none;
}

.evo-product-hero-sheet__body .evo-quick-shop-modal__price {
	text-align: center;
	font-weight: 700;
	color: var(--evo-quality-sneaks);
	margin-bottom: 14px;
}

body.evo-product-hero-sheet-open {
	overflow: hidden;
}

/* =============================================================================
   Checkout page (WooCommerce Blocks) — general aesthetic pass, 24 August 2026.
   Before this, the checkout page had zero custom styling (only the "use a
   saved address" picker had theme CSS) — everything else was raw WooCommerce
   Blocks default markup, visually disconnected from the purple/glass-panel
   look used everywhere else on the site (cart drawer, My Account, product
   pages). This section brings it in line: glass-panel step cards, pill
   buttons/inputs matching the site pattern, purple/heading-font section
   titles, and a sticky glass order-summary sidebar on desktop.

   Note: the class names below are WooCommerce Blocks' own component classes,
   not ours — they're stable across stores but should be checked live once
   after this goes in, in case this WooCommerce version's markup differs
   slightly (same "tell me what you see, we adjust" loop we used for the
   On Invoice gateway rollout).
   ============================================================================= */

.wp-block-woocommerce-checkout {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
	max-width: 1280px;
	margin: 0 auto;
	padding: 32px 24px 64px;
}

/* Step headings — "Contact information", "Shipping address", "Payment options" etc. */
.wc-block-components-checkout-step__title {
	font-family: var(--evo-heading-font);
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var(--evo-quality-sneaks);
	font-size: 20px;
}

.wc-block-components-checkout-step__description {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
	opacity: 0.75;
}

/* Each step as a soft glass card, same treatment as cart-drawer panels. */
.wc-block-components-checkout-step {
	background: var(--evo-glass-bg);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 24px;
	margin-bottom: 20px;
}

/* Radio options (shipping method + payment method) as selectable cards. Square, not rounded —
   matches the Cart page's panels (border-radius: 0 there too) rather than introducing a second,
   rounder card style just for Checkout. */
.wc-block-components-radio-control__option-layout,
.wc-block-components-radio-control-accordion-option {
	border-radius: 0 !important;
	border: 1.5px solid var(--evo-glass-border) !important;
	background: var(--evo-glass-input-bg);
	padding: 14px 16px !important;
	margin-bottom: 10px;
	transition: border-color 0.15s ease, background-color 0.15s ease;
}

.wc-block-components-radio-control__option-layout:has(input:checked),
.wc-block-components-radio-control-accordion-option.is-active,
.wc-block-components-radio-control__option[aria-checked="true"] {
	border-color: var(--evo-yorkie) !important;
	background: rgba(213, 53, 134, 0.08);
}

/* Order summary sidebar — glass panel, sticky on desktop like the cart drawer. */
.wc-block-checkout__sidebar,
.wc-block-components-sidebar {
	background: var(--evo-glass-bg-strong);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	padding: 24px;
}

@media (min-width: 992px) {
	.wc-block-checkout__sidebar {
		position: sticky;
		top: 24px;
	}
}

.wc-block-components-order-summary__title-text,
.wc-block-components-totals-wrapper .wc-block-components-totals-item__label {
	font-family: var(--evo-subtitle-font);
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

/* Grand total row — same emphasis treatment used elsewhere on the site. */
.wc-block-components-totals-footer-item .wc-block-components-totals-item__value,
.wc-block-components-totals-footer-item .wc-block-components-totals-item__label {
	font-family: var(--evo-heading-font);
	color: var(--evo-quality-sneaks);
	font-size: 18px;
}

/* Place Order button — same pill pattern as Proceed to Checkout / My Account buttons. */
.wc-block-components-checkout-place-order-button {
	font-family: var(--evo-subtitle-font) !important;
	font-weight: 700 !important;
	font-size: 15px !important;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud) !important;
	background-color: var(--evo-quality-sneaks) !important;
	border-radius: 999px !important;
	border: none !important;
	padding: 16px 24px !important;
	width: 100%;
}

.wc-block-components-checkout-place-order-button:hover {
	background-color: var(--evo-yorkie) !important;
}

/* Payment method labels (includes our On Invoice / Bank Transfer gateway). */
.wc-block-components-payment-method-label {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	text-transform: uppercase;
	font-size: 14px;
}

.evolution-on-account-blocks-description {
	font-family: var(--evo-body-font);
	font-size: 13px;
	opacity: 0.8;
	margin-top: 4px;
}

/* Field labels. */
.wc-block-components-text-input label {
	font-family: var(--evo-body-font);
	color: var(--evo-glass-text);
}

/* Validation errors — match the site's error colour. */
.wc-block-components-validation-error p {
	color: var(--evo-error-red-strong);
}

/* Mobile — summary sits below the form, no sticky. */
@media (max-width: 991px) {
	.wc-block-checkout__sidebar {
		margin-top: 24px;
	}
}

/* ==========================================================================
   Shipping & Delivery page — added 25 August 2026
   ========================================================================== */

.evo-shipping-delivery {
	max-width: 960px;
	margin: 0 auto;
	padding: 0 28px 64px;
}

.evo-shipping-delivery__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 38px;
	margin: 40px 0 12px;
}

.evo-shipping-delivery__intro {
	font-family: var(--evo-body-font);
	font-size: 15px;
	line-height: 1.6;
}

.evo-shipping-delivery__contact-link {
	margin: 4px 0 32px;
}

.evo-shipping-delivery__controls {
	margin-bottom: 32px;
}

.evo-shipping-finder__row {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	margin-bottom: 10px;
}

.evo-shipping-finder__country {
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 14px;
	color: var(--evo-glass-text);
	background: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 10px 16px;
}

.evo-shipping-finder__row input {
	flex: 1 1 auto;
	min-width: 200px;
	font-family: var(--evo-body-font);
	font-weight: 600;
	font-size: 15px;
	color: var(--evo-glass-text);
	background: var(--evo-glass-input-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 999px;
	padding: 10px 18px;
}

.evo-shipping-finder__submit {
	flex-shrink: 0;
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--evo-cloud);
	background-color: var(--evo-quality-sneaks);
	border: none;
	border-radius: 999px;
	padding: 12px 22px;
	cursor: pointer;
	transition: background-color 0.15s ease;
}

.evo-shipping-finder__submit:hover,
.evo-shipping-finder__submit:focus-visible {
	background-color: var(--evo-yorkie);
}

.evo-shipping-finder__message {
	margin: 0;
	min-height: 18px;
	font-family: var(--evo-body-font);
	font-size: 13px;
	color: var(--evo-glass-text);
}

.evo-shipping-results__zone {
	font-family: var(--evo-body-font);
	font-size: 15px;
	margin-bottom: 18px;
}

.evo-shipping-results__vat-note {
	font-size: 12px;
	opacity: 0.7;
	margin-left: 6px;
}

.evo-shipping-results__grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
	gap: 20px;
	margin-bottom: 40px;
}

.evo-shipping-service-card {
	display: flex;
	flex-direction: column;
	gap: 10px;
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	border-radius: 0;
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 24px;
}

.evo-shipping-service-card__title {
	font-family: var(--evo-subtitle-font);
	font-weight: 700;
	font-size: 20px;
	margin: 0;
}

.evo-shipping-service-card__price {
	font-family: var(--evo-body-font);
	font-weight: 700;
	font-size: 16px;
	margin: 0;
}

.evo-shipping-service-card__tiers {
	width: 100%;
	border-collapse: collapse;
	font-family: var(--evo-body-font);
	font-size: 13px;
}

.evo-shipping-service-card__tiers td {
	padding: 4px 0;
	border-top: 1px solid var(--evo-glass-border);
}

.evo-shipping-service-card__tiers td:last-child {
	text-align: right;
}

.evo-shipping-service-card__description {
	font-family: var(--evo-body-font);
	font-size: 13px;
	line-height: 1.5;
	opacity: 0.9;
	margin: 0;
}

.evo-shipping-service-card__disclaimer {
	font-family: var(--evo-body-font);
	font-size: 11px;
	line-height: 1.5;
	opacity: 0.65;
	margin: 0;
}

.evo-shipping-delivery__note-card {
	background: var(--evo-glass-bg);
	border: 1.5px solid var(--evo-glass-border);
	box-shadow: var(--evo-glass-shadow);
	-webkit-backdrop-filter: var(--evo-glass-blur);
	backdrop-filter: var(--evo-glass-blur);
	padding: 28px;
	font-family: var(--evo-body-font);
	font-size: 14px;
	line-height: 1.6;
}

.evo-shipping-delivery__cutoff-table {
	width: 100%;
	border-collapse: collapse;
	margin: 18px 0;
	font-size: 13px;
}

.evo-shipping-delivery__cutoff-table th,
.evo-shipping-delivery__cutoff-table td {
	text-align: left;
	padding: 8px 10px;
	border-bottom: 1px solid var(--evo-glass-border);
}

.evo-shipping-delivery__note-small {
	font-size: 12px;
	opacity: 0.75;
}

@media (max-width: 640px) {
	.evo-shipping-delivery__title {
		font-size: 28px;
	}

	.evo-shipping-finder__row input {
		min-width: 100%;
	}

	.evo-shipping-results__grid {
		grid-template-columns: 1fr;
	}
}

/* --- Bulk Order (CSV) — customer-facing My Account tab, added 4 Sep 2026 ---
   inc/customer-bulk-order.php. Deliberately plain/light-touch — the shared
   .woocommerce-MyAccount-content rules already style headings, inputs and
   .button/.button-primary consistently with every other account tab, so
   this only needs to lay out the two upload/template panels side by side
   and style the post-upload results (success line + Errors list). */

.evo-bulk-order-csv__results {
	margin: 0 0 20px;
}

.evo-bulk-order-csv__success {
	background: rgba(60, 160, 90, 0.1);
	border: 1px solid rgba(60, 160, 90, 0.3);
	border-radius: 10px;
	padding: 12px 16px;
	margin: 0 0 14px;
}

.evo-bulk-order-csv__errors {
	background: rgba(200, 90, 40, 0.08);
	border: 1px solid rgba(200, 90, 40, 0.28);
	border-radius: 10px;
	padding: 14px 16px;
}

.evo-bulk-order-csv__errors h3 {
	margin: 0 0 8px !important;
	font-size: 15px !important;
}

.evo-bulk-order-csv__errors ul {
	margin: 0 0 12px;
	padding-left: 18px;
}

.evo-bulk-order-csv__errors li {
	margin: 0 0 6px;
	font-size: 13px;
	line-height: 1.5;
}

.evo-bulk-order-csv__actions {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	margin: 0 0 18px;
}

.evo-bulk-order-csv__panel {
	flex: 1 1 260px;
	min-width: 240px;
	background: var(--evo-glass-bg-solid, #fff);
	border: 1.5px solid var(--evo-glass-border, rgba(0, 0, 0, 0.12));
	border-radius: 12px;
	padding: 16px 18px;
}

.evo-bulk-order-csv__panel h3 {
	margin: 0 0 6px !important;
	font-size: 15px !important;
}

.evo-bulk-order-csv__panel p {
	font-size: 13px;
	margin: 0 0 12px !important;
}

.evo-bulk-order-csv__panel input[type="file"] {
	display: block;
	margin: 0 0 12px;
	font-size: 13px;
}

.evo-bulk-order-csv__note {
	font-size: 13px;
	opacity: 0.8;
}

@media (max-width: 640px) {
	.evo-bulk-order-csv__actions {
		flex-direction: column;
	}
}
