/* ==========================================================================
   Frontier Peptide Labs — design tokens
   Extracted from production 2026-09-03. Values are exact, not approximated.
   Legacy variable names are noted so old CSS can be diffed against this.
   ========================================================================== */

:root {

  /* ---------- BRAND ---------------------------------------------------- */
  --color-brand:              #4557C9;  /* legacy --primary / --e-global-color-primary       */
  --color-brand-hover:        #182BA8;  /* legacy --primary_hover / --e-global-color-primary_hover */
  --color-brand-deep:         #3A49B5;  /* submenu hover + success-notice top border         */
  --color-brand-link-hover:   #2F3D9B;  /* term-description link hover                       */
  --color-brand-muted:        #8A93D4;  /* struck-through price in Elementor / HFE grids     */
  --color-brand-tint-25:      rgba(69,87,201,.25); /* pack-tile selected ring                */

  /* ---------- SURFACES -------------------------------------------------- */
  --color-bg:                 #FFFFFF;  /* legacy --background. body, header row, footer     */
  --color-surface-light:      #F4F4F4;  /* legacy --light. swatch rest state, theme card bg   */
  --color-surface-card:       #F6F6F6;  /* product-card .product-block (child theme)          */
  --color-surface-caption:    #FFFFFF;  /* .product-caption (wp-custom-css, !important)       */
  --color-surface-coa:        #F8F9FC;  /* .coa-viewer .coa-body                              */
  --color-surface-muted:      #F8F9FA;  /* HFE empty/notice panel                             */
  --color-ink-solid:          #000000;  /* skewed button slab, qty controls, footer headings  */
  --color-ink-deep:           #151515;  /* theme :root --accent default (NOT the live accent) */

  /* ---------- TEXT ------------------------------------------------------ */
  --color-text:               #414042;  /* legacy --text / --e-global-color-text              */
  --color-text-strong:        #414042;  /* legacy --accent / --e-global-color-accent          */
  --color-text-muted:         #888888;  /* legacy --text-light / --e-global-color-text_light  */
  --color-text-on-brand:      #FFFFFF;
  --color-text-card-title:    #1A2E4A;  /* product-card title (child theme, !important)       */
  --color-text-price:         #4557C9;  /* all listing + PDP prices                           */
  --color-text-price-strike:  rgba(0,0,0,.49); /* #0000007D on card del                       */
  --color-text-trust-label:   #6B6B6B;  /* .fpl-paytrust-label                                */
  --color-text-hfe-title:     #333333;  /* HFE product-grid title                             */
  --color-text-hfe-meta:      #666666;  /* HFE category / description                         */

  /* ---------- LINKS ----------------------------------------------------- */
  --color-link:               #414042;  /* a { color: var(--accent) }                         */
  --color-link-hover:         #4557C9;

  /* ---------- BORDERS --------------------------------------------------- */
  --color-border:             #E8E8E8;  /* legacy --border / --e-global-color-border          */
  --color-border-card:        #F0F0F0;  /* product-card + HFE card border                     */
  --color-border-soft:        #E5E5E5;  /* homepage grid .product-transition (wp-custom-css)  */
  --color-border-input-alt:   #D0D0D0;  /* search field wrapper                               */
  --color-border-pay:         #E0E0E0;  /* payment-mark chips                                 */
  --color-border-coa:         #DDDDDD;  /* .coa-viewer                                        */
  --color-border-pack:        #D9D9D9;  /* .fpl-pack-card rest state                          */
  --color-border-hairline:    rgba(0,0,0,.08); /* .fpl-paytrust top rule                      */
  --color-border-menu-item:   rgba(0,0,0,.06); /* mobile flyout menu item rule                */
  --color-divider-dot:        #CCCCCC;  /* skewed dot between PDP tab labels                  */

  /* ---------- STATUS ---------------------------------------------------- */
  --color-success:            #0F834D;  /* WooCommerce default success                        */
  --color-success-notice-bg:  #4557C9;  /* OVERRIDDEN to brand by child theme (!important)    */
  --color-info:               #3D9CD2;
  --color-error:              #E2401C;
  --color-error-strong:       #FF0000;  /* cart remove-link hover                             */
  --color-wishlist-notice:    #5FBD74;  /* woosw popup notice                                 */
  --color-star:               #4557C9;  /* .star-rating span::before = var(--primary)         */
  --color-star-empty:         rgba(65,64,66,.25); /* var(--text) at opacity .25               */
  --color-sale-badge:         #3E62E1;  /* .onsale:after — no product is on sale today        */
  --color-stock-badge:        #000000;  /* .stock-label:after                                 */

  /* ---------- HEADER / NAV / FOOTER ------------------------------------ */
  --color-announce-bg:        #4557C9;
  --color-announce-text:      #FFFFFF;
  --color-announce-link-hover:#B1B1B1;
  --color-header-bg:          #FFFFFF;
  --color-nav-link:           #414042;
  --color-nav-link-hover:     #4557C9;
  --color-submenu-bg:         #4557C9;
  --color-submenu-bg-hover:   #3A49B5;
  --color-submenu-text:       #FFFFFF;
  --color-footer-bg:          #FFFFFF;  /* no background is set anywhere; inherits body        */
  --color-footer-heading:     #000000;
  --color-footer-text:        #414042;

  /* ---------- EDITORIAL PALETTE (product descriptions + COA tab) --------
     Authored inline in post_content, not in any stylesheet. Reproduce it or
     44 product descriptions and the COA tab change appearance.              */
  --color-edit-ink:           #24384A;
  --color-edit-heading:       #071F33;
  --color-edit-hero-from:     #071F33;
  --color-edit-hero-mid:      #0B5F8F;
  --color-edit-hero-to:       #159BD3;
  --color-edit-hero-text:     #EEF9FF;
  --color-edit-panel-bg:      #F4FBFF;
  --color-edit-panel-border:  #D8EDF7;

  /* ======================================================================
     TYPOGRAPHY
     ====================================================================== */
  --font-display:  "Oxanium", sans-serif;        /* headings + body + buttons + nav */
  --font-body:     "Oxanium", sans-serif;
  --font-brandmark:"Nutritix Heading", "Helvetica Neue", Helvetica, Arial, sans-serif;
  --font-legacy-body: "Plus Jakarta Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
  --font-icon-theme: "nutritix-icon";
  --font-icon-star:  "star";

  /* base */
  --fs-body:        14px;   --lh-body:        1.714;   /* = 24px  */
  --fw-body:        400;
  --fs-small:       12px;   --lh-small:       1.8333;
  --fs-label:       12px;   --fw-label:       600;     /* uppercase, PDP variation label */

  /* headings — NO responsive scale exists in the theme; see §3.4 */
  --fs-h1:          60px;   --lh-h1:          1.214;
  --fs-h2:          48px;   --lh-h2:          1.16667;
  --fs-h3:          20px;   --lh-h3:          1.22222; /* theme ships 36px, wp-custom-css forces 20px */
  --fs-h4:          24px;   --lh-h4:          1.33333;
  --fs-h5:          20px;   --fw-h5:          600;
  --fs-h6:          16px;   --fw-h6:          600;
  --fw-heading:     500;    /* theme default for h1–h6 */

  /* page / entry titles */
  --fs-entry-title:        64px;  --lh-entry-title:        1;
  --fs-entry-title-mobile: 28px;  --lh-entry-title-mobile: 1.25;
  --fs-product-title:      48px;  --lh-product-title:      1;
  --fs-product-title-mobile: 26px;--lh-product-title-mobile: 1.25;
  --fs-archive-title-mobile: 26px;

  /* Elementor global typography (kit .elementor-kit-8) */
  --fs-kit-heading-title:        36px;  --lh-kit-heading-title:        36px;
  --fs-kit-heading-title-mobile: 30px;  --lh-kit-heading-title-mobile: 30px;
  --fw-kit-heading-title:        800;   --tt-kit-heading-title: uppercase;
  --fs-kit-footer-heading:       14px;  --lh-kit-footer-heading:       22px;
  --fw-kit-footer-heading:       700;   --tt-kit-footer-heading: none;
  --fw-kit-primary:              700;   /* headings, nav, buttons */
  --fw-kit-secondary:            400;
  --fw-kit-accent:               800;   /* Elementor button widget text */

  /* buttons */
  --fs-button:      11px;  --lh-button: 2.1818181818;  /* = 24px */
  --fw-button:      600;   --ls-button: 2px;           --tt-button: uppercase;
  --fs-button-card: 14px;  --ls-button-card: .5px;     /* card "View Product" */
  --fs-button-card-mobile: 12px;

  /* nav */
  --fs-nav:         19px;  --fw-nav: 700;
  --fs-nav-mobile:  16px;

  /* product surfaces */
  --fs-card-title:  18px;  --lh-card-title: 1.4;  --fw-card-title: 700;
  --fs-card-title-mobile: 13px;
  --fs-card-price:  16px;  --fw-card-price: 300;
  --fs-card-price-mobile: 13px;
  --fs-pdp-price:   24px;  --lh-pdp-price: 1;     --fw-pdp-price: 400;
  --fs-pdp-price-del: 14px;
  --fs-tab-title:   24px;  --lh-tab-title: 24px;  --fw-tab-title: 700;
  --fs-swatch:      16px;  --lh-swatch: 1;        /* raised from theme 13px by FPL patch */
  --fs-totals-row:  18px;
  --fs-totals-grand:24px;
  --fs-totals-head: 28px;

  --ls-eyebrow:     3px;   /* hero eyebrow headings on the homepage */

  /* ======================================================================
     SPACING + LAYOUT
     ====================================================================== */
  --container-max:            1290px;  /* Elementor container (.e-con) desktop  */
  --container-max-tablet:     1024px;  /* ≤1024px                               */
  --container-max-mobile:      767px;  /* ≤767px                                */
  --container-theme-max:      1320px;  /* .col-full / .container (non-Elementor)*/
  --container-pad-x:            15px;  /* <768px and >1320px                    */
  --container-pad-x-mid:        30px;  /* 768–1320px                            */

  --space-el-container-pad:     10px;  /* Elementor .e-con default padding      */
  --space-widget-gap:           20px;  /* --widgets-spacing / --kit-widget-spacing */

  --space-1:   4px;
  --space-2:   6px;
  --space-3:  10px;
  --space-4:  12px;
  --space-5:  15px;
  --space-6:  20px;
  --space-7:  25px;
  --space-8:  30px;
  --space-9:  40px;
  --space-10: 50px;
  --space-11: 60px;
  --space-12: 65px;

  --space-section-y:            40px;  /* #page .site-content margin-block      */
  --space-card-pad:     13px 30px 25px;/* ≥1024px                               */
  --space-card-pad-sm:  13px 15px 25px;/* <1024px                               */
  --space-card-gutter:          10px;  /* li padding-inline (child theme)       */
  --space-grid-gap-mobile:      12px;  /* forced 2-col grid <768px              */
  --space-hfe-gap:        35px 20px;   /* HFE product grid ≥1201px              */
  --space-hfe-gap-md:     20px 15px;   /* HFE grid ≤768px                       */
  --space-hfe-gap-sm:           25px;  /* HFE grid ≤480px                       */
  --space-panel-pad:    30px 30px 40px;/* .cart_totals and #order_review        */
  --space-tabs-y:         50px 0 20px; /* .woocommerce-tabs.product-accordions  */

  /* ======================================================================
     RADII
     ====================================================================== */
  --radius-0:     0;
  --radius-xs:    2px;   /* wvs-style-squared swatch, notice                    */
  --radius-sm:    3px;   /* THE default: buttons, badges, skewed slabs          */
  --radius-md:    4px;   /* card CTA, mini-cart toggle, search form, pay chips  */
  --radius-lg:    5px;   /* inputs, cart_totals, #order_review                  */
  --radius-search:8px;   /* .ntrix-search-wrap                                  */
  --radius-card: 10px;   /* homepage grid .product-transition, .custom-card     */
  --radius-pack: 12px;   /* .fpl-pack-card, .coa-viewer                         */
  --radius-pill: 20px;   /* .fpl-badge                                          */
  --radius-full: 999px;  /* .fpl-cart-count, circular action buttons use 50%    */
  --radius-round:50%;    /* hover action buttons on product cards               */

  /* ======================================================================
     BORDERS
     ====================================================================== */
  --border-hairline: 1px solid var(--color-border);
  --border-card:     1px solid var(--color-border-card);
  --border-input:    1px solid var(--color-border);
  --border-panel:    6px solid var(--color-border);   /* cart totals / order review */
  --border-coupon:   2px dashed var(--color-border);
  --border-pack:     2px solid var(--color-border-pack);
  --border-notice-l: 0.6180469716em solid rgba(0,0,0,.15);

  /* ======================================================================
     SHADOWS  (this design uses shadow sparingly — most surfaces are flat)
     ====================================================================== */
  --shadow-none:      none;
  --shadow-coa:       0 4px 20px rgba(0,0,0,.08);
  --shadow-coa-img:   0 2px 12px rgba(0,0,0,.10);
  --shadow-dropdown:  0 4px 12px rgba(0,0,0,.10);
  --shadow-flyout:    -10px 0 30px rgba(0,0,0,.18);
  --shadow-card-hover:0 15px 25px rgba(0,0,0,.15);
  --shadow-soft:      0 0 30px 0 rgba(0,0,0,.10);
  --shadow-diffuse:   0 4px 50px rgba(0,0,0,.07);
  --shadow-ring-pack: 0 0 0 2px rgba(69,87,201,.25);
  --shadow-editorial: 0 18px 44px rgba(7,31,51,.18);
  --shadow-inset-ok:  inset 2px 0 0 #0F834D;
  --shadow-inset-err: inset 2px 0 0 #E2401C;

  /* ======================================================================
     MOTION  (only two durations exist in the whole codebase)
     ====================================================================== */
  --dur-fast:  .15s;
  --dur-base:  .3s;
  --dur-slow:  .4s;
  --ease-base: ease;
  --ease-wipe: cubic-bezier(.785,.135,.15,.86);  /* button hover fill */

  /* ======================================================================
     THE SKEW — this theme's single most identifying visual trait
     ====================================================================== */
  --skew-angle:        -10deg;
  --skew-scale-x:      .955;
  --skew-origin:       bottom left;
  --skew-angle-dot:    -15deg;  /* tab separator dot */

  /* ======================================================================
     BREAKPOINTS (declared for documentation; use the literals in @media)
     ====================================================================== */
  --bp-mobile:        767px;   /* Elementor "Mobile Portrait"  (max)  */
  --bp-mobile-extra:  880px;   /* Elementor "Mobile Landscape" (max)  */
  --bp-tablet:       1024px;   /* Elementor "Tablet Portrait"  (max)  */
  --bp-tablet-extra: 1200px;   /* Elementor "Tablet Landscape" (max)  */
  --bp-laptop:       1366px;   /* Elementor "Laptop"           (max)  */
  --bp-theme-mid:    1320px;   /* theme container padding switch      */

  /* Z-INDEX */
  --z-badge:      1;
  --z-card-link:  2;
  --z-card-hover: 5;
  --z-qty-btn:    9;
  --z-agegate: 1000;
  --z-flyout: 99999;
}

/* Elementor kit responsive overrides — reproduce verbatim */
@media (max-width: 1024px) { :root { --container-max: 1024px; } }
@media (max-width:  767px) {
  :root {
    --container-max: 767px;
    --fs-kit-heading-title: 30px;
    --lh-kit-heading-title: 30px;
  }
}
/* ==========================================================================
   00 — BASE
   Fonts · reset · base elements · containers · headings · links · forms ·
   the button system (the skew).

   Concatenated after assets/css/_tokens.css, so every var(--…) below is
   already defined. !important appears exactly three times — [hidden] and
   .hidden (both utility hides), and the cart/checkout skew suppression, which
   carries it in production too. Each is marked inline. Nothing else uses it.
   ========================================================================== */


/* ==========================================================================
   1. FONTS — self-hosted Oxanium + Nutritix Heading
   --------------------------------------------------------------------------
   Oxanium is the site-wide family. "Plus Jakarta Sans" was loaded in
   production but shadowed on <body> by the Elementor kit and never painted —
   it is dropped.

   "Nutritix Heading" is NOT dropped, and design-tokens.md §3.1 / trap §8.9 are
   WRONG on this point. It is shadowed on <body>, but Elementor re-asserts it
   per-element on the two homepage promo tiles, so it does paint:
     .elementor-381 .elementor-element-0898cc9 .elementor-cta__description
       { font-family:"Nutritix Heading"; font-size:48px; font-weight:700;
         text-transform:uppercase; line-height:48px; color:#2D2C2F }   ("YOU CAN TRUST")
     .elementor-381 .elementor-element-cca7800 .elementor-cta__description
       { …64px…; color:#4557C9 }                                       ("99%")
   Both verified in the live homepage's inline CSS on 2026-09-03, and visible
   in home__desktop.png y≈1100-1200: a heavy condensed face next to Oxanium's
   wider "QUALITY" / "PURITY EXCEEDS". Consumed via --font-brandmark
   (50-content.css §4). Not preloaded — it is below the fold.

   These two files came straight out of production's Elementor font cache
   (…/uploads/elementor/google-fonts/fonts/). They are VARIABLE fonts: the
   wght axis spans 200–800, so two files — one per subset — cover the seven
   weights production declared with fourteen @font-face rules pointing at the
   same two files. Same rendering, twelve fewer rules, two HTTP requests.

   unicode-range values are Google's, copied verbatim from the production CSS.
   ========================================================================== */

/* latin */
@font-face {
	font-family: "Oxanium";
	font-style: normal;
	font-weight: 200 800;
	font-display: swap;
	src: url("../fonts/oxanium-f874cdc5.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
	font-family: "Oxanium";
	font-style: normal;
	font-weight: 200 800;
	font-display: swap;
	src: url("../fonts/oxanium-3e3c0341.woff2") format("woff2");
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Nutritix Heading — one weight, one style. Copied from production's own
   theme directory (…/themes/nutritix/assets/fonts/new/Nutritix-Heading.*),
   path read out of that theme's @font-face rule, not guessed. Production also
   served .eot and .ttf; both are dropped — woff2 covers every browser this
   store supports, woff is the single fallback. */
@font-face {
	font-family: "Nutritix Heading";
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url("../fonts/nutritix-heading.woff2") format("woff2"),
	     url("../fonts/nutritix-heading.woff") format("woff");
}


/* ==========================================================================
   2. RESET — minimal and modern
   Deliberately does NOT zero margins wholesale: the theme's rhythm comes from
   a 1.618 modular scale with irrational em literals (§4.4) that section 3
   restates exactly. Zeroing then restoring would invite drift.
   ========================================================================== */

*,
*::before,
*::after {
	box-sizing: border-box;
}

html {
	-webkit-text-size-adjust: 100%;
	text-size-adjust: 100%;
}

body {
	margin: 0;
}

/* Production sets img{display:block}; galleries and product media depend on
   it. svg is left alone — Elementor's inline icons sit inline in nav items. */
img {
	display: block;
	height: auto;
	max-width: 100%;
}

svg,
video,
canvas,
iframe,
embed,
object {
	max-width: 100%;
}

video {
	height: auto;
}

figure {
	margin: 0;
}

table {
	border-collapse: collapse;
	border-spacing: 0;
}

button,
input,
select,
textarea {
	font-family: inherit;
	font-size: 100%;
	margin: 0;
	vertical-align: baseline;
}

[hidden] {
	display: none !important;
}

::selection {
	color: var(--color-text-on-brand);
	text-shadow: none;
	background: var(--color-brand);
}


/* ==========================================================================
   3. BASE ELEMENTS — typography from the tokens
   §3.2. Note --fs-body is 14px and --lh-body 1.714 (= 24px).
   Production resolved the family to the bare string "Oxanium" with no generic
   fallback (trap §8.10); --font-body carries the fallback the spec asked for.
   ========================================================================== */

body {
	background-color: var(--color-bg);
	color: var(--color-text);
	font-family: var(--font-body);
	font-size: var(--fs-body);
	font-weight: var(--fw-body);
	line-height: var(--lh-body);
	text-rendering: optimizeLegibility;
	overflow-x: hidden;
	word-wrap: break-word;
}

button,
input,
textarea {
	color: var(--color-text);
	font-family: var(--font-body);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

select {
	color: initial;
	font-family: var(--font-body);
	max-width: 100%;
}

p {
	margin: 0 0 1em;
}

ul,
ol {
	margin: 0 0 1em 3em;
	padding: 0;
}

ul {
	list-style: disc;
}

ol {
	list-style: decimal;
}

li > ul,
li > ol {
	margin-bottom: 0;
	margin-left: 1em;
}

dt {
	font-weight: 600;
}

dd {
	margin: 0 0 1.41575em;
}

b,
strong {
	font-weight: 600;
}

dfn,
cite,
em,
i {
	font-style: italic;
}

blockquote {
	color: var(--color-text-strong);
	font-size: 18px;
	font-style: italic;
}

blockquote p {
	position: relative;
}

address {
	font-style: italic;
	margin: 0 0 1em;
}

abbr[title] {
	border-bottom: 1px dotted var(--color-border);
	cursor: help;
	text-decoration: none;
}

code,
kbd,
pre,
samp {
	font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
	font-size: 0.9375em;
}

pre {
	overflow-x: auto;
	max-width: 100%;
}

/* --color-divider-dot is named for the PDP tab separator, but #CCCCCC is one
   colour with two uses; the token is the source, not a second literal. */
hr {
	background-color: var(--color-divider-dot);
	border: 0;
	height: 1px;
	margin: 0 0 1em;
}

table {
	margin: 0 0 1.41575em;
	width: 100%;
}

.hentry strong,
.hentry th,
.hentry dt {
	color: var(--color-text-strong);
}

/* WordPress accessibility helpers — used by searchform.php, skip links and
   every screen-reader-only label in the templates. */
.screen-reader-text {
	border: 0;
	clip-path: inset(50%);
	height: 1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	white-space: nowrap;
	width: 1px;
}

.screen-reader-text:focus {
	background-color: var(--color-bg);
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-dropdown);
	clip-path: none;
	color: var(--color-brand);
	display: block;
	font-size: var(--fs-h6);
	font-weight: var(--fw-h6);
	height: auto;
	left: var(--space-5);
	line-height: normal;
	padding: var(--space-5) var(--space-7);
	text-decoration: none;
	top: var(--space-5);
	width: auto;
	z-index: 100000;
}

.hidden {
	display: none !important; /* production parity: theme ships .hidden with !important */
}


/* ==========================================================================
   4. CONTAINER / LAYOUT SYSTEM
   §4.1. .col-full and .container are the theme's containers: 1320px max with
   15px inline padding, widening to 30px between 768 and 1320 (the 1320
   breakpoint is one of the three "foreign" breakpoints called out in §8.12).
   Elementor's own .e-con containers cap at --container-max (1290 / 1024 / 767)
   and are handled by the Elementor-compatibility partial.
   ========================================================================== */

.site {
	overflow-x: hidden;
}

.site-content,
.header-widget-region {
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

.col-full,
.container {
	margin-left: auto;
	margin-right: auto;
	max-width: var(--container-theme-max);
	padding-left: var(--container-pad-x);
	padding-right: var(--container-pad-x);
	width: 100%;
}

.col-full::after {
	clear: both;
	content: "";
	display: block;
}

.col-fluid {
	padding-left: var(--container-pad-x);
	padding-right: var(--container-pad-x);
}

@media (min-width: 768px) and (max-width: 1320px) {

	.col-full,
	.container {
		padding-left: var(--container-pad-x-mid);
		padding-right: var(--container-pad-x-mid);
		width: auto;
	}
}

@media (max-width: 1320px) {

	.col-fluid {
		padding-left: var(--container-pad-x-mid);
		padding-right: var(--container-pad-x-mid);
	}
}

/* Page vertical rhythm (§4.2). */
#page .site-content {
	margin-top: var(--space-section-y);
	margin-bottom: var(--space-section-y);
}

body.home:not(.blog) #page .site-content,
body.page-template-template-homepage #page .site-content {
	margin-top: 0;
	margin-bottom: 0;
}

body.single-product #page .site-content {
	margin-top: var(--space-section-y);
	margin-bottom: 0;
}

body.woocommerce-cart #page .site-content {
	margin-bottom: 6.8535260698em;
}

body.error404 #page .site-content {
	margin-bottom: 90px;
}

/* Homepage runs its Elementor sections edge to edge (child theme).
   :not(.blog) for the same reason as the #page .site-content rule above: if the
   front page is ever switched back to the posts index, <body> carries BOTH
   `home` and `blog`, and an unguarded rule would strip the posts index of its
   container padding — content running edge to edge at 375px. */
body.home:not(.blog) .col-full {
	padding-left: 0;
	padding-right: 0;
	width: auto;
}


/* ==========================================================================
   5. HEADING SCALE
   §3.3. h3 ships at 20px, NOT the theme's 36px — a global wp-custom-css rule
   overrode it in production and 20px is the live value everywhere (trap §8.3).
   The 0.5407911001em bottom margin is an exact literal from the theme's 1.618
   modular scale; do not round it (§4.4).
   ========================================================================== */

h1,
h2,
h3,
h4,
h5,
h6 {
	clear: both;
	color: var(--color-text-strong);
	font-family: var(--font-display);
	font-weight: var(--fw-heading);
	margin: 0 0 0.5407911001em;
}

h1,
.alpha {
	font-size: var(--fs-h1);
	line-height: var(--lh-h1);
}

h2,
.beta {
	font-size: var(--fs-h2);
	line-height: var(--lh-h2);
}

h3,
.gamma {
	font-size: var(--fs-h3);
	line-height: var(--lh-h3);
}

h4,
.delta {
	font-size: var(--fs-h4);
	line-height: var(--lh-h4);
}

h5 {
	font-size: var(--fs-h5);
	font-weight: var(--fw-h5);
}

h6 {
	font-size: var(--fs-h6);
	font-weight: var(--fw-h6);
}

.alpha,
.beta,
.gamma,
.delta {
	display: block;
}

p + h2,
p + header h2,
p + h3,
p + h4,
ul + h2,
ul + header h2,
ul + h3,
ul + h4,
ol + h2,
ol + header h2,
ol + h3,
ol + h4,
table + h2,
table + header h2,
table + h3,
table + h4,
blockquote + h2,
blockquote + header h2,
blockquote + h3,
blockquote + h4,
form + h2,
form + header h2,
form + h3,
form + h4 {
	margin-top: 1em;
}

/* Entry / page titles. */
.entry-title {
	font-size: 36px;
	line-height: 1.0555555556;
}

.entry-title a {
	color: var(--color-text-strong);
}

.entry-title a:hover {
	color: var(--color-brand);
}

.post-content .entry-title {
	margin-bottom: 14px;
}

.entry-header h1.entry-title,
.page-header h1.page-title {
	font-size: var(--fs-entry-title);
	line-height: var(--lh-entry-title);
	margin-bottom: var(--space-6);
}

article.page .entry-header h1.entry-title {
	margin-bottom: var(--space-10);
}

/* --------------------------------------------------------------------------
   Responsive type (§3.4)

   There is essentially no responsive scale in this design. Production has ZERO
   responsive font-size rules for h1–h6; six hand-written !important patches in
   wp-custom-css are the entire mobile system. Reproduced here as the OUTCOME —
   same sizes, no !important, no patch-by-patch copy — so later partials can
   override normally.

   Only the title patches live in this file. The other three (loop product
   title, loop price, card CTA) belong to the product-card partial: they are
   component rules, and putting them here would out-order that component's own
   styles.

   NOTE: a bare <h1> stays 60px on mobile, exactly as production does. That is
   the acceptance standard, not an oversight.
   -------------------------------------------------------------------------- */
@media (max-width: 767px) {

	.entry-header h1.entry-title,
	h1.alpha.entry-title {
		font-size: var(--fs-entry-title-mobile);
		line-height: var(--lh-entry-title-mobile);
	}

	/* .woocommerce-products-header is NOT restated here. 20-archive.css owns
	   that header and already carries this exact rule with the extra
	   `.term-description h1` selector — two copies meant two places to edit
	   and only one of them was the complete one. */
	.page-header h1.page-title {
		font-size: var(--fs-archive-title-mobile);
		line-height: 1.25;
	}
}


/* ==========================================================================
   6. LINKS
   ========================================================================== */

a {
	color: var(--color-link);
	text-decoration: none;
}

a:hover {
	color: var(--color-link-hover);
	text-decoration: none;
}

/* Production ships `:focus { outline: none }` site-wide, which leaves keyboard
   users with no visible focus at all. Fixed rather than reproduced — the
   :focus-visible ring never shows for mouse users, so nothing in the visual
   diff moves. */
:focus-visible {
	outline: 2px solid var(--color-brand);
	outline-offset: 2px;
}

/* Category / term description links live in 60-features.css §60.4, character
   for character — that partial also owns the markup (inc/category-descriptions.php),
   so it owns the link treatment. The duplicate that used to sit here is gone. */


/* ==========================================================================
   7. FORMS
   §5.1 radii, §5.3 borders. Inputs are 5px; select is deliberately 0.
   ========================================================================== */

form {
	margin-bottom: 1.618em;
}

input[type="text"],
input[type="number"],
input[type="email"],
input[type="tel"],
input[type="url"],
input[type="password"],
input[type="search"],
input[type="date"],
textarea,
.input-text {
	-webkit-appearance: none;
	appearance: none;
	background-color: var(--color-bg);
	border: var(--border-input);
	border-radius: var(--radius-lg);
	box-sizing: border-box;
	font-weight: normal;
	outline: 0;
	padding: 0.93em 1.25em;
	transition: all var(--dur-base) ease-in-out;
}

input[type="text"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="tel"]:focus,
input[type="url"]:focus,
input[type="password"]:focus,
input[type="search"]:focus,
input[type="date"]:focus,
textarea:focus,
.input-text:focus {
	border-color: var(--color-text-strong);
}

input[type="search"] {
	box-sizing: border-box;
}

input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
	-webkit-appearance: none;
}

input[type="search"]::placeholder {
	color: #616161; /* theme literal, no token */
}

input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
	height: auto;
}

[placeholder]:focus::placeholder {
	opacity: 0;
	transition: opacity 0.5s 0.5s ease;
}

select {
	padding: 0.63em 28px 0.63em 1.41575em;
}

select:not([size]):not([multiple]) {
	-webkit-appearance: none;
	-moz-appearance: textfield;
	appearance: none;
	background-color: var(--color-bg);
	background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
	background-position: calc(100% - 10px) center;
	background-repeat: no-repeat;
	background-size: 16px 12px;
	border: var(--border-input);
	border-radius: var(--radius-0);
	color: var(--color-text);
	max-width: 100%;
	width: 100%;
}

textarea {
	overflow: auto;
	vertical-align: top;
	width: 100%;
}

label {
	font-weight: 400;
}

label.inline input {
	width: auto;
}

input[type="checkbox"],
input[type="radio"] {
	padding: 0;
}

input[type="checkbox"] + label,
input[type="radio"] + label {
	margin: 0 0 0 0.3819820591em;
}

fieldset {
	border-color: var(--color-border);
	margin: 1.618em 0;
	padding: 1em 1.618em 1.618em;
}

fieldset legend {
	color: var(--color-text-strong);
	font-weight: 700;
	margin-left: -1em;
	padding: 0.6180469716em 1em;
}

button::-moz-focus-inner,
input::-moz-focus-inner {
	border: 0;
	padding: 0;
}


/* ==========================================================================
   8. THE BUTTON SYSTEM — READ BEFORE TOUCHING
   --------------------------------------------------------------------------
   design-tokens.md §7.0, and traps §8.4 / §8.5. This is the single most
   recognisable element of the brand.

   The visible button is NOT the element's own background. It is a -10° skewed
   parallelogram slab drawn by ::after, black at rest, brand blue on hover.
   Two things make it work, and removing either one silently destroys every
   button on the site:

     1. `z-index: 1` on button/.button creates a stacking context, which is the
        only reason the `z-index: -1` slab paints ABOVE the element's own
        (transparent) background but BELOW its text. Drop it and the slab sinks
        behind the element and every button turns white-on-white.
     2. `scaleX(0.955)` with `transform-origin: bottom left` — the skew alone
        widens the slab past the element box; the scale pulls it back.

   The slab is DELIBERATELY suppressed on cart and checkout (§7.0). That
   asymmetry is intentional, not a bug — see the tail of this section.
   ========================================================================== */

button,
input[type="button"],
input[type="reset"],
input[type="submit"],
.button {
	-webkit-appearance: none;
	appearance: none;
	border: none;
	border-radius: var(--radius-sm);
	color: var(--color-text-on-brand);
	cursor: pointer;
	display: inline-block;
	font-family: var(--font-display);
	font-size: var(--fs-button);
	font-weight: var(--fw-button);
	letter-spacing: var(--ls-button);
	line-height: var(--lh-button);
	padding: 1.365em 4em;
	text-decoration: none;
	text-shadow: none;
	text-transform: var(--tt-button);
}

/* --- the skew ----------------------------------------------------------- */
button,
.button {
	background-color: transparent;
	position: relative;
	z-index: 1; /* CRITICAL — creates the stacking context the slab needs */
}

button::after,
.button::after {
	background-color: var(--color-ink-solid);
	border: 1px solid transparent;
	border-radius: var(--radius-sm);
	content: "";
	height: calc(100% - 2px);
	left: 0;
	position: absolute;
	top: 0;
	transform: skewX(var(--skew-angle)) scaleX(var(--skew-scale-x));
	transform-origin: var(--skew-origin);
	transition: all var(--dur-base) var(--ease-base);
	width: calc(100% - 2px);
	z-index: -1;
}

button:hover,
.button:hover {
	color: var(--color-text-on-brand);
}

button:hover::after,
.button:hover::after {
	background-color: var(--color-brand);
}

/* Submit-style inputs cannot carry a pseudo-element, so the theme skews the
   element itself and paints it solid. Its label skews with it — that is the
   production look. */
input[type="button"],
input[type="reset"],
input[type="submit"] {
	background-color: var(--color-text-strong);
	transform: skewX(var(--skew-angle));
}

input[type="button"]:hover,
input[type="reset"]:hover,
input[type="submit"]:hover {
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}

/* --- size and state modifiers ------------------------------------------- */
button.small,
input[type="button"].small,
input[type="reset"].small,
input[type="submit"].small,
.button.small {
	font-size: 0.875em;
	padding: 0.5407911001em 0.875em;
}

button.loading,
input[type="button"].loading,
input[type="reset"].loading,
input[type="submit"].loading,
.button.loading {
	opacity: 0.5;
}

button.disabled,
button:disabled,
input[type="button"].disabled,
input[type="button"]:disabled,
input[type="reset"].disabled,
input[type="reset"]:disabled,
input[type="submit"].disabled,
input[type="submit"]:disabled,
.button.disabled,
.button:disabled {
	cursor: not-allowed;
	opacity: 0.5;
}

button.disabled:hover,
button:disabled:hover,
input[type="button"].disabled:hover,
input[type="button"]:disabled:hover,
input[type="reset"].disabled:hover,
input[type="reset"]:disabled:hover,
input[type="submit"].disabled:hover,
input[type="submit"]:disabled:hover,
.button.disabled:hover,
.button:disabled:hover {
	opacity: 0.5;
}

/* --- outline variant (§7.3) --------------------------------------------- */
.button-outline {
	background: transparent;
	border: 1px solid var(--color-brand);
	border-radius: var(--radius-lg);
	color: var(--color-brand);
	cursor: pointer;
	display: inline-block;
	padding: 0.6180469716em 1.41575em;
	text-decoration: none;
}

.button-outline:hover {
	background-color: var(--color-brand-hover);
	border-color: var(--color-brand-hover);
	color: var(--color-text-on-brand);
}

.button-outline.small {
	font-size: 0.875em;
	padding: 0.5407911001em 0.875em;
}

.button-outline.loading {
	opacity: 0.5;
}

.button-outline.disabled,
.button-outline:disabled,
.button-outline.disabled:hover,
.button-outline:disabled:hover {
	cursor: not-allowed;
	opacity: 0.5;
}

/* --- the two documented suppressions (§7.0) ------------------------------
   Cart and checkout run the buttons FLAT. Production uses !important here
   because the rule arrives from wp-custom-css after the component CSS;
   keeping it makes the suppression immune to whatever the cart and checkout
   partials add later, which is exactly the production behaviour.           */
.woocommerce-cart button.button::after,
.woocommerce-cart button.button::before,
.woocommerce-cart .button::after,
.woocommerce-cart .button::before,
.woocommerce-checkout button.button::after,
.woocommerce-checkout button.button::before,
.woocommerce-checkout .button::after,
.woocommerce-checkout .button::before {
	content: none !important;
	display: none !important;
}

/* With the slab gone, a cart/checkout button whose component rule forgets to
   set a background is white text on transparent — an invisible control.

   The page scope is wrapped in :where() so it adds NO specificity: these two
   selectors weigh exactly the same as the `button` / `.button` base rule they
   sit after, and no more. They win over that rule because they come later,
   and lose to anything a cart or checkout partial writes — those partials are
   concatenated after this file and paint the real colours (checkout button
   and Place Order are brand blue). This only ever paints a button nothing
   else claimed. */
:where(.woocommerce-cart, .woocommerce-checkout) button,
:where(.woocommerce-cart, .woocommerce-checkout) .button {
	background-color: var(--color-ink-solid);
}


/* ==========================================================================
   9. 404 / SEARCH-RESULTS CHROME
   Only what 404.php and search.php need; both reuse the container and heading
   styles above rather than introducing a component of their own.
   ========================================================================== */

.error-404,
.no-results.not-found {
	text-align: center;
}

.error-404 .page-content,
.no-results.not-found .page-content {
	margin-left: auto;
	margin-right: auto;
	max-width: 540px;
}

.error-404 .page-content > * + *,
.no-results.not-found .page-content > * + * {
	margin-top: var(--space-7);
}

.error-404 .page-header,
.no-results.not-found .page-header {
	margin-bottom: var(--space-9);
}

/* The generic search form: field and skewed submit on one row. */
.error-404 .search-form,
.no-results.not-found .search-form {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-3);
	justify-content: center;
	margin-bottom: 0;
}

.error-404 .search-form .search-field,
.no-results.not-found .search-form .search-field {
	flex: 1 1 260px;
	min-width: 0;
}

/* Plus Jakarta Sans -- self-hosted, variable (400-700, one file per subset).
   The token spec said this family renders nowhere and should be dropped. True of the pages it
   sampled (home/shop/product/policy), NOT of /about-us/ and /contact-us/, where Elementor sets
   it per element -- 5 and 2 rules respectively, verified against the live pages 2026-09-04.
   Production loads it render-blocking from Google as TTF; we self-host woff2. */
@font-face {
	font-family: "Plus Jakarta Sans";
	font-style: normal;
	font-weight: 400 700;
	font-display: swap;
	src: url("../fonts/plus-jakarta-sans-latin.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
	font-family: "Plus Jakarta Sans";
	font-style: normal;
	font-weight: 400 700;
	font-display: swap;
	src: url("../fonts/plus-jakarta-sans-latin-ext.woff2") format("woff2");
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}


/* --------------------------------------------------------------------------
   00.99  Touch targets
   --------------------------------------------------------------------------
   44px is the accepted minimum for a touch control. Measured at 375px, the
   menu toggle drew 33x33 and the hero carousel arrows 32x32 -- both below it,
   and both primary controls: the hamburger is the ONLY way to the navigation
   on a phone.

   Only the hit area grows. The icon inside is untouched, and the containers
   have room: the header row is 121px tall and the hero 500px, so neither
   reflows. Production is worse on this measure, not better -- it has 135 sub-44
   targets on the mobile homepage against 20 here -- so this is a fix, not a
   deviation from it.

   Not applied to footer links: they sit 24px tall in stacked lists, and growing
   them to 44px would either overlap their neighbours or change the footer's
   spacing, which would be a visible deviation from production. Left as-is.
   -------------------------------------------------------------------------- */

@media (max-width: 1024px) {

	.fpl-menu-toggle {
		align-items: center;
		display: inline-flex;
		justify-content: center;
		min-height: 44px;
		min-width: 44px;
	}

	.fpl-hero__nav {
		align-items: center;
		display: inline-flex;
		justify-content: center;
		min-height: 44px;
		min-width: 44px;
	}
}
/* ==========================================================================
   10 — HEADER, PRIMARY NAV, MOBILE FLYOUT

   Replaces Header-Footer-Elementor template 3549 plus the wp-custom-css blocks
   that patch it and Elementor Pro snippet #9473 (the slide-in panel).

   Every number below is either a token, a value read out of the live inline
   Elementor CSS (el_3549), or a pixel measured off
   reference-screenshots/home__{desktop,tablet,mobile}.png. Nothing is guessed.

   DESKTOP GEOMETRY (1440px, from home__desktop.png):
     announcement  y   0–35    36px, #4557C9
     main row      y  36–163  128px, container 1290px, columns 25% / 50% / 25%
     nav row       y 164–219   55px = 10px padding + 35px link box + 10px
     header total            220px

   NOT STICKY. Production's only positioning on the header is HFE's
   `.ehf-header #masthead { position:relative; z-index:99 }`, and "sticky"
   appears nowhere in the rendered page. It scrolls away. Reproduced.

   BREAKPOINTS
     >1024   full desktop header
     ≤1024   nav row becomes a centred hamburger; account hidden; flyout live
     ≤767    search, account and cart hidden; hamburger moves beside the logo
   1024 is Elementor's "tablet" dropdown breakpoint for this nav widget and the
   breakpoint snippet #9473 scopes its panel CSS to. Do not change it to 768.

   WHERE THE CART GOES ON A PHONE. Hiding .fpl-header__actions at ≤767 is
   faithful to production, but only because production replaces it with the
   fixed bottom bar (HFE template 1381 + snippet #9471). That bar is
   template-parts/mobile-bar.php, styled in 11-footer.css §7, and it is what
   carries Shop / Account / Search / Wishlist / Cart from 1024px down. Do not
   hide the header actions without it, or a phone visitor can add to cart and
   never reach the basket.
   ========================================================================== */

:root {

	/* Elementor's menu-cart quantity bubble. No token exists for it — the
	   colour is Elementor's own default and appears nowhere else. */
	--fpl-cart-badge-bg: #d9534f;

	/* Elementor's .elementor-menu-toggle: a 22px glyph in #33373D on a
	   rgba(0,0,0,.05) tile. Measured #F2F2F2 over white in the screenshots. */
	--fpl-toggle-ink: #33373d;
	--fpl-toggle-bg: rgba(0, 0, 0, .05);

	/* Side-cart drawer. Elementor Pro's side cart is 360px wide with a dimmed
	   scrim; neither number is a token because nothing else in the theme uses
	   them. The stack sits one step under --z-flyout so the drawer and its
	   scrim can never be separated by the mobile bottom bar (z-index 997). */
	--fpl-cart-drawer-w: 360px;
	--fpl-cart-drawer-z: 99999;
	--fpl-cart-backdrop-z: 99998;
	--fpl-cart-backdrop-bg: rgba(0, 0, 0, .45);
}


/* ==========================================================================
   1. SHELL
   ========================================================================== */

.fpl-header {
	background-color: var(--color-header-bg);
	position: relative;
	z-index: 99; /* HFE parity: .ehf-header #masthead */
}

.fpl-header__body {
	background-color: var(--color-header-bg);
}

.fpl-header__grid {
	align-items: center;
	display: grid;
	grid-template-areas:
		"brand search actions"
		"nav   nav    nav";
	grid-template-columns: 25% 50% 25%;
	margin-inline: auto;
	max-width: var(--container-max);
	width: 100%;
}

.fpl-header__brand   { grid-area: brand; }
.fpl-header__search  { grid-area: search; }
.fpl-header__actions { grid-area: actions; }
.fpl-header__nav     { grid-area: nav; }

/* Elementor gives every child container a 10px pad; the row container itself
   is explicitly 0 (element f068b78). That is what puts the search box at
   x408–1032 inside a 1290px container. */
.fpl-header__brand,
.fpl-header__search,
.fpl-header__actions {
	padding: var(--space-3);
}


/* --------------------------------------------------------------------------
   1.1 Button reset — design-tokens.md §7.0, suppression case 3

   00-base.css gives EVERY <button> the -10° black slab (::after), 11px
   uppercase type, 2px tracking and 1.365em 4em padding. None of the header
   controls are brand buttons, so they all opt out.

   §7.0 lists three places production suppresses the skew: the cart page, the
   checkout page (both in 40-cart.css) and "search submit / mini-cart toggle:
   `clip-path:none !important; transform:none !important` in wp-custom-css".
   That third case is this block. It previously killed only the ::after slab
   and left `clip-path` and `transform` alone, and it did not list the cart
   toggle at all — which did not show while the cart was an <a>, but the
   toggle is a real <button> now, so it would have inherited the whole slab.
   Both gaps are closed below. The live rules being reproduced are:

     .ntrix-search-form .ntrix-search-button,
     .elementor-widget-search .e-search-submit { clip-path:none !important;
                                                 transform:none !important }
     .elementor-menu-cart__toggle .elementor-button { background:#4557C9;
                                                      border-radius:4px;
                                                      font-size:13px;
                                                      padding:8px 14px }

   Every visual property the cart toggle actually wants is re-asserted by
   `.fpl-cart` further down (§5) — same specificity, later in source order.
   -------------------------------------------------------------------------- */

.fpl-search__submit,
.fpl-menu-toggle,
.fpl-nav__toggle,
.fpl-flyout-nav__toggle,
.fpl-flyout-close,
.fpl-cart--toggle,
.fpl-cart-drawer__close {
	background-color: transparent;
	border: 0;
	border-radius: 0;
	clip-path: none;
	color: inherit;
	cursor: pointer;
	font-family: var(--font-display);
	font-size: inherit;
	font-weight: inherit;
	letter-spacing: normal;
	line-height: normal;
	padding: 0;
	text-transform: none;
	transform: none;
	z-index: auto;
}

.fpl-search__submit::after,
.fpl-search__submit::before,
.fpl-menu-toggle::after,
.fpl-nav__toggle::after,
.fpl-flyout-nav__toggle::after,
.fpl-flyout-close::after,
.fpl-cart--toggle::after,
.fpl-cart--toggle::before,
.fpl-cart-drawer__close::after {
	content: none;
	display: none;
}

.fpl-header .fpl-icon {
	display: block;
	flex: none;
}


/* ==========================================================================
   2. ANNOUNCEMENT BAR — Elementor container a0d52ae
   ========================================================================== */

.fpl-announcement {
	background-color: var(--color-announce-bg);
	color: var(--color-announce-text);
}

.fpl-announcement__inner {
	margin-inline: auto;
	max-width: var(--container-max);
	padding: var(--space-3) var(--space-5);
}

.fpl-announcement__text {
	color: var(--color-announce-text);
	font-family: var(--font-display);
	font-size: var(--fs-h6);            /* 16px — measured 258px of set text */
	font-weight: var(--fw-kit-primary); /* 700 */
	line-height: 1;                     /* 10 + 16 + 10 = the 36px bar */
	margin: 0;
	text-align: center;
}

.fpl-announcement__text a {
	color: inherit;
	text-decoration: none;
	transition: color .2s var(--ease-base);
}

.fpl-announcement__text a:hover,
.fpl-announcement__text a:focus {
	color: var(--color-announce-link-hover);
}


/* ==========================================================================
   3. LOGO
   ========================================================================== */

.fpl-header__brand .custom-logo-link,
.fpl-header__brand .fpl-logo {
	display: block;
	line-height: 0;
}

.fpl-header__brand img {
	display: block;
	height: auto;
	max-width: 100%;
}

.fpl-logo--text {
	color: var(--color-text-strong);
	font-family: var(--font-display);
	font-size: var(--fs-h4);
	font-weight: var(--fw-kit-primary);
	line-height: 1.2;
	text-decoration: none;
}


/* ==========================================================================
   4. SEARCH — WooCommerce product search

   Measured on home__desktop.png: box x408–1032 × y80–119, i.e. 625 × 40, a 1px
   #E8E8E8 rule, SQUARE corners (x408,y80 is already full border colour — there
   is no radius), and a 54px brand-blue submit on the right.

   The live DOM also carries a category <select> (.search-by-category). It is
   display:none on production and renders nowhere in any screenshot, so it is
   not rebuilt. Adding it back would change the box width.
   ========================================================================== */

.fpl-search {
	align-items: stretch;
	background-color: var(--color-bg);
	border: var(--border-hairline);
	border-radius: var(--radius-0);
	display: flex;
	height: 40px;
	margin: 0; /* 00-base gives every form a 1.618em bottom margin */
	overflow: hidden;
	position: relative;
	width: 100%;
}

.fpl-search__field {
	background-color: transparent;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	color: var(--color-text);
	flex: 1 1 auto;
	font-family: var(--font-display);
	font-size: var(--fs-body);
	height: 100%;
	line-height: 1;
	min-width: 0;
	padding: 0 var(--space-7); /* 25px — matches the live 26px text inset */
	width: 100%;
}

.fpl-search__field::placeholder {
	color: var(--color-text);
	font-size: var(--fs-small); /* 12px, per the theme's own placeholder rule */
	font-weight: var(--fw-body);
	opacity: 1;
}

.fpl-search__field:focus {
	border-color: var(--color-brand);
	outline: 2px solid var(--color-brand);
	outline-offset: -2px;
}

.fpl-search__submit {
	align-items: center;
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
	display: flex;
	flex: none;
	height: 100%;
	justify-content: center;
	transition: background-color var(--dur-base) var(--ease-base);
	width: 54px;
}

.fpl-search__submit:hover,
.fpl-search__submit:focus-visible {
	background-color: var(--color-brand-hover);
	color: var(--color-text-on-brand);
}


/* ==========================================================================
   5. ACCOUNT + CART
   ========================================================================== */

.fpl-header__actions {
	align-items: center;
	display: flex;
	gap: 22px; /* measured: account label ends x1212, cart starts x1234 */
	justify-content: center;
}

.fpl-account {
	align-items: center;
	color: var(--color-text-muted);
	display: inline-flex;
	gap: var(--space-2);
	text-decoration: none;
	transition: color var(--dur-base) var(--ease-base);
	white-space: nowrap;
}

.fpl-account .fpl-icon {
	color: var(--color-ink-solid);
	transition: color var(--dur-base) var(--ease-base);
}

.fpl-account__label {
	font-family: var(--font-display);
	font-size: 12px; /* measured: "Sign In / Register" sets 96px on production */
	font-weight: var(--fw-kit-primary);
	line-height: 1;
}

.fpl-account:hover,
.fpl-account:focus-visible {
	color: var(--color-link-hover);
}

.fpl-account:hover .fpl-icon,
.fpl-account:focus-visible .fpl-icon {
	color: var(--color-link-hover);
}

/* --------------------------------------------------------------------------
   5.1 Cart toggle

   Two controls in one wrapper, exactly one of them visible:

     button.fpl-cart--toggle  opens the drawer — needs scripting
     a.fpl-cart--link         goes to /cart/   — does not

   00-core.js swaps `no-js` for `js` on <html> (header.php sets the initial
   class). Both render the identical pill, so the exchange cannot flash.

   `.fpl-cart-wrap` is NOT a fragment target. `woocommerce_add_to_cart_
   fragments` replaces only the three data spans inside it (see inc/nav-
   walker.php §5) so the <button>'s listener, focus and aria-expanded survive
   an AJAX add-to-cart.
   -------------------------------------------------------------------------- */

.fpl-cart-wrap {
	align-items: center;
	display: inline-flex;
}

/* Both selectors carry the html.* prefix on purpose. `.fpl-cart` further down
   is also (0,1,0) and later in source order, so a bare `.fpl-cart--toggle
   { display:none }` would simply lose to it. (0,2,1) each, order-independent. */
html.no-js .fpl-cart--toggle {
	display: none;
}

html.js .fpl-cart--link {
	display: none;
}

/* Cart toggle. wp-custom-css forces these five values on the Elementor
   menu-cart button, all !important; they are reproduced here as plain
   declarations because nothing competes with them any more.
   Measured box: 82 × 36 at 1440px — 8+18+8 tall plus the 1px border. */
.fpl-cart {
	align-items: center;
	background-color: var(--color-brand);
	border: 1px solid var(--color-brand);
	border-radius: var(--radius-md);
	color: var(--color-text-on-brand);
	display: inline-flex;
	font-family: var(--font-display);
	font-size: 13px;
	font-weight: var(--fw-kit-primary);
	gap: 0;
	line-height: 1;
	padding: 8px 14px;
	text-decoration: none;
	transition: background-color var(--dur-base) var(--ease-base),
		border-color var(--dur-base) var(--ease-base);
	white-space: nowrap;
}

.fpl-cart:hover,
.fpl-cart:focus-visible {
	background-color: var(--color-brand-hover);
	border-color: var(--color-brand-hover);
	color: var(--color-text-on-brand);
}

.fpl-cart__total,
.fpl-cart__total .amount,
.fpl-cart__total .woocommerce-Price-amount {
	color: var(--color-text-on-brand);
	font-size: inherit;
	font-weight: inherit;
}

.fpl-cart__icon {
	display: inline-flex;
	position: relative;
}

/* The red bubble. 16 × 16 measured at x1294–1309, y84–99.

   The class is `fpl-cart-count`, not `fpl-cart__count`: it is a fragment
   TARGET shared with the mobile bottom bar's cart cell, so one replacement
   updates both badges (inc/nav-walker.php §5). _tokens.css:209 already names
   this class as the consumer of --radius-full. `hfe-cart-count` rides along so
   any CSS lifted off the live site keeps matching.

   The server renders it EMPTY at zero rather than "0" — `:empty` then hides
   it, which is how snippet #9471's `display:none` behaviour is reproduced
   without the element ever leaving the DOM for the fragment to miss. */
.fpl-cart-count {
	align-items: center;
	background-color: var(--fpl-cart-badge-bg);
	border-radius: var(--radius-full);
	color: var(--color-text-on-brand);
	display: inline-flex;
	font-size: 10px;
	font-weight: var(--fw-kit-primary);
	height: 16px;
	justify-content: center;
	line-height: 1;
	min-width: 16px;
	padding: 0 var(--space-1);
	position: absolute;
	right: -9px;
	top: -8px;
}

.fpl-cart-count:empty {
	display: none;
}


/* --------------------------------------------------------------------------
   5.2 Side-cart drawer

   Production: Elementor Pro woocommerce-menu-cart, cart_type "side-cart",
   open_cart "click". A right-hand panel with the mini-cart, per-line remove
   links and a subtotal.

   The mini-cart's OWN styling is 40-cart.css §40.11, which is written against
   a `.widget_shopping_cart` ancestor — the panel carries that class so those
   rules (until now unreachable, because nothing rendered the component) apply.
   Nothing about the mini-cart's interior is restyled here.
   -------------------------------------------------------------------------- */

.fpl-cart-backdrop {
	background-color: var(--fpl-cart-backdrop-bg);
	bottom: 0;
	left: 0;
	opacity: 0;
	position: fixed;
	right: 0;
	top: 0;
	transition: opacity var(--dur-base) var(--ease-base);
	z-index: var(--fpl-cart-backdrop-z);
}

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

.fpl-cart-backdrop.is-open {
	opacity: 1;
}

.fpl-cart-drawer {
	background-color: var(--color-bg);
	bottom: 0;
	box-shadow: var(--shadow-flyout);
	display: flex;
	flex-direction: column;
	height: 100%;
	inset-inline-end: 0;
	inset-inline-start: auto;
	max-height: 100%;
	position: fixed;
	top: 0;
	transform: translateX(100%);
	transition: transform var(--dur-base) var(--ease-base);
	width: min(90vw, var(--fpl-cart-drawer-w));
	z-index: var(--fpl-cart-drawer-z);
}

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

.fpl-cart-drawer.is-open {
	transform: translateX(0);
}

@media (prefers-reduced-motion: reduce) {

	.fpl-cart-backdrop,
	.fpl-cart-drawer {
		transition: none;
	}
}

body.fpl-cart-open {
	overflow: hidden;
}

.fpl-cart-drawer__head {
	align-items: center;
	border-bottom: var(--border-hairline);
	display: flex;
	flex: none;
	justify-content: space-between;
	padding: var(--space-5) var(--space-6);
}

.fpl-cart-drawer__title {
	color: var(--color-text-strong);
	font-family: var(--font-display);
	font-size: var(--fs-h6);
	font-weight: var(--fw-kit-primary);
	line-height: 1.2;
	margin: 0;
}

.fpl-cart-drawer__close {
	align-items: center;
	border-radius: var(--radius-search);
	color: var(--color-text);
	display: flex;
	height: 36px;
	justify-content: center;
	margin-inline-end: calc(-1 * var(--space-3));
	width: 36px;
}

.fpl-cart-drawer__close:hover,
.fpl-cart-drawer__close:focus-visible {
	color: var(--color-brand);
}

.fpl-cart-drawer__body {
	flex: 1 1 auto;
	overflow-x: hidden;
	overflow-y: auto;
	padding: var(--space-6);
}


/* ==========================================================================
   6. PRIMARY NAV — Elementor nav-menu widget 273a5a6

   19px / 700 Oxanium, item padding 8px 22px, 29px between items
   (--e-nav-menu-horizontal-menu-item-margin: calc(29px / 2) per side),
   rest #414042, hover / active / focus #4557C9 with a 3px underline bar.
   ========================================================================== */

.fpl-header__nav {
	background-color: var(--color-header-bg);
	display: flex;
	justify-content: center;
	padding: var(--space-3) 0;
	width: 100%;
}

.fpl-nav__list {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	list-style: none;
	margin: 0;
	padding: 0;
}

/* display:flex, not the default list-item: the chevron button and the link are
   siblings, and in an inline formatting context their baselines would add
   leading and push the 35px row to 39px. */
.fpl-nav__item {
	align-items: center;
	display: flex;
	margin-inline: calc(29px / 2);
	position: relative;
}

.fpl-nav__link {
	align-items: center;
	color: var(--color-nav-link);
	display: inline-flex;
	font-family: var(--font-display);
	font-size: var(--fs-nav);   /* 19px */
	font-weight: var(--fw-nav); /* 700 */
	gap: var(--space-2);
	line-height: 1;             /* 8 + 19 + 8 = the 35px link box */
	padding: 8px 22px;          /* Elementor literals; no 8/22px token exists */
	position: relative;
	text-decoration: none;
	transition: color var(--dur-base) var(--ease-base);
	white-space: nowrap;
}

/* The pointer bar. ::before, not ::after — 00-base.css owns button::after. */
.fpl-nav__link::before {
	background-color: var(--color-brand);
	bottom: 0;
	content: "";
	height: 3px;
	left: 22px;
	position: absolute;
	right: 22px;
	transform: scaleX(0);
	transition: transform var(--dur-base) var(--ease-base);
}

.fpl-nav__item:hover > .fpl-nav__link,
.fpl-nav__link:focus-visible,
.fpl-nav__item--current > .fpl-nav__link {
	color: var(--color-nav-link-hover);
	fill: var(--color-nav-link-hover);
}

.fpl-nav__item:hover > .fpl-nav__link::before,
.fpl-nav__link:focus-visible::before,
.fpl-nav__item--current > .fpl-nav__link::before {
	transform: scaleX(1);
}

/* Chevron. A real button so it is reachable without a pointer; visually it is
   the `<span class="sub-arrow">` production draws inside the link. */
.fpl-nav__toggle {
	align-items: center;
	color: var(--color-nav-link);
	display: inline-flex;
	justify-content: center;
	transition: color var(--dur-base) var(--ease-base);
	vertical-align: middle;
}

/* Production draws the chevron INSIDE the link, 12.5px after the label and
   before the link's 22px right padding. Here it is a separate button, so the
   negative start margin pulls it back into that padding and the end margin
   restores the 22px. Net effect on the item box: +28.5px, which is exactly
   what the live "Shop All" item measures. The 8px pad keeps a 32 × 32 target.
   32 < 35, so the chevron never grows the row. */
.fpl-nav__toggle:not(.fpl-nav__toggle--standalone) {
	margin-inline: -17.5px 14px;
	padding: 8px;
}

/* "Knowledge Base" — a dropdown parent with no page of its own, so the button
   IS the top-level item and takes the link's own metrics. */
.fpl-nav__toggle.fpl-nav__toggle--standalone {
	gap: 12.5px;
	line-height: 1;
	margin-inline: 0;
	padding: 8px 22px;
}

.fpl-nav__item:hover > .fpl-nav__toggle,
.fpl-nav__toggle:hover,
.fpl-nav__toggle:focus-visible {
	color: var(--color-nav-link-hover);
}

.fpl-nav__toggle[aria-expanded="true"] .fpl-icon {
	transform: rotate(180deg);
}

/* Submenu. Child theme forces these three with !important; kept as tokens. */
.fpl-nav__submenu {
	background-color: var(--color-submenu-bg);
	box-shadow: var(--shadow-dropdown);
	inset-inline-start: 0;
	list-style: none;
	margin: 0;
	opacity: 0;
	padding: 0;
	pointer-events: none;
	position: absolute;
	top: 100%;
	transition: opacity var(--dur-fast) var(--ease-base),
		visibility var(--dur-fast) var(--ease-base);
	visibility: hidden;
	width: 220px;
	z-index: 100;
}

.fpl-nav__item:hover > .fpl-nav__submenu,
.fpl-nav__item:focus-within > .fpl-nav__submenu,
.fpl-nav__toggle[aria-expanded="true"] ~ .fpl-nav__submenu {
	opacity: 1;
	pointer-events: auto;
	visibility: visible;
}

.fpl-nav__sublink {
	color: var(--color-submenu-text);
	display: block;
	font-family: var(--font-display);
	font-size: var(--fs-h6);
	font-weight: var(--fw-kit-primary);
	line-height: 1.3;
	padding: var(--space-4) var(--space-6);
	text-decoration: none;
	transition: background-color var(--dur-base) var(--ease-base);
}

.fpl-nav__subitem:hover > .fpl-nav__sublink,
.fpl-nav__sublink:hover,
.fpl-nav__sublink:focus-visible {
	background-color: var(--color-submenu-bg-hover);
	color: var(--color-submenu-text);
}


/* ==========================================================================
   7. HAMBURGER — Elementor .elementor-menu-toggle

   33 × 34 tile at #F2F2F2 over white (rgba(0,0,0,.05)), 3px radius, a 22px
   glyph in #33373D. Measured x312–344, y78–111 on home__mobile.png.
   ========================================================================== */

.fpl-menu-toggle {
	align-items: center;
	background-color: var(--fpl-toggle-bg);
	border-radius: var(--radius-sm);
	color: var(--fpl-toggle-ink);
	display: none;
	grid-area: toggle;
	justify-content: center;
	padding: 5.5px; /* .25em of the 22px glyph — Elementor's own literal */
}

.fpl-menu-toggle:hover,
.fpl-menu-toggle:focus-visible {
	color: var(--color-brand);
}


/* ==========================================================================
   8. OFF-CANVAS FLYOUT

   Values below are verbatim from Elementor Pro snippet #9473. No backdrop
   element — v1 shipped one, it swallowed every tap and was rolled back. The
   snippet's own source says "Do not add one." Dismissal is the X, Escape, a
   click outside, or following a link; JS handles all four.
   ========================================================================== */

.fpl-flyout {
	background-color: var(--color-bg);
	bottom: 0;
	box-shadow: var(--shadow-flyout);
	display: block;
	height: 100%;
	inset-inline-end: 0;
	inset-inline-start: auto;
	max-height: 100%;
	overflow-x: hidden;
	overflow-y: auto;
	padding: 60px 0 24px;
	position: fixed;
	top: 0;
	transform: translateX(100%);
	transition: transform var(--dur-base) var(--ease-base);
	width: min(84vw, 330px);
	z-index: var(--z-flyout);
}

.fpl-flyout[hidden] {
	display: none;
}

.fpl-flyout.is-open {
	transform: translateX(0);
}

@media (prefers-reduced-motion: reduce) {

	.fpl-flyout {
		transition: none;
	}
}

body.fpl-menu-open {
	overflow: hidden;
}

.fpl-flyout-close {
	align-items: center;
	border-radius: var(--radius-search); /* 8px, per the snippet */
	color: var(--color-text);
	display: flex;
	height: 40px;
	inset-inline-end: 12px;
	justify-content: center;
	position: absolute;
	top: 12px;
	width: 40px;
	z-index: 2;
}

.fpl-flyout-close:hover,
.fpl-flyout-close:focus-visible {
	color: var(--color-brand);
}

.fpl-flyout-nav__list,
.fpl-flyout-nav__submenu {
	list-style: none;
	margin: 0;
	padding: 0;
}

.fpl-flyout-nav__item {
	display: block;
	position: relative;
	width: 100%;
}

.fpl-flyout-nav__link {
	align-items: center;
	border-bottom: 1px solid var(--color-border-menu-item);
	color: var(--color-nav-link);
	display: flex;
	font-family: var(--font-display);
	font-size: var(--fs-nav-mobile); /* 16px */
	font-weight: var(--fw-nav);
	justify-content: space-between;
	line-height: 1.4;
	padding: 14px 22px;
	text-decoration: none;
	width: 100%;
}

.fpl-flyout-nav__item--current > .fpl-flyout-nav__link,
.fpl-flyout-nav__link:hover,
.fpl-flyout-nav__link:focus-visible {
	color: var(--color-nav-link-hover);
}

/* A parent with a real destination keeps its link and gets a separate square
   toggle on the right, so "Shop All" is still tappable as a category. */
.fpl-flyout-nav__item--parent > .fpl-flyout-nav__link {
	padding-inline-end: 56px;
}

.fpl-flyout-nav__toggle {
	align-items: center;
	border-bottom: 1px solid var(--color-border-menu-item);
	color: var(--color-nav-link);
	display: flex;
	height: 51px; /* 14 + 22.4 + 14 + 1px rule = the link box */
	inset-inline-end: 0;
	justify-content: center;
	position: absolute;
	top: 0;
	width: 52px;
}

.fpl-flyout-nav__toggle--standalone {
	border-bottom: 1px solid var(--color-border-menu-item);
	height: auto;
	justify-content: space-between;
	padding: 14px 22px;
	position: static;
	width: 100%;
}

.fpl-flyout-nav__toggle .fpl-icon {
	transition: transform var(--dur-fast) var(--ease-base);
}

.fpl-flyout-nav__toggle[aria-expanded="true"] .fpl-icon {
	transform: rotate(180deg);
}

.fpl-flyout-nav__submenu {
	display: none;
}

.fpl-flyout-nav__toggle[aria-expanded="true"] ~ .fpl-flyout-nav__submenu {
	display: block;
}

.fpl-flyout-nav__sublink {
	border-bottom: 1px solid var(--color-border-menu-item);
	color: var(--color-text);
	display: block;
	font-family: var(--font-display);
	font-size: var(--fs-body);
	font-weight: var(--fw-body);
	line-height: 1.4;
	padding: 12px 22px 12px 40px;
	text-decoration: none;
}

.fpl-flyout-nav__sublink:hover,
.fpl-flyout-nav__sublink:focus-visible {
	color: var(--color-nav-link-hover);
}

.fpl-flyout__actions {
	padding: var(--space-6) 22px 0;
}

.fpl-flyout__account {
	align-items: center;
	color: var(--color-text);
	display: inline-flex;
	font-family: var(--font-display);
	font-size: var(--fs-nav-mobile);
	font-weight: var(--fw-kit-primary);
	gap: var(--space-3);
	text-decoration: none;
}

.fpl-flyout__account:hover,
.fpl-flyout__account:focus-visible {
	color: var(--color-link-hover);
}


/* ==========================================================================
   9. ≤1024px — the nav row collapses to a centred hamburger

   Production keeps logo, search and cart on row 1 here and drops the whole
   desktop nav bar in favour of Elementor's toggle, centred on its own row.
   Measured on home__tablet.png: logo ink x19–170, search box x202–565, cart
   x639–724, hamburger centred at x367–399 on the second row.

   One grid, two areas — the same single <button> moves. No duplicate toggle.
   ========================================================================== */

@media (max-width: 1024px) {

	.fpl-header__grid {
		grid-template-areas:
			"brand  search  actions"
			"toggle toggle  toggle";
	}

	.fpl-header__nav {
		display: none;
	}

	.fpl-menu-toggle {
		display: inline-flex;
		justify-self: center;
		margin-block: var(--space-3);
	}

	/* Production hides the account link from 1024 down — the label has nowhere
	   to go once the row tightens. The flyout carries it instead. */
	.fpl-account {
		display: none;
	}

	/* The fixed bottom bar (11-footer.css §7) paints over the last ~58px of
	   this panel: `.fpl-header { z-index:99 }` is a stacking context, so the
	   flyout's --z-flyout is capped inside it and cannot rise above the bar's
	   997. Production behaves identically — its panel is nested in HFE's
	   `#masthead { position:relative; z-index:99 }` the same way — so the fix
	   is not to fight the stack but to reserve the bar's height, which keeps
	   the last menu item tappable. The panel is white and so is the bar, so
	   nothing about this is visible. Matches the 65px reserved on <body>. */
	.fpl-flyout {
		padding-bottom: var(--space-12);
	}
}


/* ==========================================================================
   10. ≤767px — logo + hamburger only

   wp-custom-css on production: "Hide search, cart, account from header" and
   `.mobile-logo-row { flex-direction:row; justify-content:space-between;
   align-items:center; padding:8px 16px }` — applied to BOTH nested containers,
   which is where the 32px horizontal inset comes from.

   Measured on home__mobile.png: logo ink x45–264 (a 250px image), hamburger
   x312–344, header bottom y157.
   ========================================================================== */

@media (max-width: 767px) {

	.fpl-header__grid {
		grid-template-areas: "brand toggle";
		grid-template-columns: 1fr auto;
		padding: 16px 32px; /* the two nested .mobile-logo-row pads, summed */
	}

	/* Both are replaced by the fixed bottom bar — 11-footer.css §7. */
	.fpl-header__search,
	.fpl-header__actions {
		display: none;
	}

	.fpl-header__brand {
		padding: 0;
	}

	.fpl-header__brand img {
		max-width: 250px;
	}

	.fpl-menu-toggle {
		justify-self: end;
		margin-block: 0;
	}

	.fpl-announcement__inner {
		padding-inline: var(--space-5);
	}
}
/* ==========================================================================
   11 — FOOTER

   Replaces Header-Footer-Elementor template 635 (design-tokens.md §7.15).

   Numbers are either tokens, values lifted from the live inline Elementor CSS
   for template 635, or pixels measured off reference-screenshots/cart__*.png.
   The homepage screenshots stop before the footer — cart / tablet / mobile are
   the shots that actually contain it.

   DESKTOP GEOMETRY (1440px, cart__desktop.png):
     spacer                     50px
     columns section            padding 0 30px, container 1290 → x75–1365
       col 1 (logo)   33.33%    padding 0 15px 0 0   → content x75–490
       col 2 (shop)   33.33%    padding 0 15px       → content x520–920
       col 3 (support)33.33%    padding 0 15px       → content x950–1350
       heading                  14/22, 700, #000, ink at y808
       list item pitch          30px = 24px line box + 3px + 3px
     legal row                  rules at y1049 and y1114, 20px padding, centred
     disclaimer                 14/24, centred, full 1290 container
     copyright                  14/24, #888888, left, two lines
     payment strip              inc/trust-badges.php, styled in 70-integrations

   Background: none is declared anywhere on production, so the footer inherits
   the body's white. --color-footer-bg is set explicitly here so it survives a
   body-background change.
   ========================================================================== */

.fpl-footer {
	background-color: var(--color-footer-bg);
	color: var(--color-footer-text);
}

.fpl-footer__inner {
	margin-inline: auto;
	max-width: var(--container-max);
	width: 100%;
}

/* Elementor spacer #79d1b3e, --spacer-size: 50px. */
.fpl-footer__spacer {
	height: var(--space-10);
}


/* ==========================================================================
   1. LINK COLUMNS — section 47110b5
   ========================================================================== */

.fpl-footer__columns {
	margin-bottom: var(--space-8);
	padding-inline: var(--space-8);
}

.fpl-footer__columns .fpl-footer__inner {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

.fpl-footer__col {
	padding-inline: var(--space-5);
}

/* Column 1 is flush left — padding: 0 15px 0 0 on production. */
.fpl-footer__col--brand {
	padding-inline: 0 var(--space-5);
}

.fpl-footer__logo {
	display: block;
	line-height: 0;
	padding-bottom: var(--space-5); /* widget-container padding, f40b8d5 */
}

/* .hfe-site-logo-img is forced to 200px wide with !important on production.
   The mark itself is the square emblem, not the horizontal header lockup. */
.fpl-footer__logo-img {
	display: block;
	height: auto;
	max-width: 200px;
	width: 200px;
}

.fpl-footer__logo--text {
	color: var(--color-footer-heading);
	font-family: var(--font-display);
	font-size: var(--fs-h5);
	font-weight: var(--fw-kit-primary);
	line-height: 1.2;
	text-decoration: none;
}

.fpl-footer__heading {
	color: var(--color-footer-heading);            /* #000000 — measured */
	font-family: var(--font-display);
	font-size: var(--fs-kit-footer-heading);       /* 14px */
	font-weight: var(--fw-kit-footer-heading);     /* 700  */
	letter-spacing: normal;
	line-height: var(--lh-kit-footer-heading);     /* 22px */
	margin: 0 0 var(--space-5);
	text-transform: var(--tt-kit-footer-heading);  /* none — NOT uppercase */
}


/* ==========================================================================
   2. LINK LISTS — Elementor icon-list, item gap 6px
   ========================================================================== */

.fpl-footer__list {
	list-style: none;
	margin: 0;
	padding: 0;
}

.fpl-footer__list--plain .fpl-footer__list-item:not(:last-child),
.fpl-footer__list--icon .fpl-footer__list-item:not(:last-child) {
	padding-block-end: calc(var(--space-2) / 2); /* 3px */
}

.fpl-footer__list--plain .fpl-footer__list-item:not(:first-child),
.fpl-footer__list--icon .fpl-footer__list-item:not(:first-child) {
	margin-block-start: calc(var(--space-2) / 2); /* 3px → 30px pitch */
}

.fpl-footer__link {
	align-items: center;
	color: var(--color-footer-text);
	display: inline-flex;
	font-family: var(--font-display);
	font-size: var(--fs-body);
	font-weight: var(--fw-body);
	gap: var(--space-2);
	line-height: var(--lh-body);
	text-decoration: none;
	transition: color var(--dur-base) var(--ease-base);
}

.fpl-footer__link:hover,
.fpl-footer__link:focus-visible {
	color: var(--color-brand-hover); /* #182BA8 — primary_hover, not primary */
}

.fpl-footer__link-icon {
	color: var(--color-brand);
	display: inline-flex;
	flex: none;
	transition: color var(--dur-base) var(--ease-base);
}

.fpl-footer__link-icon .fpl-icon {
	display: block;
}


/* ==========================================================================
   3. LEGAL ROW — section 93b3d1c, column 47a3c60

   Rules top and bottom, 20px padding, links underlined, items separated by a
   1px 10px-tall bar in the inherited text colour.
   ========================================================================== */

.fpl-footer__legal {
	padding-inline: var(--space-8);
}

.fpl-footer__legal .fpl-footer__inner {
	align-items: center;
	border-block: 1px solid var(--color-border);
	display: flex;
	justify-content: center;
	padding-block: var(--space-6);
}

.fpl-footer__list--inline {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	margin-inline: calc(-1 * var(--space-5)); /* -30px/2 */
}

.fpl-footer__list--inline .fpl-footer__list-item {
	margin-inline: var(--space-5); /* 30px/2 */
	position: relative;
}

.fpl-footer__list--inline .fpl-footer__list-item:not(:last-child)::after {
	border-inline-start: 1px solid currentColor;
	content: "";
	height: 10px;
	inset-inline-end: calc(-1 * var(--space-5));
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
}

.fpl-footer__list--inline .fpl-footer__link {
	text-decoration: underline;
}


/* ==========================================================================
   4. COMPLIANCE DISCLAIMER — container 16c1ccd
   ========================================================================== */

.fpl-footer__disclaimer .fpl-footer__inner {
	text-align: center;
}

.fpl-footer__disclaimer p {
	color: var(--color-footer-text);
	font-family: var(--font-body);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

.fpl-footer__disclaimer p:last-child {
	margin-bottom: 0;
}

.fpl-footer__disclaimer b,
.fpl-footer__disclaimer strong {
	color: var(--color-text-strong);
	font-weight: 700;
}


/* ==========================================================================
   5. COPYRIGHT — section f187eec
   ========================================================================== */

.fpl-footer__copyright {
	padding: 35px var(--space-8) var(--space-9); /* 35 / 30 / 40 */
}

.fpl-footer__copyright-text {
	color: var(--color-text-muted); /* text_light #888888 */
	font-family: var(--font-body);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	max-width: 50%; /* production splits this row into two 50% columns */
}


/* ==========================================================================
   6. ≤767px

   Production: columns stack, headings and lists centre, section padding drops
   to 0 15px, the copyright centres and the inline gap halves to 20px.
   Verified on cart__mobile.png.
   ========================================================================== */

@media (max-width: 767px) {

	.fpl-footer__columns,
	.fpl-footer__legal,
	.fpl-footer__disclaimer {
		padding-inline: var(--space-5);
	}

	.fpl-footer__columns .fpl-footer__inner {
		grid-template-columns: 1fr;
	}

	.fpl-footer__col,
	.fpl-footer__col--brand {
		padding-block-end: var(--space-8);
		padding-inline: 0;
		text-align: center;
	}

	.fpl-footer__logo {
		display: flex;
		justify-content: center;
	}

	.fpl-footer__heading {
		text-align: center;
	}

	.fpl-footer__list--plain,
	.fpl-footer__list--icon {
		align-items: center;
		display: flex;
		flex-direction: column;
	}

	.fpl-footer__list--inline {
		margin-inline: calc(-1 * var(--space-3)); /* -20px/2 */
	}

	.fpl-footer__list--inline .fpl-footer__list-item {
		margin-inline: var(--space-3); /* 20px/2 */
	}

	.fpl-footer__list--inline .fpl-footer__list-item:not(:last-child)::after {
		inset-inline-end: calc(-1 * var(--space-3));
	}

	.fpl-footer__copyright {
		padding: var(--space-6) var(--space-5);
	}

	.fpl-footer__copyright-text {
		max-width: none;
		padding-bottom: 5px; /* 235bddd: padding 0 0 5px — no 5px token */
		text-align: center;
	}
}


/* ==========================================================================
   7. MOBILE BOTTOM BAR — HFE template 1381 + Elementor Pro snippet #9471

   Markup: template-parts/mobile-bar.php, hooked to `frontier_before_footer`.

   WHY IT EXISTS
   -------------
   10-header.css hides the header's search, account and cart below 767px,
   faithfully reproducing production's wp-custom-css. Production replaces them
   with this bar. design-tokens.md line 1288, on the full-cell tap target:
   "Keep it or the bar feels dead on mobile."

   FIVE CELLS: Shop · Account · Search · Wishlist · Cart.
   The HFE template server-renders four `elementor-col-25` columns; snippet
   #9471 clones the first into a fifth Cart cell at runtime and switches every
   column to 20%. The snippet's own comment measures the finished cell as
   "75x57" — and 375/5 = 75, which is the five-cell bar. The four cells in
   shop__mobile.png y941–999 are the template captured before the deferred
   snippet ran. Verified against the live DOM 2026-09-03; the full chain of
   evidence is in template-parts/mobile-bar.php.

   GEOMETRY, live inline CSS for element 2e0d055 plus the ≤767 wp-custom-css
   block, cross-checked against shop__mobile.png:
     section     position:fixed; width:100%; bottom:0; z-index:997
                 background #FFFFFF; border 1px solid #E8E8E8 (all four sides
                 at ≤1024 — x=0 and x=374 both read #E8E8E8 in the screenshot)
     cell        padding 10px 5px; 1px right border except the last
                 (dividers measured at x=93 / 187 / 280 on a 4-cell capture)
     icon        18 × 18   (rows 952–969)
     label       10px / 1.2, margin-top 4px, weight 700, #414042
                 (ink rows 978–986)
     bar height  58px  →  #colophon margin-bottom:65px on production
   Between 768 and 1024 Elementor's own values apply instead: 20px icon,
   14px/1em label with 0.5px tracking, 2px gap.

   TAP TARGETS. Production needs `.fpl-nav-hit::after { inset:0 }` because its
   cells are Elementor icon-boxes whose only clickable thing is an 18px glyph
   inside a 75 × 57 cell — about 14% of the visible area — and the "Make Column
   Clickable" plugin it expects is not installed. Here each cell IS a single
   <a>/<button> filling its grid track, so the whole cell is the target with no
   pseudo-element patch. Same behaviour, one less workaround.
   ========================================================================== */

:root {

	/* Elementor's own literal on section 2e0d055. No token exists: nothing
	   else in the theme sits at this level, and it is deliberately BELOW the
	   flyout and the age gate. */
	--fpl-bottom-bar-z: 997;

	/* snippet #9471: `.fpl-cart-count { background:#4557C9 }`. The header's
	   bubble is Elementor's red default instead — the two really are
	   different colours on production. */
	--fpl-bottom-bar-badge-bg: var(--color-brand);
}

/* The fixed shell. Height is auto and it is pinned to the bottom, so the
   search panel above the cells simply grows it upward. */
.fpl-mobile-bar {
	bottom: 0;
	display: none;
	inset-inline: 0;
	position: fixed;
	width: 100%;
	z-index: var(--fpl-bottom-bar-z);
}

/* The cell row. `border: 1px solid #E8E8E8` on all four sides is Elementor's
   own `border-width:1px 1px 1px 1px` at ≤1024 — the screenshot reads #E8E8E8
   at x=0 and x=374 as well as along the top. */
.fpl-mobile-bar__nav {
	background-color: var(--color-bg);
	border: var(--border-hairline);
}

.fpl-mobile-bar__list {
	display: grid;
	grid-auto-columns: 1fr;
	grid-auto-flow: column;
	list-style: none;
	margin: 0;
	padding: 0;
}

.fpl-mobile-bar__item {
	display: flex;
	min-width: 0;
}

.fpl-mobile-bar__item:not(:last-child) {
	border-inline-end: var(--border-hairline);
}

/* The whole cell is the tap target — see TAP TARGETS above. */
.fpl-mobile-bar__cell {
	align-items: center;
	background-color: transparent;
	border: 0;
	color: var(--color-nav-link);
	display: flex;
	flex-direction: column;
	font-family: var(--font-display);
	justify-content: center;
	min-width: 0;
	padding: var(--space-3) 5px; /* Elementor literal; no 5px token exists */
	text-align: center;
	text-decoration: none;
	transition: color var(--dur-base) var(--ease-base);
	width: 100%;
}

/* The Search cell is a <button>, so 00-base.css's -10° slab applies to it.
   Same opt-out as the header controls — 10-header.css §1.1. */
.fpl-mobile-bar__cell--search {
	border-radius: 0;
	clip-path: none;
	cursor: pointer;
	letter-spacing: normal;
	line-height: normal;
	text-transform: none;
	transform: none;
	z-index: auto;
}

.fpl-mobile-bar__cell--search::after,
.fpl-mobile-bar__cell--search::before {
	content: none;
	display: none;
}

.fpl-mobile-bar__cell:hover,
.fpl-mobile-bar__cell:focus-visible,
.fpl-mobile-bar__cell[aria-expanded="true"] {
	color: var(--color-nav-link-hover);
}

.fpl-mobile-bar__icon {
	display: inline-flex;
	line-height: 1;
	position: relative;
}

.fpl-mobile-bar__icon .fpl-icon {
	display: block;
	flex: none;
}

.fpl-mobile-bar__label {
	font-size: 10px;
	font-weight: var(--fw-nav); /* 700 */
	line-height: 1.2;
	margin-block-start: var(--space-1); /* 4px */
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* snippet #9471's bubble. Empty at zero, so `:empty` hides it — the element
   never leaves the DOM and the shared `span.fpl-cart-count` fragment can
   always find it. The rule mirrors 10-header.css §5.1 but in brand blue and
   at the offsets the snippet uses. */
.fpl-mobile-bar__icon .fpl-cart-count {
	align-items: center;
	background-color: var(--fpl-bottom-bar-badge-bg);
	border-radius: var(--radius-full);
	color: var(--color-text-on-brand);
	display: inline-flex;
	font-size: 10px;
	font-weight: var(--fw-kit-primary);
	height: 16px;
	inset-inline-end: -10px;
	justify-content: center;
	line-height: 1;
	min-width: 16px;
	padding: 0 var(--space-1);
	position: absolute;
	top: -6px;
}

.fpl-mobile-bar__icon .fpl-cart-count:empty {
	display: none;
}


/* --------------------------------------------------------------------------
   7.1 Search panel

   The header search is display:none at this width, so toggling it would just
   be a second dead end. This panel is the search. It sits flush on top of the
   bar and reuses the .fpl-search component from 10-header.css §4 unchanged.
   -------------------------------------------------------------------------- */

.fpl-mobile-search {
	background-color: var(--color-bg);
	border: var(--border-hairline);
	border-bottom: 0;
	padding: var(--space-4) var(--space-5);
}

/* Belt and braces: 00-base.css does not declare a `[hidden]` rule, and the
   .fpl-search inside sets display:flex, which would otherwise beat the UA
   sheet's `[hidden] { display:none }` if anything ever moved that class up. */
.fpl-mobile-search[hidden] {
	display: none;
}


/* --------------------------------------------------------------------------
   7.2 ≤1024px — the bar is live

   Production hides the section above 1024 with Elementor's
   `elementor-hidden-desktop elementor-hidden-laptop elementor-hidden-
   tablet_extra`, and pairs it with `@media(max-width:1024px){ #colophon
   { margin-bottom:65px } }` so the fixed bar cannot cover the end of the page.

   That 65px is applied here as `padding-block-end` on <body> instead of a
   margin on #colophon: identical pixels (the footer ground is the same white
   as the body), one rule, and it still clears the bar on any template that
   ever renders without a #colophon.
   -------------------------------------------------------------------------- */

@media (max-width: 1024px) {

	.fpl-mobile-bar {
		display: block;
	}

	/* 65px — the live `#colophon { margin-bottom: 65px }`, expressed on the
	   scroll container so nothing can ever sit under the fixed bar. */
	body {
		padding-block-end: var(--space-12);
	}

	/* Elementor's own bar metrics between 768 and 1024: 20px icon, 2px gap,
	   14px/1em label with 0.5px tracking. */
	.fpl-mobile-bar__label {
		font-size: 14px;
		letter-spacing: .5px;
		line-height: 1;
		margin-block-start: var(--space-2); /* 6px ≈ Elementor's 2px gap + leading */
	}

	.fpl-mobile-bar__icon .fpl-icon {
		height: 20px;
		width: 20px;
	}
}


/* --------------------------------------------------------------------------
   7.3 ≤767px — wp-custom-css shrinks it

   `.elementor-icon-box-icon svg { width:18px; height:18px }` and
   `.elementor-icon-box-title { font-size:10px; line-height:1.2;
   margin-top:4px }`, both !important on production.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {

	.fpl-mobile-bar__icon .fpl-icon {
		height: 18px;
		width: 18px;
	}

	.fpl-mobile-bar__label {
		font-size: 10px;
		letter-spacing: normal;
		line-height: 1.2;
		margin-block-start: var(--space-1); /* 4px */
	}
}
/* =============================================================================
   20 — PRODUCT ARCHIVES AND THE PRODUCT CARD
   /shop/, product categories, product tags, product search.

   Reference: design-tokens.md §4.1 (containers), §4.3 (product grid), §5
   (radii / borders), §7.0 (the skew), §7.3 (button variants), §7.4 (product
   card), §8 (traps). Geometry was re-derived from the production DOM and CSS on
   2026-09-03 and then measured pixel-for-pixel against
   reference-screenshots/shop__{desktop,tablet,mobile}.png and
   category-vials__desktop.png. Where the two disagreed the screenshot won; the
   three places that happened are flagged MEASURED below.

   Every colour resolves through _tokens.css, which is concatenated first.
   Concatenation order is filename order — this file lands after 00-base.css, so
   it can rely on source order instead of !important almost everywhere.
   ============================================================================= */


/* -----------------------------------------------------------------------------
   20.1  ARCHIVE COLUMNS

   Production floats a 300px sidebar to the LEFT of the grid (body class
   `nutritix-sidebar-left`) with a 30px gutter, and hides it below 1024px:

       .woocommerce-page .content-area { width: calc(100% - 330px) }   >=1024
       .woocommerce-page .widget-area  { width: 300px }                >=1024
       .nutritix-archive-product #secondary { display: none }          <=1023

   MEASURED at 1440px: .col-full is 1290px of content (75 -> 1365), the sidebar
   occupies 75 -> 375 and the grid column 405 -> 1365. Reproduced here with flex
   rather than floats for one reason: woocommerce/global/sidebar.php only emits
   #secondary when the widget area actually has widgets, and a flex row collapses
   to a full-width grid on its own when it does not. A float pair would leave a
   330px hole.
   -------------------------------------------------------------------------- */

@media (min-width: 1024px) {

	body.woocommerce-page.archive .site-content > .col-full,
	body.woocommerce-page.woocommerce-shop .site-content > .col-full,
	body.woocommerce-page.search .site-content > .col-full {
		align-items: flex-start;
		display: flex;
		flex-wrap: wrap;
	}

	body.woocommerce-page.archive .site-content > .col-full > #primary,
	body.woocommerce-page.woocommerce-shop .site-content > .col-full > #primary,
	body.woocommerce-page.search .site-content > .col-full > #primary {
		flex: 1 1 0;
		min-width: 0;
	}

	body.woocommerce-page.archive .site-content > .col-full > #secondary,
	body.woocommerce-page.woocommerce-shop .site-content > .col-full > #secondary,
	body.woocommerce-page.search .site-content > .col-full > #secondary {
		flex: 0 0 300px;
		margin-right: var(--space-8); /* 30px gutter */
		max-width: 300px;
		order: -1; /* sidebar left — production's `nutritix-sidebar-left` */
	}
}

/* The sidebar is desktop-only on product archives (§7.4 / theme rule at 1023). */
@media (max-width: 1023px) {

	body.woocommerce-page.archive #secondary,
	body.woocommerce-page.woocommerce-shop #secondary,
	body.woocommerce-page.search.woocommerce-page #secondary {
		display: none;
	}
}


/* -----------------------------------------------------------------------------
   20.2  ARCHIVE HEADER AND THE SPLIT CATEGORY DESCRIPTION

   /shop/ renders an empty <header>. A product category renders the INTRO half of
   its description here — and that intro is where the page's <h1> lives, because
   the description is authored with the heading as its first node. The BODY half
   is printed below the grid by fpl_category_description_body_styled() on
   `woocommerce_after_shop_loop` (inc/category-descriptions.php), already carrying
   its own inline styling.

   The heading therefore takes the global h1 scale (60px, dropping to 26px below
   767px) from 00-base.css — nothing to add here beyond the mobile clamp, which
   production keys to .woocommerce-products-header.
   -------------------------------------------------------------------------- */

.woocommerce-products-header {
	margin: 0;
}

.woocommerce-products-header:empty {
	display: none;
}

/* No bottom margin on the description itself — production leaves the gap to the
   intro paragraph's own `p { margin: 0 0 1em }`, and .nutritix-sorting adds no
   top margin. Anything else here would move the first row of cards. */
.woocommerce-products-header .term-description {
	margin-bottom: 0;
}

@media (max-width: 767px) {

	.woocommerce-products-header h1,
	.woocommerce-products-header .page-title,
	.woocommerce-products-header .term-description h1 {
		font-size: var(--fs-archive-title-mobile); /* 26px (§3.4) */
		line-height: 1.25;
	}
}


/* -----------------------------------------------------------------------------
   20.3  THE SHOP TOOLBAR  (.nutritix-sorting)

   One flex row holding, left to right on screen: the mobile "Filter by" toggle,
   the grid/list switch, the ordering <select>, and the result count pushed to the
   far right.

   DOM order is not screen order. WooCommerce prints the result count at priority
   20 and the ordering form at 30, so the count comes first in the markup;
   production re-ordered the callbacks. This rebuild leaves the stock priorities
   alone (so plugins hooking `woocommerce_before_shop_loop` behave predictably)
   and flips the two with flex `order` instead.
   -------------------------------------------------------------------------- */

.nutritix-sorting {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	margin-bottom: 14px;
}

.nutritix-sorting > * {
	margin-bottom: 0;
	margin-top: 0;
}

.nutritix-sorting .woocommerce-ordering {
	margin: 0;
	order: 1;
	position: relative;
}

.nutritix-sorting .woocommerce-result-count {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin: 0;
	order: 2;
}

/* The ordering control is a bare label on white — no border, chevron on the
   right, sized to its content from 768px up. */
.nutritix-sorting .woocommerce-ordering select {
	background-color: var(--color-bg);
	background-position: 100% center;
	background-size: 10px 10px;
	border: none;
	border-radius: var(--radius-0);
	color: var(--color-text);
	font-family: var(--font-display);
	font-size: var(--fs-body);
	padding: 0 18px 0 0;
	width: 100%;
}

@media (min-width: 768px) {

	.nutritix-sorting select {
		width: auto;
	}

	.nutritix-sorting .woocommerce-result-count {
		margin-left: auto;
	}
}

/* Below 768px the count drops to its own line under the controls, exactly as
   production wraps it. Forced rather than left to intrinsic sizing so the wrap
   point does not depend on how long a translated "Sort by ..." string is. */
@media (max-width: 767px) {

	.nutritix-sorting .woocommerce-ordering {
		flex: 1 1 auto;
		min-width: 0;
	}

	.nutritix-sorting .woocommerce-result-count {
		flex: 1 0 100%;
		margin-left: 0;
	}
}

/* --- "Filter by" (below 1024px only) ------------------------------------- */

.nutritix-sorting .filter-toggle {
	align-items: center;
	background: transparent;
	color: var(--color-text);
	display: inline-flex;
	margin-right: var(--space-8); /* 30px — MEASURED on shop__mobile.png */
	outline: none;
	text-align: center;
	text-decoration: none;
	transition: color var(--dur-fast) var(--ease-base);
}

.nutritix-sorting .filter-toggle:hover,
.nutritix-sorting .filter-toggle:focus-visible {
	color: var(--color-brand);
}

.nutritix-sorting .filter-toggle__icon {
	display: inline-flex;
	line-height: 0;
	margin-right: var(--space-3); /* 10px */
}

@media (min-width: 1024px) {

	.nutritix-sorting .filter-toggle {
		display: none;
	}
}

/* --- grid / list switch (1024px and up only) ----------------------------- */

.gridlist-toggle {
	display: inline-flex;
	margin-left: -8px; /* cancels the first link's padding so the icon sits flush */
	margin-right: var(--space-5); /* 15px */
}

.gridlist-toggle a {
	color: var(--color-text-muted);
	display: inline-block;
	font-size: 16px;
	line-height: 0;
	padding: 8px;
	transition: color var(--dur-fast) var(--ease-base);
}

.gridlist-toggle a.active,
.gridlist-toggle a:hover,
.gridlist-toggle a:focus-visible {
	color: var(--color-brand);
}

/* `desktop-hide-down` is the production theme's own utility (hidden at 1023px
   and below). Scoped to the toolbar here so this partial does not lay claim to
   a global utility class name. */
@media (max-width: 1023px) {

	.nutritix-sorting .desktop-hide-down {
		display: none;
	}
}

/* --- active layered-nav filters ------------------------------------------ */

.nutritix-active-filters {
	margin-bottom: 14px;
}

.nutritix-active-filters li {
	display: inline-block;
	margin-right: var(--space-3);
}

.nutritix-active-filters li a {
	border: var(--border-hairline);
	color: var(--color-text);
	display: inline-block;
	font-size: var(--fs-small);
	padding: 2px 10px;
}

.nutritix-active-filters li a:hover {
	border-color: var(--color-brand);
	color: var(--color-brand);
}


/* -----------------------------------------------------------------------------
   20.4  THE PRODUCT GRID  (§4.3)

   Production resolved to three overlapping systems (`ul.products.columns-N` from
   768px up, `nutritix-product-{laptop,tablet,mobile}-N` body classes at 1366 /
   768 / 500, and a wp-custom-css CSS-Grid override below 767). Folded here into
   the resolved outcome:

       >= 769px   3-up flex row
       == 768px   2-up flex row      (the tablet body class beat columns-3 on
                                      source order at exactly 768px)
       <= 767px   2-column CSS grid, 12px gap, 12px inline padding

   MEASURED gutters — this is the one place design-tokens.md §4.3 is wrong. It
   records `ul.products li` padding-inline as 10px from the child theme, but the
   child's selector (0,1,2) loses to the parent theme's `ul.products li.product`
   (0,2,2), so 5px is what ships. Card borders in the screenshots sit 10px apart
   at 1440 and at 768 (2 x 5px), and 22px apart at 375 (12px grid gap + 2 x 5px),
   which only works at 5px. Card widths land on 313 / 349 / 145px respectively.
   -------------------------------------------------------------------------- */

.woocommerce ul.products {
	clear: both;
	display: flex;
	flex-wrap: wrap;
	list-style: none;
	margin: 0 -5px;
	padding: 0;
}

.woocommerce ul.products::after {
	clear: both;
	content: "";
	display: block;
}

.woocommerce ul.products li.product {
	flex: 0 0 33.3333333333%;
	list-style: none;
	margin-bottom: var(--space-3); /* 10px */
	max-width: 33.3333333333%;
	padding-left: 5px;
	padding-right: 5px;
	width: 100%;
}

.woocommerce ul.products.columns-1 li.product {
	flex-basis: 100%;
	max-width: 100%;
}

.woocommerce ul.products.columns-2 li.product {
	flex-basis: 50%;
	max-width: 50%;
}

.woocommerce ul.products.columns-4 li.product {
	flex-basis: 25%;
	max-width: 25%;
}

/* 2-up at exactly 768px, matching the production tablet body class. */
@media (max-width: 768px) {

	.woocommerce ul.products li.product,
	.woocommerce ul.products.columns-1 li.product,
	.woocommerce ul.products.columns-3 li.product,
	.woocommerce ul.products.columns-4 li.product {
		flex-basis: 50%;
		max-width: 50%;
	}
}

/* Phones: a real 2-column grid. Production reached this with six !important
   rules fighting the flex layout; here the grid simply replaces it. */
@media (max-width: 767px) {

	.woocommerce ul.products {
		box-sizing: border-box;
		display: grid;
		gap: var(--space-grid-gap-mobile); /* 12px */
		grid-template-columns: 1fr 1fr;
		margin: 0;
		overflow: hidden;
		padding: 0 var(--space-grid-gap-mobile);
		width: 100%;
	}

	.woocommerce ul.products li.product,
	.woocommerce ul.products.columns-1 li.product,
	.woocommerce ul.products.columns-2 li.product,
	.woocommerce ul.products.columns-3 li.product,
	.woocommerce ul.products.columns-4 li.product {
		box-sizing: border-box;
		margin: 0;
		max-width: none;
		min-width: 0;
		width: 100%;
	}
}

/* Production also carried `.woocommerce, .woocommerce-page { overflow-x: hidden }`
   at this breakpoint to contain the grid it could not otherwise tame. It is not
   repeated here: the grid above cannot overflow (min-width:0 on the items,
   overflow:hidden on the list) and 00-base.css already guards the page with
   `.site { overflow-x: hidden }`. Putting overflow-x on the body element breaks
   position:sticky for every descendant, so it is worth not re-adding. */


/* -----------------------------------------------------------------------------
   20.5  THE CARD — PANEL, IMAGE, HOVER RAIL  (§7.4)

   .product-block is a #F6F6F6 panel with a 1px #F0F0F0 border and NO radius; the
   caption sitting inside it is white, which is what gives the card its two-tone
   look (grey behind the photo, white behind the text).
   -------------------------------------------------------------------------- */

.woocommerce ul.products li.product .product-block {
	background-color: var(--color-surface-card); /* #F6F6F6 */
	border: var(--border-card); /* 1px solid #F0F0F0 */
	border-radius: var(--radius-0);
	display: flex;
	flex-direction: column;
	height: 100%;
	overflow: hidden;
	position: relative;
	transition: all var(--dur-base) var(--ease-base);
}

/* Lifts the hovered card above its neighbours so the action rail is never
   clipped by the next card in the row. */
.woocommerce ul.products li.product .product-block:hover {
	z-index: 9;
}

.product-transition {
	position: relative;
}

.product-transition .product-image img {
	display: block;
	height: auto;
	margin: 0 auto;
	width: 100%;
}

/* Full-bleed overlay link. aria-hidden in the template — the title link carries
   the accessible name. */
.product-transition .woocommerce-loop-product__link {
	height: 100%;
	left: 0;
	position: absolute;
	top: 0;
	transition: all var(--dur-slow) ease-in-out;
	width: 100%;
	z-index: var(--z-card-link); /* 2 */
}

/* --- wishlist / compare / quick view rail -------------------------------- */

.product-transition .group-action {
	opacity: 0;
	position: absolute;
	transition: all ease-in-out var(--dur-base);
	visibility: hidden;
	z-index: var(--z-card-hover); /* 5 */
}

.product-transition .group-action.top {
	right: var(--space-6); /* 20px */
	top: var(--space-6);
}

.product-transition .group-action .shop-action {
	display: flex;
}

.product-transition .group-action .shop-action.vertical {
	align-items: flex-end;
	flex-direction: column;
}

.product-transition .group-action .shop-action.vertical > *:not(:last-child) {
	margin-bottom: var(--space-2); /* 6px */
}

.product-transition .group-action .shop-action > button,
.product-transition .group-action .shop-action > a {
	align-items: center;
	background-color: var(--color-bg);
	border: var(--border-hairline);
	border-radius: var(--radius-round);
	color: var(--color-text-strong);
	display: flex;
	font-size: 0;
	height: 38px;
	justify-content: center;
	letter-spacing: 0;
	padding: 0;
	transition: all ease-in-out var(--dur-base);
	width: 38px;
}

/* These are circles, not slabs — kill the inherited skewed button pseudo. */
.product-transition .group-action .shop-action > button::after,
.product-transition .group-action .shop-action > a::after {
	content: none;
}

.product-transition .group-action .shop-action > button::before,
.product-transition .group-action .shop-action > a::before {
	font-size: 12px;
	margin: 0;
}

.product-transition .group-action .shop-action > button:hover,
.product-transition .group-action .shop-action > button:focus,
.product-transition .group-action .shop-action > a:hover,
.product-transition .group-action .shop-action > a:focus {
	background-color: var(--color-text-strong);
	border-color: var(--color-text-strong);
	color: var(--color-text-on-brand);
}

.woocommerce ul.products li.product .product-block:hover .group-action {
	opacity: 1;
	visibility: visible;
}

/* Staggered reveal, 100 / 200 / 280ms (§7.4). */
@keyframes frontier-action-in {

	from {
		opacity: 0;
		transform: translate(20px, 0);
	}

	to {
		opacity: 1;
		transform: translate(0, 0);
	}
}

.woocommerce ul.products li.product .product-block:hover .shop-action.vertical > * {
	animation-duration: 250ms;
	animation-fill-mode: both;
	animation-name: frontier-action-in;
	backface-visibility: hidden;
}

.woocommerce ul.products li.product .product-block:hover .shop-action.vertical > *:nth-child(2) {
	animation-delay: 100ms;
}

.woocommerce ul.products li.product .product-block:hover .shop-action.vertical > *:nth-child(3) {
	animation-delay: 200ms;
}

.woocommerce ul.products li.product .product-block:hover .shop-action.vertical > *:nth-child(4) {
	animation-delay: 280ms;
}

@media (prefers-reduced-motion: reduce) {

	.woocommerce ul.products li.product .product-block:hover .shop-action.vertical > * {
		animation: none;
	}
}


/* -----------------------------------------------------------------------------
   20.6  THE CARD — CAPTION, TITLE, PRICE  (§7.4)

   White, centred, a flex column so the price and CTA sit on the baseline of the
   card no matter how long the title runs.
   -------------------------------------------------------------------------- */

.woocommerce ul.products li.product .product-caption {
	background-color: var(--color-surface-caption); /* #FFFFFF */
	display: flex;
	flex: 1;
	flex-direction: column;
	height: 100%;
	padding: var(--space-card-pad-sm); /* 13px 15px 25px */
	text-align: center;
}

@media (min-width: 1024px) {

	.woocommerce ul.products li.product .product-caption {
		padding: var(--space-card-pad); /* 13px 30px 25px */
	}
}

/* Category chips and the empty star row are both suppressed in production. The
   markup is still emitted (loop/rating.php, content-product.php) so switching
   either back on is a one-line change here rather than a template change. */
.woocommerce ul.products li.product .product-caption .posted-in,
.woocommerce ul.products li.product .product-caption .count-review {
	display: none;
}

/* --- title ---------------------------------------------------------------
   TRAP, and design-tokens.md §7.4 does not spell it out: the child theme paints
   the <h3> #1A2E4A, but the <a> inside it carries the theme's own link colour,
   so what a visitor actually sees is #414042. Sampled straight off
   shop__desktop.png: rgb(65,64,66). Both declarations are reproduced — change
   the anchor, not the heading, if the navy is ever meant to win.
   ---------------------------------------------------------------------- */

.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title {
	-webkit-box-orient: vertical;
	color: var(--color-text-card-title); /* #1A2E4A — overridden by the link below */
	display: -webkit-box;
	flex-grow: 1;
	font-family: var(--font-display);
	font-size: var(--fs-card-title); /* 18px */
	font-weight: var(--fw-card-title); /* 700 */
	-webkit-line-clamp: 2;
	line-clamp: 2;
	line-height: var(--lh-card-title); /* 1.4 -> 25.2px, two lines = 50.4px */
	margin: 0 0 var(--space-4); /* 12px */
	max-height: 52px;
	overflow: hidden;
}

.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title a {
	color: var(--color-link); /* #414042 — the colour that actually renders */
	text-decoration: none;
	transition: color var(--dur-fast) var(--ease-base);
}

.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title a:hover,
.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title a:focus-visible {
	color: var(--color-link-hover); /* #4557C9 */
}

/* --- price ---------------------------------------------------------------
   16px / 300 / brand blue, centred, pinned to the bottom of the caption by the
   auto top margin. The child theme sets text-align:left and wp-custom-css then
   forces centre; only the resolved value is kept.
   ---------------------------------------------------------------------- */

.woocommerce ul.products li.product .product-caption .price {
	color: var(--color-text-price); /* #4557C9 */
	display: block;
	font-size: var(--fs-card-price); /* 16px */
	font-weight: var(--fw-card-price); /* 300 */
	line-height: 1.375;
	margin: auto 0 0;
	text-align: center;
}

/* Struck-through and discounted figures. Production ran three near-identical
   patches (fpl-loop-price-color, fpl-woo-grid-price-color, fpl-hfe-price-color)
   because Elementor, UAE/HFE and core WooCommerce each wrapped prices
   differently (§2.4, trap §8.6). With one renderer there is one rule. */
.woocommerce ul.products li.product .product-caption .price del,
.woocommerce ul.products li.product .product-caption .price ins {
	font-size: 18px;
	font-weight: 500;
}

.woocommerce ul.products li.product .product-caption .price del {
	color: var(--color-text-price);
	opacity: 0.55;
}

.woocommerce ul.products li.product .product-caption .price ins {
	color: var(--color-text-price);
	text-decoration: none;
}


/* -----------------------------------------------------------------------------
   20.7  THE CARD — "VIEW PRODUCT" CTA  (§7.3, "Card CTA")

   A black skewed slab. The mechanics come from 00-base.css: the element is
   transparent with `z-index: 1`, and its ::after paints a skewX(-10deg)
   scaleX(.955) slab at z-index -1, which the stacking context traps ABOVE the
   element background and BELOW the text (trap §8.5 — remove the z-index and the
   button turns white-on-white).

   What is card-specific: 14px instead of 11px, weight 800, 0.5px tracking, 4px
   radius (the slab keeps 3px), 12px/20px padding, a 100px floor, and a white
   element background so the sliver around the slab reads as card, not page.

   The auto side margins are load-bearing. .product-caption is a column flex
   container, so a stretched item would run the full caption width; auto cross
   margins suppress `stretch` and shrink the button to its text. MEASURED: 55px
   tall, ~144px wide on shop__desktop.png.
   -------------------------------------------------------------------------- */

.woocommerce ul.products li.product .product-caption a.button,
.woocommerce ul.products li.product .product-caption a.button.add_to_cart_button {
	background-color: var(--color-bg);
	border: none;
	border-radius: var(--radius-md); /* 4px — the slab under it keeps 3px */
	color: var(--color-text-on-brand);
	cursor: pointer;
	display: inline-block;
	font-family: var(--font-display);
	font-size: var(--fs-button-card); /* 14px */
	font-weight: var(--fw-kit-accent); /* 800 */
	letter-spacing: var(--ls-button-card); /* .5px */
	line-height: var(--lh-button); /* 2.1818… */
	margin: var(--space-3) auto 0; /* 10px auto 0 */
	min-width: 100px;
	padding: 12px 20px;
	position: relative;
	text-align: center;
	text-decoration: none;
	text-transform: uppercase;
	width: auto;
	z-index: var(--z-badge); /* 1 — creates the slab's stacking context */
}

/* The slab itself — `.button::after`, its skew, its 3px radius and its hover
   flip to brand blue — is already defined once in 00-base.css §"the skew" and
   is inherited here unchanged. Only the focus state is added, so keyboard users
   get the same feedback as the mouse hover. */
.woocommerce ul.products li.product .product-caption a.button:focus-visible::after {
	background-color: var(--color-brand);
}

/* AJAX add-to-cart is not used anywhere on this store; the "View cart" link Woo
   appends after a successful add would be an orphan if it ever appeared. */
.woocommerce ul.products li.product .added_to_cart {
	display: none;
}


/* --- phones (<= 767px) ----------------------------------------------------
   The complete set of production's mobile card patches (§3.4). Same selectors,
   same specificity, so source order alone decides them.
   ---------------------------------------------------------------------- */

@media (max-width: 767px) {

	.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title {
		font-size: var(--fs-card-title-mobile); /* 13px */
	}

	.woocommerce ul.products li.product .product-caption .price {
		font-size: var(--fs-card-price-mobile); /* 13px */
	}

	.woocommerce ul.products li.product .product-caption a.button,
	.woocommerce ul.products li.product .product-caption a.button.add_to_cart_button {
		font-size: var(--fs-button-card-mobile); /* 12px */
		padding: 10px 12px;
		white-space: nowrap;
	}

	/* ---------------------------------------------------------------------
	   MERCHANDISING RULE — NOT A STYLING ACCIDENT. See woocommerce/loop/price.php
	   for the long version.

	   As soon as anything is in the cart, Woo Discount Rules re-renders every
	   card price as <del>original</del><ins>discounted</ins>. On a card whose
	   price box is 113px wide (MEASURED: 375px viewport -> 145px card -> 143px
	   inside the border -> 113px inside the 15px caption padding) that wrapped
	   to between two and four ragged lines. Production's answer, shipped
	   2026-08-14 after a UX audit, is to show the regular price only: hide the
	   discounted figure, hide the <br> the plugin injects, and de-strike the
	   original so it reads as the price rather than as a crossed-out one.

	   Three things this rule depends on, all still true on 2026-09-03:
	     - It is phone-only. Desktop and tablet cards DO show del/ins, and the
	       product page, cart and checkout are deliberately untouched — the
	       saving is still merchandised where it converts. That asymmetry is why
	       this cannot move into PHP: the server cannot know the viewport.
	     - ZERO of the 44 products carry a real WooCommerce sale price, so
	       del/ins on a card can only have come from the discount plugin. Put a
	       product on a genuine sale and this would hide its sale price here.
	       Delete this block on the day that changes.
	     - White-space stays `normal`, deliberately. A range like
	       "$44.99 – $89.99" needs ~133px and the box is 113px, so nowrap made
	       ranges overflow the card edge; wrapping to two lines is fine once the
	       discounted figure is gone.

	   Production needed `.price.price.price` (0,4,2) to outrank Elementor and
	   UAE rules forcing line-through with !important at (0,3,3). Those
	   stylesheets are gone, so a single selector is enough.
	   --------------------------------------------------------------------- */

	.woocommerce ul.products li.product .product-caption .price ins,
	.woocommerce ul.products li.product .product-caption .price br {
		display: none;
	}

	.woocommerce ul.products li.product .product-caption .price del,
	.woocommerce ul.products li.product .product-caption .price del * {
		color: inherit;
		font-size: inherit;
		font-weight: inherit;
		opacity: 1;
		text-decoration: none;
	}

	.woocommerce ul.products li.product .product-caption .price {
		white-space: normal;
	}
}


/* -----------------------------------------------------------------------------
   20.8  BADGES  (§7.4, §7.12, §5.1)

   Nothing is on sale today — 0 of 44 products — so .onsale has never been seen
   rendering in production. It is reproduced from the CSS: a 10px/14px white
   label on a #3E62E1 slab skewed to the same -10deg as every button, pinned
   10px from the top-left of the image. .stock-label is the same geometry in
   black, and drops to top:40px when a sale badge is already occupying 10px.
   -------------------------------------------------------------------------- */

.woocommerce ul.products li.product .onsale,
.woocommerce ul.products li.product .stock-label {
	color: var(--color-text-on-brand);
	display: inline-block;
	font-size: 10px;
	font-weight: 600;
	left: var(--space-3); /* 10px */
	line-height: 14px;
	padding: 2px 7px;
	position: absolute;
	top: var(--space-3);
	z-index: var(--z-badge);
}

.woocommerce ul.products li.product .onsale::after,
.woocommerce ul.products li.product .stock-label::after {
	border-radius: var(--radius-sm); /* 3px */
	content: "";
	height: 100%;
	left: 0;
	position: absolute;
	top: 0;
	transform: skewX(var(--skew-angle));
	width: 100%;
	z-index: -1;
}

.woocommerce ul.products li.product .onsale::after {
	background-color: var(--color-sale-badge); /* #3E62E1 */
}

.woocommerce ul.products li.product .stock-label::after {
	background-color: var(--color-stock-badge); /* #000000 */
}

/* Production expressed the offset as `.onsale + .stock-label`. The sale badge is
   printed inside .product-image by WooCommerce's own hook, so the two are not
   siblings here; content-product.php adds the modifier instead. Both selectors
   are kept so third-party markup that does place them adjacently still works. */
.woocommerce ul.products li.product .onsale + .stock-label,
.woocommerce ul.products li.product .stock-label--offset {
	left: var(--space-3);
	top: 40px;
}


/* -----------------------------------------------------------------------------
   20.9  PAGINATION  (§5.3)

   40x40 hairline cells, 10px apart, muted numerals, inverted to #414042 on the
   current page and on hover. The prev/next glyphs used to come from the
   `nutritix-icon` font; loop/pagination.php now emits inline SVG chevrons at the
   10px the icon rule gave them.
   -------------------------------------------------------------------------- */

.woocommerce-pagination {
	clear: both;
	margin-top: var(--space-8); /* 30px */
}

.woocommerce-pagination .page-numbers {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	list-style: none;
	margin: 0;
	padding: 0;
}

.woocommerce-pagination .page-numbers li {
	display: inline-block;
	margin-right: var(--space-3); /* 10px */
}

.woocommerce-pagination .page-numbers li:last-child {
	margin-right: 0;
}

.woocommerce-pagination .page-numbers li .page-numbers {
	align-items: center;
	background-color: var(--color-bg);
	border: var(--border-hairline);
	color: var(--color-text-muted);
	display: inline-flex;
	font-size: var(--fs-body);
	font-weight: 400;
	height: 40px;
	justify-content: center;
	text-decoration: none;
	transition: all var(--dur-fast) var(--ease-base);
	width: 40px;
}

.woocommerce-pagination .page-numbers li .page-numbers.current,
.woocommerce-pagination .page-numbers li .page-numbers:hover,
.woocommerce-pagination .page-numbers li .page-numbers:focus-visible {
	background-color: var(--color-text-strong); /* #414042 */
	border-color: var(--color-text-strong);
	color: var(--color-text-on-brand);
}

.woocommerce-pagination .page-numbers__arrow {
	display: block;
	height: 10px;
	width: 10px;
}


/* -----------------------------------------------------------------------------
   20.10  EMPTY ARCHIVE

   An empty category still prints its description body underneath, because
   fpl_category_description_body_styled() is hooked to
   `woocommerce_no_products_found` as well as `woocommerce_after_shop_loop`.
   -------------------------------------------------------------------------- */

.woocommerce-no-products-found .woocommerce-info {
	margin-bottom: var(--space-8);
}


/* -----------------------------------------------------------------------------
   20.11  LIST VIEW  (?layout=list)

   The grid/list switch in the toolbar is a live control with a live URL, so the
   layout it links to has to exist. Production drops the `products` class
   entirely in this mode (`ul.nutritix-products.products-list`), which is what
   switches every rule above off; the card loses .product-block and lays the
   image beside the caption from 768px up.
   -------------------------------------------------------------------------- */

.woocommerce ul.products-list {
	list-style: none;
	margin: 0;
	padding: 0;
}

.woocommerce ul.products-list li.product-list {
	align-items: center;
	background-color: var(--color-surface-light); /* #F4F4F4 */
	display: flex;
	margin-bottom: var(--space-3);
	position: relative;
}

.woocommerce ul.products-list li.product-list .product-transition {
	overflow: hidden;
	position: relative;
	width: 100%;
}

.woocommerce ul.products-list li.product-list .product-image img {
	object-fit: cover;
	width: 100%;
}

.woocommerce ul.products-list li.product-list .product-caption {
	flex: 1;
	padding: var(--space-8); /* 30px */
	text-align: left;
}

.woocommerce ul.products-list li.product-list .posted-in,
.woocommerce ul.products-list li.product-list .count-review {
	display: none;
}

.woocommerce ul.products-list li.product-list .woocommerce-loop-product__title {
	-webkit-box-orient: vertical;
	display: -webkit-box;
	font-size: var(--fs-card-title); /* 18px */
	font-weight: 600;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	line-height: 1.4444444444;
	margin: 0 0 var(--space-1); /* 4px */
	overflow: hidden;
}

.woocommerce ul.products-list li.product-list .woocommerce-loop-product__title a {
	color: var(--color-link);
	text-decoration: none;
}

.woocommerce ul.products-list li.product-list .woocommerce-loop-product__title a:hover {
	color: var(--color-link-hover);
}

.woocommerce ul.products-list li.product-list .price {
	align-items: center;
	color: var(--color-text-price);
	display: flex;
	flex-wrap: wrap;
	font-size: var(--fs-card-price);
	font-weight: 400;
	justify-content: flex-start;
	line-height: 1.375;
	margin-bottom: var(--space-5); /* 15px */
}

.woocommerce ul.products-list li.product-list .price del {
	color: var(--color-text-price);
	font-size: 14px;
	margin-right: 0.327em;
	opacity: 0.55;
}

.woocommerce ul.products-list li.product-list .price ins {
	color: var(--color-text-price);
	font-weight: 400;
	margin-right: 0;
	text-decoration: none;
}

.woocommerce ul.products-list li.product-list .button {
	background-color: transparent;
	color: var(--color-text-on-brand);
	display: inline-block;
	font-size: var(--fs-button);
	font-weight: var(--fw-button);
	letter-spacing: var(--ls-button);
	line-height: 24px;
	margin-right: var(--space-8);
	padding: 12px 32px;
	position: relative;
	text-transform: uppercase;
	z-index: var(--z-badge);
}

.woocommerce ul.products-list li.product-list .button::after {
	background-color: var(--color-text-strong);
}

.woocommerce ul.products-list li.product-list .button:hover::after {
	background-color: var(--color-brand);
}

.woocommerce ul.products-list li.product-list .group-action {
	align-items: center;
	display: inline-flex;
}

.woocommerce ul.products-list li.product-list .group-action .shop-action {
	align-items: center;
	display: flex;
}

.woocommerce ul.products-list li.product-list .group-action .shop-action > * {
	background-color: transparent;
	color: var(--color-text-muted);
	font-size: 0;
	letter-spacing: 0;
	margin-right: var(--space-6);
	padding: 0;
}

.woocommerce ul.products-list li.product-list .group-action .shop-action > *::after {
	content: none;
}

.woocommerce ul.products-list li.product-list .group-action .shop-action > *::before {
	font-size: 16px;
}

.woocommerce ul.products-list li.product-list .group-action .shop-action > *:last-child {
	margin-right: 0;
}

@media (min-width: 768px) {

	.woocommerce ul.products-list li.product-list .product-transition {
		margin: 0 var(--space-8) 0 0;
		max-width: calc(100% - 320px);
		width: 320px;
	}

	.woocommerce ul.products-list li.product-list .product-caption {
		max-width: calc(100% - 330px);
		padding: var(--space-8) var(--space-8) var(--space-8) 0;
	}
}

@media (max-width: 767px) {

	.woocommerce ul.products-list li.product-list {
		flex-wrap: wrap;
	}
}


/* -----------------------------------------------------------------------------
   20.12  SIDEBAR WIDGETS  (#secondary, and the same widgets in the filter drawer)

   No widget area was registered anywhere in the theme, so #secondary was never
   emitted and none of this had anything to style. inc/setup.php now registers
   `shop-sidebar`, `sidebar-1` and `shop-filter`; §20.1 above already lays the
   300px column out.

   MEASURED against reference-screenshots/shop__desktop.png at 1440px, and
   cross-checked against the production rules extracted from
   themes/nutritix/style.css and .../assets/css/woocommerce/woocommerce.css:

       sidebar column        x =  75 -> 375                       (300px)
       widget title ink      y = 265 -> 287                       (24px/1.333)
       title rule            y = 304 -> 307, x = 74 -> 374         (4px, skewed)
       category rows         pitch 47px, hairlines at y = 370/417/464
       last category row     no hairline
       Popular Products      title y = 566, rule y = 605 -> 608
       product thumbnail     110px box at x = 75; title starts x = 206 (20px gap)

   Scoped to #secondary and .nutritix-canvas-filter rather than written against a
   bare `.widget`, because those are the only two containers in this theme that
   render WP widgets (verified: the only dynamic_sidebar() calls are sidebar.php,
   woocommerce/global/sidebar.php and the drawer in archive-product.php). A bare
   `.widget-title` rule here would also outrank 11-footer.css, which concatenates
   earlier.
   -------------------------------------------------------------------------- */

#secondary .widget,
.nutritix-canvas-filter .widget {
	margin-bottom: var(--space-10); /* 50px */
}

#secondary .widget:last-child,
.nutritix-canvas-filter .widget:last-child {
	margin-bottom: 0;
}

/* --- widget title + its skewed rule and brand chevron -------------------- */

#secondary .widget-title,
#secondary .widgettitle,
#secondary .wp-block-group__inner-container > h2,
.nutritix-canvas-filter .widget-title,
.nutritix-canvas-filter .widgettitle,
.nutritix-canvas-filter .wp-block-group__inner-container > h2 {
	align-items: center;
	color: var(--color-text-strong);
	display: flex;
	font-family: var(--font-display);
	font-size: var(--fs-h4); /* 24px */
	font-weight: 500;
	line-height: 1.3333333333;
	margin: 0 0 var(--space-8); /* 30px */
	padding-bottom: 16px;
	position: relative;
}

/*
 * The rule under the title is the theme's signature -20deg slab, not a border —
 * a border would have square ends. 4px tall, full column width. Both ends slant,
 * which is what the screenshot shows.
 */
#secondary .widget-title::before,
#secondary .widgettitle::before,
#secondary .wp-block-group__inner-container > h2::before,
.nutritix-canvas-filter .widget-title::before,
.nutritix-canvas-filter .widgettitle::before,
.nutritix-canvas-filter .wp-block-group__inner-container > h2::before {
	background-color: var(--color-text-strong);
	bottom: 0;
	content: "";
	height: 4px;
	left: 0;
	position: absolute;
	transform: skewX(-20deg);
	width: 100%;
}

/*
 * Production closed the title with `<i class="nutritix-icon-arrow-right">`.
 * That font is dropped, so inc/setup.php's `after_title` emits the same inline
 * SVG chevron loop/pagination.php uses. Production sized the glyph at 18px with
 * a 10px gap; the SVG's path occupies 40–75% of its box, so a 12px box puts the
 * visible chevron where the screenshot has it (x = 301 at 1440px).
 */
#secondary .widget-title__chevron,
.nutritix-canvas-filter .widget-title__chevron {
	color: var(--color-brand);
	flex: none;
	margin-left: var(--space-3); /* 10px */
}

/* --- Product Categories (widget_product_categories) ---------------------- */

#secondary .product-categories,
.nutritix-canvas-filter .product-categories {
	list-style: none;
	margin: 0;
	padding: 0;
}

#secondary .product-categories .cat-item,
.nutritix-canvas-filter .product-categories .cat-item {
	border-bottom: var(--border-hairline);
	line-height: 1.41575;
	margin: 0 0 1em; /* 14px — production's `margin-bottom: 1em` */
	padding: 0 0 var(--space-4) 17px; /* 12px under, 17px clear of the bullet */
	position: relative;
}

/*
 * The last row drops its hairline and its margin but KEEPS its 12px padding.
 * MEASURED: on shop__desktop.png the third hairline sits at y = 464 and the
 * Popular Products rule at y = 605 — 141px apart. Zeroing the padding here as
 * well closes that to 129px and pulls the second widget up by the missing 12px.
 */
#secondary .product-categories .cat-item:last-child,
.nutritix-canvas-filter .product-categories .cat-item:last-child {
	border-bottom: 0;
	margin-bottom: 0;
}

/*
 * Production hides the default "Uncategorized" term from the widget with
 * `.widget_product_categories .cat-item:has(a[href*="uncategorized"])`. Ported
 * verbatim, because the WooCommerce widget's walker emits `cat-item-{term_id}`
 * — never a slug — so the child theme's companion `.cat-item-uncategorized`
 * selector matches nothing and this :has() rule is the half doing the work.
 * The drawer's fallback list excludes the term in the query instead.
 */
#secondary .widget_product_categories .cat-item:has(> a[href*="uncategorized"]),
.nutritix-canvas-filter .widget_product_categories .cat-item:has(> a[href*="uncategorized"]) {
	display: none;
}

/* Nested children indent but keep the same row treatment. */
#secondary .product-categories .children,
.nutritix-canvas-filter .product-categories .children {
	list-style: none;
	margin: 1em 0 0;
	padding-left: 17px;
}

/* The row marker is a 7x5 skewed slab, not a disc — same -20deg as everything. */
#secondary .product-categories .cat-item::before,
.nutritix-canvas-filter .product-categories .cat-item::before {
	background-color: var(--color-divider-dot); /* #CCCCCC */
	content: "";
	height: 5px;
	left: 0;
	position: absolute;
	top: 0.62em;
	transform: skewX(-20deg);
	width: 7px;
}

#secondary .product-categories .cat-item > a,
.nutritix-canvas-filter .product-categories .cat-item > a {
	color: var(--color-text-muted);
	font-weight: 600;
	text-decoration: none;
}

#secondary .product-categories .cat-item > a:hover,
#secondary .product-categories .cat-item > a:focus-visible,
#secondary .product-categories .current-cat > a,
.nutritix-canvas-filter .product-categories .cat-item > a:hover,
.nutritix-canvas-filter .product-categories .cat-item > a:focus-visible,
.nutritix-canvas-filter .product-categories .current-cat > a {
	color: var(--color-brand);
}

#secondary .product-categories .count,
.nutritix-canvas-filter .product-categories .count {
	color: var(--color-text-muted);
	font-weight: 400;
	margin-left: var(--space-1); /* 4px */
}

/* --- Popular Products (widget_products, ul.product_list_widget) ---------- */

#secondary .product_list_widget,
.nutritix-canvas-filter .product_list_widget {
	list-style: none;
	margin: 0;
	padding: 0;
}

/*
 * WooCommerce core's content-widget-product.php emits, as siblings of the <li>:
 *
 *     <a href>{img}<span class="product-title">Name</span></a>
 *     <div class="star-rating">…</div>          (only when a rating exists)
 *     <span class="amount">$54.99</span>        (two of them on a price range)
 *
 * so the row cannot be a plain two-column flex — the thumbnail and the title
 * live inside the same anchor. Lifting the image out of flow solves it: the
 * anchor collapses to the title alone, the <li> keeps a 130px left gutter for
 * the absolutely-positioned thumbnail, and the remaining children wrap into the
 * right column. A price RANGE still flows on one line, because only the title
 * and the rating claim a full row.
 */
#secondary .product_list_widget li,
.nutritix-canvas-filter .product_list_widget li {
	align-content: center;
	align-items: center;
	/*
	 * content-box, against 00-base's global border-box. Production's row is a
	 * 110px image in normal flow inside `padding: 5px 0`, so the row measures
	 * 120px and consecutive thumbnails sit 120px apart — MEASURED on
	 * shop__desktop.png, thumbnails at y = 649 and y = 889 with one row between.
	 * Under border-box the same min-height would swallow the padding and the
	 * pitch would collapse to 110px.
	 */
	box-sizing: content-box;
	column-gap: 0.3em;
	display: flex;
	flex-wrap: wrap;
	justify-content: flex-start;
	margin: 0;
	min-height: 110px;
	padding: 5px 0 5px 130px; /* 110px thumbnail + 20px gutter */
	position: relative;
}

#secondary .product_list_widget li:first-child,
.nutritix-canvas-filter .product_list_widget li:first-child {
	padding-top: 0;
}

#secondary .product_list_widget li:last-child,
.nutritix-canvas-filter .product_list_widget li:last-child {
	padding-bottom: 0;
}

/*
 * Pinned to the top of the CONTENT box, not centred. An absolutely-positioned
 * box is placed against the padding box, so `top` has to repeat the row's own
 * padding-top for the thumbnail to land where production's in-flow image does.
 * Centring instead costs 2.5px on the first and last rows — enough to drop the
 * thumbnail pitch from 120px to 117.5px, against a MEASURED 120px on
 * shop__desktop.png (thumbnails at y = 649 and y = 889, one row between).
 */
#secondary .product_list_widget li img,
.nutritix-canvas-filter .product_list_widget li img {
	height: auto;
	left: 0;
	position: absolute;
	top: 5px;
	width: 110px;
}

#secondary .product_list_widget li:first-child img,
.nutritix-canvas-filter .product_list_widget li:first-child img {
	top: 0;
}

#secondary .product_list_widget li > a,
.nutritix-canvas-filter .product_list_widget li > a {
	color: var(--color-text-strong);
	flex: 0 0 100%;
	font-size: var(--fs-body); /* 14px */
	font-weight: 600;
	line-height: 22px;
	margin-bottom: var(--space-3); /* 10px */
	text-decoration: none;
}

#secondary .product_list_widget li > a:hover,
#secondary .product_list_widget li > a:focus-visible,
.nutritix-canvas-filter .product_list_widget li > a:hover,
.nutritix-canvas-filter .product_list_widget li > a:focus-visible {
	color: var(--color-brand);
}

#secondary .product_list_widget .product-title,
.nutritix-canvas-filter .product_list_widget .product-title {
	-webkit-box-orient: vertical;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	overflow: hidden;
}

/*
 * Star row. The glyph itself is 30-pdp.css §30.x — it deliberately styles
 * `.star-rating` unscoped and names this widget as one of its consumers, so
 * nothing here redraws a star. All that is needed is the row it sits in:
 * production's `.count-review` (an 11px muted flex row, stars then "(N)"),
 * which inc/setup.php restores for zero-review products.
 */
#secondary .count-review,
.nutritix-canvas-filter .count-review {
	align-items: center;
	color: var(--color-text-muted);
	display: flex;
	flex: 0 0 100%;
	font-size: 11px;
	margin-bottom: 5px;
}

#secondary .count-review .star-rating,
.nutritix-canvas-filter .count-review .star-rating {
	margin-right: 6px;
}

/* A bare .star-rating (no .count-review wrapper) still claims its own row. */
#secondary .product_list_widget > li > .star-rating,
.nutritix-canvas-filter .product_list_widget > li > .star-rating {
	flex: 0 0 100%;
	margin-bottom: 5px;
}

/*
 * Price. --color-text-strong, NOT --color-text-price: production's
 * `.product_list_widget .price { color: var(--accent) }` puts the widget price
 * in the body ink, unlike every other price on the store. Sampled #414042 at
 * (210,721) on shop__desktop.png.
 */
#secondary .product_list_widget .price,
#secondary .product_list_widget li > .amount,
#secondary .product_list_widget .price .amount,
.nutritix-canvas-filter .product_list_widget .price,
.nutritix-canvas-filter .product_list_widget li > .amount,
.nutritix-canvas-filter .product_list_widget .price .amount {
	color: var(--color-text-strong);
	font-size: var(--fs-card-price); /* 16px */
	font-weight: 400;
	line-height: 1.375;
}

#secondary .product_list_widget del,
.nutritix-canvas-filter .product_list_widget del {
	color: var(--color-text-muted);
	font-size: var(--fs-body);
	margin-right: 0.327em;
}

#secondary .product_list_widget ins,
.nutritix-canvas-filter .product_list_widget ins {
	color: var(--color-brand);
	text-decoration: none;
}

/* --- product / post search widget ---------------------------------------- */

#secondary,
.nutritix-canvas-filter {
	/* Magnifier for the search widget. No braces and no # — safe to concatenate. */
	--fpl-widget-search-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M8.5 2a6.5 6.5 0 1 0 4.02 11.61l4.44 4.43 1.06-1.06-4.43-4.44A6.5 6.5 0 0 0 8.5 2zm0 1.5a5 5 0 1 1 0 10 5 5 0 0 1 0-10z'/%3E%3C/svg%3E");
}

#secondary .widget_search form,
#secondary .widget_product_search form,
.nutritix-canvas-filter .widget_search form,
.nutritix-canvas-filter .widget_product_search form {
	margin-bottom: 0;
	position: relative;
}

#secondary .widget_search .search-field,
#secondary .widget_search input[type="search"],
#secondary .widget_product_search .search-field,
#secondary .widget_product_search input[type="search"],
.nutritix-canvas-filter .widget_search .search-field,
.nutritix-canvas-filter .widget_search input[type="search"],
.nutritix-canvas-filter .widget_product_search .search-field,
.nutritix-canvas-filter .widget_product_search input[type="search"] {
	border-radius: 0;
	border-width: 0 0 1px;
	color: var(--color-text-strong);
	line-height: 1;
	padding: var(--space-4) 55px var(--space-4) 0;
	width: 100%;
}

#secondary .widget_search .search-field:focus,
#secondary .widget_product_search .search-field:focus,
.nutritix-canvas-filter .widget_search .search-field:focus,
.nutritix-canvas-filter .widget_product_search .search-field:focus {
	border-color: var(--color-brand);
}

#secondary .widget_search .search-field::placeholder,
#secondary .widget_product_search .search-field::placeholder,
.nutritix-canvas-filter .widget_search .search-field::placeholder,
.nutritix-canvas-filter .widget_product_search .search-field::placeholder {
	color: var(--color-text-strong);
	font-size: var(--fs-small); /* 12px */
	font-weight: 400;
	line-height: 22px;
}

/*
 * Production hides the submit label and paints a magnifier over it from the
 * icon font. The font is gone, so the button keeps a real label for screen
 * readers, is collapsed to a 55px hit area on the right of the field, and draws
 * the magnifier as a background mask.
 */
#secondary .widget_search button[type="submit"],
#secondary .widget_search input[type="submit"],
#secondary .widget_product_search button[type="submit"],
#secondary .widget_product_search input[type="submit"],
.nutritix-canvas-filter .widget_search button[type="submit"],
.nutritix-canvas-filter .widget_search input[type="submit"],
.nutritix-canvas-filter .widget_product_search button[type="submit"],
.nutritix-canvas-filter .widget_product_search input[type="submit"] {
	background: transparent;
	border: 0;
	bottom: 0;
	color: transparent;
	cursor: pointer;
	font-size: 0;
	line-height: 0;
	padding: 0;
	position: absolute;
	right: 0;
	top: 0;
	width: 55px;
	z-index: 3;
}

#secondary .widget_search form::after,
#secondary .widget_product_search form::after,
.nutritix-canvas-filter .widget_search form::after,
.nutritix-canvas-filter .widget_product_search form::after {
	background-color: var(--color-text-strong);
	content: "";
	height: 16px;
	-webkit-mask: var(--fpl-widget-search-icon) center / contain no-repeat;
	mask: var(--fpl-widget-search-icon) center / contain no-repeat;
	pointer-events: none;
	position: absolute;
	right: 4px;
	top: 50%;
	transform: translateY(-50%);
	width: 16px;
	z-index: 4;
}

/* Production leaves widget links unadorned; the colour is set per component. */
#secondary a:not(.button),
.nutritix-canvas-filter a:not(.button) {
	text-decoration: none;
}


/* -----------------------------------------------------------------------------
   20.13  THE OFF-CANVAS FILTER PANEL  (#nutritix-canvas-filter)

   The toolbar's "Filter by" control is the only filtering affordance below
   1024px, where §20.1 hides #secondary. Its `aria-controls` had no target in
   this theme; archive-product.php now renders the panel.

   Values are production's, from themes/nutritix/.../woocommerce.css and
   style.css: 380px wide, parked at translate3d(-100%,0,0), 60px side padding,
   40px bottom padding, a 997 backdrop at rgba(0,0,0,.7), and both revealed by
   `off-canvas-active` on <body> — the class 20-archive.js already toggles.

   `visibility` is doing real work here, not decoration: while the panel is
   hidden its links and buttons are removed from the tab order by it, so a
   closed drawer cannot be reached by keyboard even though it is in the DOM.
   -------------------------------------------------------------------------- */

.nutritix-canvas-filter {
	background-color: var(--color-bg);
	bottom: 0;
	left: 0;
	max-width: 100%;
	overflow-x: hidden;
	overflow-y: auto;
	padding: 0 var(--space-11) var(--space-9); /* 0 60px 40px */
	position: fixed;
	top: 0;
	transform: translate3d(-100%, 0, 0);
	/*
	 * `visibility` is a discrete property: transitioning it over the same 0.5s as
	 * the slide flips it at the halfway point, so on open the panel spends 250ms
	 * sliding in while still `visibility: hidden` — during which 20-archive.js
	 * cannot move focus into it, because a hidden element refuses focus. Instead
	 * it is switched with a zero-length transition DELAYED to the end of the
	 * slide: instant on open (the delay is overridden below), held to the end on
	 * close so the panel is still painted while it slides out.
	 */
	transition: transform 0.5s var(--ease-base), visibility 0s var(--ease-base) 0.5s;
	visibility: hidden;
	width: 380px;
	z-index: 998;
}

.admin-bar .nutritix-canvas-filter {
	top: 32px;
}

.nutritix-overlay-filter {
	background-color: rgba(0, 0, 0, 0.7);
	bottom: 0;
	height: 100%;
	left: 0;
	opacity: 0;
	position: fixed;
	top: 0;
	transition: opacity 0.25s var(--ease-base), visibility 0s var(--ease-base) 0.25s;
	visibility: hidden;
	width: 100%;
	z-index: 997;
}

/* Opening: both become visible immediately, so the slide and the fade are seen
   and the panel can take focus on the same tick. */
.off-canvas-active .nutritix-canvas-filter {
	transform: translate3d(0, 0, 0);
	transition: transform 0.5s var(--ease-base), visibility 0s var(--ease-base) 0s;
	visibility: visible;
}

.off-canvas-active .nutritix-overlay-filter {
	opacity: 1;
	transition: opacity 0.25s var(--ease-base), visibility 0s var(--ease-base) 0s;
	visibility: visible;
}

/* The panel is never reachable at desktop widths — the sidebar is there. */
@media (min-width: 1024px) {

	.nutritix-canvas-filter,
	.nutritix-overlay-filter {
		display: none;
	}
}

.nutritix-canvas-header {
	text-align: right;
}

/*
 * BUTTON RESET — both controls are <button>, and 00-base.css §8 gives every
 * <button> the black skewed slab (a ::after pseudo-element), 11px uppercase
 * tracking and white ink. Neither control is a slab in production: "Filter by"
 * is plain 14px body text with an icon, and "Close" is 12px muted text. The
 * slab has to be switched off explicitly — `background: transparent` alone does
 * nothing, because the black comes from ::after, and `z-index: 1` on the button
 * is what creates the stacking context that slab sits in.
 */
.nutritix-sorting .filter-toggle,
.filter-close {
	background-color: transparent;
	border: 0;
	border-radius: 0;
	cursor: pointer;
	font-family: var(--font-body);
	letter-spacing: normal;
	padding: 0;
	text-transform: none;
	z-index: auto;
}

.nutritix-sorting .filter-toggle::after,
.filter-close::after {
	content: none;
}

.nutritix-sorting .filter-toggle {
	color: var(--color-text);
	font-size: var(--fs-body); /* 14px — MEASURED on shop__mobile.png */
	font-weight: 400;
	line-height: var(--lh-body);
}

.filter-close {
	align-items: center;
	color: var(--color-text-muted);
	display: inline-flex;
	font-size: var(--fs-small); /* 12px */
	font-weight: 400;
	line-height: 22px;
	margin: var(--space-6) 0 var(--space-11); /* 20px over, 60px under */
	transition: color var(--dur-fast) var(--ease-base);
}

.nutritix-sorting .filter-toggle:hover,
.nutritix-sorting .filter-toggle:focus-visible,
.filter-close:hover,
.filter-close:focus-visible {
	color: var(--color-brand);
}

.filter-close svg {
	margin-left: var(--space-3); /* 10px */
}

/* Nothing behind the drawer scrolls while it is open. */
body.off-canvas-active {
	overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {

	.nutritix-canvas-filter,
	.nutritix-overlay-filter {
		transition: none;
	}
}



/* -----------------------------------------------------------------------------
   20.14  BREADCRUMB  (.breadcrumb-wrap / .woocommerce-breadcrumb)

   Printed by frontier_breadcrumb() on `frontier_after_header` (inc/setup.php),
   between </header> and #content — the same slot production's HFE template 5117
   occupies as `<div class="breadcrumb-wrap">`.

   MEASURED on cart__desktop.png at 1440px: "Home / Cart" ink starts at x = 76,
   the same left edge as .col-full content, with the crumb row 30px below the nav
   — production's `.elementor-element-fdf6352 { padding: 30px 30px 0 30px }` plus
   a boxed 1290px container resolves to exactly the same x as this theme's
   .col-full, so `padding-block: 30px 0` on .col-full reproduces it at every
   width (production drops the section's side padding to 15px below 767px, which
   is what .col-full already uses there).

   Colours are production's per-element Elementor CSS:
       .woocommerce-breadcrumb      { color: var(--e-global-color-accent) }  #414042
       .woocommerce-breadcrumb > a  { color: #999999 }
   Sampled #414042 on "/ Cart" and #999999 on "Home" — both confirmed.

   #999999 has no token: it is the only place in the build that uses it, so it
   is a local the way 10-header.css and 50-content.css keep theirs.
   -------------------------------------------------------------------------- */

.breadcrumb-wrap {
	--fpl-breadcrumb-link: #999999;
}

.breadcrumb-wrap > .col-full {
	padding-bottom: 0;
	padding-top: var(--space-8); /* 30px */
}

.woocommerce-breadcrumb {
	color: var(--color-text-strong);
	font-size: var(--fs-body);
	line-height: 1.4285714286;
	margin: 0;
}

.woocommerce-breadcrumb a {
	color: var(--fpl-breadcrumb-link);
	text-decoration: none;
	transition: color var(--dur-fast) var(--ease-base);
}

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

/*
 * Single posts get a full-bleed brand band with white links — the child theme's
 *   .single-post .breadcrumb-wrap .elementor-top-section {
 *       background:#4557c9; padding-top:15px!important; padding-bottom:15px!important }
 *   .single-post .elementor-top-section .woocommerce-breadcrumb, … a { color:#fff!important }
 *
 * MEASURED on post__desktop.png: the band runs y = 250 -> 299 (50px = 15 + 20 +
 * 15) and is #4557C9 at x = 5 and x = 1435, so it bleeds past the container on
 * both sides. .breadcrumb-wrap is already body-width; only .col-full is boxed,
 * so the background lands on the wrapper and the padding on the inner column.
 */
body.single-post .breadcrumb-wrap {
	background-color: var(--color-brand);
}

body.single-post .breadcrumb-wrap > .col-full {
	padding-bottom: var(--space-5); /* 15px */
	padding-top: var(--space-5);
}

body.single-post .woocommerce-breadcrumb,
body.single-post .woocommerce-breadcrumb a {
	color: var(--color-text-on-brand);
}

body.single-post .woocommerce-breadcrumb a:hover,
body.single-post .woocommerce-breadcrumb a:focus-visible {
	text-decoration: underline;
}
/* ==========================================================================
   30 — PRODUCT DETAIL PAGE (PDP)
   Frontier Peptide Labs rebuild.

   Reference: reference-screenshots/product-variable__{desktop,tablet,mobile}.png
              reference-screenshots/product-simple__{desktop,tablet,mobile}.png
   Spec:      design-tokens.md §7.5 gallery · §7.6 price · §7.7 swatches
              §7.8 add-to-cart row · §7.9 pack tiles · §7.11 tabs
              §4.4 PDP spacing · §5.x radii/borders · §8 traps

   Every colour, size and radius below comes from _tokens.css. The only
   literal numbers are geometry that has no token (column percentages, the
   156x48 quantity box, the 44px swatch tap target).
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. PAGE SHELL AND TWO-COLUMN LAYOUT
   Theme rhythm: single product sets top margin only (design-tokens §4.2).
   Columns at >=768px: gallery calc(53% - 60px) capped at 630px floated left,
   summary 47% floated right. On a 1290px container that puts the summary's
   left edge at 758.7px — the measured position in the desktop screenshot.
   -------------------------------------------------------------------------- */

.single-product #page .site-content {
	margin-top: var(--space-section-y);
	margin-bottom: 0;
}

.single-product div.product {
	position: relative;
}

/* Float containment — the summary and gallery are floated at >=768px. */
.single-product div.product::before,
.single-product div.product::after {
	content: "";
	display: table;
}

.single-product div.product::after {
	clear: both;
}

.single-product div.product .images,
.single-product div.product .summary {
	margin-top: 0;
	margin-bottom: var(--space-3);
}

@media (max-width: 767px) {

	.single-product div.product .images {
		margin-bottom: var(--space-8);
	}
}

@media (min-width: 768px) {

	.single-product div.product .woocommerce-product-gallery {
		float: left;
		width: calc(53% - 60px);
		max-width: 630px;
		margin-right: 0;
	}

	.single-product div.product .summary {
		float: right;
		width: 47%;
	}

	.single-product div.product .woocommerce-tabs,
	.single-product div.product .upsells,
	.single-product div.product .related {
		clear: both;
	}
}


/* --------------------------------------------------------------------------
   2. GALLERY  (design-tokens §7.5)
   The wrapper ships inline `opacity: 0`, which WooCommerce's FlexSlider init
   clears. The live site overrides that in CSS so the image is painted before
   the script runs — reproduced here, and it also keeps the gallery visible if
   the deferred bundle is slow. Do not remove: it is the difference between a
   product photo and a blank column.
   -------------------------------------------------------------------------- */

.single-product div.product .woocommerce-product-gallery {
	position: relative;
	opacity: 1;
}

.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper {
	margin: 0;
}

.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__wrapper img {
	display: block;
	width: 100%;
	height: auto;
}

.single-product div.product .woocommerce-product-gallery .onsale {
	top: var(--space-6);
	left: var(--space-6);
}

/* PhotoSwipe zoom affordance. */
.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__trigger {
	position: absolute;
	top: var(--space-6);
	right: var(--space-6);
	z-index: 80;
	width: 30px;
	color: var(--color-text-strong);
	background: none;
	border: none;
}

.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__trigger::after,
.single-product div.product .woocommerce-product-gallery .woocommerce-product-gallery__trigger::before {
	content: none;
}

/* Thumbnail strip (FlexSlider control nav). */
.single-product div.product .woocommerce-product-gallery .flex-control-thumbs {
	display: flex;
	flex-wrap: wrap;
	margin: 0;
	padding: 0;
	list-style: none;
}

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li {
	max-width: 100px;
	cursor: pointer;
}

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li img {
	display: block;
	width: 100%;
	object-fit: cover;
	border: var(--border-hairline);
	transition: all var(--dur-base) var(--ease-base);
}

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li img.flex-active,
.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li:hover img,
.single-product div.product .woocommerce-product-gallery .flex-control-thumbs li.active img {
	opacity: 1;
	border-color: var(--color-ink-solid);
}

.single-product div.product .woocommerce-product-gallery .flex-control-thumbs .slick-prev,
.single-product div.product .woocommerce-product-gallery .flex-control-thumbs .slick-next {
	width: 30px;
	background: transparent;
	border: var(--border-hairline);
	border-radius: var(--radius-0);
	color: var(--color-ink-solid);
	font-size: var(--space-6);
}


/* --------------------------------------------------------------------------
   3. TITLE  (design-tokens §3.3, §3.4)
   48px/1/700 desktop, 26px/1.25 on phones. There is no fluid scale on this
   site — the mobile step is a hand-written patch and is reproduced exactly.
   -------------------------------------------------------------------------- */

.single-product div.product .product_title,
.single-product div.product h1.product_title {
	margin: 0 0 var(--space-5);
	font-family: var(--font-display);
	font-size: var(--fs-product-title);
	line-height: var(--lh-product-title);
	font-weight: 700;
	color: var(--color-text-strong);
}

@media (max-width: 767px) {

	.single-product div.product .product_title,
	.single-product div.product h1.product_title,
	.single-product div.product .product_title.entry-title {
		font-size: var(--fs-product-title-mobile);
		line-height: var(--lh-product-title-mobile);
	}
}


/* --------------------------------------------------------------------------
   4. PRICE  —  THE ONE RULE  (design-tokens §7.6, §2.4, trap #6)

   Production carries three separate price-colour patches (fpl-loop-price-color,
   fpl-woo-grid-price-color, fpl-hfe-price-color) purely because Elementor,
   UAE/HFE and core WooCommerce each wrap prices in a different container.
   With those gone, one rule covers every price surface on the PDP: the summary
   price, the AJAX variation price, and the grouped-product price.

   Sale display: price.php already renders the regular price, so no <del>/<ins>
   is emitted for the summary. The variation price block is built by
   WooCommerce core in JSON and cannot be filtered from a template, so the
   merchandising rule (always show the regular figure — see trap #7) is
   enforced for that one block here. No !important is needed in a clean theme.

   `display: flex` is deliberate and load-bearing: it is what collapses the
   whitespace either side of the en dash so a range reads "$34.99–$49.99",
   exactly as on the reference screenshots.
   -------------------------------------------------------------------------- */

.single-product div.product > .summary p.price,
.single-product div.product .woocommerce-variation-price .price,
.single-product div.product .single_variation .price {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	margin: 0 0 var(--space-6);
	font-family: var(--font-display);
	font-size: var(--fs-pdp-price);
	line-height: var(--lh-pdp-price);
	font-weight: var(--fw-pdp-price);
	color: var(--color-text-price);
}

.single-product div.product > .summary p.price del,
.single-product div.product .woocommerce-variation-price .price del {
	margin-right: 0.327em;
	font-size: var(--fs-pdp-price-del);
	color: var(--color-text-muted);
}

.single-product div.product > .summary p.price ins,
.single-product div.product .woocommerce-variation-price .price ins {
	margin-right: 0;
	font-weight: var(--fw-pdp-price);
	color: var(--color-text-price);
	text-decoration: none;
}

/* Always show the regular figure in the AJAX variation price (trap #7). */
.single-product div.product .woocommerce-variation-price .price ins,
.single-product div.product .woocommerce-variation-price .price br {
	display: none;
}

.single-product div.product .woocommerce-variation-price .price del {
	margin-right: 0;
	font-size: inherit;
	font-weight: inherit;
	color: inherit;
	text-decoration: none;
	opacity: 1;
}

/* Availability line — the green "In stock" under the pack tiles. */
.single-product div.product .stock {
	margin-bottom: var(--space-8);
}

.single-product div.product .stock.in-stock {
	color: var(--color-success);
}

.single-product div.product .stock.out-of-stock {
	color: var(--color-error);
}


/* --------------------------------------------------------------------------
   5. PACK TILES  (design-tokens §7.9)
   Rendered by woocommerce/single-product/pack-tiles.php between the price and
   the add-to-cart form. Each tile is a real <button>, so keyboard operation
   and the focus ring are native; the resets below stop the theme's global
   skewed-slab button treatment (§7.0) from leaking into them.
   -------------------------------------------------------------------------- */

.fpl-pack-wrapper {
	display: flex;
	flex-wrap: wrap;
	gap: 14px;
	margin: var(--space-6) 0;
}

button.fpl-pack-item,
.fpl-pack-item {
	flex: 0 0 auto;
	display: block;
	margin: 0;
	padding: 0;
	background: none;
	border: 0;
	border-radius: var(--radius-0);
	color: inherit;
	font: inherit;
	text-align: center;
	text-transform: none;
	letter-spacing: normal;
	cursor: pointer;
	-webkit-appearance: none;
	appearance: none;
}

/* Kill the theme's skewed black slab (trap #4/#5) inside the tiles. */
button.fpl-pack-item::before,
button.fpl-pack-item::after {
	content: none;
	display: none;
}

.fpl-pack-card {
	position: relative;
	display: block;
	min-width: 120px;
	padding: 14px;
	background: var(--color-bg);
	border: var(--border-pack);
	border-radius: var(--radius-pack);
	text-align: center;
	transition:
		border-color var(--dur-fast) var(--ease-base),
		box-shadow var(--dur-fast) var(--ease-base);
}

.fpl-pack-item:hover .fpl-pack-card {
	border-color: var(--color-brand);
}

.fpl-pack-item.active .fpl-pack-card {
	border-color: var(--color-brand);
	box-shadow: var(--shadow-ring-pack);
}

.fpl-pack-item:focus-visible {
	outline: none;
}

.fpl-pack-item:focus-visible .fpl-pack-card {
	outline: 3px solid var(--color-brand);
	outline-offset: 2px;
}

.fpl-pack-title {
	display: block;
	margin-bottom: var(--space-3);
	font-size: var(--fs-body);
	font-weight: 700;
	color: var(--color-text-strong);
}

.fpl-pack-img-single {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 62px;
}

.fpl-pack-img-single img {
	max-width: 64px;
	max-height: 62px;
	width: auto;
	height: auto;
	object-fit: contain;
}

.fpl-pack-price {
	display: block;
	margin-top: var(--space-3);
	font-size: var(--fs-body);
	font-weight: 700;
	line-height: 1.3;
	color: var(--color-text-strong);
}

/* wc_price() markup inside a tile stays black — it is not a headline price. */
.fpl-pack-price .woocommerce-Price-amount,
.fpl-pack-price .woocommerce-Price-currencySymbol {
	color: inherit;
	font-size: inherit;
	font-weight: inherit;
}

.fpl-badge {
	position: absolute;
	top: -12px;
	left: 50%;
	transform: translateX(-50%);
	padding: var(--space-1) var(--space-4);
	background: var(--color-brand);
	border-radius: var(--radius-pill);
	color: var(--color-text-on-brand);
	font-size: 11px;
	line-height: 1.4;
	font-weight: var(--fw-body);
	white-space: nowrap;
}


/* --------------------------------------------------------------------------
   6. VARIATION TABLE AND NATIVE SWATCHES  (design-tokens §7.7)

   The table is turned into a stack: WooCommerce emits th/td, the theme makes
   both `display: list-item` so the label sits above the swatch row.

   NOTE ON THE LABEL SIZE — design-tokens §7.7 quotes `td.label label` at
   12px/600/uppercase. That selector never matches: WooCommerce renders the
   label cell as `th.label`, so the rule that actually applies on production is
   the generic `table.variations label` at 14px/22px/400. The reference
   screenshot confirms it — "Strength" is sentence case at body size. 14px it is.

   The <select> WooCommerce renders is hidden, not removed: variations_form.js
   drives the whole form from it. See add-to-cart/variable.php.
   -------------------------------------------------------------------------- */

.single-product div.product table.variations {
	position: relative;
	table-layout: fixed;
	width: 100%;
	margin: 0 0 var(--space-3);
	border: 0;
}

.single-product div.product table.variations tbody,
.single-product div.product table.variations tr {
	display: block;
	border: 0;
}

.single-product div.product table.variations th,
.single-product div.product table.variations td {
	display: list-item;
	list-style: none;
	padding: 0;
	background-color: transparent;
	border: 0;
	/* The theme's generic `th` rule centres header cells, which is right for the
	   cart and order tables but wrong here: these are rendered as list items, and
	   production left-aligns the "Strength" label above its swatches. */
	text-align: left;
}

.single-product div.product table.variations td.value {
	position: relative;
	margin-bottom: var(--space-5);
}

.single-product div.product table.variations th.label label {
	display: block;
	margin: 0;
	font-family: var(--font-display);
	font-size: var(--fs-body);
	line-height: 22px;
	font-weight: var(--fw-body);
	color: var(--color-text-strong);
	text-transform: none;
}

/* WooCommerce's own control — present for the JS, never seen. */
.single-product div.product table.variations select.fpl-variation-select {
	display: none;
}

.single-product div.product table.variations a.reset_variations {
	display: inline-block;
	margin: 0 0 5px;
	line-height: 1;
	vertical-align: middle;
	color: var(--color-text-strong);
	border-bottom: 1px solid;
}

.single-product div.product table.variations a.reset_variations:hover,
.single-product div.product table.variations a.reset_variations:focus {
	color: var(--color-brand);
}

/* --- the swatches themselves ------------------------------------------- */

.fpl-swatches {
	display: inline-flex;
	flex-wrap: wrap;
	align-items: center;
	vertical-align: middle;
}

.fpl-swatch-item {
	position: relative;
	display: inline-flex;
	margin: 0 var(--space-3) 5px 0;
}

/* Visually hidden but still focusable — the label is the visible control. */
.fpl-swatch-input {
	position: absolute;
	top: 50%;
	left: 50%;
	width: 1px;
	height: 1px;
	margin: 0;
	padding: 0;
	border: 0;
	opacity: 0;
	pointer-events: none;
}

.fpl-swatch {
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 40px;
	min-height: 44px;          /* accessibility patch, 2026-08-14: 44px tap target */
	margin: 0;
	padding: 0 16px;
	background-color: var(--color-surface-light);
	border-radius: var(--radius-xs);
	color: var(--color-text-strong);
	font-family: var(--font-display);
	font-size: var(--fs-swatch);
	line-height: var(--lh-swatch);
	font-weight: var(--fw-body);
	text-align: center;
	white-space: nowrap;
	cursor: pointer;
	-webkit-user-select: none;
	user-select: none;
	transition:
		background-color var(--dur-base) var(--ease-base),
		color var(--dur-base) var(--ease-base);
}

.fpl-swatch:hover,
.fpl-swatch-input:checked + .fpl-swatch {
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}

.fpl-swatch-input:focus-visible + .fpl-swatch {
	outline: 2px solid var(--color-brand);
	outline-offset: 2px;
}

/*
 * Unavailable option. WooCommerce disables or drops the matching <option>
 * when no purchasable variation exists (the orphan 20mg options on
 * /product/mots-c-vial/ and /product/epithalon-vial/), and 30-pdp.js mirrors
 * that onto the radio. -30deg strike-through, per §7.7.
 */
.fpl-swatch-input:disabled + .fpl-swatch {
	cursor: not-allowed;
}

.fpl-swatch-input:disabled + .fpl-swatch::after {
	content: "";
	position: absolute;
	top: 50%;
	left: -7px;
	width: calc(100% + 14px);
	height: 2px;
	background-color: var(--color-border);
	transform: rotate(-30deg);
}

.fpl-swatch-input:disabled + .fpl-swatch:hover {
	background-color: var(--color-surface-light);
	color: var(--color-text-strong);
}


/* --------------------------------------------------------------------------
   7. ADD-TO-CART ROW  (design-tokens §7.8, §5.3)
   156x48 quantity box with a bottom rule only, then the skewed black CTA.
   -------------------------------------------------------------------------- */

.single-product div.product form.cart,
.single-product div.product .variations_button {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
}

.single-product div.product .single_variation_wrap {
	width: 100%;
}

/* Never applies while the pack tiles sit between the two — kept for parity. */
.single-product div.product > .summary p.price + form.cart {
	margin-top: var(--space-8);
}

.single-product div.product form.cart .quantity {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
	width: 156px;
	height: 48px;
	margin: 0 var(--space-5) var(--space-3) 0;
	border: 0;
	border-bottom: 1px solid var(--color-ink-solid);
	border-radius: var(--radius-0);
	font-size: 16px;
	font-weight: 500;
}

.single-product div.product form.cart .quantity.hidden {
	display: none;
}

.single-product div.product form.cart .quantity .qty {
	flex: 1;
	min-width: 0;
	padding: var(--space-3) 0;
	background: none;
	border: none;
	border-radius: var(--radius-0);
	box-shadow: none;
	color: var(--color-ink-solid);
	text-align: center;
	-moz-appearance: textfield;
	appearance: textfield;
}

.single-product div.product form.cart .quantity .qty::-webkit-outer-spin-button,
.single-product div.product form.cart .quantity .qty::-webkit-inner-spin-button {
	margin: 0;
	-webkit-appearance: none;
	appearance: none;
}

.single-product div.product form.cart .quantity .qty:focus {
	border-color: var(--color-brand);
	outline-color: var(--color-brand);
}

/* Optional +/- controls, if the global quantity template ever adds them. */
.single-product div.product form.cart .quantity button {
	z-index: var(--z-qty-btn);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 30%;
	height: 48px;
	padding: 0;
	background-color: var(--color-bg);
	border: none;
	border-radius: var(--radius-0);
	color: var(--color-ink-solid);
	text-align: center;
}

.single-product div.product form.cart .quantity button:hover {
	color: var(--color-brand);
}

.single-product div.product form.cart .quantity button::after {
	content: none;
}

/*
 * Primary CTA. The visible surface is the theme's skewed slab pseudo-element
 * (design-tokens §7.0): the element background is transparent and `z-index: 1`
 * is what lets the `z-index: -1` slab paint above it but under the label.
 * Both are restated here — trap #5 — because dropping either turns the only
 * add-to-cart button on the site into white text on white.
 */
.single-product div.product .single_add_to_cart_button {
	position: relative;
	z-index: var(--z-badge);
	display: flex;
	align-items: center;
	justify-content: center;
	margin: 0 var(--space-6) var(--space-3) 0;
	padding: var(--space-4) var(--space-8);
	background-color: transparent;
	border: none;
	border-radius: var(--radius-sm);
	color: var(--color-text-on-brand);
	font-family: var(--font-display);
	font-size: var(--fs-button);
	line-height: 24px;
	font-weight: var(--fw-button);
	letter-spacing: var(--ls-button);
	text-transform: var(--tt-button);
	white-space: nowrap;
	transition: all var(--dur-base) var(--ease-base);
}

.single-product div.product .single_add_to_cart_button::after {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	z-index: -1;
	width: calc(100% - 2px);
	height: calc(100% - 2px);
	background-color: var(--color-ink-solid);
	border: 1px solid transparent;
	border-radius: var(--radius-sm);
	transform: skewX(var(--skew-angle)) scaleX(var(--skew-scale-x));
	transform-origin: var(--skew-origin);
	transition: all var(--ease-base) var(--dur-base);
}

.single-product div.product .single_add_to_cart_button:hover::after,
.single-product div.product .single_add_to_cart_button:focus-visible::after {
	background-color: var(--color-brand);
}

.single-product div.product .single_add_to_cart_button:hover {
	color: var(--color-text-on-brand);
}

.single-product div.product .single_add_to_cart_button.disabled,
.single-product div.product .single_add_to_cart_button:disabled {
	opacity: 0.5;
	cursor: not-allowed;
}

.single-product div.product .single_add_to_cart_button + a.added_to_cart {
	display: none;
}

.single-product div.product .woocommerce-variation-description p:last-child {
	margin-bottom: var(--space-3);
}


/* --------------------------------------------------------------------------
   8. PRODUCT META  (not rendered — see single-product/meta.php)
   -------------------------------------------------------------------------- */

.single-product div.product .product_meta {
	margin-top: var(--space-6);
	font-size: var(--fs-small);
	color: var(--color-text-muted);
}

.single-product div.product .product_meta .sku {
	color: var(--color-text-strong);
}


/* --------------------------------------------------------------------------
   9. TABS  (design-tokens §7.11)

   A strip of tab labels separated by a 6px dot skewed -15deg, hidden below
   767px where the h2.resp-accordion heads take over.

   NOTHING HERE HIDES A PANEL. Panel visibility belongs to WooCommerce's own
   wc-single-product script, exactly as on production. With scripting off,
   every panel renders stacked and no tab is active — which is precisely the
   state the reference screenshots captured, and it keeps all seven panels'
   copy in the document for search engines.
   -------------------------------------------------------------------------- */

.single-product .woocommerce-tabs {
	display: block;
	position: relative;
	margin-top: var(--space-8);
	margin-bottom: var(--space-12);
}

.single-product .woocommerce-tabs ul.tabs {
	position: relative;
	margin: 0;
	padding: 0 0 var(--space-5);
	list-style: none;
	text-align: left;
	border-bottom: var(--border-hairline);
}

.single-product .woocommerce-tabs ul.tabs li {
	display: inline-flex;
	align-items: center;
	margin: 0;
	padding: 0;
}

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

.single-product .woocommerce-tabs ul.tabs li:not(:last-child)::after {
	content: "";
	display: inline-block;
	width: 6px;
	height: 6px;
	margin: 0 22px;
	vertical-align: middle;
	background-color: var(--color-divider-dot);
	transform: skewX(var(--skew-angle-dot));
}

.single-product .woocommerce-tabs ul.tabs li a {
	display: block;
	padding: 0;
	border: none;
	font-family: var(--font-display);
	font-size: var(--fs-tab-title);
	line-height: var(--lh-tab-title);
	font-weight: var(--fw-tab-title);
	color: var(--color-text-muted);
	text-decoration: none;
}

.single-product .woocommerce-tabs ul.tabs li a:hover,
.single-product .woocommerce-tabs ul.tabs li a:focus-visible,
.single-product .woocommerce-tabs ul.tabs li.active a {
	color: var(--color-text-strong);
}

.single-product .woocommerce-tabs .woocommerce-Tabs-panel {
	padding-top: var(--space-6);
	scroll-margin-top: 90px;   /* clears the sticky add-to-cart bar on jump */
}

@media (min-width: 768px) {

	.single-product .woocommerce-tabs .woocommerce-Tabs-panel {
		padding-top: var(--space-8);
	}
}

/*
 * WooCommerce repeats the tab title as an h2 inside its own panel
 * ("Description", "Additional information", "Reviews"). The live rule is a
 * descendant selector, not a child one, which also suppresses the first h2
 * inside the editorial hero of every product description — verified against
 * the screenshots, where the navy hero opens on body copy with no title.
 * Keep it as a descendant selector or 44 product descriptions gain a heading.
 */
.single-product .woocommerce-tabs .panel h2:first-of-type {
	display: none;
}

/* --- responsive accordion heads ---------------------------------------- */

.single-product .woocommerce-tabs h2.resp-accordion {
	display: none;
}

@media (max-width: 767px) {

	.single-product .woocommerce-tabs ul.tabs {
		display: none;
	}

	.single-product .woocommerce-tabs h2.resp-accordion {
		display: flex;
		align-items: center;
		margin: 0;
		padding: 1em;
		border-top: var(--border-hairline);
		font-family: var(--font-display);
		font-size: var(--fs-tab-title);
		line-height: var(--lh-tab-title);
		font-weight: var(--fw-tab-title);
		color: var(--color-text-strong);
		cursor: pointer;
	}

	.single-product .woocommerce-tabs h2.resp-accordion.active {
		border-top: 2px solid var(--color-brand);
	}

	.single-product .woocommerce-tabs h2.resp-accordion:focus-visible {
		outline: 2px solid var(--color-brand);
		outline-offset: -2px;
	}

	/* Chevron: down when collapsed, up when expanded. */
	.single-product .woocommerce-tabs h2.resp-accordion::before {
		content: "";
		flex: 0 0 auto;
		width: 9px;
		height: 9px;
		margin-right: var(--space-4);
		border-right: 2px solid currentColor;
		border-bottom: 2px solid currentColor;
		transform: translateY(-2px) rotate(45deg);
		transition: transform var(--dur-base) var(--ease-base);
	}

	.single-product .woocommerce-tabs h2.resp-accordion[aria-expanded="true"]::before {
		transform: translateY(2px) rotate(225deg);
	}
}


/* --------------------------------------------------------------------------
   10. NARROW-VIEWPORT ADJUSTMENTS
   -------------------------------------------------------------------------- */

@media (max-width: 1024px) {

	/* Sidebar layouts narrow the quantity box (design-tokens §7.8). */
	.single-product.nutritix-sidebar-left div.product form.cart .quantity,
	.single-product.nutritix-sidebar-right div.product form.cart .quantity {
		width: 110px;
	}
}

@media (max-width: 767px) {

	.fpl-pack-wrapper {
		gap: var(--space-4);
	}

	.single-product div.product .single_add_to_cart_button {
		margin-right: var(--space-3);
	}
}


/* --------------------------------------------------------------------------
   11. STICKY ADD-TO-CART BAR  (research/phase1-custom-features.md §2 item 16)

   Rebuild of production's `section.nutritix-sticky-add-to-cart` — markup from
   woocommerce/single-product/sticky-add-to-cart.php, reveal from 30-pdp.js.

   VISIBLE AT >=768px ONLY. That is production behaviour, not a shortcut: the
   parent theme ships `.nutritix-sticky-add-to-cart { display:none }` and only
   turns it on inside `@media (min-width:768px)`. Confirmed against the live
   woocommerce.css (rule at file scope, `display:block` at min-width 768) and
   against product-variable__mobile.png, which carries no bottom bar at all.

   STACKING WITH THE MOBILE BOTTOM BAR. `.fpl-mobile-bar` (11-footer.css §7)
   is also `position:fixed; bottom:0`, and it is live at <=1024px — so the two
   share the 768-1024 band. They are stacked, not overlaid, on two axes:

     bottom   --fpl-sticky-atc-bottom lifts this bar by 65px (--space-12) at
              <=1024px. That is the same 65px §7.2 already reserves on body's
              padding-block-end for the mobile bar, so the numbers cannot
              drift apart: change one, change the other.
     z-index  996 — one BELOW --fpl-bottom-bar-z (997) on purpose. The mobile
              bar's search panel grows upward when opened; letting it paint
              over the buy bar is the right outcome.

   The rest of the band: header 99/100, age gate --z-agegate 1000, flyout
   --z-flyout 99999. Production's own 99998 is deliberately NOT reproduced —
   it would paint the buy bar over the age-verification modal.

   The CTA keeps the plain `.button alt` classes, so 00-base.css §8 gives it
   the -10deg black slab. The skew is suppressed on cart and checkout only —
   this is a product page, so it applies here.
   -------------------------------------------------------------------------- */

:root {

	/* Clear-height for the fixed bar below this one. Zero above 1024px, where
	   11-footer.css §7.2 sets `.fpl-mobile-bar { display:none }`. */
	--fpl-sticky-atc-bottom: 0px;
}

@media (max-width: 1024px) {

	:root {
		--fpl-sticky-atc-bottom: var(--space-12); /* = the mobile bar's 65px */
	}
}

.fpl-sticky-atc {
	position: fixed;
	right: 0;
	bottom: var(--fpl-sticky-atc-bottom);
	left: 0;
	z-index: 996;
	display: none;
	padding: var(--space-3) 0;
	background-color: var(--color-bg);
	border-top: var(--border-hairline);
	visibility: hidden;
	/* 100% of its own height PLUS the offset, so the resting position is fully
	   below the viewport rather than tucked behind the mobile bar. */
	transform: translate3d(0, calc(100% + var(--fpl-sticky-atc-bottom)), 0);
	transition:
		transform var(--dur-base) var(--ease-base),
		visibility 0s var(--ease-base) var(--dur-base);
}

@media (min-width: 768px) {

	.fpl-sticky-atc {
		display: block;
	}
}

.fpl-sticky-atc.is-visible {
	visibility: visible;
	transform: translate3d(0, 0, 0);
	transition-delay: 0s;
}

.fpl-sticky-atc__content {
	display: flex;
	align-items: center;
	gap: var(--space-5);
}

.fpl-sticky-atc__thumb {
	flex: 0 0 auto;
	width: 44px;
	height: 44px;
	object-fit: cover;
	border: 1px solid var(--color-border-hairline);
}

/* min-width:0 is what lets the title ellipsis instead of shoving the CTA off. */
.fpl-sticky-atc__info {
	min-width: 0;
	flex: 1 1 auto;
}

.fpl-sticky-atc__title {
	display: block;
	overflow: hidden;
	font-family: var(--font-display);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	color: var(--color-text-muted);
	text-overflow: ellipsis;
	white-space: nowrap;
}

.fpl-sticky-atc__title strong {
	font-weight: 400;
	color: var(--color-text-strong);
}

/*
 * Price colour follows production, which paints this one price in --accent
 * (#414042) rather than the brand blue every other price surface uses.
 * sticky-add-to-cart.php renders the regular figure only, so the del/ins
 * rules below cover the get_price_html() fallback path alone.
 */
.fpl-sticky-atc__price {
	/* flex, not block: it collapses the whitespace either side of the en dash
	   so a range reads "$34.99–$49.99" — the same load-bearing trick §4 uses
	   on the summary price, and what the reference screenshots show.
	   Production used inline-flex for the same reason. */
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	font-size: var(--fs-body);
	font-weight: var(--fw-body);
	line-height: 1;
	color: var(--color-text-strong);
}

.fpl-sticky-atc__price ins {
	margin: 0;
	background-color: transparent;
	color: var(--color-text-price);
	text-decoration: none;
}

.fpl-sticky-atc__price del {
	margin-right: 0.6180469716em;
	font-size: var(--fs-small);
	color: var(--color-text-muted);
}

.fpl-sticky-atc__button {
	flex: 0 0 auto;
	margin-left: auto;
	padding: 11px 25px;      /* production override of the 1.365em/4em default */
	letter-spacing: 0;       /* production zeroes --ls-button on this button */
	white-space: nowrap;
}

@media (prefers-reduced-motion: reduce) {

	.fpl-sticky-atc {
		transition: none;
	}
}


/* --------------------------------------------------------------------------
   12. STAR RATINGS AND THE REVIEWS UI

   inc/cleanup.php empties woocommerce_enqueue_styles, and the Nutritix
   woocommerce.css that supplied the `star` webfont dies with the old theme.
   design-tokens.md §3.1 dropped that font on purpose ("required by real UI …
   Replace with SVG"), so the glyph is an inline-SVG CSS mask tinted with
   --color-star / --color-star-empty. No @font-face, no icon font.

   THE OVERLAY CONTRACT IS PRESERVED. WooCommerce — and this theme's own
   woocommerce/loop/rating.php — emit:

       <div class="star-rating"><span style="width:80%">Rated 4 out of 5</span></div>

   so the filled state MUST be a child span whose inline percentage width
   clips it. That span is styled here, never changed in the template (another
   agent owns loop/rating.php).

   These rules are intentionally NOT scoped to .single-product: the same
   markup appears in the Popular Products sidebar widget, in the review list
   and on product cards (where 20-archive.css hides .count-review outright).
   -------------------------------------------------------------------------- */

.star-rating,
p.stars a {
	/* One 24x24 star, drawn edge-to-edge minus a ~2/24 gutter so repeated
	   cells do not touch. Data URI: no braces, no # — safe to concatenate. */
	--fpl-star: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 1.8l3.09 6.26 6.91 1.01-5 4.87 1.18 6.87L12 17.57l-6.18 3.24 1.18-6.87-5-4.87 6.91-1.01z'/%3E%3C/svg%3E");
}

.star-rating::before,
.star-rating span::before,
p.stars a::before {
	-webkit-mask-image: var(--fpl-star);
	mask-image: var(--fpl-star);
	-webkit-mask-repeat: repeat-x;
	mask-repeat: repeat-x;
	-webkit-mask-position: left center;
	mask-position: left center;
	-webkit-mask-size: 1.24em 1.24em;
	mask-size: 1.24em 1.24em;
}

/* --- read-only rating (loop card, summary, review list, widget) --------- */

.star-rating {
	position: relative;
	display: block;
	overflow: hidden;
	width: 6.2em;              /* 5 cells x 1.24em */
	height: 1.24em;
	font-family: var(--font-display);
	font-size: var(--fs-small);
	line-height: 1.24;
}

.star-rating::before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	width: 6.2em;
	height: 1.24em;
	background-color: var(--color-star-empty);
}

/*
 * The inline `width:N%` lives on this span, so it must clip its own filled
 * track. padding-top pushes the literal "Rated 4 out of 5" text below the
 * parent's 1.24em clip — the same trick the retired stylesheet used, and the
 * reason no text-indent hack is needed.
 */
.star-rating span {
	position: absolute;
	top: 0;
	left: 0;
	display: block;
	overflow: hidden;
	height: 1.24em;
	padding-top: 1.5em;
}

.star-rating span::before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	width: 6.2em;              /* full track, then clipped by the span's width */
	height: 1.24em;
	background-color: var(--color-star);
}

/*
 * Pre-2017 engines with no mask support would paint two solid bars. Drop the
 * glyphs there and let the element's own "Rated N out of 5" text show instead.
 */
@supports not ((mask-image: url("#a")) or (-webkit-mask-image: url("#a"))) {

	.star-rating::before,
	.star-rating span::before,
	p.stars a::before {
		display: none;
	}

	.star-rating,
	.star-rating span {
		position: static;
		width: auto;
		height: auto;
		overflow: visible;
		padding-top: 0;
	}
}

/* Summary rating row: stars + "(n) customer reviews" link. */
.single-product div.product .woocommerce-product-rating {
	display: flex;
	align-items: center;
	gap: var(--space-3);
	margin-bottom: var(--space-6);
	line-height: 1;
}

.single-product div.product .woocommerce-product-rating .star-rating {
	flex: 0 0 auto;
}

.woocommerce-review-link {
	font-size: var(--fs-small);
	color: var(--color-text-muted);
	text-decoration: none;
}

.woocommerce-review-link:hover,
.woocommerce-review-link:focus-visible {
	color: var(--color-brand);
	text-decoration: underline;
}

/* --- the interactive rating picker  (p.stars) --------------------------- */

/*
 * WooCommerce's single-product script replaces <select id="rating"> with
 * `<p class="stars"><a class="star-1">1</a>…`. When that script does not run
 * — which is what product-variable__desktop.png captured — the <select> stays
 * and 00-base.css §7 already styles it. Both paths are covered.
 */

p.stars {
	display: inline-block;
	margin: 0;
	line-height: 1;
}

p.stars a {
	position: relative;
	display: inline-block;
	width: 1em;
	height: 1em;
	margin-right: 2px;
	font-size: 18px;
	font-weight: var(--fw-body);
	text-decoration: none;
	text-indent: -999em;
	overflow: hidden;
}

p.stars a::before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	width: 1em;
	height: 1em;
	-webkit-mask-size: 1em 1em;
	mask-size: 1em 1em;
	background-color: var(--color-star-empty);
	text-indent: 0;
}

/* Hovering the row fills everything, then the sibling rule empties the tail. */
p.stars:hover a::before {
	background-color: var(--color-star);
}

p.stars a:hover ~ a::before {
	background-color: var(--color-star-empty);
}

/* Chosen state: everything up to and including .active is filled. */
p.stars.selected a:not(.active)::before {
	background-color: var(--color-star);
}

p.stars.selected a.active::before {
	background-color: var(--color-star);
}

p.stars.selected a.active ~ a::before {
	background-color: var(--color-star-empty);
}

p.stars a:focus-visible {
	outline: 2px solid var(--color-brand);
	outline-offset: 2px;
}

/* --- the reviews panel -------------------------------------------------- */

/*
 * `#reviews h2.woocommerce-Reviews-title` ("Reviews") and the
 * `#reply-title` ("Be the first to review …") are both suppressed on
 * production and absent from product-variable__desktop.png. The first is
 * already handled by the `panel h2:first-of-type` rule in §9; the reply title
 * needs its own rule.
 */
#reviews .comment-reply-title {
	display: none;
}

/* One full-width column, list above form — production's layout. The explicit
   float/width reset is deliberate: WooCommerce's own review CSS floats these
   two into a 50/50 split, and if woocommerce-general is ever re-enqueued (or a
   plugin re-adds it) this keeps the panel from splitting in half. */
#reviews #comments,
#reviews #review_form_wrapper {
	float: none;
	width: 100%;
	padding-inline: 0;
}

#reviews #comments {
	margin: 0 0 3.706325903em;
}

#reviews .commentlist {
	margin: 0;
	list-style: none;
}

#reviews .commentlist li {
	margin-bottom: 2.617924em;
	list-style: none;
	clear: both;
}

#reviews .commentlist li::before,
#reviews .commentlist li::after,
#reviews .commentlist li .comment_container::before,
#reviews .commentlist li .comment_container::after {
	content: "";
	display: table;
}

#reviews .commentlist li::after,
#reviews .commentlist li .comment_container::after {
	clear: both;
}

#reviews .commentlist li:last-child {
	margin-bottom: 0;
	border-bottom: 0;
}

#reviews .commentlist li .comment_container {
	border-radius: var(--radius-sm);
}

#reviews .commentlist li .avatar {
	float: left;
	width: 50px;
	height: 50px;
	margin-right: var(--space-3);
	border-radius: var(--radius-round);
	object-fit: cover;
}

#reviews .commentlist li .comment_container .comment-text {
	float: right;
	width: calc(100% - 60px);
}

#reviews .commentlist li .comment_container .comment-text .star-rating {
	height: 1em;
	font-size: 0.875em;
	line-height: 1;
}

#reviews .commentlist li p.meta {
	margin-bottom: var(--space-2);
}

#reviews .commentlist li p.meta strong {
	font-size: var(--fs-h6);
	color: var(--color-text-strong);
}

#reviews .commentlist li p.meta time {
	margin-left: var(--space-3);
	color: var(--color-text-muted);
}

#reviews .commentlist li p.meta .verified {
	font-size: 0.875em;
	font-style: normal;
	color: var(--color-success);
}

#reviews .commentlist li p.meta .woocommerce-review__dash {
	display: none;
}

#reviews .commentlist li .description {
	margin-bottom: 0;
}

#reviews .commentlist li ul.children {
	float: right;
	width: 82.2222222222%;
	margin: 0;
	padding-top: 1.618em;
}

#reviews .commentlist li ul.children .avatar {
	float: left;
	width: 13.5135135135%;
	height: auto;
	margin-right: 8.1081081081%;
}

#reviews .commentlist li ul.children .comment-text {
	float: right;
	width: 78.3783783784%;
}

#reviews .commentlist li ul.children li {
	margin-bottom: 1.618em;
}

#reviews .commentlist li ul.children li:last-child {
	margin-bottom: 0;
}

/* --- the review form ---------------------------------------------------- */

/*
 * Geometry measured off product-variable__desktop.png at 1440px: the form is
 * a wrapping flex row bled 10px into the gutters, every <p> is a full-width
 * cell with 10px of side padding, and only author + email drop to 50% — which
 * puts the Name field at 75-710 and Email at 730-1365 inside the 1290px
 * container, exactly as captured.
 */
#reviews #commentform {
	display: flex;
	flex-wrap: wrap;
	margin: 0 -10px;
}

#reviews #commentform > p,
#reviews #commentform .comment-form-rating {
	width: 100%;
	padding: 0 10px;
}

#reviews .comment-notes,
#reviews .comment-form-comment,
#reviews .comment-form-author,
#reviews .comment-form-email,
#reviews .comment-form-cookies-consent {
	margin-bottom: 1.41575em;
}

#reviews .comment-form-rating {
	clear: both;
	margin-bottom: 1em;
}

#reviews .comment-form-rating label {
	display: block;
	margin-bottom: var(--space-2);
	color: var(--color-text-strong);
}

#reviews .comment-form-author input,
#reviews .comment-form-email input,
#reviews .comment-form-comment input,
#reviews .comment-form-comment textarea {
	width: 100%;
}

#reviews .comment-form-comment textarea {
	color: var(--color-text-strong);
}

/* Checkbox and label stay in normal inline flow — baseline-aligned, which is
   what product-variable__desktop.png shows. Production used the same. */
#reviews .comment-form-cookies-consent {
	display: inline-block;
}

#reviews .comment-form-cookies-consent label {
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	color: var(--color-text);
}

#reviews .comment-notes .required {
	color: var(--color-error);
}

#reviews .form-submit {
	margin-bottom: 0;
}

/*
 * The blue sliver behind the black slab on this button is not decoration —
 * it is the element's own background showing past the -10deg skew, and it is
 * in product-variable__desktop.png. On production it comes from Elementor's
 * kit (`.elementor-kit-8 button { background-color:#4557C9 }`), which paints
 * every bare <button> on the site. Elementor is retired, so the one place the
 * reference screenshots show that sliver gets the colour explicitly. Buttons
 * carrying `.button.alt` — add-to-cart, the sticky bar — are unaffected, and
 * the screenshots show them with no sliver.
 */
#reviews .form-submit .submit {
	background-color: var(--color-brand);
}

/* The `#reviews #commentform > p` cell rule above is (2,0,1); this has to
   out-specify it or the two fields stay stacked at every width. */
@media (min-width: 768px) {

	#reviews #commentform > p.comment-form-author,
	#reviews #commentform > p.comment-form-email {
		width: 50%;
	}
}
/* ==========================================================================
   40 — CART · CHECKOUT · MY ACCOUNT
   --------------------------------------------------------------------------
   Money pages. Correctness over flourish.

   Values here are transcribed from the live cascade (nutritix
   /assets/css/woocommerce/woocommerce.css + /style.css + the child theme) and
   from design-tokens.md §7.13 / §7.14. The irrational em literals
   (1.618em, 0.6180469716em, 3.706325903em, 6.8535260698em, …) come from the
   theme's 1.618 modular scale and are copied exactly — rounding them moves
   things 1–3px in a diff (§4.4, §8.14).

   THE SKEW IS OFF HERE. §7.0 / §8.4: the -10° parallelogram slab behind every
   button is deliberately suppressed on cart and checkout — and only there.
   My Account KEEPS the skew (see my-account__desktop.png: the Log in button is
   a black parallelogram over a brand-blue ground). Do not "fix" the asymmetry.
   ========================================================================== */


/* --------------------------------------------------------------------------
   40.1  Money-page shell
   -------------------------------------------------------------------------- */

/* `.woocommerce-cart .site-content { margin-bottom: 6.8535260698em }` is set by
   00-base.css and is not repeated here. */

.woocommerce-cart .entry-header,
.woocommerce-checkout .entry-header,
.woocommerce-account .entry-header {
	text-align: center;
	padding: 0 0 5.9968353111em;
}

/* Clearfix for the float-based cart / checkout / account grids. These layouts
   are floats, not grid — the percentage literals in §7.13/§7.14 depend on it —
   so every float container needs clearing or the footer rides up. */
.woocommerce-cart .cart-collaterals::before,
.woocommerce-cart .cart-collaterals::after,
.woocommerce-checkout form.checkout::before,
.woocommerce-checkout form.checkout::after,
.woocommerce-cart .woocommerce::before,
.woocommerce-cart .woocommerce::after,
.woocommerce-account .woocommerce::before,
.woocommerce-account .woocommerce::after {
	content: "";
	display: table;
}

.woocommerce-cart .cart-collaterals::after,
.woocommerce-checkout form.checkout::after,
.woocommerce-cart .woocommerce::after,
.woocommerce-account .woocommerce::after {
	clear: both;
}


/* --------------------------------------------------------------------------
   40.2  THE SKEW, SUPPRESSED — cart + checkout only
   -------------------------------------------------------------------------- */

/* 00-base.css already kills the slab for `.button` / `button.button` on both
   pages. Two cases it cannot see from there, added here:
     · submit buttons that carry no .button class (gateway-rendered ones);
     · the quantity stepper's +/- controls, which are bare <button> elements and
       would otherwise wear a black parallelogram inside a 40px box. */
.woocommerce-cart button[type="submit"]::before,
.woocommerce-cart button[type="submit"]::after,
.woocommerce-checkout button[type="submit"]::before,
.woocommerce-checkout button[type="submit"]::after,
table.cart .product-quantity .quantity button::before,
table.cart .product-quantity .quantity button::after {
	content: none;
	display: none;
}

/* input[type=submit] cannot carry a pseudo-element, so 00-base.css skews the
   element itself. Un-skew it here — plain means plain. */
.woocommerce-cart input[type="submit"],
.woocommerce-checkout input[type="submit"] {
	transform: none;
}

/* With the slab gone the buttons need their own ground. On the live site that
   ground comes from the Elementor kit rule
   `.elementor-kit-8 button { background-color:#4557C9 }` for <button> elements,
   and from per-component rules for <a class="button">. Reproduced here so these
   pages do not depend on a base-layer rule that no longer exists.
   Specificity is kept at (0,0,2,x) so a gateway's own button CSS still wins. */
.woocommerce-cart .button,
.woocommerce-cart button[type="submit"],
.woocommerce-cart input[type="submit"],
.woocommerce-checkout .button,
.woocommerce-checkout button[type="submit"],
.woocommerce-checkout input[type="submit"] {
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
	border-radius: var(--radius-sm);
}

.woocommerce-cart .button:hover,
.woocommerce-cart button[type="submit"]:hover,
.woocommerce-cart input[type="submit"]:hover,
.woocommerce-checkout .button:hover,
.woocommerce-checkout button[type="submit"]:hover,
.woocommerce-checkout input[type="submit"]:hover {
	background-color: var(--color-brand-hover);
	color: var(--color-text-on-brand);
}


/* --------------------------------------------------------------------------
   40.3  Notices  (§2, §7.14)
   Shown on cart, checkout, account and the shop. --color-success-notice-bg is
   overridden to brand blue on the live site, so .woocommerce-message is BLUE,
   not green. That is deliberate.
   -------------------------------------------------------------------------- */

.woocommerce-message,
.woocommerce-info,
.woocommerce-error,
.woocommerce-noreviews,
p.no-comments {
	margin: 0 0 var(--space-8);
	padding: 1.3em 1.618em 1em;
	background-color: var(--color-success);
	border-radius: var(--radius-xs);
	border-left: var(--border-notice-l);
	color: var(--color-text-on-brand);
	clear: both;
}

.woocommerce-message::before,
.woocommerce-message::after,
.woocommerce-info::before,
.woocommerce-info::after,
.woocommerce-error::before,
.woocommerce-error::after {
	content: "";
	display: table;
}

.woocommerce-message::after,
.woocommerce-info::after,
.woocommerce-error::after {
	clear: both;
}

.woocommerce-info,
.woocommerce-noreviews,
p.no-comments {
	background-color: var(--color-info);
}

.woocommerce-error {
	background-color: var(--color-error);
	list-style: none;
}

.woocommerce-message a,
.woocommerce-info a,
.woocommerce-error a,
.woocommerce-message strong,
.woocommerce-info strong,
.woocommerce-error strong {
	color: var(--color-text-on-brand);
}

.woocommerce-message a:hover,
.woocommerce-info a:hover,
.woocommerce-error a:hover {
	color: var(--color-text-on-brand);
	opacity: .7;
}

.woocommerce-message .button,
.woocommerce-info .button,
.woocommerce-error .button {
	float: right;
	margin-left: 1em;
	padding: 0 0 0 1em;
	background: none;
	color: var(--color-text-on-brand);
	box-shadow: none;
	line-height: 1.618;
	border: 0;
	border-left: 1px solid rgba(255, 255, 255, .25);
	border-radius: var(--radius-0);
}

.woocommerce-message .button:hover,
.woocommerce-info .button:hover,
.woocommerce-error .button:hover {
	background: none;
	color: var(--color-text-on-brand);
	opacity: .7;
}

/* Child-theme override: the "added to cart" message is brand blue with a
   deeper top rule, and its button is a white outline. */
.woocommerce .woocommerce-message {
	background-color: var(--color-success-notice-bg);
	border-top: 3px solid var(--color-brand-deep);
	color: var(--color-text-on-brand);
}

.woocommerce .woocommerce-message::before {
	color: var(--color-text-on-brand);
}

.woocommerce .woocommerce-message .button,
.woocommerce .woocommerce-message a.button {
	background-color: transparent;
	border: 2px solid var(--color-text-on-brand);
	color: var(--color-text-on-brand);
	box-shadow: none;
}

.home .woocommerce-message,
.home .woocommerce-info,
.home .woocommerce-error {
	display: none;
}


/* --------------------------------------------------------------------------
   40.4  Free-shipping progress banner  (.fpl-ship-*)
   Ported from the live site's fpl_free_shipping_cart_banner() inline <style>.
   The navy and the light periwinkle are banner-only and have no token.
   -------------------------------------------------------------------------- */

.fpl-ship-banner {
	--fpl-ship-navy: #0D122D;
	--fpl-ship-accent: #7C8BEF;

	margin: 0 0 24px;
	padding: 18px 22px;
	background: var(--fpl-ship-navy);
	border: 1px solid rgba(69, 87, 201, .45);
	border-radius: 14px;
	color: var(--color-text-on-brand);
	font-family: "Inter", Arial, Helvetica, sans-serif;
}

.fpl-ship-row {
	display: flex;
	align-items: center;
	gap: var(--space-4);
	margin-bottom: 14px;
}

.fpl-ship-check {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 26px;
	height: 26px;
	border-radius: var(--radius-round);
	background: var(--color-brand);
	color: var(--color-text-on-brand);
	font-weight: 700;
	font-size: 15px;
	line-height: 1;
	box-shadow: 0 0 10px rgba(69, 87, 201, .7);
}

.fpl-ship-text {
	font-family: var(--font-display);
	font-size: 15px;
	line-height: 1.4;
	font-weight: 500;
}

.fpl-ship-text strong,
.fpl-ship-text .amount {
	color: var(--fpl-ship-accent);
	font-weight: 700;
}

.fpl-ship-track {
	position: relative;
	padding-top: var(--space-1);
}

.fpl-ship-bar {
	display: block;
	width: 100%;
	height: 10px;
	border-radius: var(--radius-pill);
	background: rgba(255, 255, 255, .10);
	overflow: hidden;
}

.fpl-ship-bar-fill {
	display: block;
	height: 100%;
	border-radius: var(--radius-pill);
	background: linear-gradient(90deg, var(--color-brand) 0%, var(--fpl-ship-accent) 100%);
	box-shadow: 0 0 12px rgba(69, 87, 201, .85);
	transition: width var(--dur-slow) var(--ease-base);
}

.fpl-ship-target {
	position: absolute;
	top: -24px;
	right: 0;
	font-family: var(--font-display);
	font-size: var(--fs-small);
	font-weight: 600;
	color: rgba(255, 255, 255, .65);
	white-space: nowrap;
}

@media (prefers-reduced-motion: reduce) {
	.fpl-ship-bar-fill {
		transition: none;
	}
}

/* 600px is NOT one of §6's canonical five (767/880/1024/1200/1366), and it is
   kept deliberately. EVIDENCE: it is the live site's own breakpoint for this
   exact component — current-theme/nutritix-child-functions.php line 898,
   `@media (max-width:600px)`, inside fpl_free_shipping_cart_banner()'s inline
   <style>, with the same three declarations reproduced below. Moving it to 576
   or 767 would change where .fpl-ship-target unpins and stacks, i.e. it would
   deviate from production on a component that is otherwise a verbatim port.
   Reviewed 2026-09-03; keeping the live value. */
@media (max-width: 600px) {
	.fpl-ship-banner {
		padding: 16px 18px;
	}

	.fpl-ship-track {
		padding-top: 0;
	}

	.fpl-ship-target {
		position: static;
		display: block;
		text-align: right;
		margin-top: 8px;
		white-space: normal;
		line-height: 1.3;
	}
}


/* --------------------------------------------------------------------------
   40.5  Cart table  (§7.13)
   -------------------------------------------------------------------------- */

.woocommerce-cart-form {
	margin-bottom: 0;
}

.woocommerce-cart-form table td {
	vertical-align: middle;
}

/* Quantity changes apply instantly (40-cart.js hides "Update cart" and submits
   on a debounce). This is the in-flight state. */
.woocommerce-cart-form.fpl-cart-updating {
	opacity: .55;
	pointer-events: none;
	transition: opacity var(--dur-fast) var(--ease-base);
}

table.cart {
	margin-bottom: 3.706325903em;
}

table.cart thead {
	border-bottom: var(--border-hairline);
}

table.cart th {
	text-transform: uppercase;
	color: var(--color-text-strong);
	font-weight: 500;
}

table.cart td,
table.cart th {
	padding: 2em 0 0;
}

table.cart tr td {
	text-align: left;
	border-color: var(--color-border);
}

table.cart tr td[data-title]::before {
	font-size: var(--fs-small);
	text-transform: uppercase;
	color: var(--color-text-strong);
	font-weight: 400;
}

table.cart .cart_item {
	margin-bottom: 1em;
	border-bottom: var(--border-hairline);
}

table.cart td.product-thumbnail img {
	max-width: 90px;
	margin: auto;
}

table.cart td.product-thumbnail::before {
	display: none;
}

table.cart td.product-remove {
	padding: 0;
	position: relative;
}

table.cart tr:first-child td.product-remove {
	border-top-width: 0;
}

table.cart td.product-remove a.remove {
	position: absolute;
	top: -8px;
	left: -6px;
	font-size: 1.41575em;
	color: var(--color-text-strong);
	text-decoration: none;
	line-height: 1;
}

table.cart td.product-remove a.remove:hover,
table.cart td.product-remove a.remove:focus-visible {
	color: var(--color-error-strong);
}

table.cart td.product-name::before {
	margin-right: 1em;
}

table.cart td.product-name a {
	font-size: var(--fs-body);
	line-height: 22px;
	font-weight: 600;
	color: var(--color-text-strong);
	text-decoration: none;
}

table.cart td.product-name a:hover {
	color: var(--color-brand);
}

table.cart td.product-price .amount {
	color: var(--color-text-strong);
}

table.cart td.product-subtotal {
	padding-bottom: 1.41575em;
}

table.cart td.product-subtotal .amount {
	color: var(--color-text-strong);
	font-weight: 600;
}


/* --------------------------------------------------------------------------
   40.6  Quantity stepper  (§7.13)
   Built here, not patched. WooCommerce's own quantity-input template supplies
   the <input name="cart[key][qty]">; cart.php adds the two buttons through the
   core woocommerce_before/after_quantity_input_field hooks.
   -------------------------------------------------------------------------- */

table.cart .product-quantity .quantity {
	position: relative;
	display: inline-flex;
	float: left;
	align-items: center;
	justify-content: center;
	width: 120px;
	height: 40px;
	overflow: hidden;
	border: 1px solid var(--color-surface-light);
	border-radius: var(--radius-0);
	background-color: var(--color-bg);
}

table.cart .product-quantity .quantity.hidden {
	display: none;
}

table.cart .product-quantity .quantity button {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 38px;
	padding: 0;
	border: none;
	border-radius: var(--radius-0);
	background-color: var(--color-bg);
	color: var(--color-ink-solid);
	font-size: var(--fs-small);
	font-weight: 700;
	text-align: center;
	z-index: var(--z-qty-btn);
	transition: background-color var(--dur-base) var(--ease-base), color var(--dur-base) var(--ease-base);
}

table.cart .product-quantity .quantity button:hover,
table.cart .product-quantity .quantity button:focus-visible {
	background-color: var(--color-brand);
	/* Live CSS leaves the glyph black on the blue hover fill, which lands at
	   3.3:1. White is the only deviation from the live cascade in this file,
	   and it matches every other brand-blue surface on the site. */
	color: var(--color-text-on-brand);
	outline: none;
}

table.cart .product-quantity .quantity .qty {
	width: 40px;
	padding: 9px 0;
	border: none;
	border-radius: var(--radius-0);
	background-color: transparent;
	color: var(--color-ink-solid);
	font-size: var(--fs-small);
	font-weight: 700;
	letter-spacing: .2px;
	text-align: center;
	appearance: textfield;
	-moz-appearance: textfield;
}

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

table.cart .product-quantity .quantity .qty:focus-visible {
	outline: none;
	box-shadow: var(--shadow-ring-pack);
}

/* The theme ships a visible "Quantity" caption inside the box. Not used. */
table.cart .product-quantity .quantity .text-quantity {
	display: none;
}


/* --------------------------------------------------------------------------
   40.7  Cart actions + coupon  (§7.13)
   -------------------------------------------------------------------------- */

table.cart td.actions {
	background-color: transparent;
	padding: 10px 0 0;
}

table.cart td.actions label {
	display: none;
}

table.cart td.actions .coupon {
	position: relative;
	margin-bottom: 1.5em;
	text-align: left;
	border-color: var(--color-border);
}

table.cart td.actions .coupon .input-text {
	min-width: 220px;
	margin-right: var(--space-3);
}

table.cart td.actions .coupon .input-text:focus {
	border-color: var(--color-brand);
}

table.cart td.actions input {
	display: block;
	width: 100%;
	margin: 0.5407911001em 0;
}


/* --------------------------------------------------------------------------
   40.8  Cart totals panel  (§7.13)
   -------------------------------------------------------------------------- */

.cart-collaterals {
	margin-bottom: var(--space-8);
}

.cart_totals {
	position: relative;
	padding: var(--space-panel-pad);
	background-color: var(--color-bg);
	border: var(--border-panel);      /* 6px — a design choice, not a bug (§8.13) */
	border-radius: var(--radius-lg);
}

.cart_totals > h2 {
	font-size: var(--fs-totals-head);
	margin-bottom: var(--space-5);
}

.cart_totals table {
	width: 100%;
	margin-bottom: 0;
}

.cart_totals table th {
	color: var(--color-text-strong);
	font-size: var(--fs-totals-row);
}

.cart_totals table th,
.cart_totals table td {
	padding: 1em 0;
}

.cart_totals .cart-subtotal {
	border-bottom: var(--border-hairline);
}

.cart_totals .cart-subtotal .amount {
	color: var(--color-text-strong);
	font-size: var(--fs-totals-row);
}

.cart_totals .order-total {
	border-top: var(--border-hairline);
}

.cart_totals .order-total th {
	vertical-align: middle;
}

.cart_totals .order-total td {
	font-size: 2.2906835em;
	padding: .5em 0;
}

.cart_totals .order-total .amount {
	color: var(--color-brand);
	font-size: var(--fs-totals-grand);
}

.cart_totals .checkout-button {
	display: block;
	text-align: center;
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}

.cart_totals .checkout-button:hover {
	background-color: var(--color-text-strong);
	color: var(--color-text-on-brand);
}

.woocommerce-shipping-calculator {
	margin: 0;
}

.woocommerce-shipping-calculator > p:first-child {
	margin: 0;
}

.woocommerce-shipping-calculator .shipping-calculator-form {
	padding-top: 1.41575em;
}

.woocommerce-cart ul#shipping_method,
.woocommerce-checkout ul#shipping_method {
	margin: 0;
	padding: 0;
	list-style: none;
}

.woocommerce-cart ul#shipping_method li,
.woocommerce-checkout ul#shipping_method li {
	margin: 0 0 var(--space-2);
	list-style: none;
}

.woocommerce-checkout ul#shipping_method {
	margin-bottom: 0;
}


/* --------------------------------------------------------------------------
   40.9  Cross-sells
   -------------------------------------------------------------------------- */

.woocommerce-cart .cross-sells {
	margin-bottom: var(--space-9);
}

.cross-sells h2 {
	margin-bottom: var(--space-8);
	font-size: var(--fs-totals-head);
}

.cross-sells .slick-list li.product {
	max-width: 100%;
}

/* Card CTAs inside cross-sells would otherwise inherit the product-card's
   white ground with the skewed black slab suppressed — white on white. */
.woocommerce-cart .cross-sells ul.products li.product .product-caption a.button {
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}


/* --------------------------------------------------------------------------
   40.10  Empty cart
   -------------------------------------------------------------------------- */

.wc-empty-cart-message {
	text-align: center;
}

.fpl-empty-cart-icon {
	display: block;
	margin: 0 auto var(--space-10);
	color: var(--color-surface-light);
	max-width: 100%;
	height: auto;
}

/* Notice chrome off, centred 18px copy on. Padding is left at the notice
   default (1.3em 1.618em 1em) — the live rule only resets background+border. */
.woocommerce-cart .cart-empty {
	background-color: transparent;
	border: none;
	text-align: center;
	font-size: var(--fs-totals-row);
	color: var(--color-text-strong);
}

.woocommerce-cart .return-to-shop {
	text-align: center;
}

.woocommerce-cart .return-to-shop a {
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}

.woocommerce-cart .return-to-shop a:hover {
	background-color: var(--color-text-strong);
	color: var(--color-text-on-brand);
}


/* --------------------------------------------------------------------------
   40.11  Mini-cart (header side-cart drawer)
   -------------------------------------------------------------------------- */

.widget_shopping_cart .cart_list,
.woocommerce-mini-cart {
	margin: 0;
	padding: 0;
	list-style: none;
}

.widget_shopping_cart .mini_cart_item {
	display: block;
	position: relative;
	border-bottom: var(--border-hairline);
	font-size: var(--fs-body);
}

.widget_shopping_cart .mini_cart_item a {
	display: inline-block;
	margin-bottom: 3px;
	line-height: 1.41575em;
	color: var(--color-text-strong);
	font-weight: 500;
	text-decoration: none;
}

.widget_shopping_cart .mini_cart_item a:hover {
	color: var(--color-brand);
}

.widget_shopping_cart .mini_cart_item .quantity {
	color: var(--color-text-strong);
}

.widget_shopping_cart .mini_cart_item .quantity .amount {
	color: var(--color-brand);
	font-weight: 600;
}

.widget_shopping_cart .woocommerce-mini-cart__total {
	border-top: var(--border-hairline);
	padding-top: var(--space-3);
}

.widget_shopping_cart .woocommerce-mini-cart__total .amount {
	color: var(--color-brand);
	font-weight: 600;
}

.widget_shopping_cart .woocommerce-mini-cart__empty-message {
	color: var(--color-text-muted);
}


/* --------------------------------------------------------------------------
   40.12  Form controls — shared by checkout and account  (§7.14)
   -------------------------------------------------------------------------- */

/* .form-row is a <p>. Its vertical rhythm comes from the base `p { margin:0 0 1em }`,
   exactly as on the live site — WooCommerce's own stylesheet is not loaded, so
   there is no .form-row margin to reproduce here. */
.form-row label {
	display: block;
	margin-bottom: .5em;
	color: var(--color-text-strong);
}

.required {
	color: var(--color-error);
	border-bottom: 0;
	text-decoration: none;
}

.form-row input,
.form-row textarea,
.form-row select {
	width: 100%;
}

.form-row input[type="checkbox"],
.form-row input[type="radio"] {
	width: auto;
}

.form-row .button {
	width: auto;
}

.form-row.create-account label {
	display: inline-block;
}

.form-row-wide {
	clear: both;
	width: 100%;
}

.form-row-last {
	margin-right: 0;
}

/* Validation states. */
.form-row.woocommerce-validated input.input-text {
	box-shadow: var(--shadow-inset-ok);
}

.form-row.woocommerce-invalid input.input-text {
	box-shadow: var(--shadow-inset-err);
}

.form-row.woocommerce-invalid input.input-checkbox {
	outline: 2px solid var(--color-error);
	outline-offset: 1px;
}

.form-row.woocommerce-invalid .select2-selection {
	border-color: var(--color-error);
	border-width: 2px;
}

/* select2 country / state pickers. */
.form-row .select2-container--default .select2-selection--single {
	min-height: 52px;
	background-color: var(--color-bg);
	border: var(--border-input);
	border-radius: var(--radius-lg);
}

.form-row .select2-container--default .select2-selection--single .select2-selection__rendered {
	line-height: 52px;
	color: var(--color-text);
}

.form-row .select2-container--default .select2-selection--single .select2-selection__arrow {
	height: 52px;
}

.woocommerce-checkout .select2-dropdown,
.woocommerce-checkout .select2-container--default .select2-search--dropdown .select2-search__field {
	border: var(--border-input);
}

.form-row .select2-container--default .select2-search--dropdown .select2-search__field {
	background: var(--color-bg);
}

/* Password reveal button injected by WooCommerce's own script. */
.woocommerce form .show-password-input,
.woocommerce-page form .show-password-input {
	position: absolute;
	right: .7em;
	top: 50%;
	transform: translateY(-50%);
	margin: 0;
	padding: 0;
	background: transparent;
	border: 0;
	border-radius: var(--radius-0);
	color: var(--color-text);
	cursor: pointer;
	font-size: var(--fs-body);
	line-height: inherit;
	text-decoration: none;
	-webkit-appearance: none;
	appearance: none;
}

.woocommerce form .woocommerce-password-hint,
.woocommerce form .password-input {
	display: block;
	position: relative;
}


/* --------------------------------------------------------------------------
   40.13  Checkout layout  (§7.14)
   -------------------------------------------------------------------------- */

.woocommerce-checkout form.checkout {
	position: static;
}

.woocommerce-checkout form.checkout > .blockUI {
	position: fixed;
}

.woocommerce-checkout form.checkout h3 {
	font-size: var(--fs-totals-head);
}

.checkout_coupon {
	display: grid;
	max-width: 622px;
	margin-bottom: 2.617924em;
}

.checkout_coupon p:first-child {
	grid-column: 1 / span 2;
}

.checkout_coupon .form-row-first {
	width: 100%;
	margin-right: 0;
}

.checkout_coupon .form-row-last {
	width: unset;
	float: left;
}

.checkout_coupon .input-text {
	width: 100%;
}

.checkout_coupon .input-text:focus {
	border-color: var(--color-text-strong);
}

.checkout_coupon button[type="submit"] {
	margin-left: var(--space-6);
}

/* The "Returning customer? / Have a coupon?" toggles are plain text, not
   notice bars, even though WooCommerce marks them up as .woocommerce-info. */
.woocommerce-form-login-toggle .woocommerce-info,
.woocommerce-form-coupon-toggle .woocommerce-info {
	padding: 0;
	border: 0;
	background-color: transparent;
	color: var(--color-text);
}

.woocommerce-form-login-toggle .woocommerce-info a,
.woocommerce-form-coupon-toggle .woocommerce-info a {
	color: var(--color-brand);
}

.woocommerce-form-login-toggle .woocommerce-info {
	margin-bottom: var(--space-3);
}

.woocommerce-checkout .woocommerce form.woocommerce-form-login {
	max-width: 505px;
	margin-left: 0;
	margin-top: var(--space-8);
}

.woocommerce-checkout .woocommerce form.woocommerce-form-login .form-row-first,
.woocommerce-checkout .woocommerce form.woocommerce-form-login .form-row-last {
	width: 100%;
	margin-right: 0;
}


/* --------------------------------------------------------------------------
   40.14  Order review panel  (§7.14)
   -------------------------------------------------------------------------- */

#order_review {
	position: relative;
	padding: var(--space-panel-pad);
	background-color: var(--color-bg);
	border: var(--border-panel);      /* 6px — matches .cart_totals */
	border-radius: var(--radius-lg);
	transition: box-shadow var(--dur-slow) var(--ease-base);
}

#order_review_heading {
	font-size: var(--fs-totals-head);
}

#order_review table {
	width: 100%;
	margin-bottom: 0;
}

#order_review table th,
#order_review table td {
	padding: 1em 0;
	border-top: var(--border-hairline);
}

#order_review .woocommerce-checkout-review-order-table thead th,
#order_review .woocommerce-checkout-review-order-table thead td {
	border: none;
}

#order_review .woocommerce-checkout-review-order-table th {
	color: var(--color-text-strong);
	font-size: var(--fs-totals-row);
	font-weight: 500;
}

#order_review .woocommerce-checkout-review-order-table th.product-total {
	text-align: right;
}

#order_review .woocommerce-checkout-review-order-table td {
	text-align: right;
	vertical-align: middle;
}

#order_review .woocommerce-checkout-review-order-table td.product-name {
	text-align: left;
}

#order_review .woocommerce-checkout-review-order-table .cart-subtotal .amount {
	color: var(--color-text-strong);
}

#order_review .woocommerce-checkout-review-order-table .order-total th {
	vertical-align: middle;
}

#order_review .woocommerce-checkout-review-order-table .order-total .amount {
	color: var(--color-brand);
	font-size: var(--fs-totals-grand);
	font-weight: 600;
}

table.woocommerce-checkout-review-order-table .variation,
table.woocommerce-checkout-review-order-table .product-quantity {
	color: var(--color-text);
	font-weight: 400;
}


/* --------------------------------------------------------------------------
   40.15  Payment methods  (§7.14)
   Two live gateways bind here: ONVO Direct and Link Money. Nothing below
   touches gateway-supplied markup — only the list chrome around it.
   -------------------------------------------------------------------------- */

#payment::before,
#payment::after {
	content: "";
	display: table;
}

#payment::after {
	clear: both;
}

#payment .payment_methods {
	margin: 0;
	padding: 0;
}

#payment .payment_methods li {
	position: relative;
	margin-left: 0;
	list-style: none;
}

#payment .payment_methods > .wc_payment_method,
#payment .payment_methods > .woocommerce-PaymentMethod {
	border-bottom: var(--border-hairline);
}

#payment .payment_methods > .wc_payment_method > label,
#payment .payment_methods > .woocommerce-PaymentMethod > label {
	display: block;
	margin-left: 0;
	padding: 1em 0;
	font-size: var(--fs-h6);
	font-weight: 700;
	color: var(--color-text-strong);
	cursor: pointer;
}

#payment .payment_methods li.wc_payment_method > input[type="radio"]:first-child:checked + label::before,
#payment .payment_methods li.woocommerce-PaymentMethod > input[type="radio"]:first-child:checked + label::before {
	color: var(--color-brand);
}

#payment .payment_methods li img {
	float: right;
	max-height: 1.618em;
	padding: 0;
	border: 0;
}

#payment .payment_methods li p {
	margin: 0;
}

#payment .payment_methods li .payment_box {
	padding: 1em 1.618em 2em;
	font-size: .875em;
}

#payment .payment_methods li .payment_box fieldset {
	margin: 0;
	padding: 1em 0 0;
	border: 0;
	font-size: .875em;
}

#payment .payment_methods li .payment_box fieldset label {
	width: auto;
	margin-left: 0;
}

#payment .payment_methods li .payment_box fieldset .form-row {
	margin-bottom: 1em;
}

#payment .payment_methods li .payment_box fieldset .form-row input[type="checkbox"] {
	margin-right: 5px;
}

#payment .payment_methods li .payment_box .woocommerce-SavedPaymentMethods {
	margin: 0;
	padding-top: 1em;
}

#payment .payment_methods li .payment_box .woocommerce-SavedPaymentMethods li {
	margin-top: 0.6180469716em;
}

#payment .payment_methods li .payment_box .woocommerce-SavedPaymentMethods li input[type="radio"] {
	margin-right: .236em;
}

#payment .terms {
	width: 100%;
	clear: both;
	float: none;
	margin-bottom: 1em;
}

#payment .terms label {
	display: block;
	cursor: pointer;
}

#payment .woocommerce-terms-and-conditions {
	margin-bottom: 16px;
	padding: 1em;
	background-color: rgba(0, 0, 0, .05);
	box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);
}

#payment .place-order {
	float: none;
	width: 100%;
	margin: 1.618em 0 0;
}

#payment .place-order .button {
	width: 100%;
	white-space: pre-wrap;
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}

#payment .place-order .button:hover {
	background-color: var(--color-text-strong);
	color: var(--color-text-on-brand);
}

#payment .create-account {
	clear: both;
}


/* --------------------------------------------------------------------------
   40.16  Order received / thank you
   -------------------------------------------------------------------------- */

.woocommerce-order .woocommerce-thankyou-order-received {
	padding: 2.2906835em 1.41575em;
	background-color: #F8F8F8; /* order-received panel only — no token exists for this grey */
	color: var(--color-success);
	font-size: var(--fs-totals-grand);
	font-weight: 700;
	text-align: center;
}

.woocommerce-order .woocommerce-order-details__title,
.woocommerce-order .woocommerce-customer-details h2 {
	font-size: 1.618em;
	text-align: center;
	text-transform: uppercase;
}

.woocommerce-order .woocommerce-customer-details h2 {
	text-transform: none;
}

ul.order_details {
	position: relative;
	max-width: 900px;
	margin: 0 auto 1.618em;
	list-style: none;
	padding: 0;
}

ul.order_details::before,
ul.order_details::after {
	content: "";
	display: table;
}

ul.order_details::after {
	clear: both;
}

ul.order_details li {
	padding: 1em 1.618em;
	text-align: center;
	border-color: var(--color-border);
}

ul.order_details li:first-child {
	padding-top: 1.618em;
	border: 0;
}

ul.order_details li:last-child {
	padding-bottom: 1.618em;
}

ul.order_details li strong {
	display: block;
	color: var(--color-text-strong);
	text-transform: none;
}

.woocommerce-order .woocommerce-table--order-details {
	max-width: 900px;
	margin: 1.41575em auto 5.9968353111em;
	width: 100%;
}

.woocommerce-order .woocommerce-table--order-details th {
	color: var(--color-text-strong);
}

.woocommerce-order .woocommerce-table--order-details td,
.woocommerce-order .woocommerce-table--order-details th {
	padding-left: 0;
	padding-right: 0;
	border-top: var(--border-hairline);
}

.woocommerce-order .woocommerce-table--order-details thead td,
.woocommerce-order .woocommerce-table--order-details thead th {
	border-top: 0;
	border-bottom: 2px solid var(--color-border);
}

.woocommerce-order .woocommerce-table--order-details tr td:last-child,
.woocommerce-order .woocommerce-table--order-details tr th:last-child {
	text-align: right;
}

.woocommerce-order .woocommerce-table--order-details .product-name a {
	color: var(--color-text);
}

.woocommerce-order .woocommerce-table--order-details .product-name a:hover {
	color: var(--color-brand);
}

.woocommerce-order .woocommerce-table--order-details tfoot {
	color: var(--color-text-strong);
}

.woocommerce-order .woocommerce-table--order-details tfoot .amount {
	font-weight: 700;
}

.woocommerce-order .woocommerce-table--order-details tfoot tr:last-child .amount {
	font-size: 1.618em;
	font-weight: 700;
	color: var(--color-brand);
}


/* --------------------------------------------------------------------------
   40.17  My Account
   The skew stays ON here — see the header note.
   -------------------------------------------------------------------------- */

.woocommerce-MyAccount-navigation ul {
	margin-left: 0;
	padding-left: 0;
	border-top: var(--border-hairline);
}

.woocommerce-MyAccount-navigation ul li {
	position: relative;
	list-style: none;
	border-bottom: var(--border-hairline);
}

.woocommerce-MyAccount-navigation ul li a {
	display: block;
	padding: 0.875em 0;
	color: var(--color-text-strong);
	text-decoration: none;
}

.woocommerce-MyAccount-navigation ul li a:hover,
.woocommerce-MyAccount-navigation ul li.is-active a {
	color: var(--color-brand);
}

.woocommerce-MyAccount-content h2 {
	font-size: 2em;
	font-weight: 600;
}

.woocommerce-MyAccount-content table {
	width: 100%;
}

.woocommerce-MyAccount-content table th {
	color: var(--color-text-strong);
}

.woocommerce-MyAccount-content table thead th,
.woocommerce-MyAccount-content table tr:nth-of-type(even) {
	background-color: rgba(0, 0, 0, .05);
}

.woocommerce-MyAccount-content .woocommerce-Pagination {
	text-align: center;
}

.woocommerce-MyAccount-content .order_details a:not(.button) {
	color: var(--color-text-strong);
}

.woocommerce-MyAccount-content .order_details a:not(.button):hover {
	text-decoration: underline;
}

.woocommerce-MyAccount-content .order_details .product-total .amount {
	font-weight: 700;
}

.woocommerce-MyAccount-content .order_details tfoot .amount {
	font-size: 1.41575em;
	font-weight: 700;
	color: var(--color-text-strong);
}

.woocommerce-MyAccount-content .order-again {
	margin-bottom: 3.706325903em;
}

.my_account_orders .button,
.woocommerce-MyAccount-downloads .button {
	padding: 0.6180469716em 0.875em;
	font-size: .875em;
	margin-right: .236em;
}


/* --------------------------------------------------------------------------
   40.18  Login / register forms
   -------------------------------------------------------------------------- */

.login-form-title,
.register-from-title {
	font-size: var(--fs-totals-head);
	margin-bottom: var(--space-9);
}

form.woocommerce-form-login,
form.woocommerce-form-register {
	max-width: 440px;
	margin-left: auto;
	margin-right: auto;
}

form.woocommerce-form-login .woocommerce-form-login-wrap {
	margin-bottom: var(--space-8);
}

form.woocommerce-form-login .form-row label,
form.woocommerce-form-register .form-row label {
	line-height: 28px;
	margin-bottom: 5px;
}

form.woocommerce-form-register .form-row-wide {
	margin-bottom: 32px;
}

form.woocommerce-form-register .woocommerce-privacy-policy-text {
	margin-bottom: var(--space-8);
}

form.woocommerce-form-login .woocommerce-form__label-for-checkbox {
	float: left;
	margin-bottom: 0;
}

form.woocommerce-form-login .woocommerce-form__label-for-checkbox input {
	margin-right: var(--space-2);
}

form.woocommerce-form-login .woocommerce-LostPassword {
	float: right;
	margin-bottom: 35px;
}

form.woocommerce-form-login .woocommerce-LostPassword a {
	color: var(--color-text);
	text-decoration: underline;
	text-decoration-style: dotted;
}

form.woocommerce-form-login .woocommerce-LostPassword a:hover {
	color: var(--color-brand);
}

form.woocommerce-form-login button[type="submit"],
form.woocommerce-form-register button[type="submit"] {
	display: block;
	width: 100%;
	clear: both;
}

/* The blue ground under the slab.

   Live, `.elementor-kit-8 button { background-color:#4557C9 }` gives every
   native <button> on the site a brand-blue background. On cart and checkout
   the slab is suppressed and §40.2 above restores that ground; on My Account
   the slab is LIVE, and this background is what shows past the skewed ::after
   as the blue sliver down the right edge of the LOG IN control — see
   my-account__desktop.png. Without it the button is a plain black
   parallelogram and the page loses its only piece of brand colour.

   Scoped to the account page's own forms rather than to `button`, so the
   header search submit and any gateway-rendered button keep their own rules
   (§40.2's specificity note). The checkout's login form is untouched here:
   it is covered by §40.2, where the slab is off. */
.woocommerce-account .woocommerce-form-login__submit,
.woocommerce-account .woocommerce-form-register__submit,
.woocommerce-account .woocommerce-MyAccount-content button[type="submit"] {
	background-color: var(--color-brand);
}


/* ==========================================================================
   RESPONSIVE
   Canonical set is 767 / 880 / 1024 / 1200 / 1366, plus three foreign
   breakpoints these pages cannot avoid: 600 (the free-shipping banner's own
   live query — see §40.4), 900 (cart cell padding) and 911 (the cart's
   two-column switch). See §6 and §8.12.

   880px IS DELIBERATELY UNUSED HERE, and this is the evidence §6 asks for.
   Fetched production read-only on 2026-09-03 and parsed every @media block
   containing 880 in the live cascade:
     · nutritix/assets/css/woocommerce/woocommerce.css  — 0 blocks
     · nutritix/style.css                                — 0 blocks
     · nutritix-child/style.css                          — 0 blocks
     · uploads/elementor/css/custom-frontend.min.css     — 5 blocks, 32 rules,
       all of them Elementor's generic `mobile_extra` alignment and
       column-reverse utilities (.elementor-mobile_extra-align-*,
       .elementor-reverse-mobile_extra > .elementor-container > *).
   Not one 880px rule anywhere touches a cart, checkout, account, payment,
   coupon or shop_table selector. Nothing reflows at 880 on these three
   templates, so adding an 880 step here would invent behaviour, not restore
   it. (Elementor-built pages are a different question — not this file's.)
   ========================================================================== */

/* --- ≥768px: the cart becomes a real table again ------------------------- */
@media (min-width: 768px) {

	table.shop_table_responsive thead {
		display: table-header-group;
	}

	table.shop_table_responsive tbody th {
		display: table-cell;
	}

	table.shop_table_responsive tr td {
		display: table-cell;
	}

	table.shop_table_responsive tr td::before {
		display: none;
	}

	table.shop_table_responsive tr.woocommerce-shipping-totals td {
		width: 60%;
	}

	table.cart th,
	table.cart td {
		padding: 1.618em 1.618em 1.618em 0;
	}

	table.cart td.product-remove {
		display: table-cell;
		width: 5%;
		padding: 1.618em 1.618em 1.618em 0;
		border: 0;
	}

	table.cart td.product-remove a.remove {
		position: relative;
		float: none;
		top: auto;
		right: auto;
		left: auto;
		font-size: 1em;
	}

	table.cart td.product-thumbnail {
		width: 17%;
	}

	table.cart td.product-name {
		width: 30%;
	}

	table.cart td.product-price {
		width: 16%;
	}

	table.cart td.product-subtotal {
		padding-bottom: 2.2906835em;
	}

	table.cart td.actions {
		padding-top: var(--space-8);
		padding-bottom: 0;
	}

	table.cart td.actions .coupon {
		display: flex;
		float: left;
		width: 60%;
		padding: 25px 30px 30px;
		margin-top: 1.5em;
		margin-bottom: 0;
		border: var(--border-coupon);
	}

	table.cart td.actions input {
		display: inline-block;
		width: auto;
		margin: 0;
	}

	.cart-collaterals .cross-sells {
		width: 42.0289855072%;
		float: left;
		margin-right: 4.347826087%;
	}

	.cart-collaterals .shipping_calculator {
		width: 53.6231884058%;
		float: right;
		margin: 0;
		clear: right;
	}

	.cart-collaterals .cart_totals small.includes_tax {
		display: block;
	}

	/* Checkout two-column grid. */
	.col2-set {
		width: 53.6231884058%;
		float: left;
		margin-right: 4.347826087%;
	}

	.col2-set .col-1,
	.col2-set .col-2 {
		margin-bottom: 1.618em;
	}

	.col2-set .form-row-first {
		width: 48.3870967742%;
		float: left;
		margin-right: 3.2258064516%;
	}

	.col2-set .form-row-last {
		width: 48.3870967742%;
		float: right;
		margin-right: 0;
	}

	.col2-set.addresses {
		width: 100%;
		float: left;
		margin-left: 0;
		margin-right: 0;
	}

	.col2-set.addresses .col-1 {
		width: 47.8260869565%;
		float: left;
		margin-right: 4.347826087%;
	}

	.col2-set.addresses .col-2 {
		width: 47.8260869565%;
		float: right;
		margin-right: 0;
	}

	.form-row-first {
		width: 48.3870967742%;
		float: left;
		margin-right: 3.2258064516%;
		clear: both;
	}

	.form-row-last {
		width: 48.3870967742%;
		float: right;
		margin-right: 0;
	}

	#order_review {
		width: 42.0289855072%;
		float: right;
		margin-right: 0;
		clear: right;
	}

	#customer_details + #wc_checkout_add_ons {
		width: 42.0289855072%;
		float: right;
		margin-right: 0;
	}

	.woocommerce-order-pay #order_review {
		width: 100%;
		float: none;
	}

	.woocommerce-order-pay #order_review .button#place_order {
		display: block;
		width: 100%;
		font-size: 1.41575em;
	}

	.checkout_coupon {
		grid-template-columns: 53.6231884058% auto;
	}

	.col2-set#customer_login {
		width: 100%;
		margin: 0;
	}

	.col2-set#customer_login .col-1 {
		width: 50%;
		float: left;
		padding-right: 5%;
	}

	.col2-set#customer_login .col-2 {
		width: 50%;
		float: right;
		padding-left: 5%;
	}

	.col2-set#customer_login form.woocommerce-form-login {
		margin-right: 0;
	}

	/* Account sidebar. */
	.woocommerce-MyAccount-navigation {
		width: 27.2727272727%;
		float: left;
		margin-right: 3.8961038961%;
	}

	.woocommerce-MyAccount-content {
		width: 68.8311688312%;
		float: right;
		margin-right: 0;
	}

	ul.order_details {
		margin: 3.706325903em auto;
		display: flex;
		justify-content: center;
		max-width: 100%;
	}

	ul.order_details li {
		width: 22.5806451613%;
		float: left;
		margin: 0 3.2258064516% 0 0;
		padding-top: 0;
		padding-bottom: 0;
		border-left: 1px solid var(--color-border);
	}

	ul.order_details li:first-child {
		border: 0;
		padding-top: 0;
	}

	ul.order_details li:last-child {
		float: right;
		margin-right: 0;
		padding-bottom: 0;
	}
}

/* --- 768–900px: the cart table's cells tighten up ------------------------ */
@media (min-width: 768px) and (max-width: 900px) {

	table.cart td,
	table.cart th {
		padding: 1em;
	}
}

/* --- ≥911px: cart becomes two columns ------------------------------------ */
@media (min-width: 911px) {

	.woocommerce-cart-form,
	.woocommerce-cart .cross-sells {
		width: 65.5913978495%;
		float: left;
		margin-right: 3.2258064516%;
	}

	.cart-collaterals {
		width: 31.1827956989%;
		float: right;
		margin-right: 0;
	}
}

/* --- ≤767px: the cart table collapses to stacked cards ------------------- */
@media (max-width: 767px) {

	table.shop_table_responsive thead,
	table.shop_table_responsive tbody th {
		display: none;
	}

	table.shop_table_responsive tr td {
		display: block;
		text-align: right;
		clear: both;
	}

	table.shop_table_responsive tr td::before,
	table.shop_table_responsive tr td::after {
		content: "";
		display: table;
	}

	table.shop_table_responsive tr td::after {
		clear: both;
	}

	table.shop_table_responsive tr td[data-title]::before {
		content: attr(data-title) ": ";
		float: left;
		font-weight: 600;
	}

	table.shop_table_responsive tr td.actions::before,
	table.shop_table_responsive tr td.download-actions::before {
		display: none;
	}

	table.cart .cart_item {
		display: block;
		position: relative;
		padding-left: 120px;
	}

	table.cart tr td {
		text-align: right;
		padding-top: var(--space-3);
		padding-bottom: var(--space-3);
	}

	table.cart tr td:not(:last-child) {
		border-style: solid;
		border-width: 0 0 1px;
	}

	table.cart td.product-thumbnail {
		position: absolute;
		left: 10px;
		top: 15px;
		padding: 0;
		border: none;
	}

	table.cart td.product-remove {
		position: absolute;
		top: 18px;
		right: 20px;
		z-index: var(--z-badge);
		margin-bottom: 0;
		padding-bottom: 0;
		border: none;
		font-size: 11px;
	}

	table.cart td.product-name {
		text-align: left;
		border-width: 0;
		padding-right: 30px;
	}

	table.cart td.product-name::before {
		display: none;
	}

	table.cart .product-quantity .quantity {
		float: right;
	}

	table.cart td.actions {
		display: flex;
		flex-direction: column-reverse;
	}

	table.cart td.actions .coupon {
		padding: 25px 30px 30px;
		border: var(--border-coupon);
		margin-top: 1.5em;
		margin-bottom: 0;
	}

	table.cart td.actions .coupon .input-text {
		min-width: 0;
		margin-right: 0;
	}

	table.cart td.actions .coupon button[type="submit"],
	table.cart td.actions button[name="update_cart"] {
		width: 100%;
	}

	.checkout_coupon button[type="submit"] {
		margin-left: 0;
		margin-top: var(--space-3);
	}

	form.woocommerce-form-login,
	form.woocommerce-form-register {
		max-width: 100%;
	}
}

/* --------------------------------------------------------------------------
   40.20  Checkout: billing and Your order side by side   (Marco, 2026-09-04)
   --------------------------------------------------------------------------
   Production floats #customer_details left (53.6%) and #order_review right,
   which SHOULD produce two columns -- but #order_review_heading sits between
   them in the markup as a full-width block, so it breaks the float flow and
   drops the order panel below the billing form, leaving a large empty gap on
   the right. The live site has exactly the same fault; this is a fix, not a
   deviation from it.

   Grid instead of floats: the heading and the panel share the right-hand
   column, and the billing form spans both rows on the left, so the order of
   elements in the markup no longer decides the layout. Markup is untouched --
   WooCommerce's own template structure and every hook stay as they are.
   -------------------------------------------------------------------------- */

@media (min-width: 768px) and (max-width: 1099.98px) {

	/* Below 1100px two columns leave the address fields narrower than the order
	   panel, which reads badly, so stack instead -- and undo the floats
	   inherited from the desktop block above, which would otherwise reproduce
	   the broken layout in this band. */
	.woocommerce-checkout form.checkout > #customer_details,
	.woocommerce-checkout form.checkout > #order_review_heading,
	.woocommerce-checkout form.checkout > #order_review {
		float: none;
		width: 100%;
		margin-right: 0;
	}
}

@media (min-width: 1100px) {

	.woocommerce-checkout form.checkout {
		align-items: start;
		column-gap: var(--space-10);
		display: grid;
		grid-template-areas:
			"details review-heading"
			"details review";
		/* Billing keeps the larger share at every width this applies to:
		   1100px -> 560/440, 1440px -> 810/440. */
		grid-template-columns: minmax(0, 1fr) minmax(340px, 440px);
		grid-template-rows: auto 1fr;
	}

	.woocommerce-checkout form.checkout > #customer_details {
		float: none;
		grid-area: details;
		margin-right: 0;
		width: 100%;
	}

	.woocommerce-checkout form.checkout > #order_review_heading {
		grid-area: review-heading;
		margin-top: 0;
	}

	.woocommerce-checkout form.checkout > #order_review {
		float: none;
		grid-area: review;
		margin: 0;
		width: 100%;
	}

	/* Billing and shipping stack inside the now-narrower left column. Side by
	   side they would leave the address fields too cramped to read. */
	.woocommerce-checkout form.checkout #customer_details .col-1,
	.woocommerce-checkout form.checkout #customer_details .col-2 {
		float: none;
		margin-right: 0;
		width: 100%;
	}

	/* First/last name and similar pairs still sit two-up inside that column. */
	.woocommerce-checkout form.checkout #customer_details .form-row-first,
	.woocommerce-checkout form.checkout #customer_details .form-row-last {
		width: 48.3870967742%;
	}
}
/* ==========================================================================
   50 — CONTENT
   Homepage sections, pages, single posts, post archives.

   Everything here is derived from production: the Elementor per-element CSS of
   page 381, the Nutritix theme stylesheet, and the child theme. Sizes that look
   arbitrary were measured off reference-screenshots/*.png — they are not.

   Owned by this file:  front-page.php, page.php, single.php, archive.php,
                        template-parts/content-*.php, template-parts/home/*.
   NOT owned here:      base type + .button + .col-full (00-base.css),
                        the product card itself (.product-block /
                        .product-caption — the shop-archive partial).
                        The homepage only OVERRIDES the card, never redefines it.

   Two facts that explain most of the numbers below:

   1. Elementor headings render at line-height 1 (its frontend CSS sets it on
      .elementor-heading-title), so the homepage h1/h2 do NOT use the theme's
      1.214 / 1.1667. Measured: h1 baselines 60px apart at 60px, h2 48px apart
      at 48px. Reproduce line-height 1 or every section shifts.
   2. Elementor headings default to --color-brand, not to the text colour.
      Only the hero h1 and the promo titles override it (trap §8.11).
   ========================================================================== */

:root {
	/* Homepage-only literals with no token (they exist nowhere else). */
	--fpl-viewall:        #ABABAB;  /* inline colour on every "VIEW ALL" link  */
	--fpl-promo-ink:      #2D2C2F;  /* promo banner 1 title + description      */
	--fpl-promo-ground:   #5064E0;  /* promo panel colour behind the photo     */
	--fpl-hero-min:       600px;
	--fpl-hero-min-sm:    500px;
	--fpl-rule-on-brand:  rgba(255, 255, 255, .25);
}


/* ==========================================================================
   1. HOMEPAGE SHELL
   header.php opens #content.site-content > .col-full. 00-base.css already
   strips .col-full's padding on the homepage; .col-full keeps its 1320px cap,
   which is exactly what the hero and the trust strip measure (60px → 1380px on
   a 1440px viewport). Sections that are genuinely full-bleed break out with the
   100vw trick below — .site has overflow-x:hidden, so that is safe.
   ========================================================================== */

.fpl-home > .site-main {
	margin: 0;
}

.fpl-bleed,
.fpl-promos,
.fpl-testimonials {
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	width: 100vw;
}


/* --------------------------------------------------------------------------
   1.1 Shared section scaffolding
   -------------------------------------------------------------------------- */

.fpl-section {
	margin-block: 0;
}

.fpl-section__inner {
	margin-inline: auto;
	max-width: var(--container-max);
	width: 100%;
}

.fpl-section__inner--padded {
	padding-inline: var(--space-6);
}

/* Vertical rhythm note: production spaced these blocks with Elementor spacer
   widgets (#8443e46, #149e6e6, #541cd32) plus a 20px inter-widget gap. Those
   widgets are gone, so the equivalent is folded into padding here. Measured off
   home__desktop.png: ~110px between the intro copy and the first card row,
   ~100px between one product section and the next. */
.fpl-section__head {
	margin-bottom: var(--space-11);
}

.fpl-section__head--center {
	text-align: center;
}

.fpl-section__eyebrow {
	color: var(--color-text);
	font-family: var(--font-display);
	font-size: var(--fs-body);
	letter-spacing: var(--ls-eyebrow);
	line-height: var(--lh-body);
	margin: 0 0 var(--space-6);
	text-transform: uppercase;
}

.fpl-section__eyebrow--start {
	text-align: left;
}

.fpl-section__title {
	color: var(--color-brand);
	font-family: var(--font-display);
	font-size: var(--fs-h2);
	font-weight: var(--fw-kit-primary);
	line-height: 1;
	margin: 0 0 var(--space-6);
}

.fpl-section__title--center {
	text-align: center;
}

.fpl-section__viewall {
	font-family: var(--font-display);
	font-size: var(--fs-small);
	letter-spacing: var(--ls-eyebrow);
	margin: 0 0 var(--space-9);
	text-transform: uppercase;
}

.fpl-section__viewall a {
	color: var(--fpl-viewall);
}

.fpl-section__viewall a:hover,
.fpl-section__viewall a:focus-visible {
	color: var(--color-brand);
}

.fpl-section__intro {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	text-align: left;
}

.fpl-section__intro p {
	margin: 0;
}

.fpl-section__intro a {
	color: var(--color-brand);
}

.fpl-section__intro a:hover,
.fpl-section__intro a:focus-visible {
	color: var(--color-brand-link-hover);
	text-decoration: underline;
	text-underline-offset: 2px;
}


/* ==========================================================================
   2. HERO CAROUSEL
   Elementor nested-carousel #6558659. Two slides, 3000ms autoplay, arrows.
   Slide background: contain / center right on desktop, cover / top center
   below 768px, where a separate mobile artwork is used.
   ========================================================================== */

.fpl-hero {
	position: relative;
}

.fpl-hero__track {
	position: relative;
}

.fpl-hero__slide {
	align-items: center;
	background-image: var(--fpl-hero-bg);
	background-position: center right;
	background-repeat: no-repeat;
	background-size: contain;
	display: none;
	min-height: var(--fpl-hero-min);
}

.fpl-hero__slide.is-active {
	display: flex;
}

/* .col-full loses its padding on the homepage (00-base.css), so the hero
   supplies its own measure: a 1290px inner inside the 1320px band, plus 20px.
   That puts the eyebrow at x=95 on a 1440px viewport — production is 96. */
.fpl-hero__inner {
	display: flex;
	flex-wrap: wrap;
	margin-inline: auto;
	max-width: var(--container-max);
	padding-inline: var(--space-6);
	width: 100%;
}

.fpl-hero__col {
	flex: 1 1 100%;
	padding-block: var(--space-9);
}

.fpl-hero__spacer {
	display: none;
}

.fpl-hero__eyebrow {
	color: var(--color-brand);
	display: block;
	font-family: var(--font-display);
	font-size: var(--fs-body);
	font-weight: var(--fw-kit-primary);
	letter-spacing: var(--ls-eyebrow);
	line-height: var(--lh-body);
	margin-bottom: var(--space-6);
	text-transform: uppercase;
}

.fpl-hero__title {
	color: var(--color-ink-solid);
	font-family: var(--font-display);
	font-size: var(--fs-h1);
	font-weight: var(--fw-kit-primary);
	line-height: 1;
	margin: 0 0 var(--space-6);
	max-width: 12em;
}

.fpl-hero__cta {
	font-weight: 500;
	margin-bottom: var(--space-6);
}

/* The two hero paragraphs are the ONLY 16px/500/#000 text on the page —
   per-element rules #e00a601 and #20dc1a2. Everything else is 14px/#414042. */
.fpl-hero__copy {
	color: var(--color-ink-solid);
	font-family: var(--font-display);
	font-size: 16px;
	font-weight: 500;
	line-height: var(--lh-body);
	max-width: 40em;
}

.fpl-hero__copy p {
	margin: 0;
}

.fpl-hero__nav {
	align-items: center;
	background: none;
	border: 0;
	border-radius: var(--radius-round);
	color: var(--color-text);
	cursor: pointer;
	display: flex;
	height: 40px;
	justify-content: center;
	padding: 0;
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	transition: color var(--dur-base) var(--ease-base);
	width: 40px;
	z-index: 2;
}

.fpl-hero__nav::after {
	content: none;
}

.fpl-hero__nav:hover {
	color: var(--color-brand);
}

.fpl-hero__nav--prev {
	left: 0;
}

.fpl-hero__nav--next {
	right: 0;
}

@media (min-width: 768px) {

	.fpl-hero__col,
	.fpl-hero__spacer {
		flex: 0 0 50%;
		max-width: 50%;
	}

	.fpl-hero__spacer {
		display: block;
	}
}

@media (max-width: 767px) {

	.fpl-hero__slide {
		align-items: flex-start;
		background-image: var(--fpl-hero-bg-mobile);
		background-position: top center;
		background-size: cover;
		justify-content: flex-start;
		min-height: var(--fpl-hero-min-sm);
	}

	.fpl-hero__eyebrow {
		font-size: var(--fs-small);
	}

	.fpl-hero__title {
		font-size: 34px;
		max-width: none;
	}

	/* Production hides the hero paragraph on tablet and phone. */
	.fpl-hero__copy {
		display: none;
	}

	.fpl-hero__nav {
		height: 32px;
		width: 32px;
	}
}

@media (min-width: 768px) and (max-width: 1024px) {

	.fpl-hero__copy {
		display: none;
	}
}


/* ==========================================================================
   3. TRUST STRIP
   Elementor container #91b7195. Background is --color-brand-hover (#182BA8),
   NOT the brand colour — the strip is deliberately the darker blue.
   Labels are Plus Jakarta Sans, the one place on the site that face renders.
   ========================================================================== */

/* 20px of Elementor widget gap plus the 40px spacer container that followed
   the strip in production — measured 60px to the top of the promo panel. */
.fpl-trust {
	background-color: var(--color-brand-hover);
	margin-bottom: var(--space-11);
}

.fpl-trust__inner {
	display: flex;
	flex-wrap: wrap;
	margin-inline: auto;
	padding: var(--space-3) var(--space-8);
}

.fpl-trust__item {
	align-items: center;
	display: flex;
	flex: 1 1 0;
	gap: var(--space-5);
	justify-content: center;
	padding-block: var(--space-3);
}

.fpl-trust__item + .fpl-trust__item {
	border-left: 1px solid var(--fpl-rule-on-brand);
}

.fpl-trust__icon {
	align-items: center;
	border: 1px solid var(--color-text-on-brand);
	border-radius: var(--radius-round);
	color: var(--color-text-on-brand);
	display: inline-flex;
	flex: none;
	height: 44px;
	justify-content: center;
	width: 44px;
}

.fpl-trust__icon svg {
	fill: currentColor;
	height: 20px;
	width: 20px;
}

.fpl-trust__label {
	color: var(--color-text-on-brand);
	font-family: var(--font-legacy-body);
	font-size: var(--fs-body);
	font-weight: 600;
	line-height: 22px;
	margin: 0;
}

@media (max-width: 767px) {

	.fpl-trust__inner {
		padding-inline: var(--space-5);
	}

	.fpl-trust__item {
		flex: 1 1 100%;
		justify-content: flex-start;
	}

	.fpl-trust__item + .fpl-trust__item {
		border-left: 0;
		border-top: 1px solid var(--fpl-rule-on-brand);
	}
}


/* ==========================================================================
   4. PROMO BANNERS
   Elementor section #1c8cea9 (full-bleed) with two `nutritix-banner` widgets.
   The panel is a photo multiplied by a vertical brand gradient; the tiles are
   610px wide with a 40px gutter inside a 1260px measure.
   ========================================================================== */

.fpl-promos {
	background-color: var(--fpl-promo-ground);
	background-image: var(--fpl-promos-bg);
	background-position: center;
	background-size: cover;
	padding-block: 45px 50px;
	position: relative;
}

.fpl-promos::before {
	background-image: linear-gradient(180deg, var(--color-brand) 34%, var(--color-brand-hover) 77%);
	content: "";
	inset: 0;
	mix-blend-mode: multiply;
	position: absolute;
}

.fpl-promos__inner {
	display: grid;
	gap: var(--space-9);
	grid-template-columns: repeat(2, minmax(0, 1fr));
	margin-inline: auto;
	max-width: var(--container-theme-max);
	padding-inline: var(--space-8);
	position: relative;
	z-index: 1;
}

.fpl-promo {
	border-radius: 15px;
	color: var(--fpl-promo-ink);
	display: block;
	min-height: 300px;
	overflow: hidden;
	position: relative;
}

.fpl-promo__bg {
	background-position: center;
	background-repeat: no-repeat;
	background-size: cover;
	inset: 0;
	position: absolute;
	transition: transform var(--dur-base) var(--ease-base);
}

.fpl-promo:hover .fpl-promo__bg {
	transform: scale(1.06);
}

.fpl-promo__content {
	display: flex;
	flex-direction: column;
	justify-content: center;
	min-height: 300px;
	padding: var(--space-8);
	position: relative;
	z-index: 1;
}

.fpl-promo--end .fpl-promo__content {
	align-items: flex-end;
	text-align: right;
}

.fpl-promo__subtitle {
	color: var(--color-brand);
	font-size: var(--fs-body);
	font-weight: 700;
	line-height: 22px;
	margin-bottom: var(--space-3);
}

.fpl-promo__title {
	font-size: 36px;
	line-height: 1;
	text-transform: uppercase;
}

.fpl-promo--end .fpl-promo__title {
	color: var(--color-text);
}

/* "Nutritix Heading" is the brandmark face. It is genuinely rendered here
   (and only here) — the heavy condensed "YOU CAN TRUST" and "99%". The face
   IS self-hosted: 00-base.css §1 carries its @font-face and the woff2/woff
   sit in assets/fonts/. Remove either and these two lines fall back to
   Helvetica Neue and the tiles change width and weight. */
.fpl-promo__description {
	font-family: var(--font-brandmark);
	font-size: 48px;
	font-weight: 700;
	line-height: 48px;
	margin-bottom: var(--space-6);
	text-transform: uppercase;
}

.fpl-promo--end .fpl-promo__description {
	color: var(--color-brand);
	font-size: 64px;
	line-height: 64px;
}

.fpl-promo__button {
	align-self: flex-start;
	background-color: var(--color-brand);
	border-radius: var(--radius-sm);
	color: var(--color-text-on-brand);
	display: inline-block;
	font-family: var(--font-display);
	font-size: var(--fs-button);
	font-weight: var(--fw-button);
	letter-spacing: var(--ls-button);
	line-height: var(--lh-button);
	padding: 8px 22px;
	text-transform: var(--tt-button);
	transform: skewX(var(--skew-angle));
	transition: background-color var(--dur-base) var(--ease-base);
}

.fpl-promo--end .fpl-promo__button {
	align-self: flex-end;
}

.fpl-promo:hover .fpl-promo__button {
	background-color: var(--color-brand-hover);
}

@media (max-width: 767px) {

	.fpl-promos {
		padding-inline: var(--space-5);
	}

	/* 15px section padding + 12px here = the 27px tile inset production shows
	   on a 375px phone (home__mobile.png). */
	.fpl-promos__inner {
		grid-template-columns: minmax(0, 1fr);
		padding-inline: var(--space-4);
	}

	.fpl-promo,
	.fpl-promo__content {
		min-height: 100px;
	}

	.fpl-promo__description,
	.fpl-promo--end .fpl-promo__description {
		font-size: 30px;
		line-height: 30px;
	}
}


/* ==========================================================================
   5. HOMEPAGE PRODUCT GRIDS
   LAYOUT ONLY. The card itself (.product-block, .product-transition,
   .product-caption, title, price, CTA) is defined once by the shop-archive
   partial and reused verbatim — do not restate any of it here.

   Production ran these as a 4-up HFE grid plus three slick carousels; the
   carousels are gone, so a grid at 4 / 3 / 2 columns replaces them.
   ========================================================================== */

.fpl-section--products {
	padding-block: var(--space-10) var(--space-11);
}

/* The first product section follows the promo panel across a 100px gap
   (60px section padding + the 40px spacer widget #8443e46). */
.fpl-featured {
	padding-top: 100px;
}

.fpl-product-grid {
	padding-inline: var(--space-el-container-pad);
	padding-top: var(--space-10);
}

.fpl-product-grid ul.products {
	display: grid;
	gap: var(--space-hfe-gap); /* 35px 20px */
	grid-template-columns: repeat(4, minmax(0, 1fr));
	list-style: none;
	margin: 0;
	padding: 0;
}

.fpl-product-grid ul.products::before,
.fpl-product-grid ul.products::after {
	content: none;
}

/* Neutralise the archive card's float/flex track sizing inside the grid.
 *
 * SPECIFICITY MATTERS HERE. 20-archive.css sizes cards for a FLEX row with
 * `.woocommerce ul.products.columns-N li.product { flex-basis: 25%; max-width: 25% }`
 * -- that is (0,4,2). The obvious override, `.fpl-product-grid ul.products li.product`,
 * is only (0,3,2), so it lost: each card was clamped to 25% of its own grid track and
 * rendered 76px wide inside a 302.5px column, which is the collapsed-card bug Marco
 * spotted on the homepage. The columns-N and .woocommerce variants below match or
 * exceed the archive rule so the grid actually wins. Do not "simplify" this list. */
.fpl-product-grid ul.products li.product,
.fpl-product-grid ul.products.columns-1 li.product,
.fpl-product-grid ul.products.columns-2 li.product,
.fpl-product-grid ul.products.columns-3 li.product,
.fpl-product-grid ul.products.columns-4 li.product,
.fpl-product-grid ul.products.columns-5 li.product,
.fpl-product-grid ul.products.columns-6 li.product,
.woocommerce .fpl-product-grid ul.products li.product,
.woocommerce .fpl-product-grid ul.products.columns-4 li.product {
	clear: none;
	flex: none;
	float: none;
	margin: 0;
	max-width: none;
	min-width: 0;
	padding: 0;
	width: auto;
}

.fpl-product-grid--cols-3 ul.products {
	grid-template-columns: repeat(3, minmax(0, 1fr));
}

@media (max-width: 1200px) {

	.fpl-product-grid ul.products {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}

@media (max-width: 767px) {

	.fpl-product-grid ul.products {
		gap: var(--space-hfe-gap-md); /* 20px 15px */
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* --------------------------------------------------------------------------
   5.1 "Top Research Peptides" variant
   Production rendered this one block with the HFE widget, which differs from
   the shop card in exactly four ways. Reproduce those four, nothing else.
   -------------------------------------------------------------------------- */

.fpl-product-grid--featured ul.products li.product .product-caption {
	padding: var(--space-6);
}

/* The card hides .posted-in site-wide; the homepage grid showed it. */
.fpl-product-grid--featured ul.products li.product .posted-in {
	color: var(--color-text-hfe-meta);
	display: block !important;
	font-size: var(--fs-small);
	letter-spacing: .8px;
	margin-bottom: var(--space-3);
	opacity: .75;
	text-transform: uppercase;
}

.fpl-product-grid--featured ul.products li.product .woocommerce-loop-product__title {
	color: var(--color-ink-solid) !important;
}

.fpl-product-grid--featured ul.products li.product .price {
	font-size: 18px !important;
	font-weight: 700 !important;
}

/* Struck-through price, GRID variant. Trap §8.6 names three price colours;
   20-archive.css owns the first two (live #4557C9, loop `del` at .55 opacity)
   and this is the third — §7.4 records the HFE grid's `del` as a solid
   #8A93D4 with opacity:1, and the HFE grid is what these homepage sections
   are. It applies to all four homepage grids, not just the featured one,
   because production ran hfe-woo-product-grid 13x on this page.

   Without this rule --color-brand-muted has no consumer anywhere and the
   token claims a behaviour the CSS does not have. Unobservable today — 0 of
   44 products carry a sale price — which is exactly why it needed writing
   down rather than leaving to be rediscovered.

   `.woocommerce` and `.fpl-product-grid` are on the same element
   (template-parts/home/product-grid.php:77), so chaining them clears the
   archive rule's (0,5,3) without depending on partial order. */
.woocommerce.fpl-product-grid ul.products li.product .product-caption .price del {
	color: var(--color-brand-muted); /* #8A93D4 */
	opacity: 1;
}

/* --- phones (<= 767px) ----------------------------------------------------
   20-archive.css §"phones" shrinks every card to 13px title / 13px price /
   12px nowrap CTA. The featured card is NOT that card: the price rule above
   already pins 18px on every width, and home__mobile.png shows the title and
   the CTA staying at their full size too. Measured on home__mobile.png at
   375px, featured card 1 ("Bacteriostatic Water", y≈1890-2085):

     title   two lines, baselines 1910 and 1934  -> 24px apart, cap 14px
             = 18px/1.4, the SAME as desktop. The shop card in the section
             below it measures 18px baselines (13px), so the two really do
             differ at this width.
     price   "$9.99" 14px digit height = 18px/700 (already correct).
     CTA     black slab 83px tall wrapping to "VIEW" / "PRODUCT" on two lines,
             text baselines 30px apart, cap 10px = 14px at line-height 2.1818
             with 12px block padding (12+30.5+30.5+12 = 85 ≈ 83 measured).

   So the whole fix is: opt this one grid out of the mobile clamp. The wrapper
   carries `woocommerce` AND `fpl-product-grid--featured` on the same element
   (template-parts/home/product-grid.php:77), so chaining them gives (0,6,2)
   against the archive clamp's (0,5,2) — no !important needed, and it does not
   depend on partial order the way the price rule above does.
   ---------------------------------------------------------------------- */

@media (max-width: 767px) {

	.woocommerce.fpl-product-grid--featured ul.products li.product .product-caption .woocommerce-loop-product__title {
		font-size: var(--fs-card-title); /* 18px, not the 13px mobile step */
		line-height: var(--lh-card-title); /* 1.4 -> 25.2px; max-height 52px still fits two lines */
	}

	.woocommerce.fpl-product-grid--featured ul.products li.product .product-caption a.button,
	.woocommerce.fpl-product-grid--featured ul.products li.product .product-caption a.button.add_to_cart_button {
		font-size: var(--fs-button-card); /* 14px, not the 12px mobile step */
		line-height: var(--lh-button); /* 2.1818… -> 30.5px */
		padding: 12px 20px;
		white-space: normal; /* the reference wraps it to "VIEW" / "PRODUCT" */
	}
}


/* ==========================================================================
   6. BRAND / IMAGE SPLIT — "Advancing Where Accuracy Meets Excellence"
   ========================================================================== */

.fpl-about {
	padding-block: var(--space-10);
}

.fpl-about__grid {
	display: grid;
	gap: var(--space-9);
	grid-template-columns: minmax(0, 1fr);
}

.fpl-about__title {
	max-width: 9em;
	text-align: left;
}

.fpl-about__copy {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin-bottom: var(--space-7);
	max-width: 34em;
}

.fpl-about__copy p {
	margin: 0;
}

.fpl-about__col--media img {
	display: block;
	height: auto;
	width: 100%;
}

@media (min-width: 768px) {

	.fpl-about__grid {
		align-items: center;
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	.fpl-about__col:first-child {
		padding-right: 80px;
	}
}


/* ==========================================================================
   7. LONG-FORM SEO BLOCK
   Ranking content. Four paragraphs, 14 internal links, centred h2.
   ========================================================================== */

.fpl-seo {
	padding-block: var(--space-3) var(--space-10);
}

.fpl-seo__body {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

.fpl-seo__body p {
	margin: 0 0 var(--space-6);
}

.fpl-seo__body p:last-child {
	margin-bottom: 0;
}

.fpl-seo__body a {
	color: var(--color-brand);
}

.fpl-seo__body a:hover,
.fpl-seo__body a:focus-visible {
	color: var(--color-brand-link-hover);
	text-decoration: underline;
	text-underline-offset: 2px;
}


/* ==========================================================================
   8. FAQ ACCORDION
   Production shipped flat <h4> + <p> prose with every answer visible. This is
   a real disclosure widget that OPENS EVERY PANEL BY DEFAULT, so the rendered
   page still matches home__desktop.png while being operable from the keyboard.

   THE INDICATOR IS HIDDEN, ON PURPOSE (review finding 40). It was the one
   piece of ink this component added that production does not have: I cropped
   home__desktop.png y=4800-5400 and every row is an h4 followed immediately by
   its paragraph — no +/- glyph, no chevron, no rule, no control affordance of
   any kind. Visual fidelity is the acceptance standard, so the glyph goes; the
   <button>, the aria-expanded and the hover-to-brand colour stay, which is what
   keeps the widget operable and discoverable. The bar-pair rules below are kept
   rather than deleted so that restoring the affordance is one line — delete the
   display:none — if the flat look is ever reconsidered.
   ========================================================================== */

.fpl-faq {
	padding-block: var(--space-3) var(--space-11);
}

.fpl-faq .fpl-section__title {
	margin-bottom: var(--space-7);
	text-align: left;
}

.fpl-faq__item + .fpl-faq__item {
	margin-top: var(--space-7);
}

.fpl-faq__question {
	margin: 0;
}

.fpl-faq__toggle {
	align-items: baseline;
	background: none;
	border: 0;
	border-radius: 0;
	color: var(--color-text-strong);
	cursor: pointer;
	display: flex;
	font-family: var(--font-display);
	font-size: var(--fs-h4);
	font-weight: var(--fw-heading);
	gap: var(--space-5);
	justify-content: space-between;
	letter-spacing: normal;
	line-height: var(--lh-h4);
	padding: 0;
	text-align: left;
	text-transform: none;
	transition: color var(--dur-base) var(--ease-base);
	width: 100%;
}

/* Kill the theme's skewed black button slab — this is a heading, not a CTA. */
.fpl-faq__toggle::after,
.fpl-faq__toggle::before {
	content: none;
}

.fpl-faq__toggle:hover,
.fpl-faq__toggle:focus-visible {
	color: var(--color-brand);
}

.fpl-faq__indicator {
	display: none; /* see the section note — production paints no indicator */
	flex: none;
	height: 12px;
	position: relative;
	top: -2px;
	width: 12px;
}

.fpl-faq__indicator::before,
.fpl-faq__indicator::after {
	background-color: currentColor;
	content: "";
	height: 1px;
	left: 0;
	position: absolute;
	top: 50%;
	transition: transform var(--dur-base) var(--ease-base);
	width: 12px;
}

.fpl-faq__indicator::after {
	transform: rotate(90deg);
}

/* Expanded = the two bars form a minus. Collapsed = a plus. */
.fpl-faq__toggle[aria-expanded="true"] .fpl-faq__indicator::after {
	transform: rotate(0deg);
}

.fpl-faq__answer {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin: var(--space-4) 0 0;
}

.fpl-faq__answer[hidden] {
	display: none;
}

.fpl-faq__answer a {
	color: var(--color-brand);
}

.fpl-faq__answer a:hover,
.fpl-faq__answer a:focus-visible {
	color: var(--color-brand-link-hover);
	text-decoration: underline;
	text-underline-offset: 2px;
}


/* ==========================================================================
   9. NEWSLETTER (Sendlane)
   The form is injected by Sendlane's own script into .sendlane-form. Reserve
   the row; do not style the injected markup, it is not ours.
   ========================================================================== */

.fpl-newsletter {
	padding-block: var(--space-9);
}


/* ==========================================================================
   10. TESTIMONIALS
   Elementor section #cd41094: photo + vertical brand gradient, white cards.
   ========================================================================== */

.fpl-testimonials {
	background-color: var(--color-brand);
	background-image: var(--fpl-testimonials-bg);
	background-position: center;
	background-size: cover;
	position: relative;
}

.fpl-testimonials::before {
	background-image: linear-gradient(180deg, var(--color-brand) 0%, var(--color-brand-hover) 100%);
	content: "";
	inset: 0;
	mix-blend-mode: multiply;
	position: absolute;
}

.fpl-testimonials__inner {
	display: grid;
	gap: var(--space-8);
	grid-template-columns: repeat(3, minmax(0, 1fr));
	margin-inline: auto;
	max-width: 1680px;
	padding: 60px var(--space-8) 90px;
	position: relative;
	z-index: 1;
}

.fpl-testimonial {
	background: var(--color-bg);
	border-radius: 15px;
	margin: 0;
	padding: var(--space-9);
}

.fpl-testimonial__rating {
	color: var(--color-star);
	display: flex;
	gap: 2px;
	margin-bottom: var(--space-5);
}

.fpl-testimonial__title {
	color: var(--color-text-strong);
	font-family: var(--font-display);
	font-size: var(--fs-h5);
	font-weight: var(--fw-h5);
	margin-bottom: var(--space-2);
}

.fpl-testimonial__details {
	color: var(--color-text-muted);
	display: flex;
	flex-wrap: wrap;
	font-size: var(--fs-small);
	gap: var(--space-2);
	margin-bottom: var(--space-5);
	text-transform: uppercase;
}

.fpl-testimonial__name {
	color: var(--color-text-strong);
	font-weight: 600;
}

.fpl-testimonial__content {
	border: 0;
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin: 0;
	padding: 0;
}

.fpl-testimonial__content::before {
	content: none;
}

@media (max-width: 1366px) {

	.fpl-testimonials__inner {
		grid-template-columns: minmax(0, 1fr);
	}
}

@media (max-width: 767px) {

	.fpl-testimonials__inner {
		padding: var(--space-9) var(--space-5) var(--space-10);
	}

	.fpl-testimonial {
		padding: var(--space-8) var(--space-5);
	}
}


/* ==========================================================================
   11. fpl-cta — the Elementor button widget, rebuilt
   §7.0. Skewed slab, counter-skewed label, two halves wiping in from opposite
   ends on hover. The brand variant (hero, VIEW CATALOG) skips the wipe: those
   were per-element overrides to a flat #4557C9 → #182BA8 swap.
   ========================================================================== */

.fpl-cta {
	align-items: center;
	background-color: var(--color-text-strong);
	border: 1px solid var(--color-text-strong);
	border-radius: var(--radius-sm);
	color: var(--color-text-on-brand);
	display: inline-flex;
	font-family: var(--font-display);
	font-size: var(--fs-button);
	font-weight: var(--fw-kit-accent);
	justify-content: center;
	letter-spacing: var(--ls-button);
	line-height: var(--lh-button);
	overflow: hidden;
	padding: 14px 42px;
	position: relative;
	text-transform: var(--tt-button);
	transform: skewX(var(--skew-angle));
	transition: all var(--dur-base) var(--ease-base);
	z-index: 0;
}

.fpl-cta__label {
	transform: skewX(calc(-1 * var(--skew-angle)));
}

.fpl-cta::before,
.fpl-cta::after {
	background-color: var(--color-brand);
	content: "";
	height: 50%;
	position: absolute;
	transition: var(--dur-base) var(--ease-wipe);
	width: 0;
	z-index: -1;
}

.fpl-cta::before {
	left: 0;
	right: auto;
	top: 0;
}

.fpl-cta::after {
	bottom: 0;
	left: auto;
	right: 0;
}

.fpl-cta:hover,
.fpl-cta:focus-visible {
	border-color: var(--color-brand);
	color: var(--color-text-on-brand);
}

.fpl-cta:hover::before,
.fpl-cta:focus-visible::before {
	left: auto;
	right: 0;
	width: 100%;
}

.fpl-cta:hover::after,
.fpl-cta:focus-visible::after {
	left: 0;
	right: auto;
	width: 100%;
}

.fpl-cta--brand {
	background-color: var(--color-brand);
	border-color: transparent;
}

.fpl-cta--brand::before,
.fpl-cta--brand::after {
	content: none;
}

.fpl-cta--brand:hover,
.fpl-cta--brand:focus-visible {
	background-color: var(--color-brand-hover);
	border-color: transparent;
}


/* ==========================================================================
   12. PAGES
   Production printed no page title: every page carries its own h1 inside the
   content. content-page.php only prints one when the content has none.
   ========================================================================== */

.fpl-page,
.fpl-single {
	float: none;
	width: 100%;
}

.fpl-page .entry-content > *:first-child,
.fpl-single .entry-content > *:first-child {
	margin-top: 0;
}

/* The /about-us/, /contact-us/ and /faq/ pages point at Nutritix's
   template-homepage.php, and /guides/ + /research/ at Elementor's canvas.
   Both files are gone; production rendered them flush, so page.php flags them
   and this removes the 40px band #page .site-content otherwise adds. */
.fpl-page--flush {
	margin-bottom: 0;
}

body:has(.fpl-page--flush) #page .site-content {
	margin-bottom: 0;
	margin-top: 0;
}

/* The 25 reconstitution-calculator pages ship their own <style> and <script>
   inside post_content and lay themselves out. Give them room and get out of
   the way — no typography, no widths, no resets on .fplc. */
.entry-content .fplc {
	margin-block: var(--space-7);
}


/* ==========================================================================
   13. SINGLE POST
   Production served posts on the Elementor canvas: featured image, then a
   42px/700 brand-blue title, then the body. No meta row, no post navigation.
   ========================================================================== */

.fpl-post .post-thumbnail {
	margin-bottom: var(--space-6);
}

.fpl-post .post-thumbnail img {
	display: block;
	height: auto;
	width: 100%;
}

.fpl-post__title {
	color: var(--color-brand);
	font-family: var(--font-display);
	font-size: 42px;
	font-weight: var(--fw-kit-primary);
	line-height: 1.1;
	margin: 0 0 var(--space-6);
}

.fpl-post .entry-content {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

/* Child theme raises the in-article heading scale on posts only. */
.single-post .entry-content h2 {
	font-size: 36px;
}

.single-post .entry-content h3 {
	font-size: 30px;
}

.single-post .entry-content h4 {
	font-size: var(--fs-h4);
}

.single-post .entry-content p {
	margin-bottom: var(--space-6);
}

.single-post .entry-content ol,
.single-post .entry-content ul {
	margin: var(--space-3) 0 var(--space-6) var(--space-6);
}

.single-post .entry-content li {
	margin: var(--space-3);
}

@media (max-width: 767px) {

	.fpl-post__title {
		font-size: 28px;
	}
}


/* ==========================================================================
   14. POST ARCHIVE / BLOG LISTING
   Production floats a 300px sidebar on the LEFT with a 60px gutter, collapsing
   below 1024px. Article markup is content-post.php.
   ========================================================================== */

@media (min-width: 1024px) {

	/* SCOPED TO .fpl-sidebar-left ON PURPOSE.
	 *
	 * This narrowing used to be on bare `.content-area`, which every template
	 * emits -- including single products. So a product page reserved 360px for
	 * a sidebar that is never rendered there, and `div.product` came out 930px
	 * against production's 1290px, leaving the band of white space on the right
	 * that Marco reported. index.php and archive.php add `fpl-sidebar-left` only
	 * when `is_active_sidebar()` says a sidebar is genuinely being output, so it
	 * is the honest marker for "this page has one".
	 *
	 * Deliberately NOT `:has(+ .widget-area)`: it would be more general, but on a
	 * browser without :has() support the content would run full width underneath
	 * the sidebar. A class the template controls degrades to a single column,
	 * which is always safe.
	 *
	 * Shop and category archives are laid out separately, by the flex rules in
	 * 20-archive.css scoped to `.woocommerce-page .content-area`. */
	.content-area.fpl-sidebar-left {
		float: right;                    /* sidebar-left is the live configuration */
		width: calc(100% - 360px);
	}

	.content-area.fpl-sidebar-left + .widget-area {
		float: left;
		width: 300px;
	}

	.content-area.fpl-sidebar-left,
	.content-area.fpl-sidebar-left + .widget-area {
		margin-bottom: 1.618em;
	}
}

article.article-default {
	margin-bottom: var(--space-11);
}

.article-default .post-thumbnail {
	margin-bottom: var(--space-6);
}

.article-default .post-thumbnail img {
	display: block;
	height: auto;
	width: 100%;
}

.entry-meta {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	font-size: var(--fs-small);
	font-weight: 600;
	line-height: 1.5;
	margin-bottom: var(--space-3);
	text-transform: uppercase;
}

/* The skewed 5px dot between meta items — same motif as the PDP tab list. */
.entry-meta > div:not(:last-child)::after {
	background-color: var(--color-divider-dot);
	content: "";
	display: inline-block;
	height: 5px;
	margin: -4px var(--space-3) 0;
	transform: skewX(var(--skew-angle-dot));
	vertical-align: middle;
	width: 5px;
}

.entry-meta a {
	color: var(--color-text-muted);
	display: inline-block;
}

.entry-meta a:hover {
	color: var(--color-brand);
	text-decoration: underline;
}

.entry-meta .categories-link a {
	color: var(--color-brand);
}

.more-link-wrap {
	margin-top: var(--space-7);
}

a.more-link {
	background-color: var(--color-surface-light);
	border: 1px solid transparent;
	border-radius: var(--radius-sm);
	color: var(--color-text-strong);
	display: inline-block;
	font-size: var(--fs-button);
	font-weight: var(--fw-button);
	letter-spacing: var(--ls-button);
	line-height: var(--lh-button);
	padding: 6px 18px;
	text-transform: var(--tt-button);
	transform: skewX(var(--skew-angle));
	transition: all var(--dur-base) var(--ease-base);
}

a.more-link > span {
	display: block;
	transform: skewX(calc(-1 * var(--skew-angle)));
}

a.more-link > span.screen-reader-text {
	transform: none;
}

a.more-link:hover,
a.more-link:focus-visible {
	background-color: var(--color-brand);
	color: var(--color-text-on-brand);
}


/* --------------------------------------------------------------------------
   14.1 Pagination
   Markup mirrors production: nav.pagination > .nav-links > ul.page-numbers.
   -------------------------------------------------------------------------- */

.navigation.pagination .nav-links ul.page-numbers {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-3);
	list-style: none;
	margin: 0;
	padding: 0;
}

.navigation.pagination ul.page-numbers li {
	margin: 0;
}

.navigation.pagination .page-numbers {
	align-items: center;
	border: 1px solid var(--color-border);
	border-radius: var(--radius-sm);
	color: var(--color-text-strong);
	display: inline-flex;
	font-size: var(--fs-small);
	font-weight: 600;
	height: 40px;
	justify-content: center;
	min-width: 40px;
	padding-inline: var(--space-2);
	transition: all var(--dur-base) var(--ease-base);
}

.navigation.pagination .page-numbers:hover,
.navigation.pagination .page-numbers.current {
	background-color: var(--color-brand);
	border-color: var(--color-brand);
	color: var(--color-text-on-brand);
}


/* --------------------------------------------------------------------------
   14.2 Sidebar widgets
   Widget content is database-driven; these are the theme's container styles.
   -------------------------------------------------------------------------- */

.widget {
	margin-bottom: var(--space-9);
}

.widget:last-child {
	margin-bottom: 0;
}

.widget .widget-title,
.widget .widgettitle,
.widget .wp-block-group__inner-container > h2 {
	align-items: center;
	color: var(--color-text-strong);
	display: flex;
	font-family: var(--font-display);
	font-size: var(--fs-h4);
	font-weight: var(--fw-heading);
	line-height: 1.3333333333;
	margin-bottom: var(--space-8);
}

.widget .widget-title i,
.widget .widgettitle i,
.widget .wp-block-group__inner-container > h2 i {
	color: var(--color-brand);
	font-size: 18px;
	margin-left: var(--space-3);
}

.widget ul {
	list-style: none;
	margin-left: 0;
}

.widget ul li {
	list-style: none;
	margin-bottom: 0.875em;
}

.widget ul .children {
	margin-top: 0.875em;
}

.widget ul ul {
	margin-left: 1.618em;
	margin-top: 1em;
}

.widget-area a:not(.button) {
	color: var(--color-text-strong);
}

.widget-area a:not(.button):hover {
	color: var(--color-brand);
	text-decoration: none;
}

.widget_recent_entries li {
	display: flex;
	gap: var(--space-5);
}

.widget_recent_entries .recent-posts-thumbnail img {
	display: block;
	height: 74px;
	object-fit: cover;
	width: 108px;
}

.widget_recent_entries .post-title {
	font-size: var(--fs-body);
	font-weight: 600;
	line-height: 22px;
	margin: 0 0 var(--space-1);
}

.widget_recent_entries .post-date {
	color: var(--color-text-muted);
	font-size: var(--fs-small);
}
/* ==========================================================================
   55 — BUILT PAGES
   /about-us/, /contact-us/, /faq/, /guides/, /research/.

   Owned by this file:  template-parts/page/*.php only. It concatenates AFTER
   50-content.css, so it may override .fpl-page / .fpl-page--flush there; it
   must never restate a component 50-content already owns. The testimonial card
   (.fpl-testimonial*) and the button (.fpl-cta*) are BORROWED from
   50-content.css on purpose — one component, one definition, per findings
   [14] and [22].

   Every number below is production's, read out of the live per-element
   Elementor CSS on 2026-09-03 (the `<style id="elementor-frontend-inline-css">`
   block — this install prints per-post CSS inline, so there is no
   post-<id>.css file to read) and cross-checked against the reference
   screenshots at 1440 / 768 / 375.

   Two structural facts that explain the shapes here:

   1. `.col-full` is capped at 1320px with 15px of padding, so at any viewport
      ≥1320 the content box is exactly 1290px — the same as Elementor's
      --container-max. Sections that were `elementor-section-stretched` break
      out of it with `calc(50% - 50vw)`; sections that were not simply fill it.
      `.site` has overflow-x:hidden, so the 100vw is safe (same trick as
      .fpl-bleed in 50-content.css §1).
   2. Elementor renders every heading at `line-height: 1` and separates widgets
      with a 20px gap (--kit-widget-spacing). Reproduce both or every one of
      these pages is the wrong height.

   KNOWN GAP, not fixable from this file: several of these blocks assign
   "Plus Jakarta Sans" per element — the /about-us/ eyebrow and its four
   differentiator titles, and both /contact-us/ detail titles. 00-base.css §1
   drops that family as "never painted", which is true of the <body> rule but
   NOT of these per-element rules — the same mistake review finding [11] caught
   for Nutritix Heading. They are written here as var(--font-legacy-body) so
   they pick the face up the moment it is shipped; today they fall through to
   Helvetica Neue.
   ========================================================================== */

:root {
	/* Literals that exist only on these five pages. */
	--fpl-hub-overlay-from: var(--color-brand);
	--fpl-hub-overlay-to:   rgba(69, 87, 201, .26);  /* live value #4557C942  */
	--fpl-purity-pad:       85px 70px;
	--fpl-quote-pad:        50px 40px;
}


/* ==========================================================================
   55.1  SHARED SCAFFOLDING
   ========================================================================== */

/* page.php wraps a routed page in this article. It must not float or shrink —
   the sections inside it set their own measure. */
.fpl-page__built {
	float: none;
	width: 100%;
}

.fpl-page-section {
	margin-block: 0;
}

.fpl-page-inner {
	margin-inline: auto;
	max-width: var(--container-max);
	width: 100%;
}

/* `elementor-section-stretched`, rebuilt. Works at any ancestor width. */
.fpl-page-bleed {
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	width: 100vw;
}

/* Every stretched hero on these pages paints one photograph, passed in from
   PHP as --fpl-page-hero-bg so no upload path is ever hardcoded in CSS. */
.fpl-about__hero,
.fpl-contact__hero,
.fpl-faqpage__hero {
	background-color: var(--color-bg);
	background-image: var(--fpl-page-hero-bg);
	background-repeat: no-repeat;
}


/* ==========================================================================
   55.2  /about-us/ — HERO   (Elementor section #1e1b77f)
   ========================================================================== */

.fpl-about__hero {
	background-position: center center;
	background-size: cover;
	margin-bottom: 130px;
	padding: 85px var(--container-pad-x-mid) 130px;
}

.fpl-about__hero-inner {
	align-items: center;
	display: grid;
	gap: 0;
	grid-template-columns: repeat(2, minmax(0, 1fr));
}

/* h1. The indexed h1 on this page is the two-word eyebrow, not the headline —
   that is production's outline and it is what ranks. */
.fpl-about__eyebrow {
	color: var(--color-brand);
	font-family: var(--font-legacy-body);
	font-size: var(--fs-body);
	font-weight: 500;
	line-height: 22px;
	margin: 0 0 var(--space-5);
}

.fpl-about__headline {
	color: var(--color-text-strong);
	font-size: var(--fs-entry-title);
	font-weight: 700;
	line-height: 1;
	margin: 0 0 var(--space-8);
	max-width: 355px;
	text-transform: uppercase;
}

.fpl-about__lede {
	color: var(--color-brand);
	font-size: 18px;
	line-height: 28px;
}

.fpl-about__lede p {
	margin: 0;
}

.fpl-about__hero-art {
	text-align: center;
}

.fpl-about__hero-img {
	display: block;
	height: auto;
	margin-inline: auto;
	max-width: 100%;
}


/* ==========================================================================
   55.3  /about-us/ — IMAGE + PURITY SLAB + COPY   (section #e9820df)
   ========================================================================== */

.fpl-about__story {
	margin-bottom: 80px;
	padding-inline: var(--container-pad-x-mid);
}

.fpl-about__story-inner {
	align-items: center;
	display: grid;
	gap: 0;
	grid-template-columns: repeat(2, minmax(0, 1fr));
}

.fpl-about__figure {
	padding-right: 95px;
	position: relative;
}

.fpl-about__figure-img {
	display: block;
	height: auto;
	margin-left: auto;
	max-width: 100%;
}

/* The blue parallelogram. Production overlaid it with `margin-top: -620px` on
   an inner section, which breaks the moment the photograph's aspect ratio
   changes; anchoring it to the bottom of the figure is the same picture and
   cannot drift. */
.fpl-about__purity {
	bottom: 0;
	color: var(--color-text-on-brand);
	left: 0;
	padding: var(--fpl-purity-pad);
	position: absolute;
	text-align: center;
	width: 52%;
	z-index: 1;
}

/* .nutritix-custom-background-yes > .elementor-widget-wrap:before, verbatim:
   skewX(-10deg) about the element centre — no scaleX, unlike the buttons. */
.fpl-about__purity::before {
	background-color: var(--color-brand);
	border-radius: var(--radius-sm);
	content: "";
	inset: 0;
	position: absolute;
	transform: skewX(var(--skew-angle));
	z-index: -1;
}

.fpl-about__purity-over,
.fpl-about__purity-unit {
	font-family: var(--font-display);
	font-size: 28px;
	font-weight: var(--fw-heading);
	line-height: 1;
	margin: 0;
}

.fpl-about__purity-number {
	font-family: var(--font-display);
	font-size: 200px;
	font-weight: var(--fw-heading);
	line-height: 160px;
	margin: 0;
}

.fpl-about__story-copy {
	padding: 0 110px 0 var(--space-5);
}

/* The one place on this page that uses the brandmark face (#4d48a7a). */
.fpl-about__story-title {
	color: var(--color-text-strong);
	font-family: var(--font-brandmark);
	font-size: var(--fs-entry-title);
	font-weight: 700;
	line-height: 1;
	margin: 0 0 var(--space-8);
	text-transform: uppercase;
}

.fpl-about__story-body {
	font-size: 18px;
	line-height: 28px;
	margin: 0 0 var(--space-11);
}

.fpl-about__story-cta,
.fpl-about__why-cta {
	margin: 0;
}


/* ==========================================================================
   55.4  /about-us/ — DIFFERENTIATORS + TESTIMONIALS   (section #5fb5e5b)
   ========================================================================== */

.fpl-about__why {
	background-image: var(--fpl-page-hero-bg);
	background-position: center center;
	background-repeat: no-repeat;
	background-size: cover;
	margin-bottom: var(--space-11);
	padding: var(--space-11) var(--container-pad-x-mid);
}

.fpl-about__why-inner {
	align-items: center;
	display: grid;
	gap: 0;
	grid-template-columns: 65% 35%;
}

.fpl-about__why-copy {
	padding-right: 70px;
}

.fpl-about__why-eyebrow {
	color: var(--color-brand);
	font-weight: 500;
	margin: 0 0 var(--space-1);
}

.fpl-about__why-title {
	color: var(--color-text-strong);
	font-size: var(--fs-entry-title);
	line-height: 1;
	margin: 0 0 var(--space-9);
}

.fpl-about__points {
	display: grid;
	gap: var(--space-9) var(--space-5);
	grid-template-columns: repeat(2, minmax(0, 1fr));
	list-style: none;
	margin: 0 0 var(--space-9);
	padding: 0;
}

.fpl-about__point {
	display: flex;
	gap: var(--space-5);
	margin: 0;
}

.fpl-about__point-icon {
	color: var(--color-brand);
	flex: none;
	line-height: 0;
}

.fpl-about__point-icon svg {
	height: 26px;
	width: 26px;
}

.fpl-about__point-title {
	color: var(--color-text-strong);
	font-family: var(--font-legacy-body);
	font-size: var(--fs-h6);
	font-weight: 600;
	line-height: 1.3;
	margin: 0 0 var(--space-4);
}

.fpl-about__point-copy {
	color: var(--color-text);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
	margin: 0;
}

/* Production runs a 1-up slick carousel here. Static stack, same decision the
   homepage already took in template-parts/home/testimonials.php — the empty
   column in about-us__desktop.png is the carousel not having initialised
   during capture, not a design. Card styling is 50-content.css §10. */
.fpl-about__quotes {
	display: grid;
	gap: var(--space-6);
}

.fpl-about__quotes .fpl-testimonial {
	border-radius: var(--radius-0);
	padding: var(--fpl-quote-pad);
}


/* ==========================================================================
   55.5  /contact-us/   (sections #3972c07 and #f7644eb)
   ========================================================================== */

.fpl-contact__hero {
	background-position: center center;
	background-size: contain;
	margin-bottom: var(--space-11);
	padding: var(--space-11) var(--container-pad-x-mid);
}

/* No colour override lives on this heading, so it takes Elementor's heading
   default — brand blue, not the text colour (trap §8.11). */
.fpl-contact__title {
	color: var(--color-brand);
	line-height: 1;
	margin: 0 0 var(--space-widget-gap);
}

.fpl-contact__hero-grid {
	display: grid;
	gap: 0;
	grid-template-columns: 31% 35.332% 1fr;
}

.fpl-contact__intro {
	padding-right: var(--space-9);
}

.fpl-contact__eyebrow {
	color: var(--color-brand);
	font-weight: 500;
	margin: 0 0 var(--space-1);
}

.fpl-contact__headline {
	color: var(--color-text-strong);
	font-size: var(--fs-entry-title);
	line-height: 1;
	margin: 0 0 var(--space-8);
}

.fpl-contact__lede {
	margin-bottom: var(--space-10);
}

.fpl-contact__lede p:last-child {
	margin-bottom: 0;
}

.fpl-contact__cta {
	margin: 0;
}

.fpl-contact__card {
	background-color: var(--color-bg);
	padding: var(--space-9) var(--space-11);
}

.fpl-contact__card-title {
	color: var(--color-text-strong);
	font-family: var(--font-brandmark);
	font-size: 28px;
	line-height: 1;
	margin: 0 0 var(--space-5);
}

.fpl-contact__detail {
	border-bottom: var(--border-hairline);
	display: flex;
	gap: var(--space-5);
	margin-bottom: var(--space-5);
	padding-bottom: var(--space-5);
}

.fpl-contact__detail-icon {
	color: var(--color-brand);
	flex: none;
	line-height: 30px;
}

.fpl-contact__detail-title {
	color: var(--color-text-strong);
	font-family: var(--font-legacy-body);
	font-size: var(--fs-body);
	font-weight: 700;
	line-height: 1.5;
	margin: 0 0 8px;
}

.fpl-contact__detail-copy {
	margin: 0;
}

.fpl-contact__detail-copy a {
	color: var(--color-text);
}

.fpl-contact__detail-copy a:hover {
	color: var(--color-brand);
}

/* --- feedback form + map ------------------------------------------------- */

.fpl-contact__feedback {
	margin-bottom: var(--space-11);
	padding-inline: var(--container-pad-x-mid);
}

.fpl-contact__feedback-grid {
	align-items: center;
	display: grid;
	gap: var(--space-11);
	grid-template-columns: repeat(2, minmax(0, 1fr));
}

.fpl-contact__form-title {
	align-items: center;
	color: var(--color-ink-solid);
	display: flex;
	font-size: var(--fs-kit-heading-title);
	font-weight: var(--fw-kit-heading-title);
	gap: var(--space-2);
	line-height: var(--lh-kit-heading-title);
	margin: 0 0 var(--space-3);
	text-transform: var(--tt-kit-heading-title);
}

.fpl-contact__form-arrow {
	color: var(--color-brand);
	line-height: 0;
}

.fpl-contact__form-intro {
	margin: 0 0 var(--space-5);
}

.fpl-contact__form-body p {
	margin: 0 0 var(--space-5);
}

.fpl-contact__form-body label {
	display: block;
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

.fpl-contact__form-body input[type="text"],
.fpl-contact__form-body input[type="email"],
.fpl-contact__form-body input[type="tel"],
.fpl-contact__form-body textarea {
	width: 100%;
}

.fpl-contact__form-body textarea {
	min-height: 240px;
}

/* Elementor's kit paints EVERY native button and submit input #4557C9
   (`.elementor-kit-8 button, … input[type="submit"]`). 00-base.css reproduces
   the geometry but leaves the ground at --color-text-strong, which is right for
   the theme's own buttons and wrong here. Scoped rather than global — the
   general case is review finding [37] and belongs to whoever owns 00-base. */
.fpl-contact__form-body input[type="submit"] {
	background-color: var(--color-brand);
}

.fpl-contact__form-body input[type="submit"]:hover,
.fpl-contact__form-body input[type="submit"]:focus-visible {
	background-color: var(--color-brand-hover);
}

.fpl-contact__map iframe {
	border: 0;
	display: block;
	height: 480px;
	width: 100%;
}


/* ==========================================================================
   55.6  /faq/   (sections #8af54bb, #be6c529, #c884635)

   The disclosure is a native <details>/<summary>. Production used an Elementor
   accordion, which needs JavaScript to open; this opens without any, keeps
   every answer in the DOM for crawlers, and is keyboard-operable for free.
   ========================================================================== */

.fpl-faqpage__hero {
	background-position: center center;
	background-size: cover;
	margin-bottom: 100px;
	padding-inline: var(--container-pad-x-mid);
}

.fpl-faqpage__hero-inner {
	align-items: center;
	display: flex;
	justify-content: flex-end;
	min-height: 500px;
}

.fpl-faqpage__hero-copy {
	width: 34%;
}

.fpl-faqpage__eyebrow {
	color: var(--color-brand);
	font-size: var(--fs-body);
	font-weight: 500;
	line-height: 22px;
	margin: 0 0 var(--space-5);
}

.fpl-faqpage__title {
	color: var(--color-text-strong);
	font-size: var(--fs-entry-title);
	font-weight: 600;
	line-height: 1;
	margin: 0 0 var(--space-8);
}

.fpl-faqpage__lede {
	margin: 0;
}

.fpl-faqpage__group {
	margin-bottom: 100px;
	padding-inline: var(--container-pad-x-mid);
}

.fpl-faqpage__group:last-of-type {
	margin-bottom: var(--space-11);
}

.fpl-faqpage__group-inner {
	display: grid;
	gap: 0;
	grid-template-columns: 43% 57%;
}

.fpl-faqpage__group-head {
	padding-right: var(--space-8);
}

.fpl-faqpage__group-title {
	align-items: center;
	color: var(--color-text-strong);
	display: flex;
	font-size: var(--fs-kit-heading-title);
	font-weight: var(--fw-kit-heading-title);
	gap: var(--space-1);
	line-height: var(--lh-kit-heading-title);
	margin: 0 0 var(--space-5);
	text-transform: var(--tt-kit-heading-title);
}

.fpl-faqpage__group-arrow {
	color: var(--color-brand);
	line-height: 0;
}

.fpl-faqpage__group-intro {
	margin: 0;
}

.fpl-faqpage__list {
	border-top: var(--border-hairline);
}

.fpl-faqpage__item {
	border-bottom: var(--border-hairline);
}

.fpl-faqpage__question {
	align-items: center;
	color: var(--color-text-strong);
	cursor: pointer;
	display: flex;
	font-size: var(--fs-h6);
	font-weight: 600;
	gap: var(--space-6);
	justify-content: space-between;
	line-height: 22px;
	list-style: none;
	padding: var(--space-6) 0;
}

.fpl-faqpage__question::-webkit-details-marker {
	display: none;
}

/* The +/− indicator: two 1px bars, the vertical one collapsing on open. */
.fpl-faqpage__question::after {
	background-image: linear-gradient(currentColor, currentColor), linear-gradient(currentColor, currentColor);
	background-position: center center;
	background-repeat: no-repeat;
	background-size: 13px 1px, 1px 13px;
	content: "";
	flex: none;
	height: 13px;
	width: 13px;
}

.fpl-faqpage__item[open] .fpl-faqpage__question {
	color: var(--color-brand);
}

.fpl-faqpage__item[open] .fpl-faqpage__question::after {
	background-size: 13px 1px, 1px 0;
}

.fpl-faqpage__answer {
	font-size: var(--fs-body);
	font-weight: 400;
	line-height: 22px;
	padding: 0 0 var(--space-9);
}

.fpl-faqpage__answer p {
	margin: 0;
}

.fpl-faqpage__answer a {
	color: var(--color-brand);
}

.fpl-faqpage__answer a:hover {
	color: var(--color-brand-hover);
}


/* ==========================================================================
   55.7  /guides/ and /research/   (containers #b00aa29 and #0d629e9)

   Not stretched: the hero fills the 1290px content box exactly, which is what
   guides__desktop.png measures. The photograph sits top-right at 80% width
   under a left-to-right brand gradient.
   ========================================================================== */

/* The image, now purely a banner. Same photo, same brand gradient, no text on it.
   aspect-ratio keeps it proportional instead of guessing a height; min-height stops it
   collapsing on very wide screens where the ratio would make it a thin strip. */
.fpl-hub__banner {
	aspect-ratio: 1290 / 260;
	background-image: var(--fpl-hub-bg);
	background-position: top right;
	background-repeat: no-repeat;
	background-size: cover;
	min-height: 180px;
	position: relative;
}

.fpl-hub__banner::before {
	background-image: linear-gradient(90deg, var(--fpl-hub-overlay-from) 0%, var(--fpl-hub-overlay-to) 75%);
	content: "";
	inset: 0;
	position: absolute;
}

/* The words, now on the page rather than on the photograph. */
.fpl-hub__intro-block {
	padding: var(--space-8) var(--space-el-container-pad) var(--space-6);
}

.fpl-hub__title {
	color: var(--color-text-strong);
	line-height: 1.1;
	margin: 0 0 var(--space-widget-gap);
}

.fpl-hub__intro {
	color: var(--color-text);
	margin: 0 0 var(--space-widget-gap);
	max-width: 90ch;              /* long lines are hard to track; production had the
	                                 photo doing this job by squeezing the column */
}

.fpl-hub__intro:last-child {
	margin-bottom: 0;
}

/* On the photo these were white-on-image and inherited their colour. On the page they
   need to read as links: brand colour, underlined. */
.fpl-hub__intro a {
	color: var(--color-brand);
	text-decoration: underline;
}

.fpl-hub__intro a:hover {
	color: var(--color-brand-hover);
}

.fpl-hub__grid {
	padding: var(--space-8) var(--space-3);
}


/* ==========================================================================
   55.8  RESPONSIVE
   Elementor's ladder, in its own order: 1366, 1200, 1024, 880, 767.
   ========================================================================== */

@media (max-width: 1366px) {

	.fpl-about__purity-number {
		font-size: 140px;
		line-height: 140px;
	}

	.fpl-about__why-copy {
		padding-right: var(--space-8);
	}

	.fpl-contact__map iframe {
		height: 510px;
	}
}

@media (max-width: 1200px) {

	.fpl-about__hero {
		padding-block: 80px;
	}

	.fpl-about__figure {
		padding-right: var(--space-9);
	}

	.fpl-about__purity {
		padding: var(--space-11) var(--space-5);
	}

	.fpl-about__purity-number {
		font-size: 80px;
		line-height: 80px;
	}

	.fpl-about__story-title,
	.fpl-about__why-title {
		font-size: 54px;
		line-height: 54px;
	}

	.fpl-contact__headline {
		font-size: var(--fs-h2);
	}

	.fpl-faqpage__hero {
		background-position: center right;
	}

	.fpl-faqpage__hero-copy {
		margin-left: var(--space-5);
		width: 50%;
	}

	.fpl-faqpage__group-head {
		padding-right: var(--space-8);
	}
}

@media (max-width: 1024px) {

	.fpl-about__story-copy {
		padding: 0;
	}

	.fpl-about__quotes .fpl-testimonial {
		padding: var(--space-8);
	}

	.fpl-about__why-title {
		margin-bottom: var(--space-8);
	}

	.fpl-contact__hero {
		background-position: bottom left;
	}

	.fpl-contact__hero-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	.fpl-contact__spacer {
		display: none;
	}

	.fpl-contact__headline {
		font-size: var(--fs-kit-heading-title);
	}

	.fpl-faqpage__hero {
		background-position: center right;
		margin-bottom: 80px;
	}

	.fpl-faqpage__group {
		margin-bottom: 80px;
	}

	.fpl-faqpage__group:last-of-type {
		margin-bottom: var(--space-9);
	}

	.fpl-faqpage__group-head {
		padding-right: var(--space-5);
	}
}

@media (max-width: 880px) {

	.fpl-about__hero {
		margin-bottom: var(--space-11);
		padding-block: var(--space-11);
	}

	.fpl-about__purity {
		padding: var(--space-8) var(--space-5);
	}

	.fpl-about__purity-unit {
		font-size: 20px;
	}

	.fpl-about__story-title,
	.fpl-about__why-title {
		font-size: var(--fs-kit-heading-title);
		line-height: var(--lh-kit-heading-title);
	}

	.fpl-about__story-body {
		margin-bottom: var(--space-8);
	}

	.fpl-contact__intro {
		padding-right: var(--space-8);
	}

	.fpl-faqpage__hero {
		margin-bottom: var(--space-11);
	}

	.fpl-faqpage__group {
		margin-bottom: var(--space-11);
	}

	.fpl-faqpage__group:last-of-type {
		margin-bottom: var(--space-6);
	}
}

/* Production narrows the /about-us/ hero photo column between 768 and 880. */
@media (min-width: 768px) and (max-width: 880px) {

	.fpl-about__hero-inner {
		grid-template-columns: 55% 45%;
	}
}

@media (max-width: 767px) {

	/* --- /about-us/ ------------------------------------------------------ */

	.fpl-about__hero {
		padding-inline: var(--container-pad-x);
		text-align: center;
	}

	.fpl-about__hero-inner,
	.fpl-about__story-inner,
	.fpl-about__why-inner {
		grid-template-columns: minmax(0, 1fr);
	}

	.fpl-about__headline {
		font-size: 50px;
		line-height: 50px;
		max-width: none;
	}

	/* elementor-hidden-mobile on widget #efebb58. */
	.fpl-about__hero-art {
		display: none;
	}

	.fpl-about__story {
		padding-inline: var(--container-pad-x);
	}

	.fpl-about__figure {
		padding-right: 0;
	}

	.fpl-about__figure-img {
		margin-inline: auto;
	}

	.fpl-about__purity {
		bottom: auto;
		left: auto;
		margin-top: var(--space-8);
		position: static;
		width: 100%;
	}

	.fpl-about__story-title,
	.fpl-about__why-title {
		font-size: 30px;
		line-height: 30px;
	}

	.fpl-about__why {
		padding: var(--space-11) var(--container-pad-x) 90px;
	}

	.fpl-about__why-copy {
		margin-bottom: var(--space-8);
		padding-right: 0;
	}

	/* Production keeps the 48% widget width and centres the column, so each
	   card wraps onto its own row at just under half width, icon above text. */
	.fpl-about__points {
		grid-template-columns: minmax(0, 48%);
		justify-content: center;
	}

	.fpl-about__point {
		align-items: center;
		flex-direction: column;
		gap: var(--space-2);
		text-align: center;
	}

	.fpl-about__point-title {
		margin-bottom: var(--space-2);
	}

	/* --- /contact-us/ ---------------------------------------------------- */

	.fpl-contact__hero {
		padding-inline: var(--container-pad-x);
	}

	.fpl-contact__hero-grid {
		grid-template-columns: minmax(0, 1fr);
		justify-items: center;
	}

	.fpl-contact__intro {
		margin-bottom: var(--space-10);
		padding-right: 0;
		text-align: center;
	}

	.fpl-contact__headline {
		margin-bottom: var(--space-9);
	}

	.fpl-contact__lede {
		margin-bottom: var(--space-8);
		max-width: 385px;
	}

	.fpl-contact__card {
		padding: var(--space-8);
		text-align: center;
		width: 100%;
	}

	.fpl-contact__detail {
		align-items: center;
		flex-direction: column;
		gap: 0;
		margin-inline: auto;
		max-width: 385px;
	}

	.fpl-contact__detail-title {
		margin-bottom: 3px;
	}

	.fpl-contact__feedback {
		padding-inline: var(--container-pad-x);
	}

	.fpl-contact__feedback-grid {
		gap: var(--space-9);
		grid-template-columns: minmax(0, 1fr);
	}

	.fpl-contact__form-title {
		justify-content: center;
	}

	.fpl-contact__form-intro {
		text-align: center;
	}

	.fpl-contact__map iframe {
		height: 400px;
	}

	/* --- /faq/ ------------------------------------------------------------ */

	.fpl-faqpage__hero {
		padding: var(--space-6) var(--container-pad-x) var(--space-8);
	}

	.fpl-faqpage__hero-inner {
		min-height: 360px;
	}

	.fpl-faqpage__hero-copy {
		margin-left: 0;
		text-align: center;
		width: 100%;
	}

	.fpl-faqpage__title {
		font-size: 50px;
		line-height: 50px;
	}

	.fpl-faqpage__group {
		padding-inline: var(--container-pad-x);
	}

	.fpl-faqpage__group-inner {
		grid-template-columns: minmax(0, 1fr);
	}

	.fpl-faqpage__group-head {
		margin-bottom: var(--space-6);
		padding-right: 0;
		text-align: center;
	}

	.fpl-faqpage__group-title {
		justify-content: center;
	}

	/* --- /guides/ + /research/ -------------------------------------------- */

	.fpl-hub__banner {
		aspect-ratio: 16 / 9;
		min-height: 140px;
	}

	.fpl-hub__intro-block {
		padding-inline: var(--space-3);
	}

	/* Moving this heading off the photo left it unconstrained, and the theme has no
	   responsive type scale, so "Research Peptide Handling Guides" rendered at the full
	   60px: four lines and roughly 370px, about 40% of the first screen on a phone.
	   Uses the site's own mobile page-title size rather than a new number. */
	.fpl-hub__title {
		font-size: var(--fs-entry-title-mobile);   /* 28px */
		line-height: var(--lh-entry-title-mobile); /* 1.25 */
	}

	.fpl-hub__grid {
		padding-inline: 0;
	}
}


/* ==========================================================================
   55.9  HOMEPAGE FAQ INDICATOR — review finding [40]
   Left here as a note, not a rule: 50-content.css §? already sets
   .fpl-faq__indicator { display: none } with the same reasoning (production
   paints no +/− glyph on the homepage FAQ; home__desktop.png y≈4800-5900 shows
   flat h4 + p). Nothing to add — do not re-declare it here.
   ========================================================================== */
/* =============================================================================
   60 — BESPOKE COMMERCE FEATURES
   Certificates of Analysis · product FAQs · split category descriptions ·
   [category_posts] archive grid.

   Every colour here resolves through _tokens.css. Values with no token are
   flagged inline. Concatenated after the tokens block — never @import.
   ============================================================================= */

:root {
	/* [category_posts] card literals with no global token. Moved here from
	   50-content.css when its duplicate copy of this component was deleted —
	   this file is now the component's sole owner. */
	--fpl-card-border: #F9F9F9; /* card hairline */
	--fpl-card-text:   #555555; /* card excerpt  */
}


/* -----------------------------------------------------------------------------
   60.1  COA product tab  (#tab-coa_tab)

   Production shipped this as inline style="" on two divs:
     wrapper .. display:flex; gap:30px; flex-wrap:wrap
     columns .. flex:1; min-width:300px
   Same geometry, moved into the stylesheet.
   -------------------------------------------------------------------------- */

.fpl-coa-tab {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-8); /* 30px */
}

.fpl-coa-tab__body,
.fpl-coa-tab__media {
	flex: 1;
	min-width: 300px;
}

.fpl-coa-tab__media img {
	max-width: 100%;
	height: auto;
}


/* -----------------------------------------------------------------------------
   60.2  /coa-lab-reports/

   Reconstructed from the live rendered page and the three reference
   screenshots. The live page's card list is a `display:table` div wrapping bare
   <tr><td> with no <table>; browsers drop those tags, so the cards render as a
   flush single column at every width. That is what the screenshots show and
   what is reproduced here — measured pitch 97.85px per card at 1440, i.e. card
   height with no gap.
   -------------------------------------------------------------------------- */

.fpl-coa-page {
	max-width: 1100px; /* no token: this page's own wrapper */
	margin: 0 auto;
	padding: var(--space-11) var(--space-6); /* 60px 20px */
	box-sizing: border-box;
}

/* Hero ---------------------------------------------------------------------- */

.fpl-coa-hero {
	background: linear-gradient(135deg, var(--color-brand), var(--color-brand-hover));
	border-radius: 16px; /* no token: hero-only */
	padding: 48px var(--space-9); /* 48px 40px */
	margin-bottom: 48px;
	color: var(--color-text-on-brand);
}

.fpl-coa-hero__title {
	font-size: 36px; /* no token: inline override of the 48px h2/h1 scale */
	font-weight: 700;
	color: var(--color-text-on-brand);
	margin: 0 0 var(--space-4); /* 12px */
}

.fpl-coa-hero__lede {
	font-size: var(--fs-h6); /* 16px */
	color: rgba(255, 255, 255, .75);
	margin: 0 0 32px; /* no token: 32px sits between --space-8 (30) and --space-9 (40) */
}

/* Picker -------------------------------------------------------------------- */

.fpl-coa-picker {
	background: var(--color-bg);
	border-radius: var(--radius-pack); /* 12px */
	padding: 28px 32px; /* no token */
}

.fpl-coa-picker__label {
	display: block;
	font-size: 13px; /* no token */
	font-weight: var(--fw-label); /* 600 */
	color: var(--color-brand);
	margin-bottom: 8px; /* no token */
	letter-spacing: .05em;
	text-transform: uppercase;
}

.fpl-coa-picker__row {
	display: flex;
	align-items: center;
	gap: var(--space-4); /* 12px — production used a 12px table-cell padding */
}

.fpl-coa-select {
	flex: 1 1 auto;
	min-width: 0;
	width: 100%;
	padding: 14px 16px; /* no token */
	border: 1px solid var(--color-border-coa);
	border-radius: 8px; /* no token */
	font-size: 15px; /* no token */
	color: var(--color-brand);
	background: var(--color-surface-coa);
	cursor: pointer;
}

.fpl-coa-search {
	flex: 0 0 140px;
	width: 140px;
}

/* Production put the select and the button in table-cells of a table that never
   existed, so below ~600px the select collapsed to roughly 50px wide and the
   control became unusable. Stack instead. Desktop is untouched.

   Breakpoint is 576px, not 600px: 600 belongs to neither the canonical set
   (767/880/1024/1200/1366 plus the reconciled 768/911/1320) nor the deliberate
   Bootstrap pair, and it was the only rule in this partial using it. 576 is the
   Bootstrap step §60.5 below already uses, so the file now has one small-screen
   step instead of two 24px apart. Between 577 and 600px the row simply stays a
   row, with the select at ~390px — the collapse this rule exists to prevent
   only happens well below that. */
@media (max-width: 576px) {

	.fpl-coa-picker__row {
		display: block;
	}

	.fpl-coa-select {
		width: 100%;
		margin-bottom: var(--space-4);
	}

	.fpl-coa-search {
		width: 100%;
	}
}

/* Viewer -------------------------------------------------------------------- */
/* `.coa-viewer` was flagged in design-tokens.md §9 as an orphaned component:
   styled in the child theme, matched by nothing. It is NOT dead — the live
   /coa-lab-reports/ page builds the same box with id="coa-viewer" and a full
   set of duplicated inline styles, so the class rules never applied. The class
   is restored here and the inline copy dropped. Values are the child theme's,
   unchanged. */

.coa-viewer {
	margin-bottom: 48px;
	border: 1px solid var(--color-border-coa);
	border-radius: var(--radius-pack); /* 12px */
	overflow: hidden;
	box-shadow: var(--shadow-coa);
}

.coa-viewer[hidden] {
	display: none;
}

.coa-viewer .coa-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--space-5);
	background: var(--color-brand);
	padding: 16px 24px; /* no token */
	box-sizing: border-box;
}

.coa-viewer .coa-title {
	color: var(--color-text-on-brand);
	font-size: var(--fs-h6); /* 16px */
	font-weight: var(--fw-label); /* 600 */
}

.coa-viewer .coa-download-link {
	color: rgba(255, 255, 255, .75);
	font-size: 13px; /* no token */
	text-decoration: none;
	white-space: nowrap;
}

.coa-viewer .coa-download-link:hover,
.coa-viewer .coa-download-link:focus-visible {
	color: var(--color-text-on-brand);
	text-decoration: underline;
}

.coa-viewer .coa-body {
	padding: 24px;
	background: var(--color-surface-coa);
}

.coa-viewer .coa-body img {
	width: 100%;
	max-width: 800px;
	display: block;
	margin: 0 auto;
	border-radius: 8px; /* no token */
	box-shadow: var(--shadow-coa-img);
}

/* Report list --------------------------------------------------------------- */

.fpl-coa-heading {
	font-size: 28px; /* no token: inline override of the 48px h2 scale */
	font-weight: 700;
	color: var(--color-brand);
	text-align: center;
	margin: 0 0 32px;
	text-transform: uppercase;
	letter-spacing: .05em;
}

.fpl-coa-list {
	display: block;
}

.fpl-coa-card {
	display: flex;
	align-items: center;
	border: 1px solid var(--color-border-coa);
	border-radius: var(--radius-pack); /* 12px */
	padding: var(--space-6); /* 20px */
	background: var(--color-bg);
	color: inherit;
	text-decoration: none;
	box-sizing: border-box;
}

.fpl-coa-card:hover,
.fpl-coa-card:focus-visible {
	border-color: var(--color-brand);
	text-decoration: none;
}

.fpl-coa-card:focus-visible {
	outline: 2px solid var(--color-brand);
	outline-offset: 2px;
}

/* 60px content box + 16px gutter reproduces the original table-cell geometry. */
.fpl-coa-card__thumb {
	flex: 0 0 60px;
	box-sizing: content-box;
	padding-right: 16px; /* no token */
	display: flex;
	align-items: center;
}

.fpl-coa-card__thumb img {
	width: 56px;
	height: 56px;
	object-fit: contain;
	border-radius: 8px; /* no token */
}

.fpl-coa-card__text {
	flex: 1 1 auto;
	min-width: 0;
}

.fpl-coa-card__title {
	display: block;
	font-size: 15px; /* no token */
	font-weight: var(--fw-label); /* 600 */
	color: var(--color-text-card-title);
	margin-bottom: var(--space-1); /* 4px */
}

.fpl-coa-card__meta {
	display: block;
	font-size: var(--fs-small); /* 12px */
	color: var(--color-text-muted);
}

.fpl-coa-card__arrow {
	flex: 0 0 32px;
	text-align: right;
	font-size: var(--fs-h5); /* 20px */
	color: var(--color-brand);
	line-height: 1;
}

.fpl-coa-empty {
	text-align: center;
	color: var(--color-text-muted);
}


/* -----------------------------------------------------------------------------
   60.3  Per-product FAQ tab  (#tab-fpl_faq_tab)

   The stored `_fpl_custom_faq` HTML renders as a disclosure accordion when it is
   heading-led, and as a plain block otherwise. Type spec follows the product
   accordion in design-tokens.md §7.11 so the two read as one system.
   -------------------------------------------------------------------------- */

/* Anything the author wrote before the first question. */
.fpl-faq-intro {
	margin-bottom: var(--space-6); /* 20px */
}

.fpl-faq-intro > :last-child {
	margin-bottom: 0;
}

.fpl-faq-accordion {
	border-top: 1px solid var(--color-border);
}

.fpl-faq-item {
	border-bottom: 1px solid var(--color-border);
}

.fpl-faq-question {
	margin: 0;
	font-size: inherit;
	line-height: inherit;
	font-weight: inherit;
}

.fpl-faq-trigger {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--space-6);
	width: 100%;
	padding: var(--space-8) 0; /* 30px 0 */
	margin: 0;
	background: none;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	text-align: left;
	cursor: pointer;
	font-family: var(--font-display);
	font-size: var(--fs-tab-title); /* 24px */
	line-height: var(--lh-tab-title);
	font-weight: var(--fw-tab-title); /* 700 */
	color: var(--color-text-muted);
	text-transform: none;
	letter-spacing: normal;
	transition: color var(--dur-base) var(--ease-base);
}

/* The theme paints a skewed black slab behind every button via :after. Not here. */
.fpl-faq-trigger::before,
.fpl-faq-trigger::after {
	content: none;
}

.fpl-faq-trigger:hover,
.fpl-faq-trigger[aria-expanded="true"] {
	color: var(--color-text-strong);
	background: none;
}

.fpl-faq-trigger:focus-visible {
	outline: 2px solid var(--color-brand);
	outline-offset: 2px;
}

/* Two 12×1px bars; the vertical one un-rotates when the item opens. */
.fpl-faq-trigger__icon {
	position: relative;
	flex: 0 0 12px;
	width: 12px;
	height: 12px;
}

.fpl-faq-trigger__icon::before,
.fpl-faq-trigger__icon::after {
	content: "";
	position: absolute;
	top: 50%;
	left: 0;
	width: 12px;
	height: 1px;
	background: var(--color-text-strong);
	transition: transform var(--dur-base) var(--ease-base);
}

.fpl-faq-trigger__icon::after {
	transform: rotate(90deg);
}

.fpl-faq-trigger[aria-expanded="true"] .fpl-faq-trigger__icon::after {
	transform: rotate(0deg);
}

.fpl-faq-answer {
	padding: 0 0 var(--space-7); /* 0 0 25px */
}

.fpl-faq-answer[hidden] {
	display: none;
}

.fpl-faq-answer > :first-child {
	margin-top: 0;
}

.fpl-faq-answer > :last-child {
	margin-bottom: 0;
}


/* -----------------------------------------------------------------------------
   60.4  Split category description

   The body half carries its own inline styles from PHP (see
   inc/category-descriptions.php). Only the link treatment and the spacing
   between the grid and the body live here — both ported from the child theme.
   -------------------------------------------------------------------------- */

.term-description a,
.term-description-below a {
	color: var(--color-brand);
	text-decoration: none;
	transition: color var(--dur-fast) var(--ease-base);
}

.term-description a:hover,
.term-description-below a:hover,
.term-description a:focus-visible,
.term-description-below a:focus-visible {
	color: var(--color-brand-link-hover);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.term-description-below {
	margin-top: var(--space-9); /* 40px */
}


/* -----------------------------------------------------------------------------
   60.5  [category_posts] card grid  (/guides/, /research/)

   Production leaned on Bootstrap for .row / .col-lg-4. Bootstrap is not loaded
   in the rebuild, so the grid is supplied here, scoped to the shortcode's own
   wrapper. Card styling is the child theme's, verbatim. The 991px and 576px
   breakpoints are Bootstrap's and are kept as-is so the column counts flip at
   exactly the same widths as today.

   SOLE OWNER. 50-content.css §15 carried a second, full copy of this component
   (13 shared selectors) and was deleted. Two selectors lived only in that copy
   and were deliberately NOT ported: a bare, unscoped `.row` (it would restyle
   any .row in the calculator pages' inline HTML — .custom-category-posts below
   is the same element and covers it), and `.col-lg-3`, which no markup emits —
   inc/category-descriptions.php and the live child theme both hardcode
   `col-lg-4`. Do not re-add either. Any new [category_posts] rule goes here.
   -------------------------------------------------------------------------- */

.custom-category-posts {
	display: flex;
	flex-wrap: wrap;
	margin: 0 -15px;
}

.custom-category-posts .col-lg-4 {
	flex: 0 0 auto;
	width: 33.33333333%;
	padding: 0 15px;
	margin-bottom: var(--space-7); /* 25px */
	box-sizing: border-box;
}

.custom-card {
	border: 1px solid var(--fpl-card-border);
	border-radius: var(--radius-card); /* 10px */
	overflow: hidden;
	background-color: var(--color-bg);
	transition: transform var(--dur-base) var(--ease-base), box-shadow var(--dur-base) var(--ease-base);
	display: flex;
	flex-direction: column;
	height: 100%;
	margin-bottom: var(--space-6); /* 20px */
	cursor: pointer;
}

.custom-card:hover {
	transform: translateY(-10px);
	box-shadow: var(--shadow-card-hover);
}

.custom-card .card-img-top {
	width: 100%;
	height: 210px;
	object-fit: cover;
	transition: transform var(--dur-base) var(--ease-base);
}

.custom-card:hover .card-img-top {
	transform: scale(1.05);
}

.custom-card .card-body {
	padding: var(--space-5); /* 15px */
	flex-grow: 1;
	display: flex;
	flex-direction: column;
}

.custom-card .date {
	margin-bottom: var(--space-3); /* 10px */
}

.custom-card .card-title {
	font-size: var(--fs-h5); /* 20px */
	font-weight: var(--fw-label); /* 600 */
	margin-bottom: .75rem;
	color: var(--color-text-hfe-title); /* #333 — shared value, HFE-named token */
	line-height: 28px;
}

.custom-card .card-text {
	font-size: .95rem;
	color: var(--fpl-card-text);
	margin-bottom: auto;
}

.custom-card .read-more {
	display: flex;
	position: relative;
	padding: var(--space-3) var(--space-6); /* 10px 20px */
	border-radius: var(--radius-sm); /* 3px */
	border: none;
	font-weight: var(--fw-label); /* 600 */
	color: var(--color-ink-solid);
	text-transform: uppercase;
	letter-spacing: var(--ls-button); /* 2px */
	transform: skewX(var(--skew-angle)); /* -10deg */
	overflow: hidden;
	margin-top: var(--space-3);
	margin-left: auto;
}

.custom-card:hover .read-more,
.custom-card .read-more:hover {
	color: var(--color-brand);
	cursor: pointer;
}

@media (max-width: 991px) {

	.custom-category-posts .col-lg-4 {
		flex: 0 0 auto;
		width: 33.33333333%;
	}
}

@media (max-width: 576px) {

	.custom-card .card-img-top {
		height: 180px;
	}

	.custom-category-posts .col-lg-4 {
		flex: 0 0 auto;
		width: 100%;
	}

	.custom-card .read-more {
		width: 50%;
	}
}


/* -----------------------------------------------------------------------------
   60.6  Reduced motion
   -------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {

	.custom-card,
	.custom-card .card-img-top,
	.fpl-faq-trigger,
	.fpl-faq-trigger__icon::before,
	.fpl-faq-trigger__icon::after {
		transition: none;
	}

	.custom-card:hover {
		transform: none;
	}

	.custom-card:hover .card-img-top {
		transform: none;
	}
}
/* ==========================================================================
   70-integrations.css
   Age gate · accepted-payment marks

   The homepage trust strip used to live here too, as a second, never-rendered
   .fpl-trust-strip component alongside inc/trust-badges.php's
   frontier_trust_strip(). Both are deleted. The one that renders is
   template-parts/home/trust-bar.php, styled as .fpl-trust in 50-content.css §3;
   its "$199" now comes from frontier_free_shipping_threshold(). Do not add a
   second copy back here.

   Concatenated after assets/css/_tokens.css, so every var(--…) below is
   already defined. No @import, no second stylesheet.

   Media queries repeat the raw breakpoint values (767px, 1024px) because
   custom properties cannot be used in a media query condition. They are the
   same numbers as --bp-mobile / --bp-tablet; change both together.
   ========================================================================== */


/* ==========================================================================
   1. AGE GATE
   Ported from the `fastest-age-verification` plugin.

   In production the plugin's stylesheet is almost entirely dead: its
   .popup-content / .popup-logo / .popup-buttons rules are never applied,
   because the JS builds an unclassed div and styles it with INLINE styles that
   outrank the stylesheet. So the rules below reproduce the INLINE values —
   what actually renders — not the plugin's stylesheet.

   The overlay class name .age-verification-popup is kept deliberately: it is
   the one class the live markup has.
   ========================================================================== */

.age-verification-popup {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	display: flex;
	align-items: center;
	justify-content: center;
	background: rgba(0, 0, 0, .5);   /* inline value; the dead stylesheet said .7 */
	z-index: var(--z-agegate);

	/* NOT in the plugin, and required by the scroll lock this port adds.
	   With the body locked, a panel taller than the viewport (landscape
	   phone, large text settings) would otherwise be unreachable — the lock
	   would turn a cosmetic overflow into a dead end. */
	padding: var(--space-6);
	overflow-y: auto;
	overscroll-behavior: contain;
	-webkit-overflow-scrolling: touch;
}

.fpl-age-gate__panel {
	box-sizing: border-box;
	max-width: 400px;
	padding: var(--space-6);
	border-radius: 8px;              /* inline value; no 8px radius token exists */
	background: var(--color-bg);
	text-align: center;

	/* The plugin sets max-width only, so on a 375px viewport the panel can
	   sit flush to both edges or overflow. Bounded here instead — a broken
	   layout, not a design change. */
	width: 100%;
	margin: auto;
}

.fpl-age-gate__logo {
	display: block;
	max-width: 150px;
	height: auto;
	margin: 0 auto var(--space-3);
}

/* Heading and question carry NO typography rules on purpose.

   The plugin applies no font styles at all, so on the live site the gate
   inherits the theme's h2 and p. Hardcoding sizes here would make the rebuilt
   gate DIVERGE from production rather than match it. If the heading looks
   oversized, that is the theme's h2 (48px) and it is what ships today —
   changing it is a design decision for Marco, not a port. */

/* --- Buttons -------------------------------------------------------------

   THE ONE DELIBERATE VISUAL FIX IN THIS FILE.

   Production configures yesButtonColor and noButtonColor as "#ffffff" and the
   plugin JS then hardcodes `color: white` on both, so both controls of the
   site's only compliance gate are white text on a white face, over a white
   card. The theme's global button treatment also paints its skewed black
   ::after slab behind them (design-tokens §8 trap 5).

   So: geometry is kept exactly as the plugin sets it (padding 10px 20px,
   radius 5px, 10px gap after Yes), the configured colour still drives the
   background, the foreground is computed for contrast in JS, a 1px edge makes
   a white button visible against a white card, and the decorative slab is
   switched off so it cannot sit behind the face.
   ------------------------------------------------------------------------ */

.fpl-age-gate__btn {
	display: inline-block;
	padding: var(--space-3) var(--space-6);   /* 10px 20px */
	border: 1px solid var(--color-border-pay);
	border-radius: var(--radius-lg);          /* 5px */
	background: var(--color-bg);
	color: var(--color-text);
	font-family: inherit;
	font-size: 16px;                          /* also keeps iOS from zooming */
	line-height: 1.25;
	letter-spacing: normal;
	text-transform: none;
	cursor: pointer;
	transition: opacity var(--dur-fast) var(--ease-base);
}

/* Kill the theme's decorative skew slab on these two buttons only. */
.fpl-age-gate__btn::before,
.fpl-age-gate__btn::after {
	display: none;
	content: none;
}

.fpl-age-gate__btn:hover {
	opacity: .85;
}

.fpl-age-gate__btn:focus-visible {
	outline: 2px solid var(--color-brand);
	outline-offset: 2px;
}

.fpl-age-gate__btn--yes {
	margin-right: var(--space-3);             /* 10px, as inline-styled */
	background: var(--fpl-age-yes-bg, var(--color-bg));
	color: var(--fpl-age-yes-ink, var(--color-text));
}

.fpl-age-gate__btn--no {
	background: var(--fpl-age-no-bg, var(--color-bg));
	color: var(--fpl-age-no-ink, var(--color-text));
}

/* --- Scroll lock ---------------------------------------------------------

   position:fixed on <body> is the only lock iOS Safari honours. The JS sets
   body.style.top to the negative scroll offset before adding this class and
   restores the scroll position when it removes it, so the page does not jump.
   ------------------------------------------------------------------------ */

body.fpl-age-gate-locked {
	position: fixed;
	left: 0;
	right: 0;
	width: 100%;
	overflow: hidden;
}


/* ==========================================================================
   2. ACCEPTED PAYMENT MARKS  —  .fpl-paytrust
   design-tokens.md §7.12. Transcribed from Elementor Pro snippet #9472's own
   <style> block, with the literals swapped for the tokens that hold the same
   values. Geometry is unchanged.
   ========================================================================== */

.fpl-paytrust {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--space-3);                       /* 10px */
	margin: 18px 0;
	padding: 14px 0;
	border-top: 1px solid var(--color-border-hairline);
}

.fpl-paytrust-label {
	font-size: 13px;
	font-weight: 600;
	color: var(--color-text-trust-label);
	letter-spacing: .02em;
}

.fpl-paytrust-marks {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
}

.fpl-pm {
	display: block;
	width: 40px;
	height: 26px;
}

.fpl-pay-bank {
	display: inline-flex;
	align-items: center;
	gap: var(--space-2);                       /* 6px */
	height: 26px;
	padding: 0 var(--space-3);                 /* 0 10px */
	border: 1px solid var(--color-border-pay);
	border-radius: var(--radius-md);           /* 4px */
	background: var(--color-bg);
	font-size: 11px;
	color: var(--color-text);
	white-space: nowrap;
}

.fpl-pay-bank b {
	color: var(--color-brand);
	font-weight: 700;
}

/* Footer variant. Production matches on #colophon; the rebuilt footer may not
   carry that id, so the PHP also adds .fpl-paytrust-footer and both are
   matched here. Keep the two in step. */
#colophon .fpl-paytrust,
.fpl-paytrust-footer {
	justify-content: center;
	margin: 0;
	padding: 18px 16px;                        /* production literals; no 18/16px token */
}

@media (max-width: 767px) {
	.fpl-paytrust {
		justify-content: center;
	}

	.fpl-paytrust-label {
		width: 100%;
		text-align: center;
	}
}
/* ========================================================================== 
   80 — FRONTIER CLINICAL
   Option A visual system. This final partial intentionally overrides the
   parity-era styles without changing templates, copy, URLs, or functionality.
   ========================================================================== */

:root {
	--color-brand: #5267cc;
	--color-brand-hover: #3549ac;
	--color-brand-deep: #243b73;
	--color-brand-link-hover: #3549ac;
	--color-brand-muted: #9aa7df;
	--color-brand-tint-25: rgba(82, 103, 204, .2);
	--color-bg: #f8fbfd;
	--color-surface-light: #f0f5f8;
	--color-surface-card: #f2f7fa;
	--color-surface-caption: #ffffff;
	--color-surface-coa: #f5f9fc;
	--color-surface-muted: #f3f7fa;
	--color-ink-solid: #17324d;
	--color-ink-deep: #17324d;
	--color-text: #405267;
	--color-text-strong: #17324d;
	--color-text-muted: #708094;
	--color-text-card-title: #17324d;
	--color-text-price: #5267cc;
	--color-link: #29445f;
	--color-link-hover: #5267cc;
	--color-border: #dce8ee;
	--color-border-card: #dce8ee;
	--color-border-soft: #e5eef2;
	--color-border-input-alt: #ccdbe3;
	--color-border-pack: #cfdee6;
	--color-announce-bg: #5267cc;
	--color-header-bg: rgba(255, 255, 255, .96);
	--color-nav-link: #29445f;
	--color-nav-link-hover: #5267cc;
	--color-submenu-bg: #ffffff;
	--color-submenu-bg-hover: #eef3ff;
	--color-submenu-text: #29445f;
	--color-footer-bg: #f8fbfd;
	--color-footer-heading: #17324d;
	--color-footer-text: #5f7185;
	--font-display: "Plus Jakarta Sans", "Helvetica Neue", Arial, sans-serif;
	--font-body: "Plus Jakarta Sans", "Helvetica Neue", Arial, sans-serif;
	--fs-body: 16px;
	--lh-body: 1.7;
	--fs-h1: 68px;
	--lh-h1: 1.06;
	--fs-h2: 52px;
	--lh-h2: 1.1;
	--fw-heading: 500;
	--fw-kit-primary: 600;
	--fs-nav: 14px;
	--fw-nav: 600;
	--fs-card-title: 17px;
	--fw-card-title: 600;
	--fs-button: 12px;
	--fw-button: 700;
	--ls-button: .1em;
	--ls-eyebrow: .18em;
	--radius-sm: 8px;
	--radius-md: 12px;
	--radius-lg: 16px;
	--radius-search: 999px;
	--radius-card: 22px;
	--radius-pack: 18px;
	--radius-pill: 999px;
	--shadow-card: 0 18px 55px rgba(33, 58, 83, .09);
	--shadow-header: 0 8px 34px rgba(33, 58, 83, .06);
	--dur-base: .25s;
	--fpl-hero-min: 820px;
	--fpl-hero-min-sm: 700px;
}

body {
	background: var(--color-bg);
	font-size: var(--fs-body);
}

h1, h2, h3, h4, h5, h6 {
	color: var(--color-ink-solid);
	font-weight: 500;
	letter-spacing: -.035em;
}

input, select, textarea {
	background: #fff;
	border-color: var(--color-border);
	border-radius: 12px;
	min-height: 48px;
}

/* Buttons: replace the old angled slabs with calm pill controls. */
button:not(.fpl-search__submit):not(.fpl-menu-toggle):not(.fpl-nav__toggle):not(.fpl-flyout-nav__toggle):not(.fpl-flyout-close):not(.fpl-cart--toggle):not(.fpl-cart-drawer__close),
.button,
.fpl-cta,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button {
	background: var(--color-brand);
	border: 1px solid var(--color-brand);
	border-radius: 999px;
	box-shadow: none;
	clip-path: none;
	color: #fff;
	font-family: var(--font-body);
	letter-spacing: var(--ls-button);
	transform: none;
}

button::after,
.button::after,
.fpl-cta::before,
.fpl-cta::after,
.woocommerce a.button::after,
.woocommerce button.button::after,
.woocommerce input.button::after {
	content: none !important;
}

.fpl-cta__label,
.button > span {
	transform: none !important;
}

.button:hover,
.fpl-cta:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover {
	background: var(--color-brand-hover);
	border-color: var(--color-brand-hover);
	color: #fff;
	transform: translateY(-2px);
}

/* Header */
.fpl-announcement__inner { padding-block: 9px; }
.fpl-announcement__text { font-size: 11px; letter-spacing: .16em; }
.fpl-header { box-shadow: var(--shadow-header); }
.fpl-header__grid { grid-template-columns: 25% 47% 28%; }
.fpl-header__brand,
.fpl-header__search,
.fpl-header__actions { padding-block: 20px; }
.fpl-header__brand img { max-height: 72px; width: auto; }
.fpl-search { border-color: var(--color-border); border-radius: 999px; background: #f7fafc; }
.fpl-search__field { background: transparent; border: 0; min-height: 44px; }
.fpl-account,
.fpl-cart { color: var(--color-text-strong); }
.fpl-header__nav { border-top: 1px solid var(--color-border); }
.fpl-header__nav {
	box-shadow: 0 10px 25px rgba(31,58,84,.055);
	position: sticky;
	top: 0;
	z-index: 110;
}
.admin-bar .fpl-header__nav { top: 32px; }
.fpl-nav > li > a { font-size: var(--fs-nav); letter-spacing: .01em; padding-block: 17px; }
.fpl-nav .sub-menu { border: 1px solid var(--color-border); border-radius: 14px; box-shadow: var(--shadow-card); overflow: hidden; padding: 8px; }
.fpl-nav .sub-menu a { border-radius: 9px; }

/* Hero */
.fpl-hero {
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	margin-top: 0;
	width: 100vw;
}
.fpl-hero__slide {
	/* The room fills the banner independently of the smaller product scene. */
	background-color: #edf5fc;
	background-image: var(--fpl-hero-room);
	background-position: center;
	background-size: 100% 100%;
	border-radius: 0;
	isolation: isolate;
	overflow: hidden;
	position: relative;
}
.fpl-hero__slide::before {
	background: linear-gradient(90deg, rgba(255,255,255,.84) 0%, rgba(255,255,255,.70) 28%, rgba(255,255,255,.12) 48%, transparent 62%);
	content: "";
	inset: 0;
	pointer-events: none;
	position: absolute;
	z-index: 1;
}
.fpl-hero__slide::after {
	aspect-ratio: 1586 / 992;
	background: var(--fpl-hero-bg) center / 100% 100% no-repeat;
	content: "";
	mask-image: linear-gradient(90deg, transparent 34%, #000 45%, #000 95%, transparent 100%), linear-gradient(180deg, transparent 18%, #000 32%, #000 80%, transparent 100%);
	mask-composite: intersect;
	pointer-events: none;
	position: absolute;
	right: max(0px, calc((100vw - 1720px) / 2));
	top: 50%;
	transform: translateY(-50%);
	width: min(1282px, 95vw);
	z-index: 0;
}
.fpl-hero__inner { position: relative; z-index: 2; }
.fpl-hero__col { flex: 0 0 55%; padding-block: 90px; }
.fpl-hero__spacer { display: block; flex: 0 0 45%; }
.fpl-hero__eyebrow { color: var(--color-brand); font-size: 11px; letter-spacing: .2em; }
.fpl-hero__title { color: var(--color-ink-solid); font-weight: 500; letter-spacing: -.055em; max-width: 9.5em; }
.fpl-hero__copy { color: #4f6277; font-family: var(--font-body); font-size: 16px; font-weight: 400; line-height: 1.75; max-width: 590px; }
.fpl-hero__cta { margin-top: 10px; padding: 14px 22px; }
.fpl-hero__nav { background: rgba(255,255,255,.88); border: 1px solid var(--color-border); box-shadow: 0 8px 25px rgba(32,55,79,.08); color: var(--color-ink-solid); }
.fpl-hero__nav:hover { background: #fff; color: var(--color-brand); }

/* Sections */
.fpl-section__inner--padded { padding-inline: 24px; }
.fpl-section__head { margin-bottom: 52px; }
.fpl-section__eyebrow { color: var(--color-brand); font-size: 11px; font-weight: 700; }
.fpl-section__title { color: var(--color-ink-solid); font-weight: 500; letter-spacing: -.045em; line-height: 1.08; }
.fpl-section__intro { color: var(--color-text); font-size: 16px; line-height: 1.75; }
.fpl-section__viewall a { color: var(--color-brand); font-weight: 700; }
.fpl-trust {
	background: transparent;
	margin-bottom: 28px;
	margin-top: -112px;
	position: relative;
	z-index: 5;
}
.fpl-trust__inner { background: #fff; border: 1px solid var(--color-border); border-radius: 20px; box-shadow: var(--shadow-card); overflow: hidden; }
.fpl-trust__item + .fpl-trust__item { border-color: var(--color-border); }
.fpl-trust__icon {
	background: #eef3ff;
	border-color: #d2dcfa;
	color: var(--color-brand);
}
.fpl-trust__label { color: var(--color-text-strong); }
.fpl-promo { border-radius: 22px; overflow: hidden; }

/* Product grids */
.woocommerce ul.products:not(.products-list) {
	display: grid;
	gap: 22px;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	margin: 0;
	padding: 0;
	width: 100%;
}
.woocommerce ul.products:not(.products-list)::before,
.woocommerce ul.products:not(.products-list)::after { display: none; }
.woocommerce ul.products:not(.products-list) > li.product {
	float: none;
	flex: none;
	margin: 0;
	max-width: none;
	min-width: 0;
	padding: 0;
	width: 100%;
}
@media (max-width: 1023px) {
	.woocommerce ul.products:not(.products-list) { gap: 16px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.woocommerce ul.products li.product .product-block {
	background: #fff;
	border: 1px solid var(--color-border-card);
	border-radius: var(--radius-card);
	box-shadow: 0 8px 30px rgba(31, 58, 84, .035);
	overflow: hidden;
	transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.woocommerce ul.products li.product .product-block:hover {
	border-color: #c8d7df;
	box-shadow: var(--shadow-card);
	transform: translateY(-5px);
}
.product-transition { background: var(--color-surface-card); }
.product-transition .product-image img { transition: transform .45s ease; }
.product-block:hover .product-transition .product-image img { transform: scale(1.025); }
.woocommerce ul.products li.product .product-caption { padding: 22px 22px 26px; text-align: left; }
.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title { font-size: var(--fs-card-title); font-weight: 600; line-height: 1.45; max-height: none; }
.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title a { color: var(--color-text-card-title); }
.woocommerce ul.products li.product .product-caption .price { font-size: 16px; font-weight: 600; text-align: left; }
.woocommerce ul.products li.product .product-caption a.button,
.woocommerce ul.products li.product .product-caption a.button.add_to_cart_button {
	background: transparent;
	border: 1px solid var(--color-brand);
	border-radius: 999px;
	color: var(--color-brand);
	font-size: 11px;
	letter-spacing: .1em;
	margin: 18px 0 0;
	padding: 10px 16px;
}
.woocommerce ul.products li.product .product-caption a.button:hover,
.woocommerce ul.products li.product .product-caption a.button.add_to_cart_button:hover { background: var(--color-brand); color: #fff; }
.product-transition .group-action .shop-action > button,
.product-transition .group-action .shop-action > a { border-color: var(--color-border); box-shadow: 0 6px 18px rgba(31,58,84,.08); }
.woocommerce ul.products li.product .onsale,
.woocommerce ul.products li.product .stock-label { border-radius: 999px; overflow: hidden; padding: 5px 11px; }
.woocommerce ul.products li.product .onsale::after,
.woocommerce ul.products li.product .stock-label::after { border-radius: 999px; transform: none; }

/* Archive controls and pagination */
.woocommerce .woocommerce-ordering select,
.fpl-catalog-toolbar select { border-radius: 999px; }
.woocommerce-pagination .page-numbers li a,
.woocommerce-pagination .page-numbers li span { border-radius: 50%; }

/* Product detail */
.single-product div.product .woocommerce-product-gallery,
.single-product div.product .summary,
.woocommerce-tabs,
.fpl-pack-card,
.coa-viewer { border-radius: 20px; }
.single-product div.product .woocommerce-product-gallery { background: #f2f7fa; padding: 22px; }
.single-product div.product .summary { background: #fff; border: 1px solid var(--color-border); padding: clamp(26px,4vw,52px); }
.single-product div.product .product_title { color: var(--color-ink-solid); font-weight: 500; letter-spacing: -.045em; }
.single-product div.product p.price,
.single-product div.product span.price { color: var(--color-brand); font-weight: 600; }
.fpl-pack-card { background: #fff; transition: border-color .2s, box-shadow .2s, transform .2s; }
.fpl-pack-card:hover { box-shadow: 0 10px 30px rgba(31,58,84,.08); transform: translateY(-2px); }

/* Cart, checkout, account, notices */
.woocommerce-cart-form,
.cart_totals,
.woocommerce-checkout-review-order,
.woocommerce form.checkout,
.woocommerce-account .woocommerce-MyAccount-navigation,
.woocommerce-account .woocommerce-MyAccount-content,
.woocommerce-form-login,
.woocommerce-form-register {
	background: #fff;
	border: 1px solid var(--color-border);
	border-radius: 20px;
	box-shadow: 0 10px 35px rgba(31,58,84,.04);
}
.cart_totals,
.woocommerce-checkout-review-order { border-width: 1px; }
.woocommerce-message,
.woocommerce-info,
.woocommerce-error { border-radius: 14px; box-shadow: 0 8px 26px rgba(31,58,84,.06); }

/* Editorial pages and footer */
.entry-title,
.page-title { color: var(--color-ink-solid); font-weight: 500; letter-spacing: -.045em; }
.entry-content { color: var(--color-text); font-size: 16px; }
.fpl-testimonial,
.fpl-guide-card,
.fpl-research-card { border-radius: 18px; }
.fpl-faq__list { display: grid; gap: 14px; }
.fpl-faq__item {
	background: #fff;
	border: 1px solid var(--color-border);
	border-radius: 18px;
	box-shadow: 0 8px 28px rgba(31,58,84,.035);
	overflow: hidden;
}
.fpl-faq__item + .fpl-faq__item { margin-top: 0; }
.fpl-faq .fpl-faq__toggle {
	background: transparent !important;
	border: 0 !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	color: var(--color-text-strong) !important;
	font-family: var(--font-display) !important;
	font-size: clamp(17px, 1.5vw, 21px) !important;
	font-weight: 600 !important;
	letter-spacing: -.02em !important;
	line-height: 1.4 !important;
	padding: 20px 24px !important;
	text-transform: none !important;
	transform: none !important;
}
.fpl-faq .fpl-faq__toggle:hover,
.fpl-faq .fpl-faq__toggle:focus-visible {
	background: #f6f9ff !important;
	border-color: transparent !important;
	color: var(--color-brand-hover) !important;
	transform: none !important;
}
.fpl-faq .fpl-faq__indicator { display: block; }
.fpl-faq__answer {
	border-top: 1px solid var(--color-border-soft);
	margin: 0;
	padding: 18px 24px 22px;
}
.fpl-testimonials { background-attachment: fixed; }
.fpl-footer { background: var(--color-footer-bg); border-top: 1px solid var(--color-border); }
.fpl-footer__heading { color: var(--color-footer-heading); letter-spacing: .04em; }

@media (max-width: 1024px) {
	:root { --fs-h1: 54px; --fs-h2: 44px; }
	.fpl-header__brand,
	.fpl-header__search,
	.fpl-header__actions { padding-block: 14px; }
	.fpl-hero__slide { border-radius: 0; }
	.fpl-hero__col { flex-basis: 48%; }
	.fpl-hero__spacer { flex-basis: 52%; }
}

@media (max-width: 767px) {
	:root { --fs-body: 16px; --fs-h1: 42px; --fs-h2: 36px; --fpl-hero-min-sm: 720px; }
	.fpl-hero { margin-inline: 0; margin-top: 0; }
	.fpl-hero__slide { align-items: flex-end; background-color: #fff; background-image: var(--fpl-hero-bg-mobile); background-position: top center; background-size: 100% auto; border-radius: 0; }
	.fpl-hero__slide::before { background: linear-gradient(0deg, rgba(255,255,255,1) 0%, rgba(255,255,255,.98) 42%, rgba(255,255,255,0) 72%); }
	.fpl-hero__slide::after { display: none; }
	.fpl-hero__col { flex: 0 0 100%; padding: 300px 4px 70px; }
	.fpl-hero__spacer { display: none; }
	.fpl-hero__title { font-size: var(--fs-h1); }
	.fpl-hero__copy { font-size: 15px; line-height: 1.65; }
	.fpl-trust { margin-bottom: var(--space-11); margin-top: -30px; }
	.fpl-trust__inner { border-radius: 0 0 18px 18px; }
	.woocommerce ul.products:not(.products-list) { gap: 12px; }
	.woocommerce ul.products li.product .product-block { border-radius: 15px; }
	.woocommerce ul.products li.product .product-caption { padding: 15px 13px 18px; }
	.woocommerce ul.products li.product .product-caption .woocommerce-loop-product__title { font-size: 14px; }
	.woocommerce ul.products li.product .product-caption .price { font-size: 14px; }
	.woocommerce ul.products li.product .product-caption a.button,
	.woocommerce ul.products li.product .product-caption a.button.add_to_cart_button { font-size: 10px; padding: 9px 11px; }
	.single-product div.product .summary { border-radius: 16px; padding: 24px 18px; }
	.fpl-testimonials { background-attachment: scroll; }
}

@media (max-width: 782px) {
	.admin-bar .fpl-header__nav { top: 46px; }
}

/* Homepage paragraph alignment requested for the clinical preview. */
.fpl-home p { text-align: center; }
.fpl-home .fpl-hero p { text-align: left; }

/* Each slide is a single continuous photograph, never a masked inset. */
.fpl-hero__slide { background-image: var(--fpl-hero-bg); background-size: cover; background-position: center; }
.fpl-hero__slide::after { display: none; }
@media (max-width: 767px) {
 .fpl-hero__slide { background-size: auto 300px; background-position: 85% top; background-repeat: no-repeat; background-color: #fff; }
}


/* Mobile polish: shared card sizing and independent header controls. */

/* Responsive complete-scene images, selected without enlarging a small asset. */
@media (min-width: 768px) {
 .fpl-hero__slide { background-image: image-set(var(--fpl-hero-bg) 1x, var(--fpl-hero-bg-retina) 2x); }
}
@media (min-width: 1921px) {
 .fpl-hero__slide { background-image: var(--fpl-hero-bg-retina); }
}
@media (max-width: 767px) {
 .fpl-hero__slide { background-image: var(--fpl-hero-bg-mobile); background-size: 100% auto; background-position: center top; }
}


@media (min-width: 768px) {
 .fpl-hero__slide { min-height: max(500px, 30vw); }
 .fpl-trust { margin-top: -50px; }
 .fpl-hero__col { padding-block: 45px 85px; flex-basis: 48%; }
 .fpl-hero__spacer { flex-basis: 52%; }
 .fpl-hero__title { font-size: clamp(36px, 3.6vw, 60px); }
 .fpl-hero__copy { font-size: 16px; line-height: 1.65; max-width: 550px; color: #344b63; }
}
@media (max-width: 767px) {
 .fpl-hero__slide { background-size: 100% auto; background-position: center top; }
}
.fpl-mobile-bar button.fpl-mobile-bar__cell--search { border: 0 !important; border-radius: 0 !important; }

@media (max-width: 767px) {
 .fpl-header__grid { grid-template-columns: minmax(0, 1fr) 44px; gap: 12px; padding-inline: 20px; }
 .fpl-header__brand { min-width: 0; }
 .fpl-header__brand img { max-width: min(250px, 100%); height: auto; }
 .fpl-menu-toggle { justify-self: end; width: 44px; }
 .fpl-hero__nav { display: none; }
 .woocommerce.fpl-product-grid--featured ul.products li.product .product-caption .woocommerce-loop-product__title { font-size: 14px; line-height: 1.4; }
 .woocommerce.fpl-product-grid--featured ul.products li.product .product-caption .price { font-size: 14px !important; }
 .woocommerce.fpl-product-grid--featured ul.products li.product .product-caption a.button,
 .woocommerce.fpl-product-grid--featured ul.products li.product .product-caption a.button.add_to_cart_button { font-size: 10px; line-height: var(--lh-button); padding: 9px 11px; white-space: nowrap; }
}
.fpl-mobile-bar button.fpl-mobile-bar__cell--search,
.fpl-mobile-bar button.fpl-mobile-bar__cell--search:hover,
.fpl-mobile-bar button.fpl-mobile-bar__cell--search:focus { background: transparent !important; color: var(--color-nav-link); box-shadow: none; border-radius: 0; }

.woocommerce ul.products li.product .posted-in { display: none !important; }
.fpl-home .fpl-about, .fpl-home .fpl-about p { text-align: left; }
.fpl-home .fpl-about { padding-bottom: clamp(80px, 8vw, 128px); }
.fpl-home .fpl-faq .fpl-section__title { text-align: center; }
.fpl-footer__copyright .fpl-footer__copyright-text { max-width: none; width: 100%; text-align: center; }
.fpl-footer__copyright-text > div { display: inline; }
@media (min-width: 768px) {
 .fpl-footer__columns .fpl-footer__inner { grid-template-columns: .8fr repeat(3, 1fr); gap: 28px; }
 .fpl-footer__columns .fpl-footer__col { padding-inline: 0; }
}
/* Refined header search and commerce surfaces. */
.fpl-header .fpl-search { height: 46px; padding: 3px; border: 1px solid #dce7ee; background: #f7fafc; align-items: center; }
.fpl-header .fpl-search:focus-within { border-color: #5668d5; box-shadow: 0 0 0 3px rgba(86,104,213,.12); }
.fpl-header .fpl-search input.fpl-search__field { border: 0; border-radius: 0; background: transparent; box-shadow: none; outline: none; min-height: 0; height: 38px; padding: 0 16px; font-size: 14px; }
.fpl-header .fpl-search button.fpl-search__submit { width: 40px; height: 38px; border-radius: 50%; background: transparent; color: var(--color-brand); }
.fpl-header .fpl-search button.fpl-search__submit:hover { background: #e9edff; color: var(--color-brand); }
.fpl-header .fpl-search__submit:focus-visible { outline: 2px solid var(--color-brand); outline-offset: -2px; }
.fpl-cart-drawer { width: min(94vw, 420px); background: #fff; }
.fpl-cart-drawer__head { padding: 20px 24px; }
.fpl-cart-drawer__title { font-size: 23px; }
.fpl-cart-drawer__body { padding: 0 24px 24px; }
.fpl-cart-drawer ul.woocommerce-mini-cart { list-style: none; margin: 0; padding: 0; }
.fpl-cart-drawer li.woocommerce-mini-cart-item { position: relative; min-height: 120px; margin: 0; padding: 22px 28px 22px 94px; border-bottom: 1px solid #e5edf2; font-size: 14px; line-height: 1.5; }
.fpl-cart-drawer li.woocommerce-mini-cart-item > a:not(.remove) { display: block; color: #19354e; font-weight: 600; text-decoration: none; }
.fpl-cart-drawer li.woocommerce-mini-cart-item img { position: absolute; left: 0; top: 22px; float: none; width: 78px; height: 78px; max-width: 78px; margin: 0; border-radius: 12px; object-fit: cover; }
.fpl-cart-drawer li.woocommerce-mini-cart-item a.remove { position: absolute; top: 20px; right: 0; left: auto; display: grid; place-items: center; width: 24px; height: 24px; font-size: 20px; color: #637589; text-decoration: none; border-radius: 50%; }
.fpl-cart-drawer li.woocommerce-mini-cart-item .quantity { display: block; margin-top: 8px; font-size: 13px; }
.fpl-cart-drawer del { opacity: .55; margin-right: 5px; }
.fpl-cart-drawer ins { text-decoration: none; }
.fpl-cart-drawer .woocommerce-mini-cart__total { display: flex; justify-content: space-between; gap: 12px; padding: 22px 0 0; margin: 0 0 20px; font-size: 17px; }
.fpl-cart-drawer .woocommerce-mini-cart__buttons { display: grid; gap: 10px; margin: 0; }
.fpl-cart-drawer .woocommerce-mini-cart__buttons a.button { width: 100%; margin: 0; text-align: center; padding: 14px 16px; border-radius: 12px; }
.fpl-cart-drawer .woocommerce-mini-cart__buttons a:not(.checkout) { background: #eef1ff; color: var(--color-brand); }
.fpl-cart-drawer .woocommerce-mini-cart__empty-message { padding-top: 24px; }
.woocommerce-cart .entry-header, .woocommerce-checkout .entry-header { padding-block: 28px; margin-bottom: 24px; }
.woocommerce-cart .entry-title, .woocommerce-checkout .entry-title { margin: 0; font-size: clamp(34px, 4vw, 52px); }
.woocommerce-cart .woocommerce-cart-form { overflow: hidden; }
.woocommerce-cart table.cart { margin-bottom: 0; border: 0; }
.woocommerce-cart table.cart th { font-size: 12px; letter-spacing: .06em; padding: 18px 12px; background: #f8fafc; }
.woocommerce-cart table.cart td { padding: 20px 12px; vertical-align: middle; }
.woocommerce-cart table.cart .product-thumbnail img { width: 76px; height: 76px; border-radius: 12px; object-fit: cover; }
.woocommerce-cart table.cart .product-name { font-size: 14px; line-height: 1.5; }
.woocommerce-cart table.cart .product-price, .woocommerce-cart table.cart .product-subtotal { font-size: 14px; white-space: nowrap; }
.woocommerce-cart table.cart del { display: block; opacity: .55; font-size: 12px; }
.woocommerce-cart table.cart ins { text-decoration: none; }
.woocommerce-cart table.cart td.actions { padding: 22px; background: #fafcfe; }
.woocommerce-cart table.cart .coupon { border: 0; padding: 0; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.woocommerce-cart table.cart .coupon .input-text { width: 180px; min-height: 44px; margin: 0; border-radius: 10px; }
.woocommerce-cart table.cart .coupon .button { min-height: 44px; padding: 12px 20px; border-radius: 10px; font-size: 11px; }
.woocommerce-cart .cart_totals { padding: 26px; }
.woocommerce-cart .cart_totals h2 { font-size: 26px; margin-bottom: 20px; }
.woocommerce-cart .cart_totals th, .woocommerce-cart .cart_totals td { padding: 15px 8px; text-align: left; font-size: 14px; }
.woocommerce-cart .wc-proceed-to-checkout .checkout-button { border-radius: 12px; padding: 16px; margin: 0; }
.woocommerce form.checkout { padding: 28px; border: 0; background: transparent; box-shadow: none; }
.woocommerce-checkout #customer_details { background: #fff; padding: 28px; border: 1px solid #dce7ee; border-radius: 18px; box-sizing: border-box; }
.woocommerce-checkout #customer_details .col-1, .woocommerce-checkout #customer_details .col-2 { width: 100%; float: none; }
.woocommerce-checkout #order_review_heading { font-size: 26px; margin-top: 0; margin-bottom: 18px; }
.woocommerce-checkout #order_review { padding: 24px; border: 1px solid #dce7ee; border-radius: 18px; background: #fff; }
.woocommerce-checkout #order_review table { border: 0; margin: 0 0 20px; }
.woocommerce-checkout #order_review th, .woocommerce-checkout #order_review td { padding: 15px 8px; font-size: 14px; text-align: left; }
.woocommerce-checkout #order_review td:last-child, .woocommerce-checkout #order_review th:last-child { text-align: right; }
.woocommerce-checkout .form-row label { font-size: 14px; margin-bottom: 7px; }
.woocommerce-checkout .form-row .input-text { border-radius: 10px; min-height: 46px; padding: 12px 14px; }
.woocommerce-checkout #payment { background: transparent; border: 0; }
.woocommerce-checkout #payment ul.payment_methods { padding: 0; list-style: none; }
.woocommerce-checkout #payment li.wc_payment_method { padding: 16px 0; border-top: 1px solid #e5edf2; }
.woocommerce-checkout #payment li.wc_payment_method > input[type="radio"] { display: inline-block; width: auto; margin: 0 8px 0 0; vertical-align: middle; }
.woocommerce-checkout #payment li.wc_payment_method > label { display: inline; font-size: 14px; font-weight: 600; }
.woocommerce-checkout #payment .payment_box { margin: 14px 0 0; padding: 16px; border-radius: 10px; background: #f7fafc; }
.woocommerce-checkout #payment .place-order { padding: 18px 0 0; }
.woocommerce-checkout #place_order { width: 100%; border-radius: 12px; padding: 16px; }
@media (max-width: 767px) {
 .woocommerce form.checkout { padding: 0; }
 .woocommerce-checkout #customer_details, .woocommerce-checkout #order_review { padding: 20px; }
 .woocommerce-checkout #order_review_heading { margin-top: 28px; }
 .woocommerce-cart .cart_totals { padding: 20px; }
 .woocommerce-cart table.cart td { padding: 14px 18px; }
 .woocommerce-cart table.cart .coupon .input-text { width: 100%; }
 .woocommerce-cart table.cart .coupon .button { width: 100%; }
}
.fpl-format-gateway {
	background: #eef4f8;
	background-image: none;
	padding: 92px 0 104px;
}
.fpl-format-gateway::before { display: none; }
.fpl-flatlay-gateway .fpl-format-card__media { aspect-ratio: 1; height: auto; padding: 0; }
.fpl-flatlay-gateway .fpl-format-card__image { display: block; object-fit: contain; }
.fpl-format-gateway__header {
	margin: 0 auto 38px;
	max-width: var(--container-theme-max);
	padding-inline: var(--space-8);
}
.fpl-format-gateway__header .fpl-section__eyebrow {
	display: block;
	margin-bottom: 12px;
}
.fpl-format-gateway__header .fpl-section__title {
	font-size: clamp(34px, 4vw, 52px);
	margin: 0;
}
.fpl-format-gateway .fpl-format-gateway__grid {
	display: grid;
	gap: 24px;
	grid-template-columns: repeat(3, minmax(0, 1fr));
}
.fpl-format-card {
	background: #fff;
	border: 1px solid var(--color-border);
	border-radius: 24px;
	box-shadow: 0 16px 42px rgba(31,58,84,.07);
	color: var(--color-text-strong);
	display: flex;
	flex-direction: column;
	overflow: hidden;
	text-decoration: none;
	transition: border-color .25s ease, box-shadow .25s ease, transform .25s ease;
}
.fpl-format-card:hover,
.fpl-format-card:focus-visible {
	border-color: #c7d7e0;
	box-shadow: 0 24px 58px rgba(31,58,84,.13);
	color: var(--color-text-strong);
	transform: translateY(-7px);
}
.fpl-format-card__media {
	align-items: center;
	background: linear-gradient(180deg, #f8fbfd 0%, #edf4f8 100%);
	display: flex;
	height: 390px;
	justify-content: center;
	overflow: hidden;
	padding: 26px;
}
.fpl-format-card__image {
	height: 100%;
	max-width: 100%;
	object-fit: contain;
	transition: transform .4s ease;
	width: 100%;
}
.fpl-format-card:hover .fpl-format-card__image { transform: scale(1.04); }
.fpl-format-card__body {
	align-items: flex-end;
	display: flex;
	gap: 20px;
	justify-content: space-between;
	padding: 24px 26px 26px;
}
.fpl-format-card__title {
	font-family: var(--font-display);
	font-size: 28px;
	font-weight: 600;
	letter-spacing: -.035em;
	line-height: 1.15;
}
.fpl-format-card__cta {
	color: var(--color-brand);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: .09em;
	text-transform: uppercase;
	white-space: nowrap;
}

@media (max-width: 767px) { .fpl-format-gateway .fpl-format-gateway__grid { grid-template-columns: 1fr; gap: 20px; padding-inline: 20px; } .fpl-format-gateway { padding: 48px 0; } }

/* Consistent mobile content gutters; backgrounds remain edge-to-edge. */
@media (max-width: 767px) {
 .fpl-home .fpl-section__inner,
 .fpl-home .fpl-hero__inner,
 .fpl-home .fpl-testimonials__inner,
 .fpl-home .fpl-format-gateway .fpl-format-gateway__grid {
  box-sizing: border-box;
  width: 100%;
  min-width: 0;
  padding-left: max(20px, env(safe-area-inset-left));
  padding-right: max(20px, env(safe-area-inset-right));
 }
 .fpl-home .fpl-section__inner > .fpl-product-grid,
 .fpl-home .fpl-hero__col { padding-inline: 0; min-width: 0; }
 .fpl-home .fpl-section__head,
 .fpl-home .fpl-section__intro,
 .fpl-home .fpl-about__col,
 .fpl-home .fpl-seo__body { min-width: 0; overflow-wrap: anywhere; }
 .fpl-home .fpl-trust__inner { padding-inline: 20px; }
 .fpl-footer__columns, .fpl-footer__legal { padding-inline: 20px; }
 .fpl-footer__disclaimer .fpl-footer__inner { padding-inline: 20px; box-sizing: border-box; }
}
