/* ===========================================================
   Autonomous Refreshment Services — base styles
   Mobile-first. Design system per CLAUDE.md.
   =========================================================== */

:root{
  /* Brand palette */
  --sage:#5e8267;
  --sage-deep:#48664f;
  --sage-tint:#eef2ee;
  --gray:#a6a6a6;
  --paper:#f7f8f6;
  --ink:#1c2420;
  --ink-soft:#4a544d;
  --line:#dfe4df;
  --white:#ffffff;

  /* Type — Hanken for body; bold-italic system stack stands in for the
     display face until a licensed Bruel Grotesque is wired in. Solid
     fallbacks keep the page intentional if Google Fonts is blocked. */
  --font-body:"Hanken Grotesk",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
  --font-display:"Hanken Grotesk",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;

  --shadow:0 1px 2px rgba(28,36,32,.04),0 8px 24px rgba(28,36,32,.06);
  --shadow-lift:0 2px 4px rgba(28,36,32,.05),0 16px 40px rgba(28,36,32,.1);
  --radius:16px;
}

*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:112px}

body{
  font-family:var(--font-body);
  color:var(--ink);
  background:var(--paper);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
}

.wrap{max-width:1080px;margin:0 auto;padding:0 22px}

/* ---------- Headings & shared bits ---------- */
h1,h2,h3{font-family:var(--font-display);font-style:italic;letter-spacing:-.02em;line-height:1.1}
h1{font-size:clamp(32px,6vw,52px);font-weight:800;max-width:18ch}
h2{font-size:clamp(25px,4vw,36px);font-weight:800;margin-bottom:12px}
h3{font-size:18px;font-weight:800;font-style:normal;letter-spacing:-.01em;margin-bottom:7px}

.eyebrow,.sec-label{
  font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
}
.eyebrow{display:inline-block;color:var(--sage-deep);margin-bottom:18px}
.sec-label{color:var(--sage);margin-bottom:12px}
.sub{font-size:16px;color:var(--ink-soft);max-width:56ch;margin-bottom:32px}

.section{padding:56px 0}
.section-tint{background:linear-gradient(180deg,var(--white),var(--sage-tint))}

/* ---------- Buttons ---------- */
.btn{
  display:inline-block;font-family:inherit;font-weight:800;font-size:15px;
  padding:13px 26px;border-radius:11px;border:1px solid transparent;
  text-decoration:none;cursor:pointer;transition:transform .12s,box-shadow .12s,background .12s;
  text-align:center;
}
.btn:hover{transform:translateY(-2px)}
.btn-primary{background:var(--sage);color:#fff;box-shadow:var(--shadow)}
.btn-primary:hover{background:var(--sage-deep)}
.btn-light{background:#fff;color:var(--sage-deep);box-shadow:var(--shadow)}

/* ---------- Header / nav ---------- */
.site-header{
  position:sticky;top:0;z-index:50;
  background:rgba(247,248,246,.88);backdrop-filter:saturate(150%) blur(10px);
  border-bottom:1px solid var(--line);
}
.header-inner{display:flex;align-items:center;gap:16px;padding:10px 0}
.nav{display:none;gap:26px;margin-left:auto}
.nav a{color:var(--ink-soft);text-decoration:none;font-weight:700;font-size:15px}
.nav a:hover{color:var(--sage-deep)}
.nav-cta{padding:9px 18px;font-size:14px}

/* Nav dropdowns (two-level items) */
.nav-item{position:relative;display:inline-flex;align-items:center}
.nav-parent{color:var(--ink);text-decoration:none;font-weight:700;font-size:15px;transition:color .14s}
.nav-toggle{
  display:inline-flex;align-items:center;justify-content:center;
  background:none;border:0;margin:0;padding:4px 2px 4px 5px;cursor:pointer;color:var(--gray);
  transition:color .14s;
}
.nav-toggle:focus-visible{outline:2px solid var(--sage-deep);outline-offset:2px;border-radius:4px}
.nav-toggle svg{width:13px;height:13px;transition:transform .16s}
.nav-dropdown{
  position:absolute;top:calc(100% + 8px);left:0;z-index:60;
  min-width:220px;margin:0;padding:8px;list-style:none;
  background:var(--white);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-lift);
  opacity:0;visibility:hidden;transform:translateY(6px);
  transition:opacity .15s,transform .15s,visibility .15s;
}
/* Invisible bridge so the cursor can cross the gap without the menu closing */
.nav-dropdown::before{content:"";position:absolute;top:-8px;left:0;right:0;height:8px}
.nav-item:hover > .nav-dropdown,
.nav-item:focus-within > .nav-dropdown,
.nav-item.open > .nav-dropdown{opacity:1;visibility:visible;transform:translateY(0)}
.nav-item:hover .nav-parent,
.nav-item:focus-within .nav-parent,
.nav-item.open .nav-parent,
.nav-item:hover .nav-toggle,
.nav-item:focus-within .nav-toggle,
.nav-item.open .nav-toggle{color:var(--sage)}
.nav-item:hover .nav-toggle svg,
.nav-item:focus-within .nav-toggle svg,
.nav-item.open .nav-toggle svg{transform:rotate(180deg)}
.nav-dropdown li{margin:0}
.nav-dropdown a{
  display:block;padding:9px 12px;border-radius:8px;white-space:nowrap;
  font-size:14px;font-weight:700;color:var(--ink-soft);text-decoration:none;
}
.nav-dropdown a:hover{background:#ecefe9;color:var(--sage)}

/* Logo lockup */
.brand{display:inline-flex;align-items:center;font-weight:800;font-size:18px;text-decoration:none;letter-spacing:-.01em}
.brand-sage{color:var(--sage)}
.brand-div{color:var(--gray);margin:0 8px;font-weight:400}
.brand-gray{color:var(--gray);font-weight:700;font-size:15px}
.brand-logo{display:block;height:80px;width:auto;max-width:64vw}

/* ---------- Hero ---------- */
.hero{
  background:linear-gradient(165deg,#fbfcfb 0%,var(--sage-tint) 100%);
  border-bottom:1px solid var(--line);
  padding:56px 0 60px;
}
.hero .lede{font-size:clamp(17px,2.2vw,19px);color:var(--ink-soft);max-width:50ch;margin-bottom:30px}
.hero-actions{display:flex;flex-wrap:wrap;gap:12px}

/* ---------- Industries hero (image-backed) ----------
   Reusable across all four Industries pages. Naming follows the .ind-card
   family already used on the Industries overview page.

   Deliberate split from Services: Services pages keep the plain sage-gradient
   .hero; Industries pages get a photograph. Pages opt in by CLASSING BOTH:
   class="hero ind-hero". That is the whole graceful-degradation strategy, the
   fallback is not a reimplementation of .hero, it IS .hero, inherited. With no
   media layer the page renders exactly as a standard sage-gradient hero with
   dark text, which is what Offices, Manufacturing, and Warehouses ship as
   until they have photography.

   The light-on-dark overrides hang off the general sibling combinator
   (.ind-hero-media ~ .ind-hero-content). No :has(), no per-page modifier
   class. If the media div is absent the selectors simply never match and the
   dark-text default stands; there is no way for an author to add a photo and
   forget to flip the text, or to omit the photo and be left with white text
   on a pale gradient. The <img> also carries an onerror that removes the whole
   media layer, so a 404 collapses to the identical no-image path at runtime.

   Technique (absolute media layer, scrim, relatively positioned content) is
   borrowed from .bevi-hero, but every value here is this site's, not Bevi's:
   the scrim is the ink token at 58% matching .svc-photo-band, not Bevi navy.

   min-height clamp sits between .svc-bevi-band's 320/460 (headline + line +
   button) and .bevi-hero's 460/660 (full brand takeover): this carries
   breadcrumb, eyebrow, h1, and lede. It is a MIN, so a long h1 wrapping at
   375px grows the band rather than clipping it. */
.ind-hero{
  position:relative;
  overflow:hidden;
  min-height:clamp(380px,42vw,540px);
  display:flex;
  flex-direction:column;
  justify-content:flex-end;
}
/* Inert to input so the layer can never trap scroll or swallow a tap. */
.ind-hero-media{position:absolute;inset:0;z-index:0;pointer-events:none}
.ind-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
/* Ink at 58%, same value as .svc-photo-band: tuned to hold text against an
   unknown photograph rather than one specific frame. */
.ind-hero-scrim{position:absolute;inset:0;background:rgba(28,36,32,.58)}
.ind-hero-content{position:relative;z-index:1;width:100%}
/* No hero-actions on this component, so the lede is the last element. */
.ind-hero .lede{margin-bottom:0}

/* Light-on-dark, applied only when a media layer precedes the content. */
.ind-hero-media ~ .ind-hero-content h1{color:#fff}
.ind-hero-media ~ .ind-hero-content .lede{color:rgba(255,255,255,.92)}
.ind-hero-media ~ .ind-hero-content .eyebrow{color:var(--sage-tint)}
.ind-hero-media ~ .ind-hero-content .breadcrumb li{color:rgba(255,255,255,.75)}
.ind-hero-media ~ .ind-hero-content .breadcrumb a{color:rgba(255,255,255,.92)}
.ind-hero-media ~ .ind-hero-content .breadcrumb li+li::before{color:rgba(255,255,255,.5)}
.ind-hero-media ~ .ind-hero-content .breadcrumb [aria-current="page"]{color:#fff}

/* ---------- Spotlight (What we do — alternating image/text) ---------- */
.spotlight{display:flex;flex-direction:column;gap:44px;margin-top:6px}
.spot{display:grid;grid-template-columns:1fr;gap:22px;align-items:center}
.spot-media{
  position:relative;margin:0;border-radius:var(--radius);overflow:hidden;
  background:var(--sage-tint);box-shadow:var(--shadow);
}
.spot-img{display:block;width:100%;height:auto;aspect-ratio:4 / 3;object-fit:cover}
/* Supporting portrait photo, stacked into the corner of the main image. */
.spot-inset{
  position:absolute;right:12px;bottom:12px;width:30%;max-width:150px;
  border:4px solid var(--paper);border-radius:10px;overflow:hidden;
  box-shadow:var(--shadow-lift);line-height:0;
}
.spot-inset img{display:block;width:100%;height:auto;aspect-ratio:3 / 4;object-fit:cover}
.spot-body h3{font-size:clamp(20px,2.6vw,25px);margin-bottom:11px}
.spot-pipe{color:var(--gray);font-weight:400;font-style:normal;margin:0 .38em}
.spot-body p{font-size:16px;color:var(--ink-soft);max-width:54ch}

@media(min-width:820px){
  .spotlight{gap:84px}
  .spot{grid-template-columns:1fr 1fr;gap:60px}
  /* Alternate sides — image moves right on reversed blocks for rhythm */
  .spot.reverse .spot-media{order:2}
}

/* ---------- Services feeder (homepage, no heading) ----------
   Copy first, then the button: the button is the destination, so it's
   the last thing the eye lands on. Centered, not left-aligned like the
   rest of the homepage, and on a solid var(--sage-tint) fill (the same
   token the compare component's active-card state uses), not the
   .section-tint gradient used elsewhere. That's deliberate: this is the
   one tinted pause on the homepage, and a flat fill reads as a distinct
   "band" rather than another instance of the gradient treatment used
   for ordinary alternating sections.

   padding:72px flat (not the responsive 56px->72px most .section
   instances use) matches .svc-cta-section's closing-band padding, the
   site's existing precedent for "generous, deliberate pause" rather
   than a standard content section. ID specificity beats both the base
   .section rule and its 860px breakpoint override, so this stays 72px
   at every width instead of dropping to 56px on mobile.

   .sub needs no override here: copy now comes before the button, its
   default margin-bottom:32px already provides the gap to it, and
   600px is tighter than .sub's own 56ch max-width, so it still governs.

   FLAG: this makes the section tinted, and "Why ARS" directly below it
   is already .section-tint. That puts two tinted bands back to back,
   which the rest of the site treats as a hard no (see the Smart Stores
   build notes: tinted sections never touch). Left as is, not silently
   reassigned. See homepage report for what this looks like rendered:
   .section-tint is a white-to-sage-tint gradient, so the seam is this
   solid fill meeting a band that starts white, an abrupt tint-to-white
   jump before the gradient fades back to tint by its own bottom. */
#services-feeder{background:var(--sage-tint);padding:72px 0}
#services-feeder .wrap{display:flex;flex-direction:column;align-items:center;text-align:center}
#services-feeder .sub{max-width:600px;margin-left:auto;margin-right:auto}

/* Button gets more presence without becoming a new component: still
   .btn.btn-primary underneath (sage fill, white label, same hover
   lift), just larger padding, a stronger shadow, and a trailing arrow
   that nudges right on hover. 20px/40px roughly 1.5x the standard
   13px/26px, both already-used scale values, not one-offs. Rest shadow
   is --shadow-lift (already the site's "stronger" shadow token); hover
   goes deeper still, using the same shadow color the rest of the site
   uses, just scaled up, since var(--shadow-lift) has no larger sibling
   token to reach for. */
.btn-feeder{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:20px 40px;
  box-shadow:var(--shadow-lift);
}
.btn-feeder:hover{
  box-shadow:0 4px 8px rgba(28,36,32,.08),0 20px 48px rgba(28,36,32,.14);
}
.btn-feeder:focus-visible{outline:2px solid var(--sage-deep);outline-offset:3px}
.btn-feeder-arrow{width:18px;height:18px;flex-shrink:0;transition:transform .12s}
.btn-feeder:hover .btn-feeder-arrow{transform:translateX(3px)}

/* ---------- Cards (Why ARS) ---------- */
.cards{display:grid;grid-template-columns:1fr;gap:16px}
.card{
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  padding:24px;box-shadow:var(--shadow);
}
.card p{font-size:14px;color:var(--ink-soft)}

/* input[type=range] below is retained though its only current consumer,
   the calculator, is retired: nalley-proposal.html (standalone, out of
   scope for this cleanup) still uses a native range input and relies on
   this styling. Do not remove without checking that page. */
input[type=range]{
  -webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:6px;
  background:var(--line);outline:none;cursor:pointer;
}
input[type=range]:focus-visible{outline:2px solid var(--sage-deep);outline-offset:4px}
input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;appearance:none;width:24px;height:24px;border-radius:50%;
  background:var(--sage);border:3px solid #fff;box-shadow:0 1px 5px rgba(0,0,0,.25);
  cursor:pointer;transition:transform .1s;
}
input[type=range]::-webkit-slider-thumb:active{transform:scale(1.15)}
input[type=range]::-moz-range-thumb{
  width:24px;height:24px;border-radius:50%;background:var(--sage);border:3px solid #fff;
  box-shadow:0 1px 5px rgba(0,0,0,.25);cursor:pointer;
}

/* ---------- Contact ---------- */
.contact-wrap{display:grid;grid-template-columns:1fr;gap:32px}
.contact-direct{font-size:14px;color:var(--ink-soft);margin-top:-12px;margin-bottom:20px}
.contact-direct a{color:var(--sage-deep);font-weight:700;text-decoration:none}
.contact-direct a:hover{text-decoration:underline}

/* /contact/ page only. The homepage splits intro copy and the form into
   two .contact-wrap columns; this page puts that copy in its .hero
   instead, so the form has no sibling column to sit beside. Centering it
   at a readable width (rather than letting it stretch to the full
   1080px .wrap) keeps it from reading like an oversized two-up grid with
   nothing to balance it. */
.contact-page-form{max-width:640px;margin:0 auto}

/* Mobile-first: one column by default, two from 680px up (see the
   responsive block). Previously this was 1fr 1fr at every width with no
   collapse, which cramped the fields on a phone and would be worse still
   inside the narrow modal this component now also feeds. */
.lead-form{
  display:grid;grid-template-columns:1fr;gap:16px;
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  padding:26px;box-shadow:var(--shadow);
}
.field{display:flex;flex-direction:column;gap:6px}
/* .field sets display:flex, which beats the UA stylesheet's
   [hidden]{display:none}. Without this the conditional "Other, please
   specify" field would stay visible (and tabbable) while marked hidden. */
.field[hidden]{display:none}
.field-full{grid-column:1 / -1}
.field label{font-size:13px;font-weight:700;color:var(--ink)}
.field input,.field select,.field textarea{
  font-family:inherit;font-size:15px;color:var(--ink);
  padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:var(--paper);
  width:100%;
}
.field input:focus,.field select:focus,.field textarea:focus{
  outline:none;border-color:var(--sage);background:#fff;
}
/* max-height caps the drag: without it the textarea can be pulled to any
   height, which breaks the layout of the modal this component also feeds.
   320px is roughly 12 lines, well past the 4-row default. */
.field textarea{resize:vertical;max-height:320px}
.form-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.form-status{font-size:14px;font-weight:700;margin:0}
.form-status.ok{color:var(--sage-deep)}
.form-status.err{color:#b4452f}
/* Secondary line under the success message (the phone number). */
.form-status-sub{display:block;margin-top:4px;font-weight:400;color:var(--ink-soft)}
.form-status-sub a{color:var(--sage-deep);font-weight:700;text-decoration:none}
.form-status-sub a:hover{text-decoration:underline}
.form-status a{color:inherit}

/* Turnstile mount. Managed mode renders a VISIBLE widget, and it arrives
   asynchronously, so its box is reserved up front: without the min-height the
   submit button jumps down the moment the widget lands.

   73px is MEASURED, not assumed. Cloudflare documents the "normal" widget as
   300x65, but it actually renders 72.8px tall here, and reserving the
   documented 65 left an 8px jump. The value is stable across widget widths,
   so it holds on every surface: the widget fills the grid column and only its
   height matters. The grid gap supplies the spacing, matching every other
   field. The widget itself is never restyled; it lives in a cross-origin
   iframe behind a closed shadow root and fighting it is a losing game. */
.form-turnstile{min-height:73px}

/* Honeypot wrapper: present in the DOM and fillable by a bot, invisible to
   humans. position:absolute also keeps it out of the form's grid flow.
   Not display:none and not type="hidden": bots skip both. */
.form-hp{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;
}

/* ---------- Footer ---------- */
.site-footer{border-top:1px solid var(--line);background:var(--white)}
.footer-cols{display:grid;grid-template-columns:1fr;gap:32px;padding:48px 0 36px}
.footer-logo{display:block;height:76px;width:auto;max-width:80vw}
.footer-brand{display:flex;flex-direction:column;gap:10px}
.footer-tagline{font-size:14px;color:var(--ink-soft)}
.footer-col{display:flex;flex-direction:column;gap:8px}
.footer-col-label{font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--gray);margin-bottom:2px}
.footer-col a{font-size:14px;font-weight:700;color:var(--ink-soft);text-decoration:none}
.footer-col a:hover{color:var(--sage-deep)}
.footer-email{color:var(--sage-deep) !important}
.footer-email:hover{color:var(--sage) !important}
.footer-bottom{border-top:1px solid var(--line);padding:16px 0}
.footer-fine{font-size:12px;color:var(--gray)}
@media(min-width:680px){.footer-cols{grid-template-columns:1fr auto auto;gap:56px;align-items:start}}

/* ---------- Stub / scaffolding pages (placeholder treatment) ---------- */
.stub-grid{display:grid;grid-template-columns:1fr;gap:18px;margin-top:8px}
.stub-grid + .stub-grid{margin-top:26px}
.stub-block{
  border:1px dashed var(--gray);border-radius:var(--radius);
  background:var(--white);padding:22px;
}
.stub-tag{
  display:inline-block;margin-bottom:10px;padding:3px 10px;border-radius:999px;
  font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;
  color:var(--sage-deep);background:var(--sage-tint);
}
.stub-block p{font-size:15px;color:var(--ink-soft)}
.stub-block h3 a{color:var(--ink);text-decoration:none}
.stub-block h3 a:hover{color:var(--sage-deep)}
.stub-img{
  display:flex;align-items:center;justify-content:center;text-align:center;
  aspect-ratio:4 / 3;padding:24px;border-radius:var(--radius);
  border:2px dashed #8c8c8c;background:var(--gray);
  color:var(--ink);font-weight:700;font-size:15px;
}

@media(min-width:680px){
  .stub-grid{grid-template-columns:1fr 1fr}
}

/* ---------- Industry template ---------- */
/* Fixed hero ratio, identical on every industry page. */
.industry-hero-media{aspect-ratio:16 / 7;margin-top:28px}
/* Spotlight placeholders sit in the shared .spot-media frame at the fixed 4:3 stub ratio. */
.spot-media > .stub-img{border:none;border-radius:0;width:100%;height:100%}

/* Industry overview page — photo-led card grid */
/* auto-fill with minmax naturally produces 2 columns at desktop and 1 on mobile
   without a hardcoded breakpoint. 380px min lets two columns fit comfortably
   at 860px+ (2×380 + gap = ~784px, well within the 1036px wrap). */
.ind-cards{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(min(100%,380px),1fr));
  gap:24px;
}
.ind-card{
  position:relative;display:flex;flex-direction:column;
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);overflow:hidden;
  transition:transform .12s,box-shadow .12s;
}
.ind-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lift)}
/* Photo slot — 3:2 ratio, uniform across all cards. Placeholder tint until real photos land. */
.ind-card-img{
  position:relative;
  aspect-ratio:3 / 2;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  text-align:center;padding:20px;
  background:var(--sage-tint);
  font-size:13px;font-weight:700;color:var(--ink-soft);
}
.ind-card-img img{
  position:absolute;inset:0;width:100%;height:100%;
  display:block;object-fit:contain;background:var(--white);
}
/* Header images (sub-tier cards): fill the frame edge-to-edge. */
.ind-card-img--cover{background:var(--white)}
.ind-card-img--cover img{object-fit:cover}
/* Variant for images that are near-square (fit them inside frame rather than crop). */
.ind-card-img--scale-contain img{object-fit:contain}
/* Industries We Serve card photos: fill frame, no whitespace. */
.ind-card-img img[src*="manufacturing-main"],
.ind-card-img img[src*="dealership-main"],
.ind-card-img img[src*="office-main"],
.ind-card-img img[src*="warehouse-main"]{object-fit:cover}
/* Machine card image area: fixed frame, padded mat so source-image whitespace
   differences don't make machines appear at different scales.
   Scoped to ind-cards--machines so industry/service cards are unaffected. */
.ind-cards--machines .ind-card-img{
  height:380px;
  aspect-ratio:unset;
  background:var(--white);
  padding:0;
}
.ind-cards--machines .ind-card-img img{
  position:static;
  inset:auto;
  max-width:calc(100% - 40px);
  max-height:340px;
  width:auto;
  height:auto;
  background:transparent;
}
.ind-card-body{padding:20px 24px 24px;flex:1}
.ind-card-body h3{margin-bottom:8px}
/* Only the industry name is a link — no underline bleed into body copy. */
.ind-card-link{
  color:var(--ink);text-decoration:none;
  transition:color .14s;
}
/* ::after stretches the link hitbox to cover the whole card so the full card is tappable. */
.ind-card-link::after{content:"";position:absolute;inset:0}
.ind-card-link:hover{color:var(--sage)}
.ind-card-body p{
  font-size:15px;color:var(--ink-soft);
  margin:0;font-style:normal;text-decoration:none;
}

/* Sub-tier card machine-count cue (Coffee Service's two category cards
   today; portable to any future service that uses subTierCardHTML).
   aria-hidden and pointer-events:none: this card's real link is
   .ind-card-link (the heading), stretched over the whole card via its
   ::after above, not a wrapping <a>. A second real, focusable link here
   would be a duplicate interactive element with no ::after of its own,
   so clicks landing on this text (which paints on top of that stretched
   pseudo-element) would silently swallow the click instead of
   navigating. pointer-events:none lets them fall through to the real
   link underneath; the visual affordance is enough; the card itself
   stays the single click target, matching .ind-card-link:hover for
   color so it reads as the same link language, not a second style. */
.ind-card-cta{
  display:inline-flex;align-items:center;gap:6px;
  color:var(--sage-deep);font-weight:700;font-size:14px;
  pointer-events:none;
}
.ind-card-cta-arrow{width:14px;height:14px;flex-shrink:0;transition:transform .12s}

/* ---------- Coffee Service: category cards (Super Automatic / Batch Brew) ----------
   Everything below is scoped to #coffee-tiers so it touches nothing on the
   Industries or Services overview pages, which reuse the same .ind-card /
   .ind-card-body / .ind-cards classes and keep their existing hover lift.

   32px gap below the instructional line matches .sub's own default
   margin-bottom, the site's established "text intro, then a grid" gap.

   Card lift removed (transform:none, shadow back to the resting token):
   consistent with the compare component elsewhere on the site, cards stay
   put and only the link cue responds. cursor:pointer is explicit since
   the click target is a stretched pseudo-element, not the card element
   itself, so the browser's native anchor-cursor doesn't automatically
   read as "this whole box is clickable" without it.

   .ind-card-body becomes a flex column so .ind-card-cta can push to the
   bottom via margin-top:auto (same technique as .svc-compare-cta), which
   is what keeps both cards' links aligned across the row even though
   Batch Brew's description wraps to two lines and Super Automatic's
   doesn't. grid-auto-rows:1fr equalizes card height at mobile too, where
   the two cards stack into separate grid rows and would otherwise size
   to their own shorter/taller content independently.

   Focus: the real link is .ind-card-link, which visually wraps only the
   heading. Its own default focus ring would draw tight around just that
   text, not the card, so it's suppressed in favor of :focus-within on
   the card itself, the same sage-deep outline used everywhere else on
   the site, but sized to the whole card the way Tab really should. */
#coffee-tiers .service-intro-body{margin-bottom:32px}
#coffee-tiers .ind-cards{grid-auto-rows:1fr}
#coffee-tiers .ind-card{cursor:pointer}
#coffee-tiers .ind-card:hover{transform:none;box-shadow:var(--shadow)}
#coffee-tiers .ind-card:hover .ind-card-cta-arrow{transform:translateX(3px)}
#coffee-tiers .ind-card-body{display:flex;flex-direction:column}
#coffee-tiers .ind-card-cta{margin-top:auto;padding-top:14px}
#coffee-tiers .ind-card-link:focus-visible{outline:none}
#coffee-tiers .ind-card:focus-within{outline:2px solid var(--sage-deep);outline-offset:3px}

/* Equipment machine card grid — used by service-template.js and subtier-template.js.
   NOTE: with 2-3 cards the auto-fill grid may feel sparse at wide viewports;
   tighten minmax() or cap max columns once the full roster is confirmed. */
.equip-machine-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:20px;margin-top:32px}
.equip-machine-card{
  display:flex;flex-direction:column;overflow:hidden;
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);text-decoration:none;color:inherit;
  transition:transform .12s,box-shadow .12s;
}
.equip-machine-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lift)}
.equip-machine-card:focus-visible{outline:2px solid var(--sage-deep);outline-offset:3px}
.equip-machine-card-img{border:0;border-radius:0;aspect-ratio:4 / 3}
.equip-machine-card-body{padding:22px;display:flex;flex-direction:column;flex:1}
.equip-machine-card-body h3{margin-bottom:8px}
.equip-machine-card-body p{font-size:15px;color:var(--ink-soft)}

/* ---------- Machine detail template ---------- */
.machine-hero-grid{display:grid;grid-template-columns:1fr;gap:26px;align-items:center}
.machine-fit{font-size:15px;font-weight:700;color:var(--ink-soft);margin:0 0 22px}
.machine-h2{font-size:clamp(22px,3vw,30px);margin-bottom:18px}

/* Machine image gallery: main photo floats directly on the page background,
   no card/box/border. Fixed aspect ratio keeps every machine page uniform. */
.machine-hero-media{display:flex;flex-direction:column;gap:20px}
.machine-gallery-main{
  aspect-ratio:4 / 3;min-height:0;
  display:flex;align-items:center;justify-content:center;
}
.machine-gallery-main img{
  width:100%;height:100%;object-fit:contain;display:block;
  transition:opacity .2s ease;
}
/* Dot navigator: each button is a full 44px touch target (accessible tap
   size on mobile) with a small 9px visible dot centered inside it via
   ::before, so the row reads as tightly-spaced small dots while still
   being comfortably tappable. */
.machine-gallery-dots{display:flex;align-items:center;justify-content:center}
.machine-gallery-dot{
  width:44px;height:44px;padding:0;border:0;background:none;
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;
}
.machine-gallery-dot::before{
  content:"";width:9px;height:9px;border-radius:50%;
  background:var(--gray);transition:background .15s,transform .15s;
}
.machine-gallery-dot:hover::before{background:var(--sage)}
.machine-gallery-dot.is-active::before{background:var(--sage);transform:scale(1.2)}
.machine-gallery-dot:focus-visible{outline:2px solid var(--sage-deep);outline-offset:2px}

.machine-benefits{list-style:none;display:grid;gap:12px;max-width:60ch}
.machine-benefits li{position:relative;padding-left:30px;font-size:16px;color:var(--ink-soft)}
.machine-benefits li::before{
  content:"";position:absolute;left:0;top:5px;width:18px;height:18px;border-radius:50%;
  background:var(--sage-tint) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%235e8267' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center no-repeat;
}

.machine-specs{
  max-width:640px;background:var(--white);border:1px solid var(--line);
  border-radius:var(--radius);overflow:hidden;
}
.spec-row{
  display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:14px 18px;
  border-bottom:1px solid var(--line);
}
.spec-row:last-child{border-bottom:0}
.spec-row dt{font-weight:700;color:var(--ink)}
.spec-row dd{margin:0;color:var(--ink-soft)}

/* Subsection heading spacing inside a machine page: one shared value keeps
   the Variants / Features / Ideal for blocks on an even rhythm. */
.machine-subsec{margin-top:56px}

/* Water/ice variants list: plain bulleted list (not chips, not a paragraph),
   kept visually distinct from the Ideal-for chips. Last section on the page,
   full width, right before the closing CTA. */
.machine-variants-list{list-style:none;display:grid;gap:12px;max-width:70ch;margin:0}
.machine-variants-list li{position:relative;padding-left:20px;font-size:16px;color:var(--ink);line-height:1.5}
.machine-variants-list li::before{
  content:"";position:absolute;left:0;top:9px;width:6px;height:6px;
  border-radius:50%;background:var(--sage);
}

/* Water/ice hero row: Features & Benefits sits beside the machine image
   (not Variants, which moved to its own section further down the page).
   Text column gets the wider share; image is capped so it doesn't tower
   over a short feature stack. The text column aligns to the top (feature
   cards read top-down, like a list), but the image itself is centered
   within the row's height, since the feature stack (4-5 cards) is almost
   always taller than one product photo. Pinning the image to the top would
   leave a dead gap below it; centering it turns that space into intentional
   breathing room instead. Scoped modifier; coffee's hero row is unaffected. */
.machine-hero-grid.machine-hero-grid--waterice{align-items:start}
.machine-hero-grid--waterice .machine-hero-media{align-self:center}
.machine-hero-grid--waterice .machine-gallery-main{max-height:340px}

/* Water/ice features: scannable icon-card grid. Same icon-box treatment as
   .svc-step-icon (How It Works) for a consistent icon language site-wide.
   Two-column when this grid runs full width (e.g. if reused elsewhere); when
   the card count is odd the final card spans the full row, so the grid never
   shows a dangling gap at any count from 1 to 6. Inside the water/ice hero
   row specifically, the column is narrower than the full content width, so
   it stays a single column there regardless of viewport (see override below). */
.machine-features{display:grid;grid-template-columns:1fr;gap:18px}
@media(min-width:680px){
  .machine-features{grid-template-columns:1fr 1fr}
  .machine-feature:last-child:nth-child(odd){grid-column:1 / -1}
}
.machine-hero-grid--waterice .machine-features{grid-template-columns:1fr}
.machine-hero-grid--waterice .machine-feature:last-child:nth-child(odd){grid-column:auto}
/* Icon sits beside the text, not above it: cards stay compact and short
   values (e.g. "Chewblet nugget") no longer leave tall empty card space.
   The card DOM is flat (icon, h3, p), so the icon spans both text rows. */
.machine-feature{
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  padding:20px 22px;box-shadow:var(--shadow);
  display:grid;grid-template-columns:40px 1fr;column-gap:16px;
  align-items:start;align-content:start;
}
.machine-feature-icon{
  grid-row:1 / span 2;
  width:40px;height:40px;flex-shrink:0;
  background:var(--sage-tint);border-radius:8px;
  display:flex;align-items:center;justify-content:center;
  color:var(--sage);
}
.machine-feature h3,.machine-feature p{grid-column:2}
.machine-feature-icon svg{width:22px;height:22px;stroke:currentColor}
.machine-feature h3{font-size:15px;margin:2px 0 6px}
.machine-feature p{font-size:14px;color:var(--ink-soft);margin:0;line-height:1.55}

/* Water/ice ideal-for chips: locked tags rendered as-is, in stored order. */
.machine-idealfor{display:flex;flex-wrap:wrap;gap:10px}
.machine-chip{
  display:inline-block;padding:7px 16px;border-radius:999px;
  background:var(--sage-tint);color:var(--sage-deep);
  font-size:14px;font-weight:600;
  text-decoration:none;transition:background .15s,color .15s;
}
/* Chips linking to an Industries We Serve page (an <a>, not a <span>) get a
   hover state; plain-text chips (no matching industry page yet) are inert. */
a.machine-chip:hover{background:var(--sage);color:#fff}
a.machine-chip:focus-visible{outline:2px solid var(--sage-deep);outline-offset:2px}

@media(min-width:820px){
  .machine-hero-grid{grid-template-columns:.9fr 1.1fr;gap:48px}
  .machine-hero-grid--waterice{grid-template-columns:1.1fr .9fr}
}

/* ---------- Breadcrumb ---------- */
.breadcrumb{padding:0 0 20px}
.breadcrumb ol{display:flex;flex-wrap:wrap;gap:2px 0;list-style:none}
.breadcrumb li{display:flex;align-items:center;font-size:13px;color:var(--ink-soft)}
.breadcrumb li+li::before{content:"/";padding:0 7px;color:var(--gray)}
.breadcrumb a{color:var(--sage-deep);font-weight:700;text-decoration:none}
.breadcrumb a:hover{text-decoration:underline}
.breadcrumb [aria-current="page"]{font-weight:700;color:var(--ink)}

/* ---------- Services & Solutions overview — 5-up card grid ---------- */
/* 1-col mobile → 2-col at 500px → 3-col at 820px (5 cards: 3+2 last row) */
.svc-cards{display:grid;grid-template-columns:1fr;gap:18px;margin-top:8px}
@media(min-width:500px){.svc-cards{grid-template-columns:1fr 1fr}}
@media(min-width:820px){.svc-cards{grid-template-columns:repeat(3,1fr)}}

/* ---------- Service intro / positioning block ---------- */
/* Self-contained section, insertable on any service page between hero and sub-tier grid. */
.service-intro{padding-bottom:0}
.service-intro-body{
  font-size:clamp(17px,2vw,20px);color:var(--ink-soft);
  max-width:60ch;line-height:1.6;
}
.service-intro-body + .service-intro-body{margin-top:16px}

/* ---------- Full-width photo overlay band (interior content band, NOT a hero) ----------
   Photo sits as a background on the band; an ink scrim keeps overlaid text legible.

   Sizing: background-size is always "cover", never a fixed percentage. A
   percentage only sizes one axis (width), leaving the other to auto-scale by
   the image's own aspect ratio, so at a viewport shape unlike the source
   photo's, the image falls short of the container's height (or width) and
   leaves a gray/empty gap. "cover" scales whichever axis is needed so the
   image always fills the box completely, at any viewport size, guaranteed.

   Height: min-height scales proportionally with viewport width via clamp(),
   instead of a fixed pixel height (which looks arbitrary at in-between
   widths) or letting height be driven entirely by reflowing text (which
   jumps unpredictably as lines wrap at different breakpoints). It's a
   min-height, not a fixed height, so if text still needs more room than the
   clamped floor at very narrow widths (more line-wraps), the band grows to
   fit it rather than clipping. flex + align-items centers the text block
   vertically within whatever height the band ends up at. */
.svc-photo-band{
  position:relative;
  display:flex;align-items:center;
  min-height:clamp(240px,24vw,380px);
  padding:40px 0;
  background:url('/images/water-ice/water-ice-header-wide.png') center right/cover no-repeat;
}
.svc-photo-band::before{
  content:"";position:absolute;inset:0;
  background:rgba(28,36,32,.58);
}
.svc-photo-band .wrap{position:relative;width:100%}
.svc-photo-band .service-intro-body{color:#fff;max-width:55%;text-align:left}
/* Stub label: visible marker until the real photo lands; delete with the photo swap. */
.svc-photo-band-stub{
  display:inline-block;margin-bottom:14px;
  font-size:12px;font-weight:700;letter-spacing:.08em;
  color:rgba(255,255,255,.75);border:1px dashed rgba(255,255,255,.45);
  border-radius:6px;padding:4px 10px;
}

/* ---------- Bevi Hydration cross-sell band (Bevi band component) ----------
   Built on top of .svc-photo-band's scrim/layout/sizing approach (cover +
   clamped min-height), but keeps its OWN background image, position, and a
   taller min-height clamp since this band carries more content (headline,
   subline, and a button vs. the intro band's single paragraph). */
.svc-bevi-band.section{
  text-align:center;
  min-height:clamp(320px,30vw,460px);
  background:url('/images/water-ice/bevi-footer-panel.png') center top 30%/cover no-repeat;
}
.svc-bevi-band-eyebrow{
  font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  color:var(--sage);margin-bottom:14px;
}
.svc-bevi-band h2{color:#fff;margin-bottom:14px}
.svc-bevi-band .service-intro-body{max-width:52ch;margin:0 auto 28px}

/* ---------- Featured systems strip (single-row compact cards) ----------
   One row of 4 equal-width cards at >=860px; 2x2 from 560-859px (a single row
   turns cramped below ~860px); vertical stack below 560px. Reuses .ind-card. */
.svc-systems-row{display:grid;grid-template-columns:1fr;gap:20px;margin-top:32px}
.svc-systems-subtext{font-size:16px;color:var(--ink-soft);max-width:70ch;line-height:1.6;margin-top:32px}
@media(min-width:560px){.svc-systems-row{grid-template-columns:1fr 1fr}}
@media(min-width:860px){.svc-systems-row{grid-template-columns:repeat(4,1fr)}}
.svc-systems-row .ind-card-img{aspect-ratio:4 / 3}
.svc-systems-row .ind-card-body{padding:16px 18px 20px}
.svc-systems-row .ind-card-body .sec-label{color:var(--gray);margin-bottom:6px}
.svc-systems-row .ind-card-body h3{margin-bottom:6px}
.svc-systems-row .ind-card-body p{font-size:14px}

/* ---------- Service empty state ---------- */
.svc-empty-state{font-size:15px;color:var(--ink-soft);font-style:italic;padding:40px 0}

/* ---------- Service page image placeholder (3:2, used until real photos land) ---------- */
/* Drop inside .spot-media; inherits border-radius + overflow from the wrapper. */
.svc-img-placeholder{
  aspect-ratio:3/2;
  display:flex;align-items:center;justify-content:center;
  text-align:center;padding:24px;
  background:var(--gray);
  color:var(--ink);font-weight:700;font-size:14px;line-height:1.4;
}

/* ---------- Service page photo (3:2, fills .spot-media frame) ---------- */
.svc-photo{
  display:block;width:100%;aspect-ratio:3/2;object-fit:cover;
}

/* ---------- Check-mark bullet list (reusable across service pages) ---------- */
.svc-check-list{list-style:none;display:grid;gap:12px;max-width:60ch;margin-top:16px}
.svc-check-list li{position:relative;padding-left:30px;font-size:16px;color:var(--ink-soft)}
.svc-check-list li::before{
  content:"";position:absolute;left:0;top:5px;width:18px;height:18px;border-radius:50%;
  background:var(--sage-tint) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%235e8267' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center no-repeat;
}

/* ---------- How it works -- 4-step card strip ---------- */
.svc-steps{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:32px}
@media(min-width:680px){.svc-steps{grid-template-columns:repeat(4,1fr)}}
.svc-step{
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  padding:24px;box-shadow:var(--shadow);
}
.svc-step-icon{
  width:40px;height:40px;flex-shrink:0;
  background:var(--sage-tint);border-radius:8px;
  margin-bottom:16px;
  display:flex;align-items:center;justify-content:center;
  color:var(--sage);
}
.svc-step-icon svg{width:22px;height:22px;stroke:currentColor}
.svc-step h3{font-size:16px;margin-bottom:8px}
.svc-step p{font-size:14px;color:var(--ink-soft);margin:0}
/* Additive: the rule above zeroes ALL margins, so a second paragraph in a step
   card would butt straight against the first. Every existing .svc-steps row is
   single-paragraph and is unaffected by this. 12px matches .svc-faq-answer
   p + p, the site's only other stacked-paragraph rule and the nearest match in
   type size (15px there, 14px here). The 16px on
   .service-intro-body + .service-intro-body belongs to a much larger face
   (17-20px) and would read as too loose at this scale. */
.svc-step p + p{margin-top:12px}

/* ---------- Five-step variant of the above ----------
   Purely additive. The base grid is a hard repeat(4,1fr) at 680px, so a
   fifth child orphans onto its own row; this re-declares the track count
   at the same breakpoint. Nothing below touches .svc-steps, .svc-step,
   or .svc-step-icon, which every other service page depends on.

   Mobile drops to a single column rather than inheriting the base 2-up.
   Five items over two tracks leaves a 2+2+1 layout whose last card sits
   alone beside an empty cell, which reads as a missing sixth step rather
   than the end of a sequence. One column keeps a numbered process in a
   straight 1-to-5 read. */
.svc-steps--five{grid-template-columns:1fr}
@media(min-width:680px){
  .svc-steps--five{grid-template-columns:repeat(5,1fr)}
}

/* Title-only cards. The h3's bottom margin exists to separate it from a
   body paragraph; with no body it becomes dead space under the last line
   and the card reads truncated. Zeroing it leaves the base 24px card
   padding symmetric top and bottom, so no padding override is needed. */
.svc-steps--five .svc-step h3{margin-bottom:0}

/* ---------- Two-step variant of the above ----------
   Purely additive, same technique as .svc-steps--five. Two children in the
   base repeat(4,1fr) grid leaves a ~528px empty void at 1440px, roughly half
   the row, which reads as failed content rather than a deliberate pair.
   Re-declaring 2 tracks at the same 680px breakpoint the base grid already
   uses fills the row with both cards at proportional width. Mobile inherits
   the base grid's single column, same as every other .svc-steps variant. */
.svc-steps--two{grid-template-columns:1fr}
@media(min-width:680px){
  .svc-steps--two{grid-template-columns:repeat(2,1fr)}
}

/* ---------- Step-card outbound link ----------
   A real, focusable <a>, not the aria-hidden/pointer-events:none decorative
   span used on the Coffee Service category cards (.ind-card-cta): THOSE cards
   are themselves a stretched link to a same-named subpage, so a second real
   link would be a duplicate target. These step cards are plain, non-clickable
   containers whose title is descriptive copy, not a page name (e.g. "Smart
   Coolers and Smart Stores" does not equal the destination page "Smart
   Stores"), so the link has to be its own real, distinct target.

   margin-top:auto bottom-pins the link so it lines up across a row even when
   body copy wraps to different lengths, matching the technique already used
   by .svc-compare-cta and .ind-card-cta. Requires the card itself to be a
   flex column; scoped per-section (not added to the shared .svc-step rule)
   so pages that don't use this link are structurally untouched. */
.svc-step-link{
  display:inline-flex;align-items:center;gap:6px;
  margin-top:auto;padding-top:14px;
  color:var(--sage-deep);font-weight:700;font-size:14px;
  text-decoration:none;
}
.svc-step-link:hover{color:var(--sage)}
.svc-step-link:focus-visible{outline:2px solid var(--sage-deep);outline-offset:2px;border-radius:2px}
.svc-step-link-arrow{width:14px;height:14px;flex-shrink:0;transition:transform .12s}
.svc-step-link:hover .svc-step-link-arrow{transform:translateX(3px)}

/* ---------- Inline lead-in / mid-sentence link (running prose) ----------
   Offices and Corporate Section 3 links a service straight from the bolded
   lead-in or a phrase mid-paragraph, rather than a link row under the
   prose (six services would read as a link farm). Not .svc-step-link: that
   component is a standalone block with an arrow icon and bottom-pin
   positioning, both wrong mid-sentence. This just recolors text that is
   already bold (inherited from the surrounding <strong>) to sage-deep, the
   same color .svc-step-link uses, with underline reserved for hover so the
   rest state doesn't add a second visual treatment on top of the bold. */
.svc-lead-link{color:var(--sage-deep);text-decoration:none}
.svc-lead-link:hover{text-decoration:underline}
.svc-lead-link:focus-visible{outline:2px solid var(--sage-deep);outline-offset:2px;border-radius:2px}

/* When .svc-step-link appears as a direct child of .wrap (below a grid),
   override the flex-based positioning and display it as a block with top margin. */
.wrap > .svc-step-link{
  display:block;margin-top:24px;padding-top:0
}

/* Auto Dealerships: the two sections whose step cards carry a .svc-step-link
   need flex-column on the card so margin-top:auto can bottom-pin the link.
   Scoped to these two section ids rather than the shared .svc-step rule, so
   every other page's step cards (which stack h3+p in normal block flow) are
   structurally untouched. */
#grab-and-go .svc-step,
#water-ice .svc-step{display:flex;flex-direction:column}

/* ---------- Local roaster / partner logo strip ---------- */
/* Placeholder classes kept for future service pages that may not yet have real logos. */
.svc-partner-logos-ph{display:flex;flex-wrap:wrap;gap:20px;margin-top:36px}
.svc-partner-logo-ph{
  width:200px;height:100px;flex-shrink:0;
  border:2px dashed var(--gray);border-radius:10px;
  background:var(--white);
  display:flex;align-items:center;justify-content:center;
  text-align:center;padding:14px;
  font-size:11px;font-weight:700;color:var(--gray);line-height:1.4;
}

/* Real roaster logos — transparent PNGs float directly on section background */
.svc-roaster-lead{font-size:17px;color:var(--ink-soft);max-width:60ch;line-height:1.6;margin-bottom:40px}
.svc-roaster-logos{
  display:flex;flex-wrap:wrap;justify-content:center;gap:56px;
}
/* Name sits close to logo so they read as one unit */
.svc-roaster-logo{display:flex;flex-direction:column;align-items:center;gap:8px}
/* Both 600x300 canvas — fix height so both render at identical vertical extent */
.svc-roaster-img{height:90px;width:auto;display:block}
.svc-roaster-name{font-size:13px;font-weight:700;color:var(--ink-soft);letter-spacing:.02em}

/* ---------- FAQ accordion ---------- */
.svc-faq{margin-top:36px;max-width:720px}
.svc-faq-item{border-bottom:1px solid var(--line)}
.svc-faq-item:first-child{border-top:1px solid var(--line)}
.svc-faq-item summary{
  list-style:none;
  display:flex;justify-content:space-between;align-items:center;gap:16px;
  padding:20px 0;cursor:pointer;
  font-weight:700;font-size:16px;color:var(--ink);
  transition:color .14s;
}
.svc-faq-item summary::-webkit-details-marker{display:none}
.svc-faq-item summary::after{
  content:"+";
  font-size:22px;font-weight:400;line-height:1;
  color:var(--sage);flex-shrink:0;
  display:block;
  transition:transform .2s;
}
.svc-faq-item[open]>summary{color:var(--sage-deep)}
.svc-faq-item[open]>summary::after{transform:rotate(45deg)}
.svc-faq-answer{padding:0 0 20px;font-size:15px;color:var(--ink-soft);max-width:66ch;line-height:1.6}
.svc-faq-answer p + p{margin-top:12px}
/* Open entrance: fade + slight slide down */
.svc-faq-item[open] .svc-faq-answer{animation:faq-in .22s ease both}
@keyframes faq-in{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}
/* Close exit: JS adds .is-closing, removes [open] after 210ms */
.svc-faq-answer.is-closing{animation:faq-out .2s ease both}
@keyframes faq-out{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-5px)}}

/* ---------- Service page closing CTA block ---------- */
.svc-cta-section{
  background:var(--ink);
  padding:72px 0;
  text-align:center;
}
.svc-cta-section h2{color:#fff}
.svc-cta-sub{
  font-size:17px;color:rgba(255,255,255,.6);
  max-width:52ch;margin:14px auto 32px;
}

/* Optional phone link for a .svc-cta-section band (Auto Dealerships uses
   this; the six plain service CTAs don't). Sits below .btn-light as a
   secondary action, not a second button: text link, not button-shaped, sized
   down from the button. Brighter than .svc-cta-sub's 60%-white body copy
   (85%) so it doesn't read as inert paragraph text, with an underline-style
   border rather than text-decoration so the rest state still looks
   deliberate rather than like a stray caption. var(--sage-deep), the site's
   usual link color (e.g. .contact-direct a), fails contrast against
   var(--ink) and isn't used here. */
.svc-cta-phone{
  display:block;width:fit-content;margin:20px auto 0;
  font-size:15px;font-weight:700;
  color:rgba(255,255,255,.85);
  text-decoration:none;
  border-bottom:1px solid rgba(255,255,255,.35);
}
.svc-cta-phone:hover{color:#fff;border-bottom-color:rgba(255,255,255,.7)}
.svc-cta-phone:focus-visible{outline:2px solid #fff;outline-offset:4px;border-radius:2px}

/* ===========================================================
   Responsive — scale up from mobile
   =========================================================== */
@media(min-width:680px){
  .cards{grid-template-columns:1fr 1fr}
  .lead-form{grid-template-columns:1fr 1fr}
}

@media(min-width:860px){
  .nav{display:flex;margin-left:auto}
  .section{padding:72px 0}
  .cards-3{grid-template-columns:repeat(3,1fr)}
  .contact-wrap{grid-template-columns:0.85fr 1.15fr;align-items:start}
}

@media(max-width:480px){
  .brand-logo{height:60px}
}

/* Honor reduced-motion preferences */
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .btn:hover{transform:none}
}

/* ===========================================================
   Bevi Hydration page — Bevi brand system (scoped: this page only).

   This page DELIBERATELY departs from the ARS house style to be a
   standout partner page in Bevi's OWN brand:
     - Headlines: Corben, regular weight ALWAYS (never bold), sentence
       case, upright (no italic).
     - Body / overlines / subheads: Plus Jakarta Sans. Overlines are
       bold, all caps, wide tracking (~0.16em).
     - Palette: Bevi Blues (Ice Cube -> Navy).
   Everything is scoped to .bevi-page, and typography to .bevi-page main,
   so the shared header/footer and the rest of the site are unchanged.

   ONE approved exception (applied in a later phase): the "Why Bevi with
   ARS" section uses the ARS palette (sage/gray/paper/ink) as a
   deliberate signal that that section is about ARS, not Bevi.

   PHASE 1 = foundation + empty scaffold only. Section-specific styling
   (two-system table, flavor grid, experience steps, etc.) lands in
   later phases.
   =========================================================== */

/* ---- Palette + type tokens (scoped) ---- */
.bevi-page{
  /* Bevi Blues */
  --ice-cube:#D6E5FF;
  --glacier:#8FBDFF;
  --bevi-blue:#246EFF;
  --sky:#0851CF;
  --cobalt:#002E7E;
  --navy:#00173E;

  /* ARS palette — reserved for the single "Why Bevi with ARS" section */
  --ars-sage:#5e8267;
  --ars-gray:#a6a6a6;
  --ars-bg:#f7f8f6;
  --ars-ink:#1c2420;

  /* Bevi type faces (serif display + sans body). Solid fallbacks keep the
     page intentional if Google Fonts is blocked. */
  --bevi-head:"Corben",Georgia,"Times New Roman",serif;
  --bevi-body:"Plus Jakarta Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;

  background:var(--white);
}

/* ---- Typography ----
   Scoped to `main` so the injected header/footer keep the site face. */
.bevi-page main{font-family:var(--bevi-body);color:var(--navy)}
.bevi-page main p{font-family:var(--bevi-body);color:var(--navy)}

/* Headlines: Corben regular, sentence case, upright. Overrides the site's
   bold-italic h1-h3 for this page only. */
.bevi-page main h1,
.bevi-page main h2,
.bevi-page main h3{
  font-family:var(--bevi-head);
  font-weight:400;               /* Corben is never bold on this page */
  font-style:normal;
  text-transform:none;           /* sentence case, never all-caps headings */
  letter-spacing:normal;
  color:var(--navy);
}
.bevi-page main h1{font-size:clamp(34px,6vw,56px);line-height:1.08;max-width:20ch;margin-bottom:16px}
.bevi-page main h2{font-size:clamp(26px,4vw,40px);line-height:1.15;margin-bottom:14px}
.bevi-page main h3{font-size:clamp(19px,2.2vw,23px);line-height:1.22;margin-bottom:8px}

/* Overline / subhead: Plus Jakarta Sans bold, all caps, wide tracking. */
.bevi-page .bevi-overline{
  display:inline-block;
  font-family:var(--bevi-body);
  font-weight:700;
  font-size:12px;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--bevi-blue);
  margin-bottom:16px;
}

/* Breadcrumb + primary button tuned to the Bevi palette on this page. */
.bevi-page main .breadcrumb a{color:var(--sky)}
.bevi-page main .btn-primary{background:var(--bevi-blue)}
.bevi-page main .btn-primary:hover{background:var(--sky)}

/* ---- Section shells ---- */
.bevi-page .bevi-section{padding:56px 0;position:relative;overflow:hidden}
@media(min-width:860px){.bevi-page .bevi-section{padding:88px 0}}

/* Header band: plain/near-white utility band above the hero video, holding
   the breadcrumb and the Bevi lockup. Matches the Water & Ice / Coffee
   Service ".hero" band's padding and border-bottom exactly, so this page's
   top-of-page spacing reads consistent with the rest of the site even
   though everything below it switches to the Bevi brand system. */
.bevi-page .bevi-header-band{
  background:var(--white);
  border-bottom:1px solid var(--line);
  padding:56px 0 60px;
}
.bevi-page .bevi-header-logo{max-width:200px;aspect-ratio:220 / 64;margin:4px 0 0}

/* Hero: full-bleed 15s brand video loop behind the copy, with an Ice Cube
   gradient underneath as a pre-asset fallback (in case playback is ever
   blocked). A min-height keeps the banner tall enough to read as a video
   hero even before content pushes it open. Flex column + justify-content:
   flex-end anchors the heading/subline to the bottom-left, over the
   footage, instead of the top. */
.bevi-page .bevi-hero{
  background:linear-gradient(180deg,var(--ice-cube),var(--white));
  padding:44px 0 64px;
  min-height:clamp(460px,58vw,660px);
  display:flex;
  flex-direction:column;
  justify-content:flex-end;
}

/* Video/poster background layer: absolutely filled, z-indexed behind the
   text, and inert to input (pointer-events:none) so it can never trap
   scroll or swallow a tap on mobile. */
.bevi-page .bevi-hero-media{
  position:absolute;inset:0;z-index:0;
  pointer-events:none;
}
.bevi-page .bevi-hero-video{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;display:block;background:transparent;
}
/* Navy/Cobalt scrim over the video keeps hero text legible against any
   footage without relying on a specific frame being dark or light. */
.bevi-page .bevi-hero-scrim{
  position:absolute;inset:0;
  background:linear-gradient(160deg,rgba(0,46,126,.62),rgba(0,23,62,.72));
}
.bevi-page .bevi-hero-content{position:relative;z-index:1}

/* Hero text sits on the dark scrim, so it needs its own light-on-dark
   overrides (the site-standard .lede and this page's default navy body
   copy are both tuned for a light background). */
.bevi-page .bevi-hero h1{color:#fff}
.bevi-page .bevi-hero .lede{
  color:rgba(255,255,255,.92);font-family:var(--bevi-body);
  max-width:52ch;margin-bottom:0;
}
.bevi-page .bevi-hero .bevi-overline{color:var(--ice-cube)}

/* Bevi logotype slot in the hero: on this dark/video background it is the
   white logotype ALONE (never the combined lockup, which is white-
   background only). Placeholder chrome here needs its own light variant
   since the default .bevi-ph is tuned for light sections. */
.bevi-page .bevi-hero-logo{
  max-width:180px;aspect-ratio:220 / 56;margin:4px 0 22px;padding:12px;
}
.bevi-page .bevi-hero .bevi-ph{
  color:#fff;background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.55);
}
.bevi-page .bevi-hero .bevi-ph small{color:rgba(255,255,255,.85)}

/* ---- Intro band: matter-of-fact spec-sheet strip, not narrative prose ----
   Bottom padding is trimmed from the shared section default: this band's
   own content is a single light line, so the standard section padding reads
   as an oversized gap before the next heading. Top padding (the gap after
   the hero) is left at the shared value. */
.bevi-page .bevi-intro{padding-bottom:32px}
@media(min-width:860px){.bevi-page .bevi-intro{padding-bottom:44px}}
.bevi-page .bevi-lead{
  font-family:var(--bevi-body);font-weight:800;
  font-size:clamp(20px,2.6vw,26px);color:var(--navy);margin-bottom:20px;
}
.bevi-page .bevi-spec-row{
  display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;
  font-family:var(--bevi-body);font-size:15px;font-weight:600;color:rgba(0,23,62,.55);
}
.bevi-page .bevi-spec-row .bevi-spec-dot{color:var(--glacier);font-weight:400}

/* Lead-in paragraph: still used by the Flavor & Enhancement and Why Bevi
   with ARS sections, just no longer by Why ARS (its duplicate copy was
   removed from that section, not from this shared rule). */
.bevi-page .bevi-lead-in{
  font-family:var(--bevi-body);font-size:16px;line-height:1.6;
  color:var(--navy);max-width:64ch;margin-top:4px;
}

/* ---- Why ARS: heading + check-mark bullets on the left, lifestyle photo
   top-aligned on the right (scrolls normally, no sticky). ---- */
.bevi-page .bevi-why-layout{display:grid;grid-template-columns:1fr;gap:36px}
@media(min-width:860px){
  .bevi-page .bevi-why-layout{grid-template-columns:minmax(0,55fr) minmax(0,45fr);gap:56px;align-items:start}
}
.bevi-page .bevi-why-img{
  display:block;width:100%;aspect-ratio:3/2;object-fit:cover;border-radius:16px;
}
.bevi-page .bevi-check-list{
  list-style:none;display:grid;gap:14px;max-width:62ch;margin-top:22px;
}
.bevi-page .bevi-check-list li{
  position:relative;padding-left:32px;
  font-family:var(--bevi-body);font-size:16px;line-height:1.55;color:var(--navy);
}
.bevi-page .bevi-check-list li strong{color:var(--navy);font-weight:700}
.bevi-page .bevi-check-list li::before{
  content:"";position:absolute;left:0;top:4px;width:20px;height:20px;border-radius:50%;
  background:var(--ice-cube) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23246EFF' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center no-repeat;
}

/* Screen-reader-only utility: gives icon-only content (the comparison
   table's check/dash badges) a textual equivalent without visible text. */
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;
}

/* ---- Two Systems: model cards (photo + positioning copy), side by side ---- */
.bevi-page .bevi-models{
  display:grid;grid-template-columns:1fr;gap:32px;
  margin-top:28px;margin-bottom:44px;
}
@media(min-width:680px){.bevi-page .bevi-models{grid-template-columns:1fr 1fr}}

/* Machine gallery: primary image + thumbnail buttons to swap angles */
.bevi-page .bevi-model-gallery{margin-bottom:16px}
.bevi-page .bevi-model-gallery-main{
  background:var(--white);border:1px solid var(--ice-cube);border-radius:14px;
  overflow:hidden;padding:20px;display:flex;align-items:center;justify-content:center;
  aspect-ratio:3 / 4;
}
.bevi-page .bevi-model-gallery-main img{
  max-width:100%;max-height:100%;width:auto;height:auto;display:block;object-fit:contain;
}
.bevi-page .bevi-model-gallery-thumbs{
  display:flex;gap:10px;margin-top:12px;
}
.bevi-page .bevi-model-thumb{
  flex:1;aspect-ratio:1;border:2px solid var(--glacier);border-radius:8px;
  background:var(--white);padding:4px;cursor:pointer;overflow:hidden;
  display:flex;align-items:center;justify-content:center;transition:all .2s;
}
.bevi-page .bevi-model-thumb img{max-width:100%;max-height:100%;object-fit:contain}
.bevi-page .bevi-model-thumb:hover{border-color:var(--bevi-blue)}
.bevi-page .bevi-model-thumb.is-active{border-color:var(--bevi-blue);border-width:3px}

.bevi-page .bevi-model-media{max-width:none;margin-top:0}
.bevi-page .bevi-model h3{margin-top:20px;margin-bottom:8px;color:var(--navy)}
.bevi-page .bevi-model p{
  font-family:var(--bevi-body);font-size:15px;line-height:1.6;color:var(--navy);
}

/* Capability comparison table. Plain semantic <table>; boolean rows use the
   check/dash badge pair in Bevi Blues, spec-value rows (slot counts, screen
   size, color options) render as plain text. NO pricing row, ever. */
.bevi-page .bevi-compare-wrap{overflow-x:auto;margin-top:8px}
.bevi-page .bevi-compare{
  width:100%;border-collapse:collapse;min-width:560px;
  font-family:var(--bevi-body);
  background:var(--white);border:1px solid var(--ice-cube);border-radius:14px;
  overflow:hidden;
}
.bevi-page .bevi-compare th,
.bevi-page .bevi-compare td{
  padding:14px 18px;text-align:center;border-bottom:1px solid var(--ice-cube);
  font-size:15px;
}
.bevi-page .bevi-compare thead th{
  font-family:var(--bevi-head);font-weight:400;font-size:17px;
  color:var(--navy);background:var(--ice-cube);
}
.bevi-page .bevi-compare .bevi-compare-feature{text-align:left}
.bevi-page .bevi-compare tbody th{
  text-align:left;font-family:var(--bevi-body);font-weight:700;font-size:14px;
  color:var(--navy);background:rgba(214,229,255,.22);
}
.bevi-page .bevi-compare tbody td{color:var(--navy);font-weight:600}
.bevi-page .bevi-compare tbody tr:last-child th,
.bevi-page .bevi-compare tbody tr:last-child td{border-bottom:0}

.bevi-page .bevi-check-badge,
.bevi-page .bevi-dash-badge{
  display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:26px;border-radius:50%;
}
.bevi-page .bevi-check-badge{background:var(--ice-cube)}
.bevi-page .bevi-check-badge svg{width:14px;height:14px;stroke:var(--bevi-blue);stroke-width:3;fill:none}
.bevi-page .bevi-dash-badge{background:rgba(0,23,62,.07)}
.bevi-page .bevi-dash-badge svg{width:14px;height:14px;stroke:var(--glacier);stroke-width:3;fill:none}

/* ---- Bevi Experience: 4-step drink-ordering walkthrough ----
   Distinct from the later "How It Works" service-process section. Two
   columns at desktop width: steps read as a plain divided list (no card
   boxes) on the left, the machine touchscreen sits top-aligned in the right
   column and scrolls normally with the page. Steps 1 and 3-4 carry an
   illustrative option row, plain inline text, not a control, every option
   rendered identically. */
.bevi-page .bevi-xlayout{display:grid;grid-template-columns:1fr;gap:36px;margin-top:28px}
@media(min-width:860px){
  .bevi-page .bevi-xlayout{grid-template-columns:minmax(0,55fr) minmax(0,45fr);gap:56px}
}

.bevi-page .bevi-xstep{padding:22px 0;border-top:1px solid var(--ice-cube)}
.bevi-page .bevi-xstep:first-child{padding-top:0;border-top:none}
.bevi-page .bevi-xstep-head{display:flex;align-items:baseline;gap:10px;margin-bottom:8px}
.bevi-page .bevi-xstep-num{
  flex-shrink:0;font-family:var(--bevi-head);font-weight:400;
  font-size:15px;color:var(--sky);
}
.bevi-page .bevi-xstep h3{color:var(--navy);font-size:18px;margin:0}
.bevi-page .bevi-xstep p{
  font-family:var(--bevi-body);font-size:14.5px;line-height:1.6;color:var(--navy);margin:0;
}
.bevi-page .bevi-xstep-opts{
  margin-top:12px;font-family:var(--bevi-body);font-size:14.5px;
  line-height:1.6;color:var(--navy);
}

/* Right column: top-aligned, scrolls normally with the page. Sized to fill
   the column comfortably so the touchscreen detail reads clearly. */
.bevi-page .bevi-xshot-img{
  display:block;max-width:480px;height:auto;
  margin:0 auto;width:100%;object-fit:contain;
}

/* UI feature items: light supporting text describing the screen above them,
   stacked, smaller and quieter than the step copy, muted (not a link color)
   so nothing here reads as clickable, no card treatment. */
.bevi-page .bevi-xfeatures{margin-top:24px}
.bevi-page .bevi-xfeatures p{
  font-family:var(--bevi-body);font-size:13.5px;font-weight:500;color:rgba(0,23,62,.55);
  margin:0 0 8px;
}
.bevi-page .bevi-xfeatures p:last-child{margin-bottom:0}

/* Closing CTA (Phase 1 scaffold uses Bevi Blue field; refined later). */
.bevi-page .bevi-cta{background:linear-gradient(160deg,var(--cobalt),var(--navy));text-align:center}
.bevi-page .bevi-cta h2{color:#fff}

/* ---- Scaffold placeholder chrome ----
   PHASE 1: every empty section and media slot shows a clearly-labeled,
   obviously-unfinished block so nothing reads as done. Removed as each
   section is populated in later phases. */
.bevi-page .bevi-ph{
  border:2px dashed var(--glacier);
  border-radius:14px;
  padding:20px 22px;
  margin-top:14px;
  font-family:var(--bevi-body);
  font-size:13px;font-weight:700;letter-spacing:.01em;line-height:1.5;
  color:var(--sky);
  background:rgba(214,229,255,.30);
}
.bevi-page .bevi-ph--copy{max-width:62ch}
.bevi-page .bevi-ph--media{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;gap:6px;margin-top:18px;
  color:var(--cobalt);background:rgba(143,189,255,.18);border-color:var(--glacier);
}
.bevi-page .bevi-ph--media small{
  display:block;font-weight:600;letter-spacing:.02em;color:var(--sky);opacity:.85;
}
/* On the dark CTA field, keep the placeholder legible. */
.bevi-page .bevi-cta .bevi-ph{
  margin-left:auto;margin-right:auto;color:#eaf1ff;
  background:rgba(255,255,255,.08);border-color:rgba(214,229,255,.5);
}

/* ---- Flavor & Enhancement showcase ---- */

/* Sub-heading for each part of the mega-section (tier headings, BeviBoosts,
   Quality and dietary), Corben to match the page's heading language. */
.bevi-page .bevi-subhead{
  font-family:var(--bevi-head);font-weight:400;font-style:normal;
  font-size:clamp(19px,2.2vw,23px);color:var(--navy);
  margin-top:44px;margin-bottom:4px;
}
.bevi-page .bevi-subhead:first-of-type{margin-top:32px}

.bevi-page .bevi-flavor-tier{margin-top:36px}
.bevi-page .bevi-tier-note{
  font-family:var(--bevi-body);font-size:14px;color:var(--sky);
  margin-top:6px;margin-bottom:4px;
}

/* Flavor icon grid: labeled placeholder icon slots until the real BeviWaters
   icon set lands. Compact white cards on a faint Ice Cube border, wraps to
   more columns as width allows. Real <button>s so tap/hover highlight is
   native, no JS required. */
.bevi-page .bevi-flavor-grid{
  display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:16px;
}
@media(min-width:560px){.bevi-page .bevi-flavor-grid{grid-template-columns:repeat(3,1fr)}}
@media(min-width:900px){.bevi-page .bevi-flavor-grid{grid-template-columns:repeat(4,1fr)}}
.bevi-page .bevi-flavor-grid--compact{grid-template-columns:repeat(2,1fr)}
@media(min-width:560px){.bevi-page .bevi-flavor-grid--compact{grid-template-columns:repeat(4,1fr)}}

.bevi-page .bevi-flavor{
  display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;
  background:var(--white);border:1.5px solid var(--ice-cube);border-radius:14px;
  padding:16px 10px;font:inherit;
  cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;
  transition:border-color .15s,transform .1s,box-shadow .15s;
}
.bevi-page .bevi-flavor:active{transform:scale(.96);border-color:var(--bevi-blue)}
.bevi-page .bevi-flavor:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
@media(hover:hover){
  .bevi-page .bevi-flavor:hover{border-color:var(--glacier);box-shadow:0 6px 16px rgba(0,46,126,.08)}
}
.bevi-page .bevi-flavor-icon{
  width:52px;height:52px;flex-shrink:0;
  display:block;object-fit:contain;
}
.bevi-page .bevi-flavor span{font-size:13px;font-weight:700;color:var(--navy);line-height:1.3}

.bevi-page .bevi-flavor-note{
  margin-top:24px;font-family:var(--bevi-body);font-size:14px;line-height:1.6;
  color:var(--sky);max-width:70ch;
}

/* BeviBoosts: 4 cards, icon + name + one line. */
.bevi-page .bevi-enh-grid{display:grid;grid-template-columns:1fr;gap:16px;margin-top:20px}
@media(min-width:680px){.bevi-page .bevi-enh-grid{grid-template-columns:repeat(2,1fr)}}
.bevi-page .bevi-enh{
  display:flex;gap:16px;align-items:flex-start;text-align:left;width:100%;
  background:var(--white);border:1px solid var(--ice-cube);border-radius:14px;padding:20px;
  font:inherit;color:inherit;cursor:pointer;
  -webkit-tap-highlight-color:transparent;touch-action:manipulation;
  transition:border-color .15s,transform .1s,box-shadow .15s;
}
.bevi-page .bevi-enh:active{transform:scale(.99);border-color:var(--bevi-blue)}
.bevi-page .bevi-enh:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
@media(hover:hover){
  .bevi-page .bevi-enh:hover{border-color:var(--glacier);box-shadow:0 6px 16px rgba(0,46,126,.08)}
}
.bevi-page .bevi-enh-icon{
  width:44px;height:44px;flex-shrink:0;
  display:block;object-fit:contain;
}
.bevi-page .bevi-enh-name{font-weight:700;font-size:16px;color:var(--navy);margin-bottom:6px;display:block}
.bevi-page .bevi-enh-desc{font-family:var(--bevi-body);font-size:14px;line-height:1.55;color:var(--navy)}
.bevi-page .bevi-enh-availability{font-size:12px;color:var(--sky)}

/* Quality and dietary: GF/V/U badge icon slots, plus plain text chips. */
.bevi-page .bevi-dietary-badges{display:flex;flex-wrap:wrap;gap:20px;margin-top:18px}
.bevi-page .bevi-dietary-badge{display:flex;flex-direction:column;align-items:center;gap:8px;width:76px}
.bevi-page .bevi-badge-icon{
  width:48px;height:48px;object-fit:contain;
}
.bevi-page .bevi-dietary-badge span{
  font-family:var(--bevi-body);font-size:12px;font-weight:600;color:var(--navy);text-align:center;
}
.bevi-page .bevi-dietary-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:18px}
.bevi-page .bevi-dietary-chip{
  display:inline-block;padding:8px 16px;border-radius:999px;
  background:var(--ice-cube);color:var(--sky);
  font-family:var(--bevi-body);font-size:13px;font-weight:700;letter-spacing:.01em;
}

/* Functional blends: small callout tying BeviPop + an enhancement to
   BeviSport/BeviEnergy, distinct from the flavor tiers above (no grid, no
   icon tiles, just a named heading + one line of context). */
.bevi-page .bevi-functional-callout{
  margin-top:28px;padding:18px 20px;border-radius:14px;
  background:rgba(214,229,255,.30);border:1px solid var(--ice-cube);
  max-width:70ch;
}
.bevi-page .bevi-functional-callout h4{
  font-family:var(--bevi-head);font-weight:400;font-style:normal;
  font-size:16px;color:var(--navy);margin:0 0 6px;
}
.bevi-page .bevi-functional-callout p{
  font-family:var(--bevi-body);font-size:14px;line-height:1.6;
  color:var(--sky);margin:0;
}

/* ---- Why Bevi with ARS: ARS-palette differentiator band ----
   Austin-approved exception: this ONE section switches from Bevi Blues to
   ARS's own palette (sage/gray/paper/ink) as a deliberate signal that it is
   about ARS, not Bevi. Corben + Plus Jakarta Sans stay in place; only the
   color system changes, so the shift reads as a clean palette swap, not a
   different page. */
.bevi-page .bevi-ars-panel{background:var(--ars-bg)}
.bevi-page .bevi-ars-panel h2{color:var(--ars-ink)}
.bevi-page .bevi-ars-panel .bevi-lead-in{color:var(--ars-ink)}
.bevi-page .bevi-ars-panel .bevi-check-list li{color:var(--ars-ink)}
.bevi-page .bevi-ars-panel .bevi-check-list li strong{color:var(--ars-ink)}
.bevi-page .bevi-ars-panel .bevi-check-list li::before{
  background:var(--sage-tint) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%235e8267' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center no-repeat;
}

/* ---- How It Works: reuses the site's .svc-steps card pattern, recolored
   to Bevi Blues (icon chip + border only; h3/p already inherit Corben/
   Jakarta + navy from the page-wide main rules). ---- */
.bevi-page .svc-step{border-color:var(--ice-cube)}
.bevi-page .svc-step-icon{background:var(--ice-cube);color:var(--bevi-blue)}

/* ---- FAQ: reuses the site's .svc-faq accordion pattern, recolored to
   Bevi Blues. summary/answer set color explicitly in the base rules, so
   the page's inherited navy needs an explicit override here. ---- */
.bevi-page .svc-faq-item{border-color:var(--ice-cube)}
.bevi-page .svc-faq-item:first-child{border-color:var(--ice-cube)}
.bevi-page .svc-faq-item summary{color:var(--navy)}
.bevi-page .svc-faq-item summary::after{color:var(--bevi-blue)}
.bevi-page .svc-faq-item[open]>summary{color:var(--sky)}
.bevi-page .svc-faq-answer{color:var(--sky)}

/* ---- Closing CTA: text needs light-on-dark overrides against the Cobalt/
   Navy field (the page-wide main rules default to navy text, which would
   vanish here). ---- */
.bevi-page .bevi-cta p{color:rgba(255,255,255,.88);max-width:56ch;margin:0 auto 28px}

/* The site header (position:sticky + backdrop-filter, its own GPU compositing
   layer) can paint above a position:fixed overlay regardless of z-index in
   this browser's compositor. Confirmed by testing: lowering z-index, and
   separately stripping position/backdrop-filter, both left the header
   visually on top of the scrim despite every computed value being correct.
   Rather than keep fighting a layer-ordering quirk with more stacking
   properties, remove the ambiguity outright: the header is fully hidden
   for as long as a card is on screen (open through its close animation),
   which is visually identical to "covered by the scrim" from the header
   never being visible either way, and is restored the instant no card is
   open. Focus is trapped in the dialog regardless, so the header was never
   reachable while a card is open anyway. */
.bevi-page.bevi-modal-open .site-header{visibility:hidden}

/* ---- Flavor & enhancement detail cards ----
   A centered dialog over a navy scrim on desktop; a full-screen sheet on
   mobile. Content is injected on demand by the page script. The modal shell
   never scrolls; its inner body does, so the close control stays put while
   long nutrition panels scroll on small screens. ---- */
.bevi-page .bevi-modal-overlay{
  position:fixed;inset:0;z-index:2000;
  display:flex;align-items:center;justify-content:center;padding:24px;
  background:rgba(0,23,62,.55);
  /* Motion: scrim + card fade via overlay opacity; card scale/drift via the
     dialog transform below. Only opacity + transform animate. */
  opacity:0;transition:opacity 220ms cubic-bezier(0.16,1,0.3,1);
}
.bevi-page .bevi-modal-overlay[hidden]{display:none}
.bevi-page .bevi-modal-overlay.is-open{opacity:1}
.bevi-page .bevi-modal-overlay.is-closing{transition-duration:170ms}

.bevi-page .bevi-modal{
  position:relative;display:flex;flex-direction:column;
  width:100%;max-width:560px;max-height:86vh;
  background:var(--white);border-radius:18px;overflow:hidden;
  box-shadow:0 24px 60px rgba(0,23,62,.35);
  /* Desktop open motion: scale up from 0.94 with a small upward drift. */
  transform:scale(.94) translateY(12px);
  transition:transform 220ms cubic-bezier(0.16,1,0.3,1);
}
.bevi-page .bevi-modal-overlay.is-open .bevi-modal{transform:none}
.bevi-page .bevi-modal-overlay.is-closing .bevi-modal{transition-duration:170ms}
.bevi-page .bevi-modal-body{
  flex:1 1 auto;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;
  padding:28px;
}
.bevi-page .bevi-modal-close{
  position:absolute;top:16px;right:16px;z-index:2;
  width:44px;height:44px;border:none;border-radius:50%;
  background:rgba(214,229,255,.75);color:var(--sky);
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;
  transition:background .15s;
}
.bevi-page .bevi-modal-close svg{width:20px;height:20px}
@media(hover:hover){.bevi-page .bevi-modal-close:hover{background:var(--ice-cube)}}
.bevi-page .bevi-modal-close:focus-visible{outline:2px solid var(--sky);outline-offset:2px}

/* Card content */
.bevi-page .bevi-card-top{display:flex;align-items:center;gap:16px;padding-right:52px;margin-bottom:14px}
.bevi-page .bevi-card-icon{width:56px;height:56px;flex-shrink:0;object-fit:contain;display:block}
.bevi-page .bevi-card-name{font-size:clamp(24px,4vw,30px);line-height:1.12;margin:0}
.bevi-page .bevi-card-desc{font-size:15px;line-height:1.6;color:var(--navy);margin:0 0 18px}
.bevi-page .bevi-card-badges{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:6px}
.bevi-page .bevi-card-badge{
  display:inline-flex;align-items:center;gap:8px;padding:7px 14px 7px 10px;
  border-radius:999px;background:var(--ice-cube);color:var(--sky);
  font-family:var(--bevi-body);font-size:13px;font-weight:700;
}
.bevi-page .bevi-card-badge img{width:22px;height:22px;object-fit:contain}

/* Special notes (caffeine ranges, U.S.-only): shown as a clear callout, not
   fine print. */
.bevi-page .bevi-card-note{
  margin:16px 0 0;padding:12px 16px;border-radius:12px;
  background:rgba(214,229,255,.5);border-left:4px solid var(--bevi-blue);
  font-family:var(--bevi-body);font-size:14px;font-weight:600;line-height:1.5;color:var(--cobalt);
}
.bevi-page .bevi-card-block{margin-top:22px}
.bevi-page .bevi-card-label{font-size:16px;line-height:1.2;margin:0 0 8px}
.bevi-page .bevi-card-ing{font-size:14px;line-height:1.6;color:var(--navy);margin:0}
.bevi-page .bevi-card-attr{margin:22px 0 0;font-size:12px;line-height:1.5;color:rgba(0,23,62,.55)}

/* Nutrition panel, styled after a standard label: bold nutrient left, value
   right, thin dividers, Calories emphasized, a heavier rule before the
   vitamin/mineral group. */
.bevi-page .bevi-nutri{border:1.5px solid var(--navy);border-radius:12px;padding:14px 16px;background:var(--white)}
.bevi-page .bevi-nutri-serving{font-family:var(--bevi-body);font-size:13px;font-weight:700;color:var(--navy)}
.bevi-page .bevi-nutri-amount{
  font-family:var(--bevi-body);font-size:12px;color:var(--navy);
  border-bottom:6px solid var(--navy);padding-bottom:6px;margin-bottom:2px;
}
.bevi-page .bevi-nutri-row{
  display:flex;justify-content:space-between;gap:12px;
  padding:7px 0;border-top:1px solid var(--ice-cube);
  font-family:var(--bevi-body);font-size:14px;color:var(--navy);
}
.bevi-page .bevi-nutri-row:first-child{border-top:none}
.bevi-page .bevi-nutri-label{font-weight:700}
.bevi-page .bevi-nutri-value{text-align:right;white-space:nowrap}
.bevi-page .bevi-nutri-row.is-calories{font-size:20px;padding:8px 0}
.bevi-page .bevi-nutri-row.is-calories .bevi-nutri-label,
.bevi-page .bevi-nutri-row.is-calories .bevi-nutri-value{font-weight:800}
.bevi-page .bevi-nutri-row.is-indent .bevi-nutri-label{font-weight:400;padding-left:18px}
.bevi-page .bevi-nutri-row.is-micro .bevi-nutri-label{font-weight:400}
.bevi-page .bevi-nutri-row.is-group-start{border-top:3px solid var(--navy)}

/* Mobile: full-screen sheet, not a shrunken modal. */
@media(max-width:640px){
  .bevi-page .bevi-modal-overlay{padding:0}
  .bevi-page .bevi-modal{
    max-width:none;max-height:none;width:100%;height:100%;border-radius:0;
    /* Sheet motion: rise from the bottom edge (no scale/zoom on mobile). The
       .is-open rule above (higher specificity) resets this to none, sliding
       the sheet up. */
    transform:translateY(100%);
  }
  /* The sheet fills the raw viewport, so on notched/dynamic-island phones the
     close button needs the device's safe-area inset added on top of its
     normal clearance, or it sits under that hardware cutout. env() resolves
     to 0 on devices without one, so this is a no-op elsewhere. */
  .bevi-page .bevi-modal-close{
    top:calc(16px + env(safe-area-inset-top));
    right:calc(16px + env(safe-area-inset-right));
  }
}

/* Reduced motion: instant open/close, no scale, slide, or drift. */
@media(prefers-reduced-motion:reduce){
  .bevi-page .bevi-modal-overlay,
  .bevi-page .bevi-modal{transition:none !important}
  .bevi-page .bevi-modal{transform:none !important}
}

/* ---------- Vending: full-bleed install band (Section 3) ----------
   Fixed 16:7 ratio (matches .industry-hero-media) so swapping the
   placeholder <img> for a real photo is a one-line src change with
   no layout shift. object-fit:cover crops any real photo cleanly. */
.svc-media-band{position:relative;overflow:hidden;aspect-ratio:16 / 7}
.svc-media-band-img{display:block;width:100%;height:100%;object-fit:cover}

/* ---------- Vending: contained install strip (Section 6) ----------
   flex:1 1 0 with no fixed basis means the row splits evenly across
   however many items exist, so removing one leaves no gap and causes
   no stretching. Stacks single-column below 680px, matching the
   breakpoint the page's other 4-item row (.svc-steps) already uses. */
.svc-media-strip{display:flex;flex-direction:column;gap:20px}
.svc-media-strip-item{margin:0}
.svc-media-strip-img{display:block;width:100%;height:auto;aspect-ratio:3 / 2;object-fit:cover;border-radius:var(--radius)}

/* Contain variant: for a strip where the sources are equipment shots at
   differing native ratios (landscape, square, tall) that must each display
   whole, not cropped. Portrait 3/4 instead of the base's landscape 3/2,
   matching the vertical-image convention .spot-inset already uses
   elsewhere, since the tallest source here (a single-door cooler) is
   narrow and vertical and a landscape cell would starve it. object-fit
   switches to contain so every source letterboxes instead of cropping.
   Base rule's height:auto still applies; only aspect-ratio and object-fit
   are overridden. Scoped to this modifier so the Vending page's install
   strip (real full-bleed-style photos, correctly cropped with cover) is
   untouched. */
.svc-media-strip-img--contain{aspect-ratio:3 / 4;object-fit:contain}
.svc-media-strip-label{display:none}
@media(min-width:680px){
  .svc-media-strip{flex-direction:row}
  .svc-media-strip-item{flex:1 1 0;min-width:0}
}

/* ---------- Contained single-image media frame ----------
   Portable: a single photo at contained (.wrap) width, framed at 16:9
   so it reads as a photo rather than a wall of image. Companion to
   .svc-media-band (full-bleed) and .svc-media-strip (multi-item row)
   above for pages that need one contained image moment. */
.svc-media-frame{position:relative;overflow:hidden;border-radius:var(--radius);aspect-ratio:16 / 9}
.svc-media-frame-img{display:block;width:100%;height:100%;object-fit:cover}

/* Smart Stores section 2 closes with a .svc-media-frame folded in below
   its check-list, instead of the frame living in its own section. Scoped
   to #what-it-is so the other standalone .svc-media-frame instances (which
   get their spacing from crossing a section boundary) are untouched.
   32px keeps the image grouped with the copy above it, same value used
   elsewhere for a new content block following intro copy in one section
   (.svc-steps, .svc-compare-cards, .equip-machine-cards, .svc-systems-row). */
#what-it-is .svc-media-frame{margin-top:32px}

/* ---------- Media caption (portable) ----------
   First caption pattern on the site. Pairs with any of the three media
   components above via <figure> + <figcaption>.

   Always BELOW the image, never overlaid: text on a photograph competes
   with it and cannot be guaranteed legible against unknown future
   photography. 13px sits one step under the site's smallest body copy
   (14px on .svc-step p and .svc-compare-card p) so a caption reads as
   attribution rather than as another paragraph.

   No inset of its own. Contained frames inherit alignment from their
   .wrap parent; the full-bleed band gets a .wrap around the figcaption
   alone, so the image runs edge to edge while the caption still lines up
   with the content column. <figure> margin is already zeroed by the
   global reset, so no figure rule is needed. */
.svc-media-caption{
  margin-top:10px;
  font-size:13px;
  color:var(--ink-soft);
}

/* ---------- Prose source citation ----------
   First third-party citation on the site; this is the pattern any future one
   should reuse. Deliberately NOT .svc-media-caption: that class is coupled to
   <figure>/<figcaption> and exists to NAME equipment in a photo ("Instant
   Systems 600 Quad"). A study attribution isn't naming an image, it's
   attributing a claim in body copy, so it gets its own sibling class and its
   own semantic element: <small>, which HTML5 defines for side comments and
   attribution text ("fine print"), used here inside a <p> since <small> is
   inline-only. Same 13px / ink-soft "fine print" treatment as
   .svc-media-caption for one consistent small-print language across the
   site, but more top margin (24px vs. 10px): a caption sits directly under
   one image it belongs to, while this follows a multi-paragraph stack and
   needs enough separation to read as detached from it, not as one more
   paragraph in the stack. */
.svc-source{
  margin-top:24px;
  font-size:13px;
  color:var(--ink-soft);
}

/* ---------- Partner block (portable: copy above a product-image grid) ----------
   Drops onto any service page that carries a supplier story. Carries no
   page-specific selector, so the only per-page edit is the copy inside
   .svc-partner-body and the cells inside .svc-partner-grid.

   Always stacked, text above and the grid running full container width
   below, at every viewport. Not a responsive two-column layout: a grid
   of small cells reads as a wall of thumbnails if it's squeezed into a
   partial-width column next to text, so the grid always gets the full
   contained width to work with. */
.svc-partner{display:flex;flex-direction:column;gap:28px}

/* Heading + attribution logo. Mobile-first: stacked and left-aligned by
   default, since a wide logo beside a heading has nowhere to go on a
   narrow column. Above 560px there's reliably enough width in this
   component's text column (it runs the full contained width, same as
   the grid below) for the two to sit on one line with room to spare, so
   they move to a row. The logo never gets a fixed pixel size beyond its
   height: width:auto plus its own intrinsic aspect ratio keeps it from
   ever distorting, and flex-shrink:0 keeps a long heading from
   squeezing it before flex-wrap has a chance to drop it to its own
   line. */
.svc-partner-heading-row{
  display:flex;flex-direction:column;align-items:flex-start;gap:14px;
}
@media(min-width:560px){
  .svc-partner-heading-row{
    flex-direction:row;align-items:center;flex-wrap:wrap;gap:32px;
  }
}
.svc-partner-heading-row h2{margin-bottom:0}

/* Secondary to the heading by design: sized near the heading's cap
   height, never equal to its full point size. width:auto preserves the
   source 1000:636 ratio off a single height constraint. */
.svc-partner-logo{
  display:block;height:40px;width:auto;flex-shrink:0;
}
@media(min-width:560px){
  .svc-partner-logo{height:46px}
}

/* Grid of individual product images, never a pre-composited strip.

   auto-fit + minmax means a variable image count degrades without a
   rebuild: when there are fewer images than the container could hold,
   the empty tracks COLLAPSE and the images stretch to fill the row
   instead of leaving a hole at the end.

   The min column width is re-declared per breakpoint rather than set
   once, because no single min yields 6 / 3 / 2 across at the three
   container widths this component runs at (full .wrap width at each).
   min(100%,...) keeps a single cell from overflowing a container
   narrower than the min. */
.svc-partner-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,120px),1fr));
  gap:10px;
}
@media(min-width:560px){
  .svc-partner-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr))}
}
@media(min-width:820px){
  .svc-partner-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,150px),1fr))}
}

/* Square cells so every row aligns top and bottom at any count or width.
   Radius is smaller than var(--radius): 16px reads as a squircle on a
   cell this size. */
.svc-partner-cell{position:relative;overflow:hidden;border-radius:12px;aspect-ratio:1 / 1}
.svc-partner-img{display:block;width:100%;height:100%;object-fit:cover}

/* Placeholder treatment. Remove .is-stub with the label text when the
   real photography lands; nothing else about the cell changes. */
.svc-partner-cell.is-stub{
  display:flex;align-items:center;justify-content:center;text-align:center;
  padding:6px;border:1px dashed var(--gray);background:var(--sage-tint);
  font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--sage-deep);line-height:1.25;
}

/* ---------- Vending: comparison block (Section 8) ----------
   Portable across service pages. The active card is resolved entirely
   in CSS by matching the section's data-current against each card's
   data-service, so changing data-current on the wrapper moves the
   active state with no other edits and no JS.

   The current-page card stays a plain, non-interactive container: no
   hover lift, no link affordance. The other two cards are real links
   (see .svc-compare-card--link below) out to their service pages. */
.svc-compare-cards{display:grid;grid-template-columns:1fr;grid-auto-rows:1fr;gap:20px;margin-top:32px}
@media(min-width:680px){.svc-compare-cards{grid-template-columns:repeat(3,1fr)}}

/* Base card matches the .svc-step convention already used on this page. */
.svc-compare-card{
  background:var(--white);border:1px solid var(--line);border-radius:var(--radius);
  padding:24px;box-shadow:var(--shadow);
}
.svc-compare-card h3{font-size:16px;margin-bottom:8px}
/* margin-bottom is a floor, not a fixed gap: .svc-compare-cta's margin-top:auto
   (below) still absorbs whatever space is left in the row-height-equalized
   card, so shorter-copy cards get more than this. Without the floor, a card
   whose copy is long enough to leave zero leftover space collapses the
   copy-to-button gap to 0, crowding the button against the last line of text.
   24px matches the card's own padding, so the gap reads at least as open as
   the button-to-bottom-edge space. */
.svc-compare-card p{font-size:14px;color:var(--ink-soft);margin:0 0 24px}

/* Clickable variant: the whole card is the link (not just the button inside
   it). The card itself never moves or shifts on hover, by design: only the
   button responds (see .svc-compare-card--link:hover .svc-compare-cta
   below), so the card's own :hover carries no rules at all. cursor:pointer
   is explicit so the full card still reads as clickable even though the
   card itself is visually static. Focus stays on the card (not the inert
   button) via a plain outline, unrelated to hover and unaffected by
   removing the old lift. */
.svc-compare-card--link{
  display:flex;flex-direction:column;text-decoration:none;color:inherit;
  cursor:pointer;
}
.svc-compare-card--link:focus-visible{outline:2px solid var(--sage-deep);outline-offset:3px}

/* Inert variant: for a service page that doesn't exist yet. Plain <div>,
   same base card look, deliberately carries no href, no button, no hover
   lift, and no focus ring, so it reads as informational only. cursor:default
   overrides nothing else, since the base card is already non-interactive;
   it just documents the intent. Not currently applied anywhere: all three
   service pages have shipped, so all non-active cards use the
   .svc-compare-card--link <a> pattern instead. Kept in reserve for the next
   service page that ships before its siblings. */
.svc-compare-card--inert{cursor:default}

/* Visual-only button: an aria-hidden span, not a real nested link/button,
   since the card itself is the interactive element. margin-top:auto keeps
   it flush to the bottom of the card and aligned across cards of uneven
   body-copy length: body copy stays top-aligned, the gap above the button
   absorbs the difference, so buttons line up horizontally across the row
   regardless of how long each card's paragraph is.

   Hover feedback lives here, not on the card: since the card no longer
   moves on hover, the button is the only element that visibly responds.
   Background + border shift to on-palette sage tones, no new color. */
.svc-compare-cta{margin-top:auto;align-self:flex-start}
.svc-compare-card--link:hover .svc-compare-cta{background:var(--sage-tint);border-color:var(--sage)}

/* Active card: sage border plus sage-tint fill. Quiet, on-palette, and
   reads as "current" without a badge, ribbon, or extra label. */
.svc-compare[data-current="vending"] .svc-compare-card[data-service="vending"],
.svc-compare[data-current="smart-stores"] .svc-compare-card[data-service="smart-stores"],
.svc-compare[data-current="micromarkets"] .svc-compare-card[data-service="micromarkets"]{
  background:var(--sage-tint);border-color:var(--sage);
}
.svc-compare[data-current="vending"] .svc-compare-card[data-service="vending"] h3,
.svc-compare[data-current="smart-stores"] .svc-compare-card[data-service="smart-stores"] h3,
.svc-compare[data-current="micromarkets"] .svc-compare-card[data-service="micromarkets"] h3{
  color:var(--sage-deep);
}

/* Screen-reader-only current-page announcement. Hidden by default; revealed
   only on the active card (matching data-current). Uses .sr-only for visual
   hiding while keeping it audible to assistive tech. Swapping data-current
   moves the announcement with no other edits. Note: absolute positioning
   (from .sr-only) computes display as block. */
.svc-compare-current{display:none}
.svc-compare[data-current="vending"] .svc-compare-card[data-service="vending"] .svc-compare-current,
.svc-compare[data-current="smart-stores"] .svc-compare-card[data-service="smart-stores"] .svc-compare-current,
.svc-compare[data-current="micromarkets"] .svc-compare-card[data-service="micromarkets"] .svc-compare-current{
  display:block;
}

/* ===========================================================
   Contact modal (contact-modal.js)

   A native <dialog> opened with showModal(), so it renders in
   the browser's top layer. Verified in Chromium and WebKit that
   this paints above the sticky header despite the header's
   backdrop-filter compositing layer, which is what forced the
   .bevi-page header-hiding workaround further up this file.
   That workaround is deliberately NOT repeated here.
   =========================================================== */

.ars-modal{
  padding:0;border:0;background:transparent;overflow:visible;
  width:min(560px,calc(100vw - 32px));max-width:none;
  max-height:90dvh;
  /* A modal <dialog> is centred by the UA's dialog{margin:auto} against
     dialog:modal{inset:0}. The universal reset at the top of this file
     (*{margin:0}) kills that, which pins the panel to the top-left corner.
     Restore it explicitly. */
  margin:auto;
  /* Column so .ars-modal-body is the only thing that scrolls: the close
     control stays put while a long form scrolls under it. */
  display:flex;flex-direction:column;
  color:var(--ink);
}
.ars-modal:not([open]){display:none}

/* The visible panel. On the dialog itself rather than a wrapper so the
   backdrop-click box test in contact-modal.js measures the real panel. */
.ars-modal{
  background:var(--white);
  border-radius:var(--radius);
  box-shadow:var(--shadow-lift);
}

.ars-modal-body{
  flex:1 1 auto;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;
  padding:28px;
}

/* The form supplies its own card chrome for the homepage surface. Inside
   the modal the dialog IS the card, so flatten it rather than nesting a
   second bordered, shadowed, padded box. */
.ars-modal .lead-form{
  background:transparent;border:0;box-shadow:none;padding:0;
}
.ars-modal .form-heading{font-size:24px;margin-bottom:8px}
.ars-modal .sub{margin-bottom:22px}

.ars-modal-close{
  position:absolute;top:10px;right:10px;z-index:2;
  width:40px;height:40px;border:0;border-radius:50%;
  background:var(--sage-tint);color:var(--sage-deep);
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;padding:0;
  transition:background .15s;
}
.ars-modal-close svg{width:20px;height:20px}
.ars-modal-close:hover{background:var(--line)}
.ars-modal-close:focus-visible{outline:2px solid var(--sage-deep);outline-offset:2px}

/* ---- Backdrop ----
   Ink token at low opacity with a light blur. ::backdrop inherits from its
   originating element in current browsers, so var(--ink) resolves through
   the dialog. */
.ars-modal::backdrop{
  background:var(--ink);
  opacity:.55;
  backdrop-filter:blur(7px);
  -webkit-backdrop-filter:blur(7px);
}
/* Without blur support, lean on a denser solid scrim so the page behind
   still reads as dimmed rather than as an un-separated backdrop. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .ars-modal::backdrop{opacity:.72}
}

/* ---- Open animation ----
   Pure CSS, no class toggling and no JS timers. transition-behavior:
   allow-discrete lets display and overlay animate, and @starting-style
   supplies the pre-open values, so the panel fades and rises on open and
   reverses on close. Browsers without @starting-style simply snap, which
   is a clean no-animation fallback rather than a broken state. */
.ars-modal{
  opacity:0;transform:translateY(8px) scale(.99);
  transition:opacity .18s ease, transform .18s ease,
             overlay .18s ease allow-discrete, display .18s ease allow-discrete;
}
.ars-modal[open]{opacity:1;transform:none}
@starting-style{
  .ars-modal[open]{opacity:0;transform:translateY(8px) scale(.99)}
}
.ars-modal::backdrop{
  transition:opacity .18s ease, backdrop-filter .18s ease,
             overlay .18s ease allow-discrete, display .18s ease allow-discrete;
}
@starting-style{
  .ars-modal[open]::backdrop{opacity:0}
}

@media(prefers-reduced-motion:reduce){
  .ars-modal,.ars-modal::backdrop{transition:none}
}

/* ---- Small screens ----
   Full-bleed sheet below 600px. The form's own single-column breakpoint is
   at 680px, so at every width where this full-height treatment applies the
   fields are already stacked; the two never fight. Between 601 and 679px
   the modal is windowed while the form is still single column, which is
   the correct reading for that width. */
@media(max-width:600px){
  .ars-modal{
    width:100vw;max-width:100vw;
    height:100dvh;max-height:100dvh;
    margin:0;border-radius:0;
  }
  .ars-modal-body{padding:24px 20px 32px}
  .ars-modal .form-heading{font-size:21px}
}
