/* ============================================================
   NUTOAST — Refined Homepage Design System
   Keeps the existing brand language (pistachio/olive green,
   cream, nut-brown, Fenix display + DM Sans body) and elevates
   it with a disciplined token system, rhythm, and motion.
   ============================================================ */

/* ----------  WEBFONT — Alimama FangYuanTi VF (rounded "方圆体", Latin subset,
   self-hosted, variable: wght 200–700 + BEVL 1–100 roundness)  ---------- */
@font-face {
  font-family: 'Alimama FangYuanTi';
  src: url('../fonts/AlimamaFangYuanTi-latin.woff2') format('woff2');
  font-weight: 200 700;
  font-style: normal;
  font-display: swap;
}

/* ----------  DESIGN TOKENS  ---------- */
:root {
  /* Brand palette (cleaned: dropped off-brand teal/blue) */
  --cream:        #fefff7;   /* page base            */
  --cream-2:      #f6f4e6;   /* alt section          */
  --sand:         #e9e7d3;   /* muted surface/border */
  --olive-ink:    #141604;   /* primary text         */
  --olive-deep:   #33370a;   /* headings / dark green */
  --olive:        #5a6322;   /* mid olive            */
  --olive-soft:   #677039;   /* secondary text — darkened from #757f41 2026-08:
                                the old value measured 3.72–4.28:1 on every ground
                                it is used against (card, panel, page), i.e. below
                                WCAG AA 4.5:1 for the small text it exists to set.
                                Same hue, one notch down; clears 4.58:1 worst case. */
  --avocado:      #666e13;   /* brand standard green - PANTONE 2307C (aiyangle green) */
  --lime:         #e7ea6b;   /* brand auxiliary yellow - PANTONE 386C (aiyangle yellow) */
  --lime-bright:  #d7dd2e;   /* accent hover         */
  --nut:          #8e7648;   /* nut brown            */
  --nut-soft:     #b79e74;

  /* Functional */
  --bg:           var(--cream);
  --text:         var(--olive-ink);
  --muted:        #6b6f54;
  --line:         rgba(20,22,4,.10);
  --line-soft:    rgba(20,22,4,.06);

  /* Typography — display matches the logo wordmark (geometric / Futura-style) */
  --font-display: 'Alimama FangYuanTi', 'Jost', system-ui, -apple-system, sans-serif;
  --font-body:    'Alimama FangYuanTi', 'DM Sans', system-ui, -apple-system, sans-serif;

  /* Fluid type scale */
  --fs-eyebrow: .72rem;
  --fs-body:    clamp(1rem, .96rem + .2vw, 1.075rem);
  --fs-lead:    clamp(1.1rem, 1rem + .5vw, 1.3rem);
  --fs-h4:      clamp(1.15rem, 1.05rem + .5vw, 1.4rem);
  --fs-h3:      clamp(1.5rem, 1.25rem + 1.1vw, 2.1rem);
  --fs-h2:      clamp(2rem, 1.5rem + 2.4vw, 3.4rem);
  --fs-hero:    clamp(2.1rem, 1.3rem + 2.3vw, 3.2rem);
  --fs-stat:    clamp(2.6rem, 1.8rem + 3vw, 4.2rem);

  /* Spacing scale (8pt) */
  --sp-1: .5rem;  --sp-2: 1rem;  --sp-3: 1.5rem;  --sp-4: 2rem;
  --sp-5: 3rem;   --sp-6: 4rem;  --sp-7: 6rem;    --sp-8: 8rem;
  --section-y: clamp(2.8rem, 1.8rem + 3.8vw, 4.6rem);

  /* Radii / shadows / motion */
  --r-sm: 10px; --r-md: 18px; --r-lg: 28px; --r-pill: 999px;
  --shadow-sm: 0 1px 2px rgba(20,22,4,.05), 0 4px 14px rgba(20,22,4,.05);
  --shadow-md: 0 6px 18px rgba(20,22,4,.07), 0 24px 50px rgba(20,22,4,.09);
  --shadow-lg: 0 12px 30px rgba(20,22,4,.10), 0 40px 80px rgba(45,50,8,.16);
  --ease: cubic-bezier(.22,.61,.36,1);
  --ease-out: cubic-bezier(.16,1,.3,1);

  --maxw: 1240px;
  --tb-h: 40px;   /* utility top bar height (0 on mobile) */
}

/* ----------  RESET  ---------- */
*,*::before,*::after { box-sizing: border-box; }
* { margin: 0; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; overflow-x: hidden; overflow-x: clip; }
body {
  font-family: var(--font-body);
  font-variation-settings: 'BEVL' 100; /* rounded "方圆" axis (1=square … 100=round); inherits site-wide. wght stays driven by font-weight. */
  font-size: var(--fs-body);
  line-height: 1.65;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  overflow-x: clip;
}
img,svg,video { display: block; max-width: 100%; height: auto; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; cursor: pointer; border: 0; background: none; }
ul { list-style: none; padding: 0; }
h1,h2,h3,h4 { font-family: var(--font-display); font-weight: 500; line-height: 1.08; letter-spacing: -.015em; color: var(--olive-deep); }
::selection { background: var(--lime); color: var(--olive-ink); }

/* Organic grain overlay for warmth/depth */
body::before {
  content: ""; position: fixed; inset: 0; z-index: 9999; pointer-events: none;
  opacity: .5; mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.035'/%3E%3C/svg%3E");
}

/* ----------  LAYOUT  ---------- */
.wrap { width: min(100% - 2.5rem, var(--maxw)); margin-inline: auto; }
.section { padding-block: var(--section-y); position: relative; }
.section--alt { background: var(--cream-2); }
.section--ink { background: var(--olive-deep); color: #efeedd; }
.section--ink h2,.section--ink h3 { color: #fff; }

/* ----------  SHARED HEADER BLOCK  ---------- */
.eyebrow {
  display: inline-flex; align-items: center; gap: .6rem;
  font-family: var(--font-body); font-size: var(--fs-eyebrow);
  font-weight: 600; letter-spacing: .22em; text-transform: uppercase;
  color: var(--olive-soft);
}
/* The decorative rule before (and after, when centred) every eyebrow was
   removed 2026-08 at the client's request. Dropping `content` is enough: with
   no generated box the flex `gap` contributes nothing either, so the label
   closes up on its own. The dozen `.x .eyebrow::before { background: ... }`
   overrides further down only ever recoloured this rule — with no content they
   generate nothing and are inert, so they are left in place rather than hunted
   down individually. */
.section-head { max-width: 720px; margin-bottom: clamp(1.5rem,3vw,2.6rem); }
.section-head.center { margin-inline: auto; text-align: center; }
/* A heading that needs a little more room than the 720px default. Measured:
   "Every show, planned and past" wants 784px and was breaking one word onto a
   second line. The paragraph keeps a readable measure of its own — widening the
   column for the heading must not stretch the body copy to match. */
.section-head--wide { max-width: 900px; }
.section-head--wide p { max-width: 62ch; }
.section-head h2 { font-size: var(--fs-h2); margin-top: 1rem; }
.section-head p { margin-top: 1rem; color: var(--muted); font-size: var(--fs-lead); }
.section--ink .section-head p { color: #c7cbab; }

/* highlight word inside a heading */
/* isolate gives .hl its own stacking context so the z-index:-1 bar can't sink
   behind the hero background once the h1's reveal transform settles to `none`. */
.hl { position: relative; white-space: nowrap; isolation: isolate; }
.hl::after {
  content: ""; position: absolute; left: -.04em; right: -.04em; bottom: .06em; height: .32em;
  background: var(--lime); z-index: -1; border-radius: 3px; opacity: .9;
  transform: skewX(-6deg) scaleX(1); transform-origin: left center;
  transition: transform .7s var(--ease-out) .5s;        /* draws in after the title lands */
}
/* hidden only while its revealed ancestor hasn't settled yet → draws in on reveal.
   .hl used outside a [data-reveal] (e.g. search highlights) stays visible. */
[data-reveal]:not(.in) .hl::after { transform: skewX(-6deg) scaleX(0); transition: none; }
@media (prefers-reduced-motion: reduce){ .hl::after { transition: none; } }

/* ----------  BUTTONS  ---------- */
.btn {
  --bg-btn: var(--avocado); --fg-btn: var(--cream);
  display: inline-flex; align-items: center; gap: .6rem;
  padding: .92em 1.5em; border-radius: var(--r-pill);
  font-weight: 600; font-size: .95rem; letter-spacing: .01em;
  background: var(--bg-btn); color: var(--fg-btn);
  transition: transform .35s var(--ease), box-shadow .35s var(--ease), background .35s var(--ease);
  will-change: transform;
}
.btn svg { width: 18px; height: 18px; transition: transform .35s var(--ease); }
.btn:hover { transform: translateY(-3px); box-shadow: 0 12px 28px rgba(45,50,8,.28); }
/* Only the TRAILING arrow travels. A leading action glyph that slides right on
   hover swims into its own label; nutoast_arrow() carries .ico-arrow precisely so
   the two can be told apart (a structural selector cannot — an <svg> after a bare
   text node still matches :first-child). */
.btn:hover .ico-arrow { transform: translateX(4px); }
.btn > svg:not(.ico-arrow) { opacity: .92; transition: opacity .3s var(--ease), transform .3s var(--ease); }
.btn:hover > svg:not(.ico-arrow) { opacity: 1; transform: scale(1.06); }
.btn--accent { --bg-btn: var(--lime); --fg-btn: var(--olive-ink); }
.btn--accent:hover { background: var(--lime-bright); }
.btn--ghost {
  --bg-btn: transparent; --fg-btn: var(--olive-deep);
  box-shadow: inset 0 0 0 1.5px var(--line);
}
.btn--ghost:hover { box-shadow: inset 0 0 0 1.5px var(--olive-deep); background: rgba(20,22,4,.03); }
.btn--lg { padding: 1.05em 1.9em; font-size: 1rem; }
.link-arrow { display: inline-flex; align-items: center; gap: .45rem; font-weight: 600; color: var(--olive); }
.link-arrow svg { width: 16px; transition: transform .3s var(--ease); }
.link-arrow:hover svg { transform: translateX(4px); }

/* ============================================================
   UTILITY TOP BAR (phone + social)
   ============================================================ */
.top-bar {
  position: fixed; top: var(--wpadminbar, 0px); left: 0; right: 0; z-index: 101; height: var(--tb-h);
  display: flex; align-items: center;
  background: var(--cream-2); border-bottom: 1px solid var(--line-soft);
  font-size: .82rem; color: var(--olive-soft);
}
.top-bar-inner { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.tb-item { display: inline-flex; align-items: center; gap: .42rem; color: var(--olive-soft); font-weight: 500; transition: color .2s var(--ease); }
.tb-item:hover { color: var(--olive-deep); }
.tb-item svg { width: 15px; height: 15px; flex: 0 0 auto; }
.tb-phone { font-weight: 600; color: var(--olive); }
/* phone <-> CTA rotator: grid-stacked items that fade & rise.

   SEQUENCED, not cross-faded. Both items share one grid cell, so a simple
   cross-fade had them legible on top of each other — measured at 4% of the time,
   the weaker one reaching 0.43 opacity, which reads as two lines of garbled text
   rather than as a transition ("+852 5128 5815" printed through "Bulk quote in
   24 hours"). The incoming item now waits for the outgoing one to finish
   leaving, so the cell only ever holds one readable message. */
.tb-rotator { position: relative; display: inline-grid; }
.tb-rotator .tb-rot__item {
  grid-area: 1 / 1; white-space: nowrap;
  opacity: 0; transform: translateY(65%); pointer-events: none;
  transition: opacity .26s var(--ease), transform .26s var(--ease);
}
.tb-rotator .tb-rot__item.is-active {
  opacity: 1; transform: none; pointer-events: auto;
  transition-delay: .3s;   /* > the .26s the outgoing one takes to clear */
}
.tb-cta { color: var(--olive); font-weight: 600; }
.tb-emoji { font-size: 1.05em; line-height: 1; }
@media (prefers-reduced-motion: reduce){ .tb-rotator .tb-rot__item { transition: none; } }
.tb-social { display: flex; align-items: center; gap: 1.15rem; }
@media (max-width: 1040px){
  .tb-social .tb-item span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); }
  .tb-social { gap: .95rem; }
}
@media (max-width: 768px){ :root { --tb-h: 0px; } .top-bar { display: none; } }
/* behaviour: "Show on scroll down" (default) — bar is hidden at the very top
   and slides in once the page is scrolled; header sits flush at top until then. */
.topbar-scroll .top-bar { transform: translateY(-100%); transition: transform .4s var(--ease); }
.topbar-scroll.is-scrolled .top-bar { transform: translateY(0); }
/* move the header with transform (not `top`) — animating `top` on a fixed,
   backdrop-filtered header leaves a stale composited "ghost" at the old position. */
.topbar-scroll .site-header { top: var(--wpadminbar, 0px); transition: transform .4s var(--ease), background .4s var(--ease), box-shadow .4s var(--ease), padding .4s var(--ease); }
.topbar-scroll.is-scrolled .site-header { transform: translateY(var(--tb-h)); }
@media (prefers-reduced-motion: reduce){ .topbar-scroll .top-bar, .topbar-scroll .site-header { transition: none; } }

/* ============================================================
   HEADER / NAV
   ============================================================ */
.site-header {
  position: fixed; top: calc(var(--tb-h, 0px) + var(--wpadminbar, 0px)); left: 0; right: 0; z-index: 100;
  transition: background .4s var(--ease), box-shadow .4s var(--ease), padding .4s var(--ease);
  padding-block: 1.1rem;
}
.site-header.scrolled {
  /* solid background (no backdrop-filter): the frosted blur produced a stale
     composited snapshot that ghosted whenever the header wasn't being repainted. */
  background: var(--cream);
  box-shadow: 0 1px 0 var(--line-soft), 0 10px 30px rgba(20,22,4,.05);
  padding-block: .7rem;
}
.nav { display: flex; align-items: center; justify-content: space-between; gap: 2rem; }
.brand { display: flex; align-items: center; gap: .55rem; }
/* leaf icon cropped from the real logo (wordmark below is clipped out) */
.brand-mark { width: 42px; height: 42px; flex: 0 0 auto;
  background-color: var(--avocado);
  -webkit-mask: url("../images/leaf-mark.png") no-repeat center / contain;
  mask: url("../images/leaf-mark.png") no-repeat center / contain; }
/* leaf colour adapts per context, like the wordmark */
.dark-hero .site-header:not(.scrolled) .brand-mark { background-color: var(--lime); }
.footer-brand .brand-mark { background-color: var(--lime); }
.mobile-nav__head .brand-mark { background-color: var(--avocado); }
.brand .wordmark { font-family: var(--font-display); font-size: 1.6rem; font-weight: 500;
  color: var(--avocado); letter-spacing: .005em; text-transform: lowercase; }
.nav-menu { display: flex; align-items: center; gap: .35rem; }
.nav-menu > li > a {
  display: inline-flex; align-items: center; gap: .3rem; padding: .55rem .85rem;
  border-radius: var(--r-pill); font-weight: 500; font-size: .95rem; color: var(--olive-ink);
  transition: background .25s var(--ease), color .25s var(--ease);
}
/* Hover and current-page share one mark: a lime rule that draws out from the
   centre of the word. Hover plays it, the current section holds it — so "where
   can I go" and "where am I" are the same vocabulary rather than two inventions.
   It also has to work on both headers: the masthead is transparent over the dark
   hero, where the old rgba(20,22,4,.05) wash was darkening an already-dark
   surface and was effectively invisible. Lime reads on both grounds. */
.nav-menu > li > a { position: relative; }
.nav-menu > li > a::after {
  content: ""; position: absolute; bottom: .3rem; left: 50%; right: 50%; height: 2px;
  border-radius: 2px; background: var(--lime-bright, var(--lime)); opacity: 0;
  transition: left .32s var(--ease), right .32s var(--ease), opacity .32s var(--ease);
}
.nav-menu > li > a:hover::after,
.nav-menu > li.is-current > a::after { left: .85rem; right: .85rem; opacity: 1; }

/* No background wash on hover. A translucent rounded box behind the word reads
   as a stray grey panel on the dark header — square-cornered against a site
   whose whole vocabulary is pills, and competing with the lime rule that is
   already saying the same thing. The rule alone is the hover state; the colour
   shift is all the reinforcement it needs. */
.nav-menu > li > a:hover { color: var(--olive-deep); }
.dark-hero .site-header:not(.scrolled) .nav-menu > li > a:hover { color: #fff; }

/* The current section is legible without hovering: the rule stays, and the label
   carries a little more weight. Not a colour change — on the dark header there is
   no darker olive to go to. */
.nav-menu > li.is-current > a { font-weight: 600; }

/* The NEW bubble rides on the item, so it should move with it rather than sit
   there while the pill lights up underneath. */
.nav-menu > li.has-new > a .nt-flag { transition: transform .25s var(--ease); }
.nav-menu > li.has-new > a:hover .nt-flag { transform: translateY(-1px) scale(1.04); }

@media (prefers-reduced-motion: reduce) {
  .nav-menu > li > a::after { transition: opacity .2s linear; }
  .nav-menu > li > a:hover::after, .nav-menu > li.is-current > a::after { left: .85rem; right: .85rem; }
  .nav-menu > li.has-new > a:hover .nt-flag { transform: none; }
}
.nav-menu .caret { width: 12px; opacity: .6; }
.nav-actions { display: flex; align-items: center; gap: .7rem; }
.nav-actions .btn { white-space: nowrap; }
.nav-toggle { display: none; width: 44px; height: 44px; border-radius: 12px; }
.nav-toggle span { display:block; width: 22px; height: 2px; background: var(--olive-ink); margin: 4px auto; transition: .3s var(--ease); }

@media (max-width: 1080px) {
  .nav-menu, .nav-actions .btn--ghost { display: none; }
  .nav-toggle { display: block; }
}
/* phones: drop the topbar CTA too — clean logo + hamburger; both CTAs live in the drawer */
@media (max-width: 768px) {
  .nav-actions .btn--accent { display: none; }
}

/* Mobile drawer */
.mobile-nav {
  position: fixed; inset: 0 0 0 auto; width: min(86vw, 380px); z-index: 110;
  background: var(--cream); box-shadow: var(--shadow-lg);
  transform: translateX(100%); visibility: hidden; transition: transform .5s var(--ease-out), visibility 0s linear .5s;
  padding: 6rem 2rem 2rem; display: flex; flex-direction: column; gap: .25rem;
}
.mobile-nav.open { transform: translateX(0); visibility: visible; transition: transform .5s var(--ease-out), visibility 0s; }
.mobile-nav a { padding: .9rem .5rem; font-size: 1.15rem; font-family: var(--font-display); border-bottom: 1px solid var(--line-soft); }
.mobile-nav .btn { margin-top: 1.5rem; justify-content: center; }
.nav-scrim { position: fixed; inset: 0; background: rgba(20,22,4,.4); opacity: 0; visibility: hidden; transition: .4s; z-index: 105; }
.nav-scrim.open { opacity: 1; visibility: visible; }

/* ============================================================
   HERO
   ============================================================ */
.hero { position: relative; padding-top: clamp(8rem, 12vw, 11rem); padding-bottom: var(--hero-gap, 48px); overflow: clip; }
/* phones get ~2/3 of the desktop gap — the band below is full-bleed and reads closer there */
@media (max-width: 768px) { .hero { padding-bottom: calc(var(--hero-gap, 48px) * .66); } }
.hero::before {
  content: ""; position: absolute; inset: 0; z-index: -2;
  background:
    radial-gradient(60% 55% at 85% 18%, rgba(231,234,107,.45), transparent 60%),
    radial-gradient(50% 50% at 8% 90%, rgba(158,167,0,.16), transparent 60%);
}
.hero-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(2rem,4vw,4rem); align-items: center; }
.hero h1 { font-size: var(--fs-hero); letter-spacing: -.02em; line-height: 1.06; text-wrap: balance; }
.hero .est { margin-bottom: 1.4rem; }
.hero-lead { margin-top: 1.6rem; max-width: 33ch; color: var(--muted); font-size: var(--fs-lead); }
.hero-cta { display: flex; flex-wrap: wrap; gap: .9rem; margin-top: 2.2rem; }
.hero-trust { margin-top: clamp(1.8rem, 3vw, 2.4rem); color: var(--olive-soft); }
.hero-trust__facts { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem .85rem; margin: 0; font-size: .9rem; }
.hero-trust__facts > span + span::before { content: ""; display: inline-block; width: 5px; height: 5px; margin-right: .8rem; border-radius: 50%; background: var(--avocado); opacity: .55; vertical-align: .16em; }
.hero-trust__facts strong { font-family: var(--font-display); font-weight: 600; font-size: 1.06em; color: var(--olive-deep); }
.hero-trust__certs { margin: .55rem 0 0; font-size: .72rem; line-height: 1.75; letter-spacing: .01em; color: var(--olive-soft); opacity: .8; }
/* Mobile: the 4 trust items (3 stats + a long cert list) can't share a row — stack them
   as a clean bulleted list so the certs wrap full-width instead of in a narrow column. */
@media (max-width: 768px) {
  /* eyebrow: long uppercase label can't fit one line — let it wrap, dash stays inline */
  .hero .eyebrow { display: block; white-space: normal; font-size: .6rem; letter-spacing: .07em; line-height: 1.5; }
  .hero .eyebrow::before { display: inline-block; vertical-align: middle; margin-right: .5rem; }
  /* CTAs: stack full-width so "Request Quote" never overflows the viewport */
  .hero-cta { gap: .7rem; margin-top: 1.9rem; }
  .hero-cta .btn { flex: 1 1 100%; justify-content: center; }
  /* trust: the certs now live on their own muted tier, so the claims stay inline */
  .hero-trust { margin-top: 1.7rem; }
  .hero-trust__facts { gap: .3rem .65rem; font-size: .84rem; }
  .hero-trust__certs { font-size: .67rem; line-height: 1.7; }
}

.hero-visual { position: relative; }
.hero-visual .frame {
  position: relative; border-radius: var(--r-lg); overflow: hidden;
  box-shadow: var(--shadow-lg); aspect-ratio: 4/4.4; background: var(--sand);
}
.hero-visual .frame img { width: 100%; height: 100%; object-fit: cover; }
.hero-badge {
  position: absolute; left: -1.5rem; bottom: 1.8rem; z-index: 3;
  background: var(--cream); border-radius: var(--r-md); padding: 1rem 1.2rem;
  box-shadow: var(--shadow-md); display: flex; align-items: center; gap: .85rem;
  border: 1px solid var(--line-soft);
}
.hero-badge .ring { width: 46px; height: 46px; border-radius: 50%; display: grid; place-items: center;
  background: var(--lime); font-family: var(--font-display); font-size: 1.1rem; color: var(--olive-deep); }
.hero-badge b { font-family: var(--font-display); font-size: 1.15rem; color: var(--olive-deep); display: block; line-height: 1; }
.hero-badge span { font-size: .78rem; color: var(--muted); }
.hero-leaf { position: absolute; z-index: -1; opacity: .5; }

@media (max-width: 880px) {
  .hero-grid { grid-template-columns: 1fr; }
  .hero-visual { order: -1; max-width: 460px; }
}

/* ---- Hero layout modes ---- */
/* A) full-bleed image background (default): image bleeds in from the right,
      cream gradient on the left keeps the text crisp. */
.hero--bg { min-height: clamp(480px, 72vh, 720px);
  background-image:
    linear-gradient(to top, var(--cream) 0, rgba(254,255,247,0) 150px),
    linear-gradient(100deg, var(--cream) 0%, var(--cream) 30%, rgba(254,255,247,.82) 44%, rgba(254,255,247,.18) 62%, rgba(254,255,247,0) 76%),
    var(--hero-img, none);
  background-size: 100% 100%, cover, 160% auto;
  background-position: center, center, right bottom;
  background-repeat: no-repeat;
}
.hero--bg::before { display: none; }
.hero--bg .hero-grid { grid-template-columns: 1fr; }
.hero--bg .hero-copy { max-width: 600px; }
@media (max-width: 768px){
  .hero--bg { min-height: 0;
    background-image: linear-gradient(rgba(254,255,247,.74), rgba(254,255,247,.74)), var(--hero-img, none);
    background-size: cover, cover;
    background-position: center;
  }
  .hero--bg .hero-copy { max-width: none; }
}
/* B) split, no card: plain image, no frame/shadow/badge */
.hero--split .hero-visual .frame { box-shadow: none; border-radius: var(--r-md); }

/* ============================================================
   STATS BAR
   ============================================================ */
/* frameless band on a FRESH, living pistachio-green gradient — the colour flows
   horizontally while a soft lime/white aurora drifts on top; dark-on-light text. */
.stats {
  /* The top edge is a POUR of pistachio paste, not a ruled line. The curve is a
     MASK on this element (not an SVG laid over it) so it cuts the real animated
     gradient — a static overlay would drift out of sync with statsFlow and show
     a seam. Layer 1 = the curve, stretched to 100% x a FIXED height so the band
     getting taller on mobile can't deepen the dip; layer 2 = everything below it. */
  --pour-h: clamp(30px, 3.8vw, 60px);
  position: relative; overflow: hidden;
  background: linear-gradient(115deg, #5d6611 0%, #666e13 24%, #71791a 48%, #5a6312 74%, #666e13 100%);
  background-size: 240% 240%;
  animation: statsFlow 22s ease-in-out infinite;
  -webkit-mask-image: url('data:image/svg+xml;utf8,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 1440 100%22 preserveAspectRatio=%22none%22><path d=%22M0,72 C150,72 230,16 470,12 C710,8 830,52 1080,62 C1250,69 1350,60 1440,52 L1440,100 L0,100 Z%22/></svg>'), linear-gradient(#000, #000);
          mask-image: url('data:image/svg+xml;utf8,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 1440 100%22 preserveAspectRatio=%22none%22><path d=%22M0,72 C150,72 230,16 470,12 C710,8 830,52 1080,62 C1250,69 1350,60 1440,52 L1440,100 L0,100 Z%22/></svg>'), linear-gradient(#000, #000);
  -webkit-mask-repeat: no-repeat, no-repeat;
          mask-repeat: no-repeat, no-repeat;
  -webkit-mask-position: top center, bottom center;
          mask-position: top center, bottom center;
  /* +1px kills a sub-pixel hairline between the two mask layers */
  -webkit-mask-size: 100% var(--pour-h), 100% calc(100% - var(--pour-h) + 1px);
          mask-size: 100% var(--pour-h), 100% calc(100% - var(--pour-h) + 1px);
}
/* Lime sheen riding the pour edge — the gloss on poured nut butter. It lives
   INSIDE the masked element on purpose: its outer half is clipped away by the
   same curve, so what is left sits exactly on the paste surface. */
.stats__sheen { position: absolute; left: 0; top: 0; width: 100%; height: var(--pour-h); z-index: 1; pointer-events: none; }
.stats > .wrap { position: relative; z-index: 2; }
.stats::before {
  content: ""; position: absolute; inset: -30%; z-index: 0; pointer-events: none;
  background:
    radial-gradient(46% 58% at 20% 28%, rgba(231,234,107,.22), transparent 60%),
    radial-gradient(48% 60% at 82% 72%, rgba(231,234,107,.16), transparent 62%),
    radial-gradient(40% 52% at 56% 50%, rgba(255,255,255,.07), transparent 66%);
  mix-blend-mode: soft-light;
  animation: statsAurora 28s ease-in-out infinite alternate;
  will-change: transform;
}
@keyframes statsFlow {
  0%, 100% { background-position: 0% 50%; }
  50%      { background-position: 100% 50%; }
}
@keyframes statsAurora {
  0%   { transform: translate3d(-3%, -2%, 0) scale(1.05) rotate(.3deg); }
  100% { transform: translate3d(4%, 3%, 0) scale(1.16) rotate(-.4deg); }
}
@media (prefers-reduced-motion: reduce){
  .stats { animation: none; }
  .stats::before { animation: none; }
}
/* fresh light band ⇒ dark-on-light text (scoped to .stats; Resources' --ink band keeps lime) */
.stats .stat .num { color: var(--lime); }
.stats .stat .num .plus { color: #fff; }
.stats .stat .label { color: rgba(231,234,107,.82); }
.stats .stat + .stat::before { background: linear-gradient(to bottom, transparent, rgba(231,234,107,.3), transparent); }
.stats .wrap { position: relative; z-index: 1; }
.stats-grid { display: grid; grid-template-columns: repeat(4,1fr); }
.stat { background: transparent; padding: clamp(1rem,2vw,1.5rem) 1rem; text-align: center; position: relative; }
.stat + .stat::before {
  content: ""; position: absolute; left: 0; top: 24%; bottom: 24%; width: 1px;
  background: linear-gradient(to bottom, transparent, rgba(255,255,255,.14), transparent);
}
.stat .num { font-family: var(--font-display); font-size: var(--fs-stat); color: var(--lime); line-height: 1; }
.stat .num .plus { color: #fff; }
.stat .label { margin-top: .45rem; color: #c7cbab; font-size: .92rem; letter-spacing: .02em; }
@media (max-width: 680px){ .stats-grid { grid-template-columns: repeat(2,1fr); } .stat + .stat::before { display: none; } }

/* ============================================================
   INDUSTRIES — "Who Choose Nutoast?"
   ============================================================ */
#industries { padding-block: clamp(1.8rem, 3.4vw, 2.9rem); }
#industries .section-head { margin-bottom: clamp(1rem, 2.3vw, 1.6rem); }
#industries .section-head h2 { margin-top: .5rem; }
#industries .section-head p { margin-top: .55rem; }
.ind-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 1.4rem; }
.ind-card {
  position: relative; border-radius: var(--r-lg); overflow: hidden; aspect-ratio: 4/4.4;
  box-shadow: var(--shadow-sm); isolation: isolate; background: var(--sand);
}
.ind-card img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease-out); }
.ind-card::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(20,22,4,.82) 0%, rgba(20,22,4,.18) 50%, transparent 78%); }
.ind-card .meta { position: absolute; left: 1.3rem; right: 1.3rem; bottom: 1.3rem; z-index: 2; color: #fff; }
.ind-card .meta h3 { color: #fff; font-size: 1.45rem; }
.ind-card .meta p { font-size: .88rem; color: rgba(255,255,255,.78); margin-top: .25rem; max-height: 0; opacity: 0; overflow: hidden; transition: max-height .5s var(--ease), opacity .4s var(--ease); }
.ind-card .tag { position: absolute; top: 1.1rem; left: 1.1rem; z-index: 2; background: rgba(231,234,107,.92); color: var(--olive-ink); font-size: .72rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; padding: .35rem .7rem; border-radius: var(--r-pill); }
.ind-card:hover img { transform: scale(1.07); }
.ind-card:hover .meta p { max-height: 11rem; opacity: 1; }
@media (max-width: 900px){ .ind-grid { grid-template-columns: repeat(2,1fr);} }
@media (max-width: 520px){ .ind-grid { gap: 1rem; } }

/* ============================================================
   WHAT WE SUPPLY
   ============================================================ */
/* three equal product cards (image + footer), uniform height */
.supply-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 1.6rem; }
.supply-card {
  border-radius: var(--r-lg); background: var(--cream); border: 1px solid var(--line-soft);
  box-shadow: var(--shadow-sm); overflow: hidden; display: flex; flex-direction: column; position: relative;
  transition: transform .5s var(--ease), box-shadow .5s var(--ease);
}
.supply-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); }
.supply-card__link::after { content: ""; position: absolute; inset: 0; z-index: 1; }
.supply-card:hover .link-arrow svg { transform: translateX(4px); }
.supply-card .ph { aspect-ratio: 1/1; overflow: hidden; background: var(--sand); }
.supply-card .ph img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease-out); }
.supply-card:hover .ph img { transform: scale(1.06); }
.supply-card .pad { padding: 1.5rem 1.6rem 1.7rem; display: flex; flex-direction: column; flex: 1; }
.supply-card h3 { font-size: 1.5rem; color: var(--olive-deep); }
.supply-card p { color: var(--muted); font-size: .94rem; margin-top: .5rem; }
.supply-card .link-arrow { margin-top: auto; padding-top: 1.1rem; }
@media (max-width: 880px){ .supply-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px){ .supply-grid { grid-template-columns: 1fr; } }

/* ============================================================
   SPLIT BLOCKS (Application Support / Quality)
   ============================================================ */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(2rem,4vw,4.5rem); align-items: center; }
.split.reverse .split-media { order: 2; }
.split-media { border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-md); aspect-ratio: 5/4; background: var(--sand); position: relative; }
.split-media img { width: 100%; height: 100%; object-fit: cover; }
.split h2 { font-size: var(--fs-h2); margin-top: 1rem; }
.split p.lead { margin-top: 1rem; color: var(--muted); font-size: var(--fs-lead); }
.feature-list { margin-top: 1.6rem; display: grid; gap: .9rem; }
.feature-list li { display: flex; gap: .8rem; align-items: flex-start; }
.feature-list .ic { flex: 0 0 28px; width: 28px; height: 28px; border-radius: 8px; background: var(--lime); display: grid; place-items: center; color: var(--olive-deep); }
.feature-list .ic svg { width: 16px; }
.feature-list b { color: var(--olive-deep); font-family: var(--font-display); font-size: 1.05rem; font-weight: 400; }
.feature-list span { color: var(--muted); font-size: .92rem; }
.split .btn { margin-top: 2rem; }
@media (max-width: 820px){ .split { grid-template-columns: 1fr; } .split.reverse .split-media{ order: -1; } }

/* fade carousel (reusable; used inside .split-media) */
.nut-carousel { position: absolute; inset: 0; }
.nut-carousel__track { position: absolute; inset: 0; }
.nut-carousel__slide { position: absolute; inset: 0; opacity: 0; transition: opacity .9s var(--ease); }
.nut-carousel__slide.is-active { opacity: 1; }
.nut-carousel__slide img { width: 100%; height: 100%; object-fit: cover; }
.nut-carousel__dots { position: absolute; left: 0; right: 0; bottom: 1rem; z-index: 2; display: flex; gap: .5rem; justify-content: center; }
.nut-carousel__dots button { width: 9px; height: 9px; padding: 0; border-radius: 50%; background: rgba(255,255,255,.6); box-shadow: 0 1px 3px rgba(20,22,4,.25); cursor: pointer; transition: width .3s var(--ease), background .3s var(--ease); }
.nut-carousel__dots button:hover { background: #fff; }
.nut-carousel__dots button.is-active { width: 26px; border-radius: 5px; background: var(--lime); }
/* synced copy track — grid-stack so the column holds the tallest slide (no jump on change) */
.support-copy { display: grid; }
.support-copy .support-slide { grid-area: 1 / 1; opacity: 0; pointer-events: none; transform: translateY(10px); transition: opacity .5s var(--ease), transform .5s var(--ease); }
.support-copy .support-slide.is-active { opacity: 1; pointer-events: auto; transform: none; }
@media (prefers-reduced-motion: reduce){ .support-copy .support-slide { transition: none; } }
@media (prefers-reduced-motion: reduce){ .nut-carousel__slide { transition: none; } }

/* Beyond Ingredients: portrait product-poster carousel (1080x1420 -> exact 54/71, no crop) */
#support .split-media { aspect-ratio: 54 / 71; width: 100%; max-width: 520px; margin-left: auto; background: var(--cream-2); }
@media (max-width: 820px){ #support .split-media { margin-inline: auto; } }

/* certificate showcase — unframed, full-width fan on the cream ground */
#quality .cert-showcase { margin-top: clamp(1.4rem, 3vw, 2.6rem); }
#quality .cert-showcase img { display: block; width: 100%; max-width: 1180px; height: auto; margin-inline: auto; }

/* ============================================================
   WORLDWIDE REACH
   ============================================================ */
/* light, centered, full-bleed map — the transparent PNG/WebP dissolves into the cream ground */
.reach { background: #f6f7ed; }
.reach-map { margin-top: clamp(1.4rem, 3vw, 2.6rem); }
.reach-map img { display: block; width: 100%; max-width: 1160px; height: auto; margin-inline: auto; }

/* ============================================================
   HOW WE WORK — 2×2 process cards (number · title · copy · photo)
   ============================================================ */
.how-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(2rem,4vw,3.4rem) clamp(1.8rem,4vw,3.6rem); }
.how-card { display: flex; flex-direction: column; }
.how-card .idx { font-family: var(--font-display); font-size: clamp(1.3rem,2vw,1.6rem); color: var(--olive-soft); letter-spacing: .1em; opacity: .7; }
.how-card h3 { font-size: clamp(1.35rem,2.2vw,1.8rem); margin: .3rem 0 .6rem; }
.how-card p { color: var(--muted); font-size: 1rem; line-height: 1.6; max-width: 50ch; margin-bottom: clamp(1.1rem,2vw,1.6rem); }
.how-media { margin-top: auto; border-radius: var(--r-lg); overflow: hidden; aspect-ratio: 5/3; background: var(--sand); box-shadow: var(--shadow-md); }
.how-media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .8s var(--ease-out); }
.how-card:hover .how-media img { transform: scale(1.05); }
@media (max-width: 760px){ .how-grid { grid-template-columns: 1fr; gap: clamp(1.8rem,6vw,2.4rem); } }

/* ============================================================
   TRADE SHOWS — "Where You Can Meet Us"
   ============================================================ */
.shows { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 280px)); justify-content: center; gap: 1.2rem; }
.show {
  position: relative; border-radius: var(--r-md); overflow: hidden; aspect-ratio: 3/4;
  box-shadow: var(--shadow-sm); background: var(--sand);
}
.show img { width:100%; height:100%; object-fit: cover; transition: transform .7s var(--ease-out); }
.show::after { content:""; position:absolute; inset:0; background: linear-gradient(to top, rgba(20,22,4,.78), transparent 55%); }
.show .meta { position: absolute; left: 1rem; bottom: 1rem; right: 1rem; z-index: 2; color:#fff; }
.show .meta .city { display: flex; align-items: center; gap: .45rem; font-family: var(--font-display); font-size: 1.2rem; line-height: 1.15; }
.show .meta .city .pin { width: 1em; height: 1em; flex: none; color: var(--lime); }
.show .meta .city .flag { width: 1.4em; height: auto; flex: none; margin-left: .15rem; border-radius: 2px; box-shadow: 0 0 0 1px rgba(255,255,255,.4); }
.show .meta .date { font-size: .8rem; color: rgba(255,255,255,.8); }
.show--ph { background: linear-gradient(160deg, var(--olive), var(--olive-deep)); }
.show:hover img { transform: scale(1.06); }

/* ONE upcoming show — a lone centred card looks lost, so feature it: heading +
   intro + CTA on the left, the show card enlarged on the right, vertically
   balanced. Falls back to the centred grid automatically once there are 2+. */
#shows.shows--single .wrap {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(300px, 360px);
  grid-template-areas: "head card" "cta card";
  column-gap: clamp(2.5rem, 6vw, 6rem);
  align-items: center;
  align-content: center;
}
#shows.shows--single .section-head { grid-area: head; margin: 0 0 1.6rem; max-width: none; align-self: end; }
#shows.shows--single .shows { grid-area: card; display: block; }
#shows.shows--single .show { width: 100%; max-width: 360px; margin: 0 auto; box-shadow: var(--shadow-md); }
#shows.shows--single .shows-cta { grid-area: cta; justify-content: flex-start; margin: 0; align-self: start; }
@media (max-width: 860px) {
  #shows.shows--single .wrap { grid-template-columns: 1fr; grid-template-areas: "head" "card" "cta"; justify-items: center; }
  #shows.shows--single .section-head { text-align: center; align-self: auto; margin-bottom: 0; }
  #shows.shows--single .show { max-width: 320px; }
  #shows.shows--single .shows { margin-top: clamp(1.6rem, 4vw, 2.2rem); width: 100%; }
  #shows.shows--single .shows-cta { justify-content: center; margin-top: clamp(1.4rem, 3.5vw, 2rem); }
}
@media (max-width: 860px){ .shows { grid-template-columns: 1fr 1fr; } }

/* ============================================================
   UPCOMING TRADE-SHOW CARD (inside the hero, under the numbers)
   ============================================================ */
.showbar { display: flex; align-items: center; gap: .85rem; margin-top: 1.5rem; padding: .7rem .9rem;
  /* it's a <button> (opens the invitation modal) -> undo the UA button styling */
  -webkit-appearance: none; appearance: none; width: 100%; text-align: left; font: inherit; cursor: pointer;
  border-radius: var(--r-md); background: rgba(20,22,4,.72); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border: 1px solid rgba(255,255,255,.14); color: #fff; text-decoration: none; max-width: 100%;
  transition: transform .3s var(--ease), background .3s var(--ease), border-color .3s var(--ease); }
.showbar:hover { transform: translateY(-2px); background: rgba(20,22,4,.84); border-color: rgba(231,234,107,.55); }
.showbar:focus-visible { outline: 2px solid var(--lime); outline-offset: 3px; }
.showbar__poster { flex: 0 0 auto; width: 46px; border-radius: 6px; overflow: hidden; line-height: 0; box-shadow: 0 4px 12px rgba(0,0,0,.38); }
.showbar__poster img { width: 100%; height: auto; display: block; }
.showbar__poster--multi { position: relative; }
.showbar__poster--multi img { transition: opacity .9s var(--ease); }
.showbar__poster--multi img:not(:first-child) { position: absolute; inset: 0; height: 100%; object-fit: cover; }
.showbar__poster--multi img { opacity: 0; }
.showbar__poster--multi img.is-on { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .showbar__poster--multi img { transition: none; } }
.showbar__body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: .14rem; }
.showbar__badge { font-family: var(--font-body); font-size: .54rem; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: var(--olive-ink); background: var(--lime); padding: .16rem .5rem; border-radius: var(--r-pill); }
.showbar__line { font-family: var(--font-display); font-weight: 500; font-size: .98rem; line-height: 1.2; }
.showbar__city { display: flex; align-items: center; gap: .3rem; font-size: .76rem; color: rgba(255,255,255,.72); }
.showbar__city .pin { width: 1em; height: 1em; flex: none; color: var(--lime); }
.showbar__city .flag { width: 1.2em; height: auto; flex: none; border-radius: 2px; box-shadow: 0 0 0 1px rgba(255,255,255,.35); }
.showbar__go { flex: 0 0 auto; display: inline-flex; align-items: center; gap: .35rem; color: var(--lime); font-size: .78rem; font-weight: 600; }
.showbar__go svg { width: 16px; height: 16px; transition: transform .3s var(--ease); }
.showbar:hover .showbar__go svg { transform: translateX(3px); }
@media (max-width: 560px){
  .showbar { gap: .7rem; padding: .6rem .7rem; }
  .showbar__poster { width: 40px; }
  .showbar__line { font-size: .9rem; }
  .showbar__go-label { display: none; }   /* keep just the arrow on small screens */
}

/* ============================================================
   FINAL CTA
   ============================================================ */
/* full-bleed band — animated olive gradient, no card/window */
.cta-band {
  position: relative; overflow: clip; isolation: isolate; text-align: center; color: #fff;
  background: linear-gradient(115deg, var(--avocado) 0%, #6f7a17 48%, var(--olive-deep) 100%);
  padding-block: clamp(3.5rem,8vw,6.5rem);
}
.cta-band::before {
  content:""; position:absolute; inset:-30%; z-index:-1; pointer-events:none;
  background:
    radial-gradient(38% 50% at 18% 24%, rgba(231,234,107,.34), transparent 60%),
    radial-gradient(40% 52% at 84% 14%, rgba(215,221,46,.24), transparent 60%),
    radial-gradient(50% 60% at 72% 82%, rgba(20,22,4,.50), transparent 64%),
    radial-gradient(46% 56% at 26% 90%, rgba(158,167,0,.30), transparent 62%);
  animation: ctaMesh 24s ease-in-out infinite alternate;
}
@keyframes ctaMesh {
  0%   { transform: translate3d(-2%,-1.5%,0) scale(1.05) rotate(.3deg); }
  100% { transform: translate3d(2.5%,2%,0) scale(1.16) rotate(-.45deg); }
}
.cta-card { position: relative; text-align: center; }
.cta-card .eyebrow::before, .cta-card .eyebrow::after { background: var(--lime); }
.cta-card h2 { color:#fff; font-size: var(--fs-h2); }
.cta-card p { color: rgba(255,255,255,.88); max-width: 52ch; margin: 1rem auto 0; }
.cta-card .hero-cta { justify-content: center; margin-top: 2.2rem; }
@media (prefers-reduced-motion: reduce){ .cta-band::before { animation: none; } }

/* brand video — poster + click-to-play */
.video-section .section-head { margin-inline: auto; }
.video-player { position: relative; max-width: 980px; margin-inline: auto; border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-lg); aspect-ratio: 16 / 9; background: #000; isolation: isolate; }
.video-player video { width: 100%; height: 100%; object-fit: cover; display: block; }
.video-play { position: absolute; inset: 0; display: grid; place-items: center; background: linear-gradient(rgba(20,22,4,.12), rgba(20,22,4,.36)); border: 0; cursor: pointer; transition: opacity .4s var(--ease); z-index: 2; }
.video-play span { width: clamp(58px,7vw,80px); aspect-ratio: 1; border-radius: 50%; background: var(--lime); display: grid; place-items: center; box-shadow: 0 12px 34px rgba(0,0,0,.4); transition: transform .3s var(--ease); }
.video-play span::before { content: ""; width: 0; height: 0; margin-left: 6px; border-style: solid; border-width: 12px 0 12px 21px; border-color: transparent transparent transparent var(--olive-ink); }
.video-play:hover span { transform: scale(1.08); }
.video-player.is-playing .video-play { opacity: 0; pointer-events: none; }

/* ============================================================
   ABOUT PAGE
   ============================================================ */
.about-hero h1 { max-width: 18ch; }
.about-hero .lead { max-width: 60ch; }
.about-intro { margin-top: 1.4rem; max-width: 66ch; color: #c7cbab; }
.about-intro p { margin-bottom: .8rem; }

/* icon cards (Why Nutoast / Operational Support) */
.icard-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: clamp(1rem,2.2vw,1.6rem); }
.icard { background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: clamp(1.3rem,2.4vw,1.8rem); box-shadow: var(--shadow-sm); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.icard:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.icard__ic { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 14px; background: var(--lime); color: var(--olive-ink); margin-bottom: 1rem; }
.icard__ic svg { width: 24px; height: 24px; }
.icard h3 { font-size: 1.15rem; margin-bottom: .4rem; }
.icard p { color: var(--muted); font-size: .94rem; line-height: 1.6; }
.icard-grid--2 { grid-template-columns: 1fr 1fr; }
.icard--wide { display: flex; gap: 1.1rem; align-items: flex-start; }
.icard--wide .icard__ic { margin-bottom: 0; flex: 0 0 auto; }
@media (max-width: 900px){ .icard-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px){ .icard-grid, .icard-grid--2 { grid-template-columns: 1fr; } }

/* ingredient transformation flow */
.flow { display: grid; grid-template-columns: repeat(5,1fr); gap: 1rem; position: relative; list-style: none; padding: 0; margin: 0; }
.flow::before { content:""; position:absolute; top: 34px; left: 9%; right: 9%; height:2px; background: repeating-linear-gradient(to right, var(--avocado) 0 8px, transparent 8px 16px); opacity:.5; }
.flow__step { text-align: center; position: relative; }
.flow__node { width: 68px; height: 68px; margin: 0 auto 1.1rem; border-radius: 50%; background: var(--cream); border: 1px solid var(--line); display: grid; place-items: center; box-shadow: var(--shadow-sm); color: var(--olive); position: relative; z-index: 1; transition: transform .4s var(--ease); }
.flow__node svg { width: 28px; height: 28px; }
.flow__step:hover .flow__node { transform: translateY(-4px); }
.flow__step h3 { font-size: 1.05rem; margin-bottom: .3rem; }
.flow__step p { color: var(--muted); font-size: .86rem; line-height: 1.5; }
@media (max-width: 860px){ .flow { grid-template-columns: repeat(3,1fr); } .flow::before { display:none; } }
@media (max-width: 480px){ .flow { grid-template-columns: 1fr 1fr; } }

/* awards strip */
.awards-strip { margin-top: clamp(1.4rem,3vw,2.4rem); }
.awards-strip img { display: block; width: 100%; max-width: 1000px; height: auto; margin-inline: auto; }

/* ============================================================
   PRODUCTS HERO — blurred, performance-gated background video
   ============================================================ */
.phero { position: relative; isolation: isolate; overflow: clip; display: grid; align-items: center; min-height: clamp(440px, 74vh, 700px); padding-block: clamp(8rem,12vw,11rem) clamp(3rem,6vw,5rem); }
.phero__bg { position: absolute; inset: 0; z-index: -2; }
.phero__bg img, .phero__bg video { position: absolute; inset: -4%; width: 108%; height: 108%; object-fit: cover; filter: blur(11px) saturate(1.06) brightness(.92); }
/* products hero: a bit sharper than the (heavily-overlaid) about hero */
.phero:not(.about-phero) .phero__bg img, .phero:not(.about-phero) .phero__bg video { filter: blur(5px) saturate(1.08) brightness(.94); }
.phero__bg video { z-index: 1; }
.phero::after { content:""; position:absolute; inset:0; z-index:-1; background: linear-gradient(102deg, rgba(20,22,4,.86) 0%, rgba(20,22,4,.6) 48%, rgba(51,55,10,.48) 100%); }
.phero .eyebrow { color: var(--lime); }
.phero .eyebrow::before { background: var(--lime); }
.phero h1 { color: #fff; font-size: var(--fs-hero); letter-spacing: -.02em; line-height: 1.06; text-wrap: balance; max-width: 18ch; margin-top: .9rem; }
.phero .lead { color: rgba(255,255,255,.9); max-width: 56ch; margin-top: 1.1rem; font-size: var(--fs-lead); }
.phero .hero-cta { margin-top: 1.9rem; }
.btn--ghost-light { --bg-btn: transparent; --fg-btn: #fff; box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.55); }
.btn--ghost-light:hover { box-shadow: inset 0 0 0 1.5px #fff; background: rgba(255,255,255,.1); }
/* light header text while it sits transparent over a dark hero (until scrolled) */
.dark-hero .site-header:not(.scrolled) .wordmark { color: #fff; }
.dark-hero .site-header:not(.scrolled) .nav-menu a { color: rgba(255,255,255,.9); }
.dark-hero .site-header:not(.scrolled) .nav-menu a:hover { color: #fff; }
/* The white wash lived on the <li>, not the <a> — which is why removing the
   anchor's background above changed nothing on screen. It applied to
   .current-menu-item as well, so the page you were already on wore a grey panel
   permanently. The lime rule says both things already: it plays on hover and it
   holds on the current section. */
.dark-hero .site-header:not(.scrolled) .nav-toggle span { background: #fff; }
.dark-hero .site-header:not(.scrolled) .btn--ghost { --fg-btn: #fff; box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.5); }
.dark-hero .site-header:not(.scrolled) .btn--ghost:hover { box-shadow: inset 0 0 0 1.5px #fff; background: rgba(255,255,255,.1); }

/* products page: category tiles (5-up) + featured product grid */
.pcat-grid { grid-template-columns: repeat(5,1fr); }
/* product images are square (1:1) — match the tile so the full image shows, uncropped */
.pcat-grid .ind-card { aspect-ratio: 1 / 1; }
.pcat-grid .ind-card::after { background: linear-gradient(to top, rgba(20,22,4,.82) 0%, rgba(20,22,4,.18) 44%, transparent 66%); }
.pcat-grid .ind-card .meta p { max-height: none; opacity: 1; margin-top: .2rem; font-size: .8rem; color: rgba(255,255,255,.82); }
@media (max-width: 980px){ .pcat-grid { grid-template-columns: repeat(3,1fr); } }
@media (max-width: 600px){ .pcat-grid { grid-template-columns: 1fr 1fr; } }
.pgrid { display: grid; grid-template-columns: repeat(4,1fr); gap: clamp(1rem,2vw,1.5rem); }
.pcard { display: block; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-sm); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.pcard:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.pcard__img { aspect-ratio: 1/1; background: var(--sand); overflow: hidden; }
.pcard__img img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease-out); }
.pcard:hover .pcard__img img { transform: scale(1.05); }
.pcard__body { padding: .95rem 1.05rem 1.15rem; }
.pcard__cat { font-size: .7rem; letter-spacing: .12em; text-transform: uppercase; color: var(--avocado); font-weight: 700; }
.pcard__name { font-size: 1rem; line-height: 1.35; margin-top: .3rem; color: var(--olive-ink); }
.pgrid-more { text-align: center; margin-top: clamp(1.6rem,3vw,2.6rem); }
@media (max-width: 900px){ .pgrid { grid-template-columns: repeat(3,1fr); } }
@media (max-width: 600px){ .pgrid { grid-template-columns: 1fr 1fr; } }

/* ============================================================
   PRODUCT CATEGORY BANDS  (.pcat-band) — /products/ page
   Three full-width bands (one per product_cat) on alternating grounds.
   Editorial 2-col spread: margin-folio masthead rail | 4-up framed-poster
   previews. Reuses house primitives (.eyebrow, .btn, .wrap) + the framed
   poster photo treatment. Replaces the old .pcat-grid + .pgrid blocks.
   ============================================================ */
/* ---- hero-area category quick-nav: 3 scene tiles that jump to the bands ---- */
.pcat-nav { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 2vw, 1.6rem); margin-top: clamp(1.8rem, 3.4vw, 2.6rem); }
.pcat-nav__card {
  position: relative; isolation: isolate; display: block; aspect-ratio: 4 / 3; overflow: hidden;
  border-radius: var(--r-lg); box-shadow: var(--shadow-sm); color: #fff;
  transition: transform .45s var(--ease), box-shadow .45s var(--ease);
}
.pcat-nav__card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); }
.pcat-nav__media { position: absolute; inset: 0; z-index: -2; background: var(--olive-deep); }
.pcat-nav__media img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease-out); }
.pcat-nav__card:hover .pcat-nav__media img { transform: scale(1.07); }
.pcat-nav__card::after { content: ""; position: absolute; inset: 0; z-index: -1; background: linear-gradient(to top, rgba(20,22,4,.84) 0%, rgba(20,22,4,.34) 46%, rgba(20,22,4,.04) 78%); }
.pcat-nav__body { position: absolute; left: 0; right: 0; bottom: 0; padding: clamp(1.2rem, 2vw, 1.6rem); display: flex; flex-direction: column; }
.pcat-nav__count { font-size: .72rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--lime); }
.pcat-nav__name { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.45rem, 2.4vw, 2rem); line-height: 1.04; color: #fff; margin-top: .3rem; }
.pcat-nav__go { display: inline-flex; align-items: center; gap: .4rem; margin-top: .7rem; font-weight: 600; font-size: .9rem; color: #fff; opacity: .92; }
.pcat-nav__go svg { width: 16px; height: 16px; transition: transform .3s var(--ease); }
.pcat-nav__card:hover .pcat-nav__go svg { transform: translateX(5px); }
@media (max-width: 760px){ .pcat-nav { grid-template-columns: 1fr; max-width: 440px; margin-inline: auto; } .pcat-nav__card { aspect-ratio: 16 / 9; } }

.pcat-bands { position: relative; }
.pcat-band { padding-block: var(--section-y); background: var(--cream); position: relative; scroll-margin-top: clamp(88px, 11vh, 116px); }
.pcat-band:nth-of-type(even) { background: var(--cream-2); }
.pcat-band + .pcat-band { border-top: 1px solid var(--line-soft); }

.pcat-band__inner {
  display: grid; grid-template-columns: minmax(260px, 21rem) 1fr;
  gap: clamp(2rem, 4vw, 4.5rem); align-items: start;
}

/* ---- left rail / masthead ---- */
.pcat-band__rail { position: relative; min-width: 0; }
.pcat-band__masthead { position: relative; min-width: 0; }
.pcat-band__index {
  position: absolute; top: -.35em; left: -.06em; z-index: 0;
  font-family: var(--font-display); font-weight: 500;
  font-size: clamp(2.6rem, 1.6rem + 3vw, 4.2rem); line-height: .9; letter-spacing: -.03em;
  color: rgba(158,167,0,.14); user-select: none; pointer-events: none;
  transition: color .5s var(--ease);
}
.pcat-band__eyebrow, .pcat-band__name, .pcat-band__desc { position: relative; z-index: 1; }
.pcat-band__eyebrow { margin-bottom: 1rem; }
.pcat-band__name {
  font-family: var(--font-display); font-weight: 500; font-size: var(--fs-h2);
  line-height: 1.05; letter-spacing: -.015em; color: var(--olive-deep);
  text-wrap: balance; overflow-wrap: anywhere;
}
.pcat-band__desc { margin-top: 1rem; color: var(--muted); font-size: var(--fs-body); max-width: 32ch; }
.pcat-band__cta { margin-top: clamp(1.4rem, 2.4vw, 2rem); }
.pcat-band:hover .pcat-band__index { color: rgba(158,167,0,.26); }

/* ---- right: 4 framed-poster previews ---- */
.pcat-band__previews { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(.9rem, 1.6vw, 1.4rem); }
.pcat-prev { display: block; min-width: 0; color: inherit; }
.pcat-prev__img {
  display: block; position: relative; aspect-ratio: 1 / 1; border-radius: var(--r-md); overflow: hidden;
  background: var(--sand);
  box-shadow: inset 0 0 0 1px rgba(20,22,4,.07), 0 6px 18px rgba(20,22,4,.12);
  transition: transform .5s var(--ease), box-shadow .5s var(--ease);
}
.pcat-prev__img img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .65s var(--ease-out); }
.pcat-prev__img--empty { display: grid; place-items: center; }
.pcat-prev__img--empty svg { width: 34%; height: auto; opacity: .5; color: var(--nut-soft); }
.pcat-prev__name {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2;
  overflow: hidden; overflow-wrap: anywhere;
  margin-top: .7rem; min-height: 2.5em; font-size: .9rem; line-height: 1.25; color: var(--olive-ink);
  transition: color .25s var(--ease);
}
.pcat-prev:hover .pcat-prev__img { transform: translateY(-4px); box-shadow: inset 0 0 0 1px rgba(20,22,4,.09), 0 14px 30px rgba(45,50,8,.16); }
.pcat-prev:hover .pcat-prev__img img { transform: scale(1.05); }
.pcat-prev:hover .pcat-prev__name { color: var(--olive-deep); }
.pcat-prev:focus-visible { outline: none; }
.pcat-prev:focus-visible .pcat-prev__img { transform: translateY(-4px); box-shadow: inset 0 0 0 2px var(--avocado), 0 14px 30px rgba(45,50,8,.16); }

/* ---- responsive: wrap (never horizontal-scroll), house 900/600 breakpoints ---- */
@media (max-width: 900px) {
  .pcat-band__inner { grid-template-columns: 1fr; gap: clamp(1.6rem, 4vw, 2.4rem); }
  .pcat-band__rail { display: grid; grid-template-columns: 1fr auto; align-items: end; column-gap: 1.5rem; }
  .pcat-band__masthead { grid-column: 1; }
  .pcat-band__index { font-size: clamp(2.2rem, 7vw, 3.2rem); }
  .pcat-band__cta { grid-column: 2; align-self: end; margin-top: 0; }
  .pcat-band__previews { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 600px) {
  .pcat-band__rail { grid-template-columns: 1fr; }
  .pcat-band__cta { grid-column: 1; margin-top: 1.2rem; }
  .pcat-band__cta .btn { width: 100%; justify-content: center; }
  .pcat-band__desc { max-width: none; }
  .pcat-band__previews { gap: .8rem; }
}
@media (prefers-reduced-motion: reduce) {
  .pcat-prev__img, .pcat-prev__img img, .pcat-band__index { transition: none; }
  .pcat-prev:hover .pcat-prev__img, .pcat-prev:focus-visible .pcat-prev__img { transform: none; }
}

/* ============================================================
   CONTACT PAGE + AJAX forms (contact + subscribe)
   ============================================================ */
.contact-grid { display: grid; grid-template-columns: .85fr 1.15fr; gap: clamp(2rem,5vw,4rem); align-items: start; }
.contact-info h2 { font-size: clamp(1.4rem,2.4vw,1.9rem); }
.contact-lines { list-style: none; padding: 0; margin: 1.4rem 0 0; display: grid; gap: 1rem; }
.contact-lines li { display: flex; align-items: center; gap: .8rem; }
.contact-lines .ic { display: grid; place-items: center; width: 40px; height: 40px; border-radius: 12px; background: var(--cream-2); color: var(--olive); flex: none; }
.contact-lines .ic svg { width: 18px; height: 18px; }
.contact-lines a { color: var(--olive-ink); font-weight: 500; }
.contact-lines a:hover { color: var(--avocado); }
.contact-social { display: flex; gap: .7rem; margin-top: 1.6rem; }
.contact-social a { display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; background: var(--cream-2); color: var(--olive); transition: background .25s var(--ease), color .25s var(--ease); }
.contact-social a:hover { background: var(--olive-deep); color: #fff; }
.contact-social svg { width: 18px; height: 18px; }
.contact-extra { margin-top: 1.4rem; color: var(--muted); font-size: .95rem; }
.nutoast-form { display: grid; gap: .8rem; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: clamp(1.4rem,3vw,2.2rem); box-shadow: var(--shadow-sm); }
.nutoast-form .nf-row { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; }
.nutoast-form input, .nutoast-form textarea { width: 100%; font: inherit; font-size: .95rem; padding: .85rem 1rem; border: 1px solid var(--line); border-radius: var(--r-md); background: #fff; color: var(--olive-ink); transition: border-color .2s var(--ease), box-shadow .2s var(--ease); }
.nutoast-form input:focus, .nutoast-form textarea:focus { outline: none; border-color: var(--avocado); box-shadow: 0 0 0 3px rgba(158,167,0,.16); }
.nutoast-form textarea { resize: vertical; min-height: 120px; }
.nutoast-form .btn { justify-content: center; margin-top: .3rem; }
.nutoast-hp { position: absolute !important; left: -9999px !important; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.nutoast-form-msg { font-size: .9rem; min-height: 1.2em; }
.nutoast-form-msg.ok { color: var(--olive); font-weight: 600; }
.nutoast-form-msg.err { color: #b3261e; font-weight: 600; }
.sub-msg { margin-top: .6rem; }
.sub-msg.ok { color: var(--lime); }
.sub-msg.err { color: #ffb4a8; }
@media (max-width: 800px){ .contact-grid { grid-template-columns: 1fr; } .nutoast-form .nf-row { grid-template-columns: 1fr; } }





/* ============================================================
   FOOTER
   ============================================================ */
.site-footer { background: var(--olive-ink); color: #b9bd9f; padding-top: clamp(4rem,7vw,6rem); }
.footer-top { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1.2fr; gap: 2.5rem; padding-bottom: 3rem; border-bottom: 1px solid rgba(255,255,255,.08); }
.footer-brand .wordmark { font-family: var(--font-display); font-size: 1.7rem; font-weight: 500; letter-spacing: .005em; text-transform: lowercase; color:#fff; }
.footer-logo { display: inline-flex; align-items: center; gap: .6rem; }
/* newsletter heading had no footer-specific colour → inherited the dark global h4 and vanished on the dark ground */
.footer-sub h4 { color: #fff; font-size: 1.05rem; margin-bottom: .55rem; }
.footer-brand p { margin-top: 1rem; max-width: 32ch; font-size: .92rem; color:#9da284; }
/* contact block under the brand (email + phone) — replaces the orphaned lime email */
.footer-contact { margin-top: 1.5rem; display: grid; gap: .6rem; }
.footer-contact__link { display: inline-flex; align-items: center; gap: .65rem; width: fit-content; color: #c7cbab; font-size: .92rem; transition: color .25s var(--ease); }
.footer-contact__link:hover { color: var(--lime); }
.footer-contact__ic { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 9px; background: rgba(255,255,255,.07); color: var(--lime); flex: 0 0 auto; transition: background .25s var(--ease); }
.footer-contact__link:hover .footer-contact__ic { background: rgba(231,234,107,.16); }
.footer-contact__ic svg { width: 16px; height: 16px; }
.footer-social { margin-top: 1.4rem; display: flex; flex-wrap: wrap; gap: .6rem; }
.footer-social__link { display: grid; place-items: center; width: 38px; height: 38px; border-radius: 50%; background: rgba(255,255,255,.07); color: #c7cbab; transition: background .25s var(--ease), color .25s var(--ease), transform .25s var(--ease); }
.footer-social__link:hover { background: var(--lime); color: var(--olive-ink); transform: translateY(-3px); }
.footer-social__link svg { width: 18px; height: 18px; }
.footer-col h4 { color:#fff; font-family: var(--font-body); font-size: .8rem; letter-spacing: .18em; text-transform: uppercase; margin-bottom: 1.1rem; }
.footer-col a { display: block; padding: .35rem 0; color:#b9bd9f; font-size: .94rem; transition: color .25s; }
.footer-col a:hover { color: var(--lime); }
.footer-sub p { font-size: .92rem; color:#9da284; margin-bottom: 1rem; }
.sub-form { display: flex; gap: .5rem; background: rgba(255,255,255,.06); padding: .4rem; border-radius: var(--r-pill); }
.sub-form input { flex: 1 1 0; min-width: 0; background: none; border: 0; color:#fff; padding: .55rem .9rem; font: inherit; font-size: .9rem; }
.sub-form:focus-within { box-shadow: inset 0 0 0 2px var(--lime); }
.sub-form input:focus-visible { outline: 2px solid var(--lime); outline-offset: 2px; border-radius: var(--r-pill); }
.sub-form input::placeholder { color:#8a8e72; }
.sub-form { max-width: 100%; }
.sub-form button { flex: 0 0 auto; white-space: nowrap; background: var(--lime); color: var(--olive-ink); border-radius: var(--r-pill); padding: .6rem 1.1rem; font-weight: 600; font-size: .9rem; }
/* phones: drop the wrapping pill; email field + full-width button as two distinct, balanced elements */
@media (max-width: 480px){
  .sub-form { flex-direction: column; align-items: stretch; gap: .6rem; background: transparent; padding: 0; border-radius: 0; box-shadow: none; }
  .sub-form:focus-within { box-shadow: none; }
  .sub-form input { flex: 0 0 auto; width: 100%; background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.16); border-radius: var(--r-pill); padding: .95rem 1.25rem; font-size: .95rem; transition: border-color .25s var(--ease), box-shadow .25s var(--ease); }
  .sub-form input:focus-visible { outline: none; border-color: var(--lime); box-shadow: 0 0 0 3px rgba(231,234,107,.22); }
  .sub-form button { width: 100%; padding: .95rem 1.1rem; font-size: .95rem; }
}
.footer-bottom { display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; padding: 1.6rem 0; font-size: .85rem; color:#8a8e72; }
.footer-bottom a { color:#8a8e72; }
@media (max-width: 860px){ .footer-top { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px){ .footer-top { grid-template-columns: 1fr; } }

/* ============================================================
   SCROLL REVEAL
   ============================================================ */
[data-reveal] { opacity: 0; transform: translateY(26px); transition: opacity .8s var(--ease-out), transform .8s var(--ease-out); }
[data-reveal].in { opacity: 1; transform: none; }
[data-reveal][data-delay="1"]{ transition-delay:.08s; }
[data-reveal][data-delay="2"]{ transition-delay:.16s; }
[data-reveal][data-delay="3"]{ transition-delay:.24s; }
[data-reveal][data-delay="4"]{ transition-delay:.32s; }
@media (prefers-reduced-motion: reduce){ [data-reveal]{opacity:1;transform:none;transition:none;} html{scroll-behavior:auto;} }

/* ============================================================
   WORDPRESS OUTPUT HELPERS (a11y, menus, content)
   ============================================================ */
.screen-reader-text {
  position: absolute !important; clip: rect(1px,1px,1px,1px); clip-path: inset(50%);
  width: 1px; height: 1px; overflow: hidden; word-wrap: normal !important;
}
.skip-link.screen-reader-text:focus {
  position: fixed !important; top: 1rem; left: 1rem; z-index: 1000; width: auto; height: auto;
  clip: auto; clip-path: none; padding: .7rem 1.1rem; border-radius: var(--r-pill);
  background: var(--olive-deep); color: #fff; box-shadow: var(--shadow-md);
}
/* wp_nav_menu output keeps the same look as the hand-built lists */
.footer-menu { margin: 0; }
.nav-menu .sub-menu { display: none; } /* top-level only for now */

/* ---------- Products mega-menu (header) ---------- */
.nav-item.has-mega { position: relative; }
.nav-item.has-mega > a { display: inline-flex; align-items: center; gap: .35rem; }
.nav-item.has-mega .caret { width: 11px; height: 8px; opacity: .55; transition: transform .3s var(--ease), opacity .3s var(--ease); }
.nav-item.has-mega:hover .caret,
.nav-item.has-mega:focus-within .caret { transform: rotate(180deg); opacity: .9; }

.nav-mega {
  position: absolute; top: 100%; left: 0;
  width: min(660px, 92vw); max-width: calc(100vw - 2.5rem);
  padding-top: .6rem;                       /* transparent hover-bridge over the gap */
  transform: translateY(10px);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .26s var(--ease), transform .26s var(--ease), visibility .26s;
  z-index: 200;
}
.nav-item.has-mega:hover .nav-mega,
.nav-item.has-mega:focus-within .nav-mega {
  opacity: 1; visibility: visible; pointer-events: auto;
  transform: translateY(0);
}
.nav-mega__panel {
  background: var(--cream); border: 1px solid var(--line-soft);
  border-radius: var(--r-lg); box-shadow: var(--shadow-lg);
  padding: 1.1rem;
}
.nav-mega__eyebrow {
  display: block; font-size: .68rem; font-weight: 700; letter-spacing: .16em;
  text-transform: uppercase; color: var(--olive-soft); margin: .1rem .25rem .7rem;
}
.nav-mega__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: .6rem; }
.nav-mega__card {
  display: block; border-radius: var(--r-md); overflow: hidden;
  background: var(--cream-2); border: 1px solid transparent;
  transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease), background .3s var(--ease);
}
.nav-mega__card:hover { transform: translateY(-3px); border-color: var(--line); box-shadow: var(--shadow-sm); background: #fff; }
.nav-mega__img { display: block; aspect-ratio: 16 / 10; overflow: hidden; background: var(--sand); }
.nav-mega__img img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease-out); }
.nav-mega__card:hover .nav-mega__img img { transform: scale(1.06); }
.nav-mega__body { display: block; padding: .7rem .8rem .85rem; }
.nav-mega__name { display: block; font-family: var(--font-display); font-weight: 500; font-size: 1.05rem; line-height: 1.1; color: var(--olive-deep); }
.nav-mega__meta { display: block; margin-top: .25rem; font-size: .66rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--avocado); }
.nav-mega__desc { display: block; margin-top: .3rem; font-size: .8rem; line-height: 1.4; color: var(--muted); }
.nav-mega__all { display: inline-flex; align-items: center; gap: .4rem; margin: .9rem .25rem .2rem; font-weight: 600; font-size: .9rem; color: var(--olive); }
.nav-mega__all svg { width: 16px; height: 16px; transition: transform .3s var(--ease); }
.nav-mega__all:hover { color: var(--olive-deep); }
.nav-mega__all:hover svg { transform: translateX(4px); }
@media (max-width: 1040px) { .nav-mega { display: none; } }  /* mobile/tablet use the drawer */
@media (prefers-reduced-motion: reduce) {
  .nav-mega, .nav-mega__card, .nav-mega__img img, .nav-item.has-mega .caret { transition: none; }
}
.entry-content > * + * { margin-top: 1.1rem; }
.entry-content h2, .entry-content h3 { margin-top: 2rem; }
.entry-content a { color: var(--olive); text-decoration: underline; text-underline-offset: 3px; }
.entry-content img { border-radius: var(--r-md); }

/* In-body poster carousel — the finished client posters, shown whole, one at a time.
   Capped well under the 760px column: a full-width 2:3 portrait would be 1,133px
   tall and push everything else off screen. Drives the shared .ntcar component. */
.entry-content .mc-posters { max-width: min(460px, 100%); margin: 1.5rem auto 2.9rem; }
/* radius/clip live on the carousel itself (its viewport inherits the radius) so the
   dots can sit outside the frame without being clipped away */
.entry-content .mc-posters .ntcar { border-radius: var(--r-md); }
.entry-content .mc-posters .ntcar__viewport { box-shadow: var(--shadow-md); background: var(--cream); }
.entry-content .mc-posters .ntcar__slide img { width: 100%; height: auto; display: block;
  border-radius: 0; /* the frame is rounded, not each slide */ }
.entry-content .mc-posters .ntcar__nav { background: rgba(254,255,247,.92); color: var(--olive-deep); border: 1px solid var(--line); }
.entry-content .mc-posters .ntcar__nav:hover { background: var(--olive-deep); color: #fff; }
.entry-content .mc-posters .ntcar__dots { bottom: -1.55rem; background: none;
  -webkit-backdrop-filter: none; backdrop-filter: none; padding: 0; }
.entry-content .mc-posters .ntcar__dot { background: rgba(20,22,4,.22); }
.entry-content .mc-posters .ntcar__dot.is-active { background: var(--avocado); }
.entry-content .mc-posters__cap { margin: .55rem 0 0; text-align: center; font-size: .82rem; color: var(--olive-soft); }

/* Pulled-out statistic — breaks the article's opening wall of prose without
   inventing a new claim: the figure and its source are lifted from the paragraph
   it sits under. The client's complaint was that the piece opens with ~1,900
   characters of unbroken text before the first product image. */
/* The figure callout. Built for the Mid-Autumn article as .mc-stat and kept
   under that name so the published article is untouched; .nt-stat is the same
   component with a name that does not belong to one story. */
.entry-content .nt-stat,
.entry-content .mc-stat { display: grid; grid-template-columns: auto 1fr; gap: 0 1.15rem; align-items: center;
  margin: 1.6rem 0; padding: 1.15rem 1.35rem; border-radius: var(--r-md);
  background: linear-gradient(135deg, #eef0d8, #e4e6c6); border: 1px solid var(--line-soft); }
.entry-content .nt-stat__n,
.entry-content .mc-stat__n { font-family: var(--font-display); font-size: clamp(2.2rem, 6vw, 3rem);
  line-height: 1; color: var(--avocado); font-weight: 600; }
.entry-content .nt-stat__t,
.entry-content .mc-stat__t { font-size: .92rem; line-height: 1.5; color: var(--olive-deep); }
.entry-content .nt-stat__src,
.entry-content .mc-stat__src { grid-column: 1 / -1; margin: .6rem 0 0; font-size: .74rem; color: var(--olive-soft); }
/* A unit riding on the figure — "US$1.09bn" reads better with the bn a size down
   than as one long display-font string. */
.entry-content .nt-stat__n i { font-style: normal; font-size: .46em; letter-spacing: .01em; }
/* Tabular figures + a reserved width: a counter running 0 → 600,180 changes the
   string's width on almost every frame, and without both of these the sentence
   beside it reflows for the whole animation. */
.entry-content .nt-stat__n,
.entry-content .mc-stat__n { font-variant-numeric: tabular-nums; }
.nt-count[data-nt-count] { display: inline-block; }

/* Comparison variant. Some numbers only mean something against another number:
   a trade balance is the pair, not either side, so the two sit level and the
   verdict line runs underneath both. */
.entry-content .nt-stat--pair { grid-template-columns: 1fr 1fr; gap: .6rem; align-items: stretch; }
/* Same reasoning as .nt-figs__cell: a comparison needs two objects to compare,
   not two halves of one sheet. */
.entry-content .nt-stat--pair .nt-stat__col {
  padding: .85rem .95rem .9rem;
  background: rgba(255,255,255,.52);
  border: 1px solid rgba(102,110,19,.10);
  border-radius: calc(var(--r-md) - 6px);
}
.nt-stat__col { min-width: 0; }
.nt-stat__k { display: block; font-family: var(--font-body); font-size: .64rem; font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase; color: var(--olive-soft); margin-bottom: .3rem; }
.entry-content .nt-stat--pair .nt-stat__n { display: block; font-size: clamp(1.6rem, 4.4vw, 2.15rem); }
/* The second figure. Sized between the headline and the deltas so the ranking is
   readable without a label: this is the same measurement in another unit, not a
   competing headline and not a footnote. */
.entry-content .nt-stat__n2 {
  display: block; margin-top: .16rem;
  font-family: var(--font-display); font-weight: 500;
  font-size: clamp(.9rem, 2.2vw, 1.04rem); line-height: 1.2;
  color: var(--olive-soft); font-variant-numeric: tabular-nums;
}
.entry-content .nt-stat__n2 i { font-style: normal; font-size: .74em; letter-spacing: .01em; }
/* A wider gap where the figures end and the changes begin. */
.entry-content .nt-stat__n2 + .nt-stat__d { margin-top: .62rem; }
.nt-stat__d { display: flex; align-items: flex-start; gap: .4em; margin-top: .34rem; font-size: .76rem; line-height: 1.35; color: var(--olive-deep); }
/* Direction is a filled badge, not a bare character.
   Two small outline triangles differing only in rotation and in two shades of
   green/brown read as the same mark at 12px — the client could not tell them
   apart. Now up and down differ on three axes at once: fill colour (brand green
   vs the palette's existing hot red), glyph, and the shape of the badge itself.
   Colour is never the only cue, so this still works in greyscale. */
.nt-stat__d::before {
  content: "→";
  display: inline-flex; align-items: center; justify-content: center;
  flex: 0 0 auto; width: 1.45em; height: 1.45em; margin-top: -.02em;
  border-radius: 6px; font-size: .82em; line-height: 1;
  background: rgba(102,110,19,.12); color: var(--olive);
}
.nt-stat__d--up::before {
  content: "▲"; border-radius: 50%;
  background: var(--avocado); color: var(--cream);
}
.nt-stat__d--down::before {
  content: "▼"; border-radius: 4px;
  background: #B4471F; color: #FFF6EC;
}
.entry-content .nt-stat--pair .nt-stat__t { grid-column: 1 / -1; padding-top: .85rem; border-top: 1px solid rgba(102,110,19,.18); }
.entry-content .nt-stat--pair .nt-stat__t strong { color: var(--avocado); }

@media (max-width: 560px) {
  .entry-content .nt-stat,
  .entry-content .mc-stat { grid-template-columns: 1fr; gap: .35rem; text-align: left; }
  /* The pair stays two-up even on a phone — stacked, the comparison the block
     exists to make disappears. */
  .entry-content .nt-stat--pair { grid-template-columns: 1fr 1fr; gap: .9rem .9rem; }
  .entry-content .nt-stat--pair .nt-stat__n { font-size: 1.45rem; }
  .nt-stat__k { font-size: .58rem; letter-spacing: .09em; }
  .nt-stat__d { font-size: .72rem; }
}

/* Featured development case — the closing "product breakdown" sheet. Full-bleed
   to the wider column because these are dense infographics that are unreadable
   at 760px. */
.entry-content .mc-case { width: min(var(--maxw), calc(100vw - 2.5rem)); margin: 1.5rem 0 1.8rem 50%;
  transform: translateX(-50%); border-radius: var(--r-md); overflow: hidden;
  box-shadow: var(--shadow-md); background: var(--cream); }
.entry-content .mc-case img { width: 100%; height: auto; display: block; border-radius: 0; }

/* Mid-Autumn article hero — five poster crops read as one wide band, so the range
   of applications lands in a single glance instead of a long scroll.
   It has to break out of the 760px .article column on its own: there is no
   full-bleed/alignwide treatment anywhere else in .entry-content to inherit.
   margin-left:50% + translateX(-50%) re-centres it against the wider viewport. */
.entry-content .mc-hero { display: grid; grid-template-columns: repeat(5, 1fr); gap: 3px;
  width: min(var(--maxw), calc(100vw - 2.5rem)); margin: 1.35rem 0 1.6rem 50%; transform: translateX(-50%);
  border-radius: var(--r-md); overflow: hidden; background: var(--cream);
  box-shadow: var(--shadow-sm); }
/* 32/50 matches the exported panels exactly, so cover never has to crop twice. */
.entry-content .mc-hero img { width: 100%; height: 100%; aspect-ratio: 32 / 50; object-fit: cover;
  display: block; border-radius: 0; }
/* Phones: five 70px slivers would be unreadable, so drop to a 2-up mosaic. The odd
   fifth panel spans both columns and switches to a landscape crop, which resolves
   the odd count deliberately instead of leaving an orphan. */
@media (max-width: 700px) {
  .entry-content .mc-hero { grid-template-columns: repeat(2, 1fr); gap: 2px; }
  .entry-content .mc-hero img { aspect-ratio: 1 / 1; }
  .entry-content .mc-hero img:last-child { grid-column: span 2; aspect-ratio: 16 / 9; }
}

/* "Recommended: <product>" stays a real link (crawlable, works with JS off) but a
   plain left click pops the product modal — the caret hints there is more behind it. */
.entry-content .mooncake__prod a[data-pmodal-tmpl]::after { content: ""; display: inline-block;
  width: .34em; height: .34em; margin-left: .38em; vertical-align: .12em;
  border-right: 1.6px solid currentColor; border-bottom: 1.6px solid currentColor;
  transform: rotate(45deg); opacity: .55; transition: transform .2s var(--ease), opacity .2s var(--ease); }
.entry-content .mooncake__prod a[data-pmodal-tmpl]:hover::after { opacity: 1; transform: rotate(45deg) translate(1px, 1px); }

/* Holidays / Seasonal Inspiration — the concept catalogue grid (九宫格).
   --mc-pad is the card's inner gutter, declared once on the card so the phone
   block can retune every inset by overriding a single value. */
.entry-content .mooncake-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(1rem, 2vw, 1.6rem); margin: 1.6rem 0; }
.entry-content .mooncake { --mc-pad: 1.05rem; margin: 0; display: flex; flex-direction: column;
  border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; background: var(--cream);
  box-shadow: var(--shadow-sm); transition: box-shadow .25s var(--ease); }
.entry-content .mooncake:hover, .entry-content .mooncake:focus-within { box-shadow: var(--shadow-md); }
/* the image+name+highlight are a <button data-app> opening the same recipe modal as
   /segments/ — "Recommended:" stays a plain <a> OUTSIDE it (an <a> can't nest inside
   a <button>, that's invalid HTML and would break click handling). */
.entry-content .mooncake__trigger { display: block; width: 100%; padding: 0; margin: 0; border: 0; background: none;
  font: inherit; text-align: left; color: inherit; cursor: pointer; }
.entry-content .mooncake__trigger:focus-visible { outline: 2px solid var(--avocado); outline-offset: -2px; }
.entry-content .mooncake__img { aspect-ratio: 1 / 1; overflow: hidden; background: linear-gradient(135deg, #eef0d8, #e4e6c6); display: grid; place-items: center; font-family: var(--font-display); font-size: 1.6rem; color: var(--olive-soft); }
.entry-content .mooncake__img img { width: 86%; height: 86%; margin: auto; object-fit: contain; border-radius: 0; transition: transform .4s var(--ease); }
.entry-content .mooncake__trigger:hover .mooncake__img img { transform: scale(1.04); }
/* display:block is load-bearing: as a bare inline <span> the gutter below never
   applied (title/highlight rendered flush against the card border) and the span's
   own line box wedged a phantom ~28px gap above "Recommended:". */
.entry-content .mooncake__body { display: block; padding: .95rem var(--mc-pad) 0; }
.entry-content .mooncake h3 { margin: 0; font-size: 1.02rem; line-height: 1.32; color: var(--olive-deep); }
.entry-content .mooncake__hl { margin: .34rem 0 0; font-size: .86rem; color: var(--olive); line-height: 1.5; }
.entry-content .mooncake__cta { display: inline-flex; align-items: center; gap: .32rem; margin-top: .6rem; font-size: .78rem; font-weight: 600; color: var(--avocado); }
.entry-content .mooncake__cta svg { width: 13px; height: 13px; transition: transform .25s var(--ease); }
.entry-content .mooncake__trigger:hover .mooncake__cta svg, .entry-content .mooncake__trigger:focus-visible .mooncake__cta svg { transform: translateX(3px); }
/* margin-top:auto pins the recommendation to the card floor so the line sits level
   across a row however long each highlight runs; the gap lives in padding-top so
   the tallest card (zero free space) still keeps its breathing room. */
.entry-content .mooncake__prod { margin: auto 0 0; padding: .7rem var(--mc-pad) 1.05rem; font-size: .8rem; line-height: 1.5; color: var(--olive-soft); }
.entry-content .mooncake__prod strong { color: var(--olive-deep); font-weight: 600; }
/* Pointer devices only: the recommendation rides DOWN over the photo on hover /
   keyboard focus, leaving the resting card clean. Deliberately over the IMAGE and
   not the card floor — a band at the bottom would drop a product link exactly
   where "View full recipe" sits and steal that click. Deliberately absolute and
   not collapsed in flow — animating its height would resize the grid row and jog
   every neighbouring card. Touch has no hover, so phones keep the static in-flow
   line and always see the recommendation. */
@media (hover: hover) and (pointer: fine) {
  .entry-content .mooncake { position: relative; }
  .entry-content .mooncake__prod {
    position: absolute; top: 0; left: 0; right: 0; z-index: 2; margin: 0;
    padding: .6rem var(--mc-pad); background: rgba(254,255,247,.94);
    border-bottom: 1px solid var(--line); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
    transform: translateY(-101%); opacity: 0;
    transition: transform .3s var(--ease), opacity .22s var(--ease); }
  .entry-content .mooncake:hover .mooncake__prod,
  .entry-content .mooncake:focus-within .mooncake__prod { transform: translateY(0); opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .entry-content .mooncake__prod { transition: none; }
}
/* Phones stay 2-up (client request) — tighten gutter/type so two cards still breathe.
   The highlight is clamped visually only; the full sentence stays in the DOM for
   crawlers. */
@media (max-width: 560px) {
  .entry-content .mooncake-grid { gap: .7rem; }
  .entry-content .mooncake { --mc-pad: .8rem; }
  .entry-content .mooncake__body { padding-top: .75rem; }
  .entry-content .mooncake h3 { font-size: .9rem; }
  .entry-content .mooncake__hl { margin-top: .3rem; font-size: .76rem; line-height: 1.45;
    display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }
  .entry-content .mooncake__cta { margin-top: .45rem; font-size: .72rem; }
  .entry-content .mooncake__prod { padding: .55rem var(--mc-pad) .85rem; font-size: .72rem; }
}

/* ---- article blocks used by the FISA-style trade-show posts ---- */
/* the "view product" line under each product entry */
.entry-content .artprod__links { font-size: .88rem; color: var(--olive-soft); }
.entry-content .artprod__links strong { color: var(--olive-deep); font-weight: 600; }
.entry-content .artprod__links a { display: inline-block; margin-right: .5rem; }

/* facts + invitation poster, side by side */
.entry-content .artvisit { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,300px); gap: clamp(1.2rem,3vw,2.2rem);
  align-items: center; margin-top: 1.6rem; padding: clamp(1.2rem,2.5vw,1.8rem); border: 1px solid var(--line);
  border-radius: var(--r-lg); background: var(--cream); box-shadow: var(--shadow-sm); }
.entry-content .artvisit dl { margin: 0; display: grid; gap: .7rem; }
.entry-content .artfact { display: grid; gap: .1rem; }
.entry-content .artfact dt { font-family: var(--font-body); font-size: .6rem; font-weight: 700; letter-spacing: .16em;
  text-transform: uppercase; color: var(--olive-soft); margin: 0; }
.entry-content .artfact dd { margin: 0; font-family: var(--font-display); font-size: 1.02rem; color: var(--olive-deep); line-height: 1.3; }
.entry-content .artvisit__cta { margin: 1.1rem 0 0; }
.entry-content .artvisit__cta .btn { text-decoration: none; }
.entry-content .artvisit__poster { border-radius: var(--r-md); overflow: hidden; }
.entry-content .artvisit__poster img { width: 100%; height: auto; display: block; border-radius: 0; }
.entry-content .artvisit .ntcar__viewport { border-radius: var(--r-md); border: 1px solid var(--line-soft); }
@media (max-width: 640px) {
  .entry-content .artvisit { grid-template-columns: 1fr; }
  .entry-content .artvisit__poster { max-width: 260px; margin: 0 auto; }
}
/* pagination */
.pagination, .nav-links { display: flex; gap: .5rem; flex-wrap: wrap; }
.pagination .page-numbers {
  display: inline-grid; place-items: center; min-width: 42px; height: 42px; padding: 0 .6rem;
  border-radius: var(--r-pill); background: var(--cream-2); color: var(--olive-ink); font-weight: 600;
}
.pagination .page-numbers.current { background: var(--olive-deep); color: #fff; }

/* ============================================================
   ARCHIVES / SINGLE / BLOG / SEARCH / 404
   ============================================================ */
.page-hero { position: relative; isolation: isolate; overflow: clip; background: var(--olive-deep); color: #efeedd; padding: clamp(6.6rem,5.4rem + 2.4vw,8rem) 0 clamp(1.8rem,2.6vw,2.4rem); }
.page-hero::before { content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background: radial-gradient(55% 70% at 82% 0%, color-mix(in srgb, var(--lime) 26%, transparent), transparent 60%); }
.page-hero > .wrap { position: relative; z-index: 1; }
.page-hero .eyebrow { color: var(--lime); }
.page-hero .eyebrow::before, .page-hero .eyebrow::after { background: var(--lime); }
.page-hero h1 { font-size: var(--fs-h2); margin-top: .8rem; color: #fff; }
.page-hero p.lead { margin-top: 1rem; color: #c7cbab; font-size: var(--fs-lead); max-width: 60ch; }
.page-hero .btn--ghost { --fg-btn: #fff; box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.55); background: transparent; }
.page-hero .btn--ghost:hover { box-shadow: inset 0 0 0 1.5px #fff; background: rgba(255,255,255,.1); }
.page-hero .term-chips a { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.2); color: #efeedd; }
.page-hero .term-chips a:hover, .page-hero .term-chips a.active { background: var(--lime); border-color: var(--lime); color: var(--olive-ink); }

.post-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 1.6rem; }
@media (max-width:900px){ .post-grid { grid-template-columns: repeat(2,1fr);} }
@media (max-width:560px){ .post-grid { grid-template-columns: 1fr;} }
.post-grid .show { display: block; }

.post-meta { display: flex; gap: .8rem; align-items: center; font-size: .8rem; color: var(--olive-soft); letter-spacing: .04em; text-transform: uppercase; }
.post-meta .cat { color: var(--olive); font-weight: 700; }

.term-chips { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1.6rem; }
.term-chips a { padding: .45rem .95rem; border-radius: var(--r-pill); background: var(--cream-2); border:1px solid var(--line-soft); font-size:.85rem; font-weight:600; color: var(--olive-ink); transition: background .25s, color .25s; }
.term-chips a:hover, .term-chips a.active { background: var(--olive-deep); color:#fff; }

.article { max-width: 760px; margin-inline: auto; }
/* Blog detail - header to content hierarchy + hero glow */
.single article.section { position: relative; isolation: isolate; padding-top: clamp(7rem, 9vw, 9.5rem); }
.single article.section::before { content: ""; position: absolute; inset: 0 0 auto 0; height: clamp(340px, 46vh, 560px); z-index: -1; pointer-events: none; background: radial-gradient(58% 80% at 50% 0%, rgba(231,234,107,.20), rgba(231,234,107,0) 64%); }
.article-hero { text-align: center; container-type: inline-size; }
/* Language switcher — only rendered when a translation actually exists. */
.langbar { display: inline-flex; gap: 4px; padding: 4px; margin: 0 auto clamp(.9rem, 2vw, 1.3rem);
  background: var(--sand); border-radius: var(--r-pill); }
.langbar__pill { display: inline-block; padding: .34rem .82rem; border-radius: var(--r-pill); text-decoration: none;
  font-size: .72rem; font-weight: 700; letter-spacing: .1em; color: var(--olive); transition: background .2s var(--ease), color .2s var(--ease); }
.langbar__pill:hover { color: var(--olive-deep); }
.langbar__pill.is-active { background: var(--olive-deep); color: #fff; }
.article .post-meta { justify-content: center; gap: .7rem; margin-bottom: clamp(.9rem, 2vw, 1.4rem); }
.article .post-meta .cat { background: #edf0cf; color: var(--olive-deep); font-weight: 700; padding: .34rem .85rem; border-radius: var(--r-pill); letter-spacing: .12em; }
.article .post-meta .date { color: var(--olive-soft); }
.article .post-meta .dot { width: 4px; height: 4px; border-radius: 50%; background: var(--avocado); flex: 0 0 auto; }
/* Title sizing: titles run 32-82 chars, a 2.5x spread, so no single font-size can
   put them all on two lines — the size has to follow the length. --tlen comes from
   single.php; 335cqw/len is the largest constant where every live title lands on
   <=2 lines at 760px — measured ON THE LIVE PAGES by binary-searching each title's
   max size (a local mock mis-measured it: the real font renders ~0.6em/char, not
   0.5, and per-title char mix pushes the needed constant from 338 to 433). Clamped so a short
   title still reads big and a very long one never gets unreadable; on a narrow
   phone column the min wins and long titles legitimately take 3 lines. */
.article h1 { font-size: clamp(1.5rem, calc(335cqw / var(--tlen, 40)), 3.2rem); text-align: center; line-height: 1.08; letter-spacing: -.015em; max-width: none; margin-inline: auto; text-wrap: balance; }
.article .featured { margin: clamp(2rem,4vw,3rem) 0; border-radius: var(--r-lg); overflow: hidden; box-shadow: 0 30px 66px -24px rgba(45,50,8,.32), 0 8px 20px rgba(45,50,8,.10); }
.article-nav { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(.9rem, 2vw, 1.4rem); margin-top: clamp(2.6rem, 5vw, 3.8rem); padding-top: clamp(2rem, 4vw, 2.8rem); border-top: 1px solid var(--line); }
.article-nav__spacer { display: block; }
.article-nav__item { display: flex; align-items: center; gap: 1rem; min-width: 0; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: .75rem; box-shadow: var(--shadow-sm); transition: transform .35s var(--ease), box-shadow .35s var(--ease), border-color .35s var(--ease); }
.article-nav__item:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--avocado); }
.article-nav__item--next { text-align: right; }
.article-nav__thumb { flex: 0 0 auto; width: 88px; height: 88px; border-radius: var(--r-md); overflow: hidden; background: var(--sand); }
.article-nav__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .5s var(--ease); }
.article-nav__item:hover .article-nav__thumb img { transform: scale(1.06); }
.article-nav__txt { display: flex; flex-direction: column; gap: .25rem; min-width: 0; }
.article-nav__dir { font-size: .72rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--avocado); }
.article-nav__title { font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); font-size: 1rem; line-height: 1.25; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
@media (max-width: 640px){ .article-nav { grid-template-columns: 1fr; } .article-nav__spacer { display: none; } .article-nav__item--next { text-align: left; } }

.single-hero { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(2rem,4vw,3.5rem); align-items: center; }
.single-hero .media { border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-md); aspect-ratio: 4/3; }
.single-hero .media img { width:100%; height:100%; object-fit: cover; }
@media (max-width:820px){ .single-hero { grid-template-columns: 1fr;} }

.empty-state { text-align:center; padding: clamp(3rem,8vw,6rem) 0; }
.empty-state h2 { font-size: var(--fs-h3); }

.search-form { display: inline-flex; gap: .5rem; background: var(--cream-2); padding: .4rem; border-radius: var(--r-pill); border:1px solid var(--line-soft); }
.search-form label { flex: 1; margin: 0; }
.search-form .search-field { width: 100%; border:0; background:none; padding:.55rem .9rem; font:inherit; color:var(--olive-ink); }
.search-form .search-field:focus-visible { outline: 2px solid var(--lime); outline-offset: 2px; border-radius: var(--r-pill); }
.search-form .search-submit { background: var(--olive-deep); color:#fff; border-radius: var(--r-pill); padding:.55rem 1.1rem; font-weight:600; cursor:pointer; }

/* ============================================================
   INQUIRY LIST (multi-product RFQ)
   ============================================================ */
.wc-cat-filter { margin-bottom: 1.8rem; }

.nutoast-add-inquiry .ok { display: none; }
.nutoast-add-inquiry.is-added { background: var(--olive-deep); color: #fff; box-shadow: none; }
.nutoast-add-inquiry.is-added .lbl { display: none; }
.nutoast-add-inquiry.is-added .ok { display: inline; }
.nutoast-add-inquiry.is-added .ok::before { content: "✓ "; }
.nutoast-loop-actions { margin: .8rem 1.3rem 1.4rem; }
.nutoast-sample-link { margin-top: 1rem; }

.nutoast-inq-launcher { background: var(--olive-deep); color: #fff; }
.nutoast-inq-launcher:hover { background: var(--olive-ink); }
.nutoast-inq-launcher svg { width: 24px; height: 24px; }
.nutoast-inq-launcher .count {
  position: absolute; top: -4px; right: -4px; min-width: 22px; height: 22px; padding: 0 5px;
  border-radius: var(--r-pill); background: var(--lime); color: var(--olive-ink);
  font: 700 .75rem/22px var(--font-body); text-align: center; box-shadow: 0 2px 6px rgba(0,0,0,.25);
}
.nutoast-inq-launcher[hidden] { display: none; }
.nutoast-inq-launcher:not([hidden]) { animation: fabPop .35s var(--ease); }
@keyframes fabPop { from { opacity: 0; transform: scale(.4) translateY(8px); } to { opacity: 1; transform: none; } }
.nutoast-hp { position: absolute !important; left: -9999px; width: 1px; height: 1px; opacity: 0; pointer-events: none; }

.nutoast-inq-scrim { position: fixed; inset: 0; background: rgba(20,22,4,.45); opacity: 0; visibility: hidden; transition: .35s; z-index: 110; }
.nutoast-inq-scrim.open { opacity: 1; visibility: visible; }
.nutoast-inq-drawer {
  position: fixed; top: 0; right: 0; bottom: 0; width: min(92vw,420px); z-index: 115;
  background: var(--cream); box-shadow: var(--shadow-lg); transform: translateX(100%);
  transition: transform .5s var(--ease-out), visibility 0s linear .5s; display: flex; flex-direction: column; visibility: hidden;
}
.nutoast-inq-drawer.open { transform: none; visibility: visible; transition: transform .5s var(--ease-out), visibility 0s; }
.nutoast-inq-head { display: flex; align-items: center; justify-content: space-between; padding: 1.4rem 1.5rem; border-bottom: 1px solid var(--line-soft); }
.nutoast-inq-head h2 { font-size: 1.3rem; font-weight: 500; }
.nutoast-inq-close { font-size: 1.8rem; line-height: 1; color: var(--olive-soft); width: 40px; height: 40px; border-radius: 10px; }
.nutoast-inq-close:hover { background: rgba(20,22,4,.05); }
.nutoast-inq-items { flex: 1 1 auto; overflow-y: auto; padding: 1rem 1.5rem; }
.nutoast-inq-empty { color: var(--muted); text-align: center; padding: 2.5rem 1rem; }
.nutoast-inq-item { display: grid; grid-template-columns: 52px 1fr auto auto; gap: .8rem; align-items: center; padding: .8rem 0; border-bottom: 1px solid var(--line-soft); }
.nutoast-inq-item img, .nutoast-inq-item .ph { width: 52px; height: 52px; border-radius: 10px; object-fit: cover; background: var(--sand); }
.nutoast-inq-item .meta strong { font-family: var(--font-display); font-weight: 500; font-size: 1rem; color: var(--olive-deep); display: block; }
.nutoast-inq-item .meta span { font-size: .78rem; color: var(--muted); }
.nutoast-inq-item .qty { width: 52px; padding: .4rem; border: 1px solid var(--line); border-radius: 8px; font: inherit; text-align: center; }
.nutoast-inq-item .rm { font-size: 1.3rem; color: var(--olive-soft); width: 30px; height: 30px; border-radius: 8px; }
.nutoast-inq-item .rm:hover { background: rgba(118,18,18,.08); color: #761212; }
.nutoast-inq-form { padding: 1.3rem 1.5rem; border-top: 1px solid var(--line); background: var(--cream-2); display: grid; gap: .7rem; }
.nutoast-inq-formtitle { font-family: var(--font-display); font-size: 1.1rem; color: var(--olive-deep); margin: 0 0 .2rem; }
.nutoast-inq-form input, .nutoast-inq-form textarea { width: 100%; padding: .7rem .9rem; border: 1px solid var(--line); border-radius: var(--r-md); font: inherit; background: var(--cream); color: var(--olive-ink); }
.nutoast-inq-form input:focus-visible, .nutoast-inq-form textarea:focus-visible { outline: 2px solid var(--lime); outline-offset: 1px; }
.nutoast-inq-form .btn { justify-content: center; margin-top: .3rem; }
.nutoast-inq-msg { font-size: .88rem; min-height: 1.2em; }
.nutoast-inq-msg.ok { color: var(--olive); }
.nutoast-inq-msg.err { color: #761212; }
.nutoast-inq-file { display: grid; gap: .5rem; }
.nutoast-inq-file__drop { position: relative; display: flex; align-items: center; gap: .6rem; padding: .85rem 1rem; border: 1.5px dashed var(--line); border-radius: var(--r-md); background: var(--cream); cursor: pointer; transition: border-color .2s var(--ease), background .2s var(--ease); }
.nutoast-inq-file__drop:hover { border-color: var(--avocado); background: #fff; }
.nutoast-inq-file__drop:focus-within { outline: 2px solid var(--lime); outline-offset: 1px; }
.nutoast-inq-file__drop input[type=file] { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
.nutoast-inq-file__drop svg { width: 20px; height: 20px; flex: 0 0 auto; color: var(--avocado); }
.nutoast-inq-file__label { font-weight: 600; color: var(--olive-deep); }
.nutoast-inq-file__drop small { margin-left: auto; color: var(--muted); font-size: .8rem; white-space: nowrap; }
.nutoast-inq-file__list { list-style: none; margin: 0; padding: 0; display: grid; gap: .35rem; }
.nutoast-inq-file__list:empty { display: none; }
.nutoast-inq-file__item { font-size: .85rem; color: var(--olive); background: var(--cream-2); border: 1px solid var(--line); border-radius: 8px; padding: .4rem .7rem; word-break: break-word; }
.nutoast-inq-file__item.is-bad { color: #761212; background: #fbeaea; border-color: #f0c8c8; }
.nutoast-inq-file__hint { margin: 0; font-size: .78rem; color: var(--muted); }
@media (max-width: 420px){ .nutoast-inq-file__drop small { display: none; } }

@media (prefers-reduced-motion: reduce){ .nutoast-inq-drawer, .nutoast-inq-scrim { transition: none; } }

/* ============================================================
   CERTIFICATIONS + CLIENT LOGOS + ABOUT FEATURE
   ============================================================ */
.about-feature { border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-md); aspect-ratio: 16/7; background: var(--sand); }
.about-feature img { width: 100%; height: 100%; object-fit: cover; }

.cert-badges { display: flex; flex-wrap: wrap; justify-content: center; gap: 1.2rem; }
.cert-badge {
  display: flex; flex-direction: column; align-items: center; gap: .6rem; text-align: center;
  min-width: 130px; padding: 1.5rem 1.6rem; border: 1px solid var(--line-soft);
  border-radius: var(--r-lg); background: var(--cream); box-shadow: var(--shadow-sm);
  transition: transform .4s var(--ease), box-shadow .4s var(--ease);
}
.cert-badge:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.cert-badge img { height: 50px; width: auto; max-width: 120px; object-fit: contain; }
.cert-badge .cert-mark { width: 50px; height: 50px; display: grid; place-items: center; border-radius: 50%; background: var(--lime); color: var(--olive-deep); }
.cert-badge .cert-mark svg { width: 26px; height: 26px; }
.cert-badge .cert-name { font-family: var(--font-display); font-weight: 500; font-size: 1.02rem; color: var(--olive-deep); letter-spacing: .01em; }

.client-logos { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: clamp(1.5rem,4vw,3rem); margin-top: clamp(2rem,4vw,3rem); opacity: .72; filter: grayscale(1); }
.client-logos img { height: 38px; width: auto; }
@media (max-width: 520px){ .cert-badge { min-width: 0; flex: 1 1 40%; } }

/* scroll progress bar */
.scroll-progress {
  position: fixed; top: 0; left: 0; right: 0; height: 3px; transform: scaleX(0);
  transform-origin: 0 50%; background: linear-gradient(90deg, var(--avocado), var(--lime));
  z-index: 200; will-change: transform; pointer-events: none;
}
@media (prefers-reduced-motion: reduce){ .scroll-progress { display: none; } }

/* inquiry drawer — embedded FluentForm container */
.nutoast-inq-ff { padding: 1.3rem 1.5rem; border-top: 1px solid var(--line); background: var(--cream-2); }
.nutoast-inq-ff .nutoast-inq-formtitle { font-family: var(--font-display); font-size: 1.1rem; color: var(--olive-deep); margin: 0 0 .6rem; }

/* ============================================================
   TESTIMONIALS
   ============================================================ */
.tm-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 1.6rem; }
@media (max-width:900px){ .tm-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width:600px){ .tm-grid { grid-template-columns: 1fr; } }
.tm-card {
  margin: 0; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm); padding: 1.8rem; display: flex; flex-direction: column; gap: 1rem;
  transition: transform .5s var(--ease), box-shadow .5s var(--ease); position: relative; overflow: hidden;
}
.tm-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); }
.tm-card::before { content: "\201C"; position: absolute; top: .2rem; right: 1.2rem; font-family: var(--font-display); font-size: 4rem; line-height: 1; color: var(--lime); opacity: .5; }
.tm-stars { display: flex; gap: 2px; color: var(--sand); font-size: 1rem; }
.tm-stars .on { color: #e0b400; }
.tm-card blockquote { margin: 0; font-size: 1.02rem; line-height: 1.6; color: var(--olive-ink); position: relative; }
.tm-author { display: flex; align-items: center; gap: .8rem; margin-top: auto; }
.tm-ava { width: 46px; height: 46px; border-radius: 50%; overflow: hidden; flex: 0 0 auto; background: var(--sand); display: grid; place-items: center; }
.tm-ava img { width: 100%; height: 100%; object-fit: cover; }
.tm-ava--ph { background: var(--olive-deep); color: var(--lime); font-family: var(--font-display); font-size: 1.2rem; }
.tm-meta strong { display: block; font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); }
.tm-meta span { font-size: .82rem; color: var(--muted); }

/* ============================================================
   PRODUCT COMPARE (bar is global; table on the compare page)
   ============================================================ */
.nutoast-compare-loop { margin: -.3rem 1.3rem 1.2rem; }
.nutoast-add-compare.btn-mini { background: none; box-shadow: none; padding: .2rem 0; font-size: .82rem; font-weight: 600; color: var(--olive-soft); display: inline-flex; align-items: center; gap: .3rem; border-radius: 0; }
.nutoast-add-compare.btn-mini::before { content: "\21C4"; font-size: .95rem; }
.nutoast-add-compare.btn-mini:hover { color: var(--olive-deep); transform: none; }
.nutoast-add-compare .ok { display: none; }
.nutoast-add-compare.is-added .lbl { display: none; }
.nutoast-add-compare.is-added .ok { display: inline; }
.nutoast-add-compare.btn-mini.is-added { color: var(--olive); }

.nutoast-compare-bar {
  position: fixed; left: 50%; transform: translateX(-50%); bottom: clamp(1rem,3vw,1.5rem); z-index: 96;
  display: flex; align-items: center; gap: 1rem; padding: .7rem .9rem .7rem 1rem;
  background: var(--olive-ink); color: #fff; border-radius: var(--r-pill); box-shadow: var(--shadow-lg);
  max-width: calc(100% - 2rem);
}
.nutoast-compare-bar[hidden] { display: none; }
.nutoast-compare-bar.is-max { animation: nutoastShake .4s; }
@keyframes nutoastShake { 25%{ transform: translateX(-50%) translateX(-6px); } 75%{ transform: translateX(-50%) translateX(6px); } }
.nutoast-compare-items { display: flex; gap: .5rem; }
.nutoast-cmp-thumb { position: relative; width: 42px; height: 42px; border-radius: 10px; overflow: hidden; background: rgba(255,255,255,.12); display: grid; place-items: center; }
.nutoast-cmp-thumb img { width: 100%; height: 100%; object-fit: cover; }
.nutoast-cmp-thumb .rm { position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; border-radius: 50%; background: var(--lime); color: var(--olive-ink); font-size: 12px; line-height: 1; display: grid; place-items: center; }
.nutoast-compare-actions { display: flex; align-items: center; gap: .6rem; }
.nutoast-cmp-clear { color: #b9bd9f; font-size: .85rem; }
.nutoast-cmp-clear:hover { color: #fff; }
@media (max-width:520px){ .nutoast-compare-bar { flex-direction: column; gap: .6rem; border-radius: var(--r-lg); } }

.cmp-table-wrap { overflow-x: auto; }
.cmp-table { width: 100%; border-collapse: collapse; min-width: 560px; }
.cmp-table th, .cmp-table td { padding: .9rem 1rem; border-bottom: 1px solid var(--line-soft); text-align: left; vertical-align: top; font-size: .92rem; }
.cmp-table thead th { vertical-align: bottom; border-bottom: 2px solid var(--line); }
.cmp-table tbody th[scope="row"] { width: 22%; color: var(--olive-soft); font-weight: 600; background: rgba(20,22,4,.025); }
.cmp-head { display: block; }
.cmp-head img { width: 100%; max-width: 150px; aspect-ratio: 16/12; object-fit: cover; border-radius: var(--r-md); }
.cmp-name { display: block; margin-top: .6rem; font-family: var(--font-display); font-weight: 500; font-size: 1.05rem; color: var(--olive-deep); }
.cmp-cta-row td { border-bottom: 0; }

/* currency switcher slot (header) */
.nutoast-currency { display: flex; align-items: center; font-size: .9rem; color: var(--olive-ink); }
.nutoast-currency select { font: inherit; padding: .4rem .6rem; border: 1px solid var(--line); border-radius: var(--r-pill); background: var(--cream); }
@media (max-width: 1080px){ .nutoast-currency { display: none; } }


/* ============================================================
   ABOUT — BESPOKE (purpose-built /about/, homepage design language).
   Extends the ABOUT PAGE block above; token-aligned, .about-* scoped.
   ============================================================ */

/* ---- Hero: masthead set-back year + operating-snapshot ledger ---- */
.about-hero--ledger { position: relative; }
.about-hero--ledger .wrap { position: relative; z-index: 1; }
.about-hero__grid { display: grid; grid-template-columns: 1.35fr .9fr; gap: clamp(1.8rem,4vw,3.6rem); align-items: end; }
.about-hero__lede { max-width: 60ch; }
.about-hero--ledger h1 { max-width: 17ch; }
.hero-year {
  position: absolute; top: clamp(-1rem,-2vw,.5rem); right: clamp(-1rem,2vw,2rem); z-index: -1;
  font-family: var(--font-display); font-weight: 500; line-height: .8; letter-spacing: -.03em;
  font-size: clamp(8rem,22vw,17rem); pointer-events: none;
  color: color-mix(in srgb, var(--olive) 16%, transparent);
  animation: heroYear 1.2s var(--ease-out) both;
}
@keyframes heroYear { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: none; } }
.spec-ledger { background: var(--cream-2); border: 1px solid var(--line); border-radius: var(--r-lg); padding: clamp(1.3rem,2.4vw,1.7rem); box-shadow: var(--shadow-sm); }
.spec-ledger__title { font-family: var(--font-body); font-size: var(--fs-eyebrow); text-transform: uppercase; letter-spacing: .22em; font-weight: 600; color: var(--olive-soft); margin-bottom: 1rem; }
.spec-ledger dl { margin: 0; display: grid; gap: .85rem; }
.spec-ledger .row { display: grid; gap: .15rem; padding-bottom: .85rem; border-bottom: 1px solid var(--line-soft); }
.spec-ledger .row:last-child { padding-bottom: 0; border-bottom: 0; }
.spec-ledger dt { font-family: var(--font-display); font-size: .8rem; letter-spacing: .14em; text-transform: uppercase; color: var(--avocado); }
.spec-ledger dd { margin: 0; color: var(--muted); font-size: .95rem; line-height: 1.5; }
.about-hero__seal { position: absolute; right: -.5rem; bottom: -1rem; width: clamp(120px,16vw,200px); color: #fff; opacity: .07; pointer-events: none; z-index: 0; }
.about-hero__seal svg { width: 100%; height: auto; }
@media (max-width: 820px){ .about-hero__grid { grid-template-columns: 1fr; align-items: start; } }
@media (max-width: 560px){ .hero-year { font-size: clamp(6rem,30vw,9rem); opacity: .8; } }

/* ---- Ledger band: About-specific light header over the stats mesh ---- */
.stats--about { padding-block: clamp(2.2rem, 1.6rem + 2vw, 3.4rem); }
.stats--about .section-head { position: relative; z-index: 1; max-width: 640px; margin-inline: auto; text-align: center; margin-bottom: clamp(1.4rem,3vw,2.2rem); }
.stats--about .section-head .eyebrow { color: var(--olive); justify-content: center; }
.stats--about .section-head .eyebrow::before,
.stats--about .section-head .eyebrow::after { background: var(--avocado); }
.stats--about .section-head h2 { color: var(--olive-deep); }
.stats--about .section-head p { color: var(--olive); }

/* ---- Story spine: the "Since 2003" backbone ---- */
.about-story .wrap { display: grid; grid-template-columns: clamp(80px,11vw,130px) minmax(0,1fr); gap: clamp(1.4rem,4vw,3.2rem); }
.story-spine { position: relative; }
.story-spine::before { content:""; position: absolute; left: 50%; top: .4rem; bottom: .4rem; width: 2px; transform: translateX(-50%); background: repeating-linear-gradient(to bottom, var(--avocado) 0 8px, transparent 8px 16px); opacity: .45; }
.story-spine__label { position: sticky; top: 7rem; writing-mode: vertical-rl; transform: rotate(180deg); font-family: var(--font-display); font-size: clamp(1.1rem,1.6vw,1.5rem); letter-spacing: .3em; text-transform: uppercase; color: var(--olive-soft); white-space: nowrap; }
.story-beats { display: grid; gap: clamp(1.8rem,4vw,3rem); }
.story-beat { position: relative; padding-left: clamp(1.2rem,2vw,1.8rem); }
.story-beat::before { content:""; position: absolute; left: 0; top: .55rem; width: 11px; height: 11px; border-radius: 50%; background: var(--avocado); box-shadow: 0 0 0 5px color-mix(in srgb, var(--avocado) 16%, transparent); }
.story-beat__yr { display: inline-flex; align-items: center; gap: .5rem; font-size: var(--fs-eyebrow); font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--olive-soft); margin-bottom: .5rem; }
.story-beat__ic { display: inline-grid; place-items: center; width: 26px; height: 26px; border-radius: 8px; background: var(--lime); color: var(--olive-deep); }
.story-beat__ic svg { width: 15px; height: 15px; }
.story-beat h3 { font-size: var(--fs-h4); margin-bottom: .5rem; }
.story-beat p { color: var(--muted); font-size: var(--fs-body); line-height: 1.6; max-width: 62ch; }
@media (max-width: 720px){ .about-story .wrap { grid-template-columns: 1fr; } .story-spine { display: none; } }

/* ---- Integration: dark .split band ---- */
.about-integration .eyebrow { color: var(--lime); }
.about-integration .eyebrow::before { background: var(--lime); }
.about-integration .split p.lead { color: #c7cbab; }
.about-integration .feature-list b { color: #fff; }
.about-integration .feature-list span { color: #aeb38c; }
.about-integration .split-media { box-shadow: var(--shadow-lg); }
.split-media__tab { position: absolute; left: 1rem; bottom: 1rem; z-index: 2; background: var(--lime); color: var(--olive-ink); font-family: var(--font-display); font-size: .85rem; letter-spacing: .02em; padding: .5rem .85rem; border-radius: var(--r-pill); box-shadow: var(--shadow-sm); }

/* ---- Flow: numbered "process page" (CSS counter, JS-safe) ---- */
.about-flow .section-head { margin-inline: 0; text-align: left; }
.about-flow .flow-rule { height: 1px; background: var(--line); margin: 0 0 clamp(1.8rem,4vw,2.8rem); }
.about-flow .flow { counter-reset: flowstep; }
.about-flow .flow__step { counter-increment: flowstep; }
.about-flow .flow__node { position: relative; }
.about-flow .flow__node::after { content: "0" counter(flowstep); position: absolute; top: -.7rem; left: 50%; transform: translateX(-50%); font-family: var(--font-display); font-size: .72rem; letter-spacing: .12em; color: var(--olive-soft); background: var(--cream); padding: 0 .4rem; border-radius: var(--r-pill); }

/* ---- Quality: asymmetric unframed compliance plate ---- */
.about-quality .section-head { margin-inline: 0; text-align: left; max-width: none; }
.about-quality__cols { display: grid; grid-template-columns: minmax(0,.9fr) minmax(0,1.1fr); gap: clamp(2rem,5vw,4rem); align-items: center; }
.qual-notes { display: grid; gap: 1rem; list-style: none; padding: 0; margin: 0; }
.qual-notes li { display: flex; gap: .8rem; align-items: flex-start; }
.qual-notes__ic { flex: 0 0 28px; width: 28px; height: 28px; border-radius: 8px; background: var(--lime); display: grid; place-items: center; color: var(--olive-deep); }
.qual-notes__ic svg { width: 16px; }
.qual-notes b { display: block; font-family: var(--font-display); font-weight: 400; color: var(--olive-deep); font-size: 1.05rem; }
.qual-notes span { color: var(--muted); font-size: .92rem; line-height: 1.55; }
.about-quality .cert-showcase { margin-top: 0; }
.about-quality .cert-showcase img { display: block; width: 100%; max-width: 640px; height: auto; margin-inline: auto; }
@media (max-width: 900px){ .about-quality__cols { grid-template-columns: 1fr; } .about-quality .cert-showcase img { max-width: 560px; } }

/* ---- Reach: export-figures row under the dissolved map ---- */
.about-reach .reach-figures { margin-top: clamp(1.4rem,3vw,2.2rem); display: flex; flex-wrap: wrap; justify-content: center; gap: clamp(1.2rem,4vw,3rem); text-align: center; }
.about-reach .reach-figure { display: grid; gap: .15rem; }
.about-reach .reach-figure b { font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); font-size: clamp(1.5rem,1.2rem+1.2vw,2.1rem); line-height: 1; }
.about-reach .reach-figure span { font-size: var(--fs-eyebrow); text-transform: uppercase; letter-spacing: .16em; color: var(--olive-soft); }

/* ---- Support: shared dashboard index numeral on wide icards ---- */
.about-support .icard { position: relative; }
.about-support .icard__no { position: absolute; top: clamp(1.3rem,2.4vw,1.8rem); right: clamp(1.3rem,2.4vw,1.8rem); font-family: var(--font-display); font-size: .8rem; letter-spacing: .18em; color: var(--olive-soft); opacity: .75; }

/* ---- Recognition: CSS-drawn rosette seal strip (no broken image) ---- */
.about-recognition .awards-seals { display: flex; flex-wrap: wrap; justify-content: center; gap: clamp(1.8rem,5vw,3.4rem); margin: clamp(1.6rem,3vw,2.4rem) auto 0; padding-top: clamp(1.6rem,3vw,2.4rem); border-top: 1px solid var(--line); max-width: 760px; list-style: none; }
.award-seal { display: grid; justify-items: center; gap: .7rem; text-align: center; }
.award-seal__ic { display: grid; place-items: center; width: 56px; height: 56px; color: var(--avocado); }
.award-seal__ic svg { width: 56px; height: 56px; }
.award-seal span { font-family: var(--font-display); font-size: .9rem; letter-spacing: .04em; color: var(--olive-deep); }
.award-notes { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.2rem,3vw,2.4rem); max-width: 760px; margin: clamp(1.6rem,3vw,2.4rem) auto 0; }
.award-notes b { display: block; font-family: var(--font-display); font-weight: 400; color: var(--olive-deep); margin-bottom: .25rem; }
.award-notes p { color: var(--muted); font-size: .92rem; line-height: 1.55; }
@media (max-width: 560px){ .award-notes { grid-template-columns: 1fr; } }

/* ---- Reduced motion ---- */
@media (prefers-reduced-motion: reduce){ .hero-year { animation: none; } }



/* ============================================================
   RESOURCES — BESPOKE (purpose-built /resources/, homepage design
   language; SIBLING of /about/, not a clone). Token-aligned, .res-*
   scoped. The "procurement & documentation desk." Reuses .spec-ledger
   (verbatim), .stats-grid/.stat (lime-on-ink), .flow/.flow__node, and
   the set-back-numeral + CSS-counter-chip mechanics under NEW scopes.
   ============================================================ */

/* ---- Hero: set-back "DOCS" wordmark + "Documentation Index" ledger ---- */
.res-hero--desk { position: relative; }
.res-hero--desk .wrap { position: relative; z-index: 1; }
.res-hero__grid { display: grid; grid-template-columns: 1.35fr .9fr; gap: clamp(1.8rem,4vw,3.6rem); align-items: end; }
.res-hero__lede { max-width: 60ch; }
.res-hero h1 { max-width: 22ch; }
.res-hero .lead { max-width: 62ch; }
.res-hero__mark {
  position: absolute; top: clamp(-.5rem,-1.5vw,1rem); right: clamp(-1.5rem,1vw,1.5rem); z-index: -1;
  font-family: var(--font-display); font-weight: 500; line-height: .8; letter-spacing: -.04em;
  font-size: clamp(5.5rem,16vw,12rem); text-transform: uppercase; pointer-events: none; user-select: none;
  color: color-mix(in srgb, var(--avocado) 14%, transparent);
  animation: heroYear 1.2s var(--ease-out) both; /* reuse About's keyframe (defined in main.css) */
}
.res-hero__cta { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 1.8rem; }
.res-index .spec-ledger__title { color: var(--avocado); }
@media (max-width: 820px){ .res-hero__grid { grid-template-columns: 1fr; align-items: start; } }
@media (max-width: 560px){ .res-hero__mark { font-size: clamp(4rem,26vw,7rem); opacity: .9; } }

/* ---- Directory: real-pages-only quick-links w/ set-back index numerals ---- */
.res-dir-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: clamp(1rem,2.2vw,1.6rem); }
.res-dir-card {
  position: relative; display: flex; flex-direction: column; gap: .55rem;
  background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(1.4rem,2.4vw,1.9rem); box-shadow: var(--shadow-sm);
  transition: transform .4s var(--ease), box-shadow .4s var(--ease), border-color .4s var(--ease);
}
.res-dir-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); border-color: color-mix(in srgb, var(--avocado) 50%, transparent); }
.res-dir-card__no { position: absolute; top: clamp(1.3rem,2.4vw,1.7rem); right: clamp(1.3rem,2.4vw,1.7rem); font-family: var(--font-display); font-size: .8rem; letter-spacing: .18em; color: var(--olive-soft); opacity: .7; }
.res-dir-card__ic { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 14px; background: var(--lime); color: var(--olive-deep); margin-bottom: .35rem; transition: background .35s var(--ease); }
.res-dir-card__ic svg { width: 24px; height: 24px; }
.res-dir-card:hover .res-dir-card__ic { background: var(--lime-bright); }
.res-dir-card h3 { font-size: 1.18rem; color: var(--olive-deep); }
.res-dir-card p { color: var(--muted); font-size: .92rem; line-height: 1.55; flex: 1; }
.res-dir-card .link-arrow { margin-top: .4rem; font-size: .88rem; }
@media (max-width: 900px){ .res-dir-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px){ .res-dir-grid { grid-template-columns: 1fr; } }

/* ---- Documentation: asymmetric plate + numbered spec-sheet rows
   (re-declared locally; woocommerce.css .nutoast-doc is NOT loaded here) ---- */
.res-docs__cols { display: grid; grid-template-columns: minmax(0,.9fr) minmax(0,1.1fr); gap: clamp(2rem,5vw,4rem); align-items: start; }
.res-docs__intro { position: sticky; top: 7rem; }
.res-docs__intro .section-head { margin-inline: 0; max-width: none; margin-bottom: 1rem; }
.res-docs__note { display: inline-flex; align-items: center; gap: .5rem; margin: 0 0 1.3rem; font-family: var(--font-display); font-size: .85rem; letter-spacing: .04em; color: var(--avocado); }
.res-docs__note::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--avocado); box-shadow: 0 0 0 4px color-mix(in srgb, var(--avocado) 18%, transparent); }
.res-doc-list { list-style: none; padding: 0; margin: 0; display: grid; gap: .7rem; }
.res-doc {
  display: grid; grid-template-columns: auto auto 1fr auto; gap: .9rem; align-items: center;
  padding: .9rem 1.1rem; background: var(--cream); border: 1px solid var(--line);
  border-radius: var(--r-md); box-shadow: var(--shadow-sm);
  transition: border-color .3s var(--ease), transform .3s var(--ease), box-shadow .3s var(--ease);
}
.res-doc:hover { border-color: color-mix(in srgb, var(--avocado) 50%, transparent); transform: translateY(-2px); box-shadow: var(--shadow-md); }
.res-doc__no { font-family: var(--font-display); font-size: .82rem; letter-spacing: .14em; color: var(--avocado); align-self: center; }
.res-doc__ic { display: grid; place-items: center; width: 38px; height: 38px; border-radius: 10px; background: color-mix(in srgb, var(--lime) 55%, var(--cream-2)); color: var(--olive-deep); }
.res-doc__ic svg { width: 20px; height: 20px; }
.res-doc__body { min-width: 0; }
.res-doc__body b { display: block; font-family: var(--font-display); font-weight: 500; font-size: 1.02rem; color: var(--olive-deep); line-height: 1.25; }
.res-doc__body b a { color: inherit; text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--avocado) 50%, transparent); text-underline-offset: 3px; }
.res-doc__body b a:hover { text-decoration-color: var(--avocado); }
.res-doc__body span { display: block; color: var(--muted); font-size: .86rem; line-height: 1.45; margin-top: .12rem; }
.res-doc__tag { justify-self: end; font-family: var(--font-body); font-size: .7rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--olive); background: var(--cream-2); border: 1px solid var(--line-soft); padding: .3rem .6rem; border-radius: var(--r-pill); white-space: nowrap; }
.res-doc__tag--live { color: var(--olive-ink); background: var(--lime); border-color: transparent; }
.res-docs__foot { margin-top: 1.4rem; font-size: .82rem; color: var(--olive-soft); }
@media (max-width: 900px){ .res-docs__cols { grid-template-columns: 1fr; } .res-docs__intro { position: static; } }
@media (max-width: 480px){ .res-doc { grid-template-columns: auto 1fr; row-gap: .45rem; } .res-doc__ic { grid-row: span 2; } .res-doc__tag { justify-self: start; grid-column: 2; } }

/* ---- Certified systems: CSS-drawn rosette seals (no logo files) ---- */
.res-cert-strip { display: flex; flex-wrap: wrap; justify-content: center; gap: clamp(1.8rem,5vw,3.6rem); margin: clamp(1.8rem,3vw,2.6rem) auto 0; padding-top: clamp(1.6rem,3vw,2.4rem); border-top: 1px solid var(--line); max-width: 860px; list-style: none; }
.res-cert-seal { display: grid; justify-items: center; gap: .6rem; text-align: center; }
.res-cert-seal__ic { display: grid; place-items: center; width: 54px; height: 54px; color: var(--avocado); transition: transform .4s var(--ease); }
.res-cert-seal__ic svg { width: 54px; height: 54px; }
.res-cert-seal:hover .res-cert-seal__ic { transform: translateY(-3px) rotate(-4deg); }
.res-cert-seal span { font-family: var(--font-display); font-size: .9rem; letter-spacing: .04em; color: var(--olive-deep); }
.res-certs__foot { text-align: center; margin-top: clamp(1.4rem,3vw,2rem); color: var(--muted); font-size: .9rem; }
.res-certs__foot .link-arrow { font-size: .9rem; }

/* ---- Request band: the ONE --ink band — counters + numbered res-flow ---- */
.res-request .section-head { max-width: 640px; margin-inline: auto; }
.res-request .eyebrow { color: var(--lime); justify-content: center; }
.res-request .eyebrow::before, .res-request .eyebrow::after { background: var(--lime); }
.res-request h2 { color: #fff; }
.res-request .stats-grid { margin-bottom: clamp(2.4rem,5vw,3.6rem); }
.res-request .res-flow-rule { height: 1px; background: rgba(255,255,255,.14); margin: 0 auto clamp(1.8rem,4vw,2.6rem); max-width: 920px; }
/* re-declare About's CSS-counter chip trick under a NEW scope (.res-flow) */
.res-flow { counter-reset: resstep; }
.res-flow .flow__step { counter-increment: resstep; }
.res-flow .flow__node { position: relative; background: rgba(255,255,255,.06); border-color: rgba(255,255,255,.18); color: var(--lime); }
.res-flow .flow__node::after { content: "0" counter(resstep); position: absolute; top: -.7rem; left: 50%; transform: translateX(-50%); font-family: var(--font-display); font-size: .72rem; letter-spacing: .12em; color: var(--olive-deep); background: var(--lime); padding: 0 .45rem; border-radius: var(--r-pill); }
.res-flow.flow::before { background: repeating-linear-gradient(to right, var(--lime) 0 8px, transparent 8px 16px); opacity: .4; }
.res-flow .flow__step h3 { color: #fff; }
.res-flow .flow__step p { color: #c7cbab; }
.res-request__cta { display: flex; flex-wrap: wrap; gap: .8rem; justify-content: center; margin-top: clamp(2rem,4vw,2.8rem); }

/* ---- Applications: graceful by-industry icon grid (recipes=0) ---- */
.res-apps .section-head { margin-inline: 0; max-width: none; }
.res-app-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: clamp(1rem,2.2vw,1.5rem); }
.res-app-card { display: flex; flex-direction: column; gap: .5rem; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: clamp(1.3rem,2.4vw,1.7rem); box-shadow: var(--shadow-sm); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.res-app-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.res-app-card__ic { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 14px; background: var(--lime); color: var(--olive-deep); margin-bottom: .3rem; }
.res-app-card__ic svg { width: 24px; height: 24px; }
.res-app-card h3 { font-size: 1.12rem; color: var(--olive-deep); }
.res-app-card p { color: var(--muted); font-size: .9rem; line-height: 1.55; flex: 1; }
.res-app-card .link-arrow { font-size: .84rem; margin-top: .3rem; }
.res-apps__cta { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.4rem; margin-top: clamp(1.8rem,3.5vw,2.6rem); padding-top: clamp(1.6rem,3vw,2.2rem); border-top: 1px solid var(--line); }
.res-apps__cta p { color: var(--muted); font-size: .96rem; max-width: 56ch; margin: 0; flex: 1; }
@media (max-width: 900px){ .res-app-grid { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 520px){ .res-app-grid { grid-template-columns: 1fr; } .res-apps__cta { flex-direction: column; align-items: flex-start; } }

/* ---- FAQ: asymmetric split (LIGHT surface) + native <details>, zero JS ---- */
.res-faq__cols { display: grid; grid-template-columns: minmax(0,1.15fr) minmax(0,.85fr); gap: clamp(2rem,5vw,3.6rem); align-items: start; }
.res-faq-sec .section-head { margin-inline: 0; max-width: none; }
.res-faq { display: grid; gap: .7rem; list-style: none; padding: 0; margin: 0; }
.res-faq__item { border: 1px solid var(--line); border-radius: var(--r-md); background: var(--cream); box-shadow: var(--shadow-sm); overflow: hidden; transition: border-color .3s var(--ease), box-shadow .3s var(--ease); }
.res-faq__item[open] { border-color: color-mix(in srgb, var(--avocado) 55%, transparent); box-shadow: var(--shadow-md); }
.res-faq__q { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; padding: 1.05rem 1.3rem; font-family: var(--font-display); font-weight: 500; font-size: var(--fs-h4); color: var(--olive-deep); }
.res-faq__q::-webkit-details-marker { display: none; }
.res-faq__q:focus-visible { outline: 2px solid var(--lime); outline-offset: 2px; border-radius: var(--r-md); }
.res-faq__no { flex: 0 0 auto; font-size: .82rem; letter-spacing: .12em; color: var(--avocado); }
.res-faq__q > span:not(.res-faq__no) { flex: 1; }
.res-faq__chev { flex: 0 0 auto; width: 22px; height: 22px; color: var(--avocado); transition: transform .35s var(--ease); }
.res-faq__item[open] .res-faq__chev { transform: rotate(180deg); }
.res-faq__a { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .4s var(--ease-out); }
.res-faq__item[open] .res-faq__a { grid-template-rows: 1fr; }
.res-faq__a-inner { overflow: hidden; }
.res-faq__a-inner p { padding: 0 1.3rem 1.2rem 3.15rem; color: var(--muted); font-size: var(--fs-body); line-height: 1.65; margin: 0; max-width: 64ch; }
/* FAQ aside — sticky "Ask the desk" next-step card */
.res-faq__aside { position: sticky; top: 7rem; background: var(--cream-2); border: 1px solid var(--line); border-radius: var(--r-lg); padding: clamp(1.5rem,2.6vw,2rem); box-shadow: var(--shadow-sm); }
.res-faq__aside-title { font-family: var(--font-body); font-size: var(--fs-eyebrow); text-transform: uppercase; letter-spacing: .22em; font-weight: 600; color: var(--avocado); margin-bottom: .9rem; }
.res-faq__aside p { color: var(--muted); font-size: .94rem; line-height: 1.6; margin-bottom: 1.1rem; }
.res-faq__aside .feature-list { margin-bottom: 1.4rem; }
.res-faq__aside .btn { width: 100%; justify-content: center; }
@media (max-width: 860px){ .res-faq__cols { grid-template-columns: 1fr; } .res-faq__aside { position: static; } .res-faq__a-inner p { padding-left: 1.3rem; } }

@media (prefers-reduced-motion: reduce){ .res-faq__a, .res-faq__chev, .res-hero__mark, .res-dir-card__ic, .res-cert-seal__ic { transition: none; animation: none; } }



/* ============================================================
   NEWS — BESPOKE (purpose-built /news/, homepage design language;
   SIBLING of /about/ + /resources/, NOT a clone). Token-aligned,
   .news-* scoped. Identity = "The Nutoast Dispatch" PRESS DESK:
   a set-back masthead wordmark + live issue dateline (reuses the
   set-back-numeral + heroYear mechanic as a newspaper masthead,
   not an est. year/DOCS wordmark), a lead-story + .post-grid
   "dispatch board", a subscribe-first empty plate (never an empty
   grid), the ONE --ink "briefing" band carrying the verbatim
   footer .sub-form (+ a scoped .sub-form--ink light variant), and
   a numbered newsroom-desk cross-link grid. The .post-grid /
   .supply-card / .shows / .sub-form / .stat all reused verbatim.
   ============================================================ */

/* ---- Hero / masthead: set-back "DISPATCH" wordmark + live dateline rule ---- */
.news-hero { position: relative; }
.news-hero .wrap { position: relative; z-index: 1; }
.news-hero h1 { max-width: 24ch; }
.news-hero .lead { max-width: 64ch; }
.news-hero__mark {
  position: absolute; top: clamp(-.5rem,-1vw,1.2rem); right: clamp(-1.5rem,1vw,1.5rem); z-index: -1;
  font-family: var(--font-display); font-weight: 500; line-height: .8; letter-spacing: -.05em;
  font-size: clamp(5rem,15vw,11rem); text-transform: uppercase; pointer-events: none; user-select: none;
  color: color-mix(in srgb, var(--avocado) 13%, transparent);
  animation: heroYear 1.2s var(--ease-out) both;   /* reuse About's keyframe (defined above) */
}
/* the masthead dateline rule — a live publication signal under the lede */
.news-dateline {
  display: flex; align-items: center; flex-wrap: wrap; gap: .4rem .7rem; margin-top: 1.6rem;
  font-family: var(--font-display); font-size: .82rem; letter-spacing: .04em; color: var(--olive-soft);
}
.news-dateline__rule { display: none; }
/* The dot separates "Vol. 01 · August 2026" from the dateline label. The row
   wraps on a narrow screen and the dot was left stranded at the end of the
   first line, reading as a typo. Below the width where it wraps, drop the dot
   and let the label sit on its own line. */
@media (max-width: 640px) {
  .news-dateline { gap: .15rem .7rem; }
  .news-dateline__dot { display: none; }
  .news-dateline__issue,
  .news-dateline__label { flex: 1 0 100%; }
}
.news-dateline__issue { font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: #efeedd; }
.news-dateline__dot { color: var(--lime); }
.news-dateline__label { color: #c7cbab; }
.news-hero__cta { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 1.8rem; }
@media (max-width: 560px){ .news-hero__mark { font-size: clamp(3.6rem,24vw,6rem); opacity: .9; } }

/* ---- Dispatch board: wide lead-story card (reused .post-meta/.link-arrow) ---- */
.news-board .news-lead {
  display: grid; grid-template-columns: 1.15fr .85fr; align-items: stretch; gap: 0;
  background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm); overflow: hidden; margin-bottom: clamp(1.6rem,3vw,2.2rem);
  transition: transform .5s var(--ease), box-shadow .5s var(--ease);
}
.news-board .news-lead:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.news-lead__media { position: relative; display: block; background: var(--sand); aspect-ratio: 16/11; overflow: hidden; }
.news-lead__media img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease-out); }
.news-board .news-lead:hover .news-lead__media img { transform: scale(1.05); }
/* thumbnail-less lead degrades to an olive→lime press ground (mirrors .show--ph) */
.news-lead--ph .news-lead__media { background: linear-gradient(150deg, var(--olive-deep), var(--olive)); aspect-ratio: 16/11; }
.news-lead__flag {
  position: absolute; top: 1rem; left: 1rem; z-index: 2;
  font-family: var(--font-body); font-size: .68rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
  color: var(--olive-ink); background: var(--lime); padding: .34rem .7rem; border-radius: var(--r-pill);
  box-shadow: var(--shadow-sm);
}
.news-lead__body { padding: clamp(1.6rem,3vw,2.4rem); display: flex; flex-direction: column; justify-content: center; }
.news-lead__body h3 { font-size: var(--fs-h3); color: var(--olive-deep); margin-top: .7rem; line-height: 1.12; }
.news-lead__body h3 a:hover { color: var(--olive); }
.news-lead__body p { color: var(--muted); font-size: 1rem; line-height: 1.6; margin-top: .7rem; max-width: 52ch; }
.news-lead__body .link-arrow { margin-top: 1.2rem; }
@media (max-width: 760px){ .news-board .news-lead { grid-template-columns: 1fr; } .news-lead__media { aspect-ratio: 16/9; } }

/* ---- Empty state: an editorial plate that pivots to the briefing (NEVER an empty grid) ---- */
.news-empty { display: grid; place-items: center; }
.news-empty__plate {
  position: relative; max-width: 680px; width: 100%; text-align: center;
  background: var(--cream-2); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(2.2rem,5vw,3.4rem) clamp(1.6rem,4vw,3rem); box-shadow: var(--shadow-sm); overflow: hidden;
}
.news-empty__plate::before {   /* a faint lime press-glow, echoing the page-hero radial */
  content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background: radial-gradient(60% 80% at 50% -10%, rgba(231,234,107,.4), transparent 60%);
}
.news-empty__plate > * { position: relative; z-index: 1; }
.news-empty__no {
  display: block; font-family: var(--font-display); font-weight: 500; line-height: 1;
  font-size: clamp(2.6rem,6vw,4rem); letter-spacing: -.02em;
  color: color-mix(in srgb, var(--avocado) 22%, transparent); margin-bottom: .4rem;
}
.news-empty__plate .eyebrow { justify-content: center; }
.news-empty__plate h3 { font-size: var(--fs-h3); color: var(--olive-deep); margin-top: .9rem; }
.news-empty__plate > p { color: var(--muted); font-size: 1rem; line-height: 1.65; margin: 1rem auto 0; max-width: 56ch; }
.news-empty__form { max-width: 440px; margin: 1.6rem auto .6rem; flex-wrap: wrap; }
.news-empty__alt { margin-top: 1rem; font-size: .9rem; }

/* light-on-cream variant of the dark footer .sub-form (used in the empty plate) */
.sub-form--light { background: var(--cream); border: 1px solid var(--line); }
.sub-form--light input { color: var(--olive-ink); }
.sub-form--light input::placeholder { color: var(--olive-soft); }
.sub-form--light:focus-within { box-shadow: inset 0 0 0 2px var(--avocado); }
.sub-form--light button { background: var(--olive-deep); color: var(--cream); }
.sub-form--light button:hover { background: var(--olive); }
/* form-msg nests INSIDE the flex .sub-form (the site JS finds it via
   f.querySelector('[data-form-msg]'), descendant-only) — force it to a
   full-width row under the pill, and keep it legible on cream. The site JS
   rewrites className to 'nutoast-form-msg ok|err', so colour on that class. */
.news-empty__msg, .news-briefing__msg { flex: 1 0 100%; width: 100%; text-align: center; margin: 0; font-size: .85rem; min-height: 0; padding: 0 .4rem; }
.news-empty__msg:empty, .news-briefing__msg:empty { display: none; }
.news-empty__msg { margin-top: .5rem; }
.news-briefing__msg { margin-top: .55rem; }
/* on the dark briefing band the default .nutoast-form-msg.ok (olive) is too dim → lime */
.news-briefing__msg.ok { color: var(--lime); }
.news-briefing__msg.err { color: #ffb4a8; }

/* ---- The Briefing: the ONE --ink band (newsletter = the forward action) ---- */
.news-briefing .section-head { max-width: 640px; }
.news-briefing .eyebrow { color: var(--lime); }
.news-briefing .eyebrow::before, .news-briefing .eyebrow::after { background: var(--lime); }
.news-briefing h2 { color: #fff; }
.news-briefing__form { max-width: 520px; margin: 0 auto clamp(2.2rem,5vw,3.2rem); text-align: center; }
.news-briefing__form .sub-form { margin-inline: auto; }   /* footer .sub-form, styled for dark — renders perfectly here */
.news-briefing__note { margin-top: .9rem; font-size: .82rem; color: #aeb18f; }
/* numbered "what you'll receive" pillars — set-back 0N numerals (echo .icard__no, fresh scope) */
.news-pillars { display: grid; grid-template-columns: repeat(4,1fr); gap: clamp(1rem,2.2vw,1.5rem); }
.news-pillar {
  position: relative; display: flex; flex-direction: column; gap: .4rem;
  background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.12); border-radius: var(--r-lg);
  padding: clamp(1.3rem,2.4vw,1.7rem); overflow: hidden;
  transition: transform .4s var(--ease), border-color .4s var(--ease), background .4s var(--ease);
}
.news-pillar:hover { transform: translateY(-5px); border-color: rgba(231,234,107,.45); background: rgba(255,255,255,.06); }
.news-pillar__no {
  position: absolute; top: clamp(1rem,2vw,1.4rem); right: clamp(1rem,2vw,1.4rem);
  font-family: var(--font-display); font-size: .78rem; letter-spacing: .16em; color: var(--lime); opacity: .65;
}
.news-pillar__ic { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 14px; background: var(--lime); color: var(--olive-deep); margin-bottom: .4rem; transition: background .35s var(--ease); }
.news-pillar__ic svg { width: 24px; height: 24px; }
.news-pillar:hover .news-pillar__ic { background: var(--lime-bright); }
.news-pillar h3 { font-size: 1.1rem; color: #fff; }
.news-pillar p { color: #c7cbab; font-size: .9rem; line-height: 1.55; }
@media (max-width: 900px){ .news-pillars { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px){ .news-pillars { grid-template-columns: 1fr; } }

/* ---- Where to meet us: graceful request-schedule plate (0 trade_shows) ---- */
.news-meet__foot { margin-top: clamp(1.4rem,3vw,2rem); }
.news-meet__foot .link-arrow { font-size: .9rem; }
.news-meet-empty {
  display: flex; align-items: center; gap: clamp(1.2rem,3vw,2.2rem);
  background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(1.8rem,4vw,2.8rem); box-shadow: var(--shadow-sm);
}
.news-meet-empty__ic {
  flex: 0 0 auto; display: grid; place-items: center; width: clamp(56px,8vw,76px); height: clamp(56px,8vw,76px);
  border-radius: 50%; background: var(--lime); color: var(--olive-deep); box-shadow: var(--shadow-sm);
}
.news-meet-empty__ic svg { width: clamp(26px,4vw,34px); height: auto; }
.news-meet-empty__body { min-width: 0; }
.news-meet-empty__body h3 { font-size: var(--fs-h3); color: var(--olive-deep); }
.news-meet-empty__body p { color: var(--muted); font-size: 1rem; line-height: 1.6; margin-top: .7rem; max-width: 60ch; }
.news-meet-empty__cta { display: flex; flex-wrap: wrap; align-items: center; gap: .9rem 1.4rem; margin-top: 1.4rem; }
.news-meet-empty__cta .link-arrow { font-size: .9rem; }
@media (max-width: 620px){ .news-meet-empty { flex-direction: column; align-items: flex-start; text-align: left; } }

/* ---- Newsroom desk: numbered cross-link grid (live pages only) ---- */
.news-desk-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: clamp(1rem,2.2vw,1.5rem); }
.news-desk-card {
  position: relative; display: flex; flex-direction: column; gap: .5rem;
  background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(1.3rem,2.4vw,1.8rem); box-shadow: var(--shadow-sm);
  transition: transform .4s var(--ease), box-shadow .4s var(--ease), border-color .4s var(--ease);
}
.news-desk-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); border-color: color-mix(in srgb, var(--avocado) 50%, transparent); }
.news-desk-card__no { position: absolute; top: clamp(1.2rem,2.4vw,1.6rem); right: clamp(1.2rem,2.4vw,1.6rem); font-family: var(--font-display); font-size: .78rem; letter-spacing: .18em; color: var(--olive-soft); opacity: .7; }
.news-desk-card__ic { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 13px; background: color-mix(in srgb, var(--lime) 60%, var(--cream-2)); color: var(--olive-deep); margin-bottom: .3rem; transition: background .35s var(--ease); }
.news-desk-card__ic svg { width: 22px; height: 22px; }
.news-desk-card:hover .news-desk-card__ic { background: var(--lime); }
.news-desk-card__body { flex: 1; }
.news-desk-card h3 { font-size: 1.14rem; color: var(--olive-deep); }
.news-desk-card p { color: var(--muted); font-size: .9rem; line-height: 1.55; margin-top: .25rem; }
.news-desk-card .link-arrow { font-size: .88rem; margin-top: .2rem; }
@media (max-width: 900px){ .news-desk-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px){ .news-desk-grid { grid-template-columns: 1fr; } }

@media (prefers-reduced-motion: reduce){ .news-hero__mark, .news-lead__media img, .news-pillar__ic, .news-desk-card__ic { transition: none; animation: none; } }



/* ============================================================
   FLOATING ACTION STACK — bottom-right: customer-service launcher
   (expands to a contact panel: email / phone / WhatsApp / LinkedIn,
   all backend-configurable) + a back-to-top button (shows on scroll).
   The inquiry launcher is moved to bottom-LEFT to avoid collision.
   ============================================================ */
.nutoast-fab {
  position: fixed; right: clamp(1rem,3vw,1.8rem); bottom: clamp(1rem,3vw,1.8rem); z-index: 97;
  display: flex; flex-direction: column-reverse; align-items: flex-end; gap: .7rem;
}
/* chat + its panel ride together; lift up to reveal the back-to-top below (GPU transform) */
.nutoast-fab__main { position: relative; z-index: 2; }
.nutoast-fab__btn {
  width: 56px; height: 56px; border-radius: 50%; border: 0; cursor: pointer;
  display: grid; place-items: center; position: relative; box-shadow: var(--shadow-lg);
  transition: transform .3s var(--ease), background .3s var(--ease), opacity .35s var(--ease), visibility .35s;
}
.nutoast-fab__btn:hover { transform: translateY(-3px); }
/* back-to-top — hidden until scrolled */
.nutoast-fab__top {
  background: var(--cream); color: var(--olive-deep); display: none;
}
.nutoast-fab.show-top .nutoast-fab__top { display: grid; animation: fabPop .35s var(--ease); }
.nutoast-fab__top.is-leaving { display: grid; pointer-events: none; animation: fabPopOut .3s var(--ease) forwards; }
@keyframes fabPopOut { from { opacity: 1; transform: none; } to { opacity: 0; transform: scale(.4); } }
.nutoast-fab__top:hover { background: #fff; }
.nutoast-fab__top svg { width: 24px; height: 24px; }
/* customer-service launcher — lime, always visible */
.nutoast-fab__contact { background: var(--lime); color: var(--olive-ink); }
.nutoast-fab__contact:hover { background: var(--lime-bright); }
.nutoast-fab__i { position: absolute; display: grid; place-items: center; transition: opacity .25s var(--ease), transform .3s var(--ease); }
.nutoast-fab__i svg { width: 26px; height: 26px; }
.nutoast-fab__i--close { opacity: 0; transform: rotate(-90deg) scale(.5); }
.nutoast-fab.is-open .nutoast-fab__contact { background: var(--olive-deep); color: #fff; }
.nutoast-fab.is-open .nutoast-fab__i--open { opacity: 0; transform: rotate(90deg) scale(.5); }
.nutoast-fab.is-open .nutoast-fab__i--close { opacity: 1; transform: none; }
/* contact panel — opens above the stack */
.nutoast-fab__panel {
  position: absolute; right: 0; bottom: 100%; margin-bottom: .85rem; width: min(86vw, 320px);
  background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg); overflow: hidden;
  opacity: 0; visibility: hidden; transform: translateY(14px) scale(.96); transform-origin: bottom right;
  transition: opacity .3s var(--ease), transform .35s var(--ease-out), visibility .35s;
}
.nutoast-fab.is-open .nutoast-fab__panel { opacity: 1; visibility: visible; transform: none; }
.nutoast-fab__head {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: .85rem 1.1rem; background: var(--olive-deep); color: #fff;
  font-family: var(--font-display); font-weight: 500; font-size: 1.02rem;
}
.nutoast-fab__brand { display: inline-flex; align-items: center; gap: .55rem; }
.nutoast-fab__brand .brand-mark { width: 32px; height: 32px; background-color: var(--lime); }
.nutoast-fab__x { flex: 0 0 auto; width: 28px; height: 28px; border-radius: 50%; border: 0; cursor: pointer; display: grid; place-items: center; background: rgba(255,255,255,.12); color: #fff; transition: background .25s var(--ease); }
.nutoast-fab__x:hover { background: rgba(255,255,255,.24); }
.nutoast-fab__x svg { width: 14px; height: 14px; }
.nutoast-fab__list { list-style: none; margin: 0; padding: .5rem; display: grid; gap: .2rem; }
.nutoast-fab__ch { display: flex; align-items: center; gap: .85rem; padding: .7rem .8rem; border-radius: var(--r-md); transition: background .25s var(--ease); }
.nutoast-fab__ch:hover { background: var(--cream-2); }
.nutoast-fab__ch-ic { flex: 0 0 auto; width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center; background: var(--lime); color: var(--olive-deep); }
.nutoast-fab__ch-ic svg { width: 20px; height: 20px; }
.nutoast-fab__ch-ic--whatsapp { background: #25d366; color: #fff; }
.nutoast-fab__ch-ic--linkedin { background: #0a66c2; color: #fff; }
.nutoast-fab__ch-txt { display: grid; gap: .1rem; min-width: 0; }
.nutoast-fab__ch-txt b { font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); font-size: .98rem; line-height: 1.2; }
.nutoast-fab__ch-txt > span { color: var(--muted); font-size: .82rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (prefers-reduced-motion: reduce){
  .nutoast-fab__btn, .nutoast-fab__i, .nutoast-fab__panel, .nutoast-fab__top, .nutoast-fab__main { transition: none; }
  .nutoast-fab__top, .nutoast-inq-launcher { animation: none !important; }
  .nutoast-fab__top.is-leaving { display: none; }
}

/* Partner With Us — photo cards: soft-blurred photo BACKGROUND, crisp copy on top */
#partner .section-head { margin-inline: auto; }
.partner-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1.1rem, 2.2vw, 1.7rem); margin-top: clamp(1.6rem, 3vw, 2.4rem); }
.partner-card { position: relative; isolation: isolate; display: flex; flex-direction: column; justify-content: flex-end;
	min-height: 470px; overflow: hidden; border-radius: var(--r-lg); padding: clamp(1.7rem, 2.6vw, 2.1rem);
	color: #e9ecd6; box-shadow: var(--shadow-md); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.partner-card:hover { transform: translateY(-7px); box-shadow: var(--shadow-lg); }
.partner-card__media { position: absolute; inset: 0; z-index: -2; overflow: hidden; background: var(--olive-deep); }
/* the background photo itself is defocused; scaled up so the blur's soft edges still fill the card */
.partner-card__media img { width: 100%; height: 100%; object-fit: cover;
	filter: blur(7px) saturate(1.04); transform: scale(1.14); transition: transform .8s var(--ease-out); }
.partner-card:hover .partner-card__media img { transform: scale(1.2); }
.partner-card::after { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
	background: linear-gradient(180deg, rgba(20,22,4,.18) 0%, rgba(20,22,4,.30) 34%, rgba(20,22,4,.74) 70%, var(--olive-ink) 96%); }
.partner-card__ic { position: absolute; top: 1.15rem; left: 1.15rem; z-index: 1; display: grid; place-items: center;
	width: 46px; height: 46px; border-radius: 13px; background: var(--lime); color: var(--olive-ink); box-shadow: 0 6px 16px rgba(20,22,4,.3); }
.partner-card__ic svg { width: 23px; height: 23px; }
.partner-card h3 { color: #fff; font-size: clamp(1.32rem, 1.9vw, 1.6rem); }
.partner-card > p { color: #dde0c8; font-size: .95rem; line-height: 1.6; margin-top: .55rem; }
.partner-list { list-style: none; display: grid; gap: .55rem; margin-top: 1.05rem; }
.partner-list li { display: flex; align-items: center; gap: .6rem; color: #f0f1e1; font-size: .94rem; }
.partner-list li svg { flex: 0 0 17px; width: 17px; height: 17px; color: var(--lime-bright); }
.partner-card .link-arrow { margin-top: 1.25rem; color: var(--lime-bright); font-weight: 600; }
.partner-card .link-arrow:hover { color: #fff; }
@media (max-width: 900px){ .partner-grid { grid-template-columns: 1fr; max-width: 460px; margin-inline: auto; } .partner-card { min-height: 430px; } }
/* ============================================================
   RESOURCES / SEGMENTS PAGE — video + scenes + application grid
   ============================================================ */
.res-video-sec {
  background: var(--olive-deep); color: #efeedd;
  padding-block: clamp(6.6rem, 5.4rem + 2.4vw, 8rem) clamp(2.6rem, 3.2vw, 3.4rem);
  position: relative; isolation: isolate; overflow: hidden;
}
/* ambient spotlight behind the video for depth */
.res-video-sec::before {
  content: ""; position: absolute; left: 50%; top: 60%; transform: translate(-50%, -50%);
  width: min(1180px, 96%); aspect-ratio: 16 / 9; z-index: 0; pointer-events: none;
  background: radial-gradient(ellipse at center, color-mix(in srgb, var(--lime) 22%, transparent), transparent 68%);
  filter: blur(28px);
}
.res-video-sec .wrap { position: relative; z-index: 1; }
.res-video-sec .section-head { margin-inline: auto; }
.res-video-sec .eyebrow { color: var(--lime); }
.res-video-sec .eyebrow::before { background: var(--lime); }
.res-video-sec h1 {
  color: #fff; font-size: clamp(2.1rem, 1.5rem + 2.8vw, 3.1rem);
  letter-spacing: -.02em; line-height: 1.08; text-wrap: balance;
  max-width: 20ch; margin-inline: auto; margin-top: .9rem;
}
.res-video-sec .section-head p { color: #c7cbab; }
.res-video {
  position: relative; max-width: 980px; margin: clamp(1.2rem,2.2vw,1.8rem) auto 0;
  aspect-ratio: 16 / 9; border-radius: var(--r-lg); overflow: hidden;
  box-shadow: var(--shadow-lg); background: var(--olive-deep);
}
.yt-facade {
  position: absolute; inset: 0; width: 100%; height: 100%; border: 0; cursor: pointer;
  background-size: cover; background-position: center; display: grid; place-items: center; padding: 0;
}
.yt-facade::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(20,22,4,.16), rgba(20,22,4,.36));
  transition: background .3s var(--ease);
}
.yt-facade:hover::after { background: linear-gradient(180deg, rgba(20,22,4,.1), rgba(20,22,4,.28)); }
.yt-facade__play {
  position: relative; z-index: 1; display: grid; place-items: center;
  width: clamp(64px,8vw,88px); height: clamp(64px,8vw,88px); border-radius: 50%;
  background: var(--lime); color: var(--olive-ink); box-shadow: 0 10px 30px rgba(20,22,4,.35);
  transition: transform .3s var(--ease), background .3s var(--ease);
}
.yt-facade:hover .yt-facade__play { transform: scale(1.08); background: var(--lime-bright); }
.yt-facade__play svg { width: 40%; height: 40%; margin-left: .12em; }
.res-video .yt-frame { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }

.seg-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(.9rem,1.8vw,1.4rem); margin-top: clamp(1.8rem,3.4vw,2.6rem); }
.seg-card {
  display: flex; flex-direction: column; min-width: 0;
  background: var(--cream-2); border: 1px solid var(--line-soft); border-radius: var(--r-md);
  padding: .9rem .9rem 1rem; box-shadow: var(--shadow-sm);
  transition: transform .4s var(--ease), box-shadow .4s var(--ease);
}
.seg-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); }
.seg-card__img { position: relative; width: 100%; aspect-ratio: 1 / 1; flex: 0 0 auto; }
.seg-card__img img { position: absolute; inset: 0; margin: auto; max-width: 86%; max-height: 86%; width: auto; height: auto; object-fit: contain; transition: transform .5s var(--ease-out); }
.seg-card:hover .seg-card__img img { transform: scale(1.05); }
.seg-card__name { margin-top: .55rem; text-align: center; font-family: var(--font-display); font-weight: 500; font-size: .95rem; line-height: 1.25; color: var(--olive-deep); }
@media (max-width: 860px){ .seg-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px){ .seg-grid { grid-template-columns: 1fr; max-width: 360px; margin-inline: auto; } .res-video { aspect-ratio: 16/10; } }
@media (prefers-reduced-motion: reduce){ .seg-card, .yt-facade__play { transition: none; } }


/* ============================================================
   APPLICATION-SCENE MODAL — pain points + solutions per scene
   ============================================================ */
.ind-card--scene { cursor: pointer; }
.ind-card--scene .meta p { display: flex; align-items: center; gap: .35rem; }
.ind-card--scene .meta p svg { width: 15px; }

.scene-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; width: min(960px, 94vw); max-width: 94vw; padding: 0; border: 0; background: transparent; color: var(--text); overflow: visible; }
.scene-modal::backdrop { background: rgba(20,22,4,0); transition: background .3s var(--ease); }
.scene-modal[open]::backdrop { background: rgba(20,22,4,.62); -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); }
.scene-modal__inner { position: relative; display: grid; grid-template-columns: minmax(0,.86fr) minmax(0,1fr); background: var(--cream); border-radius: var(--r-lg); overflow: hidden; max-height: 88vh; box-shadow: 0 30px 80px rgba(20,22,4,.42); }
.scene-modal__media { position: relative; min-height: 100%; background: var(--olive-deep); }
.scene-modal__media img { width: 100%; height: 100%; object-fit: cover; }
.scene-modal__tag { position: absolute; left: 1rem; top: 1rem; background: rgba(231,234,107,.94); color: var(--olive-ink); font-size: .72rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; padding: .35rem .7rem; border-radius: var(--r-pill); }
.scene-modal__close { position: absolute; top: .8rem; right: .8rem; z-index: 3; width: 40px; height: 40px; display: grid; place-items: center; border-radius: 50%; background: rgba(254,255,247,.92); color: var(--olive-deep); box-shadow: var(--shadow-sm); transition: background .25s var(--ease), transform .35s var(--ease); }
.scene-modal__close:hover { background: #fff; transform: rotate(90deg); }
.scene-modal__close svg { width: 20px; height: 20px; }
.scene-modal__body { padding: clamp(1.5rem,2.6vw,2.4rem); overflow-y: auto; max-height: 88vh; }
.scene-modal__body .eyebrow { color: var(--olive); }
.scene-modal__body h3 { font-size: clamp(1.6rem,1.2rem + 1.4vw,2.1rem); margin-top: .5rem; color: var(--olive-deep); }
.scene-modal__lead { margin-top: .6rem; color: var(--muted); font-size: .95rem; }
.scene-cmp { margin-top: 1.3rem; border: 1px solid var(--line-soft); border-radius: var(--r-md); overflow: hidden; }
.scene-cmp__head { display: grid; grid-template-columns: 1fr auto 1fr; background: var(--cream-2); border-bottom: 1px solid var(--line-soft); }
.scene-cmp__h { padding: .6rem .9rem; font-size: .68rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; }
.scene-cmp__h--pain { color: var(--muted); }
.scene-cmp__h--sol { color: var(--olive); grid-column: 3; }
.scene-cmp__list { display: flex; flex-direction: column; }
.scene-cmp__row { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: .7rem; padding: .7rem .9rem; }
.scene-cmp__row:not(:last-child) { border-bottom: 1px dashed var(--line-soft); }
.scene-cmp__pain { color: var(--text); font-size: .88rem; opacity: .9; }
.scene-cmp__arr { color: var(--avocado); display: grid; place-items: center; }
.scene-cmp__arr svg { width: 18px; height: 18px; }
.scene-cmp__sol { color: var(--olive-deep); font-weight: 600; font-size: .88rem; }
.scene-prod { margin-top: 1.2rem; }
.scene-prod__label { display: block; font-size: .68rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: var(--muted); margin-bottom: .55rem; }
.scene-prod__chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.scene-prod__chip { padding: .4rem .85rem; border-radius: var(--r-pill); background: var(--cream-2); border: 1px solid var(--line-soft); font-size: .82rem; font-weight: 600; color: var(--olive-ink); }
.scene-modal__cta { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.5rem; }
body.scene-modal-open { overflow: hidden; }
@media (prefers-reduced-motion: no-preference){
  .scene-modal[open] .scene-modal__inner { animation: sceneIn .34s var(--ease-out); }
  @keyframes sceneIn { from { opacity: 0; transform: translateY(12px) scale(.985); } to { opacity: 1; transform: none; } }
}
@media (max-width: 740px){
  .scene-modal__inner { grid-template-columns: 1fr; max-height: 92vh; }
  .scene-modal__media { aspect-ratio: 16/10; min-height: 0; }
  .scene-modal__body { max-height: none; }
}


/* ============================================================
   NEWS — category tabs + card grid
   ============================================================ */
.news-tabs { margin-top: clamp(1.2rem,2.6vw,2rem); }
.news-tabs__bar { display: flex; flex-wrap: wrap; gap: .3rem; border-bottom: 1px solid var(--line-soft); margin-bottom: clamp(1.6rem,3vw,2.4rem); }
.news-tab { position: relative; display: inline-flex; align-items: center; gap: .55rem; padding: .85rem 1.2rem; margin-bottom: -1px; font-family: var(--font-display); font-weight: 500; font-size: clamp(1rem,.9rem + .4vw,1.18rem); color: var(--muted); border-bottom: 2px solid transparent; transition: color .25s var(--ease); }
.news-tab:hover { color: var(--olive-deep); }
.news-tab.is-active { color: var(--olive-deep); border-bottom-color: var(--lime-bright); }
.news-tab__count { font-family: var(--font-body); font-size: .72rem; font-weight: 700; line-height: 1; padding: .25rem .5rem; border-radius: var(--r-pill); background: var(--cream-2); border: 1px solid var(--line-soft); color: var(--olive); }
.news-tab.is-active .news-tab__count { background: var(--lime); border-color: var(--lime); color: var(--olive-ink); }
.news-tab:focus-visible { outline: 2px solid var(--olive); outline-offset: 3px; border-radius: 6px; }
.news-tabpanel { display: none; }
.news-tabpanel.is-active { display: block; }
@media (prefers-reduced-motion: no-preference){
  .news-tabpanel.is-active { animation: newsTabIn .35s var(--ease-out); }
  @keyframes newsTabIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
}
.news-grid { grid-template-columns: repeat(4, minmax(0,1fr)); }
.news-card .ph { aspect-ratio: 3 / 2; }
.news-card .pad { padding: 1.1rem 1.2rem 1.3rem; }
.news-card h3 { font-size: 1.1rem; line-height: 1.28; }
.news-card h3 a:hover { color: var(--olive); }
.news-board__empty { color: var(--muted); margin-top: 1.5rem; }
@media (max-width: 1040px){ .news-grid { grid-template-columns: repeat(3, minmax(0,1fr)); } }
@media (max-width: 760px){ .news-grid { grid-template-columns: repeat(2, minmax(0,1fr)); } }
@media (max-width: 480px){ .news-grid { grid-template-columns: 1fr; } }
@media (max-width: 560px){
  .news-tabs__bar { flex-wrap: nowrap; gap: .4rem; }
  /* mobile: stack the count pill centered UNDER the label so it never drifts to the edge */
  .news-tab { flex: 1 1 0; min-width: 0; flex-direction: column; justify-content: center; align-items: center; gap: .42rem; text-align: center; padding: .85rem .45rem .68rem; font-size: .9rem; line-height: 1.18; border-radius: 12px 12px 0 0; }
  .news-tab.is-active { background: linear-gradient(180deg, rgba(231,234,107,.16), rgba(231,234,107,0)); }
  .news-tab__count { padding: .16rem .58rem; font-size: .68rem; }
}

/* ============================================================
   ABOUT PAGE (8-section rebuild)
   ============================================================ */
/* 1. hero stats */
.about-phero .wrap { max-width: min(100% - 3rem, 1320px); }
.about-phero h1 { max-width: 26ch; }
.about-phero .lead { max-width: 64ch; }
.about-phero__stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(1rem,2.5vw,2rem); margin-top: clamp(1.8rem,3.5vw,2.8rem); }
.about-phero__stats .num { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.9rem,1.3rem + 1.9vw,2.8rem); line-height: 1; color: #fff; }
.about-phero__stats .num .plus { color: var(--lime); }
.about-stat { display: flex; flex-direction: column; gap: .55rem; }
.about-stat__ic { width: 38px; height: 38px; color: var(--lime); }
.about-stat__ic svg { width: 100%; height: 100%; }
.about-stat__head { display: flex; align-items: baseline; gap: .45rem; flex-wrap: wrap; }
.about-stat__unit { font-family: var(--font-display); font-weight: 500; font-size: clamp(.9rem,.8rem + .3vw,1.05rem); color: rgba(255,255,255,.88); }
.about-stat__desc { font-size: .82rem; line-height: 1.38; color: rgba(255,255,255,.68); max-width: 24ch; }
@media (max-width: 560px){
  .about-phero__stats { grid-template-columns: 1fr 1fr; gap: 1.7rem 1rem; }
  .about-stat { align-items: center; text-align: center; gap: .35rem; }
  .about-stat__ic { width: 34px; height: 34px; }
  .about-phero__stats .num { font-size: 1.7rem; }
  .about-stat__head { justify-content: center; gap: .35rem; flex-wrap: nowrap; }
  .about-stat__desc { max-width: 22ch; margin-inline: auto; }
}

/* 2. who-we-are + journey */
.journey { display: grid; grid-template-columns: 1.15fr .85fr; gap: clamp(1.4rem,3vw,2.6rem); align-items: start; margin-top: clamp(1.8rem,3.5vw,2.8rem); }
.journey__time { background: var(--cream-2); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: clamp(1.3rem,2.4vw,1.9rem); }
.journey__time .eyebrow { color: var(--olive); }
.journey__time h3 { font-size: 1.4rem; color: var(--olive-deep); margin: .5rem 0 1rem; }
.milestones { list-style: none; margin: 0; padding: 0 .6rem 0 0; max-height: clamp(300px,42vh,400px); overflow-y: auto; display: grid; gap: 1.1rem; scrollbar-width: thin; scrollbar-color: var(--avocado) transparent; }
.milestones::-webkit-scrollbar { width: 6px; }
.milestones::-webkit-scrollbar-thumb { background: var(--avocado); border-radius: 6px; }
.milestone { display: grid; grid-template-columns: auto 1fr; gap: .9rem; position: relative; padding-left: .2rem; }
.milestone__year { font-family: var(--font-display); font-weight: 600; font-size: 1.05rem; color: var(--olive); min-width: 3.2em; }
.milestone__body { display: flex; flex-direction: column; gap: .15rem; border-left: 2px solid var(--line-soft); padding-left: .9rem; }
.milestone__body b { color: var(--olive-deep); font-family: var(--font-display); font-weight: 500; font-size: 1.02rem; }
.milestone__body span { color: var(--muted); font-size: .9rem; line-height: 1.45; }
.journey__mvv { display: grid; gap: .9rem; }
.mvv-card { position: relative; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-md); padding: 1.1rem 1.2rem 1.2rem; box-shadow: var(--shadow-sm); }
.mvv-card__no { position: absolute; top: .9rem; right: 1.1rem; font-family: var(--font-display); font-size: .8rem; color: var(--avocado); }
.mvv-card h3 { font-size: 1.15rem; color: var(--olive-deep); }
.mvv-card p { margin-top: .35rem; color: var(--muted); font-size: .92rem; line-height: 1.5; }
@media (max-width: 820px){ .journey { grid-template-columns: 1fr; } }

/* 3. services overview image */
.about-svc { border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-md); background: var(--cream); }
.about-svc img { display: block; width: 100%; height: auto; }

/* 4. quality cert badges */
.about-certs { list-style: none; margin: clamp(1.6rem,3vw,2.4rem) 0 0; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: .7rem 1.6rem; }
.about-certs li { display: inline-flex; align-items: center; gap: .5rem; font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); font-size: 1rem; }
.about-certs__mark { width: 26px; height: 26px; color: var(--avocado); display: inline-grid; place-items: center; }
.about-certs__mark svg { width: 100%; height: 100%; }

/* 5. documentation list */
.about-doclist { list-style: none; margin: clamp(1.4rem,3vw,2.2rem) 0 0; padding: 0; display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(.9rem, 1.8vw, 1.3rem); }
.about-doc { display: grid; grid-template-columns: auto 1fr; column-gap: 1rem; row-gap: .9rem; align-items: start; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: clamp(1.2rem, 2.2vw, 1.6rem); transition: transform .35s var(--ease), box-shadow .35s var(--ease), border-color .35s var(--ease); }
.about-doc:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--avocado); }
.about-doc__ic { grid-row: 1; grid-column: 1; width: 46px; height: 46px; display: grid; place-items: center; border-radius: var(--r-md); background: rgba(102,110,19,.08); color: var(--olive-deep); transition: background .35s var(--ease), color .35s var(--ease); }
.about-doc__ic svg { width: 23px; height: 23px; }
.about-doc:hover .about-doc__ic { background: var(--lime); color: var(--olive-ink); }
.about-doc__body { grid-row: 1; grid-column: 2; display: flex; flex-direction: column; gap: .16rem; min-width: 0; }
.about-doc__no { font-family: var(--font-display); color: var(--avocado); font-size: .72rem; letter-spacing: .14em; }
.about-doc__title { color: var(--olive-deep); font-family: var(--font-display); font-weight: 500; font-size: 1.08rem; line-height: 1.22; }
.about-doc__desc { color: var(--muted); font-size: .88rem; line-height: 1.5; }
.about-doc__action { grid-row: 2; grid-column: 1 / -1; display: flex; padding-left: calc(46px + 1rem); }
.about-doc__dl { display: inline-flex; align-items: center; gap: .5rem; padding: .55rem 1rem; border-radius: var(--r-pill); background: var(--avocado); color: var(--cream); font-weight: 600; font-size: .85rem; transition: transform .3s var(--ease), background .3s var(--ease), box-shadow .3s var(--ease); }
.about-doc__dl svg { width: 16px; height: 16px; }
.about-doc__dl em { font-style: normal; font-weight: 500; opacity: .82; font-size: .78rem; }
.about-doc__dl:hover { background: var(--olive-deep); transform: translateY(-1px); box-shadow: 0 8px 20px rgba(45,50,8,.22); }
.about-doc__tag { font-size: .72rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--olive); background: var(--cream-2); border: 1px solid var(--line-soft); border-radius: var(--r-pill); padding: .42rem .85rem; white-space: nowrap; }
.about-docs__cta { margin-top: clamp(1.4rem, 2.6vw, 2rem); text-align: center; }
@media (max-width: 720px){ .about-doclist { grid-template-columns: 1fr; } }
@media (max-width: 460px){ .about-doc__action { padding-left: 0; } }

/* 6. end-to-end QC cards */
.qc-grid { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: clamp(1rem,2vw,1.5rem); margin-top: clamp(1.6rem,3vw,2.4rem); }
.qc-card { margin: 0; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-md); overflow: hidden; box-shadow: var(--shadow-sm); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.qc-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); }
.qc-card__img { display: block; aspect-ratio: 4/3; overflow: hidden; }
.qc-card__img img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s var(--ease-out); }
.qc-card:hover .qc-card__img img { transform: scale(1.05); }
.qc-card figcaption { padding: .9rem 1rem 1.1rem; display: flex; flex-direction: column; gap: .25rem; }
.qc-card figcaption b { color: var(--olive-deep); font-family: var(--font-display); font-weight: 500; font-size: 1.02rem; }
.qc-card figcaption span { color: var(--muted); font-size: .86rem; line-height: 1.45; }
@media (max-width: 860px){ .qc-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 480px){ .qc-grid { grid-template-columns: 1fr; } }

/* 7. factory carousel */
.fcar { position: relative; max-width: 1000px; margin-inline: auto; margin-top: clamp(1.4rem,3vw,2.2rem); }
.fcar__viewport { overflow: hidden; border-radius: var(--r-lg); box-shadow: var(--shadow-lg); }
.fcar__track { display: flex; transition: transform .6s var(--ease-out); }
.fcar__slide { flex: 0 0 100%; aspect-ratio: 16/9; background: var(--olive-deep); }
.fcar__slide img { width: 100%; height: 100%; object-fit: cover; display: block; }
.fcar__nav { position: absolute; top: 50%; transform: translateY(-50%); width: 44px; height: 44px; display: grid; place-items: center; border-radius: 50%; background: rgba(254,255,247,.92); color: var(--olive-deep); box-shadow: var(--shadow-sm); transition: background .25s var(--ease), transform .25s var(--ease); z-index: 2; }
.fcar__nav:hover { background: #fff; }
.fcar__nav svg { width: 22px; height: 22px; }
.fcar__nav--prev { left: clamp(.5rem,1.5vw,1rem); }
.fcar__nav--next { right: clamp(.5rem,1.5vw,1rem); }
.fcar__nav--next:hover { transform: translateY(-50%) translateX(2px); }
.fcar__nav--prev:hover { transform: translateY(-50%) translateX(-2px); }
.fcar__dots { display: flex; justify-content: center; gap: .5rem; margin-top: 1rem; }
.fcar__dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line-soft); border: 1px solid var(--avocado); transition: background .25s, transform .25s; }
.fcar__dot.is-active { background: var(--avocado); transform: scale(1.25); }

/* 8. production flow */
.prodflow { list-style: none; margin: clamp(1.8rem,3.5vw,2.8rem) 0 0; padding: 0; display: grid; grid-template-columns: repeat(6, 1fr); gap: clamp(.8rem,1.6vw,1.3rem); counter-reset: pf; position: relative; }
.prodflow__step { position: relative; display: flex; flex-direction: column; gap: .4rem; padding-top: 2.6rem; }
.prodflow__step::before { content: ""; position: absolute; top: 1.1rem; left: 1.1rem; right: -50%; height: 2px; background: var(--line-soft); z-index: 0; }
.prodflow__step:last-child::before { display: none; }
.prodflow__n { position: absolute; top: 0; left: 0; width: 2.2rem; height: 2.2rem; display: grid; place-items: center; border-radius: 50%; background: var(--lime); color: var(--olive-ink); font-family: var(--font-display); font-weight: 600; z-index: 1; box-shadow: 0 0 0 5px var(--cream); }
.prodflow__step b { color: var(--olive-deep); font-family: var(--font-display); font-weight: 500; font-size: 1rem; line-height: 1.25; }
.prodflow__t { color: var(--muted); font-size: .85rem; line-height: 1.45; }
@media (max-width: 900px){ .prodflow { grid-template-columns: repeat(3, 1fr); row-gap: 1.8rem; } .prodflow__step:nth-child(3)::before { display: none; } }
@media (max-width: 560px){ .prodflow { grid-template-columns: 1fr 1fr; } .prodflow__step:nth-child(2)::before { display: none; } }

/* ---- Contact page polish (cards + what-happens-next) ---- */
.contact-info__lead { margin-top: .7rem; color: var(--muted); max-width: 40ch; line-height: 1.55; }
.contact-cards { display: grid; gap: .7rem; margin-top: 1.5rem; }
.contact-card { display: flex; align-items: center; gap: .9rem; padding: .9rem 1.1rem; background: var(--cream-2); border: 1px solid var(--line-soft); border-radius: var(--r-md); transition: transform .3s var(--ease), box-shadow .3s var(--ease); }
.contact-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-sm); }
.contact-card__ic { display: grid; place-items: center; width: 42px; height: 42px; border-radius: 12px; background: var(--cream); color: var(--olive); flex: none; }
.contact-card__ic svg { width: 19px; height: 19px; }
.contact-card__body { display: flex; flex-direction: column; min-width: 0; }
.contact-card__body b { font-size: .72rem; text-transform: uppercase; letter-spacing: .07em; color: var(--muted); font-weight: 700; }
.contact-card__body span { color: var(--olive-ink); font-weight: 500; }
.contact-steps { margin-top: 1.9rem; }
.contact-steps .eyebrow { color: var(--olive); }
.contact-steps ol { margin: 1rem 0 0; padding: 0; list-style: none; counter-reset: cs; display: grid; gap: .85rem; }
.contact-steps li { counter-increment: cs; position: relative; padding-left: 2.5rem; color: var(--muted); font-size: .92rem; line-height: 1.5; }
.contact-steps li::before { content: counter(cs); position: absolute; left: 0; top: -.15rem; width: 1.75rem; height: 1.75rem; display: grid; place-items: center; border-radius: 50%; background: var(--lime); color: var(--olive-ink); font-family: var(--font-display); font-weight: 600; font-size: .85rem; }

/* ---- Contact form: country select (real SVG flags) + phone with dial code ---- */
.cc { position: relative; min-width: 0; }
.cc__btn { width: 100%; display: flex; align-items: center; gap: .6rem; font: inherit; font-size: .95rem; padding: .85rem 1rem; border: 1px solid var(--line); border-radius: var(--r-md); background: #fff; color: var(--olive-ink); cursor: pointer; text-align: left; transition: border-color .2s var(--ease), box-shadow .2s var(--ease); }
.cc__btn:hover { border-color: var(--avocado); }
.cc__btn[aria-expanded="true"] { border-color: var(--avocado); box-shadow: 0 0 0 3px rgba(158,167,0,.16); }
.cc__flag { width: 22px; height: 16px; border-radius: 2px; overflow: hidden; flex: none; box-shadow: inset 0 0 0 1px rgba(20,22,4,.08); }
.cc__flag:empty { display: none; }
.cc__flag img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cc__text { flex: 1; min-width: 0; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cc__text--filled { color: var(--olive-ink); }
.cc__chev { width: 18px; height: 18px; color: var(--muted); flex: none; transition: transform .25s var(--ease); }
.cc__btn[aria-expanded="true"] .cc__chev { transform: rotate(180deg); }
.cc__panel[hidden] { display: none; }
.cc__panel { position: absolute; z-index: 30; top: calc(100% + .4rem); left: 0; right: 0; background: #fff; border: 1px solid var(--line-soft); border-radius: var(--r-md); box-shadow: var(--shadow-md); padding: .5rem; max-height: 290px; display: flex; flex-direction: column; }
.cc__search { width: 100%; font: inherit; font-size: .9rem; padding: .55rem .7rem; border: 1px solid var(--line-soft); border-radius: 8px; margin-bottom: .4rem; color: var(--olive-ink); }
.cc__search:focus { outline: none; border-color: var(--avocado); box-shadow: 0 0 0 3px rgba(158,167,0,.14); }
.cc__list { list-style: none; margin: 0; padding: 0; overflow-y: auto; scrollbar-width: thin; }
.cc__opt { display: flex; align-items: center; gap: .6rem; padding: .5rem .6rem; border-radius: 8px; cursor: pointer; }
.cc__opt:hover { background: var(--cream-2); }
.cc__opt-flag { width: 22px; height: 16px; border-radius: 2px; object-fit: cover; flex: none; box-shadow: inset 0 0 0 1px rgba(20,22,4,.08); }
.cc__opt-name { flex: 1; min-width: 0; color: var(--olive-ink); font-size: .92rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cc__opt-dial { color: var(--muted); font-size: .85rem; flex: none; }
.cc__empty { padding: .9rem; text-align: center; color: var(--muted); font-size: .9rem; }
.phone { display: flex; align-items: stretch; border: 1px solid var(--line); border-radius: var(--r-md); background: #fff; overflow: hidden; transition: border-color .2s var(--ease), box-shadow .2s var(--ease); min-width: 0; }
.phone:focus-within { border-color: var(--avocado); box-shadow: 0 0 0 3px rgba(158,167,0,.16); }
.phone__dial { display: grid; place-items: center; padding: 0 .75rem; background: var(--cream-2); color: var(--muted); font-size: .9rem; border-right: 1px solid var(--line-soft); white-space: nowrap; flex: none; }
.phone__dial--set { color: var(--olive-ink); font-weight: 500; }
.nutoast-form .phone__num { flex: 1; min-width: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }
.nutoast-form .phone__num:focus { outline: none; box-shadow: none; border: 0; }

/* continent group headers in the country dropdown */
.cc__group { padding: .55rem .6rem .25rem; font-family: var(--font-body); font-size: .68rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--olive); background: #fff; position: sticky; top: 0; z-index: 1; }

/* ============================================================
   HOVER (site-wide): border/ring reacts — no zoom, no lift
   ============================================================ */
.ind-card:hover img, .supply-card:hover .ph img, .how-card:hover .how-media img, .show:hover img,
.pcard:hover .pcard__img img, .pcat-nav__card:hover .pcat-nav__media img, .pcat-prev:hover .pcat-prev__img img,
.nav-mega__card:hover .nav-mega__img img, .news-board .news-lead:hover .news-lead__media img,
.partner-card:hover .partner-card__media img, .seg-card:hover .seg-card__img img,
.qc-card:hover .qc-card__img img { transform: none; }
/* bordered cards: lift -> border-color highlight, shadow stays resting */
.supply-card:hover, .icard:hover, .pcard:hover, .pcat-nav__card:hover, .cert-badge:hover, .tm-card:hover,
.res-dir-card:hover, .res-doc:hover, .res-app-card:hover, .news-board .news-lead:hover, .news-desk-card:hover,
.seg-card:hover, .qc-card:hover, .contact-card:hover, .nav-mega__card:hover { transform: none; border-color: var(--avocado); box-shadow: var(--shadow-sm); }
/* image / borderless cards: lift -> inset accent ring */
.ind-card:hover, .partner-card:hover, .show:hover { transform: none; box-shadow: inset 0 0 0 2px var(--avocado); }
.pcat-prev:hover .pcat-prev__img { transform: none; box-shadow: inset 0 0 0 2px var(--avocado); }
/* dark-band card keeps its own tint reaction, just no lift */
.news-pillar:hover { transform: none; }

/* ============================================================
   NUTOAST-SUPPORT-CAROUSEL — per-slide copy crossfade + arrows
   ============================================================ */
#support .split-copy { display: grid; }
#support .split-copy__slide { grid-area: 1 / 1; opacity: 0; visibility: hidden; transform: translateY(10px); transition: opacity .55s var(--ease), transform .55s var(--ease), visibility 0s linear .55s; }
#support .split-copy__slide.is-active { opacity: 1; visibility: visible; transform: none; transition: opacity .55s var(--ease), transform .55s var(--ease); }
.nut-carousel__arrow { position: absolute; top: 50%; transform: translateY(-50%); z-index: 3; width: 46px; height: 46px; display: grid; place-items: center; padding: 0; border: none; border-radius: 999px; cursor: pointer; color: var(--olive-deep); background: rgba(254,255,247,.9); box-shadow: var(--shadow-sm); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); transition: background .25s var(--ease), color .25s var(--ease), box-shadow .25s var(--ease); }
.nut-carousel__arrow svg { width: 22px; height: 22px; }
.nut-carousel__arrow--prev { left: .85rem; }
.nut-carousel__arrow--next { right: .85rem; }
.nut-carousel__arrow:hover { background: var(--lime); color: var(--olive-ink); box-shadow: var(--shadow-md, var(--shadow-sm)); }
.nut-carousel__arrow:focus-visible { outline: 2px solid var(--avocado); outline-offset: 2px; }
@media (max-width: 600px) { .nut-carousel__arrow { width: 40px; height: 40px; } .nut-carousel__arrow--prev { left: .45rem; } .nut-carousel__arrow--next { right: .45rem; } }

/* NUTOAST-SEG-MOBILE-2UP: keep the Segments showcase 2-per-row on phones */
@media (max-width: 520px) {
  .seg-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: none; margin-inline: 0; gap: .7rem; }
  .seg-card { padding: .6rem .55rem .7rem; }
  .seg-card__name { font-size: .82rem; margin-top: .4rem; line-height: 1.2; }
}

/* ============================================================
   NUTOAST-MOBILE-NAV — purpose-built drawer mirroring desktop nav
   ============================================================ */
.mobile-nav { padding: 0; display: flex; flex-direction: column; }
.mobile-nav__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 1rem 1.25rem; border-bottom: 1px solid var(--line-soft); flex: 0 0 auto; }
.mobile-nav__head .brand { display: inline-flex; align-items: center; gap: .55rem; }
.mobile-nav__head .wordmark { font-family: var(--font-display); font-weight: 600; font-size: 1.4rem; color: var(--olive-deep); }
.mobile-nav__close { width: 42px; height: 42px; border: 0; border-radius: 12px; display: grid; place-items: center; background: var(--cream-2); color: var(--olive-deep); cursor: pointer; transition: background .2s var(--ease), color .2s var(--ease); }
.mobile-nav__close svg { width: 22px; height: 22px; }
.mobile-nav__close:hover { background: var(--lime); color: var(--olive-ink); }
.mobile-menu { display: flex; flex-direction: column; padding: .5rem 1rem; overflow-y: auto; flex: 1 1 auto; }
.mobile-nav .mobile-menu__link { display: flex; align-items: center; gap: .5rem; width: 100%; margin: 0; padding: .95rem .55rem; font-family: var(--font-display); font-weight: 500; font-size: 1.2rem; line-height: 1.2; color: var(--olive-deep); text-align: left; background: none; border: 0; border-bottom: 1px solid var(--line-soft); cursor: pointer; }
.mobile-nav .mobile-menu__link .caret { width: 13px; height: 9px; margin-left: auto; transition: transform .3s var(--ease); }
.mobile-menu__acc { border-bottom: 1px solid var(--line-soft); }
.mobile-menu__acc .mobile-menu__accbtn { border-bottom: 0; }
.mobile-menu__acc.is-open .caret { transform: rotate(180deg); }
.mobile-menu__panel { display: flex; flex-direction: column; padding: 0 0 .5rem .85rem; }
.mobile-nav .mobile-menu__panel a { margin: 0; padding: .6rem .55rem; font-family: var(--font-body); font-size: 1rem; font-weight: 500; color: var(--olive); border: 0; }
.mobile-nav .mobile-menu__panel a:hover { color: var(--olive-deep); }
.mobile-nav__cta { flex: 0 0 auto; padding: .9rem 1.25rem .4rem; display: grid; gap: .5rem; }
.mobile-nav .mobile-nav__cta .btn { width: 100%; margin: 0; justify-content: center; }
.mobile-nav__foot { flex: 0 0 auto; padding: .7rem 1.25rem 1.5rem; display: flex; flex-direction: column; gap: .5rem; border-top: 1px solid var(--line-soft); margin-top: .4rem; }
.mobile-nav .mobile-nav__contact { display: flex; align-items: center; gap: .55rem; margin: 0; padding: .2rem 0; font-family: var(--font-body); font-size: .95rem; color: var(--olive); border: 0; }
.mobile-nav__contact svg { width: 18px; height: 18px; flex: 0 0 auto; }
.mobile-nav__social { display: flex; gap: .5rem; margin-top: .35rem; }
.mobile-nav .mobile-nav__social a { width: 40px; height: 40px; margin: 0; padding: 0; border: 0; border-radius: 11px; display: grid; place-items: center; background: var(--cream-2); color: var(--olive-deep); transition: background .2s var(--ease), color .2s var(--ease); }
.mobile-nav .mobile-nav__social a:hover { background: var(--lime); color: var(--olive-ink); }
.mobile-nav__social svg { width: 19px; height: 19px; }

/* ============================================================
   NUTOAST-PRODDEMO — manual-style deep product page (test)
   ============================================================ */
.pd-page { padding-top: clamp(6.5rem, 5.5rem + 3vw, 8rem); padding-bottom: clamp(3rem, 6vw, 5rem); background: var(--cream); }
.pd-hero { display: grid; grid-template-columns: 1.25fr .85fr; align-items: center; gap: clamp(1.2rem, 3vw, 2.4rem); background: linear-gradient(135deg, #9c5f1e 0%, #c98a3a 58%, #b87d2f 100%); border-radius: var(--r-lg); padding: clamp(1.6rem, 4vw, 3rem); color: #fff; overflow: hidden; box-shadow: var(--shadow-md); }
.pd-hero__series { display: inline-block; padding: .3rem .8rem; border-radius: var(--r-pill); background: rgba(255,255,255,.16); color: #fff; font-size: .72rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; }
.pd-hero__name { font-family: var(--font-display); font-weight: 600; font-size: clamp(2rem, 5vw, 3.1rem); line-height: 1.04; margin: .8rem 0 0; color: #fff; }
.pd-hero__name span { font-weight: 400; opacity: .92; }
.pd-hero__tag { margin: .8rem 0 0; max-width: 40ch; color: rgba(255,255,255,.92); line-height: 1.5; }
.pd-hero__sub { margin: .6rem 0 1rem; color: rgba(255,255,255,.8); font-size: .92rem; }
.pd-hero__chip { display: inline-flex; align-items: center; gap: .5rem; padding: .45rem .9rem; border-radius: var(--r-pill); background: rgba(255,255,255,.92); color: var(--olive-deep); font-weight: 600; font-size: .9rem; }
.pd-hero__swatch { width: 14px; height: 14px; border-radius: 50%; background: #c98a3a; box-shadow: inset 0 0 0 1px rgba(0,0,0,.1); }
.pd-hero__media img { width: 100%; display: block; border-radius: var(--r-md); }
.pd-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem, 3vw, 3rem); margin-top: clamp(2rem, 4vw, 3rem); align-items: start; }
.pd-col { display: flex; flex-direction: column; gap: clamp(1.4rem, 3vw, 2.2rem); }
.pd-h { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.3rem, 2.4vw, 1.6rem); color: var(--olive-deep); position: relative; margin: 0 0 1rem; }
.pd-spec { display: grid; gap: .35rem; list-style: none; margin: 0; padding: 0; }
.pd-spec__row { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: .5rem 0; border-bottom: 1px solid var(--line-soft); }
.pd-spec__label { display: inline-flex; align-items: center; gap: .5rem; color: var(--olive); font-weight: 500; font-size: .95rem; }
.pd-spec__label svg { width: 15px; height: 15px; color: var(--avocado); flex: 0 0 auto; }
.pd-spec__val { color: var(--olive-deep); font-weight: 600; font-size: .93rem; text-align: right; }
.pd-dots, .pd-sq { display: inline-flex; gap: 4px; }
.pd-dots i { width: 11px; height: 11px; flex: 0 0 auto; border-radius: 50%; border: 1.5px solid var(--avocado); }
.pd-dots i.on { background: var(--avocado); }
.pd-sq i { width: 14px; height: 14px; border-radius: 3px; border: 1.5px solid #b5462f; }
.pd-sq i.on { background: #b5462f; }
.pd-bar { display: inline-block; width: 96px; height: 12px; border-radius: 99px; background: var(--cream-2); border: 1px solid var(--line); overflow: hidden; vertical-align: middle; }
.pd-bar span { display: block; height: 100%; background: var(--olive-deep); border-radius: 99px; }
.pd-list { display: grid; gap: .7rem; list-style: none; margin: 0; padding: 0; }
.pd-list li { display: flex; gap: .6rem; align-items: flex-start; color: var(--olive); line-height: 1.5; }
.pd-list li svg { width: 16px; height: 16px; color: var(--avocado); flex: 0 0 auto; margin-top: .25rem; }
.pd-radars { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; }
.pd-radar { background: var(--cream-2); border-radius: var(--r-md); padding: .6rem .4rem .4rem; text-align: center; }
.pd-radar svg { width: 100%; height: auto; display: block; overflow: visible; }
.pd-radar__cap { display: block; margin-top: .2rem; font-size: .72rem; letter-spacing: .14em; text-transform: uppercase; color: var(--olive-soft); font-weight: 700; }
.pd-radar__ring, .pd-radar__axis { fill: none; stroke: var(--line); stroke-width: 1; }
.pd-radar__lab { font-size: 8.5px; fill: var(--olive); font-family: var(--font-body); }
.pd-radar__data { fill: rgba(122,143,42,.22); stroke: var(--avocado); stroke-width: 2; stroke-linejoin: round; }
svg[data-kind="process"] .pd-radar__data { fill: rgba(201,138,58,.26); stroke: #bd7e30; }
.pd-note { margin-top: .9rem; font-size: .88rem; color: var(--olive); line-height: 1.55; }
.pd-chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.pd-chip { display: inline-flex; align-items: center; padding: .45rem .9rem; border-radius: var(--r-pill); background: var(--cream-2); border: 1px solid var(--line-soft); color: var(--olive-deep); font-weight: 600; font-size: .88rem; }
.pd-shot { margin: 0; position: relative; border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-md); }
.pd-shot img { width: 100%; display: block; aspect-ratio: 4 / 3; object-fit: cover; }
.pd-shot figcaption { position: absolute; left: 0; right: 0; bottom: 0; padding: 1rem; background: linear-gradient(transparent, rgba(20,22,4,.65)); color: #fff; font-size: .88rem; }
.pd-avoid { background: var(--cream-2); border: 1px solid var(--line-soft); border-radius: var(--r-md); padding: 1.1rem 1.3rem; }
.pd-avoid h3 { font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); margin: 0 0 .5rem; font-size: 1.05rem; }
.pd-avoid ul { display: grid; gap: .35rem; list-style: none; margin: 0; padding: 0; }
.pd-avoid li { position: relative; padding-left: 1.3rem; color: var(--olive); font-size: .9rem; }
.pd-avoid li::before { content: "\00d7"; position: absolute; left: 0; color: #b5462f; font-weight: 700; }
.pd-sample { margin: .85rem 0 0; font-size: .88rem; color: var(--olive); border-top: 1px dashed var(--line); padding-top: .75rem; }
.pd-sample__vs { display: block; margin-top: .35rem; color: var(--olive-soft); font-style: italic; }
.pd-cta { display: flex; flex-wrap: wrap; gap: .7rem; }
.pd-cta .btn { margin: 0; }
@media (max-width: 880px) { .pd-grid { grid-template-columns: 1fr; } .pd-hero { grid-template-columns: 1fr; } .pd-hero__media { order: -1; max-width: 360px; } }
@media (max-width: 520px) { .pd-radars { grid-template-columns: 1fr; } }

/* NUTOAST-PD-DETAIL — rich detail block on single product (reuses .pd-* styles) */
.pd-detail { padding: clamp(2rem,4vw,3.4rem) 0 clamp(1rem,2vw,2rem); }
.pd-detail .pd-grid { margin-top: 0; }
.pd-detail__lead { padding: clamp(1.3rem,2.6vw,1.9rem) clamp(1.4rem,3vw,2rem); border-radius: var(--r-lg, 16px); background: var(--cream-2); border: 1px solid var(--line-soft); border-left: 5px solid var(--pd-accent, var(--avocado)); margin-bottom: clamp(1.6rem,3vw,2.4rem); }
.pd-detail__leadtop { display: flex; align-items: center; justify-content: space-between; gap: .7rem 1rem; flex-wrap: wrap; margin-bottom: 1rem; }
.pd-detail__lead .pd-hero__series { background: var(--pd-accent, var(--olive-deep)); color: #fff; }
.pd-detail__tag { margin: 0; max-width: 74ch; color: var(--olive-deep); font-weight: 600; font-size: clamp(1.05rem,1.5vw,1.25rem); line-height: 1.5; }
.pd-detail__sub { margin: .65rem 0 0; color: var(--olive-soft); font-size: .9rem; }
.pd-detail__lead .pd-hero__chip { background: #fff; border: 1px solid var(--line-soft); }

/* ============================================================
   NUTOAST-PSG — selection-guide style product cards (/products demo)
   ============================================================ */
.psg-page { padding-top: clamp(7rem, 6rem + 3vw, 9rem); }
.psg-grid { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: clamp(1.4rem,3vw,2.2rem); margin-top: clamp(2rem,4vw,3rem); align-items: start; }
.psg-card { position: relative; display: flex; flex-direction: column; background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: 0 14px 30px rgba(43,50,27,.07); overflow: hidden; transition: border-color .3s var(--ease), box-shadow .3s var(--ease), transform .3s var(--ease); }
.psg-card:hover { border-color: var(--avocado); box-shadow: var(--shadow-md); }
.psg-card__bar { height: 5px; background: linear-gradient(90deg, var(--pd-accent, var(--avocado)) 0%, var(--pd-accent, var(--avocado)) 62%, var(--lime) 62%); }
.psg-card__img { margin: 1rem 1rem 0; border: 1px solid var(--line-soft); border-radius: var(--r-md); overflow: hidden; background: #efeee4; }
.psg-card__img img { width: 100%; height: auto; object-fit: contain; display: block; }
/* Customizer: revert listing-card images to the cropped 16:10 look */
.nutoast-cards-cropped .psg-card__img { aspect-ratio: 16 / 10; }
.nutoast-cards-cropped .psg-card__img img { height: 100%; object-fit: cover; }
.nutoast-cards-cropped .psg-card2__media { aspect-ratio: 16 / 10; }
.nutoast-cards-cropped .psg-card2__media img { height: 100%; object-fit: cover; }
.psg-card__body { padding: 1.1rem 1.3rem 1.4rem; display: flex; flex-direction: column; gap: .7rem; }
.psg-card__head { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .7rem; }
.psg-card__series { display: inline-block; padding: .34rem .85rem; border-radius: var(--r-pill); background: #edf0cf; color: var(--olive-deep); font-weight: 800; font-size: .72rem; letter-spacing: .1em; text-transform: uppercase; }
.psg-card__sub { color: var(--olive); font-size: .92rem; }
.psg-card__name { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.3rem,2vw,1.55rem); color: var(--olive-deep); margin: .1rem 0 0; line-height: 1.14; }
.psg-card__desc { color: var(--olive); line-height: 1.55; margin: 0; }
.psg-card__specs { display: grid; grid-template-columns: 1fr 1fr; gap: .6rem; margin: .25rem 0; }
.psg-spec { background: #fcfbf3; border: 1px solid var(--line); border-radius: var(--r-md); padding: .7rem .85rem; min-width: 0; }
.psg-spec__k { display: block; font-size: .68rem; letter-spacing: .04em; text-transform: uppercase; color: var(--olive-soft); font-weight: 700; margin-bottom: .3rem; }
.psg-spec__v { font-weight: 600; color: var(--olive-deep); font-size: .95rem; }
.psg-spec .pd-dots i { border-color: var(--olive-deep); }
.psg-spec .pd-dots i.on { background: var(--olive-deep); }
.psg-card__box { background: #fcfbf3; border: 1px solid var(--line); border-radius: var(--r-md); padding: .85rem 1rem; }
.psg-card__boxh { display: block; font-size: .68rem; letter-spacing: .04em; text-transform: uppercase; color: var(--olive-soft); font-weight: 700; margin-bottom: .45rem; }
.psg-card__box ul { list-style: disc; padding-left: 1.1rem; display: grid; gap: .3rem; color: var(--olive); margin: 0; }
.psg-card__lbl { display: block; font-size: .68rem; letter-spacing: .04em; text-transform: uppercase; color: var(--olive-soft); font-weight: 700; margin-top: .2rem; }
.psg-card__avoid { list-style: disc; padding-left: 1.1rem; display: grid; gap: .25rem; color: var(--olive); font-size: .92rem; margin: 0; }
.psg-card__sample { margin: .2rem 0 0; color: var(--olive); font-size: .9rem; line-height: 1.5; }
.psg-card__sample b { color: var(--olive-deep); }
.psg-card .psg-card__cta { margin: .6rem 0 0; width: 100%; justify-content: center; }
.psg-empty { text-align: center; color: var(--olive); padding: 2rem 0; }
@media (max-width: 760px) { .psg-grid { grid-template-columns: 1fr; } }


/* ──────────────────────────────────────────────────────────
   NUTOAST-PSG-TOOL — selection-guide filter / selector
   ────────────────────────────────────────────────────────── */
.psg-tool { margin: clamp(1.6rem,3.5vw,2.6rem) 0 0; padding: clamp(1rem,2.4vw,1.4rem); border: 1px solid rgba(79,87,32,.18); border-radius: var(--r-md); background:
  linear-gradient(rgba(79,87,32,.045) 1px, transparent 1px),
  linear-gradient(90deg, rgba(79,87,32,.045) 1px, transparent 1px),
  var(--cream-2); background-size: 22px 22px; }
.psg-tool__modes { display: inline-grid; grid-auto-flow: column; gap: .25rem; padding: .3rem; border: 1px solid rgba(79,87,32,.16); border-radius: 999px; background: #fff; }
.psg-mode { border: 0; background: transparent; padding: .55rem 1.15rem; border-radius: 999px; font: inherit; font-weight: 700; font-size: .85rem; color: var(--olive); cursor: pointer; transition: background .18s ease, color .18s ease; }
.psg-mode:hover { color: var(--olive-deep); }
.psg-mode.is-active { background: var(--olive-deep); color: #fff; }
.psg-panel { margin-top: 1.1rem; }
.psg-panel__lbl { display: block; font-size: .72rem; letter-spacing: .05em; text-transform: uppercase; font-weight: 700; color: var(--olive-soft); margin-bottom: .65rem; }
.psg-chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.psg-chip-btn { border: 1px solid rgba(79,87,32,.22); background: #fff; color: var(--olive-deep); padding: .5rem 1rem; border-radius: 999px; font: inherit; font-size: .84rem; font-weight: 600; cursor: pointer; transition: background .16s ease, color .16s ease, border-color .16s ease; }
.psg-chip-btn:hover { border-color: var(--olive-deep); }
.psg-chip-btn.is-active { background: var(--olive-deep); color: #fff; border-color: var(--olive-deep); }
.psg-controls { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px,1fr)); gap: .9rem 1rem; align-items: end; }
.psg-ctrl { display: grid; gap: .4rem; }
.psg-ctrl > span { font-size: .72rem; letter-spacing: .04em; text-transform: uppercase; font-weight: 700; color: var(--olive-soft); }
.psg-ctrl select { min-height: 44px; border: 1px solid rgba(79,87,32,.22); border-radius: var(--r-md); padding: 0 .7rem; background: #fff; color: var(--olive-deep); font: inherit; font-size: .9rem; cursor: pointer; }
.psg-seg { display: inline-grid; grid-auto-flow: column; gap: .2rem; padding: .25rem; border: 1px solid rgba(79,87,32,.16); border-radius: 999px; background: #fff; align-self: end; height: 44px; align-content: center; }
.psg-seg button { border: 0; background: transparent; padding: 0 .95rem; border-radius: 999px; font: inherit; font-weight: 700; font-size: .8rem; color: var(--olive); cursor: pointer; }
.psg-seg button.is-active { background: var(--olive-deep); color: #fff; }
.psg-tool__foot { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 1.1rem; padding-top: .9rem; border-top: 1px solid rgba(79,87,32,.12); }
.psg-count { font-size: .82rem; font-weight: 600; color: var(--olive-soft); }
.psg-reset { border: 0; background: transparent; color: var(--olive-deep); font: inherit; font-weight: 700; font-size: .82rem; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; }
.psg-card.is-hidden { display: none !important; }
.psg-noresult { text-align: center; padding: clamp(2rem,5vw,3.5rem) 1rem; display: grid; gap: 1.1rem; place-items: center; }
.psg-noresult p { max-width: 48ch; color: var(--olive); font-size: 1.02rem; line-height: 1.6; margin: 0; }
@media (max-width: 600px) {
  .psg-tool__modes { display: grid; grid-template-columns: 1fr 1fr 1fr; width: 100%; }
  .psg-mode { padding: .55rem .35rem; font-size: .76rem; }
}

/* hidden attr must win over flex/grid display on toggled elements */
.psg-noresult[hidden], .psg-seg[hidden], .psg-panel[hidden], .psg-tool[hidden], .psg-controls [hidden] { display: none !important; }


/* ──────────────────────────────────────────────────────────
   NUTOAST-PSEL — product selection tool (主厨/匠选/臻选) on /products/
   ────────────────────────────────────────────────────────── */
.psel-modes { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(.8rem,2vw,1.2rem); margin-top: clamp(1.6rem,3.5vw,2.6rem); }
.psel-mode { display: grid; gap: .4rem; align-content: start; text-align: left; padding: clamp(1.1rem,2.4vw,1.6rem); border: 1px solid rgba(79,87,32,.2); border-radius: 16px; background: var(--cream-2); cursor: pointer; font: inherit; transition: border-color .18s ease, background .18s ease, box-shadow .18s ease, transform .18s ease; }
.psel-mode:hover { border-color: var(--olive-deep); transform: translateY(-2px); box-shadow: 0 16px 36px rgba(43,50,27,.1); }
.psel-mode.is-active { border-color: var(--olive-deep); background: #eef0cf; box-shadow: inset 0 0 0 1px var(--olive-deep); }
.psel-mode__title { font-size: clamp(1.2rem,2.3vw,1.55rem); font-weight: 800; color: var(--olive-deep); line-height: 1.12; }
.psel-mode__sub { font-size: .9rem; line-height: 1.5; color: var(--olive); margin-top: .15rem; }
.psel-panel { margin-top: clamp(1.4rem,3vw,2rem); }
.psel-panel__lbl { display: block; font-size: .72rem; letter-spacing: .05em; text-transform: uppercase; font-weight: 700; color: var(--olive-soft); margin-bottom: .8rem; }
.psel-scenarios { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(.7rem,1.6vw,1rem); }
.psel-scenario { display: grid; gap: .4rem; align-content: start; text-align: left; padding: clamp(.9rem,1.8vw,1.2rem); border: 1px solid rgba(79,87,32,.16); border-radius: var(--r-md); background: #fff; cursor: pointer; font: inherit; transition: border-color .16s ease, background .16s ease, transform .16s ease; }
.psel-scenario:hover { border-color: var(--olive-deep); transform: translateY(-2px); }
.psel-scenario.is-active { border-color: var(--olive-deep); background: #eef0cf; box-shadow: inset 0 0 0 1px var(--olive-deep); }
.psel-scenario__name { font-weight: 800; color: var(--olive-deep); font-size: 1rem; }
.psel-scenario__desc { font-size: .82rem; line-height: 1.45; color: var(--olive-soft); }
.psel-controls { display: flex; flex-wrap: wrap; gap: 1rem; align-items: end; padding: clamp(1rem,2vw,1.3rem); border: 1px solid rgba(79,87,32,.16); border-radius: var(--r-md); background: var(--cream-2); }
.psel-ctrl { display: grid; gap: .4rem; }
.psel-ctrl > span { font-size: .72rem; letter-spacing: .04em; text-transform: uppercase; font-weight: 700; color: var(--olive-soft); }
.psel-ctrl select { min-height: 44px; border: 1px solid rgba(79,87,32,.22); border-radius: var(--r-md); padding: 0 .7rem; background: #fff; color: var(--olive-deep); font: inherit; font-size: .9rem; cursor: pointer; }
.psel-seg { display: inline-grid; grid-auto-flow: column; gap: .2rem; padding: .25rem; border: 1px solid rgba(79,87,32,.16); border-radius: 999px; background: #fff; height: 44px; align-content: center; }
.psel-seg button { border: 0; background: transparent; padding: 0 1rem; border-radius: 999px; font: inherit; font-weight: 700; font-size: .8rem; color: var(--olive); cursor: pointer; }
.psel-seg button.is-active { background: var(--olive-deep); color: #fff; }
.psel-results { margin-top: clamp(2rem,4vw,3rem); }
.psel-results__head { margin-bottom: clamp(1.2rem,2.5vw,1.8rem); }
.psel-results__head h3 { font-size: clamp(1.5rem,3vw,2.2rem); line-height: 1.1; margin: .3rem 0 .4rem; color: var(--olive-deep); }
.psel-results__head p { color: var(--olive); max-width: 62ch; margin: 0; }
.psel-results .psg-grid { margin-top: 0; }
.psel-prompt p { color: var(--olive); font-size: 1rem; }
.psel-panel[hidden], .psel-seg[hidden], [data-psel-prompt][hidden], [data-psel-noresult][hidden] { display: none !important; }
@media (max-width: 900px) { .psel-scenarios { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 700px) { .psel-modes { grid-template-columns: 1fr; } }
@media (max-width: 480px) { .psel-scenarios { grid-template-columns: 1fr; } }

/* NUTOAST-PSEL grid-paper backdrop (reference "All products" vibe) */
.psel { background-color: var(--cream); background-image: linear-gradient(rgba(51,55,10,.038) 1px, transparent 1px), linear-gradient(90deg, rgba(51,55,10,.038) 1px, transparent 1px); background-size: 30px 30px; }
.psg-card:hover { transform: translateY(-3px); }

/* round content dots (was oval) handled above; keep psel heading on one line on desktop */
.psel .section-head { max-width: 900px; }
@media (min-width: 760px) { .psel .section-head h2 { white-space: nowrap; } }

/* application-scenario icons */
.psel-scenario { position: relative; }
.psel-scenario__icon { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border-radius: 11px; background: rgba(122,143,42,.12); color: var(--olive-deep); margin-bottom: .2rem; transition: background .16s ease, color .16s ease; }
.psel-scenario__icon svg { width: 23px; height: 23px; }
.psel-scenario:hover .psel-scenario__icon, .psel-scenario.is-active .psel-scenario__icon { background: var(--olive-deep); color: #fff; }


/* ──────────────────────────────────────────────────────────
   NUTOAST product preview modal
   ────────────────────────────────────────────────────────── */
.psg-card { cursor: pointer; }
.pmodal { position: fixed; inset: 0; z-index: 9000; display: none; }
.pmodal.open { display: block; }
.pmodal__scrim { position: absolute; inset: 0; background: rgba(33,37,10,.5); -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); animation: pmFade .2s ease both; }
.pmodal__dialog { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); width: min(760px, 94vw); max-height: 90vh; overflow: auto; background: var(--cream); border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: 0 30px 80px rgba(33,37,10,.35); padding: clamp(1.3rem,3vw,2rem); animation: pmRise .24s var(--ease) both; }
.pmodal__close { position: absolute; top: 14px; right: 14px; width: 38px; height: 38px; border-radius: 50%; border: 1px solid var(--line); background: #fff; color: var(--olive-deep); font-size: 1.3rem; line-height: 1; cursor: pointer; display: inline-grid; place-items: center; z-index: 3; transition: background .16s ease, color .16s ease; }
.pmodal__close:hover { background: var(--olive-deep); color: #fff; }
.pmodal-card { display: grid; gap: .9rem; }
.pmodal-card__media { border: 1px solid var(--line-soft); border-radius: var(--r-md); overflow: hidden; aspect-ratio: 1 / 1; position: relative; background: #efeee4; }
.pmodal-card__media img:not(.psg-card__jar) { width: 100%; height: 100%; object-fit: cover; display: block; }
.pmodal-card__title { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.5rem,3vw,2rem); color: var(--olive-deep); margin: .35rem 0 .25rem; line-height: 1.1; }
.pmodal-card__tag { color: var(--olive); margin: 0; line-height: 1.55; }
.pmodal-card__sensory { display: grid; gap: .5rem; }
.pmodal-card .pd-radars { grid-template-columns: 1fr 1fr; }
.pmodal-card__cta { margin-top: .3rem; }
.pmodal-card__cta .btn { width: 100%; justify-content: center; }
.pmodal-card__cta-row { display: flex; gap: .5rem; margin-top: .5rem; }
.pmodal-card__cta-row .btn { flex: 1 1 0; min-width: 0; width: auto; justify-content: center; }
@keyframes pmFade { from { opacity: 0; } to { opacity: 1; } }
@keyframes pmRise { from { opacity: 0; transform: translate(-50%, -46%); } to { opacity: 1; transform: translate(-50%, -50%); } }
@media (max-width: 560px) { .pmodal__dialog { width: 96vw; max-height: 92vh; padding: 1.1rem; } .pmodal-card .pd-radars { grid-template-columns: 1fr; } }

/* Trade-show invitation modal (cloned out of .showbar__tmpl into the pmodal scaffold).
   Poster is a tall 1000x1780 portrait -> give it its own column and let the copy breathe. */
.showmodal { display: grid; grid-template-columns: minmax(0, 260px) minmax(0, 1fr); gap: clamp(1rem, 2.5vw, 1.7rem); align-items: center; }
.showmodal__poster { border: 1px solid var(--line-soft); border-radius: var(--r-md); overflow: hidden; line-height: 0; background: #efeee4; box-shadow: 0 14px 34px rgba(33,37,10,.18); }
.showmodal__poster img { width: 100%; height: auto; display: block; }

/* invitation carousel */
.ntcar { position: relative; }
.ntcar__viewport { overflow: hidden; border-radius: inherit; }
.ntcar__track { display: flex; transition: transform .45s var(--ease); will-change: transform; }
.ntcar__slide { flex: 0 0 100%; min-width: 0; line-height: 0; }
.ntcar__nav { position: absolute; top: 50%; transform: translateY(-50%); width: 34px; height: 34px; display: grid; place-items: center;
  border: 1px solid var(--line); border-radius: 50%; background: rgba(255,255,255,.92); color: var(--olive-deep); cursor: pointer; padding: 0;
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); box-shadow: 0 4px 14px rgba(33,37,10,.18);
  opacity: 0; transition: opacity .25s var(--ease), background .18s var(--ease), color .18s var(--ease); }
.ntcar:hover .ntcar__nav, .ntcar__nav:focus-visible { opacity: 1; }
.ntcar__nav:hover { background: var(--olive-deep); color: #fff; }
.ntcar__nav svg { width: 15px; height: 15px; }
.ntcar__nav--prev { left: 8px; }
.ntcar__nav--prev svg { transform: rotate(180deg); }
.ntcar__nav--next { right: 8px; }
.ntcar__dots { position: absolute; left: 50%; bottom: 8px; transform: translateX(-50%); display: flex; gap: 6px;
  padding: 5px 8px; border-radius: 999px; background: rgba(33,37,10,.42); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }
.ntcar__dot { width: 7px; height: 7px; padding: 0; border: 0; border-radius: 50%; background: rgba(255,255,255,.5); cursor: pointer;
  transition: background .2s var(--ease), transform .2s var(--ease); }
.ntcar__dot.is-active { background: var(--lime); transform: scale(1.25); }
@media (hover: none) { .ntcar__nav { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .ntcar__track { transition: none; } }
.showmodal__body { display: grid; gap: .5rem; justify-items: start; }
.showmodal__badge { display: inline-block; font-family: var(--font-body); font-size: .56rem; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  padding: .3rem .6rem; border-radius: 999px; background: var(--lime); color: var(--olive-deep); }
.showmodal__title { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.35rem, 2.6vw, 1.8rem); line-height: 1.15; color: var(--olive-deep); margin: .2rem 0 0; }
.showmodal__line { font-family: var(--font-display); font-size: 1.02rem; color: var(--olive); margin: 0; }
.showmodal__city { display: flex; align-items: center; gap: .35rem; font-size: .86rem; color: var(--olive-soft); margin: 0; }
.showmodal__city .pin { width: 1em; height: 1em; flex: none; color: var(--avocado); }
.showmodal__city .flag { width: 1.25em; height: auto; flex: none; border-radius: 2px; box-shadow: 0 0 0 1px rgba(33,37,10,.18); }
.showmodal__note { color: var(--olive); line-height: 1.6; margin: .2rem 0 0; }
.showmodal__cta { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .6rem; width: 100%; }
.showmodal__cta .btn { flex: 1 1 auto; justify-content: center; }
.showmodal__fine { margin: .55rem 0 0; width: 100%; font-size: .76rem; }
.showmodal__fine a { color: var(--olive-soft); text-decoration: underline; text-underline-offset: 3px; }
.showmodal__fine a:hover { color: var(--olive-deep); }
@media (max-width: 560px) {
  /* stack: poster leads, but cap it so the CTAs aren't pushed below the fold of a 92vh dialog */
  .showmodal { grid-template-columns: 1fr; gap: 1rem; }
  .showmodal__poster { max-width: 190px; margin: 0 auto; }
  .showmodal__body { justify-items: center; text-align: center; }
  .showmodal__cta .btn { flex: 1 1 100%; }
}

/* how-card hover: ring the rounded image, not the whole text+image card */
.how-media { position: relative; }
.how-media::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 2px var(--avocado); opacity: 0; transition: opacity .35s var(--ease); pointer-events: none; }
.how-card:hover .how-media::after { opacity: 1; }

/* header Contact Sales button — brand-green fill (was lime) */
.site-header .btn--accent { --bg-btn: var(--avocado); --fg-btn: var(--cream); }
.site-header .btn--accent:hover { background: var(--olive-deep); }
.dark-hero .site-header:not(.scrolled) .btn--accent { --bg-btn: var(--lime); --fg-btn: var(--olive-ink); }
.dark-hero .site-header:not(.scrolled) .btn--accent:hover { background: var(--lime-bright); }

/* solid .btn (Explore Nut Solutions, form submits, etc.) — brand green to match Contact Sales; darken on hover */
.btn:not(.btn--ghost):not(.btn--accent):not(.btn--ghost-light):hover { background: var(--olive-deep); }


/* === NUTOAST-PSEL2 (products form -> tier browser) === */
/* form tiles become selectable buttons */
.pcat-nav__card { -webkit-appearance: none; appearance: none; border: 0; background: none; width: 100%; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.pcat-nav__card.is-active { box-shadow: inset 0 0 0 3px var(--avocado), 0 14px 32px rgba(45, 50, 8, .18); }
.pcat-nav__go { display: inline-flex; align-items: center; gap: .4rem; }
.pcat-nav__go-select, .pcat-nav__go-selected { display: inline-flex; align-items: center; gap: .4rem; transition: color .25s var(--ease, ease); }
.pcat-nav__go-selected { display: none; color: var(--avocado); }
.pcat-nav__go-selected svg { width: 18px; height: 18px; }
.pcat-nav__card.is-active .pcat-nav__go-select { display: none; }
.pcat-nav__card.is-active .pcat-nav__go-selected { display: inline-flex; }

/* two-column layout: selection panel + product grid */
.psel2-layout { display: grid; grid-template-columns: minmax(228px, 290px) 1fr; gap: clamp(1.2rem, 2.4vw, 2.2rem); align-items: start; margin-top: clamp(1.6rem, 3vw, 2.6rem); }
.psel2--no-aside .psel2-aside { display: none; }
.psel2--no-aside .psel2-layout { grid-template-columns: 1fr; }
.psel2-aside { position: sticky; top: calc(var(--tb-h, 0px) + 6.5rem); }
.psel2-panel { background: var(--cream); border-radius: var(--r-lg); box-shadow: var(--shadow-md); padding: clamp(1rem, 1.6vw, 1.4rem); }
.psel2-panel__head { display: flex; align-items: baseline; justify-content: space-between; padding-bottom: .85rem; margin-bottom: .85rem; border-bottom: 1px solid color-mix(in srgb, var(--olive-deep) 12%, transparent); }
.psel2-panel__label { font-family: var(--font-display); font-size: .82rem; letter-spacing: .16em; text-transform: uppercase; color: var(--olive); }
.psel2-panel__filter { font-size: .82rem; color: var(--olive-soft); }
.psel2-tiers { display: grid; gap: .5rem; }
.psel2-tier { display: flex; align-items: center; justify-content: space-between; gap: 1rem; width: 100%; padding: .85rem 1.15rem; border: 0; border-radius: 999px; cursor: pointer; background: var(--cream-2); color: var(--olive-deep); font-family: var(--font-display); font-size: 1.08rem; line-height: 1; transition: background .25s var(--ease, ease), color .25s var(--ease, ease); }
.psel2-tier__count { font-size: .98rem; color: var(--olive-soft); font-variant-numeric: tabular-nums; }
.psel2-tier:hover:not(.is-active) { background: #eceadb; }
.psel2-tier.is-active { background: var(--olive-deep); color: #fff; }
.psel2-tier.is-active .psel2-tier__count { color: var(--lime); }

/* results */
.psel2-resulthead { color: var(--olive-soft); font-size: .95rem; margin-bottom: 1rem; }
.psel2-grid { display: block; columns: 340px; column-gap: clamp(1rem, 1.8vw, 1.6rem); }
.psel2-cell { min-width: 0; }
.psel2-cell[hidden] { display: none !important; }

/* clean card for plain WooCommerce products */
.psg-card2 { display: flex; flex-direction: column; height: 100%; background: var(--cream); border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-sm, 0 6px 18px rgba(45, 50, 8, .08)); text-decoration: none; color: inherit; transition: transform .35s var(--ease, ease), box-shadow .35s var(--ease, ease); }
.psg-card2:hover { transform: translateY(-4px); box-shadow: 0 16px 34px rgba(45, 50, 8, .16); }
.psg-card2__media { display: block; overflow: hidden; background: #fff; }
.psg-card2__media img { width: 100%; height: auto; display: block; transition: transform .5s var(--ease, ease); }
.psg-card__foot { display: flex; gap: .5rem; margin-top: auto; }
.psg-card__foot .btn { flex: 1 1 0; min-width: 0; justify-content: center; padding-left: .8rem; padding-right: .8rem; white-space: nowrap; }
.psg-card2:hover .psg-card2__media img { transform: scale(1.04); }
.psg-card2__body { display: flex; flex-direction: column; gap: .5rem; padding: 1.1rem 1.15rem 1.2rem; flex: 1 1 auto; }
.psg-card2__tier { align-self: flex-start; background: #edf0cf; color: var(--olive); border-radius: 999px; padding: .22rem .72rem; font-size: .68rem; font-weight: 600; letter-spacing: .09em; text-transform: uppercase; }
.psg-card2__name { font-family: var(--font-display); font-weight: 500; font-size: 1.18rem; line-height: 1.18; color: var(--olive-deep); margin: 0; }
.psg-card2__desc { color: var(--olive-soft); font-size: .92rem; line-height: 1.5; margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.psg-card2__link { margin-top: auto; color: var(--avocado); font-weight: 600; }

/* empty state */
.psel2-empty { text-align: center; padding: clamp(2rem, 5vw, 3.4rem) 1rem; color: var(--olive-soft); }
.psel2-empty p { margin-bottom: 1.1rem; }
.psel2-empty[hidden] { display: none !important; }

@media (max-width: 840px) {
  .psel2-layout { grid-template-columns: 1fr; }
  .psel2-aside { position: static; top: auto; }
  .psel2-tiers { grid-template-columns: repeat(2, 1fr); }
}

/* rich (pd_enable) product cards open the preview modal — rendered as a <button>, keep the clean card look */
button.psg-card2 { -webkit-appearance:none; appearance:none; border:0; font:inherit; color:inherit; text-align:left; width:100%; cursor:pointer; }

/* === NUTOAST-PSEL2 sticky form tabs + one-line heading === */
.psel2 .section-head h2 { font-size: clamp(1.9rem, 1.15rem + 2.3vw, 2.6rem); white-space: nowrap; }
@media (max-width: 680px) { .psel2 .section-head h2 { white-space: normal; font-size: clamp(1.6rem, 5.4vw, 2.1rem); } }

.psel2-tabbar {
	position: fixed; left: 0; right: 0; top: calc(var(--tb-h, 0px) + 5.5rem); z-index: 40; opacity: 0; transform: translateY(-10px); pointer-events: none; transition: opacity .3s var(--ease), transform .3s var(--ease);
	display: flex; flex-wrap: wrap; gap: .4rem; justify-content: center; align-items: center;
	width: fit-content; max-width: 100%;
	margin: 0 auto clamp(1.4rem, 2.6vw, 2.2rem);
	padding: .45rem;
	background: color-mix(in srgb, var(--cream) 86%, transparent);
	-webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
	border-radius: 999px;
	box-shadow: var(--shadow-sm), inset 0 0 0 1px rgba(45,50,8,.06);
}
.psel2-tab {
	-webkit-appearance: none; appearance: none; border: 0; cursor: pointer;
	font-family: var(--font-display); font-weight: 400; font-size: 1rem; line-height: 1;
	padding: .6rem 1.35rem; border-radius: 999px; white-space: nowrap;
	background: transparent; color: var(--olive);
	transition: background .25s var(--ease), color .25s var(--ease);
}
.psel2-tab:hover { background: var(--cream-2); color: var(--olive-deep); }
.psel2-tab.is-active { background: var(--avocado); color: var(--cream); }
@media (max-width: 520px) { .psel2-tab { font-size: .9rem; padding: .5rem 1rem; } }

.psel2-tabbar.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; }

/* pull the product browser up close under the form cards (psel2 heading removed) */
.pcat-nav-sec { padding-bottom: clamp(1.2rem, 2.2vw, 2rem); }
.psel2 { padding-top: clamp(1.6rem, 3vw, 2.6rem); }
@media (max-width: 840px){ .psel2 { padding-top: .6rem; } }

/* clearer selected form card — outset brand-green ring + soft halo + lift */
.pcat-nav__card.is-active { box-shadow: 0 0 0 3px var(--avocado), 0 0 0 9px rgba(102,110,19,.14), 0 16px 40px rgba(45,50,8,.2); transform: translateY(-3px); }
.pcat-nav__card.is-active:hover { box-shadow: 0 0 0 3px var(--avocado), 0 0 0 9px rgba(102,110,19,.14), var(--shadow-md); transform: translateY(-6px); }

/* === /segments/ scene cards as segment tabs === */
button.ind-card--scene { -webkit-appearance:none; appearance:none; border:0; background:none; width:100%; font:inherit; color:inherit; text-align:left; cursor:pointer; }
.ind-card--scene.is-active { box-shadow: 0 0 0 3px var(--avocado), 0 0 0 9px rgba(102,110,19,.14), 0 16px 38px rgba(45,50,8,.2); }
.seg-card[hidden] { display: none !important; }
.res-apps__bar { display: flex; justify-content: center; margin-bottom: clamp(1.4rem, 2.6vw, 2.4rem); }

.res-apps__painbtn[hidden] { display: none !important; }

/* === /segments/ per-card pain-modal pill (top-right of each scene card) === */
.ind-card__pain { position:absolute; top:1.05rem; right:1.05rem; z-index:3; display:inline-flex; align-items:center; gap:.4em; max-width:calc(100% - 2.1rem); white-space:nowrap; margin:0; padding:.5rem .8rem; border:0; border-radius:var(--r-pill); background:rgba(255,255,255,.94); color:var(--olive-ink); font:inherit; font-size:.74rem; font-weight:700; line-height:1; cursor:pointer; box-shadow:0 6px 18px rgba(20,22,4,.3); transition:background .18s var(--ease), color .18s var(--ease), transform .18s var(--ease); }
.ind-card__pain:hover, .ind-card__pain:focus-visible { background:var(--avocado); color:var(--cream); transform:translateY(-1px); outline:none; }
.ind-card__pain svg { width:14px; height:14px; flex:0 0 auto; }

.scene-prod__chip--link { text-decoration:none; cursor:pointer; transition:background .18s var(--ease), color .18s var(--ease); }
.scene-prod__chip--link:hover { background:var(--avocado); color:var(--cream); }

/* About — text certification list (crawlable, carries Quality keywords) */
.cert-list { list-style:none; margin: clamp(1.4rem,2.6vw,2.2rem) 0 0; padding:0; display:flex; flex-wrap:wrap; justify-content:center; gap:.6rem; }
.cert-list__item { display:inline-flex; align-items:center; padding:.5rem 1rem; border:1px solid var(--avocado); border-radius:999px; font-size:.8rem; font-weight:700; letter-spacing:.04em; color:var(--avocado); background:rgba(102,110,19,.06); }
.cert-note { max-width:62ch; margin:1.2rem auto 0; text-align:center; font-size:.92rem; color:var(--olive); }

.psel2-tier[hidden] { display: none !important; }

/* === /products/ grid: equal-height cards, View details anchored to bottom (fix uneven blank gaps) === */
.psel2-cell { break-inside: avoid; -webkit-column-break-inside: avoid; margin-bottom: clamp(1rem, 1.8vw, 1.6rem); }
.psg-card__body { flex: 1 1 auto; }
.psg-card .psg-card__cta { margin-top: auto; }

/* === Application recipe: gallery cards become buttons === */
button.seg-card { -webkit-appearance:none; appearance:none; font:inherit; color:inherit; cursor:pointer; width:100%; }

/* === Application recipe modal === */
.app-modal { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); margin:0; width:min(720px,92vw); max-width:720px; max-height:90vh; border:0; border-radius:var(--r-lg); padding:0; background:var(--cream); color:var(--olive-deep); box-shadow:0 30px 80px rgba(20,22,4,.4); overflow:auto; }
.app-modal::backdrop { background:rgba(20,22,4,.55); }
.app-modal__inner { position:relative; display:grid; grid-template-columns:1fr 1fr; }
@media (max-width:640px){ .app-modal__inner { grid-template-columns:1fr; } }
.app-modal__close { position:absolute; top:.7rem; right:.7rem; z-index:3; width:38px; height:38px; display:grid; place-items:center; border:0; border-radius:50%; background:rgba(255,255,255,.92); color:var(--olive-deep); cursor:pointer; }
.app-modal__close svg { width:20px; height:20px; }
.app-modal__media { background:#efeee4; display:grid; place-items:center; min-height:240px; }
/* 菜品没有照片时（/recipes/ 的网格会直接跳过这类，文章里的应用条不会），
   把媒体栏整个撤掉、弹窗收成一栏 —— 否则左边是一个带 alt 文字的破图框，
   看起来像图挂了，而不是「这道菜还没拍」。
   注意不能只用 [hidden]：上一行的 display:grid 优先级更高，会把它盖掉。 */
.app-modal__inner.is-noimg { grid-template-columns: 1fr; }
.app-modal__inner.is-noimg .app-modal__media { display: none; }
.app-modal__media img { width:100%; height:100%; max-height:430px; object-fit:contain; display:block; }
.app-modal__body { padding:1.6rem 1.7rem 1.8rem; display:flex; flex-direction:column; gap:.65rem; }
/* Desktop: pin the media panel, scroll only the recipe column. Without this the
   whole dialog scrolls, which stretches the media column to the full content
   height (measured 1201px against an 810px window) — the photo is then centred
   in the column but sits ~200px below the centre of the visible dialog and gets
   clipped. Capping the grid to the dialog height makes "centre of the column"
   and "centre of what you see" the same thing again. */
@media (min-width:641px){
  .app-modal { overflow:hidden; }
  .app-modal__inner { max-height:90vh; }
  .app-modal__body { min-height:0; overflow-y:auto; overscroll-behavior:contain; }
}
.app-modal__name { font-family:var(--font-display); font-weight:600; font-size:clamp(1.4rem,1rem+1.6vw,1.8rem); line-height:1.15; color:var(--olive-deep); margin:0; }
.app-modal__desc { color:var(--olive); line-height:1.55; margin:0; font-size:.94rem; }
.app-modal__lbl { display:block; font-size:.7rem; letter-spacing:.1em; text-transform:uppercase; font-weight:800; color:var(--avocado); margin:.35rem 0 .1rem; }
.app-modal__list { list-style:none; margin:0; padding:0; display:grid; gap:.4rem; }
.app-modal__list li { display:flex; align-items:baseline; justify-content:space-between; gap:.8rem; padding:.55rem .85rem; background:#fcfbf3; border:1px solid var(--line); border-radius:var(--r-md); font-size:.93rem; }
.app-modal__list li b { color:var(--olive-deep); font-weight:700; white-space:nowrap; }
.app-modal__list--rec li { justify-content:flex-start; }
.app-prod { color:var(--avocado); font-weight:600; text-decoration:none; }
.app-prod:hover { text-decoration:underline; }
.app-prod--plain { color:var(--olive); font-weight:500; }
.app-modal__cta { display:grid; grid-template-columns:1fr 1fr; gap:.55rem; margin-top:.7rem; }
.app-modal__cta .btn { width:100%; min-width:0; justify-content:center; padding:.72rem .5rem; font-size:.85rem; white-space:nowrap; }
@media (max-width:380px){ .app-modal__cta { grid-template-columns:1fr; } }
body.scene-modal-open { overflow:hidden; }

.app-modal__list li.app-prod-row { align-items:center; gap:.7rem; padding:.5rem .7rem; }
.app-prod-img { width:46px; height:46px; flex:0 0 auto; border-radius:8px; object-fit:cover; background:#efeee4; border:1px solid var(--line); }
.app-prod-name { flex:1 1 auto; }
.app-prod-link { color:var(--avocado); font-weight:600; text-decoration:none; }
.app-prod-link:hover { text-decoration:underline; }
.app-prod-link--plain { color:var(--olive); font-weight:500; }
.app-prod-row b { color:var(--olive-deep); font-weight:700; white-space:nowrap; }

.app-modal__radar { margin-top:1rem; padding-top:1rem; border-top:1px solid var(--line); text-align:center; }
.app-modal__radar .app-modal__lbl { display:block; margin-bottom:.2rem; }
.app-modal__radar .pd-radar { max-width:240px; margin:.3rem auto 0; }
.app-modal__radar[hidden] { display:none; }

/* ===== Bespoke product landing — single-product-pd.php (modal-style card) ===== */
.pdp--card { position: relative; isolation: isolate; background-color: var(--cream); background-image: linear-gradient( rgba(102,110,19,.07) 1px, transparent 1px ), linear-gradient( 90deg, rgba(102,110,19,.07) 1px, transparent 1px ); background-size: 32px 32px; padding: clamp(7rem,9vw,9.5rem) 0 clamp(2.4rem,3.5vw,3.2rem); }
.pdp--card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: clamp(420px, 56vh, 680px); z-index: -1; pointer-events: none; background: radial-gradient(64% 78% at 50% 0%, rgba(255,255,253,.92), rgba(255,255,253,0) 60%), radial-gradient(48% 56% at 50% 4%, rgba(231,234,107,.20), rgba(231,234,107,0) 70%); }
.pdp-card__cta { margin-top: .6rem; }
.pdp-cta-box { display: flex; align-items: center; justify-content: space-between; gap: clamp(1rem,3vw,1.8rem); flex-wrap: wrap; background: linear-gradient(120deg, var(--cream-2), rgba(231,234,107,.22)); border: 1px solid var(--line-soft); border-radius: var(--r-lg); padding: clamp(1.4rem,3vw,2rem) clamp(1.4rem,3vw,2.2rem); box-shadow: var(--shadow-sm); }
.pdp-cta-box__txt { display: flex; flex-direction: column; gap: .28rem; min-width: 0; }
.pdp-cta-box__txt b { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.15rem,2vw,1.5rem); color: var(--olive-deep); line-height: 1.15; }
.pdp-cta-box__txt span { color: var(--muted); font-size: .92rem; line-height: 1.5; max-width: 48ch; }
.pdp-cta-box__act { display: flex; gap: .6rem; flex-shrink: 0; flex-wrap: wrap; }
@media (max-width: 560px){ .pdp-cta-box { flex-direction: column; align-items: stretch; } .pdp-cta-box__act { width: 100%; flex-direction: column; gap: .6rem; } .pdp-cta-box__act .btn { width: 100%; justify-content: center; padding-block: .95em; } }
.pdp-card { max-width: 920px; margin: 0 auto; padding: 0 1.3rem; display: grid; gap: 1.15rem; }
.pdp-card__crumb { font-size: .82rem; letter-spacing: .02em; color: var(--olive); display: flex; gap: .45rem; align-items: center; margin-bottom: clamp(.6rem, 2vw, 1.4rem); }
.pdp-card__crumb a { color: var(--olive); text-decoration: none; }
.pdp-card__crumb a:hover { color: var(--avocado); text-decoration: underline; }
.pdp-card__crumb span { opacity: .5; }
.pdp-card__media { border: 1px solid var(--line-soft); border-radius: var(--r-lg); overflow: hidden; position: relative; aspect-ratio: 1 / 1; max-width: 560px; margin-inline: auto; box-shadow: 0 28px 64px -22px rgba(45,50,8,.34), 0 8px 20px rgba(45,50,8,.10); }
.pdp-card__media img:not(.psg-card__jar) { width: 100%; height: 100%; object-fit: cover; display: block; }
.pdp-card__head { display: grid; gap: .5rem; }
.pdp-card__title { font-family: var(--font-display); font-weight: 600; font-size: clamp(2rem,4vw,3rem); color: var(--olive-deep); margin: .25rem 0 0; line-height: 1.05; }
.pdp-card__tag { color: var(--olive); margin: 0; line-height: 1.6; font-size: 1.06rem; }
.pdp-card__sub2 { color: var(--olive-soft); margin: 0; font-size: .94rem; }
.pdp-cta-float { position: fixed; bottom: 1.5rem; left: 50%; transform: translateX(-50%); z-index: 70; display: flex; gap: .5rem; padding: .45rem; background: rgba(253,252,244,.94); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); border: 1px solid var(--line); border-radius: 999px; box-shadow: 0 16px 44px rgba(20,22,4,.24); transition: opacity .3s var(--ease), transform .3s var(--ease); }
.pdp-cta-float.is-hidden { opacity: 0; transform: translateX(-50%) translateY(160%); pointer-events: none; }
.pdp-cta-float .btn { margin: 0; white-space: nowrap; }
.pdp-cta-float .nutoast-add-inquiry { white-space: nowrap; }
@media (max-width: 600px){
  .pdp-cta-float { bottom: 5.25rem; width: min(440px, calc(100vw - 2rem)); }
  .pdp-cta-float .btn { flex: 1 1 0; min-width: 0; justify-content: center; padding-left: 1rem; padding-right: 1rem; }
}
.pdp-card__sensory { display: grid; gap: .55rem; }
.pdp-card__boxes { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; }
.pdp-card__apps { display: grid; gap: .5rem; }
.pdp-swatch { display: inline-block; width: .85rem; height: .85rem; border-radius: 50%; vertical-align: middle; margin-right: .35rem; border: 1px solid rgba(0,0,0,.12); }
.psg-spec .pd-sq i.on { background: var(--olive-deep); border-color: var(--olive-deep); }
.psg-spec .pd-bar { display: inline-block; width: 84px; }
.psg-spec .pd-bar > span { background: var(--olive-deep); }
@media (max-width: 620px){
  .pdp-card__boxes { grid-template-columns: 1fr; }
  .psg-card__specs { grid-template-columns: 1fr; }
  .pd-radars { grid-template-columns: 1fr; }
}
#explore { scroll-margin-top: 9.5rem; }

/* Worldwide Reach — map + HTML figures (replaces the baked-in composite stats) */
.reach-grid { display: grid; grid-template-columns: 1.12fr .88fr; gap: clamp(1.5rem, 4vw, 3.5rem); align-items: center; margin-top: clamp(1.4rem, 3vw, 2.4rem); }
.reach-grid .reach-map { margin: 0; }
.reach-figures { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem, 3vw, 2.6rem) clamp(1.1rem, 2.4vw, 1.9rem); }
.reach-fig { display: grid; gap: .4rem; }
.reach-fig__icon { color: var(--avocado); }
.reach-fig__icon svg { width: 26px; height: 26px; display: block; }
.reach-fig__num { font-family: var(--font-display); font-weight: 600; font-size: clamp(2rem, 3.4vw, 2.7rem); line-height: 1; color: var(--olive-deep); }
.reach-fig__num .plus { color: var(--avocado); margin-left: 1px; }
.reach-fig__label { color: var(--olive-soft); font-size: .92rem; line-height: 1.35; }
@media (max-width: 820px){ .reach-grid { grid-template-columns: 1fr; } .reach-figures { max-width: 440px; margin: .5rem auto 0; } }

/* About — ingredient-transformation conveyor illustration (from staging5) */
.prodflow-img { margin: clamp(1.6rem, 3.5vw, 3rem) auto 0; max-width: 1180px; }
.prodflow-img img { width: 100%; height: auto; display: block; }

/* Recipe modal — video module (play overlay -> embed) */
.app-modal__media { position: relative; }
.app-modal__play { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); width: 64px; height: 64px; border: 0; border-radius: 50%; background: rgba(255,255,255,.92); color: var(--avocado); display: grid; place-items: center; cursor: pointer; box-shadow: 0 10px 28px rgba(20,22,4,.32); transition: transform .2s var(--ease, ease); z-index: 2; }
.app-modal__play:hover { transform: translate(-50%,-50%) scale(1.08); }
.app-modal__play svg { width: 28px; height: 28px; fill: currentColor; margin-left: 3px; }
.app-modal__play[hidden] { display: none; }
.app-vbox { position: fixed; inset: 0; z-index: 20; display: grid; place-items: center; background: rgba(18,20,6,.86); padding: 4vw; }
.app-vbox[hidden] { display: none; }
.app-vbox__frame { position: relative; width: min(960px, 92vw); aspect-ratio: 16 / 9; max-height: 84vh; background: #000; border-radius: 14px; overflow: hidden; box-shadow: 0 30px 90px rgba(0,0,0,.55); }
.app-vbox__frame iframe, .app-vbox__frame video { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.app-vbox__close { position: absolute; top: 1.4rem; right: 1.6rem; width: 44px; height: 44px; border: 0; border-radius: 50%; background: rgba(255,255,255,.92); color: var(--olive-deep); font-size: 1.7rem; line-height: 1; cursor: pointer; display: grid; place-items: center; box-shadow: 0 6px 18px rgba(0,0,0,.3); }
.app-vbox__close:hover { background: #fff; }

/* Single post — render imported Elementor post content cleanly (no Elementor CSS loaded) */
.entry-content .elementor, .entry-content .elementor-element, .entry-content .e-con, .entry-content .e-con-inner, .entry-content .elementor-widget, .entry-content .elementor-widget-container, .entry-content .elementor-button-wrapper { display: block; width: auto; max-width: 100%; padding: 0; margin: 0; }
.entry-content .elementor-widget { margin: 1.1rem 0; }
.entry-content .elementor-widget-image img { width: 100%; height: auto; display: block; border-radius: var(--r-lg); }
.entry-content .elementor-widget-text-editor { line-height: 1.75; color: var(--olive-deep); }
.entry-content .elementor-widget-text-editor p { margin: 0 0 .9rem; }
.entry-content .elementor-button-wrapper { margin: 1.4rem 0; }
.entry-content .elementor-button, .entry-content a.elementor-button { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; padding: .7rem 1.7rem; background: var(--avocado); color: #fff !important; border-radius: var(--r-pill); font-size: 1rem; font-weight: 600; line-height: 1.2; text-decoration: none; }
.entry-content .elementor-button:hover, .entry-content a.elementor-button:hover { background: var(--olive-deep); }
.entry-content .elementor-button .elementor-button-content-wrapper { display: inline-flex; align-items: center; line-height: 1.2; }
.entry-content .elementor-button .elementor-button-text { line-height: 1.2; font-size: inherit; }

/* ---- animated jar overlay on /products/ listing cards (compositor-only) ---- */
.psg-card__img { position: relative; }
.psg-card__img .psg-card__jar, .pmodal-card__media .psg-card__jar, .pdp-card__media .psg-card__jar {
  position: absolute; right: 3.5%; bottom: 11%; width: 40%; height: auto; margin: 0;
  object-fit: contain; pointer-events: none; z-index: 2;
  filter: drop-shadow(0 10px 13px rgba(20,30,8,.30));
  animation: nutoastJarFloat 4s ease-in-out infinite;
}
.psel2-cell:nth-child(3n+2) .psg-card__jar { animation-delay: -1.3s; }
.psel2-cell:nth-child(3n+3) .psg-card__jar { animation-delay: -2.6s; }
@keyframes nutoastJarFloat {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  50%      { transform: translateY(-7px) rotate(-1deg); }
}
.psg-card:hover .psg-card__jar {
  animation-play-state: paused;
  transform: translateY(-11px) scale(1.05) rotate(-2.5deg);
  transition: transform .45s var(--ease, ease), filter .45s var(--ease, ease);
  filter: drop-shadow(0 18px 22px rgba(20,30,8,.34));
}
@media (prefers-reduced-motion: reduce) {
  .psg-card__img .psg-card__jar, .pmodal-card__media .psg-card__jar, .pdp-card__media .psg-card__jar { animation: none; }
  .psg-card:hover .psg-card__jar { transform: none; }
}

/* Trade-shows section CTA -> News */
.shows-cta { display: flex; justify-content: center; margin-top: clamp(1.8rem, 3.5vw, 2.8rem); }

/* ===== Certifications wall (downloadable + previewable PDFs) ===== */
.cert-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(1rem, 2vw, 1.5rem); margin-top: clamp(1.6rem,3vw,2.4rem); }
@media (max-width: 980px){ .cert-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 680px){ .cert-grid { grid-template-columns: repeat(2, 1fr); } }
.cert-card { display: flex; flex-direction: column; background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-lg); overflow: hidden; transition: transform .35s var(--ease), box-shadow .35s var(--ease), border-color .35s var(--ease); }
.cert-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); border-color: var(--avocado); }
.cert-card__view { position: relative; display: block; width: 100%; padding: 0; border: 0; background: #fff; cursor: pointer; aspect-ratio: 1 / 1.26; overflow: hidden; }
.cert-card__view[disabled] { cursor: default; }
.cert-card__view img { width: 100%; height: 100%; object-fit: cover; object-position: top center; display: block; transition: transform .5s var(--ease); }
.cert-card:hover .cert-card__view img { transform: scale(1.045); }
.cert-card__ph { display: grid; place-items: center; height: 100%; color: var(--olive-soft); }
.cert-card__ph svg { width: 40px; height: 40px; }
.cert-card__overlay { position: absolute; inset: 0; display: grid; place-items: center; background: linear-gradient(to top, rgba(20,22,4,.34), rgba(20,22,4,0) 45%); opacity: 0; transition: opacity .3s var(--ease); }
.cert-card:hover .cert-card__overlay { opacity: 1; }
.cert-card__zoom { display: inline-flex; align-items: center; gap: .4rem; padding: .45rem .9rem; border-radius: var(--r-pill); background: rgba(253,252,244,.95); color: var(--olive-deep); font-weight: 600; font-size: .8rem; box-shadow: var(--shadow-sm); transform: translateY(8px); transition: transform .3s var(--ease); }
.cert-card:hover .cert-card__zoom { transform: none; }
.cert-card__zoom svg { width: 15px; height: 15px; }
.cert-card__cap { padding: .85rem 1rem .3rem; display: flex; flex-direction: column; gap: .12rem; }
.cert-card__name { font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); font-size: 1rem; line-height: 1.2; }
.cert-card__desc { color: var(--muted); font-size: .78rem; line-height: 1.4; }
.cert-card__act { display: flex; gap: .5rem; padding: .55rem 1rem 1rem; margin-top: auto; }
.cert-card__btn { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: .35rem; padding: .5rem .5rem; border-radius: var(--r-pill); font-size: .8rem; font-weight: 600; transition: background .3s var(--ease), color .3s var(--ease), transform .3s var(--ease); }
.cert-card__btn--view { background: var(--cream-2); color: var(--olive-deep); border: 1px solid var(--line-soft); }
.cert-card__btn--view:hover { background: var(--lime); border-color: var(--lime); }
.cert-card__btn--dl { background: var(--avocado); color: var(--cream); }
.cert-card__btn--dl:hover { background: var(--olive-deep); }
.cert-card__btn svg { width: 14px; height: 14px; }
.cert-lb[hidden] { display: none; }
.cert-lb { position: fixed; inset: 0; z-index: 200; display: grid; place-items: center; padding: clamp(.8rem, 3vw, 2.4rem); }
.cert-lb__scrim { position: absolute; inset: 0; background: rgba(20,22,4,.62); -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); }
.cert-lb__panel { position: relative; width: min(900px, 96vw); height: min(90vh, 1180px); background: var(--cream); border-radius: var(--r-lg); box-shadow: var(--shadow-lg); display: flex; flex-direction: column; overflow: hidden; }
.cert-lb__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: .8rem .6rem .8rem 1.2rem; border-bottom: 1px solid var(--line-soft); }
.cert-lb__head b { font-family: var(--font-display); font-weight: 500; color: var(--olive-deep); font-size: 1.05rem; }
.cert-lb__tools { display: flex; align-items: center; gap: .5rem; }
.cert-lb__tool { font-size: .8rem; font-weight: 600; padding: .45rem .85rem; border-radius: var(--r-pill); background: var(--cream-2); color: var(--olive-deep); border: 1px solid var(--line-soft); transition: background .25s var(--ease); }
.cert-lb__tool:hover { background: var(--lime); }
.cert-lb__tool--dl { background: var(--avocado); color: var(--cream); border-color: transparent; }
.cert-lb__tool--dl:hover { background: var(--olive-deep); }
.cert-lb__x { width: 36px; height: 36px; border-radius: 10px; font-size: 1.6rem; line-height: 1; color: var(--olive-soft); display: grid; place-items: center; }
.cert-lb__x:hover { background: rgba(20,22,4,.06); color: var(--olive-deep); }
.cert-lb__body { flex: 1; min-height: 0; background: #525659; }
.cert-lb__body iframe { width: 100%; height: 100%; border: 0; display: block; }
@media (max-width: 560px){ .cert-lb__tool { padding: .4rem .6rem; font-size: .72rem; } }
@media (max-width: 440px){ .cert-card__act { flex-direction: column; } .cert-card__btn { padding: .6rem; min-height: 44px; } }

/* Cert wall — show 4, expand the rest (compositor-only reveal) */
.cert-card--extra { display: none; }
.about-certs.is-expanded .cert-card--extra { display: flex; animation: certReveal .45s var(--ease, ease) both; }
.about-certs.is-expanded .cert-card:nth-child(6) { animation-delay: .06s; }
.about-certs.is-expanded .cert-card:nth-child(7) { animation-delay: .12s; }
.about-certs.is-expanded .cert-card:nth-child(8) { animation-delay: .18s; }
@keyframes certReveal { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.cert-more { display: flex; justify-content: center; margin-top: clamp(1.4rem, 3vw, 2.2rem); }
.cert-more__chev { width: 16px; height: 16px; transition: transform .3s var(--ease, ease); }
.about-certs.is-expanded .cert-more__chev { transform: rotate(180deg); }
@media (prefers-reduced-motion: reduce){ .about-certs.is-expanded .cert-card--extra { animation: none; } }
.cert-cta { text-align: center; margin-top: clamp(1.6rem, 3vw, 2.4rem); }
#certifications { scroll-margin-top: clamp(6rem, 9vw, 7.5rem); }


/* ============================================================
   COOKIE CONSENT — dark olive bar w/ lime accent (matches .showbar)
   ============================================================ */
.ck { position: fixed; left: 0; right: 0; bottom: 0; z-index: 9500; display: none;
  padding: clamp(.8rem, 2vw, 1.4rem); pointer-events: none; }
.ck.is-open { display: block; }
.ck[hidden] { display: none; }
.ck__bar, .ck__panel { pointer-events: auto; max-width: 1060px; margin: 0 auto;
  background: rgba(20,22,4,.94); -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
  border: 1px solid rgba(231,234,107,.28); border-top: 2px solid var(--lime);
  border-radius: var(--r-lg); color: #fff; box-shadow: 0 -6px 40px rgba(20,22,4,.4);
  animation: ckRise .34s var(--ease) both; }
@keyframes ckRise { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: none; } }
.ck__bar { display: flex; align-items: center; gap: clamp(.9rem, 2vw, 1.4rem); padding: clamp(1rem, 2vw, 1.3rem) clamp(1.1rem, 2.2vw, 1.6rem); }
.ck__icon { flex: none; width: 40px; height: 40px; display: grid; place-items: center; border-radius: 11px;
  background: rgba(231,234,107,.16); color: var(--lime); }
.ck__text { flex: 1 1 auto; min-width: 0; }
.ck__title { margin: 0 0 .2rem; font-family: var(--font-body); font-weight: 700; font-size: .74rem;
  letter-spacing: .14em; text-transform: uppercase; color: #fff; }
.ck__body { margin: 0; font-size: .84rem; line-height: 1.55; color: rgba(255,255,255,.74); }
.ck__link { color: var(--lime); text-decoration: underline; text-underline-offset: 3px; }
.ck__link:hover { color: #fff; }
.ck__actions { flex: none; display: flex; flex-wrap: wrap; gap: .5rem; }
.ck__btn { font: inherit; font-size: .82rem; font-weight: 600; line-height: 1; white-space: nowrap;
  padding: .68rem 1.15rem; border-radius: var(--r-pill); cursor: pointer; transition: background .18s var(--ease), color .18s var(--ease), border-color .18s var(--ease); }
.ck__btn--ghost { background: transparent; border: 1px solid rgba(255,255,255,.26); color: #fff; }
.ck__btn--ghost:hover { border-color: var(--lime); color: var(--lime); }
.ck__btn--accent { background: var(--lime); border: 1px solid var(--lime); color: var(--olive-deep); }
.ck__btn--accent:hover { background: #eef1a0; border-color: #eef1a0; }
.ck__btn:focus-visible { outline: 2px solid var(--lime); outline-offset: 2px; }
/* preferences panel */
.ck__panel { padding: clamp(1.1rem, 2.2vw, 1.5rem); }
.ck__panel .ck__title { margin-bottom: .9rem; font-size: .82rem; }
.ck__panel .ck__actions { margin-top: 1.1rem; justify-content: flex-end; }
.ck__cats { display: grid; gap: .5rem; }
.ck__cat { display: flex; align-items: center; gap: 1rem; padding: .8rem .95rem; border-radius: var(--r-md);
  background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.08); }
.ck__cat-txt { flex: 1 1 auto; min-width: 0; }
.ck__cat-name { display: block; font-weight: 600; font-size: .9rem; color: #fff; }
.ck__cat-desc { display: block; font-size: .76rem; line-height: 1.5; color: rgba(255,255,255,.6); margin-top: .12rem; }
.ck__switch { flex: none; position: relative; width: 42px; height: 24px; }
.ck__switch input { position: absolute; inset: 0; opacity: 0; margin: 0; cursor: pointer; }
.ck__slider { position: absolute; inset: 0; border-radius: 999px; background: rgba(255,255,255,.22); transition: background .2s var(--ease); }
.ck__slider::before { content: ""; position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: #fff; transition: transform .2s var(--ease); }
.ck__switch input:checked + .ck__slider { background: var(--lime); }
.ck__switch input:checked + .ck__slider::before { transform: translateX(18px); }
.ck__switch input:focus-visible + .ck__slider { outline: 2px solid var(--lime); outline-offset: 2px; }
.ck__switch.is-locked { opacity: .7; }
.ck__switch.is-locked input { cursor: not-allowed; }
@media (max-width: 720px) {
  .ck__bar { flex-wrap: wrap; }
  .ck__actions { width: 100%; }
  .ck__actions .ck__btn { flex: 1 1 auto; text-align: center; }
  .ck__panel .ck__actions { justify-content: stretch; }
}


/* ============================================================
   WP admin bar clearance — the admin bar is position:fixed and our top-bar +
   header are too, so WP's html margin-top can't push them down. Offset the
   top-pinned UI by the bar height (logged-in only; visitors: --wpadminbar unset
   -> 0). Composes with the header's scroll transform. WP breakpoint = 782px.
   ============================================================ */
.admin-bar { --wpadminbar: 32px; }
.admin-bar .mobile-nav { top: var(--wpadminbar, 0px); }
@media screen and (max-width: 782px) { .admin-bar { --wpadminbar: 46px; } }


/* Recipe modal — base ingredients (chips) + numbered method. */
.app-modal__ingredients, .app-modal__steps { margin-top: 1rem; }
.app-modal__chips { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .45rem; }
.app-modal__chip { display: inline-block; padding: .3rem .68rem; border-radius: var(--r-pill);
  background: var(--sand); color: var(--olive-deep); font-size: .78rem; line-height: 1.3; }
.app-modal__steplist { margin: .5rem 0 0; padding-left: 1.15rem; display: grid; gap: .38rem; }
.app-modal__steplist li { font-size: .86rem; line-height: 1.55; color: var(--olive); }
.app-modal__steplist li::marker { color: var(--avocado); font-weight: 700; }

/* ===========================================================================
   Mid-Autumn long-read (mcx-) — an illustrated article, not blocks of image
   followed by blocks of text.

   The brief that produced this: the first version put every picture in one slab
   and every paragraph in another, so on a phone you scrolled through ~1,900
   characters before anything to look at. Here each image sits beside the
   paragraph it actually illustrates, and the eye is handed from text to picture
   and back the whole way down.
   =========================================================================== */

/* --- alternating text | image row ---------------------------------------- */
/* Breaks out past the 760px article column: at 760 a two-column split leaves
   ~360px of text, which wraps every 6 words and reads worse than one column. */
.entry-content .mcx-split { display: grid; grid-template-columns: 1.12fr .88fr; gap: clamp(1.2rem, 3vw, 2.6rem);
  align-items: center; width: min(var(--maxw), calc(100vw - 2.5rem));
  margin: 2rem 0 2rem 50%; transform: translateX(-50%); }
/* Alternate rows flip so the page zig-zags instead of forming a hard column edge
   down one side. This is an explicit class, NOT :nth-of-type(even) — the rows are
   not contiguous siblings (a stat block and <hr> sit between them), so type-based
   counting silently produced 图右/图右/图左/图右. */
.entry-content .mcx-split--flip .mcx-split__media { order: -1; }
/* The posters are 2:3 portraits. At half of a 1240px row they tower ~880px over a
   ~350px text column, which is what produced the large voids; capping the width
   brings the two sides into the same visual weight and takes ~1,500px off the
   page. align-items:center then splits whatever gap remains above and below
   rather than dumping it all underneath the text. */
.entry-content .mcx-split__media { max-width: 400px; margin-inline: auto;
  border-radius: var(--r-md); overflow: hidden; box-shadow: var(--shadow-md); background: var(--cream); }
.entry-content .mcx-split__media img { width: 100%; height: auto; display: block; border-radius: 0; }
/* The theme's own rhythm rule is `.entry-content > * + *`, i.e. DIRECT children
   only, so nothing inside these blocks got any spacing and consecutive
   paragraphs ran together. Restate it one level down. */
.entry-content .mcx-split__body > * + * { margin-top: .85rem; }
.entry-content .mcx-split__body > *:first-child { margin-top: 0; }
.entry-content .mcx-split__body h2,
.entry-content .mcx-split__body h3 { margin-top: 0; }

@media (max-width: 820px) {
  /* One column on phones. The image goes FIRST in every row — on a narrow screen
     a picture is what makes someone keep reading, and alternating the order there
     just looks like a mistake. */
  .entry-content .mcx-split { grid-template-columns: 1fr; gap: 1rem; margin: 1.6rem 0; width: auto;
    transform: none; }
  .entry-content .mcx-split .mcx-split__media,
  .entry-content .mcx-split--flip .mcx-split__media { order: -1; }
}

/* --- a family's mooncakes, as cut-outs on the brand ground ---------------- */
.entry-content .mcx-strip { display: grid; gap: .6rem; margin: 1.1rem 0 0;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); }
.entry-content .mcx-item { border-radius: var(--r-md); overflow: hidden;
  background: linear-gradient(135deg, #eef0d8, #e4e6c6); text-align: center; }
.entry-content .mcx-item img { width: 88%; height: auto; margin: 0 auto; display: block;
  aspect-ratio: 1/1; object-fit: contain; border-radius: 0; }
.entry-content .mcx-item span { display: block; padding: 0 .5rem .6rem; font-size: .72rem;
  line-height: 1.35; color: var(--olive-deep); }

/* --- the ingredient line that closes each family -------------------------- */
.entry-content .mcx-prod { display: flex; flex-wrap: wrap; align-items: baseline; gap: .4rem;
  margin: 1rem 0 0; padding: .7rem .9rem; border-left: 3px solid var(--avocado);
  background: #f6f7ea; border-radius: 0 var(--r-md) var(--r-md) 0; font-size: .88rem; }
.entry-content .mcx-prod strong { color: var(--olive-deep); }

/* --- featured development case ------------------------------------------- */
.entry-content .mcx-case { width: min(var(--maxw), calc(100vw - 2.5rem)); margin: 1.8rem 0 2rem 50%;
  transform: translateX(-50%); display: grid; grid-template-columns: minmax(0, 320px) minmax(0, 1fr);
  gap: clamp(1.2rem, 3vw, 2.2rem); align-items: start;
  padding: clamp(1.2rem, 3vw, 1.9rem); border-radius: var(--r-lg);
  background: var(--cream); border: 1px solid var(--line); box-shadow: var(--shadow-sm); }
.entry-content .mcx-case__media { border-radius: var(--r-md); overflow: hidden;
  background: linear-gradient(135deg, #eef0d8, #e4e6c6); }
.entry-content .mcx-case__media img { width: 88%; margin: 0 auto; display: block; border-radius: 0;
  aspect-ratio: 1/1; object-fit: contain; }
.entry-content .mcx-case h3 { margin: 0 0 .3rem; }
.entry-content .mcx-case__lead { margin: 0 0 1rem; font-size: .92rem; color: var(--olive); }
.entry-content .mcx-case__label { display: block; margin: 1.1rem 0 .5rem; font-size: .68rem;
  font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--avocado); }
.entry-content .mcx-case__label:first-of-type { margin-top: 0; }
.entry-content .mcx-chips { display: flex; flex-wrap: wrap; gap: .38rem; margin: 0; padding: 0; list-style: none; }
.entry-content .mcx-chips li { padding: .26rem .68rem; border-radius: 999px; background: #edf0cf;
  font-size: .78rem; color: var(--olive-deep); }
.entry-content .mcx-steps { margin: 0; padding: 0 0 0 1.15rem; display: grid; gap: .45rem; }
.entry-content .mcx-steps li { font-size: .87rem; line-height: 1.55; color: var(--olive); }
.entry-content .mcx-steps li::marker { color: var(--avocado); font-weight: 700; }
@media (max-width: 820px) {
  .entry-content .mcx-case { grid-template-columns: 1fr; width: auto; margin: 1.5rem 0; transform: none; }
  .entry-content .mcx-case__media { max-width: 260px; margin-inline: auto; }
}

/* --- section rule, to give the long read visible chapters ----------------- */
.entry-content .mcx-rule { width: min(var(--maxw), calc(100vw - 2.5rem)); margin: 2.6rem 0 2.2rem 50%;
  transform: translateX(-50%); border: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--line), transparent); }
@media (max-width: 820px) {
  .entry-content .mcx-rule { width: auto; margin: 2rem 0; transform: none; }
}

/* --- article header / body separation ------------------------------------ */
/* The title previously ran straight into the first content block with no
   boundary, so the page read as one undifferentiated column. A short brand rule
   is enough to mark "header ends here" without the weight of a full-width line. */
.single .article-hero::after { content: ""; display: block; width: 64px; height: 3px;
  margin: clamp(1.1rem, 2.5vw, 1.6rem) auto 0; border-radius: 2px;
  background: linear-gradient(90deg, var(--avocado), var(--lime)); }

/* Standfirst. Larger than body copy so the eye has an obvious entry point and
   the opening row carries some visual weight against a tall poster. */
.entry-content .mcx-lead { font-size: clamp(1.02rem, 1.7vw, 1.16rem); line-height: 1.62; color: var(--olive-deep); }

/* The opening row top-aligns. Centred, a short lead floated in the middle of a
   596px poster with dead space above AND below, which reads as a mistake rather
   than as deliberate space. */
/* Client asked for the opening text to sit more centred against the poster.
   Safe to centre now that the at-a-glance strip gives the column real height —
   centring a bare two-line lead was what made it look adrift earlier. */
.entry-content .mcx-split--intro { align-items: center; }

/* --- post navigation: the empty half gets a destination ------------------- */
.article-nav__item--all { justify-content: center; text-align: center; border-style: dashed;
  background: transparent; box-shadow: none; }
.article-nav__item--all .article-nav__txt { align-items: center; }
.article-nav__item--all .article-nav__title { color: var(--olive); }
@media (max-width: 640px) { .article-nav__item--all { display: none; } }

/* At-a-glance strip. Fills the space a short lead leaves beside a tall poster
   with something a reader actually wants — the shape of the piece — rather than
   padding it out with more prose. */
.entry-content .mcx-facts { display: flex; flex-wrap: wrap; gap: 0; margin: 1.5rem 0 0; padding: 0;
  list-style: none; border-top: 1px solid var(--line); }
.entry-content .mcx-facts li { flex: 1 1 auto; min-width: 92px; padding: .85rem 1rem .85rem 0; }
.entry-content .mcx-facts strong { display: block; font-family: var(--font-display); font-size: 1.6rem;
  line-height: 1; color: var(--avocado); font-weight: 600; }
.entry-content .mcx-facts span { display: block; margin-top: .2rem; font-size: .76rem; color: var(--olive-soft);
  white-space: nowrap; }

/* A category with one article: a single centred destination, rather than two
   identical cards or a jump into unrelated content. */
.article-nav--solo { grid-template-columns: minmax(0, 340px); justify-content: center; }
.article-nav--solo .article-nav__item--all { display: flex; }

/* --- v1 hero: the client's own collection poster, whole ------------------- */
/* A 2:3 poster cannot run full width — at 1240px it would stand 1,848px tall
   and push the article off screen. Constrained and centred it reads as a
   deliberate cover. */
.entry-content .mc-heroposter { max-width: min(520px, 100%); margin: 1.4rem auto 1.9rem;
  border-radius: var(--r-md); overflow: hidden; box-shadow: var(--shadow-md); background: var(--cream); }
.entry-content .mc-heroposter img { width: 100%; height: auto; display: block; border-radius: 0; }

/* mcx-facts 单行 — on a 350px column the long labels pushed the third item onto
   a second row, which broke the "one glance" idea the strip exists for. nowrap +
   flex-basis 0 forces three equal columns; the labels wrap inside their own
   column instead of the row wrapping. */
@media (max-width: 560px) {
  .entry-content .mcx-facts { flex-wrap: nowrap; gap: .55rem; }
  .entry-content .mcx-facts li { flex: 1 1 0; min-width: 0; padding: .75rem 0; }
  .entry-content .mcx-facts strong { font-size: 1.34rem; }
  .entry-content .mcx-facts span { font-size: .68rem; line-height: 1.3; }
}

/* ===== /segments/ — filter chips + card badges =============================
   Badged dishes sort to the front of the grid, so the badge has to read as a
   property of the card rather than an overlay stuck on top of the photo: it
   sits in the padding gutter, above the image box, not over the product. */
.seg-filter {
  display: flex; flex-wrap: wrap; justify-content: center; align-items: center;
  gap: .5rem; margin-top: clamp(1.4rem, 2.6vw, 2rem);
}
.seg-filter__chip {
  display: inline-flex; align-items: center; gap: .5rem;
  padding: .5rem 1rem; border-radius: var(--r-pill);
  background: var(--cream-2); border: 1px solid var(--line-soft);
  font-family: var(--font-display); font-weight: 500; font-size: .88rem;
  color: var(--olive-ink); cursor: pointer;
  transition: background .25s var(--ease), border-color .25s var(--ease), color .25s var(--ease);
}
.seg-filter__chip:hover { border-color: var(--avocado); color: var(--olive-deep); }
.seg-filter__chip.is-active { background: var(--avocado); border-color: var(--avocado); color: var(--cream); }
.seg-filter__n {
  font-family: var(--font-body); font-size: .7rem; font-weight: 700; line-height: 1;
  padding: .22rem .45rem; border-radius: var(--r-pill);
  background: rgba(102,110,19,.1); color: var(--olive);
  transition: background .25s var(--ease), color .25s var(--ease);
}
.seg-filter__chip.is-active .seg-filter__n { background: rgba(255,255,255,.22); color: var(--cream); }
/* the lime pip marks "just added" without needing a second colour word */
.seg-filter__chip--new::before {
  content: ""; width: 7px; height: 7px; border-radius: 50%;
  background: var(--lime-bright, var(--lime)); flex: 0 0 auto;
}
.seg-filter__chip--new.is-active::before { background: var(--cream); }

.seg-card { position: relative; }
.seg-card__badge {
  position: absolute; top: .6rem; left: .6rem; z-index: 2;
  padding: .2rem .55rem; border-radius: var(--r-pill);
  font-family: var(--font-body); font-size: .64rem; font-weight: 800;
  letter-spacing: .08em; text-transform: uppercase; line-height: 1.5;
  background: var(--avocado); color: var(--cream);
  box-shadow: 0 2px 8px rgba(20,22,4,.18);
}
/* New is the loud one — brand lime on dark ink, the only high-contrast pair
   in the palette that survives against the cream card. */
.seg-card__badge--new { background: var(--lime-bright, var(--lime)); color: var(--olive-deep); }
.seg-card__badge--hot { background: #B4471F; color: #FFF6EC; }

@media (max-width: 640px) {
  .seg-filter { gap: .4rem; }
  .seg-filter__chip { padding: .42rem .75rem; font-size: .8rem; }
  .seg-card__badge { top: .45rem; left: .45rem; font-size: .58rem; padding: .16rem .45rem; }
}
@media (prefers-reduced-motion: reduce) {
  .seg-filter__chip { transition: none; }
}

/* ===== /segments/ — "just added" shelf ====================================
   Deliberately subordinate to the gallery below it: no panel, no headline,
   just a labelled row of smaller cards under the filter chips. Five across
   against the grid's three is what makes it read as secondary — if the cards
   matched the grid it would look like the first row of the gallery, which is
   the exact confusion this is meant to avoid. */
.newdrop {
  margin-top: clamp(1.1rem, 2.2vw, 1.6rem);
  padding-bottom: clamp(1.1rem, 2.2vw, 1.6rem);
  border-bottom: 1px solid var(--line-soft);
}
.newdrop__bar {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; margin-bottom: .8rem;
}
.newdrop__label {
  display: inline-flex; align-items: center; gap: .5rem;
  font-family: var(--font-body); font-size: .7rem; font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase; color: var(--olive);
}
.newdrop__label::before {
  content: ""; width: 7px; height: 7px; border-radius: 50%;
  background: var(--lime-bright, var(--lime)); flex: 0 0 auto;
}
.newdrop__nav { display: flex; gap: .35rem; flex: 0 0 auto; }
.newdrop__arrow {
  width: 32px; height: 32px; display: grid; place-items: center;
  border-radius: 50%; border: 1px solid var(--line-soft);
  background: transparent; color: var(--olive); cursor: pointer;
  transition: background .25s var(--ease), color .25s var(--ease), border-color .25s var(--ease);
}
.newdrop__arrow:hover { background: var(--avocado); border-color: var(--avocado); color: var(--cream); }
.newdrop__arrow svg { width: 15px; height: 15px; }

/* Native scroller: swipe, keyboard and the scrollbar all work without JS. */
.newdrop__viewport {
  overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x mandatory; scroll-behavior: smooth;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none; -ms-overflow-style: none;
  padding-bottom: .2rem;
}
.newdrop__viewport::-webkit-scrollbar { display: none; }
.newdrop__viewport:focus-visible { outline: 2px solid var(--avocado); outline-offset: 3px; border-radius: var(--r-md); }
.newdrop__track { display: flex; gap: .75rem; list-style: none; margin: 0; padding: 0; }
.newdrop__item { flex: 0 0 calc((100% - 4 * .75rem) / 5); min-width: 0; scroll-snap-align: start; }
.newdrop__item > .seg-card { width: 100%; height: 100%; padding: .6rem .6rem .7rem; }
.newdrop__item .seg-card__name { font-size: .82rem; margin-top: .4rem; }
.newdrop__item .seg-card__badge { top: .4rem; left: .4rem; font-size: .56rem; padding: .14rem .42rem; }

@media (max-width: 1024px) { .newdrop__item { flex-basis: calc((100% - 3 * .75rem) / 4); } }
@media (max-width: 760px) {
  /* the sliver of a further card is what tells a thumb there is more to the right */
  .newdrop__item { flex-basis: calc((100% - 1.6 * .75rem) / 2.6); }
  .newdrop__item .seg-card__name { font-size: .76rem; }
}
@media (prefers-reduced-motion: reduce) {
  .newdrop__viewport { scroll-behavior: auto; }
  .newdrop__arrow { transition: none; }
}

/* Cap card names at two lines.
   Measured on the just-added shelf: at phone width 7 of 10 names ran to three
   lines ("Chocolate Pistachio Ice Cream Mooncake" and friends), which pushed the
   cards taller than the art and made the row look ragged. Two lines is the cap
   everywhere — the grid never exceeds two today, so there it is a guard for
   future long names rather than a change.

   Visual truncation only: the full name stays in the DOM for screen readers,
   and it is spelled out in full in the recipe modal one tap away. */
.seg-card__name {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  overflow-wrap: anywhere;      /* never let one long word blow out the card */
  /* No min-height: cards already come out equal — the grid rows stretch by
     themselves and the shelf items are flex-stretched (measured height spread
     of 0). Reserving two lines here only padded every one-line name in the
     desktop grid with dead space. */
}

/* Scene-card "Pain points & solutions" pill — stop the label painting outside it.
   The rule combined `max-width: calc(100% - 2.1rem)` with `white-space: nowrap`:
   the box was capped but the text was forbidden to wrap, so at phone widths
   (card 167px, label needs ~180px) the words and the arrow rendered straight
   past the rounded background. Letting it use two lines keeps the label
   readable AND inside its own pill. */
@media (max-width: 760px) {
  .ind-card__pain {
    white-space: normal;
    text-align: left;
    line-height: 1.2;
    font-size: .68rem;
    padding: .42rem .62rem;
    max-width: calc(100% - 1.4rem);
    top: .7rem; right: .7rem;
  }
  .ind-card__pain svg { width: 12px; height: 12px; }
}

/* Floating segment tabs on /recipes/ — reuses .psel2-tabbar wholesale.

   On phones the five full labels need 536px against 325–395px of screen, so the
   bar wrapped to two rows: 72px tall, and a 999px radius on a two-row box reads
   as two big ovals rather than a pill. Below 760px it becomes a single-row
   horizontal scroller with the two long labels shortened, which claws back
   ~137px and keeps the pill a pill. */
.psel2-tab__short { display: none; }

@media (max-width: 760px) {
  .seg-tabbar {
    flex-wrap: nowrap;
    justify-content: flex-start;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
    scrollbar-width: none; -ms-overflow-style: none;
    max-width: calc(100% - 1.6rem);
    padding: .34rem .4rem;
  }
  .seg-tabbar::-webkit-scrollbar { display: none; }
  .seg-tabbar .psel2-tab {
    flex: 0 0 auto;
    scroll-snap-align: center;
    font-size: .84rem;
    padding: .48rem .85rem;
  }
  /* swap to the trimmed labels */
  .seg-tabbar .psel2-tab__full  { display: none; }
  .seg-tabbar .psel2-tab__short { display: inline; }
}

/* Mobile drawer accordion — make `hidden` actually hide.
   `.mobile-menu__panel { display:flex }` is an author rule (0,1,0); the hidden
   attribute only works through the UA sheet's `[hidden]{display:none}`, which
   loses. So the panel never collapsed and started life expanded, even though
   the markup ships `hidden`. The attribute selector (0,2,0) settles it. */
.mobile-menu__panel[hidden] { display: none; }

/* Drawer icons. The link is already flex with the caret on margin-left:auto,
   so the icon simply becomes the first child. Muted a shade below the label so
   it reads as a marker, not as competing content. */
.mobile-menu__icon {
  width: 21px; height: 21px; flex: 0 0 auto;
  color: var(--avocado); opacity: .85;
}
.mobile-nav .mobile-menu__link > span { flex: 1 1 auto; min-width: 0; }
.mobile-nav .mobile-menu__link:hover .mobile-menu__icon,
.mobile-nav .mobile-menu__link:focus-visible .mobile-menu__icon { opacity: 1; }
/* Line the sub-items up under the label, not under the icon. */
.mobile-menu__panel { padding-left: calc(21px + .5rem + .55rem); }
@media (prefers-reduced-motion: reduce) {
  .mobile-menu__icon { transition: none; }
}

/* ===== Recipe modal — living media panel + breathing room ==================
   The media panel was a flat #efeee4 slab with a cut-out product dropped on it.
   Now it carries a slow drift of the brand greens behind the product, and the
   product itself rises and settles. Both are deliberately near-subliminal: this
   is a product shot, and anything faster reads as a loading spinner. */

.app-modal__media { position: relative; overflow: hidden; background: var(--cream-2); }

/* Painted by a pseudo-element rather than animating background-position on the
   panel itself: transforms are composited, background-position is not, and this
   sits under a large photo on a modal that also scrolls. */
.app-modal__media::before {
  content: ""; position: absolute; inset: -25%; pointer-events: none;
  background:
    radial-gradient(38% 34% at 28% 26%, color-mix(in srgb, var(--lime) 58%, transparent), transparent 68%),
    radial-gradient(44% 38% at 74% 72%, color-mix(in srgb, var(--avocado) 24%, transparent), transparent 70%),
    radial-gradient(46% 40% at 62% 20%, color-mix(in srgb, var(--lime-bright, var(--lime)) 30%, transparent), transparent 72%);
  filter: blur(8px);
  will-change: transform;
}
/* The product must sit above the wash — the panel's img is a grid item with no
   stacking context, so an absolutely positioned ::before would otherwise cover it. */
.app-modal__media img,
.app-modal__play { position: relative; z-index: 1; }
.app-modal__play { z-index: 2; }

@media (prefers-reduced-motion: no-preference) {
  .app-modal[open] .app-modal__media::before { animation: nt-media-drift 24s ease-in-out infinite alternate; }
  .app-modal[open] .app-modal__img { animation: nt-media-float 7s ease-in-out infinite; }
}
@keyframes nt-media-drift {
  0%   { transform: translate3d(-2%, -1.5%, 0) scale(1.02); }
  50%  { transform: translate3d(2.5%,  2%,   0) scale(1.07); }
  100% { transform: translate3d(-1%,   2.5%, 0) scale(1.03); }
}
@keyframes nt-media-float {
  0%, 100% { transform: translate3d(0, 0, 0); }
  50%      { transform: translate3d(0, -11px, 0); }
}

/* The CTA row sat 29px off the bottom — the same as the side padding, but the
   modal's corner radius curves through exactly that band, so the pill's rounded
   end crowded the curve. Clear the radius instead of matching the sides. */
.app-modal__body { padding-bottom: clamp(2.2rem, 2.8vw, 2.8rem); }

/* Recipe modal — actually cap the grid so the body scrolls.
   `.app-modal__inner { max-height: 90vh }` only CLIPS: a grid row still sizes
   to its content, so with a long recipe (the mooncakes carry ingredients and
   method steps) the row grew to 1474px inside an 810px box. The body never
   entered a scrolling state, and the media column stretched with it — the
   product image centred inside 1474px, i.e. far below the visible 810px, which
   is why the panel showed a tall empty gradient with the product cut off.

   minmax(0, 1fr) gives the row a definite height it may shrink below content,
   which is what lets overflow-y:auto on the body take effect. */
@media (min-width: 641px) {
  .app-modal__inner { grid-template-rows: minmax(0, 1fr); }
  .app-modal__media { min-height: 0; }
}

/* ===== Field-note article figures ==========================================
   Trade-show posts up to now carried bare <img> tags with no captions. This
   handoff specifies a caption for every one of its seven photographs, so the
   figure needs a real treatment rather than an image with a stray line of text
   under it. */
.entry-content .fn-fig {
  margin: clamp(1.6rem, 3.2vw, 2.4rem) 0;
}
.entry-content .fn-fig img {
  display: block; width: 100%; height: auto;
  border-radius: var(--r-md);
  background: var(--cream-2);
}
.entry-content .fn-fig figcaption,
.entry-content .fn-note {
  margin-top: .7rem;
  padding-left: .9rem;
  border-left: 3px solid var(--lime-bright, var(--lime));
  font-size: .88rem; line-height: 1.5;
  color: var(--olive); font-style: normal;
}
/* A standalone note is not attached to a figure above it, so it needs the
   breathing room a figcaption gets from its own image. */
.entry-content .fn-note { margin-top: clamp(1.1rem, 2.4vw, 1.5rem); margin-bottom: clamp(1.1rem, 2.4vw, 1.5rem); }

/* Dateline under the headline.
   The top margin is not decoration: the kicker is the first thing in
   .entry-content, so the theme's `> * + *` rhythm rule never reaches it, and it
   was rendering flush against the hero's brand rule — measured gap 0px. It also
   cannot be hung off :first-child, because the desktop contents list is injected
   ahead of it (position:fixed, so it takes no space but is still the first DOM
   child). The gap is deliberately larger than the 25.6px above that rule: the
   rule closes the header, and the body should start clearly after it. */
.entry-content .fn-kicker {
  margin: clamp(1.5rem, 3.2vw, 2.2rem) 0 .4rem;
  font-family: var(--font-body);
  font-size: .7rem; font-weight: 800;
  letter-spacing: .16em; text-transform: uppercase;
  color: var(--avocado);
}

/* Closing call to action. */
/* The article's conversion close.
   It was cream-on-cream with a body-copy question and an underlined pill — the
   underline came from `.entry-content a` (0,1,1), which .btn never opted out of,
   so every in-article button was struck through. That is fixed globally below.
   The block now borrows the homepage's closing card: dark ground, lime action.
   After 900 words of cream the tone change is what makes it read as "the article
   has finished and here is the next step" rather than as one more paragraph. */
.entry-content .fn-cta {
  position: relative; overflow: hidden;
  margin-top: clamp(2rem, 4vw, 3rem);
  padding: clamp(1.5rem, 3vw, 2.1rem) clamp(1.4rem, 3vw, 2.1rem);
  background:
    radial-gradient(120% 140% at 100% 0%, rgba(231,234,107,.16), transparent 58%),
    linear-gradient(158deg, #3d4210 0%, #2b2f08 100%);
  border: 0;
  border-radius: var(--r-lg);
  box-shadow: 0 18px 40px rgba(20,22,4,.18);
}
/* The brand leaf, bled off the bottom-right corner, filled with a gradient that
   drifts.
   It is the same leaf-mark.png the masthead uses, applied as a MASK — so the
   shape is the logo and the paint behind it is free to be anything, including an
   animated gradient. A coloured <img> could not do this without shipping a second
   asset per colourway. The gradient is built only from the block's own palette
   (lime → avocado), so it reads as the card breathing rather than as a new colour
   arriving. */
.entry-content .fn-cta::after {
  content: ""; position: absolute; right: -2.4rem; bottom: -3.2rem;
  width: clamp(160px, 27%, 250px); aspect-ratio: 1;
  -webkit-mask: url("../images/leaf-mark.png") no-repeat center / contain;
          mask: url("../images/leaf-mark.png") no-repeat center / contain;
  background: linear-gradient(135deg,
    var(--lime) 0%, var(--avocado) 34%, var(--lime-bright) 58%, var(--avocado) 100%);
  /* Oversized so there is somewhere to travel: animating background-position on a
     100% gradient does nothing. */
  background-size: 280% 280%;
  animation: nt-cta-leaf 16s ease-in-out infinite;
  opacity: .2;
  pointer-events: none;
}
@keyframes nt-cta-leaf {
  0%, 100% { background-position: 0% 50%; }
  50%      { background-position: 100% 50%; }
}
@media (max-width: 640px) {
  /* Top-right, not bottom-right. On a phone the button goes full width and sits
     across the bottom of the card, so a leaf in that corner is three-quarters
     hidden behind it and reads as a stray shape. The heading's lines are short,
     which leaves the top-right genuinely open. */
  .entry-content .fn-cta::after {
    width: 132px; right: -2.1rem; top: -2.2rem; bottom: auto; opacity: .15;
  }
}
@media (prefers-reduced-motion: reduce) {
  .entry-content .fn-cta::after { animation: none; background-position: 30% 50%; }
}
.entry-content .fn-cta > * { position: relative; z-index: 1; }
.entry-content .fn-cta p { margin: 0; }
/* The question is the hook, so it gets the display face and room to breathe —
   at body size it read as a caption on its own button. */
.entry-content .fn-cta > p:first-child {
  font-family: var(--font-display); font-weight: 500;
  font-size: clamp(1.12rem, 1.1rem + .55vw, 1.42rem); line-height: 1.28;
  color: #fbfbf2; max-width: 30ch; text-wrap: balance;
}
.entry-content .fn-cta p + p { margin-top: clamp(1.1rem, 2.2vw, 1.45rem); }
.entry-content .fn-cta .btn { box-shadow: 0 10px 26px rgba(20,22,4,.3); }
.entry-content .fn-cta .btn:hover { box-shadow: 0 16px 34px rgba(20,22,4,.38); }

/* THE bug: .entry-content a (0,1,1) underlines every link in the body, and a
   button is a link. Buttons opt out here rather than each one fighting it. */
.entry-content .btn { text-decoration: none; color: var(--fg-btn); }
.entry-content .btn:hover { color: var(--fg-btn); }

/* "Previously / read the field note" lines between the two WOFEX posts.
   Navigation, not body copy — sized and coloured to sit below the article
   voice so it never reads as part of the approved text. */
.entry-content .fn-prev {
  margin: clamp(1.6rem, 3vw, 2.2rem) 0 0;
  padding-top: 1rem;
  border-top: 1px solid var(--line-soft);
  font-size: .88rem; color: var(--muted, var(--olive-soft));
}
.entry-content .fn-prev a { color: var(--olive-deep); text-decoration: underline; text-underline-offset: 3px; }
.entry-content .fn-prev a:hover { color: var(--avocado); }
/* The forward pointer sits at the top of the older post, so it needs a rule
   underneath rather than above. */
.entry-content .fn-next {
  margin: 0 0 clamp(1.4rem, 2.6vw, 2rem);
  padding: .85rem 1rem;
  border: 1px solid var(--line-soft); border-radius: var(--r-md);
  background: var(--cream-2);
}

/* ===== Article contents list (desktop only) ===============================
   Quiet by design. It lives inside .entry-content, so it inherits the article's
   link styling — `.entry-content a` (0,1,1) was beating `.toc__link` (0,1,0) and
   underlining every entry, which is what made the list shout. Every rule here is
   written at `.entry-content .toc…` so it actually wins.

   Position is derived from the article column, keeping a fixed 72px channel
   between the two. Below 1280px that channel cannot exist — at 1200px the list
   was overlapping the text by 26px — so it simply does not appear. */
.toc { display: none; }

@media (min-width: 1280px) {
  .entry-content .toc {
    display: block;
    position: fixed;
    z-index: 20;
    top: calc(var(--tb-h, 0px) + 9.5rem);
    /* article's left edge (50% - 380px) minus the list and a 72px channel */
    left: max(1.5rem, calc(50% - 380px - 200px - 72px));
    width: 200px;
    max-height: calc(100vh - 13rem);
    overflow-y: auto;
    scrollbar-width: none;
    margin: 0; padding: 0;
    transition: opacity .28s var(--ease), visibility .28s var(--ease);
  }
  .entry-content .toc::-webkit-scrollbar { display: none; }
  .entry-content .toc.is-off { opacity: 0; visibility: hidden; pointer-events: none; }

  .entry-content .toc__label {
    margin: 0 0 .55rem;
    font-family: var(--font-body);
    font-size: .6rem; font-weight: 700;
    letter-spacing: .18em; text-transform: uppercase;
    color: var(--olive-soft); opacity: .65;
  }
  .entry-content .toc__list {
    list-style: none; margin: 0; padding: 0 0 0 .8rem;
    border-left: 1px solid var(--line-soft);
    display: grid; gap: 0;
  }
  .entry-content .toc__item { margin: 0; }

  .entry-content .toc__link {
    position: relative; display: block;
    margin: 0; padding: .34rem 0;
    font-family: var(--font-body);
    font-size: .78rem; font-weight: 400; line-height: 1.35;
    color: var(--olive-soft);
    text-decoration: none;            /* beats .entry-content a */
    opacity: .72;
    transition: color .2s var(--ease), opacity .2s var(--ease);
  }
  .entry-content .toc__link:hover {
    color: var(--olive-deep); opacity: 1; text-decoration: none;
  }
  /* Read-so-far: a shade darker, nothing more. */
  .entry-content .toc__link.is-past { color: var(--olive); opacity: .8; }
  /* Where you are: the only element allowed any weight. */
  .entry-content .toc__link.is-active {
    color: var(--olive-deep); font-weight: 500; opacity: 1;
  }
  .entry-content .toc__link.is-active::before {
    content: ""; position: absolute;
    left: calc(-.8rem - 1px); top: .3rem; bottom: .3rem;
    width: 1px; background: var(--avocado);
  }

  /* Clicking an entry must not park the heading under the fixed header. */
  .entry-content h2 { scroll-margin-top: 9rem; }
}
@media (prefers-reduced-motion: reduce) {
  .entry-content .toc { transition: none; }
  .entry-content .toc__link { transition: none; }
}

/* ===== Mobile drawer: sub-item icons ======================================
   The parent rows carry icons; their children were plain text, which left the
   expanded panel looking like a hole in the list. Same 24-unit stroked set,
   sized down and dimmed so the hierarchy still reads parent > child. */
.mobile-menu__panel a {
  display: flex; align-items: center; gap: .55rem;
}
.mobile-menu__panel .mobile-menu__icon {
  width: 17px; height: 17px; flex: 0 0 auto;
  color: var(--avocado); opacity: .6;
}
.mobile-menu__panel a:hover .mobile-menu__icon { opacity: .9; }
/* the panel was indented to clear the parent icon; the children have their own
   now, so pull them back to align icon-with-icon */
.mobile-menu__panel { padding-left: 1.15rem; }

/* ===== Footer subscribe — compact on phones ===============================
   Measured at 390px: the block ran 241px of a 1281px footer, because an
   existing mobile rule broke the form into two stacked full-width elements
   (input 57px + button 55px + gap).

   Overriding flex-direction alone was not enough — that rule also sets
   `width:100%` on BOTH children, so with the row restored the button claimed
   the full line and squeezed the field down to its padding. Width has to be
   released as well as direction.

   The fix restores the desktop treatment: one pill holding the field and the
   button, which is both smaller and more consistent than a phone-only layout. */
@media (max-width: 760px) {
  .footer-sub h4 { font-size: 1rem; margin-bottom: .3rem; }
  .footer-sub > p { font-size: .82rem; line-height: 1.45; margin: 0 0 .7rem; }

  .footer-sub .sub-form {
    flex-direction: row; align-items: center; gap: .35rem;
    background: rgba(255,255,255,.06);
    padding: .3rem; border-radius: var(--r-pill);
  }
  .footer-sub .sub-form:focus-within { box-shadow: inset 0 0 0 2px var(--lime); }

  .footer-sub .sub-form input[type="email"] {
    flex: 1 1 0; width: auto; min-width: 0;
    height: 42px; padding: 0 .5rem 0 2.1rem;
    font-size: .86rem;
    background-color: transparent; border: 0; border-radius: 0; box-shadow: none;
    /* mail glyph inside the field: no extra markup, and it can never wrap away
       from the input it labels */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23E7EA6B' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round' opacity='.7'%3E%3Crect x='3' y='5.5' width='18' height='13' rx='2'/%3E%3Cpath d='m3.6 6.6 8.4 6 8.4-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: .7rem center;
    background-size: 16px 16px;
  }
  .footer-sub .sub-form input[type="email"]:focus-visible {
    outline: none; border-color: transparent; box-shadow: none;
  }
  .footer-sub .sub-form button,
  .footer-sub .sub-form [type="submit"] {
    flex: 0 0 auto; width: auto;
    height: 42px; padding: 0 1rem;
    font-size: .86rem; white-space: nowrap;
  }
  .footer-sub .nutoast-form-msg:empty { display: none; }
}

/* The floating stack lifts to clear the newsletter form — see inc/fab-dodge.php.
   Transform rather than `bottom`, so the move is composited and cannot reflow
   the footer underneath it. */
.nutoast-fab {
  transform: translateY(calc(-1 * var(--fab-lift, 0px)));
  transition: transform .25s var(--ease);
}
@media (prefers-reduced-motion: reduce) {
  .nutoast-fab { transition: none; }
}

/* Route from a trade-show record to its write-up. The link was missing entirely,
   which left these pages with no onward path for a reader or a crawler. */
.ts-read { font-size: .92rem; color: var(--olive); margin: 0; }
.ts-read a { color: var(--olive-deep); text-decoration: underline; text-underline-offset: 3px; }
.ts-read a:hover { color: var(--avocado); }

/* ===== /news/ category tabs — icons, and an aligned row on phones ==========
   At 390px each tab gets ~112px. "Seminars & Conferences" wrapped to two lines
   there while the other two stayed on one, so its count badge sat 8px lower
   than its neighbours — three tabs that never lined up.

   Fix is structural, not a nudge: every tab becomes the same three stacked
   parts (icon / label / count), and the long label is shortened on phones so
   all three labels occupy exactly one line. */
.news-tab__short { display: none; }
.news-tab__ic {
  width: 18px; height: 18px; flex: 0 0 auto;
  color: var(--olive-soft); opacity: .7;
  transition: color .2s var(--ease), opacity .2s var(--ease);
}
.news-tab:hover .news-tab__ic { opacity: 1; }
.news-tab.is-active .news-tab__ic { color: var(--avocado); opacity: 1; }

@media (max-width: 760px) {
  .news-tabs__bar { gap: .1rem; }
  .news-tab {
    flex: 1 1 0; min-width: 0;
    display: flex; flex-direction: column; align-items: center; justify-content: flex-start;
    gap: .3rem; padding: .7rem .3rem .8rem;
    font-size: .84rem; line-height: 1.2; text-align: center;
  }
  .news-tab__full  { display: none; }
  .news-tab__short { display: inline; white-space: nowrap; }
  .news-tab__count { margin: 0; }
}

/* ===== Article CTA — an icon, and a full-width tap target on phones ========
   The mark is drawn in CSS rather than added to the post body: the block lives
   inside client-approved article content, and this way every future article
   using the pattern picks it up without an edit. */
.fn-cta .btn::before {
  content: ""; width: 18px; height: 18px; flex: 0 0 auto;
  margin-right: .1rem;
  background-color: currentColor;
  -webkit-mask: var(--nt-chat) center / contain no-repeat;
          mask: var(--nt-chat) center / contain no-repeat;
}
:root {
  --nt-chat: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.4 12.3c0 3.9-3.8 7-8.4 7a9.6 9.6 0 0 1-2.6-.35L4.8 20.4l1.2-3.5A6.6 6.6 0 0 1 3.6 12.3c0-3.9 3.8-7 8.4-7s8.4 3.1 8.4 7Z'/%3E%3C/svg%3E");
}
@media (max-width: 760px) {
  .entry-content .fn-cta > p:first-child { font-size: 1.12rem; line-height: 1.3; max-width: none; }
  /* The label is a full sentence, so on a phone it wraps. Left-aligned with the
     glyph held at the top line, a two-line button still reads as a button;
     centred, the second line floats and it reads as broken text. */
  .entry-content .fn-cta .btn {
    width: 100%; justify-content: flex-start; align-items: flex-start;
    padding: .9rem 1.05rem; line-height: 1.35; text-align: left;
  }
  .entry-content .fn-cta .btn::before { margin-top: .12rem; }
}

/* ============================ New & Latest markers =========================
   One badge shape for the whole site. The geometry deliberately matches
   .seg-card__badge (which the recipe gallery already uses and the client has
   signed off): a second badge with different metrics would read as a second,
   unrelated system rather than the same signal in a new place. */
.nt-badge {
  position: absolute; top: .7rem; left: .7rem; z-index: 3;
  padding: .2rem .55rem; border-radius: var(--r-pill);
  font-family: var(--font-body); font-size: .64rem; font-weight: 800;
  letter-spacing: .08em; text-transform: uppercase; line-height: 1.5;
  background: var(--lime-bright, var(--lime)); color: var(--olive-deep);
  box-shadow: 0 2px 8px rgba(20,22,4,.18);
  pointer-events: none;   /* never intercepts the click on the card behind it */
}
/* Latest is the rarer, quieter one — exactly one article ever carries it, so it
   reads as a label rather than a promotion. */
.nt-badge--latest { background: var(--avocado); color: var(--cream); }

/* The nav marker: the same word as the card badge, shrunk into a bubble that
   perches on the top-right corner of whatever it marks. Appears only when the
   count is non-zero, so a quiet week leaves the masthead untouched. */
.nt-flag {
  display: inline-block; flex: 0 0 auto;
  padding: .1rem .36rem;
  border-radius: var(--r-pill);
  font-family: var(--font-body); font-size: .56rem; font-weight: 800;
  letter-spacing: .09em; text-transform: uppercase; line-height: 1.55;
  background: var(--lime-bright, var(--lime)); color: var(--olive-deep);
  /* A hairline ring in the surface colour lifts the bubble off whatever it
     overlaps — the same trick a notification badge uses on an app icon. */
  box-shadow: 0 0 0 2px var(--cream), 0 2px 6px rgba(20,22,4,.22);
  white-space: nowrap; pointer-events: none;
}
/* Over the dark hero the header is transparent, so the ring must be dark too or
   it prints a cream halo on the photograph. */
.dark-hero .site-header:not(.scrolled) .nt-flag { box-shadow: 0 2px 6px rgba(20,22,4,.35); }

/* Corner bubble — masthead nav. The extra right margin on the item is what keeps
   the bubble from landing on the next menu word; without it "Products" would
   push its badge over "Recipes". */
.nav-menu > li { position: relative; }
.nav-menu > li.has-new { margin-right: 1.5rem; }
/* Raised clear of the cap height, not merely nudged: at top:-1px the bubble's
   lower edge still crossed the word's own box by ~4px and clipped the "s". */
.nav-menu > li.has-new > a .nt-flag { position: absolute; top: -.42rem; right: -1.25rem; }

/* Corner bubble — news category tabs. On wide screens the tab is one horizontal
   row and its right end is already the count pill, so the bubble perches just
   above the tab's edge instead of sitting inside it. */
.news-tab.has-new .nt-flag { position: absolute; top: -.5rem; right: .35rem; }

/* The drawer is a full-width list, not a compact chip: a bubble pinned to the
   row's far corner would float in empty space away from the word. There the
   marker stays beside the label, raised to the same top-right position relative
   to the text itself. */
.mobile-menu__link .nt-flag,
.mobile-menu__panel a .nt-flag { margin-left: .38rem; vertical-align: .34em; box-shadow: 0 1px 4px rgba(20,22,4,.18); }
@media (prefers-reduced-motion: no-preference) {
  .nt-flag { animation: nt-flag-in .45s var(--ease-out, ease) both; }
  @keyframes nt-flag-in { from { transform: scale(.7); opacity: 0; } to { transform: scale(1); opacity: 1; } }
}

/* Inline count on a category card/tile — lands in the slot that already holds
   the product number, so nothing is added to the card's shape. */
.nt-inline { color: var(--avocado); font-weight: 800; }
.nav-mega__card.has-new .nt-inline { color: var(--olive-deep); }
/* The /products/ form tiles put that line over a dark photo, where avocado on
   dark green disappears — follow the count's own lime instead. */
.pcat-nav__card .nt-inline { color: var(--lime-bright, var(--lime)); }

/* News cards: the card is position:relative already; the badge overlays the
   photo's top-left corner. */
.news-card .nt-badge { top: .8rem; left: .8rem; }
/* On phones the tab is a centred column — icon, label, count — which leaves its
   top-right corner genuinely empty, so the bubble can sit inside it. */
@media (max-width: 640px) {
  .news-tab.has-new .nt-flag { font-size: .5rem; padding: .07rem .28rem; top: .22rem; right: .22rem; }
}

/* Product cards. .psg-card2 had no positioning context of its own. */
.psg-card2 { position: relative; }
.psg-card2 .nt-badge { top: .75rem; left: .75rem; }
/* The rich card is inset: a 5px accent bar, then the photo sits in a 1rem
   frame. Anchoring to the card would float the badge on the cream margin, so it
   is offset onto the photo's own corner — same relationship every other card
   has between badge and image. */
.psg-card .nt-badge { top: 1.55rem; left: 1.5rem; }

@media (max-width: 640px) {
  .nt-badge { top: .5rem; left: .5rem; font-size: .58rem; padding: .16rem .45rem; }
  .news-card .nt-badge { top: .6rem; left: .6rem; }
}

/* ============================== Read counter ==============================
   A quiet sibling of the date in .post-meta — same size, same colour, no box.
   It is a footnote about the article, not a claim to be shouted. */
.pv {
  display: inline-flex; align-items: center; gap: .32rem;
  color: var(--olive-soft); white-space: nowrap;
  /* Tabular figures: the number is refreshed by JS after the beacon replies, and
     proportional digits would visibly re-flow the line when it changes. */
  font-variant-numeric: tabular-nums;
}
.pv__ic { width: 14px; height: 14px; flex: 0 0 auto; opacity: .65; }
.news-card .post-meta .pv { margin-left: auto; }   /* date left, reads right */
.article .post-meta .pv { color: var(--olive-soft); }
@media (max-width: 400px) {
  .pv__ic { width: 13px; height: 13px; }
}

/* ===================== Icons on the remaining buttons =====================
   The .btn family already lays its icon out (inline-flex + gap). These three
   are buttons that live outside it and had no icon slot at all. */

/* Footer subscribe — the label is wrapped so the icon does not inherit the
   nowrap/centring meant for the text. */
.sub-form button { display: inline-flex; align-items: center; justify-content: center; gap: .42rem; }
.sub-form button svg { width: 16px; height: 16px; flex: 0 0 auto; }

/* Cookie banner — small type, so the glyph is scaled down to match the label
   rather than the 18px the .btn family uses. */
.ck__btn { display: inline-flex; align-items: center; justify-content: center; gap: .38rem; }
.ck__btn svg { width: 14px; height: 14px; flex: 0 0 auto; }

/* "Open full invitation" is a fine-print link, not a button — the glyph rides
   with the text and must not be underlined along with it. */
.showmodal__fine a { display: inline-flex; align-items: center; gap: .32rem; text-decoration: none; }
.showmodal__fine a span, .showmodal__fine a { text-underline-offset: 3px; }
.showmodal__fine a svg { width: 13px; height: 13px; flex: 0 0 auto; }

/* The certificates toggle now leads with a shield and still trails with its own
   chevron; neither is the arrow, so neither slides. */
.cert-more__btn > svg:first-child { width: 17px; height: 17px; }

/* Add-to-inquiry carries two labels (.lbl / .ok) that CSS swaps on state, so the
   glyph lives outside both — it must not disappear when the button flips to
   "Added". */
.nutoast-add-inquiry { display: inline-flex; align-items: center; justify-content: center; gap: .45rem; }
.nutoast-add-inquiry > svg { width: 16px; height: 16px; flex: 0 0 auto; }

/* ======================= In-article photo carousel =======================
   Six frames in the height of one. The track is a scroll-snap row, so swipe and
   trackpad work without JS having to own the gesture; the script only keeps the
   arrows, dots and counter in step with wherever the scroller ended up. */
.ncar { position: relative; margin: clamp(1.6rem, 3vw, 2.4rem) 0; }
.ncar__viewport {
  display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
  border-radius: var(--r-lg); background: var(--sand);
  scrollbar-width: none; -ms-overflow-style: none;
}
.ncar__viewport::-webkit-scrollbar { display: none; }
.ncar__viewport:focus-visible { outline: 2px solid var(--avocado); outline-offset: 3px; }
.ncar__slide { flex: 0 0 100%; scroll-snap-align: start; margin: 0; }
/* One fixed frame for slides of different shapes — five are 16:9 and the booth
   photograph is portrait. Letterboxing the odd one out would leave a third of
   the carousel empty on every visit, so the frame crops and each slide carries
   its own focal point instead. */
.ncar__slide img {
  display: block; width: 100%; aspect-ratio: 16 / 10;
  object-fit: cover; object-position: var(--pos, 50% 50%);
}
/* --pos is set per slide in the article markup. On object-fit:cover a LARGER Y
   moves the window DOWN the source image, so the portrait booth frame uses a
   high value to drop the hall ceiling out of shot and start at the C-39 sign. */
.ncar__bar {
  display: flex; align-items: center; gap: .7rem;
  margin-top: .7rem;
}
.ncar__nav {
  width: 34px; height: 34px; flex: 0 0 auto; display: inline-flex;
  align-items: center; justify-content: center;
  border-radius: 50%; border: 1px solid var(--line); background: var(--cream);
  color: var(--olive-deep); cursor: pointer;
  transition: background .25s var(--ease), border-color .25s var(--ease), color .25s var(--ease), opacity .25s var(--ease);
}
.ncar__nav:hover:not(:disabled) { background: var(--avocado); border-color: var(--avocado); color: var(--cream); }
.ncar__nav:disabled { opacity: .32; cursor: default; }
.ncar__nav svg { width: 16px; height: 16px; }
.ncar__dots { display: flex; gap: .34rem; margin-left: auto; }
.ncar__dot {
  width: 7px; height: 7px; padding: 0; border: 0; border-radius: 50%;
  background: var(--line); cursor: pointer; transition: background .25s var(--ease), transform .25s var(--ease);
}
.ncar__dot.is-active { background: var(--avocado); transform: scale(1.25); }
.ncar__count { font-size: .78rem; color: var(--olive-soft); font-variant-numeric: tabular-nums; }
@media (max-width: 560px) {
  .ncar__slide img { aspect-ratio: 4 / 3; }
  .ncar__dots { display: none; }        /* six dots at 390px are smaller than a fingertip */
}

/* ===================== In-article product / recipe cards =================
   The reason these exist is to connect a paragraph about an application to the
   things that actually make it — so they are links, never decoration. */
.ncards { display: grid; gap: .8rem; margin: 1.2rem 0 .4rem; }
.ncards--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.ncards--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 620px) { .ncards--2, .ncards--3 { grid-template-columns: 1fr; } }

.entry-content .ncard {
  display: flex; align-items: center; gap: .85rem; padding: .55rem .9rem .55rem .55rem;
  background: var(--cream); border: 1px solid var(--line-soft); border-radius: var(--r-md);
  text-decoration: none; color: inherit; text-align: left; width: 100%; cursor: pointer;
  font: inherit; -webkit-appearance: none; appearance: none;
  transition: transform .3s var(--ease), border-color .3s var(--ease), box-shadow .3s var(--ease);
}
.entry-content .ncard:hover { transform: translateY(-2px); border-color: var(--avocado); box-shadow: var(--shadow-sm); }
.ncard__media {
  flex: 0 0 auto; width: 62px; height: 62px; border-radius: 10px; overflow: hidden;
  background: var(--sand);
}
.ncard__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ncard__body { min-width: 0; }
.ncard__kicker {
  display: block; font-size: .6rem; font-weight: 800; letter-spacing: .13em;
  text-transform: uppercase; color: var(--avocado); margin-bottom: .16rem;
}
.entry-content .ncard__name {
  display: block; font-family: var(--font-display); font-weight: 500;
  font-size: 1rem; line-height: 1.2; color: var(--olive-deep);
}
.ncard__go { margin-left: auto; flex: 0 0 auto; color: var(--olive-soft); display: inline-flex; }
.ncard__go svg { width: 16px; height: 16px; transition: transform .3s var(--ease); }
.entry-content .ncard:hover .ncard__go svg { transform: translateX(3px); }

/* The label above each pair — small, so it reads as a caption on the paragraph
   above rather than as another heading competing with the H3. */
.ncards-lbl {
  display: block; margin: 1.3rem 0 -.2rem; font-family: var(--font-body);
  font-size: .68rem; font-weight: 800; letter-spacing: .13em; text-transform: uppercase;
  color: var(--olive-soft);
}

/* ===================== Country on trade-show articles ====================
   Only the Trade Shows column carries a venue, so this markup only ever renders
   there. The flag reuses the bundled .flag <img> the trade-show pages already
   use — one flag asset set, one look. */
.ctry { display: inline-flex; align-items: center; gap: .38rem; }
.ctry .flag { width: 1.15em; height: auto; flex: none; border-radius: 2px; box-shadow: 0 0 0 1px rgba(33,37,10,.16); }
.ctry__n { font-size: .74rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--olive); }

/* On a card it sits between the date line and the headline, so it needs to read
   as metadata — not as a second, competing kicker. */
.news-card .ctry--card { margin: .5rem 0 -.1rem; }

/* The filter row. Chips, not a <select>: with six or seven countries the whole
   set fits on one line and a reader can see the spread of shows at a glance,
   which a collapsed dropdown hides. */
.ctry-filter {
  display: flex; flex-wrap: wrap; gap: .45rem;
  margin: 0 0 clamp(1.2rem, 2.4vw, 1.7rem);
}
.ctry-chip {
  display: inline-flex; align-items: center; gap: .42rem;
  padding: .42rem .75rem; border-radius: var(--r-pill);
  background: var(--cream); border: 1px solid var(--line-soft);
  font-family: var(--font-body); font-size: .78rem; font-weight: 600; line-height: 1;
  color: var(--olive); cursor: pointer;
  transition: background .25s var(--ease), border-color .25s var(--ease), color .25s var(--ease);
}
.ctry-chip:hover { border-color: var(--avocado); }
.ctry-chip__n {
  font-size: .68rem; font-weight: 800; color: var(--olive-soft);
  font-variant-numeric: tabular-nums;
}
.ctry-chip.is-active { background: var(--avocado); border-color: var(--avocado); color: var(--cream); }
/* The chip's own label is the .ctry markup, which carries its own colour — it has
   to invert with the chip or it stays olive on olive. */
.ctry-chip.is-active .ctry__n,
.ctry-chip.is-active .ctry-chip__n { color: var(--cream); }
.ctry-chip.is-active .flag { box-shadow: 0 0 0 1px rgba(255,255,255,.5); }
.ctry-chip:focus-visible { outline: 2px solid var(--olive); outline-offset: 2px; }

.ctry-empty { margin: 0 0 1.4rem; color: var(--muted); font-size: .92rem; }

/* Without this the market filter does nothing visible.
   The JS sets the `hidden` attribute, but `.supply-card { display: flex }`
   (0,1,0) outranks the UA sheet's `[hidden] { display: none }` — author styles
   beat user-agent styles, so every "hidden" card stayed on screen at
   display:flex. Same specificity trap as the mobile menu accordion. Scoped
   selector rather than !important: (0,3,0) is enough to win. */
.news-grid .news-card[hidden] { display: none; }

@media (max-width: 560px) {
  /* One scrolling row rather than four stacked lines of chips — the grid below
     is what the reader came for and should not be pushed off screen. */
  .ctry-filter {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    margin-inline: -1.25rem; padding-inline: 1.25rem;
    scroll-snap-type: x proximity;
  }
  .ctry-filter::-webkit-scrollbar { display: none; }
  .ctry-chip { flex: 0 0 auto; scroll-snap-align: start; }
}

/* ============================ Article sharing ============================
   Plain links, so they get the site's own button language rather than each
   network's brand colour — a row of red/blue/green chips would be the loudest
   thing on a page that has just spent 900 words being quiet. Brand identity is
   carried by the glyph alone. */
.share {
  display: flex; flex-wrap: wrap; align-items: center; gap: .55rem .7rem;
  margin: clamp(2rem, 4vw, 2.8rem) 0 0;
  padding-top: clamp(1.2rem, 2.4vw, 1.6rem);
  border-top: 1px solid var(--line-soft);
}
.share__label {
  font-family: var(--font-body); font-size: .68rem; font-weight: 800;
  letter-spacing: .13em; text-transform: uppercase; color: var(--olive-soft);
  margin-right: .3rem;
}
.share__row { display: flex; flex-wrap: wrap; gap: .45rem; }
.share__btn {
  display: inline-flex; align-items: center; gap: .4rem;
  padding: .48rem .8rem; border-radius: var(--r-pill);
  background: var(--cream); border: 1px solid var(--line-soft);
  font-family: var(--font-body); font-size: .8rem; font-weight: 600; line-height: 1;
  color: var(--olive); text-decoration: none; cursor: pointer;
  transition: background .25s var(--ease), border-color .25s var(--ease), color .25s var(--ease), transform .25s var(--ease);
}
.share__btn:hover { background: var(--avocado); border-color: var(--avocado); color: var(--cream); transform: translateY(-1px); }
.share__btn svg { width: 15px; height: 15px; flex: 0 0 auto; }
.share__btn:focus-visible { outline: 2px solid var(--olive); outline-offset: 2px; }
/* The native sheet is the best option where it exists, so it leads and is the
   only filled button in the row. */
.share__btn--native { background: var(--avocado); border-color: var(--avocado); color: var(--cream); }
.share__btn--native:hover { background: var(--olive-deep); border-color: var(--olive-deep); }
.share__btn--copy.is-done { background: var(--lime); border-color: var(--lime); color: var(--olive-ink); }
/* The confirmation ("Link copied") is taken OUT of the flow. As a full-width flex
   line with a min-height it reserved ~22px under the buttons on every page view
   for a message that is shown for two seconds after a click — dead space the rest
   of the time. Absolute means no reserved row and no reflow when it appears. */
.share__done {
  position: absolute; right: 0;
  /* Aligned with the label, not under the buttons: now that the gap below is
     tightened the confirmation landed on the divider rule. It shares the label's
     line — same clamp as the block's padding-top, so the two cannot drift apart. */
  top: clamp(1.2rem, 2.4vw, 1.6rem);
  font-size: .76rem; line-height: 1.2; color: var(--avocado); pointer-events: none;
}

/* .entry-content underlines every link (0,1,1) and these are links. */
.entry-content .share__btn,
.share__btn { text-decoration: none; }

@media (max-width: 560px) {
  .share { gap: .5rem; }
  .share__label { flex-basis: 100%; margin-right: 0; }
  /* One scrolling row rather than two ragged lines of chips. */
  .share__row {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    margin-inline: -1.25rem; padding-inline: 1.25rem;
  }
  .share__row::-webkit-scrollbar { display: none; }
  .share__btn { flex: 0 0 auto; }
}
@media (prefers-reduced-motion: reduce) { .share__btn:hover { transform: none; } }

/* The onward-links block was spaced for following the article body directly. With
   the share row in between there are two rules and two large gaps in a row, which
   read as the page having ended twice. Tightened only where it follows sharing —
   every other use of .article-nav keeps its original rhythm. */
.share + .article-nav {
  margin-top: clamp(1.3rem, 2.6vw, 1.9rem);
  padding-top: clamp(1.3rem, 2.6vw, 1.9rem);
}

/* WeChat QR popover — anchored to the share row, not a full-screen modal: it is
   a small aside, and covering the article to show it would be out of proportion
   to what is being asked for. */
.share { position: relative; }
.share__qr {
  position: absolute; z-index: 5; left: 0; top: calc(100% + .6rem);
  display: inline-flex; flex-direction: column; align-items: center; gap: .5rem;
  padding: 1rem 1rem .85rem; border-radius: var(--r-md);
  background: var(--cream); border: 1px solid var(--line);
  box-shadow: var(--shadow-md);
}
.share__qr[hidden] { display: none; }
.share__qr canvas { display: block; border-radius: 6px; }
.share__qr-hint { margin: 0; max-width: 17rem; text-align: center; font-size: .76rem; line-height: 1.4; color: var(--olive-soft); }
.share__qr-x {
  position: absolute; top: .3rem; right: .45rem;
  width: 24px; height: 24px; padding: 0; line-height: 1;
  background: none; border: 0; border-radius: 50%;
  font-size: 1.2rem; color: var(--olive-soft); cursor: pointer;
}
.share__qr-x:hover { background: var(--cream-2); color: var(--olive-deep); }
@media (max-width: 560px) {
  /* Centred on a phone: anchored left it would hang off the edge of a 350px card. */
  .share__qr { left: 50%; transform: translateX(-50%); }
}

/* ============================================================== FIELD DATA ===
   Blocks for a data-led field note. A show write-up that carries a visitor
   profile is a different animal from a narrative one: it has to publish counts,
   rankings and a forward schedule without turning the page into a slide deck.

   Three components, deliberately weighted differently so the article keeps a
   reading rhythm rather than becoming a wall of widgets:

     .nt-figs   pale olive card, same ground as .nt-stat  — the headline counts
     .nt-rank   open on the page, hairline rules only     — the rankings
     .nt-sched  cream card with an olive rail             — what comes next

   .nt-rank is deliberately the LIGHTEST of the three. Bars are already the
   loudest shape on a page of prose; putting them on a card as well would make
   the rankings shout over the figures, which are the actual news.
   The single dark moment in an article stays .fn-cta, so the schedule is light —
   two dark blocks back to back read as one long footer.
   ------------------------------------------------------------------------- */

/* --- figure strip ---------------------------------------------------------
   Three or four counts that belong to one measurement. Reuses .nt-stat__n for
   the number so the count-up in inc/article-blocks.php picks it up with no new
   selector, and .nt-stat__src for the provenance line. */
.entry-content .nt-figs,
.nt-figs {
  display: grid; grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr));
  gap: .6rem; margin: 1.6rem 0; padding: 1.1rem 1.15rem;
  border-radius: var(--r-md);
  background: linear-gradient(135deg, #eef0d8, #e4e6c6);
  border: 1px solid var(--line-soft);
}
.entry-content .nt-figs--4,
.nt-figs--4 { --cols: 4; }
/* Each figure is its own raised panel rather than a slice of one flat sheet.
   Hairline dividers put every tier on the same plane, so the eye had nothing to
   rank: number, label and provenance all read at once. A lighter inset ground
   lifts the figures off the card and lets the label drop a tier without
   shrinking it into illegibility. */
.nt-figs__cell {
  min-width: 0; padding: .85rem .95rem .9rem;
  background: rgba(255,255,255,.52);
  border: 1px solid rgba(102,110,19,.10);
  border-radius: calc(var(--r-md) - 6px);
}
.entry-content .nt-figs .nt-stat__n,
.nt-figs .nt-stat__n {
  display: block; font-size: clamp(1.55rem, 4.2vw, 2.1rem); line-height: 1.05;
  font-family: var(--font-display); font-weight: 600; color: var(--avocado);
  font-variant-numeric: tabular-nums;
}
.entry-content .nt-figs .nt-stat__n i,
.nt-figs .nt-stat__n i { font-size: .5em; }
.nt-figs__lbl {
  display: block; margin-top: .38rem;
  font-family: var(--font-body); font-size: .735rem; line-height: 1.3;
  color: var(--olive-soft);
}
.entry-content .nt-figs .nt-stat__src,
.nt-figs .nt-stat__src {
  grid-column: 1 / -1; margin: .95rem 0 0; padding-top: .75rem;
  border-top: 1px solid rgba(102,110,19,.18);
}

/* --- ranked bars ----------------------------------------------------------
   Two shapes off one component:
     default       label | bar | value    — short labels that carry a count
     --stack       label over a full bar  — long labels, relative values only

   A bar with no printed number is intentional where the source published none.
   The relative charts here are indexed to their own leading category, so
   printing "85%" beside one would invite it to be read as a share of visitors,
   which is not what it measures. Length carries the ranking; the figures that
   ARE counts get printed. */
.entry-content .nt-rank {
  margin: 1.5rem 0;
  padding: 1.05rem 0 .9rem;
  border-top: 1px solid rgba(102,110,19,.22);
  border-bottom: 1px solid rgba(102,110,19,.12);
}
.nt-rank__k {
  display: block; margin-bottom: .85rem;
  font-family: var(--font-body); font-size: .64rem; font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase; color: var(--olive-soft);
}
.entry-content .nt-rank__list { list-style: none; margin: 0; padding: 0; display: grid; gap: .62rem; }
.entry-content .nt-rank__list > li { margin: 0; padding: 0; }
.entry-content .nt-rank__list > li::marker { content: none; }
.nt-rank__row {
  display: grid; grid-template-columns: minmax(6.5rem, auto) minmax(0, 1fr) auto;
  align-items: center; gap: .8rem;
}
.nt-rank__lbl {
  display: flex; align-items: center; gap: .48rem; min-width: 0;
  font-size: .86rem; line-height: 1.3; color: var(--olive-deep);
}
/* Flags are the one place a country row earns an image. 16px keeps it level
   with the cap height of the label instead of riding above it. */
.nt-rank__lbl img { flex: 0 0 auto; width: 18px; height: 13px; border-radius: 2px;
  object-fit: cover; box-shadow: 0 0 0 1px rgba(20,22,4,.12); }
.nt-rank__bar {
  position: relative; display: block; height: 9px; border-radius: var(--r-pill);
  background: rgba(102,110,19,.10); overflow: hidden;
}
.nt-rank__fill {
  position: absolute; inset: 0; transform-origin: left center;
  transform: scaleX(var(--v, 1));
  border-radius: var(--r-pill);
  background: linear-gradient(90deg, var(--avocado), #8b9422);
  transition: transform .95s cubic-bezier(.16, 1, .3, 1);
}
.nt-rank__v {
  font-family: var(--font-display); font-weight: 600; font-size: 1.02rem;
  color: var(--avocado); font-variant-numeric: tabular-nums;
  min-width: 1.9rem; text-align: right;
}
/* Stacked variant — the label needs the whole width, so the bar drops beneath. */
.nt-rank--stack .nt-rank__row { grid-template-columns: 1fr; gap: .3rem; }
.nt-rank--stack .nt-rank__lbl { font-size: .84rem; }
.entry-content .nt-rank--stack .nt-rank__list { gap: .78rem; }
.entry-content .nt-rank__src { margin: .85rem 0 0; font-size: .74rem; line-height: 1.45; color: var(--olive-soft); }

/* Two rankings that are read against each other sit side by side, the same
   argument .nt-stat--pair makes: the comparison IS the content. */
.entry-content .nt-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 1.1rem 2rem; margin: 1.5rem 0; }
.entry-content .nt-duo .nt-rank { margin: 0; }

/* --- schedule -------------------------------------------------------------
   Dates run down a rail so the eye can scan them as a sequence rather than
   re-reading each row's month. The rail is a pseudo-element on the list, not a
   border on each row, so it does not break between items. */
.entry-content .nt-sched {
  position: relative; list-style: none;
  margin: 1.5rem 0; padding: 1.25rem 1.35rem 1.15rem;
  border-radius: var(--r-md); background: var(--cream-2);
  border: 1px solid var(--line-soft);
  display: grid; gap: .2rem;
}
.entry-content .nt-sched > li { margin: 0; padding: .72rem 0; }
.entry-content .nt-sched > li::marker { content: none; }
.entry-content .nt-sched > li + li { border-top: 1px solid rgba(102,110,19,.13); }
/* The date column is a FIXED width, not auto. Each row is its own grid, so an
   auto column sizes to that row's own content and the dates would step in and
   out down the list — the one thing a schedule must not do. 8.2rem clears the
   longest string ("30 MAR–02 APR") with the nowrap below. */
.nt-sched__row { display: grid; grid-template-columns: 8.2rem minmax(0, 1fr) auto; align-items: center; gap: 1rem; }
.nt-sched__date {
  display: block; font-family: var(--font-body); line-height: 1.15;
  color: var(--avocado); font-variant-numeric: tabular-nums;
}
.nt-sched__date b { display: block; font-size: .88rem; font-weight: 800; letter-spacing: .01em; white-space: nowrap; }
.nt-sched__date i {
  display: block; margin-top: .12rem; font-style: normal;
  font-size: .62rem; font-weight: 700; letter-spacing: .11em;
  text-transform: uppercase; color: var(--olive-soft);
}
.nt-sched__name { display: block; font-family: var(--font-display); font-weight: 600; font-size: 1.02rem; line-height: 1.2; color: var(--olive-deep); }
.nt-sched__where { display: block; margin-top: .2rem; font-size: .78rem; line-height: 1.4; color: var(--olive-soft); }
.nt-sched__flag img { width: 22px; height: 16px; border-radius: 2px; object-fit: cover; box-shadow: 0 0 0 1px rgba(20,22,4,.12); display: block; }

@media (max-width: 640px) {
  /* Four figures across a phone gives each one about 70px — the labels wrap to
     four lines and the strip becomes taller than it is wide. Two-up instead,
     and the dividers have to move with them. */
  .entry-content .nt-figs,
  .nt-figs { grid-template-columns: 1fr 1fr; gap: .5rem; padding: .9rem .95rem; }
  .nt-figs__cell { padding: .7rem .8rem .75rem; }
  .entry-content .nt-figs .nt-stat__n,
  .nt-figs .nt-stat__n { font-size: 1.5rem; }
  .nt-figs__lbl { font-size: .72rem; }

  .nt-rank__row { grid-template-columns: minmax(5rem, auto) minmax(0, 1fr) auto; gap: .55rem; }
  .nt-rank__lbl { font-size: .8rem; }
  .nt-rank__v { font-size: .92rem; min-width: 1.6rem; }

  /* Side by side at 320px would be two 140px charts; stacked they stay readable
     and the second still reads as a comparison because the labels repeat. */
  .entry-content .nt-duo { grid-template-columns: 1fr; gap: .4rem; }

  .nt-sched__row { grid-template-columns: 1fr auto; gap: .35rem .8rem; }
  .nt-sched__date { grid-column: 1 / -1; display: flex; align-items: baseline; gap: .45rem; }
  .nt-sched__date i { margin-top: 0; }
  .nt-sched__name { font-size: .96rem; }
}

/* --- image-less show card ------------------------------------------------
   A show is added to the calendar long before there is a photo or an
   invitation poster for it, so a full grid of .show--ph is the normal state
   for the next season rather than an edge case. As a flat olive rectangle,
   four of them in a row read as four failed images.

   The leaf gets them out of that: it is the same mark and the same masked
   gradient as the article CTA (.fn-cta::after) and the masthead, so a card
   waiting for its photo still looks like a Nutoast card. Masked, not an <img>,
   because the paint behind a mask is free — the shape costs one PNG the site
   already ships and the colour comes from the tokens.

   Deliberately NOT animated. One drifting leaf closing an article is a moment;
   four drifting leaves in a grid is a screensaver, and this section sits above
   the fold on a short viewport. The angle steps per card instead, so the four
   read as a set rather than as one tile repeated.
   ---------------------------------------------------------------------- */
/* A show goes into the calendar long before there is a photo of it, so a full
   row of these is the normal state, not an edge case. At the photo card's 3/4
   portrait they are tall dark rectangles with a big faint mark in them — the
   first person to see it asked what the image was, which is the whole problem:
   an empty frame reads as a picture that failed to load. Squarer, with a
   smaller and firmer leaf, it reads as a card that was designed this way.
   Mixed rows still line up: grid items stretch to the tallest in the row. */
.show--ph { position: relative; aspect-ratio: 1 / 1; }
.show--ph::before {
  content: ""; position: absolute; z-index: 1;
  right: -8%; top: 8%; width: 52%; aspect-ratio: 1;
  -webkit-mask: url("../images/leaf-mark.png") no-repeat center / contain;
          mask: url("../images/leaf-mark.png") no-repeat center / contain;
  background: linear-gradient(var(--ph-a, 135deg), var(--lime) 0%, var(--avocado) 46%, var(--lime-bright) 100%);
  opacity: .22;
  pointer-events: none;
}
.show--ph:nth-child(2)::before { --ph-a: 205deg; right: auto; left: -10%; top: 12%; }
.show--ph:nth-child(3)::before { --ph-a:  75deg; top: 4%;  width: 46%; }
.show--ph:nth-child(4)::before { --ph-a: 260deg; right: auto; left: -6%; top: 14%; width: 48%; }
/* The scrim is what keeps the city legible over a photo; over the leaf it only
   needs to hold the bottom third, so it must sit ABOVE the leaf. */
.show--ph::after { z-index: 1; }

/* ========================================================= TRADE SHOWS PAGE ===
   The exhibition calendar (/trade-shows/). Two halves with deliberately
   different weights: the next show is the only dark object on the page because
   it is the only one asking for a decision, and everything behind it — the rest
   of the calendar, the years already exhibited — is quiet type on cream.
   .ts-row is shared by both lists; a show is the same object seen from either
   side of today, so it should not be two components.
   ------------------------------------------------------------------------- */

/* No padding override here. This carried `padding-bottom: 0`, which put the
   dark card hard against the section below it — measured 0px where every other
   boundary on the site is 73.6px, and it read as the card being stuck to the
   next block rather than closing the section. */
.ts-figs { margin-top: 0; }

.entry-content .ts-next,
.ts-next {
  position: relative; overflow: hidden;
  display: grid; grid-template-columns: minmax(9rem, 12rem) minmax(0, 1fr);
  gap: clamp(1.2rem, 3vw, 2.6rem); align-items: center;
  padding: clamp(1.5rem, 3.4vw, 2.6rem);
  border-radius: var(--r-lg);
  background:
    radial-gradient(120% 140% at 100% 0%, rgba(231,234,107,.16), transparent 58%),
    linear-gradient(158deg, #3d4210 0%, #2b2f08 100%);
  color: var(--cream);
}
/* Same leaf as the article CTA and the image-less show card — one mark, three
   places, so the brand reads as a system rather than as three decisions. */
.ts-next::after {
  content: ""; position: absolute; right: -3rem; bottom: -3.6rem; z-index: 0;
  width: clamp(150px, 26%, 240px); aspect-ratio: 1;
  -webkit-mask: url("../images/leaf-mark.png") no-repeat center / contain;
          mask: url("../images/leaf-mark.png") no-repeat center / contain;
  background: linear-gradient(135deg, var(--lime) 0%, var(--avocado) 34%, var(--lime-bright) 58%, var(--avocado) 100%);
  background-size: 280% 280%;
  animation: nt-cta-leaf 16s ease-in-out infinite;
  opacity: .17; pointer-events: none;
}
.ts-next > * { position: relative; z-index: 1; }

.ts-next__when { text-align: center; border-right: 1px solid rgba(231,234,107,.22); padding-right: clamp(1rem, 2vw, 1.8rem); }
.ts-next__n {
  display: block; font-family: var(--font-display); font-weight: 600;
  font-size: clamp(3.4rem, 9vw, 5.4rem); line-height: .92; color: var(--lime);
  font-variant-numeric: tabular-nums; letter-spacing: -.02em;
}
.ts-next__u {
  display: block; margin-top: .35rem;
  font-family: var(--font-body); font-size: .74rem; font-weight: 700;
  letter-spacing: .14em; text-transform: uppercase; color: rgba(254,255,247,.66);
}
.ts-next__badge {
  display: inline-flex; align-items: center; gap: .55rem;
  font-family: var(--font-body); font-size: .68rem; font-weight: 800;
  letter-spacing: .16em; text-transform: uppercase; color: var(--lime);
}
.ts-next__title { margin: .5rem 0 0; font-size: clamp(1.5rem, 3.4vw, 2.1rem); line-height: 1.12; color: var(--cream); }
.ts-next__title a { color: inherit; }
.ts-next__title a:hover { color: var(--lime); }
.ts-next__meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1.1rem;
  margin: .7rem 0 0; font-size: .92rem; color: rgba(254,255,247,.82);
}
.ts-next__meta .pin { width: 1em; height: 1em; color: var(--lime); margin-right: .3em; vertical-align: -.12em; }
.ts-next__meta .flag { width: 1.4em; height: auto; margin-left: .45em; border-radius: 2px; vertical-align: -.18em; box-shadow: 0 0 0 1px rgba(255,255,255,.35); }
.ts-next__city { display: inline-flex; align-items: center; }
.ts-next__booth { font-weight: 700; color: var(--lime); }
.ts-next__note { margin: .75rem 0 0; font-size: .9rem; line-height: 1.55; color: rgba(254,255,247,.68); max-width: 58ch; }
.ts-next__cta { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.3rem; }
.ts-next__cta .btn--ghost { border-color: rgba(231,234,107,.4); color: var(--cream); }
.ts-next__cta .btn--ghost:hover { background: rgba(231,234,107,.14); border-color: var(--lime); color: var(--lime); }

/* --- the shared row ------------------------------------------------------- */
.ts-list { list-style: none; margin: 0; padding: 0; }
.ts-row {
  display: grid; grid-template-columns: 8.5rem minmax(0, 1fr) auto;
  align-items: start; gap: 1.2rem;
  padding: clamp(.95rem, 2vw, 1.25rem) 0;
  border-top: 1px solid rgba(102,110,19,.16);
}
.ts-list > .ts-row:last-child { border-bottom: 1px solid rgba(102,110,19,.16); }
.ts-row__date { font-family: var(--font-body); font-variant-numeric: tabular-nums; padding-top: .1rem; }
.ts-row__date b { display: block; font-size: .92rem; font-weight: 800; color: var(--avocado); white-space: nowrap; }
.ts-row__date i {
  display: block; margin-top: .16rem; font-style: normal;
  font-size: .66rem; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--olive-soft);
}
.ts-row__name { display: flex; align-items: baseline; flex-wrap: wrap; gap: .5rem;
  font-family: var(--font-display); font-weight: 600; font-size: 1.06rem; line-height: 1.2; color: var(--olive-deep); }
.ts-row__name a { color: inherit; }
.ts-row__name a:hover { color: var(--avocado); }
.ts-row__where { display: block; margin-top: .22rem; font-size: .82rem; color: var(--olive-soft); }
.ts-row__where b { font-weight: 700; color: var(--olive); }
.ts-row__where b::before { content: "·"; margin: 0 .45em; color: var(--olive-soft); font-weight: 400; }

/* The link out to the coverage. This is the whole job of a past row, so it is
   a real link with its own hit area rather than a chevron on the row. */
.ts-row__reads { display: flex; flex-direction: column; align-items: flex-start; gap: .3rem; margin-top: .55rem; }
.ts-row__reads a {
  display: inline-flex; align-items: center; gap: .42rem;
  font-size: .8rem; line-height: 1.3; color: var(--olive);
  border-bottom: 1px solid transparent;
}
.ts-row__reads a svg { width: 14px; height: 14px; flex: none; color: var(--avocado); }
.ts-row__reads a:hover { color: var(--avocado); border-bottom-color: rgba(102,110,19,.4); }

.ts-row__side { display: flex; align-items: center; gap: .7rem; padding-top: .15rem; flex: none; }
.ts-row__side .flag { width: 24px; height: auto; border-radius: 2px; box-shadow: 0 0 0 1px rgba(20,22,4,.12); display: block; }
/* A labelled pill, not an icon-only circle — see the note in the row renderer.
   whitespace:nowrap because "Add to calendar" breaking over two lines inside a
   pill is worse than the pill being wide. */
.ts-row__ics {
  display: inline-flex; align-items: center; justify-content: center; gap: .4rem;
  padding: .34rem .72rem .34rem .6rem; border-radius: var(--r-pill);
  background: rgba(102,110,19,.08); color: var(--avocado);
  font-family: var(--font-body); font-size: .74rem; font-weight: 600;
  line-height: 1.2; white-space: nowrap;
  transition: background .2s var(--ease-out), color .2s var(--ease-out);
}
.ts-row__ics svg { width: 15px; height: 15px; flex: none; }
.ts-row__ics:hover { background: var(--avocado); color: var(--cream); }

.ts-pill {
  font-family: var(--font-body); font-style: normal;
  font-size: .6rem; font-weight: 800; letter-spacing: .12em; text-transform: uppercase;
  padding: .22rem .5rem; border-radius: var(--r-pill);
  background: rgba(231,234,107,.34); color: var(--olive-deep);
  white-space: nowrap;
}
.ts-next__badge .ts-pill { background: rgba(231,234,107,.2); color: var(--lime); }

.ts-fine { margin-top: 1.1rem; font-size: .78rem; line-height: 1.5; color: var(--olive-soft); }

/* --- track record --------------------------------------------------------- */
.ts-figs { margin: 0 0 clamp(1.6rem, 3.4vw, 2.4rem); }
.ts-year { margin-top: clamp(1.4rem, 3vw, 2.2rem); }
.ts-year__n {
  font-family: var(--font-display); font-size: 1.5rem; font-weight: 600;
  color: var(--avocado); margin: 0 0 .2rem;
  font-variant-numeric: tabular-nums;
}
.ts-list--past .ts-row { grid-template-columns: 7rem minmax(0, 1fr) auto; }

/* --- closing CTA ---------------------------------------------------------- */
.ts-cta {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: clamp(1.2rem, 3vw, 2.4rem);
  align-items: center;
}
.ts-cta h2 { font-size: clamp(1.4rem, 3vw, 1.9rem); margin: 0; color: var(--olive-deep); }
.ts-cta p { margin: .6rem 0 0; color: var(--muted); max-width: 58ch; }

@media (max-width: 780px) {
  .ts-next { grid-template-columns: 1fr; gap: 1.1rem; }
  /* The rule between the count and the show becomes a horizontal one, or the
     number floats over the title with nothing separating them. */
  .ts-next__when {
    display: flex; align-items: baseline; gap: .55rem; text-align: left;
    border-right: 0; border-bottom: 1px solid rgba(231,234,107,.22);
    padding: 0 0 .9rem;
  }
  .ts-next__n { font-size: 2.9rem; }
  .ts-next__u { margin-top: 0; }
  .ts-next__cta .btn { flex: 1 1 100%; justify-content: center; }

  .ts-row,
  .ts-list--past .ts-row { grid-template-columns: minmax(0, 1fr) auto; gap: .3rem .9rem; }
  /* Date to its own full-width line, laid out inline so it does not become two
     stacked lines for what is one fact. */
  .ts-row__date { grid-column: 1 / -1; display: flex; align-items: baseline; gap: .5rem; }
  .ts-row__date i { margin-top: 0; }
  .ts-row__side { grid-row: 2; justify-content: flex-end; }

  .ts-cta { grid-template-columns: 1fr; }
  .ts-cta .btn { justify-content: center; }
}

/* Cross-link from the News trade-show tab to the calendar. Sits between the
   market filter and the grid, so it reads as an aside to the list rather than
   as a card competing with the articles. */
.news-xlink {
  display: flex; align-items: flex-start; gap: .6rem;
  margin: 0 0 clamp(1.2rem, 2.6vw, 1.8rem);
  padding: .75rem .95rem;
  border-radius: var(--r-sm);
  background: rgba(102,110,19,.055);
  font-size: .86rem; line-height: 1.45; color: var(--olive-deep);
}
.news-xlink svg { width: 17px; height: 17px; flex: none; margin-top: .1rem; color: var(--avocado); }
.news-xlink a { color: var(--avocado); font-weight: 600; border-bottom: 1px solid rgba(102,110,19,.35); }
.news-xlink a:hover { border-bottom-color: var(--avocado); }

/* Calendar filter. Reuses .ctry-filter / .ctry-chip from the News market filter
   — same control, same meaning, already approved — with two additions: a second
   row for status, and a spent state for a market that has nothing under the
   current status. */
.ts-filter { margin: 0 0 clamp(1.4rem, 3vw, 2rem); display: grid; gap: .6rem; }
.ts-filter__row { margin: 0; }
.ctry-chip.is-off {
  opacity: .34; cursor: not-allowed; filter: grayscale(.7);
}
.ctry-chip.is-off:hover { background: rgba(102,110,19,.07); }

.ts-block + .ts-block { margin-top: clamp(2rem, 4vw, 3rem); }
.ts-block__h {
  font-family: var(--font-body); font-size: .68rem; font-weight: 800;
  letter-spacing: .16em; text-transform: uppercase; color: var(--olive-soft);
  margin: 0 0 .8rem;
}
.ts-empty {
  margin: 1.4rem 0 0; padding: 1.1rem 1.2rem;
  border-radius: var(--r-sm); background: rgba(102,110,19,.055);
  color: var(--olive); font-size: .9rem;
}
/* .ts-year is now nested inside .ts-block, so its first child needs no top gap. */
.ts-block > .ts-year:first-of-type { margin-top: 0; }

/* --- "show more" per year ---------------------------------------------------
   Two shows per year, the rest inside a <details>. See the note in
   archive-trade_show.php for why <details> and not a JS-toggled class, and for
   what this does and does not actually buy in performance terms.
   -------------------------------------------------------------------------- */
.ts-more { display: block; }
.ts-more > summary {
  display: flex; align-items: center; gap: .5rem;
  padding: .8rem 0; cursor: pointer;
  border-top: 1px solid rgba(102,110,19,.16);
  font-family: var(--font-body); font-size: .8rem; font-weight: 600;
  color: var(--avocado);
  list-style: none;                 /* Firefox */
  -webkit-tap-highlight-color: transparent;
}
.ts-more > summary::-webkit-details-marker { display: none; }   /* Safari */
.ts-more > summary:hover { color: var(--olive-deep); }
.ts-more > summary:focus-visible { outline: 2px solid var(--avocado); outline-offset: 3px; border-radius: 4px; }
.ts-more__c { width: 15px; height: 15px; flex: none; transition: transform .3s var(--ease-out); }
.ts-more[open] > summary .ts-more__c { transform: rotate(180deg); }
/* While a market filter is on, every panel is forced open and its toggle is
   meaningless — see syncMore() in inc/trade-shows.php. */
.ts-more.is-forced > summary { display: none; }
/* The first list runs straight into the summary's rule, so it must not draw its
   own bottom border as well — two hairlines 1px apart read as a thick one. */
.ts-year .ts-list > .ts-row:last-child { border-bottom: 0; }
.ts-year .ts-list:last-child > .ts-row:last-child { border-bottom: 1px solid rgba(102,110,19,.16); }

/* The open/close animation.

   `::details-content` + `interpolate-size` animates to the content's real
   height with no measuring, no magic max-height, and no JS — the browser
   interpolates `block-size: 0` to `auto` itself. Only this one wrapper's size
   animates; the rows inside are never touched, so there is no per-row work and
   nothing else on the page re-layouts.

   `interpolate-size` is set HERE and not on :root on purpose: it is inherited,
   so scoping it to this component means it cannot silently turn some other
   transition elsewhere on the site into an animated one.

   Where `::details-content` is not supported the rule is simply ignored and the
   panel opens instantly — still completely functional, which is the whole
   reason for building it on <details>. */
@media (prefers-reduced-motion: no-preference) {
  .ts-more { interpolate-size: allow-keywords; }
  .ts-more::details-content {
    block-size: 0;
    overflow: clip;
    transition: block-size .42s var(--ease-out), content-visibility .42s allow-discrete;
  }
  .ts-more[open]::details-content { block-size: auto; }
}

/* --- News mega panel -------------------------------------------------------
   ROWS, not cards — and that is the whole point.

   Products uses three image cards because a category name is two or three
   words. An article headline here is 70-105 characters, so in a 174px column
   every single one was cut and the panel became a stack of three truncated
   sentences with three ellipses. Three attempts at moving *where* the cut fell
   all failed for the same reason: the format was wrong, not the trim.

   Turned on its side the headline gets ~490px — about 50 characters a line, so
   two lines hold ~100 and nothing is cut. The thumbnail drops to a 92px cue,
   which also stops three near-identical booth photos from being the loudest
   thing in a navigation menu.
   -------------------------------------------------------------------------- */
.nav-mega--news { left: auto; right: 0; width: min(620px, calc(100vw - 2.5rem)); }

.nav-news__list { display: grid; gap: .2rem; }
.nav-news__row {
  display: grid; grid-template-columns: 92px minmax(0, 1fr);
  align-items: center; gap: .85rem;
  padding: .55rem .6rem; border-radius: var(--r-md);
  transition: background .25s var(--ease);
}
.nav-news__row + .nav-news__row { box-shadow: 0 -1px 0 var(--line-soft); }
.nav-news__row:hover { background: var(--cream-2); box-shadow: none; }
.nav-news__row:hover + .nav-news__row { box-shadow: none; }

.nav-news__thumb {
  display: block; aspect-ratio: 3 / 2; border-radius: 10px;
  overflow: hidden; background: var(--sand);
}
.nav-news__thumb img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease-out); }
.nav-news__row:hover .nav-news__thumb img { transform: scale(1.06); }
/* An article with no featured image gets the brand ground, not an empty box. */
.nav-news__thumb--ph { background: linear-gradient(150deg, var(--olive), var(--olive-deep)); }

.nav-news__body { min-width: 0; }
/* Quiet: three of these in a column must not compete with three headlines. */
.nav-news__meta {
  display: flex; align-items: baseline; gap: .45rem;
  font-size: .68rem; color: var(--olive-soft); white-space: nowrap; overflow: hidden;
}
.nav-news__where { overflow: hidden; text-overflow: ellipsis; }
/* Three lines, from measurement: the text column is 378px at the narrow
   breakpoint and 9.6px a character in this face, so ~39 a line. The longest
   real headline on the site is 104 characters — two lines (78) clips it, three
   (117) does not. Most titles use two and the row simply sits shorter. */
.nav-news__title {
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  margin-top: .18rem;
  font-family: var(--font-display); font-weight: 500;
  font-size: .95rem; line-height: 1.3; color: var(--olive-deep);
}
.nav-news__row:hover .nav-news__title { color: var(--avocado); }

.nav-mega__new {
  flex: 0 0 auto; font-family: var(--font-body);
  font-size: .56rem; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: var(--olive-ink); background: var(--lime);
  padding: .1rem .34rem; border-radius: var(--r-pill); line-height: 1.5;
}

.nav-mega__foot {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; flex-wrap: nowrap; margin-top: .8rem;
  padding-top: .75rem; border-top: 1px solid var(--line-soft);
}
.nav-mega__foot .nav-mega__all { flex: 0 0 auto; white-space: nowrap; margin: 0; }

/* The countdown, sized to its content rather than stretched across the panel. */
.nav-mega__show {
  display: inline-flex; align-items: baseline; gap: .5rem; flex-wrap: nowrap;
  flex: 0 1 auto; min-width: 0;
  padding: .42rem .8rem; border-radius: var(--r-pill);
  background: linear-gradient(135deg, #3d4210, #2b2f08); color: var(--cream);
  transition: transform .3s var(--ease-out);
}
.nav-mega__show:hover { transform: translateY(-2px); color: var(--cream); }
.nav-mega__show-k {
  flex: 0 0 auto; white-space: nowrap;
  font-family: var(--font-body); font-size: .54rem; font-weight: 800;
  letter-spacing: .13em; text-transform: uppercase; color: var(--lime);
}
.nav-mega__show-n {
  font-family: var(--font-display); font-weight: 600; font-size: .84rem; color: var(--cream);
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nav-mega__show-m {
  display: inline-flex; align-items: baseline; gap: .4rem; font-size: .7rem;
  color: rgba(254,255,247,.66); flex: 0 0 auto; white-space: nowrap;
}
.nav-mega__show-m b { color: var(--lime); font-weight: 700; }

/* Count bubble on a drawer sub-item (e.g. "Trade show calendar  7"). */
.mobile-menu__n {
  margin-left: auto; font-style: normal;
  font-family: var(--font-body); font-size: .66rem; font-weight: 800;
  min-width: 1.3rem; height: 1.3rem; padding: 0 .34rem;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--r-pill); background: rgba(102,110,19,.12); color: var(--avocado);
  font-variant-numeric: tabular-nums;
}

/* The dark-hero masthead paints every nav link white so it reads over the hero
   photo — `.dark-hero .site-header:not(.scrolled) .nav-menu a`, (0,4,1), high
   enough to reach INSIDE a mega panel that has its own cream background. That
   made "View all products" white-on-cream, i.e. invisible, on every dark-hero
   page since the Products panel was built. Re-specified at (0,5,1). */
.dark-hero .site-header:not(.scrolled) .nav-menu .nav-mega__panel a { color: var(--olive); }
.dark-hero .site-header:not(.scrolled) .nav-menu .nav-mega__panel a:hover { color: var(--avocado); }
.dark-hero .site-header:not(.scrolled) .nav-menu .nav-mega__panel .nav-news__title { color: var(--olive-deep); }
/* The countdown pill is dark by design and keeps its cream text. */
.dark-hero .site-header:not(.scrolled) .nav-menu a.nav-mega__show,
.dark-hero .site-header:not(.scrolled) .nav-menu a.nav-mega__show:hover { color: var(--cream); }

@media (max-width: 1180px) {
  .nav-mega--news { width: min(580px, calc(100vw - 2.5rem)); }
  .nav-mega__show-m span { display: none; }   /* city goes first when tight */
}

/* ============================================================
   Newsletter confirm / unsubscribe landing (inc/subscribers.php)
   One-off page reached from a tokened link in an email, so it is
   deliberately quiet: one card, no nav bait, one way back.
   ============================================================ */
.sub-note {
  min-height: 58vh;
  display: grid;
  place-items: center;
  padding: clamp(3rem, 8vw, 7rem) var(--gut, 1.25rem);
  background:
    radial-gradient(120% 90% at 50% 0%, rgba(231,234,107,.22), transparent 62%),
    var(--cream);
}
.sub-note__card {
  max-width: 46rem;
  text-align: center;
  background: var(--cream);
  border: 1px solid var(--sand);
  border-radius: 22px;
  padding: clamp(2rem, 5vw, 3.4rem);
  box-shadow: 0 24px 60px rgba(45, 50, 8, .09);
}
.sub-note__card h1 {
  margin: 0 0 .75rem;
  font-size: clamp(1.7rem, 1.1rem + 1.9vw, 2.5rem);
  line-height: 1.15;
  color: var(--olive-ink);
}
.sub-note__card > p {
  margin: 0 auto;
  max-width: 34rem;
  color: color-mix(in srgb, var(--olive-ink) 72%, transparent);
  line-height: 1.7;
}
.sub-note__actions {
  margin-top: 1.9rem;
  display: flex;
  flex-wrap: wrap;
  gap: .9rem 1.4rem;
  align-items: center;
  justify-content: center;
}
.sub-note__quiet {
  font-size: .88rem;
  color: color-mix(in srgb, var(--olive-ink) 55%, transparent);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.sub-note__quiet:hover { color: var(--avocado); }

/* The footer subscribe reply. It sits outside the form, so it needs its own
   spacing rather than inheriting the form's. */
.sub-msg:empty { display: none; }
.sub-msg {
  margin-top: .7rem;
  font-size: .88rem;
  line-height: 1.5;
}
.sub-msg.ok  { color: var(--lime); }
.sub-msg.err { color: #ffb4a2; }

/* ============================================================
   Market cards (.nt-mkt) — four parallel markets, read at a glance.
   Four h3 + paragraph pairs made the reader compare by memory: the
   figures for Europe were a screen away from the figures for Mexico.
   Parallel data wants parallel objects.
   ============================================================ */
.entry-content .nt-mkt {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: .85rem; margin: 1.6rem 0;
}
.entry-content .nt-mkt__card {
  display: flex; flex-direction: column;
  padding: 1.15rem 1.2rem 1.2rem;
  border-radius: var(--r-md);
  background: linear-gradient(135deg, #eef0d8, #e4e6c6);
  border: 1px solid var(--line-soft);
}
.entry-content .nt-mkt__k {
  display: block; font-family: var(--font-body); font-size: .64rem; font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase; color: var(--olive-soft);
}
.entry-content .nt-mkt__t {
  margin: .3rem 0 .55rem; font-size: 1.06rem; line-height: 1.25; color: var(--olive-ink);
}
/* The headline figure carries the card; the supporting splits sit under it as
   one quiet line so they never compete with it. */
.entry-content .nt-mkt__n {
  display: block; font-family: var(--font-display); font-weight: 600;
  font-size: clamp(1.45rem, 3.4vw, 1.75rem); line-height: 1.05;
  color: var(--avocado); font-variant-numeric: tabular-nums;
}
.entry-content .nt-mkt__n i { font-style: normal; font-size: .5em; letter-spacing: .01em; }
.entry-content .nt-mkt__sub {
  display: block; margin-top: .3rem; font-size: .76rem; line-height: 1.4; color: var(--olive-soft);
}
.entry-content .nt-mkt__d {
  margin: .7rem 0 0; font-size: .86rem; line-height: 1.6; color: var(--olive-deep);
}
/* Applications are the commercial read, so they sit visually apart from the
   data above them — chips, below a hairline, pushed to the foot of the card so
   all four cards line their tags up whatever the copy length. */
.entry-content .nt-mkt__tags {
  list-style: none; display: flex; flex-wrap: wrap; gap: .35rem;
  margin: .85rem 0 0; padding: .8rem 0 0; border-top: 1px solid rgba(102,110,19,.18);
  margin-top: auto;
}
.entry-content .nt-mkt__tags li {
  margin: 0; padding: .22rem .6rem; border-radius: 999px;
  font-family: var(--font-body); font-size: .7rem; line-height: 1.5;
  color: var(--olive-deep); background: rgba(255,255,255,.55);
  border: 1px solid rgba(102,110,19,.14);
}
.entry-content .nt-mkt__tags li::marker { content: ""; }
.entry-content .nt-mkt__src { grid-column: 1 / -1; margin: .1rem 0 0; font-size: .74rem; color: var(--olive-soft); }

@media (max-width: 700px) {
  .entry-content .nt-mkt { grid-template-columns: 1fr; gap: .7rem; }
}

/* ============================================================
   Closing call to action (.nt-cta)
   Dark, so the article ends on a deliberate stop rather than trailing off
   into a source list. Same ground as the site's hero and footer bands.
   ============================================================ */
.entry-content .nt-cta {
  margin: 2.1rem 0 .5rem; padding: 1.7rem 1.8rem;
  border-radius: var(--r-md);
  background: linear-gradient(135deg, #2c3a05, #141604 70%);
  color: var(--cream);
}
.entry-content .nt-cta__k {
  display: block; font-family: var(--font-body); font-size: .64rem; font-weight: 800;
  letter-spacing: .12em; text-transform: uppercase; color: var(--lime);
}
.entry-content .nt-cta p { margin: .55rem 0 0; font-size: .92rem; line-height: 1.65; color: rgba(250,248,240,.82); }
/* Matched on the element as well as the class: a bare `.nt-cta__t` loses to
   `.entry-content .nt-cta p` and the heading silently became body text. */
.entry-content .nt-cta h2,
.entry-content .nt-cta p.nt-cta__t {
  margin: .5rem 0 0; font-family: var(--font-display); font-weight: 600;
  font-size: clamp(1.28rem, 3.1vw, 1.55rem); line-height: 1.25; color: var(--cream);
}
.entry-content .nt-cta__act { display: flex; flex-wrap: wrap; gap: .6rem; margin-top: 1.15rem; }
/* The body rule underlines every link in .entry-content; buttons opt out. */
.entry-content .nt-cta a.btn { text-decoration: none; }
.entry-content .nt-cta .btn--ghost { --fg-btn: var(--cream); box-shadow: inset 0 0 0 1.5px rgba(250,248,240,.45); }
.entry-content .nt-cta .btn--ghost:hover { box-shadow: inset 0 0 0 1.5px var(--lime); background: rgba(250,248,240,.06); }

@media (max-width: 560px) {
  .entry-content .nt-cta { padding: 1.35rem 1.25rem; }
  .entry-content .nt-cta__act .btn { width: 100%; justify-content: center; }
}

/* ============================================================
   Site search (inc/search.php) — trigger + instant panel
   ============================================================ */
.nsearch-open {
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .58em 1em; border-radius: var(--r-pill);
  font-family: var(--font-body); font-size: .9rem; font-weight: 600;
  color: var(--olive-deep); background: transparent;
  box-shadow: inset 0 0 0 1.5px var(--line);
  cursor: pointer; transition: box-shadow .3s var(--ease), background .3s var(--ease);
}
.nsearch-open:hover { box-shadow: inset 0 0 0 1.5px var(--avocado); background: rgba(102,110,19,.05); }
.nsearch-open svg { width: 17px; height: 17px; }
/* In the masthead the label would crowd the CTA, so only the glyph shows;
   the accessible name still comes from aria-label on the button. */
.nsearch-open--mast .nsearch-open__txt { display: none; }
.nsearch-open--mast { padding: .58em; }
/* The drawer entry is dressed as an input, not a button: filled ground, soft
   corners (a pill reads as an action), icon and label left-aligned where a
   placeholder would sit, and placeholder-weight text. Tapping it still opens
   the same panel — this is about matching the affordance to the expectation. */
.nsearch-open--drawer {
  /* The drawer itself has no padding — head, menu and footer each inset their
     own content (20px / 16px / 20px). Everything else in there is unfilled
     text, so its inset reads as the margin; this control has a background, so
     a full-bleed box ran to both edges while the menu beside it sat 16px in.
     Match the menu's inset with a MARGIN so the filled box lines up with the
     column the rest of the drawer keeps. */
  width: auto; justify-content: flex-start; gap: .6rem;
  margin: .35rem 16px 1rem; padding: .78rem .85rem;
  border-radius: 12px;
  background: var(--cream-2);
  box-shadow: inset 0 0 0 1px var(--line-soft);
  font-weight: 500; font-size: .92rem; color: var(--olive-soft);
}
.nsearch-open--drawer:hover,
.nsearch-open--drawer:focus-visible {
  background: var(--cream); box-shadow: inset 0 0 0 1.5px var(--avocado); color: var(--olive-deep);
}
.nsearch-open--drawer .nsearch-open__ico { display: grid; place-items: center; color: var(--olive); }
.nsearch-open--drawer svg { width: 18px; height: 18px; }
.nsearch-open--drawer .nsearch-open__txt {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
@media (max-width: 1080px) { .nsearch-open--mast { display: none; } }

.nsearch { position: fixed; inset: 0; z-index: 1200; }
.nsearch[hidden] { display: none; }
html.nsearch-lock { overflow: hidden; }
.nsearch__scrim {
  position: absolute; inset: 0; background: rgba(20,22,4,.55);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); opacity: 0; transition: opacity .22s var(--ease);
}
.nsearch.is-open .nsearch__scrim { opacity: 1; }
.nsearch__panel {
  position: relative; margin: clamp(3vh, 7vh, 5rem) auto 0;
  width: min(720px, calc(100vw - 2rem));
  max-height: min(76vh, 720px); display: flex; flex-direction: column;
  background: var(--cream); border: 1px solid var(--sand);
  border-radius: 20px; box-shadow: 0 30px 80px rgba(20,22,4,.35);
  overflow: hidden;
  transform: translateY(-10px) scale(.985); opacity: 0;
  transition: transform .24s var(--ease), opacity .24s var(--ease);
}
.nsearch.is-open .nsearch__panel { transform: none; opacity: 1; }
.nsearch__bar { display: flex; align-items: center; gap: .7rem; padding: .95rem 1.1rem; border-bottom: 1px solid var(--line-soft); }
.nsearch__ico { display: grid; place-items: center; color: var(--olive-soft); flex: 0 0 auto; }
.nsearch__ico svg { width: 20px; height: 20px; }
.nsearch__input {
  flex: 1 1 auto; min-width: 0; border: 0; background: transparent; outline: none;
  font-family: var(--font-display); font-size: 1.08rem; color: var(--olive-ink);
}
.nsearch__input::placeholder { color: var(--olive-soft); }
.nsearch__input::-webkit-search-cancel-button { display: none; }
.nsearch__close {
  flex: 0 0 auto; width: 32px; height: 32px; display: grid; place-items: center;
  border-radius: 50%; background: transparent; color: var(--olive-soft); cursor: pointer;
}
.nsearch__close:hover { background: rgba(102,110,19,.08); color: var(--olive-deep); }
.nsearch__close svg { width: 17px; height: 17px; }

.nsearch__body { overflow-y: auto; padding: .5rem .6rem .7rem; -webkit-overflow-scrolling: touch; }
.nsearch__group + .nsearch__group { margin-top: .3rem; }
.nsearch__glabel {
  margin: .7rem .5rem .35rem; font-family: var(--font-body); font-size: .62rem; font-weight: 800;
  letter-spacing: .14em; text-transform: uppercase; color: var(--olive-soft);
}
.nsearch__hit, .nsearch__all {
  display: flex; align-items: center; gap: .8rem;
  padding: .6rem .55rem; border-radius: 12px;
  text-decoration: none; color: inherit;
}
.nsearch__hit:hover, .nsearch__hit.is-active,
.nsearch__all:hover, .nsearch__all.is-active { background: rgba(102,110,19,.09); }
.nsearch__thumb {
  flex: 0 0 auto; width: 46px; height: 46px; border-radius: 9px; overflow: hidden;
  background: var(--cream-2); display: grid; place-items: center;
}
.nsearch__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.nsearch__txt { min-width: 0; display: flex; flex-direction: column; gap: .12rem; }
.nsearch__t { font-family: var(--font-display); font-size: .95rem; line-height: 1.3; color: var(--olive-ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nsearch__s { font-size: .78rem; line-height: 1.4; color: var(--olive-soft);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.nsearch__all { justify-content: center; margin-top: .5rem; font-weight: 600; color: var(--avocado); }
.nsearch__empty { margin: 1.6rem .6rem; text-align: center; color: var(--olive-soft); font-size: .9rem; line-height: 1.6; }

.nsearch__suggest { padding: .8rem .55rem 1rem; }
.nsearch__hint { margin: 0 0 .55rem; font-family: var(--font-body); font-size: .62rem; font-weight: 800;
  letter-spacing: .14em; text-transform: uppercase; color: var(--olive-soft); }
.nsearch__chips { display: flex; flex-wrap: wrap; gap: .45rem; }
.nsearch__chip {
  padding: .4rem .8rem; border-radius: 999px; font-size: .82rem; text-decoration: none;
  color: var(--olive-deep); background: var(--cream-2); border: 1px solid var(--line-soft);
}
.nsearch__chip:hover { border-color: var(--avocado); color: var(--avocado); }

.nsearch__foot {
  display: flex; gap: 1.1rem; padding: .55rem 1.1rem; border-top: 1px solid var(--line-soft);
  font-size: .7rem; color: var(--olive-soft); background: var(--cream-2);
}
.nsearch__foot kbd {
  display: inline-block; min-width: 1.35em; padding: .05em .35em; margin-right: .15em;
  border-radius: 5px; border: 1px solid var(--line); background: var(--cream);
  font-family: inherit; font-size: .95em; text-align: center; color: var(--olive-deep);
}
@media (max-width: 560px) {
  .nsearch__panel { margin-top: 0; width: 100vw; max-height: 100vh; height: 100%; border-radius: 0; border: 0; }
  .nsearch__foot { display: none; }   /* no physical keyboard to hint at */
}
@media (prefers-reduced-motion: reduce) {
  .nsearch__panel, .nsearch__scrim { transition: none; }
}

/* ============================================================
   Search results feed (search.php)
   Masonry column flow, same technique as the products grid, so cards of
   different natural heights sit flush. Type filters live on the right.
   ============================================================ */
.nsr-layout { display: grid; grid-template-columns: 1fr minmax(210px, 250px); gap: clamp(1.2rem, 2.4vw, 2.2rem); align-items: start; }
.nsr-feed { columns: 300px; column-gap: clamp(.9rem, 1.6vw, 1.4rem); }
.nsr-cell { break-inside: avoid; -webkit-column-break-inside: avoid; margin: 0 0 clamp(.9rem, 1.6vw, 1.4rem); }
.nsr-cell[hidden] { display: none; }

.nsr-card {
  display: block; text-decoration: none; color: inherit; overflow: hidden;
  border-radius: var(--r-md); background: var(--cream);
  border: 1px solid var(--line-soft);
  transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease);
}
.nsr-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--sand); }
.nsr-card__media { display: block; background: var(--cream-2); }
.nsr-card__media img { display: block; width: 100%; height: auto; }
.nsr-card__body { display: flex; flex-direction: column; gap: .3rem; padding: .85rem .95rem 1rem; }
.nsr-card__kind {
  font-family: var(--font-body); font-size: .6rem; font-weight: 800;
  letter-spacing: .13em; text-transform: uppercase; color: var(--olive-soft);
}
.nsr-card__title { font-family: var(--font-display); font-size: 1rem; line-height: 1.3; color: var(--olive-ink); }
.nsr-card__meta { font-size: .74rem; color: var(--olive-soft); }
.nsr-card__text {
  font-size: .82rem; line-height: 1.55; color: var(--olive-deep);
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
/* Products lead with the pack shot, so the image is not cropped — same
   decision as the product cards on /products/. */
.nsr-cell--product .nsr-card__media { background: var(--cream); }
.nsr-cell--nt_app .nsr-card__title { font-size: .95rem; }
/* A trade show is a date and a place; it does not need three lines of body. */
.nsr-cell--trade_show .nsr-card__text { -webkit-line-clamp: 2; }
.nsr-cell--page .nsr-card__body { padding-block: 1rem; }

.nsr-side { position: sticky; top: calc(var(--head-h, 76px) + 1rem); }
.nsr-side__h {
  margin: 0 0 .6rem; font-family: var(--font-body); font-size: .62rem; font-weight: 800;
  letter-spacing: .14em; text-transform: uppercase; color: var(--olive-soft);
}
.nsr-tags { display: flex; flex-direction: column; gap: .35rem; }
.nsr-tag {
  display: flex; align-items: center; justify-content: space-between; gap: .6rem;
  width: 100%; padding: .5rem .75rem; border-radius: 10px; cursor: pointer;
  font-family: var(--font-body); font-size: .86rem; text-align: left;
  color: var(--olive-deep); background: transparent; border: 1px solid var(--line-soft);
  transition: background .25s var(--ease), border-color .25s var(--ease), color .25s var(--ease);
}
.nsr-tag:hover { border-color: var(--avocado); }
.nsr-tag.is-on { background: var(--avocado); border-color: var(--avocado); color: var(--cream); }
.nsr-tag__n { font-size: .74rem; opacity: .75; font-variant-numeric: tabular-nums; }
.nsr-side__note { margin: .7rem 0 0; font-size: .74rem; color: var(--olive-soft); }

.nsr-none { max-width: 46rem; }
.nsr-none p { margin: 0 0 .5rem; }
.nsr-none__hint { color: var(--olive-soft); }
.nsr-none__links { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.1rem; }

@media (max-width: 880px) {
  /* Filters move above the feed rather than shrinking into a column that would
     leave the cards too narrow to read. */
  .nsr-layout { grid-template-columns: 1fr; }
  .nsr-side { position: static; order: -1; }
  .nsr-tags { flex-direction: row; flex-wrap: wrap; }
  .nsr-tag { width: auto; border-radius: 999px; }
  .nsr-feed { columns: 260px; }
}
@media (max-width: 520px) { .nsr-feed { columns: 1; } }

/* Homepage stats bar -> anniversary story.
   Sits under the figures because the first figure IS "20+ Years". The band it
   sits on is the OLIVE stats panel, not cream, so the type is cream/lime here —
   olive-on-olive was invisible. */
.stats-note { margin: clamp(1.1rem, .7rem + 1.2vw, 1.8rem) 0 0; text-align: center; }
.stats-note a {
  display: inline-flex; align-items: center; gap: .45em;
  font-family: var(--font-body); font-size: .88rem; font-weight: 600;
  letter-spacing: .01em; color: rgba(254, 255, 247, .88); text-decoration: none;
  padding-bottom: 2px; border-bottom: 1px solid rgba(254, 255, 247, .38);
  transition: color .25s var(--ease), border-color .25s var(--ease);
}
.stats-note a span { transition: transform .3s var(--ease-out); }
.stats-note a:hover { color: var(--lime); border-bottom-color: var(--lime); }
.stats-note a:hover span { transform: translateX(3px); }
.stats-note a:focus-visible { outline: 3px solid var(--lime); outline-offset: 4px; border-radius: 2px; }
@media (prefers-reduced-motion: reduce) { .stats-note a span { transition: none; } }

/* Homepage 20th-anniversary band -------------------------------------------
   Sits right after the stats bar, because the first figure there IS "20+ Years
   of expertise" — this is what that number opens into. Dark ground so it reads
   as a distinct chapter without competing with the commercial sections. */
.home-anniv {
  position: relative;
  overflow: hidden;
  color: var(--cream);
  background:
    radial-gradient(70% 130% at 88% 8%, rgba(231, 234, 107, .14), transparent 60%),
    linear-gradient(150deg, #2c3a05, var(--olive-ink) 72%);
}
.home-anniv__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
  gap: clamp(1.6rem, .8rem + 3vw, 3.6rem);
  align-items: center;
}
.home-anniv__copy { min-width: 0; }

/* The "20" is the hook — set as a mark, not a heading, so it does not fight
   the H2 for the reader's eye or the document outline. */
.home-anniv__mark { display: flex; align-items: baseline; gap: .6rem; margin-bottom: .9rem; }
.home-anniv__mark b {
  font-family: var(--font-display);
  font-size: clamp(2.4rem, 1.6rem + 2.6vw, 3.6rem);
  font-weight: 600; line-height: .9; letter-spacing: -.03em; color: var(--lime);
}
.home-anniv__mark i {
  font-style: normal; font-family: var(--font-body);
  font-size: .68rem; font-weight: 800; letter-spacing: .2em;
  text-transform: uppercase; color: rgba(254, 255, 247, .62);
}

.home-anniv__h {
  margin: 0 0 .8rem;
  font-family: var(--font-display);
  font-size: clamp(1.7rem, 1.2rem + 2vw, 2.8rem);
  font-weight: 500; line-height: 1.06; letter-spacing: -.02em;
  color: var(--cream); text-wrap: balance;
}
.home-anniv__h em { display: block; font-style: normal; color: var(--lime); }
.home-anniv__p {
  max-width: 46ch; margin: 0 0 clamp(1.1rem, .8rem + 1vw, 1.6rem);
  font-size: var(--fs-body); line-height: 1.6; color: rgba(254, 255, 247, .78);
}
.home-anniv__cta { align-self: flex-start; }

.home-anniv__fig { display: block; border-radius: var(--r-md); overflow: hidden; box-shadow: var(--shadow-md); }
.home-anniv__fig img { display: block; width: 100%; height: auto; transition: transform .6s var(--ease-out); }
.home-anniv__fig:hover img { transform: scale(1.03); }

@media (max-width: 900px) {
  .home-anniv__inner { grid-template-columns: minmax(0, 1fr); }
  .home-anniv__fig { order: -1; }
}
@media (prefers-reduced-motion: reduce) {
  .home-anniv__fig img,
  .home-anniv__fig:hover img { transition: none; transform: none; }
}

/* A/B test "manual" ----------------------------------------------------------
   Both arms ship in the HTML because the page is cached; the class the
   assignment script puts on <html> before first paint decides which one the
   visitor actually sees. Default hidden, so a visitor who somehow never gets
   assigned sees the control rather than a half-made offer. */
.nt-ab-offer { display: none; }
.nt-ab-b .nt-ab-offer {
  display: flex; align-items: flex-start; gap: .55rem;
  margin: 0 0 .9rem; padding: .7rem .85rem;
  border-radius: var(--r-sm);
  background: rgba(231, 234, 107, .18);
  box-shadow: inset 0 0 0 1px rgba(102, 110, 19, .22);
  font-size: .85rem; line-height: 1.45; color: var(--olive-deep);
}
.nt-ab-b .nt-ab-offer svg { flex: 0 0 auto; width: 17px; height: 17px; margin-top: .1em; color: var(--avocado); }
.nt-ab-offer--entry { font-size: .82rem; }

/* The handover, shown only after a successful submit in variant B. */
.nt-ab-get {
  display: inline-flex; align-items: center; gap: .5rem;
  margin-top: .8rem; padding: .7rem 1.15rem;
  border-radius: var(--r-pill);
  background: var(--avocado); color: var(--cream);
  font-size: .9rem; font-weight: 600; text-decoration: none;
  transition: background .25s var(--ease), transform .25s var(--ease);
}
.nt-ab-get:hover { background: var(--olive-deep); color: var(--cream); transform: translateY(-1px); }
.nt-ab-get svg { width: 17px; height: 17px; }
@media (prefers-reduced-motion: reduce) { .nt-ab-get { transition: none; } .nt-ab-get:hover { transform: none; } }

/* Handover: saving it and reading it are offered side by side. */
.nt-ab-actions { display: flex; flex-wrap: wrap; gap: .55rem; margin-top: .85rem; }
.nt-ab-view {
  display: inline-flex; align-items: center; gap: .5rem;
  padding: .7rem 1.15rem; border-radius: var(--r-pill);
  background: transparent; color: var(--olive-deep);
  box-shadow: inset 0 0 0 1.5px rgba(102, 110, 19, .45);
  font-size: .9rem; font-weight: 600; text-decoration: none;
  transition: background .25s var(--ease), box-shadow .25s var(--ease);
}
.nt-ab-view:hover { background: rgba(231, 234, 107, .28); box-shadow: inset 0 0 0 1.5px var(--avocado); color: var(--olive-deep); }
.nt-ab-get { margin-top: 0; }

/* The manual as the first "what happens next" step — B only. */
.nt-ab-step { display: none; }
.nt-ab-b .nt-ab-step { display: list-item; }
.nt-ab-b .nt-ab-step { font-weight: 600; color: var(--olive-deep); }

/* Sending state — a disabled button alone read as a hung page. */
.nt-spin {
  display: inline-block; width: 1em; height: 1em; margin-right: .1em;
  border: 2px solid currentColor; border-right-color: transparent;
  border-radius: 50%; animation: nt-spin .7s linear infinite; vertical-align: -.15em;
}
@keyframes nt-spin { to { transform: rotate(360deg); } }
.btn.is-sending, button.is-sending { cursor: progress; opacity: .85; }

/* Confirmation replaces the form. Leaving the filled-in fields on screen was
   what made a successful send look like nothing had happened. */
.nutoast-form.is-sent > *:not(.nt-sent),
.nutoast-inq-form.is-sent > *:not(.nt-sent) { display: none !important; }
.nt-sent {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: .35rem; padding: clamp(1.4rem, 1rem + 2vw, 2.4rem) 1rem;
  animation: nt-sent-in .45s var(--ease-out) both;
}
.nt-sent:focus { outline: none; }
@keyframes nt-sent-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

.nt-sent__mark { width: 62px; height: 62px; margin-bottom: .5rem; }
.nt-sent__mark svg { width: 100%; height: 100%; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.nt-sent__ring {
  stroke: var(--avocado); stroke-width: 2.5; stroke-dasharray: 145; stroke-dashoffset: 145;
  animation: nt-draw .5s var(--ease-out) .05s forwards;
}
.nt-sent__tick {
  stroke: var(--avocado); stroke-width: 3.5; stroke-dasharray: 40; stroke-dashoffset: 40;
  animation: nt-draw .32s var(--ease-out) .42s forwards;
}
@keyframes nt-draw { to { stroke-dashoffset: 0; } }

.nt-sent__msg {
  max-width: 42ch; margin: 0; font-size: var(--fs-body); line-height: 1.55;
  color: var(--olive-deep);
}
.nt-sent .nt-ab-actions { justify-content: center; }

@media (prefers-reduced-motion: reduce) {
  .nt-spin { animation: none; }
  .nt-sent { animation: none; }
  .nt-sent__ring, .nt-sent__tick { animation: none; stroke-dashoffset: 0; }
}

/* The manual, read in place. */
.nt-pdf {
  position: fixed; inset: 0; z-index: 9998;
  display: flex; flex-direction: column;
  padding: clamp(.8rem, .4rem + 1.6vw, 2rem);
  background: rgba(11, 13, 3, .9);
  animation: nt-pdf-in .2s var(--ease-out);
}
.nt-pdf[hidden] { display: none; }
@keyframes nt-pdf-in { from { opacity: 0; } to { opacity: 1; } }
.nt-pdf__bar {
  display: flex; align-items: center; gap: .8rem;
  max-width: 1200px; width: 100%; margin: 0 auto .7rem;
  color: var(--cream);
}
.nt-pdf__t { font-family: var(--font-display); font-size: 1.05rem; margin-right: auto; }
.nt-pdf__dl {
  padding: .45rem 1rem; border-radius: var(--r-pill); text-decoration: none;
  font-size: .84rem; font-weight: 600; color: var(--olive-ink); background: var(--lime);
}
.nt-pdf__dl:hover { background: #fff; color: var(--olive-ink); }
.nt-pdf__x {
  display: grid; place-items: center; width: 38px; height: 38px; padding: 0;
  border: 0; border-radius: 50%; cursor: pointer;
  background: rgba(254, 255, 247, .12); color: var(--cream);
}
.nt-pdf__x:hover { background: rgba(254, 255, 247, .24); }
.nt-pdf__x svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
.nt-pdf__frame {
  flex: 1 1 auto; max-width: 1200px; width: 100%; margin: 0 auto;
  border-radius: var(--r-sm); overflow: hidden; background: #fff;
}
.nt-pdf__frame iframe { width: 100%; height: 100%; border: 0; display: block; }
@media (prefers-reduced-motion: reduce) { .nt-pdf { animation: none; } }

.nt-pdf__frame { position: relative; }
.nt-pdf__load {
  position: absolute; inset: 0; z-index: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .7rem;
  background: var(--cream); color: var(--olive-soft); font-size: .9rem;
}
.nt-pdf__load[hidden] { display: none; }
.nt-pdf__load .nt-spin { width: 1.6rem; height: 1.6rem; border-width: 2.5px; color: var(--avocado); margin: 0; }

/* The confirmation follows you down the page ---------------------------------
   The left column is much taller than the panel, so scrolling on to read
   "what happens next" took the manual buttons off screen. Sticky keeps them
   reachable for the whole section.

   .contact-grid is align-items:start, which collapses the right column to its
   content and leaves sticky with no range to work in — so the column is told
   to stretch, but only once the form has actually been replaced. */
@media (min-width: 801px) {
  .contact-grid:has(.nutoast-form.is-sent) .contact-form-wrap { align-self: stretch; }
  .contact-grid:has(.nutoast-form.is-sent) .nutoast-form.is-sent { height: 100%; }
  .nutoast-form.is-sent .nt-sent {
    position: sticky;
    top: calc(var(--tb-h, 0px) + 6rem);
  }
}

/* On one column it would sit on top of the very content it is next to, and a
   250px block is a third of a phone screen — it stays in flow there. */

/* The container is stretched to the row so sticky has somewhere to travel, but
   the panel itself must keep its own height — filling the container left only
   ~70px of range and it slid straight off. */
@media (min-width: 801px) {
  .nutoast-form.is-sent .nt-sent {
    align-self: start;
    height: auto;
    flex: 0 0 auto;
  }
}

/* Icons on the two handover actions. */
.nt-ab-get svg, .nt-ab-view svg {
  width: 17px; height: 17px; flex: 0 0 auto;
  fill: none; stroke: currentColor; stroke-width: 1.8;
  stroke-linecap: round; stroke-linejoin: round;
}
.nt-sent__ref {
  margin: .9rem 0 0; font-family: var(--font-body); font-size: .74rem;
  letter-spacing: .08em; text-transform: uppercase; color: var(--olive-soft); opacity: .8;
}

/* ===== 季节性专题：万圣节 2026 ==========================================
 * 全部作用域在 .hw 下 —— 这套配色和母题只属于这一篇，绝不能漏到别的文章。
 *
 * 立场：奶油底和橄榄绿是品牌，不动。万圣节只通过两样东西进入 ——
 *   一个焦橙重点色（--hw-amber），以及蛛网／吊蛛的线描母题。
 * 不铺橙色、不放卡通南瓜：这是给采购看的应用简报，不是节日海报。
 * -------------------------------------------------------------------- */
.entry-content .hw { --hw-amber: #c2600f; --hw-ink: #14160a; }

/* --- 把节奏规则往下重述一层 -------------------------------------------
 * 主题的节奏规则是 `.entry-content > * + *`，只管**直接**子元素。内容一旦
 * 包进 .hw，段落之间就一点间距都没有，挤成一坨。
 * 同样的坑 .mcx-split__body 上已经踩过一次，那儿的注释就写着这句话，
 * 我还是又撞了一遍 —— 所以这段留在这里。
 *
 * ⚠️ 这一块必须排在下面所有组件规则**之前**：它和 .hw-hero / .hw-rule
 *    的选择器权重相同（都是 0,2,0），谁在后面谁生效，而那几个组件的
 *    上下留白是特意调过的，不能被 1.1rem 冲掉。
 * -------------------------------------------------------------------- */
.entry-content .hw > * + * { margin-top: 1.1rem; }
.entry-content .hw > *:first-child { margin-top: 0; }
/* 标题要拿回自己的 2rem —— 上面那条权重比 `.entry-content h2`（0,1,1）高，
   不重述的话标题会缩成和正文一样的间距。 */
.entry-content .hw > h2, .entry-content .hw > h3 { margin-top: 2rem; }
.entry-content .hw-case > * + * { margin-top: .9rem; }
.entry-content .hw-case > *:first-child { margin-top: 0; }

/* --- 开篇暗色带：把三个数字装进容器，顺带承载蛛网 -------------------- */
.entry-content .hw-hero {
  position: relative; overflow: hidden; isolation: isolate;
  /* ⚠️ 不要像 .mcx-rule / .mcx-case 那样破格到 --maxw。
     那个破格会把元素向左伸到左侧「ON THIS PAGE」目录的下面。主题自己的
     .mcx-case 能这么做，是因为它是奶油色底，深色目录文字压上去照样可读；
     这一块是深色底，同样的破格会让目录文字变成深色压深色，几乎看不见。
     所以这里老老实实待在正文栏宽里。 */
  margin: .4rem 0 2rem;
  padding: clamp(1.6rem, 3.6vw, 2.6rem);
  border-radius: var(--r-lg);
  background: linear-gradient(150deg, var(--olive-deep) 0%, var(--hw-ink) 78%);
  color: var(--cream);
}
/* 蛛网挂在右上角，压在内容下面。宽度用 % + clamp 是为了小屏自动收，
   固定 px 会在手机上把整块撑出横向滚动。 */
.entry-content .hw-hero__web {
  position: absolute; top: -14%; right: -6%; width: clamp(150px, 32%, 300px);
  color: var(--avocado); opacity: .34; pointer-events: none; z-index: -1;
}
.entry-content .hw-hero__web svg { width: 100%; height: auto; display: block; }
.entry-content .hw-hero__eyebrow {
  margin: 0 0 .9rem; font-size: .7rem; font-weight: 700; letter-spacing: .17em;
  text-transform: uppercase; color: var(--hw-amber);
}
.entry-content .hw-hero__thesis {
  margin: 0; max-width: 34ch;
  font-family: var(--font-display); font-size: clamp(1.5rem, 3.1vw, 2.15rem);
  line-height: 1.22; font-weight: 600; color: var(--cream); text-wrap: balance;
}

/* --- 数字带 -----------------------------------------------------------
 * 原来直接用 .mcx-facts：它是 flex:1 1 auto，在月饼那篇的半栏里正好，
 * 放到整幅宽度就摊成三段 400px，中间全是空的（客户反馈的正是这个）。
 * 这里改成内容宽 + 固定间距 + 竖线分隔，左对齐 packed。 */
.entry-content .hw-stats {
  display: flex; flex-wrap: wrap; gap: 0 clamp(1.6rem, 4vw, 3rem);
  margin: 1.8rem 0 0; padding: 1.2rem 0 0; list-style: none;
  border-top: 1px solid rgba(254,255,247,.18);
}
.entry-content .hw-stats li { flex: 0 0 auto; position: relative; padding-right: clamp(1.6rem, 4vw, 3rem); }
.entry-content .hw-stats li + li::before {
  content: ""; position: absolute; left: calc(-1 * clamp(1.6rem, 4vw, 3rem) / 2);
  top: .25rem; bottom: .25rem; width: 1px; background: rgba(254,255,247,.18);
}
.entry-content .hw-stats li:last-child { padding-right: 0; }
.entry-content .hw-stats strong {
  display: block; font-family: var(--font-display); font-size: clamp(1.7rem, 3.4vw, 2.3rem);
  line-height: 1; font-weight: 600; color: var(--hw-amber);
}
.entry-content .hw-stats span {
  display: block; margin-top: .3rem; font-size: .74rem; letter-spacing: .06em;
  text-transform: uppercase; color: rgba(254,255,247,.66);
}

/* --- 方向标题：编号用重点色，和正文拉开层级 -------------------------- */
.entry-content .hw-dir { display: flex; align-items: baseline; gap: .7rem; }
.entry-content .hw-dir__n {
  flex: 0 0 auto; font-family: var(--font-display); font-size: .9em;
  font-weight: 700; color: var(--hw-amber); font-variant-numeric: tabular-nums;
}

/* --- 分隔线中间挂一只小蜘蛛 ------------------------------------------
 * 蜘蛛是 <hr> 的兄弟元素（hr 不能有子元素），用负 margin 提上去压在线上。 */
.entry-content .hw-rule {
  width: min(var(--maxw), calc(100vw - 2.5rem));
  margin: 3.2rem 0 2.4rem 50%; transform: translateX(-50%);
  border: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--line), transparent);
}
.entry-content .hw-rule__spider {
  display: block; width: 30px; margin: -3.05rem auto 2.4rem;
  color: var(--olive-soft); opacity: .5;
}
.entry-content .hw-rule__spider svg { width: 100%; height: auto; display: block; }
@media (max-width: 820px) {
  .entry-content .hw-rule { width: auto; margin-left: 0; margin-right: 0; transform: none; }
}

/* 窄屏：数字带改成三等分网格，并撤掉竖分隔线。
   flex 换行时，那条用负 left 定位的分隔线会落到新行的行首，
   看起来像一条没来由的竖杠 —— 网格没有这个问题。 */
@media (max-width: 560px) {
  .entry-content .hw-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; }
  .entry-content .hw-stats li { padding-right: .5rem; }
  .entry-content .hw-stats li + li::before { display: none; }
  .entry-content .hw-stats span { font-size: .66rem; line-height: 1.3; }
}

/* --- 菜品条 ------------------------------------------------------------
 * 图由 JS 从 window.NT_APPS 注入（见 main.js 的 hydrateAppStrips），
 * 不写死在正文里 —— 换成实拍之后文章会自动跟着换。
 *
 * ⚠️ 卡片化的那套样式只加在 .mcx-item--img 上，也就是**真的注入了图**的
 *    那些。之前直接写在 .mcx-item 上，结果没有图的时候胶囊也被套上描边和
 *    平铺奶油底，变成一个个空白方框 —— 而主题原本的样子是柔和绿色渐变、
 *    没有描边。没有照片时就该退回那个样子，而不是退到一个更难看的中间态。 */
.entry-content .hw .mcx-item span { padding: .55rem .5rem .7rem; font-weight: 500; }
.entry-content .hw .mcx-item--img {
  border: 1px solid var(--line); background: var(--cream-2);
  transition: transform .18s ease, box-shadow .18s ease;
  cursor: pointer;
}
.entry-content .hw .mcx-item--img:hover { transform: translateY(-2px); box-shadow: var(--shadow-sm); }
.entry-content .hw .mcx-item--img img { width: 100%; aspect-ratio: 1/1; object-fit: cover; }

/* --- 重点案例卡 ------------------------------------------------------- */
.entry-content .hw-case {
  margin: 1.6rem 0 0; padding: clamp(1.2rem, 3vw, 1.9rem);
  border: 1px solid var(--line); border-left: 3px solid var(--hw-amber);
  border-radius: 0 var(--r-lg) var(--r-lg) 0; background: var(--cream-2);
}
.entry-content .hw-case h3 { margin-top: 0; }

@media (prefers-reduced-motion: reduce) {
  .entry-content .hw .mcx-item--img { transition: none; }
  .entry-content .hw .mcx-item--img:hover { transform: none; }
}

/* ===== 新闻卡片：有徽章但没主图 =========================================
 * tmpl-news.php 一直在给卡片加 .has-badge，但 CSS 里从来没有对应规则 ——
 * 是个留了钩子没接的地方。
 *
 * .nt-badge 是 position:absolute 贴在卡片左上角的：有主图时落在图上，
 * 那是设计意图；没有主图时图区根本不存在，它就直接砸在日期那一行上。
 * 实测：万圣节这篇没配封面时，LATEST 把 “SEPTEMBER” 盖掉了半截。
 *
 * 选择器用 `.nt-badge + .pad`：只有当徽章和内容之间没有 .ph 时才相邻，
 * 正好就是「有徽章、没图」这一种情况，有图的卡片完全不受影响。
 * ---------------------------------------------------------------------- */
.news-card.has-badge > .nt-badge + .pad { padding-top: 2.9rem; }

/* ===== 窄屏：菜品条变成一行可滑动的轮播 ==================================
 * 桌面端保持原来的自适应网格。窄屏下 grid-template-columns 的
 * repeat(auto-fit, minmax(120px,1fr)) 会折成两三行，四条菜品排成 3+1，
 * 最后一行孤零零一个，很难看。
 *
 * 改成 flex + 横向滚动 + scroll-snap：一行显示，触屏原生惯性滑动，
 * 不需要任何轮播库。自动前进由 main.js 的 initAppStripCarousel 负责。
 *
 * 每张宽 62% —— 露出下一张的一角，这是「还能往右滑」唯一的视觉提示；
 * 铺满一整屏的话，用户没有理由知道右边还有东西。
 * ---------------------------------------------------------------------- */
@media (max-width: 700px) {
  .entry-content .hw .mcx-strip {
    display: flex; flex-wrap: nowrap;
    overflow-x: auto; overscroll-behavior-x: contain;
    /* ⚠️ proximity，不要 mandatory。
       mandatory 会在程序化滚动的动画途中把位置重新吸附回起点，
       自动前进因此完全失效 —— 为绕开它写的「关吸附→等停稳→恢复」
       那一套既复杂又不可靠（读到的 scrollLeft 是动画目标值，
       会误判成已经停稳）。proximity 只在滚动自然停下、且离吸附点够近时
       才吸附，不跟程序化滚动抢，手指滑动的手感几乎没有差别。 */
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    /* ⚠️ 不要在这里写 scroll-behavior: smooth。
       它会把 JS 的 scrollLeft 赋值变成浏览器动画，而这个站上那套动画
       和吸附互相打架，实测结果是位置完全不动。
       平滑改由 main.js 里的 rAF 补间自己做，全程可控。 */
  }
  /* 明确表示不要动画的用户：连滚动都不要平滑。
     轮播本身在 JS 里也不会启动，这条只是兜住手动滑动的情形。 */
  @media (prefers-reduced-motion: reduce) {
    .entry-content .hw .mcx-strip { scroll-behavior: auto; }
  }
  .entry-content .hw .mcx-strip::-webkit-scrollbar { display: none; }
  .entry-content .hw .mcx-strip > .mcx-item {
    flex: 0 0 62%; scroll-snap-align: start;
    min-height: 5.2rem; display: grid; place-items: center;
  }
  /* 有图的时候不需要撑最小高度，图本身就是 1:1 */
  .entry-content .hw .mcx-strip > .mcx-item--img { min-height: 0; display: block; }
}

/* --- 海报与实拍 --------------------------------------------------------
 * 客户自己的战役素材：一张概念海报（3:4 竖版）+ 白底实拍。
 * 海报按原比例居中收窄 —— 竖版铺满正文栏会有 1000px 以上高，
 * 把后面的内容整个推出屏幕，和月饼那篇 mc-heroposter 踩的是同一个坑。 */
.entry-content .hw-poster {
  max-width: min(460px, 100%); margin: 1.6rem auto 2rem;
}
.entry-content .hw-poster img {
  width: 100%; height: auto; display: block;
  border-radius: var(--r-md); box-shadow: var(--shadow-md);
}
.entry-content .hw-poster figcaption,
.entry-content .hw-shot figcaption {
  margin-top: .6rem; font-size: .78rem; line-height: 1.5;
  color: var(--olive-soft); text-align: center;
}

/* 实拍：单张铺满栏宽，成对时并排。图本身是白底方图，
   给个浅色底和圆角，免得白图直接贴在奶油底上边界消失。 */
.entry-content .hw-shot { margin: 1.4rem 0 0; }
/* ⚠️ 单张实拍是 1:1 方图，铺满栏宽就是 660px 见方 —— 比 3:4 的海报（封顶 460
 *    宽 = 613 高）还高，主次就反了。所以单张收窄居中，成对的不受影响。 */
.entry-content .hw-shot:not(.hw-shot--pair) {
  max-width: min(540px, 100%); margin-left: auto; margin-right: auto;
}
.entry-content .hw-shot img {
  width: 100%; height: auto; display: block;
  border-radius: var(--r-md); background: var(--cream-2);
}
.entry-content .hw-shot--pair {
  display: grid; grid-template-columns: 1fr 1fr; gap: .8rem;
}
.entry-content .hw-shot--pair figcaption { grid-column: 1 / -1; margin-top: .2rem; }
@media (max-width: 620px) {
  .entry-content .hw-shot--pair { grid-template-columns: 1fr; }
}

/* Single trade_show: on mobile the hero image sits between meta and body copy */
.single-hero .media--mobile { display: none; }
@media (max-width:820px){
	.single-hero .media--desktop { display: none; }
	.single-hero .media--mobile { display: block; margin: 1.4rem 0 .2rem; }
}

/* Single trade_show mobile: stack city / date-booth lines instead of squeezing side by side */
@media (max-width:820px){
	.single-hero .post-meta { flex-direction: column; align-items: flex-start; gap: .45rem; line-height: 1.5; }
}
