/*
Theme Name: Vio Shop
Theme URI: https://coma.lv
Author: COMA.LV
Author URI: https://coma.lv
Description: Custom WooCommerce theme for Viola Farma (violafarma.lv).
Version: 0.1.0
License: GNU General Public License v2 or later
License URI: LICENSE
Text Domain: vio-shop
*/

/* ====================================================================
   DESIGN TOKENS — pulled directly from Figma's "Palette and typography"
   page (finalized, confirmed by Vadim/designer). Plain CSS custom
   properties on purpose: no preprocessor, no build step, no framework
   lock-in. Every property name below mirrors Figma's own variable name
   (Greyscale/900 -> --color-grey-900, Title/h1 -> --text-h1, etc.) so
   updating a value here when the design changes is a 1:1 lookup, not a
   guessing game. Mobile type sizes come from Figma's separate Mobile/*
   variable set and are applied via the media query at the bottom — same
   custom property names, different values, so nothing else in the
   stylesheet needs to know or care that a breakpoint exists.
   Source nodes: 515:15978 (colors), 515:15575 (desktop type), 573:20025
   (mobile type) on the violafarma.lv (Copy) Figma file.
   ==================================================================== */
/* ---- Google Sans (SIL Open Font License 1.1 - see assets/fonts/OFL.txt) ----
   Self-hosted, not the Google Fonts CDN: no third-party request, no GDPR
   question about visitor IPs reaching Google, and it works offline/on staging.

   These are the VARIABLE fonts from the official fonts.google.com download,
   subset to Latin + Latin-Ext + Cyrillic (the three site languages: LV needs
   ā ē ī ū ķ ļ ņ š ž ģ from Latin-Ext, RU needs Cyrillic) and converted to
   woff2. 4.8MB TTF -> 143KB woff2 each. One file covers 400-700, so weight
   500 (every heading in the design) is a real weight, not a synthesised one.
   Verified after subsetting: wght axis 400-700 intact, zero missing LV/RU
   glyphs. */
@font-face {
	font-family: "Google Sans";
	src: url("assets/fonts/google-sans-var.woff2") format("woff2-variations");
	font-weight: 400 700;
	font-style: normal;
	font-display: swap;
}

@font-face {
	font-family: "Google Sans";
	src: url("assets/fonts/google-sans-italic-var.woff2") format("woff2-variations");
	font-weight: 400 700;
	font-style: italic;
	font-display: swap;
}

:root {
	/* Greyscale */
	--color-white: #FFFFFF;
	--color-grey-900: #0D1B28;
	--color-grey-700: #5C6974;
	--color-grey-400: #979797;
	--color-grey-200: #EEEEEF;
	--color-grey-100: #F5F4F4;
	--color-grey-50: #F9F9F9;

	/* Brand */
	--color-brand-green: #78BF43;
	--color-brand-blue: #4CBDE3;
	/* Figma "Brand/Green_tp" - the brand green at 10%, used as the callout
	   tint. Deliberately NOT --color-light-green (#E9EEDB, Additional/Light
	   green): that is a separate opaque swatch for the category tiles. */
	--color-brand-green-tp: rgba(120, 191, 67, 0.1);

	/* Additional / accent - not yet used anywhere, defined so they're
	   available the moment a section needs one rather than inventing a
	   one-off hex */
	--color-crimson: #FF3871;
	--color-light-green: #E9EEDB;
	--color-light-blue: #DFEEF5;
	--color-pink: #EB7D8D;
	--color-light-pink: #FBE2E1;
	--color-purple: #B098D8;
	--color-light-purple: #ECE7F6;
	--color-yellow: #F9BF47;
	--color-light-yellow: #FEEFD5;

	/* Google Sans is now genuinely available under the OFL and is self-hosted
	   above - the fallbacks below only cover the moment before the woff2
	   loads, or a failed request. */
	--font-body: "Google Sans", Inter, Roboto, -apple-system, sans-serif;

	/* Titles */
	--text-h1: 500 70px/1.2 var(--font-body);
	--text-h1-italic: italic 400 70px/1.2 var(--font-body);
	--text-h2: 500 56px/1.3 var(--font-body);
	--text-h3: 500 40px/1.3 var(--font-body);
	--text-h4: 500 32px/1.3 var(--font-body);
	--text-h5: 500 24px/1.3 var(--font-body);

	/* Body */
	--text-body-lg: 400 18px/1.4 var(--font-body);
	--text-body-lg-bold: 700 18px/1.4 var(--font-body);
	--text-body-md: 500 14px/1.3 var(--font-body);
	--text-body-regular: 400 14px/1.3 var(--font-body);
	--text-body-default-text: 400 14px/1.4 var(--font-body);
	--text-body-uppercase: 500 14px/1.3 var(--font-body);
	/* Figma's Body/Default_uppercase is 3% tracking, which inspect reports as
	   0.42px on the 14px size (585:16742). This was read as a flat 3px, which
	   is seven times too wide; em keeps it proportional at every size. */
	--text-body-uppercase-tracking: 0.03em;

	/* Caption */
	--text-caption: 400 12px/1.28 var(--font-body);
}

/* Mobile type scale - matches the TZ's own mobile breakpoint (<=767px).
   Same custom property names as above, so every rule using font: var(...)
   anywhere in this file becomes responsive automatically. */
@media (max-width: 767px) {
	:root {
		--text-h1: 500 32px/1.2 var(--font-body);
		--text-h1-italic: italic 400 32px/1.2 var(--font-body);
		--text-h2: 500 24px/1.3 var(--font-body);
		--text-h3: 500 20px/1.3 var(--font-body);
		--text-h4: 500 18px/1.3 var(--font-body);
		--text-body-lg: 400 16px/1.4 var(--font-body);
		--text-body-lg-bold: 700 16px/1.4 var(--font-body);
		--text-caption: 400 10px/1.28 var(--font-body);
	}
}

/* Reserve the scrollbar's width permanently. When a flyout (Katalogs / main
   menu) locks the page with body overflow:hidden, the scrollbar would
   otherwise vanish and the whole page would jump right by its width. With the
   gutter always reserved, hiding the scrollbar changes nothing. */
html {
	scrollbar-gutter: stable;
}

body {
	margin: 0;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	background: var(--color-grey-100);
}

a {
	color: inherit;
	text-decoration: none;
}

.pill-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 100px;
	border: none;
	cursor: pointer;
	font: var(--text-body-md);
	box-sizing: border-box;
}

.pill-btn--icon {
	background: var(--color-grey-100);
	width: 40px;
	height: 40px;
	padding: 0;
}

.pill-btn--primary {
	background: var(--color-brand-blue);
	color: var(--color-white);
	padding: 10px 24px;
	height: 40px;
}

.pill-btn--cta {
	background: var(--color-brand-green);
	color: var(--color-white);
	padding: 10px 24px;
	height: 56px;
	text-transform: uppercase;
	letter-spacing: var(--text-body-uppercase-tracking);
}

/* ---- Site header ---- */
/* Bars keep full-width background on any screen size; .site-header__inner
   caps content at the 1920px Figma canvas width and centers it, so header
   content doesn't stretch to the edges on ultra-wide monitors. */
.site-header__inner {
	max-width: 1920px;
	margin: 0 auto;
}

.site-header__bar {
	background: var(--color-white);
}

.site-header__bar .site-header__inner {
	display: flex;
	align-items: center;
	gap: 24px;
	height: 80px;
	padding: 0 145px;
}

/* Logo + phone + hours stay grouped on the left; the actions cluster is pushed
   to the right edge (Figma groups them, doesn't space-between them evenly). */
.site-header__actions {
	margin-left: auto;
}

.site-header__logo img {
	width: 160px;
	height: 40px;
	object-fit: contain;
	object-position: left center;
	display: block;
}

/* Hamburger relocated into the top bar, next to the logo (Figma 95:2151) -
   reuses the shared grey pill icon-button look. */
.site-header__bar .site-header__menu-trigger {
	width: 68px;
	height: 40px;
	border-radius: 100px;
}

.site-header__bar .site-header__menu-trigger img {
	width: 20px;
	height: 20px;
}

.site-header__actions .pill-btn--icon {
	width: 68px;
	height: 40px;
	background: var(--color-grey-100);
	border-radius: 100px;
}

.site-header__phone {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	background: var(--color-grey-100);
	border-radius: 100px;
	padding: 10px 24px;
	font: var(--text-body-md);
}

.site-header__hours {
	color: var(--color-grey-700);
	font: var(--text-body-regular);
}

.site-header__actions {
	display: flex;
	align-items: center;
	gap: 12px;
}

.site-header__wishlist {
	position: relative;
}

/* ---- Header mini-cart popup (Figma "Cart_pop-up": 201:3224/365:12521/
   365:12491/366:12666). Was previously a bare link straight to /cart/. ---- */
.cart-popup {
	position: relative;
}

.site-header__cart {
	position: relative;
}

.cart-popup__panel {
	position: absolute;
	z-index: 30;
	top: calc(100% + 12px);
	right: 0;
	width: 360px;
	max-width: calc(100vw - 32px);
	background: var(--color-white);
	border-radius: 20px;
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.12);
	padding: 16px;
	box-sizing: border-box;
}

.cart-popup__panel[hidden] {
	display: none;
}

.cart-popup__header {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 16px;
}

.cart-popup__header h2 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0;
}

/* Look comes from the shared .count-badge (Figma 366:12679). */

/* Stock-cap / removal feedback (vio_shop_get_cart_popup_notice()) - re-rendered
   fresh with every fragment refresh, so it naturally clears on the next
   action instead of needing its own dismiss timer. */
.cart-popup__inline-notice {
	margin: 0 0 12px;
	padding: 10px 12px;
	border-radius: 4px;
	background: var(--color-grey-100);
	color: var(--color-grey-900);
	font: var(--text-caption);
}

/* Compact scrollbar, closer to Figma 365:12521 than the OS default. The
   padding-right keeps the track clear of the remove button. */
.cart-popup__items {
	list-style: none;
	margin: 0 0 12px;
	padding: 0 6px 0 0;
	max-height: 320px;
	overflow-y: auto;
	scrollbar-width: thin;
	scrollbar-color: var(--color-grey-200) transparent;
}

.cart-popup__items::-webkit-scrollbar {
	width: 4px;
}

.cart-popup__items::-webkit-scrollbar-track {
	background: transparent;
}

.cart-popup__items::-webkit-scrollbar-thumb {
	background: var(--color-grey-200);
	border-radius: 100px;
}

/* Fixed 48px content height (the thumbnail's own size). Everything the hover
   state swaps in - the stepper and the remove button - is sized to fit INSIDE
   that, so revealing them can't grow the row. Without this the 56px stepper
   made every hovered row 8px taller, which resized the panel and made the
   whole mini-cart jump under the cursor. */
.cart-popup__item {
	display: flex;
	align-items: center;
	gap: 12px;
	height: 48px;
	padding: 10px 0;
	border-bottom: 1px solid var(--color-grey-100);
}

.cart-popup__item:last-child {
	border-bottom: none;
}

.cart-popup__thumb {
	flex-shrink: 0;
	width: 48px;
	height: 48px;
	border-radius: 4px;
	overflow: hidden;
	background: var(--color-grey-100);
}

.cart-popup__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.cart-popup__item-body {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.cart-popup__item-name {
	font: var(--text-body-md);
	color: var(--color-grey-900);
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* Two representations of the same quantity, CSS toggling which shows: plain
   text normally, the +/- stepper otherwise. On a mouse/trackpad (real hover),
   hovering a row swaps to the big pill stepper from Figma 366:12666, which
   REPLACES the product name entirely, and the remove button takes over the
   price column - there's no hover on a touch device to reveal any of that, so
   under `(hover: none)` the row instead keeps its name + price and gets a
   small always-on stepper + remove button, growing taller if the two-line
   name needs it. */
.cart-popup__item-qty {
	font: var(--text-caption);
	color: var(--color-grey-700);
}

/* Same 144x56 "Large round btn" stepper as the product page (see the shared
   .quantity / .qty-step rules) - just scoped to the popup. The compound
   .cart-popup__qty.quantity selector (this element carries both classes) is
   needed so this display:none beats the shared .quantity rule's
   display:inline-flex regardless of stylesheet order. */
/* Figma's own stepper is 144x56 beside a 68px thumbnail; this popup's rows use
   a 48px thumbnail, so the whole control is scaled by the same 48/68 ratio to
   keep the design's proportions while fitting the row height exactly. */
.cart-popup__qty.quantity {
	display: none;
	width: 104px;
	height: 40px;
	padding: 4px;
	box-sizing: border-box;
}

.cart-popup__qty .qty-step {
	width: 32px;
	height: 32px;
}

.cart-popup__qty .qty-step img {
	width: 18px;
	height: 18px;
}

.cart-popup__qty .qty-step--plus {
	width: 32px;
	height: 32px;
}

.cart-popup__qty-value {
	flex: 1;
	width: 100%;
	min-width: 0;
	border: none;
	background: none;
	padding: 0;
	text-align: center;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	-moz-appearance: textfield;
	appearance: textfield;
}

.cart-popup__qty-value::-webkit-outer-spin-button,
.cart-popup__qty-value::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

/* html.is-touch (set on first real touchstart, see menus.js) takes priority
   over the `:hover` pill even on hybrid devices that report hover:hover
   because their primary pointer is a trackpad - without :not(.is-touch),
   tapping there triggers the classic mobile "first tap = hover, second tap =
   click" bug instead of registering. */
html:not(.is-touch) .cart-popup__item:hover .cart-popup__item-qty,
html:not(.is-touch) .cart-popup__item:hover .cart-popup__item-name,
html:not(.is-touch) .cart-popup__item:hover .cart-popup__item-price {
	display: none;
}

html:not(.is-touch) .cart-popup__item:hover .cart-popup__qty,
html:not(.is-touch) .cart-popup__item:hover .cart-popup__remove {
	display: flex;
}

/* Touch (device has no hover, or a real touch already happened this session -
   html.is-touch): no hover to reveal anything, so name/price stay put and the
   stepper + remove button are always on, at a smaller size (reusing the same
   scale as the real cart page's stepper - see .cart-item__qty). The two
   selector groups below are the same declarations twice, once per condition -
   `@media` and a plain class selector can't be combined in one selector list. */
@media (hover: none) {
	/* height:auto releases the fixed 48px row set for the hover layout - here
	   the name, price and always-on stepper stack, so the row must grow. */
	.cart-popup__item {
		align-items: flex-start;
		height: auto;
	}

	.cart-popup__item-qty {
		display: none;
	}

	.cart-popup__item .cart-popup__qty.quantity {
		display: flex;
		width: auto;
		height: 40px;
		padding: 3px;
		margin-top: 4px;
	}

	.cart-popup__item .cart-popup__qty .qty-step {
		width: 30px;
		height: 30px;
	}

	.cart-popup__item .cart-popup__qty .qty-step img {
		width: 16px;
		height: 16px;
	}

	.cart-popup__item .cart-popup__qty .qty-step--plus {
		width: 34px;
		height: 34px;
	}

	.cart-popup__item .cart-popup__qty .cart-popup__qty-value {
		width: 32px;
		flex: none;
		font: var(--text-body-md);
	}

	.cart-popup__item .cart-popup__remove {
		display: flex;
		width: 36px;
		height: 36px;
		margin-top: 4px;
	}

	.cart-popup__item .cart-popup__remove img {
		width: 16px;
		height: 16px;
	}
}

html.is-touch .cart-popup__item {
	align-items: flex-start;
	height: auto;
}

html.is-touch .cart-popup__item-qty {
	display: none;
}

html.is-touch .cart-popup__item .cart-popup__qty.quantity {
	display: flex;
	width: auto;
	height: 40px;
	padding: 3px;
	margin-top: 4px;
}

html.is-touch .cart-popup__item .cart-popup__qty .qty-step {
	width: 30px;
	height: 30px;
}

html.is-touch .cart-popup__item .cart-popup__qty .qty-step img {
	width: 16px;
	height: 16px;
}

html.is-touch .cart-popup__item .cart-popup__qty .qty-step--plus {
	width: 34px;
	height: 34px;
}

html.is-touch .cart-popup__item .cart-popup__qty .cart-popup__qty-value {
	width: 32px;
	flex: none;
	font: var(--text-body-md);
}

html.is-touch .cart-popup__item .cart-popup__remove {
	display: flex;
	width: 36px;
	height: 36px;
	margin-top: 4px;
}

html.is-touch .cart-popup__item .cart-popup__remove img {
	width: 16px;
	height: 16px;
}

/* Dim the panel while an AJAX qty change is in flight (assets/js/cart-popup-qty.js)
   so a second click can't fire before the fragments come back. */
.cart-popup__panel.is-busy {
	opacity: 0.6;
	pointer-events: none;
}

.cart-popup__item-price {
	flex-shrink: 0;
	font: var(--text-body-md);
	color: var(--color-grey-900);
	white-space: nowrap;
}

/* Same 48/68 scale-down as .cart-popup__qty above - Figma's is 56px. */
.cart-popup__remove {
	flex-shrink: 0;
	display: none;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: 50%;
	background: var(--color-grey-200);
}

.cart-popup__remove img {
	width: 18px;
	height: 18px;
}

.cart-popup__remove:hover {
	background: var(--color-grey-100);
}

.cart-popup__total {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin-bottom: 16px;
}

.cart-popup__view {
	display: flex;
	width: 100%;
	box-sizing: border-box;
	justify-content: center;
	height: 40px;
}

.cart-popup__empty {
	text-align: center;
	padding: 16px 0 0;
}

.cart-popup__empty-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 64px;
	height: 64px;
	border-radius: 50%;
	background: var(--color-grey-100);
	color: var(--color-grey-700);
	margin-bottom: 16px;
}

.cart-popup__empty-title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.cart-popup__empty-text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 24px;
}

@media (max-width: 767px) {
	.cart-popup__panel {
		position: fixed;
		top: auto;
		bottom: 0;
		left: 0;
		right: 0;
		width: 100%;
		max-width: 100%;
		border-radius: 20px 20px 0 0;
	}
}

.site-header__badge {
	position: absolute;
	top: -4px;
	right: -4px;
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 17px;
	height: 17px;
	padding: 0 5px;
	border-radius: 100px;
	background: var(--color-crimson);
	color: var(--color-white);
	font: var(--text-caption);
	line-height: 1;
}

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

/* Wishlist heart button - real toggle now (inc/wishlist.php). Active state
   just needs the icon swap (outline -> filled, both real Figma assets - see
   assets/js/wishlist.js) since the icon itself is an external <img> and
   can't be recolored via CSS; a light tint on the button reinforces it. */
.wishlist-btn.is-active {
	background: var(--color-light-blue);
}

.lang-switch {
	position: relative;
}

/* Figma 458:16385 (frame 0:25) specifies Body/Large - 400 18px/1.4 with
   letterSpacing 0 - NOT the 14px uppercase-tracked style this had. The 3px
   tracking was the visible discrepancy: "LV" read as "L V". The label is
   already uppercased in PHP (strtoupper on the WPML code), so no
   text-transform is needed either. */
.site-header__lang-switch {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 10px 24px;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	border: none;
	background: none;
	cursor: pointer;
}

.lang-switch__panel {
	position: absolute;
	z-index: 20;
	top: calc(100% + 8px);
	right: 0;
	list-style: none;
	margin: 0;
	padding: 8px;
	min-width: 100px;
	background: var(--color-white);
	border-radius: 12px;
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.08);
}

.lang-switch__panel[hidden] {
	display: none;
}

.lang-switch__option {
	display: block;
	padding: 10px 12px;
	border-radius: 8px;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.lang-switch__option:hover {
	background: var(--color-grey-100);
}

.lang-switch__option.is-active {
	color: var(--color-brand-blue);
}

.site-header__nav-bar {
	background: var(--color-grey-200);
	box-shadow: inset 0 -4px 36px 0 rgba(0, 0, 0, 0.06);
}

/* Real Figma geometry, "under header" 611:18054 on the 1920 canvas:
     Katalogs   x=219  w=162  -> ends 381
     sub menu   x=481  w=628  -> ends 1109
     search     x=1209 w=511  -> ends 1720
   So this row is inset FURTHER than the top bar (145px): ~200px each side,
   with a 100px gap after Katalogs and another 100px before the search, and
   the search pinned to the right edge at a fixed 511px rather than stretching
   across everything left over. */
.site-header__nav-bar .site-header__inner {
	display: flex;
	align-items: center;
	justify-content: flex-start;
	gap: 100px;
	padding: 27px 200px;
}

.site-header__menu-trigger {
	display: inline-flex;
	align-items: center;
	gap: 8px;
}

.site-header__menu-trigger img {
	width: 20px;
	height: 20px;
}

.site-header__catalog-trigger {
	display: inline-flex;
	align-items: center;
	gap: 14px;
	font: var(--text-h4);
	background: none;
	border: none;
	cursor: pointer;
	flex-shrink: 0;
}

.site-header__catalog-trigger img {
	width: 24px;
	height: 24px;
}

/* 88px between links (Figma: Akcijas ends 57, Izpārdošana starts 145), with a
   1px divider centred in each gap - the dividers sit at 101/288/515, i.e.
   exactly 44px after the preceding label and 44px before the next. */
.site-header__sub-nav {
	display: flex;
	align-items: center;
	gap: 88px;
	list-style: none;
	margin: 0;
	padding: 0;
	flex-shrink: 0;
}

.site-header__sub-nav li {
	position: relative;
	font: var(--text-body-lg);
}

.site-header__sub-nav li + li::before {
	content: "";
	position: absolute;
	left: -44px;
	top: 50%;
	transform: translateY(-50%);
	width: 1px;
	height: 47px;
	background: var(--color-grey-400);
	opacity: 0.4;
}

.site-header__sub-nav a {
	display: inline-flex;
	padding: 12px 20px;
	border-radius: 100px;
}

.site-header__sub-nav a:hover {
	background: var(--color-white);
}

.site-header__search {
	display: flex;
	align-items: center;
	gap: 12px;
	background: var(--color-white);
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	padding: 14px 19px;
	/* Pinned to the right edge at the design's 511px rather than stretching to
	   fill the row (it was swallowing ~900px). margin-left:auto is what pushes
	   it right now that the row is flex-start instead of space-between.
	   It is still the ONE thing allowed to give up space - Katalogs trigger +
	   sub-nav links are flex-shrink:0, so a narrowing viewport squeezes the
	   search first, not the nav labels. */
	flex: 0 1 511px;
	margin-left: auto;
	min-width: 0;
}

.site-header__search button {
	display: flex;
	border: none;
	background: none;
	padding: 0;
	cursor: pointer;
	flex-shrink: 0;
}

.site-header__search img {
	width: 19px;
	height: 19px;
}

.site-header__search input {
	border: none;
	outline: none;
	flex: 1;
	min-width: 0;
	font: var(--text-body-regular);
	background: none;
}

/* ---- Search autocomplete dropdown (Figma 165:4086) ----
   Shared by both search forms (.site-header__search and the shop archive's
   .shop-sort-bar__search) - assets/js/search-suggest.js appends the panel and
   adds .has-search-suggest to whichever form it enhanced.

   The panel is a child of the form, so the form is what it positions against.
   Neither search form was positioned before, hence the rule here rather than
   on the two form classes. */
.has-search-suggest {
	position: relative;
}

.search-suggest {
	position: absolute;
	z-index: 30;
	top: calc(100% + 12px);
	left: 0;
	right: 0;
	/* 8px, not the design's 20px: each row carries 12px of its own padding, so
	   8 + 12 puts the text at the design's 20px while letting the hover pill
	   run out to 8px from the panel edge exactly as in Figma. */
	padding: 8px;
	box-sizing: border-box;
	background: var(--color-white);
	border-radius: 20px;
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.08);
}

.search-suggest[hidden] {
	display: none;
}

.search-suggest__item {
	display: block;
	padding: 12px;
	border-radius: 100px;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	text-decoration: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.search-suggest__item:hover,
.search-suggest__item.is-active {
	background: var(--color-grey-100);
}

/* The run of the title matching what was typed - darker and medium weight. */
.search-suggest__match {
	font: var(--text-body-md);
	color: var(--color-grey-900);
}

.search-suggest__empty {
	margin: 0;
	padding: 12px;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

/* ---- Header collapse. The header had NO breakpoint at all originally
   (fixed 145px side padding, non-wrapping row at every viewport).

   Breakpoint is 1024px, NOT 767px: measured live, the full header row is
   ~870px wide (logo 160 + burger 68 + phone 150 + hours 200 + actions 294
   + gaps), so at a 768px tablet EVERY page overflowed by 162-370px. It has
   to collapse well before phone width. The opening hours line drops earlier
   still (1200px) since it's the longest and least critical element.

   Phone + hours stay reachable via the Kontakti page and the footer. ---- */
@media (max-width: 1200px) {
	.site-header__hours {
		display: none;
	}
}

/* ---- Header gutters ----
   The 145px gutter is a 1920px-canvas measurement (Figma 458:16385). It only
   dropped at 1024px before, so every laptop width (1440, 1366, 1280) kept the
   full 145px and wasted ~290px of the row - the logo and the language switcher
   sat well inside the viewport edges with nothing between them and the screen.
   Collapse to the compact gutter from 1440px down instead. Padding only: the
   bar heights, logo size and icon sizing still change at 1024, which is where
   they actually need to. */
/* The 100px/88px gaps are 1920-canvas measurements. They hold to ~1780px;
   below that the search - the only flexible item in the row - is the thing
   that gives, and it was down to an unusable stub. Tighten the gaps first. */
/* The nav row's extra 200px inset is a 1920-canvas measurement. Below 1560 it
   costs the search field more than the symmetry is worth, so the row drops to
   the top bar's 145px gutter and the two rows line up. */
@media (max-width: 1560px) {
	.site-header__nav-bar .site-header__inner {
		padding-left: 145px;
		padding-right: 145px;
	}
}

@media (max-width: 1780px) {
	.site-header__nav-bar .site-header__inner {
		gap: 48px;
	}

	.site-header__sub-nav {
		gap: 48px;
	}

	.site-header__sub-nav li + li::before {
		left: -24px;
		height: 36px;
	}
}

@media (max-width: 1440px) {
	.site-header__bar .site-header__inner,
	.site-header__nav-bar .site-header__inner {
		padding-left: 20px;
		padding-right: 20px;
	}

	/* Below 1440 the row can't hold Katalogs + 4 promo links + a usable search
	   field. The promo links move into the Katalogs flyout
	   (.catalog-menu__promo) and this row becomes just Katalogs + search -
	   which then stays that way all the way down, on one line, instead of the
	   old wrap-to-three-rows behaviour. */
	.site-header__sub-nav {
		display: none;
	}

	.site-header__nav-bar .site-header__inner {
		gap: 24px;
	}

	/* Free to grow again now that it's the only other thing in the row. */
	.site-header__search {
		flex: 1 1 auto;
		max-width: 511px;
	}
}

@media (max-width: 1024px) {
	.site-header__bar .site-header__inner {
		padding: 0 20px;
		gap: 12px;
		height: 64px;
	}

	/* Logo centred from 1024 down (Rob, 2026-07-30).
	   Absolutely centred, NOT flex-centred: the burger is 44px but the right
	   group is much wider, so a flex:1 logo would centre itself inside the
	   LEFTOVER space - off by half that difference. Pinning it to 50% of the
	   row makes it dead centre whatever the two sides weigh. Row height still
	   comes from the buttons, which stay in flow.
	   max-width keeps it clear of the buttons: the actions group is widest
	   here (wishlist + cart + Ienākt + LV), hence the larger reserve. */
	.site-header__bar .site-header__inner {
		position: relative;
	}

	.site-header__logo {
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
		margin: 0;
		/* Reserve BOTH sides symmetrically: the logo is centred on the row, so
		   the clear zone has to be twice the wider side, not the sum of the
		   two. The right group (wishlist + cart + Ienākt + LV) is ~250px here,
		   hence 500. Below 600 that group sheds down to two icons and the
		   reserve relaxes - see the 600px block. */
		max-width: calc(100% - 500px);
	}

	.site-header__logo img {
		display: block;
	}

	.site-header__logo img {
		width: 120px;
		height: 30px;
	}

	.site-header__bar .site-header__menu-trigger {
		width: 44px;
	}

	.site-header__phone,
	.site-header__hours {
		display: none;
	}

	.site-header__actions {
		gap: 8px;
	}

	/* Unlike desktop (Figma 95:2151, bare icons), the mobile header uses the
	   grey-pill icon-button chrome for touch-target weight. */
	.site-header__actions .pill-btn--icon {
		width: 44px;
		background: var(--color-grey-100);
		border-radius: 100px;
	}

	/* nowrap, not wrap: the row is only Katalogs + search below 1440, so it
	   stays on ONE line all the way down instead of stacking into three. */
	.site-header__nav-bar .site-header__inner {
		flex-wrap: nowrap;
		padding: 16px 20px;
		gap: 12px;
	}

	.site-header__sub-nav {
		order: 2;
		width: 100%;
		flex-wrap: nowrap;
		overflow-x: auto;
		gap: 20px;
		scrollbar-width: none;
	}

	.site-header__sub-nav::-webkit-scrollbar {
		display: none;
	}

	.site-header__sub-nav li {
		flex-shrink: 0;
	}

	/* The sub-nav becomes a horizontally scrolling strip here, where a vertical
	   rule between items reads as clutter rather than structure. */
	.site-header__sub-nav li + li::before {
		display: none;
	}

	.site-header__search {
		order: 3;
		flex: 1 1 auto;
		min-width: 0;
		padding: 10px 16px;
	}

	/* The language switcher STAYS in the top-right at every width (Rob,
	   2026-07-30) - it's the one control with no other home, and burying it in
	   the footer made switching language a scroll-to-the-bottom job. It just
	   gets tighter padding to keep the row fitting a 360px viewport. */
	.site-header__lang-switch {
		padding: 10px 8px;
		gap: 4px;
	}

	.site-header__actions .pill-btn--primary {
		padding: 0 14px;
		height: 36px;
	}
}

@media (max-width: 767px) {
	.site-header__bar .site-header__inner {
		padding: 0 12px;
		gap: 8px;
	}

	.site-header__logo img {
		width: 100px;
		height: 25px;
	}

	.site-header__actions .pill-btn--icon {
		width: 36px;
	}
}

/* ---- Homepage hero banner (Figma node 95:2107 "slider") ---- */
#site-content {
	box-sizing: border-box;
	max-width: 1920px;
	margin: 0 auto;
	padding: 0 40px;
}

/* .shop-archive__inner already carries its own 145px side padding (matching
   .site-header__inner) - #site-content's 40px was stacking on top of it,
   pushing content 40px further in than the header on Garantijas/Lietošanas
   noteikumi/wishlist/single-product/jaunumi/shop-archive pages (Figma
   343:6978 shows the content column flush to the same 145px as the header,
   not 145+40). Zero it out wherever .shop-archive supplies its own padding. */
#site-content.shop-archive {
	padding: 0;
}

/* Cart / Checkout / My Account render through index.php's plain
   <main id="site-content"> (no .shop-archive class - they're WooCommerce
   shortcode pages, not archives), so the rule above missed them and their
   .shop-archive__inner's 145px stacked on top of the 40px here: 185px, well
   past where the header sits.
   WooCommerce wraps shortcode output in its own <div class="woocommerce">, so
   on those pages .shop-archive__inner is a grandchild - hence the second
   selector. Both stay anchored with `>` rather than a loose descendant match:
   the homepage nests .shop-archive__inner deep inside .home-blocks, and an
   unanchored :has() matched that too, stripping the gutter off the entire
   front page below 1920px. */
#site-content:has(> .shop-archive__inner),
#site-content:has(> .woocommerce > .shop-archive__inner) {
	padding: 0;
}

.hero-banner {
	margin-top: 24px;
}

.hero-banner__swiper {
	position: relative;
	/* NO horizontal padding here: padding on the element Swiper initializes on
	   breaks its slide-width/translate math and makes the previous slide peek
	   in at the edge. Arrows are positioned inside the slide instead (per Figma
	   node 155:3608, arrows sit over the slide at left/right). */
}

/* Override Swiper's default button box + glyph entirely — we render our own
   icons via <img>, and every one of these rules must beat swiper-bundle's
   defaults, which is why swiper is enqueued before our stylesheet. */
.hero-banner__arrow.swiper-button-next,
.hero-banner__arrow.swiper-button-prev {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	margin-top: 0;
	width: 56px;
	height: 56px;
	border-radius: 32px;
	border: none;
	background: var(--color-grey-200);
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
}

.hero-banner__arrow.swiper-button-next::after,
.hero-banner__arrow.swiper-button-prev::after {
	content: none;
}

.hero-banner__arrow--prev {
	left: 32px;
	background: var(--color-grey-100);
	opacity: 0.5;
}

.hero-banner__arrow--next {
	right: 32px;
}

.hero-banner__arrow.swiper-button-disabled {
	opacity: 0.25;
	cursor: default;
}

.hero-banner__slide {
	position: relative;
	min-height: 500px;
	border-radius: 50px;
	overflow: hidden;
	display: flex;
	align-items: center;
	/* Left inset clears the prev arrow (which sits at 32–88px) instead of
	   letting the title/CTA fall under it — Figma 95:2142 puts the copy at
	   x=128 from the slide edge. Right stays at 64px. */
	padding: 0 64px 0 128px;
	/* border-box is REQUIRED here: Swiper sets each slide's width inline, and
	   this theme has no global box-sizing reset - without this the 64px side
	   padding is ADDED on top of Swiper's width, making every slide 128px too
	   wide so the offset accumulates and drifts worse with each slide. */
	box-sizing: border-box;
	/* Set per slide as a custom property (see template-parts/home/hero-banner.php)
	   so desktop and mobile can differ - an inline style can't carry a media
	   query, but a custom property it sets can be swapped by one. */
	background: var(--slide-bg, var(--color-grey-100));
}

.hero-banner__copy {
	position: relative;
	z-index: 2;
	display: flex;
	flex-direction: column;
	gap: 40px;
	max-width: 560px;
}

.hero-banner__title {
	margin: 0;
	font: var(--text-h1);
	color: var(--color-grey-900);
	display: flex;
	flex-direction: column;
}

.hero-banner__title em {
	font-style: italic;
	font-weight: 400;
}

.hero-banner__title span {
	font-style: normal;
	font-weight: 500;
}

/* ---- Promo tiles row (Figma node 95:2107 "slide bar") ----
   They sit BELOW the hero, not over it: in Figma the slider is y=211 h=500
   (bottom edge 711) and "slide bar" starts at y=739 - a 28px gap. The old
   -80px pull-up overlapped the slide artwork and covered the CTA button. */
.promo-tiles {
	display: flex;
	gap: 20px;
	justify-content: center;
	margin-top: 28px;
	position: relative;
	z-index: 3;
	padding-bottom: 24px;
	/* nowrap: these are the hero's pagination, so a tile dropping to a second
	   row reads as a broken grid rather than "one per slide". They shrink
	   together instead, and hand over to plain dots at 1024 (below) before
	   they get too small to read. */
	flex-wrap: nowrap;
}

.promo-tile {
	width: 340px;
	min-width: 0;
	flex: 0 1 340px;
	height: 158px;
	border-radius: 28px;
	background-size: cover;
	background-position: center;
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 7px;
	/* Copy sits top-left (Figma 95:2159: left 19, top 37), not centred, so the
	   product art can own the right half of the tile. */
	justify-content: flex-start;
	align-items: flex-start;
	padding: 37px 19px 0;
	overflow: hidden;
}

.promo-tile--active {
	border: 5px solid var(--color-white);
	outline: 2px solid var(--color-brand-blue);
}

/* Text tiles: a wash that's opaque behind the copy on the left and fades to
   clear on the right, so the text stays legible AND the product art shows
   through on the right half. (The design uses a dedicated composed image there;
   we reuse the hero background, so this gradient stands in for it.) The active
   tile has its branding baked into the art and instead gets the Figma cyan
   tint below. */
.promo-tile::before {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(90deg, rgba(255, 255, 255, 0.72) 0%, rgba(255, 255, 255, 0.55) 38%, rgba(255, 255, 255, 0) 68%);
}

.promo-tile--active::before {
	background: rgba(76, 189, 227, 0.3);
}

.promo-tile__eyebrow,
.promo-tile__title {
	position: relative;
	z-index: 1;
	/* Cap the copy so it never runs across the art on the right. */
	max-width: 200px;
	font-family: var(--font-body);
	font-size: 26px;
	line-height: 1.15;
	color: var(--color-grey-900);
}

.promo-tile__title {
	font-weight: 500;
}

.promo-tile__eyebrow em {
	font-style: italic;
	font-weight: 400;
	display: block;
}

.hero-banner__pagination {
	display: none;
}

/* ---- Hero + promo tiles, mobile (below this, the 64px slide padding and
   fixed 340px tiles would overflow a phone-width viewport horizontally). ---- */
@media (max-width: 767px) {
	.hero-banner__slide {
		min-height: 420px;
		padding: 0 24px;
		border-radius: 24px;
	}

	.hero-banner__copy {
		max-width: 100%;
		gap: 24px;
	}

	/* Kept full-size (56px, same as desktop) per Rob - mobile slider controls
	   should read as MORE obvious/tappable, not shrink away. Tucked closer to
	   the edges instead so they don't crowd the copy. */
	.hero-banner__arrow--prev {
		left: 12px;
	}

	.hero-banner__arrow--next {
		right: 12px;
	}

	.hero-banner__pagination {
		justify-content: center;
		gap: 8px;
		position: static;
		margin-top: 16px;
	}

	.hero-banner__pagination .swiper-pagination-bullet {
		width: 8px;
		height: 8px;
		margin: 0;
		background: var(--color-grey-200);
		opacity: 1;
	}

	.hero-banner__pagination .swiper-pagination-bullet-active {
		background: var(--color-brand-blue);
	}
}

/* ---- Product row (Akcijas / Izpardosana / Popularas preces / Jaunumi) ----
   80px is the default gap above a row. Figma (95:2071) only gives 140px to the
   tabbed Jaunumi block - every other row sits at 80 - and applying 140 to all
   of them left the homepage far airier than the design. Override per instance
   with a spacing utility class in the block's Advanced > Additional CSS class
   panel (see the .vio-mt-* helpers further down). */
.product-row {
	margin-top: 80px;
}

/* The tabbed row keeps the design's larger gap. */
.product-row.jaunumi-tabs {
	margin-top: 140px;
}

.product-row__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	margin-bottom: 24px;
	flex-wrap: wrap;
}

.product-row__heading {
	min-width: 0;
	display: flex;
	align-items: baseline;
	gap: 16px;
	flex-wrap: wrap;
}

.product-row__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0;
	display: flex;
	align-items: center;
	gap: 8px;
}

.product-row__subtitle {
	color: var(--color-grey-700);
	font: var(--text-body-regular);
	margin: 0;
}

.product-row__swiper {
	position: relative;
	/* Swiper's own .swiper rule is overflow:hidden, which clips the
	   product-card hover shadow (0 16px 28px 4px) along the top/bottom edge of
	   the row - splitting overflow-x/overflow-y does NOT avoid this (Chrome/
	   Firefox still clip visual box-shadow once either axis is non-visible).
	   Real fix: pad the clipped box tall enough to contain the shadow, then
	   pull it back with a matching negative margin so layout doesn't shift -
	   the shadow now paints inside the (larger) clip box instead of outside it. */
	overflow: hidden;
	padding: 20px 0 50px;
	margin: -20px 0 -50px;
}

/* margin-left: auto keeps the arrows on the RIGHT once the header wraps.
   justify-content: space-between only separates items that share a line - as
   soon as the nav drops to its own row it becomes that row's only item and
   space-between parks it at the left edge, under the title. */
.product-row__nav {
	display: flex;
	gap: 14px;
	flex-shrink: 0;
	margin-left: auto;
}

/* ---- Shared slider arrow (reused by every product slider: Akcijas,
   Izpardosana, Popularas preces, Jaunumi tabs). One canonical look so the
   pagination controls are identical everywhere - Figma 56px grey circle.
   Applied alongside Swiper's .swiper-button-prev/next where Swiper drives
   the nav, and standalone where we drive it manually (Jaunumi). ---- */
.slider-arrow {
	position: static;
	width: 56px;
	height: 56px;
	flex-shrink: 0;
	border-radius: 32px;
	border: none;
	background: var(--color-grey-200);
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	margin-top: 0;
}

.slider-arrow.swiper-button-next::after,
.slider-arrow.swiper-button-prev::after {
	content: none;
}

.slider-arrow.swiper-button-disabled {
	opacity: 0.5;
	cursor: default;
}

.product-row__cta {
	display: flex;
	justify-content: center;
	margin-top: 24px;
}

/* Trailing "view all" slide - appended as the last card when a row has more
   products than the cap, so reaching the slider's end signals there's more. */
.product-row__view-all {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 16px;
	height: 100%;
	min-height: 280px;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
	text-decoration: none;
	color: var(--color-grey-900);
	font: var(--text-body-md);
	text-align: center;
}

.product-row__view-all-icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	border-radius: 32px;
	background: var(--color-brand-green);
}

.product-row__view-all-icon img {
	filter: brightness(0) invert(1); /* white chevron on green */
}

.pill-btn--cta-outline {
	border: 1px solid var(--color-brand-green);
	color: var(--color-brand-green);
	background: none;
	padding: 10px 24px;
	height: 40px;
	text-transform: uppercase;
	letter-spacing: var(--text-body-uppercase-tracking);
}

/* ---- Product card (Figma 41:768 Default / 52:1081 Hover, Components page) ---- */
/* The card is the positioning context for the wishlist heart, which now
   floats over the product image instead of sharing the footer row. */
.product-card {
	position: relative;
}

/* container-type makes the card itself the query container, so the layout
   below reacts to how wide THIS card is - not how wide the window is. That
   matters because the same card renders at wildly different widths in the
   same viewport: 4-up in a slider, 3-up in a grid, 1-up on a phone. Viewport
   media queries can't tell those apart, which is why the price + button row
   was overflowing out of narrow cards. */
.product-card {
	container-type: inline-size;
	background: var(--color-white);
	border: 1px solid var(--color-white);
	border-radius: 4px;
	display: flex;
	flex-direction: column;
	gap: 24px;
	padding-bottom: 24px;
	/* height:100% again, but WITHOUT overflow:hidden.
	   min-height let a card grow past its grid row and bleed across the row
	   gap, so the gutters looked closed up and rows ran together. It only
	   needed to grow while the title could overflow its box - now that the
	   title is pinned to exactly two 25px lines, card content always fits, so
	   the card can be locked to its track again.
	   overflow stays visible: clipping here is what sliced the title in the
	   first place, and the media element carries its own overflow:hidden for
	   the rounded top corners, so nothing else needs the card to clip. */
	height: 100%;
	box-sizing: border-box;
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.product-card:hover {
	border-color: var(--color-brand-blue);
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.08);
}

.product-card__media {
	position: relative;
	display: block;
	height: 280px;
	overflow: hidden;
	/* Carries the card's top corners now that the card itself doesn't clip. */
	border-radius: 4px 4px 0 0;
	/* Product photos are shot on white - grey-50 here read as a visible box
	   around images that don't fill the full 280px height. */
	background: var(--color-white);
}

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

.product-card__tag {
	position: absolute;
	top: 20px;
	left: 20px;
	background: var(--color-grey-100);
	border-radius: 100px;
	padding: 8px 16px;
	font: var(--text-body-regular);
	color: var(--color-brand-blue);
}

/* Deal badge: discount % over a "līdz <date>" expiry pill, stacked top-right.
   Preview only for now (see product-card.php) — the real % / best-before date
   arrive with the import fields later. Theme crimson + light-pink. */
.product-card__deal {
	position: absolute;
	top: 20px;
	right: 20px;
	z-index: 2;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 8px;
}

.product-card__deal-pct {
	padding: 8px 18px;
	border-radius: 100px;
	background: var(--color-crimson);
	color: var(--color-white);
	font: var(--text-body-lg-bold);
	line-height: 1;
}

.product-card__deal-until {
	padding: 6px 16px;
	border-radius: 100px;
	background: var(--color-light-pink);
	color: var(--color-crimson);
	font: var(--text-body-md);
	white-space: nowrap;
}

/* Title is a full-width row of its own, price + actions sit in the row below
   (Figma 41:768). Previously title and price shared a column next to the
   buttons, so the title only got ~55% of the card width and truncated. */
.product-card__body {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 0 20px;
	/* Fill the leftover card height so the price row can be pinned to the
	   bottom - otherwise a 1-line title and a 2-line title put their prices at
	   different heights even when the cards themselves are equal height. */
	flex: 1;
	min-height: 0;
}

.product-card__footer {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	min-width: 0;
	margin-top: auto;
	/* NO flex-wrap here. With wrapping on, whether the actions dropped to a
	   second line depended on the rendered width of that card's price string
	   and button label - so two cards in the same row could resolve to
	   different layouts, and therefore different heights. The container query
	   below is the only thing allowed to decide, which makes the choice
	   identical for every card of the same width. */
	flex-wrap: nowrap;
}

/* Narrow card: price on its own line, actions beneath it, full width.
   320px, not 280: at 280 a 4-across grid on a ~1300px screen sat just above
   the threshold for some cards and just below for others once the price string
   varied, which is exactly the staggering this is meant to prevent. */
@container (max-width: 320px) {
	.product-card__footer {
		flex-direction: column;
		align-items: stretch;
		gap: 8px;
	}

	/* Height stays FIXED here. Releasing it was the reason rows were still
	   ragged: below 280px the container query kicked in on every card, and a
	   sale card (struck price above the new one) then grew two lines tall
	   while its neighbours stayed one. */
	.product-card__price {
		height: 68px;
	}

	.product-card__actions {
		justify-content: space-between;
	}

	.product-card__actions .button {
		flex: 1;
		justify-content: center;
		padding: 0 12px;
	}
}


.product-card__title {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	/* Explicit line-height so two lines measure EXACTLY the box height.
	   --text-body-lg is 18px/1.4 = 25.2px per line, so two lines came to
	   50.4px against a 50px box - and overflow:hidden shaved that 0.4px off
	   the bottom of line 2, which reads as a sliced third line. Chasing it
	   with min-height / flex-shrink / removing the card's clip each fixed one
	   contributor while the sub-pixel mismatch itself remained.
	   25px x 2 = 50px exactly: nothing to clip, at any card width. */
	line-height: 25px;
	height: 50px;
	flex-shrink: 0;
}

/* Sale prices stack (struck-through old price above the new one), which made
   that card taller than its non-sale neighbours. Height is FIXED to the
   two-line case so every card is identical either way:
     ins  = --text-h4, 32px x 1.3 line-height = 41.6px
     del  = 0.6em of that = 19.2px x 1.3      = 25.0px
   -> 67px, rounded to 68. Equalising here (rather than with align-items:
   stretch on the grid) is deliberate: stretch made cards overlap between rows
   on the category archive. */
.product-card__price {
	font: var(--text-h4);
	color: var(--color-grey-900);
	display: flex;
	flex-direction: column;
	justify-content: center;
	height: 68px;
}

.product-card__price del {
	font-size: 0.6em;
	color: var(--color-grey-400);
	opacity: 0.8;
	margin-right: 6px;
}

/* The sale price is green (Figma 256:5141). The struck-through old price stays
   ABOVE it rather than beside it, which is our own variation - it keeps the
   row height stable and leaves room for the hover-revealed button. */
.product-card__price ins {
	text-decoration: none;
	color: var(--color-brand-green);
}

.product-card__actions {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-shrink: 0;
	min-width: 0;
}

/* Default state: add-to-cart invisible, only wishlist shows. Hover: reveal it.
   Targets WooCommerce's own .add_to_cart_button so stock/variation logic
   from woocommerce_template_loop_add_to_cart() keeps working untouched.
   Uses visibility+opacity, NOT display:none/flex - toggling display removes
   the button from flow entirely, so revealing it on hover inserted new height
   into .product-card__actions and grew the whole card. Keeping display:
   inline-flex always reserves that space, so hover only ever changes the
   border/shadow (per Figma), never the card's dimensions.

   Selector is .button (not .add_to_cart_button specifically): products that
   aren't directly purchasable in the loop (variable products needing a
   selection, out-of-stock, etc.) get a plain "Lasīt vairāk" link from
   woocommerce_template_loop_add_to_cart() WITHOUT the add_to_cart_button
   class - targeting only that class left this fallback link permanently
   visible and unstyled instead of hover-gated like every other card. */
.product-card__actions .button {
	display: inline-flex;
	background: var(--color-brand-blue);
	color: var(--color-white);
	border-radius: 100px;
	padding: 0 24px;
	height: 40px;
	/* border-box or the 10px vertical padding is ADDED to the 40px height and
	   the button renders 60px tall - this theme has no global box reset. */
	box-sizing: border-box;
	align-items: center;
	font: var(--text-body-md);
	text-decoration: none;
	white-space: nowrap;
}

/* ---- Hover-reveal, only where hovering exists ----
   A touch device has no hover state, so a button revealed on :hover is either
   permanently invisible or needs a first tap just to appear - the tap that
   should have added the product to the cart. Gate the hiding on the INPUT
   rather than on screen width: a small laptop still has a mouse, and a large
   tablet still doesn't. Anything that can't hover simply gets the button
   shown, which is why the "hidden" state lives inside this query and the
   visible state is the default above. */
@media (hover: hover) and (pointer: fine) {
	.product-card__actions .button {
		visibility: hidden;
		opacity: 0;
	}

	.product-card:hover .button,
	.product-card:focus-within .button {
		visibility: visible;
		opacity: 1;
	}
}

/* The media query above is necessary but NOT sufficient: a touchscreen laptop
   or 2-in-1 reports hover:hover + pointer:fine (its trackpad is the primary
   pointer), so on those devices the button was hidden behind a hover state a
   finger can't produce - one tap to reveal, another to actually add. Once a
   real touchstart has happened, <html> gets .is-touch (see menus.js) and the
   button is unconditionally visible. Higher specificity than the rule inside
   the query, so it wins regardless of order. Same guard the mini-cart popup's
   hover controls use. */
html.is-touch .product-card__actions .button {
	visibility: visible;
	opacity: 1;
}

.product-card__wishlist {
	flex-shrink: 0;
}

/* ---- Homepage 2-column layout + sticky marketplace sidebar ---- */
.home-layout {
	display: flex;
	gap: 40px;
	align-items: flex-start;
}

.home-layout__main {
	flex: 1;
	min-width: 0;
}

.home-layout__sidebar {
	width: 280px;
	flex-shrink: 0;
	position: sticky;
	top: 24px;
	/* Drop the sidebar so its title lines up with the top of the hero slide
	   instead of floating 24px above it (the hero carries its own 24px
	   .hero-banner margin-top, which the sidebar column doesn't inherit). */
	margin-top: 24px;
}

.marketplace-sidebar {
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.marketplace-sidebar__title {
	font: var(--text-body-lg-bold);
	margin: 0;
}

.marketplace-sidebar__subtitle {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 8px;
}

.marketplace-sidebar__link {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	text-align: center;
	background: var(--color-white);
	border-radius: 16px;
	padding: 32px 16px;
	font: var(--text-body-md);
}

.marketplace-sidebar__link img {
	max-width: 100%;
	max-height: 24px;
	object-fit: contain;
}

/* Arrow-up-right icon in a 34px circle that stays transparent until hover,
   when it fills with grey-100 (Figma 104:2847 — the hovered 220.lv banner
   shows the grey circle behind the arrow). The arrow itself is masked so its
   colour comes from background-color. */
.marketplace-sidebar__arrow {
	position: absolute;
	top: 8px;
	right: 8px;
	width: 34px;
	height: 34px;
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
	background-color: transparent;
	transition: background-color 0.15s ease;
}

.marketplace-sidebar__arrow::before {
	content: "";
	width: 24px;
	height: 24px;
	background-color: var(--color-brand-blue);
	-webkit-mask: url("assets/icons/arrow-up-right.svg") no-repeat center / contain;
	mask: url("assets/icons/arrow-up-right.svg") no-repeat center / contain;
}

.marketplace-sidebar__link:hover .marketplace-sidebar__arrow {
	background-color: var(--color-grey-100);
}

/* The sticky/3rd-column sidebar doesn't fit narrow screens, so the same
   content also renders as a compact horizontal row; exactly one of the two is
   visible at any width. The SWAP POINT DIFFERS BY CONTEXT and that matters:
   - Homepage is a 2-column layout, so its sidebar survives down to 767px.
   - The product page is 3 columns (803px gallery + summary + 190px sidebar).
     Below ~1700px that row wraps, which stranded the sidebar as a lone 190px
     column at the very bottom of the row with no travel left - measured live:
     position:sticky resolved but never actually pinned, because it sat 974px
     into a 1397px-tall parent. So it swaps to the compact row at 1700px, the
     same width the row starts wrapping.
   Layout styles for the compact variant are unconditional (they only apply
   when something makes it visible); the media queries only toggle display. */
.marketplace-sidebar--compact {
	display: none;
	flex-wrap: wrap;
	flex-direction: row;
	gap: 8px;
	margin: 24px 0;
}

.marketplace-sidebar--compact .marketplace-sidebar__title,
.marketplace-sidebar--compact .marketplace-sidebar__subtitle {
	width: 100%;
}

.marketplace-sidebar--compact .marketplace-sidebar__link {
	flex: 1;
	min-width: 0;
	padding: 16px 8px;
	border-radius: 12px;
}

.marketplace-sidebar--compact .marketplace-sidebar__link img {
	max-height: 18px;
}

.marketplace-sidebar--compact .marketplace-sidebar__arrow {
	top: 8px;
	right: 8px;
}

/* Product page: swap as soon as the 3-column row wraps. */
@media (max-width: 1700px) {
	.product-page__top .marketplace-sidebar {
		display: none;
	}

	.product-page .marketplace-sidebar--compact {
		display: flex;
	}
}

/* Homepage: the 2-column layout gives up at 900px (Rob, 2026-08-03) - below
   that the 170px sidebar starves the product rows more than it earns.
   The hide and the compact-row reveal share ONE breakpoint on purpose, so the
   marketplace links are never missing and never shown twice.

   NOTE: the compact row is also available as the vio/mobile-sidebar block, for
   pages that want to place it somewhere specific. */
@media (max-width: 900px) {
	.home-layout__sidebar {
		display: none;
	}

	.home-layout .marketplace-sidebar--compact,
	.vio-block--mobile-sidebar .marketplace-sidebar--compact {
		display: flex;
	}
}

/* ---- Info row under hero (Apmaksa/Piegade/Garantijas/etc.) ---- */
.info-row {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	margin: 24px 0;
}

.info-row__item {
	display: flex;
	align-items: center;
	gap: 12px;
	background: var(--color-white);
	border: 1px solid var(--color-grey-200);
	border-radius: 8px;
	padding: 16px 20px;
	/* Equal width for every card (basis 0 + grow 1). min-width is the ONLY
	   wrap threshold - it must be a single declaration (a duplicate one used to
	   override it). Cards only shrink to it if the label can break, hence the
	   overflow-wrap on .info-row__label below; without that, a long unbroken
	   word sets a huge min-content width and forces an early wrap. */
	flex: 1 1 0;
	min-width: 140px;
}

.info-row__icon {
	flex-shrink: 0;
	width: 48px;
	height: 48px;
	border-radius: 12px;
	object-fit: cover;
}

.info-row__label {
	font: var(--text-body-md);
	color: var(--color-grey-900);
	/* Let the card actually shrink to its min-width: without these a long
	   unbroken label sets the item's min-content width and forces early wrap. */
	min-width: 0;
	overflow-wrap: anywhere;
}

/* ---- Product row grid mode (2 rows sliding together, Swiper Grid) ---- */
.product-row--grid .product-card {
	margin-bottom: 0;
}

/* ---- FAQ accordion (native <details>/<summary>, no JS) ---- */
.faq-accordion {
	margin-top: 140px;
}

.faq-accordion__title {
	font: var(--text-h1);
	font-style: normal;
	font-size: 42px;
	margin: 0 0 24px;
}

.faq-accordion__grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	/* Figma 354:8461: 32px between stacked items, 88px between the two columns. */
	gap: 32px 88px;
}

.faq-accordion__item {
	border-bottom: 1px solid var(--color-grey-200);
	padding-bottom: 16px;
}

.faq-accordion__question {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	cursor: pointer;
	/* Figma I354:8463: 32px Medium. Scales down on narrow screens. */
	font-size: clamp(20px, 2.6vw, 32px);
	font-weight: 500;
	line-height: 1.3;
	color: var(--color-grey-900);
	list-style: none;
}

.faq-accordion__question::-webkit-details-marker {
	display: none;
}

/* "Large round btn" (Figma 56:1270): 56px grey-200 circle, +/- glyph inside.
   grey-200, not grey-100 — the latter matches the page and vanished. */
.faq-accordion__icon {
	flex-shrink: 0;
	width: 56px;
	height: 56px;
	border-radius: 100px;
	background: var(--color-grey-200);
	position: relative;
}

.faq-accordion__icon::before,
.faq-accordion__icon::after {
	content: "";
	position: absolute;
	background: var(--color-grey-900);
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}

.faq-accordion__icon::before {
	width: 16px;
	height: 3px;
}

.faq-accordion__icon::after {
	width: 3px;
	height: 16px;
}

.faq-accordion__item[open] .faq-accordion__icon::after {
	display: none;
}

/* Open answer sits in its own white card (Figma 354:10569): white bg, 4px
   radius, 16px padding, 18px body text. No stroke — the white-on-grey edge is
   the "border". */
.faq-accordion__answer {
	color: var(--color-grey-700);
	font: var(--text-body-lg);
	margin: 20px 0 0;
	background: var(--color-white);
	border-radius: 4px;
	padding: 16px;
}

@media (max-width: 767px) {
	.faq-accordion__icon {
		width: 44px;
		height: 44px;
	}
}

@media (max-width: 767px) {
	.faq-accordion__grid {
		grid-template-columns: 1fr;
	}
}

/* ---- Newsletter signup ---- */
.newsletter-signup {
	margin-top: 140px;
	/* Radial wash: lightest in the centre, cyan toward every edge (Figma
	   388:9680) - the old 135deg linear only darkened left-to-right. */
	background: radial-gradient(ellipse at center, #F6FEFF 0%, #CDE7EE 100%);
	border-radius: 50px;
	padding: 88px 48px;
	text-align: center;
}

.newsletter-signup__title {
	/* Narrower column so the heading wraps to two lines like the design
	   (text frame 568px, Figma 95:2199). */
	max-width: 568px;
	margin: 0 auto 20px;
	font-weight: 500;
	font-size: clamp(28px, 3.4vw, 40px);
	line-height: 1.3;
	color: var(--color-grey-900);
}

.newsletter-signup__subtitle {
	color: var(--color-grey-700);
	font: var(--text-body-lg);
	/* 60px down to the form (Figma gap between the text and form groups). */
	margin: 0 0 60px;
}

.newsletter-signup__form {
	display: flex;
	justify-content: center;
	gap: 12px;
	max-width: 480px;
	margin: 0 auto;
}

.newsletter-signup__input {
	flex: 1;
	/* Blue border + a mail glyph inside on the left (Figma 95:2204 / 95:2205). */
	border: 1px solid var(--color-brand-blue);
	border-radius: 100px;
	padding: 10px 20px 10px 42px;
	font: var(--text-body-regular);
	background: var(--color-white) url("assets/icons/mail-input.svg") no-repeat left 14px center;
	background-size: 16px 16px;
}

.newsletter-signup__consent {
	display: flex;
	/* Centre the box against the text block (Figma check-line is items-center). */
	align-items: center;
	gap: 10px;
	max-width: 480px;
	margin: 16px auto 0;
	/* 14px medium, dark text (Figma 388:9676) - was 12px light grey. */
	font: var(--text-body-md);
	color: var(--color-grey-900);
	text-align: left;
}

/* Custom 20px checkbox (Figma 52:1191): blue rounded square, white tick when
   checked. Native accent-color rendered a dark tick in some browsers. */
.newsletter-signup__consent input {
	appearance: none;
	-webkit-appearance: none;
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	margin: 0;
	border: 1px solid var(--color-brand-blue);
	border-radius: 4px;
	background: var(--color-white);
	cursor: pointer;
	position: relative;
}

.newsletter-signup__consent input:checked {
	background: var(--color-brand-blue);
	border-color: var(--color-brand-blue);
}

.newsletter-signup__consent input:checked::after {
	content: "";
	position: absolute;
	left: 6px;
	top: 2px;
	width: 5px;
	height: 10px;
	border: solid var(--color-white);
	border-width: 0 2.5px 2.5px 0;
	transform: rotate(45deg);
}

/* ---- Jaunumi category tabs (each tab = its own 2-row grid Swiper) ---- */
.jaunumi-tabs__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	margin-bottom: 24px;
}

.jaunumi-tabs__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0;
	flex-shrink: 0;
}

.jaunumi-tabs__pills {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	/* Centre the tabs between the title and the nav arrows (Figma 256:5128).
	   Below 1450 they drop to their own row and go back to left-aligned. */
	flex: 1;
	justify-content: center;
}

.jaunumi-tabs__pill {
	border: none;
	/* Figma uses grey-100, but that equals the homepage background so the pills
	   vanished — grey-200 is the visible "light grey" (same as delivery tabs). */
	background: var(--color-grey-200);
	border-radius: 32px;
	padding: 16px 24px;
	font: var(--text-body-md);
	color: var(--color-grey-900);
	cursor: pointer;
	white-space: nowrap;
}

.jaunumi-tabs__pill.is-active {
	background: var(--color-brand-blue);
	color: var(--color-white);
}

/* Same reasoning as .product-row__nav - stay right-hand side after a wrap. */
.jaunumi-tabs__nav {
	display: flex;
	gap: 14px;
	flex-shrink: 0;
	margin-left: auto;
}

/* Below 1450 the pills drop to their own full-width row under the title and
   arrows (Rob, 2026-08-03). Squeezed between a big H2 and the nav buttons they
   were wrapping into a ragged two-line block that pushed the row taller than
   the title; given the full width they wrap cleanly and the header stays one
   tidy line. Padding and gaps tighten too, since the row is now carrying all
   the tabs rather than sharing space. */
@media (max-width: 1450px) {
	.jaunumi-tabs__header {
		flex-wrap: wrap;
	}

	.jaunumi-tabs__pills {
		order: 3;
		/* flex:0 0 100% (not just width:100%) to beat the base flex:1, whose
		   flex-basis:0 would otherwise keep the pills sharing the title row. */
		flex: 0 0 100%;
		flex-wrap: wrap;
		gap: 8px;
		/* Wrapped onto their own row, keep them left-aligned (not centred). */
		justify-content: flex-start;
	}

	.jaunumi-tabs__pill {
		padding: 10px 18px;
	}

	/* Title and arrows keep the first row to themselves. */
	.jaunumi-tabs__title {
		flex: 1;
	}
}

@media (max-width: 767px) {
	.jaunumi-tabs__pill {
		padding: 8px 14px;
		font: var(--text-body-regular);
	}
}

.jaunumi-tabs__panel {
	display: none;
}

.jaunumi-tabs__panel.is-active {
	display: block;
}

/* ---- Shop archive (category pages / search results) ---- */
/* box-sizing:border-box is required here: max-width:1920 is the Figma CANVAS
   width (gutters measured from its outer edge), but with the default
   content-box the 145px side padding was ADDED on top of that 1920 once a
   viewport got wide enough to hit the cap - up to 2210px total on an ultrawide
   monitor, pushing every .shop-archive__inner page (cart, wishlist, Piegāde,
   the shop archive...) way off the design. border-box makes max-width cap the
   TOTAL box, padding included, matching the canvas exactly. */
.shop-archive__inner {
	box-sizing: border-box;
	max-width: 1920px;
	margin: 0 auto;
	padding: 40px 145px 80px;
}

/* flex-wrap so whole crumbs move to the next line. Without it the row could
   only relieve pressure by letting a single long label wrap INSIDE itself,
   which is why "BIŠOFĪTS Elit ar alantoīnu un ēteriskām eļļām, 500 ml" broke
   across two lines while the separator stayed pinned beside it. */
.shop-breadcrumb {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px;
	font: var(--text-body-md);
	color: var(--color-grey-700);
	margin-bottom: 40px;
}

/* Each crumb stays whole; the row wraps between them instead. */
.shop-breadcrumb > a,
.shop-breadcrumb > span:not(.shop-breadcrumb__sep) {
	white-space: nowrap;
}

/* The current page's own name is the one crumb that may be far too long to
   keep on one line, so it alone is allowed to break.
   The selector has to out-specify the nowrap rule above, which it did NOT in
   its previous `> :last-child` form - that scores lower than
   `> span:not(.sep)`, so a long post title stayed on one line and pushed a
   horizontal scrollbar onto the whole page. */
.shop-breadcrumb > a:last-child,
.shop-breadcrumb > span:last-child:not(.shop-breadcrumb__sep) {
	white-space: normal;
	min-width: 0;
	overflow-wrap: anywhere;
	/* Current-page crumb (Figma 139:7001) - darker than the grey-700 trail
	   behind it. */
	color: var(--color-grey-900);
}

.shop-breadcrumb a {
	color: var(--color-grey-700);
	text-decoration: none;
}

.shop-breadcrumb a:hover {
	color: var(--color-brand-blue);
}

.product-page__breadcrumb-wrap {
	padding-bottom: 0;
}

.shop-breadcrumb__sep {
	display: inline-block;
	width: 12px;
	height: 12px;
	background: no-repeat center / contain;
	/* small right chevron between crumbs */
	-webkit-mask: url("assets/icons/chevron-right.svg") no-repeat center / contain;
	mask: url("assets/icons/chevron-right.svg") no-repeat center / contain;
	background-color: var(--color-grey-700);
}

/* 60px, not 32: the layout below also carries a 40px top margin and adjacent
   margins COLLAPSE to the larger of the two - so raising that to 40 only ever
   bought 8px over the original 32, which looked like nothing had changed. */
.shop-archive__head {
	margin-bottom: 60px;
}

/* Breathing room under the archive head (title + product count). Set on the
   layout itself - an adjacent-sibling selector only matched the variants where
   .shop-layout happens to follow the head directly, which is why it looked
   like nothing had changed. */
.shop-layout {
	margin-top: 40px;
}

.shop-archive__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0;
}

/* Still used by woocommerce/myaccount/my-account.php's subtitle line under
   its H1 - unrelated to the product count, don't remove alongside it. */
.shop-archive__count {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 8px 0 0;
}

/* Count pill beside the H1 (Figma 139:6910), replacing the old "N produkti"
   line that used to sit under the shop-archive title specifically. */
/* ---- Shared count badge ----
   ONE Figma component, used in three places and identical in all of them:
   142:7526 beside the archive H1, 275:7465 in the cart summary, 366:12679 in
   the mini-cart header. A 25px translucent-blue pill, count in brand blue at
   18px. The three had drifted into three different looks - this is now the
   single source; the per-place classes only add positioning. */
.count-badge {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	min-width: 45px;
	padding: 3px 10px 1px 9px;
	height: 25px;
	border-radius: 100px;
	background: rgba(76, 189, 227, 0.3);
	color: var(--color-brand-blue);
	font: var(--text-body-lg);
	vertical-align: middle;
	white-space: nowrap;
}

/* The mini-cart's badge is rendered with [hidden] on an empty cart. A display
   value set by an author rule outranks the UA's [hidden]{display:none}, so
   without this it would show as an empty 45px pill. */
.count-badge[hidden] {
	display: none;
}

.shop-archive__count-badge {
	margin-left: 12px;
}

.shop-layout {
	display: flex;
	align-items: flex-start;
	gap: 24px;
}

.shop-layout__main {
	flex: 1;
	min-width: 0;
}

/* Sidebar category tree */
.shop-sidebar {
	width: 390px;
	flex-shrink: 0;
	box-sizing: border-box;
	background: var(--color-white);
	border-radius: 8px;
	padding: 32px;
}

/* A <button> in the markup (it collapses the tree on narrow screens), so the
   default button chrome has to go for it to read as the heading it is. */
.shop-sidebar__title {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	width: 100%;
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 24px;
	padding: 0;
	border: none;
	background: none;
	text-align: left;
	cursor: default;
}

/* No chevron and no pointer while the list is permanently open. */
.shop-sidebar__title-chevron {
	display: none;
	flex-shrink: 0;
	transition: transform 0.15s ease;
}

.shop-sidebar__list,
.shop-sidebar__children {
	list-style: none;
	margin: 0;
	padding: 0;
}

.shop-sidebar__parent {
	/* Figma 139:6910 packs the parent rows tight (~37px pitch); 32px between
	   them made the sidebar nearly twice as tall as the design. */
	margin-bottom: 2px;
}

.shop-sidebar__row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 12px;
	margin: 0 -12px;
	border-radius: 12px;
}

/* Open/active branch gets a grey pill behind its row (Figma 142:7313, "bg hover"). */
.shop-sidebar__parent.is-open .shop-sidebar__row {
	background: var(--color-grey-100);
}

.shop-sidebar__link {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	text-decoration: none;
}

.shop-sidebar__toggle {
	flex-shrink: 0;
	border: none;
	background: none;
	padding: 4px;
	cursor: pointer;
	line-height: 0;
}

.shop-sidebar__chevron {
	transition: transform 0.15s ease;
}

.shop-sidebar__parent.is-open .shop-sidebar__chevron {
	transform: rotate(180deg);
}

/* Children hidden unless the parent branch is the active one */
.shop-sidebar__children {
	display: none;
	padding: 4px 0 8px 20px;
}

.shop-sidebar__parent.is-open .shop-sidebar__children {
	display: block;
}

.shop-sidebar__children li {
	margin-bottom: 2px;
}

.shop-sidebar__child-link {
	display: block;
	padding: 8px 0;
}

.shop-sidebar__child-link {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	text-decoration: none;
}

.shop-sidebar__link.is-active,
.shop-sidebar__child-link.is-active,
.shop-sidebar__link:hover,
.shop-sidebar__child-link:hover {
	color: var(--color-brand-blue);
}

/* Sort / filter bar */
.shop-sort-bar {
	display: flex;
	align-items: center;
	gap: 16px;
	margin-bottom: 32px;
	flex-wrap: wrap;
}

/* The filter controls (sort/brand/price) are their own form inside the row;
   the search is a separate form (global search) pushed to the right. */
.shop-sort-bar__filters {
	display: flex;
	align-items: center;
	gap: 16px;
	flex-wrap: wrap;
}

.shop-sort-bar > .shop-sort-bar__search {
	margin-left: auto;
}

/* Reuses the header search's look (.site-header__search) - same component,
   different placement, since the gray nav bar (which holds that search) is
   hidden on shop/category pages. */
.shop-sort-bar__search {
	display: flex;
	align-items: center;
	gap: 12px;
	background: var(--color-white);
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	padding: 14px 19px;
	width: 340px;
	max-width: 100%;
	margin-left: auto;
}

.shop-sort-bar__search button {
	display: flex;
	border: none;
	background: none;
	padding: 0;
	cursor: pointer;
	flex-shrink: 0;
}

.shop-sort-bar__search img {
	width: 19px;
	height: 19px;
	flex-shrink: 0;
}

.shop-sort-bar__search input {
	border: none;
	outline: none;
	flex: 1;
	min-width: 0;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	background: none;
}

.shop-sort-bar .woocommerce-ordering {
	margin: 0;
}

/* ---- Price filter dropdown (Figma 163:3176) ----
   A pill that opens a white card holding a dual-range slider and two euro
   fields. Same pill dimensions as the sort/brand selects above so the three
   controls line up. */
.filter-drop {
	position: relative;
}

.filter-pill {
	display: inline-flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	min-width: 140px;
	background: var(--color-grey-200);
	border: none;
	border-radius: 32px;
	padding: 15px 20px;
	font: var(--text-body-md);
	color: var(--color-grey-700);
	cursor: pointer;
}

.filter-drop--applied .filter-pill {
	color: var(--color-grey-900);
	/* Room for the clear "x", which sits over the pill rather than inside it -
	   an <a> can't be nested in a <button>. */
	padding-right: 48px;
}

.filter-pill__caret {
	width: 20px;
	height: 20px;
	flex-shrink: 0;
	transition: transform 0.15s ease;
}

.filter-drop--open .filter-pill__caret {
	transform: rotate(180deg);
}

.filter-pill__clear {
	position: absolute;
	top: 50%;
	right: 20px;
	transform: translateY(-50%);
	display: flex;
	width: 20px;
	height: 20px;
}

/* Panels are absolutely positioned from their trigger, so a trigger near the
   right edge used to push its panel past the viewport with no way to reach the
   controls inside. max-width caps it to the screen, and the right-edge variant
   below flips the anchor. */
.filter-drop__panel {
	position: absolute;
	z-index: 20;
	top: calc(100% + 12px);
	left: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
	width: 256px;
	max-width: calc(100vw - 32px);
	box-sizing: border-box;
	padding: 20px;
	background: var(--color-white);
	border-radius: 20px;
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.08);
}

.filter-drop__panel[hidden] {
	display: none;
}

/* Sort/brand dropdowns (Figma 163:3176) - same white card as the price
   panel, but a plain list of real links instead of the slider. Replaces what
   used to be two native <select> elements, whose open dropdown list is
   OS/browser chrome that can never match this styling. */
.filter-drop__panel--list {
	/* JS sets an inline width matching the trigger pill (assets/js/filters.js);
	   max-content is only the no-JS fallback, so no min-width here to fight it. */
	width: max-content;
	padding: 8px;
	gap: 0;
}

.filter-list-item {
	display: block;
	padding: 12px 16px;
	border-radius: 8px;
	font: var(--text-body-md);
	color: var(--color-grey-900);
	white-space: nowrap;
}

.filter-list-item:hover {
	background: var(--color-grey-100);
}

.filter-list-item.is-active {
	color: var(--color-brand-blue);
}

/* Dual-range slider: two native range inputs stacked on one track. Their
   backgrounds are transparent and pointer-events sit on the THUMBS only, so
   whichever thumb is under the cursor grabs the drag - a full-width overlay
   input would otherwise swallow every click meant for the one beneath it. */
.price-range {
	position: relative;
	height: 15px;
}

.price-range__track,
.price-range__fill {
	position: absolute;
	top: 50%;
	height: 4px;
	transform: translateY(-50%);
	border-radius: 100px;
}

.price-range__track {
	left: 0;
	right: 0;
	background: var(--color-grey-200);
}

.price-range__fill {
	background: var(--color-brand-green);
}

.price-range__input {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 15px;
	margin: 0;
	padding: 0;
	background: none;
	appearance: none;
	-webkit-appearance: none;
	pointer-events: none;
}

.price-range__input:focus {
	outline: none;
}

.price-range__input::-webkit-slider-thumb {
	appearance: none;
	-webkit-appearance: none;
	width: 15px;
	height: 15px;
	border: none;
	border-radius: 50%;
	background: var(--color-white);
	box-shadow: 0 2px 8px rgba(46, 49, 50, 0.2);
	cursor: pointer;
	pointer-events: auto;
}

.price-range__input::-moz-range-thumb {
	width: 15px;
	height: 15px;
	border: none;
	border-radius: 50%;
	background: var(--color-white);
	box-shadow: 0 2px 8px rgba(46, 49, 50, 0.2);
	cursor: pointer;
	pointer-events: auto;
}

.price-range__input::-moz-range-track {
	background: none;
}

.price-fields {
	display: flex;
	gap: 16px;
}

/* Each field takes half the row rather than a fixed 100px: two 100px controls
   plus the gap and the panel's own padding added up to more than the panel
   once max-width kicked in on a narrow screen, so the Max input hung out of
   the card. min-width:0 is required for a flex item to shrink at all. */
.price-field {
	display: flex;
	flex-direction: column;
	gap: 4px;
	flex: 1 1 0;
	min-width: 0;
}

.price-field__label {
	font: var(--text-caption);
	color: var(--color-grey-700);
}

.price-field__control {
	display: flex;
	align-items: center;
	width: 100%;
	box-sizing: border-box;
	height: 32px;
	padding: 0 12px;
	border-radius: 100px;
	background: rgba(238, 238, 239, 0.5);
}

.price-field__control input {
	flex: 1;
	min-width: 0;
	border: none;
	outline: none;
	background: none;
	font: var(--text-body-md);
	color: var(--color-grey-900);
}

.price-field__suffix {
	font: var(--text-body-md);
	color: var(--color-grey-900);
	flex-shrink: 0;
}

.price-apply {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 40px;
	padding: 0 24px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-blue);
	font: var(--text-body-md);
	color: var(--color-white);
	cursor: pointer;
}

.price-apply[disabled] {
	opacity: 0.5;
	cursor: default;
}

/* ---- Par mums (Figma 458:16347) ---- */
.parmums-hero {
	position: relative;
	background: no-repeat center / cover;
	background-image: url('assets/images/par-mums-hero.jpg');
	padding-top: 40px;
	padding-bottom: 40px;
	/* Full-bleed comes from the MARKUP now - this section is a direct child of
	   <body>, outside the padded #site-content wrapper (see the note in
	   page-templates/par-mums.php). No 100vw breakout, so no scrollbar
	   overhang and no horizontal scroll. */
}

.parmums-hero__inner {
	padding-top: 0;
	padding-bottom: 0;
}

.parmums-hero__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 24px 0 8px;
}

.parmums-hero__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	max-width: 800px;
	margin: 0;
}

/* Shared perk-pill row - Par mums + Kontakti (template-parts/shared/perks-strip.php) */
/* Grid, not flex: with flex the column count was an emergent result of
   flex-basis + min-width + the longest label, which is why it dropped to one
   column far earlier than intended. A grid states the count outright. */
.perks-strip {
	display: grid;
	grid-template-columns: repeat(6, 1fr);
	gap: 12px;
	list-style: none;
	margin: 0 0 64px;
	padding: 0;
}

.perks-strip__item {
	display: flex;
	align-items: center;
	gap: 12px;
	flex: 1;
	min-width: 0;
	background: var(--color-white);
	border-radius: 4px;
	padding: 20px 24px;
}

/* All 6 fit on one row at desktop widths (Figma 458:16347) - the old
   flex-wrap:wrap + min-width:220px combination let the longest label
   ("Konsultācijas un pasūtīšana pa telefonu") force a wrap, and flex:1 then
   stretched that lone item across the entire second row by itself.

   Wraps from 1200px down, NOT 767px: 6 items need ~1320px, so at both 1024
   and 768 the last item's label still ran past the viewport (measured 16px
   over on Par mums and Kontakti at 768). */
@media (max-width: 1200px) {
	.perks-strip {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 900px) {
	.perks-strip {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* One column only at 600, not 768 - two columns still read fine on a tablet. */
@media (max-width: 600px) {
	.perks-strip {
		grid-template-columns: 1fr;
	}
}

.perks-strip__item img {
	width: 48px;
	height: 48px;
	border-radius: 12px;
	object-fit: cover;
	flex-shrink: 0;
}

.perks-strip__item span {
	font: var(--text-body-md);
	color: var(--color-grey-900);
}

.parmums-intro,
.parmums-europe {
	display: flex;
	align-items: center;
	gap: 24px;
	margin-bottom: 64px;
}

.parmums-intro__photo {
	width: 50%;
	height: 445px;
	object-fit: cover;
	border-radius: 4px;
	flex-shrink: 0;
}

.parmums-intro__text,
.parmums-europe__text {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 24px;
}

/* 48px between the image and the text column (Figma 458:16347). */
.parmums-intro,
.parmums-europe {
	gap: 48px;
}

.parmums-intro__text h2,
.parmums-europe__text h2,
.parmums-whyus h2 {
	font: var(--text-h3);
	color: var(--color-grey-900);
	margin: 0;
}

.parmums-intro__text p,
.parmums-europe__text > p {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	margin: 0;
}

/* A plain <ul>/<li>, with the green check supplied as the LIST MARKER rather
   than an <img> per row - semantic markup, and the icon changes in one place.
   list-style-image can't be sized, so the marker is drawn with ::marker-free
   padding + a background image instead, which is sizeable and vertically
   centres against the first line of text. */
.parmums-ticks {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.parmums-ticks li {
	position: relative;
	padding-left: 36px;
	min-height: 20px;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.parmums-ticks li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 50%;
	transform: translateY(-50%);
	width: 20px;
	height: 20px;
	background: url("assets/icons/circle-check-big.svg") no-repeat center / contain;
}

/* Legacy markup (page-templates/par-mums.php) still wraps each row in
   <img> + <span>; keep those readable until that file is retired. */
.parmums-ticks li > img {
	display: none;
}

.parmums-ticks span {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.parmums-europe__map {
	position: relative;
	width: 50%;
	height: 400px;
	border-radius: 4px;
	overflow: hidden;
	flex-shrink: 0;
}

.parmums-europe__map img:first-child {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.parmums-europe__marker,
.parmums-europe__marker-shadow {
	position: absolute;
	width: auto;
	height: auto;
}

.parmums-europe__marker {
	left: 81%;
	top: 33%;
	width: 24px;
}

.parmums-europe__marker-shadow {
	left: 78%;
	top: 37%;
	width: 81px;
}

.parmums-whyus {
	margin-bottom: 64px;
}

.parmums-whyus h2 {
	text-align: center;
	margin-bottom: 60px;
}

.parmums-whyus__grid {
	display: flex;
	gap: 21px;
}

.parmums-card {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 20px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
	text-align: center;
}

.parmums-card__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 70px;
	height: 70px;
	border-radius: 50%;
	background: var(--color-light-blue);
}

.parmums-card__title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0;
}

.parmums-card__text {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin: 0;
}

/* The source photo (1024x684) is mostly flat pale-green with the flowers
   clustered in the top-right corner, so it can be used as a full-bleed cover
   background rather than a pasted-on corner graphic: `cover` scales it to fill,
   `right` pins the flower corner to the right edge, and the vertical position
   crops off the empty top strip and the bottom of the frame. The left of the
   image is plain green, so the heading/paragraph sit on flat colour with no
   contrast problem. background-color stays as the fallback for the moment
   before the image decodes, and for any sliver cover doesn't reach.
   Longhand, not the `background` shorthand: the block template sets
   background-image inline (editable field), and a shorthand here would fight
   it. */
.parmums-cta {
	position: relative;
	background-color: var(--color-light-green);
	background-image: url("assets/images/par-mums-cta-bg.png");
	background-repeat: no-repeat;
	background-size: cover;
	background-position: right 22%;
	border-radius: 4px;
	padding: 48px;
	min-height: 260px;
	box-sizing: border-box;
	margin-bottom: 64px;
}

/* Below 1200px the banner is too narrow for the photo to read as anything but
   noise behind the text - drop to the flat brand green. !important is required
   here (and only here): the block template sets background-image as an INLINE
   style from the editable field, which nothing but !important can override. */
@media (max-width: 1200px) {
	.parmums-cta {
		background-image: none !important;
	}
}

.parmums-cta h2 {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

.parmums-cta p {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	max-width: 509px;
	margin: 0 0 16px;
}

.parmums-cta__btn {
	display: inline-flex;
	background: var(--color-brand-green);
	color: var(--color-white);
	padding: 0 24px;
	height: 40px;
}

/* ---- Pirkuma nosacījumi (Figma 585:16742) ---- */
.pn-hero__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	max-width: 800px;
	margin: 8px 0 0;
}

.pn-intro {
	display: flex;
	gap: 24px;
	margin: 40px 0 60px;
}

/* The designer's artwork is the card background (Figma 590:16941/16942 - one
   803x271 image bleeding behind the whole card), so the gradients that stood in
   for it are gone. Pinned bottom-left and covering, which keeps the laptop /
   phone in the source file's lower-left corner visible however the card is
   sized. Text sits in the right half, matching the design's x=453 of 803. */
.pn-intro__card {
	flex: 1;
	min-width: 0;
	display: flex;
	align-items: center;
	/* Text block pinned to the right half. NOT a percentage padding-left: those
	   resolve against the flex CONTAINER's width, not the card's, so a 56% rule
	   computed to 912px on a 952px card and crushed the text to nothing. */
	justify-content: flex-end;
	border-radius: 4px;
	overflow: hidden;
	/* Figma 590:16941: content box is 48px in from every edge of the 803x271
	   card (text frame at x=453 y=48, 302 wide, 175 tall). */
	padding: 48px;
	box-sizing: border-box;
	min-height: 271px;
	background-color: var(--color-light-blue);
	position: relative;
}

/* Fills the card as its backdrop while the layout is side by side; anchored
   bottom-left so the device in the artwork's lower-left corner is what survives
   the crop. Becomes a normal stacked block below 1024 (see that query). */
.pn-intro__image {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: left bottom;
}

/* 302px is the design's own text column (Figma 596:15997). */
.pn-intro__body {
	width: 302px;
	max-width: 100%;
	flex-shrink: 0;
	position: relative;
	z-index: 1;
}

/* Figma's Button primary is 201x56 - without a floor the shorter labels
   ("Zvanīt") shrink to a pill half the design's width. */
.pn-intro__body .pill-btn {
	min-width: 201px;
	justify-content: center;
}

/* Title measures 31px tall in Figma - that's h5 (24/1.3), not h4's 32px. */
.pn-intro__body h2 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

/* 40px below the copy, matching the design's gap to the button (text block
   ends at y=79 in Frame 263, button starts at y=119). */
.pn-intro__body p {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin: 0 0 40px;
}

.pn-steps {
	margin-bottom: 60px;
}

.pn-steps__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

.pn-steps__grid {
	display: flex;
	gap: 21px;
}

.pn-step {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
	text-align: center;
}

.pn-step__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 70px;
	height: 70px;
	border-radius: 50%;
	background: var(--color-light-blue);
}

.pn-step__title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0;
}

.pn-step__text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0;
}

/* The card's own content goes vertical at the same width the row does. That is
   also where the artwork stops being a backdrop and becomes a band above the
   text - as a background it kept sitting underneath the copy and the two
   overlapped. */
@media (max-width: 1024px) {
	.pn-intro {
		flex-direction: column;
	}

	.pn-intro__card {
		flex-direction: column;
		justify-content: flex-start;
		align-items: stretch;
		padding: 0;
		min-height: 0;
	}

	.pn-intro__image {
		position: static;
		height: 220px;
	}

	.pn-intro__body {
		width: 100%;
		padding: 24px;
		box-sizing: border-box;
	}

	.pn-steps__grid {
		flex-wrap: wrap;
	}

	.pn-step {
		flex: 1 1 calc(33.333% - 14px);
	}
}

@media (max-width: 767px) {
	/* Shallower artwork band on a phone, so the copy is not pushed below the
	   fold by a near-square image. */
	.pn-intro__image {
		height: 160px;
	}

	.pn-intro__body .pill-btn {
		min-width: 0;
		width: 100%;
	}

	.pn-step {
		flex-basis: calc(50% - 11px);
	}
}

/* ---- Kontakti (Figma 540:18206) ---- */
.kontakti-hero {
	background: linear-gradient(97deg, #EDE9EA 0%, #A0D5DE 100%);
	padding: 40px 0;
	margin-bottom: 40px;
	/* Full-bleed via markup (direct child of <body>), same as .parmums-hero. */
}

/* The gap after the hero was 80px, not the design's 40: this margin-bottom
   AND .shop-archive__inner's own 40px padding-top were stacking. Zero the
   container's top padding directly after a hero band so only one of them
   counts. */
.kontakti-hero + #site-content > .shop-archive__inner,
.parmums-hero + #site-content > .shop-archive__inner {
	padding-top: 0;
}

.kontakti-hero__inner {
	padding-top: 0;
	padding-bottom: 0;
}

.kontakti-hero__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 24px 0 8px;
}

.kontakti-hero__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	max-width: 800px;
	margin: 0;
}

.kontakti-cards {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 24px;
	list-style: none;
	margin: 0 0 40px;
	padding: 0;
}

/* Two centred columns on a tablet - three are too cramped, one wastes the
   width. The odd third card centres itself across both tracks. */
@media (max-width: 1024px) {
	.kontakti-cards {
		grid-template-columns: repeat(2, 1fr);
	}

	.kontakti-cards > :last-child:nth-child(odd) {
		grid-column: 1 / -1;
	}
}

@media (max-width: 678px) {
	.kontakti-cards {
		grid-template-columns: 1fr;
	}

	.kontakti-cards > :last-child:nth-child(odd) {
		grid-column: auto;
		max-width: none;
		justify-self: stretch;
	}
}

.kontakti-card {
	display: flex;
	align-items: center;
	gap: 20px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

/* The icons were 70px baked-in PNGs whose "circle" was part of the artwork -
   at any other size the ring went soft and the padding was wrong. They're now
   plain 20px SVGs (Figma's real assets) sitting in a CSS circle, so the ring
   is crisp, sized here, and recolourable. */
.kontakti-card__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	border-radius: 100px;
	background: var(--color-light-blue);
	flex-shrink: 0;
}

.kontakti-card img {
	width: 20px;
	height: 20px;
	flex-shrink: 0;
}

.kontakti-card__title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.kontakti-card__line {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin: 0 0 4px;
}

.kontakti-card__note {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0;
}

.kontakti-contact {
	display: flex;
	gap: 24px;
	margin-bottom: 64px;
}

.kontakti-form {
	flex: 1;
	min-width: 0;
}

.kontakti-form h2 {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.kontakti-form__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0 0 32px;
}

.kontakti-form__missing {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	background: var(--color-grey-100);
	border-radius: 4px;
	padding: 20px;
}

/* ---- Contact Form 7, styled to Figma 540:18224 ----
   Scoped to .kontakti-form so it can't leak into any other CF7 form added
   later.

   BUG FIX (confirmed live, this is why the form read as completely
   unstyled/cramped despite the rules below existing): this comment used to
   claim "CF7 wraps every field in <p>", which is only true for a form
   authored with each mail-tag on its own line. This form's actual saved
   content puts every field in ONE shared <p>, separated by plain <br> -
   `<p><label>Vārds<br><span class="wpcf7-form-control-wrap">...</span>
   </label><br><label>Tālrunis<br>...`. So `.wpcf7-form p { margin-bottom:
   20px }` only ever had ONE <p> to apply to for the WHOLE form, meaning
   there was no real gap between fields at all - just each field's own
   line-height from the <br>. <label> is the element that genuinely wraps
   ONE field each regardless of this quirk, so the inter-field gap has to
   live there instead. */
.kontakti-form .wpcf7-form label {
	display: block;
	margin-bottom: 20px;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

/* No trailing gap under the last real field (the message textarea) before
   the checkbox row - it already gets its own margin-top below. */
.kontakti-form .wpcf7-acceptance {
	display: block;
	margin-bottom: 24px;
}

.kontakti-form .wpcf7-form-control-wrap {
	display: block;
	margin-top: 6px;
}

.kontakti-form .wpcf7-form input[type="text"],
.kontakti-form .wpcf7-form input[type="email"],
.kontakti-form .wpcf7-form input[type="tel"] {
	width: 100%;
	height: 47px;
	padding: 0 20px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	background: var(--color-white);
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	box-sizing: border-box;
}

.kontakti-form .wpcf7-form textarea {
	width: 100%;
	min-height: 170px;
	padding: 14px 20px;
	border: 1px solid var(--color-grey-200);
	border-radius: 24px;
	background: var(--color-white);
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	box-sizing: border-box;
	resize: vertical;
	display: block;
}

.kontakti-form .wpcf7-form input:focus,
.kontakti-form .wpcf7-form textarea:focus {
	outline: none;
	border-color: var(--color-brand-blue);
}

.kontakti-form .wpcf7-form input::placeholder,
.kontakti-form .wpcf7-form textarea::placeholder {
	color: var(--color-grey-400);
}

/* Consent checkbox. CF7 renders acceptance as
   <span class="wpcf7-list-item"><label><input><span class="wpcf7-list-item-label">
   so the row is built on that inner label. */
.kontakti-form .wpcf7-acceptance .wpcf7-list-item {
	margin: 0;
}

.kontakti-form .wpcf7-acceptance label {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	cursor: pointer;
	color: var(--color-grey-900);
}

.kontakti-form .wpcf7-acceptance input[type="checkbox"] {
	width: 20px;
	height: 20px;
	margin: 0;
	flex-shrink: 0;
	accent-color: var(--color-brand-blue);
	cursor: pointer;
}

.kontakti-form .wpcf7-acceptance .wpcf7-list-item-label {
	font: var(--text-body-regular);
}

.kontakti-form .wpcf7-form .wpcf7-submit {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 56px;
	margin-top: 24px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-green);
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
	cursor: pointer;
}

.kontakti-form .wpcf7-form .wpcf7-submit:disabled {
	opacity: 0.6;
	cursor: default;
}

/* CF7's own validation + response messages, which ship unstyled once WC's
   stylesheet is dequeued. */
.kontakti-form .wpcf7-not-valid-tip {
	display: block;
	margin-top: 6px;
	font: var(--text-caption);
	color: var(--color-crimson);
}

.kontakti-form .wpcf7-form input.wpcf7-not-valid,
.kontakti-form .wpcf7-form textarea.wpcf7-not-valid {
	border-color: var(--color-crimson);
}

/* Bigger card, full muted-tint background matching the border colour (not a
   thin accent line on a white box), plus a big round glyph per state. CF7's
   own JS puts the real status as a class on the <form> (confirmed in its
   bundled index.js): mail_sent->sent, validation_failed->invalid,
   mail_failed->failed, acceptance_missing->unaccepted, spam->spam,
   aborted->aborted. */
.kontakti-form .wpcf7-response-output {
	display: flex;
	align-items: center;
	gap: 16px;
	margin: 24px 0 0;
	padding: 28px 24px;
	border: 1px solid var(--color-grey-200);
	border-radius: 8px;
	background: var(--color-grey-100);
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

/* The glyph: a solid circle in the state colour with a bold white character -
   check/exclamation/X, one shared recipe, different content + colour. */
.kontakti-form .wpcf7-response-output::before {
	flex-shrink: 0;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	display: none;
	align-items: center;
	justify-content: center;
	color: var(--color-white);
	font-size: 18px;
	font-weight: 700;
	line-height: 1;
}

.kontakti-form .wpcf7-form.sent .wpcf7-response-output {
	border-color: rgba(120, 191, 67, 0.35);
	background: rgba(120, 191, 67, 0.12);
}

.kontakti-form .wpcf7-form.sent .wpcf7-response-output::before {
	content: "\2713";
	display: flex;
	background: var(--color-brand-green);
}

.kontakti-form .wpcf7-form.unaccepted .wpcf7-response-output {
	border-color: rgba(249, 191, 71, 0.5);
	background: var(--color-light-yellow);
}

.kontakti-form .wpcf7-form.unaccepted .wpcf7-response-output::before {
	content: "!";
	display: flex;
	background: var(--color-yellow);
}

.kontakti-form .wpcf7-form.invalid .wpcf7-response-output,
.kontakti-form .wpcf7-form.failed .wpcf7-response-output,
.kontakti-form .wpcf7-form.spam .wpcf7-response-output,
.kontakti-form .wpcf7-form.aborted .wpcf7-response-output {
	border-color: rgba(255, 56, 113, 0.3);
	background: rgba(255, 56, 113, 0.1);
}

.kontakti-form .wpcf7-form.invalid .wpcf7-response-output::before,
.kontakti-form .wpcf7-form.failed .wpcf7-response-output::before,
.kontakti-form .wpcf7-form.spam .wpcf7-response-output::before,
.kontakti-form .wpcf7-form.aborted .wpcf7-response-output::before {
	content: "\2715";
	display: flex;
	background: var(--color-crimson);
}

.kontakti-form .wpcf7-spinner {
	margin: 0 0 0 12px;
}

/* No fixed height: the row is a flex container with the default
   align-items:stretch, so dropping the 682px lets the map column take exactly
   the form column's height - which changes with the number of fields and with
   validation messages appearing. min-height only covers the degenerate case
   where the form renders short (e.g. CF7 inactive). */
.kontakti-map {
	flex: 1;
	min-width: 0;
	align-self: stretch;
	min-height: 400px;
	border-radius: 4px;
	overflow: hidden;
}

/* width/height must be set in CSS, not just as HTML attributes: `height="100%"`
   is not a valid iframe HTML attribute (percentages are only allowed on width),
   so the browser ignored it and fell back to the 150px default - the map
   rendered as a small box floating in the 682px column. */
.kontakti-map iframe {
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
}

/* ---- Cart page (Figma 232:3982, "Cart_Piegāde" frame 211:3949 for the
   filled-cart layout) ---- */
.cart-page__head {
	margin-bottom: 40px;
}

/* No top margin - the title has to sit level with the top of the summary card
   beside it (Figma 211:3949), and .cart-layout aligns the two columns at their
   top edges, so any margin here pushes it out of line. */
.cart-page__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.cart-page__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0;
}

.cart-layout {
	display: flex;
	align-items: flex-start;
	gap: 24px;
	margin-bottom: 60px;
}

.cart-layout__main {
	flex: 1;
	min-width: 0;
}

/* 527px, matching Figma 275:7406 (and the checkout sidebar, which is the same
   summary card and already used 527) - it was the odd one out at 390. At the
   design's 1920 that leaves 1079 for the item list: 1630 content - 24 gap. */
.cart-layout__sidebar {
	width: 527px;
	flex-shrink: 0;
	position: sticky;
	top: 24px;
}

.cart-items {
	list-style: none;
	margin: 0 0 24px;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.cart-item {
	display: flex;
	align-items: center;
	gap: 16px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 20px;
}

/* 68px with a grey-200 hairline (Figma 211:4874). */
.cart-item__thumb {
	display: block;
	width: 68px;
	height: 68px;
	flex-shrink: 0;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
	overflow: hidden;
	box-sizing: border-box;
}

/* contain, not cover - product packshots are portrait and were being cropped
   top and bottom to fill the square. */
.cart-item__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.cart-item__info {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.cart-item__name {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

/* 18px BOLD grey-900 (Figma 211:4895) - it was 14px medium grey-700. */
.cart-item__price {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

/* Sold out / not enough stock while already in the cart (see cart.php). */
.cart-item__unavailable {
	font: var(--text-body-md);
	font-weight: 700;
	color: var(--color-crimson);
}

/* The stepper can't take this line any higher, so it reads as inert rather
   than looking like it just isn't responding. Pointer-events stay ON for the
   minus button - reducing the quantity is exactly what the shopper needs to
   do here - so only the plus is actually blocked. */
.cart-item--unavailable .qty-step--plus {
	opacity: 0.35;
	pointer-events: none;
}

/* Cart row controls are the full-size set from Figma 218:3726: a 144x56
   stepper next to two 56px round buttons, 16px apart. (They were previously
   scaled down to 40px here, which is also why the remove button looked so
   much smaller than everything around it.) */
/* space-between: the three children (40 + 40 + 48) are 8px narrower than the
   pill's content box, and packed left that slack all collected to the RIGHT of
   the plus - which is what made the plus look shoved inward and off-centre.
   Pinning both ends and letting the value field absorb the slack puts the two
   buttons at equal insets, as in Figma 211:4880. */
.cart-item__qty .quantity {
	width: 144px;
	height: 56px;
	padding: 4px;
	box-sizing: border-box;
	justify-content: space-between;
}

.cart-item__qty .qty-step {
	width: 40px;
	height: 40px;
}

.cart-item__qty .qty-step--plus {
	width: 48px;
	height: 48px;
}

.cart-item__qty input.qty {
	flex: 1;
	min-width: 0;
	height: 100%;
	font: var(--text-body-lg-bold);
}

/* 56px round buttons with 24px icons (Figma 218:3726 / 211:4885). The remove
   button is a bare <a>, so without explicit sizing it collapsed to its icon -
   which is why it read as much smaller than the wishlist heart beside it. */
.cart-item__wishlist,
.cart-item__remove {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	padding: 0;
	border-radius: 50%;
	background: var(--color-grey-200);
}

.cart-item__wishlist img,
.cart-item__remove img {
	width: 24px;
	height: 24px;
}

.cart-item__remove:hover {
	background: var(--color-grey-100);
}

.cart-actions {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: 12px;
	flex-wrap: wrap;
	margin-top: 16px;
}

/* "Atjaunot grozu" is disabled by WooCommerce's cart.js until a quantity
   actually changes, so the two states have to read very differently - it was
   previously the same flat grey either way and looked broken. */
.cart-actions button[name="update_cart"] {
	height: 48px;
	padding: 0 32px;
	background: var(--color-brand-blue);
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
}

.cart-actions button[name="update_cart"]:disabled {
	background: var(--color-grey-200);
	color: var(--color-grey-700);
	cursor: default;
}

.cart-actions .coupon {
	display: flex;
	gap: 8px;
	flex: 1;
}

.cart-actions .coupon .input-text {
	flex: 1;
	height: 47px;
	padding: 0 20px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	font: var(--text-body-regular);
}

.cart-summary {
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

.cart-summary__title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

.cart-summary__row {
	display: flex;
	justify-content: space-between;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	margin-bottom: 16px;
}

/* ---- WooCommerce notices ----
   WC's own stylesheet is dequeued theme-wide (woocommerce_enqueue_styles ->
   __return_empty_array), so every notice - add-to-cart confirmations, coupon
   errors, login errors - rendered as bare unstyled text jammed against the
   left edge of the viewport. These give them the theme's card look and pull
   them inside the same 145px gutter the rest of the page uses. */
.woocommerce-notices-wrapper {
	max-width: 1920px;
	margin: 0 auto;
	padding: 0 145px;
	box-sizing: border-box;
}

/* Gutter-only wrapper around woocommerce_before_checkout_form (the login /
   coupon toggles) - see form-checkout.php. It sits directly above the page's
   own .shop-archive__inner, so it contributes the side padding and nothing
   else; both classes needed to beat that rule's own vertical padding. */
.shop-archive__inner.checkout-page__before {
	padding-top: 0;
	padding-bottom: 0;
}

.shop-archive__inner.checkout-page__before:empty {
	display: none;
}

.woocommerce-message,
.woocommerce-error,
.woocommerce-info {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 12px;
	/* Bottom margin matters: on checkout the notice renders directly above the
	   "Grozs" back button, which was sitting flush against it. */
	margin: 16px 0 24px;
	padding: 16px 20px;
	border-radius: 4px;
	border-left: 4px solid var(--color-brand-blue);
	background: var(--color-white);
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	list-style: none;
}

.woocommerce-message {
	border-left-color: var(--color-brand-green);
}

.woocommerce-error {
	border-left-color: var(--color-crimson);
}

/* WC renders errors as a <ul> of <li>; kill the default list chrome so a
   single-item error reads as one line, not a bullet. */
.woocommerce-error li {
	list-style: none;
	margin: 0;
}

/* The inline action link WC appends ("Apskatīt grozu", "Turpināt iepirkties")
   comes through as .button - make it read as the theme's pill, pushed to the
   far end of the notice row. */
.woocommerce-message .button,
.woocommerce-error .button,
.woocommerce-info .button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin-left: auto;
	height: 40px;
	padding: 0 20px;
	border-radius: 100px;
	border: none;
	background: var(--color-brand-blue);
	color: var(--color-white);
	font: var(--text-body-regular);
	cursor: pointer;
}

/* Track the same 1440 breakpoint the header and .shop-archive__inner use, or
   notices sit 125px inside the content they belong to. */
@media (max-width: 1440px) {
	.woocommerce-notices-wrapper {
		padding: 0 20px;
	}
}

@media (max-width: 1200px) {
	.woocommerce-notices-wrapper {
		padding: 0 24px;
	}
}

@media (max-width: 767px) {
	.woocommerce-notices-wrapper {
		padding: 0 12px;
	}

	.woocommerce-message .button,
	.woocommerce-error .button,
	.woocommerce-info .button {
		margin-left: 0;
	}
}

/* WC's own "Cart totals" H2 (cart-totals.php) is redundant - the sidebar
   already has our own "Pasūtījuma kopsavilkums" heading above it. */
.cart_totals > h2 {
	display: none;
}

/* ---- Cart summary card rows + coupon (Figma 369:14603 empty, 369:14666
   typing, 369:14788 invalid, 372:9240 applied) ---- */
.cart-summary__rows .cart-summary__row {
	align-items: flex-start;
	font: var(--text-body-regular);
}

.cart-summary__label {
	display: flex;
	align-items: center;
	/* 16px between the label and its count badge (Figma 275:7463). */
	gap: 16px;
	color: var(--color-grey-900);
}

.cart-summary__label small {
	display: block;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

/* Look comes from the shared .count-badge; nothing to add here. */

.cart-summary__value {
	text-align: right;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

.cart-summary__row--total .cart-summary__label {
	flex-direction: column;
	align-items: flex-start;
	gap: 4px;
	font: var(--text-h5);
}

.cart-summary__row--total .cart-summary__value strong {
	font: var(--text-h5);
}

.cart-summary__applied-note {
	display: block;
	margin-top: 4px;
	font: var(--text-caption);
	color: var(--color-brand-green);
}

.cart-summary__row--discount .cart-summary__value {
	color: var(--color-brand-green);
}

.cart-summary__coupon-remove {
	color: var(--color-grey-700);
	font-size: 18px;
	line-height: 1;
}

.cart-summary__divider {
	border: none;
	border-top: 1px solid var(--color-grey-200);
	margin: 16px 0;
}

.cart-coupon {
	margin-bottom: 24px;
}

.cart-coupon__row {
	display: flex;
	gap: 8px;
	align-items: flex-start;
}

/* The field is the piece that changes colour per state; the button never does. */
.cart-coupon__field {
	position: relative;
	flex: 1;
	min-width: 0;
	display: flex;
	align-items: center;
	height: 40px;
	padding: 0 16px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	background: var(--color-white);
	box-sizing: border-box;
}

.cart-coupon__icon {
	flex-shrink: 0;
	margin-right: 8px;
	opacity: 0.5;
	/* Only shown once the field carries a value/state - Figma's empty state has
	   no magnifier, the invalid + applied states do. */
	display: none;
}

.cart-coupon.is-invalid .cart-coupon__icon,
.cart-coupon.is-applied .cart-coupon__icon {
	display: block;
}

.cart-coupon__input {
	flex: 1;
	min-width: 0;
	border: none;
	outline: none;
	background: none;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.cart-coupon__input::placeholder {
	color: var(--color-grey-700);
}

/* Typing/focused - Figma 369:14666 */
.cart-coupon__field:focus-within {
	border-color: var(--color-brand-blue);
}

/* Invalid - Figma 369:14788 (Additional/Crimson) */
.cart-coupon.is-invalid .cart-coupon__field {
	border-color: var(--color-crimson);
}

/* Applied - Figma 372:9240 (Brand/Green) */
.cart-coupon.is-applied .cart-coupon__field {
	border-color: var(--color-brand-green);
}

.cart-coupon__submit {
	flex-shrink: 0;
	height: 40px;
	padding: 0 20px;
	background: var(--color-brand-blue);
	color: var(--color-white);
	font: var(--text-body-regular);
}

.cart-coupon__msg {
	margin: 8px 0 0;
	font: var(--text-caption);
}

.cart-coupon__msg--error {
	color: var(--color-crimson);
}

.cart-coupon__msg--ok {
	color: var(--color-brand-green);
}

.cart-summary__checkout {
	width: 100%;
	height: 56px;
}

.cart_totals table {
	width: 100%;
	border-collapse: collapse;
	margin-bottom: 24px;
}

.cart_totals th,
.cart_totals td {
	text-align: left;
	padding: 12px 0;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	border-bottom: 1px solid var(--color-grey-200);
}

.cart_totals td {
	text-align: right;
}

.cart_totals .order-total th,
.cart_totals .order-total td {
	font: var(--text-h5);
	border-bottom: none;
}

.wc-proceed-to-checkout .checkout-button {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 56px;
	border-radius: 100px;
	background: var(--color-brand-green);
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
}

.cart-summary__disabled {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 56px;
	border-radius: 100px;
	background: var(--color-brand-green);
	opacity: 0.6;
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
	pointer-events: none;
}

/* Grey notice boxes under the checkout button (Figma 223:4130) - see
   vio_shop_cart_notices() in inc/woocommerce.php. */
.cart-notice {
	display: flex;
	gap: 10px;
	align-items: flex-start;
	background: var(--color-grey-200);
	border-radius: 4px;
	padding: 24px;
	margin-top: 16px;
	box-sizing: border-box;
}

.cart-notice__icon {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	background: currentColor;
	color: var(--color-grey-700);
	-webkit-mask: url("assets/icons/info.svg") no-repeat center / contain;
	mask: url("assets/icons/info.svg") no-repeat center / contain;
}

.cart-notice p {
	margin: 0;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

/* Free-shipping threshold reached (Figma 366:14112) - same box, green. */
.cart-notice--success {
	background: var(--color-light-green);
}

.cart-notice--success .cart-notice__icon {
	color: var(--color-brand-green);
}

.cart-notice--success p {
	color: var(--color-brand-green);
}

.cart-empty {
	background: var(--color-white);
	border-radius: 4px;
	padding: 80px 24px;
	text-align: center;
}

/* Reason the checkout button is inert (cart/cart-totals.php). */
.cart-summary__blocked {
	margin: 12px 0 0;
	font: var(--text-caption);
	color: var(--color-crimson);
	text-align: center;
}

/* ---- Checkout blocked by a cart problem (checkout/cart-errors.php) ----
   WC prints its own specific error notices above this card. */
.cart-errors {
	max-width: 640px;
	margin: 40px auto 80px;
}

.cart-errors__icon {
	display: inline-block;
	width: 48px;
	height: 48px;
	margin-bottom: 16px;
	background: var(--color-crimson);
	-webkit-mask: url("assets/icons/info.svg") no-repeat center / contain;
	mask: url("assets/icons/info.svg") no-repeat center / contain;
}

.cart-errors .pill-btn {
	display: inline-flex;
}

.cart-empty__title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.cart-empty__text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 24px;
}

.cart-empty .pill-btn {
	display: inline-flex;
	background: var(--color-brand-blue);
	color: var(--color-white);
	padding: 0 24px;
	height: 40px;
}

/* Cross-sells - real WC data, plain grid (not a slider - simplification, see
   the note in woocommerce/cart/cart.php) reusing the shop product-card. */
.cross-sells > h2 {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

.cross-sells ul.products {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 24px;
}

.cross-sells ul.products li.product {
	width: auto;
	float: none;
	margin: 0;
}

/* ---- Single product page (Figma 163:3243) ---- */
.product-page {
	box-sizing: border-box;
	max-width: 1920px;
	margin: 0 auto;
	/* No top padding: the breadcrumb wrapper above already has 40px on top
	   (.shop-archive__inner) and the breadcrumb's own 40px margin-bottom -
	   adding 40 more here doubled the gap below the breadcrumb to 80px. */
	padding: 0 145px 80px;
}

.product-page__top {
	display: flex;
	gap: 24px;
	margin-bottom: 60px;
	align-items: flex-start;
}

/* Product page: content column + partner sidebar. The sidebar is a sibling of
   the whole column (gallery, summary AND the description tabs), so its sticky
   travel runs the full height of the page rather than stopping level with the
   gallery. */
/* NOT align-items:flex-start. A sticky element can only travel inside its own
   containing block, and with flex-start the aside was only as tall as the
   sidebar itself - so there was no distance to travel and it never moved.
   Stretching the aside to the row's full height is what gives the sticky
   sidebar its runway. */
.product-page__layout {
	display: flex;
	align-items: stretch;
	gap: 24px;
}

.product-page__aside {
	flex-shrink: 0;
}

.product-page__main {
	flex: 1;
	min-width: 0;
}

.product-page__aside .marketplace-sidebar {
	width: 190px;
	flex-shrink: 0;
	position: sticky;
	/* Was top:24px - sat right at the browser edge as soon as it stuck.
	   Rob wants more breathing room from the top when it's stuck. */
	top: 100px;
	/* No overflow / max-height here: overflow on a sticky element turns it into
	   its own scroll container, and no ancestor of a sticky element may have
	   overflow other than visible or it silently stops sticking. The runway
	   comes from .product-page__aside being stretched to the row height. */
}

.product-gallery {
	width: 100%;
	position: relative;
}

/* WooCommerce prints its sale flash OUTSIDE the gallery markup, so absolutely
   positioning it just anchored it to the page (it ended up top-right of the
   viewport). It has no styling at all here anyway - WC's stylesheet is
   dequeued - so it's hidden and the badge is rendered inside the gallery
   instead (see woocommerce/single-product/product-image.php). */
.product-page .onsale {
	display: none;
}

.product-gallery__badge {
	position: absolute;
	top: 20px;
	right: 20px;
	z-index: 2;
	margin: 0;
	padding: 6px 16px;
	border-radius: 100px;
	background: #E14F4F;
	color: var(--color-white);
	font: var(--text-body-md);
	white-space: nowrap;
}

.product-gallery__main {
	background: var(--color-white);
	border-radius: 4px;
	height: 553px;
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
	margin-bottom: 12px;
}

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

/* No-photo state (Figma 361:11491): the frame keeps its full height so the
   summary column beside it doesn't jump, and says so in plain grey text. */
.product-gallery--empty .product-gallery__main {
	margin-bottom: 0;
}

.product-gallery__empty-label {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.product-gallery__thumbs {
	display: flex;
	gap: 12px;
}

.product-gallery__thumb {
	width: 100px;
	height: 100px;
	padding: 0;
	background: var(--color-white);
	border: 2px solid transparent;
	border-radius: 4px;
	overflow: hidden;
	cursor: pointer;
}

.product-gallery__thumb.is-active {
	border-color: var(--color-brand-blue);
}

.product-gallery__thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.product-page__summary {
	flex: 1;
	min-width: 0;
}

/* This used to stack at 1700 because the gallery was pinned at a fixed 803px,
   which starved the summary on every laptop. The gallery is a percentage now
   and shrinks with the row, so the two can stay side by side much further
   down - they only stack at 1200, the same point the partner sidebar drops
   out and the row gets that space back. */
@media (max-width: 1200px) {
	.product-page__top {
		flex-wrap: wrap;
	}

	.product-page__summary {
		flex-basis: 100%;
	}

	/* Stacked, the gallery has the whole row - no reason to keep it at the
	   narrow side-by-side width, and the image gets a taller box to match. */
	.product-page__gallery {
		width: 100%;
		max-width: none;
	}

	.product-gallery__main {
		height: 520px;
	}

	.product-gallery__thumb {
		width: 120px;
		height: 120px;
	}
}

@media (max-width: 767px) {
	.product-gallery__main {
		height: 320px;
	}

	.product-gallery__thumb {
		width: 72px;
		height: 72px;
	}
}

/* 40px to the title (Figma 276:7994 is a gap-[40px] column) - it was 8px, so
   the brand/category line sat right on top of the H1. */
.product-page__pretitle {
	margin-bottom: 40px;
}

.product-page__brand {
	font: var(--text-body-md);
	color: var(--color-brand-green);
	text-transform: uppercase;
	letter-spacing: var(--text-body-uppercase-tracking);
	margin: 0;
}

.product-page__category {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	/* 8px under the brand (Figma 276:7995). */
	margin: 8px 0 0;
}

.product-page__summary .product_title {
	font: var(--text-h3);
	color: var(--color-grey-900);
	margin: 0 0 40px;
}

.product-page__summary .woocommerce-product-details__short-description {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

/* Price state (Figma 276:7974): on sale, the CURRENT price leads in green and
   the old one follows it, struck through and smaller. WooCommerce prints
   <del> before <ins>, so the order is flipped here rather than in markup - the
   DOM order is the semantically correct one (old price, then new). */
.product-page__summary p.price {
	display: flex;
	/* flex-start, not baseline: Figma 276:7999 / 277:8447 give both prices the
	   same top edge, so the struck price rides high against the 40px one. */
	align-items: flex-start;
	gap: 12px;
	font: var(--text-h3);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

/* 18px regular grey-700 (Figma 276:7999) - it was 0.6em (24px) grey-400 at 80%
   opacity, which read as a different, washed-out element. */
.product-page__summary p.price del {
	order: 2;
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	opacity: 1;
}

.product-page__summary p.price ins {
	order: 1;
	text-decoration: none;
	color: var(--color-brand-green);
}

.product-page__summary .stock {
	font: var(--text-body-md);
	color: var(--color-brand-green);
	margin: 0 0 24px;
}

.product-page__summary .stock.out-of-stock {
	color: var(--color-crimson);
}

/* Sold out (Figma 361:11105): the stepper and the add-to-cart button stay in
   place but read as unavailable. They are already disabled in markup; this is
   only the look. */
.product-page__cart-row .quantity--disabled,
.product-page__cart-row .single_add_to_cart_button[disabled] {
	opacity: 0.5;
	pointer-events: none;
}

.product-page__delivery-link {
	display: block;
	font: var(--text-body-md);
	color: var(--color-grey-700);
	text-decoration: underline;
	margin: 0 0 24px;
}

.product-page__cart-row {
	display: flex;
	align-items: center;
	gap: 16px;
	margin-bottom: 32px;
}

.product-page__summary form.cart {
	display: inline-flex;
	align-items: center;
	gap: 16px;
	margin: 0;
}

/* ---- Product image lightbox (Figma "Item card_photo view", 363:11863).
   Built in assets/js/product-gallery.js rather than re-enabling WooCommerce's
   PhotoSwipe, which depends on the WC stylesheets this theme dequeues. ---- */
.product-gallery__main.is-zoomable {
	cursor: zoom-in;
}

.product-lightbox {
	position: fixed;
	inset: 0;
	z-index: 1000;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 24px;
	padding: 40px;
	background: rgba(13, 27, 40, 0.85);
}

.product-lightbox[hidden] {
	display: none;
}

.product-lightbox__img {
	max-width: min(1100px, 100%);
	max-height: 100%;
	object-fit: contain;
	background: var(--color-white);
	border-radius: 8px;
}

.product-lightbox__nav,
.product-lightbox__close {
	flex-shrink: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	border: none;
	border-radius: 100px;
	background: var(--color-white);
	color: var(--color-grey-900);
	font-size: 32px;
	line-height: 1;
	cursor: pointer;
}

.product-lightbox__nav[hidden] {
	display: none;
}

.product-lightbox__close {
	position: absolute;
	top: 24px;
	right: 24px;
	width: 44px;
	height: 44px;
	font-size: 26px;
}

/* Stop the page scrolling behind the overlay. */
body.has-lightbox-open {
	overflow: hidden;
}

@media (max-width: 767px) {
	.product-lightbox {
		padding: 16px;
		gap: 8px;
	}

	.product-lightbox__nav {
		width: 40px;
		height: 40px;
		font-size: 24px;
	}
}

/* ---- Quantity stepper (Figma 163:3243 / "Large round btn" 177:2346):
   one grey pill containing a minus glyph, the value, and a white circular
   plus button. WooCommerce only outputs a bare <input type="number">, so
   without this the browser's own spinner arrows showed instead. The - / +
   buttons are injected by WC hooks in inc/woocommerce.php. ---- */
.quantity {
	display: inline-flex;
	align-items: center;
	background: var(--color-grey-200);
	border-radius: 32px;
	flex-shrink: 0;
}

.qty-step {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	border: none;
	background: none;
	padding: 0;
	cursor: pointer;
	color: var(--color-grey-900);
}

.qty-step img {
	display: block;
}

.qty-step:disabled {
	opacity: 0.35;
	cursor: default;
}

/* The plus is a white circle inside the pill; the minus is a bare glyph. */
.qty-step--plus {
	background: var(--color-white);
	border-radius: 100px;
	color: var(--color-brand-blue);
}

/* Kill the native spinner arrows - they were the visible "what is this" bit. */
.quantity input.qty {
	-moz-appearance: textfield;
	appearance: textfield;
	border: none;
	background: none;
	text-align: center;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	padding: 0;
}

.quantity input.qty::-webkit-outer-spin-button,
.quantity input.qty::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

/* Product page: full 144x56 pill per Figma. */
.product-page__summary .quantity {
	width: 144px;
	height: 56px;
	padding: 4px;
	box-sizing: border-box;
}

.product-page__summary .qty-step {
	width: 40px;
	height: 40px;
}

.product-page__summary .qty-step--plus {
	width: 48px;
	height: 48px;
}

.product-page__summary .quantity input.qty {
	width: 100%;
	min-width: 0;
	height: 100%;
}

.product-page__summary .single_add_to_cart_button {
	white-space: nowrap;
	height: 56px;
	padding: 0 24px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-green);
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
	cursor: pointer;
}

.product-page__wishlist {
	background: var(--color-grey-200);
	width: 56px;
	height: 56px;
	flex-shrink: 0;
}

/* WC's product data tabs (Apraksts/Lietošana/Sastāvs) */
.woocommerce-tabs {
	max-width: 678px;
	margin-bottom: 60px;
}

/* The pill row spans the panel width, with the tabs sharing it evenly - it was
   shrink-wrapping to its labels and sitting as a short stub above much wider
   content. */
.woocommerce-tabs ul.tabs {
	display: flex;
	width: 100%;
	box-sizing: border-box;
	gap: 4px;
	list-style: none;
	margin: 0 0 32px;
	padding: 3.5px;
	background: var(--color-grey-200);
	border-radius: 32px;
}

.woocommerce-tabs ul.tabs li {
	margin: 0;
	flex: 1;
}

.woocommerce-tabs ul.tabs li a {
	display: block;
	text-align: center;
	padding: 12px 24px;
	border-radius: 100px;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

.woocommerce-tabs ul.tabs li.active a {
	background: var(--color-grey-50);
}

.woocommerce-tabs .woocommerce-Tabs-panel {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.woocommerce-tabs .woocommerce-Tabs-panel p {
	margin: 0 0 20px;
}

/* Related products - reuses the existing shop grid + product-card look */
.related.products {
	margin-bottom: 60px;
}

.related.products > h2 {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

.related.products ul.products {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 24px;
}

.related.products ul.products li.product {
	width: auto;
	float: none;
	margin: 0;
}

/* ---- Checkout (Figma 238:3979) ----
   Sidebar keeps WC's shipping-method + payment-gateway selection together
   with the totals/terms/submit as ONE "Pasūtījums" card (see the note in
   woocommerce/checkout/form-checkout.php for why, vs the design's split). */
.checkout-header {
	margin-bottom: 40px;
}

/* No top margin - this row is now the first thing in the left column and has
   to start level with the "Pasūtījums" card opposite it. */
.checkout-header__row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
	margin: 0 0 24px;
}

/* A real grey pill with the back chevron, not a bare text link (Figma
   238:3979 / 654:19890). */
.checkout-header__back {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 40px;
	background: var(--color-grey-200);
	box-shadow: inset 0 -4px 36px 0 rgba(0, 0, 0, 0.06);
	color: var(--color-brand-blue);
	padding: 0 24px;
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
}

/* Masked rather than an <img> so it inherits the button's blue - same pattern
   as .cart-notice__icon. */
.checkout-header__back-icon {
	width: 20px;
	height: 20px;
	background: currentColor;
	-webkit-mask: url("assets/icons/chevron-left.svg") no-repeat center / contain;
	mask: url("assets/icons/chevron-left.svg") no-repeat center / contain;
}

.checkout-header__login {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0;
}

.checkout-header__login a {
	color: var(--color-grey-700);
	text-decoration: underline;
}

.checkout-header__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0;
}

.checkout-layout {
	display: flex;
	align-items: flex-start;
	gap: 24px;
}

.checkout-layout__main {
	flex: 1;
	min-width: 0;
}

.checkout-layout__sidebar {
	width: 527px;
	flex-shrink: 0;
	position: sticky;
	top: 24px;
}

.checkout-section-title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

.checkout-persona {
	margin-bottom: 32px;
}

.checkout-persona__segments {
	display: inline-flex;
	gap: 4px;
	background: var(--color-grey-200);
	border-radius: 32px;
	padding: 3.5px;
}

.checkout-persona__segment {
	border: none;
	background: transparent;
	border-radius: 100px;
	padding: 12px 24px;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	cursor: pointer;
}

.checkout-persona__segment.is-active {
	background: var(--color-grey-50);
}

/* WooCommerce's own checkout field markup (form-billing.php / form-shipping.php).
   col-2/shipping fields are now suppressed at the source (see the
   woocommerce_cart_needs_shipping_address filter in inc/woocommerce.php) -
   this used to be an empty placeholder rule that did nothing. */

#customer_details .woocommerce-billing-fields__field-wrapper,
#customer_details .woocommerce-shipping-fields__field-wrapper {
	display: flex;
	flex-wrap: wrap;
	gap: 24px;
	margin-bottom: 20px;
}

#customer_details .form-row {
	flex: 1 1 100%;
	min-width: 0;
	margin: 0;
}

#customer_details .form-row-first,
#customer_details .form-row-last {
	flex: 1 1 calc(50% - 12px);
}

#customer_details label {
	display: block;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin-bottom: 6px;
}

#customer_details label .required {
	color: var(--color-crimson);
	text-decoration: none;
}

#customer_details .input-text,
#customer_details select {
	width: 100%;
	height: 47px;
	padding: 0 20px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	background: var(--color-white);
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	box-sizing: border-box;
}

/* Native selects keep the OS dropdown chrome (a small grey square button on
   Windows) which reads nothing like the pill inputs beside them - replace it
   with the theme's own chevron. */
#customer_details select {
	appearance: none;
	-webkit-appearance: none;
	-moz-appearance: none;
	/* Without an explicit line-height the value sits high in the pill once
	   appearance:none removes the browser's own centring. */
	line-height: 45px;
	padding-right: 48px;
	background-image: url("assets/icons/chevron-down.svg");
	background-repeat: no-repeat;
	background-position: right 18px center;
	background-size: 18px 18px;
}

/* ---- select2 (WooCommerce enhances the country/state selects with it and
   loads its own stylesheet, which this theme does NOT dequeue - so the
   country field was showing select2's stock 28px grey box while every field
   around it was a 47px pill). ---- */
/* Flex-centred rather than line-height matched: WooCommerce also puts a
   -4px bottom margin on this element, which combined with select2's own 28px
   line-height left the value sitting high in the 47px pill. */
.woocommerce .select2-container--default .select2-selection--single,
#customer_details .select2-container--default .select2-selection--single {
	display: flex;
	align-items: center;
	height: 47px;
	margin: 0;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	background: var(--color-white);
	outline: none;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__rendered,
#customer_details .select2-container--default .select2-selection--single .select2-selection__rendered {
	width: 100%;
	line-height: normal;
	padding: 0 48px 0 20px;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	box-sizing: border-box;
}

.woocommerce .select2-container .select2-selection--single .select2-selection__placeholder {
	color: var(--color-grey-400);
}

/* select2 draws its arrow as a CSS triangle; swap it for the theme chevron. */
.woocommerce .select2-container--default .select2-selection--single .select2-selection__arrow,
#customer_details .select2-container--default .select2-selection--single .select2-selection__arrow {
	top: 0;
	right: 14px;
	height: 45px;
	width: 20px;
}

.woocommerce .select2-container--default .select2-selection--single .select2-selection__arrow b,
#customer_details .select2-container--default .select2-selection--single .select2-selection__arrow b {
	border: none;
	margin: 0;
	top: 50%;
	left: 0;
	width: 18px;
	height: 18px;
	transform: translateY(-50%);
	background: var(--color-grey-900);
	-webkit-mask: url("assets/icons/chevron-down.svg") no-repeat center / contain;
	mask: url("assets/icons/chevron-down.svg") no-repeat center / contain;
}

/* The dropdown itself is appended to <body>, so it can't be scoped to the
   form - keep it on select2's own container classes. */
.select2-container--default .select2-dropdown {
	border: 1px solid var(--color-grey-200);
	border-radius: 12px;
	overflow: hidden;
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.12);
}

.select2-container--default .select2-search--dropdown .select2-search__field {
	height: 40px;
	padding: 0 14px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	font: var(--text-body-regular);
	box-sizing: border-box;
}

.select2-container--default .select2-results__option {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	padding: 10px 16px;
}

.select2-container--default .select2-results__option--highlighted[aria-selected],
.select2-container--default .select2-results__option[data-selected="true"] {
	background: var(--color-light-blue);
	color: var(--color-grey-900);
}

/* Company field visibility is owned by assets/js/checkout.js (the Fiziskā /
   Juridiskā persona toggle), NOT by CSS. A `display: none` rule used to live
   here from before the toggle existed - because the JS "show" step sets
   style.display = '', which merely removes the inline value and lets the
   stylesheet win again, the field could never be revealed and "Uzņēmuma
   nosaukums ir obligāts lauks" fired on a field nobody could see.
   Hidden by default here so it doesn't flash before the JS runs; the JS sets
   an explicit display value to show it. */
#customer_details #billing_company_field:not([style*="display"]) {
	display: none;
}

/* ---- Order review sidebar card ---- */
.checkout-summary {
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

.checkout-summary__title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

/* ---- Checkout "Pasūtījums" card (Figma 238:4000) ----
   Products are a thumbnail grid, not a name/qty/price list - see
   woocommerce/checkout/review-order.php for why the totals stay a table. */
.checkout-review__thumbs {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 16px;
	margin-bottom: 24px;
}

.checkout-review__thumb {
	position: relative;
	aspect-ratio: 1;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
	overflow: hidden;
}

.checkout-review__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

/* Qty is dropped from the row in this design, so a multi-quantity line would
   otherwise be indistinguishable from a single one. */
.checkout-review__thumb-qty {
	position: absolute;
	right: 4px;
	bottom: 4px;
	min-width: 20px;
	height: 20px;
	padding: 0 5px;
	border-radius: 100px;
	background: var(--color-grey-900);
	color: var(--color-white);
	font: var(--text-caption);
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
}

.woocommerce-checkout-review-order-table {
	width: 100%;
	border-collapse: collapse;
	margin-bottom: 24px;
}

.woocommerce-checkout-review-order-table thead {
	display: none;
}

/* An empty <tbody> (the product list moved to the grid above) would still
   contribute its rows' borders/padding if a plugin adds nothing. */
.woocommerce-checkout-review-order-table tbody:empty {
	display: none;
}

.woocommerce-checkout-review-order-table td,
.woocommerce-checkout-review-order-table th {
	padding: 12px 0;
	font: var(--text-body-lg);
	font-weight: 400;
	color: var(--color-grey-900);
	border-bottom: 1px solid var(--color-grey-200);
	vertical-align: top;
}

/* Label left, amount right. The previous rule right-aligned EVERY th, which
   is what pushed each label flush against its own value ("Summa87,54 €"). */
.woocommerce-checkout-review-order-table th {
	text-align: left;
}

.woocommerce-checkout-review-order-table td {
	text-align: right;
	font: var(--text-body-lg-bold);
	white-space: nowrap;
}

.woocommerce-checkout-review-order-table tr:last-child th,
.woocommerce-checkout-review-order-table tr:last-child td {
	border-bottom: none;
}

.checkout-review__badge {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 45px;
	height: 25px;
	margin-left: 8px;
	padding: 0 8px;
	border-radius: 100px;
	background: var(--color-light-blue);
	color: var(--color-brand-blue);
	font: var(--text-caption);
	box-sizing: border-box;
}

.woocommerce-checkout-review-order-table .order-total th,
.woocommerce-checkout-review-order-table .order-total td {
	font: var(--text-h5);
	border-bottom: none;
}

.woocommerce-checkout-review-order-table .order-total th small {
	display: block;
	margin-top: 6px;
	font: var(--text-body-lg);
	color: var(--color-grey-700);
}

/* Right-aligned like every other total row. The left-align here dated from
   when WC's own method <ul> was rendered inside this cell; the selectable list
   now lives in the left column's "Piegāde" section and this cell holds only
   the cost, which was being stranded mid-row instead of at the edge. */
.woocommerce-checkout-review-order-table .woocommerce-shipping-totals td {
	text-align: right;
	white-space: nowrap;
	font: var(--text-body-lg);
}

#shipping_method {
	list-style: none;
	margin: 0;
	padding: 0;
}

#shipping_method li {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	margin-bottom: 8px;
}

/* ---- "Izveidot kontu?" (WC's own account-creation checkbox, shown once
   Accounts & Privacy > "During checkout" is on and the visitor is logged out).
   WC renders it as a bare 13px checkbox+label with no spacing. ---- */
.woocommerce-account-fields {
	margin: 24px 0 40px;
}

.woocommerce-account-fields .create-account {
	margin: 16px 0 0;
}

.woocommerce-account-fields > p.form-row {
	margin: 0;
}

.woocommerce-account-fields label.checkbox {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	cursor: pointer;
}

.woocommerce-account-fields input[type="checkbox"],
.woocommerce-terms-and-conditions-wrapper input[type="checkbox"] {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	margin: 0;
	accent-color: var(--color-brand-blue);
	cursor: pointer;
}

.woocommerce-terms-and-conditions-wrapper .woocommerce-form__label-for-checkbox {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	margin: 0;
	cursor: pointer;
}

/* ---- Checkout validation states (Figma 390:14745) ----
   WooCommerce puts .woocommerce-invalid / .woocommerce-validated on the
   .form-row itself; the inline message element is added by checkout.js. */
#customer_details .form-row.woocommerce-invalid .input-text,
#customer_details .form-row.woocommerce-invalid select,
#customer_details .form-row.woocommerce-invalid .select2-selection--single {
	border-color: var(--color-crimson);
}

#customer_details .form-row.woocommerce-validated .input-text,
#customer_details .form-row.woocommerce-validated select {
	border-color: var(--color-brand-green);
}

.vio-field-error {
	display: block;
	margin-top: 6px;
	padding-left: 20px;
	font: var(--text-caption);
	color: var(--color-crimson);
}

/* ---- "Piegāde" section, left column (template-parts/checkout/shipping-methods.php) ---- */
.checkout-shipping {
	margin-bottom: 40px;
}

/* No shipping method available for the entered address (Figma 420:14712), and
   the "enter your address first" state before anything is entered. Both come
   from template-parts/checkout/shipping-methods.php. */
.checkout-shipping__empty {
	display: flex;
	gap: 12px;
	align-items: flex-start;
	background: var(--color-white);
	border-left: 4px solid var(--color-brand-blue);
	border-radius: 4px;
	padding: 20px 24px;
}

.checkout-shipping__empty::before {
	content: "";
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	background: var(--color-brand-blue);
	-webkit-mask: url("assets/icons/info.svg") no-repeat center / contain;
	mask: url("assets/icons/info.svg") no-repeat center / contain;
}

/* Address entered, but nothing can ship there - a harder stop than the
   neutral prompt above. */
.checkout-shipping__empty--none {
	border-left-color: var(--color-crimson);
}

.checkout-shipping__empty--none::before {
	background: var(--color-crimson);
}

.checkout-shipping__empty {
	margin: 0;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.checkout-shipping__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.checkout-shipping__option label {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 16px 20px;
	background: var(--color-white);
	border-radius: 4px;
	cursor: pointer;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.checkout-shipping__name {
	flex: 1;
	min-width: 0;
}

.checkout-shipping__price {
	font: var(--text-body-lg-bold);
	white-space: nowrap;
}

/* Pickup-point picker under its own shipping option.
   Four carriers, four different markup shapes (a plain <select>, a custom
   dropdown, a button that opens a map) - so this styles by ELEMENT rather than
   by each plugin's class names, which differ per carrier and per version.
   The slot is collapsed until its option is chosen: the plugins only render a
   picker for the chosen method, so an unselected option's slot is empty. */
.checkout-shipping__extra:empty {
	display: none;
}

.checkout-shipping__extra {
	padding: 0 20px 16px;
	background: var(--color-white);
	border-radius: 0 0 4px 4px;
	margin-top: -4px;
}

/* The carrier lists are long (hundreds of terminals) with long address labels.
   A fixed width plus its own scroll keeps one from setting the column width -
   this is what pushed the sidebar table wide enough to scroll the whole page
   before the picker moved out of it. */
/* Venipak wraps its picker in a float-based block that shrink-wrapped to its
   own content and sat offset from the left edge. */
.checkout-shipping__extra .venipak-pickup-wrapper,
.checkout-shipping__extra .venipak-pickup-wrapper > div,
.checkout-shipping__extra .terminal-container,
.checkout-shipping__extra .pasts-express-terminals-list,
.checkout-shipping__extra .select2,
.checkout-shipping__extra .select2-container {
	display: block;
	float: none;
	width: 100% !important;
	max-width: 100%;
	margin: 0;
	box-sizing: border-box;
}

/* Carrier's own label above its picker ("Select Venipak pickup point:",
   "LatvijasPasts"). */
.checkout-shipping__extra label,
.checkout-shipping__extra .pasts-express-shipping-description {
	display: block;
	margin: 0 0 8px;
	font: var(--text-body-md);
	color: var(--color-grey-900);
}

.checkout-shipping__extra select,
.checkout-shipping__extra input[type="text"],
.checkout-shipping__extra .dropdown,
.checkout-shipping__extra .select2-selection {
	display: block;
	width: 100%;
	max-width: 100%;
	box-sizing: border-box;
	padding: 12px 16px;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
	background: var(--color-white);
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.checkout-shipping__extra .inner-container ul {
	list-style: none;
	margin: 4px 0 0;
	padding: 0;
	max-height: 260px;
	overflow-y: auto;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
	background: var(--color-white);
}

.checkout-shipping__extra .inner-container li {
	padding: 10px 16px;
	cursor: pointer;
	font: var(--text-body-regular);
}

.checkout-shipping__extra .inner-container li.city {
	font: var(--text-body-md);
	color: var(--color-grey-700);
	cursor: default;
	background: var(--color-grey-100);
}

.checkout-shipping__extra .inner-container li.selected,
.checkout-shipping__extra .inner-container li:hover:not(.city) {
	background: var(--color-light-blue);
}

/* Smartposti's map trigger ships with the plugin's own orange button styling;
   pulled into the theme's pill button look so all four carriers match. */
.checkout-shipping__extra button,
.checkout-shipping__extra .button,
.checkout-shipping__extra a.button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 12px 24px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-blue);
	color: var(--color-white);
	font: var(--text-body-md);
	text-transform: none;
	cursor: pointer;
}

/* Payment block stays in the sidebar card (see form-checkout.php) - it also
   carries the terms checkbox and place-order button, which the design has
   there too. */
.woocommerce-checkout-payment {
	margin-top: 24px;
}

.woocommerce-checkout-payment .form-row.place-order {
	margin: 16px 0 0;
	padding: 0;
}

#place_order {
	width: 100%;
	height: 56px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-green);
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
	cursor: pointer;
}

.wc_payment_methods {
	list-style: none;
	margin: 0 0 24px;
	padding: 0;
}

.wc_payment_method {
	border-bottom: 1px solid var(--color-grey-200);
	padding: 12px 0;
}

.wc_payment_method label {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.woocommerce-terms-and-conditions-checkbox-text {
	font: var(--text-body-md);
	color: var(--color-grey-900);
}

.woocommerce-terms-and-conditions-checkbox-text a {
	text-decoration: underline;
}

#place_order {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 56px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-green);
	color: var(--color-white);
	font: var(--text-body-uppercase);
	letter-spacing: var(--text-body-uppercase-tracking);
	text-transform: uppercase;
	cursor: pointer;
	margin-top: 16px;
}

/* ---- Izlase / Wishlist page (Figma 615:18911) ---- */
.wishlist-page__count {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 25px;
	height: 25px;
	padding: 0 8px;
	margin-left: 8px;
	border-radius: 100px;
	background: rgba(76, 189, 227, 0.3);
	color: var(--color-brand-blue);
	font: var(--text-body-lg);
	vertical-align: middle;
}

/* Figma 616:22640: icon+copy group -> 60px gap -> button. */
.wishlist-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 60px;
	max-width: 420px;
	margin: 60px auto;
	text-align: center;
}

.wishlist-empty__body {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 28px;
}

.wishlist-empty__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 70px;
	height: 70px;
	flex-shrink: 0;
	border-radius: 50%;
	background: var(--color-light-blue);
}

.wishlist-empty__copy {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 12px;
}

.wishlist-empty__title {
	font: var(--text-body-md);
	color: var(--color-grey-900);
	margin: 0;
}

.wishlist-empty__text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	max-width: 342px;
	margin: 0;
}

/* ---- 404 page (404.php). Same empty-state shape as .wishlist-empty /
   .cart-popup__empty, scaled up for a standalone full page. ---- */
.error-404 {
	max-width: 460px;
	margin: 80px auto;
	text-align: center;
}

.error-404__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 96px;
	height: 96px;
	border-radius: 50%;
	background: var(--color-grey-100);
	color: var(--color-grey-700);
	margin-bottom: 24px;
}

.error-404__eyebrow {
	font: var(--text-h1);
	color: var(--color-brand-blue);
	margin: 0;
}

.error-404__title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 8px 0;
}

.error-404__text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 24px;
}

.error-404 .pill-btn {
	display: inline-flex;
	padding: 0 24px;
	height: 40px;
}

@media (max-width: 1024px) {
	.error-404 {
		margin: 60px auto;
	}
}

@media (max-width: 767px) {
	.error-404 {
		margin: 40px auto;
	}
}

.wishlist-guest-notice {
	display: flex;
	align-items: center;
	gap: 16px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 20px 24px;
	margin-bottom: 32px;
}

/* Even up the gap above/below the notice: .shop-archive__head's shared 60px
   (meant for the plain title+breadcrumb case) read as a much bigger gap above
   the notice than the 32px below it to the grid. */
.wishlist-page .shop-archive__head {
	margin-bottom: 32px;
}

.wishlist-guest-notice p {
	flex: 1;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin: 0;
}

.wishlist-guest-notice .pill-btn {
	flex-shrink: 0;
	background: var(--color-brand-blue);
	color: var(--color-white);
	padding: 0 24px;
	height: 40px;
}

/* ---- Jaunumi archive (Figma 347:7666, "Initial"/"Full" frames) ---- */
.jaunumi-archive__filters {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	list-style: none;
	margin: 0 0 32px;
	padding: 0;
}

.jaunumi-archive__filter {
	display: inline-flex;
	padding: 16px 24px;
	border-radius: 100px;
	font: var(--text-body-md);
	color: var(--color-grey-700);
}

.jaunumi-archive__filter.is-active {
	background: var(--color-brand-blue);
	color: var(--color-white);
}

.jaunumi-grid {
	list-style: none;
	margin: 0 0 40px;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 24px;
}

.jaunumi-card {
	display: flex;
	flex-direction: column;
	gap: 16px;
	background: var(--color-white);
	border-radius: 4px;
	padding-bottom: 16px;
}

.jaunumi-card__media {
	position: relative;
	display: block;
	height: 140px;
	overflow: hidden;
	border-radius: 4px 4px 0 0;
}

.jaunumi-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.jaunumi-card__tag {
	position: absolute;
	top: 16px;
	left: 16px;
	background: var(--color-grey-100);
	border-radius: 100px;
	padding: 8px 16px;
	font: var(--text-body-regular);
	color: var(--color-brand-blue);
}

.jaunumi-card__title {
	padding: 0 16px;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.jaunumi-card__meta {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 0 16px;
	font: var(--text-body-md);
	color: var(--color-grey-700);
}

.jaunumi-empty {
	max-width: 420px;
	margin: 60px auto;
	text-align: center;
}

.jaunumi-empty__title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.jaunumi-empty__text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 24px;
}

.jaunumi-empty .pill-btn {
	display: inline-flex;
	background: var(--color-brand-green);
	color: var(--color-white);
	padding: 0 24px;
	height: 40px;
}

/* ---- Single Jaunumi post hero (title overlaid on a real background image -
   the ACF "post_hero_image" field, same pattern as the Kontakti/Par mums
   photo heroes) ---- */
/* Background comes in as --hero-bg (and optionally --hero-bg-mobile /
   --hero-color-mobile) from single.php, so the desktop/mobile swap is a media
   query here rather than two inline styles. */
.jaunumi-single-hero {
	position: relative;
	background-color: var(--color-grey-100);
	background-image: var(--hero-bg, none);
	background-repeat: no-repeat;
	background-position: center;
	background-size: cover;
	padding: 40px 0 60px;
	margin-bottom: 40px;
}

/* Two classes so it beats .shop-archive__inner's own responsive padding rules
   (24px top / 60px bottom below 1200px), which were being ADDED to the
   section's own 40/60 and left a huge dead band under the title on phones. */
.jaunumi-single-hero .jaunumi-single-hero__inner {
	padding-top: 0;
	padding-bottom: 0;
}

.jaunumi-single-hero__meta {
	display: flex;
	align-items: center;
	gap: 8px;
	font: var(--text-body-md);
	color: var(--color-grey-700);
	/* Below the title + excerpt, per Figma - it used to sit above the title. */
	margin: 24px 0 0;
}

/* Masked, not an <img>: the old calendar.png carried an opaque white square. */
.jaunumi-single-hero__meta-icon {
	flex-shrink: 0;
	width: 20px;
	height: 20px;
	background: currentColor;
	-webkit-mask: url("assets/icons/calendar.svg") no-repeat center / contain;
	mask: url("assets/icons/calendar.svg") no-repeat center / contain;
}

.jaunumi-single-hero__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0;
	max-width: 900px;
}

.jaunumi-single-hero__excerpt {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 16px 0 0;
	max-width: 700px;
}

@media (max-width: 767px) {
	.jaunumi-single-hero {
		background-image: var(--hero-bg-mobile, var(--hero-bg, none));
		background-color: var(--hero-color-mobile, var(--color-grey-100));
		padding: 24px 0 32px;
		margin-bottom: 24px;
	}
}

/* ---- Single Jaunumi post body (Figma 446:14951, "Article") ---- */
.jaunumi-single {
	display: flex;
	gap: 24px;
	margin-bottom: 60px;
}

.jaunumi-single__main {
	flex: 1;
	min-width: 0;
	max-width: 1217px;
}

/* Article body measure (Figma 446:15347): the LEAD paragraph runs the full
   1217px column, everything after it is capped at 803px - a comfortable
   reading measure, while the intro still spans the width under the image.
   803/1217 as a percentage so it holds at every viewport instead of only at
   the design's 1920. */
.jaunumi-single__body {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.jaunumi-single__body > * {
	max-width: 66%;
}

/* The lead paragraph. Targeted by position rather than needing a class, since
   the design's rule is literally "the first paragraph"; add `vio-lead` in the
   editor's Advanced > Additional CSS class field to make another block span
   the full width too (e.g. a full-bleed image mid-article). */
.jaunumi-single__body > p:first-child,
.jaunumi-single__body > .vio-lead {
	max-width: none;
	font: var(--text-body-lg);
}

/* 40px between top-level blocks, 24px between a heading and the text under it
   (Figma 446:15347 / 446:15342). Margins are set on the TOP of each block and
   collapsed away from the first one, so a block never has to know what
   follows it. */
.jaunumi-single__body > * {
	margin-top: 40px;
	margin-bottom: 0;
}

.jaunumi-single__body > *:first-child {
	margin-top: 0;
}

.jaunumi-single__body h2,
.jaunumi-single__body h3 {
	color: var(--color-grey-900);
}

.jaunumi-single__body h2 {
	font: var(--text-h4);
}

.jaunumi-single__body h3 {
	font: var(--text-h5);
}

/* A paragraph or list directly under a heading is part of that section, so it
   sits at the tighter 24px rather than the 40px between sections. */
.jaunumi-single__body h2 + *,
.jaunumi-single__body h3 + * {
	margin-top: 24px;
}

.jaunumi-single__body img {
	max-width: 100%;
	height: auto;
	border-radius: 4px;
}

/* ---- "Svarīgi!" callout (Figma 446:15335) ----
   No block needed: apply `vio-callout` in the editor's Advanced > Additional
   CSS class field on a Group/Paragraph block. Bold the first words of the
   paragraph to get the title line.

   The icon is positioned rather than a flex/grid item, and the text is left in
   normal block flow. Figma stacks the title above the body in a column beside
   the icon, and with flex the paragraph's inline content collapses into ONE
   anonymous flex item - so the bold title ran on the same line as the body and
   could not be split without wrapping the text in its own element. Absolute
   positioning keeps the markup a plain paragraph while still stacking. */
.vio-callout {
	position: relative;
	/* 24 padding + 20 icon + 10 gap (Figma 446:15335). */
	padding: 24px 24px 24px 54px;
	background: var(--color-brand-green-tp);
	border-radius: 4px;
	margin: 24px 0;
	font: var(--text-body-default-text);
	color: var(--color-grey-900);
}

.vio-callout::before {
	content: "";
	position: absolute;
	top: 24px;
	left: 24px;
	width: 20px;
	height: 20px;
	background: var(--color-brand-green);
	-webkit-mask: url("assets/icons/info.svg") no-repeat center / contain;
	mask: url("assets/icons/info.svg") no-repeat center / contain;
}

/* Title line: the leading <strong> of the paragraph (or a heading, when the
   callout is a Group block). */
.vio-callout > strong:first-child,
.vio-callout > b:first-child {
	display: block;
	margin-bottom: 8px;
	font: var(--text-body-md);
}

.vio-callout > *:first-child {
	margin-top: 0;
}

.vio-callout > *:last-child {
	margin-bottom: 0;
}

.jaunumi-single__pagination {
	display: flex;
	align-items: center;
	justify-content: space-between;
	max-width: 803px;
	margin-top: 40px;
	padding-top: 24px;
	border-top: 1px solid var(--color-grey-200);
}

.jaunumi-single__pagination a {
	display: flex;
	align-items: center;
	gap: 20px;
	font: var(--text-body-md);
	color: var(--color-grey-900);
}

.jaunumi-single__pagination .slider-arrow {
	flex-shrink: 0;
}

.jaunumi-single__sidebar {
	width: 389px;
	flex-shrink: 0;
}

.jaunumi-single__sidebar h2 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

.jaunumi-related {
	list-style: none;
	margin: 0 0 24px;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.jaunumi-related__item {
	display: flex;
	align-items: center;
	gap: 24px;
	background: var(--color-white);
	border: 1px solid transparent;
	border-radius: 4px;
	padding: 12px;
	transition: border-color 0.15s, box-shadow 0.15s;
}

/* These rows had no hover feedback at all despite being links. Same treatment
   as .product-card so the whole site reads consistently. */
.jaunumi-related__item:hover {
	border-color: var(--color-brand-blue);
	box-shadow: 0 16px 28px 4px rgba(46, 49, 50, 0.08);
}

.jaunumi-related__item:hover .jaunumi-related__name {
	color: var(--color-brand-blue);
}

.jaunumi-related__item img.jaunumi-related__thumb {
	width: 100px;
	height: 100px;
	object-fit: cover;
	border-radius: 4px;
	flex-shrink: 0;
}

.jaunumi-related__info {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.jaunumi-related__name {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.jaunumi-related__row {
	display: flex;
	align-items: center;
	justify-content: space-between;
}

.jaunumi-related__price {
	font: var(--text-h5);
	color: var(--color-grey-900);
}

/* Same sale treatment as the product cards (Figma 256:5141) - green sale
   price, muted struck-through original. Without these the <ins> kept its
   browser-default underline and inherited the link colour. */
.jaunumi-related__price del {
	font-size: 0.7em;
	color: var(--color-grey-400);
	opacity: 0.8;
	margin-right: 6px;
}

.jaunumi-related__price ins {
	text-decoration: none;
	color: var(--color-brand-green);
}

/* A real button, per Figma 56:1770 - it was a bare centred text link. */
.jaunumi-single__sidebar-cta {
	display: flex;
	width: 100%;
	box-sizing: border-box;
	justify-content: center;
	height: 40px;
}

/* ---- Post body: featured image + editor content ---- */
.jaunumi-single__featured {
	margin: 0 0 32px;
}

.jaunumi-single__featured img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 4px;
}

/* Wraps the sidebar under the article well before phone width - at 1024 the
   two columns leave the text about 40 characters wide and unreadable. */
@media (max-width: 1024px) {
	.jaunumi-single {
		flex-direction: column;
	}

	.jaunumi-single__main,
	.jaunumi-single__body,
	.jaunumi-single__pagination {
		max-width: none;
	}

	.jaunumi-single__sidebar {
		width: 100%;
	}
}

/* ---- TEMPORARY build separator ----
   Used while a page is mid-conversion to ACF blocks: the block version renders
   above it, the old fixed-template version below, so both can be compared at
   every breakpoint before the old one is deleted. Deliberately loud - it is
   not meant to survive sign-off. (Par mums used the same device during its
   own conversion; this is that pattern brought back as a reusable component.) */
.vio-build-separator {
	position: relative;
	max-width: 1920px;
	margin: 60px auto;
	padding: 0 145px;
	box-sizing: border-box;
	border-top: 4px dashed #ff0000;
}

.vio-build-separator span {
	display: inline-block;
	margin-top: -14px;
	padding: 4px 12px;
	background: #ff0000;
	color: #fff;
	font: var(--text-body-md);
	text-transform: uppercase;
	letter-spacing: 1px;
}

@media (max-width: 1440px) {
	.vio-build-separator {
		padding: 0 20px;
	}
}

/* ---- Piegāde page (page-templates/piegade.php, Figma 750:24030) ---- */
.delivery-page__head {
	margin-bottom: 32px;
}

.delivery-page__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 24px 0 8px;
}

.delivery-page__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0;
}

/* Vertical rhythm below is measured off Figma 750:24030: pills end y=477,
   partner strip 517-591, cards start 691, pickup map starts 1166 against cards
   ending 1066. So: 40 pills->partners, 100 partners->cards, 100 cards->pickup. */
.delivery-tabs__segments {
	display: inline-flex;
	gap: 12px;
	flex-wrap: wrap;
	margin-bottom: 40px;
}

/* Each delivery section is its own block, so each one's .shop-archive__inner
   would add another 40px top / 80px bottom - stacking to a 180px gap between
   the cards and the pickup section where Figma has 100px. The sections own
   their vertical rhythm; the wrapper only supplies the side gutter. Two
   classes deep so this also beats .shop-archive__inner's own responsive
   padding rules, which are defined later in the file. */
.shop-archive__inner.vio-block--delivery-regions,
.shop-archive__inner.vio-block--delivery-pickup {
	padding-top: 0;
	padding-bottom: 0;
}

.delivery-tabs__segment {
	height: 50px;
	padding: 0 24px;
	border: none;
	border-radius: 100px;
	background: var(--color-grey-200);
	color: var(--color-grey-900);
	font: var(--text-body-md);
	cursor: pointer;
}

.delivery-tabs__segment.is-active {
	background: var(--color-brand-blue);
	color: var(--color-white);
}

.delivery-partners {
	display: flex;
	align-items: center;
	gap: 32px;
	flex-wrap: wrap;
	margin-bottom: 100px;
}

.delivery-partners__title {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0;
}

.delivery-partners__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	align-items: center;
	/* Wraps rather than scrolling once a phone runs out of room. The 8px left
	   padding cancels the first badge's -8px margin, and does so on every
	   wrapped row too, so each row still starts flush with the title. */
	flex-wrap: wrap;
	row-gap: 12px;
	padding-left: 8px;
}

.delivery-partners__list li {
	width: 74px;
	height: 74px;
	border-radius: 50%;
	overflow: hidden;
	background: var(--color-white);
	display: flex;
	align-items: center;
	justify-content: center;
	/* Figma 769:24669 spaces the 74px badges 66px apart - they overlap by 8. */
	margin-left: -8px;
	position: relative;
	box-shadow: 0 6px 24px rgb(0 0 0 / 0.12);
	transition: transform 0.15s ease, box-shadow 0.15s ease;
}

/* Each badge overlaps the one before it, so the rightmost sits on top - which
   is plain painting order, hence no z-index ladder here. Hover lifts whichever
   one is pointed at above all of them. */
.delivery-partners__list li:hover {
	z-index: 1;
	transform: translateY(-2px);
	box-shadow: 0 8px 32px rgb(0 0 0 / 0.2);
}

.delivery-partners__list img {
	max-width: 100%;
	height: auto;
}

/* The badge fills the circle so the whole thing is the hit area, and only a
   linked badge gets the pointer - an unlinked one must not look clickable. */
.delivery-partners__list a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	cursor: pointer;
}

.delivery-tabs__panel {
	display: none;
}

.delivery-tabs__panel.is-active {
	display: block;
}

.delivery-tabs__empty {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	background: var(--color-white);
	border-radius: 4px;
	padding: 32px;
	margin: 0;
}

.delivery-grid {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 24px;
}

.delivery-card {
	display: flex;
	gap: 24px;
	align-items: flex-start;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

.delivery-card__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 70px;
	height: 70px;
	border-radius: 50%;
	background: var(--color-light-blue);
}

.delivery-card__body {
	flex: 1;
	min-width: 0;
}

.delivery-card__title {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

.delivery-card__price {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 16px;
	margin-bottom: 32px;
}

.delivery-card__fee {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0;
}

.delivery-card__tag {
	display: inline-flex;
	align-items: center;
	padding: 8px 16px;
	border-radius: 100px;
	background: rgba(255, 56, 113, 0.2);
	color: var(--color-crimson);
	font: var(--text-body-md);
}

.delivery-card__meta {
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.delivery-card__meta div {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
}

.delivery-card__meta dt,
.delivery-card__meta dd {
	display: inline;
	margin: 0;
}

.delivery-card__meta dd {
	color: var(--color-grey-900);
}

/* Figma 750:24030 metadata: info column is a fixed 577px, the map a fixed
   803px, with a 250px gap between them (NOT the roughly-even split flex:1/
   flex:1 this used to render as) - the design deliberately leaves the map
   narrower than "everything left over" and the gap wide. align-items:center
   because the two aren't top-aligned in the design either (the map starts
   43px above the text column and runs 42px past its bottom). */
.delivery-pickup {
	display: flex;
	align-items: center;
	gap: 250px;
	margin: 100px 0 80px;
}

/* flex-shrink 1 (not 0) - matches Figma's 577/803 EXACTLY at full desktop
   width, but must still be allowed to shrink below that: a fixed 0 0 pair
   held both columns at their full px size no matter how narrow the viewport
   got, forcing the row past 1630px wide and creating horizontal scroll from
   roughly 1024-1804px (confirmed live). */
.delivery-pickup__info {
	flex: 1 1 577px;
	min-width: 0;
	max-width: 577px;
}

.delivery-pickup__map {
	flex: 1 1 803px;
	min-width: 0;
	max-width: 803px;
	height: 400px;
	border-radius: 4px;
	overflow: hidden;
}

.delivery-pickup__map iframe {
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
}

.delivery-pickup__title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.delivery-pickup__text {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0 0 24px;
}

.delivery-pickup__details {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

.delivery-pickup .pill-btn {
	display: inline-flex;
}

@media (max-width: 1200px) {
	.delivery-grid {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 767px) {
	.delivery-grid {
		grid-template-columns: 1fr;
	}

	.delivery-card {
		flex-direction: column;
		gap: 16px;
	}

	.delivery-partners {
		gap: 16px;
	}
}

/* The 100px Figma gaps are desktop figures - on a stacked layout they read as
   dead space, so they come back to the 60px the rest of the page uses. */
@media (max-width: 1024px) {
	.delivery-partners {
		margin-bottom: 60px;
	}

	.delivery-pickup {
		flex-direction: column;
		gap: 32px;
		margin: 60px 0;
	}

	.delivery-pickup__info,
	.delivery-pickup__map {
		flex: 1 1 100%;
		width: 100%;
		max-width: none;
	}

	.delivery-pickup__map {
		height: 320px;
	}
}

/* ---- Order received / thank you (no Figma frame; reuses the checkout's
   white-card language). ---- */
.order-received__head {
	background: var(--color-white);
	border-radius: 4px;
	padding: 40px;
	margin-bottom: 24px;
	text-align: center;
}

.order-received__icon {
	display: inline-block;
	width: 56px;
	height: 56px;
	margin-bottom: 16px;
	background: var(--color-brand-green);
	-webkit-mask: url("assets/icons/circle-check-big.svg") no-repeat center / contain;
	mask: url("assets/icons/circle-check-big.svg") no-repeat center / contain;
}

.order-received__head--failed .order-received__icon {
	background: var(--color-crimson);
	-webkit-mask-image: url("assets/icons/info.svg");
	mask-image: url("assets/icons/info.svg");
}

.order-received__head h1 {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.order-received__head p {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0;
}

.woocommerce-order-overview {
	list-style: none;
	margin: 0 0 24px;
	padding: 24px;
	background: var(--color-white);
	border-radius: 4px;
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
	gap: 24px;
}

.woocommerce-order-overview li {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.woocommerce-order-overview li strong {
	display: block;
	margin-top: 6px;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

/* WC's order-details / customer-details tables below the overview. */
.woocommerce-order .woocommerce-order-details,
.woocommerce-order .woocommerce-customer-details {
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
	margin-bottom: 24px;
}

.woocommerce-order .woocommerce-order-details h2,
.woocommerce-order .woocommerce-customer-details h2 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 20px;
}

.woocommerce-order table.shop_table {
	width: 100%;
	border-collapse: collapse;
}

.woocommerce-order table.shop_table th,
.woocommerce-order table.shop_table td {
	padding: 12px 0;
	text-align: left;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	border-bottom: 1px solid var(--color-grey-200);
}

.woocommerce-order table.shop_table td:last-child,
.woocommerce-order table.shop_table th:last-child {
	text-align: right;
	white-space: nowrap;
}

.woocommerce-order table.shop_table tfoot th {
	font: var(--text-body-lg-bold);
}

.woocommerce-order .woocommerce-customer-details address {
	font: var(--text-body-regular);
	font-style: normal;
	color: var(--color-grey-700);
	border: none;
	padding: 0;
}

.order-received__actions {
	margin: 0;
}

.woocommerce-thankyou-order-failed-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

@media (max-width: 767px) {
	.order-received__head {
		padding: 24px;
	}
}

/* ---- My Account (Figma 648:19010) - was 100% unstyled WC default before. ---- */
.myaccount-layout {
	align-items: flex-start;
}

.myaccount-nav {
	padding: 20px;
}

.myaccount-nav__list {
	list-style: none;
	margin: 0 0 40px;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.myaccount-nav__link {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 12px;
	border-radius: 100px;
	font: var(--text-body-lg);
	color: var(--color-grey-700);
}

.myaccount-nav__item.is-active .myaccount-nav__link {
	background: var(--color-grey-100);
	color: var(--color-brand-blue);
	font: var(--text-body-lg-bold);
}

.myaccount-nav__logout {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 12px;
	font: var(--text-body-lg-bold);
	color: var(--color-brand-blue);
}

/* Masked so the icon takes the row's own colour (grey, or blue when active)
   and has no background of its own - the previous PNGs shipped with an opaque
   white square baked in. The file comes through as a --vio-icon custom
   property set inline per item in navigation.php. */
.myaccount-nav__icon {
	flex-shrink: 0;
	width: 24px;
	height: 24px;
	background: currentColor;
	-webkit-mask: var(--vio-icon) no-repeat center / contain;
	mask: var(--vio-icon) no-repeat center / contain;
}

.myaccount-layout__content {
	flex: 1;
	min-width: 0;
}

.myaccount-stats {
	display: flex;
	gap: 24px;
	margin-bottom: 60px;
}

.myaccount-stats__item {
	flex: 1;
	display: flex;
	align-items: center;
	gap: 24px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

/* Tile is the light-green square; the glyph inside is a mask so all three
   cards render the same colour. Previously two were flat SVGs and the third a
   coloured PNG, so one card came out blue. */
.myaccount-stats__icon {
	position: relative;
	width: 56px;
	height: 56px;
	flex-shrink: 0;
	border-radius: 4px;
	background: var(--color-light-green);
}

.myaccount-stats__icon::after {
	content: "";
	position: absolute;
	inset: 0;
	margin: auto;
	width: 24px;
	height: 24px;
	background: var(--color-grey-900);
	-webkit-mask: var(--vio-icon) no-repeat center / contain;
	mask: var(--vio-icon) no-repeat center / contain;
}

.myaccount-stats__value {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 7px;
}

.myaccount-stats__label {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0;
}

.myaccount-section-title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 32px;
}

.myaccount-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	padding: 60px 0;
}

.myaccount-empty__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 70px;
	height: 70px;
	border-radius: 50%;
	background: var(--color-light-blue);
	margin-bottom: 24px;
}

.myaccount-empty__title {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.myaccount-empty__text {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 24px;
	max-width: 342px;
}

.myaccount-empty .pill-btn {
	display: inline-flex;
	background: var(--color-brand-green);
	color: var(--color-white);
	padding: 0 24px;
	height: 56px;
}

.myaccount-orders {
	list-style: none;
	margin: 0 0 40px;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

/* ---- Dashboard recent-orders rows (Figma 337:9301 "delivery item_account") ----
   Order no + date on the left, status pill, then total + item count and a
   chevron on the right. The whole row is one link. */
.myaccount-orders__item {
	background: var(--color-white);
	border-radius: 4px;
}

.myaccount-orders__link {
	display: grid;
	grid-template-columns: minmax(160px, 240px) auto 1fr auto 24px;
	align-items: center;
	gap: 24px;
	padding: 24px;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.myaccount-orders__id {
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.myaccount-orders__id strong {
	font: var(--text-body-lg-bold);
}

.myaccount-orders__id time {
	color: var(--color-grey-900);
}

.myaccount-orders__status {
	justify-self: start;
	padding: 8px 16px;
	border-radius: 100px;
	font: var(--text-body-md);
	white-space: nowrap;
	/* Neutral default; the per-status rules below override it. */
	background: var(--color-grey-100);
	color: var(--color-grey-700);
}

.myaccount-orders__item--processing .myaccount-orders__status,
.myaccount-orders__item--on-hold .myaccount-orders__status {
	background: var(--color-light-blue);
	color: var(--color-brand-blue);
}

.myaccount-orders__item--completed .myaccount-orders__status {
	background: var(--color-light-green);
	color: var(--color-brand-green);
}

.myaccount-orders__item--cancelled .myaccount-orders__status,
.myaccount-orders__item--failed .myaccount-orders__status,
.myaccount-orders__item--refunded .myaccount-orders__status {
	background: rgba(255, 56, 113, 0.2);
	color: var(--color-crimson);
}

.myaccount-orders__total {
	justify-self: end;
	font: var(--text-body-lg-bold);
	white-space: nowrap;
}

.myaccount-orders__count {
	color: var(--color-grey-700);
	white-space: nowrap;
}

.myaccount-orders__chevron {
	width: 24px;
	height: 24px;
	background: var(--color-grey-900);
	-webkit-mask: url("assets/icons/chevron-right.svg") no-repeat center / contain;
	mask: url("assets/icons/chevron-right.svg") no-repeat center / contain;
}

.myaccount-orders__link:hover .myaccount-orders__chevron {
	background: var(--color-brand-blue);
}

@media (max-width: 900px) {
	.myaccount-orders__link {
		grid-template-columns: 1fr auto;
		gap: 12px 16px;
	}

	.myaccount-orders__status {
		justify-self: end;
	}

	.myaccount-orders__total {
		justify-self: start;
	}

	.myaccount-orders__count {
		text-align: right;
	}

	.myaccount-orders__chevron {
		display: none;
	}
}

.myaccount-prompts {
	display: flex;
	gap: 24px;
}

.myaccount-prompt {
	flex: 1;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

.myaccount-prompt__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 16px;
}

.myaccount-prompt__head h3 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0;
}

.myaccount-prompt__head a {
	flex-shrink: 0;
	font: var(--text-body-lg-bold);
	color: var(--color-brand-blue);
}

.myaccount-prompt p {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0;
}

/* WooCommerce's own generated markup for the OTHER account sub-pages
   (orders list, addresses, account details, payment methods) - not fully
   redesigned per-page yet, just made legible instead of raw unstyled
   defaults. See TODOS/infrastructure.md for what's still default WC look. */
.myaccount-layout__content .woocommerce-orders-table,
.myaccount-layout__content table.shop_table {
	width: 100%;
	border-collapse: collapse;
	background: var(--color-white);
	border-radius: 4px;
	overflow: hidden;
}

.myaccount-layout__content table.shop_table th,
.myaccount-layout__content table.shop_table td {
	padding: 16px 20px;
	text-align: left;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	border-bottom: 1px solid var(--color-grey-200);
}

/* ---- Orders list (myaccount/orders.php - WC's own markup, CSS only) ---- */
.woocommerce-orders-table thead th {
	font: var(--text-body-md);
	color: var(--color-grey-700);
	background: var(--color-grey-50);
	white-space: nowrap;
}

.woocommerce-orders-table tbody tr:last-child th,
.woocommerce-orders-table tbody tr:last-child td {
	border-bottom: none;
}

.woocommerce-orders-table__cell-order-number a {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

.woocommerce-orders-table__cell-order-number a:hover {
	color: var(--color-brand-blue);
}

/* Status as a pill. WC prints the plain status name, but every row also
   carries a --status-<slug> modifier class, so the colour can be driven off
   the row without touching the template. */
.woocommerce-orders-table__cell-order-status {
	white-space: nowrap;
}

.woocommerce-orders-table__cell-order-status::before {
	content: "";
	display: inline-block;
	width: 8px;
	height: 8px;
	margin-right: 8px;
	border-radius: 50%;
	background: var(--color-grey-400);
	vertical-align: middle;
}

.woocommerce-orders-table__row--status-completed .woocommerce-orders-table__cell-order-status::before {
	background: var(--color-brand-green);
}

.woocommerce-orders-table__row--status-processing .woocommerce-orders-table__cell-order-status::before,
.woocommerce-orders-table__row--status-on-hold .woocommerce-orders-table__cell-order-status::before {
	background: var(--color-brand-blue);
}

.woocommerce-orders-table__row--status-cancelled .woocommerce-orders-table__cell-order-status::before,
.woocommerce-orders-table__row--status-failed .woocommerce-orders-table__cell-order-status::before {
	background: var(--color-crimson);
}

.woocommerce-orders-table__cell-order-actions {
	text-align: right;
	white-space: nowrap;
}

.woocommerce-orders-table__cell-order-actions .button {
	display: inline-flex;
	align-items: center;
	height: 40px;
	padding: 0 20px;
	margin-left: 8px;
	border: none;
	border-radius: 100px;
	background: var(--color-grey-100);
	color: var(--color-brand-blue);
	font: var(--text-body-md);
	cursor: pointer;
}

.woocommerce-orders-table__cell-order-actions .button:hover {
	background: var(--color-grey-200);
}

/* No orders yet - WC prints an .woocommerce-message info box + a browse link. */
.woocommerce-MyAccount-content .woocommerce-message,
.woocommerce-MyAccount-content .woocommerce-info {
	margin: 0 0 24px;
}

/* Pagination between order pages. */
.woocommerce-pagination {
	display: flex;
	gap: 12px;
	margin-top: 24px;
}

.woocommerce-pagination .button {
	display: inline-flex;
	align-items: center;
	height: 40px;
	padding: 0 20px;
	border-radius: 100px;
	background: var(--color-grey-100);
	color: var(--color-brand-blue);
	font: var(--text-body-md);
}

/* Below 900px the 5-column table cannot hold its shape inside the account
   content column. WC already emits data-title on every cell for exactly this
   (its .shop_table_responsive convention), so each row becomes a card with
   the column name as an inline label. */
@media (max-width: 900px) {
	.woocommerce-orders-table thead {
		display: none;
	}

	.woocommerce-orders-table,
	.woocommerce-orders-table tbody,
	.woocommerce-orders-table tr,
	.woocommerce-orders-table th,
	.woocommerce-orders-table td {
		display: block;
		width: auto;
	}

	/* The white card is the CELLS, not the row. Putting it on the row added a
	   blank white strip below the last cell (the row's own padding) which read
	   as part of the next card. Row is now pure spacing. */
	.woocommerce-orders-table tr {
		background: none;
		border: none;
		padding: 0;
		margin-bottom: 20px;
	}

	.woocommerce-orders-table tr:last-child {
		margin-bottom: 0;
	}

	/* Cells stay white, the table behind them goes page-grey - that grey is
	   what shows through the 20px row gaps and actually separates the cards.
	   The shared rule further up paints the whole table white, which made the
	   gaps invisible. */
	.myaccount-layout__content .woocommerce-orders-table {
		background: var(--color-grey-100);
	}

	.myaccount-layout__content .woocommerce-orders-table th,
	.myaccount-layout__content .woocommerce-orders-table td {
		background: var(--color-white);
	}

	.woocommerce-orders-table tr > *:first-child {
		border-radius: 4px 4px 0 0;
		padding-top: 16px;
	}

	.woocommerce-orders-table tr > *:last-child {
		border-radius: 0 0 4px 4px;
		padding-bottom: 16px;
	}

	.myaccount-layout__content .woocommerce-orders-table th,
	.myaccount-layout__content .woocommerce-orders-table td {
		display: flex;
		align-items: center;
		justify-content: space-between;
		gap: 16px;
		padding: 10px 20px;
		border-bottom: none;
		text-align: right;
	}

	.woocommerce-orders-table td::before,
	.woocommerce-orders-table th::before {
		content: attr(data-title);
		font: var(--text-body-md);
		color: var(--color-grey-700);
		text-align: left;
	}

	/* The status dot lives on ::before at desktop, but here ::before has to
	   carry the row label instead. The per-status colour rules are scoped by
	   the row class and therefore out-specify a plain reset - so they're
	   re-stated at matching specificity, otherwise the word "Statuss" rendered
	   with a solid green/blue/pink block behind it and became unreadable. */
	.woocommerce-orders-table__cell-order-status::before,
	.woocommerce-orders-table__row--status-completed .woocommerce-orders-table__cell-order-status::before,
	.woocommerce-orders-table__row--status-processing .woocommerce-orders-table__cell-order-status::before,
	.woocommerce-orders-table__row--status-on-hold .woocommerce-orders-table__cell-order-status::before,
	.woocommerce-orders-table__row--status-cancelled .woocommerce-orders-table__cell-order-status::before,
	.woocommerce-orders-table__row--status-failed .woocommerce-orders-table__cell-order-status::before {
		content: attr(data-title);
		width: auto;
		height: auto;
		margin: 0;
		border-radius: 0;
		background: none;
	}

	/* Status value itself becomes a coloured pill, same language as the
	   dashboard rows. */
	.myaccount-layout__content .woocommerce-orders-table__cell-order-status {
		align-items: center;
	}

	.woocommerce-orders-table__cell-order-status {
		font: var(--text-body-md);
	}

	.woocommerce-orders-table__row--status-completed .woocommerce-orders-table__cell-order-status {
		color: var(--color-brand-green);
	}

	.woocommerce-orders-table__row--status-processing .woocommerce-orders-table__cell-order-status,
	.woocommerce-orders-table__row--status-on-hold .woocommerce-orders-table__cell-order-status {
		color: var(--color-brand-blue);
	}

	.woocommerce-orders-table__row--status-cancelled .woocommerce-orders-table__cell-order-status,
	.woocommerce-orders-table__row--status-failed .woocommerce-orders-table__cell-order-status {
		color: var(--color-crimson);
	}

	/* Label column keeps the neutral grey regardless of the value's colour. */
	.woocommerce-orders-table__cell-order-status::before {
		color: var(--color-grey-700);
	}

	/* Needs the full .myaccount-layout__content prefix: the generic cell rule
	   above is (0,2,1) and sets justify-content: space-between, which beat a
	   bare single-class selector here and parked the button hard left with the
	   free space to its right. */
	.myaccount-layout__content .woocommerce-orders-table__cell-order-actions {
		justify-content: center;
	}

	.woocommerce-orders-table__cell-order-actions::before {
		display: none;
	}

	/* Wide enough to read as the row's primary action once stacked, but not
	   edge to edge. */
	.woocommerce-orders-table__cell-order-actions .button {
		flex: 0 1 70%;
		justify-content: center;
		height: 48px;
		margin: 4px 0 0;
	}
}

.myaccount-layout__content .woocommerce-Addresses {
	display: flex;
	gap: 24px;
}

.myaccount-layout__content .woocommerce-Address {
	flex: 1;
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

.myaccount-layout__content .woocommerce-Address-title {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 16px;
}

.myaccount-layout__content .woocommerce-Address-title h2,
.myaccount-layout__content .woocommerce-Address-title h3 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0;
}

/* "Pievienot / Rediģēt" as a grey pill, matching Figma 654:19381 - it was a
   bare blue text link jammed against the heading.
   NOT the 3px uppercase tracking the CTA buttons use: these labels are long
   full sentences ("Pievienot Norēķinu adrese"), and at 3px they sprawled
   across most of the card. */
.myaccount-layout__content .woocommerce-Address-title .edit {
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	height: 40px;
	padding: 0 24px;
	border-radius: 100px;
	background: var(--color-grey-100);
	box-shadow: inset 0 -4px 36px 0 rgba(0, 0, 0, 0.06);
	color: var(--color-brand-blue);
	font: var(--text-body-md);
	letter-spacing: 0.5px;
	white-space: nowrap;
}

.myaccount-layout__content .woocommerce-Address address {
	font: var(--text-body-regular);
	font-style: normal;
	color: var(--color-grey-700);
	margin: 0;
}

.myaccount-layout__content form .form-row {
	margin: 0 0 20px;
}

.myaccount-layout__content form label {
	display: block;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin-bottom: 6px;
}

/* `.input-text` covers the edit-account form too - its inputs are NOT wrapped
   in .woocommerce-input-wrapper (only the address forms are), which is why
   that page rendered as bare browser default fields. */
.myaccount-layout__content form .woocommerce-input-wrapper input,
.myaccount-layout__content form .woocommerce-input-wrapper select,
.myaccount-layout__content form .input-text,
.myaccount-layout__content form select {
	width: 100%;
	height: 47px;
	padding: 0 20px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	background: var(--color-white);
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	box-sizing: border-box;
}

/* ---- Edit account form (Profila informācija) ---- */
.woocommerce-EditAccountForm {
	background: var(--color-white);
	border-radius: 4px;
	padding: 32px;
	max-width: 720px;
}

.woocommerce-EditAccountForm .form-row-first,
.woocommerce-EditAccountForm .form-row-last {
	width: calc(50% - 12px);
	float: left;
}

.woocommerce-EditAccountForm .form-row-last {
	margin-left: 24px;
}

.woocommerce-EditAccountForm .clear {
	clear: both;
}

.woocommerce-EditAccountForm .required {
	color: var(--color-crimson);
	text-decoration: none;
}

/* WC puts the display-name hint in a trailing <span><em>, which inlined
   itself next to the field. */
.woocommerce-EditAccountForm #account_display_name_description {
	display: block;
	margin-top: 6px;
	font: var(--text-caption);
	font-style: normal;
	color: var(--color-grey-700);
}

.woocommerce-EditAccountForm #account_display_name_description em {
	font-style: normal;
}

.woocommerce-EditAccountForm fieldset {
	margin: 8px 0 24px;
	padding: 24px;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
}

.woocommerce-EditAccountForm fieldset legend {
	padding: 0 8px;
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

.woocommerce-EditAccountForm .password-input {
	display: block;
}

.myaccount-layout__content form button[type="submit"] {
	height: 47px;
	padding: 0 24px;
	border: none;
	border-radius: 100px;
	background: var(--color-brand-blue);
	color: var(--color-white);
	font: var(--text-body-md);
	cursor: pointer;
}

/* The save button sits in a bare <p> after a floated field row. */
.woocommerce-EditAccountForm > p:last-of-type {
	clear: both;
	margin: 0;
}

/* ---- Login / register (woocommerce/myaccount/form-login.php, Figma
   654:19669 / 654:19796). Rendered directly into #site-content, not wrapped
   by my-account.php (WC never calls that template for a logged-out visitor -
   see the comment there), so this owns its own page-level centering. */
.myaccount-auth {
	max-width: 1630px;
	margin: 60px auto;
	display: flex;
	justify-content: center;
	gap: 40px;
}

.myaccount-auth__panel {
	width: 100%;
	max-width: 420px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 40px;
	box-sizing: border-box;
}

.myaccount-auth__head {
	text-align: center;
	margin-bottom: 32px;
}

.myaccount-auth__head h2 {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 8px;
}

.myaccount-auth__subtitle {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0;
}

.myaccount-auth .form-row {
	margin: 0 0 16px;
}

.myaccount-auth label {
	display: block;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin-bottom: 6px;
}

.myaccount-auth .required {
	color: var(--color-crimson);
	text-decoration: none;
}

.myaccount-auth .screen-reader-text {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
}

.myaccount-auth .input-text {
	width: 100%;
	height: 47px;
	padding: 0 20px;
	border: 1px solid var(--color-grey-200);
	border-radius: 100px;
	background: var(--color-white);
	font: var(--text-body-lg);
	color: var(--color-grey-900);
	box-sizing: border-box;
}

.myaccount-auth__row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 24px;
}

.myaccount-auth__row .woocommerce-form-login__rememberme {
	display: flex;
	align-items: center;
	gap: 8px;
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.myaccount-auth .lost_password {
	margin: 0;
	font: var(--text-body-md);
}

.myaccount-auth .lost_password a,
.myaccount-auth__row .woocommerce-form-login__rememberme a {
	color: var(--color-brand-blue);
}

.myaccount-auth .pill-btn--cta {
	width: 100%;
}

.myaccount-auth__foot {
	margin: 16px 0 0;
	text-align: center;
	font: var(--text-body-md);
}

.myaccount-auth__foot a {
	color: var(--color-brand-blue);
}

/* WC's lost-password template ships form-row-first, which its own (dequeued)
   stylesheet floats to 50% - without that CSS it's fine, but the row also
   carries a .clear sibling, so make the width explicit either way. */
.myaccount-auth .form-row-first {
	width: 100%;
	float: none;
}

/* ---- WC's own "show password" toggle (core woocommerce.js wraps every
   password field in .password-input and injects this button - not something
   this theme adds, but its CSS is normally supplied by WC's own stylesheet,
   which this theme dequeues entirely, so it rendered as a bare unstyled
   overlapping button). Global, not scoped to .myaccount-auth - the same
   wrapper appears on any WC form with a password field (lost/reset password,
   edit-account). ---- */
.password-input {
	position: relative;
	display: block;
}

.show-password-input {
	position: absolute;
	top: 50%;
	right: 16px;
	transform: translateY(-50%);
	width: 20px;
	height: 20px;
	padding: 0;
	border: none;
	background: url("assets/icons/eye.svg") no-repeat center / contain;
	cursor: pointer;
}

.show-password-input.display-password {
	background-image: url("assets/icons/eye-off.svg");
}

.password-input .input-text {
	padding-right: 44px;
}

@media (max-width: 900px) {
	.myaccount-auth {
		flex-direction: column;
		align-items: center;
	}
}

@media (max-width: 480px) {
	.myaccount-auth__panel {
		padding: 24px;
	}
}

/* ---- Legal pages (Garantijas un atgriešana + siblings, Figma 344:6984 /
   492:16093 / 492:16266) - reuses .shop-layout for the sidebar+content row. */
.legal-sidebar {
	width: 390px;
	flex-shrink: 0;
	padding: 20px;
	background: var(--color-white);
	border-radius: 4px;
	box-sizing: border-box;
}

.legal-sidebar__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.legal-sidebar__link {
	display: block;
	padding: 12px 20px;
	border-radius: 100px;
	font: var(--text-body-lg);
	color: var(--color-grey-700);
}

.legal-sidebar__link.is-active {
	background: var(--color-grey-100);
	font: var(--text-body-lg-bold);
	color: var(--color-brand-blue);
}

/* ---- Plain prose page (page-templates/prose.php, Figma 579:15598) ----
   Konfidencialitātes politika and any other standalone document page: no
   sidebar, numbered H2 sections, measured line length. */
.prose-page__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 0 0 16px;
}

.prose-page__intro {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0 0 40px;
	max-width: 900px;
}

/* ~80 characters. Full-width legal text across a 1630px page is unreadable. */
.prose-page__body {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	max-width: 900px;
	padding-bottom: 40px;
}

.prose-page__body h2 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 40px 0 16px;
}

.prose-page__body h2:first-child {
	margin-top: 0;
}

.prose-page__body h3 {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 32px 0 12px;
}

.prose-page__body p {
	margin: 0 0 20px;
	line-height: 1.6;
}

.prose-page__body ul,
.prose-page__body ol {
	margin: 0 0 20px;
	padding-left: 21px;
}

.prose-page__body li {
	margin-bottom: 8px;
	line-height: 1.6;
}

.prose-page__body a {
	color: var(--color-brand-blue);
	text-decoration: underline;
}

.prose-page__body table {
	width: 100%;
	border-collapse: collapse;
	margin: 0 0 24px;
}

.prose-page__body th,
.prose-page__body td {
	padding: 12px 16px;
	text-align: left;
	border: 1px solid var(--color-grey-200);
}

.legal-content {
	flex: 1;
	min-width: 0;
}

.legal-content__title {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 40px;
}

.legal-content__body {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	max-width: 800px;
}

.legal-content__body p {
	margin: 0 0 24px;
}

.legal-content__body ul {
	margin: 0 0 24px;
	padding-left: 21px;
}

.legal-content__body li {
	margin-bottom: 8px;
}

/* 3-column product grid, reusing product-card */
.shop-grid.products {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 24px;
	/* stretch + .product-card{height:100%} is what actually equalises a row.
	   The fixed part-heights (2-line title, 68px price) get most of the way
	   there, but anything else that varies - a wrapped button, a taller image
	   box - still left rows ragged. */
	align-items: stretch;
}

/* Neutralize WooCommerce's default ul.products li.product float/width/margin so
   our grid controls the layout. */
.shop-grid.products li.product {
	width: auto;
	float: none;
	margin: 0;
	clear: none;
}

.shop-archive__empty {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
}

/* ---- Katalogs landing page (Figma 125:5053) - category tiles + Populāras
   slider + intro block. Distinct from the product-grid archive above. ---- */
.catalog-landing__head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 24px;
	flex-wrap: wrap;
	margin-bottom: 40px;
}

.catalog-landing__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 8px 0 0;
}

.catalog-landing__search {
	flex-shrink: 0;
}

/* Fixed 5 columns on desktop (not auto-fill) - Rob wants exactly 5 per row on
   desktop regardless of container width, wrapping to fewer only on smaller
   breakpoints (see the @media rules further down). */
.catalog-tiles {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	gap: 24px;
	margin-bottom: 140px;
}

@media (max-width: 1440px) {
	.catalog-tiles {
		grid-template-columns: repeat(4, 1fr);
	}
}

.catalog-tile {
	position: relative;
	height: 240px;
	border-radius: 4px;
	overflow: hidden;
	text-decoration: none;
	display: block;
}

/* Real per-category photo (WooCommerce category thumbnail, or the shared WC
   placeholder if none is set yet) - sits bottom-right, capped at ~160px tall,
   never cropped or stretched (object-fit:contain preserves the source image's
   own proportions untouched). */
.catalog-tile__photo {
	position: absolute;
	right: 0;
	bottom: 0;
	width: 100%;
	height: 100%;
	pointer-events: none;
}

.catalog-tile__photo img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: bottom right;
}

.catalog-tile__name {
	position: absolute;
	top: 20px;
	left: 20px;
	right: 20px;
	font: var(--text-h4);
	color: var(--color-grey-900);
	/* Was raw overflow clipping - a wrapped title's last line got cut mid-glyph
	   right at the tile's edge instead of stopping between lines, which read as
	   text bleeding into the section below. Real 2-line clamp + ellipsis instead. */
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.catalog-tile__badge {
	position: absolute;
	bottom: 20px;
	left: 20px;
	width: 40px;
	height: 40px;
}

.catalog-tile__badge img {
	width: 100%;
	height: 100%;
}

.catalog-intro {
	position: relative;
	background: var(--color-white);
	border-radius: 4px;
	padding: 32px;
	overflow: hidden;
	min-height: 266px;
	display: flex;
	align-items: center;
	/* Nothing was pushing this away from the Populāras preces grid above it -
	   .product-row's margin is on ITS OWN top, not a bottom margin, so the two
	   sat flush against each other. */
	margin-top: 100px;
}

@media (max-width: 1024px) {
	.catalog-intro {
		margin-top: 60px;
	}
}

@media (max-width: 767px) {
	.catalog-intro {
		margin-top: 40px;
	}
}

.catalog-intro__copy {
	max-width: 509px;
	position: relative;
	z-index: 1;
}

.catalog-intro__copy h2 {
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

.catalog-intro__copy p {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 16px;
}

.catalog-intro__image {
	position: absolute;
	top: 0;
	right: 0;
	height: 100%;
	width: 686px;
	max-width: 45%;
	object-fit: cover;
}

@media (max-width: 500px) {
	.catalog-tile {
		height: 150px;
	}

	.catalog-tile__name {
		font: var(--text-body-lg-bold);
	}
}

@media (max-width: 767px) {
	.catalog-intro {
		flex-direction: column;
		align-items: flex-start;
	}
	.catalog-intro__image {
		position: static;
		width: 100%;
		max-width: 100%;
		height: 200px;
		margin-top: 24px;
	}
}

/* WooCommerce pagination */
.shop-archive .woocommerce-pagination {
	margin-top: 40px;
	text-align: center;
}

.shop-archive .woocommerce-pagination ul {
	display: inline-flex;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}

.shop-archive .woocommerce-pagination a,
.shop-archive .woocommerce-pagination span {
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 40px;
	height: 40px;
	padding: 0 12px;
	border-radius: 100px;
	background: var(--color-grey-100);
	color: var(--color-grey-900);
	text-decoration: none;
}

.shop-archive .woocommerce-pagination .current {
	background: var(--color-brand-blue);
	color: var(--color-white);
}

/* Only the COLUMN COUNT moves up - three product columns beside a 390px
   sidebar stay cramped well past 1440, so 2-up holds all the way to 1560.
   The sidebar itself keeps stacking at 1200, where it always did. */
@media (max-width: 1560px) {
	.shop-grid.products {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* Full-width gutter from 1440, matching the header (.site-header__inner drops
   to 20px at the same breakpoint) - .shop-archive__inner is the shared
   container for the cart, Garantijas/Kontakti/Par mums, wishlist and the
   product page's breadcrumb/tail sections, so fixing it here covers all of
   them instead of patching each page. Previously this only narrowed at
   1200px, so those pages stayed boxed in well after the header had already
   gone edge-to-edge. */
@media (max-width: 1440px) {
	.shop-archive__inner {
		padding-left: 20px;
		padding-right: 20px;
	}
}

@media (max-width: 1200px) {
	.shop-archive__inner {
		padding-top: 24px;
		padding-bottom: 60px;
	}
	.shop-layout {
		flex-direction: column;
	}
	.shop-sidebar {
		width: 100%;
	}
	.catalog-tiles {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 767px) {
	.shop-grid.products {
		grid-template-columns: 1fr;
	}
	.catalog-tiles {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* ---- Header flyout menus (☰ main menu 73:1558, Katalogs mega-menu 87:1875) ---- */
/* Shared dark backdrop behind either open flyout, with the X close button. */
.menu-overlay {
	position: fixed;
	inset: 0;
	background: rgba(13, 27, 40, 0.4);
	z-index: 1000;
}

.menu-overlay__close {
	position: fixed;
	top: 40px;
	right: 40px;
	width: 44px;
	height: 44px;
	display: flex;
	align-items: center;
	justify-content: center;
	border: none;
	background: none;
	color: var(--color-white);
	cursor: pointer;
	z-index: 1002;
}

/* Shared flyout panel - fixed to the left edge, full height, white. */
.flyout {
	position: fixed;
	top: 0;
	left: 0;
	height: 100vh;
	background: var(--color-white);
	border-right: 1px solid var(--color-grey-200);
	padding: 60px;
	overflow-y: auto;
	z-index: 1001;
}

.flyout--catalog {
	width: 286px;
}

.flyout__title {
	display: block;
	text-decoration: none;
	font: var(--text-h4);
	color: var(--color-grey-900);
	margin: 0 0 40px;
}

/* Main (hamburger) menu - single client-editable column. */
.main-menu__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.main-menu__list a {
	display: block;
	padding: 10px 0;
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	text-decoration: none;
	white-space: nowrap;
}

.main-menu__list a:hover,
.main-menu__list .current-menu-item > a {
	color: var(--color-brand-blue);
}

/* Katalogs mega-menu - parents column + hover-revealed children column. */
.catalog-menu__parents {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}

/* Same treatment as .main-menu__list: the click target was only the text's own
   line-height, with dead space between items. Padding moves into the link so
   the whole row is clickable; the list gap shrinks to compensate, keeping the
   overall column height (and therefore the layout) unchanged. */
.catalog-menu__parent-link,
.catalog-menu__child-link {
	display: block;
	padding: 10px 0;
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	text-decoration: none;
	white-space: nowrap;
}

.catalog-menu__parent.is-active > .catalog-menu__parent-link,
.catalog-menu__parent-link:hover,
.catalog-menu__child-link:hover {
	color: var(--color-brand-blue);
}

/* Children sit as a second white panel immediately right of the 286px parents
   column, full height, top-aligned to match the parent list (142px = 60 pad +
   title + gap). Only the active parent's children are shown (JS toggles
   .is-active on mouseenter). position:fixed (not absolute) so the panel escapes
   the parents column's overflow-y:auto - otherwise overflow-x clips it away. */
.catalog-menu__children {
	position: fixed;
	left: 286px;
	top: 0;
	height: 100vh;
	min-width: 286px;
	background: var(--color-white);
	border-right: 1px solid var(--color-grey-200);
	padding: 142px 60px 60px;
	margin: 0;
	list-style: none;
	display: none;
	flex-direction: column;
	gap: 4px;
	overflow-y: auto;
	z-index: 1;
}

.catalog-menu__parent.is-active > .catalog-menu__children {
	display: flex;
}

/* ---- Site footer ---- */
#site-footer {
	margin-top: 80px;
	background: var(--color-grey-50);
	border-top: 1px solid var(--color-grey-200);
}

.site-footer__inner {
	box-sizing: border-box;
	max-width: 1920px;
	margin: 0 auto;
	/* 28px top, not 48 (Figma 161:1220). */
	padding: 28px 145px 48px;
	display: grid;
	grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;
	gap: 32px;
}

.site-footer__logo {
	height: 32px;
	width: auto;
	margin-bottom: 16px;
}

.site-footer__hours {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0 0 16px;
}

.site-footer__socials {
	display: flex;
	gap: 12px;
}

.site-footer__socials a {
	width: 64px;
	height: 64px;
	border-radius: 100px;
	background: var(--color-grey-200);
	display: flex;
	align-items: center;
	justify-content: center;
}

.site-footer__socials a img {
	/* Figma 95:2231: 24px glyph inside the 64px circle (was 28, read too big). */
	width: 24px;
	height: 24px;
}

.site-footer__payment-icons {
	display: flex;
	gap: 12px;
	margin-bottom: 8px;
}

/* 64px grey-200 icon pill. On hover a SEPARATE semi-transparent pill (the
   provider name) overlaps its right edge - Figma tooltip is Greyscale/400 at
   50% (#979797), not a merge into the chip. */
.site-footer__payment-chip {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 64px;
	height: 40px;
	border-radius: 100px;
	background: var(--color-grey-200);
	flex-shrink: 0;
}

.site-footer__payment-chip[data-name]:hover::after {
	content: attr(data-name);
	position: absolute;
	/* Overlaps the chip's right edge, vertically centred (Figma). */
	left: calc(100% - 14px);
	top: 24%;
	transform: translateY(-50%);
	padding: 8px 16px;
	border-radius: 100px;
	background: rgb(184 184 184);
	color: var(--color-grey-900);
	font: var(--text-body-md);
	white-space: nowrap;
	pointer-events: none;
	z-index: 2;
}

.site-footer__payment-icons img {
	height: 24px;
	width: auto;
	flex-shrink: 0;
}

/* Phone + email as grey pills, address as icon + text (Figma 161:1220). */
.site-footer__contact {
	display: flex;
	flex-direction: column;
	gap: 8px;
	align-items: flex-start;
}

/* inline-grid so both pills size to the WIDER of the two (Figma pins them to
   one width); justify-items:stretch makes the shorter one grow to match. */
.site-footer__contact-pills {
	display: inline-grid;
	gap: 8px;
	justify-items: stretch;
}

.site-footer__chip {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 8px 20px;
	border-radius: 100px;
	background: var(--color-grey-100);
	color: var(--color-grey-900);
	font: var(--text-body-regular);
	transition: color 0.15s ease;
}

.site-footer__chip:hover {
	color: var(--color-brand-blue);
}

.site-footer__address {
	display: flex;
	/* Centre the pin against the text (Figma address is items-center) - it sat
	   a few px low with flex-start + a margin nudge. */
	align-items: center;
	gap: 8px;
	margin: 0;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	transition: color 0.15s ease;
}

.site-footer__address:hover {
	color: var(--color-brand-blue);
}

.site-footer__address img {
	flex-shrink: 0;
}

.site-footer__heading {
	/* 18px bold (Figma 95:2250) - was 14px medium. */
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
	margin: 0 0 16px;
}

.site-footer__links {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.site-footer__links a,
.site-footer__links li {
	font: var(--text-body-regular);
	/* Dark, not grey-700 (Figma link colour #0D1B28); blue on hover. */
	color: var(--color-grey-900);
	transition: color 0.15s ease;
}

.site-footer__links a:hover {
	color: var(--color-brand-blue);
}

.site-footer__payments {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	margin: 0;
}

.site-footer__bottom {
	box-sizing: border-box;
	max-width: 1920px;
	margin: 0 auto;
	padding: 20px 145px;
	border-top: 1px solid var(--color-grey-200);
	display: flex;
	justify-content: space-between;
	/* 14px (Figma 95:2283), not 12px caption. */
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.site-footer__bottom p {
	margin: 0;
}

.site-footer__bottom a {
	color: var(--color-grey-700);
	text-decoration: underline;
}

/* Baseline, NOT center: the mark is bottom-heavy - inside its 18px box the
   "coma" wordmark occupies y 9-17.5 with the three dots floating above it, so
   the box's vertical centre sits well above the wordmark's. Centring the box
   therefore pushes the visible letters below the text baseline. Aligning on
   the baseline puts the wordmark's foot on the text's foot, which is what the
   eye reads as level. */
.site-footer__credit {
	display: inline-flex;
	align-items: baseline;
	gap: 6px;
}

.site-footer__credit a {
	display: inline-flex;
	align-items: baseline;
	text-decoration: none;
}

.site-footer__credit img {
	display: block;
}

/* Footer mobile rules live in the RESPONSIVE SWEEP block further down, so they
   come after the <=1024px tablet rules and actually win at phone widths
   (equal specificity - source order decides). */

/* ============================================================================
   RESPONSIVE SWEEP - found by auditing every page at a 390px viewport and
   measuring real horizontal overflow (document.scrollWidth vs clientWidth),
   not by eyeballing screenshots.

   The theme was built desktop-first and MOST components never got a mobile
   rule at all: fixed-width sidebars (390px/527px) and hardcoded 4-column
   grids stayed at their desktop size on a phone, pushing the whole document
   sideways. Every rule below is tied to a specific measured offender.
   ========================================================================= */

/* ---- Two-column page layouts: the sidebars were fixed-width and never
   collapsed. .shop-layout already went column at 1200px, but only
   .shop-sidebar got width:100% there - .legal-sidebar (390px),
   .cart-layout__sidebar and .checkout-layout__sidebar (both 527px) all
   kept their desktop width and overflowed. ---- */
@media (max-width: 1200px) {
	.cart-layout,
	.checkout-layout {
		flex-direction: column;
	}

	/* THE key fix. All three layouts set `align-items: flex-start`, which in a
	   COLUMN flex container makes each child size to fit-content on the cross
	   (horizontal) axis instead of stretching. fit-content can exceed the
	   container, so children ballooned to their min-content width (e.g. the
	   sort bar forced .shop-layout__main to 496px inside a 232px parent) and
	   `min-width: 0` did nothing, because the overflow wasn't a min-width
	   problem at all. Stretch makes them honour the container width. */
	.shop-layout,
	.cart-layout,
	.checkout-layout {
		align-items: stretch;
	}

	.legal-sidebar,
	.cart-layout__sidebar,
	.checkout-layout__sidebar {
		width: 100%;
		position: static; /* sticky is meaningless once stacked full-width */
	}

	/* Stacked cart order: title, summary, items, policy accordion - the summary
	   has to come BEFORE the item list, so it can't just be `order` on the two
	   columns: the title and the item list are siblings inside
	   .cart-layout__main, and the summary is in the other column entirely.
	   `display: contents` drops __main's box so its three children become
	   direct flex items of .cart-layout, which puts all four in one ordering
	   context. Safe on a plain div (the display:contents a11y bug applies to
	   elements with their own semantics, e.g. ul/table).
	   Their own vertical margins are zeroed so the container's 24px gap is the
	   single source of spacing instead of stacking on top of them. */
	.cart-layout__main {
		display: contents;
	}

	.cart-layout .cart-page__head {
		order: 1;
		margin-bottom: 0;
	}

	.cart-layout__sidebar {
		order: 2;
	}

	.cart-layout .woocommerce-cart-form {
		order: 3;
	}

	.cart-layout .cart-policy {
		order: 4;
		margin-top: 0;
	}

	/* Stacked, the checkout sections run straight into each other. */
	.checkout-layout {
		gap: 40px;
	}

	.checkout-section-title {
		margin-top: 40px;
	}

	.woocommerce-account-fields {
		margin: 20px 0 32px;
	}

	.checkout-shipping {
		margin-bottom: 0;
	}

	/* .product-page carries its own 145px side padding with no override,
	   which alone offset the whole page 145px past a phone viewport. */
	.product-page {
		padding: 24px 24px 60px;
	}
}

/* ---- Cart line items on narrow screens ----
   The row is thumb + name + stepper + wishlist + remove on one line. The
   stepper and the two icon buttons are all fixed-width and unshrinkable, so
   below ~550px every pixel comes out of the name column - the title was being
   squeezed to one or two characters per line. Break the row in two instead:
   thumb + text across the top, controls on their own line underneath. */
@media (max-width: 550px) {
	.cart-item {
		flex-wrap: wrap;
		align-items: center;
		/* Only affects the controls line - the thumb+name line above always
		   fills its full width, so centring is a no-op there. */
		justify-content: center;
		row-gap: 12px;
	}

	/* Sized to exactly finish the first line (64px thumb + 16px gap), which is
	   what keeps the three controls together on line two. Giving the stepper a
	   100% basis instead pushed it onto a line of its own and bumped the
	   wishlist/remove buttons down to a third. */
	.cart-item__info {
		flex: 1 1 calc(100% - 80px);
	}

	.cart-item__qty {
		flex: 0 0 auto;
	}

	/* Scale the 56px control set down so the stepper + two buttons still fit
	   one line on a phone. */
	.cart-item__qty .quantity {
		width: 124px;
		height: 44px;
		padding: 3px;
	}

	.cart-item__qty .qty-step {
		width: 32px;
		height: 32px;
	}

	.cart-item__qty .qty-step--plus {
		width: 38px;
		height: 38px;
	}

	.cart-item__wishlist,
	.cart-item__remove {
		width: 44px;
		height: 44px;
	}

	.cart-item__wishlist img,
	.cart-item__remove img {
		width: 20px;
		height: 20px;
	}
}

/* ---- Coupon row + place-order button on very narrow screens ---- */
@media (max-width: 400px) {
	/* Field and button side by side leaves the input a ~60px stub. */
	.cart-coupon__row {
		flex-direction: column;
		align-items: stretch;
	}

	/* The 40px pill reads as squashed once it's full-width and stacked above a
	   button of the same height - both go up to the 48px the other inputs use. */
	.cart-coupon__field {
		height: 48px;
	}

	.cart-coupon__submit {
		width: 100%;
		height: 48px;
	}

	/* Once the label wraps to two lines the default left-ish alignment reads
	   as broken - the button is full-width, so centre both lines. */
	.cart-summary__checkout,
	.cart-summary__disabled,
	.wc-proceed-to-checkout .checkout-button {
		height: auto;
		min-height: 56px;
		padding: 12px 20px;
		text-align: center;
		text-wrap: balance;
	}
}

/* ---- Product grids that were hardcoded to 4 columns with no breakpoint.
   Measured: related products alone pushed the single-product page 1154px
   past the viewport at 390px. ---- */
@media (max-width: 1200px) {
	.related.products ul.products,
	.jaunumi-grid {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 900px) {
	.related.products ul.products,
	.jaunumi-grid {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 560px) {
	.related.products ul.products,
	.jaunumi-grid {
		grid-template-columns: 1fr;
	}
}

/* ---- Grid items must be allowed to shrink. A `1fr` track's automatic minimum
   is the item's MIN-CONTENT, so a product card with a long unbreakable title
   set a floor far wider than its column and blew the whole grid out - measured
   350-380px of overflow even at 1440px desktop on every product grid (shop,
   category, search, related products). min-width:0 removes that floor; the
   cards already have overflow:hidden so their contents clip cleanly. ---- */
.shop-grid.products > li,
.shop-grid__item,
.related.products ul.products > li,
.jaunumi-grid > li,
.catalog-tiles > * {
	min-width: 0;
}

.shop-grid.products .product-card,
.related.products .product-card,
.jaunumi-grid .jaunumi-card {
	min-width: 0;
}

/* ---- TABLET (<=1024). Everything here was originally written as a 767px-only
   rule, which left a 768-1024px tablet showing the untouched desktop layout -
   measured, that overflowed 100-370px on literally every page. These are all
   "stop being a rigid desktop row" rules, so they belong at tablet width. ---- */
@media (max-width: 1024px) {
	/* Category/search archive: .shop-sort-bar__search is width:340px, which
	   set a min-content floor of 496px on .shop-layout__main and dragged the
	   whole grid past the viewport. */
	.shop-sort-bar__search {
		width: 100%;
		margin-left: 0;
	}

	.shop-sort-bar,
	.shop-sort-bar__filters {
		width: 100%;
	}

	/* Kontakti's 3 contact cards were a non-wrapping flex row (416px over). */
	.kontakti-cards {
		flex-direction: column;
	}

	/* Product summary: qty stepper + add-to-cart + heart on one line put the
	   heart 169px past the right edge. */
	.product-page__cart-row {
		flex-wrap: wrap;
	}

	/* Apraksts/Lietošana/Sastāvs segmented control is wider than 360px. */
	.woocommerce-tabs ul.tabs {
		display: flex;
		flex-wrap: wrap;
		width: 100%;
		box-sizing: border-box;
	}

	/* Pagination is a non-wrapping inline-flex row - 7+ page links ran 160px
	   past the edge on a category archive. */
	.shop-archive .woocommerce-pagination ul {
		flex-wrap: wrap;
		justify-content: center;
	}

	/* My Account: stat cards and the address/payment prompt cards were both
	   non-wrapping flex rows (296px and 136px over). */
	.myaccount-stats,
	.myaccount-prompts {
		flex-direction: column;
		gap: 12px;
	}

	/* Katalogs landing header: the search keeps its desktop width because of
	   flex-shrink:0, so it pushed the head row past the viewport. */
	.catalog-landing__search {
		flex-shrink: 1;
		width: 100%;
	}

	.catalog-landing__search .shop-sort-bar__search,
	.catalog-landing__search form {
		width: 100%;
	}

	/* Par mums "Kāpēc izvēlēties" - 6 cards in a non-wrapping flex row. */
	.parmums-whyus__grid {
		flex-wrap: wrap;
	}

	.parmums-card {
		flex: 1 1 calc(33.333% - 14px);
	}

	/* Footer kept its desktop 5-column grid + 145px side padding until 767px,
	   so a 768px tablet overflowed by 100px on every single page. */
	.site-footer__inner {
		grid-template-columns: repeat(3, 1fr);
		padding: 40px 24px;
	}

	.site-footer__bottom {
		padding: 20px 24px;
	}
}

@media (max-width: 767px) {
	.parmums-card {
		flex-basis: calc(50% - 11px);
	}

	/* #site-content's 40px side padding stacked on top of each inner
	   container's own 24px left only 232px of usable width on a 360px screen.
	   Trim both so content gets a sane share of a phone viewport. */
	#site-content {
		padding: 0 12px;
	}

	.shop-archive__inner,
	.product-page {
		padding-left: 12px;
		padding-right: 12px;
	}

	/* Newsletter box on a phone: give the card breathing room top and bottom,
	   and pull the form up closer to the subtitle (the desktop 60px gap reads
	   as a hole on a narrow screen). */
	.newsletter-signup {
		padding: 40px 20px;
		margin-top: 30px;
		margin-bottom: 30px;
	}

	.newsletter-signup__subtitle {
		margin-bottom: 32px;
	}

	.newsletter-signup__form {
		flex-wrap: wrap;
	}

	.newsletter-signup__input {
		flex-basis: 100%;
	}

	/* Footer: 2 columns on a phone, brand block full width. */
	.site-footer__inner {
		padding: 32px 20px;
		grid-template-columns: 1fr 1fr;
		gap: 32px 20px;
	}

	.site-footer__col--brand {
		grid-column: 1 / -1;
	}

	.site-footer__bottom {
		padding: 20px;
		flex-direction: column;
		align-items: center;
		text-align: center;
		gap: 8px;
		text-align: center;
	}
}

/* The cart coupon row (input + "Lietot kuponu" button) is a non-wrapping
   flex row that ran 2px past a 360px viewport. */
@media (max-width: 767px) {
	.coupon {
		display: flex;
		flex-wrap: wrap;
		gap: 8px;
	}

	.coupon .pill-btn,
	.coupon input {
		flex: 1 1 100%;
		box-sizing: border-box;
	}
}

/* ---- Cart policy tabs: Garantijas / Piegāde / Apmaksa (Figma 211:3949,
   segments 275:7332, panel 275:7333) ---- */
.cart-policy {
	margin-top: 32px;
	max-width: 700px;
}

.cart-policy__segments {
	display: flex;
	gap: 4px;
	padding: 3.5px;
	border-radius: 100px;
	background: var(--color-grey-200);
}

/* nowrap keeps each label on one line (Figma 275:7494 - one line, 49px tall;
   "Garantijas un atgriešana" wrapping to two was what doubled the control's
   height). Paired with `min-width: max-content` - flex's default min-width:auto
   was still letting a segment shrink narrower than its own nowrap text, so the
   label spilled outside its pill instead of the pill growing to hold it. */
.cart-policy__segment {
	flex: 1 1 auto;
	min-width: max-content;
	padding: 12px 24px;
	border: none;
	border-radius: 100px;
	background: none;
	color: var(--color-grey-900);
	font: var(--text-body-lg);
	line-height: 1.4;
	white-space: nowrap;
	cursor: pointer;
	box-sizing: border-box;
}

.cart-policy__segment.is-active {
	background: var(--color-grey-50);
	font: var(--text-body-lg-bold);
}

.cart-policy__panel {
	display: none;
	padding-top: 24px;
}

.cart-policy__panel.is-active {
	display: block;
}

.cart-policy__prose {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.cart-policy__prose p {
	margin: 0 0 12px;
}

.cart-policy__link {
	color: var(--color-brand-blue);
}

.cart-policy__pickup {
	margin: 0 0 16px;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.cart-policy__region {
	border-radius: 4px;
	overflow: hidden;
	margin-bottom: 4px;
}

/* grey-200, NOT grey-100: grey-100 (#F5F4F4) is within a hair of the page
   background, so the header band was effectively invisible and the accordion
   read as unstyled. Same recurring trap as the tab pills and FAQ circles.
   Left padding is 24px (was 44) - the design indents the chevron about half
   that far. */
.cart-policy__region-head {
	display: flex;
	align-items: center;
	gap: 12px;
	width: 100%;
	height: 52px;
	padding: 0 24px;
	border: none;
	background: var(--color-grey-200);
	color: var(--color-grey-900);
	font: var(--text-body-md);
	font-weight: 700;
	text-align: left;
	cursor: pointer;
	box-sizing: border-box;
}

.cart-policy__chevron {
	flex-shrink: 0;
	transition: transform 0.15s ease;
}

.cart-policy__region.is-open .cart-policy__chevron {
	transform: rotate(180deg);
}

.cart-policy__rates {
	display: none;
	list-style: none;
	margin: 0;
	padding: 0;
}

/* flex + gap, not plain block: the rows are white cards separated by a hairline
   of the page behind them, which is what makes them read as separate rates
   rather than one unstyled slab. */
.cart-policy__region.is-open .cart-policy__rates {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin-top: 2px;
}

/* Prose body of a Garantijas accordion - same white panel as the Piegāde
   tab's rate rows, so both tabs read as one component. */
.cart-policy__region-body {
	display: none;
}

.cart-policy__region.is-open .cart-policy__region-body {
	display: block;
	margin-top: 2px;
	padding: 20px 24px;
	background: var(--color-white);
}

.cart-policy__region-body .cart-policy__prose > *:last-child {
	margin-bottom: 0;
}

.cart-policy__rate {
	display: flex;
	align-items: center;
	gap: 16px;
	height: 50px;
	padding: 0 24px;
	background: var(--color-white);
	font: var(--text-body-regular);
	color: var(--color-grey-700);
	box-sizing: border-box;
}

/* Fixed basis rather than flex:1 - the design sets the price in its OWN column
   right after the name (all three prices line up), instead of letting the name
   push it across to sit against the free-delivery text on the right. */
.cart-policy__rate-name {
	flex: 0 1 180px;
	min-width: 0;
}

.cart-policy__rate-price {
	flex-shrink: 0;
	color: var(--color-grey-900);
}

.cart-policy__rate-free {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-left: auto;
}

.cart-policy__rate-free strong {
	color: var(--color-grey-900);
	font-weight: 500;
}

.cart-policy__rate-free em {
	font-style: normal;
	color: var(--color-brand-green);
}

@media (max-width: 767px) {
	.cart-policy__segment,
	.cart-policy__segment.is-active {
		font: var(--text-caption);
		padding: 12px 8px;
		/* Three nowrap labels can't fit a phone row - let them wrap here, and
		   drop the max-content floor with them or they'd still overflow. */
		white-space: normal;
		min-width: 0;
	}

	/* The desktop .is-active rule sets a full `font` shorthand (700 18px), which
	   at equal specificity would otherwise win over the caption-size rule above
	   regardless of source order - restated here so the active tab shrinks with
	   everything else on mobile instead of staying desktop-sized. */
	.cart-policy__segment.is-active {
		font-weight: 700;
	}

	.cart-policy__region-head,
	.cart-policy__rate {
		padding: 0 16px;
	}

	/* The name's 180px basis is most of a phone row - let it collapse so the
	   price and free-delivery text wrap underneath instead of overflowing. */
	.cart-policy__rate-name {
		flex: 1 1 100%;
	}

	.cart-policy__rate {
		height: auto;
		flex-wrap: wrap;
		gap: 4px 12px;
		padding-top: 12px;
		padding-bottom: 12px;
	}

	.cart-policy__rate-free {
		margin-left: 0;
		flex-basis: 100%;
	}
}


/* ---- Block-area vertical rhythm (Par mums, and any page built from these
   blocks) ----
   The gaps were compounding from three sources at once: each block's
   .shop-archive__inner carries 40px top / 80px bottom padding, AND the
   section inside it had its own margin-bottom (64px or 140px), AND the next
   block added its own top padding. Measured that's 184px+ where the design
   asks for 100px.
   Fix: strip the vertical padding and the per-section margins inside the
   block area, then set ONE gap between adjacent blocks. margin-top only (never
   bottom) so two rules can never add up. */
.page-blocks .shop-archive__inner {
	padding-top: 0;
	padding-bottom: 0;
}

/* ...but Cart, Checkout and My Account are ordinary WP pages, so since page.php
   was added they render through .page-blocks too - and the rule above was
   silently stripping the 40px/80px their own .shop-archive__inner is supposed
   to have, leaving the breadcrumb jammed against the header. They are the only
   .page-blocks children that sit inside WooCommerce's own .woocommerce wrapper
   (the ACF prose blocks are not), which is what separates them here. */
.page-blocks > .woocommerce > .shop-archive__inner {
	padding-top: 40px;
	padding-bottom: 80px;
}

@media (max-width: 1200px) {
	.page-blocks > .woocommerce > .shop-archive__inner {
		padding-top: 24px;
		padding-bottom: 60px;
	}
}

.page-blocks .perks-strip,
.page-blocks .parmums-intro,
.page-blocks .parmums-europe,
.page-blocks .parmums-whyus,
.page-blocks .parmums-cta,
.page-blocks .newsletter-signup,
.page-blocks .page-hero,
.page-blocks .delivery-tabs,
.page-blocks .delivery-pickup,
.page-blocks .pn-intro,
.page-blocks .pn-steps,
.page-blocks .faq-accordion {
	margin-top: 0;
	margin-bottom: 0;
}

/* Default gap between any two stacked blocks (Figma 458:16347: 100px). */
.page-blocks > .vio-block + .vio-block {
	margin-top: 100px;
}

/* These two must stay AFTER the generic rule above: same specificity
   (three classes each), so whichever comes LAST in the file wins. They
   used to sit before it and were silently overridden by the 100px
   default - confirmed live (delivery-regions was getting 100px instead
   of the intended 40px below the Piegāde page-hero). */
/* The page-hero is a plain heading, not a full-bleed band, so what follows sits
   closer to it than the standard 100px (Figma 750:24030: subtitle ends y=387,
   the tabs start y=427). */
.page-blocks > .vio-block--page-hero + .vio-block {
	margin-top: 40px;
}

/* Pirkuma nosacījumi gives the signup more air than the default gap - 140px
   above and below it (Figma 585:16742: steps end 1135, subscription 1275-1775,
   BUJ 1915). Scoped to the page so Par mums keeps its own rhythm. */
.page-blocks--pirkuma-nosacijumi > .vio-block--newsletter,
.page-blocks--pirkuma-nosacijumi > .vio-block--newsletter + .vio-block {
	margin-top: 140px;
}

/* The Europe section is the one that breathes more - 140px above and below. */
.page-blocks > .vio-block--europe,
.page-blocks > .vio-block--europe + .vio-block {
	margin-top: 140px;
}

/* The hero is a full-bleed band: it butts straight up against whatever
   follows in the design, no 100px gap above it. */
.page-blocks > .vio-block--hero {
	margin-top: 0;
}

.page-blocks > .vio-block--hero + .vio-block {
	margin-top: 64px;
}

/* Last block shouldn't leave the footer glued to it. */
.page-blocks > .vio-block:last-child {
	margin-bottom: 100px;
}

/* ---- Flyout contact block (phone + hours) ----
   Only rendered into the ☰ panel; hidden at widths where the top bar still
   shows the same information, so the phone number never appears twice.
   1200px is where .site-header__hours drops out of the bar, 1024px is where
   .site-header__phone does - between those two only the hours line needs to
   show here. */
.flyout__contact {
	display: none;
	flex-direction: column;
	align-items: flex-start;
	gap: 12px;
	margin-top: 32px;
	padding-top: 32px;
	border-top: 1px solid var(--color-grey-200);
}

.flyout__hours {
	color: var(--color-grey-700);
	font: var(--text-body-regular);
}

/* Between 1024 and 1200 the bar still has the phone, so show the hours only. */
@media (max-width: 1200px) {
	.flyout__contact {
		display: flex;
	}

	.flyout__contact .flyout__phone {
		display: none;
	}
}

@media (max-width: 1024px) {
	.flyout__contact .flyout__phone {
		display: inline-flex;
	}
}

/* ---- Narrow header (<=500px) ----
   Rob's layout: burger left, logo centred, cart + account right. Wishlist and
   the language switcher move into the ☰ panel (.flyout__extras) because five
   controls plus a logo cannot share a 360px row without everything becoming a
   24px tap target.
   Reordered with flex `order`, not by changing the markup, so the DOM (and
   therefore tab order and the desktop layout) is untouched. */
.site-header__account-icon {
	display: none;
}

.flyout__extras {
	display: none;
	flex-direction: column;
	align-items: flex-start;
	gap: 16px;
	margin-top: 24px;
	padding-top: 24px;
	border-top: 1px solid var(--color-grey-200);
}

.flyout__extra-link {
	display: inline-flex;
	align-items: center;
	gap: 12px;
	background: var(--color-grey-100);
	border-radius: 100px;
	padding: 10px 20px;
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.flyout__extra-badge {
	position: static;
	transform: none;
}

.flyout__langs {
	display: flex;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}

.flyout__lang {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 48px;
	padding: 10px 16px;
	border-radius: 100px;
	background: var(--color-grey-100);
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.flyout__lang.is-active {
	background: var(--color-brand-blue);
	color: var(--color-white);
}

/* 600px, not 500 (Rob, 2026-07-30): with the logo centring now starting at
   1024 the right-hand group (wishlist + cart + Ienākt + LV) still overlapped
   the centred logo between 500 and 600. Shedding the wishlist and language
   switcher into the ☰ panel earlier keeps the row clear. */
@media (max-width: 600px) {
	.site-header__bar .site-header__inner {
		gap: 8px;
	}

	.site-header__menu-trigger {
		order: 1;
	}

	/* Only cart + account remain on the right here, so the logo gets more room
	   back than the 1024 rule reserves. */
	.site-header__logo {
		max-width: calc(100% - 200px);
	}

	.site-header__actions {
		order: 3;
	}

	/* Wishlist + language switcher live in the ☰ panel at this width. */
	.site-header__wishlist,
	.site-header__bar .lang-switch,
	.site-header__bar .site-header__lang-switch {
		display: none;
	}

	.flyout__extras {
		display: flex;
	}

	/* Cart and account become the same 44px circle - they sat at 36x40 and
	   44x36 respectively, which read as two different components. */
	.site-header__actions .pill-btn--icon,
	.site-header__actions .site-header__account {
		width: 44px;
		height: 44px;
		padding: 0;
		border-radius: 100px;
		flex-shrink: 0;
	}

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

	.site-header__account-icon {
		display: block;
		/* The SVG strokes use currentColor, and .pill-btn--primary sets
		   color:white - so the icon picks up white on the blue pill with no
		   second asset. */
		filter: brightness(0) invert(1);
	}
}


/* ---- Promo links inside the Katalogs flyout ----
   Akcijas / Izpārdošana / Populāras preces / Jaunumi, shown here only below
   1440px where they no longer fit in the nav bar. Grey pills, matching the
   treatment the phone and language links get in the ☰ panel. */
.catalog-menu__promo {
	display: none;
	flex-wrap: wrap;
	gap: 8px;
	list-style: none;
	margin: 32px 0 0;
	padding: 32px 0 0;
	border-top: 1px solid var(--color-grey-200);
}

.catalog-menu__promo-link {
	display: inline-flex;
	align-items: center;
	padding: 10px 18px;
	border-radius: 100px;
	background: var(--color-grey-100);
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	white-space: nowrap;
}

.catalog-menu__promo-link:hover {
	background: var(--color-brand-blue);
	color: var(--color-white);
}

/* Revealed here rather than in the earlier 1440 block: this rule has to come
   AFTER the `display: none` default above, or the default wins on source
   order (both are single-class selectors). */
@media (max-width: 1440px) {
	.catalog-menu__promo {
		display: flex;
	}

	.flyout--catalog {
		width: 320px;
	}

	/* The children panel is pinned to the parents column's right edge with a
	   hardcoded left:286px - it has to follow the widened column or it would
	   sit 34px on top of it. */
	.catalog-menu__children {
		left: 320px;
	}
}


/* ---- Katalogs flyout: parent row + inline children on narrow screens ---- */
.catalog-menu__row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
}

/* Desktop reveals children by hover in the side column, so the tap target is
   pointless there.
   Where it IS shown it needs to be a real 44px target that sits ABOVE the
   category link - the link is the full-width flex item next to it, and a
   near-miss on a small chevron was landing on the link and navigating away
   instead of expanding. position+z-index guarantee the button wins the hit
   test on its own footprint. */
.catalog-menu__toggle {
	display: none;
	position: relative;
	z-index: 1;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: none;
	background: none;
	padding: 0;
	cursor: pointer;
	line-height: 0;
}

.catalog-menu__toggle img {
	transition: transform 0.15s ease;
}

.catalog-menu__parent.is-active .catalog-menu__toggle img {
	transform: rotate(180deg);
}

/* ---- Katalogs flyout on narrow screens ----
   The children were a position:fixed panel pinned beside the parents column -
   at phone width that panel sat off-screen (or on top of the parent list), so
   subcategories were effectively unreachable. Below 1024 they become a plain
   indented list INSIDE the parent item, expanded by the chevron, which is the
   same pattern the shop sidebar already uses. */
@media (max-width: 1440px) {
	.catalog-menu__toggle {
		display: inline-flex;
	}
}

@media (max-width: 1024px) {
	/* BOTH panels, not just the catalog one: the ☰ menu was inheriting the
	   base 60px padding while Katalogs used 24px, so the two lists started at
	   visibly different distances from the left edge. Same width cap too, so
	   they're the same panel at every width. */
	.flyout {
		width: min(100%, 420px);
		padding: 60px 24px;
	}

	.catalog-menu__children {
		position: static;
		height: auto;
		min-width: 0;
		width: auto;
		padding: 4px 0 8px 16px;
		border-right: none;
		border-left: 2px solid var(--color-grey-200);
		margin: 4px 0 8px;
		overflow: visible;
	}

	.catalog-menu__parents {
		gap: 0;
	}

	.catalog-menu__parent-link {
		padding: 12px 0;
		white-space: normal;
		/* Bounded so it can never grow under the chevron. */
		flex: 1 1 auto;
		min-width: 0;
	}

	.catalog-menu__child-link {
		padding: 10px 0;
		white-space: normal;
	}
}


/* "Visas preces: X" - only needed in compact mode, where the parent row
   toggles instead of linking. */
.catalog-menu__all {
	display: none;
}

/* Flyout panels must include their own padding in the width they are given -
   the theme has no global box-sizing reset, so `width: min(100%, 420px)` plus
   60px of padding was 48-120px WIDER than the viewport on a phone, which is
   what pushed the panel (and its close button) off screen. */
.flyout {
	box-sizing: border-box;
}

@media (max-width: 1440px) {
	.catalog-menu__all {
		display: block;
	}

	/* The whole row is the tap target now, so make it look like one. */
	.catalog-menu__row {
		cursor: pointer;
		border-radius: 8px;
	}

	.catalog-menu__parent[data-has-children] .catalog-menu__parent-link {
		pointer-events: none; /* the row handles the tap; no link hit test */
	}
}

/* ---- Close button ----
   Sits above the panel (see header.php for why it is a sibling of the
   overlay). On desktop it sits to the RIGHT of the 286px panel over the dark
   backdrop, so it is white; once the panel goes full-width it lands on top of
   white, so it gets a grey chip and a dark glyph to stay visible. */
.menu-overlay__close {
	z-index: 1003;
}

.menu-overlay__close[hidden] {
	display: none;
}

@media (max-width: 767px) {
	.menu-overlay__close {
		top: 12px;
		right: 12px;
		border-radius: 100px;
		background: var(--color-grey-100);
		color: var(--color-grey-900);
	}
}

/* Footer: single column below 400px. Two columns there left ~170px per column,
   which broke "Garantijas un atgriešana" and the address onto four lines each. */
@media (max-width: 400px) {
	.site-footer__inner {
		grid-template-columns: 1fr;
		gap: 28px;
	}
}


/* Kontakti form + map stack below 1024; a stretched map has no form column to
   match at that point, so give it a sensible standalone height. */
@media (max-width: 1024px) {
	.kontakti-contact {
		flex-direction: column;
	}

	.kontakti-map {
		align-self: auto;
		width: 100%;
		/* flex:1 from the desktop rule resolves against the VERTICAL axis once
		   the row becomes a column, collapsing the height to its content -
		   that's why it rendered ~150px tall. Pin it. */
		flex: 0 0 auto;
		height: 300px;
		min-height: 0;
	}
}

/* Marketplace sidebar slims down before the sliders lose a column, so the
   product row gets the freed width instead of the gap growing. */
@media (max-width: 1400px) {
	.home-layout__sidebar {
		width: 170px;
	}

	.home-layout {
		gap: 24px;
	}

	.marketplace-sidebar__link img {
		max-width: 100%;
	}
}

/* ---- Product card: after an AJAX add-to-cart ----
   WooCommerce appends its own .added_to_cart link next to the button instead
   of replacing it, so the card showed two competing CTAs. assets/js/added-to-
   cart.js flags the row and the swap happens here. */
.product-card__actions .added_to_cart {
	display: none;
}

.product-card__actions.is-added .button {
	display: none;
}

.product-card__actions.is-added .added_to_cart {
	display: inline-flex;
	align-items: center;
	visibility: visible;
	opacity: 1;
	height: 40px;
	padding: 0 24px;
	box-sizing: border-box;
	border-radius: 100px;
	background: var(--color-brand-green);
	color: var(--color-white);
	font: var(--text-body-md);
	text-decoration: none;
	white-space: nowrap;
}


/* ---- Hero pagination: tiles -> dots at 1024 ----
   The promo tiles ARE the hero's pagination on desktop. Below 1024 three of
   them can't stay legible across the row (and must not wrap - see
   .promo-tiles), so Swiper's own dots take over instead. */
@media (max-width: 1024px) {
	.promo-tiles {
		display: none;
	}

	.hero-banner__pagination {
		display: flex;
		justify-content: center;
		gap: 8px;
		position: static;
		margin-top: 16px;
	}

	.hero-banner__pagination .swiper-pagination-bullet {
		width: 8px;
		height: 8px;
		margin: 0;
		background: var(--color-grey-200);
		opacity: 1;
	}

	.hero-banner__pagination .swiper-pagination-bullet-active {
		background: var(--color-brand-blue);
	}
}


/* ---- Wishlist heart, over the image ----
   Out of the footer flow entirely: the add-to-cart label varies in width
   ("Pievienot grozam" vs "Lasīt vairāk"), which made the footer wrap
   inconsistently from card to card and left rows of uneven height. */
.product-card__wishlist {
	position: absolute;
	top: 236px;
	right: 20px;
	z-index: 2;
	margin: 0;
}

/* Must match the stacking threshold above (320px) - at 280 the button went
   full-width at a different point than the footer stacked, so cards between
   the two values got a half-width button on its own line. */
@container (max-width: 320px) {
	.product-card__actions .button {
		width: 100%;
	}
}


/* ---- Section rhythm on smaller screens ----
   140px is the 1920-canvas figure. On a phone it eats a third of the screen
   before a section even starts, and there are five of these stacked down the
   homepage, so it compounds badly. Every section that uses it is scaled here
   together rather than one at a time, so the page keeps an even rhythm. */
@media (max-width: 1024px) {
	.product-row,
	.product-row.jaunumi-tabs,
	.faq-accordion,
	.newsletter-signup,
	.page-blocks > .vio-block--europe,
	.page-blocks > .vio-block--europe + .vio-block {
		margin-top: 60px;
	}

	.catalog-tiles {
		margin-bottom: 60px;
	}
}

@media (max-width: 767px) {
	.product-row,
	.product-row.jaunumi-tabs,
	.faq-accordion,
	.newsletter-signup,
	.page-blocks > .vio-block--europe,
	.page-blocks > .vio-block--europe + .vio-block {
		margin-top: 40px;
	}

	.catalog-tiles {
		margin-bottom: 40px;
	}
}


/* ---- Homepage blocks area ----
   Blocks render inside .home-layout__main, so the page gutter, max-width and
   the sidebar column all come from the existing shell.

   No first-child margin reset here: ACF blocks are registered with
   'jsx' => true, which means the render template's own root element IS the
   block - there is no wrapper div. So `.home-blocks > *:first-child` matched
   .hero-banner itself and zeroed the very 24px margin that forms the gap
   under the nav bar. */

/* Pink pill beside a product-row title (Figma: "Zīmols Bioapta"). Describes
   the row's selection - editor-set, and hidden when left empty. */
.product-row__badge {
	display: inline-flex;
	align-items: center;
	margin-left: 16px;
	padding: 6px 16px;
	border-radius: 100px;
	background: var(--color-pink);
	color: var(--color-white);
	font: var(--text-body-md);
	vertical-align: middle;
	white-space: nowrap;
}

/* Colour presets picked in the block (Produktu slaideris > Nozīmītes krāsa).
   The value is the modifier suffix; see vio_shop_badge_color_choices(). */
.product-row__badge--pink { background: var(--color-pink); }
.product-row__badge--blue { background: var(--color-brand-blue); }
.product-row__badge--green { background: var(--color-brand-green); }
.product-row__badge--purple { background: var(--color-purple); }
.product-row__badge--crimson { background: var(--color-crimson); }
/* Yellow is light, so its text flips to dark for contrast. */
.product-row__badge--yellow {
	background: var(--color-yellow);
	color: var(--color-grey-900);
}

@media (max-width: 767px) {
	.product-row__badge {
		margin-left: 8px;
		padding: 4px 12px;
		font: var(--text-caption);
	}
}

/* ---- Spacing utilities ----
   For the block editor's Advanced > "Additional CSS class(es)" field, so an
   editor can retune the gap above any section without touching code. !important
   is warranted here: these exist purely to beat a component's own margin, and
   that is the entire contract. */
.vio-mt-0 { margin-top: 0 !important; }
.vio-mt-40 { margin-top: 40px !important; }
.vio-mt-80 { margin-top: 80px !important; }
.vio-mt-140 { margin-top: 140px !important; }

.vio-mb-0 { margin-bottom: 0 !important; }
.vio-mb-40 { margin-bottom: 40px !important; }
.vio-mb-80 { margin-bottom: 80px !important; }
.vio-mb-140 { margin-bottom: 140px !important; }

/* Scale the big ones down on smaller screens, same as the section rhythm. */
@media (max-width: 1024px) {
	.vio-mt-140 { margin-top: 60px !important; }
	.vio-mt-80 { margin-top: 60px !important; }
	.vio-mb-140 { margin-bottom: 60px !important; }
	.vio-mb-80 { margin-bottom: 60px !important; }
}

@media (max-width: 767px) {
	.vio-mt-140 { margin-top: 40px !important; }
	.vio-mt-80 { margin-top: 40px !important; }
	.vio-mb-140 { margin-bottom: 40px !important; }
	.vio-mb-80 { margin-bottom: 40px !important; }
}

/* ---- Blocks inside the homepage column ----
   Blocks each carry their own .shop-archive__inner gutter because on Par mums
   and Kontakti they sit directly under <body> with nothing else providing one.
   On the homepage they're already inside #site-content > .home-layout__main,
   which supplies the gutter - so that inner padding was applied twice: the
   newsletter sat 145px narrower than its neighbours, and its 40/80px vertical
   padding stacked on top of the section's own 140px margin. */
.home-blocks .shop-archive__inner {
	padding: 0;
	max-width: none;
}

/* ---- Flyout menu items: hover pill ----
   Same grey-100 rounded treatment the icon buttons and shop sidebar use, so a
   hovered row reads as a target rather than just changing colour. Negative
   margin keeps the text aligned with everything else while the pill extends
   past it. */
.main-menu__list a,
.catalog-menu__parent-link,
.catalog-menu__child-link {
	padding-left: 12px;
	padding-right: 12px;
	margin-left: -12px;
	margin-right: -12px;
	border-radius: 100px;
	transition: background-color 0.12s ease;
}

.main-menu__list a:hover,
.main-menu__list .current-menu-item > a,
.catalog-menu__parent-link:hover,
.catalog-menu__child-link:hover {
	background: var(--color-grey-100);
}

/* An open branch marks its parent as active - the children panel is showing,
   so hovering a child (which keeps the branch open) leaves the parent looking
   selected instead of going flat. */
.catalog-menu__parent.is-active > .catalog-menu__row .catalog-menu__parent-link,
.catalog-menu__parent.is-active > .catalog-menu__parent-link {
	background: var(--color-grey-100);
}

/* In compact mode the whole row is the tap target, so the pill belongs on the
   row rather than on the link inside it. */
@media (max-width: 1440px) {
	.catalog-menu__parent-link:hover {
		background: none;
	}

	.catalog-menu__row:hover,
	.catalog-menu__parent.is-active > .catalog-menu__row {
		background: var(--color-grey-100);
		border-radius: 100px;
	}
}

/* ---- Hero slide, small screens ----
   Below 600px the copy is centred and the CTA goes full width - at that size a
   left-aligned block against a busy product photo left the button floating in
   the middle of the slide with the artwork behind it. Type scales down with
   clamp() so the headline shrinks smoothly instead of stepping at one
   breakpoint and overflowing in between. */
@media (max-width: 600px) {
	.hero-banner__slide {
		/* Falls back to the desktop value when the slide sets no mobile
		   override, so existing slides are unaffected. */
		background: var(--slide-bg-mobile, var(--slide-bg, var(--color-grey-100)));
		min-height: 380px;
		padding: 0 16px;
		text-align: center;
	}

	.hero-banner__copy {
		align-items: center;
		gap: 20px;
		width: 100%;
	}

	.hero-banner__title {
		align-items: center;
	}

	.hero-banner__slide .pill-btn--cta {
		width: 100%;
		justify-content: center;
	}
}

/* Headline scales with the viewport rather than jumping at a breakpoint. */
@media (max-width: 1024px) {
	.hero-banner__title {
		font-size: clamp(28px, 6vw, 70px);
		line-height: 1.15;
	}
}

/* ---- Hero slider arrows on small screens ----
   56px controls were sized for a 1630px-wide desktop slide; on a 360px screen
   they cover a sixth of the artwork and collide with the centred copy. */
@media (max-width: 600px) {
	.hero-banner__arrow.swiper-button-next,
	.hero-banner__arrow.swiper-button-prev {
		width: 32px;
		height: 32px;
	}

	.hero-banner__arrow img {
		width: 16px;
		height: 16px;
	}

	.hero-banner__arrow--prev {
		left: 8px;
	}

	.hero-banner__arrow--next {
		right: 8px;
	}
}

/* ---- Homepage tail on mobile ----
   FAQ, newsletter and the marketplace row ran straight into each other and
   into the footer. */
@media (max-width: 767px) {
	.home-blocks > *:last-child {
		margin-bottom: 40px;
	}

	.faq-accordion {
		margin-bottom: 40px;
	}

	.marketplace-sidebar--compact {
		margin: 32px 0;
	}
}


/* ---- Flexible page hero block ----
   Full-bleed coloured band ONLY when a background image is set; without one it
   sits inline, so it doesn't stamp a band where the design has plain page. */
.page-hero {
	margin-bottom: 40px;
}

/* The hero owns its side gutter rather than inheriting one from a wrapper.
   On a blocks-only page (Piegāde) nothing wraps it, so the title sat flush
   against the viewport edge. Left/right only - the vertical rhythm is the
   margin above and --has-bg's own padding. Values track
   .shop-archive__inner's 145 -> 20 -> 12 so the two containers stay aligned. */
.page-hero__inner {
	box-sizing: border-box;
	max-width: 1920px;
	margin: 0 auto;
	padding: 40px 145px 0;
}

/* Kept next to the rule they override, not in the shared .shop-archive__inner
   media blocks - those sit earlier in the file, so at equal specificity the
   145px base above won and the hero stayed indented while the page content
   beside it had already gone to 20px. */
@media (max-width: 1440px) {
	.page-hero__inner {
		padding-left: 20px;
		padding-right: 20px;
	}
}

@media (max-width: 1200px) {
	.page-hero__inner {
		padding-top: 24px;
	}
}

@media (max-width: 767px) {
	.page-hero__inner {
		padding-left: 12px;
		padding-right: 12px;
	}
}

/* Already inside a gutter container (the shop landing page renders its blocks
   inside .shop-archive__inner, as do any blocks placed on a WooCommerce
   template) - so the hero must not add a second one on top, which is what put
   its text 145px further in than the category tiles beside it. Two classes deep
   so it also beats the responsive rules above. */
.shop-archive__inner .page-hero__inner {
	padding: 0;
}

.page-hero--has-bg {
	background: no-repeat center / cover;
	padding: 40px 0;
}

.page-hero__row {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 24px;
	flex-wrap: wrap;
}

.page-hero__title {
	font: var(--text-h2);
	color: var(--color-grey-900);
	margin: 16px 0 8px;
}

.page-hero__subtitle {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
	margin: 0;
}

.page-hero__search {
	flex: 0 1 340px;
}

@media (max-width: 767px) {
	.page-hero__search {
		flex-basis: 100%;
	}
}

/* ---- Category sidebar, stacked above the products (<=1440) ----
   Full height here pushed the product grid entirely below the fold, so the
   tree starts COLLAPSED and the heading becomes the toggle. Above this width
   the sidebar is a real column and the list is always open, so none of this
   applies. */
@media (max-width: 1200px) {
	.shop-sidebar {
		padding: 20px 24px;
	}

	.shop-sidebar__title {
		margin: 0;
		cursor: pointer;
	}

	.shop-sidebar__title-chevron {
		display: block;
	}

	.shop-sidebar.is-open .shop-sidebar__title-chevron {
		transform: rotate(180deg);
	}

	.shop-sidebar__list {
		display: none;
	}

	.shop-sidebar.is-open .shop-sidebar__list {
		display: block;
		margin-top: 20px;
	}
}

/* The parent row is the toggle now (see assets/js/menus.js), so it needs to
   look like one - the chevron alone was a small target with a lot of dead
   space beside it. */
.shop-sidebar__parent[data-has-children] > .shop-sidebar__row,
.shop-sidebar__row:has(.shop-sidebar__toggle) {
	cursor: pointer;
}

/* ---- Filter dropdown panels on narrow screens ----
   Anchoring a fixed-width panel to its trigger cannot work once the trigger
   itself sits near the right edge - the panel either overflows (left:0) or its
   own left edge does (right:0). Trying to correct that at runtime just moved
   the overflow around.

   Instead the FILTER ROW becomes the containing block and the panel spans it
   edge to edge. It is then bounded by the page container by definition, so it
   can never cause a sideways scroll regardless of which trigger opened it. */
@media (max-width: 900px) {
	.shop-sort-bar__filters {
		position: relative;
	}

	.shop-sort-bar__filters .filter-drop {
		position: static;
	}

	.shop-sort-bar__filters .filter-drop__panel {
		left: 0;
		right: 0;
		width: auto;
		max-width: none;
	}
}

/* Container that keeps the page gutter but contributes no vertical space of
   its own - used where sections already bring their own margins and the
   container's 40/80px padding would just stack on top (product page tail). */
.shop-archive__inner--flush {
	padding-top: 0;
	padding-bottom: 0;
}

/* Product page tail: the newsletter and FAQ each carry a 140px top margin,
   which is the homepage rhythm. Here they follow Saistītie produkti inside an
   already-padded page, so they're scaled back to something proportionate. */
.shop-archive__inner--flush .newsletter-signup {
	margin-top: 80px;
}

.shop-archive__inner--flush .faq-accordion {
	margin-top: 80px;
	margin-bottom: 80px;
}

@media (max-width: 1024px) {
	.shop-archive__inner--flush .newsletter-signup,
	.shop-archive__inner--flush .faq-accordion {
		margin-top: 60px;
	}

	.shop-archive__inner--flush .faq-accordion {
		margin-bottom: 60px;
	}
}

@media (max-width: 767px) {
	.shop-archive__inner--flush .newsletter-signup,
	.shop-archive__inner--flush .faq-accordion {
		margin-top: 40px;
	}

	.shop-archive__inner--flush .faq-accordion {
		margin-bottom: 40px;
	}
}

/* ---- Product page column widths ----
   The gallery was pinned at 803px (the 1920 design width) with the summary
   taking whatever was left, so between 1440 and 1920 the summary was squeezed
   and the title wrapped to three lines. Scaling the gallery down instead keeps
   both columns readable, and the row stays horizontal to 1440. */
/* Width belongs on .product-page__gallery - that is the flex item in the row.
   Setting it on the inner .product-gallery made the percentage resolve against
   that wrapper's own (content-sized) width instead of the row, which collapsed
   the image to a sliver. */
.product-page__gallery {
	width: 803px;
	flex-shrink: 0;
}

.product-page__gallery .product-gallery {
	width: 100%;
}

@media (max-width: 1919px) {
	.product-page__gallery {
		width: 44%;
		max-width: 803px;
	}
}

@media (max-width: 1700px) {
	.product-page__gallery {
		width: 42%;
	}
}

@media (max-width: 1440px) {
	.product-page__gallery {
		width: 40%;
	}

	.product-page__layout {
		gap: 16px;
	}
}

/* Below the tablet breakpoint the gallery and summary stack, and the partner
   sidebar gives way to its compact horizontal row. */
@media (max-width: 1200px) {
	.product-page__aside {
		display: none;
	}

	.product-page__gallery {
		width: 100%;
		max-width: none;
	}
}

/* Related products sit under the two-column layout and span the page. The row
   itself is the shared product slider, which brings its own top margin. */
.product-page__related {
	margin-top: 0;
}

.product-page__related .product-row {
	margin-top: 60px;
}

@media (max-width: 1024px) {
	.product-page__related {
		margin-top: 40px;
	}
}

/* ---- Product page, narrow screens ----
   Below 1440 the page gutter matches the header's; the add-to-cart row wraps
   rather than pushing past the viewport; and the sale price gets the same
   green + larger size treatment it has on the cards.
   .product-page itself carries its own 145px gutter (not .shop-archive__inner),
   so it still needs its own rule here - the breadcrumb wrap and tail sections
   ARE .shop-archive__inner and now get the matching 1440 breakpoint from its
   own base rule instead. */
@media (max-width: 1440px) {
	.product-page,
	.product-page__related {
		padding-left: 20px;
		padding-right: 20px;
	}
}

@media (max-width: 767px) {
	.product-page__summary p.price {
		font: var(--text-h4);
	}

	.product-page__summary p.price ins {
		color: var(--color-brand-green);
	}

	/* Newsletter follows the section rhythm here, not the 80px desktop step. */
	.shop-archive__inner--flush .newsletter-signup {
		margin-top: 40px;
	}
}

/* The quantity stepper, add-to-cart button and wishlist heart could not share
   one row on a phone - the button has a fixed min-width and the row had
   nowrap, so it simply ran off the side and took the page's horizontal scroll
   with it. */
@media (max-width: 480px) {
	.product-page__cart-row {
		flex-wrap: wrap;
		gap: 12px;
	}

	.product-page__summary form.cart {
		display: flex;
		flex: 1 1 100%;
		min-width: 0;
	}

	/* white-space:nowrap on the button is what actually forced the overflow -
	   an uppercase, letter-spaced "PIEVIENOT GROZAM" cannot shrink below its
	   own text width, so the row grew past the viewport instead of wrapping. */
	.product-page__summary .single_add_to_cart_button {
		flex: 1;
		min-width: 0;
		padding: 0 16px;
		white-space: normal;
		line-height: 1.2;
		letter-spacing: 1px;
	}

	.product-page__summary .quantity {
		flex-shrink: 0;
	}
}

/* ---- Product page vertical rhythm on phones ----
   Three separate gaps stacked above the gallery: the breadcrumb's own 40px
   bottom margin, .shop-archive__inner's 40px top padding on the product
   wrapper, and the gallery's own offset. Trimmed together so the image starts
   near the top of the screen where it belongs. */
@media (max-width: 767px) {
	.shop-breadcrumb {
		margin-bottom: 16px;
	}

	.product-page__breadcrumb-wrap {
		padding-top: 16px;
	}

	.product-page > .product-page__layout,
	.product-page .product-page__layout {
		margin-top: 0;
	}

	/* Gap between the add-to-cart block and the description tabs. */
	.product-page__top {
		margin-bottom: 32px;
	}

	/* Halved again - the newsletter sits close under the related products
	   here, and the section's own padding already separates them. */
	.shop-archive__inner--flush .newsletter-signup {
		margin-top: 20px;
	}
}

/* ---- Product page: kill the stacked top/bottom padding on phones ----
   .shop-archive__inner's responsive rule (24px top / 60px bottom) applies to
   the breadcrumb wrapper too and outranked the `padding-bottom: 0` set on the
   wrapper alone - hence the large empty band between the breadcrumb and the
   gallery. Two classes here beats it. */
.shop-archive__inner.product-page__breadcrumb-wrap {
	padding-bottom: 0;
}

@media (max-width: 767px) {
	.shop-archive__inner.product-page__breadcrumb-wrap {
		padding-top: 12px;
		padding-bottom: 0;
	}

	.product-page {
		padding-top: 0;
		padding-bottom: 32px;
	}

	/* Now that the over-specific rule above is gone, this is the only thing
	   setting the newsletter's top gap on a phone. */
	.shop-archive__inner--flush .newsletter-signup {
		margin-top: 16px;
	}
}

/* ---- Wishlist grid ----
   Same column rhythm as the catalogue: 4 across on wide screens, 3 from 1560,
   2 from 1200, 1 on phones. It has no sidebar, so it can hold 4 longer than
   the category archive can. */
.wishlist-page .shop-grid.products {
	grid-template-columns: repeat(4, 1fr);
}

@media (max-width: 1560px) {
	.wishlist-page .shop-grid.products {
		grid-template-columns: repeat(3, 1fr);
	}
}

@media (max-width: 1200px) {
	.wishlist-page .shop-grid.products {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 767px) {
	.wishlist-page .shop-grid.products {
		grid-template-columns: 1fr;
	}
}

/* ---- Slider arrows with nothing to slide ----
   Swiper adds .swiper-button-lock to both buttons when every slide already
   fits (watchOverflow, on by default), which is exactly the "nothing to
   scroll" case - so no JS needed, just hide them. .swiper-button-disabled
   stays visible: that means "no FURTHER slides this direction", which is
   still useful feedback mid-carousel. */
.slider-arrow.swiper-button-lock,
.hero-banner__arrow.swiper-button-lock {
	display: none;
}

/* Nav wrapper collapses too, so the header doesn't keep a hole where the
   arrows were. */
.product-row__nav:has(.swiper-button-lock),
.jaunumi-tabs__nav:has(.swiper-button-lock) {
	display: none;
}

/* ---- My-account order detail (Figma 654:20764 / 680:20474 / 681:20911) ----
   Was WooCommerce's totally unstyled default view-order.php. */
/* No bottom margin: it's the last element in .shop-archive__head now (see
   my-account.php), which already sets the 60px gap to the layout row below. */
.order-view__meta {
	display: flex;
	align-items: center;
	gap: 16px;
	margin: 8px 0 0;
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.order-view__status {
	display: inline-flex;
	align-items: center;
	height: 34px;
	padding: 0 16px;
	border-radius: 100px;
	background: var(--color-grey-200);
	color: var(--color-grey-900);
	font: var(--text-body-md);
}

/* Same status -> colour mapping as the orders LIST (.woocommerce-orders-table
   status dot) - one convention, not two. */
.order-view__status--completed {
	background: rgba(120, 191, 67, 0.15);
	color: var(--color-brand-green);
}

.order-view__status--processing,
.order-view__status--on-hold {
	background: rgba(76, 189, 227, 0.15);
	color: var(--color-brand-blue);
}

.order-view__status--cancelled,
.order-view__status--failed,
.order-view__status--refunded {
	background: rgba(255, 56, 113, 0.1);
	color: var(--color-crimson);
}

.order-view__layout {
	display: flex;
	align-items: flex-start;
	gap: 24px;
}

.order-view__items {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.order-view__item {
	display: flex;
	align-items: center;
	gap: 16px;
	background: var(--color-white);
	border-radius: 4px;
	padding: 20px;
}

.order-view__item-thumb {
	display: block;
	flex-shrink: 0;
	width: 68px;
	height: 68px;
	border: 1px solid var(--color-grey-200);
	border-radius: 4px;
	overflow: hidden;
	box-sizing: border-box;
}

.order-view__item-thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.order-view__item-info {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.order-view__item-name {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.order-view__item-price {
	font: var(--text-body-lg-bold);
	color: var(--color-grey-900);
}

.order-view__item-qty {
	flex-shrink: 0;
}

.order-view__item-wishlist {
	flex-shrink: 0;
}

/* 527px, matching the real card width in Figma 654:20764's own metadata
   (both the summary and timeline cards) - not the 390px account-nav sidebar
   convention, which this isn't. */
.order-view__side {
	flex-shrink: 0;
	width: 527px;
	display: flex;
	flex-direction: column;
	gap: 24px;
}

.order-view__summary .cart-summary__rows {
	margin-bottom: 24px;
}

/* Shipping row carries method name + full address under the "Piegāde" label -
   the shared .cart-summary__label is inline-flex for the simple cart case, so
   it needs its own stacked layout here. */
.order-view__shipping-row .cart-summary__label {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 4px;
}

.order-view__shipping-method {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
}

.order-view__shipping-address {
	font: var(--text-body-regular);
	color: var(--color-grey-700);
}

.order-view__reorder {
	display: flex;
	width: 100%;
	margin-top: 24px;
}

.order-timeline {
	background: var(--color-white);
	border-radius: 4px;
	padding: 24px;
}

.order-timeline__title {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 24px;
}

.order-timeline__list {
	list-style: none;
	margin: 0;
	padding: 0;
}

.order-timeline__step {
	position: relative;
	display: flex;
	align-items: center;
	gap: 16px;
	padding-bottom: 30px;
}

.order-timeline__step:last-child {
	padding-bottom: 0;
}

/* Connecting line between icons - a pseudo-element instead of a background
   image, since its length only ever has to bridge two fixed 56px circles. */
.order-timeline__step:not(:last-child)::after {
	content: "";
	position: absolute;
	left: 27px;
	top: 56px;
	width: 1px;
	height: 30px;
	background: var(--color-grey-200);
}

.order-timeline__icon {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 56px;
	height: 56px;
	border-radius: 50%;
	background: var(--color-grey-100);
}

.order-timeline__step.is-done .order-timeline__icon {
	background: rgba(120, 191, 67, 0.1);
}

.order-timeline__info {
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.order-timeline__label {
	font: var(--text-body-lg);
	color: var(--color-grey-700);
}

.order-timeline__date {
	font: var(--text-body-lg);
	color: var(--color-grey-900);
}

.order-view__notes {
	margin-top: 40px;
}

.order-view__notes h2 {
	font: var(--text-h5);
	color: var(--color-grey-900);
	margin: 0 0 16px;
}

.order-view__notes-list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.order-view__notes-list li {
	background: var(--color-white);
	border-radius: 4px;
	padding: 16px 20px;
}

.order-view__notes-list time {
	display: block;
	font: var(--text-caption);
	color: var(--color-grey-700);
	margin-bottom: 4px;
}

.order-view__notes-list p {
	font: var(--text-body-regular);
	color: var(--color-grey-900);
	margin: 0;
}

@media (max-width: 1024px) {
	.order-view__layout {
		flex-direction: column;
	}

	.order-view__side {
		width: 100%;
	}
}
