/**
 * Custom Animations Override
 * Matches the Concept Shopify theme animation style
 * Version: 1.0.115
 *
 * Baseline: v1.0.5 (the last stable version the user installed)
 * Changes on top of v1.0.5:
 *   1. Fixed orphan closing brace that broke CSS parsing
 *   2. Added `opacity: 1 !important` + `transform: none !important`
 *      overrides on menu containers — required because Glozin's native
 *      CSS uses transform:scale(0)+opacity:0 without transitions, which
 *      made the close animation invisible (element snapped to scale(0)
 *      before clip-path could animate).
 *   3. Added Concept-style staggered item animations inside mega menu
 *      (translateX fade-in per-column with delay chain).
 */

/* ==========================================================================
   CSS Custom Properties
   ========================================================================== */

/* ==========================================================================
   SCROLLBAR GUTTER — prevent layout shift when overlays open

   The parent theme does `body { overflow: hidden }` whenever a modal /
   off-canvas / popover opens, which makes the page's scrollbar disappear
   and the content jumps right to fill the freed space. The theme tries
   to compensate with `body { padding-right: <scrollbar-width> }` but the
   two styles aren't perfectly in sync and you see a visible hop on each
   open. Concept (and other modern themes) avoid this by permanently
   reserving the scrollbar space.

   `scrollbar-gutter: stable` on `<html>` does exactly that: the gutter
   is always reserved, so `overflow: hidden` on `<body>` no longer frees
   any space and there's nothing to jump into. We then neutralize the
   parent's `padding-right` compensation (inline style on `<body>` set by
   jQuery) with an `!important` override — `scrollbar-gutter: stable`
   already accounts for the scrollbar, so the extra padding would cause
   an inverse shift. On macOS / iOS overlay scrollbars `scrollbar-gutter`
   has no visual effect (the scrollbar doesn't take layout space there
   anyway), so this is safe cross-platform.
   ========================================================================== */

html {
	/* Keep the scrollbar gutter reserved so opening an overlay doesn't
	   cause a layout jump. We deliberately do NOT customise scrollbar
	   thumb/track colors here — the user preferred the browser default. */
	scrollbar-gutter: stable;

	/* Paint the gutter white so opening an overlay no longer shows an
	   abrupt black→white flip in the reserved scrollbar strip.
	   What was happening: when a modal/minicart opens, the parent theme
	   sets `body { overflow: hidden }`, which hides the dark scrollbar.
	   The 15px gutter then exposes the canvas root color (transparent
	   <html> falls back to UA canvas, which on dark-mode systems shows
	   as black). With <html> bg = white, the dark scrollbar overlays on
	   top of white when visible; when it's hidden, white still shows.
	   A short transition smooths any future bg changes. */
	background-color: #ffffff;
	transition: background-color 0.30s var(--ios-backdrop-ease, cubic-bezier(0.7, 0, 0.2, 1));
}

body.modal-opened,
body.offcanvas-opened,
body.popover-opened,
body.search-modal-form {
	padding-right: 0 !important;
	padding-inline-end: 0 !important;
}


:root {
	--concept-ease-primary: cubic-bezier(0.3, 1, 0.3, 1);
	--concept-ease-fast: cubic-bezier(0.7, 0, 0.3, 1);
	--concept-ease-smooth: cubic-bezier(0.7, 0, 0.2, 1);
	--concept-ease-bounce: cubic-bezier(0.075, 0.82, 0.165, 1);
	--concept-ease-out: cubic-bezier(0.19, 1, 0.22, 1);
	--concept-duration-primary: 0.5s;
	--concept-duration-fast: 0.3s;
	--concept-duration-slow: 0.6s;
	/* Drawer animation — split into open/close for sequential switching */
	--drawer-ease: cubic-bezier(0.65, 0, 0.35, 1);
	--drawer-close-duration: 0.30s;
	--drawer-open-duration: 0.45s;
	/* Open waits until the close finishes → sequential feel when switching menus */
	--drawer-open-delay: 0.30s;
	/* Legacy alias (kept so any leftover reference still resolves) */
	--drawer-duration: 0.30s;

	/* Reveal animation (scroll-in effect). Tuned to match
	   Concept's product-grid entrance: a short rise with a soft
	   easing curve, staggered per-sibling via
	   `--gz-reveal-delay` set by custom-reveal.js. */
	--gz-reveal-duration: 0.56s;
	--gz-reveal-ease: cubic-bezier(0.3, 1, 0.3, 1);
	--gz-reveal-rise: 16px;
}

/* Page-load fade-from-black disabled. The PHP hook that injected
   #gz-page-fade has been removed; this defensive rule prevents the
   overlay from showing if stale cached markup exists during rollout. */
#gz-page-fade {
	display: none !important;
}

/* Android Chrome shows a blue tap flash on links/buttons by default.
   iOS Safari does not, so remove the tap highlight globally while
   preserving normal focus-visible outlines for keyboard users. */
html body a,
html body button,
html body [role="button"],
html body input[type="button"],
html body input[type="submit"],
html body .gz-button,
html body .button {
	-webkit-tap-highlight-color: transparent;
	touch-action: manipulation;
}


/* ==========================================================================
   REVEAL ANIMATION — scroll-in (Concept-style)

   Elements tagged `.gz-reveal` by custom-reveal.js start hidden
   (opacity:0 + translateY(var(--gz-reveal-rise))) and fade + rise into place when
   they enter the viewport (class `.is-in-view` added by the
   IntersectionObserver). Stagger between siblings is driven by the
   `--gz-reveal-delay` CSS variable JS sets on each element.

   Safety net — `.gz-reduced-motion` on <html> (set by the same JS
   when the user has `prefers-reduced-motion: reduce` OR the browser
   lacks IntersectionObserver) bypasses the hidden base state so
   content renders immediately.
   ========================================================================== */

.gz-reveal {
	opacity: 0;
	transform: translate3d(0, var(--gz-reveal-rise), 0);
	transition:
		opacity var(--gz-reveal-duration) var(--gz-reveal-ease),
		transform var(--gz-reveal-duration) var(--gz-reveal-ease);
	transition-delay: var(--gz-reveal-delay, 0ms);
	will-change: opacity, transform;
}

.gz-reveal.is-in-view {
	opacity: 1;
	transform: translate3d(0, 0, 0);
}

/* Reduced-motion / no-IO fallback: show content immediately, no
   opacity fade, no translate. Covers users who opted out of motion
   and browsers too old for IntersectionObserver. */
.gz-reduced-motion .gz-reveal,
.gz-reduced-motion .gz-reveal.is-in-view {
	opacity: 1 !important;
	transform: none !important;
	transition: none !important;
}


/* ==========================================================================
   1. HEADER MENU HOVER ANIMATION — Concept duplicate-label pill
      Concept uses two labels: the visible text and a duplicate dark pill
      that rises from below while the original label fades/scales upward.
      Glozin gives us the label in `data-title`, so the duplicate is created
      with a pseudo element instead of changing the menu markup.
   ========================================================================== */

@media (min-width: 1025px) {

	.primary-navigation .nav-menu > li > a {
		position: relative;
		overflow: hidden;
		z-index: 1;
		display: inline-flex;
		align-items: center;
		min-height: 42px;
		border-radius: 999px;
		padding: 0 20px !important;
		line-height: 1;
		color: var(--gz-header-color, #171717) !important;
		transition:
			color var(--concept-duration-primary) var(--concept-ease-primary),
			transform var(--concept-duration-primary) var(--concept-ease-primary);
	}

	.primary-navigation .nav-menu > li > a::after {
		content: attr(data-title);
		position: absolute;
		inset: 0;
		z-index: 2;
		display: flex;
		align-items: center;
		justify-content: center;
		padding: 0 20px;
		color: var(--gz-color-light, #ffffff);
		background-color: var(--gz-color-dark, #1a1a1a);
		border-radius: 999px;
		white-space: nowrap;
		transform: translate3d(0, 100%, 0) scale(0.6);
		transform-origin: center bottom;
		transition: transform var(--concept-duration-primary) var(--concept-ease-primary);
		pointer-events: none;
	}

	/* Remove dropdown caret arrows */
	.primary-navigation .nav-menu > li > a::before,
	.primary-navigation .nav-menu > li.menu-item-has-children > a::before {
		display: none !important;
	}

	.primary-navigation .nav-menu > li > a > .glozin-svg-icon.caret,
	.primary-navigation .nav-menu > li > a > .menu-item-icon.caret {
		display: none !important;
	}

	.primary-navigation .nav-menu > li.menu-item-has-children > a {
		padding-inline-end: 20px !important;
	}

	.primary-navigation .nav-menu > li:hover > a {
		color: transparent !important;
		transform: translateY(-1px);
	}

	.primary-navigation .nav-menu > li:hover > a::after {
		transform: translate3d(0, 0, 0) scale(1);
	}

	.primary-navigation .nav-menu > li:hover > a .glozin-svg-icon:not(.caret),
	.primary-navigation .nav-menu > li:hover > a .menu-item-icon:not(.caret) {
		color: var(--gz-color-light, #ffffff);
		transition: color var(--concept-duration-primary) var(--concept-ease-primary);
	}

	.primary-navigation .nav-menu > li > a:not([data-title])::after,
	.primary-navigation .nav-menu > li > a[data-title='']::after {
		content: none;
	}
}


/* ==========================================================================
   2. MEGA MENU / DROPDOWN — drawer reveal with symmetric open/close
      + Concept-style staggered item animations

      CRITICAL: We MUST override Glozin's native transform:scale(0) and
      opacity:0 with !important — otherwise the element snaps invisible
      on close before clip-path can animate.
   ========================================================================== */

@media (min-width: 1025px) {

	/* =============================================
	   PAGE BACKDROP — gradient dim (Concept-style):
	   darker near the header (top), lighter at bottom.
	   Matches Concept's linear-gradient(to top,
	     rgba(23,23,23,0.10) 40%, rgba(23,23,23,0.50) 80%)
	   ============================================= */
	body::after {
		content: '';
		position: fixed;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		background: linear-gradient(
			to top,
			rgba(23, 23, 23, 0.10) 40%,
			rgba(23, 23, 23, 0.50) 80%
		);
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		z-index: 10;
		transition:
			opacity var(--drawer-duration) var(--drawer-ease),
			visibility 0s linear var(--drawer-duration);
	}

	body:has(.primary-navigation .nav-menu > li.menu-item-has-children:hover)::after,
	body:has(.primary-navigation .nav-menu > li.menu-item-mega:hover)::after {
		opacity: 1;
		visibility: visible;
		transition:
			opacity var(--drawer-duration) var(--drawer-ease),
			visibility 0s linear 0s;
	}

	.site-header,
	.site-header__desktop {
		position: relative;
		z-index: 11;
	}

	/* =============================================
	   MEGA MENU + SUB-MENU OUTER — drawer reveal
	   Override Glozin's scale(0) / opacity:0 completely.

	   IMPORTANT: also lock `top: 100%` with !important.
	   Glozin's native CSS sets `top: calc(100% + 20px)`
	   as the default and transitions `top` over 0.3s.
	   Without this override the menu visibly "drops 20px"
	   during the close animation.
	   ============================================= */
	/* =============================================
	   ALL SUB-MENUS (regular + mega) — Concept drawer reveal.
	   The panel reveals downward with a rounded clipping mask while the
	   native Glozin scale(0) hiding is neutralized.

	   Pure CSS, no JS needed.
	   ============================================= */
	.primary-navigation .nav-menu li > ul.sub-menu,
	.primary-navigation .menu-item-mega .mega-menu {
		/* Force Glozin's hide props to "always open" */
		opacity: 1 !important;
		top: 100% !important;
		visibility: hidden;
		pointer-events: none;
		clip-path: inset(0 0 100% 0 round 0 0 20px 20px);
		-webkit-clip-path: inset(0 0 100% 0 round 0 0 20px 20px);
		transform: translate3d(0, -8px, 0) !important;
		transform-origin: top center;
		will-change: clip-path, transform;
		overflow: hidden;
		border-radius: 0 0 20px 20px !important;
		box-shadow: 0 24px 60px rgba(0, 0, 0, 0.10);
		transition:
			clip-path var(--drawer-close-duration) var(--drawer-ease),
			-webkit-clip-path var(--drawer-close-duration) var(--drawer-ease),
			transform var(--drawer-close-duration) var(--drawer-ease),
			visibility 0s linear var(--drawer-close-duration) !important;
	}

	.primary-navigation .nav-menu li:hover > ul.sub-menu,
	.primary-navigation .menu-item-mega:hover .mega-menu {
		opacity: 1 !important;
		transform: translate3d(0, 0, 0) !important;
		top: 100% !important;
		visibility: visible;
		pointer-events: auto;
		clip-path: inset(0 0 0 0 round 0 0 20px 20px);
		-webkit-clip-path: inset(0 0 0 0 round 0 0 20px 20px);
		transition:
			clip-path var(--drawer-open-duration) var(--drawer-ease) var(--drawer-open-delay),
			-webkit-clip-path var(--drawer-open-duration) var(--drawer-ease) var(--drawer-open-delay),
			transform var(--drawer-open-duration) var(--drawer-ease) var(--drawer-open-delay),
			visibility 0s linear var(--drawer-open-delay) !important;
	}

	.primary-navigation .nav-menu > li > ul.sub-menu:not(.mega-menu) {
		min-width: 250px;
		width: max-content;
		padding: 24px 0 32px;
		margin-inline-start: -32px;
		background: var(--gz-color-light, #ffffff);
		border: 0;
		border-radius: 20px !important;
		clip-path: inset(0 0 100% 0 round 20px);
		-webkit-clip-path: inset(0 0 100% 0 round 20px);
	}

	.primary-navigation .nav-menu > li:hover > ul.sub-menu:not(.mega-menu) {
		clip-path: inset(0 0 0 0 round 20px);
		-webkit-clip-path: inset(0 0 0 0 round 20px);
	}

	.primary-navigation .nav-menu > li > ul.sub-menu:not(.mega-menu) a {
		padding: 7px 32px;
	}

	.primary-navigation .menu-item-mega .mega-menu {
		background: var(--gz-color-light, #ffffff);
	}

	/* Glozin uses fixed-width mega menus for small dropdown-like menus
	   such as Home, Pages, and some Shop menus. Treat those like Concept's
	   rounded dropdown card, while leaving true full-width mega menus with
	   bottom-only rounding. */
	.primary-navigation .menu-item-mega .mega-menu:not(:has(> .mega-menu-container.full-width)) {
		border-radius: 20px !important;
		clip-path: inset(0 0 100% 0 round 20px);
		-webkit-clip-path: inset(0 0 100% 0 round 20px);
	}

	.primary-navigation .menu-item-mega:hover .mega-menu:not(:has(> .mega-menu-container.full-width)) {
		clip-path: inset(0 0 0 0 round 20px);
		-webkit-clip-path: inset(0 0 0 0 round 20px);
	}

	.primary-navigation .menu-item-mega .mega-menu:not(:has(> .mega-menu-container.full-width)) > .mega-menu-container {
		border-radius: 20px !important;
		overflow: hidden;
	}

	/* =============================================
	   MEGA MENU INNER ITEMS — Concept-style stagger
	   Items fade in + slide from the inline direction as the drawer opens
	   ============================================= */
	.primary-navigation .menu-item-mega .mega-menu .mega-menu__column > li {
		opacity: 0;
		transform: translateX(25%);
		transition:
			transform 1.0s var(--concept-ease-bounce),
			opacity 0.9s var(--concept-ease-out);
		transition-delay: 0s;
	}

	.primary-navigation .menu-item-mega:hover .mega-menu .mega-menu__column > li {
		opacity: 1;
		transform: translateX(0);
		transition:
			transform 0.7s var(--concept-ease-bounce),
			opacity 0.7s var(--concept-ease-out);
	}

	/* Column stagger — aligned with Concept's .3s/.4s/.5s item cadence. */
	.primary-navigation .menu-item-mega:hover .mega-menu .mega-menu__row > .mega-menu__column:nth-child(1) > li { transition-delay: 0.32s; }
	.primary-navigation .menu-item-mega:hover .mega-menu .mega-menu__row > .mega-menu__column:nth-child(2) > li { transition-delay: 0.42s; }
	.primary-navigation .menu-item-mega:hover .mega-menu .mega-menu__row > .mega-menu__column:nth-child(3) > li { transition-delay: 0.52s; }
	.primary-navigation .menu-item-mega:hover .mega-menu .mega-menu__row > .mega-menu__column:nth-child(4) > li { transition-delay: 0.62s; }

	/* Banner in the last column (if any) */
	.primary-navigation .menu-item-mega .mega-menu .mega-menu__column > li:has(.menu-widget-banner) {
		transform: translate3d(0, 12px, 0);
		transition:
			transform 0.55s var(--drawer-ease),
			opacity 0.45s var(--drawer-ease);
	}

	.primary-navigation .menu-item-mega:hover .mega-menu .mega-menu__column > li:has(.menu-widget-banner) {
		transform: translate3d(0, 0, 0);
		transition:
			transform 0.75s var(--concept-ease-bounce) 0.36s,
			opacity 0.65s var(--concept-ease-out) 0.36s;
	}

	.primary-navigation .menu-item-mega .mega-menu .menu-widget-banner {
		opacity: 0;
		transform: translate3d(0, 10px, 0) scale(0.985);
		transform-origin: center center;
		transition:
			transform 0.55s var(--drawer-ease),
			opacity 0.45s var(--drawer-ease);
		will-change: transform, opacity;
	}

	.primary-navigation .menu-item-mega:hover .mega-menu .menu-widget-banner {
		opacity: 1;
		transform: translate3d(0, 0, 0) scale(1);
		transition:
			transform 0.75s var(--concept-ease-bounce) 0.42s,
			opacity 0.65s var(--concept-ease-out) 0.42s;
	}

	/* Reset stagger on close so items fade out quickly together */
	.primary-navigation .menu-item-mega:not(:hover) .mega-menu .mega-menu__column > li:not(:has(.menu-widget-banner)),
	.primary-navigation .menu-item-mega:not(:hover) .mega-menu .mega-menu__row > .mega-menu__column > li:not(:has(.menu-widget-banner)) {
		transition-delay: 0s;
		transition-duration: 0.2s;
	}

	/* =============================================
	   REGULAR SUB-MENU ITEMS — subtle stagger fade
	   ============================================= */
	.primary-navigation .nav-menu li > ul.sub-menu:not(.mega-menu) > li {
		opacity: 0;
		transform: translateX(20%);
		transition:
			transform 1.0s var(--concept-ease-bounce),
			opacity 1.0s var(--concept-ease-out);
	}

	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li {
		opacity: 1;
		transform: translateX(0);
		transition:
			transform 0.6s var(--concept-ease-bounce),
			opacity 0.6s var(--concept-ease-out);
	}

	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(1) { transition-delay: 0.30s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(2) { transition-delay: 0.40s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(3) { transition-delay: 0.50s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(4) { transition-delay: 0.60s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(5) { transition-delay: 0.70s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(6) { transition-delay: 0.80s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(7) { transition-delay: 0.90s; }
	.primary-navigation .nav-menu li:hover > ul.sub-menu:not(.mega-menu) > li:nth-child(8) { transition-delay: 1.00s; }

	.primary-navigation .nav-menu li:not(:hover) > ul.sub-menu:not(.mega-menu) > li {
		transition-delay: 0s;
		transition-duration: 0.2s;
	}
}


/* ==========================================================================
   3. QUICK VIEW MODAL ANIMATION — Refined zoom + fade with staggered reveal
   ========================================================================== */

@keyframes zoomInCenter {
	0%   { transform: translate(-50%, -50%) scale(0.92); opacity: 0; }
	100% { transform: translate(-50%, -50%) scale(1);    opacity: 1; }
}

@keyframes zoomOutCenter {
	0%   { transform: translate(-50%, -50%) scale(1);    opacity: 1; }
	100% { transform: translate(-50%, -50%) scale(0.92); opacity: 0; }
}

.modal__backdrop {
	transition: opacity 0.8s var(--concept-ease-smooth),
	            visibility 0.8s var(--concept-ease-smooth);
}

@media (min-width: 768px) {
	.modal--open:not(.loading) {
		animation: fadeIn 0.5s var(--concept-ease-smooth) forwards;
	}

	.modal--open:not(.loading) .modal__container {
		animation: zoomInCenter 0.5s var(--concept-ease-smooth) forwards;
		transition: transform var(--concept-duration-slow) var(--concept-ease-smooth);
	}

	.modal--closing .modal__container {
		animation: zoomOutCenter 0.4s var(--concept-ease-smooth) forwards;
		transition: transform var(--concept-duration-slow) var(--concept-ease-smooth);
	}
}

.quick-view-modal .modal__content--quickview {
	opacity: 0;
	transition: opacity var(--concept-duration-primary) var(--concept-ease-primary) 0.25s,
	            visibility var(--concept-duration-primary) var(--concept-ease-primary) 0.25s;
}

.quick-view-modal.modal--open:not(.loading) .modal__content--quickview {
	opacity: 1;
}

.quick-view-modal.modal--closing .modal__content--quickview {
	opacity: 1;
}

.quick-view-modal .modal__button-close {
	opacity: 1;
	transition: transform 0.3s ease;
}

.quick-view-modal.modal--opening .modal__button-close,
.quick-view-modal.modal--open:not(.loading) .modal__button-close,
.quick-view-modal.modal--closing .modal__button-close {
	opacity: 1;
}

/* Quick-view fit fixes (v1.0.90): keep the close button on a solid
   white circle, let the desktop modal end with the image/content, and
   remove the mobile side gutters around the product carousel. */
.quick-view-modal .modal__wrapper--quickview,
.quick-view-modal .modal__content--quickview {
	overflow: hidden !important;
}

.quick-view-modal div.product .product-gallery-summary {
	margin-bottom: 0 !important;
}

html body #quick-view-modal .modal__button-close.gz-mc-style-close,
html body .quick-view-modal .modal__button-close.gz-mc-style-close {
	background-color: #ffffff !important;
	border-color: rgba(0, 0, 0, 0.10) !important;
	--gz-button-bg-color: #ffffff !important;
	--gz-button-bg-color-hover: #ffffff !important;
}

html body #quick-view-modal .modal__button-close.gz-mc-style-close:hover,
html body .quick-view-modal .modal__button-close.gz-mc-style-close:hover {
	background-color: #ffffff !important;
}

#quick-view-modal .product-featured-icons--single-product,
#quick-view-modal .product-featured-icons--mobile,
#quick-view-modal .wcboost-wishlist-button,
#quick-view-modal .wcboost-products-compare-button,
.quick-view-modal .product-featured-icons--single-product,
.quick-view-modal .product-featured-icons--mobile,
.quick-view-modal .wcboost-wishlist-button,
.quick-view-modal .wcboost-products-compare-button {
	display: none !important;
}

@media (min-width: 768px) {
	.quick-view-modal .modal__content--quickview,
	.quick-view-modal .modal__product,
	.quick-view-modal div.product.product-quickview,
	.quick-view-modal div.product .product-gallery-summary {
		min-height: 0 !important;
	}

	.quick-view-modal div.product .product-gallery-summary {
		gap: 0 !important;
		align-items: stretch !important;
	}

	.quick-view-modal div.product .woocommerce-product-gallery {
		flex: 0 0 50% !important;
		max-width: 50% !important;
		align-self: stretch !important;
		margin: 0 !important;
		overflow: hidden !important;
		background-color: #f6f6f6 !important;
	}

	.quick-view-modal div.product .entry-summary {
		padding-top: 30px !important;
		padding-bottom: 30px !important;
	}
}

@media (max-width: 767px) {
	.quick-view-modal .modal__container--quickview {
		padding-inline-start: 0 !important;
		padding-inline-end: 0 !important;
		height: min(70dvh, calc(100dvh - env(safe-area-inset-top, 0px) - 12px)) !important;
		max-height: min(70dvh, calc(100dvh - env(safe-area-inset-top, 0px) - 12px)) !important;
		min-height: 64dvh !important;
		overflow: hidden !important;
		max-width: 100% !important;
	}

	.quick-view-modal .modal__wrapper--quickview {
		border-radius: 15px 15px 0 0 !important;
		display: flex !important;
		flex-direction: column !important;
		height: 100% !important;
		max-height: 100% !important;
		overflow-x: hidden !important;
		overflow-y: auto !important;
		-webkit-overflow-scrolling: touch;
		overscroll-behavior: contain;
	}

	.quick-view-modal .modal__content--quickview {
		flex: 1 1 auto !important;
		min-height: 0 !important;
		overflow-x: hidden !important;
		overflow-y: auto !important;
		-webkit-overflow-scrolling: touch;
		overscroll-behavior: contain;
	}

	.quick-view-modal .modal__product,
	.quick-view-modal div.product.product-quickview,
	.quick-view-modal div.product .product-gallery-summary {
		min-height: 0 !important;
		overflow: visible !important;
	}

	.quick-view-modal div.product .woocommerce-product-gallery {
		width: 100vw !important;
		max-width: 100vw !important;
		margin-inline-start: 50% !important;
		transform: translateX(-50%) !important;
		padding: 0 !important;
	}

	.quick-view-modal div.product .woocommerce-product-gallery__wrapper,
	.quick-view-modal div.product .woocommerce-product-gallery__image,
	.quick-view-modal div.product .woocommerce-product-gallery__image a {
		border-radius: 0 !important;
	}

	.quick-view-modal div.product .entry-summary {
		padding-bottom: calc(30px + env(safe-area-inset-bottom, 0px)) !important;
	}
}

.animation-slide.modal--open:not(.loading) .modal__container,
.animation-slide.modal--closing .modal__container {
	transition: transform var(--concept-duration-slow) var(--concept-ease-smooth);
}

@media (max-width: 767px) {
	.modal--open:not(.loading) .modal__container {
		transition: transform 0.5s var(--concept-ease-smooth) 0.1s;
	}

	.modal--closing .modal__container {
		transition: transform 0.4s var(--concept-ease-smooth);
	}
}


/* ==========================================================================
   4. PRODUCT CARD — Show/hide animations on card hover
   ========================================================================== */

@media screen and (pointer: fine) {

	ul.products li.product .product-card-animation {
		opacity: 0;
		visibility: hidden;
		transform: translateY(10px);
		transition: opacity var(--concept-duration-primary) var(--concept-ease-primary),
		            visibility var(--concept-duration-primary) var(--concept-ease-primary),
		            transform var(--concept-duration-primary) var(--concept-ease-primary);
	}

	ul.products li.product .product-card-animation.product-card-animation--bottom {
		transform: translateY(10px);
	}

	ul.products li.product .product-inner:hover .product-card-animation {
		opacity: 1;
		visibility: visible;
		transform: translateY(0);
	}

	ul.products li.product .product-inner:hover .product-card-animation.product-card-animation--bottom {
		transform: translateY(0);
	}

	.product-featured-icons--primary > *:nth-child(1) { transition-delay: 0s; }
	.product-featured-icons--primary > *:nth-child(2) { transition-delay: 0.04s; }
	.product-featured-icons--primary > *:nth-child(3) { transition-delay: 0.08s; }
	.product-featured-icons--primary > *:nth-child(4) { transition-delay: 0.12s; }

	.product-featured-icons--second {
		transition: opacity var(--concept-duration-primary) var(--concept-ease-primary),
		            visibility var(--concept-duration-primary) var(--concept-ease-primary),
		            transform var(--concept-duration-primary) var(--concept-ease-primary) !important;
	}

	ul.products li.product .product-thumbnail .product-thumbnails--fadein img {
		transition: transform 0.8s var(--concept-ease-primary),
		            opacity 0.5s var(--concept-ease-primary);
	}

	ul.products li.product .product-inner:hover .product-thumbnail .product-thumbnails--fadein img {
		transform: scale(1.05);
	}

	ul.products li.product .product-thumbnails--fadein-image {
		transition: opacity var(--concept-duration-primary) var(--concept-ease-primary);
	}

	ul.products.product-card-wishlist-always-show li.product .product-featured-icons--primary > *:not(.wcboost-wishlist-button) {
		opacity: 0;
		visibility: hidden;
		transform: translateY(10px);
		transition: opacity var(--concept-duration-primary) var(--concept-ease-primary),
		            visibility var(--concept-duration-primary) var(--concept-ease-primary),
		            transform var(--concept-duration-primary) var(--concept-ease-primary);
	}

	ul.products.product-card-wishlist-always-show li.product .product-inner:hover .product-featured-icons--primary > *:not(.wcboost-wishlist-button) {
		opacity: 1;
		visibility: visible;
		transform: translateY(0);
	}

	ul.products li.product .product-inner .glozin-badges-sale__countdown {
		transition: opacity var(--concept-duration-fast) var(--concept-ease-fast),
		            visibility var(--concept-duration-fast) var(--concept-ease-fast),
		            transform var(--concept-duration-fast) var(--concept-ease-fast);
	}
}

@media screen and (pointer: coarse) {
	ul.products li.product .product-card-animation {
		transition: none;
	}
}


/* ==========================================================================
   5. CONCEPT-STYLE BUTTON FILL HOVER — JavaScript-driven
   ========================================================================== */

.btn-fill {
	display: block;
	position: absolute;
	width: 150%;
	height: 200%;
	top: -50%;
	left: -25%;
	border-radius: 50%;
	pointer-events: none;
	/* `z-index: -1` keeps the fill behind text nodes inside the button;
	   `isolation: isolate` on `.concept-hover-btn` pins it so it can't
	   escape below the button's own background. */
	z-index: -1;
	will-change: transform;
	/* Default — fill parked below the button. `:hover` / `:active`
	   slide it up to 0 (centered, covering the button). Driven by the
	   transition declared on `.concept-hover-btn .btn-fill` below. */
	transform: translate3d(0, 76%, 0);
	transition: transform 0.6s cubic-bezier(0.3, 1, 0.3, 1);
}

/* CSS-only hover fill — mirrors the minicart X-button's `:hover`-driven
   slide that the user likes. Works on desktop hover AND on mobile
   tap (mobile browsers hold `:hover` state on tap until another tap
   elsewhere, same as the X-button).

   `:active` is included so the animation starts on press (not just
   on hover-landing), which on touch feels immediate instead of
   lagging behind finger release. */
.concept-hover-btn:hover .btn-fill,
.concept-hover-btn:active .btn-fill,
.concept-hover-btn:focus-visible .btn-fill {
	transform: translate3d(0, 0%, 0);
}

.btn-fill ~ *,
.btn-fill ~ .glozin-svg-icon,
.btn-fill ~ .add-to-cart__text,
.btn-fill ~ span {
	position: relative;
	z-index: 1;
}

.concept-hover-btn {
	position: relative;
	overflow: hidden;
	/* Create a stacking context so the fill's z-index: -1 is scoped to the
	   button and doesn't drop behind the button's own background/border. */
	isolation: isolate;
}

@media (pointer: fine) {
	/* Transition color faster (was 0.5s + 0.1s delay — too long to wait
	   before the text becomes readable against the incoming fill). */
	.concept-hover-btn {
		transition: color 0.18s linear;
	}
}

.concept-hover-btn:hover,
.concept-hover-btn:active {
	background-color: var(--gz-button-bg-color) !important;
	border-color: var(--gz-button-border-color) !important;
	/* NOTE: `color` is deliberately NOT reset here. The old rule used
	   `color: var(--gz-button-color) !important` which tied with the
	   `.concept-hover-active` color rule below on specificity (both 0,2,0)
	   and, in practice, won the cascade — leaving the text invisible on
	   the white fill. Letting `.concept-hover-active` drive the color
	   directly (and JS sets an inline color as a safety net, see
	   custom-hover-buttons.js) keeps the text readable against the fill. */
}

.concept-hover-btn::before,
.concept-hover-btn::after {
	display: none !important;
}

.concept-hover-btn--secondary .btn-fill {
	background-color: var(--gz-color-dark, #171717);
}

.concept-hover-btn--primary .btn-fill {
	background-color: #ffffff;
}

/* Text color flip on hover. Covers the CSS-only path (`:hover`,
   `:active`) for mobile tap + desktop hover, and the legacy
   `.concept-hover-active` class (no longer added by JS but kept for
   safety in case any third-party code triggers it). */
.concept-hover-btn--secondary:hover,
.concept-hover-btn--secondary:active,
.concept-hover-btn--secondary:focus-visible,
.concept-hover-btn--secondary.concept-hover-active,
.concept-hover-btn--secondary:hover *,
.concept-hover-btn--secondary:active *,
.concept-hover-btn--secondary:focus-visible *,
.concept-hover-btn--secondary.concept-hover-active * {
	color: var(--gz-color-light, #ffffff) !important;
	-webkit-text-fill-color: var(--gz-color-light, #ffffff) !important;
}

.concept-hover-btn--primary:hover,
.concept-hover-btn--primary:active,
.concept-hover-btn--primary:focus-visible,
.concept-hover-btn--primary.concept-hover-active,
.concept-hover-btn--primary:hover *,
.concept-hover-btn--primary:active *,
.concept-hover-btn--primary:focus-visible *,
.concept-hover-btn--primary.concept-hover-active * {
	color: var(--gz-color-dark, #171717) !important;
	-webkit-text-fill-color: var(--gz-color-dark, #171717) !important;
}

.gz-buy-now-button.concept-hover-btn--primary:hover,
.gz-buy-now-button.concept-hover-btn--primary:active,
.gz-buy-now-button.concept-hover-btn--primary:focus-visible,
.gz-buy-now-button.concept-hover-btn--primary.concept-hover-active {
	color: var(--gz-color-primary, #c41230) !important;
	-webkit-text-fill-color: var(--gz-color-primary, #c41230) !important;
}

/* ----- Hover text colors — maximum-specificity overrides ---------------

   THE REAL BUG (fixed in this revision): the previous selectors used
   `body .single-product …` with a SPACE between `body` and `.single-product`.
   That means "`body`'s descendant with class `.single-product`" — but
   `.single-product` is on the BODY element itself, not a descendant, so
   the whole selector never matched and these rules were silently dead.
   The correct selector is `body.single-product` (no space — same element).
   Same trap avoided below for all class-on-body matches.

   JS in `custom-hover-buttons.js` ALSO sets `color` and
   `-webkit-text-fill-color` inline with `!important` on mouseenter — belt
   and suspenders.  `-webkit-text-fill-color` is included because Safari
   (and Chromium-on-Mac for form controls) uses it as the text paint
   color and it beats plain `color` when both are set. */

/* PRIMARY buttons (white fill → BLACK text):
     • Single-product "Add to cart"
     • Minicart "Checkout"
     • Sticky add-to-cart
   These rules do NOT require the JS-added `.concept-hover-btn` class, so
   they work even if the hover-fill JS fails to initialise the button. */
html body.single-product div.product button.single_add_to_cart_button:hover,
html body.single-product div.product button.single_add_to_cart_button:hover *,
html body .cart-panel .woocommerce-mini-cart__buttons a.button.checkout:hover,
html body .cart-panel .woocommerce-mini-cart__buttons a.button.checkout:hover *,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button:hover,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button:hover *,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button:hover,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button:hover * {
	color: #000000 !important;
	-webkit-text-fill-color: #000000 !important;
}

/* SECONDARY buttons (dark fill → WHITE text):
     • Minicart "View cart" (any minicart button that is NOT the checkout) */
html body .cart-panel .woocommerce-mini-cart__buttons a.button:not(.checkout):hover,
html body .cart-panel .woocommerce-mini-cart__buttons a.button:not(.checkout):hover * {
	color: #ffffff !important;
	-webkit-text-fill-color: #ffffff !important;
}

/* Minicart footer buttons layout — fill needs to sit under the text. */
.cart-panel .woocommerce-mini-cart__buttons a.button.concept-hover-btn {
	position: relative;
	overflow: hidden;
	isolation: isolate;
}


/* ==========================================================================
   6. PRODUCT TITLE LINK HOVER
   ========================================================================== */

ul.products li.product .woocommerce-loop-product__title a {
	transition: color var(--concept-duration-primary) var(--concept-ease-primary);
}


/* ==========================================================================
   7. MODAL CLOSE BUTTON
   ========================================================================== */

.modal__button-close .glozin-svg-icon {
	transition: transform var(--concept-duration-primary) var(--concept-ease-primary);
}

.modal__button-close:hover .glozin-svg-icon {
	transform: rotate(90deg);
}


/* ==========================================================================
   8. iOS-STYLE DRAWERS — cart, mobile menu, account/login
      Replaces the abrupt black backdrop and stiff slide with:
        • soft CSS-animated dim + backdrop-filter blur (iOS sheet feel)
        • iOS system ease curve on the drawer container
      Applies to all `.offscreen-panel` drawers (cart-panel, hamburger-panel,
      account-panel) and to `.login-modal` (opened by the mobile bottom-nav
      "Account" button).

      NOTE ON !important: the parent theme uses jQuery `.fadeIn()/.fadeOut()`
      on `.panel__backdrop`, which sets inline `display` + `opacity` styles.
      We beat those inline styles with `!important` so the backdrop becomes
      a pure CSS transition (opacity + backdrop-filter together), not a
      jQuery opacity tween on top of a solid-black box.
   ========================================================================== */

/* -------- Tokens (v2 — Concept-theme calibrated) --------
   Concept Shopify theme uses:
     --animation-primary: .5s cubic-bezier(.3, 1, .3, 1)
     .drawer .overlay      → transition: .8s cubic-bezier(.7,0,.2,1)
     .drawer .drawer__inner → transition: .6s cubic-bezier(.7,0,.2,1)
   We match those curves/durations, then layer a gradual
   backdrop-filter blur on top for the "iOS-like" depth effect. */
:root {
	/* Concept's drawer slide curve — silky, strong ease-out. */
	--ios-drawer-ease: cubic-bezier(0.7, 0, 0.2, 1);
	/* Slower curve for the backdrop — the dim/blur should breathe in,
	   not snap. Matches Concept's 0.8s overlay transition. */
	--ios-backdrop-ease: cubic-bezier(0.7, 0, 0.2, 1);

	--ios-drawer-open-duration: 0.62s;
	--ios-drawer-close-duration: 0.52s;
	--ios-backdrop-open-duration: 0.80s;
	--ios-backdrop-close-duration: 0.65s;

	/* Gradient dim values (Concept uses a gradient rather than a flat fill —
	   stronger dim on the far side, lighter near the drawer edge, giving a
	   sense of depth). We lower the "near" stop further so the blur does
	   the heavy lifting without the scene going muddy. */
	--ios-backdrop-dim-near: rgba(17, 17, 17, 0.12);
	--ios-backdrop-dim-far:  rgba(17, 17, 17, 0.42);

	/* Blur builds gradually via transition; these are the end states. */
	--ios-backdrop-blur: 16px;
	--ios-backdrop-saturate: 170%;
}

/* ---------- Shared panel backdrop (cart / mobile menu / account) ----------
   The parent theme fades these with jQuery (inline opacity + display styles).
   We use `!important` to beat those inline styles so the backdrop becomes a
   pure CSS transition — opacity, background, AND backdrop-filter animating
   together over the same 0.8s curve → gradual, synced dim + blur. */

/* IMPORTANT: `!important` on opacity/backdrop-filter is REQUIRED here.
   The parent theme runs jQuery `.fadeIn()/.fadeOut()` on the backdrop
   element directly — that tweens inline opacity 1↔0 over 400ms, and a
   non-`!important` rule loses to inline styles in the cascade. With
   `!important` we hold opacity at 0 (closed) / 1 (open) regardless of
   what jQuery writes inline, so the CSS transitions on the SAME
   properties become the visible animation.

   WHITE-SPIKE FIX: the gradient dim is painted via `background-image`
   on the BASE rule (not gated behind `--open`). Why it matters:
   `background-image` can't be transitioned in CSS, so when a rule with
   a gradient gets un-selected, the gradient vanishes INSTANTLY. The
   previous revision had the gradient only on `.--open`, so closing the
   drawer removed the dim at tick 0, then opacity + blur faded over
   650ms — you saw the page "un-dim" immediately, then blur fade after,
   a visible "white spike". Keeping the gradient on the base rule means
   the dim is always painted; opacity alone controls its visibility,
   and opacity animates smoothly both directions. Matches how the
   quick-view backdrop already works. */
.offscreen-panel .panel__backdrop {
	display: block !important;
	background-color: transparent !important;
	opacity: 0 !important;
	visibility: hidden;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	backdrop-filter: blur(0px) saturate(100%);
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear var(--ios-backdrop-open-duration);
	will-change: opacity, backdrop-filter;
}

/* Gradient dim lives on the BASE (class-independent) rule so it stays
   painted through the entire close animation and fades with opacity
   rather than disappearing instantly on class-removal.

   Direction rules for .panel__container drawers (cart, account, mobile
   menu): `.--side-right` stays on the right (parent's
   `.panel__container { transform: translateX(100%) }` base), and
   `.--side-left` gets flipped to the left by the parent's
   `.offscreen-panel--side-left .panel__container { translateX(-100%) }`
   override. So:
     • drawer on RIGHT  → far from drawer = LEFT  → gradient `to left`
       (strongest dim at the left edge of the page behind the drawer)
     • drawer on LEFT   → far from drawer = RIGHT → gradient `to right`
   (Filter panel's `.sidebar__container` is a DIFFERENT case — it uses
   `--side-right` but the parent CSS flips it to slide from the left.
   That's handled separately on `.sidebar__backdrop` further below.) */
.offscreen-panel.offscreen-panel--side-right .panel__backdrop {
	background-image: linear-gradient(
		to left,
		var(--ios-backdrop-dim-near) 30%,
		var(--ios-backdrop-dim-far)  85%
	) !important;
}

.offscreen-panel.offscreen-panel--side-left .panel__backdrop {
	background-image: linear-gradient(
		to right,
		var(--ios-backdrop-dim-near) 30%,
		var(--ios-backdrop-dim-far)  85%
	) !important;
}

.offscreen-panel--open .panel__backdrop {
	/* Open-state targets, also `!important` so they beat jQuery's inline
	   opacity tween (which would otherwise make the backdrop snap to a
	   partial value mid-animation). */
	opacity: 1 !important;
	visibility: visible;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		background-color var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear 0s;
}

/* ---------- Shared panel container (the drawer itself) ------------------- */

/* Container slide. The drop shadow is gated to the OPEN state only —
   leaving it on the closed-rest container made an 80px-wide shadow halo
   bleed back into the page from the right (cart/account/search) and
   from the left (mobile menu), showing as faint pink/grey gradients
   along the page edges even when nothing was open. We fade the shadow
   in/out together with the slide.

   Duration: symmetric 0.62s open AND close (not the 0.52s close var).
   User asked for matched speeds — the previous asymmetric close felt
   rushed next to the 0.62s open. */
.offscreen-panel .panel__container {
	transition:
		transform var(--ios-drawer-open-duration) var(--ios-drawer-ease),
		box-shadow var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
	box-shadow: 0 0 0 rgba(0, 0, 0, 0);
	will-change: transform;
}

.offscreen-panel--open .panel__container {
	transition:
		transform var(--ios-drawer-open-duration) var(--ios-drawer-ease),
		box-shadow var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
	box-shadow: -24px 0 80px rgba(0, 0, 0, 0.10);
}

.offscreen-panel--side-left.offscreen-panel--open .panel__container {
	box-shadow: 24px 0 80px rgba(0, 0, 0, 0.10);
}

/* ---------- Login modal + Search modal — drawer-styled overlays ----------
   Both are driven by `custom-modal-drawers.js` (Web Animations API) for
   reliable open/close animations on container AND backdrop. The parent
   theme's `glozin.openModal/closeModal` flips `display:none ↔ block` and
   tweens inline `opacity` with `$.fadeIn(1000)/fadeOut(400)` — so pure
   CSS transitions are unreliable here (no painted "from" state on open,
   and a cancelled keyframe animation leaves no style delta for a close
   transition to catch).

   CSS below provides:
     • The gradient dim + rest states (blur 0 ↔ 16px) that JS animates toward
     • `opacity: 1 !important` on the modal element so jQuery's opacity
       fade doesn't cross-fade the backdrop and container together
     • Container rest transforms so the drawer is offscreen when closed,
       even if JS fails to load. */

/* (1) Beat the jQuery fadeIn/fadeOut tween on the modal element.
   CRITICAL: do NOT put `!important` on `transform` on any container below
   — `!important` author declarations beat WAAPI animations in the CSS
   cascade, so a keyframe animation would run but its values would be
   ignored on the element. Keep transforms non-important; boost specificity
   via compound selectors if they need to beat parent theme rules. */
.login-modal.modal--opening,
.login-modal.modal--open,
.login-modal.modal--closing,
.search-modal.modal--opening,
.search-modal.modal--open,
.search-modal.modal--closing,
.quick-view-modal.modal--opening,
.quick-view-modal.modal--open,
.quick-view-modal.modal--closing,
.product-ask-question-modal.modal--opening,
.product-ask-question-modal.modal--open,
.product-ask-question-modal.modal--closing,
.product-share-modal.modal--opening,
.product-share-modal.modal--open,
.product-share-modal.modal--closing {
	opacity: 1 !important;
}

/* ---------- Backdrop — gradient dim rest states + blur target ----------
   JS (WAAPI) drives opacity + backdrop-filter for reliable animation on
   open (CSS transitions can't animate display:none → block reliably).
   The CSS declarations below act as the rest state AND as a fallback if
   JS fails to load. No `!important` on backdrop-filter/opacity so WAAPI
   wins during animation. */

.login-modal .modal__backdrop,
.login-modal.modal .modal__backdrop,
.search-modal .modal__backdrop,
.search-modal.modal .modal__backdrop,
.quick-view-modal .modal__backdrop,
.quick-view-modal.modal .modal__backdrop,
.product-ask-question-modal .modal__backdrop,
.product-ask-question-modal.modal .modal__backdrop,
.product-share-modal .modal__backdrop,
.product-share-modal.modal .modal__backdrop {
	background-color: transparent !important;
	opacity: 0;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	backdrop-filter: blur(0px) saturate(100%);
	will-change: opacity, backdrop-filter;
}

/* Login modal slides up from bottom → top-biased dim */
.login-modal .modal__backdrop,
.login-modal.modal .modal__backdrop {
	background-image: linear-gradient(
		to top,
		var(--ios-backdrop-dim-near) 30%,
		var(--ios-backdrop-dim-far)  85%
	) !important;
}

/* Search modal direction varies by viewport — gradient follows it. */
@media (min-width: 1200px) {
	/* Desktop: slides down from top → bottom-biased dim */
	.search-modal .modal__backdrop,
	.search-modal.modal .modal__backdrop {
		background-image: linear-gradient(
			to bottom,
			var(--ios-backdrop-dim-near) 30%,
			var(--ios-backdrop-dim-far)  85%
		) !important;
	}
}
@media (max-width: 1199px) {
	/* Mobile/tablet: slides in from right → left-biased dim (matches minicart) */
	.search-modal .modal__backdrop,
	.search-modal.modal .modal__backdrop {
		background-image: linear-gradient(
			to left,
			var(--ios-backdrop-dim-near) 30%,
			var(--ios-backdrop-dim-far)  85%
		) !important;
	}
}

/* Quick-view modal: centered/bottom-sheet — use a radial/top-biased fill */
.quick-view-modal .modal__backdrop,
.quick-view-modal.modal .modal__backdrop,
.product-ask-question-modal .modal__backdrop,
.product-ask-question-modal.modal .modal__backdrop,
.product-share-modal .modal__backdrop,
.product-share-modal.modal .modal__backdrop {
	background-image: radial-gradient(
		ellipse at center,
		var(--ios-backdrop-dim-near) 20%,
		var(--ios-backdrop-dim-far)  100%
	) !important;
}

/* Fallback CSS rest states for when JS hasn't fired yet.
   IMPORTANT: `quick-view-modal` is EXCLUDED from this rule because its
   WAAPI animation is event-driven (`glozin_product_quick_view_loaded`) and
   runs a frame after the class lands. Having a CSS end-state here would
   snap the backdrop to full blur the instant the class is added, and you'd
   see a jarring "site goes blurry immediately" before the modal slid in.
   For quick-view, WAAPI is the sole controller of the backdrop — if JS
   fails, the backdrop stays invisible (acceptable fallback vs. the snap). */
.login-modal.modal--open:not(.loading) .modal__backdrop,
.login-modal.modal--opening .modal__backdrop,
.search-modal.modal--open:not(.loading) .modal__backdrop,
.search-modal.modal--opening .modal__backdrop,
.product-ask-question-modal.modal--open:not(.loading) .modal__backdrop,
.product-ask-question-modal.modal--opening .modal__backdrop,
.product-share-modal.modal--open:not(.loading) .modal__backdrop,
.product-share-modal.modal--opening .modal__backdrop {
	opacity: 1;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
}

.login-modal.modal--closing .modal__backdrop,
.search-modal.modal--closing .modal__backdrop,
.quick-view-modal.modal--closing .modal__backdrop,
.product-ask-question-modal.modal--closing .modal__backdrop,
.product-share-modal.modal--closing .modal__backdrop {
	opacity: 0;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	backdrop-filter: blur(0px) saturate(100%);
	/* Parent rule `.modal--closing .modal__backdrop { transition: none }`
	   kills the close fallback; re-enable it. */
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease) !important;
}

/* ---------- Container rest states (NO `!important` on transform) ----------
   JS drives the slide via WAAPI. We purposely leave parent's transforms
   to define the base direction (mobile=right for search, bottom for login/
   quick-view; desktop=top for search, centered for login/quick-view). */

/* Login modal: desktop fade-scale via CSS keyframes. Mobile slide is pure
   WAAPI (the parent theme's default translateY(100%) base already sits the
   drawer offscreen below). */
@media (max-width: 767px) {
	.login-modal .modal__container {
		will-change: transform;
		box-shadow: 0 -24px 80px rgba(0, 0, 0, 0.10);
	}
}
@media (min-width: 768px) {
	.login-modal.modal--open:not(.loading) .modal__container {
		animation: iosModalIn var(--ios-drawer-open-duration) var(--ios-drawer-ease) forwards !important;
	}
	.login-modal.modal--closing .modal__container {
		animation: iosModalOut var(--ios-drawer-close-duration) var(--ios-drawer-ease) forwards !important;
	}
}

/* Search modal: parent handles the base direction per-viewport already
   (translateX(100%) <1200px, translateY(-120%) ≥1200px) — we just add a
   tasteful shadow. Transitions are ignored because WAAPI runs. */
.search-modal .modal__container {
	will-change: transform;
}
@media (max-width: 1199px) {
	.search-modal .modal__container {
		box-shadow: -24px 0 80px rgba(0, 0, 0, 0.10);
	}
}
@media (min-width: 1200px) {
	.search-modal .modal__container {
		box-shadow: 0 24px 80px rgba(0, 0, 0, 0.10);
	}
}

/* Quick-view modal: parent's default on desktop is zoomInCenter (0.35s
   ease); replace with the softer iOS fade-scale. Mobile uses dedicated
   slide-up/slide-down KEYFRAME animations instead of WAAPI because
   quick-view's open is gated behind an AJAX round trip — the modal goes
   from `display:none → block` in the same tick a bunch of other state
   settles, and WAAPI timing against that was unreliable. CSS keyframe
   animations start correctly on `display:none → block` (unlike CSS
   transitions), and using two distinct keyframe names (Up for open, Down
   for close) means neither cancels the other's fill state. */
.quick-view-modal .modal__container {
	will-change: transform;
}

.product-ask-question-modal .modal__container,
.product-share-modal .modal__container {
	will-change: transform;
}

.product-ask-question-modal .modal__wrapper,
.product-share-modal .modal__wrapper {
	background: #ffffff !important;
	-webkit-backdrop-filter: none !important;
	backdrop-filter: none !important;
	border: 0 !important;
	box-shadow: 0 24px 80px rgba(0, 0, 0, 0.14) !important;
}

.product-ask-question-modal .wpcf7-form .wpcf7-submit,
.product-ask-question-modal button[type="submit"],
.product-ask-question-modal input[type="submit"] {
	min-height: 50px !important;
	border-radius: 30px !important;
	padding: 0 28px !important;
	background: #111111 !important;
	border-color: #111111 !important;
	color: #ffffff !important;
	-webkit-text-fill-color: #ffffff !important;
	font-size: 14px !important;
	font-weight: 600 !important;
	line-height: 1 !important;
	text-transform: none !important;
	letter-spacing: 0 !important;
	box-shadow: none !important;
	position: relative !important;
	overflow: hidden !important;
	transition:
		background-color 0.32s cubic-bezier(0.7, 0, 0.3, 1),
		color 0.32s cubic-bezier(0.7, 0, 0.3, 1),
		transform 0.38s cubic-bezier(0.22, 1, 0.36, 1) !important;
}

.product-ask-question-modal button[type="submit"].concept-hover-btn {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	isolation: isolate !important;
	gap: 8px !important;
}

.product-ask-question-modal button[type="submit"].concept-hover-btn .btn-fill {
	display: block !important;
	background-color: #ffffff !important;
	z-index: 0 !important;
	opacity: 1 !important;
	visibility: visible !important;
	transform: translate3d(0, 76%, 0) !important;
	transition: transform 0.6s cubic-bezier(0.3, 1, 0.3, 1) !important;
}

.product-ask-question-modal button[type="submit"].concept-hover-btn:hover .btn-fill,
.product-ask-question-modal button[type="submit"].concept-hover-btn:active .btn-fill,
.product-ask-question-modal button[type="submit"].concept-hover-btn:focus-visible .btn-fill {
	transform: translate3d(0, 0, 0) !important;
}

.product-ask-question-modal button[type="submit"].concept-hover-btn > *:not(.btn-fill) {
	position: relative !important;
	z-index: 1 !important;
}

.product-ask-question-modal button[type="submit"].concept-hover-btn:hover,
.product-ask-question-modal button[type="submit"].concept-hover-btn:active,
.product-ask-question-modal button[type="submit"].concept-hover-btn:focus-visible {
	color: #111111 !important;
	-webkit-text-fill-color: #111111 !important;
	transform: translate3d(0, -1px, 0);
}

.product-ask-question-modal button[type="submit"].concept-hover-btn:hover *:not(.btn-fill),
.product-ask-question-modal button[type="submit"].concept-hover-btn:active *:not(.btn-fill),
.product-ask-question-modal button[type="submit"].concept-hover-btn:focus-visible *:not(.btn-fill) {
	color: #111111 !important;
	-webkit-text-fill-color: #111111 !important;
}

/* Mobile quick-view: animations driven by JS (Web Animations API) in
   custom-modal-drawers.js, triggered on the `glozin_product_quick_view_loaded`
   event. CSS keyframes here proved unreliable because the modal arrives
   at `display:block` via jQuery.fadeIn in the same tick as the class
   changes after an AJAX round-trip — some browsers don't restart an
   animation whose `animation-name` was set while the element was still
   `display:none`. WAAPI + an explicit event hook gives us deterministic
   timing. */

@media (min-width: 768px) {
	.quick-view-modal.modal--open:not(.loading) .modal__container {
		animation: iosModalIn var(--ios-drawer-open-duration) var(--ios-drawer-ease) forwards !important;
	}
	.quick-view-modal.modal--closing .modal__container {
		animation: iosModalOut var(--ios-drawer-close-duration) var(--ios-drawer-ease) forwards !important;
	}
	.product-ask-question-modal.modal--open:not(.loading) .modal__container,
	.product-share-modal.modal--open:not(.loading) .modal__container {
		animation: iosModalIn var(--ios-drawer-open-duration) var(--ios-drawer-ease) forwards !important;
	}
	.product-ask-question-modal.modal--closing .modal__container,
	.product-share-modal.modal--closing .modal__container {
		animation: iosModalOut var(--ios-drawer-close-duration) var(--ios-drawer-ease) forwards !important;
	}
}

@keyframes iosSheetSlideUp {
	from { transform: translateY(100%); }
	to   { transform: translateY(0);    }
}
@keyframes iosSheetSlideDown {
	from { transform: translateY(0);    }
	to   { transform: translateY(100%); }
}
@keyframes iosBackdropFadeIn {
	from {
		opacity: 0;
		-webkit-backdrop-filter: blur(0px) saturate(100%);
		        backdrop-filter: blur(0px) saturate(100%);
	}
	to {
		opacity: 1;
		-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
		        backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	}
}
@keyframes iosBackdropFadeOut {
	from {
		opacity: 1;
		-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
		        backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	}
	to {
		opacity: 0;
		-webkit-backdrop-filter: blur(0px) saturate(100%);
		        backdrop-filter: blur(0px) saturate(100%);
	}
}

@keyframes iosModalIn {
	0%   { transform: translate(-50%, -46%) scale(0.94); opacity: 0; }
	60%  { opacity: 1; }
	100% { transform: translate(-50%, -50%) scale(1);    opacity: 1; }
}

@keyframes iosModalOut {
	0%   { transform: translate(-50%, -50%) scale(1);    opacity: 1; }
	100% { transform: translate(-50%, -47%) scale(0.97); opacity: 0; }
}

/* ---------- Respect reduced-motion preferences ---------- */

@media (prefers-reduced-motion: reduce) {
	.offscreen-panel .panel__backdrop,
	.offscreen-panel--open .panel__backdrop,
	.offscreen-panel .panel__container,
	.offscreen-panel--open .panel__container,
	.login-modal .modal__backdrop,
	.login-modal .modal__container,
	.search-modal .modal__backdrop,
	.search-modal .modal__container,
	.quick-view-modal .modal__backdrop,
	.quick-view-modal .modal__container,
	.product-ask-question-modal .modal__backdrop,
	.product-ask-question-modal .modal__container,
	.product-share-modal .modal__backdrop,
	.product-share-modal .modal__container,
	.offscreen-panel--side-right .sidebar__backdrop,
	.offscreen-panel--side-left .sidebar__backdrop,
	.offscreen-panel--side-right .sidebar__container,
	.offscreen-panel--side-left .sidebar__container,
	.popover .popover__backdrop,
	.popover .popover__container {
		transition-duration: 0.01s !important;
		animation-duration: 0.01s !important;
	}
}


/* ==========================================================================
   9. iOS-STYLE DRAWERS — filter sidebar + popovers (sort-by, cart note,
      cart discount, cart estimate)

      These use DIFFERENT class conventions than `.offscreen-panel`:
        • Filter sidebar (shop page mobile):
            root: `<aside class="... offscreen-panel--side-right">`  (no base `.offscreen-panel` class!)
            backdrop: `.sidebar__backdrop`
            container: `.sidebar__container`
            open state: `.offscreen-panel--open` added by JS
        • Popovers (sort-by, cart note/discount/estimate):
            root: `<div class="popover …-popover">`
            backdrop: `.popover__backdrop`
            container: `.popover__container`
            open state: `.popover--open` added by JS; element also goes
                        `display:none → block` via jQuery .fadeIn().

      Both gain the minicart's gradient dim + gradual blur, and a smooth
      iOS slide. Popovers keep their bottom-sheet direction (slide up from
      bottom).
   ========================================================================== */

/* ---------- Filter sidebar — slide-from-right drawer (mobile) ---------- */

/* Same "white-spike" fix applied to .sidebar__backdrop as .panel__backdrop
   above: put the gradient dim on the BASE rule so it stays painted
   through the close animation and fades with opacity. Without this,
   closing the filter drawer pulled the dim off immediately, so the
   page briefly flashed bright white before the blur unfaded. */
.offscreen-panel--side-right .sidebar__backdrop,
.offscreen-panel--side-left  .sidebar__backdrop {
	display: block !important;
	background-color: transparent !important;
	opacity: 0 !important;
	visibility: hidden;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	        backdrop-filter: blur(0px) saturate(100%);
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear var(--ios-backdrop-open-duration);
	will-change: opacity, backdrop-filter;
}

/* Direction for the filter sidebar is INVERTED vs .panel__container:
   the parent theme's `.offscreen-panel.offscreen-panel--side-right .sidebar__container`
   rule re-anchors the filter drawer to `left:0; translateX(-100%)`,
   so despite the `--side-right` class the drawer actually slides in
   from the LEFT and occupies the left portion of the viewport when
   open. The farthest point from the drawer is therefore the RIGHT
   side, and the gradient should flow `to right`. */
.offscreen-panel--side-right .sidebar__backdrop {
	background-image: linear-gradient(
		to right,
		var(--ios-backdrop-dim-near) 30%,
		var(--ios-backdrop-dim-far)  85%
	) !important;
}
.offscreen-panel--side-left .sidebar__backdrop {
	background-image: linear-gradient(
		to left,
		var(--ios-backdrop-dim-near) 30%,
		var(--ios-backdrop-dim-far)  85%
	) !important;
}

.offscreen-panel--open .sidebar__backdrop {
	opacity: 1 !important;
	visibility: visible;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	        backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear 0s;
}

/* Filter drawer only: this is the laggy shop-page drawer path. It uses
   `.sidebar__backdrop`, while minicart uses `.panel__backdrop`. Keep the
   same final iOS glass look and duration, but do not tween
   backdrop-filter on every frame. */
#filter-sidebar-panel .sidebar__backdrop {
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate)) !important;
	        backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate)) !important;
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear var(--ios-backdrop-open-duration) !important;
	will-change: opacity;
}

#filter-sidebar-panel.offscreen-panel--open .sidebar__backdrop {
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear 0s !important;
}

/* Sidebar container slide — parent already has translateX(100%) base
   and a 0.35s transition; swap to our iOS timing. No `!important` on
   transform so the `.offscreen-panel--open` open state still wins.

   IMPORTANT: gate the drawer-only styling (box-shadow especially) to
   the mobile breakpoint. The shop-page filter `<aside>` carries the
   `offscreen-panel--side-right` class on ALL screen sizes — on desktop
   it renders as a normal inline sidebar via `.catalog-filters-sidebar`
   (which the parent theme hides under 1024px and reveals as a slide-out
   panel instead). Without the media query, the drawer's drop shadow
   leaked onto the desktop sidebar and made the "Filter by price"
   widget look like a stray white card. */
/* Filter off-canvas animation — cloned from the minicart's
   `.panel__container` drawer animation above. Same 0.62s symmetric
   open+close with the same cubic-bezier curve. Shadow gated to the
   open state so it doesn't halo the closed/offscreen side.

   NOT gated behind a media query anymore. Previous gate was
   `@media (max-width: 1024px)` — but the actual drawer-mode
   breakpoint varies based on which Elementor layout the shop uses,
   and some viewports (e.g. 1100px tablets) slipped between
   max-width:1024 and parent's hide-inline-sidebar threshold, so the
   drawer fell back to the parent's default 0.35s transition and
   felt faster than the minicart's 0.62s. Applying at all viewports
   is safe: on desktop where the filter renders inline (not as a
   drawer), `transform` stays `none` and the transitions just sit idle. */
.offscreen-panel--side-right .sidebar__container,
.offscreen-panel--side-left  .sidebar__container {
	transition:
		transform var(--ios-drawer-open-duration) var(--ios-drawer-ease),
		box-shadow var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
	will-change: transform;
	box-shadow: 0 0 0 rgba(0, 0, 0, 0);
}
.offscreen-panel--side-right.offscreen-panel--open .sidebar__container {
	box-shadow: -24px 0 80px rgba(0, 0, 0, 0.10);
}
.offscreen-panel--side-left.offscreen-panel--open .sidebar__container {
	box-shadow: 24px 0 80px rgba(0, 0, 0, 0.10);
}
.offscreen-panel--open .sidebar__container {
	transition:
		transform var(--ios-drawer-open-duration) var(--ios-drawer-ease),
		box-shadow var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
}


/* ---------- Popovers — bottom-sheet slide (mobile sort-by, cart note,
                cart discount, cart estimate) ---------- */

.popover .popover__backdrop {
	display: block !important;
	background-color: transparent !important;
	background-image: linear-gradient(
		to top,
		var(--ios-backdrop-dim-near) 30%,
		var(--ios-backdrop-dim-far)  85%
	) !important;
	opacity: 0 !important;
	visibility: hidden;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	        backdrop-filter: blur(0px) saturate(100%);
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear var(--ios-backdrop-open-duration) !important;
	will-change: opacity, backdrop-filter;
}

.popover.popover--open .popover__backdrop {
	opacity: 1 !important;
	visibility: visible;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	        backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear 0s !important;
}

/* Bottom-sheet container — parent uses a subtle `translateY(30px)` base.
   We replace with a full `translateY(100%)` so the sheet slides in from
   below the viewport rather than just nudging upward. */
.popover .popover__container {
	transform: translateY(100%);
	transition: transform var(--ios-drawer-close-duration) var(--ios-drawer-ease);
	will-change: transform;
	box-shadow: 0 -24px 80px rgba(0, 0, 0, 0.10);
}

.popover.popover--open .popover__container {
	transform: translateY(0);
	transition: transform var(--ios-drawer-open-duration) var(--ios-drawer-ease);
}

/* Popovers use jQuery .fadeIn()/.fadeOut() on the ROOT `.popover`
   element, which tweens inline opacity. Force opacity:1 during the
   open/closing states so the container and backdrop animate cleanly
   on their own, without jQuery's opacity tween interfering. */
.popover.popover--open {
	opacity: 1 !important;
}


/* ==========================================================================
   10. Cart-panel popovers — Add note / Add coupon / Estimate shipping

   Fixes for screenshot issues:

   (A) "The blur eats part of the 'Shopping Cart' words at the top"
       — The popovers default to `position: fixed` covering the full
         viewport, so their backdrop's blur is applied to EVERYTHING
         behind, including the minicart header. Solution: constrain
         the popover (and its backdrop + container) to the cart-panel
         CONTENT area only by re-parenting via position:absolute inside
         a now-relative `.panel__content`. The header stays crisp, the
         blur only covers the scrollable cart area below.

   (B) "A weird whitish strip above the popover content"
       — `.popover__container` has `padding-top: 65px` by default (room
         for a circular close button used by currency/language/orderby
         popovers). These note/discount/estimate popovers don't have
         that close button — they use their own "Close" action button
         instead — so the 65px just shows the blurred backdrop through
         a transparent gap above the white content box. Solution: kill
         the padding for these specific popovers and pin the container
         flush against the bottom of the cart panel.
   ========================================================================== */

/* Popover is anchored to the cart-panel content area (not the viewport),
   so opening note/shipping/discount darkens only the minicart, not the
   page behind. Container animation + backdrop fill/opacity live in
   section 13 below.

   The ROOT popover's opacity + visibility transition MUST match the
   container slide + backdrop fade durations in section 13 (0.42s) so
   nothing snaps. Previously 0.62s but that felt laggy on open/close —
   0.42s with the same cubic-bezier is the sweet spot (snappy but still
   readable). visibility is transitioned with a 0.42s linear delay so
   the element stays `visibility: visible` throughout the close fade
   (otherwise the parent theme's `.popover { visibility: hidden }`
   short 0.4s default transition snaps visibility off before our opacity
   finishes, which visually "instantly removes the darkened area"). */
.cart-panel .glozin-note-estimate-coupon__popover {
	position: absolute !important;
	inset: 0 !important;
	z-index: 2;
	transition:
		opacity 0.42s cubic-bezier(0.7, 0, 0.2, 1),
		visibility 0s linear 0.42s !important;
}
.cart-panel .glozin-note-estimate-coupon__popover.popover--open {
	transition:
		opacity 0.42s cubic-bezier(0.7, 0, 0.2, 1),
		visibility 0s linear 0s !important;
}

/* Container must stay position:absolute inside the anchored popover. */
.cart-panel .glozin-note-estimate-coupon__popover .popover__container {
	position: absolute !important;
}

/* Content: ensure a solid white fill from edge to edge, with rounded top
   corners so it reads as a proper bottom sheet inside the cart panel. */
.cart-panel .glozin-note-estimate-coupon__popover .popover__content {
	background-color: var(--gz-color-light, #ffffff);
	border-radius: 15px 15px 0 0;
	max-height: 68vh;
	overflow-y: auto;
}

/* Bring the buttons' hover-fill (created by custom-hover-buttons-v2.js)
   into the correct stacking context — same `isolation: isolate` trick
   as the minicart footer buttons. */
.cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn {
	isolation: isolate;
}

/* Hover text colors for the popover buttons (safety net, same pattern
   as the minicart Checkout / View cart rules): white fill → black text
   on primary (Save / Apply coupon / Update), dark fill → white text on
   the secondary outlined "Close" buttons. */
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--primary:hover,
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--primary.concept-hover-active,
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--primary:hover *,
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--primary.concept-hover-active * {
	color: #000000 !important;
	-webkit-text-fill-color: #000000 !important;
}

html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--secondary:hover,
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--secondary.concept-hover-active,
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--secondary:hover *,
html body .cart-panel .glozin-note-estimate-coupon__popover .popover__content .concept-hover-btn--secondary.concept-hover-active * {
	color: #ffffff !important;
	-webkit-text-fill-color: #ffffff !important;
}


/* ==========================================================================
   11. Cart-panel Concept-theme polish
       - Rounded corners on the drawer (desktop)
       - Rounded close button (like Concept's)
       - "Shopping Cart" → "Cart" (JS injects count badge, styled here)
       - Order note / Shipping / Discount: row of icon+label buttons
       - View cart: hidden; Checkout has a lock icon
       - Free-shipping bar: progress animation on open
   ========================================================================== */

/* -------- Rounded drawer corners (desktop only) -------- */
@media (min-width: 768px) {
	.cart-panel.offscreen-panel .panel__container {
		border-top-left-radius: 20px;
		border-bottom-left-radius: 20px;
		overflow: hidden;
	}
	/* RTL mirror — round the right corners instead */
	[dir="rtl"] .cart-panel.offscreen-panel .panel__container,
	.offscreen-panel--side-left.cart-panel .panel__container {
		border-top-left-radius: 0;
		border-bottom-left-radius: 0;
		border-top-right-radius: 20px;
		border-bottom-right-radius: 20px;
	}
}

/* -------- Close button: Concept-style rounded outline (CSS-only fill) --
   Glozin renders the close as a bare <span class="panel__button-close"> +
   <svg>. We style the span into a 40x40 circle with a subtle border and
   drive two animations purely via CSS:
     1. A `::before` pseudo slides up from below the circle on hover-in
        and slides back down on hover-out (mirrors the wishlist /
        product-card fill, but CSS-only so it always animates on
        hover-in — the previous WAAPI implementation was flaky because
        the parent theme also rotated the container span, fighting the
        translateY axis).
     2. The inner <svg> (the X) spins 180° on hover (both directions —
        the transition's return leg handles hover-out).

   Parent theme applies `transform: rotate(180deg)` to the whole span on
   hover; we override to `transform: none` so the CIRCLE doesn't rotate
   (the X inside still does). */
.cart-panel .panel__header .panel__button-close {
	width: 40px !important;
	height: 40px !important;
	border: 1px solid rgba(0, 0, 0, 0.15);
	border-radius: 50%;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	padding: 0 !important;
	flex: 0 0 40px;
	background-color: transparent;
	color: var(--gz-color-dark, #171717);
	opacity: 1 !important;
	position: relative;
	overflow: hidden;
	isolation: isolate;
	transform: none !important;
	transition: color 0.35s cubic-bezier(0.3, 1, 0.3, 1), border-color 0.3s ease;
	cursor: pointer;
}
.cart-panel .panel__header .panel__button-close:hover {
	transform: none !important;
	color: #ffffff;
	border-color: #000;
}
/* CSS hover-fill pseudo: black disc that slides up from below on
   hover-in, slides back down on hover-out. */
.cart-panel .panel__header .panel__button-close::before {
	content: '';
	position: absolute;
	inset: 0;
	background-color: #000;
	border-radius: 50%;
	transform: translateY(110%);
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	z-index: -1;
	pointer-events: none;
}
.cart-panel .panel__header .panel__button-close:hover::before {
	transform: translateY(0);
}
/* The X icon spins 180° on hover; transition covers both directions. */
.cart-panel .panel__header .panel__button-close .glozin-svg-icon,
.cart-panel .panel__header .panel__button-close > svg {
	position: relative;
	z-index: 1;
	width: 12px;
	height: 12px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	transform-origin: center center;
	color: inherit;
}
.cart-panel .panel__header .panel__button-close:hover .glozin-svg-icon,
.cart-panel .panel__header .panel__button-close:hover > svg {
	transform: rotate(180deg);
}

/* -------- Header: Cart/Recently viewed tab group ----------
   JS rebuilds `.panel__header` into:
     [ .cart-panel__tabs (Cart N  |  Recently viewed) ]    [ close ]
   Wrapping tabs in ONE flex child keeps the existing
   `justify-content: space-between` behaviour — tabs hug the start and
   only the close button is pushed to the end, so "Cart" and the count
   stay TIGHTLY next to each other. */
.cart-panel .panel__header {
	align-items: center;
	gap: 12px;
}
.cart-panel .panel__header .cart-panel__tabs {
	display: inline-flex;
	align-items: baseline;
	gap: 18px;
	min-width: 0;
	flex: 1 1 auto;
}
.cart-panel .panel__header .cart-panel__tab {
	all: unset;
	cursor: pointer;
	display: inline-flex;
	align-items: baseline;
	gap: 1px;                       /* micro-gap so "Cart" and count kiss */
	color: var(--gz-color-dark, #171717);
	opacity: 0.35;
	font-weight: 500;
	font-size: 18px;
	line-height: 1.1;
	transition: opacity 0.25s ease, color 0.25s ease;
}
.cart-panel .panel__header .cart-panel__tab:hover {
	opacity: 0.7;
}
.cart-panel .panel__header .cart-panel__tab.is-active {
	opacity: 1;
	font-weight: 700;
}
.cart-panel .panel__header .cart-panel__title {
	font-weight: inherit;
}
.cart-panel .panel__header .cart-panel__count {
	font-size: 0.55em;
	font-weight: 500;
	margin: 0 0 0 2px;
	padding: 0;
	vertical-align: super;
	line-height: 1;
	color: inherit;
}
.cart-panel .panel__header::after {
	left: 0 !important;
	right: 0 !important;
	width: 100% !important;
}

/* -------- Recently viewed — matches minicart item visuals ----------

   The user wants recently-viewed items to look IDENTICAL to the
   minicart item layout (`.woocommerce-mini-cart-item`) — same thumbnail
   size, same typography, same spacing, same dashed-top-border separator
   — just with a "View" pill on the right instead of the quantity stepper
   and remove icon.

   Reference — parent theme's minicart item dimensions (overlay.css line
   228-305):
     .woocommerce-mini-cart-item { display: flex; padding-top: 20px;
       margin-bottom: 20px; gap: 15px; border-top: 1px dashed … }
     .woocommerce-mini-cart-item__thumbnail { flex-basis: 90px }
     .woocommerce-mini-cart-item__data .woocommerce-mini-cart-item__name
       { font-weight: 600 }
     .woocommerce-mini-cart-item__data .price { font-weight: 600; gap: 5px }

   The AJAX endpoint `glozin_get_recently_viewed` returns standard
   WooCommerce product-card markup (`ul.products > li.product`), so we
   style those cards into the same layout. */

.cart-panel .cart-panel__recently {
	display: block;
	/* Tight top spacing — the parent theme's tab list already adds visual
	   separation, and the first item carries its own dashed top border via
	   the minicart-item rules below. The previous 24px top padding pushed
	   the first product way too far from the "Recently viewed" header. */
	padding: 4px 0 20px;
}
.cart-panel .cart-panel__recently .recently-viewed-products {
	min-height: 120px;
}
.cart-panel .cart-panel__recently .recently-viewed-products.ajax-loading {
	opacity: 0.6;
}
.cart-panel .cart-panel__recent-empty {
	text-align: center;
	color: var(--gz-color-dark, #171717);
	opacity: 0.6;
	padding: 20px 10px;
	margin: 0;
}

/* Reset grid → single-column list (same "list" semantics as the
   mini-cart UL on the other tab). */
.cart-panel .cart-panel__recently ul.products,
.cart-panel .cart-panel__recently .products {
	display: block !important;
	grid-template-columns: none !important;
	gap: 0 !important;
	list-style: none !important;
	padding: 0 !important;
	margin: 0 !important;
	width: 100% !important;
}

/* Each LI mirrors the minicart item's border / spacing / layout. */
.cart-panel .cart-panel__recently ul.products li.product,
.cart-panel .cart-panel__recently .products li.product {
	width: 100% !important;
	max-width: 100% !important;
	flex: initial !important;
	display: flex !important;
	flex-direction: row !important;
	align-items: stretch !important;
	gap: 15px !important;
	margin: 0 0 20px 0 !important;
	padding: 20px 0 0 0 !important;
	padding-inline-end: 90px !important;    /* room for the "View" pill */
	border-top: 1px dashed var(--gz-border-color, rgba(0, 0, 0, 0.12)) !important;
	border-bottom: 0 !important;
	background: transparent !important;
	box-shadow: none !important;
	position: relative;
}
.cart-panel .cart-panel__recently ul.products li.product:first-child {
	padding-top: 0 !important;
	border-top: 0 !important;
}

/* Product-inner, if the card has one, becomes transparent pass-through. */
.cart-panel .cart-panel__recently ul.products li.product > .product-inner,
.cart-panel .cart-panel__recently ul.products li.product .product-inner {
	display: contents !important;
	padding: 0 !important;
	border: 0 !important;
	background: transparent !important;
	box-shadow: none !important;
}

/* Thumbnail: 90px like the minicart item. */
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail,
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail a,
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail img {
	width: 90px !important;
	height: 90px !important;
	max-width: 90px !important;
	max-height: 90px !important;
	flex: 0 0 90px !important;
	border-radius: 4px !important;
	overflow: hidden !important;
	background: #f6f6f6 !important;
	padding: 0 !important;
	margin: 0 !important;
	position: static !important;
}
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail img {
	width: 100% !important;
	height: 100% !important;
	object-fit: cover !important;
	transform: none !important;
	transition: none !important;
}

/* Summary column — stacked, justify between so price can drop to bottom
   like the minicart item's price row. */
.cart-panel .cart-panel__recently ul.products li.product .product-summary {
	flex: 1 1 auto !important;
	min-width: 0 !important;
	display: flex !important;
	flex-direction: column !important;
	justify-content: space-between !important;
	align-items: flex-start !important;
	text-align: start !important;
	margin: 0 !important;
	padding: 0 !important;
	color: var(--gz-color-dark, #171717) !important;
	line-height: 20px !important;
}

/* Name: 600 weight, same as minicart item name. */
.cart-panel .cart-panel__recently ul.products li.product .woocommerce-loop-product__title {
	font-size: 15px !important;
	font-weight: 600 !important;
	margin: 0 !important;
	line-height: 1.25 !important;
	color: var(--gz-color-dark, #171717) !important;
}
.cart-panel .cart-panel__recently ul.products li.product .woocommerce-loop-product__title a {
	color: inherit !important;
	text-decoration: none !important;
}

/* Price: 600 weight, 5px gap — mirror minicart item price row. */
.cart-panel .cart-panel__recently ul.products li.product .price {
	font-size: 14px !important;
	font-weight: 600 !important;
	margin: 0 !important;
	padding-top: 5px !important;
	display: flex !important;
	align-items: center !important;
	gap: 5px !important;
	color: var(--gz-color-dark, #171717) !important;
}
.cart-panel .cart-panel__recently ul.products li.product .price del {
	text-decoration: line-through;
	order: 2;
	opacity: 0.6;
}
.cart-panel .cart-panel__recently ul.products li.product .price ins {
	order: 1;
	text-decoration: none;
}

/* Hide every card-variant embellishment so what remains matches the
   minicart item shape exactly: thumbnail + name + price.

   IMPORTANT: do NOT hide `.product-thumbnails--fadein` or
   `.product-thumbnails--fadein-image` as a blanket rule — those are
   the CONTAINER and the IMAGES themselves on products that use hover-
   swap thumbnails. Hiding them kills the entire image. We only want
   to hide the SECOND (hover) image, which we target via a sibling
   selector further down. */
.cart-panel .cart-panel__recently ul.products li.product .glozin-rating,
.cart-panel .cart-panel__recently ul.products li.product .star-rating,
.cart-panel .cart-panel__recently ul.products li.product .product-card-animation,
.cart-panel .cart-panel__recently ul.products li.product .product-featured-icons,
.cart-panel .cart-panel__recently ul.products li.product .product-loop-button-atc,
.cart-panel .cart-panel__recently ul.products li.product .glozin-quickview-button,
.cart-panel .cart-panel__recently ul.products li.product .wcboost-wishlist-button,
.cart-panel .cart-panel__recently ul.products li.product .wcboost-products-compare-button,
.cart-panel .cart-panel__recently ul.products li.product .product-meta-categories,
.cart-panel .cart-panel__recently ul.products li.product .product-short-description,
.cart-panel .cart-panel__recently ul.products li.product .product-variation-items,
.cart-panel .cart-panel__recently ul.products li.product .product-video-loop-thumbnail,
.cart-panel .cart-panel__recently ul.products li.product .glozin-multi-color-swatches,
.cart-panel .cart-panel__recently ul.products li.product .added-to-cart,
.cart-panel .cart-panel__recently ul.products li.product .added_to_cart,
.cart-panel .cart-panel__recently ul.products li.product .product-meta,
.cart-panel .cart-panel__recently ul.products li.product .description {
	display: none !important;
}

/* Hide EVERY kind of sale / stock / custom badge on the thumbnail —
   Concept's recently-viewed is label-free. Covers the common names
   used across Glozin + Woo + popular badge plugins. */
.cart-panel .cart-panel__recently ul.products li.product .glozin-badges,
.cart-panel .cart-panel__recently ul.products li.product .glozin-badges-sale,
.cart-panel .cart-panel__recently ul.products li.product .glozin-badges-sale__countdown,
.cart-panel .cart-panel__recently ul.products li.product .glozin-badges-wrapper,
.cart-panel .cart-panel__recently ul.products li.product .product-badges,
.cart-panel .cart-panel__recently ul.products li.product .product-badge,
.cart-panel .cart-panel__recently ul.products li.product .badge,
.cart-panel .cart-panel__recently ul.products li.product .onsale,
.cart-panel .cart-panel__recently ul.products li.product .out-of-stock,
.cart-panel .cart-panel__recently ul.products li.product .featured-label,
.cart-panel .cart-panel__recently ul.products li.product .new-label,
.cart-panel .cart-panel__recently ul.products li.product .hot-label,
.cart-panel .cart-panel__recently ul.products li.product .sale-badge,
.cart-panel .cart-panel__recently ul.products li.product .gz-product-badge,
.cart-panel .cart-panel__recently ul.products li.product [class*="-badge"]:not([class*="-badges-wrapper"]),
.cart-panel .cart-panel__recently ul.products li.product [class*="badge-"] {
	display: none !important;
}

/* Hover-swap: keep ONLY the first image rendered. */
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnails--fadein-image:not(:first-of-type),
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail img + img {
	display: none !important;
}

/* Some product thumbnail wrappers (Glozin "ratio" box) force the image
   via `position: absolute` + `object-fit`. Make sure it paints inside
   our 90x90 container instead of being absolutely offset / zero-sized. */
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail .gz-ratio,
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail .gz-image-rounded,
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail .product-thumbnails--fadein {
	position: static !important;
	width: 100% !important;
	height: 100% !important;
	padding: 0 !important;
	overflow: hidden;
	border-radius: 4px;
	background: transparent !important;
}
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail .gz-ratio::before,
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail .gz-image-rounded::before {
	display: none !important;          /* kill the "aspect-ratio spacer" ::before */
}
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail img {
	position: static !important;
	inset: auto !important;
	opacity: 1 !important;
	visibility: visible !important;
}

/* Lazy-loaded images often start hidden until a lazyload library sets
   `src` from `data-src`. If the image arrives with only `data-src`
   filled in, expose it via an attr() rule so there's at least SOMETHING
   showing before the JS lazyload kicks in.
   (Our JS also force-resolves data-src → src on recently-viewed load.) */
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail img[data-src]:not([src]),
.cart-panel .cart-panel__recently ul.products li.product .product-thumbnail img[data-lazy-src]:not([src]) {
	opacity: 0;
}

/* "View" pill on the right — mirrors the position where the minicart
   item has its quantity stepper. The product card's title <a> already
   handles navigation, so the pill is purely visual. */
.cart-panel .cart-panel__recently ul.products li.product::after {
	content: "View";
	position: absolute;
	top: 50% ;
	inset-inline-end: 0;
	transform: translateY(calc(-50% + 10px)); /* the +10px accounts for the 20px top padding so the pill centers on the thumbnail, not the li box */
	padding: 9px 18px;
	border-radius: 999px;
	background-color: #000;
	color: #fff;
	font-size: 13px;
	font-weight: 600;
	line-height: 1;
	white-space: nowrap;
	pointer-events: none;
	display: inline-flex;
	align-items: center;
	transition: background-color 0.3s ease, transform 0.3s cubic-bezier(0.3, 1, 0.3, 1);
}
.cart-panel .cart-panel__recently ul.products li.product:first-child::after {
	transform: translateY(-50%);
}
.cart-panel .cart-panel__recently ul.products li.product:hover::after {
	background-color: #1a1a1a;
}

/* -------- Free-shipping bar: Concept-style elegant thin black line -----

   Actual plugin DOM (from glozin-addons/free-shipping-bar):
     .glozin-free-shipping-bar
       └ .glozin-free-shipping-bar__progress           (gray track)
           └ .glozin-free-shipping-bar__progress-bar   (colored fill, width: var(--gz-progress))
               └ .glozin-free-shipping-bar__icon       (delivery truck)
       .glozin-free-shipping-bar__percent-value        (e.g. "75.00%")
       .glozin-free-shipping-bar__message              ("Spend $X more…" / "Congratulations!…")

   Plugin animations we must KILL:
     fs-progress  — diagonal stripes scrolling on the fill       (flicker #1)
     fs-raise     — fill width 30px → var(--gz-progress) on load
     fs-flash     — opacity pulse on message + track on success  (flicker #2)

   Concept look = just the sentence + a 2px black line underneath.
   So we flex-column the container, message FIRST, progress SECOND,
   hide the truck icon and the percent value, flatten the fill to solid
   black with zero animations, and add our own `scaleX` open animation. */

.cart-panel .glozin-free-shipping-bar,
.cart-panel .cart-panel__free-shipping {
	display: flex !important;
	flex-direction: column !important;
	flex-wrap: nowrap !important;
	gap: 10px;
	/* Width matches the product rows in the minicart (image → remove btn).
	   Previously broke out of panel__content's 30px padding with negative
	   margins so it ran drawer-edge-to-drawer-edge — user wants it
	   constrained to the same horizontal extent as the cart items. */
	margin-inline-start: 0 !important;
	margin-inline-end: 0 !important;
	padding: 20px 0 18px !important;
	background-color: transparent !important;
	border: 0 !important;
	animation: none !important;
}
/* Nuke ALL plugin/keyframe animations on the bar in EVERY state — the
   user reported a continuous flicker on the success state that came
   from the plugin's `fs-flash` (running on .glozin-free-shipping-bar__progress
   even when we'd whitelisted the success state for our own glow). The
   continuous shimmer is now driven by JS particles instead of CSS
   keyframes, so we don't need to leave any animation slots free. */
.cart-panel .glozin-free-shipping-bar,
.cart-panel .glozin-free-shipping-bar *,
.cart-panel .cart-panel__free-shipping,
.cart-panel .cart-panel__free-shipping * {
	animation: none !important;
	animation-name: none !important;
	animation-duration: 0s !important;
	animation-iteration-count: 1 !important;
}
/* Force the message fully visible on every state — `fs-flash` used to
   pulse its opacity from the plugin side. */
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__message {
	opacity: 1 !important;
}
/* Kill the plugin's diagonal-stripes gradient on the fill in both
   states — we paint a clean gradient/solid instead. */
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__progress-bar {
	background-image: none !important;
	background-size: auto !important;
}

/* Hide the delivery-truck icon and the "75.00%" percent value — Concept
   shows neither, just the sentence + thin line. */
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__icon,
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__percent-value {
	display: none !important;
}

/* Message goes FIRST (plugin outputs it after the progress track in
   source order — flex `order` swaps them visually). */
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__message {
	order: 1 !important;
	width: 100% !important;
	margin: 0 !important;
	font-size: 14px !important;
	line-height: 1.4 !important;
	color: var(--gz-color-dark, #171717) !important;
	font-weight: 400 !important;
}
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__message strong {
	color: inherit !important;
	font-weight: 500 !important;
}

/* Track: bolder pill-shaped bar (iOS-style). 6px tall with fully-rounded
   caps; the fill inherits the same radius so the progress end caps are
   also pill-rounded. `overflow: visible` lets sparkles in the success
   state animate above the bar without being clipped. */
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__progress {
	order: 2 !important;
	position: relative !important;
	width: 100% !important;
	height: 6px !important;
	margin: 0 !important;
	border: 0 !important;
	border-radius: 999px !important;
	background-color: rgba(0, 0, 0, 0.07) !important;
	display: block !important;
	overflow: visible !important;
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.02);
}

/* Fill: gradient black with subtle shadow → gives the bar depth and an
   iOS-like glossy look. Width comes from `--gz-progress` (which the
   plugin updates inline on the outer bar when the cart total changes).
   Three compositions animate here:
     (a) `transform: scaleX(0 → 1)` on cart open — the initial "draw in".
     (b) `width` transition — when the plugin writes a new `--gz-progress`
         value after add-to-cart / remove-from-cart, the fill GROWS
         smoothly to the new percentage instead of snapping.
     (c) `fs-glow` keyframe animation (only while `.gz-is-success` is on
         the bar) — the fill pulses a soft glow when you've earned free
         shipping. See keyframes further down. */
.cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__progress-bar {
	position: relative !important;
	min-width: 0 !important;
	width: var(--gz-progress, 100%) !important;
	height: 100% !important;
	margin: 0 !important;
	border-radius: 999px !important;
	background-color: #000 !important;
	background-image: linear-gradient(180deg, #1a1a1a 0%, #000 100%) !important;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.12) !important;
	transform-origin: left center;
	transform: scaleX(0);
	transition:
		transform 1.4s cubic-bezier(0.3, 1, 0.3, 1) 0.25s,
		width 0.9s cubic-bezier(0.3, 1, 0.3, 1);
}
[dir="rtl"] .cart-panel .glozin-free-shipping-bar .glozin-free-shipping-bar__progress-bar {
	transform-origin: right center;
}
.cart-panel.offscreen-panel--open .glozin-free-shipping-bar .glozin-free-shipping-bar__progress-bar {
	transform: scaleX(1);
}

/* -------- SUCCESS STATE -------- */

/* Solid black gradient fill on success — no CSS keyframe glow / sparkle
   animations here anymore (they were the source of the flicker). The
   continuous iOS-style sparkle shimmer is driven entirely by JS
   particles in custom-free-shipping-bar.js, which spawns dust + sparkles
   that drift along the bar while the cart panel is open. */
.cart-panel .glozin-free-shipping-bar.gz-is-success .glozin-free-shipping-bar__progress-bar {
	background-image: linear-gradient(180deg, #111 0%, #000 100%) !important;
}

/* Keep the success message dark (matches Concept). */
.cart-panel .glozin-free-shipping-bar.gz-is-success .glozin-free-shipping-bar__message,
.cart-panel .glozin-free-shipping-bar.gz-is-success .glozin-free-shipping-bar__message strong {
	color: var(--gz-color-dark, #171717) !important;
}

/* -------- Helper class used by JS to hide children for the
               Cart / Recently viewed tab switch --------------------------
   Higher specificity than the parent theme's various `display: flex`
   rules on the cart children, and `!important` to lock it in. */
.cart-panel .panel__content > .cart-panel__tab-hidden,
.cart-panel .panel__content .cart-panel__tab-hidden {
	display: none !important;
}

/* -------- Order note / Shipping / Discount: row of icon+label buttons --------
   JS (custom-cart-panel.js) strips the `gz-tooltip-inside` class and the
   `data-tooltip` attribute from each button so no tooltip pops up, and
   appends a visible `<span class="cart-panel__trigger-label">` next to
   the icon. CSS just handles the row layout + visual polish. */
.cart-panel .glozin-note-estimate-coupon {
	padding: 0 !important;
	margin-inline: 0 !important;
	background: transparent !important;
	border-top: 1px solid var(--gz-border-color, rgba(0, 0, 0, 0.08)) !important;
	border-bottom: 1px solid var(--gz-border-color, rgba(0, 0, 0, 0.08)) !important;
	justify-content: stretch !important;
}
.cart-panel .glozin-note-estimate-coupon__button {
	--gz-button-width: auto !important;
	--gz-button-height: auto !important;
	--gz-button-bg-color: transparent !important;
	--gz-button-bg-color-hover: transparent !important;
	--gz-button-border-color: transparent !important;
	--gz-button-border-color-hover: transparent !important;
	--gz-button-color: var(--gz-color-dark, #171717) !important;
	flex: 1 1 0 !important;
	min-width: 0;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	gap: 10px;
	height: auto !important;
	padding: 18px 8px !important;
	font-size: 14px;
	font-weight: 500;
	color: var(--gz-color-dark, #171717);
	cursor: pointer;
	position: relative;
	white-space: nowrap;
	line-height: 1;
}
.cart-panel .glozin-note-estimate-coupon__button .glozin-svg-icon,
.cart-panel .glozin-note-estimate-coupon__button > svg {
	width: 16px;
	height: 16px;
	flex: 0 0 auto;
}
.cart-panel .glozin-note-estimate-coupon__button .cart-panel__trigger-label {
	display: inline-block;
	line-height: 1;
}

/* Vertical divider between cells */
.cart-panel .glozin-note-estimate-coupon__button + .glozin-note-estimate-coupon__button::before {
	content: '';
	position: absolute;
	left: 0;
	top: 22%;
	bottom: 22%;
	width: 1px;
	background: var(--gz-border-color, rgba(0, 0, 0, 0.10));
}

/* Belt-and-braces: even if JS somehow misses stripping the tooltip
   class, hide the tooltip pseudo-elements so nothing pops up on hover. */
.cart-panel .glozin-note-estimate-coupon__button::before,
.cart-panel .glozin-note-estimate-coupon__button::after {
	display: none;
}
/* Re-enable the vertical-divider ::before on the 2nd & 3rd cells. */
.cart-panel .glozin-note-estimate-coupon__button + .glozin-note-estimate-coupon__button::before {
	display: block;
}

/* -------- Checkout button: lock icon + hide the View cart button -------- */

.cart-panel .woocommerce-mini-cart__buttons a.button:not(.checkout),
.cart-panel .woocommerce-mini-cart__buttons .button.wc-forward:not(.checkout) {
	display: none !important;
}
.cart-panel .woocommerce-mini-cart__buttons {
	display: flex !important;
	gap: 0;
	margin-top: 12px;
}
.cart-panel .woocommerce-mini-cart__buttons a.button.checkout {
	flex: 1 1 100%;
	width: 100%;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	gap: 10px;
}

/* Lock icon BEFORE "Checkout" — JS injects a real inline <svg> with
   class `.cart-panel__lock-icon` as the button's first child. Using a
   real element (not a ::before mask) means it plays nicely with our
   v1.0.33 stacking fix — it's a sibling of .btn-fill and gets lifted
   to z-index:1 by the existing `.btn-fill ~ *` rule. */
.cart-panel .woocommerce-mini-cart__buttons a.button.checkout .cart-panel__lock-icon {
	display: inline-block;
	width: 16px;
	height: 16px;
	flex: 0 0 16px;
	color: currentColor;
	stroke: currentColor;
	vertical-align: middle;
	position: relative;
	z-index: 1;
}


/* ==========================================================================
   12. Recently-viewed tab — real "View" CTA + Concept hover-fill

   Parent renders the View pill as `li::after { content:'View' }` which
   pointer-events:none and can't take a click handler. custom-recently-
   viewed.js appends a real <a class="recent-view-btn"> linking to the
   product page; this block hides the dead pseudo and styles the real
   anchor to match the original visual + makes it the hover-fill target.
   ========================================================================== */
#cart-panel .cart-panel__recently .recently-viewed-products li.product::after {
	content: none !important;
	display: none !important;
}

#cart-panel .cart-panel__recently .recently-viewed-products li.product .recent-view-btn {
	position: absolute !important;
	top: 45px !important;
	right: 0 !important;
	left: auto !important;
	bottom: auto !important;
	margin: 0 !important;
	transform: translateY(-50%);
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	background-color: #1a1a1a;
	color: #ffffff;
	padding: 9px 18px;
	border-radius: 999px;
	font-size: 13px;
	line-height: 13px;
	font-weight: 500;
	text-decoration: none;
	overflow: hidden;
	isolation: isolate;
	z-index: 2;
	transition: color 0.3s;
	white-space: nowrap;
	width: auto;
	flex: 0 0 auto;
}

/* LI is the positioned ancestor for the View pill — must win over the
   parent theme's loop styles which leave the LI as static. */
#cart-panel .cart-panel__recently .recently-viewed-products li.product {
	position: relative !important;
}

/* Hover text-color safety net (matches the minicart Checkout / Apply rules):
   primary fill is white → text flips to black. The hover JS also sets
   inline color !important, this rule is a CSS-side guarantee for first paint. */
html body #cart-panel .cart-panel__recently .recently-viewed-products li.product .recent-view-btn:hover,
html body #cart-panel .cart-panel__recently .recently-viewed-products li.product .recent-view-btn.concept-hover-active {
	color: #000000 !important;
	-webkit-text-fill-color: #000000 !important;
}


/* ==========================================================================
   13. Cart-panel popovers — slick iOS bottom-sheet
        (Add note / Add coupon / Estimate shipping)

   Keeps the bottom-up direction the user wanted, but upgrades the
   animation to feel like an iOS sheet:
     • Container: translateY(100%) → 0 with the same `--ios-drawer-*`
       curves/durations as the side drawers (asymmetric: longer/softer
       open, snappier close).
     • Backdrop: gradient dim + saturated blur fading in/out together.
     • Soft shadow on the top edge so the sheet reads as lifted.

   Section 10 above already constrains these popovers to the cart-panel
   content area (position:absolute; inset:0).
   ========================================================================== */

/* Sheet container — anchored to the bottom of the cart panel content,
   slides up from below. Width spans the full panel; height is content-
   driven up to ~68vh of the cart panel.

   ANIMATION = 420ms both directions with cubic-bezier(0.7, 0, 0.2, 1).
   Open and close are SYMMETRIC — translateY(100%) → 0 on open, reverse
   on close, same curve, same duration. Previously 620ms; user reported
   this felt laggy. 420ms gives a snappy-but-still-smooth iOS-sheet
   motion that matches the backdrop fade one-to-one. (The parent
   theme's close-button / backdrop-click path only removes the
   `popover--open` class and never calls `$.fadeOut()`, so CSS
   transitions can run for exactly this duration — no 400ms fadeOut
   cap on the main close paths.) */
.cart-panel .glozin-note-estimate-coupon__popover .popover__container {
	top: auto !important;
	bottom: 0 !important;
	left: 0 !important;
	right: 0 !important;
	width: 100% !important;
	max-width: 100% !important;
	padding-top: 0 !important;
	transform: translateY(100%);
	transition: transform 0.42s cubic-bezier(0.7, 0, 0.2, 1) !important;
	will-change: transform;
	box-shadow: 0 -24px 60px rgba(0, 0, 0, 0.22) !important;
}

.cart-panel .glozin-note-estimate-coupon__popover.popover--open .popover__container {
	transform: translateY(0);
	transition: transform 0.42s cubic-bezier(0.7, 0, 0.2, 1) !important;
}

/* Sheet content — solid white fill, rounded top corners (sheet feel). */
.cart-panel .glozin-note-estimate-coupon__popover .popover__content {
	background-color: var(--gz-color-light, #ffffff);
	border-radius: 18px 18px 0 0;
	max-height: 68vh;
	overflow-y: auto;
}

/* Backdrop — flat dim, NO blur (user requested no blur for these popovers).
   Matches the sheet slide at 420ms both directions so the dim breathes
   in & out alongside the sheet.

   `!important` is REQUIRED on OPACITY + TRANSITION + VISIBILITY:
     - Section 9's generic `.popover .popover__backdrop` rule has
       `opacity: 0 !important` and a delayed `visibility 0s linear
       <duration>` transition. Without `!important` on our opacity the
       generic rule wins and the backdrop snaps invisible at whatever
       the generic delay is, while our sheet is still sliding out.
     - We also override `visibility` to STAY VISIBLE during the fade
       (explicit `visibility: visible` with `transition: visibility 0s
       linear 0.42s` on the closed-rest rule), so the fade runs to
       completion and only then is visibility flipped. This is what
       the user was noticing: the whole darkened area was vanishing
       instantly on close.

   `pointer-events` gates click-handling: opacity:0 alone doesn't
   prevent the backdrop from catching clicks. Swapping
   pointer-events auto/none gives us the right behavior: interactive
   when open, transparent to clicks when closed. */
.cart-panel .glozin-note-estimate-coupon__popover .popover__backdrop {
	background-color: rgba(0, 0, 0, 0.55) !important;
	background-image: none !important;
	-webkit-backdrop-filter: none !important;
	        backdrop-filter: none !important;
	opacity: 0 !important;
	visibility: visible !important;
	pointer-events: none !important;
	transition:
		opacity 0.42s cubic-bezier(0.7, 0, 0.2, 1),
		visibility 0s linear 0.42s !important;
}
.cart-panel .glozin-note-estimate-coupon__popover.popover--open .popover__backdrop {
	opacity: 1 !important;
	visibility: visible !important;
	pointer-events: auto !important;
	transition:
		opacity 0.42s cubic-bezier(0.7, 0, 0.2, 1),
		visibility 0s linear 0s !important;
}

/* Same gate for the popover ROOT element. The parent theme renders
   `.popover { opacity: 0; display: block }` via jQuery.fadeIn's
   inline styles — `display: block` leaves the absolutely-positioned
   popover covering its entire target region (`inset: 0` of the cart
   panel content) even when fully faded. Without
   `pointer-events: none` on the closed state, ALL clicks on the
   cart panel content get swallowed by the invisible popover — which
   is exactly why the Note / Discount / Shipping buttons stopped
   responding in v1.0.54. */
.cart-panel .glozin-note-estimate-coupon__popover:not(.popover--open) {
	pointer-events: none;
}
.cart-panel .glozin-note-estimate-coupon__popover.popover--open {
	pointer-events: auto;
}


/* ==========================================================================
   16. Concept-theme product card — top-right rating ↔ quick-view swap
        + bottom-center Add-to-Cart slide-up.

   Reference: concept-theme-tech.myshopify.com/collections/headphones
   DOM: custom-product-cards.js injects
     .product-thumbnail
       └ .product__badge-swap     (absolute, top-right)
           └ .product__rating-pill     (white pill, visible by default)
           └ .product__quickview-pill  (clone of .glozin-quickview-button,
                                         absolute over the rating pill,
                                         hidden by default, crossfades in
                                         on card hover)
   The original bottom-right `.glozin-quickview-button` gets
   `.product__quickview--replaced` and is hidden so the top-right clone
   becomes the single canonical entry-point.
   ========================================================================== */

/* Badge-swap anchor — pinned top-right of the thumbnail. Both children
   are absolutely positioned at top:0 right:0 of THIS wrapper so they
   share the exact same anchor point and the crossfade scales from the
   same origin. That eliminates the "jump" that appeared when they had
   different sizes in the layout flow. */
.product--concept-card .product-thumbnail .product__badge-swap {
	position: absolute;
	top: 15px;
	right: 15px;
	z-index: 5;
	pointer-events: none;
	/* Size matches the rating pill (its natural size). The quickview
	   circle is absolute-positioned inside with top/right 0. */
	display: inline-block;
	line-height: 0;
}

/* Rating pill — iOS-style glass pill ("★ 5.0") with a translucent
   backdrop-blur, no drop shadow, normal-weight text. Bumped the
   opacity from 0.42 → 0.72 so the pill reads noticeably brighter
   against product photos without losing the glass feel — matches
   the user's latest "brighter bg but still blur" request. */
.product--concept-card .product__rating-pill {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	padding: 6px 12px 6px 10px;
	background: rgba(255, 255, 255, 0.72);
	-webkit-backdrop-filter: blur(20px) saturate(180%);
	        backdrop-filter: blur(20px) saturate(180%);
	border: 0.5px solid rgba(255, 255, 255, 0.75);
	border-radius: 999px;
	box-shadow: none;
	font-size: 12.5px;
	/* No bold — user requested plain weight. */
	font-weight: 500;
	line-height: 1;
	color: #171717;
	white-space: nowrap;
	pointer-events: auto;
	/* Crossfade: default state — fully visible.
	   `transform-origin: 100% 50%` so the scale shrinks toward the
	   top-right corner (not the center) — the pill appears to retract
	   into the corner as the quickview circle appears there. */
	opacity: 1;
	transform: scale(1);
	transform-origin: 100% 50%;
	transition:
		opacity 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.30s cubic-bezier(0.3, 1, 0.3, 1);
}
.product--concept-card .product__rating-star {
	display: inline-flex;
	color: #F2B84B;
	line-height: 0;
}
.product--concept-card .product__rating-star svg {
	display: block;
	width: 13px;
	height: 13px;
}

/* Sale badge — match the product-card glass language while keeping a
   red sale signal. The badge now uses a translucent iOS-like red blur
   instead of a flat solid fill. */
html body ul.products li.product.product--concept-card .woocommerce-badges,
html body ul.products li.product.product--concept-card .glozin-badges,
html body ul.products li.product.product--concept-card .glozin-badges-wrapper {
	pointer-events: none !important;
}

html body ul.products li.product.product--concept-card .woocommerce-badges .onsale,
html body ul.products li.product.product--concept-card .glozin-badges .onsale,
html body ul.products li.product.product--concept-card .glozin-badges-wrapper .onsale {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	min-height: 30px !important;
	padding: 0 14px !important;
	border-radius: 999px !important;
	border: 0 !important;
	background: rgba(196, 64, 52, 0.72) !important;
	-webkit-backdrop-filter: blur(18px) saturate(175%) !important;
	        backdrop-filter: blur(18px) saturate(175%) !important;
	box-shadow:
		0 8px 20px rgba(147, 35, 28, 0.16),
		inset 0 1px 0 rgba(255, 255, 255, 0.22) !important;
	color: #ffffff !important;
	font-size: 13px !important;
	font-weight: 600 !important;
	line-height: 1 !important;
	letter-spacing: 0 !important;
	white-space: nowrap !important;
}

/* Quick-view pill — 40px circle, absolute over the rating-pill's
   right edge so both share a top-right anchor point. Hidden by default.
   Solid white background with a subtle drop shadow for depth — same
   pairing as the single-product form controls. On hover, a dark disc
   (`.product__pill-hover-fill`) slides up from below via CSS transform
   and the inner SVG colour flips to white so it reads on the dark
   fill. `overflow: hidden` clips the slide inside the 40px circle. */
.product--concept-card .product__badge-swap .product__quickview-pill {
	position: absolute !important;
	top: 0 !important;
	right: 0 !important;
	left: auto !important;
	width: 40px !important;
	height: 40px !important;
	background: rgba(255, 255, 255, 0.72) !important;
	-webkit-backdrop-filter: blur(20px) saturate(180%);
	        backdrop-filter: blur(20px) saturate(180%);
	border: 0 !important;
	outline: 0 !important;
	border-radius: 50% !important;
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08) !important;
	color: #171717 !important;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	opacity: 0;
	transform: scale(0.5);
	transform-origin: 100% 50%;
	transition:
		opacity 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		color 0.25s cubic-bezier(0.3, 1, 0.3, 1);
	pointer-events: none;
	cursor: pointer;
	padding: 0 !important;
	margin: 0 !important;
	overflow: hidden !important;
	isolation: isolate;
	/* Pin the circle so its right edge aligns with the badge-swap's right
	   edge (same as the rating pill's right edge). The pill grew to the
	   left from the right anchor, so the circle also grows from there. */
}
/* Suppress the legacy `.btn-fill` from custom-hover-buttons-v2.js in
   case it's injected before our JS runs — we use our own
   `.product__pill-hover-fill` layer now. */
.product--concept-card .product__badge-swap .product__quickview-pill .btn-fill {
	display: none !important;
}
.product--concept-card .product__badge-swap .product__quickview-pill::before,
.product--concept-card .product__badge-swap .product__quickview-pill::after {
	display: none !important;
}
.product--concept-card .product__badge-swap .product__quickview-pill .glozin-svg-icon,
.product--concept-card .product__badge-swap .product__quickview-pill svg {
	width: 18px !important;
	height: 18px !important;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

/* Wishlist pill — second circle stacked BELOW the quick-view at the
   same top-right anchor. Matches the quick-view visually 1:1 (white
   circle, dark icon, dark fill slide on hover) so the two pills read
   as a coordinated vertical pair. 8px vertical gap. */
.product--concept-card .product__badge-swap .product__wishlist-pill {
	position: absolute !important;
	top: 48px !important;              /* 40px quick-view + 8px gap */
	right: 0 !important;
	left: auto !important;
	width: 40px !important;
	height: 40px !important;
	background: rgba(255, 255, 255, 0.72) !important;
	-webkit-backdrop-filter: blur(20px) saturate(180%);
	        backdrop-filter: blur(20px) saturate(180%);
	border: 0 !important;
	outline: 0 !important;
	border-radius: 50% !important;
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08) !important;
	color: #171717 !important;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	opacity: 0;
	transform: scale(0.5);
	transform-origin: 100% 0%;
	transition:
		opacity 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		color 0.25s cubic-bezier(0.3, 1, 0.3, 1);
	pointer-events: none;
	cursor: pointer;
	padding: 0 !important;
	margin: 0 !important;
	overflow: hidden !important;
	isolation: isolate;
}
.product--concept-card .product__badge-swap .product__wishlist-pill::before,
.product--concept-card .product__badge-swap .product__wishlist-pill::after {
	display: none !important;
}
/* Heart ↔ check crossfade.
   The heart is whatever WCBoost put inside the button — typically a
   `.glozin-svg-icon` wrapper or a bare `<svg>`. We tag that "existing"
   SVG with a broad selector (every direct SVG / icon-wrapper child
   that ISN'T our injected check) and animate `opacity` + `transform`.
   The check is a stroke-only polyline we injected as
   `.product__wishlist-check`; it sits absolutely centred and pops in
   with an overshoot when `.in-wishlist` is added. */
.product--concept-card .product__badge-swap .product__wishlist-pill > svg:not(.product__wishlist-check),
.product--concept-card .product__badge-swap .product__wishlist-pill > .glozin-svg-icon,
.product--concept-card .product__badge-swap .product__wishlist-pill > span:not(.product__pill-hover-fill) {
	width: 18px !important;
	height: 18px !important;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	position: relative;
	z-index: 1;
	transform: scale(1) rotate(0deg);
	opacity: 1;
	transition:
		opacity 0.28s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.38s cubic-bezier(0.3, 1, 0.3, 1),
		fill 0.25s ease,
		color 0.25s ease;
}
.product--concept-card .product__badge-swap .product__wishlist-pill.in-wishlist > svg:not(.product__wishlist-check),
.product--concept-card .product__badge-swap .product__wishlist-pill.in-wishlist > .glozin-svg-icon,
.product--concept-card .product__badge-swap .product__wishlist-pill.in-wishlist > span:not(.product__pill-hover-fill) {
	transform: scale(0.3) rotate(-45deg);
	opacity: 0;
	pointer-events: none;
}
/* The check — absolute on top. Hidden by default; pops in with a
   gentle overshoot when `.in-wishlist` is set. Inherits the pill's
   `color` so the stroke follows the button's rest / hover colour
   (dark on the white pill, flips to white when the dark hover fill
   slides up). */
.product--concept-card .product__badge-swap .product__wishlist-pill > svg.product__wishlist-check {
	position: absolute !important;
	top: 50% !important;
	left: 50% !important;
	width: 18px !important;
	height: 18px !important;
	transform: translate(-50%, -50%) scale(0.3) rotate(25deg);
	opacity: 0;
	color: inherit;
	z-index: 2;
	pointer-events: none;
	transition:
		opacity 0.28s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.42s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.product--concept-card .product__badge-swap .product__wishlist-pill.in-wishlist > svg.product__wishlist-check {
	transform: translate(-50%, -50%) scale(1) rotate(0deg);
	opacity: 1;
}
/* When pulsing (re-add), run a tiny bounce so repeat clicks still feel
   responsive. */
@keyframes wishlistCheckPulse {
	0%   { transform: translate(-50%, -50%) scale(0.3) rotate(25deg); opacity: 0; }
	55%  { transform: translate(-50%, -50%) scale(1.15) rotate(0deg); opacity: 1; }
	100% { transform: translate(-50%, -50%) scale(1) rotate(0deg); opacity: 1; }
}
.product--concept-card .product__badge-swap .product__wishlist-pill.in-wishlist.product__wishlist-pill--pulse > svg.product__wishlist-check {
	animation: wishlistCheckPulse 0.42s cubic-bezier(0.3, 1, 0.3, 1);
}
.product--concept-card .product__badge-swap .product__wishlist-pill .btn-fill {
	display: none !important;
}
/* Hide the WCBoost-rendered text node inside the wishlist button —
   the pill is icon-only, the "Add to wishlist" label would overflow
   the 40px circle and there's no design slot for it. sr-only pattern
   preserves the label for screen readers. */
.product--concept-card .product__badge-swap .product__wishlist-pill .wcboost-wishlist-button__text {
	position: absolute !important;
	width: 1px !important;
	height: 1px !important;
	padding: 0 !important;
	margin: -1px !important;
	overflow: hidden !important;
	clip: rect(0, 0, 0, 0) !important;
	white-space: nowrap !important;
	border: 0 !important;
}

/* Solid dark sliding hover-fill for circular card pills
   (quick-view + wishlist). Injected as `.product__pill-hover-fill`
   by custom-product-cards.js. At rest it's parked below the pill
   (translateY 110%) so the white base is fully visible; on hover
   (or `:active` tap on mobile — iOS holds `:hover` briefly after a
   tap) it slides up to cover the pill with `#111`. Mirrors the
   single-product ATC's `.btn-fill` slide — just the dark variant
   since these pills are white circles with a dark fill, whereas the
   ATC is a dark pill with a white fill. Border-radius 50% matches
   the container circle so the fill doesn't show any square edges. */
.product--concept-card .product__badge-swap .product__quickview-pill .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__wishlist-pill .product__pill-hover-fill {
	position: absolute;
	inset: -10%;
	background: #111;
	border-radius: 50%;
	transform: translateY(110%);
	transition: transform 0.5s cubic-bezier(0.3, 1, 0.3, 1);
	pointer-events: none;
	z-index: 0;
	will-change: transform;
}
.product--concept-card .product__badge-swap .product__quickview-pill:hover .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__quickview-pill:active .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__quickview-pill:focus-visible .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__wishlist-pill:hover .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__wishlist-pill:active .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__wishlist-pill:focus-visible .product__pill-hover-fill {
	transform: translateY(0);
}
/* Icon flips to white once the dark fill covers the pill. Done via
   `color` (plus `fill: currentColor` / `stroke: currentColor` on SVG
   paths) so both stroke-only and filled icons follow. Applies to both
   the rest heart / check state and the `.in-wishlist` check state —
   the pill is visually identical in both states (white circle) so
   the hover flip is identical too. */
.product--concept-card .product__badge-swap .product__quickview-pill:hover,
.product--concept-card .product__badge-swap .product__quickview-pill:active,
.product--concept-card .product__badge-swap .product__quickview-pill:focus-visible,
.product--concept-card .product__badge-swap .product__wishlist-pill:hover,
.product--concept-card .product__badge-swap .product__wishlist-pill:active,
.product--concept-card .product__badge-swap .product__wishlist-pill:focus-visible {
	color: #ffffff !important;
}

/* Quick-view loading lock: keep the pill visually black while the
   AJAX quick-view request and opening animation are in flight. */
.product--concept-card .product__badge-swap .product__quickview-pill.gz-quickview-loading-locked,
.product--concept-card .product__badge-swap .product__quickview-pill.gz-ios-loading {
	background: rgba(17, 17, 17, 0.92) !important;
	color: #ffffff !important;
	border: 0 !important;
	box-shadow: 0 8px 20px rgba(0, 0, 0, 0.14) !important;
}

.product--concept-card .product__badge-swap .product__quickview-pill.gz-quickview-loading-locked .product__pill-hover-fill,
.product--concept-card .product__badge-swap .product__quickview-pill.gz-ios-loading .product__pill-hover-fill {
	transform: translateY(0) !important;
}

html body ul.products li.product .product__quickview-pill.gz-ios-loading .gz-ios-loader__ring,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading .gz-ios-loader__ring,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked .gz-ios-loader__ring,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked .gz-ios-loader__ring {
	border-color: #ffffff !important;
	border-top-color: transparent !important;
}

html body ul.products li.product .product__quickview-pill.gz-ios-loading .gz-ios-loader__dot,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading .gz-ios-loader__dot,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked .gz-ios-loader__dot,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked .gz-ios-loader__dot {
	background-color: #ffffff !important;
}
/* Icon colour sync only — `fill: currentColor` so filled glyphs (the
   heart, the eye) pick up the pill's hover colour flip.
   IMPORTANT: DO NOT set `stroke: currentColor` here. SVG's default
   stroke-width is 1, so asserting a stroke paints a 1px outline on
   top of the fill — the eye/heart glyphs look visibly "bold" /
   heavier on hover. Leave stroke alone; the glyph is filled-only in
   its rest state and should stay that way on hover. The stroke-only
   checkmark SVG handles its own stroke via the inline `stroke`
   attribute and isn't touched by this rule. */
.product--concept-card .product__badge-swap .product__quickview-pill:hover svg,
.product--concept-card .product__badge-swap .product__quickview-pill:active svg,
.product--concept-card .product__badge-swap .product__quickview-pill:focus-visible svg,
.product--concept-card .product__badge-swap .product__wishlist-pill:hover svg:not(.product__wishlist-check),
.product--concept-card .product__badge-swap .product__wishlist-pill:active svg:not(.product__wishlist-check),
.product--concept-card .product__badge-swap .product__wishlist-pill:focus-visible svg:not(.product__wishlist-check) {
	fill: currentColor;
}
/* Guardrail: every SVG inside the pills gets `stroke-width: 0` so
   even if the rendered markup specifies a default stroke (some WC
   plugins' inline SVGs do), no accidental outline paints. The
   injected `.product__wishlist-check` restores its own stroke-width
   explicitly below. */
.product--concept-card .product__badge-swap .product__quickview-pill svg,
.product--concept-card .product__badge-swap .product__wishlist-pill svg:not(.product__wishlist-check) {
	stroke-width: 0;
}
.product--concept-card .product__badge-swap .product__wishlist-pill > svg.product__wishlist-check {
	stroke-width: 2.4;
}
/* Kill any leftover tooltip pseudo-elements on the cloned wishlist.
   The JS strips the `.gz-tooltip` / `.gz-tooltip-inside` classes and
   related `data-tooltip*` attrs, but a defensive CSS rule belts it
   in case a future parent-theme update adds a new selector we miss
   — tooltips on this specific pill are unwanted regardless. */
.product--concept-card .product__badge-swap .product__wishlist-pill::before,
.product--concept-card .product__badge-swap .product__wishlist-pill::after,
.product--concept-card .product__badge-swap .product__quickview-pill::before,
.product--concept-card .product__badge-swap .product__quickview-pill::after {
	display: none !important;
	content: none !important;
}

/* "Added to wishlist" state — KEEP the pill visually identical to the
   default (white circle, dark icon). The only difference is that the
   heart SVG is swapped for the check via the crossfade above. User
   explicitly requested the wishlist pill look the same in both states
   so the visual treatment (background / border / color) is unchanged
   from the rest state — this block is intentionally empty but kept
   as a documentation anchor so future edits know the "added" state
   is visually a no-op. */

/* Hover crossfade: rating shrinks into the corner, quickview + wishlist
   grow out of the same corner. Symmetric 0.30s timing means hover-in
   and hover-out mirror each other — no "glitch" on hover-out because
   all three elements take the same duration to reverse. */
.product--concept-card:hover .product__rating-pill {
	opacity: 0;
	transform: scale(0.5);
	pointer-events: none;
}
.product--concept-card:hover .product__badge-swap .product__quickview-pill {
	opacity: 1;
	transform: scale(1);
	pointer-events: auto;
}
.product--concept-card:hover .product__badge-swap .product__wishlist-pill {
	opacity: 1;
	transform: scale(1);
	pointer-events: auto;
	/* Small stagger: wishlist arrives just after the quick-view so the
	   two circles read as a coordinated reveal instead of a hard pop. */
	transition-delay: 0.06s;
}

/* Hide the ORIGINAL bottom-right quick-view icon on Concept cards —
   the top-right clone is the canonical entry-point now. */
.product--concept-card .product-featured-icons .product__quickview--replaced {
	display: none !important;
}

/* -------- Bottom-center Add-to-Cart slide-up --------
   Concept uses a compact pill — NOT a wide, stretched button. Target
   sizing (measured off the reference theme): ~130–150px wide, 36px
   tall, 13px text. Re-anchor the existing `.add_to_cart_button` at
   the horizontal centre of the thumbnail's lower third, sliding up on
   card hover.

   Parent theme positions `.product-featured-icons--primary` as a
   small box at the bottom-right on mobile (`bottom-10 end-10`) and
   top-right on desktop (`top-15-xl end-15-xl`) — so `left:50%` inside
   THAT container would be ~the container's middle, not the card's
   middle. We re-shape the container itself into a full-width strip
   pinned to the bottom of the thumbnail, with the single remaining
   child (ATC button) centered inside it. Wishlist/compare/quickview
   are hidden from this stack (see rules below) so the re-shaped
   container only holds the ATC pill.

   `.product-loop-button-atc` is present in BOTH
   `.product-featured-icons--primary` (the vertical right-edge stack,
   hovers to reveal on desktop; visible always on mobile) AND
   `.product-featured-icons--second` (the full-width bottom row,
   desktop-only via Bootstrap `d-flex-xl`). We target BOTH containers
   so the concept pill shows regardless of which strip is active at a
   given breakpoint — keyed to `.product--concept-card` so the rule
   only applies when our JS marked the card up.

   Mobile: there's no `:hover` state, so we can't rely on the
   `card:hover` reveal. We unconditionally show the pill on coarse-
   pointer devices via the media query at the bottom of this block. */

/* Re-shape the --primary and --second containers into full-width
   bottom strips so `left: 50%` actually centers against the thumbnail,
   not the container's 40px-wide sliver. The containers themselves
   carry `pointer-events: none` so the space around the pill is
   transparent to clicks — the pill re-enables pointer events on
   itself. */
.product--concept-card .product-thumbnail .product-featured-icons--primary,
.product--concept-card .product-thumbnail .product-featured-icons--second {
	position: absolute !important;
	top: auto !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	width: 100% !important;
	max-width: none !important;
	display: flex !important;
	flex-direction: row !important;
	align-items: flex-end !important;
	justify-content: center !important;
	padding: 0 0 20px 0 !important;
	margin: 0 !important;
	pointer-events: none;
	z-index: 3;
}

.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc,
.product--concept-card .product-thumbnail .product-featured-icons--primary a.add_to_cart_button,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc,
.product--concept-card .product-thumbnail .product-featured-icons--second a.add_to_cart_button {
	position: relative !important;
	left: auto !important;
	right: auto !important;
	top: auto !important;
	bottom: auto !important;
	transform: translateY(16px);
	opacity: 0;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	gap: 6px;
	width: auto !important;
	min-width: 0 !important;
	max-width: calc(100% - 48px) !important;
	padding: 10px 18px !important;
	/* Solid dark pill — matches the single-product "Add to cart"
	   button exactly so the ATC feels visually identical across
	   contexts. The sliding `.btn-fill` (injected by
	   custom-hover-buttons-v2.js and styled in section 5) slides a
	   white disc up from below on hover, and the text flips from
	   white → dark via the `.concept-hover-btn--primary:hover *`
	   rule — same mechanic, same look as the single page.
	   (Previous revisions used iOS-glass translucency; reverted on
	   user request who preferred the plain white/black pairing.) */
	background-color: #111 !important;
	color: #ffffff !important;
	border: 0 !important;
	border-radius: 999px !important;
	font-size: 13px !important;
	font-weight: 600 !important;
	line-height: 1 !important;
	letter-spacing: 0 !important;
	white-space: nowrap;
	box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);
	transition:
		opacity 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.30s cubic-bezier(0.3, 1, 0.3, 1),
		color 0.25s cubic-bezier(0.3, 1, 0.3, 1);
	pointer-events: none;
	z-index: 4;
	margin: 0 !important;
}

/* The Glozin ATC inline markup is `<svg shopping-bag>` + `<span>Add to
   cart</span>`. Concept doesn't show the cart-bag icon in its pill —
   just text. Hide it for a cleaner, narrower pill. */
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc .glozin-svg-icon,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc .glozin-svg-icon-original,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc .glozin-svg-icon,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc .glozin-svg-icon-original {
	display: none !important;
}

/* Text colour — mirrors the single-product ATC pairing.
   Rest state: white text on the #111 pill.
   Hover / active: the `.btn-fill` slides a white disc over the pill,
   so the text must flip to dark (#171717) to read on the newly-white
   fill. We write explicit hover selectors at the same high specificity
   as the rest-state rule so neither overrides the other through
   `!important` ties — each wins only in its own state. */
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc *,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc * {
	color: #ffffff !important;
	-webkit-text-fill-color: #ffffff !important;
}
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc:hover,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc:active,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc:focus-visible,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc:hover *,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc:active *,
.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc:focus-visible *,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc:hover,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc:active,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc:focus-visible,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc:hover *,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc:active *,
.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc:focus-visible * {
	color: #171717 !important;
	-webkit-text-fill-color: #171717 !important;
}

.product--concept-card:hover .product-thumbnail .product-featured-icons--primary .product-loop-button-atc,
.product--concept-card:hover .product-thumbnail .product-featured-icons--primary a.add_to_cart_button,
.product--concept-card:hover .product-thumbnail .product-featured-icons--second .product-loop-button-atc,
.product--concept-card:hover .product-thumbnail .product-featured-icons--second a.add_to_cart_button {
	opacity: 1;
	transform: translateY(0);
	pointer-events: auto;
}

/* Only ONE ATC pill should be visible at a time. The `--second` copy
   is `d-none d-flex-xl` from Bootstrap so it's hidden <1200px and
   shown ≥1200px. When both are in the DOM at ≥1200px we'd stack two
   identical pills on top of each other, so hide the `--primary` copy
   once the `--second` row is in play. Below 1200px only the
   `--primary` pill renders, which is what we want. */
@media (min-width: 1200px) {
	.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc,
	.product--concept-card .product-thumbnail .product-featured-icons--primary a.add_to_cart_button {
		display: none !important;
	}
}

/* Mobile / touch devices — no hover state, show the pill permanently
   so users can tap-to-cart. */
@media (hover: none), (pointer: coarse) {
	/* Mobile two-tap reveal pattern.
	   On touch devices there is no `:hover` — what the user sees on
	   desktop only when hovering a card (rating pill → quick-view /
	   wishlist crossfade + ATC slide-up) now needs a different
	   trigger. We lean on a JS-managed `.product--active` class
	   (toggled by custom-product-cards.js on first tap, cleared on
	   outside tap) to gate the reveal.
	   First tap on a card → `.product--active` added → pills + ATC
	   appear exactly like desktop hover. Second tap → the click
	   handler lets the default anchor navigation through and the
	   browser loads the PDP. Tap another card / outside → the
	   active class is removed and the card collapses back to its
	   rating-pill rest state. See JS comments for the full state
	   machine. */
	.product--concept-card.product--active .product-thumbnail .product-featured-icons--primary .product-loop-button-atc,
	.product--concept-card.product--active .product-thumbnail .product-featured-icons--primary a.add_to_cart_button,
	.product--concept-card.product--active .product-thumbnail .product-featured-icons--second .product-loop-button-atc,
	.product--concept-card.product--active .product-thumbnail .product-featured-icons--second a.add_to_cart_button {
		opacity: 1 !important;
		transform: translateY(0) !important;
		pointer-events: auto !important;
	}
	/* Parent-theme's `product-card-animation` visibility toggle only
	   fires under `pointer: fine` so it's not a concern on coarse
	   pointer. We still force the strip visible on active cards in
	   case a tablet reports mixed pointer capability. */
	.product--concept-card.product--active .product-thumbnail .product-featured-icons--primary,
	.product--concept-card.product--active .product-thumbnail .product-featured-icons--second {
		opacity: 1 !important;
		visibility: visible !important;
		transform: none !important;
	}
	/* Active-card rating ↔ quick-view / wishlist crossfade on touch.
	   Mirrors the desktop `:hover` rules so the mobile experience is
	   identical in appearance — just triggered by a tap instead of
	   a pointer hover. */
	.product--concept-card.product--active .product__rating-pill {
		opacity: 0;
		transform: scale(0.5);
		pointer-events: none;
	}
	.product--concept-card.product--active .product__badge-swap .product__quickview-pill {
		opacity: 1;
		transform: scale(1);
		pointer-events: auto;
	}
	.product--concept-card.product--active .product__badge-swap .product__wishlist-pill {
		opacity: 1;
		transform: scale(1);
		pointer-events: auto;
		transition-delay: 0.06s;
	}
}

/* Hide the NATIVE wishlist / compare buttons in their original
   `.product-featured-icons--primary` stack. The wishlist is lifted
   into the top-right badge-swap as a JS-cloned `.product__wishlist-pill`
   so it sits next to quick-view with the iOS-glass treatment — if we
   leave the native copy visible it'd show as a duplicate on the card.
   The compare icon is intentionally dropped entirely (reference Concept
   design has no compare action on cards). */
.product--concept-card .product-thumbnail .product-featured-icons--primary .wcboost-wishlist-button:not(.product__wishlist-pill),
.product--concept-card .product-thumbnail .product-featured-icons--primary .wcboost-products-compare-button {
	display: none !important;
}

/* -------- Summary layout: CATEGORY ▸ TITLE ▸ PRICE ▸ SWATCHES -----
   Three stacked left-aligned rows — category (small uppercase, like
   Concept's "SONICPULSE" brand line), then title, then price. Applies
   at every viewport width. A long title is clamped to one line with
   an ellipsis so it can never push the price into a weird wrap.

   IMPORTANT (override): parent theme wraps `.product-summary` with
   `d-flex flex-column align-items-center text-center` Bootstrap
   utility classes (each using `!important` at specificity (0,1,0)).
   The selectors here are at (0,3,2) plus our own `!important` so
   every property wins the cascade outright — no half-applied rules. */
.product--concept-card .product-summary {
	display: flex !important;
	flex-direction: column !important;
	flex-wrap: nowrap !important;
	align-items: flex-start !important;
	justify-content: flex-start !important;
	gap: 4px !important;
	text-align: left !important;
	/* Match the tile padding so the title/price sit comfortably inside
	   the unified grey tile introduced in section 17. */
	margin: 0 !important;
	padding: 14px 14px 16px !important;
	width: 100%;
}

/* Category row — injected by functions.php (glozin_child_product_card_category)
   as `<div class="product__category"><a>Name</a></div>`. Concept
   renders this as small, uppercase, letter-spaced text. */
.product--concept-card .product-summary .product__category,
.product--concept-card .product-summary .product--cat {
	order: 1;
	flex: 0 0 auto;
	margin: 0 !important;
	padding: 0 !important;
	font-size: 11px !important;
	font-weight: 500 !important;
	line-height: 1.4 !important;
	letter-spacing: 0.06em !important;
	text-transform: uppercase !important;
	color: rgba(23, 23, 23, 0.55) !important;
	text-align: left !important;
	width: 100%;
}
.product--concept-card .product-summary .product__category a,
.product--concept-card .product-summary .product--cat a {
	color: inherit !important;
	text-decoration: none !important;
	transition: color 0.2s ease;
}
.product--concept-card .product-summary .product__category a:hover,
.product--concept-card .product-summary .product--cat a:hover {
	color: rgba(23, 23, 23, 0.9) !important;
}

/* Title — row 2, full-width, clamped to 1 line with ellipsis. */
.product--concept-card .product-summary .woocommerce-loop-product__title,
.product--concept-card .product-summary .product__title {
	order: 2;
	flex: 0 0 auto;
	margin: 0 !important;
	padding: 0 !important;
	font-weight: 600;
	font-size: 15px;
	line-height: 1.3;
	text-align: left !important;
	color: var(--gz-color-dark, #171717);
	width: 100%;
	/* One-line truncation. -webkit-line-clamp renders consistently
	   across all browsers (WebKit, Blink, and Firefox all treat it
	   as a standard property now) and is the single cleanest way to
	   clamp to N lines with ellipsis. `min-width: 0` lets the flex
	   child shrink below its content's intrinsic width so the text
	   can actually be clipped. */
	display: -webkit-box !important;
	-webkit-line-clamp: 1;
	line-clamp: 1;
	-webkit-box-orient: vertical;
	overflow: hidden;
	text-overflow: ellipsis;
	min-width: 0;
	word-break: break-word;
}
.product--concept-card .product-summary .woocommerce-loop-product__title a,
.product--concept-card .product-summary .product__title a {
	color: inherit;
	display: inline;   /* keep -webkit-line-clamp working on the parent */
}

/* Price — row 3, left-aligned.
   `.price` is `display: flex` in the parent theme (see woocommerce.css:286)
   and the parent adds `ul.products li.product .product-summary.align-items-center
   .price { justify-content: center }` via the Bootstrap utility class on
   `.product-summary`. So text-align alone does nothing — we also have to
   force `justify-content: flex-start` to actually push the sale/strike
   price pair to the left edge. */
.product--concept-card .product-summary .price {
	order: 3;
	flex: 0 0 auto;
	margin: 0 !important;
	padding: 0 !important;
	text-align: left !important;
	justify-content: flex-start !important;
	align-items: baseline !important;
	font-weight: 500;
	font-size: 15px;
	line-height: 1.3;
	color: var(--gz-color-dark, #171717);
	white-space: nowrap;
	width: 100%;
}
/* Sale price pairs: keep the strike-through and current price aligned
   tidily on a single line. */
.product--concept-card .product-summary .price del,
.product--concept-card .product-summary .price ins {
	margin: 0;
	padding: 0;
}
.product--concept-card .product-summary .price del {
	opacity: 0.55;
	margin-right: 4px;
	font-weight: 400;
}
.product--concept-card .product-summary .price ins {
	text-decoration: none;
}

/* Swatches row below price. */
.product--concept-card .product-summary .product-variation-items,
.product--concept-card .product-summary .product-list-featured-icons {
	order: 4;
	flex: 0 0 auto;
	width: 100% !important;
	margin: 6px 0 0 !important;
	justify-content: flex-start !important;
}

/* Hide the inline rating block (we lifted it into the top-right badge). */
.product--concept-card .product-summary .product__rating,
.product--concept-card .product-summary .glozin-rating {
	display: none !important;
}


/* -------- Image carousel: iOS-style slide-track --------
   Previous revision used an opacity crossfade between images — the user
   asked for a real slide-between-images feel like the iOS Photos app
   swipe. We now wrap every thumbnail `<img>` in a flexbox
   `.product__carousel-track` (done by JS) and translate the track by
   `-N * 100%` to show image N. All images are in the DOM at once,
   side-by-side, so the motion is continuous horizontal scroll rather
   than a crossfade.

   Gallery images beyond Glozin's primary+secondary pair are injected
   into the track by JS from a `<script type="application/json">` blob
   the PHP hook emits (functions.php → glozin_child_product_card_gallery_data).
   The track length adjusts automatically to however many images are
   present.

   Hardware acceleration: the track has `will-change: transform` so
   the browser promotes it to its own compositor layer, keeping the
   slide buttery on mid-range mobiles. */
.product--concept-card .product-thumbnail .woocommerce-LoopProduct-link {
	--active-index: 0;
	display: block;
	overflow: hidden;
	position: relative;
}

.product--concept-card .product-thumbnail .product__carousel-track {
	position: absolute;
	inset: 0;
	display: flex;
	flex-direction: row;
	align-items: stretch;
	transform: translate3d(calc(var(--active-index, 0) * -100%), 0, 0);
	/* iOS-style slide timing — slower and smoother than the old 0.42s
	   snap. `cubic-bezier(0.22, 1, 0.36, 1)` is a close approximation
	   of iOS's standard "ease out" curve (gentle deceleration). */
	transition: transform 0.62s cubic-bezier(0.22, 1, 0.36, 1);
	will-change: transform;
	z-index: 1;
}

/* Each image is a full-width flex item. `flex: 0 0 100%` freezes the
   width regardless of image intrinsic size so the track arithmetic
   (translateX(-N*100%)) lands exactly on each image's start edge. */
.product--concept-card .product-thumbnail .product__carousel-track > img,
.product--concept-card .product-thumbnail .product__carousel-track > img.attachment-woocommerce_thumbnail {
	position: relative !important;
	inset: auto !important;
	top: auto !important;
	left: auto !important;
	right: auto !important;
	bottom: auto !important;
	flex: 0 0 100% !important;
	width: 100% !important;
	height: 100% !important;
	max-width: 100% !important;
	object-fit: cover !important;
	opacity: 1 !important;
	transform: none !important;
	transition: none !important;
	display: block !important;
	margin: 0 !important;
	padding: 0 !important;
}

/* Kill the parent theme's `fadein-image` opacity tween on the
   secondary image — everything lives in the track now and the track
   handles all motion. Without this, the secondary image keeps
   fading in/out on `ul.products li.product:hover` and we get a
   double animation. */
.product--concept-card .product-thumbnail .product__carousel-track > img.product-thumbnails--fadein-image {
	opacity: 1 !important;
	transition: none !important;
}

/* Native hover fade preview.
   The slide-track remains responsible for arrows and touch swipes.
   Passive desktop hover gets a separate clone of the second image that
   fades over image 1, matching Glozin's native `fadein` card effect
   without moving the carousel track. Once the user navigates manually
   (`.product--carousel-active`), the overlay stays hidden so it never
   masks the selected slide. */
.product--concept-card .product-thumbnail .product__hover-fade-img {
	position: absolute !important;
	inset: 0 !important;
	top: 0 !important;
	left: 0 !important;
	right: auto !important;
	bottom: auto !important;
	width: 100% !important;
	height: 100% !important;
	max-width: 100% !important;
	object-fit: cover !important;
	opacity: 0 !important;
	transform: scale(1) !important;
	transform-origin: center center;
	transition:
		opacity 0.52s cubic-bezier(0.22, 1, 0.36, 1),
		transform 1.45s cubic-bezier(0.22, 1, 0.36, 1) !important;
	pointer-events: none !important;
	display: block !important;
	z-index: 2;
}

@media (hover: hover) and (pointer: fine) {
	.product--concept-card:not(.product--carousel-active):hover .product-thumbnail .product__hover-fade-img {
		opacity: 1 !important;
		transform: scale(1.045) !important;
	}
}

@media (hover: none), (pointer: coarse) {
	.product--concept-card .product-thumbnail .product__hover-fade-img {
		display: none !important;
	}
}

/* If the JS didn't run (e.g., script failed to load), fall back to
   the first image visible + rest stacked. This keeps the card usable
   even when the carousel track doesn't get built. */
.product--concept-card .product-thumbnail .woocommerce-LoopProduct-link:not(:has(.product__carousel-track)) img.attachment-woocommerce_thumbnail {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
.product--concept-card .product-thumbnail .woocommerce-LoopProduct-link:not(:has(.product__carousel-track)) img.attachment-woocommerce_thumbnail:not(:first-of-type) {
	opacity: 0;
}

/* Hide the gallery-data JSON script from layout (it's <script type="application/json">
   so browsers won't execute it, but some themes set `display: block`
   on `<script>`. Force it hidden. */
.product__gallery-data {
	display: none !important;
}

/* Arrows — iOS-style glass buttons (backdrop-blur + translucent
   white), invisible by default, fade in on card hover (desktop only).
   Touch devices don't need the arrows; swipe handles it. */
.product--concept-card .product-thumbnail .product__nav-arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%) scale(0.94);
	width: 34px;
	height: 34px;
	border-radius: 50%;
	/* iOS-glass: translucent white with saturation boost + blur so
	   whatever's behind shows through subtly but legibly. */
	background: rgba(255, 255, 255, 0.42);
	-webkit-backdrop-filter: blur(20px) saturate(180%);
	        backdrop-filter: blur(20px) saturate(180%);
	border: 0.5px solid rgba(255, 255, 255, 0.55);
	color: #171717;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	margin: 0;
	z-index: 4;
	/* No drop shadow — the blur provides all the separation the
	   button needs. */
	box-shadow: none;
	cursor: pointer;
	opacity: 0;
	transition:
		opacity 0.28s cubic-bezier(0.22, 1, 0.36, 1),
		transform 0.28s cubic-bezier(0.22, 1, 0.36, 1),
		background-color 0.2s ease;
	pointer-events: none;
}
.product--concept-card .product-thumbnail .product__nav-arrow--prev { left: 12px; }
.product--concept-card .product-thumbnail .product__nav-arrow--next { right: 12px; }
.product--concept-card .product-thumbnail .product__nav-arrow svg {
	width: 13px; height: 13px; display: block;
	stroke-width: 2.2;
}
.product--concept-card:hover .product-thumbnail .product__nav-arrow {
	opacity: 1;
	transform: translateY(-50%) scale(1);
	pointer-events: auto;
}
.product--concept-card .product-thumbnail .product__nav-arrow:hover {
	background: rgba(255, 255, 255, 0.75);
	color: #000;
}

/* Hide arrows on touch devices — swipe replaces them. */
@media (hover: none), (pointer: coarse) {
	.product--concept-card .product-thumbnail .product__nav-arrow {
		display: none !important;
	}
}


/* ==========================================================================
   17. Concept-theme card tile — unified grey shell + gap
        Applies at ALL viewport widths.

   Concept renders every product card on a single light-gray tile:
   the image and the info text below share one rounded background,
   with visible gutters between adjacent tiles so they never blur
   into one big grey block. We re-create that by:

     1. Painting `.product-inner` light-gray with rounded corners,
        and neutralising any background/shadow Glozin had on `.li`
        and the thumbnail (so the image and text visually sit inside
        one unified shell).
     2. Giving every `li.product.product--concept-card` 8px of
        horizontal padding — which, with the sibling li on the other
        side also carrying 8px, creates 16px of empty space between
        tiles. Vertical gap comes from the existing 30px
        margin-bottom (we tighten to 24px).
     3. Pulling the UL out 8px on each side (`:has()`-scoped so it
        only applies when there are Concept cards inside) so the
        leftmost/rightmost tile's horizontal padding doesn't show
        up as a gap at the page edges — tiles stay visually
        flush with the rest of the page.

   Higher-specificity selector (`html body ul.products li.product`)
   beats Bootstrap utility classes (`.d-flex`, `.text-center` etc.)
   that parent theme sprinkles on the summary — those use
   `!important` at (0,1,0) specificity; we're at (0,4,2) + our own
   `!important` so the cascade is unambiguous.
   ========================================================================== */

/* UL: pull outward so tile paddings line up flush with the grid edge.
   `:has()` gates this to collections that actually contain Concept
   cards — plain shortcode product lists (upsell, related, widgets)
   keep the stock Glozin layout. */
ul.products:has(> li.product.product--concept-card) {
	margin-left: -8px !important;
	margin-right: -8px !important;
	row-gap: 8px;
}

/* li — transparent, horizontal gap via padding. */
html body ul.products li.product.product--concept-card {
	padding: 0 8px !important;
	margin-bottom: 24px !important;
	background: transparent !important;
	box-shadow: none !important;
	box-sizing: border-box !important;
}

/* .product-inner — the actual visible tile. Unified light-gray
   background with rounded corners; overflow hidden so the thumbnail
   + summary cascade into one chip. */
html body ul.products li.product.product--concept-card > .product-inner {
	background-color: #f5f5f5 !important;
	border-radius: 14px !important;
	overflow: hidden !important;
	padding: 0 !important;
	box-shadow: none !important;
	height: 100%;
}

/* Thumbnail blends into the tile — no separate bg, no own corners. */
html body ul.products li.product.product--concept-card .product-thumbnail {
	background-color: transparent !important;
	border-radius: 0 !important;
	margin: 0 !important;
}

/* ---- Stand-out hover / active: iOS-glass outer frame ----
   Reference deltitechbrands.com/shop — their hover effect is a
   WHITE `.wd-product-card-bg` element that fades in behind the
   tile (inset -15px/-15px/-2px/-15px, box-shadow 0 0 10px
   rgba(0,0,0,0.15), transform scale(0.98)→scale(1)).

   Direct port concern: deltitech's card has NO background in its
   rest state, so painting the frame white doesn't create any
   colour conflict. Our Concept tiles have a permanent grey shell
   (`#f5f5f5`, section 17), so a stark-white frame behind a grey
   rectangle reads as "the grey got whitened" — that's what the
   user rejected.

   Resolution: tint the frame the SAME grey as the tile, but add
   iOS-style frosted-glass translucency (backdrop-filter blur +
   saturate) + an ambient drop shadow. The halo that extends past
   the tile edges looks like a slightly lifted, frosted-glass
   platform the tile is sitting on — same visual ROLE as
   deltitech's white frame (a "card stands out" halo) but colour-
   matched to our tile so nothing visibly changes hue on hover.
   That's the "ios-like with background around the outer frame"
   the user asked for.

   Host element: `<li>`, NOT `.product-inner`. `.product-inner`
   carries `overflow: hidden` (needed for rounded-corner image
   clipping, section 17), which prunes any pseudo extending past
   the tile edges. The `<li>` has `overflow: visible` by default,
   so a `::before` there paints freely into the grid gutter.

   Inset maths: deltitech's offsets are measured from the visible
   tile. Our visible tile is `.product-inner`, which sits 8px
   inward from `<li>` edges (section 17's `0 8px` padding). To
   land the frame at the same physical inset from the tile,
   subtract 8px from the left/right offsets: `-15px → -7px` on
   each side. Top is `-12px` and bottom `-8px` (slightly shorter
   than deltitech's `-15px/-2px` because our card has more
   vertical content under the image so the halo looks balanced
   with smaller vertical bleed).

   Triggered by `:hover` on desktop and by the JS-managed
   `.product--active` class on touch devices (mobile 2-tap). */

html body ul.products li.product.product--concept-card {
	position: relative;
	/* `isolation: isolate` creates a stacking context on the <li>.
	   Without it, the `::before` frame's `z-index: -1` escapes to
	   ancestor stacking contexts and may render behind the grid
	   container — visually vanishing the halo. Creating the
	   context here scopes the negative z-index to this li only.
	   NOTE: do NOT set `transition` on the <li> — parent theme's
	   `.gz-reveal` class sets its own `transition: opacity..., transform...`,
	   and any `transition` declaration at this higher specificity
	   replaces it, which silently breaks the scroll-reveal fade-in
	   (cards snap from opacity 0 to 1 without animating). */
	isolation: isolate;
	z-index: 0;
}
html body ul.products li.product.product--concept-card:hover,
html body ul.products li.product.product--concept-card.product--active {
	z-index: 20;
}

/* The iOS-glass outer frame. Tinted to match the grey tile
   (`#f5f5f5` at 55% alpha) so the halo doesn't introduce any new
   colour; backdrop blur + saturation give it the frosted-glass
   feel. Fades in + scales from 0.96 → 1 on hover for the
   "materialising" motion. The `inset` pattern creates a slightly
   larger halo above/sides of the tile than below — the card
   visually rises out of the frame from the bottom. */
html body ul.products li.product.product--concept-card::before {
	content: '';
	position: absolute;
	top: -12px;
	left: -7px;
	right: -7px;
	bottom: -8px;
	border-radius: 20px;
	background: rgba(245, 245, 245, 0.55);
	-webkit-backdrop-filter: blur(28px) saturate(180%);
	        backdrop-filter: blur(28px) saturate(180%);
	border: 0.5px solid rgba(0, 0, 0, 0.05);
	/* Tighter ambient shadow — keeps the drop close to the frame
	   edges instead of bleeding into a 45px halo. Two layers:
	   a short 10px softening + a ~16px contact shadow at 15% opacity.
	   Total visible reach ≈ 14–16px from the frame edge. */
	box-shadow:
		0 0 0 0.5px rgba(255, 255, 255, 0.6) inset,
		0 6px 14px -4px rgba(0, 0, 0, 0.14),
		0 2px 6px -2px rgba(0, 0, 0, 0.08);
	opacity: 0;
	visibility: hidden;
	transform: scale(0.96);
	transform-origin: center center;
	transition:
		opacity 0.35s ease,
		visibility 0s linear 0.35s,
		transform 0.35s cubic-bezier(0.25, 1, 0.3, 1);
	z-index: -1;
	pointer-events: none;
}
html body ul.products li.product.product--concept-card:hover::before,
html body ul.products li.product.product--concept-card.product--active::before {
	opacity: 1;
	visibility: visible;
	transform: scale(1);
	transition:
		opacity 0.35s ease,
		visibility 0s linear 0s,
		transform 0.35s cubic-bezier(0.25, 1, 0.3, 1);
}

/* Tile lift — `.product-inner` rises 4px on hover so the grey
   tile visibly lifts out of the frosted-glass halo. No scale
   (the frame's scale does the "growing" motion); no extra
   shadow on the tile (the frame's shadow already handles depth). */
html body ul.products li.product.product--concept-card > .product-inner {
	position: relative;
	transform: translateY(0);
	transition: transform 0.35s cubic-bezier(0.25, 1, 0.3, 1);
	will-change: transform;
}
html body ul.products li.product.product--concept-card:hover > .product-inner,
html body ul.products li.product.product--concept-card.product--active > .product-inner {
	transform: translateY(-4px);
}

/* ---- Mobile frame clipping fix — the REAL root cause ----
   Two compounding issues that caused the "frame cuts from the sides
   and top" bug:

   (a) Parent's `.glozin-shop-content { overflow: hidden }` at
       `max-width: 1024` (catalog.css:210) clipped the ul's negative
       margin AND our `<li>::before` frame any time it extended past
       the grid container.

   (b) A previous override fix used `overflow-x: clip` as a
       "scroll-bar guard" — but clip STILL pruned the horizontal
       bleed, just silently. That's why a "fix" didn't actually
       fix anything. Body's own `overflow-x: hidden` already
       prevents horizontal scroll bars, so we don't need a
       belt-and-suspenders X clip here.

   Resolution: force pure `overflow: visible` on every plausible
   ancestor in the clipping chain (shop content, container-xxl,
   ul.products). Horizontal scroll stays suppressed via body's
   own overflow-x:hidden, which is safe because the frame's bleed
   at the viewport edges is on the FIRST / LAST card only and
   the li padding box already covers the first 8px.

   Also drop `:has()` on the ul selector — older iOS Safari
   versions that don't support :has() would silently skip the
   rule. Plain selectors work everywhere. */
@media (max-width: 1024px) {
	html body .glozin-shop-content,
	html body .container-xxl.site-content-container,
	html body ul.products {
		overflow: visible !important;
	}
}

/* Mobile frame insets.
   Desktop uses `-12 / -7 / -8 / -7` (top/right/bottom/left). On
   mobile the visual tile is narrower so we pull the horizontal
   insets in a touch to stay safely within the viewport — but we
   still extend `-4px` beyond the li left/right to draw a halo
   outside the tile's 8px gutter. Body's overflow-x:hidden is
   still the safety net for any remaining bleed at the extreme
   viewport edges. */
@media (max-width: 767px) {
	html body ul.products li.product.product--concept-card::before {
		top: -8px;
		left: -4px;
		right: -4px;
		bottom: -4px;
		border-radius: 16px;
	}
}

/* `prefers-reduced-motion` — collapse the lift + scale so the
   card doesn't move. Frame still fades in as a focus cue; no
   motion involved. */
@media (prefers-reduced-motion: reduce) {
	html body ul.products li.product.product--concept-card:hover > .product-inner,
	html body ul.products li.product.product--concept-card.product--active > .product-inner {
		transform: none;
	}
	html body ul.products li.product.product--concept-card::before {
		transform: scale(1);
		transition: opacity 0.25s linear, visibility 0s linear;
	}
}


/* ==========================================================================
   18. MOBILE PRODUCT CARD — Concept-style circle ATC + tighter padding
                              (< 768px)

   Section 16 already gives us the column-stacked summary at every
   width. This section only overrides what NEEDS to change on phones:
   a smaller ATC button (38px circle with icon, no shadow), tighter
   summary padding, and slightly smaller body-copy sizes.
   ========================================================================== */

@media (max-width: 767px) {
	html body ul.products li.product.product--concept-card {
		--gz-mobile-card-action-size: clamp(32px, 8.64vw, 38px);
		--gz-mobile-card-action-icon-size: clamp(13.5px, 3.64vw, 16px);
		--gz-mobile-card-badge-action-size: clamp(34px, 9.1vw, 40px);
		--gz-mobile-card-badge-icon-size: clamp(15px, 4.1vw, 18px);
		--gz-mobile-card-sale-height: clamp(26px, 6.82vw, 30px);
		--gz-mobile-card-sale-padding: clamp(10px, 3.18vw, 14px);
		--gz-mobile-card-sale-font-size: clamp(11px, 2.95vw, 13px);
		--gz-mobile-card-action-inset: clamp(8px, 2.73vw, 12px);
		--gz-mobile-card-badge-gap: clamp(6px, 1.82vw, 8px);
	}

	/* Tighter inner padding + a touch smaller type so the tile works
	   on narrow viewports. */
	html body ul.products li.product.product--concept-card .product-summary {
		padding: 12px 14px 14px !important;
		gap: 3px !important;
	}
	html body ul.products li.product.product--concept-card .product-summary .product__category,
	html body ul.products li.product.product--concept-card .product-summary .product--cat {
		font-size: 10.5px !important;
	}
	html body ul.products li.product.product--concept-card .product-summary .woocommerce-loop-product__title,
	html body ul.products li.product.product--concept-card .product-summary .product__title {
		font-size: 14px !important;
	}
	html body ul.products li.product.product--concept-card .product-summary .price {
		font-size: 14px !important;
	}

	/* ---- ATC button → 38px circle with cart icon, no shadow ----
	   Sized to match Concept's mobile quick-add circle. No shadow per
	   the user's request. Still uses the dark pill fill (#111 +
	   white icon) so the hover fill animation from custom-hover-
	   buttons-v2.js works identically to the desktop pill. */
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--primary,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--second {
		top: auto !important;
		left: auto !important;
		right: 0 !important;
		bottom: 0 !important;
		width: auto !important;
		padding: 0 var(--gz-mobile-card-action-inset) var(--gz-mobile-card-action-inset) 0 !important;
		justify-content: flex-end !important;
		align-items: flex-end !important;
	}
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--primary a.add_to_cart_button,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--second a.add_to_cart_button {
		width: var(--gz-mobile-card-action-size) !important;
		height: var(--gz-mobile-card-action-size) !important;
		min-width: var(--gz-mobile-card-action-size) !important;
		max-width: var(--gz-mobile-card-action-size) !important;
		min-height: var(--gz-mobile-card-action-size) !important;
		max-height: var(--gz-mobile-card-action-size) !important;
		padding: 0 !important;
		border-radius: 50% !important;
		gap: 0 !important;
		font-size: 0 !important;         /* collapses any stray text node */
		/* Remove the drop shadow per user request — Concept's mobile
		   quick-add sits flat on the tile. */
		box-shadow: none !important;
	}
	/* Re-show the shopping-bag SVG that section 16 hides for the
	   desktop text pill. */
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc .glozin-svg-icon,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--primary .product-loop-button-atc .glozin-svg-icon-original,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc .glozin-svg-icon,
	html body ul.products li.product.product--concept-card .product-thumbnail .product-featured-icons--second .product-loop-button-atc .glozin-svg-icon-original {
		display: inline-flex !important;
		align-items: center;
		justify-content: center;
		width: var(--gz-mobile-card-action-icon-size) !important;
		height: var(--gz-mobile-card-action-icon-size) !important;
		min-width: var(--gz-mobile-card-action-icon-size) !important;
		min-height: var(--gz-mobile-card-action-icon-size) !important;
		max-width: var(--gz-mobile-card-action-icon-size) !important;
		max-height: var(--gz-mobile-card-action-icon-size) !important;
		margin: 0 !important;
		flex: 0 0 var(--gz-mobile-card-action-icon-size) !important;
	}
	html body ul.products li.product.product--concept-card .product-thumbnail .product-loop-button-atc svg {
		width: var(--gz-mobile-card-action-icon-size) !important;
		height: var(--gz-mobile-card-action-icon-size) !important;
		min-width: var(--gz-mobile-card-action-icon-size) !important;
		min-height: var(--gz-mobile-card-action-icon-size) !important;
		max-width: var(--gz-mobile-card-action-icon-size) !important;
		max-height: var(--gz-mobile-card-action-icon-size) !important;
		display: block !important;
		flex: 0 0 var(--gz-mobile-card-action-icon-size) !important;
	}
	html body ul.products li.product.product--concept-card .product__badge-swap .product__quickview-pill,
	html body ul.products li.product.product--concept-card .product__badge-swap .product__wishlist-pill {
		width: var(--gz-mobile-card-badge-action-size) !important;
		height: var(--gz-mobile-card-badge-action-size) !important;
		min-width: var(--gz-mobile-card-badge-action-size) !important;
		min-height: var(--gz-mobile-card-badge-action-size) !important;
		max-width: var(--gz-mobile-card-badge-action-size) !important;
		max-height: var(--gz-mobile-card-badge-action-size) !important;
		flex: 0 0 var(--gz-mobile-card-badge-action-size) !important;
	}
	html body ul.products li.product.product--concept-card .product__badge-swap .product__wishlist-pill {
		top: calc(var(--gz-mobile-card-badge-action-size) + var(--gz-mobile-card-badge-gap)) !important;
	}
	html body ul.products li.product.product--concept-card .product__badge-swap .product__quickview-pill .glozin-svg-icon,
	html body ul.products li.product.product--concept-card .product__badge-swap .product__quickview-pill svg,
	html body ul.products li.product.product--concept-card .product__badge-swap .product__wishlist-pill > svg:not(.product__wishlist-check),
	html body ul.products li.product.product--concept-card .product__badge-swap .product__wishlist-pill > .glozin-svg-icon,
	html body ul.products li.product.product--concept-card .product__badge-swap .product__wishlist-pill > span:not(.product__pill-hover-fill):not(.wcboost-wishlist-button__text),
	html body ul.products li.product.product--concept-card .product__badge-swap .product__wishlist-pill > svg.product__wishlist-check {
		width: var(--gz-mobile-card-badge-icon-size) !important;
		height: var(--gz-mobile-card-badge-icon-size) !important;
		min-width: var(--gz-mobile-card-badge-icon-size) !important;
		min-height: var(--gz-mobile-card-badge-icon-size) !important;
		max-width: var(--gz-mobile-card-badge-icon-size) !important;
		max-height: var(--gz-mobile-card-badge-icon-size) !important;
		flex: 0 0 var(--gz-mobile-card-badge-icon-size) !important;
	}
	/* Hide the visible "Add to cart" text on mobile but keep it for
	   screen readers (sr-only pattern). */
	html body ul.products li.product.product--concept-card .product-thumbnail .product-loop-button-atc .add-to-cart__text {
		position: absolute !important;
		width: 1px !important;
		height: 1px !important;
		padding: 0 !important;
		margin: -1px !important;
		overflow: hidden !important;
		clip: rect(0, 0, 0, 0) !important;
		white-space: nowrap !important;
		border: 0 !important;
	}

	/* Rating pill: tighten down a touch so it doesn't crowd the top-
	   right corner on small screens. */
	.product--concept-card .product__rating-pill {
		padding: 5px 10px 5px 8px !important;
		font-size: 11.5px !important;
	}

	html body ul.products li.product.product--concept-card .woocommerce-badges .onsale,
	html body ul.products li.product.product--concept-card .glozin-badges .onsale,
	html body ul.products li.product.product--concept-card .glozin-badges-wrapper .onsale {
		min-height: var(--gz-mobile-card-sale-height) !important;
		padding-left: var(--gz-mobile-card-sale-padding) !important;
		padding-right: var(--gz-mobile-card-sale-padding) !important;
		font-size: var(--gz-mobile-card-sale-font-size) !important;
	}

	/* Badge-swap position on mobile: the parent theme anchors the
	   `.woocommerce-badges` sale pill at `top-10 start-10` (Bootstrap
	   utility = 10px inset) on mobile, stepping up to `top-15-xl
	   end-15-xl` (15px) on XL. Our default `.product__badge-swap`
	   sits at 15px/15px which matches desktop — but on mobile that
	   made the rating pill / quick-view / wishlist visibly hang lower
	   and further inboard than the red -24% sale pill on the opposite
	   corner. Drop to 10px/10px on mobile so both corners mirror. */
	.product--concept-card .product-thumbnail .product__badge-swap {
		top: 10px !important;
		right: 10px !important;
	}
}


/* ==========================================================================
   15. Full-width site — concept-theme-style stretched layout.

   The parent theme caps `.container-xxl` at 1470px. On large displays
   (1920+) that leaves ~450px of empty margin on each side, which felt
   narrow compared to the reference (concept-theme-tech.myshopify.com
   runs its grids nearly edge-to-edge). Widen the site's primary
   containers to fill the viewport with a comfortable 40px gutter.

   Scoped to ≥1200px so tablet/mobile layouts (which already run
   edge-to-edge via their own media queries) aren't touched. */
@media (min-width: 1200px) {
	body .container-xxl,
	body .container-xxl.site-content-container,
	/* Single-product page uses `.container` (not `.container-xxl`)
	   as its outer wrapper — `inc/header/main.php` → `site-content`
	   wraps the single-product template in a plain `.container`
	   capped at 1200px, so the default full-width rule above
	   (scoped to container-xxl) misses it. Extend the override to
	   `body.single-product .container` so the PDP also runs
	   edge-to-edge like the shop grid. */
	body.single-product .container {
		max-width: 100% !important;
		padding-left: 40px !important;
		padding-right: 40px !important;
	}
}

/* On very wide displays (≥1800px), open up to 60px gutters — matches
   concept-theme's breathing room on big screens without letting the
   line lengths get unbounded. */
@media (min-width: 1800px) {
	body .container-xxl,
	body .container-xxl.site-content-container,
	body.single-product .container {
		padding-left: 60px !important;
		padding-right: 60px !important;
	}
}


/* ==========================================================================
   14. Filter off-canvas (shop page) — Concept polish to match the minicart
        - Rounded drawer corners (desktop only, mirrored for left-side)
        - Rounded outline close button with the SAME hover-fill + spin-X
          animation as `.cart-panel .panel__button-close`

   The filter sidebar uses different class names than the minicart:
     root:      `aside#filter-sidebar-panel.offscreen-panel--side-right`
     container: `.sidebar__container`
     close btn: `.sidebar__button-close`
     header:    `.sidebar__header`
   so we duplicate the relevant rules with these selectors instead of
   trying to share them with the cart-panel rules above.
   ========================================================================== */

/* -------- Rounded drawer corners --------
   Filter panel uses the `--side-right` CLASS NAME but the parent CSS
   remaps `.offscreen-panel.offscreen-panel--side-right .sidebar__container`
   to slide in FROM THE LEFT (left:0 + translateX(-100%)). So the
   drawer occupies the LEFT portion of the viewport when open, and the
   visible "inside" edge is the RIGHT side of the drawer — round those
   corners, not the left. (The previous rev rounded the wrong corners.)

   No media query gate: on desktop ≥1025 the parent hides
   `.catalog-filters-sidebar` and re-opens it through a different
   entry-point anyway, and rounded corners do no harm on the inline
   layout — the sidebar is inside a container that clips them. */
#filter-sidebar-panel.offscreen-panel--side-right .sidebar__container {
	border-top-right-radius: 20px !important;
	border-bottom-right-radius: 20px !important;
	overflow: hidden !important;
}
/* `--side-left` (RTL mirror): drawer on the right, round the left edge. */
#filter-sidebar-panel.offscreen-panel--side-left .sidebar__container {
	border-top-right-radius: 0 !important;
	border-bottom-right-radius: 0 !important;
	border-top-left-radius: 20px !important;
	border-bottom-left-radius: 20px !important;
	overflow: hidden !important;
}

/* -------- Cloned close button (sidebar__button-close) ----------------------
   Mirrors the minicart's `.panel__button-close` animation exactly: 40px
   rounded-outline circle, pseudo `::before` black disc sliding up from
   below on hover-in / back down on hover-out, inner SVG rotating 180°
   on hover.

   SELECTOR FIX: the parent theme places `.sidebar__button-close` as a
   DIRECT CHILD of `.sidebar__container` — a SIBLING of `.sidebar__header`,
   NOT a child of it. The previous rule used
   `.sidebar__header .sidebar__button-close` which matched nothing, so
   no styling applied. The selector below targets the actual parent.

   The parent theme adds utility classes `position-absolute top-13 end-20 z-1`
   that anchor the button to the top-right of `.sidebar__container`, and
   we keep that positioning — just restyle the visual and the hover. */
#filter-sidebar-panel .sidebar__container > .sidebar__button-close {
	/* Override the parent's size-by-content layout — force a square circle. */
	width: 40px !important;
	height: 40px !important;
	border: 1px solid rgba(0, 0, 0, 0.15) !important;
	border-radius: 50% !important;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	padding: 0 !important;
	background-color: transparent !important;
	color: var(--gz-color-dark, #171717) !important;
	opacity: 1 !important;
	overflow: hidden;
	isolation: isolate;
	transform: none !important;
	transition: color 0.35s cubic-bezier(0.3, 1, 0.3, 1), border-color 0.3s ease;
	cursor: pointer;
	/* Keep the parent's absolute top/right positioning (utility classes),
	   but nudge slightly so the circle sits nicely within the header row. */
	top: 16px !important;
	right: 16px !important;
	z-index: 2 !important;
}
#filter-sidebar-panel .sidebar__container > .sidebar__button-close:hover {
	transform: none !important;
	color: #ffffff !important;
	border-color: #000 !important;
}
/* Hover-fill: black disc slides up from below on hover-in, down on out. */
#filter-sidebar-panel .sidebar__container > .sidebar__button-close::before {
	content: '';
	position: absolute;
	inset: 0;
	background-color: #000;
	border-radius: 50%;
	transform: translateY(110%);
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	z-index: -1;
	pointer-events: none;
}
#filter-sidebar-panel .sidebar__container > .sidebar__button-close:hover::before {
	transform: translateY(0);
}
/* Inner SVG spins 180° on hover; transition handles both directions. */
#filter-sidebar-panel .sidebar__container > .sidebar__button-close > svg {
	position: relative;
	z-index: 1;
	width: 12px !important;
	height: 12px !important;
	display: inline-block;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	transform-origin: center center;
	color: inherit;
}
#filter-sidebar-panel .sidebar__container > .sidebar__button-close:hover > svg {
	transform: rotate(180deg);
}

/* Filter drawer scroll fix (v1.0.115): the rounded-corner rule above
   used `overflow:hidden`, which clipped the drawer but also trapped
   the filter list so it could not scroll. Keep horizontal clipping,
   restore vertical scrolling, and use momentum scrolling on iOS. */
#filter-sidebar-panel.offscreen-panel .sidebar__container,
#filter-sidebar-panel.offscreen-panel--open .sidebar__container {
	display: flex !important;
	flex-direction: column !important;
	overflow: hidden !important;
	max-height: 100vh;
	max-height: 100dvh;
}
#filter-sidebar-panel.offscreen-panel .sidebar__content {
	flex: 1 1 auto;
	min-height: 0;
	overflow-x: hidden;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
	overscroll-behavior: contain;
}

/* Mobile breadcrumbs: keep the full trail on one row and let the row pan
   horizontally instead of wrapping into a tall block. */
@media (max-width: 767px) {
	body.single-product .glozin-breadcrumb-navigation-wrapper {
		overflow: hidden;
	}

	body.single-product .woocommerce-breadcrumb.site-breadcrumb,
	body.single-product nav.woocommerce-breadcrumb {
		display: flex !important;
		flex-wrap: nowrap !important;
		align-items: center;
		gap: 0;
		max-width: 100%;
		overflow-x: auto;
		overflow-y: hidden;
		white-space: nowrap;
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none;
	}

	body.single-product .woocommerce-breadcrumb.site-breadcrumb::-webkit-scrollbar,
	body.single-product nav.woocommerce-breadcrumb::-webkit-scrollbar {
		display: none;
	}

	body.single-product .woocommerce-breadcrumb.site-breadcrumb a,
	body.single-product .woocommerce-breadcrumb.site-breadcrumb span,
	body.single-product nav.woocommerce-breadcrumb a,
	body.single-product nav.woocommerce-breadcrumb span {
		flex: 0 0 auto;
	}
}

/* ==========================================================================
   17. MOBILE BOTTOM NAVIGATION BAR — sit above scrolling product cards

   Symptom: on the mobile shop page, hovering a product card triggers our
   `.product--concept-card` overlay (rating/quick-view pills, ATC slide-up,
   z-indexes 3–5 on `.product-thumbnail` children). When the user scrolls,
   the card's hover layer was painting OVER the fixed bottom navigation
   bar (`#glozin-mobile-navigation-bar`, an Elementor widget pinned to
   bottom of viewport via the parent theme's `glozin.navigationBar()`
   helper, which adds `body.mobile-has-navigation-bar` and reserves
   `--gz-navigation-bar-height` of bottom padding).

   Why: Elementor sections default to a low/auto z-index. Our card-level
   stacking contexts (created by `transform`, `will-change`) can hoist
   children visually above any sibling that doesn't claim a higher index.

   Fix: pin the bottom nav at z-index 1000 (above the parent theme's
   sticky header at 899/900, below the modal/popover layer at 1100 so
   opening the sort-by popover still covers it correctly). Force a fresh
   stacking context so our z-index actually wins, and lock pointer events
   so taps go to the nav, not the card behind it.
   ========================================================================== */
#glozin-mobile-navigation-bar {
	position: fixed !important;
	z-index: 1000 !important;
	isolation: isolate;
}

/* ==========================================================================
   18. DESKTOP SORT-BY DROPDOWN — above the product grid

   Symptom: clicking "Sort by:" on desktop opens
   `.catalog-toolbar__orderby-list` (a position:absolute dropdown), but
   the parent theme tags it with the `z-3` utility class (z-index: 3).
   Our `.product--concept-card .product-thumbnail` children carry
   z-index 3–5 too, and the cards establish their own stacking contexts
   via `transform`. Net result: the dropdown opens UNDER the first row
   of product cards, so the options aren't clickable.

   Live-site investigation (live DOM walk on test.jonglerjewelry.com):
   raising z-index ON `.catalog-toolbar__orderby-form` alone wasn't
   enough — `.catalog-toolbar` (the form's grandparent) has the
   `gz-reveal` reveal animation, which leaves it with a non-`none`
   `transform: matrix(1,0,0,1,0,0)` AND `will-change: opacity, transform`.
   Both create a stacking context. The toolbar's sibling
   `.glozin-shop-content` (the product grid) doesn't, so the toolbar's
   children never beat the grid's children when both have `z-index: auto`
   contexts. Children's z-index inside a `z-index: auto` SC are scoped
   to that SC and don't compete with siblings outside it.

   Fix: lift `.catalog-toolbar` itself with a real z-index and stacking
   context, so its `.catalog-toolbar__orderby-list` descendant can win
   over the product grid sibling. Keep the dropdown below the modal /
   popover layer (1100) so the mobile sort popover and cart modals still
   paint over it.
   ========================================================================== */
/* Default state: position: relative + z-index: 1 — gives the orderby
   dropdown a stacking context to escape the cards (z-indexes 3–5 inside
   the cards' own contexts) but stays BELOW the sticky header (z-index
   899/900). User report: at z-index 50 the toolbar buttons (filters /
   sort / grid) painted OVER the sticky header during scroll-up. Cap at
   1 to keep the header firmly on top. */
.catalog-toolbar {
	position: relative;
	z-index: 1;
}
.catalog-toolbar__item .catalog-toolbar__orderby-form {
	position: relative;
	z-index: 1;
}
.catalog-toolbar__item .catalog-toolbar__orderby-list {
	z-index: 50 !important;
}
/* When the dropdown is OPEN, raise the entire toolbar above the cards
   (z-index 50 beats the cards' z-indexes 3-5) so the open list is
   clickable. Header is at 899/900 — still above us. */
.catalog-toolbar:has(.catalog-toolbar__orderby-form.glozin-active) {
	z-index: 50;
}
.catalog-toolbar__item .catalog-toolbar__orderby-form.glozin-active {
	z-index: 60;
}

/* ==========================================================================
   19. MOBILE SORT-BY POPOVER — match the offscreen-panel drawer feel

   The parent theme's `.popover` (used for `#mobile-orderby-popover`) is
   driven by jQuery `.fadeIn() / .fadeOut()` on the WHOLE popover, with
   a tiny CSS `translateY(30px) → 0` slide on `.popover__container`.
   Two visible problems on close:
     1. The white-ish backdrop (`rgba(255,255,255,0.9)`) FLASHES because
        `display:none` is set the same tick the class is removed — there's
        no painted "from" state for opacity to transition out of.
     2. The container snaps back instantly because `display:none` cuts
        the transition mid-frame.

   Fix: mirror the offscreen-panel approach (section 8). Beat jQuery's
   inline `display`/`opacity` with `!important`, animate opacity +
   backdrop-filter on the backdrop, and slide the container up from
   100% (full-height drawer feel) using the same iOS curve & durations
   as the cart / account drawers. Result: the sort-by sheet opens AND
   closes with the exact same blur+slide as the account button drawer.

   NOTE: we keep this scoped to `.mobile-orderby-popover` so other
   popovers (mini-cart estimate / discount / note popovers) keep their
   parent-theme behaviour.
   ========================================================================== */

/* Lift the popover above the bottom nav (1000) but keep below modals
   (1100) — jQuery sets `display:block` inline on open, so we beat it
   with !important to keep the popover paintable for the close
   transition rather than snapping to display:none.

   IMPORTANT — `transition` MUST use `!important` here. The parent
   `.popover { transition: var(--gz-transition); }` rule has equal
   specificity (single class) AND parent's overlay.min.css can load
   AFTER our v4 file (parent enqueues its overlay-styles at priority
   30; child priority 20 by default fires earlier, putting our <link>
   above parent's even though we list it as a dep). The `!important`
   guarantees our `transition: visibility 0s ... 0.65s` wins regardless
   of source order — without it, parent's `transition: 0.4s all` was
   making `visibility` flip at ~400-500ms instead of after the close
   animation finished, cutting the slide-down short and producing the
   "flash" of products + nav bar the user reported. */
.mobile-orderby-popover {
	display: block !important;
	visibility: hidden;
	opacity: 1 !important; /* the popover root no longer fades — its children do */
	z-index: 1100;
	transition: visibility 0s linear var(--ios-backdrop-close-duration) !important;
}
.mobile-orderby-popover.popover--open {
	visibility: visible;
	transition: visibility 0s linear 0s !important;
}

/* Backdrop: position: fixed FULL VIEWPORT (100vw × 100vh from 0,0).
   Earlier rev used `position: absolute; inset: 0` which inherits the
   popover root's containing block — and the popover has `top: 32px`
   (or 46px) when the admin bar is showing. The result: the backdrop
   started 32–46px DOWN from the actual viewport top, leaving a
   visible "line" / band where the un-blurred admin bar (or the page
   above the popover) met the blurred backdrop. THAT was the seam the
   user kept reporting. By breaking out of the popover's containing
   block via `position: fixed` + viewport units, the backdrop covers
   absolutely everything from y=0 down — no boundary, no seam.

   Uniform flat fill (no gradient) so there's no banding artifact at
   the gradient stops either. */
.mobile-orderby-popover .popover__backdrop {
	display: block !important;
	position: fixed !important;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	width: 100vw !important;
	height: 100vh !important;
	inset: 0 !important;
	background-color: rgba(17, 17, 17, 0.32) !important;
	background-image: none !important;
	opacity: 0 !important;
	visibility: hidden;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	backdrop-filter: blur(0px) saturate(100%);
	transition:
		opacity var(--ios-backdrop-close-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-close-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-close-duration) var(--ios-backdrop-ease),
		visibility 0s linear var(--ios-backdrop-close-duration) !important;
	will-change: opacity, backdrop-filter;
	z-index: 0;
}
.mobile-orderby-popover.popover--open .popover__backdrop {
	opacity: 1 !important;
	visibility: visible;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate));
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear 0s !important;
}

/* Container: full-distance slide-up (translateY 100% → 0) using the
   iOS drawer curve, matching the cart-panel slide feel. The parent CSS
   only travelled 30px which felt like a flicker rather than a drawer.

   `!important` on transition for the same source-order reason — parent's
   `.popover__container` rule sets `transition: var(--gz-transition)`
   (0.4s all) and would otherwise win source-order, making the drawer
   slide-down finish in 0.4s and start cutting off before the visibility
   delay of 0.65s. */
.mobile-orderby-popover .popover__container {
	transform: translateY(100%);
	transition: transform var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
	will-change: transform;
}
.mobile-orderby-popover.popover--open .popover__container {
	transform: translateY(0);
}

/* -------- Mobile sort-by close button -----------------------------------

   Keep the parent's original white circular close button. The no-extra-
   background fix belongs on the drawer container, not on the X button
   itself. */

.mobile-orderby-popover .popover__container > .popover__button-close,
.mobile-orderby-popover .popover__button-close.gz-button {
	/* Keep parent's anchor: top:0 + left:50% + translateX(-50%). The X
	   sits above the white drawer panel (in the dim/blurred area), per
	   user request to keep the original location. */
	--gz-button-width: 40px !important;
	--gz-button-height: 40px !important;
	--gz-button-bg-color: #ffffff !important;
	--gz-button-bg-color-hover: #ffffff !important;
	--gz-button-border-color: rgba(0, 0, 0, 0.10) !important;
	--gz-button-border-color-hover: transparent !important;
	--gz-button-color: var(--gz-color-dark, #171717) !important;
	--gz-button-color-hover: #ffffff !important;
	width: 40px !important;
	height: 40px !important;
	min-width: 0 !important;
	border: 1px solid rgba(0, 0, 0, 0.10) !important;
	border-radius: 50% !important;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	padding: 0 !important;
	background-color: #ffffff !important;
	color: var(--gz-color-dark, #171717) !important;
	opacity: 1 !important;
	overflow: hidden;
	isolation: isolate;
	z-index: 2;
	transition:
		color 0.35s cubic-bezier(0.3, 1, 0.3, 1),
		border-color 0.3s ease !important;
	cursor: pointer;
}
.mobile-orderby-popover .popover__button-close:hover {
	color: #ffffff !important;
	border-color: transparent !important;
	background-color: #ffffff !important;
}
.mobile-orderby-popover .popover__button-close::before {
	content: '';
	position: absolute;
	inset: 0;
	border-radius: 50%;
	background-color: #000000;
	transform: translateY(110%);
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	z-index: 0;
	pointer-events: none;
}
.mobile-orderby-popover .popover__button-close:hover::before {
	transform: translateY(0);
}
/* Inner svg (X) spins 180° on hover; transition covers both directions.
   Force a small intrinsic size so the icon doesn't fill the whole
   40x40 circle (the parent's `gz-button-icon` rule sets it to 13/16rem). */
.mobile-orderby-popover .popover__button-close > svg,
.mobile-orderby-popover .popover__button-close .glozin-svg-icon {
	position: relative;
	z-index: 1;
	width: 12px !important;
	height: 12px !important;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	transform-origin: center center;
	color: inherit;
}
.mobile-orderby-popover .popover__button-close:hover > svg,
.mobile-orderby-popover .popover__button-close:hover .glozin-svg-icon {
	transform: rotate(180deg);
}

/* ==========================================================================
   20. MOBILE MENU (HAMBURGER) — black header + circular close button

   Two visual changes requested:
     1. The panel header in `#mobile-menu-panel` ships with `bg-primary`
        (red brand color) + `text-on-primary` (white). User wants the
        header swapped to solid black so it matches the rest of the
        Concept-style chrome (cart/account/quick-view all use white-on-
        black or vice versa, never red).
     2. The close icon ships as a bare `<svg.panel__button-close>` —
        same as the cart's, but the cart is restyled in section in
        `cart-panel .panel__header .panel__button-close` rules above.
        Replicate the EXACT same styling here so both panels feel
        identical (40px circle, hover-fill disc slides up, X spins 180°).
   ========================================================================== */

/* Header: kill the parent's `.bg-primary` red and swap to solid black.
   `!important` beats the parent utility classes because they're applied
   inline in the same selector specificity. Keep the parent's white text
   color (text-on-primary already maps to white on most installs, but we
   set it explicitly for safety). */
.hamburger-panel .panel__header.bg-primary,
.hamburger-panel .panel__header {
	background-color: #000 !important;
	color: #ffffff !important;
}

/* Active / inactive menu tabs ("Menu", "Categories"): keep them legible
   on the new black background. The parent theme styles these with
   inherit-color anchors; the tab color matches whatever the header sets. */
.hamburger-panel .panel__header .panel__menu-items > li > a {
	color: rgba(255, 255, 255, 0.7);
	transition: color 0.25s ease;
}
.hamburger-panel .panel__header .panel__menu-items > li > a.active,
.hamburger-panel .panel__header .panel__menu-items > li > a:hover {
	color: #ffffff;
}

/* Close button: identical structure to `.cart-panel .panel__header
   .panel__button-close` — Glozin's `Icon::get_svg()` helper wraps the
   raw svg in a `<span class="panel__button-close">`, so the same
   pseudo-element fill trick works here. We just flip the palette for
   the dark header (white circle/border that fills with white-on-black
   on hover-in instead of black-on-white).

   Two animations driven purely via CSS:
     1. A `::before` pseudo slides up from below the circle on hover-in
        and back down on hover-out (white disc on dark bg). The cart's
        version uses a black disc on white — the mechanic is identical.
     2. The inner svg (the X) spins 180° on hover (both directions).

   Parent theme rotates the whole span on hover; we override to
   `transform: none !important` so only the X spins, not the circle. */
.hamburger-panel .panel__header .panel__button-close {
	width: 40px !important;
	height: 40px !important;
	border: 1px solid rgba(255, 255, 255, 0.35);
	border-radius: 50%;
	display: inline-flex !important;
	align-items: center;
	justify-content: center;
	padding: 0 !important;
	flex: 0 0 40px;
	background-color: transparent;
	color: #ffffff;
	opacity: 1 !important;
	position: relative;
	overflow: hidden;
	isolation: isolate;
	transform: none !important;
	transition: color 0.35s cubic-bezier(0.3, 1, 0.3, 1), border-color 0.3s ease;
	cursor: pointer;
}
.hamburger-panel .panel__header .panel__button-close:hover {
	transform: none !important;
	color: #000000;
	border-color: #ffffff;
}
/* CSS hover-fill pseudo: white disc that slides up from below on
   hover-in, back down on hover-out. Mirror of cart-panel's black disc. */
.hamburger-panel .panel__header .panel__button-close::before {
	content: '';
	position: absolute;
	inset: 0;
	background-color: #ffffff;
	border-radius: 50%;
	transform: translateY(110%);
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	z-index: -1;
	pointer-events: none;
}
.hamburger-panel .panel__header .panel__button-close:hover::before {
	transform: translateY(0);
}
/* The X icon spins 180° on hover; transition covers both directions. */
.hamburger-panel .panel__header .panel__button-close .glozin-svg-icon,
.hamburger-panel .panel__header .panel__button-close > svg {
	position: relative;
	z-index: 1;
	width: 12px;
	height: 12px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	transform-origin: center center;
	color: inherit;
}
.hamburger-panel .panel__header .panel__button-close:hover .glozin-svg-icon,
.hamburger-panel .panel__header .panel__button-close:hover > svg {
	transform: rotate(180deg);
}

/* ==========================================================================
   21. SHOP-PAGE FILTER BUTTON — guarantee clickability on mobile

   User report: clicking "Filter" on the mobile shop page does nothing.
   Root cause is hard to pin down without reproducing on a real device,
   but two likely culprits — both worth defending against:

     1. Our `.catalog-toolbar { z-index: 1 }` change (so the sticky
        header floats over the toolbar) created a stacking context
        that, on some viewports, gets covered by the product grid's
        first row when the toolbar is in the cards' z-band. We
        explicitly raise the BUTTON above any sibling so it always
        receives taps.

     2. A stale `body.popover-opened` / `body.offcanvas-opened` class
        from a previous overlay can leave `pointer-events: auto` on
        the popover/panel layers — but if the panel itself didn't get
        a chance to clean up its inline `display`, the next click on
        the toggle button sees the panel as "already open" and the
        toggle handler closes it instead of opening. Force the
        button's pointer-events + cursor on so it can't be neutralised.
   ========================================================================== */
.catalog-toolbar__filter-button {
	position: relative;
	z-index: 3;
	pointer-events: auto !important;
	cursor: pointer;
	/* iOS Safari sometimes ignores click on a button under
	   `body { overflow: hidden }` if the button has been recently moved
	   under a translucent ancestor. Force `touch-action: manipulation`
	   to guarantee tap-to-click without delay. */
	touch-action: manipulation;
	-webkit-tap-highlight-color: transparent;
}
/* Defensive — make sure no descendant of the toolbar has a higher
   stacking context that could swallow the button's tap area. */
.catalog-toolbar__filter-button > * {
	pointer-events: none;
}

/* ==========================================================================
   22. STICKY HEADER — always above shop toolbar buttons + iOS-blur look

   Two changes layered together:

   A) Z-INDEX FIX. User report: when scrolling on the mobile shop page,
      the toolbar buttons (Filter / Sort / grid icons) painted OVER
      the sticky header. The previous rev had `.catalog-toolbar
      { z-index: 50 }` unconditionally, which is above the parent's
      sticky header (z 899/900 only when sticky-pinned, but `z-index:
      auto` while still inline above the fold — meaning sibling
      stacking puts a relatively-positioned `.catalog-toolbar` ABOVE
      a static-flow header in the same containing block). We dropped
      the toolbar's default z-index to 1 (and only raise to 50 when
      the orderby dropdown is open via `:has()`), and pin the headers
      to z-index 950 in their non-sticky state too — solidly above
      anything in the page flow.

   B) iOS-LIKE BLUR + ROUNDED BOTTOM CORNERS. User asked for a
      "stunning iOS-like blur background" with rounded bottom-left/right
      corners. We apply `backdrop-filter: blur(...) saturate(...)` to
      the header backgrounds (mobile + desktop, sticky + non-sticky)
      with a translucent white fill so the page content shows through
      with a soft frosted look. Bottom corners get a 16px radius for
      a floating-pill aesthetic. `overflow: visible` lets dropdowns
      (account menu, mega menu) escape the rounded clip; the radius
      is applied via border-radius alone, not via clip-path.

      NOTE: backdrop-filter requires that the header NOT have a fully
      opaque solid bg behind it — the parent's customizer can set
      `--gz-header-sticky-bg-color` to a solid hex. We override the
      computed background to a translucent value so the blur can
      actually reveal page content. */

/* ----- A) Z-INDEX -----
   Pin both desktop and mobile header sections to z-index 999 in
   ALL states. 999 sits ABOVE product cards (z 0-50) and above the
   toolbar (z 1) but BELOW the mobile bottom nav (z 1000) and BELOW
   off-canvas panels / modals / popovers (z 1100). That hierarchy
   is critical: panels MUST paint OVER the header (filter sidebar,
   minicart, login modal, sort-by popover all expect to cover the
   header when open).

   Earlier rev set this to 9999 — that broke the filter sidebar
   (z-index 1100) because the sidebar opened UNDER the header and
   was therefore invisible, which is what the user described as
   "filter button does nothing". */
.site-header__desktop,
.site-header__mobile {
	z-index: 999;
}
/* Sticky-pinned states — match the same 999 baseline. */
.site-header__section.minimized,
.site-header__section.headroom--not-top,
.site-header__section.minimized .header-sticky,
.site-header__section.minimized .header-mobile-sticky,
.site-header__section.headroom--not-top .header-sticky,
.site-header__section.headroom--not-top .header-mobile-sticky,
.site-header__section.minimized .header-sticky.header-main,
.site-header__section.minimized .header-mobile-sticky.header-main,
.site-header__section.headroom--not-top.headroom--pinned .header-sticky,
.site-header__section.headroom--not-top.headroom--pinned .header-mobile-sticky,
.site-header__section.headroom--not-top.headroom--pinned .header-sticky.header-main,
.site-header__section.headroom--not-top.headroom--pinned .header-mobile-sticky.header-main {
	z-index: 999 !important;
}

/* ----- B) iOS-LIKE BLUR BACKGROUND + ROUNDED BOTTOM CORNERS -----

   STRATEGY (corrected): apply blur to the INNER CHROME ROWS
   (`.header-main`, `.header-mobile-main`, `.header-mobile-bottom`)
   and let the parent's headroom.js drive the sticky pin/unpin. We do
   NOT set `position: sticky` on the section — the section's parent
   `<header id="site-header">` is only as tall as the section itself,
   so `position: sticky` has nothing to "stick within" and the header
   simply scrolls out of view (this was the v1.0.75 regression — user
   reported "sticky header is not coming when I scroll down").

   The parent's headroom.js adds `.minimized` / `.headroom--not-top` /
   `.headroom--pinned` classes when the page scrolls; the parent CSS
   already pins `.header-sticky` (or the section, with header-sticky--both)
   to `position: fixed` in those states. We add iOS blur there.

   At the TOP of the page (no sticky classes), we still want the blur
   visible per user request. We give the inner rows a translucent
   white fill + backdrop-filter — even though there's no content
   behind to blur at the top, the translucent fill makes the bar
   appear softly glassy rather than solid, and as soon as the user
   scrolls the blur takes effect (rows become position:fixed). */

/* iOS-blur tokens — translucent enough that the page color shows
   through even at top of page (where there's no content behind the
   header to blur), so the user perceives the glass look immediately.
   On scroll, parent's headroom.js pins the section `position: fixed`
   over the scrolling content, and the blur becomes very pronounced. */
:root {
	/* v1.0.79: dropped opacity 0.45 → 0.28 per user feedback ("more
	   transparent, but not too much"). The blur+saturate filter is
	   what carries the glassy material; the fill mostly serves to
	   give text inside the header (logo, nav links) enough contrast
	   without nuking the see-through effect. */
	--gz-header-blur-bg: rgba(255, 255, 255, 0.28);
	--gz-header-blur-filter: blur(30px) saturate(200%);
	--gz-header-blur-shadow: 0 6px 30px rgba(0, 0, 0, 0.10);
	--gz-header-blur-border: 1px solid rgba(255, 255, 255, 0.18);
	--gz-header-blur-radius: 20px;
}

/* Stronger specificity (`html body ...`) so we beat parent style.css
   per-tenant customizer overrides that may target the section/rows
   with their own background colors.

   v1.0.79: ALL FOUR corners rounded so the header reads as a
   floating pill — previously only bottom-left/right were rounded. */
html body .header-main,
html body .header-mobile-main,
html body .header-mobile-bottom {
	background-color: var(--gz-header-blur-bg) !important;
	background-image: none !important;
	-webkit-backdrop-filter: var(--gz-header-blur-filter) !important;
	backdrop-filter: var(--gz-header-blur-filter) !important;
	border-bottom: var(--gz-header-blur-border) !important;
	box-shadow: var(--gz-header-blur-shadow) !important;
	border-radius: var(--gz-header-blur-radius) !important;
}

/* Sticky-pinned chrome (parent's headroom.js adds `.minimized` /
   `.headroom--not-top` etc. when scrolling). Same look — but pinned
   over the scrolled content, so the blur is dramatic. */
html body .site-header__section.minimized .header-sticky,
html body .site-header__section.minimized .header-mobile-sticky,
html body .site-header__section.headroom--not-top .header-sticky,
html body .site-header__section.headroom--not-top .header-mobile-sticky,
html body .site-header__section.minimized .header-sticky.header-main,
html body .site-header__section.minimized .header-mobile-sticky.header-main,
html body .site-header__section.headroom--not-top.headroom--pinned .header-sticky,
html body .site-header__section.headroom--not-top.headroom--pinned .header-mobile-sticky,
html body .site-header__section.headroom--not-top.headroom--pinned .header-sticky.header-main,
html body .site-header__section.headroom--not-top.headroom--pinned .header-mobile-sticky.header-main,
html body .site-header__section.header-sticky--both.minimized,
html body .site-header__section.header-sticky--both.headroom--not-top,
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--pinned {
	background-color: var(--gz-header-blur-bg) !important;
	background-image: none !important;
	-webkit-backdrop-filter: var(--gz-header-blur-filter) !important;
	backdrop-filter: var(--gz-header-blur-filter) !important;
	border-bottom: var(--gz-header-blur-border) !important;
	box-shadow: var(--gz-header-blur-shadow) !important;
	border-radius: var(--gz-header-blur-radius) !important;
}

/* Null out parent customizer tokens that paint solid colors. */
.site-header__section,
.site-header__desktop,
.site-header__mobile {
	--gz-header-sticky-bg-color: var(--gz-header-blur-bg) !important;
	--gz-header-main-bg-color: var(--gz-header-blur-bg) !important;
	--gz-header-bottom-bg-color: var(--gz-header-blur-bg) !important;
	--gz-header-mobile-main-bg-color: var(--gz-header-blur-bg) !important;
	--gz-header-mobile-bottom-bg-color: var(--gz-header-blur-bg) !important;
}

/* The section also gets the same chrome look in BOTH-sticky mode.
   Parent CSS makes the section `position: fixed` when sticky-pinned. */
html body .site-header__section.header-sticky--both.minimized,
html body .site-header__section.header-sticky--both.headroom--not-top {
	background-color: var(--gz-header-blur-bg) !important;
	-webkit-backdrop-filter: var(--gz-header-blur-filter) !important;
	backdrop-filter: var(--gz-header-blur-filter) !important;
}

/* ==========================================================================
   23. STICKY HEADER ENTRANCE — clean drop-down + admin-bar offset

   v1.0.78 nullified parent's `@keyframes fadeInSticky` to fix a "double
   drop" bug. That removed the entrance animation entirely and also
   exposed a second issue: with no keyframe to set the end-state `top`,
   the section sat at `top: 0` and was clipped behind the WP admin bar
   (the user's "cut in half on desktop" report). The keyframe's 100%
   stop used `top: var(--gz-admin-bar-height, 0)` to avoid that overlap.

   FIX (v1.0.79): own the entrance animation with our own keyframe
   (`gzStickyDropdown`) that uses `transform: translateY(-100%) → 0`
   instead of animating `top`. Set `top: var(--gz-admin-bar-height, 0)`
   directly on the section so admin-bar overlap is gone.

   Why a transform-only keyframe instead of the parent's top+opacity
   one? Two reasons:
     1. Avoids the original double-drop. Parent's keyframe animated
        `top` AND the parent's `transition: top` rule was active for
        the same property — overlapping animations of the same property
        produced visible double-fire. Transform-only sidesteps both.
     2. Compositor-layer friendly. `transform` runs on the GPU
        compositor, not main-thread layout — the slide is buttery
        even with the section's heavy `backdrop-filter: blur(30px)`.

   `both` fill mode: starts at `translateY(-100%)` (off-screen above)
   before the animation begins, sticks at `translateY(0)` after it
   ends. So the section is never visible at the wrong position. */

@keyframes gzStickyDropdown {
	from {
		transform: translateY(-100%);
	}
	to {
		transform: translateY(0);
	}
}

/* Inner rows defensive nullify — for sites where rows carry
   `.header-sticky` / `.header-mobile-sticky` and would otherwise
   ALSO play parent's fadeInSticky alongside the section. Most sites
   (including jonglerjewelry) use `header-sticky--both` mode where
   only the section sticks, but we keep this for safety. */
html body .site-header__section.minimized .header-sticky,
html body .site-header__section.minimized .header-mobile-sticky {
	animation: none !important;
	-webkit-animation: none !important;
}

/* Inner rows: NEVER fixed when section is sticky-pinned (header-sticky--both). */
html body .site-header__section.header-sticky--both.minimized .header-sticky,
html body .site-header__section.header-sticky--both.minimized .header-mobile-sticky,
html body .site-header__section.header-sticky--both.headroom--not-top .header-sticky,
html body .site-header__section.header-sticky--both.headroom--not-top .header-mobile-sticky,
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--pinned .header-sticky,
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--pinned .header-mobile-sticky,
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--unpinned .header-sticky,
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--unpinned .header-mobile-sticky {
	position: relative !important;
	top: auto !important;
	left: auto !important;
	right: auto !important;
	width: auto !important;
	max-width: none !important;
	z-index: auto !important;
	animation: none !important;
	-webkit-animation: none !important;
	box-shadow: none !important;
	background-color: transparent !important;
	-webkit-backdrop-filter: none !important;
	backdrop-filter: none !important;
	border-radius: 0 !important;
}

/* Section sticky entry — slide-down via transform, parked below admin
   bar via top. Replaces parent's `animation: fadeInSticky ...` (which
   sets `top: 0` ignoring admin bar — that's the desktop "cut in half"
   bug). The `!important` on `top` beats parent's `top: 0` rule on
   `.header-sticky--both.minimized` / `.header-sticky--both.headroom--not-top`. */
html body .site-header__section.header-sticky--both.minimized,
html body .site-header__section.header-sticky--both.headroom--not-top {
	top: var(--gz-admin-bar-height, 0) !important;
	animation: gzStickyDropdown 0.4s cubic-bezier(0.22, 0.61, 0.36, 1) both !important;
	-webkit-animation: gzStickyDropdown 0.4s cubic-bezier(0.22, 0.61, 0.36, 1) both !important;
	transition: top 0.35s cubic-bezier(0.4, 0, 0.2, 1) !important;
}

/* Headroom-mode unpinned (scroll-down): slide back UP via transform
   so the entry/exit are symmetrical on sites that use Headroom
   (`header_sticky_on: 'up'`). On `.minimized`-only sites this
   selector never matches; harmless either way. */
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--unpinned {
	transform: translateY(-100%);
	animation: none !important;
	-webkit-animation: none !important;
	transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1) !important;
}
html body .site-header__section.header-sticky--both.headroom--not-top.headroom--pinned {
	transform: translateY(0);
	animation: none !important;
	-webkit-animation: none !important;
	transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1) !important;
}

/* ==========================================================================
   24. FILTER SIDEBAR — force position:fixed when open

   ROOT CAUSE (re-confirmed v1.0.79 via live DOM inspection on
   test.jonglerjewelry.com at viewport ≤1024px):
   The aside `#filter-sidebar-panel.catalog-filters-sidebar` is
   targeted by the parent's `@media (max-width: 1024px) {
   .catalog-filters-sidebar { display: none; } }` rule
   (woocommerce.css line ~5026). With `display: none` set, the
   click handler in scripts.js DOES toggle `.offscreen-panel--open`
   and `body.offcanvas-opened` correctly — but the aside never
   renders, so the user sees absolutely nothing happen on tap.
   Earlier revs only set `position: fixed` without overriding
   `display`, which is why the bug persisted through v1.0.76→78.

   FIX (this rev): force `display: block` on the aside at mobile
   width regardless of open/closed state, so that:
     - When closed: aside renders but with `transform: translateX(...)`
       keeping its container off-screen + `pointer-events: none` on
       descendants → invisible & non-interactive (matches parent's
       intent for `.offscreen-panel` ready state).
     - When open: aside is already display:block, the
       `.offscreen-panel--open` class triggers `transform: none` on
       `.sidebar__container` (parent CSS) and the drawer slides in. */
#filter-sidebar-panel.offscreen-panel--open {
	position: fixed !important;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	width: 100% !important;
	height: 100% !important;
	z-index: 1100 !important;
	pointer-events: auto !important;
	display: block !important;
}
/* Also force the aside to stop being position:sticky on mobile
   regardless of open state — the parent's `.offscreen-panel`
   semantics expect this to be a viewport-overlay element on small
   screens. We scope to viewports where the toolbar Filter button is
   actually used (≤1024px is the parent's breakpoint where the
   inline sidebar collapses into off-canvas mode). `display: block`
   here is the load-bearing override that beats parent's
   `.catalog-filters-sidebar { display: none }` rule — without it
   the panel stays invisible and the filter button appears broken. */
@media (max-width: 1024px) {
	#filter-sidebar-panel.offscreen-panel,
	aside#filter-sidebar-panel {
		display: block !important;
		position: fixed !important;
		top: 0 !important;
		left: 0 !important;
		right: 0 !important;
		bottom: 0 !important;
		width: 100% !important;
		height: 100% !important;
	}
	/* When NOT open, keep only the overlay shell non-clickable. Avoid
	   descendant-wide `*` pointer-events rules here: the filter tree is
	   large, and Android Chrome pays for recalculating every child when
	   the drawer opens. */
	#filter-sidebar-panel.offscreen-panel:not(.offscreen-panel--open),
	#filter-sidebar-panel.offscreen-panel:not(.offscreen-panel--open) .sidebar__backdrop,
	#filter-sidebar-panel.offscreen-panel:not(.offscreen-panel--open) .sidebar__container {
		pointer-events: none !important;
	}
	/* When open, the shell/backdrop/container become clickable again;
	   descendants inherit normal hit testing without a costly `*` rule. */
	#filter-sidebar-panel.offscreen-panel--open,
	#filter-sidebar-panel.offscreen-panel--open .sidebar__backdrop,
	#filter-sidebar-panel.offscreen-panel--open .sidebar__container {
		pointer-events: auto !important;
	}
}

/* Defensive: kill the `pointer-events: none` we previously put on
   filter button children — that may have been preventing taps on
   real mobile devices where the SVG icon receives the touch first. */
.catalog-toolbar__filter-button > * {
	pointer-events: auto;
}

/* ==========================================================================
   25. SORT-BY POPOVER — uniform blur (NO band/seam above the X button)

   THE BAND THE USER MARKED IN GREEN: the area between the heavily-blurred
   top zone and the white drawer panel — exactly the height of the
   `.popover__container`'s 65px padding-top zone where the X button sits.
   Cause: `transform: translateY(0)` on `.popover__container` creates a
   compositor layer. The backdrop-filter is on `.popover__backdrop` (a
   sibling). When the container's compositor layer paints on top of the
   backdrop layer, browsers DO NOT propagate backdrop-filter through the
   transparent area of the container — the area inside the container
   shows the page WITHOUT the backdrop's filter. Result: the band that
   the user kept reporting.

   FIX: apply backdrop-filter to BOTH `.popover__backdrop` AND
   `.popover__container`. Both elements then carry their own filter
   pass:
     - .popover__backdrop blurs the page in the area ABOVE the container
     - .popover__container blurs the page in the area where the
       container slides up (its transparent top 65px)
   Result: uniform blur across the entire viewport behind the white
   drawer, no band. */

/* Reset the popover root — keep it as a clean transparent overlay,
   no filter on the root (we don't need it since both backdrop AND
   container carry their own filter). */
.mobile-orderby-popover {
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	-webkit-backdrop-filter: none !important;
	backdrop-filter: none !important;
	background-color: transparent !important;
}

/* Backdrop: solid dim color + blur, full viewport. This is the
   primary blur layer for the area ABOVE the container. */
.mobile-orderby-popover .popover__backdrop {
	display: block !important;
	position: fixed !important;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	width: 100vw !important;
	height: 100vh !important;
	inset: 0 !important;
	background-color: rgba(17, 17, 17, 0.32) !important;
	background-image: none !important;
	-webkit-backdrop-filter: blur(0px) saturate(100%);
	backdrop-filter: blur(0px) saturate(100%);
	opacity: 0 !important;
	visibility: hidden;
	pointer-events: none;
	transition:
		opacity var(--ios-backdrop-close-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-close-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-close-duration) var(--ios-backdrop-ease),
		visibility 0s linear var(--ios-backdrop-close-duration) !important;
	will-change: opacity, backdrop-filter;
	z-index: 0;
}
.mobile-orderby-popover.popover--open .popover__backdrop {
	opacity: 1 !important;
	visibility: visible;
	pointer-events: auto;
	-webkit-backdrop-filter: blur(20px) saturate(180%) !important;
	backdrop-filter: blur(20px) saturate(180%) !important;
	transition:
		opacity var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		-webkit-backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		backdrop-filter var(--ios-backdrop-open-duration) var(--ios-backdrop-ease),
		visibility 0s linear 0s !important;
}

/* Container: keep the area around the X fully transparent. The full-
   viewport backdrop supplies the blur; adding a second filter layer on
   this transformed container creates the extra horizontal band seen
   above the white sort panel. */
.mobile-orderby-popover .popover__container {
	will-change: auto !important;
	background-color: transparent !important;
	box-shadow: none !important;
	-webkit-backdrop-filter: none !important;
	backdrop-filter: none !important;
	transition: transform var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
}
.mobile-orderby-popover.popover--open .popover__container {
	background-color: transparent !important;
	-webkit-backdrop-filter: none !important;
	backdrop-filter: none !important;
	transition: transform var(--ios-drawer-open-duration) var(--ios-drawer-ease) !important;
}
/* The actual sort menu remains the only white surface. */
.mobile-orderby-popover .popover__content {
	background-color: var(--gz-color-light, #fff) !important;
	-webkit-backdrop-filter: none;
	backdrop-filter: none;
}

/* ==========================================================================
   26. SHOP TOOLBAR — Concept-style polish (v1.0.79)

   Three visual changes baked together because they share specificity
   battles with the parent's `.catalog-toolbar__*` rules and it's
   easier to keep them adjacent:

     A) Hide the "There are X results in total" line. The user
        considers the count noise on a shop page that already shows
        every card — drop it.

     B) Filter button → looks/animates like the single-product
        Add-to-Cart pill. JS in custom-hover-buttons-v2.js tags the
        button with `.concept-hover-btn .concept-hover-btn--primary`
        and injects `<span class="btn-fill">`; the slide-up fill +
        text color flip then run from the existing section 5 CSS.
        We just ship the matching pill skin (dark bg, white text,
        30px radius, 50px height — the exact ATC numbers we read off
        the live site).

     C) Sort-by trigger → Concept pill. The default state was a
        bare inline "Sort by: <option> ↓" line; we wrap that in a
        rounded outline pill that visually pairs with the filter
        button on the opposite end of the toolbar. The dropdown
        panel below it gets matching rounded corners + a soft
        shadow + a smoother fade-and-slide animation than the
        parent's `var(--gz-transition)` (0.4s linear).
   ========================================================================== */

/* ----- A) Hide product result count ------------------------------- */
html body .catalog-toolbar__result-count {
	display: none !important;
}

/* ----- B) Filter button — match single-product Add-to-Cart pill ---
   Numbers (height 50, radius 30, font-size 15, weight 600, padding
   16.5/20) come from `getComputedStyle(.single_add_to_cart_button)`
   on test.jonglerjewelry.com. Padding-right has 4px extra room on
   the icon side because the SVG sits before the label and breaks
   the visual centering with the symmetrical 20px ATC has. */
html body .catalog-toolbar__filter-button,
html body .catalog-toolbar__filter-button:not(.not-default) {
	--gz-button-rounded: 30px;
	--gz-button-font-weight: 600;
	--gz-button-padding-top: 0;
	--gz-button-padding-bottom: 0;
	--gz-button-padding-left: 24px;
	--gz-button-padding-right: 24px;
	--gz-button-icon-size: 14px;
	--gz-button-icon-spacing: 8px;
	--gz-button-bg-color: #111111;
	--gz-button-bg-color-hover: #ffffff;
	--gz-button-color: #ffffff;
	--gz-button-color-hover: #111111;
	--gz-button-border-color: #111111;
	--gz-button-border-color-hover: #111111;
	background-color: #111111 !important;
	color: #ffffff !important;
	border: 1px solid #111111 !important;
	border-radius: 30px !important;
	height: 50px !important;
	min-height: 50px !important;
	padding: 0 24px !important;
	font-size: 15px !important;
	font-weight: 600 !important;
	letter-spacing: -0.36px !important;
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	gap: 8px !important;
	white-space: nowrap !important;
	line-height: 1 !important;
	transition: color 0.18s linear !important;
}

/* The SVG icon inside the filter button — neutralise the parent's
   `top: 1px` nudge (designed for the OLD short button), let
   flexbox center it, and pin its color to inherit so the white→black
   flip on hover follows the label. */
html body .catalog-toolbar__filter-button .glozin-svg-icon,
html body .catalog-toolbar__filter-button .glozin-svg-icon svg {
	position: static !important;
	top: auto !important;
	color: currentColor !important;
	fill: currentColor !important;
}

/* Hover/active state — text flips to dark; the slide-up white fill
   itself is painted by `.btn-fill` (section 5). Specificity-stacked
   selectors guard against parent's `.gz-button-light:hover` etc.
   that re-color the label back. */
html body .catalog-toolbar__filter-button:hover,
html body .catalog-toolbar__filter-button:active,
html body .catalog-toolbar__filter-button:focus-visible,
html body .catalog-toolbar__filter-button.concept-hover-active,
html body .catalog-toolbar__filter-button:hover *:not(.btn-fill),
html body .catalog-toolbar__filter-button:active *:not(.btn-fill),
html body .catalog-toolbar__filter-button:focus-visible *:not(.btn-fill),
html body .catalog-toolbar__filter-button.concept-hover-active *:not(.btn-fill) {
	color: #111111 !important;
	-webkit-text-fill-color: #111111 !important;
	border-color: #111111 !important;
}

/* The mobile shop header places the filter button in a one-line
   toolbar with the sort-by button on the right. v1.0.81: dropped
   from 44px → 38px per user request ("a little bit smaller") and
   shrank padding to keep the icon-and-label spacing balanced. The
   matching mobile sort-by pill (next selector) reuses these numbers
   so the two buttons read as a pair. */
@media (max-width: 1024px) {
	html body .catalog-toolbar__toolbar {
		align-items: center !important;
	}
	html body .catalog-toolbar__filter-button,
	html body .catalog-toolbar__filter-button:not(.not-default) {
		height: 38px !important;
		min-height: 38px !important;
		padding: 0 16px !important;
		font-size: 13px !important;
		gap: 7px !important;
	}
	html body .catalog-toolbar__filter-button .glozin-svg-icon svg {
		width: 12px !important;
		height: 12px !important;
	}

	/* ----- Mobile sort-by pill — match the filter pill exactly --
	   The mobile sort-by uses a different element than desktop:
	   `.catalog-toolbar__orderby-button` is a real <button> the
	   parent already renders as the popover trigger. We restyle it
	   to the dark Add-to-Cart pill (same numbers as the filter pill
	   above) so the two buttons mirror each other across the
	   toolbar row. */
	html body .catalog-toolbar__orderby-button {
		--gz-button-rounded: 30px;
		--gz-button-bg-color: #111111;
		--gz-button-bg-color-hover: #ffffff;
		--gz-button-color: #ffffff;
		--gz-button-color-hover: #111111;
		--gz-button-border-color: #111111;
		--gz-button-border-color-hover: #111111;
		background-color: #111111 !important;
		color: #ffffff !important;
		border: 1px solid #111111 !important;
		border-radius: 30px !important;
		height: 38px !important;
		min-height: 38px !important;
		padding: 0 16px !important;
		font-size: 13px !important;
		font-weight: 600 !important;
		letter-spacing: -0.2px !important;
		display: inline-flex !important;
		align-items: center !important;
		justify-content: center !important;
		gap: 7px !important;
		white-space: nowrap !important;
		line-height: 1 !important;
		transition: color 0.18s linear !important;
		position: relative !important;
		overflow: hidden !important;
		isolation: isolate;
	}
	/* Chevron icon inside the mobile sort-by pill — neutralise
	   parent's `margin-top: 2px` nudge and let flexbox center it. */
	html body .catalog-toolbar__orderby-button .glozin-svg-icon {
		position: static !important;
		margin: 0 !important;
		color: currentColor !important;
	}
	html body .catalog-toolbar__orderby-button .glozin-svg-icon svg {
		width: 10px !important;
		height: 10px !important;
		color: currentColor !important;
		fill: currentColor !important;
	}
	/* Hover/active text-flip — the white slide-up fill is painted
	   by `.btn-fill` (added by custom-hover-buttons-v2.js, see
	   BUTTON_MAP). Specificity-stacked selectors guard against the
	   parent's `gz-button-outline` rules re-coloring the label. */
	html body .catalog-toolbar__orderby-button:hover,
	html body .catalog-toolbar__orderby-button:active,
	html body .catalog-toolbar__orderby-button:focus-visible,
	html body .catalog-toolbar__orderby-button.concept-hover-active,
	html body .catalog-toolbar__orderby-button:hover *:not(.btn-fill),
	html body .catalog-toolbar__orderby-button:active *:not(.btn-fill),
	html body .catalog-toolbar__orderby-button:focus-visible *:not(.btn-fill),
	html body .catalog-toolbar__orderby-button.concept-hover-active *:not(.btn-fill) {
		color: #111111 !important;
		-webkit-text-fill-color: #111111 !important;
		border-color: #111111 !important;
	}
}

/* ----- C) Desktop sort-by — Concept "morph" pill (v1.0.82) --------

   v1.0.82 redesign: the form was previously growing in normal flow
   (220×44 → 300×340) which pushed the product grid down on every
   open. We now wrap the form in a `.gz-orderby-pill-slot` (added
   by custom-shop-toolbar.js) that LOCKS the toolbar layout to
   220×44 forever; the form itself goes `position: absolute` and
   morphs ABOVE the cards, so opening the panel never shifts
   anything below it.

   We also added a Concept-style X close badge (a `<span>` with the
   X SVG, injected by the same JS) that scales in from 0 and rotates
   −90° on open — matches `concept-theme-tech.myshopify.com`'s
   `.sort-close` exactly.

   Tokens still come from Concept:
     --animation-primary: 0.5s cubic-bezier(0.3, 1, 0.3, 1)
     --animation-fast:    0.3s cubic-bezier(0.7, 0, 0.3, 1)            */

@media (min-width: 1025px) {
	/* Slot — reserves 220×44 in the flex toolbar regardless of
	   whether the form inside is collapsed or expanded. */
	html body .gz-orderby-pill-slot {
		position: relative;
		display: inline-block;
		width: 220px;
		height: 44px;
		flex: 0 0 auto;
		vertical-align: middle;
	}

	/* Form — absolutely positioned inside the slot, anchored
	   top:right (so the morph grows leftward + downward over the
	   product grid below). */
	html body .gz-orderby-pill-slot .catalog-toolbar__orderby-form {
		position: absolute !important;
		top: 0 !important;
		right: 0 !important;
		width: 220px !important;
		height: 44px !important;
		display: block !important;
		background-color: #ffffff !important;
		border: 1px solid #111111 !important;
		border-radius: 30px !important;
		overflow: hidden !important;
		z-index: 60;
		transition:
			width 0.5s cubic-bezier(0.3, 1, 0.3, 1),
			height 0.5s cubic-bezier(0.3, 1, 0.3, 1),
			border-radius 0.5s cubic-bezier(0.3, 1, 0.3, 1),
			box-shadow 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
	}

	html body .gz-orderby-pill-slot .catalog-toolbar__orderby-form.glozin-active {
		width: 300px !important;
		height: 340px !important;
		border-radius: 24px !important;
		box-shadow: 0 16px 40px rgba(0, 0, 0, 0.14), 0 2px 8px rgba(0, 0, 0, 0.06) !important;
		z-index: 100;
	}

	/* Trigger row — single line, no wrap. The selection name is
	   clipped with ellipsis if too long. */
	html body .catalog-toolbar__orderby-default {
		display: flex !important;
		align-items: center !important;
		justify-content: flex-start !important;
		gap: 6px !important;
		height: 44px !important;
		padding: 0 56px 0 22px !important; /* extra right padding leaves room for the chevron / X badge */
		margin: 0 !important;
		background-color: transparent !important;
		color: #111111 !important;
		font-size: 14px !important;
		font-weight: 500 !important;
		letter-spacing: -0.2px !important;
		cursor: pointer !important;
		border: 0 !important;
		white-space: nowrap !important;
		overflow: hidden !important;
		position: relative !important;
	}

	/* "Sort by:" prefix — never shrinks; fades to muted on open. */
	html body .catalog-toolbar__orderby-default > span:first-child {
		opacity: 0.7;
		font-weight: 500;
		flex: 0 0 auto;
		transition: opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1);
	}
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-default > span:first-child {
		opacity: 0.4;
	}

	/* Selection name — fills remaining width, ellipsis on overflow.
	   Fades to 0 when the panel is open (Concept hides the active
	   selection so the user focuses on the new options). */
	html body .catalog-toolbar__orderby-default-name {
		font-weight: 600 !important;
		color: inherit !important;
		flex: 1 1 auto;
		overflow: hidden !important;
		text-overflow: ellipsis !important;
		white-space: nowrap !important;
		transition: opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1);
		opacity: 1;
	}
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-default-name {
		opacity: 0;
	}

	/* Chevron — sits at the right edge, fades + collapses to 0 on
	   open (replaced by the X badge below). */
	html body .catalog-toolbar__orderby-default .gz-collapse-icon {
		position: absolute !important;
		right: 22px !important;
		top: 50% !important;
		transform: translateY(-50%) !important;
		transition: opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1), transform 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
		font-size: 9px !important;
		display: inline-flex !important;
		align-items: center !important;
		color: inherit !important;
		opacity: 1;
	}
	html body .catalog-toolbar__orderby-form.glozin-active .gz-collapse-icon {
		opacity: 0;
		transform: translateY(-50%) rotate(-180deg) !important;
	}

	/* X close badge — black circle (32×32) with white X.  Scales
	   from 0 + rotates −90° on open. JS injects this `<span>` so
	   we can give it its own z-index above the chevron + own SVG. */
	html body .catalog-toolbar__orderby-default .gz-orderby-close {
		position: absolute !important;
		right: 14px !important;
		top: 50% !important;
		width: 32px !important;
		height: 32px !important;
		border-radius: 50% !important;
		background-color: #111111 !important;
		color: #ffffff !important;
		display: inline-flex !important;
		align-items: center !important;
		justify-content: center !important;
		transform: translateY(-50%) scale(0) rotate(0deg) !important;
		transition: transform 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
		pointer-events: none;
		z-index: 3;
	}
	html body .catalog-toolbar__orderby-default .gz-orderby-close svg {
		width: 12px !important;
		height: 12px !important;
		display: block !important;
	}
	html body .catalog-toolbar__orderby-form.glozin-active .gz-orderby-close {
		transform: translateY(-50%) scale(1) rotate(-90deg) !important;
	}

	/* List inside the morphed pill. */
	html body .catalog-toolbar__orderby-list {
		position: absolute !important;
		top: 60px !important;
		left: 22px !important;
		right: 22px !important;
		margin: 0 !important;
		padding: 0 !important;
		list-style: none !important;
		background: transparent !important;
		box-shadow: none !important;
		border-radius: 0 !important;
		transform: none !important;
		opacity: 0 !important;
		visibility: hidden !important;
		pointer-events: none !important;
		transition:
			opacity 0.5s cubic-bezier(0.3, 1, 0.3, 1),
			visibility 0s linear 0.5s !important;
	}
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list {
		opacity: 1 !important;
		visibility: visible !important;
		pointer-events: auto !important;
		transition:
			opacity 0.5s cubic-bezier(0.3, 1, 0.3, 1),
			visibility 0s linear 0s !important;
	}

	html body .catalog-toolbar__orderby-list > li {
		opacity: 0;
		transition: opacity 0.7s ease-out;
		margin: 0;
		padding: 0;
	}
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li {
		opacity: 1;
	}
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(1) { transition-delay: 0.06s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(2) { transition-delay: 0.11s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(3) { transition-delay: 0.16s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(4) { transition-delay: 0.21s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(5) { transition-delay: 0.26s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(6) { transition-delay: 0.31s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(7) { transition-delay: 0.36s; }
	html body .catalog-toolbar__orderby-form.glozin-active .catalog-toolbar__orderby-list > li:nth-child(8) { transition-delay: 0.41s; }

	html body .catalog-toolbar__orderby-list .catalog-toolbar__orderby-item {
		display: block !important;
		padding: 8px 0 !important;
		font-size: 15px !important;
		font-weight: 500 !important;
		color: #555555 !important;
		transition: color 0.3s cubic-bezier(0.7, 0, 0.3, 1), opacity 0.3s ease !important;
	}
	html body .catalog-toolbar__orderby-list .catalog-toolbar__orderby-item:hover {
		color: #111111 !important;
		background-color: transparent !important;
	}
	html body .catalog-toolbar__orderby-list .catalog-toolbar__orderby-item.selected,
	html body .catalog-toolbar__orderby-list .catalog-toolbar__orderby-item.current {
		color: #111111 !important;
		font-weight: 600 !important;
		opacity: 0.4;
		pointer-events: none;
	}
}

/* ==========================================================================
   27. PRODUCT CARDS — keep the sticky mobile header on top (v1.0.81)

   Bug report: "when I click once on a product card in the shop page in
   mobile view, it highlights that specific card, and when I scroll
   down the page that card is above the mobile header."

   On mobile browsers `:hover` (and sometimes `:focus-within`) sticks
   on a tap until the user taps elsewhere. If any third-party plugin
   (multi-color-swatches, wcboost compare/wishlist popovers, drift
   zoom, etc.) sets `z-index: <high>` on the focused card or its
   inner elements, the card escapes above our `z-index: 999` sticky
   header.

   Two-pronged defense:

   A) Pin every product-card state to `z-index: 0` and isolate its
      stacking context with `isolation: isolate`. Any high z-index
      INSIDE the card now stays scoped to the card and can't lift
      the entire card above siblings/the document root.

   B) Bump the sticky mobile header to `z-index: 1001` so it paints
      above the mobile bottom-nav (z 1000) too — overkill for the
      reported bug specifically but harmless and sidesteps any other
      element trying to win the painting order.
   ========================================================================== */

/* A) Card stacking-context isolation. */
html body ul.products li.product,
html body ul.products li.product:hover,
html body ul.products li.product:focus,
html body ul.products li.product:active,
html body ul.products li.product:focus-within,
html body ul.products li.product .product-inner,
html body ul.products li.product .product-inner:hover,
html body ul.products li.product .product-inner:focus,
html body ul.products li.product .product-inner:active,
html body ul.products li.product .product-inner:focus-within {
	z-index: 0 !important;
	isolation: isolate;
}

/* B) Mobile header always above any in-flow content. Scoped to the
   mobile breakpoint so the desktop header (z 999, deliberately
   below the bottom-nav-less desktop chrome) is unaffected. */
@media (max-width: 1199px) {
	html body .site-header__mobile,
	html body .site-header__mobile.minimized,
	html body .site-header__mobile.headroom--not-top,
	html body .site-header__section.site-header__mobile.header-sticky--both.minimized,
	html body .site-header__section.site-header__mobile.header-sticky--both.headroom--not-top {
		z-index: 1001 !important;
	}
}

/* ==========================================================================
   28. iOS-STYLE LOADERS — fully overlay, never affect button size (v1.0.84)

   v1.0.84 hard rewrite. The two persistent v1.0.82-83 bugs were:

     1. Button height changed when the loader appeared (363×50 →
        363×68 on the single-product ATC) because the loader was
        rendered as a flex CHILD of the button — pushing the button's
        content area taller. Root cause: section 5 has a rule
        `.btn-fill ~ * { position: relative }` (specificity 0,1,1)
        which beat `.gz-ios-loader { position: absolute }` (0,1,0).
        With the loader stuck at `position: relative`, it joined the
        button's flex flow and changed layout.

     2. Dots stacked vertically (7×33 instead of 33×7) because the
        loader root used `display: grid` with `place-items: center` —
        grid auto-flow made each dot its own cell, stacked rows.

   Both bugs fixed below by:
     • `position: absolute !important; inset: 0 !important` so the
       sibling `.btn-fill ~ *` rule can't drag the loader back to
       relative.
     • `display: flex !important; align-items: center !important;
       justify-content: center !important` so the dots line up
       horizontally and centre as a single visual unit.
     • `width: 100% !important; height: 100% !important; margin: 0;
       padding: 0` — explicit size to the button's content box so
       `align-items / justify-content` have a known frame to centre
       in regardless of how flex-shrink behaves on the parent.

   Reference: Concept Shopify theme uses the SAME structural pattern
   (`loader { position: absolute; top:0; right:0; bottom:0; left:0;
   display: flex; align-items: center; justify-content: center;
   gap: var(--sp-2); pointer-events: none }`) — I matched their
   approach exactly so future maintainers see the parity.

   Two variants picked at click time by `custom-ios-loaders.js`:

     a) `.gz-ios-loader--dots` — three dots that pulse in sequence.
        Used on text buttons (ATC, Buy now).
     b) `.gz-ios-loader--ring` — a single rotating ring spinner. Used
        on icon-only / square buttons (Quick view pill, wishlist pill,
        ≤ 60px square buttons) where 3 dots would visually overflow.
   ========================================================================== */

/* Loader root — overlay only. Never affects button layout. */
.gz-ios-loader {
	position: absolute !important;
	inset: 0 !important;
	top: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	left: 0 !important;
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	gap: 6px;
	margin: 0 !important;
	padding: 0 !important;
	width: auto !important;
	height: auto !important;
	pointer-events: none !important;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
	z-index: 4;
	box-sizing: border-box !important;
	border: 0 !important;
	background: transparent !important;
}

/* ---- Variant A: three bouncing dots ---- */
.gz-ios-loader--dots {
	gap: 6px;
}

.gz-ios-loader--dots .gz-ios-loader__dot {
	display: block;
	flex: 0 0 auto;
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background-color: currentColor;
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	/* Each dot pulses (scale + opacity) on a 1.4s loop. The
	   delay sequence (0 / 0.18s / 0.36s) is the iOS Messages
	   typing-indicator cadence. */
	animation: gzIOSDotPulse 1.4s cubic-bezier(0.4, 0, 0.2, 1) infinite;
	will-change: transform, opacity;
	/* Resting transform so the SCALE keyframe origin is the dot's
	   visual centre (not its top-left corner). */
	transform-origin: center center;
}
.gz-ios-loader--dots .gz-ios-loader__dot:nth-child(1) { animation-delay: 0s; }
.gz-ios-loader--dots .gz-ios-loader__dot:nth-child(2) { animation-delay: 0.18s; }
.gz-ios-loader--dots .gz-ios-loader__dot:nth-child(3) { animation-delay: 0.36s; }

@keyframes gzIOSDotPulse {
	0%, 70%, 100% {
		transform: scale(0.6);
		opacity: 0.35;
	}
	35% {
		transform: scale(1.05);
		opacity: 1;
	}
}

/* ---- Variant B: single ring spinner ---- */
.gz-ios-loader--ring .gz-ios-loader__ring {
	display: block;
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	border: 2px solid currentColor;
	border-top-color: transparent;
	border-radius: 50%;
	box-sizing: border-box;
	margin: 0;
	padding: 0;
	background: transparent;
	animation: gzIOSRing 0.8s linear infinite;
	will-change: transform;
}

@keyframes gzIOSRing {
	to { transform: rotate(360deg); }
}

/* Show / hide the loader (and its sibling content) ----------------- */
/* v1.0.87: do NOT set `pointer-events: none` on the button itself
   when loading. Doing so prevents the click event from firing on
   the button — for buttons that open a modal via parent's
   `[data-toggle="modal"]` delegate (quick view), the click never
   reaches the modal-toggle handler and the modal never opens.
   Double-tap protection is now handled by the JS guard in
   `custom-ios-loaders.js`: subsequent clicks on a button that
   already has `.gz-ios-loading` are ignored. */
html body .gz-ios-loading {
	cursor: progress;
}
html body .gz-ios-loading > .gz-ios-loader {
	opacity: 1 !important;
	visibility: visible !important;
}

/* Hide every direct child of the button EXCEPT the loader and the
   `.btn-fill` (which we keep parked off-screen via section 5).
   Layered specificity for buttons whose parents override
   `opacity: 1 !important` on `*`. */
html body .gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body ul.products li.product .product-loop-button-atc.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body ul.products li.product a.add_to_cart_button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body ul.products li.product .glozin-quickview-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body ul.products li.product .product__quickview-pill.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body .single-product div.product .single_add_to_cart_button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body .single-product div.product .gz-buy-now-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body #quick-view-modal .single_add_to_cart_button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body #quick-view-modal .gz-buy-now-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body #glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body #glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body #glozin-sticky-add-to-cart .gz-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body .glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body .glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill),
html body .glozin-sticky-add-to-cart .gz-button.gz-ios-loading > *:not(.gz-ios-loader):not(.btn-fill) {
	opacity: 0 !important;
	transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;
}

/* Park `.btn-fill` off-screen while the loader is up — otherwise the
   slide-up white fill would race with the dots' colour. */
html body .gz-ios-loading > .btn-fill {
	transform: translate3d(0, 76%, 0) !important;
}

/* Loader colour follows the button's hover-fill convention so the
   dots / ring are readable on whichever resting bg the button has. */
html body .gz-ios-loading.concept-hover-btn--primary .gz-ios-loader__dot {
	background-color: #ffffff !important;
}
html body .gz-ios-loading.concept-hover-btn--primary .gz-ios-loader__ring {
	border-color: #ffffff !important;
	border-top-color: transparent !important;
}
html body .gz-ios-loading.concept-hover-btn--secondary .gz-ios-loader__dot {
	background-color: #111111 !important;
}
html body .gz-ios-loading.concept-hover-btn--secondary .gz-ios-loader__ring {
	border-color: #111111 !important;
	border-top-color: transparent !important;
}

/* Specific colour pins for known buttons (overrides the
   primary/secondary fallback when more specificity is needed). */
html body .single-product .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__dot,
html body #quick-view-modal .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__dot,
html body ul.products li.product .product-loop-button-atc.gz-ios-loading .gz-ios-loader__dot,
html body ul.products li.product a.add_to_cart_button.gz-ios-loading .gz-ios-loader__dot,
html body .single-product .gz-buy-now-button.gz-ios-loading .gz-ios-loader__dot,
html body #quick-view-modal .gz-buy-now-button.gz-ios-loading .gz-ios-loader__dot,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__dot,
html body #glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader__dot,
html body #glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader__dot,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__dot,
html body .glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader__dot,
html body .glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader__dot {
	background-color: #ffffff !important;
}
html body .single-product .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__ring,
html body #quick-view-modal .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__ring,
html body ul.products li.product .product-loop-button-atc.gz-ios-loading .gz-ios-loader__ring,
html body ul.products li.product a.add_to_cart_button.gz-ios-loading .gz-ios-loader__ring,
html body .single-product .gz-buy-now-button.gz-ios-loading .gz-ios-loader__ring,
html body #quick-view-modal .gz-buy-now-button.gz-ios-loading .gz-ios-loader__ring,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__ring,
html body #glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader__ring,
html body #glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader__ring,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader__ring,
html body .glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader__ring,
html body .glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader__ring {
	border-color: #ffffff !important;
	border-top-color: transparent !important;
}

/* Quick-view loading is locked to a black background until the modal
   opens, so the loader must stay white/readable. */
html body ul.products li.product .product__quickview-pill.gz-ios-loading .gz-ios-loader__ring,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading .gz-ios-loader__ring {
	border-color: #ffffff !important;
	border-top-color: transparent !important;
}
html body ul.products li.product .product__quickview-pill.gz-ios-loading .gz-ios-loader__dot,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading .gz-ios-loader__dot {
	background-color: #ffffff !important;
}

/* Kill parent's WC `.loading` spinner pseudo-elements if WC's class
   is also present so it doesn't fight our loader. */
html body .gz-ios-loading.loading::before,
html body .gz-ios-loading.loading::after {
	display: none !important;
	animation: none !important;
	background: none !important;
	border: 0 !important;
}

/* Mobile: dots and ring scale down so they fit the smaller 38px
   pills on cramped screens. Sizing only — layout / centering is
   inherited from the desktop rules above. */
@media (max-width: 767px) {
	.gz-ios-loader--dots {
		gap: 5px;
	}
	.gz-ios-loader--dots .gz-ios-loader__dot {
		width: 6px;
		height: 6px;
	}
	.gz-ios-loader--ring .gz-ios-loader__ring {
		width: 16px;
		height: 16px;
		border-width: 2px;
	}
}

/* ==========================================================================
   29. SEARCH MODAL — Popular Products card polish (v1.0.83)

   v1.0.82 set the right structure but the parent's `.product--concept-card
   .product-thumbnail { border-radius: 0 !important }` was winning on
   `!important` priority. Every search-modal rule now carries
   `!important` to tie-break, and we pin the inner image alignment +
   summary stack so the card reads as a clean discover-card (square
   thumb on top, two lines of title, price below).
   ========================================================================== */

html body #search-modal ul.products,
html body #search-modal .products.swiper-wrapper {
	display: flex !important;
	flex-wrap: nowrap !important;
	margin: 0 !important;
	padding: 0 !important;
	gap: 14px !important;
	align-items: stretch !important;
}

/* Cards: Swiper sets inline width — we just zero our min/max-width
   shop-grid rules so they don't fight Swiper. */
html body #search-modal ul.products li.product,
html body #search-modal .products.swiper-wrapper > li.product,
html body #search-modal .products.swiper-wrapper > .swiper-slide {
	flex: 0 0 auto !important;
	margin: 0 !important;
	padding: 0 !important;
	min-width: 0 !important;
	max-width: none !important;
	background: transparent !important;
	box-shadow: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	height: auto !important;
}

html body #search-modal ul.products li.product .product-inner {
	display: flex !important;
	flex-direction: column !important;
	align-items: stretch !important;
	gap: 10px !important;
	padding: 0 !important;
	margin: 0 !important;
	background: transparent !important;
	border: 0 !important;
	box-shadow: none !important;
}

/* Thumbnail — beats `.product--concept-card .product-thumbnail`
   (the older v4 rule with `border-radius: 0 !important`). Both
   selectors carry `!important`; ours wins on specificity (1 ID +
   3 classes + 4 elements > 0 IDs + 4 classes + 4 elements). */
html body #search-modal ul.products li.product .product-thumbnail,
html body #search-modal ul.products li.product.product--concept-card .product-thumbnail {
	aspect-ratio: 1 / 1 !important;
	overflow: hidden !important;
	border-radius: 14px !important;
	margin: 0 !important;
	padding: 0 !important;
	background-color: #f6f6f6 !important;
	position: relative !important;
	display: block !important;
	width: 100% !important;
	height: auto !important;
}

html body #search-modal ul.products li.product .product-thumbnail a,
html body #search-modal ul.products li.product .product-thumbnail .product-thumbnails--fadein,
html body #search-modal ul.products li.product .product-thumbnail .product-thumbnails-wrapper {
	display: block !important;
	width: 100% !important;
	height: 100% !important;
	position: absolute !important;
	inset: 0 !important;
	margin: 0 !important;
	padding: 0 !important;
	border-radius: inherit !important;
	overflow: hidden !important;
}

html body #search-modal ul.products li.product .product-thumbnail img {
	width: 100% !important;
	height: 100% !important;
	object-fit: cover !important;
	display: block !important;
	border-radius: inherit !important;
	transition: transform 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
}
html body #search-modal ul.products li.product:hover .product-thumbnail img,
html body #search-modal ul.products li.product:focus-within .product-thumbnail img {
	transform: scale(1.05) !important;
}

/* Hide all accessory chrome (rating/quickview/wishlist pills,
   featured-icons row, sale countdown, category line). Search-result
   cards are a "tap to go" list — keep them visually quiet. */
html body #search-modal ul.products li.product .product__badge-swap,
html body #search-modal ul.products li.product .product__rating-pill,
html body #search-modal ul.products li.product .product__quickview-pill,
html body #search-modal ul.products li.product .product__wishlist-pill,
html body #search-modal ul.products li.product .product-card-wishlist,
html body #search-modal ul.products li.product .glozin-rating,
html body #search-modal ul.products li.product .product-card-animation,
html body #search-modal ul.products li.product .product-featured-icons,
html body #search-modal ul.products li.product .glozin-badges-sale__countdown,
html body #search-modal ul.products li.product .product__category,
html body #search-modal ul.products li.product .glozin-badges-sale,
html body #search-modal ul.products li.product .glozin-badges-out_of_stock,
html body #search-modal ul.products li.product .glozin-badges,
html body #search-modal ul.products li.product .product-thumbnail .product-featured-icons {
	display: none !important;
}

/* But keep the simple "Sale" / "New" badges if any — they're
   short visual cues, easy to read. Restore them to a small pill. */
/* Kill ALL hover-fill discs inside search-modal product cards. The
   carousel cards inherit our `.concept-hover-btn` sliding fills,
   `.btn-fill` and `.product__pill-hover-fill` — these are large
   off-screen dark discs (150×200% of the parent button) that on
   tap or scroll could leak as a black circle in the search area.
   Force them parked + invisible regardless of state. */
html body #search-modal ul.products li.product .btn-fill,
html body #search-modal ul.products li.product .product__pill-hover-fill {
	display: none !important;
	transform: translate3d(0, 200%, 0) !important;
	opacity: 0 !important;
	pointer-events: none !important;
	visibility: hidden !important;
	background: transparent !important;
}

html body #search-modal ul.products li.product .glozin-badges-sale.glozin-badges-text {
	display: inline-block !important;
	position: absolute !important;
	top: 8px !important;
	left: 8px !important;
	padding: 3px 8px !important;
	border-radius: 999px !important;
	background-color: #111 !important;
	color: #fff !important;
	font-size: 10px !important;
	font-weight: 600 !important;
	letter-spacing: 0.4px !important;
	text-transform: uppercase !important;
	line-height: 1 !important;
	z-index: 2 !important;
}

/* Title + price summary block. */
html body #search-modal ul.products li.product .product-summary {
	padding: 0 !important;
	margin: 0 !important;
	display: flex !important;
	flex-direction: column !important;
	align-items: flex-start !important;
	text-align: left !important;
	gap: 4px !important;
	background: transparent !important;
}
html body #search-modal ul.products li.product .woocommerce-loop-product__title {
	font-size: 13px !important;
	font-weight: 500 !important;
	color: #111 !important;
	line-height: 1.35 !important;
	margin: 0 !important;
	padding: 0 !important;
	display: -webkit-box !important;
	-webkit-line-clamp: 2 !important;
	-webkit-box-orient: vertical !important;
	overflow: hidden !important;
	text-overflow: ellipsis !important;
	min-height: 36px !important;
}
html body #search-modal ul.products li.product .woocommerce-loop-product__title a {
	color: inherit !important;
	text-decoration: none !important;
	font-weight: inherit !important;
	font-size: inherit !important;
	line-height: inherit !important;
}
html body #search-modal ul.products li.product .price,
html body #search-modal ul.products li.product .price * {
	font-size: 13px !important;
	font-weight: 600 !important;
	color: #111 !important;
	margin: 0 !important;
	padding: 0 !important;
	display: inline-block !important;
	line-height: 1.2 !important;
}
html body #search-modal ul.products li.product .price del {
	color: #999 !important;
	font-weight: 500 !important;
	margin-right: 6px !important;
	text-decoration: line-through !important;
}
html body #search-modal ul.products li.product .price ins {
	background: transparent !important;
	text-decoration: none !important;
	color: #c41230 !important;
}

/* Mobile (v1.0.89): 2-COLUMN grid replacing the 1-row Swiper.
   Breakpoint widened to `1199px` — same threshold parent uses to
   swap desktop ↔ mobile header, so any viewport that shows the
   mobile header will also show the 2-column search popular grid.
   v1.0.89 switches the mobile list to CSS grid so Swiper slide
   sizing cannot leave the second column blank. */
@media (max-width: 1199px) {
	html body #search-modal ul.products,
	html body #search-modal .products.swiper-wrapper {
		display: grid !important;
		grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
		column-gap: 10px !important;
		row-gap: 18px !important;
		/* Swiper sets inline `transform: translate3d(...)` to slide the
		   carousel — neutralise it so the wrapped grid stays still. */
		transform: none !important;
		-webkit-transform: none !important;
		width: 100% !important;
		max-width: 100% !important;
		overflow: visible !important;
	}
	html body #search-modal ul.products li.product,
	html body #search-modal .products.swiper-wrapper > li.product,
	html body #search-modal .products.swiper-wrapper > .swiper-slide {
		flex: none !important;
		width: auto !important;
		max-width: none !important;
		min-width: 0 !important;
		margin: 0 !important;
	}
	html body #search-modal ul.products li.product .product-thumbnail,
	html body #search-modal ul.products li.product.product--concept-card .product-thumbnail {
		width: 100% !important;
		max-width: 100% !important;
		aspect-ratio: 1 / 1 !important;
		height: auto !important;
		max-height: none !important;
		border-radius: 12px !important;
	}
	html body #search-modal ul.products li.product .woocommerce-loop-product__title {
		font-size: 12px !important;
		line-height: 1.3 !important;
		min-height: 32px !important;
	}
	html body #search-modal ul.products li.product .price,
	html body #search-modal ul.products li.product .price * {
		font-size: 12px !important;
	}
	html body #search-modal ul.products li.product .product-inner {
		gap: 8px !important;
	}
	/* Hide swiper navigation / dots — irrelevant in a wrapped grid. */
	html body #search-modal .swiper-pagination,
	html body #search-modal .swiper-button-prev,
	html body #search-modal .swiper-button-next {
		display: none !important;
	}
}

/* ==========================================================================
   30. v1.0.85 BATCH FIXES

   A) Header logo — Chrome was rendering the SVG IMG at 0×0 because
      `width: auto; max-width: 100%` plus a flex parent of unknown
      width creates a chicken-and-egg sizing loop. Pin height + auto
      width so the SVG renders at its natural ratio (82×36 → 36 tall
      at the actual ratio).

   B) Quick-view loader colour flash — when `.gz-ios-loading` is on
      a quickview pill, suppress the hover/active state's bg-flip
      and the `.product__pill-hover-fill` slide so the dots show on
      a stable background (no dark→white→dark blink while modal opens).

   C) Wishlist page — hide variation swatches inside `.product-summary`
      and the existing wishlist heart on each card. Inject a top-LEFT
      X close badge (mirror of the quickview pill on top-right) with
      the same scale-up animation; clicking it removes the item.

   D) Search modal X button — adopt the minicart's 40px circle X
      with the same hover-fill (black disc slides up) + 180° spin.

   E) Sticky filter button — fixed pill on the left edge of the
      viewport that slides in from off-screen when the inline filter
      button leaves the viewport, slides back out when it returns.
      Driven by `.gz-sticky-filter--visible` toggled by JS via an
      IntersectionObserver.
   ========================================================================== */

/* ----- A) Header logo + flex layout (v1.0.87) -------------------
   v1.0.85's logo width fix made the SVG render at 82px (correct).
   But by leaving `.header-left/center/right-items` at parent's
   `flex: 1 1 0%`, the center NAV (1254px of menu items) was forcing
   the center column wider than 1/3, which pushed the right items
   (cart + wishlist) off the viewport edge.

   Fix: pin LEFT and RIGHT items to `flex: 0 0 auto` (take their
   content width and stay there) and let CENTER take all remaining
   space with `min-width: 0` + `overflow: hidden` so an oversized
   menu just clips instead of pushing the cart icons off-screen. */

/* Left + right take their natural content width — never stretch,
   never compress past content. This guarantees the cart, wishlist,
   account, search icons (175px total) and the logo (82px) always
   fit within the header. */
html body .site-header__desktop .header-left-items,
html body .site-header__desktop .header-right-items {
	flex: 0 0 auto !important;
	min-width: 0 !important;
}

/* Center fills the remaining width and clips its menu when the
   menu would otherwise overflow into the right items. */
html body .site-header__desktop .header-center-items {
	flex: 1 1 0% !important;
	min-width: 0 !important;
	overflow: hidden !important;
}

/* Logo: explicit pixel size on the SVG (Chrome can't always
   derive intrinsic SVG sizing through nested auto-width parents). */
html body .site-header__desktop .header-logo,
html body .site-header__mobile .header-logo {
	flex-shrink: 0 !important;
	min-width: 82px;
}
html body .site-header__desktop .header-logo > a,
html body .site-header__mobile .header-logo > a {
	min-width: 82px;
	line-height: 0;
}
/* Only the dark (visible) logo gets explicit sizing. Don't touch
   .logo-light — its `display: none` from the parent must persist. */
html body .site-header__desktop .header-logo img.logo-dark,
html body .site-header__mobile .header-logo img.logo-dark {
	width: auto !important;
	height: 36px !important;
	max-width: none !important;
	min-width: 0;
}
/* Mobile header logo can be slightly smaller. */
@media (max-width: 1024px) {
	html body .site-header__mobile .header-logo img.logo-dark {
		height: 32px !important;
	}
}

/* ----- B) Quick-view loader colour flash fix -------------------- */
/* While the loader is up, freeze the button's resting bg + colour
   so the click doesn't trigger the hover→fill→reset blink. The
   `.btn-fill` is already parked in section 28; this rule covers
   the `.product__pill-hover-fill` and any direct `:hover`/`:active`
   bg-color overrides on the quick-view pill. */
html body ul.products li.product .product__quickview-pill.gz-ios-loading,
html body ul.products li.product .product__quickview-pill.gz-ios-loading:hover,
html body ul.products li.product .product__quickview-pill.gz-ios-loading:active,
html body ul.products li.product .product__quickview-pill.gz-ios-loading:focus,
html body ul.products li.product .product__quickview-pill.gz-ios-loading:focus-visible,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked:hover,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked:active,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked:focus,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked:focus-visible,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading:hover,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading:active,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading:focus-visible,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked:hover,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked:active,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked:focus-visible {
	background: rgba(17, 17, 17, 0.92) !important;
	background-color: rgba(17, 17, 17, 0.92) !important;
	color: #ffffff !important;
	border-color: transparent !important;
}
html body ul.products li.product .product__quickview-pill.gz-ios-loading .product__pill-hover-fill,
html body ul.products li.product .product__quickview-pill.gz-quickview-loading-locked .product__pill-hover-fill,
html body ul.products li.product .glozin-quickview-button.gz-ios-loading .product__pill-hover-fill,
html body ul.products li.product .glozin-quickview-button.gz-quickview-loading-locked .product__pill-hover-fill {
	transform: translateY(0) !important;
	transition: none !important;
}

/* Apply the same freeze to the loop ATC + single-product ATC so
   the dark→white flash on slow networks is also gone. */
html body ul.products li.product .product-loop-button-atc.gz-ios-loading,
html body ul.products li.product a.add_to_cart_button.gz-ios-loading,
html body .single-product div.product .single_add_to_cart_button.gz-ios-loading,
html body .single-product div.product .gz-buy-now-button.gz-ios-loading,
html body #quick-view-modal .single_add_to_cart_button.gz-ios-loading,
html body #quick-view-modal .gz-buy-now-button.gz-ios-loading,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading,
html body #glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading,
html body #glozin-sticky-add-to-cart .gz-button.gz-ios-loading,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading,
html body .glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading,
html body .glozin-sticky-add-to-cart .gz-button.gz-ios-loading {
	color: transparent !important;
	-webkit-text-fill-color: transparent !important;
}

html body .single-product div.product .single_add_to_cart_button.gz-ios-loading .gz-ios-loader,
html body .single-product div.product .single_add_to_cart_button.gz-ios-loading .gz-ios-loader *,
html body .single-product div.product .gz-buy-now-button.gz-ios-loading .gz-ios-loader,
html body .single-product div.product .gz-buy-now-button.gz-ios-loading .gz-ios-loader *,
html body #quick-view-modal .single_add_to_cart_button.gz-ios-loading .gz-ios-loader,
html body #quick-view-modal .single_add_to_cart_button.gz-ios-loading .gz-ios-loader *,
html body #quick-view-modal .gz-buy-now-button.gz-ios-loading .gz-ios-loader,
html body #quick-view-modal .gz-buy-now-button.gz-ios-loading .gz-ios-loader *,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader *,
html body #glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader,
html body #glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader *,
html body #glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader,
html body #glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader *,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button.gz-ios-loading .gz-ios-loader *,
html body .glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader,
html body .glozin-sticky-add-to-cart .gz-buy-now-button.gz-ios-loading .gz-ios-loader *,
html body .glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader,
html body .glozin-sticky-add-to-cart .gz-button.gz-ios-loading .gz-ios-loader * {
	color: #ffffff !important;
	-webkit-text-fill-color: #ffffff !important;
}

/* ----- C) Wishlist page card polish (v1.0.87) -------------------
   Two updates from v1.0.86:

     1. Hide BOTH `.product-featured-icons--primary` (top-right
        column) and `.product-featured-icons--second` (bottom row)
        on wishlist cards — that's the "X button at bottom center"
        the user kept seeing. v1.0.86 only hid the heart inside
        primary; the bottom row "Select options" button stayed.

     2. Use the screen-reader-only pattern (clip + 1px size +
        position:absolute) on the wishlist heart so it's INVISIBLE
        but JS can still trigger its click — `display: none` made
        the click no-op since unrendered elements don't accept
        click events. This restores the click-removes flow. */

/* Hide variation swatches / +N labels inside the summary on the
   wishlist page — were rendering as stray letters / "+8" links and
   overlapping the rating row. */
html body.wcboost-wishlist-page ul.products li.product .product-variation-items,
html body.wcboost-wishlist-page ul.products li.product .product-variation-item-more {
	display: none !important;
}

/* Hide the bottom-center select-options row entirely — wishlist
   cards are about removal, not picking variations. */
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--second {
	display: none !important;
}

/* Hide compare + quickview + ATC inside the primary column — only
   the heart stays (sr-only) so we can programmatically click it. */
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--primary .wcboost-products-compare-button,
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--primary .glozin-quickview-button,
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--primary .product-loop-button-atc,
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--primary a.add_to_cart_button {
	display: none !important;
}

/* The heart wishlist button — sr-only pattern. The element stays
   rendered (1×1 px, clipped) so `.click()` works to trigger
   wcboost's removal AJAX, but the user never sees it. The
   `.product-featured-icons--primary` container itself collapses to
   1×1 too, so it doesn't intercept any layout space on the card. */
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--primary {
	width: 1px !important;
	height: 1px !important;
	overflow: hidden !important;
	position: absolute !important;
	top: 0 !important;
	left: 0 !important;
	margin: 0 !important;
	padding: 0 !important;
	clip: rect(0, 0, 0, 0) !important;
	clip-path: inset(50%) !important;
	flex-direction: row !important;
	gap: 0 !important;
	pointer-events: auto !important;
}
html body.wcboost-wishlist-page ul.products li.product .product-featured-icons--primary .wcboost-wishlist-button {
	display: inline-block !important;
	visibility: visible !important;
	opacity: 0;
	width: 1px;
	height: 1px;
	overflow: hidden;
	pointer-events: auto;
}

/* Top-LEFT X close badge — mirror of `.product__quickview-pill`
   styling (white circle, dark X, dark fill on hover). Anchored to
   the same y-coord as the rating pill on the right. */
html body.wcboost-wishlist-page ul.products li.product .product-thumbnail .product__remove-pill {
	position: absolute !important;
	top: 15px !important;
	left: 15px !important;
	z-index: 5 !important;
	width: 40px !important;
	height: 40px !important;
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	padding: 0 !important;
	margin: 0 !important;
	border: 0 !important;
	border-radius: 50% !important;
	background-color: #ffffff !important;
	color: #171717 !important;
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08) !important;
	cursor: pointer !important;
	overflow: hidden !important;
	isolation: isolate;
	transition: color 0.30s cubic-bezier(0.3, 1, 0.3, 1) !important;
	transform: scale(1);
	transform-origin: 0% 50%;
	opacity: 1;
}

/* Show the X badge on card hover (matches Concept's quickview pill
   reveal cadence — 0.3s cubic-bezier ease-out-quart). */
html body.wcboost-wishlist-page ul.products li.product:hover .product__remove-pill,
html body.wcboost-wishlist-page ul.products li.product:focus-within .product__remove-pill,
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill:focus-visible {
	transform: scale(1);
	opacity: 1;
}

/* On touch devices the badge stays visible (matches the quickview
   pill behaviour on the shop page). */
@media (pointer: coarse), (max-width: 1024px) {
	html body.wcboost-wishlist-page ul.products li.product .product__remove-pill {
		transform: scale(1);
		opacity: 1;
	}
}

/* Hover-fill: dark disc slides up from below — same animation as
   `.product__quickview-pill .product__pill-hover-fill`. */
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill .product__pill-hover-fill {
	position: absolute;
	inset: 0;
	background-color: #111111;
	border-radius: 50%;
	transform: translateY(110%);
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	z-index: -1;
	pointer-events: none;
}
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill:hover .product__pill-hover-fill,
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill:active .product__pill-hover-fill {
	transform: translateY(0);
}

/* Inner X SVG — flips white on hover via inherited `currentColor`. */
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill .glozin-svg-icon {
	position: relative;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 14px;
	height: 14px;
	color: inherit;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
}
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill .glozin-svg-icon svg {
	width: 14px;
	height: 14px;
	stroke: currentColor;
	color: inherit;
}
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill:hover {
	color: #ffffff !important;
}
html body.wcboost-wishlist-page ul.products li.product .product__remove-pill:hover .glozin-svg-icon {
	transform: rotate(180deg);
}

/* Wishlist quick-view card guardrails. Variable products can expose
   "Select options" text through the cloned quick-view trigger; keep
   the pill icon-only so it matches simple product cards. */
html body.wcboost-wishlist-page ul.products li.product .product__quickview-pill .add-to-cart__text,
html body.wcboost-wishlist-page ul.products li.product .product__quickview-pill .button-text,
html body.wcboost-wishlist-page ul.products li.product .product__quickview-pill .wcboost-wishlist-button__text {
	position: absolute !important;
	width: 1px !important;
	height: 1px !important;
	padding: 0 !important;
	margin: -1px !important;
	overflow: hidden !important;
	clip: rect(0, 0, 0, 0) !important;
	white-space: nowrap !important;
	border: 0 !important;
}

/* Wishlist notices: replace WooCommerce's green banner feel with a
   compact iOS-like glass pill. */
html body.wcboost-wishlist-page .woocommerce-notices-wrapper .woocommerce-message,
html body.wcboost-wishlist-page .woocommerce-message {
	display: inline-flex !important;
	align-items: center !important;
	gap: 10px !important;
	width: auto !important;
	max-width: min(100%, 760px) !important;
	margin: 0 0 18px !important;
	padding: 12px 16px !important;
	border: 1px solid rgba(0, 0, 0, 0.08) !important;
	border-radius: 999px !important;
	background: rgba(255, 255, 255, 0.86) !important;
	-webkit-backdrop-filter: blur(18px) saturate(180%);
	        backdrop-filter: blur(18px) saturate(180%);
	box-shadow: 0 12px 34px rgba(0, 0, 0, 0.10) !important;
	color: #171717 !important;
	font-size: 14px !important;
	line-height: 1.35 !important;
}
html body.wcboost-wishlist-page .woocommerce-message::before {
	display: none !important;
	content: none !important;
}
html body.wcboost-wishlist-page .woocommerce-message a,
html body.wcboost-wishlist-page .woocommerce-message .restore-item {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	min-height: 28px !important;
	padding: 0 12px !important;
	border-radius: 999px !important;
	background: #171717 !important;
	color: #ffffff !important;
	font-size: 13px !important;
	font-weight: 500 !important;
	text-decoration: none !important;
	white-space: nowrap !important;
}

/* ----- D) Search modal X close — minicart-style 40×40 circle ----
   v1.0.88: explicit `top/left/right/bottom/width/height: 100%` on
   the ::before disc instead of `inset: 0` — Safari + iOS WebKit
   sometimes fail to compute `inset: 0` correctly when the parent's
   sizing comes from competing rules (parent sets 30×44, we override
   to 40×40, the disc's `inset: 0` resolves to a stale containing
   block during layout). That mis-computation is what produced the
   "massive black hole" on tap on mobile. Explicit dimensions force
   the disc to stay inside the 40×40 button.

   Also moved the X further from the search field — `inset-inline-
   end` overridden to 112px on mobile so the rounded button
   doesn't visually butt against the input. */
html body #search-modal .modal__button-close.gz-mc-style-close,
html body .search-modal .modal__button-close.gz-mc-style-close,
html body #quick-view-modal .modal__button-close.gz-mc-style-close,
html body .quick-view-modal .modal__button-close.gz-mc-style-close {
	width: 40px !important;
	height: 40px !important;
	min-width: 40px !important;
	max-width: 40px !important;
	max-height: 40px !important;
	border-radius: 50% !important;
	border: 1px solid rgba(0, 0, 0, 0.15) !important;
	background-color: transparent !important;
	color: var(--gz-color-dark, #171717) !important;
	opacity: 1 !important;
	overflow: hidden !important;
	isolation: isolate;
	contain: paint;
	transform: none !important;
	transition: color 0.35s cubic-bezier(0.3, 1, 0.3, 1), border-color 0.3s ease !important;
	cursor: pointer !important;
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	padding: 0 !important;
	box-shadow: none !important;
	/* Override parent QV modal's --gz-button-bg-color so the disc
	   stays visible (parent forces white bg via the var). */
	--gz-button-bg-color: transparent !important;
	--gz-button-bg-color-hover: transparent !important;
	--gz-button-color: var(--gz-color-dark, #171717) !important;
	--gz-button-color-hover: #ffffff !important;
}

/* Search modal close — extra right offset so the X doesn't visually
   butt against the search input. Quick View modal keeps its own positioning since the X
   sits on the modal corner, not next to a field. */
html body #search-modal .modal__button-close.gz-mc-style-close,
html body .search-modal .modal__button-close.gz-mc-style-close {
	inset-inline-end: 50px !important;
	right: 50px !important;
}
@media (max-width: 767px) {
	html body #search-modal .modal__button-close.gz-mc-style-close,
	html body .search-modal .modal__button-close.gz-mc-style-close {
		inset-inline-end: 112px !important;
		right: 112px !important;
	}
}
html body #search-modal .modal__button-close.gz-mc-style-close::before,
html body .search-modal .modal__button-close.gz-mc-style-close::before,
html body #quick-view-modal .modal__button-close.gz-mc-style-close::before,
html body .quick-view-modal .modal__button-close.gz-mc-style-close::before {
	content: '';
	position: absolute;
	top: 0 !important;
	left: 0 !important;
	right: 0 !important;
	bottom: 0 !important;
	width: 100% !important;
	height: 100% !important;
	background-color: #000;
	border-radius: 50%;
	transform: translateY(110%);
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	z-index: -1;
	pointer-events: none;
	box-sizing: border-box;
}
html body #search-modal .modal__button-close.gz-mc-style-close:hover,
html body .search-modal .modal__button-close.gz-mc-style-close:hover,
html body #quick-view-modal .modal__button-close.gz-mc-style-close:hover,
html body .quick-view-modal .modal__button-close.gz-mc-style-close:hover {
	color: #ffffff !important;
	border-color: #000 !important;
	transform: none !important;
	background-color: transparent !important;
}
html body #search-modal .modal__button-close.gz-mc-style-close:hover::before,
html body .search-modal .modal__button-close.gz-mc-style-close:hover::before,
html body #quick-view-modal .modal__button-close.gz-mc-style-close:hover::before,
html body .quick-view-modal .modal__button-close.gz-mc-style-close:hover::before {
	transform: translateY(0);
}
html body #search-modal .modal__button-close.gz-mc-style-close .glozin-svg-icon,
html body #search-modal .modal__button-close.gz-mc-style-close > svg,
html body .search-modal .modal__button-close.gz-mc-style-close .glozin-svg-icon,
html body .search-modal .modal__button-close.gz-mc-style-close > svg,
html body #quick-view-modal .modal__button-close.gz-mc-style-close .glozin-svg-icon,
html body #quick-view-modal .modal__button-close.gz-mc-style-close > svg,
html body .quick-view-modal .modal__button-close.gz-mc-style-close .glozin-svg-icon,
html body .quick-view-modal .modal__button-close.gz-mc-style-close > svg {
	position: relative;
	z-index: 1;
	width: 12px !important;
	height: 12px !important;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	transform-origin: center center;
	color: inherit;
}
html body #search-modal .modal__button-close.gz-mc-style-close:hover .glozin-svg-icon,
html body #search-modal .modal__button-close.gz-mc-style-close:hover > svg,
html body .search-modal .modal__button-close.gz-mc-style-close:hover .glozin-svg-icon,
html body .search-modal .modal__button-close.gz-mc-style-close:hover > svg,
html body #quick-view-modal .modal__button-close.gz-mc-style-close:hover .glozin-svg-icon,
html body #quick-view-modal .modal__button-close.gz-mc-style-close:hover > svg,
html body .quick-view-modal .modal__button-close.gz-mc-style-close:hover .glozin-svg-icon,
html body .quick-view-modal .modal__button-close.gz-mc-style-close:hover > svg {
	transform: rotate(180deg);
}

/* Keep Quick View's close button on a white base after the shared
   minicart-style close rule above sets transparent backgrounds. */
html body #quick-view-modal .modal__button-close.gz-mc-style-close,
html body .quick-view-modal .modal__button-close.gz-mc-style-close,
html body #quick-view-modal .modal__button-close.gz-mc-style-close:hover,
html body .quick-view-modal .modal__button-close.gz-mc-style-close:hover {
	background-color: #ffffff !important;
	--gz-button-bg-color: #ffffff !important;
	--gz-button-bg-color-hover: #ffffff !important;
}

/* ----- E) Sticky ATC upgrades (v1.0.115) ------------------------ */
html body #glozin-sticky-add-to-cart,
html body .glozin-sticky-add-to-cart {
	overflow: visible !important;
	background: var(--gz-header-blur-bg) !important;
	background-image: none !important;
	-webkit-backdrop-filter: var(--gz-header-blur-filter) !important;
	backdrop-filter: var(--gz-header-blur-filter) !important;
	border: var(--gz-header-blur-border) !important;
	border-bottom: 0 !important;
	border-radius: var(--gz-header-blur-radius) var(--gz-header-blur-radius) 0 0 !important;
	box-shadow: var(--gz-header-blur-shadow), 0 -18px 46px rgba(0, 0, 0, 0.10) !important;
	opacity: 0 !important;
	transform: translate3d(0, calc(100% + 22px), 0) !important;
	transform-origin: bottom center !important;
	transition:
		transform 0.68s cubic-bezier(0.22, 1, 0.36, 1),
		opacity 0.68s cubic-bezier(0.22, 1, 0.36, 1),
		box-shadow 0.68s cubic-bezier(0.22, 1, 0.36, 1) !important;
	will-change: transform, opacity;
}

html body #glozin-sticky-add-to-cart.open,
html body .glozin-sticky-add-to-cart.open {
	opacity: 1 !important;
	transform: translate3d(0, 0, 0) !important;
}

html body #glozin-sticky-add-to-cart::after,
html body .glozin-sticky-add-to-cart::after {
	content: '';
	position: absolute;
	top: 0;
	left: 24px;
	right: 24px;
	height: 1px;
	background: rgba(0, 0, 0, 0.16);
	pointer-events: none;
}

/* Remove the detached blur strip below/behind the sticky add-to-cart;
   the drawer itself now carries the glass material. */
html body.glozin-atc-sticky-height-open::before {
	content: none !important;
	display: none !important;
}

/* ----- F) Single product gallery polish ------------------------- */
@keyframes gzDriftMagnifierIn {
	0% {
		opacity: 0;
		transform: scale(0.72);
		filter: blur(7px);
	}
	55% {
		opacity: 1;
		transform: scale(1.035);
		filter: blur(0);
	}
	100% {
		opacity: 1;
		transform: scale(1);
		filter: blur(0);
	}
}

@keyframes gzDriftMagnifierOut {
	0% {
		opacity: 1;
		transform: scale(1);
		filter: blur(0);
	}
	100% {
		opacity: 0;
		transform: scale(0.82);
		filter: blur(8px);
	}
}

@media (min-width: 1025px) {
	/* Legacy magnifier pane styles (only apply if Drift falls back to
	   inlinePane mode — our JS patch usually disables it in favour of
	   the Woodmart-style inner overlay below). Kept for safety. */
	html body.single-product .drift-zoom-pane.drift-inline {
		width: clamp(220px, 17vw, 300px) !important;
		height: clamp(220px, 17vw, 300px) !important;
		border-radius: 999px !important;
		background: rgba(255, 255, 255, 0.58) !important;
		-webkit-backdrop-filter: blur(18px) saturate(170%) !important;
		backdrop-filter: blur(18px) saturate(170%) !important;
		border: 1px solid rgba(255, 255, 255, 0.72) !important;
		box-shadow:
			0 26px 70px rgba(0, 0, 0, 0.22),
			0 2px 12px rgba(0, 0, 0, 0.10),
			inset 0 0 0 1px rgba(255, 255, 255, 0.36) !important;
		overflow: hidden !important;
		pointer-events: none !important;
		will-change: transform, opacity, filter;
	}

	html body.single-product .drift-zoom-pane.drift-inline.drift-opening {
		animation: gzDriftMagnifierIn 0.48s cubic-bezier(0.22, 1, 0.36, 1) both !important;
	}

	html body.single-product .drift-zoom-pane.drift-inline.drift-closing {
		animation: gzDriftMagnifierOut 0.36s cubic-bezier(0.55, 0, 0.1, 1) both !important;
	}

	/* ----- Woodmart-style inner zoom (active path) -------------------
	   Our JS patch (custom-single-product-upgrades.js) forces Drift
	   into inner mode by setting `paneContainer = the gallery image
	   cell`. The pane gets the class `drift-zoom-pane` (no
	   `drift-inline`) and is inserted as a sibling/child of the
	   gallery cell. We fade it in over the source image so the visual
	   reads as "the image scales up under your cursor", just like
	   woodmart.xtemos.com.

	   Parent CSS already positions `.drift-zoom-pane` absolute at
	   top:0 / left:0 / 100%×100% within `.woocommerce-product-gallery
	   __image`, so we only need to layer it correctly and animate
	   its opacity. */
	html body.single-product div.product .woocommerce-product-gallery__image .drift-zoom-pane:not(.drift-inline) {
		position: absolute !important;
		top: 0 !important;
		left: 0 !important;
		width: 100% !important;
		height: 100% !important;
		border-radius: inherit !important;
		overflow: hidden !important;
		pointer-events: none !important;
		background-color: #fff !important;
		z-index: 2 !important;
		opacity: 0;
		transition: opacity 0.28s cubic-bezier(0.22, 1, 0.36, 1);
		will-change: opacity;
	}

	html body.single-product div.product .woocommerce-product-gallery__image .drift-zoom-pane:not(.drift-inline).drift-open,
	html body.single-product div.product .woocommerce-product-gallery__image .drift-zoom-pane:not(.drift-inline).drift-opening {
		opacity: 1;
	}

	html body.single-product div.product .woocommerce-product-gallery__image .drift-zoom-pane:not(.drift-inline) img {
		max-width: none !important;
		max-height: none !important;
		display: block;
	}

	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox {
		--gz-button-color: #111111;
		--gz-button-bg-color: rgba(255, 255, 255, 0.78);
		width: 50px !important;
		min-width: 50px !important;
		max-width: 50px !important;
		height: 50px !important;
		padding: 0 !important;
		overflow: hidden !important;
		border-radius: 999px !important;
		background-color: var(--gz-button-bg-color) !important;
		-webkit-backdrop-filter: blur(18px) saturate(170%) !important;
		backdrop-filter: blur(18px) saturate(170%) !important;
		border: 1px solid rgba(255, 255, 255, 0.62) !important;
		box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12) !important;
		color: var(--gz-button-color) !important;
		white-space: nowrap !important;
		justify-content: center !important;
		gap: 0 !important;
		transition:
			max-width 0.48s cubic-bezier(0.22, 1, 0.36, 1),
			width 0.48s cubic-bezier(0.22, 1, 0.36, 1),
			background-color 0.34s cubic-bezier(0.7, 0, 0.3, 1),
			color 0.34s cubic-bezier(0.7, 0, 0.3, 1),
			box-shadow 0.48s cubic-bezier(0.22, 1, 0.36, 1),
			transform 0.48s cubic-bezier(0.22, 1, 0.36, 1) !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox svg {
		flex: 0 0 auto;
		transform: none;
		transform-origin: center center;
		transition: transform 0.48s cubic-bezier(0.22, 1, 0.36, 1);
	}

	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox::after {
		content: 'click to enlarge';
		display: inline-block;
		color: inherit;
		font-size: 13px;
		font-weight: 600;
		line-height: 1;
		letter-spacing: 0;
		max-width: 0;
		overflow: hidden;
		white-space: nowrap;
		opacity: 0;
		transform: translate3d(6px, 0, 0);
		transition:
			max-width 0.48s cubic-bezier(0.22, 1, 0.36, 1),
			opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1),
			transform 0.48s cubic-bezier(0.22, 1, 0.36, 1);
	}

	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox:hover,
	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox:focus-visible {
		--gz-button-color: #ffffff;
		--gz-button-bg-color: rgba(17, 17, 17, 0.88);
		width: 174px !important;
		max-width: 174px !important;
		padding: 0 18px !important;
		gap: 8px !important;
		transform: translate3d(0, -1px, 0);
		box-shadow: 0 16px 42px rgba(0, 0, 0, 0.18) !important;
	}

	/* The previous rev rotated the expand-arrows icon -6deg on hover,
	   which made the icon look askew. The user wants it to stay
	   perfectly centered and not rotated, so the only hover effect on
	   the SVG itself is now `transform: none`. The button still grows
	   horizontally to reveal the "click to enlarge" label — the icon
	   inside just stays put. */
	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox:hover svg,
	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox:focus-visible svg {
		transform: none !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox:hover::after,
	html body.single-product div.product .woocommerce-product-gallery .glozin-button--product-lightbox:focus-visible::after {
		max-width: 108px;
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

html body.single-product .pswp {
	opacity: 0 !important;
	transition:
		opacity 0.52s cubic-bezier(0.22, 1, 0.36, 1),
		visibility 0s linear 0.52s !important;
}

html body.single-product .pswp--open {
	opacity: 1 !important;
	transition:
		opacity 0.52s cubic-bezier(0.22, 1, 0.36, 1),
		visibility 0s linear 0s !important;
}

html body.single-product .pswp__bg {
	background-color: transparent !important;
	background-image:
		radial-gradient(ellipse at center, var(--ios-backdrop-dim-near) 20%, var(--ios-backdrop-dim-far) 100%) !important;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate)) !important;
	backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate)) !important;
	opacity: 0 !important;
	transition: opacity 0.52s cubic-bezier(0.22, 1, 0.36, 1) !important;
}

html body.single-product .pswp--open .pswp__bg {
	opacity: 1 !important;
	-webkit-backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate)) !important;
	backdrop-filter: blur(var(--ios-backdrop-blur)) saturate(var(--ios-backdrop-saturate)) !important;
}

html body.single-product .pswp__scroll-wrap {
	background: transparent !important;
}

html body.single-product .pswp.gz-pswp-opening .pswp__bg {
	animation: gzPswpBackdropIn 0.52s cubic-bezier(0.22, 1, 0.36, 1) both !important;
}

html body.single-product .pswp.gz-pswp-closing .pswp__bg {
	animation: gzPswpBackdropOut 0.44s cubic-bezier(0.22, 1, 0.36, 1) both !important;
}

html body.single-product .pswp.gz-pswp-opening .pswp__scroll-wrap {
	animation: gzPswpStageIn 0.58s cubic-bezier(0.22, 1, 0.36, 1) both !important;
}

html body.single-product .pswp.gz-pswp-closing .pswp__scroll-wrap {
	animation: gzPswpStageOut 0.38s cubic-bezier(0.55, 0, 0.1, 1) both !important;
}

html body.single-product .pswp.gz-pswp-opening .pswp__ui,
html body.single-product .pswp.gz-pswp-opening .pswp__button,
html body.single-product .pswp.gz-pswp-opening .pswp__counter {
	animation: gzPswpChromeIn 0.52s cubic-bezier(0.22, 1, 0.36, 1) both !important;
}

html body.single-product .pswp.gz-pswp-closing .pswp__ui,
html body.single-product .pswp.gz-pswp-closing .pswp__button,
html body.single-product .pswp.gz-pswp-closing .pswp__counter {
	animation: gzPswpChromeOut 0.36s cubic-bezier(0.55, 0, 0.1, 1) both !important;
}

html body.single-product .pswp__button,
html body.single-product .pswp__counter {
	transition:
		opacity 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		transform 0.44s cubic-bezier(0.22, 1, 0.36, 1) !important;
}

html body.single-product .pswp__button--arrow--left:active,
html body.single-product .pswp__button--arrow--right:active {
	transform: scale(0.92) !important;
}

html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock),
html body.single-product div.product .woocommerce-product-gallery.woocommerce-product-gallery--has-arrows-mobile .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock) {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 34px !important;
	height: 34px !important;
	min-width: 34px !important;
	border-radius: 50% !important;
	border: 0.5px solid rgba(255, 255, 255, 0.55) !important;
	background: rgba(255, 255, 255, 0.42) !important;
	-webkit-backdrop-filter: blur(20px) saturate(180%) !important;
	backdrop-filter: blur(20px) saturate(180%) !important;
	color: #171717 !important;
	box-shadow: none !important;
	opacity: 1 !important;
	transition:
		opacity 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		background-color 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		border-color 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		transform 0.28s cubic-bezier(0.22, 1, 0.36, 1),
		margin 0.28s cubic-bezier(0.22, 1, 0.36, 1) !important;
}

/* Quick-view gallery controls — reuse the same iOS glass controls from
   the single product gallery. */
html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock),
html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock) {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 34px !important;
	height: 34px !important;
	min-width: 34px !important;
	border-radius: 50% !important;
	border: 0.5px solid rgba(255, 255, 255, 0.55) !important;
	background: rgba(255, 255, 255, 0.42) !important;
	-webkit-backdrop-filter: blur(20px) saturate(180%) !important;
	backdrop-filter: blur(20px) saturate(180%) !important;
	color: #171717 !important;
	box-shadow: none !important;
	opacity: 1 !important;
	transition:
		opacity 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		background-color 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		border-color 0.34s cubic-bezier(0.7, 0, 0.3, 1),
		transform 0.28s cubic-bezier(0.22, 1, 0.36, 1),
		margin 0.28s cubic-bezier(0.22, 1, 0.36, 1) !important;
}

html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button svg,
html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button svg {
	width: 13px !important;
	height: 13px !important;
	stroke-width: 2.2 !important;
}

html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:hover,
html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:focus-visible,
html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:hover,
html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:focus-visible {
	background: rgba(255, 255, 255, 0.75) !important;
	border-color: rgba(255, 255, 255, 0.55) !important;
	color: #000000 !important;
	opacity: 1 !important;
}

html body #quick-view-modal div.product .woocommerce-product-gallery .swiper-fraction,
html body .quick-view-modal div.product .woocommerce-product-gallery .swiper-fraction {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	min-height: 34px !important;
	padding: 0 14px !important;
	border-radius: 999px !important;
	border: 0.5px solid rgba(255, 255, 255, 0.55) !important;
	background: rgba(255, 255, 255, 0.42) !important;
	-webkit-backdrop-filter: blur(20px) saturate(180%) !important;
	backdrop-filter: blur(20px) saturate(180%) !important;
	color: #171717 !important;
	box-shadow: none !important;
	font-size: 12px !important;
	font-weight: 600 !important;
	line-height: 1 !important;
}

@media (min-width: 768px) {
	html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock),
	html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock) {
		top: 50% !important;
		opacity: 0 !important;
		pointer-events: none !important;
		transform: translateY(-50%) scale(0.94) !important;
	}

	html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized:hover .swiper-button:not(.swiper-button-lock),
	html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized:focus-within .swiper-button:not(.swiper-button-lock),
	html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized:hover .swiper-button:not(.swiper-button-lock),
	html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized:focus-within .swiper-button:not(.swiper-button-lock) {
		opacity: 1 !important;
		pointer-events: auto !important;
		transform: translateY(-50%) scale(1) !important;
	}

	html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button.swiper-button-next,
	html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button.swiper-button-next {
		right: 12px !important;
		left: auto !important;
		margin-inline-end: 0 !important;
	}

	html body #quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button.swiper-button-prev,
	html body .quick-view-modal div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button.swiper-button-prev {
		left: 12px !important;
		right: auto !important;
		margin-inline-start: 0 !important;
	}
}

html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button svg {
	width: 13px !important;
	height: 13px !important;
	stroke-width: 2.2 !important;
}

html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:hover,
html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:focus-visible {
	background: rgba(255, 255, 255, 0.75) !important;
	border-color: rgba(255, 255, 255, 0.55) !important;
	box-shadow: none !important;
	color: #000000 !important;
	opacity: 1 !important;
}

@media (min-width: 768px) {
	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock),
	html body.single-product div.product .woocommerce-product-gallery.woocommerce-product-gallery--has-arrows-mobile .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock) {
		top: 50% !important;
		opacity: 0 !important;
		pointer-events: none !important;
		transform: translateY(-50%) scale(0.94) !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized:hover .swiper-button:not(.swiper-button-lock),
	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized:focus-within .swiper-button:not(.swiper-button-lock) {
		opacity: 1 !important;
		pointer-events: auto !important;
		transform: translateY(-50%) scale(1) !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button.swiper-button-next {
		right: 12px !important;
		left: auto !important;
		margin-inline-end: 0 !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button.swiper-button-prev {
		left: 12px !important;
		right: auto !important;
		margin-inline-start: 0 !important;
	}

	html body.single-product div.product .woocommerce-product-gallery.woocommerce-product-gallery--has-arrows-mobile .woocommerce-product-gallery__wrapper.swiper-initialized:hover .swiper-button.swiper-button-next {
		margin-inline-end: 0 !important;
	}

	html body.single-product div.product .woocommerce-product-gallery.woocommerce-product-gallery--has-arrows-mobile .woocommerce-product-gallery__wrapper.swiper-initialized:hover .swiper-button.swiper-button-prev {
		margin-inline-start: 0 !important;
	}
}

@media (max-width: 767px) {
	html body.single-product div.product .woocommerce-product-gallery .swiper-fraction {
		display: none !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock),
	html body.single-product div.product .woocommerce-product-gallery.woocommerce-product-gallery--has-arrows-mobile .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button:not(.swiper-button-lock) {
		width: 34px !important;
		height: 34px !important;
		min-width: 34px !important;
		background: rgba(255, 255, 255, 0.42) !important;
		border: 0.5px solid rgba(255, 255, 255, 0.55) !important;
		box-shadow: none !important;
		-webkit-backdrop-filter: blur(20px) saturate(180%) !important;
		backdrop-filter: blur(20px) saturate(180%) !important;
		opacity: 1 !important;
	}

	html body.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper.swiper-initialized .swiper-button svg {
		width: 13px !important;
		height: 13px !important;
		stroke-width: 2.2 !important;
	}
}

@keyframes gzPswpBackdropIn {
	from { opacity: 0; }
	to   { opacity: 1; }
}

@keyframes gzPswpBackdropOut {
	from { opacity: 1; }
	to   { opacity: 0; }
}

@keyframes gzPswpStageIn {
	from {
		opacity: 0;
		filter: blur(10px);
	}
	to {
		opacity: 1;
		filter: blur(0);
	}
}

@keyframes gzPswpStageOut {
	from {
		opacity: 1;
		filter: blur(0);
	}
	to {
		opacity: 0;
		filter: blur(10px);
	}
}

@keyframes gzPswpChromeIn {
	from {
		opacity: 0;
		filter: blur(8px);
	}
	to {
		opacity: 1;
		filter: blur(0);
	}
}

@keyframes gzPswpChromeOut {
	from {
		opacity: 1;
		filter: blur(0);
	}
	to {
		opacity: 0;
		filter: blur(8px);
	}
}

/* ----- G) Single product variable mobile overflow + extra actions ------- */
html body.single-product div.product .product-featured-icons--mobile,
html body.single-product div.product form.cart .product-featured-icons--single-product {
	display: none !important;
}

html body.single-product div.product .glozin-product-extra-link {
	display: flex !important;
	align-items: center !important;
	justify-content: flex-start !important;
	flex-wrap: nowrap !important;
	gap: 10px 18px !important;
	min-width: 0 !important;
}

html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	flex: 0 1 auto !important;
	width: auto !important;
	height: auto !important;
	min-height: 0 !important;
	min-width: 0 !important;
	max-width: none !important;
	margin: 0 !important;
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent !important;
	box-shadow: none !important;
	color: var(--gz-color-base) !important;
	font-size: 14px !important;
	font-weight: 500 !important;
	line-height: 1.2 !important;
	letter-spacing: 0 !important;
	text-transform: none !important;
	white-space: nowrap !important;
	gap: 10px !important;
	-webkit-text-fill-color: currentColor !important;
	transition: color 0.25s cubic-bezier(0.7, 0, 0.3, 1) !important;
}

html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item:hover,
html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item:focus-visible {
	color: #111111 !important;
}

html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item .glozin-svg-icon,
html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item svg,
html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item [class$="__icon"] {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	flex: 0 0 auto !important;
	width: 16px !important;
	height: 16px !important;
	font-size: 16px !important;
	margin: 0 !important;
	color: currentColor !important;
	position: relative !important;
	overflow: visible !important;
	transition: color 0.25s cubic-bezier(0.7, 0, 0.3, 1) !important;
}

html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item svg {
	width: 16px !important;
	height: 16px !important;
}

html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item:hover svg:not(.product__wishlist-check),
html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item:focus-visible svg:not(.product__wishlist-check) {
	stroke-width: 2.2 !important;
}

/* Pin the V check SVG to its own slim stroke even when the parent
   extra-link rule above tries to thicken every SVG on hover. The
   bolded check looked clunky next to the slim heart/compare outlines. */
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action svg.product__wishlist-check,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action:hover svg.product__wishlist-check,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action:focus-visible svg.product__wishlist-check {
	stroke-width: 1.7 !important;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action .wcboost-wishlist-button__text,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action .wcboost-products-compare-button__text {
	display: inline !important;
	position: static !important;
	width: auto !important;
	height: auto !important;
	clip: auto !important;
	clip-path: none !important;
	overflow: visible !important;
	opacity: 1 !important;
	visibility: visible !important;
	text-indent: 0 !important;
	font-size: inherit !important;
	line-height: inherit !important;
	text-transform: none !important;
}

html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item .btn-fill,
html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item::after,
html body.single-product div.product .glozin-product-extra-link .gz-tooltip::after,
html body.single-product div.product .glozin-product-extra-link .gz-tooltip::before,
html body.single-product div.product .glozin-product-extra-link .gz-tooltip-inside::after,
html body.single-product div.product .glozin-product-extra-link .gz-tooltip-inside::before {
	display: none !important;
	content: none !important;
	opacity: 0 !important;
	visibility: hidden !important;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.gz-action-just-clicked {
	animation: gzExtraActionTap 0.34s cubic-bezier(0.22, 1, 0.36, 1);
}

/* The V (check) SVG inside .gz-single-extra-action is `position: absolute`,
   so its container — the WC Boost icon span (`.wcboost-wishlist-button__icon`
   / `.wcboost-products-compare-button__icon`, or the fallback span the JS
   injects) — MUST establish a positioning context AND have an explicit
   16x16 box for the V to center inside. Without this, the V positioned
   itself relative to the whole `.glozin-extra-link-item` button (the
   nearest `position: relative` ancestor), which placed it underneath the
   "Wishlist" / "Compare" text label — the swap was technically firing,
   the user just couldn't see it. */
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action .wcboost-wishlist-button__icon,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action .wcboost-products-compare-button__icon {
	position: relative !important;
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 16px !important;
	height: 16px !important;
	flex: 0 0 auto !important;
	overflow: visible !important;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action .gz-extra-original-icon {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 16px !important;
	height: 16px !important;
	transform: scale(1) rotate(0deg);
	opacity: 1;
	transition:
		opacity 0.28s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.38s cubic-bezier(0.3, 1, 0.3, 1),
		color 0.25s ease !important;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.gz-extra-action-checked .gz-extra-original-icon {
	transform: scale(0.3) rotate(-45deg);
	opacity: 0;
	pointer-events: none;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action svg.product__wishlist-check {
	position: absolute !important;
	top: 50% !important;
	left: 50% !important;
	width: 16px !important;
	height: 16px !important;
	transform: translate(-50%, -50%) scale(0.3) rotate(25deg);
	opacity: 0;
	color: inherit;
	z-index: 2;
	pointer-events: none;
	transition:
		opacity 0.28s cubic-bezier(0.3, 1, 0.3, 1),
		transform 0.42s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.gz-extra-action-checked svg.product__wishlist-check {
	transform: translate(-50%, -50%) scale(1) rotate(0deg);
	opacity: 1;
}

html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.gz-extra-action-checked.product__wishlist-pill--pulse svg.product__wishlist-check {
	animation: wishlistCheckPulse 0.42s cubic-bezier(0.3, 1, 0.3, 1);
}

@keyframes gzExtraActionTap {
	0% { transform: scale(1); }
	45% { transform: scale(0.94); }
	100% { transform: scale(1); }
}

/* ----- H) Concept-style product tabs ----------------------------------- */
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper {
	--gz-tabs-pill-bg: rgba(17, 17, 17, 0.06);
	--gz-tabs-pill-bg-hover: #111111;
	--gz-tabs-pill-text: #171717;
	--gz-tabs-pill-text-hover: #ffffff;
	padding: clamp(22px, 3vw, 38px) 0 50px !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper::after {
	display: none !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs {
	display: inline-flex !important;
	align-items: center !important;
	gap: 6px !important;
	width: auto !important;
	max-width: 100% !important;
	margin: 0 0 clamp(24px, 3vw, 38px) !important;
	padding: 6px !important;
	border: 1px solid rgba(17, 17, 17, 0.08) !important;
	border-radius: 999px !important;
	background: rgba(255, 255, 255, 0.72) !important;
	-webkit-backdrop-filter: blur(16px) saturate(160%) !important;
	backdrop-filter: blur(16px) saturate(160%) !important;
	box-shadow:
		0 18px 50px rgba(0, 0, 0, 0.06),
		inset 0 1px 0 rgba(255, 255, 255, 0.68) !important;
	overflow-x: auto !important;
	scrollbar-width: none;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs::-webkit-scrollbar {
	display: none;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li {
	flex: 0 0 auto !important;
	margin: 0 !important;
	padding: 0 !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	min-height: 42px !important;
	padding: 0 20px !important;
	border-radius: 999px !important;
	background: transparent !important;
	color: var(--gz-tabs-pill-text) !important;
	font-size: 14px !important;
	font-weight: 600 !important;
	line-height: 1 !important;
	letter-spacing: 0 !important;
	white-space: nowrap !important;
	overflow: hidden !important;
	position: relative !important;
	transition:
		background-color 0.42s cubic-bezier(0.22, 1, 0.36, 1),
		color 0.26s cubic-bezier(0.7, 0, 0.3, 1),
		transform 0.42s cubic-bezier(0.22, 1, 0.36, 1),
		box-shadow 0.42s cubic-bezier(0.22, 1, 0.36, 1) !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a::after {
	display: none !important;
	content: none !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a .btn-text {
	display: block;
	transition:
		transform 0.48s cubic-bezier(0.22, 1, 0.36, 1),
		opacity 0.36s cubic-bezier(0.7, 0, 0.3, 1);
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a .btn-duplicate {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: inherit;
	transform: translate3d(0, 112%, 0);
	opacity: 0;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a:hover,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a:focus-visible,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li.active a {
	background: var(--gz-tabs-pill-bg-hover) !important;
	color: var(--gz-tabs-pill-text-hover) !important;
	transform: translate3d(0, -1px, 0);
	box-shadow: 0 12px 30px rgba(0, 0, 0, 0.12) !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a:hover .btn-text:first-child,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a:focus-visible .btn-text:first-child,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li.active a .btn-text:first-child {
	transform: translate3d(0, -112%, 0);
	opacity: 0;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a:hover .btn-duplicate,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a:focus-visible .btn-duplicate,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li.active a .btn-duplicate {
	transform: translate3d(0, 0, 0);
	opacity: 1;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tab {
	border: 1px solid rgba(17, 17, 17, 0.08) !important;
	border-radius: 28px !important;
	background: #ffffff !important;
	padding: clamp(22px, 3vw, 38px) !important;
	box-shadow: 0 24px 70px rgba(0, 0, 0, 0.05) !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper #reviews .woocommerce-noreviews,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .woocommerce-Reviews .woocommerce-noreviews {
	display: inline-flex !important;
	align-items: center !important;
	gap: 10px !important;
	max-width: 100% !important;
	margin: 0 !important;
	padding: 12px 18px !important;
	border: 1px solid rgba(17, 17, 17, 0.08) !important;
	border-radius: 999px !important;
	background: rgba(255, 255, 255, 0.76) !important;
	-webkit-backdrop-filter: blur(16px) saturate(160%) !important;
	backdrop-filter: blur(16px) saturate(160%) !important;
	box-shadow:
		0 16px 42px rgba(0, 0, 0, 0.06),
		inset 0 1px 0 rgba(255, 255, 255, 0.72) !important;
	color: #171717 !important;
	font-size: 14px !important;
	font-weight: 650 !important;
	line-height: 1.25 !important;
	letter-spacing: 0 !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper #reviews .woocommerce-noreviews::before,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .woocommerce-Reviews .woocommerce-noreviews::before {
	content: '' !important;
	width: 8px !important;
	height: 8px !important;
	flex: 0 0 8px !important;
	border-radius: 999px !important;
	background: #111111 !important;
	box-shadow: 0 0 0 5px rgba(17, 17, 17, 0.08) !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper #reviews .woocommerce-noreviews::after,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .woocommerce-Reviews .woocommerce-noreviews::after {
	content: 'Be the first to review this product.' !important;
	color: rgba(23, 23, 23, 0.58) !important;
	font-weight: 500 !important;
}

html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .woocommerce-Tabs-panel.gz-tab-content-enter,
html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tab.gz-tab-content-enter {
	animation: gzProductTabContentIn 0.52s cubic-bezier(0.22, 1, 0.36, 1) both;
	will-change: opacity, filter, transform;
}

@keyframes gzProductTabContentIn {
	from {
		opacity: 0;
		filter: blur(8px);
		transform: translate3d(0, 10px, 0);
	}
	to {
		opacity: 1;
		filter: blur(0);
		transform: translate3d(0, 0, 0);
	}
}

@media (prefers-reduced-motion: reduce) {
	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .woocommerce-Tabs-panel.gz-tab-content-enter,
	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tab.gz-tab-content-enter {
		animation: none !important;
	}
}

@media (max-width: 767px) {
	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs {
		display: flex !important;
		width: 100% !important;
		padding: 5px !important;
	}

	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tabs li a {
		min-height: 38px !important;
		padding: 0 14px !important;
		font-size: 13px !important;
	}

	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .wc-tab {
		border-radius: 22px !important;
	}

	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper #reviews .woocommerce-noreviews,
	html body.single-product div.product .woocommerce-tabs.wc-tabs-wrapper .woocommerce-Reviews .woocommerce-noreviews {
		display: flex !important;
		flex-wrap: wrap !important;
		width: 100% !important;
		border-radius: 22px !important;
	}
}

@media (max-width: 767px) {
	html body.single-product {
		overflow-x: hidden !important;
		width: 100% !important;
		max-width: 100% !important;
	}

	@supports selector(html:has(body.single-product)) {
		html:has(body.single-product) {
			overflow-x: hidden !important;
			width: 100% !important;
			max-width: 100% !important;
		}
	}

	html body.single-product #page,
	html body.single-product .site,
	html body.single-product .site-content,
	html body.single-product .site-header,
	html body.single-product .site-header__mobile,
	html body.single-product div.product,
	html body.single-product div.product .product-gallery-summary,
	html body.single-product div.product .woocommerce-product-gallery,
	html body.single-product div.product .woocommerce-product-gallery__wrapper,
	html body.single-product div.product .entry-summary,
	html body.single-product div.product form.cart,
	html body.single-product div.product form.variations_form,
	html body.single-product div.product table.variations,
	html body.single-product div.product .variations,
	html body.single-product div.product .variations tr,
	html body.single-product div.product .variations td,
	html body.single-product div.product .variations .value,
	html body.single-product div.product .wcboost-variation-swatches,
	html body.single-product div.product .variable-items-wrapper,
	html body.single-product div.product .product-gallery-summary .swiper,
	html body.single-product div.product .product-gallery-summary .swiper-wrapper {
		max-width: 100% !important;
		min-width: 0 !important;
		box-sizing: border-box !important;
	}

	html body.single-product div.product.product-type-variable,
	html body.single-product div.product.product-type-variable .product-gallery-summary,
	html body.single-product div.product.product-type-variable .entry-summary,
	html body.single-product div.product.product-type-variable form.variations_form {
		overflow-x: clip !important;
	}

	@supports not (overflow: clip) {
		html body.single-product div.product.product-type-variable,
		html body.single-product div.product.product-type-variable .product-gallery-summary,
		html body.single-product div.product.product-type-variable .entry-summary,
		html body.single-product div.product.product-type-variable form.variations_form {
			overflow-x: hidden !important;
		}
	}

	html body.single-product div.product table.variations {
		width: 100% !important;
		table-layout: fixed !important;
	}

	html body.single-product div.product .variations .value,
	html body.single-product div.product .wcboost-variation-swatches,
	html body.single-product div.product .variable-items-wrapper {
		display: flex !important;
		flex-wrap: wrap !important;
		gap: 8px !important;
	}

	html body.single-product div.product .glozin-product-extra-link {
		justify-content: space-between !important;
		gap: 0 !important;
		width: 100% !important;
		padding-bottom: 18px !important;
	}

	html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item {
		flex: 0 1 auto !important;
		gap: 7px !important;
		font-size: clamp(11px, 3.05vw, 13px) !important;
	}

	html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item .glozin-svg-icon,
	html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item svg,
	html body.single-product div.product .glozin-product-extra-link .glozin-extra-link-item [class$="__icon"] {
		width: 14px !important;
		height: 14px !important;
		font-size: 14px !important;
	}
}

html body #glozin-sticky-add-to-cart .container,
html body .glozin-sticky-add-to-cart .container {
	max-width: 100% !important;
}

html body #glozin-sticky-add-to-cart .single_add_to_cart_button,
html body #glozin-sticky-add-to-cart .gz-buy-now-button,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button,
html body .glozin-sticky-add-to-cart .gz-buy-now-button {
	min-height: 50px !important;
	border-radius: 30px !important;
	background-color: #111111 !important;
	border-color: #111111 !important;
	color: #ffffff !important;
	-webkit-text-fill-color: #ffffff !important;
	transition:
		color 0.3s cubic-bezier(0.7, 0, 0.3, 1),
		background-color 0.3s cubic-bezier(0.7, 0, 0.3, 1),
		border-color 0.3s cubic-bezier(0.7, 0, 0.3, 1) !important;
}

html body #glozin-sticky-add-to-cart .single_add_to_cart_button .btn-fill,
html body #glozin-sticky-add-to-cart .gz-buy-now-button .btn-fill,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button .btn-fill,
html body .glozin-sticky-add-to-cart .gz-buy-now-button .btn-fill {
	background-color: #ffffff !important;
	z-index: 0 !important;
}

html body #glozin-sticky-add-to-cart .single_add_to_cart_button:hover,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button:active,
html body #glozin-sticky-add-to-cart .single_add_to_cart_button:focus-visible,
html body #glozin-sticky-add-to-cart .gz-buy-now-button:hover,
html body #glozin-sticky-add-to-cart .gz-buy-now-button:active,
html body #glozin-sticky-add-to-cart .gz-buy-now-button:focus-visible,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button:hover,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button:active,
html body .glozin-sticky-add-to-cart .single_add_to_cart_button:focus-visible,
html body .glozin-sticky-add-to-cart .gz-buy-now-button:hover,
html body .glozin-sticky-add-to-cart .gz-buy-now-button:active,
html body .glozin-sticky-add-to-cart .gz-buy-now-button:focus-visible {
	color: #111111 !important;
	-webkit-text-fill-color: #111111 !important;
}

html body #glozin-sticky-add-to-cart .single_add_to_cart_button:hover *:not(.gz-ios-loader):not(.btn-fill),
html body #glozin-sticky-add-to-cart .gz-buy-now-button:hover *:not(.gz-ios-loader):not(.btn-fill),
html body .glozin-sticky-add-to-cart .single_add_to_cart_button:hover *:not(.gz-ios-loader):not(.btn-fill),
html body .glozin-sticky-add-to-cart .gz-buy-now-button:hover *:not(.gz-ios-loader):not(.btn-fill) {
	color: #111111 !important;
	-webkit-text-fill-color: #111111 !important;
}

@media (max-width: 767px) {
	html body #glozin-sticky-add-to-cart,
	html body .glozin-sticky-add-to-cart {
		left: 0 !important;
		right: 0 !important;
		width: 100% !important;
		max-width: 100% !important;
		border-left: 0 !important;
		border-right: 0 !important;
		border-radius: var(--gz-header-blur-radius) var(--gz-header-blur-radius) 0 0 !important;
		transform: translate3d(0, calc(100% + 18px), 0) !important;
	}

	html body #glozin-sticky-add-to-cart.open,
	html body .glozin-sticky-add-to-cart.open {
		transform: translate3d(0, 0, 0) !important;
	}

	html body #glozin-sticky-add-to-cart .container,
	html body .glozin-sticky-add-to-cart .container {
		width: 100% !important;
		max-width: 100% !important;
		padding-left: 14px !important;
		padding-right: 14px !important;
	}
}

html body .glozin-sticky-atc__variations {
	position: relative;
	z-index: 20;
}

html body .glozin-sticky-atc__variations select.gz-sticky-variation-native {
	position: absolute !important;
	width: 1px !important;
	height: 1px !important;
	padding: 0 !important;
	margin: -1px !important;
	overflow: hidden !important;
	clip: rect(0, 0, 0, 0) !important;
	white-space: nowrap !important;
	border: 0 !important;
	opacity: 0 !important;
	pointer-events: none !important;
}

html body .gz-sticky-variation-slot {
	position: relative;
	width: 260px;
	height: 44px;
	flex: 0 0 auto;
}

html body .gz-sticky-variation-form {
	position: absolute !important;
	right: 0 !important;
	bottom: 0 !important;
	width: 260px !important;
	height: 44px !important;
	background-color: #ffffff !important;
	border: 1px solid #111111 !important;
	border-radius: 30px !important;
	box-shadow: none !important;
	overflow: hidden !important;
	z-index: 40;
	transition:
		width 0.5s cubic-bezier(0.3, 1, 0.3, 1),
		height 0.5s cubic-bezier(0.3, 1, 0.3, 1),
		border-radius 0.5s cubic-bezier(0.3, 1, 0.3, 1),
		box-shadow 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
}

html body .gz-sticky-variation-form.glozin-active {
	width: 320px !important;
	height: min(340px, 62vh) !important;
	border-radius: 24px !important;
	box-shadow: 0 18px 48px rgba(0, 0, 0, 0.16), 0 2px 8px rgba(0, 0, 0, 0.06) !important;
	z-index: 80;
}

html body .gz-sticky-variation-default {
	display: flex !important;
	align-items: center !important;
	justify-content: flex-start !important;
	gap: 6px !important;
	width: 100% !important;
	height: 44px !important;
	padding: 0 56px 0 20px !important;
	background: transparent !important;
	color: #111111 !important;
	font-size: 14px !important;
	font-weight: 500 !important;
	border: 0 !important;
	cursor: pointer !important;
	white-space: nowrap !important;
	overflow: hidden !important;
	position: relative !important;
}

html body .gz-sticky-variation-label {
	opacity: 0.7;
	flex: 0 0 auto;
	transition: opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1);
}

html body .gz-sticky-variation-name {
	flex: 1 1 auto;
	overflow: hidden !important;
	text-overflow: ellipsis !important;
	white-space: nowrap !important;
	font-weight: 600 !important;
	transition: opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1);
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-label {
	opacity: 0.4;
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-name {
	opacity: 0;
}

html body .gz-sticky-variation-chevron {
	position: absolute !important;
	right: 22px !important;
	top: 50% !important;
	transform: translateY(-50%) !important;
	display: inline-flex !important;
	color: inherit !important;
	transition: opacity 0.3s cubic-bezier(0.7, 0, 0.3, 1), transform 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
}

html body .gz-sticky-variation-chevron svg {
	width: 12px !important;
	height: 8px !important;
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-chevron {
	opacity: 0;
	transform: translateY(-50%) rotate(-180deg) !important;
}

html body .gz-sticky-variation-close {
	position: absolute !important;
	right: 14px !important;
	top: 50% !important;
	width: 32px !important;
	height: 32px !important;
	border-radius: 50% !important;
	background-color: #111111 !important;
	color: #ffffff !important;
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	transform: translateY(-50%) scale(0) rotate(0deg) !important;
	transition: transform 0.5s cubic-bezier(0.3, 1, 0.3, 1) !important;
	pointer-events: none;
	z-index: 3;
}

html body .gz-sticky-variation-close svg {
	width: 12px !important;
	height: 12px !important;
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-close {
	transform: translateY(-50%) scale(1) rotate(-90deg) !important;
}

html body .gz-sticky-variation-list {
	position: absolute !important;
	top: 58px !important;
	left: 22px !important;
	right: 22px !important;
	bottom: 18px !important;
	margin: 0 !important;
	padding: 0 4px 0 0 !important;
	list-style: none !important;
	background: transparent !important;
	overflow-y: auto !important;
	opacity: 0 !important;
	visibility: hidden !important;
	pointer-events: none !important;
	scrollbar-width: thin;
	transition:
		opacity 0.5s cubic-bezier(0.3, 1, 0.3, 1),
		visibility 0s linear 0.5s !important;
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list {
	opacity: 1 !important;
	visibility: visible !important;
	pointer-events: auto !important;
	transition:
		opacity 0.5s cubic-bezier(0.3, 1, 0.3, 1),
		visibility 0s linear 0s !important;
}

html body .gz-sticky-variation-list > li {
	margin: 0 !important;
	padding: 0 !important;
	opacity: 0;
	transition: opacity 0.7s ease-out;
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li {
	opacity: 1;
}

html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(1) { transition-delay: 0.06s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(2) { transition-delay: 0.11s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(3) { transition-delay: 0.16s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(4) { transition-delay: 0.21s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(5) { transition-delay: 0.26s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(6) { transition-delay: 0.31s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(7) { transition-delay: 0.36s; }
html body .gz-sticky-variation-form.glozin-active .gz-sticky-variation-list > li:nth-child(8) { transition-delay: 0.41s; }

html body .gz-sticky-variation-item {
	display: block !important;
	width: 100% !important;
	padding: 8px 0 !important;
	background: transparent !important;
	border: 0 !important;
	color: #555555 !important;
	font-size: 14px !important;
	font-weight: 500 !important;
	line-height: 1.35 !important;
	text-align: left !important;
	transition: color 0.3s cubic-bezier(0.7, 0, 0.3, 1), opacity 0.3s ease !important;
}

html body .gz-sticky-variation-item:hover,
html body .gz-sticky-variation-item:focus-visible {
	color: #111111 !important;
}

html body .gz-sticky-variation-item.selected {
	color: #111111 !important;
	font-weight: 600 !important;
	opacity: 0.42;
}

@media (max-width: 767px) {
	html body #glozin-sticky-add-to-cart .glozin-sticky-atc__content,
	html body .glozin-sticky-add-to-cart .glozin-sticky-atc__content {
		width: 100% !important;
		padding-top: 14px !important;
		padding-bottom: 14px !important;
	}

	html body #glozin-sticky-add-to-cart .glozin-sticky-atc__actions,
	html body #glozin-sticky-add-to-cart .glozin-sticky-atc__actions form,
	html body .glozin-sticky-add-to-cart .glozin-sticky-atc__actions,
	html body .glozin-sticky-add-to-cart .glozin-sticky-atc__actions form {
		width: 100% !important;
		max-width: 100% !important;
		margin-left: 0 !important;
		margin-right: 0 !important;
		align-items: stretch !important;
	}

	html body #glozin-sticky-add-to-cart .glozin-sticky-atc__variations,
	html body .glozin-sticky-add-to-cart .glozin-sticky-atc__variations {
		width: 100% !important;
		max-width: 100% !important;
		display: flex !important;
		justify-content: center !important;
		z-index: 70;
	}

	html body .gz-sticky-variation-slot,
	html body .gz-sticky-variation-form {
		width: 100% !important;
		max-width: min(430px, calc(100vw - 28px)) !important;
		margin-left: auto !important;
		margin-right: auto !important;
	}

	html body .gz-sticky-variation-slot {
		height: 44px !important;
	}

	html body .gz-sticky-variation-form.glozin-active {
		width: min(430px, calc(100vw - 28px)) !important;
		max-width: calc(100vw - 28px) !important;
		height: min(300px, 46vh) !important;
		left: 50% !important;
		right: auto !important;
		bottom: 0 !important;
		transform: translateX(-50%) !important;
	}

	html body .gz-sticky-variation-default {
		font-size: 13px !important;
		padding-left: 18px !important;
	}

	html body .gz-sticky-variation-list {
		top: 54px !important;
		left: 18px !important;
		right: 18px !important;
		bottom: 14px !important;
		-webkit-overflow-scrolling: touch;
		overscroll-behavior: contain;
	}

	html body .gz-sticky-variation-item {
		font-size: 13px !important;
		padding: 7px 0 !important;
	}

	html body #glozin-sticky-add-to-cart .glozin-sticky-atc__buttons,
	html body .glozin-sticky-add-to-cart .glozin-sticky-atc__buttons {
		width: 100% !important;
		max-width: 430px !important;
		margin-left: auto !important;
		margin-right: auto !important;
	}
}

/* ----- E) Sticky filter button (drawer in/out) ------------------ */
/* The button is created and inserted at `<body>` level by JS so it
   participates in viewport-fixed positioning regardless of any
   Elementor / page-builder containers. */
.gz-sticky-filter {
	position: fixed;
	left: 0;
	top: 50%;
	transform: translate(-100%, -50%);
	z-index: 950;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 44px;
	padding: 0 18px 0 14px;
	background-color: #111111;
	color: #ffffff;
	border: 0;
	border-radius: 0 30px 30px 0;
	font-size: 13px;
	font-weight: 600;
	letter-spacing: -0.2px;
	box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
	cursor: pointer;
	transition: transform 0.45s cubic-bezier(0.3, 1, 0.3, 1);
	white-space: nowrap;
	pointer-events: none;
}
.gz-sticky-filter--visible {
	transform: translate(0, -50%);
	pointer-events: auto;
}
.gz-sticky-filter:hover {
	background-color: #222;
}
.gz-sticky-filter__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: inherit;
}
.gz-sticky-filter__icon svg {
	width: 14px;
	height: 13px;
	color: inherit;
}
.gz-sticky-filter__label {
	display: inline-block;
	color: inherit;
	line-height: 1;
}
@media (max-width: 1024px) {
	.gz-sticky-filter {
		height: 40px;
		padding: 0 14px 0 12px;
		font-size: 12px;
		gap: 6px;
	}
}

/* The desktop sort-by pill / Sort/Filter chips would compete for
   the same edge during drawer reveal — push the sticky filter ABOVE
   the bottom nav on mobile (z 1000 → ours 1020) so it isn't hidden. */
@media (max-width: 1199px) {
	.gz-sticky-filter {
		z-index: 1020;
	}
}

/* ----- Sticky add-to-cart open/close animation -------------------------
   Root cause of the "no close animation" bug (fully verified against
   the live deployed plugin at
   /wp-content/plugins/glozin-addons/modules/sticky-add-to-cart/):

   The bar's markup is:
     <section class="glozin-sticky-add-to-cart ... z-n1 pe-none ...">
   and the plugin CSS is:
     .glozin-sticky-add-to-cart   { transition: transform .3s;
                                    opacity: 0;
                                    transform: translate3d(0,100%,0); }
     .glozin-sticky-add-to-cart.open { opacity: 1; z-index: 800;
                                       transform: translate3d(0,0,0);
                                       pointer-events: auto;
                                       overflow: initial; }

   Two things made the close *appear* instant even though the transform
   was running:

   (1) `transition` only lists `transform`. opacity flipped 1→0 in one
       frame, so the bar went transparent before the slide could be
       seen.
   (2) On `.open` removal, `z-index` reverts from 800 to the markup's
       Bootstrap `z-n1` utility (z-index: -1). A position:fixed element
       at z-index:-1 stacks *behind* the body's painting context — the
       bar is occluded by the page background instantly, regardless of
       whatever its transform/opacity are doing.

   Fix: transition opacity alongside transform, AND keep z-index high
   enough during the close. Setting it to 800 unconditionally is safe
   because `pointer-events: none` (from the `pe-none` utility) already
   prevents the closed bar from intercepting clicks. */
html body #glozin-sticky-add-to-cart,
html body .glozin-sticky-add-to-cart {
	transition:
		transform 420ms cubic-bezier(0.22, 1, 0.36, 1),
		opacity 420ms cubic-bezier(0.22, 1, 0.36, 1) !important;
	will-change: transform, opacity;
	z-index: 800 !important;
}

/* ----- Wishlist / Compare loading-spin conflict ------------------------
   Root cause of the "icons spinning weirdly" bug:

   wcboost-wishlist/assets/css/wishlist.css ships with:
     .wcboost-wishlist-button.loading .wcboost-wishlist-button__icon svg {
         animation: wcboost-spin .75s linear infinite;
     }

   That selector matches EVERY <svg> inside the icon span — both the
   original heart we wrap in `.gz-extra-original-icon` AND our injected
   `.product__wishlist-check` overlay. Combined with our own scale +
   rotate transitions on those same elements, the result is the V (and
   the heart underneath it) tumbling around while the AJAX request is
   in flight. Disabling the plugin's spin on these specific buttons
   keeps the V/heart morph clean and stationary; the V appearing IS the
   "I heard your click" feedback, so we don't need a separate spinner. */
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.loading .wcboost-wishlist-button__icon svg,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.loading .wcboost-products-compare-button__icon svg,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.loading .wcboost-wishlist-button__icon svg *,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.loading .wcboost-products-compare-button__icon svg *,
html body.single-product div.product .glozin-product-extra-link .gz-single-extra-action.loading svg {
	animation: none !important;
	transform-origin: center center !important;
}

/* ----- FunnelKit checkout conflict fixes -------------------------------
   FunnelKit renders its own compact order-summary thumbnail with the
   quantity badge. Glozin also injects a checkout thumbnail into the cart item
   name via `woocommerce_cart_item_name`; the PHP hook removal in functions.php
   prevents that duplicate, and these CSS rules are a defensive fallback for
   cached fragments already carrying the old markup. */
html body #wfacp-e-form .wfacp_order_summary .wfacp_order_summary_item_name .checkout-review-product-image,
html body #wfacp-e-form .wfacp_order_summary .wfacp_order_summary_item_name .checkout-review-product-price {
	display: none !important;
}

html body #wfacp-e-form .wfacp_order_summary .product-image,
html body #wfacp-e-form .wfacp_order_summary .product-image .wfacp-pro-thumb {
	width: 48px !important;
	min-width: 48px !important;
	max-width: 48px !important;
	height: 48px !important;
}

html body #wfacp-e-form .wfacp_order_summary .product-image img {
	width: 48px !important;
	height: 48px !important;
	max-width: 48px !important;
	object-fit: cover !important;
	border-radius: 6px !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"] {
	position: absolute !important;
	width: 16px !important;
	min-width: 16px !important;
	height: 16px !important;
	margin: 0 !important;
	padding: 0 !important;
	border: 1px solid #111111 !important;
	border-radius: 4px !important;
	background: #ffffff !important;
	box-shadow: none !important;
	appearance: none !important;
	-webkit-appearance: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]::before {
	display: none !important;
	content: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]::after {
	content: "" !important;
	position: absolute !important;
	display: block !important;
	left: 4px !important;
	top: 1px !important;
	width: 5px !important;
	height: 9px !important;
	border: solid #ffffff !important;
	border-width: 0 2px 2px 0 !important;
	opacity: 0 !important;
	transform: rotate(45deg) scale(0.8) !important;
	transition: opacity 0.12s ease, transform 0.12s ease !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:checked {
	background: #111111 !important;
	border-color: #111111 !important;
	border-width: 1px !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:checked::after {
	opacity: 1 !important;
	transform: rotate(45deg) scale(1) !important;
}

html body #wfacp-e-form .woocommerce-form-login-toggle ~ .woocommerce-form-login-toggle,
html body #wfacp-e-form .wfacp-coupon-section .woocommerce-form-login-toggle ~ .woocommerce-form-login-toggle {
	display: none !important;
}

/* FunnelKit checkout place-order button: keep the icon stable and transparent.
   The checkout builder injects its icon with pseudo-elements; Glozin's shared
   button hover styles can give that pseudo-element a dark fill and move it. */
html body #wfacp-e-form .wfacp_main_form.woocommerce button#place_order,
html body #wfacp-e-form .wfacp_main_form.woocommerce .button.button#place_order,
html body #wfacp-e-form .wfacp_main_form.woocommerce #payment button#place_order {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	gap: 8px !important;
	overflow: hidden !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce button#place_order .btn-fill,
html body #wfacp-e-form .wfacp_main_form.woocommerce .button.button#place_order .btn-fill,
html body #wfacp-e-form .wfacp_main_form.woocommerce #payment button#place_order .btn-fill {
	display: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce button#place_order::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce button#place_order::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce .button.button#place_order::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce .button.button#place_order::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #payment button#place_order::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #payment button#place_order::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce button#place_order:hover::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce button#place_order:hover::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce .button.button#place_order:hover::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce .button.button#place_order:hover::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #payment button#place_order:hover::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #payment button#place_order:hover::after {
	background: transparent !important;
	box-shadow: none !important;
	border: 0 !important;
	border-radius: 0 !important;
	transform: none !important;
	animation: none !important;
	text-transform: none !important;
}

/* Terms checkbox: draw the checked state on the label text instead of relying
   on input pseudo-elements, which are unreliable across browser/theme combos. */
html body #wfacp-e-form .wfacp_main_form.woocommerce #terms {
	position: absolute !important;
	left: 0 !important;
	top: 2px !important;
	z-index: 2 !important;
	width: 18px !important;
	min-width: 18px !important;
	height: 18px !important;
	margin: 0 !important;
	opacity: 0 !important;
	cursor: pointer !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms_field label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label.woocommerce-form__label-for-checkbox {
	position: relative !important;
	display: block !important;
	padding-left: 28px !important;
	cursor: pointer !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms + .woocommerce-terms-and-conditions-checkbox-text {
	position: relative !important;
	display: inline !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms + .woocommerce-terms-and-conditions-checkbox-text::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label:has(#terms) .woocommerce-terms-and-conditions-checkbox-text::before {
	content: "" !important;
	position: absolute !important;
	left: -28px !important;
	top: 1px !important;
	width: 16px !important;
	height: 16px !important;
	border: 1px solid #111111 !important;
	border-radius: 4px !important;
	background: #ffffff !important;
	box-shadow: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms + .woocommerce-terms-and-conditions-checkbox-text::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label:has(#terms) .woocommerce-terms-and-conditions-checkbox-text::after {
	content: "" !important;
	position: absolute !important;
	left: -23px !important;
	top: 3px !important;
	width: 5px !important;
	height: 9px !important;
	border: solid #ffffff !important;
	border-width: 0 2px 2px 0 !important;
	opacity: 0 !important;
	transform: rotate(45deg) !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms:checked + .woocommerce-terms-and-conditions-checkbox-text::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label:has(#terms:checked) .woocommerce-terms-and-conditions-checkbox-text::before {
	background: #111111 !important;
	border-color: #111111 !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms:checked + .woocommerce-terms-and-conditions-checkbox-text::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label:has(#terms:checked) .woocommerce-terms-and-conditions-checkbox-text::after {
	opacity: 1 !important;
}

/* Terms checkbox final override: keep the real WooCommerce/FunnelKit input
   visible and draw the check mark on the input itself. This supersedes the
   label-generated marker above, which can miss if checkout markup changes. */
html body #wfacp-e-form .wfacp_main_form.woocommerce #terms_field,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper .form-row {
	position: relative !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms_field label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label.woocommerce-form__label-for-checkbox {
	position: relative !important;
	display: inline-flex !important;
	align-items: flex-start !important;
	gap: 10px !important;
	padding-left: 0 !important;
	cursor: pointer !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms {
	position: relative !important;
	left: auto !important;
	top: 2px !important;
	z-index: 1 !important;
	display: inline-block !important;
	flex: 0 0 18px !important;
	width: 18px !important;
	min-width: 18px !important;
	max-width: 18px !important;
	height: 18px !important;
	min-height: 18px !important;
	max-height: 18px !important;
	margin: 0 !important;
	padding: 0 !important;
	opacity: 1 !important;
	cursor: pointer !important;
	border: 1px solid #111111 !important;
	border-radius: 4px !important;
	background-color: #ffffff !important;
	background-image: none !important;
	background-position: center !important;
	background-repeat: no-repeat !important;
	background-size: 12px 12px !important;
	box-shadow: none !important;
	appearance: none !important;
	-webkit-appearance: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms + .woocommerce-terms-and-conditions-checkbox-text {
	position: static !important;
	display: inline !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms + .woocommerce-terms-and-conditions-checkbox-text::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #terms + .woocommerce-terms-and-conditions-checkbox-text::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label:has(#terms) .woocommerce-terms-and-conditions-checkbox-text::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label:has(#terms) .woocommerce-terms-and-conditions-checkbox-text::after {
	display: none !important;
	content: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms:checked {
	background-color: #111111 !important;
	border-color: #111111 !important;
	background-image: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 7.1 5.8 10 11 4' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
}

/* Unified FunnelKit checkout checkbox rendering. Keep the real inputs visible
   and remove every pseudo-element checkmark so we never show two icons. */
html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:not(.wfacp_product_switch) {
	position: relative !important;
	left: auto !important;
	top: 2px !important;
	z-index: 1 !important;
	display: inline-block !important;
	flex: 0 0 18px !important;
	width: 18px !important;
	min-width: 18px !important;
	max-width: 18px !important;
	height: 18px !important;
	min-height: 18px !important;
	max-height: 18px !important;
	margin: 0 10px 0 0 !important;
	padding: 0 !important;
	opacity: 1 !important;
	cursor: pointer !important;
	border: 1px solid #111111 !important;
	border-radius: 4px !important;
	background-color: #ffffff !important;
	background-image: none !important;
	background-position: center !important;
	background-repeat: no-repeat !important;
	background-size: 12px 12px !important;
	box-shadow: none !important;
	vertical-align: top !important;
	appearance: none !important;
	-webkit-appearance: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:not(.wfacp_product_switch)::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:not(.wfacp_product_switch)::after {
	display: none !important;
	content: none !important;
	background: transparent !important;
	border: 0 !important;
	box-shadow: none !important;
	opacity: 0 !important;
	transform: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:not(.wfacp_product_switch):checked {
	background-color: #111111 !important;
	border-color: #111111 !important;
	background-image: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 7.1 5.8 10 11 4' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:not(.wfacp_product_switch) + label,
html body #wfacp-e-form .wfacp_main_form.woocommerce label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce label.woocommerce-form__label-for-checkbox {
	cursor: pointer !important;
}

/* Restore FunnelKit's native form alignment after checkbox rendering fixes. */
html body #wfacp-e-form .wfacp_main_form.woocommerce label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce label.woocommerce-form__label-for-checkbox {
	display: inline !important;
	padding-left: 0 !important;
	margin-left: 0 !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce .wfacp-form-control-wrapper,
html body #wfacp-e-form .wfacp_main_form.woocommerce .form-row,
html body #wfacp-e-form .wfacp_main_form.woocommerce .wfacp_section,
html body #wfacp-e-form .wfacp_main_form.woocommerce .wfacp-form,
html body #wfacp-e-form .wfacp_main_form.woocommerce .wfacp-payment-tab-list,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-checkout-payment {
	margin-left: 0 !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address label,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field label,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field label {
	display: flex !important;
	align-items: flex-start !important;
	gap: 10px !important;
	padding-left: 0 !important;
	margin-left: 0 !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address input[type="checkbox"],
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field input[type="checkbox"],
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field input[type="checkbox"] {
	margin: 2px 0 0 0 !important;
}

/* Checkout checkbox scope correction. The prior broad checkbox rule made
   FunnelKit/extension helper inputs visible, including a stray one near the
   place order button. Keep custom rendering only on the public checkboxes. */
html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"][hidden],
html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"][aria-hidden="true"],
html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"][style*="display: none"],
html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"][style*="display:none"],
html body #wfacp-e-form .wfacp_main_form.woocommerce .place-order > input[type="checkbox"]:not(#terms):not(#billing_same_as_shipping):not(#shipping_same_as_billing):not(#ship-to-different-address-checkbox),
html body #wfacp-e-form .wfacp_main_form.woocommerce .place-order button#place_order ~ input[type="checkbox"]:not(#terms):not(#billing_same_as_shipping):not(#shipping_same_as_billing):not(#ship-to-different-address-checkbox) {
	display: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce input[type="checkbox"]:not(#terms):not(#billing_same_as_shipping):not(#shipping_same_as_billing):not(#ship-to-different-address-checkbox):not([name="billing_same_as_shipping"]):not([name="shipping_same_as_billing"]):not([name="ship_to_different_address"]):not(.wfacp_product_switch) {
	position: static !important;
	left: auto !important;
	top: auto !important;
	z-index: auto !important;
	flex: initial !important;
	width: auto !important;
	min-width: 0 !important;
	max-width: none !important;
	height: auto !important;
	min-height: 0 !important;
	max-height: none !important;
	margin: 0 !important;
	border: initial !important;
	border-radius: initial !important;
	background-color: initial !important;
	background-image: none !important;
	box-shadow: none !important;
	vertical-align: baseline !important;
	appearance: auto !important;
	-webkit-appearance: checkbox !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address-checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="billing_same_as_shipping"],
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="shipping_same_as_billing"],
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="ship_to_different_address"] {
	position: relative !important;
	left: auto !important;
	top: 0 !important;
	z-index: 1 !important;
	display: inline-block !important;
	flex: 0 0 18px !important;
	width: 18px !important;
	min-width: 18px !important;
	max-width: 18px !important;
	height: 18px !important;
	min-height: 18px !important;
	max-height: 18px !important;
	margin: 0 !important;
	padding: 0 !important;
	opacity: 1 !important;
	cursor: pointer !important;
	border: 1px solid #111111 !important;
	border-radius: 4px !important;
	background-color: #ffffff !important;
	background-image: none !important;
	background-position: center !important;
	background-repeat: no-repeat !important;
	background-size: 12px 12px !important;
	box-shadow: none !important;
	vertical-align: middle !important;
	appearance: none !important;
	-webkit-appearance: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #terms::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address-checkbox::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address-checkbox::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="billing_same_as_shipping"]::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="billing_same_as_shipping"]::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="shipping_same_as_billing"]::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="shipping_same_as_billing"]::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="ship_to_different_address"]::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="ship_to_different_address"]::after {
	display: none !important;
	content: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #terms:checked,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping:checked,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing:checked,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address-checkbox:checked,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="billing_same_as_shipping"]:checked,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="shipping_same_as_billing"]:checked,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="ship_to_different_address"]:checked {
	background-color: #111111 !important;
	border-color: #111111 !important;
	background-image: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 7.1 5.8 10 11 4' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce .woocommerce-terms-and-conditions-wrapper label.woocommerce-form__label-for-checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field label,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field label,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address label,
html body #wfacp-e-form .wfacp_main_form.woocommerce .form-row:has(#billing_same_as_shipping),
html body #wfacp-e-form .wfacp_main_form.woocommerce .form-row:has(#shipping_same_as_billing),
html body #wfacp-e-form .wfacp_main_form.woocommerce .form-row:has(#ship-to-different-address-checkbox) {
	display: flex !important;
	align-items: center !important;
	gap: 10px !important;
	padding-left: 0 !important;
	margin-left: 0 !important;
	line-height: 1.4 !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field label::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field label::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field label::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field label::after,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address label::before,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address label::after {
	display: none !important;
	content: none !important;
}

/* The ship-to-different-address checkbox is a hidden WooCommerce state field on
   this FunnelKit layout. It has no label here and must not render below the
   place order button. */
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address,
html body #wfacp-e-form .wfacp_main_form.woocommerce #ship-to-different-address-checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="ship_to_different_address"] {
	display: none !important;
	width: 0 !important;
	min-width: 0 !important;
	max-width: 0 !important;
	height: 0 !important;
	min-height: 0 !important;
	max-height: 0 !important;
	margin: 0 !important;
	padding: 0 !important;
	opacity: 0 !important;
	border: 0 !important;
	background: transparent !important;
	box-shadow: none !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field .woocommerce-input-wrapper,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field .woocommerce-input-wrapper {
	display: block !important;
	width: 100% !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field label.checkbox,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field label.checkbox {
	display: inline-flex !important;
	align-items: center !important;
	gap: 10px !important;
	margin: 0 !important;
	padding: 0 !important;
	vertical-align: middle !important;
}

html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing,
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="billing_same_as_shipping"],
html body #wfacp-e-form .wfacp_main_form.woocommerce input[name="shipping_same_as_billing"] {
	top: 0 !important;
	margin: 0 !important;
	align-self: center !important;
}

/* Align the visible billing-address checkbox with FunnelKit's input control
   edge. The field row itself starts 8px left of the actual text inputs. */
html body #wfacp-e-form .wfacp_main_form.woocommerce #billing_same_as_shipping_field .woocommerce-input-wrapper,
html body #wfacp-e-form .wfacp_main_form.woocommerce #shipping_same_as_billing_field .woocommerce-input-wrapper {
	box-sizing: border-box !important;
	padding-left: 8px !important;
}

/* Hide the fixed Google reCAPTCHA badge on the FunnelKit checkout screen. */
html body.woocommerce-checkout .grecaptcha-badge,
html body.wfacp_checkout-template .grecaptcha-badge,
html body:has(#wfacp-e-form) .grecaptcha-badge {
	visibility: hidden !important;
	opacity: 0 !important;
	pointer-events: none !important;
}
