/* ============================================================
   blafili theme — WordPress adaptation layer
   Extends the SIGNAL FIELD system (style.css) with the pieces WP
   needs: dropdown navigation (new IA: Receivers/Transmitters/
   Solutions/Learn/Support/About), mobile submenu accordion,
   archive pagination, and core content alignment classes.
   Everything below uses the existing design tokens only.
   ============================================================ */

/* ---------- desktop dropdowns (.main-nav) ---------- */
.main-nav > ul{ display:flex; gap:6px; list-style:none; margin:0; padding:0; }
.main-nav li{ position:relative; }
.main-nav a{ display:inline-block; }

.main-nav .sub-menu{
  position:absolute; top:calc(100% + 10px); left:50%; translate:-50% 0;
  min-width:230px; list-style:none; margin:0; padding:10px;
  background:rgb(10 14 19 / .96); border:1px solid var(--line2); border-radius:18px;
  box-shadow:0 30px 70px -30px rgb(0 0 0 / .75);
  display:grid; gap:2px;
  opacity:0; visibility:hidden; transform:translateY(8px);
  transition:opacity .3s var(--ease), transform .3s var(--ease), visibility .3s;
}
[data-theme="light"] .main-nav .sub-menu{ background:rgb(255 255 255 / .98); box-shadow:0 30px 70px -32px rgb(20 35 55 / .4); }
/* invisible hover bridge so the pointer can travel to the panel */
.main-nav .sub-menu::before{
  content:""; position:absolute; left:0; right:0; top:-12px; height:12px;
}
.main-nav .sub-menu a{
  display:block; padding:10px 14px; border-radius:10px;
  font:500 .88rem/1.3 var(--f-body); color:var(--mut); white-space:nowrap;
}
.main-nav .sub-menu a::after{ display:none; }
.main-nav .sub-menu a:hover{ color:var(--txt); background:var(--acc-soft); }
.main-nav .sub-menu .sub-menu{ top:-11px; left:100%; translate:0 0; }

/* hover opening is JS-driven (.is-open with a close delay for pointer travel);
   :focus-within keeps keyboard access. Bridges stay for the first hop. */
.main-nav li.is-open > .sub-menu,
.main-nav li:focus-within > .sub-menu{
  opacity:1; visibility:visible; transform:translateY(0);
}

/* ---------- mega menu (product categories) — split navigation panel ----------
   Group structure: TOP > label li ("By output"/"By scene", class bf-mega-label)
   > link column, plus one synthetic .bf-mega-prods slot appended by the theme
   (live WooCommerce cards). The top li carries .bf-mega. The panel anchors to
   .head-inner (li.bf-mega is position:static), so it spans the whole container
   and sits FLUSH under the header — nav row and panel form one uninterrupted
   hover corridor, which is what keeps pointer drift from dropping or swapping
   the menu. Product panels split into a left navigation rail (the menu's own
   groups, big quiet links) and a right featured-products strip. */
.main-nav li.bf-mega{ position:static; }
.head-inner{ position:relative; }

.main-nav li.bf-mega > .sub-menu{
  left:0; right:0; top:100%; translate:0 0;
  width:auto; min-width:0; max-width:none;
  display:flex; align-items:stretch; gap:0;
  padding:30px clamp(20px,3vw,44px) 36px;
  background:var(--raise);
  border:1px solid var(--line); border-top:none;
  border-radius:0 0 14px 14px;
  box-shadow:0 44px 90px -48px rgb(20 35 55 / .5);
}
.main-nav li.bf-mega.is-open > .sub-menu,
.main-nav li.bf-mega:focus-within > .sub-menu{ translate:0 0; }
/* closed bands must NEVER catch the pointer: every band spans the full
   container, so a hidden sibling sits exactly under the open one — if it
   stays hit-testable, entering the open band can fire ghost mouseenter
   events on the sibling and swap the panel. */
.main-nav li.bf-mega:not(.is-open):not(:focus-within) > .sub-menu{ pointer-events:none; }

/* bridge: cover the strip between the nav row and the band across the full
   container width — the pointer can never fall out of the open item */
.main-nav li.bf-mega > .sub-menu::before{ top:-30px; height:30px; }

/* ---- product split panel (Receivers / Transmitters) ---- */
.main-nav li.bf-mega:not(.bf-mega-apps) > .sub-menu{
  display:flex; align-items:stretch; gap:clamp(32px,3vw,56px);
  padding:34px clamp(24px,3vw,48px) 42px;
}
/* left navigation rail: the menu's group columns, stacked */
.main-nav li.bf-mega:not(.bf-mega-apps) > .sub-menu > li{
  flex:0 0 auto; width:clamp(200px,15.5vw,236px);
  padding:0 !important; border:none !important; margin:0 !important;
  opacity:0; transform:translateY(14px);
  transition:opacity .35s var(--ease), transform .35s var(--ease);
}
.main-nav li.bf-mega.is-open:not(.bf-mega-apps) > .sub-menu > li,
.main-nav li.bf-mega:focus-within:not(.bf-mega-apps) > .sub-menu > li{ opacity:1; transform:translateY(0); }
.main-nav li.bf-mega:not(.bf-mega-apps).is-open > .sub-menu > li:nth-child(2),
.main-nav li.bf-mega:not(.bf-mega-apps):focus-within > .sub-menu > li:nth-child(2){ transition-delay:70ms; }
.main-nav li.bf-mega:not(.bf-mega-apps).is-open > .sub-menu > li:nth-child(3),
.main-nav li.bf-mega:not(.bf-mega-apps):focus-within > .sub-menu > li:nth-child(3){ transition-delay:140ms; }

/* nested group lists are static content inside the rail — always visible */
.main-nav .bf-mega .sub-menu .sub-menu{
  position:static; translate:0 0; opacity:1; visibility:visible; transform:none;
  display:grid; gap:0; background:none; border:none; box-shadow:none;
  padding:0; min-width:0; width:auto;
}
.main-nav .bf-mega .sub-menu .sub-menu::before{ display:none; }
.main-nav .bf-mega .sub-menu .sub-menu a{
  display:block; white-space:normal;
  padding:9px 0; border-radius:0; border-bottom:none;
  font:600 16.5px/1.35 var(--f-disp); letter-spacing:-.005em; color:var(--ink-3);
  transition:color .2s var(--ease);
}
/* the first entry of each group is the "all" page — inked like the active
   item on the reference rail */
.main-nav .bf-mega .sub-menu .sub-menu li:first-child > a{ color:var(--ink); }
.main-nav .bf-mega .sub-menu .sub-menu a:hover{ color:var(--acc); background:none; }
.main-nav .bf-mega .sub-menu .sub-menu a::before{ display:none; }

/* group heading row — a non-interactive <span> (the walker filter swaps
   the seeded '#' link for a span); the `> a` twin keeps the same look
   if an admin re-creates a link. */
.main-nav .bf-mega-label > span,
.main-nav .bf-mega-label > a{
  display:block; font:600 11px/1 var(--f-disp) !important; letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3) !important; padding:0 !important; border-radius:0; margin-bottom:12px;
  cursor:default; pointer-events:none; white-space:nowrap;
}
.main-nav .bf-mega-label > span::before,
.main-nav .bf-mega-label > a::before{ display:none; }

/* ---- right side: featured product cards (synthetic .bf-mega-prods slot) ----
   Same specificity as the rail rule above so it wins by source order, plus
   order:9 so the strip always sits after the rail whatever the DOM order.
   Anchor rules are scoped through .main-nav .sub-menu so the generic
   dropdown-link rule cannot flatten the cards back to block links. */
.main-nav li.bf-mega:not(.bf-mega-apps) > .sub-menu > li.bf-mega-prods{
  order:9; flex:1 1 auto; width:auto; min-width:0;
  padding:0 !important; border:none !important; margin-top:0 !important;
  opacity:1 !important; transform:none !important;
}
.bmp-head{
  display:flex; align-items:baseline; justify-content:space-between; gap:24px;
  margin-bottom:20px;
}
.bmp-eyebrow{
  font:600 11px/1 var(--f-disp); letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3);
}
.main-nav .sub-menu a.bmp-all{
  display:inline-flex; align-items:center; gap:8px;
  padding:0; border-radius:0;
  font:600 15px/1.2 var(--f-disp); color:var(--ink); white-space:nowrap;
}
.bmp-all .cta-arrow{ width:15px; height:15px; color:currentColor; transition:transform .3s var(--ease); }
.main-nav .sub-menu a.bmp-all:hover{ color:var(--acc); background:none; }
.bmp-all:hover .cta-arrow{ transform:translateX(4px); }
.bmp-grid{
  /* fixed three tracks, capped to the card size the Receivers panel renders —
     a two-product category keeps the same card size and packs left */
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:20px; max-width:830px;
}
/* R7: the card chrome is shared with the PDP related rail (a.r-card.bmp-card
   there) — same specificity plan as the rail: the anchor rules outrank any
   generic link styling in either tree. */
.main-nav .sub-menu a.bmp-card,
.rel-track a.bmp-card{
  position:relative; display:flex; flex-direction:column; align-items:flex-start;
  padding:0; border-radius:14px; overflow:hidden;
  background:var(--card); color:var(--ink); white-space:normal;
  transition:box-shadow .3s var(--ease), transform .3s var(--ease-out);
}
.main-nav .sub-menu a.bmp-card:hover,
.rel-track a.bmp-card:hover{ box-shadow:var(--shadow-pop); transform:translateY(-3px); background:var(--card); }
.main-nav .sub-menu a.bmp-card:hover .bmp-name,
.rel-track a.bmp-card:hover .bmp-name{ text-decoration:underline; text-underline-offset:3px; }
.bmp-rate{
  position:absolute; top:12px; right:12px; z-index:1;
  display:inline-flex; align-items:center; gap:5px;
  background:var(--raise); border-radius:999px; padding:6px 11px;
  font:600 12.5px/1 var(--f-disp); color:var(--ink);
}
.bmp-rate i{ font-style:normal; color:var(--acc); font-size:12.5px; line-height:1; }
.bmp-media{ display:grid; place-items:center; width:100%; margin:0; padding:32px 26px 12px; }
.bmp-media img{ width:auto; max-width:min(78%,238px); height:auto; mix-blend-mode:multiply; }
/* unscoped: the two-line clamp name renders in the mega panel and the PDP
   related rail alike; no generic `b` rule competes in either tree */
.bmp-name{
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden;
  white-space:normal;
  margin:4px 20px 0; min-height:2.8em;
  font:600 15.5px/1.4 var(--f-disp); letter-spacing:-.005em; color:var(--ink);
}
.bmp-price{ display:flex; align-items:baseline; gap:8px; margin:10px 20px 18px; margin-top:auto; padding-top:10px; font:400 13.5px/1 var(--f-body); color:var(--ink-2); }
.bmp-price b{ font:600 15px/1 var(--f-disp); color:var(--ink); }
.bmp-price s{ opacity:.55; }
/* the synthetic slot is desktop-panel content only — never leaks into the
   mobile nav sheet */
.m-nav li.bf-mega-prods{ display:none !important; }

/* the Support apps tile panel keeps its centered tile row */
.main-nav li.bf-mega-apps > .sub-menu{ background:var(--raise); }

/* ---------- cart drawer ---------- */
/* visibility flips AFTER the slide-out finishes so closing animates too */
.bf-drawer{ position:fixed; inset:0; z-index:80; visibility:hidden; transition:visibility 0s linear .5s; }
.bf-drawer.open{ visibility:visible; transition-delay:0s; }
.bf-drawer-backdrop{
  position:absolute; inset:0; background:rgb(4 6 9 / .55);
  opacity:0; transition:opacity .35s var(--ease);
}
.bf-drawer.open .bf-drawer-backdrop{ opacity:1; }
.bf-drawer-panel{
  position:absolute; top:0; right:0; bottom:0; z-index:1;
  width:min(420px, 100vw);
  background:var(--panel); border-left:1px solid var(--line2);
  display:flex; flex-direction:column;
  transform:translateX(102%); transition:transform .45s var(--ease-out);
  box-shadow:-40px 0 80px -30px rgb(0 0 0 / .6);
}
.bf-drawer.open .bf-drawer-panel{ transform:translateX(0); }
[data-theme="light"] .bf-drawer-panel{ background:#fff; box-shadow:-40px 0 80px -36px rgb(20 35 55 / .45); }
.bf-drawer-head{
  display:flex; align-items:center; justify-content:space-between; gap:14px;
  padding:20px 24px; border-bottom:1px solid var(--line);
}
.bf-drawer-head h3{ font:600 1.05rem/1 var(--f-disp); letter-spacing:.02em; }
.bf-drawer-close{
  width:38px; height:38px; display:grid; place-items:center;
  border:1px solid var(--line2); border-radius:50%; color:var(--txt);
  transition:border-color .3s, color .3s;
}
.bf-drawer-close:hover{ border-color:var(--acc); color:var(--acc); }
.bf-drawer-close svg{ width:15px; height:15px; }
.bf-drawer-body{ flex:1; overflow-y:auto; padding:18px 24px; display:grid; gap:14px; align-content:start; }
/* fragments swap the inner id container; the grid gap is carried by the inner container */
.bf-drawer-body #bfCartDrawerBody{ display:grid; gap:14px; align-content:start; }
.bf-drawer-empty{ display:grid; gap:10px; justify-items:center; text-align:center; padding:44px 10px; }
.bf-drawer-empty .w-ico{ margin:0 0 6px; }
.bf-drawer-empty b{ font:600 1.02rem/1.3 var(--f-disp); }
.bf-drawer-empty p{ font-size:.88rem; color:var(--mut); max-width:30ch; margin:0 0 8px; }
.bf-cart-item{ display:flex; gap:14px; align-items:center; padding:10px 0; border-bottom:1px solid var(--line); }
.bf-cart-item figure{
  width:58px; height:58px; border-radius:12px; overflow:hidden; flex:0 0 auto; margin:0;
  background:linear-gradient(160deg,#fff,#e9eef3); border:1px solid var(--line);
}
.bf-cart-item figure img{ width:100%; height:100%; object-fit:cover; mix-blend-mode:multiply; }
.bf-cart-item .bci-info{ flex:1; min-width:0; }
.bf-cart-item .bci-info b{ display:block; font:600 .9rem/1.3 var(--f-disp); }
.bf-cart-item .bci-info span{ font-size:.8rem; color:var(--mut); }
.bf-cart-item .bci-price{ font:600 .88rem/1 var(--f-disp); color:var(--acc); white-space:nowrap; }
/* drawer line price pairs the struck regular price for promo SKUs */
.bf-cart-item .bci-price del{ color:var(--mut); font-weight:400; font-size:.85em; margin-right:4px; }
.bf-cart-item .bci-price ins{ text-decoration:none; }
.bf-drawer-foot{ padding:20px 24px 24px; border-top:1px solid var(--line); }
.bf-drawer-foot #bfCartDrawerFoot{ display:grid; gap:14px; }
.bf-drawer-subtotal{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; }
.bf-drawer-subtotal span{ font:600 .78rem/1 var(--f-disp); letter-spacing:.18em; text-transform:uppercase; color:var(--mut); }
.bf-drawer-subtotal b{ font:650 1.3rem/1 var(--f-disp); }
.bf-drawer-actions{ display:grid; gap:10px; }
.bf-drawer-actions .cta-btn, .bf-drawer-actions .ghost-btn{ justify-content:center; }
/* explicit free-shipping promise in the drawer (free shipping on all orders) */
.bf-drawer-free{
  display:flex; align-items:center; gap:8px; margin:0;
  font:600 .84rem/1.3 var(--f-body); color:var(--acc);
}
.bf-drawer-free svg{ width:17px; height:17px; flex:none; }

/* ---------- native cart page: free-shipping banner + trust + cross-sell ----------
   Banner reuses the .bf-form-note.ok success pattern (acc-soft bg /
   acc-glow border / acc text); trust chips reuse the .hero-chips pill
   style; cross-sell grid reuses .p-card with width reset (cards are
   track-sized by default). */
.bf-cart-free{
  display:flex; align-items:center; gap:10px;
  background:var(--acc-soft); border:1px solid var(--acc-glow); border-radius:var(--r-md, 16px);
  color:var(--acc); padding:13px 18px; margin:0 0 14px;
  font:600 .92rem/1.4 var(--f-body);
}
.bf-cart-free svg{ width:20px; height:20px; flex:none; }
/* four promises as ✓-dot benefit cards heading the cross-sell rail —
   same card pattern as the category landing hero. Scoped under
   .entry-content to outrank the shared list measure (0,1,1) that wraps
   every list on this page */
.entry-content .bf-cart-trust{
  margin:clamp(28px,5vh,44px) 0 0;
  display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); gap:14px;
  list-style:none; padding:0;
}
.entry-content .bf-cart-trust li{
  display:flex; align-items:center; gap:11px;
  background:var(--raise); border:1px solid var(--line);
  border-radius:12px; padding:16px 18px;
  font:500 14.5px/1.35 var(--f-body); color:var(--ink);
  min-width:0;
}
.entry-content .bf-cart-trust li::before{
  content:"✓"; flex:0 0 auto;
  width:22px; height:22px; border-radius:50%;
  background:var(--acc); color:#fff;
  display:grid; place-items:center;
  font:700 12px/1 var(--f-disp);
}
@media (max-width:900px){ .entry-content .bf-cart-trust{ grid-template-columns:repeat(2, minmax(0,1fr)); } }
@media (max-width:480px){ .entry-content .bf-cart-trust{ grid-template-columns:minmax(0,1fr); } }
.bf-cart-cross{ margin-top:clamp(36px,6vh,64px); clear:both; }
.bf-cart-cross h2{ font:600 1.25rem/1.3 var(--f-disp); margin:0 0 18px; }
/* minmax(0,1fr) — bare 1fr tracks expand to the cards' min-content
   (unbreakable long titles). Cards get min-width:0 for the same reason.
   The rail is a fixed 4-track row: cards keep quarter width even when
   fewer than four qualify; ≤1100 falls to 2 tracks, ≤640 single column. */
.bf-cross-grid{ display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); gap:20px; }
.bf-cross-grid .p-card{ width:auto; flex:initial; min-width:0; }
@media (max-width:1100px){
  .bf-cross-grid{ grid-template-columns:repeat(2, minmax(0,1fr)); }
}
@media (max-width:640px){
  .bf-cross-grid{ grid-template-columns:minmax(0,1fr); }
}

@media (max-width:640px){
  .bf-drawer-panel{ width:100vw; border-left:none; }
}

/* current item state gets the aria-current underline */
.main-nav .current-menu-item > a,
.main-nav .current_page_item > a{ color:var(--txt); }
.main-nav .current-menu-item > a::after,
.main-nav .current_page_item > a::after{ transform:scaleX(1); }
.main-nav .current-menu-ancestor > a{ color:var(--txt); }

/* ---------- mobile nav — quiet single-column list ----------
   Replaces the earlier giant centered overlay: rows align left under the
   header with hairline separators and a moderate type scale (SIGNAL FIELD
   tokens only). One accordion level — mega group labels (bf-mega-label)
   render as small section headers and their link column is revealed
   together with the parent row, instead of nesting a third tap level. */
@media (max-width:900px){
  .m-nav{
    display:block; overflow-y:auto; overscroll-behavior:contain;
    padding:calc(var(--head-h) + 18px) clamp(22px, 6vw, 44px) 56px;
  }
  .m-nav nav{
    display:grid; gap:0; text-align:left;
    max-width:520px; margin-inline:auto;
  }
  .m-nav nav ul{ list-style:none; margin:0; padding:0; }
  .m-nav nav > ul > li{ border-bottom:1px solid var(--line); }
  .m-nav nav > ul > li:last-child{ border-bottom:0; }
  .m-nav nav > ul > li > a{
    display:flex; align-items:center; justify-content:space-between; gap:14px;
    font:600 1.28rem/1.2 var(--f-disp); letter-spacing:.01em; color:var(--txt);
    padding:17px 2px;
  }
  /* one quiet chevron per expandable row */
  .m-nav .menu-item-has-children > a::after{
    content:""; width:8px; height:8px; flex:0 0 auto; margin-left:auto;
    border-right:1.6px solid var(--mut); border-bottom:1.6px solid var(--mut);
    transform:rotate(45deg); transition:transform .3s var(--ease);
  }
  .m-nav .menu-item-has-children.open > a::after{
    transform:rotate(225deg); border-color:var(--acc);
  }
  /* submenu: slide reveal — JS sets an exact max-height while opening so the
     animation has no dead travel and closes as snappy as it opens */
  .m-nav .sub-menu{
    display:grid; gap:0;
    max-height:0; overflow:hidden; opacity:0;
    transition:max-height .38s var(--ease), opacity .3s var(--ease);
  }
  .m-nav .menu-item-has-children.open > .sub-menu{ max-height:640px; opacity:1; }
  .m-nav .sub-menu a{
    display:block; font:500 1rem/1.4 var(--f-body); color:var(--mut);
    padding:10px 2px;
  }
  .m-nav .sub-menu > li:last-child > a{ padding-bottom:14px; }
  /* every top-level panel ends 33px above the next hairline — the same
     breathing room as its opening (17px row padding + 16px label padding) */
  .m-nav nav > ul > li > .sub-menu{ padding-bottom:19px; }
  /* mega group labels are headers, not rows: not tappable (their '#' link is
     inert) and their column shows whenever the parent panel is open.
     The label may render as a <span class="bf-mega-label-txt"> (the walker
     swaps the seeded '#' link for it), so these rules key on the span as
     well as `> a` — keyed on `> a` alone the span fell through to plain
     16px text and read as just another row. Same accent-uppercase-dash
     header language as the desktop band. */
  .m-nav .bf-mega-label > a,
  .m-nav .bf-mega-label > span{
    display:block; font:600 calc(.68rem + 1px)/1 var(--f-disp); letter-spacing:.22em; text-transform:uppercase;
    color:var(--acc); pointer-events:none; padding:16px 2px 5px;
  }
  .m-nav .bf-mega-label > a::before,
  .m-nav .bf-mega-label > span::before{
    content:""; display:inline-block; width:12px; height:1px;
    background:var(--acc); margin-right:8px; vertical-align:3px;
  }
  .m-nav .bf-mega-label > a::after,
  .m-nav .bf-mega-label > span::after{ display:none; }
  .m-nav .bf-mega-label > .sub-menu{ max-height:none; opacity:1; overflow:visible; }
  .m-nav .bf-mega-label > .sub-menu a{ padding:9px 2px; }
}

/* ---------- footer menu columns + legal row ---------- */
.foot-col ul{ list-style:none; margin:0; padding:0; display:grid; gap:12px; }
.foot-legal{ display:inline-flex; align-items:center; gap:16px; flex-wrap:wrap; }
.foot-legal ul{ list-style:none; margin:0; padding:0; display:flex; gap:16px; flex-wrap:wrap; }
.foot-legal a{ color:var(--mut); text-decoration:none; transition:color .3s; display:inline-block; padding:4px 0; } /* touch target ≥24px */
.foot-legal a:hover{ color:var(--acc); }

/* ---------- subscription notice pill (blafili-subscribers plugin) ---------- */
/* Absolute in the document: below the breadcrumb, above the page title —
   scrolls away with the page instead of floating over content. */
.bf-subs-notice{
  position:absolute; left:0; right:0; margin-inline:auto; width:fit-content;
  top:calc(var(--head-h) + 96px); z-index:20;
  background:rgb(10 14 19 / .96); border:1px solid var(--acc-glow); color:var(--txt);
  padding:14px 24px 14px 20px; border-radius:18px;
  font:600 .9rem/1.5 var(--f-body);
  box-shadow:0 20px 50px -20px rgb(0 0 0 / .6);
  max-width:min(92vw, 520px); text-align:center;
  animation:bfNoticeIn .7s var(--ease-out) .15s both;
}
.bf-subs-notice::before{
  content:""; display:inline-block; width:7px; height:7px; border-radius:50%;
  background:var(--acc); margin-right:10px; vertical-align:1px;
  box-shadow:0 0 10px var(--acc-glow);
}
[data-theme="light"] .bf-subs-notice{
  background:rgb(255 255 255 / .97); border-color:var(--line2); color:var(--txt);
  box-shadow:0 20px 50px -24px rgb(20 35 55 / .45);
}
@keyframes bfNoticeIn{
  from{ opacity:0; transform:translateY(-18px); }
  to{ opacity:1; transform:translateY(0); }
}
/* mobile + iPad: keep the box centered like desktop (right-align request
   was about the header tool buttons — see .head-tools below) */
@media (max-width:640px){
  .bf-subs-notice{
    top:calc(var(--head-h) + 96px);
    max-width:min(92vw, 420px); padding:10px 14px;
    font-size:.8rem; line-height:1.5; text-wrap:balance;
  }
}
/* landing page CTA row centers on small screens */
@media (max-width:640px){
  .bf-landing-cta{ text-align:center; }
}

/* ---------- archive pagination ----------
   Canonical merged block (formerly duplicated in two sections of this
   file; computed cascade preserved). The 46px round + SVG-arrow override
   lives in the misc additions section near the bottom. */
.bf-pagination{
  display:flex; align-items:center; justify-content:center; gap:8px; flex-wrap:wrap;
  margin-top:clamp(30px,5vh,50px); margin-bottom:clamp(44px,7vh,72px);
}
.bf-pagination .page-numbers{
  display:inline-flex; align-items:center; justify-content:center; min-width:42px; height:42px; padding:0 12px;
  border:1px solid var(--line); border-radius:999px; text-decoration:none;
  font:600 .9rem/1 var(--f-disp); color:var(--mut);
  transition:border-color .3s, color .3s, background .3s;
}
.bf-pagination .page-numbers:hover{ color:var(--acc); border-color:var(--acc); }
.bf-pagination .page-numbers.current{
  color:#04121a; background:var(--acc); border-color:var(--acc); /* white text on the bright cyan accent would be 1.55:1 */
}
[data-theme="light"] .bf-pagination .page-numbers.current{ color:#fff; }
.bf-pagination .page-numbers.dots{ border-color:transparent; }

/* ---------- WP core content alignment inside .post-body / .entry-content ---------- */
.entry-content > *{ min-width:0; }
.entry-content img{ max-width:100%; height:auto; }
.alignleft{ float:left; margin:.4em 1.6em 1em 0; }
.alignright{ float:right; margin:.4em 0 1em 1.6em; }
.aligncenter{ margin-inline:auto; }
.alignwide{ width:min(1100px, 100%); margin-inline:auto; }
.alignfull{ width:100vw; margin-inline:calc(50% - 50vw); max-width:100vw; }
.wp-caption{ max-width:100%; }
.wp-caption-text{ font-size:.78rem; color:var(--mut); padding-top:8px; }
.wp-block-table table{ width:100%; border-collapse:collapse; }
.screen-reader-text{
  position:absolute; width:1px; height:1px; overflow:hidden;
  clip:rect(0 0 0 0); clip-path:inset(50%);
}
/* keep long words/URLs from breaking the grid */
.entry-content{ overflow-wrap:break-word; }

/* ---------- searchform ---------- */
.bf-searchform{ display:flex; gap:8px; max-width:560px; }
.bf-searchform input[type="search"]{
  flex:1; min-width:0; background:var(--panel); border:1px solid var(--line2); border-radius:999px;
  color:var(--txt); padding:14px 20px; font:500 .92rem var(--f-body);
  transition:border-color .3s, box-shadow .3s; appearance:none;
}
.bf-searchform input[type="search"]::placeholder{ color:var(--mut); }
.bf-searchform input[type="search"]:focus{ outline:none; border-color:var(--acc); box-shadow:0 0 0 4px var(--acc-soft); }
.bf-searchform button{
  background:var(--acc); color:#04121a; border-radius:999px; padding:14px 24px;
  font:600 .9rem/1 var(--f-disp); transition:filter .3s;
}
.bf-searchform button:hover{ filter:brightness(1.08); }
[data-theme="light"] .bf-searchform input[type="search"]{ background:#fff; }
[data-theme="light"] .bf-searchform button{ color:#fff; }

/* ---------- header tool buttons on mobile/iPad ----------
   main-nav is hidden ≤900px, which removes its auto margin — without this
   the three round buttons hug the logo instead of the right edge. */
@media (max-width:900px){
  .head-tools{ margin-left:auto; }
}

@media (prefers-reduced-motion:reduce){
  .main-nav .sub-menu{ transition:none; }
  .m-nav .sub-menu{ transition:none; }
}

/* ---------- hero breakpoint tuning ----------
   (R8: the hero is a full-bleed background carousel now — no inner grid to
   re-column; the old two-column tuning rules are retired.) */

/* ============================================================
   WooCommerce surfaces + PDP/Category extensions
   Everything below reuses SIGNAL FIELD tokens only.
   ============================================================ */

/* ---------- quantity stepper: real input hidden, visual display kept ---------- */
.bf-qty-input{ position:absolute; width:1px; height:1px; opacity:0; pointer-events:none; }
.p-cart-form{ display:inline-flex; margin:0; }
a.chip, a.r-sort{ text-decoration:none; }
span.chip.is-on{ border-color:var(--acc); background:var(--acc-soft); color:var(--acc); }

/* ---------- PDP: review form (Woo native, collapsed in an accordion) ---------- */
.bf-review-toggle summary{ list-style:none; }
.bf-review-form{ padding-top:14px; }
.bf-review-form #comments,
.bf-review-form #reviews{ display:none; }
.bf-review-form .comment-reply-title{ display:block; margin:0 0 12px; font:600 1.05rem/1.3 var(--f-disp); }
.bf-review-form .comment-form{ margin:0; }
.bf-review-form .comment-form p{ margin:0 0 14px; }
.bf-review-form label{ display:block; margin:0 0 6px; color:var(--mut); font-size:.84rem; }
/* review-form inputs share the site-wide input skin (checkout reference).
   Woo ships its rating-star styling in the dropped stylesheet, so the
   anchors render as raw "1 of 5 stars" text without this — re-create the
   star row: text hidden, ::before draws the glyph, hover/active fill gold. */
.bf-review-form .comment-form input:not([type="submit"]):not([type="checkbox"]):not([type="radio"]),
.bf-review-form .comment-form textarea{
  width:100%; background:var(--panel); border:1px solid var(--line2); border-radius:var(--r-md, 16px);
  color:var(--txt); padding:12px 14px; font:400 .95rem/1.4 var(--f-body); transition:border-color .3s;
}
.bf-review-form .comment-form input:not([type="submit"]):not([type="checkbox"]):not([type="radio"]):focus,
.bf-review-form .comment-form textarea:focus{ outline:none; border-color:var(--acc); }
.bf-review-form .comment-form textarea{ min-height:150px; resize:vertical; }
.bf-review-form .comment-form-rating .stars{ display:inline-flex; gap:4px; }
.bf-review-form .comment-form-rating .stars span{ display:inline-flex; gap:4px; }
.bf-review-form .comment-form-rating .stars a{
  position:relative; display:block; width:1.25em; height:1.25em; overflow:hidden;
  text-indent:-999em; font-size:1.3rem; text-decoration:none;
}
.bf-review-form .comment-form-rating .stars a::before{
  content:"★"; position:absolute; top:0; left:0; width:1.25em; height:1.25em;
  display:block; text-indent:0; line-height:1.25; color:var(--mut);
}
/* cumulative fill — every star defaults gold; stars AFTER the selected
   (Woo only marks the clicked one .active) or after the hovered one go gray.
   While hovering, the selected grays are lifted (the hover point takes over)
   and stars after the HOVERED one go gray — the two rules share specificity,
   so the lift must be declared before the hover-after gray. */
.bf-review-form .comment-form-rating .stars a::before{ color:var(--gold); }
.bf-review-form .comment-form-rating .stars a.active ~ a::before{ color:var(--mut); }
.bf-review-form .comment-form-rating .stars:hover a.active ~ a::before{ color:var(--gold); }
.bf-review-form .comment-form-rating .stars:hover a:hover ~ a::before{ color:var(--mut); }

/* ---------- cart / checkout / my-account: Woo native surfaces ---------- */
.woocommerce{ color:var(--txt); }
.woocommerce:after{ content:""; display:block; clear:both; }
.woocommerce form .form-row{ display:block; margin:0 0 16px; }
.woocommerce form .form-row label{ display:block; margin:0 0 6px; color:var(--mut); font-size:.84rem; }
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.select2-container--default .select2-selection--single{
  width:100%; background:var(--panel); border:1px solid var(--line2); border-radius:var(--r-md, 16px);
  color:var(--txt); padding:12px 14px; font:400 .95rem/1.4 var(--f-body); transition:border-color .3s;
}
/* select2 core pins .select2-selection--single{height:28px}; our 24px
   of vertical padding left the rendered text overflowing the closed box by
   ~4px, clipped by overflow:hidden. Declare height on our higher-specificity
   rule so the closed select matches the text inputs' natural height. */
.select2-container--default .select2-selection--single{ height:auto; min-height:46px; }
.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus{ outline:none; border-color:var(--acc); }
/* unified input surface — every Woo text-ish control gets the
   checkout skin even where Woo renders no .form-row wrapper (cart coupon
   field, review form, my-account screens). Select2's dropdown search keeps
   its own compact style; checkboxes/radios/submits are out of scope. */
.woocommerce input[type="text"]:not(.select2-search__field),
.woocommerce input[type="email"],
.woocommerce input[type="tel"],
.woocommerce input[type="url"],
.woocommerce input[type="password"],
.woocommerce input[type="number"]:not(.bf-qty-input),
.woocommerce textarea,
.woocommerce select{
  width:100%; background:var(--panel); border:1px solid var(--line2); border-radius:var(--r-md, 16px);
  color:var(--txt); padding:12px 14px; font:400 .95rem/1.4 var(--f-body); transition:border-color .3s;
}
.woocommerce input[type="text"]:not(.select2-search__field):focus,
.woocommerce input[type="email"]:focus,
.woocommerce input[type="tel"]:focus,
.woocommerce input[type="url"]:focus,
.woocommerce input[type="password"]:focus,
.woocommerce input[type="number"]:not(.bf-qty-input):focus,
.woocommerce textarea:focus,
.woocommerce select:focus{ outline:none; border-color:var(--acc); }
.select2-container--default .select2-selection--single .select2-selection__rendered{ color:var(--txt); line-height:1.4; padding:0; }
.select2-container--default .select2-selection--single .select2-selection__arrow b{ border-color:var(--mut) transparent transparent transparent; }
.select2-dropdown{ background:var(--panel); border:1px solid var(--line2); border-radius:var(--r-md, 16px); }
.select2-container--default .select2-results__option--highlighted[aria-selected]{ background:var(--acc-soft); color:var(--acc); }
.select2-container--default .select2-results__option[aria-selected=true]{ color:var(--acc); }
.select2-search__field{ background:var(--bg1); color:var(--txt); border:1px solid var(--line2) !important; border-radius:8px; }

/* Woo buttons
   dark ink on the BRIGHT dark-theme accent (white text would be 1.56:1);
   the light theme re-overrides to white on its deepened accent
   (theme-light.css). Same contrast treatment as every site-wide CTA. */
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce #respond input#submit{
  display:inline-flex; align-items:center; gap:8px; cursor:pointer;
  background:var(--acc); color:#04121a; border:1px solid var(--acc); border-radius:999px;
  padding:12px 22px; font:600 .92rem/1 var(--f-body); letter-spacing:.02em; text-decoration:none;
  transition:filter .3s, transform .3s;
}
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce #respond input#submit:hover{ filter:brightness(1.12); }
.woocommerce a.button:disabled,
.woocommerce button.button:disabled,
.woocommerce button.button:disabled[disabled]{ opacity:.5; cursor:not-allowed; }
.woocommerce .woocommerce-form-login .button{ background:transparent; color:var(--txt); border-color:var(--line2); }
.woocommerce .woocommerce-form-login .button:hover{ border-color:var(--acc); color:var(--acc); }

/* notices → signal chips */
.woocommerce-message,
.woocommerce-info,
.woocommerce-error{
  background:var(--panel); border:1px solid var(--line2); border-left:3px solid var(--acc);
  border-radius:var(--r-md, 16px); color:var(--txt); padding:14px 18px; margin:0 0 20px; list-style:none;
  font-size:.9rem;
}
.woocommerce-error{ border-left-color:#f87171; }
.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before{ display:none; }
.woocommerce-message .button,
.woocommerce-info .button,
.woocommerce-error .button{ float:right; margin-top:-6px; }

/* Woo 10+ surfaces coupon errors INLINE — span.coupon-error-notice +
   input.has-error under the coupon field — instead of .woocommerce-error
   notices. We dropped Woo's stylesheets, so the affordance had no styling
   at all and read as zero feedback. Give it theme tokens. */
/* the bare class (0,1,0) lost to style.css `.post-body p` (0,1,1) — cart
   pages render inside .post-body, so the error text came out muted gray.
   Bump specificity (element + class) to win for good. */
.woocommerce p.coupon-error-notice{ display:block; margin:8px 2px 0; color:#f87171; font:500 .84rem/1.5 var(--f-body); }
#coupon_code.has-error{ border-color:#f87171 !important; }

/* cart actions restack. Making the colspan td itself display:grid takes the
   cell OUT of the table formatting context — the colspan collapses and
   auto-layout inflated the remove column to 246px while the table (873px
   min-content) overflowed the 717px grid column under the totals card. Keep
   the td a table-cell; stack INSIDE it in normal block flow instead: coupon
   row, then the Update button floated right, error notice full-width. */
.woocommerce-cart table.shop_table td.actions{ padding:18px 16px 20px; }
.woocommerce-cart table.shop_table td.actions::after{ content:""; display:table; clear:both; }
.woocommerce-cart table.shop_table td.actions .coupon{ display:flex; gap:8px; align-items:center; margin:0; flex-wrap:wrap; }
.woocommerce-cart table.shop_table td.actions .coupon .input-text{ flex:1 1 240px; min-width:0; width:auto; }
.woocommerce-cart table.shop_table td.actions .coupon-error-notice{ flex-basis:100%; width:100%; margin:0; }
.woocommerce-cart table.shop_table td.actions .button[name="update_cart"]{ float:right; margin:14px 0 0; }
.woocommerce-cart table.shop_table .product-name{ min-width:220px; }
.woocommerce-cart table.shop_table .product-name a{ overflow-wrap:anywhere; }
/* the two-column grid gives the form ~717px — let a squeezed table scroll
   inside its column instead of bleeding under the totals card.
   The 640px floor is desktop-only. At ≤900 the block-card layout must fit
   its container — the floor was forcing a 640px table into a 390px phone,
   pushing every td VALUE off-screen behind a horizontal scroll (labels
   visible, values not). Desktop columns fit 717px on their own, so ≥901
   keeps the floor purely as a safety net. */
.woocommerce-cart-form{ overflow-x:auto; }
@media (min-width:901px){
  .woocommerce-cart-form table.shop_table{ min-width:640px; }
}
/* ≥641px the coupon input, Apply coupon and Update cart share ONE baseline
   as a form footer bar (Update floats right; 4px top nudges the 40px button
   onto the 47px input's center line). The coupon float gets a DEFINITE
   width — shrink-to-fit on a float whose children are flex items
   mis-measures max-content (measured 375px vs the real 463px, wrapping
   Apply) — and the input absorbs the slack via flex-grow.
   The stacked float layout above stays as the ≤640px (block-table) layout. */
@media (min-width:641px){
  .woocommerce-cart table.shop_table td.actions .coupon{ float:left; width:min(500px,100%); }
  .woocommerce-cart table.shop_table td.actions .coupon .input-text{ flex:1 1 280px; }
  .woocommerce-cart table.shop_table td.actions .button[name="update_cart"]{ float:right; margin:4px 0 0; }
}
/* three article-context leaks made the cart read as a blog post, not a
   checkout surface:
   1. `.entry-content table` handed both cart tables margin:18px 0, so the
      cart table sat 18px below the totals column's top edge;
   2. `.post-body h2` gave "Cart totals" a 34px collapsed top margin and a
      1.55rem article scale, floating detached above its card;
   3. table auto-layout collapsed the thumbnail column to 55px while
      `img{max-width:100%}` squeezed the real product photo to a 23px icon
      that reads as a broken placeholder. */
.woocommerce-cart table.shop_table{ margin:0; }
.woocommerce-cart table.shop_table td.product-thumbnail img{
  width:56px; min-width:56px; height:56px; object-fit:cover;
}
/* Column hints are desktop-only (≥901 = native table layout). Below 901 the
   block-card layout sizes its own cells — these hints squeezed the
   quantity row and clipped the stepper's "+" button on phones. */
@media (min-width:901px){
  .woocommerce-cart table.shop_table td.product-thumbnail{ width:88px; }
  /* Quantity column hint: auto layout gave it 164px against a 131px stepper
     while the fixed hints summed to 727px > the 717px grid column, so the
     table overflowed its scroll container by 10px and showed a scrollbar.
     150px hint + 8px inline padding (the 131px control needs 147 with
     borders) lets the whole table fit its column again. */
  .woocommerce-cart table.shop_table th.product-quantity,
  .woocommerce-cart table.shop_table td.product-quantity{ width:150px; padding-inline:8px; }
}

/* cart table */
.woocommerce table.shop_table{
  width:100%; background:var(--panel); border:1px solid var(--line); border-collapse:collapse;
  border-radius:var(--r-lg, 26px); overflow:hidden;
}
.woocommerce table.shop_table th{ text-align:left; padding:14px 16px; color:var(--mut); font:600 .78rem/1 var(--f-body); text-transform:uppercase; letter-spacing:.12em; }
.woocommerce table.shop_table td{ padding:16px; border-top:1px solid var(--line); vertical-align:middle; font-size:.92rem; }
.woocommerce table.shop_table img{ width:64px; height:auto; border-radius:12px; background:#fff; }
.woocommerce table.shop_table .product-remove a{ color:var(--mut); font-size:1.2rem; text-decoration:none; }
.woocommerce table.shop_table .product-remove a:hover{ color:#f87171; }
.woocommerce table.shop_table td.product-price del,
.woocommerce table.shop_table td.product-subtotal del{ color:var(--mut); opacity:.7; }
.woocommerce-Price-amount{ font-variant-numeric:tabular-nums; }

/* cart totals + checkout grid */
.woocommerce .cart-collaterals .cart_totals,
.woocommerce-page .cart-collaterals .cart_totals{ width:46%; float:right; }
/* the right column becomes ONE clean card — the panel sits on
   .cart_totals so title, totals table and the checkout button share it
   (previously only the inner table was a card and the h2 floated above it).
   Inner table flattens to rows; the card top aligns with the cart table now
   that the 18px article-table margin is gone. Scoped to the cart page —
   checkout's #order_review has its own card. */
.woocommerce-cart .cart_totals{
  background:var(--panel); border:1px solid var(--line);
  border-radius:var(--r-lg, 26px); padding:20px 24px 24px;
}
.woocommerce-cart .cart_totals h2{
  margin:0 0 14px; font:700 .82rem/1 var(--f-body);
  letter-spacing:.14em; text-transform:uppercase;
}
.woocommerce-cart .cart_totals table.shop_table{ background:transparent; border:0; border-radius:0; }
.woocommerce-cart .cart_totals table.shop_table tr:first-child th,
.woocommerce-cart .cart_totals table.shop_table tr:first-child td{ border-top:0; }
.woocommerce-cart .cart_totals .shipping ul{ list-style:none; margin:0; padding:0; }
.woocommerce-cart .cart_totals .wc-proceed-to-checkout{ margin:16px 0 0; padding:0; }
/* the PayPal express buttons render INSIDE this container — the plugin
   hooks woocommerce_proceed_to_checkout (its button_wrapper div lands
   right after the link). Stack the two CTAs full-width with a real gap:
   previously a shrink-to-fit pill sat glued on top of the 100%-wide
   PayPal iframe. */
.woocommerce-cart .wc-proceed-to-checkout{ display:flex; flex-direction:column; gap:12px; }
.woocommerce-cart .wc-proceed-to-checkout .checkout-button{ width:100%; justify-content:center; }
.woocommerce-cart .wc-proceed-to-checkout .ppc-button-wrapper{ margin:0; }

/* express buttons under the PDP buy form (dedicated hook). The plugin
   stylesheet keeps line-height:0 and the per-funding-source gaps; we only
   seat the block in the buy column. */
.pd-info .ppc-button-wrapper{ margin-top:14px; }
.pd-info .ppcp-messages{ margin-top:10px; }

/* on every common desktop viewport the only Proceed-to-checkout button
   (inside cart_totals, below the full-width table) rendered below the fold.
   Woo's classic side-by-side cart (form 57% / totals 40%) therefore returns
   only at ≥1280px.
   The sticky must never float over the cross-sell rail: the grid gives
   every child an EXPLICIT row (auto-placement pushed the banner below the
   form row), the collaterals box stretches to the row height, and the
   sticky element is its CHILD (.cart_totals) — plain sticky-in-a-div,
   hard-bounded by that box: the card rides along and stops at the form
   row's bottom edge, exactly like the left column. Without :has() the
   float fallback has no sticky at all (no overlap possible).
   A lower cut left the sub-1280 band two-column with a squeezed left track
   — at 1220 the 711px table sat in a 631px container (80px inner scroll),
   and 145px overflow at the old lower edge. Moving the cut to 1280px
   stacks the form full-width below that (table fits: container ≥963px at
   1024+), and the 1280~1439 band gets its own safety-net rules in the
   media block right after this one. */
@media (min-width:1280px){
  .woocommerce-cart .woocommerce-cart-form{ float:left; width:57%; min-width:0; }
  .woocommerce-cart .cart-collaterals{ float:right; width:40%; }
  .woocommerce-cart .cart-collaterals .cart_totals{ float:none; width:100%; }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form){
    display:grid;
    grid-template-columns:minmax(0,1.55fr) minmax(0,1fr);
    column-gap:clamp(28px,4vw,56px);
    align-items:start;
  }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > *{ grid-column:1 / -1; min-width:0; }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .woocommerce-notices-wrapper{ grid-row:1; }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .bf-cart-free{ grid-row:2; }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .woocommerce-cart-form{
    grid-column:1; grid-row:3; float:none; width:auto;
  }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .cart-collaterals{
    grid-column:2; grid-row:3; float:none; width:auto; align-self:stretch;
  }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .cart-collaterals .cart_totals{
    position:sticky; top:calc(var(--head-h) + 16px);
  }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .bf-cart-trust{ grid-row:4; }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .bf-cart-cross{ grid-row:5; }
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form) > .bf-cart-cta2{ grid-row:6; }
}

/* 1280~1439 narrow-desktop band: the two-column grid's left track is
   tightest at its lower edge. Measured table min-content ≈711px (thumb 88 +
   quantity 150 + name floor 220 + price/subtotal/remove); left track ≈
   (viewport − wrap padding − gap) × 1.55/2.55 lands at ~700px around 1280 —
   no margin, and real-browser probes ran up to ~45px short in this band.
   Three scoped, reversible compressions close the gap without touching
   checkout, the mobile block-card rules, or the explicit-row grid semantics:
   - grid ratio 1.75fr/1fr: left ≈ +24px at 1280 (totals card still ~419px);
   - thumbnail hint 88→64 WITH padding-inline 4: the cart thumb img is
     56px-fixed, so 64 = 56 img + 8 padding — the hint alone would be a
     no-op against the 88px floor set by img+16px td padding;
   - name floor 220→200: names already wrap (overflow-wrap:anywhere);
     one extra wrap at most, scoped to this band.
   Net: table min ≈ 667px vs left track ≥ 695px at 1280 under the worst
   probe model (≈734px by pure CSS math) — no inner scroll 1280~1439. */
@media (min-width:1280px) and (max-width:1439px){
  .woocommerce-cart .woocommerce:has(> .woocommerce-cart-form){
    grid-template-columns:minmax(0,1.75fr) minmax(0,1fr);
  }
  .woocommerce-cart table.shop_table td.product-thumbnail{ width:64px; padding-inline:4px; }
  .woocommerce-cart table.shop_table .product-name{ min-width:200px; }
}

/* page.php caps EVERY static page's content at 820px with an inline
   style — the checkout two-column grid and the cart page must have the full
   wrap (431px billing column + 289px order card was the old breakage). An
   inline style can only be beaten by an !important rule, hence the flag,
   scoped to the two Woo surfaces only. */
.woocommerce-checkout .post-body.entry-content{ max-width:1280px !important; margin-inline:auto; }
/* 1180 → 1280 and a wider form track — product names stopped wrapping to
   three lines at 630px. Explicit grid rows untouched. */
.woocommerce-cart .post-body.entry-content{ max-width:1280px !important; margin-inline:auto; }

/* page.php inlines the flat hero's paddings on every static page —
   tighten the checkout page's hero→form gap (measured 92px) via the same
   !important override mechanism as the width caps above. */
.woocommerce-checkout .page-hero--flat{ padding-bottom:clamp(10px,2vh,20px) !important; }

/* repeated checkout CTA after the cross-sell rail (label identical to the
   native button; the original sits in the sticky totals card). Bottom
   margin keeps the page from ending flush against the footer. */
.bf-cart-cta2{ clear:both; display:flex; justify-content:center; margin-top:clamp(28px,5vh,44px); margin-bottom:clamp(48px,8vh,88px); }
.bf-cart-cta2 .cta-btn{ min-width:min(320px,100%); justify-content:center; }

/* native 13×13 terms checkbox → 24px custom control (same touch-target
   family as the other custom controls; the label stays clickable around it). */
form.woocommerce-checkout input[name="terms"],
#add_payment_method input[name="terms"]{
  appearance:none; -webkit-appearance:none;
  width:24px; height:24px; flex:none; margin:0 10px 0 0;
  border:1.5px solid var(--line2); border-radius:8px; background:var(--panel);
  vertical-align:middle; position:relative; cursor:pointer;
  transition:border-color .3s, background .3s;
}
form.woocommerce-checkout input[name="terms"]:hover,
#add_payment_method input[name="terms"]:hover{ border-color:var(--acc); }
form.woocommerce-checkout input[name="terms"]:checked,
#add_payment_method input[name="terms"]:checked{ background:var(--acc); border-color:var(--acc); }
form.woocommerce-checkout input[name="terms"]:checked::after,
#add_payment_method input[name="terms"]:checked::after{
  content:""; position:absolute; left:7px; top:3px; width:6px; height:11px;
  border:solid #fff; border-width:0 2.5px 2.5px 0; transform:rotate(45deg);
}
form.woocommerce-checkout input[name="terms"]:focus-visible,
#add_payment_method input[name="terms"]:focus-visible{ outline:2px solid var(--acc); outline-offset:2px; }

/* the classic checkout form's direct children are #customer_details
   (col2-set with .col-1 billing / .col-2 shipping), #order_review_heading and
   #order_review. Two columns ≥901px (~58% / ~42%). The form column spans
   both rows so the order card's grid area is taller than the card itself —
   that headroom is what lets position:sticky actually travel beside the
   long billing form. ≤900px falls back to plain block flow (DOM order:
   form → heading → order card). */
.woocommerce-checkout form.checkout #order_review{
  background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg, 26px);
  padding:clamp(18px,3vw,30px);
}
/* the order-review shipping row renders Woo's options <ul> with a disc
   bullet ("• Free shipping") — the same list leak cleaned on the cart card.
   Flatten it to plain rows inside the checkout card. */
.woocommerce-checkout #order_review .shipping ul,
.woocommerce-checkout #order_review .shipping li{
  list-style:none; margin:0; padding:0;
}
.woocommerce-checkout form.checkout #order_review_heading{ margin:0 0 6px; }
/* Woo 11 renders the heading as a bare <h3
   id="order_review_heading"> SIBLING of #order_review (no inner element), so
   the earlier display:contents idea produced an anonymous empty box. The
   checkout inline script now moves the H3 into the card's top and tags the
   form with .js-merged; that switches the grid to ONE row (billing | order
   card, card top flush with the billing column top — the 144px phantom row
   gap is gone). Without JS the two-row fallback keeps the H3 bottom-aligned
   directly above the card. */
@media (min-width:901px){
  .woocommerce-checkout form.checkout{
    display:grid;
    grid-template-columns:minmax(0,1.38fr) minmax(0,1fr);
    gap:12px clamp(28px,4vw,56px);
    align-items:start;
  }
  .woocommerce-checkout form.checkout #customer_details{ grid-column:1; grid-row:1 / span 2; min-width:0; }
  .woocommerce-checkout form.checkout #customer_details h3{ margin-top:0; }
  .woocommerce-checkout form.checkout #order_review_heading{ grid-column:2; grid-row:1; align-self:end; margin:0; }
  .woocommerce-checkout form.checkout #order_review{
    grid-column:2; grid-row:2; align-self:start; min-width:0;
    position:sticky; top:calc(var(--head-h) + 16px);
  }
  .woocommerce-checkout form.checkout #order_review .shop_table:first-child{ margin-top:0; }
  /* JS merged the heading into the card: single-row grid */
  .woocommerce-checkout form.checkout.js-merged #customer_details{ grid-row:1; }
  .woocommerce-checkout form.checkout.js-merged #order_review{ grid-row:1; }
  .woocommerce-checkout form.checkout.js-merged #order_review > h3{ margin:0; }
  /* express checkout (WooPay + wallet buttons) sits above Contact
     information: site.js moves the wrapper inside the billing column when
     JS runs; these explicit grid rows are the no-JS fallback, where the
     short heading row keeps the wrapper gap-free above billing. */
  .woocommerce-checkout form.checkout .wcpay-express-checkout-wrapper{
    grid-column:1; grid-row:1; align-self:start; min-width:0;
  }
  .woocommerce-checkout form.checkout #customer_details{ grid-row:2 / span 2; }
}
/* 901~1100 narrow-desktop band — the base 1.38fr/1fr split left the order
   card at 362~392px. 1fr vs minmax(420px,1fr) holds the card ≥420px across
   the whole band (billing track floor ≈391px at 901 — its inputs are fluid
   full-width). ≥1101 keeps the base ratio untouched. */
@media (min-width:901px) and (max-width:1100px){
  .woocommerce-checkout form.checkout{ grid-template-columns:minmax(0,1fr) minmax(420px,1fr); }
}

/* checkout keeps brand chrome minimal — logo (+ secure tag) and the cart
   button stay; site navigation surfaces come off. CSS-only hiding (the
   elements remain in the DOM and every engine binding is delegated or
   null-guarded, so nothing breaks). The hamburger is hidden too: the mobile
   menu it opens is a pure navigation surface with nowhere to go on checkout
   (the logo links home, the cart button opens the drawer). Cart keeps the
   full header — scoped to body.woocommerce-checkout only. .head-inner keeps
   its fixed var(--head-h) height, so the sticky offsets
   (top:calc(var(--head-h) + 16px)) are unaffected. */
.woocommerce-checkout .site-head .main-nav,
.woocommerce-checkout .site-head .tuner,
.woocommerce-checkout .site-head #themeToggle,
.woocommerce-checkout .site-head #navSearchBtn,
.woocommerce-checkout .site-head #menuBtn,
.woocommerce-checkout .m-nav{ display:none; }
.secure-tag{
  display:inline-flex; align-items:center; gap:8px;
  font:600 .72rem/1 var(--f-disp); letter-spacing:.18em; text-transform:uppercase;
  color:var(--mut); white-space:nowrap;
}
.secure-tag svg{ width:14px; height:14px; flex:none; }
/* .main-nav carried margin-inline:auto; the tag takes over the centering */
.woocommerce-checkout .head-inner .secure-tag{ margin-inline:auto; }
/* checkout-only logo sizing: on phones the header grid can hand the brand a
   track narrower than the mark, and the global img{max-width:100%} then
   squashes the fixed-height logo into a wrong ratio. Lock the checkout logo
   to its intrinsic ratio at a compact size — other pages keep 34px. */
.woocommerce-checkout .site-head .brand{ flex:0 0 auto; }
.woocommerce-checkout .site-head .brand-logo{ height:30px; width:auto; max-width:none; }

/* reCAPTCHA v3: the script loads only on subscribe-form engagement and the
   corner badge stays hidden — the branding disclosure line sits beside each
   subscribe form instead. */
.grecaptcha-badge{ visibility:hidden !important; }
.bf-recap-note{ margin:6px 0 0; font:400 .7rem/1.4 var(--f-body); letter-spacing:.02em; color:var(--mut); }

.woocommerce-checkout #payment{ background:var(--bg2); border-radius:var(--r-md, 16px); }
.woocommerce-checkout #payment ul.payment_methods{ list-style:none; margin:0; padding:16px 24px; border-bottom:1px solid var(--line); }
.woocommerce-checkout #payment ul.payment_methods li{ padding:10px 0; }
/* de-nest (all widths): the method description / card-form wrapper renders as
   plain content on the gray zone — no inner white box; the card-form fieldset
   loses its UA border and its inline 7px padding. Side padding aligns the
   expanded content with the order card's 30px inner rhythm. */
.woocommerce-checkout #payment div.payment_box{
  background:transparent; border:0; border-radius:0;
  color:var(--mut); font-size:.86rem; margin:6px 0 2px; padding:2px 6px 6px;
}
.woocommerce-checkout #payment div.payment_box::before{ display:none; }
.woocommerce-checkout #payment fieldset{ border:0 !important; padding:0 !important; margin:0; }
.woocommerce-checkout #payment .place-order{ padding:16px 24px; }
/* WooPay save-details block (phone save form): the gateway prints it flush
   to the payment zone edge — same side rhythm as the method list. */
.woocommerce-checkout #payment div.woopay-save-new-user-container{ padding:4px 24px 8px; }
.woocommerce-checkout-review-order-table tfoot th,
.woocommerce-checkout-review-order-table tfoot td{ border-top:1px solid var(--line); }

/* Mobile (≤900): the order review / payment / place-order card stacks after
   the billing form in native document order — always visible. An earlier
   collapsed-summary pattern (bar toggle hiding #order_review) was removed
   after launch feedback: the entry bar read as a passive total label and
   buyers could not find the payment form or the Place order button.
   The block also flattens the stacked side gutters (card 22px + panel 18px
   + gray-zone 18px ≈ 58px per side at 390px): the page keeps a thin gutter,
   the panel drops its side padding, the gray payment zone runs edge to edge
   inside the card and its own rows carry the breathing room. Kept AFTER the
   base #payment rules above — same specificity, cascade order decides. */
@media (max-width:900px){
  .woocommerce-checkout form.checkout #order_review{
    margin-top:22px; position:static; padding:14px 0 0; border-radius:var(--r-md, 16px);
  }
  .woocommerce-checkout .post-body.entry-content{ padding-inline:12px; }
  .woocommerce-checkout form.checkout.js-merged #order_review > h3{ margin:0 16px 2px; }
  .woocommerce-checkout #order_review .shop_table{ margin:0; }
  .woocommerce-checkout #order_review .shop_table th,
  .woocommerce-checkout #order_review .shop_table td{ padding:10px 16px; }
  .woocommerce-checkout #payment{ margin:14px 0 0; border-radius:0 0 15px 15px; }
  .woocommerce-checkout #payment ul.payment_methods{ padding:14px 18px 12px; }
  .woocommerce-checkout #payment ul.payment_methods li{ padding:10px 0; }
  .woocommerce-checkout #payment .place-order{ padding:16px 18px 20px; }
  .woocommerce-checkout #payment div.woopay-save-new-user-container{ padding:2px 18px 6px; }
  /* keep the full-width CTA aligned with the card-form column above (the
     earlier full-bleed zeroing sits later in the file at equal specificity) */
  .woocommerce-checkout #payment .form-row.place-order{ padding-right:16px; padding-left:16px; }
}

/* my-account */
.woocommerce-account .woocommerce-MyAccount-navigation{ float:left; width:26%; margin:0 0 40px; }
.woocommerce-account .woocommerce-MyAccount-content{ float:right; width:70%; }
.woocommerce-account .woocommerce-MyAccount-navigation ul{ list-style:none; margin:0; padding:0; }
.woocommerce-account .woocommerce-MyAccount-navigation ul li{ border:1px solid var(--line); border-bottom:0; background:var(--panel); }
.woocommerce-account .woocommerce-MyAccount-navigation ul li:last-child{ border-bottom:1px solid var(--line); border-radius:0 0 var(--r-md, 16px) var(--r-md, 16px); }
.woocommerce-account .woocommerce-MyAccount-navigation ul li:first-child{ border-radius:var(--r-md, 16px) var(--r-md, 16px) 0 0; }
.woocommerce-account .woocommerce-MyAccount-navigation ul li a{ display:block; padding:13px 18px; color:var(--txt); text-decoration:none; font-size:.92rem; transition:color .3s, background .3s; }
.woocommerce-account .woocommerce-MyAccount-navigation ul li.is-active a,
.woocommerce-account .woocommerce-MyAccount-navigation ul li a:hover{ color:var(--acc); background:var(--acc-soft); }
@media (max-width:900px){
  .woocommerce-account .woocommerce-MyAccount-navigation,
  .woocommerce-account .woocommerce-MyAccount-content{ float:none; width:100%; }
}

/* ---------- order received (thank you) ----------
   Themed confirmation replacing Woo's bare default (bulleted overview +
   naked table). Panel/card tokens only — light/dark automatic. Every rule
   is prefixed .bf-received to out-rank the article typography the
   .post-body wrapper would otherwise leak in. */
.bf-received{ max-width:880px; margin-bottom:clamp(44px,7vh,72px); }
.bf-received .bf-recv-hero{
  display:flex; gap:16px; align-items:flex-start;
  background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg, 26px);
  padding:22px 24px; margin:0 0 14px;
}
.bf-received .bf-recv-check{
  display:grid; place-items:center; flex:none; width:46px; height:46px;
  border-radius:50%; border:1.5px solid var(--acc); color:var(--acc);
  background:var(--acc-soft); box-shadow:0 0 0 6px var(--acc-soft);
}
.bf-received .bf-recv-check svg{ width:22px; height:22px; }
.bf-received .bf-recv-check--fail{
  border-color:#f87171; color:#f87171;
  background:rgba(248,113,113,.12); box-shadow:0 0 0 6px rgba(248,113,113,.10);
}
.bf-received .bf-recv-msg{ margin:3px 0 0; font:600 1.05rem/1.45 var(--f-disp); color:var(--txt); }
.bf-received .bf-recv-sub{ margin:7px 0 0; color:var(--mut); font-size:.9rem; line-height:1.55; }
.bf-received .bf-recv-sub b{ color:var(--txt); font-weight:600; }
.bf-received .bf-recv-facts{
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px;
  list-style:none; margin:0 0 14px; padding:0;
}
.bf-received .bf-recv-facts li{
  background:var(--panel); border:1px solid var(--line); border-radius:var(--r-md, 16px);
  padding:12px 16px;
}
.bf-received .bf-recv-facts li > span{
  display:block; margin:0 0 6px; font:600 .68rem/1.3 var(--f-body);
  letter-spacing:.12em; text-transform:uppercase; color:var(--mut);
}
/* wc_price's currency symbol is also a <span> — keep it inline inside the value */
.bf-received .bf-recv-facts .woocommerce-Price-currencySymbol{ display:inline; }
.bf-received .bf-recv-facts b{ font:600 .95rem/1.4 var(--f-body); color:var(--txt); word-break:break-word; }
/* wc_price splits symbol/amount into nested spans — never let them wrap apart */
.bf-received .bf-recv-facts b .woocommerce-Price-amount{ white-space:nowrap; }
.bf-received .bf-recv-card{
  background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg, 26px);
  padding:20px 24px 22px; margin:0 0 14px;
}
.bf-received .bf-recv-card h2{
  margin:0 0 14px; font:700 .82rem/1 var(--f-body);
  letter-spacing:.14em; text-transform:uppercase; color:var(--txt);
}
.bf-received .bf-recv-table{ width:100%; border-collapse:collapse; margin:0; background:transparent; border:0; }
/* kill the article-table cell borders (.entry-content table td border:1px)
   before re-adding the row rules — stray vertical lines otherwise */
.bf-received .bf-recv-table th,
.bf-received .bf-recv-table td{ border:0; }
.bf-received .bf-recv-table tbody td{ padding:12px 2px; border-top:1px dashed var(--line2); vertical-align:top; }
.bf-received .bf-recv-table tbody tr:first-child td{ border-top:0; }
.bf-received .bf-recv-name{ font-weight:500; color:var(--txt); }
.bf-received .bf-recv-name a{ color:var(--txt); text-decoration:none; border-bottom:1px solid var(--line2); transition:color .3s, border-color .3s; }
.bf-received .bf-recv-name a:hover{ color:var(--acc); border-color:var(--acc); }
.bf-received .bf-recv-name em{ font-style:normal; color:var(--mut); margin-left:8px; font-size:.85rem; }
.bf-received .bf-recv-amt{ text-align:right; white-space:nowrap; color:var(--txt); font-variant-numeric:tabular-nums; }
.bf-received .bf-recv-table tfoot th,
.bf-received .bf-recv-table tfoot td{
  padding:12px 2px; border-top:1px solid var(--line); text-align:left;
  font-weight:500; color:var(--mut);
}
.bf-received .bf-recv-table tfoot td{ text-align:right; color:var(--txt); font-variant-numeric:tabular-nums; }
.bf-received .bf-recv-table .bf-recv-note td{ text-align:left; }
.bf-received .bf-recv-table tfoot tr:last-child th,
.bf-received .bf-recv-table tfoot tr:last-child td{ font-weight:700; }
.bf-received .bf-recv-addr{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:22px; }
.bf-received .bf-recv-addr h2{ margin:0 0 10px; }
.bf-received .bf-recv-addr address{ font-style:normal; color:var(--mut); line-height:1.7; font-size:.92rem; }
.bf-received .bf-recv-addr-line{ margin:4px 0 0; color:var(--mut); font-size:.92rem; }
.bf-received .bf-recv-actions{ display:flex; flex-wrap:wrap; gap:12px; margin:20px 0 0; }
/* on desktop the CONTENT column and its action buttons center; the hero
   H1 + breadcrumb keep the site-wide left alignment. Sticky side CTAs were
   rejected: the page is short, post-purchase actions live in the email,
   and a following rail reads pushy on a confirmation surface. */
@media (min-width:901px){
  .bf-received{ margin-inline:auto; }
  .bf-received .bf-recv-actions{ justify-content:center; }
}
@media (max-width:640px){
  .bf-received .bf-recv-facts{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .bf-received .bf-recv-addr{ grid-template-columns:1fr; }
  .bf-received .bf-recv-actions .cta-btn,
  .bf-received .bf-recv-actions .ghost-btn{ width:100%; justify-content:center; }
}

/* star ratings → gold tokens */
.woocommerce .star-rating{ color:var(--gold); }
.woocommerce .star-rating span::before{ color:var(--gold); }
.woocommerce p.stars a{ color:var(--gold); }

/* shop/archive helpers */
.bf-shop-pagination{ display:flex; justify-content:center; padding-top:26px; }
.sort-box form{ display:inline; }
.sort-box select{
  background:var(--panel); border:1px solid var(--line2); border-radius:12px; color:var(--txt);
  padding:9px 12px; font:500 .86rem/1.2 var(--f-body);
}

/* ---------- category buying guide ---------- */
.bf-guide{ padding:clamp(44px,6vh,80px) 0 clamp(40px,6vh,72px); }
.bf-guide-grid{ display:grid; grid-template-columns:minmax(280px,.9fr) 1.4fr; gap:clamp(28px,5vw,72px); align-items:start; }
.bf-guide-head .sec-title{ margin-bottom:0; }
/* keep the section head in view while the long guide column scrolls.
   Desktop two-column only — under 1100px the grid stacks and a pinned head
   would overlap the body text scrolling beneath it. */
@media (min-width:1101px){
  .bf-guide-head{ position:sticky; top:calc(var(--head-h) + 20px); }
}
.bf-guide-body{ color:var(--txt); font-size:.98rem; line-height:1.75; }
.bf-guide-body p{ margin:0 0 14px; }
.bf-guide-body h3{ font:600 1.12rem/1.35 var(--f-disp); margin:22px 0 10px; }
.bf-guide-body ul{ margin:0 0 14px; padding-left:18px; }
.bf-guide-body li{ margin:0 0 6px; }
.bf-guide-body a{ color:var(--acc); text-decoration:none; border-bottom:1px solid var(--acc-soft); }
@media (max-width:1100px){ .bf-guide-grid{ grid-template-columns:1fr; } }

/* ---------- compatibility matrix (PDP) ---------- */
.bf-compat{ padding:clamp(70px,10vh,140px) 0; }
.bf-matrix th.cmp-label{ width:38%; }
.bf-matrix td.bf-matrix-state{ width:110px; }
.bf-state{
  display:inline-flex; align-items:center; justify-content:center; min-width:30px; height:30px;
  border-radius:999px; font:700 .95rem/1 var(--f-disp);
}
.bf-state--yes{ color:var(--ok); background:rgb(80 250 190 / .12); }
.bf-state--no{ color:#f87171; background:rgb(248 113 113 / .12); }
.bf-state--cond{ color:var(--acc); background:var(--acc-soft); }

/* ---------- third-party press quotes (PDP) ---------- */
.bf-press{ padding:clamp(70px,10vh,140px) 0; }
.bf-press-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); gap:20px; }
.bf-press-quote{ margin:0; background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg, 26px); padding:clamp(20px,3vw,30px); display:flex; flex-direction:column; gap:16px; }
.bf-press-quote blockquote{ margin:0; font:500 1.02rem/1.65 var(--f-body); color:var(--txt); flex:1; }
.bf-press-quote figcaption a,
.bf-press-quote figcaption b{ color:var(--acc); font:600 .9rem/1 var(--f-body); text-decoration:none; }

/* ---------- PDP FAQ layout ---------- */
.bf-pdp-faq{ padding:clamp(70px,10vh,140px) 0; }
.bf-pdp-faq .accordion{ width:100%; }
/* PDP answers run wider than the global .acc p cap (60ch) — the PDP wrap is
   1440px and 60ch left most of the row blank on desktop. Rows that carry a
   diagram split text|figure on wide screens and stack below 1101px. */
.bf-pdp-faq .acc p{ max-width:80ch; }
/* question text shares the answer's 80ch measure — an unbounded summary ran
   the full 1440px wrap (two long lines) while the answer sat in an 805px
   column, leaving the pair visually lopsided. The + icon stays pinned right. */
.bf-pdp-faq .acc summary .bf-faq-q{ max-width:80ch; }
.bf-pdp-faq .acc .bf-faq-split{ display:block; }
.bf-pdp-faq .acc .bf-faq-fig{ margin:14px 0 2px; max-width:520px; }
.bf-pdp-faq .acc .bf-faq-fig img{ display:block; width:100%; height:auto; border:1px solid var(--line); border-radius:12px; }
@media (min-width:1101px){
  .bf-pdp-faq .acc.has-fig .bf-faq-split{ display:grid; grid-template-columns:minmax(0,1fr) minmax(320px,440px); gap:6px 40px; align-items:start; }
  .bf-pdp-faq .acc.has-fig .bf-faq-fig{ max-width:none; margin:6px 0 0; }
}

/* ---------- checkout subscription opt-in ---------- */
.bf-subs-check{ display:flex; align-items:flex-start; gap:10px; margin:18px 0 6px !important; }
.bf-subs-check input[type=checkbox]{
  width:18px; height:18px; margin-top:2px; accent-color:var(--acc); cursor:pointer; flex:none;
}
.bf-subs-check label{ margin:0 !important; color:var(--txt) !important; font-size:.9rem !important; cursor:pointer; }

/* ================= learn pages & templates ================= */

/* ---------- single post: FAQ accordion after body ---------- */
.post-faq{ margin-top:clamp(30px,5vh,50px); }
.post-faq h2{ font:600 1.25rem/1.3 var(--f-disp); margin-bottom:8px; }
.post-faq .accordion{ border-top:1px solid var(--line); }

/* ---------- learn hub / list bar ---------- */
.list-bar .search-box{ display:flex; align-items:center; gap:10px; background:var(--panel); border:1px solid var(--line); border-radius:999px; padding:12px 18px; color:var(--mut); }
.list-bar .search-box input{ background:transparent; border:0; outline:0; color:var(--txt); font:500 .95rem var(--f-body); width:260px; max-width:52vw; }
.list-bar .search-box svg{ flex:none; }

/* ---------- reviews page ----------
   Scope these to the /reviews/ page hero. Unscoped, they overrode the PDP
   review sidebar (.rev-sum is a sticky grid card there) and crushed its
   rating histogram to a 2px sliver. */
.page-hero .rev-sum{ display:flex; align-items:center; gap:14px; margin-top:18px; }
/* direct child only — the bare descendant selector also hit the <b> layer
   INSIDE the .stars component, painting it 2rem while the gold overlay
   stayed 1rem (two mismatched star rows in the page hero). */
.page-hero .rev-sum > b{ font:700 2rem/1 var(--f-disp); color:var(--txt); }
.page-hero .rev-sum span:last-child{ color:var(--mut); font-size:.92rem; }
.rev-card{ break-inside:avoid; background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg); padding:clamp(18px,2.4vw,26px); margin-bottom:18px; }
.rev-card p{ color:var(--txt); font-size:.95rem; line-height:1.6; margin:10px 0; }
.rev-ava{ width:38px; height:38px; flex:none; display:inline-flex; align-items:center; justify-content:center; border-radius:50%; background:var(--acc-soft); color:var(--acc); font:700 .85rem var(--f-disp); }
.rev-who{ display:flex; flex-direction:column; gap:2px; }
.rev-who a{ color:var(--acc); font-size:.8rem; text-decoration:none; }
.rev-photos{ display:flex; gap:8px; flex-wrap:wrap; margin:8px 0; }
.rev-photos img{ width:92px; height:92px; object-fit:cover; border-radius:12px; border:1px solid var(--line); }
/* photos are lightbox triggers now */
button.rev-photo{ padding:0; border:none; background:none; cursor:zoom-in; line-height:0; }
.rev-videos{ display:flex; gap:8px; flex-wrap:wrap; margin:8px 0; }
.rev-video{ width:auto; max-width:100%; max-height:360px; display:block; border-radius:12px; border:1px solid var(--line); background:#000; }
.verified.bf-src-plain{ color:var(--mut)!important; font-weight:500!important; letter-spacing:.02em; }
.yt-modal-frame img#ytModalImg{ position:absolute; inset:0; width:100%; height:100%; object-fit:contain; background:#000; }
.rev-reply{ border-left:2px solid var(--acc); background:var(--acc-soft); border-radius:0 12px 12px 0; padding:10px 14px; margin:10px 0; }
.rev-reply b{ color:var(--acc); font:600 .8rem var(--f-disp); letter-spacing:.04em; }
.rev-reply p{ font-size:.88rem; color:var(--mut); margin:4px 0 0; }
/* team replies clamp like customer reviews (blockquote wrapper) */
.rev-reply .bf-reply-quote{ margin:4px 0 0; }
.rev-reply .bf-reply-quote p{ font-size:.88rem; color:var(--mut); margin:0 0 6px; }
.rev-reply .bf-reply-quote p:last-child{ margin-bottom:0; }
.rev-reply .rev-more-link{ background:none; border:none; padding:0; cursor:pointer; color:var(--acc); font:600 .78rem/1 var(--f-disp); letter-spacing:.05em; margin-top:6px; }
.rev-more-wrap{ display:flex; justify-content:center; margin-top:10px; }
.rev-grid3{ display:grid; grid-template-columns:repeat(3,1fr); gap:20px; }
.rev-src{ display:inline-block; margin-top:8px; color:var(--acc); font:600 .85rem var(--f-disp); text-decoration:none; }

/* ---------- compatibility selector v1 ---------- */
.cs-choose{ font:600 .8rem/1 var(--f-disp); letter-spacing:.12em; text-transform:uppercase; color:var(--mut); margin-bottom:14px; }
.cs-chips{ flex-wrap:wrap; margin-bottom:22px; }
.cs-chips .chip{ cursor:pointer; }
/* cap at 3 cards per row — auto-fit squeezed cards to 4-up with long
   text; 2-up ≤1100 / 1-up ≤640 follow the site breakpoints */
.cs-results{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:16px; }
@media (max-width:1100px){ .cs-results{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media (max-width:640px){ .cs-results{ grid-template-columns:minmax(0,1fr); } }
.cs-card{ display:flex; align-items:center; gap:16px; background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg); padding:16px 18px; text-decoration:none; color:var(--txt); transition:border-color .2s, transform .2s; }
.cs-card:hover{ border-color:var(--acc); transform:translateY(-2px); }
.cs-card figure{ width:84px; height:84px; flex:none; border-radius:16px; overflow:hidden; background:var(--acc-soft); display:flex; align-items:center; justify-content:center; }
.cs-card figure img{ width:100%; height:100%; object-fit:cover; }
.cs-card figure img.fit{ object-fit:contain; padding:6px; }
.cs-info{ display:flex; flex-direction:column; gap:4px; min-width:0; }
.cs-info b{ font:600 .98rem var(--f-body); }
.cs-specs{ color:var(--mut); font-size:.82rem; }
.cs-note{ color:var(--acc); font-size:.8rem; }
.cs-price{ margin-left:auto; flex:none; font:700 1.05rem var(--f-disp); color:var(--txt); display:flex; align-items:center; gap:6px; }
.cs-price i{ color:var(--acc); font-style:normal; }
/* struck regular price rides every promo price display (muted, smaller) */
.cs-price s, .sr-price s{ color:var(--mut); font-size:.8em; font-weight:400; }
/* fallback note spans the full results row instead of squeezing into
   one grid track; outside a grid context the span is inert */
.cs-fallback{ color:var(--mut); font-size:.94rem; grid-column:1 / -1; }

/* ---------- solution pages ---------- */
.chain-strip{ display:flex; align-items:stretch; gap:12px; flex-wrap:wrap; }
.chain-node{ flex:1 1 200px; background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg); padding:18px 20px; display:flex; flex-direction:column; gap:6px; }
.chain-node b{ font:600 .98rem var(--f-disp); color:var(--acc); }
.chain-node span{ color:var(--mut); font-size:.86rem; }
.chain-arrow{ align-self:center; font-size:1.3rem; color:var(--acc); font-style:normal; }
/* in post content wpautop wraps each arrow in a <p>, so the span's
   align-self:center never applies (its parent is not a flex item context)
   and the arrow hugs the top of the stretched row. Center the wrapper <p>
   itself; the template-rendered arrows (solution pages) are bare flex
   children and keep working through align-self. */
.chain-strip > p{ display:flex; align-items:center; justify-content:center; margin:0; flex:none; }
/* mobile: the signal chain turns vertical — with horizontal wrap the nodes
   folded into three rows and the arrows hung off each row's right edge
   pointing off-page. Narrow screens stack single-column with the arrows
   rotated 90° to point down; the flow semantics are unchanged and the
   desktop horizontal triptych is untouched. */
@media (max-width:640px){
  .chain-strip{ flex-direction:column; align-items:stretch; gap:8px; }
  .chain-node{ flex:none; }
  .chain-arrow{ transform:rotate(90deg); line-height:1; }
}
.r-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:20px; }
@media (max-width:900px){ .rev-grid3, .r-grid{ grid-template-columns:1fr; } }

/* ---------- contact form ---------- */
.bf-form{ display:grid; gap:16px; }
.bf-form-grid{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media (max-width:640px){ .bf-form-grid{ grid-template-columns:1fr; } }
.bf-form label{ display:grid; gap:8px; font:600 .78rem/1 var(--f-disp); letter-spacing:.1em; text-transform:uppercase; color:var(--mut); }
/* input skin unified with the checkout reference (panel bg, 16px radius) */
.bf-form input, .bf-form select, .bf-form textarea{
  border:1px solid var(--line2); background:var(--panel); color:var(--txt);
  border-radius:var(--r-md, 16px); padding:12px 14px; font:400 .95rem/1.4 var(--f-body); outline:none; width:100%; transition:border-color .3s;
}
.bf-form input:focus, .bf-form select:focus, .bf-form textarea:focus{ border-color:var(--acc); }
.bf-form-msg textarea{ resize:vertical; }
.bf-form-note{ border-radius:14px; padding:14px 16px; font-size:.92rem; margin-bottom:16px; }
.bf-form-note.ok{ background:var(--acc-soft); color:var(--acc); border:1px solid var(--acc-glow); }
.bf-form-note.err{ background:rgba(220,60,60,.1); color:#e05b5b; border:1px solid rgba(220,60,60,.35); }

/* contact page layout — the blog post-layout put the ticket form in the
   320px sidebar column while the info boxes took the wide one. Contact
   inverts the ratio: a narrow info rail, the form gets the width. */
.contact-page .post-layout{ grid-template-columns:minmax(260px,340px) minmax(0,1fr); }
@media (max-width:1100px){
  .contact-page .post-layout{ grid-template-columns:1fr; }
}

/* ---------- track order (Woo shortcode) ---------- */
.page-track .woocommerce-form-track-order{ background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg); padding:clamp(22px,3vw,34px); display:grid; gap:14px; }
/* the form intro sentence is removed in gettext (hero sub carries the
   guidance) — collapse the empty <p> Woo still prints so no dead gap remains. */
.page-track .woocommerce-form-track-order p:empty{ display:none; }
.page-track .woocommerce-form-track-order label{ font:600 .78rem/1 var(--f-disp); letter-spacing:.1em; text-transform:uppercase; color:var(--mut); display:grid; gap:8px; }
.page-track .woocommerce-form-track-order input{ border:1px solid var(--line2); background:var(--panel); color:var(--txt); border-radius:var(--r-md, 16px); padding:12px 14px; font:400 .95rem/1.4 var(--f-body); outline:none; width:100%; transition:border-color .3s; }
.page-track .woocommerce-form-track-order input:focus{ border-color:var(--acc); }
.page-track .woocommerce-form-track-order button[type=submit]{ background:var(--acc); color:#04121a; border:0; border-radius:999px; padding:14px 26px; font:600 .95rem var(--f-disp); cursor:pointer; width:fit-content; }
.page-track .woocommerce-form-track-order button[type=submit]:hover{ filter:brightness(1.08); }
.page-track .woocommerce-message{ background:var(--acc-soft); border:1px solid var(--acc-glow); color:var(--txt); border-radius:14px; padding:14px 16px; margin:0 0 18px; }

/* ---------- generic entry content polish (legal / tutorials / collabs) ---------- */
.entry-content table{ width:100%; border-collapse:collapse; margin:18px 0; font-size:.93rem; }
.entry-content table th, .entry-content table td{ border:1px solid var(--line); padding:10px 12px; text-align:left; }
.entry-content img{ max-width:100%; height:auto; border-radius:var(--r-lg); }
.entry-content h2{ font:600 clamp(1.3rem,2.4vw,1.7rem)/1.3 var(--f-disp); margin:34px 0 12px; }
.entry-content h3{ font:600 1.12rem/1.35 var(--f-disp); margin:26px 0 10px; }

/* ---------- tutorial pages: self-hosted walkthrough video, step shots, ZIP rows ---------- */
.bf-tut-video{ display:block; width:100%; height:auto; margin:18px 0; border-radius:var(--r-lg); background:#000; }
.bf-tut-shot{ margin:14px 0; }
.bf-tut-shot img{ height:auto; }
.bf-dl{ margin:4px 0 16px; }
.bf-dl a{ display:inline-block; padding:9px 16px; border:1px solid var(--line); border-radius:999px; font:600 .9rem/1.2 var(--f-disp); color:var(--txt); text-decoration:none; transition:border-color .18s ease, color .18s ease; }
.bf-dl a:hover{ border-color:var(--acc); color:var(--acc); }

.cs-lead{ color:var(--mut); font-size:1.02rem; margin-bottom:8px; }

/* ---------- in-body related guides box (protected posts) ---------- */
.bf-guide-links{ border:1px solid var(--line); background:var(--panel); border-radius:var(--r-lg); padding:18px 22px; margin:28px 0; }
.bf-guide-links b{ display:block; font:600 .78rem/1 var(--f-disp); letter-spacing:.1em; text-transform:uppercase; color:var(--mut); margin-bottom:10px; }
.bf-guide-links ul{ list-style:none; margin:0; padding:0; display:grid; gap:8px; }
.bf-guide-links a{ color:var(--txt); font-weight:500; font-size:.96rem; text-decoration:none; border-bottom:1px solid var(--line); padding-bottom:2px; transition:border-color .2s, color .2s; }
.bf-guide-links a:hover{ color:var(--acc); border-color:var(--acc); }

/* ---- product pick cards ([bf_picks] shortcode in post bodies) ---- */
.bf-picks{ border:1px solid var(--line); background:var(--panel); border-radius:var(--r-lg); padding:20px 22px; margin:30px 0; }
.bf-picks-title{ display:block; font:600 .78rem/1 var(--f-disp); letter-spacing:.1em; text-transform:uppercase; color:var(--mut); margin-bottom:14px; }
.bf-picks-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(160px, 1fr)); gap:14px; }
.bf-pick{ display:flex; flex-direction:column; gap:8px; padding:14px; border:1px solid var(--line); border-radius:var(--r-md, 14px); background:var(--bg, transparent); text-decoration:none; transition:border-color .2s, transform .2s; }
.bf-pick:hover{ border-color:var(--acc); transform:translateY(-2px); }
.bf-pick figure{ margin:0; aspect-ratio:1/1; display:flex; align-items:center; justify-content:center; overflow:hidden; border-radius:10px; background:var(--panel); }
.bf-pick figure img{ width:100%; height:100%; object-fit:cover; }
.bf-pick b{ font:600 .95rem/1.3 var(--f-disp); color:var(--txt); }
.bf-pick-specs{ font-size:.82rem; line-height:1.45; color:var(--mut); }
.bf-pick-price{ font-weight:600; color:var(--txt); font-size:.95rem; }
.bf-pick-price del{ opacity:.55; font-weight:400; margin-right:6px; font-size:.85em; }
.bf-pick-price ins{ text-decoration:none; }
.bf-pick-cta{ margin-top:auto; font-size:.85rem; font-weight:600; color:var(--acc); }
.bf-picks-note{ margin:12px 0 0; font-size:.8rem; color:var(--mut); }

/* ---- reserved tool slot (codec comparison tool mount point) ---- */
.bf-tool-slot{ border:1px dashed var(--line); border-radius:var(--r-lg); background:var(--panel); padding:20px 22px; margin:30px 0; }
.bf-tool-slot > h2:first-child, .bf-tool-slot > h3:first-child{ margin-top:0; }

/* ---- /video/ embed grid + user gallery (content-driven, light/dark via tokens) ---- */
.bf-video-grid{ display:grid; grid-template-columns:repeat(2, 1fr); gap:18px; margin:24px 0; }
@media (max-width:640px){ .bf-video-grid{ grid-template-columns:1fr; } }
.bf-video-card{ display:grid; gap:8px; align-content:start; }
.bf-video{ position:relative; aspect-ratio:16/9; border-radius:var(--r-md, 14px); overflow:hidden; border:1px solid var(--line); background:#000; }
.bf-video iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; }
.bf-video-card > p{ margin:0; font:600 .9rem/1.4 var(--f-disp); color:var(--txt); }
.bf-gallery{ display:grid; grid-template-columns:repeat(4, 1fr); gap:12px; margin:24px 0; }
@media (max-width:640px){ .bf-gallery{ grid-template-columns:repeat(2, 1fr); } }
.bf-gallery figure{ margin:0; border-radius:var(--r-md, 14px); overflow:hidden; border:1px solid var(--line); aspect-ratio:3/4; }
.bf-gallery img{ width:100%; height:100%; object-fit:cover; display:block; }

/* ---------- page-level layout refinements ---------- */
/* split page hero (solution scenes + order tracking) — copy left,
   scene/product image right; collapses to one column under 900px. */
.page-hero--split .wrap{ display:grid; grid-template-columns:minmax(0,7fr) minmax(0,5fr); gap:clamp(24px,4vw,56px); align-items:center; }
.page-hero--split .page-sub{ max-width:46ch; }
.ph-media{ margin:0; border-radius:var(--r-lg); overflow:hidden; border:1px solid var(--line); background:var(--panel); box-shadow:0 34px 80px -40px rgb(0 0 0 / .55); }
.ph-media img{ width:100%; height:100%; min-height:260px; max-height:420px; object-fit:cover; display:block; }
@media (max-width:900px){
  .page-hero--split .wrap{ grid-template-columns:1fr; }
  .ph-media img{ min-height:0; max-height:300px; }
}
/* solutions hub filler CTA card */
.gs-card-cta{ cursor:pointer; position:relative; }
.gs-card-cta .w-ico{ width:64px; height:64px; border-radius:18px; display:grid; place-items:center; background:var(--acc-soft); color:var(--acc); }
.gs-card-cta .w-ico svg{ width:30px; height:30px; }
.gs-card-cta .cta-arrow{ position:absolute; right:18px; bottom:18px; color:var(--acc); transition:transform .3s var(--ease); }
.gs-card-cta .cta-arrow svg{ width:20px; height:20px; }
.gs-card-cta:hover .cta-arrow{ transform:translateX(5px); }
/* featured story without a photo — collapse instead of a 300px void */
.feat-media.no-img{ display:none; }
@media (max-width:900px){ .feat-media.no-img{ display:none; } }

/* ============================================================
   mobile commerce fixes
   ============================================================ */

/* drawer/cart remove button touch target (the bare × was only 9×26px; removal is irreversible) */
.bci-remove{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:32px; min-height:32px; padding:4px; border-radius:8px;
  color:var(--mut); font-size:1.15rem; line-height:1; text-decoration:none;
  transition:color .3s, background .3s;
}
.bci-remove:hover{ color:#f87171; background:var(--acc-soft); }

/* full-width primary action at the last viewport (e-commerce convention;
   only the body carries .woocommerce-checkout, so a descendant selector
   never reaches #place_order — anchor on the form directly; Woo's default
   1em horizontal padding on .place-order visually shrinks width:100% by
   36px, zeroed here as well) */
@media (max-width:900px){
  form.woocommerce-checkout #place_order,
  #add_payment_method #place_order{ width:100%; }
  #payment .form-row.place-order{ padding-right:0; padding-left:0; }
}

/* ≤900px: the cart table becomes block cards (Woo responsive convention:
   thead hidden, rows as cards, td self-labeled via data-title) and totals
   + cross-sell stack again (floats cleared). Scoped to
   .woocommerce-cart-form / .cart_totals so the checkout order table is
   untouched; table/tbody go block too — display:table's min-content
   sizing bursts the parent (a 347px table in a 294px container caused a
   12px page-wide horizontal overflow). */
@media (max-width:900px){
  .woocommerce-cart-form table.shop_table_responsive,
  .woocommerce-cart-form table.shop_table_responsive tbody,
  .cart_totals table.shop_table,
  .cart_totals table.shop_table tbody{ display:block; }
  .cart_totals table.shop_table tr{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; }
  .cart_totals table.shop_table th,
  .cart_totals table.shop_table td{ border-top:1px dashed var(--line2); }
  .woocommerce-cart-form table.shop_table_responsive thead{ display:none; }
  .woocommerce-cart-form table.shop_table_responsive tr{
    display:block; margin-bottom:14px; border:1px solid var(--line);
    border-radius:18px; background:var(--panel); overflow:hidden;
  }
  .woocommerce-cart-form table.shop_table_responsive td{
    display:flex; align-items:center; justify-content:space-between; gap:12px;
    text-align:right; border-top:1px dashed var(--line2);
  }
  .woocommerce-cart-form table.shop_table_responsive td::before{
    content:attr(data-title); float:left; color:var(--mut);
    font:600 .74rem/1.4 var(--f-body); text-transform:uppercase; letter-spacing:.1em;
  }
  .woocommerce-cart-form table.shop_table_responsive td:empty{ display:none; }
  .woocommerce-cart-form table.shop_table_responsive td.product-remove::before,
  .woocommerce-cart-form table.shop_table_responsive td.actions::before,
  .woocommerce-cart-form table.shop_table_responsive td.product-thumbnail::before{ display:none; }
  .woocommerce-cart-form table.shop_table_responsive td.product-thumbnail{ justify-content:flex-start; }
  .woocommerce-cart-form table.shop_table_responsive td.product-thumbnail img{ width:56px; }
  .woocommerce-cart-form table.shop_table_responsive td.product-name a{ overflow-wrap:anywhere; }
  .woocommerce-cart-form table.shop_table_responsive td.actions{ display:block; }
  .woocommerce-cart-form table.shop_table_responsive td.actions .coupon{ display:flex; gap:8px; }
  .woocommerce-cart-form table.shop_table_responsive td.actions .coupon .input-text{ flex:1; min-width:0; width:auto; }
  .woocommerce .cart-collaterals .cart_totals,
  .woocommerce-page .cart-collaterals .cart_totals{ float:none; width:100%; }
  /* stacked single-column: the coupon/actions card (last table row) sat
     flush against the CART TOTALS card below — keep a visible gap between
     the two cards; clear:both so the 901–1279 float fallback stacks too */
  .woocommerce-cart .cart-collaterals{ margin-top:18px; clear:both; }
  .bf-cart-cross{ clear:both; }
}

/* ============================================================
   support menu tiles, scene blocks & misc page widgets
   ============================================================ */

/* ---------- Support mega — app-tile panel (white rounded panel +
   circular icons + bold labels in a horizontal row; icons are purely
   decorative — all text/links run through the menu system) ---------- */
.main-nav li.bf-mega.bf-mega-apps > .sub-menu{
  justify-content:center; gap:clamp(14px, 2vw, 26px);
  padding:30px clamp(20px,3vw,44px) 34px;
}
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li{ padding:0 !important; border-left:none !important; }
/* the icon is an INLINE <svg class="bf-app-ico"> rendered by the walker
   filter — pseudo-element mask/variable variants rendered on only the
   first tile in real browsers (even with valid mask data). */
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a::before,
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a::after{ display:none !important; content:none; }
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a{
  position:relative; display:flex; flex-direction:column; align-items:center; gap:14px;
  width:150px; padding:22px 12px 18px;
  background:var(--panel); border:1px solid var(--line); border-radius:18px;
  text-align:center; color:var(--txt); white-space:normal;
}
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a > b{
  font:600 .95rem/1.2 var(--f-disp); display:block;
}
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a .bf-app-ico{
  width:52px; height:52px; border-radius:50%;
  display:grid; place-items:center;
  background:var(--acc-soft); border:1px solid var(--acc-glow); color:var(--acc);
}
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a .bf-app-ico svg{ width:24px; height:24px; }

/* tiles are always fully visible — no stagger entrance (the panel's li
   fade/slide read as "icons appear only on hover"); hovering a tile now
   just lifts it slightly with a card shadow. */
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li,
.main-nav li.bf-mega.bf-mega-apps.is-open > .sub-menu > li,
.main-nav li.bf-mega.bf-mega-apps:focus-within > .sub-menu > li{
  opacity:1; transform:none; transition:none;
}
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a{
  transition:transform .25s var(--ease), box-shadow .25s var(--ease), border-color .25s var(--ease);
}
.main-nav li.bf-mega.bf-mega-apps > .sub-menu > li > a:hover{
  transform:translateY(-3px);
  box-shadow:0 18px 36px -18px rgb(0 0 0 / .55);
  border-color:var(--acc-glow);
  background:var(--panel); color:var(--txt);
}
/* mobile menu: tiles render as plain text rows */
@media (max-width:900px){
  .m-nav .bf-mega-app .bf-app-ico{ display:none; }
  .m-nav .bf-mega-app > a > b{ font:inherit; font-weight:inherit; }
}

/* ---------- scene page — image|text split blocks ---------- */
.sol-block{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:clamp(24px,4vw,56px); align-items:center; }
.sol-block + .sol-block{ margin-top:clamp(40px,7vh,80px); }
.sol-block--imgfirst .sol-block-text{ order:2; }
.sol-block--imgfirst .sol-block-media{ order:1; }
.sol-block-text{ max-width:640px; }
/* standalone (image-less) text blocks span the module width; only
   image-paired text keeps the structural half column */
.sol-block--solo .sol-block-text{ margin-inline:0; }
.sol-block-media{ margin:0; border-radius:var(--r-lg); overflow:hidden; border:1px solid var(--line); background:var(--panel); box-shadow:0 34px 80px -40px rgb(0 0 0 / .55); }
.sol-block-media img{ width:100%; height:100%; max-height:460px; object-fit:cover; display:block; }
.sol-block-media figcaption{ padding:10px 16px; font-size:.78rem; color:var(--mut); border-top:1px solid var(--line); }
@media (max-width:900px){
  .sol-block{ grid-template-columns:1fr; }
  .sol-block--imgfirst .sol-block-text{ order:1; }
  .sol-block--imgfirst .sol-block-media{ order:2; }
  /* once stacked, img height:100% collapses to the native aspect ratio —
     panorama assets (1024×253) end up only ~83px tall, badly unbalanced
     against the 400px+ text block above. An explicit height + cover raise
     them toward the text block's visual height. */
  .sol-block-media img{ height:min(60vw, 300px); }
}
/* install notes as numbered step cards (was a bare 860px list) */
.sol-steps{ list-style:none; counter-reset:bfsol; display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:14px; margin-left:0; padding:0; }
.sol-steps li{
  counter-increment:bfsol; position:relative; list-style:none;
  background:var(--panel); border:1px solid var(--line); border-radius:var(--r-lg);
  padding:20px 20px 18px 62px; color:var(--mut); font-size:.94rem; line-height:1.6;
}
.sol-steps li::before{
  content:counter(bfsol, decimal-leading-zero); position:absolute; left:18px; top:20px;
  font:700 .95rem/1 var(--f-disp); color:var(--acc);
  width:32px; height:32px; display:grid; place-items:center;
  background:var(--acc-soft); border:1px solid var(--acc-glow); border-radius:50%;
}
.sol-steps li b{ display:block; color:var(--txt); font:600 .98rem/1.3 var(--f-disp); margin-bottom:4px; }
@media (max-width:900px){ .sol-steps{ grid-template-columns:1fr; } }
/* scene review quotes — clamp + Read more (JS toggles .is-open) */
.rev-grid3 .rev-quote.len-long{ display:-webkit-box; -webkit-line-clamp:6; -webkit-box-orient:vertical; overflow:hidden; }
.rev-grid3 .rev-quote.len-long.is-open{ display:block; -webkit-line-clamp:unset; overflow:visible; }
.rev-grid3 .rev-more-link{ background:none; border:none; padding:0; cursor:pointer; color:var(--acc); font:600 .8rem/1 var(--f-disp); letter-spacing:.05em; text-align:left; }
/* cards equal height + quotes not stretching the row */
.rev-grid3{ align-items:start; }

/* ---------- About values grid — 2 cards per row ---------- */
.about-page .why-grid{ grid-template-columns:repeat(2, minmax(0,1fr)); }
@media (max-width:900px){ .about-page .why-grid{ grid-template-columns:1fr; } }

/* ---------- post subscribe modal (reuses the .yt-modal shell) ---------- */
.bf-news-box{
  position:relative;
  width:min(440px, 100%); display:grid; gap:14px; justify-items:start;
  background:var(--panel); border:1px solid var(--acc-glow); border-radius:22px;
  padding:28px; box-shadow:0 40px 110px -30px rgb(0 0 0 / .65);
}
/* the shared close pill is white-on-dark for the video overlay; on this
   WHITE card it must flip dark-on-light and pin to the corner (same
   treatment as the coupon ticket), or it disappears into the card.
   Icon-only: a 32px round ✕ (R7d: the "Close" label left, aria-label carries
   the name). */
.bf-news-box .yt-modal-close{
  position:absolute; top:14px; right:14px; justify-self:auto;
  display:grid; place-items:center; width:32px; height:32px; padding:0;
  background:transparent; border:1px solid var(--line2); color:var(--mut);
  border-radius:50%;
}
.bf-news-box .yt-modal-close:hover{ background:var(--acc-soft); border-color:var(--acc-glow); color:var(--acc); }
.bf-news-box h3{ font:600 1.4rem/1.2 var(--f-disp); }
.bf-news-box p{ color:var(--mut); font-size:.92rem; margin:0; }
.bf-news-box form{ display:flex; gap:8px; width:100%; }
.bf-news-box input[type="email"]{
  flex:1; min-width:0; background:var(--bg1); border:1px solid var(--line2); border-radius:999px;
  color:var(--txt); padding:13px 18px; font:500 .95rem var(--f-body); outline:none;
}
.bf-news-box input[type="email"]:focus{ border-color:var(--acc); }
.bf-news-box input.is-ok{ border-color:var(--ok); }
.bf-news-box input.is-err{ border-color:#f87171; }
.bf-news-note{ font-size:.82rem; min-height:1.2em; }
@media (max-width:640px){ .bf-news-box form{ flex-direction:column; } }

/* ---------- coupon floating button + ticket popup (reuses the .yt-modal shell) ----------
   One always-visible pill on the lower left opens the popup on demand; the
   auto-open (scroll depth, once per 24h) is wired in the engine bridge. Both
   share the same tokens as every other surface, so light/dark just work. */
.bf-coupon-fab{
  position:fixed; left:16px; bottom:calc(16px + env(safe-area-inset-bottom, 0px));
  z-index:80; display:inline-flex; align-items:center; gap:10px;
  /* dark theme: dark text on the bright accent, same as every other
     accent pill; the light theme overrides both (white on --acc-fill) */
  background:var(--acc); color:#04121a; border:none; border-radius:999px;
  padding:14px 22px; cursor:pointer;
  font:700 .78rem/1 var(--f-body); letter-spacing:.14em; text-transform:uppercase;
  box-shadow:0 16px 38px -14px rgb(0 0 0 / .6);
  transition:transform .3s, filter .3s;
}
.bf-coupon-fab::before{
  content:""; width:8px; height:8px; border-radius:50%; background:currentColor;
  animation:bf-coupon-pulse 2.4s ease-out infinite;
}
@keyframes bf-coupon-pulse{
  0%{ box-shadow:0 0 0 0 rgb(255 255 255 / .55); }
  70%{ box-shadow:0 0 0 10px rgb(255 255 255 / 0); }
  100%{ box-shadow:0 0 0 0 rgb(255 255 255 / 0); }
}
.bf-coupon-fab:hover{ transform:translateY(-2px); filter:brightness(1.07); }
.bf-coupon-fab:focus-visible{ outline:2px solid var(--acc); outline-offset:3px; }
/* the PDP sticky buy bar is a full-width fixed strip — ride above it while
   it is showing (body:has works in all evergreen browsers). The bar wraps
   its title on narrow screens, so the mobile band needs the taller offset. */
body:has(.mini-bar.show) .bf-coupon-fab{ bottom:calc(84px + env(safe-area-inset-bottom, 0px)); }
@media (max-width:640px){
  body:has(.mini-bar.show) .bf-coupon-fab{ bottom:calc(126px + env(safe-area-inset-bottom, 0px)); }
}

.bf-coupon-box{
  position:relative; width:min(430px, 100%); display:grid; gap:12px; justify-items:center; text-align:center;
  background:var(--panel); border:1px solid var(--acc-glow); border-radius:26px;
  padding:36px 30px 28px; box-shadow:0 40px 110px -30px rgb(0 0 0 / .65);
}
.bf-coupon-box .yt-modal-close{
  position:absolute; top:14px; right:14px; justify-self:auto;
  background:transparent; border:1px solid var(--line2); color:var(--mut);
  padding:8px 13px; font-size:.72rem;
}
.bf-coupon-box .yt-modal-close:hover{ background:var(--acc-soft); border-color:var(--acc-glow); color:var(--acc); }
.bf-coupon-eyebrow{
  display:inline-flex; align-items:center; gap:8px;
  background:var(--acc-soft); border:1px solid var(--acc-glow); border-radius:999px;
  color:var(--acc); padding:7px 16px;
  font:700 .68rem/1 var(--f-body); letter-spacing:.18em; text-transform:uppercase;
}
.bf-coupon-amount{
  margin:2px 0 0; font:700 clamp(3rem, 9vw, 3.8rem)/1 var(--f-disp);
  letter-spacing:-.01em; color:var(--txt);
}
.bf-coupon-amount .acc{ color:var(--acc); }
.bf-coupon-sub{ margin:0; color:var(--mut); font:500 .92rem/1.5 var(--f-body); }
/* label sits OUTSIDE the dashed ticket (top-left, small gap);
   the ticket itself holds only the code and the copy icon */
.bf-coupon-codeblock{ width:100%; display:grid; gap:7px; margin-top:4px; }
.bf-coupon-code-label{
  display:block; text-align:left; padding-left:2px;
  font:700 .64rem/1 var(--f-body); letter-spacing:.16em; text-transform:uppercase;
  color:var(--mut);
}
.bf-coupon-ticket{
  position:relative; width:100%; display:flex; align-items:center; justify-content:center;
  padding:14px 18px; cursor:pointer;
  background:var(--acc-soft); border:1.5px dashed var(--acc); border-radius:16px;
  color:var(--acc); text-align:center; transition:border-color .3s, background .3s;
}
.bf-coupon-ticket:hover{ background:var(--acc-glow); }
.bf-coupon-ticket:focus-visible{ outline:2px solid var(--acc); outline-offset:3px; }
.bf-coupon-ticket b{ font:600 1.4rem/1 var(--f-disp); letter-spacing:.05em; }
.bf-coupon-ico{ position:absolute; right:16px; top:50%; transform:translateY(-50%); width:22px; height:22px; }
.bf-coupon-ico svg{ position:absolute; inset:0; width:22px; height:22px; transition:opacity .25s; }
.bf-coupon-ico .ico-check{ opacity:0; }
.bf-coupon-ticket.is-copied .ico-copy{ opacity:0; }
.bf-coupon-ticket.is-copied .ico-check{ opacity:1; }
/* copied feedback is read by screen readers only — no layout footprint,
   so nothing opens a blank gap between the ticket and the fine print */
.bf-coupon-copynote{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
}
.bf-coupon-fine{ margin:0; color:var(--mut); font:500 .78rem/1.5 var(--f-body); }
.bf-coupon-cta{ margin-top:2px; }

/* ---------- reviews hero — the rating as an instrument (R35) ----------
   The score IS the first visual: a big gradient readout with /5.00
   suffix, a segmented 5-star LED meter (one segment per star, filled to
   the average), and the tier distribution as an EQ spectrum column.
   Asymmetric grid: brand copy left, instrument right. */
.rvh-grid{
  display:grid; grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);
  gap:clamp(30px,5vw,76px); align-items:center;
  /* the panel's glow bleeds past the wrap — clip it here so the page
     never gains a horizontal scrollbar */
  overflow-x:clip;
}
.rvh-panel{ position:relative; }
.rvh-panel::before{
  content:""; position:absolute; inset:-14% -10%; pointer-events:none;
  background:radial-gradient(58% 62% at 58% 42%, hsl(var(--hue) 70% 50% / .13), transparent 72%);
}
.rvh-score{ display:flex; align-items:baseline; gap:12px; margin:0; }
.rvh-num{
  font:700 clamp(5.4rem,9.5vw,8.6rem)/0.92 var(--f-disp); letter-spacing:-.02em;
  background:linear-gradient(120deg,var(--acc),hsl(calc(var(--hue) + 28) 80% 58%));
  -webkit-background-clip:text; background-clip:text; color:transparent;
  font-variant-numeric:tabular-nums;
}
.rvh-denom{ font:600 clamp(1rem,1.6vw,1.25rem)/1 var(--f-disp); color:var(--mut); letter-spacing:.1em; }
/* the meter is the five stars: one LED segment per star, the fill runs to
   the average — segment ticks land on every 20% boundary */
.rvh-meter{
  position:relative; height:12px; border-radius:999px; overflow:hidden;
  background:var(--acc-soft); border:1px solid var(--acc-glow); margin:20px 0 12px;
}
.rvh-meter i{
  position:absolute; inset:0 auto 0 0; width:var(--f,95%);
  background:linear-gradient(90deg, hsl(var(--hue) 60% 38%), var(--acc));
}
.rvh-meter i::after{
  content:""; position:absolute; inset:0;
  background:repeating-linear-gradient(90deg, transparent 0 calc(20% - 2px), var(--bg) calc(20% - 2px) 20%);
}
.rvh-meta{
  margin:0 0 24px; color:var(--mut);
  font:600 .72rem/1 var(--f-body); letter-spacing:.18em; text-transform:uppercase;
}
.rvh-spectrum{ display:grid; grid-template-columns:repeat(5,1fr); gap:clamp(12px,1.6vw,22px); align-items:end; }
.rvh-col{ display:grid; gap:8px; justify-items:center; }
/* the count sits under its bar+star pair — data-label position, so it never
   reads as a scale mark of the LED meter above */
.rvh-col b{ font:600 .78rem/1 var(--f-disp); color:var(--mut); margin-top:-2px; font-variant-numeric:tabular-nums; }
.rvh-bar{ display:flex; align-items:flex-end; width:100%; max-width:66px; height:clamp(44px,6.5vw,104px); }
.rvh-bar i{
  display:block; width:100%; height:var(--h,10%); min-height:4px;
  border-radius:8px 8px 3px 3px;
  background:linear-gradient(180deg, var(--acc), hsl(calc(var(--hue) + 24) 70% 52% / .3));
  box-shadow:inset 0 0 0 1px var(--acc-glow);
}
.rvh-star{ font:600 .9rem/1 var(--f-body); letter-spacing:.1em; color:var(--acc); }
/* ---------- shipment tracking block on the customer order view ---------- */
.bf-ship-track{
  display:flex; align-items:center; flex-wrap:wrap; gap:8px 14px;
  margin:0 0 18px; padding:14px 18px;
  background:var(--acc-soft); border:1px solid var(--acc-glow); border-radius:16px;
}
.bf-ship-track b{ font:600 .95rem/1.3 var(--f-disp); color:var(--txt); }
.bf-ship-track > b{ letter-spacing:.06em; }
.bf-ship-track span{ font:500 .9rem/1.4 var(--f-body); color:var(--txt); }
.bf-ship-track a{ color:var(--acc); font-weight:600; text-decoration:none; }
.bf-ship-track a:hover{ text-decoration:underline; }
/* creator rail — 3 cards per view on desktop, one-card step;
   phones fall back to the single-card track (--thirds would force 2-up) */
.page-reviews .h-track--thirds{ grid-auto-columns:calc((100% - 48px)/3); }
@media (max-width:1100px){ .page-reviews .h-track--thirds{ grid-auto-columns:calc(50% - 12px); } }
@media (max-width:640px){ .page-reviews .h-track--thirds{ grid-auto-columns:86%; } }
@media (max-width:900px){
  .rvh-grid{ grid-template-columns:1fr; gap:40px; }
  .rvh-num{ font-size:clamp(4.6rem,17vw,6.4rem); }
  .rvh-meter{ margin-top:14px; }
}

/* ---------- contact map ---------- */
.bf-map{ margin:0; border-radius:var(--r-lg); overflow:hidden; border:1px solid var(--line); background:var(--panel); }
.bf-map iframe{ display:block; width:100%; aspect-ratio:16/7; border:0; min-height:300px; }
.bf-map figcaption{
  display:flex; align-items:center; gap:10px; padding:14px 18px;
  border-top:1px solid var(--line); font:600 .92rem/1.4 var(--f-disp); color:var(--txt);
}
.bf-map figcaption .w-ico{ width:34px; height:34px; border-radius:10px; margin:0; }
.bf-map figcaption .w-ico svg{ width:17px; height:17px; }

/* ---------- explicit support search submit ---------- */
.support-search-btn{
  align-self:center; width:46px; height:46px; flex:none; border-radius:50%;
  display:grid; place-items:center; background:var(--acc); color:#04121a;
  transition:filter .3s;
}
/* style.css `.support-search svg` absolutely positioned the button's icon
   into the field's left edge and painted it --mut — invisible until hover.
   Exempt the button icon (always visible, inherits button ink) and give
   the BUTTON a small lift instead. */
.support-search .support-search-btn svg{
  position:static; left:auto; top:auto; translate:none;
  width:20px; height:20px; color:currentColor;
}
.support-search-btn{ transition:filter .3s, transform .25s var(--ease), box-shadow .25s var(--ease); }
.support-search-btn:hover{ transform:translateY(-1px); box-shadow:0 12px 26px -14px var(--acc-glow); }
.support-search-btn:active{ transform:translateY(0); }

/* ---------- support search results panel under the field ---------- */
.support-results{
  position:absolute; left:0; right:0; top:calc(100% + 12px); z-index:30;
  background:var(--panel); border:1px solid var(--line2); border-radius:20px;
  box-shadow:0 40px 90px -40px rgb(0 0 0 / .7);
  max-height:min(480px, 70vh); overflow-y:auto; padding:16px;
  display:grid; gap:18px;
}
[data-theme="light"] .support-results{ box-shadow:0 40px 90px -44px rgb(20 35 55 / .45); }
.support-results[hidden]{ display:none; }
.sr-group h5{
  font:600 .72rem/1 var(--f-disp); letter-spacing:.22em; text-transform:uppercase;
  color:var(--acc); margin:0 0 10px; display:flex; align-items:center; gap:8px;
}
.sr-group h5::before{ content:""; width:14px; height:1px; background:var(--acc); }
.sr-list{ display:grid; gap:6px; }
.sr-item{
  display:flex; align-items:center; gap:12px; padding:10px 12px;
  border:1px solid transparent; border-radius:14px; text-decoration:none; color:var(--txt);
  transition:border-color .2s, background .2s;
}
.sr-item:hover{ border-color:var(--line2); background:var(--acc-soft); }
.sr-item figure{ width:44px; height:44px; flex:none; border-radius:10px; overflow:hidden; background:linear-gradient(160deg,#fff,#e9eef3); border:1px solid var(--line); margin:0; display:grid; place-items:center; }
.sr-item figure img{ width:100%; height:100%; object-fit:cover; }
.sr-item .sr-ico{ width:34px; height:34px; flex:none; border-radius:50%; display:grid; place-items:center; background:var(--acc-soft); border:1px solid var(--acc-glow); color:var(--acc); }
.sr-item .sr-ico svg{ width:16px; height:16px; }
.sr-info{ flex:1; min-width:0; }
.sr-info b{ display:block; font:600 .9rem/1.3 var(--f-disp); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sr-info span{ display:block; font:400 .78rem/1.4 var(--f-body); color:var(--mut); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sr-meta{ font:600 .68rem/1 var(--f-disp); letter-spacing:.1em; text-transform:uppercase; color:var(--acc); background:var(--acc-soft); border:1px solid var(--acc-glow); padding:5px 9px; border-radius:999px; white-space:nowrap; flex:none; }
.sr-price{ font:700 .92rem/1 var(--f-disp); color:var(--txt); white-space:nowrap; flex:none; }
.sr-empty{ margin:0; color:var(--mut); font-size:.92rem; text-align:center; padding:14px 0 6px; }
.sr-empty a{ color:var(--acc); text-decoration:none; font-weight:600; }
@media (max-width:900px){
  .support-results{ position:static; margin-top:14px; max-height:none; }
}

/* ---------- misc additions (continued) ---------- */

/* archive pagination — 46px circles, SVG prev/next (bf_pagination) */
.bf-pagination .page-numbers{ min-width:46px; height:46px; border-radius:50%; }
.bf-pagination .page-numbers .pg-svg{ display:grid; place-items:center; width:20px; height:20px; }
.bf-pagination .page-numbers .pg-svg svg{ width:20px; height:20px; display:block; }

/* the about story image fills its grid column (natural-width png left
   dead space to the right of the figure) */
.about-page .ov-img img{ width:100%; height:auto; }

/* mobile: coupon error takes its own line under the coupon row */
@media (max-width:900px){
  .woocommerce-cart-form table.shop_table_responsive td.actions .coupon{ flex-wrap:wrap; }
  .woocommerce-cart-form table.shop_table_responsive td.actions .coupon .input-text{ flex:1 1 100%; }
  .woocommerce-cart-form table.shop_table_responsive td.actions .coupon-error-notice{ flex-basis:100%; margin:4px 0 0; }
  .woocommerce-cart-form table.shop_table_responsive td.actions .button[name="update_cart"]{ margin-top:12px; width:100%; justify-content:center; }
}

/* the star-row rules live with the review-form block above (cumulative
   fill); nothing theme-specific needed here. */

/* mobile: the app tiles render as plain submenu rows — strip the desktop
   tile chrome (circle/icon) inside the mobile accordion */
@media (max-width:900px){
  .m-nav .bf-mega-app > a::before,
  .m-nav .bf-mega-app > a::after{ display:none !important; }
  .m-nav .bf-mega-app > a{ border-bottom:none; }
}

/* ============================================================
   review clamps, video cards & PDP mobile layout
   ============================================================ */

/* shared long-review clamp — /reviews/ wall cards + PDP review cards
   (scene cards keep their scoped rules). Applies only when JS is on
   (html.js): without JS the full text stays readable and the toggle button
   hides. Lines: 6 on mobile / 7 on desktop. */
html.js .bf-clamp{ display:-webkit-box; -webkit-line-clamp:6; -webkit-box-orient:vertical; overflow:hidden; }
@media (min-width:641px){
  html.js .bf-clamp{ -webkit-line-clamp:7; }
}
html.js .bf-clamp.is-open{ display:block; -webkit-line-clamp:unset; overflow:visible; }
html:not(.js) .rev-more-link{ display:none; }

/* the /reviews/ creator card trigger is a real <button> now — keep it
   filling the card like the old figure did.
   At ≥1600px viewports the card grows to 664px and a natural-size
   (480×360) img stops filling it (it only matched by coincidence at
   ≈465px card width): the base shows through on the right and the card
   stretches to 4:3 (object-fit:fill). Same treatment as the /video/ hub:
   the button IS the 16/9 thumb frame, img cover-crops hqdefault's black
   bars. */
.video-card > button[data-yt]{
  display:block; width:100%; padding:0; border:0; background:none;
  position:relative; aspect-ratio:16/9; overflow:hidden; cursor:pointer;
}
.video-card > button[data-yt] img{
  display:block; width:100%; height:100%; object-fit:cover;
}
.video-card > button[data-yt]:focus-visible{
  outline:2px solid var(--acc); outline-offset:-3px;
}
.video-card > button[data-yt] .play{
  position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  width:54px; height:54px; border-radius:50%; pointer-events:none;
  background:rgb(4 8 12 / .55); border:1.5px solid rgb(255 255 255 / .75);
  display:grid; place-items:center;
}
.video-card > button[data-yt] .play::after{
  content:""; margin-left:4px;
  border-left:16px solid #fff; border-top:10px solid transparent; border-bottom:10px solid transparent;
}

/* mobile (≤640) — filter pills become a single horizontal scroller so
   long product names stop stacking; the page itself never scrolls sideways.
   Desktop behavior (wrap) is unchanged. */
@media (max-width:640px){
  .page-reviews .filter-chips{
    flex-wrap:nowrap; overflow-x:auto; min-width:0; flex:1 1 100%;
    padding-bottom:6px; scrollbar-width:none; -webkit-overflow-scrolling:touch;
  }
  .page-reviews .filter-chips::-webkit-scrollbar{ display:none; }
  .page-reviews .filter-chips .chip{ flex:0 0 auto; white-space:nowrap; }
}

/* PDP mobile first screen —
   1) thumbs past the 5th hide behind a "+N" expander (server renders all;
      .g-extra is the marker; html.js gates the expander so no-JS just shows
      the 5 thumbs, unbroken);
   2) the square main image loses height (contain, letterboxed on its own
      gradient — nothing cropped) and the gallery↔info gap tightens so price
      + rating reach the first viewport at 390×844;
   3) desktop (>900) is untouched; a short desktop viewport (≤780px high)
      gets one vh-based cap so Add to cart isn't pushed off-screen. */
.g-more-btn{ display:none; }
@media (max-width:900px){
  .pdp .crumbs{ margin-bottom:14px; }
  .pd-top{ gap:18px; }
  /* the main media stays a 1:1 square at every breakpoint; the
     old natural-height fallback is retired. */
  .pd-gallery .g-main{ aspect-ratio:1/1; }
  .pd-gallery .g-img{ position:absolute; inset:0; }
  .pd-gallery .g-img img{ width:100%; height:100%; object-fit:cover; }
  .pd-gallery .g-th.g-extra{ display:none; }
  html.js .pd-gallery .g-more-btn{
    display:grid; place-items:center; aspect-ratio:1/1; width:100%;
    border:1px dashed var(--line2); border-radius:12px;
    background:var(--panel); color:var(--mut); font:600 .95rem/1 var(--f-disp);
  }
  .pd-gallery .g-thumbs.bf-expanded .g-th.g-extra{ display:grid; }
  .pd-gallery .g-thumbs.bf-expanded .g-more-btn{ display:none; }
  /* a long short_description pushes price (y≈1037) and Add to cart
     (y≈1165) out of the 844px first viewport — ≤900px the info column
     switches to an explicit flex order: price/buy row/stock follow the
     rating, the long description moves after them (DOM order unchanged,
     SEO-neutral). */
  .pd-info{ display:flex; flex-direction:column; }
  .pd-info > *{ order:9; }
  .pd-eyebrow, .pd-title, .pd-rating{ order:1; }
  .pd-price{ order:2; margin-bottom:14px; }
  .pd-buy{ order:3; }
  .pd-stock{ order:4; }
  .pd-desc{ order:5; }
  /* usage callout shares desc's order slot; equal orders keep DOM order,
     and the callout sits before the description in the DOM — so it renders
     directly above the bullet list, right after the CTA block */
  .pd-warn{ order:5; }
  .pd-trust{ order:6; }
}
@media (min-width:901px) and (max-height:780px){
  /* short desktop viewports: cap the square instead of dropping it */
  .pd-gallery .g-main{ max-height:64vh; }
  .pd-gallery .g-img img{ object-fit:contain; }
}
/* short desktop viewports: in the two-column layout the CTA position is
   decided by the right column's content (at 1220×730 the description takes
   307px, Add to cart top=713) — shrinking the main image does not help.
   At ≤780px height JS clamps .pd-desc to 3 lines + Read more (html.js
   gated; no JS keeps the full text; normal desktop heights are untouched). */
html.js .bf-autoclamp.bf-clamped:not(.is-open){
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden;
}
html.js .bf-autoclamp.is-open{ display:block; }

/* ============================================================
   PDP, creator cards & hub polish
   ============================================================ */

/* /reviews/ creator card — the card's border-radius + overflow:hidden
   clipped the bare <b>/<span> caption text along the bottom rounded corner
   (on the /video/ hub the same cards wrap their text in .video-body
   padding; here they are direct children). Fix: the radius stays on the
   cover image (the button) only, the card itself drops its
   border/background, and the caption gets real padding. */
#creatorTrack .video-card{
  overflow:visible; border-radius:0; border:0; background:none;
}
#creatorTrack .video-card > button[data-yt]{ border-radius:var(--r-lg); }
#creatorTrack .video-card > b{
  font:600 1rem/1.35 var(--f-disp); padding:13px 4px 0;
}
#creatorTrack .video-card > span{
  font:500 .78rem/1.4 var(--f-body); color:var(--mut); padding:5px 4px 0;
}
/* article variant (creator carousel) — the hover animation lives on the
   video module (button) only; title/source text trigger nothing. The generic
   .video-card:hover lift+shadow no longer exists in style.css, so these
   are additive, not overrides. */
article.video-card > button[data-yt]{
  transition:transform .5s var(--ease-out), box-shadow .4s;
}
article.video-card > button[data-yt]:hover{
  transform:translateY(-5px);
  box-shadow:0 30px 70px -40px rgb(0 0 0 / .7);
}
article.video-card > button[data-yt] img{
  transition:transform .7s var(--ease-out);
}
article.video-card > button[data-yt]:hover img{
  transform:scale(1.06);
}
article.video-card > button[data-yt] .play{
  transition:transform .35s var(--ease), background .35s;
}
article.video-card > button[data-yt]:hover .play{
  transform:translate(-50%,-50%) scale(1.12);
  background:var(--acc);
}

/* PDP main-image hover zoom restored (a blanket thumbnail-hover cleanup
   had accidentally removed the PDP zoom). fine-pointer only + respects
   prefers-reduced-motion; JS side in product.js (transformOrigin + lens
   follow). */
.g-main.zooming .g-img img{ transform:scale(1.75); }
.g-main.zooming .g-lens{ opacity:1; }

/* short-description list indent — the global * reset zeroed ul padding, so
   pd-desc li bullets hung outside the text column and nearly touched the
   screen edge at 390px. Pull the indent back inside the column, consistent
   on both breakpoints. */
.pd-desc ul{ padding-left:20px; }

/* PDP mobile module spacing — sections inherited the desktop
   clamp(70~90px,10~12vh,130~150px) vertical rhythm, which reads as an
   empty page at 390px. ≤640 tightens to a 44/30px step that keeps some
   breathing room; desktop and tablet (641~900) untouched. */
@media (max-width:640px){
  .pdp .codecs{ padding:44px 0 30px; }
  .pdp .overview, .pdp .bf-compat, .pdp .specs, .pdp .bf-press,
  .pdp .reviews, .pdp .bf-pdp-faq{ padding:44px 0; }
  .pdp .compare{ padding:44px 0 0; }
  .pdp .related{ padding:44px 0 60px; }
}

/* solutions hub "Custom install?" CTA card — the figure reuses the scene
   card's 1:1 image area but has no img, so the 52px icon sat pinned to the
   top-left corner in normal flow. Center the icon in the image area and
   size it one step up to match. */
.gs-card-cta figure{ display:grid; place-items:center; }
.gs-card-cta .w-ico{ width:88px; height:88px; border-radius:24px; margin-bottom:0; }
.gs-card-cta .w-ico svg{ width:38px; height:38px; }

/* brand circular avatars switch to a "b" mark (two asset variants: black
   line on white for dark mode, white line on black for light mode). Both
   are rendered and CSS picks via data-theme, so theme switching needs no
   reload; customer review / scene Q&A avatars keep customer initials —
   they are not brand slots. */
.q-ava-brand{ padding:0; overflow:hidden; }
.q-ava-brand img{
  width:100%; height:100%; object-fit:cover; display:block;
}
.q-ava-brand .for-light{ display:none; }
.q-ava-brand .for-dark{ display:block; }
[data-theme="light"] .q-ava-brand .for-light{ display:block; }
[data-theme="light"] .q-ava-brand .for-dark{ display:none; }

/* ============================================================
   homepage mobile section rhythm
   ============================================================ */
/* at 390px the lineup heading sat only 26px under the marquee band (too
   tight) while scenes/why sections carried 84~135px padding-top (too
   loose). Unify to a ~56-60px step: keeps breathing room, drops the excess;
   desktop and tablet (641~900) untouched. Other pages checked fine (about
   51~68 / reviews has built-in spacing / the rest differ structurally) and
   are out of scope here. */
@media (max-width:640px){
  #lineup .lineup-sticky{ padding-top:30px; }
  #engineered, #scenes, #why, #stories, #news, #support{
    padding-top:clamp(44px,7vh,60px);
  }
}

/* ============================================================
   PDP reviews in-place pagination
   Fetch-swap keeps the page alive; these only polish it:
   - scroll-margin so the post-swap landing (and the native
     anchor jump for no-JS visitors) clears the sticky header;
   - a quiet loading state on the list while fetching.
   ============================================================ */
#bf-reviews{ scroll-margin-top:88px; }
.rev-list{ transition:opacity .18s ease; }
.bf-rev-loading .rev-list{ opacity:.45; pointer-events:none; }

/* ============================================================
   no-featured-image cards — designed placeholder.
   Posts without a featured image yet must not render as an empty
   16:9 panel; the SIGNAL FIELD eq glyph sits on the soft accent
   ground until the real image replaces it.
   ============================================================ */
.post-media.no-img, .n-card figure.no-img{ display:flex; align-items:center; justify-content:center; background:var(--acc-soft); }
.post-media.no-img .media-ph, .n-card figure.no-img .media-ph{ display:flex; width:44px; height:44px; color:var(--acc); opacity:.55; }
.post-media.no-img .media-ph svg, .n-card figure.no-img .media-ph svg{ width:100%; height:100%; }

/* ============================================================
   homepage press strip + finder card + brand FAQ.
   New sections reuse existing components only:
   .help-banner / .chip / .bf-pdp-faq accordion. Two scoped
   additions below; nothing else on the page is touched.
   ============================================================ */

/* press strip — a quiet single line between STATS and WHY.
   Bordered strip reads as a divider, not a section: citations stay
   secondary to the stats above them. */
.press-strip-sec{ padding:0; }
.press-strip{
  display:flex; flex-wrap:wrap; align-items:baseline; justify-content:center;
  gap:10px 18px; margin:0; padding:clamp(24px,4vh,38px) 0;
  border-top:1px solid var(--line); border-bottom:1px solid var(--line);
}
.press-strip b{
  font:600 .74rem/1.4 var(--f-disp); letter-spacing:.14em;
  text-transform:uppercase; color:var(--mut);
}
.press-strip a, .press-strip span{
  color:var(--txt); font-weight:500; font-size:.95rem; text-decoration:none;
  border-bottom:1px solid var(--line); padding-bottom:2px;
  transition:color .2s, border-color .2s;
}
.press-strip a:hover{ color:var(--acc); border-color:var(--acc); }
.press-strip .press-dot{ color:var(--mut); font-style:normal; }

/* finder card — help-banner is a 1.2fr/1fr grid; the category
   page keeps its cb-list column, here the chips wrap as a group.
   margin-top:0 — the homepage section supplies its own rhythm.
   Layout fix: 5 pills never fit one 1fr column and flex-wrap centered
   a lonely 5th chip on row 2; the global .cta-row{justify-content:center}
   also indented the single CTA away from the copy column. Chips become
   an equal-width 2-col grid (2+2+full-width last), the CTA aligns left
   with the copy. */
.compat-entry-sec{ padding:clamp(36px,6vh,64px) 0 0; }
.compat-entry-sec .help-banner{ margin-top:0; height:100%; align-items:center; }
.compat-entry-sec .compat-chips{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; align-content:center; }
.compat-entry-sec .compat-chips .chip{
  /* block + text-align, NOT flex: flex items would drop the whitespace
     text nodes around the <span class="amp">&</span> (「Optical&Coaxial」). */
  display:block; text-align:center; padding-block:14px; white-space:nowrap; font-size:.92rem;
}
.compat-entry-sec .compat-chips .chip:last-child{ grid-column:1 / -1; }
.compat-entry-sec .cta-row{ justify-content:flex-start; }

/* homepage FAQ — same ov-grid/accordion shape as the category
   pages; the index label needs no extra rules. */

/* ============================================================
   late fixes batch
   ============================================================ */

/* wide compare/matrix tables must never inflate the page width.
   Grid and flex ancestors size items by min-content unless min-width:0 is
   explicit — the .cmp-scroll scroller stays exactly as wide as its column
   and scrolls internally (fixes the ~10px horizontal jitter on 390px). */
.cmp-scroll{ max-width:100%; min-width:0; }
.bf-compat .wrap > .cmp-scroll,
.compare .wrap > .cmp-scroll,
.specs .wrap > .spec-grid{ max-width:100%; min-width:0; }

/* skip link — visually hidden until keyboard focus lands on it. */
.skip-link{
  position:fixed; left:12px; top:-56px; z-index:300;
  padding:12px 18px; border-radius:12px;
  background:var(--acc); color:#04121a;
  font:700 .92rem/1 var(--f-disp); text-decoration:none;
  transition:top .18s ease-out;
}
.skip-link:focus{ top:12px; }

/* drawer quantity stepper */
.bf-drawer-qty{
  display:inline-flex; align-items:center; gap:8px;
  margin-top:6px; border:1px solid var(--line); border-radius:999px; padding:2px;
}
.bf-drawer-qty .bf-dqty{
  width:24px; height:24px; border:none; border-radius:50%;
  background:transparent; color:var(--tx); cursor:pointer;
  font:700 .95rem/1 var(--f-disp); display:grid; place-items:center;
  transition:background .2s;
}
.bf-drawer-qty .bf-dqty:hover{ background:rgb(255 255 255 / .08); }
.bf-drawer-qty .bf-dqty-val{
  min-width:18px; text-align:center; font:600 .9rem/1 var(--f-disp); color:var(--tx);
}
.bci-info .bf-drawer-qty ~ .bci-price{ align-self:center; }

/* downloads tools grid — three columns that still collapse on
   breakpoints (the old inline style pinned 3 columns at every width). */
.qa-grid--three{ grid-template-columns:repeat(3,1fr); }
@media (max-width:1100px){ .qa-grid--three{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:640px){ .qa-grid--three{ grid-template-columns:1fr; } }

/* print styles — order confirmation (high-frequency print target)
   and policy pages. Chrome prints the fixed header/canvas on every page
   otherwise. */
@media print{
  .grain, .site-head, .m-nav,
  #miniBar, #bfStickyP, .bf-stickyp, .foot, .bf-drawer, .search-overlay,
  #newsModal, .yt-modal, .head-progress, .skip-link,
  .post-side, .bf-cart-cross, .bf-cart-cta2, .bf-cta{ display:none !important; }
  body{ background:#fff !important; color:#111 !important; }
  html[data-theme="dark"] body{ background:#fff !important; color:#111 !important; }
  main, .wrap{ max-width:100% !important; padding:0 !important; }
  a{ color:#111 !important; text-decoration:underline; }
  .woocommerce-order, .woocommerce-thankyou-order-details,
  .woocommerce-customer-details, .woocommerce-order-details{ page-break-inside:avoid; }
  .rv{ opacity:1 !important; transform:none !important; }
  details{ display:block; }
  details > *{ display:block !important; }
}

/* the 390px overflow source is the specs grid — its two <dl>
   columns are grid items defaulting to min-width:auto, so one long value
   ("Built-In Bluetooth, Music Streaming, RCA") pushed the page 16px wide.
   The compare tables were already contained by .cmp-scroll. Let the dl
   shrink and long values wrap. */
.spec-grid dl{ min-width:0; }
.spec-grid dd{ overflow-wrap:anywhere; }

/* quad image wall — 2×2 captioned figures used by the commercial
   landing template; single column under 719px keeps captions readable. */
.bf-quad-grid{
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(16px,2.4vw,26px); max-width:940px; margin-inline:auto;
}
.bf-quad-grid figure{
  margin:0; overflow:hidden; border-radius:var(--r-lg);
  border:1px solid var(--line); background:var(--panel);
}
.bf-quad-grid img{
  width:100%; aspect-ratio:1/1; object-fit:cover; display:block;
}
.bf-quad-grid figcaption{
  padding:12px 16px; font:500 .84rem/1.45 var(--f-body);
  color:var(--mut); text-align:center; border-top:1px solid var(--line);
}
@media (max-width:719px){ .bf-quad-grid{ grid-template-columns:1fr; } }

/* upgrade section — featured receiver as a split card beside a compact
   lineup list (live catalog rows); both stack under 900px. */
.bf-upgrade-grid{
  display:grid; grid-template-columns:minmax(0,7fr) minmax(0,5fr);
  gap:clamp(18px,2.5vw,30px); align-items:stretch; max-width:1120px; margin-inline:auto;
}
.bf-hero-card{
  position:relative; display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(16px,2vw,28px); align-items:center;
  background:linear-gradient(175deg, var(--panel), var(--bg2));
  border:1px solid var(--line); border-radius:var(--r-lg); padding:clamp(20px,3vw,36px);
  transition:border-color .4s;
}
.bf-hero-card:hover{ border-color:var(--acc-glow); }
.bf-hero-card .p-badge-flag{ position:absolute; top:14px; left:14px; padding:10px 16px; z-index:1; }
.bf-hero-media{ position:relative; display:block; margin:0; }
.bf-hero-media img{ width:100%; height:auto; display:block; }
.bf-hero-media img.alt{
  position:absolute; inset:0; width:100%; height:100%; object-fit:contain;
  background:var(--bg2); opacity:0; transition:opacity .35s var(--ease);
}
.bf-hero-media:hover img.alt{ opacity:1; }
.bf-hero-info h3{ margin:0; font:600 clamp(1.15rem,1.8vw,1.5rem)/1.25 var(--f-disp); letter-spacing:-.01em; }
.bf-hero-info h3 a{ color:inherit; text-decoration:none; }
.bf-hero-sub{ margin:6px 0 0; font:500 .8rem/1 var(--f-disp); letter-spacing:.06em; color:var(--acc); }
.bf-hero-info .p-specs{ margin-top:8px; }
.bf-hero-info .p-rate{ margin-top:14px; }
.bf-hero-info .p-foot{ margin-top:16px; display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap; }
.bf-hero-more{
  display:inline-flex; align-items:center; gap:8px; margin-top:18px;
  font:600 .84rem/1 var(--f-disp); color:var(--txt); text-decoration:none;
}
.bf-more-arrow{ display:inline-flex; width:16px; height:16px; color:var(--acc); transition:transform .35s var(--ease); }
.bf-more-arrow svg{ width:100%; height:100%; }
.bf-hero-more:hover .bf-more-arrow,
.bf-mini:hover .bf-more-arrow{ transform:translateX(5px); }
.bf-mini-wrap{ display:flex; flex-direction:column; }
.bf-mini-title{ margin:0 0 12px; font:600 .78rem/1 var(--f-disp); letter-spacing:.22em; text-transform:uppercase; color:var(--mut); }
.bf-mini-list{ display:grid; gap:14px; flex:1; }
.bf-mini{
  display:grid; grid-template-columns:76px minmax(0,1fr) auto; gap:14px; align-items:center;
  background:linear-gradient(175deg, var(--panel), var(--bg2));
  border:1px solid var(--line); border-radius:var(--r-lg); padding:12px 18px 12px 12px;
  text-decoration:none; color:var(--txt); transition:border-color .4s, transform .5s var(--ease-out);
}
.bf-mini:hover{ border-color:var(--acc-glow); transform:translateY(-4px); }
.bf-mini-thumb img{ width:76px; height:76px; object-fit:contain; display:block; }
.bf-mini-body{ min-width:0; }
.bf-mini-body b{ display:block; font:600 .98rem/1.3 var(--f-disp); }
.bf-mini-body i{
  display:block; margin-top:4px; font:400 .78rem/1.4 var(--f-body); font-style:normal; color:var(--mut);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.bf-mini-meta{ display:flex; align-items:center; gap:12px; }
.bf-mini-meta b{ font:600 1.02rem/1 var(--f-disp); color:var(--acc); white-space:nowrap; }
@media (max-width:900px){
  .bf-upgrade-grid{ grid-template-columns:1fr; }
  .bf-hero-card{ grid-template-columns:1fr; }
  .bf-hero-media img{ max-height:340px; object-fit:contain; margin-inline:auto; }
}

/* ============================================================
   LIGHT OVERRIDES (the site renders a single light theme — data-theme is
   pinned to "light" in header.php; these catch the few surfaces that
   had no light variant in the dual-theme era)
   ============================================================ */
/* subscribe notice toast */
.bf-subs-notice{
  background:rgba(255,255,255,.98); border:1px solid var(--line-2, #D9DBDE);
  color:var(--txt, #0A0A0A);
  box-shadow:0 20px 50px -20px rgba(10,10,10,.35);
}
/* news modal + coupon ticket + drawer already carry light variants;
   their dark-only text bits: */
.bf-news-modal .news input{ background:#fff; }
.bf-coupon-modal{ background:rgba(10,12,14,.5); }
/* woo error/notice chips sit fine; pagination current already handled */
/* legacy tuner eq bars (hidden in the header, keep inert) */
.eq{ display:none; }
/* checkout payment panel rides --bg2 (now #F4F5F6) — fine */
