/* ==========================================================================
   Elevarm — shared stylesheet
   Concept A "Operator Grade": an operations spec-sheet, not a brochure.
   Mono carries every number and label; the display face carries the claims.
   ========================================================================== */

/* ---------- tokens: light is the base state ---------- */
:root {
  --paper:      #F4F5F8;
  --surface:    #FFFFFF;
  --surface-2:  #EAECF3;
  --ink:        #0C1330;
  --ink-2:      #39406A;
  --grey:       #626A87;   /* 4.53:1 on --surface-2, the darkest ground it sits on */
  --line:       #D3D8E6;
  --line-strong:#AAB2CC;
  --navy:       #121B54;
  --blue:       #2F45CC;
  --blue-soft:  #E4E7FA;
  --green:      #2A6F33;
  --green-soft: #DFF0DC;
  --amber:      #8C6109;
  --amber-soft: #FAEFD4;
  --shadow:     0 1px 0 rgba(12,19,48,.05);
  /* Brand marks, taken from the Elevarm logo. Kept separate from the
     semantic --blue/--green, which are tuned for text contrast. */
  --brand-blue:  #2B37C4;
  --brand-green: #22A81F;
  --logo-ink:    var(--brand-blue);

  --f-display: "Helvetica Neue", "Inter", Helvetica, Arial, sans-serif;
  --f-body:    ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --f-mono:    ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --paper:      #080C1E;
    --surface:    #101736;
    --surface-2:  #18204A;
    --ink:        #E9ECF7;
    --ink-2:      #AFB7D6;
    --grey:       #8089AD;   /* 4.54:1 on --surface-2 */
    --line:       #232C55;
    --line-strong:#39437B;
    --navy:       #C3CBF2;
    --blue:       #8496FF;
    --blue-soft:  #1B245A;
    --green:      #87D179;
    --green-soft: #16321A;
    --amber:      #E0A93C;
    --amber-soft: #35270A;
    --shadow:     0 1px 0 rgba(0,0,0,.4);
    --logo-ink:   #EEF1FB;
  }
}
:root[data-theme="dark"] {
  --paper:      #080C1E;
  --surface:    #101736;
  --surface-2:  #18204A;
  --ink:        #E9ECF7;
  --ink-2:      #AFB7D6;
  --grey:       #8089AD;   /* 4.54:1 on --surface-2 */
  --line:       #232C55;
  --line-strong:#39437B;
  --navy:       #C3CBF2;
  --blue:       #8496FF;
  --blue-soft:  #1B245A;
  --green:      #87D179;
  --green-soft: #16321A;
  --amber:      #E0A93C;
  --amber-soft: #35270A;
  --shadow:     0 1px 0 rgba(0,0,0,.4);
  --logo-ink:   #EEF1FB;
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0; background: var(--paper); color: var(--ink);
  font-family: var(--f-body); font-size: 16px; line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; }
a { color: inherit; }
:focus-visible { outline: 2px solid var(--blue); outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;   /* without this the .live dot keeps cycling, faster */
    scroll-behavior: auto !important;
  }
}
.wrap { max-width: 1220px; margin: 0 auto; padding: 0 28px; }
.skip {
  position: absolute; left: -9999px; top: 0; background: var(--ink); color: var(--paper);
  padding: 10px 16px; font-family: var(--f-mono); font-size: 12px; z-index: 100;
}
.skip:focus { left: 0; }

/* Grid children default to min-width:auto, which lets a wide child (a nowrap
   table) push its track past the viewport and defeat its own overflow-x. */
.hero-grid > *, .gap-grid > *, .os-grid > *, .case > *, .grid-3 > *, .grid-2 > *,
.metrics-in > *, .sla > *, .serve > *, .team > *, .bio-grid > *, .kanban > *,
.sec-hd > *, .shots > *, .logos > *, .pillars > *, .foot-grid > *, .nextprev > *,
.voices > *, .sdgs > * { min-width: 0; }

/* ---------- type ---------- */
h1, h2, h3, h4 { font-family: var(--f-display); font-weight: 800; letter-spacing: -.032em; margin: 0; text-wrap: balance; }
h1 { font-size: clamp(34px, 5.2vw, 64px); line-height: .99; }
h2 { font-size: clamp(26px, 3.1vw, 40px); line-height: 1.05; }
h3 { font-size: 18px; letter-spacing: -.015em; }
h4 { font-size: 15px; letter-spacing: -.01em; }
p { margin: 0; }
.lede { font-size: clamp(16px, 1.35vw, 19px); color: var(--ink-2); max-width: 60ch; line-height: 1.6; }
.mono, .eyebrow, .tag, .num, th, .cell-mono { font-family: var(--f-mono); font-variant-numeric: tabular-nums; }
.eyebrow {
  font-size: 11px; letter-spacing: .13em; text-transform: uppercase;
  color: var(--grey); display: flex; align-items: center; gap: 10px;
}
.eyebrow::after { content: ""; height: 1px; background: var(--line); flex: 1; }
.sec-no { color: var(--blue); }
.note { font-family: var(--f-mono); font-size: 11px; color: var(--grey); letter-spacing: .03em; margin-top: 16px; }

/* ---------- draft banner ---------- */
/* ---------- nav ---------- */
header.nav {
  position: sticky; top: 0; z-index: 40;
  background: color-mix(in srgb, var(--paper) 88%, transparent);
  backdrop-filter: blur(12px); border-bottom: 1px solid var(--line);
}
.nav-in { display: flex; align-items: center; gap: 20px; height: 62px; }
/* Logo. The wordmark + swoosh below is a CSS/SVG interpretation of the real
   mark, so the site is correct without waiting on artwork. To use the official
   file instead, drop it in as assets/elevarm-logo.svg (plus a light-ink version
   for dark mode) and swap .logo-word/.logo-swoosh for:
     <img class="logo-file" src="assets/elevarm-logo.svg" alt="Elevarm">
   then style .logo-file { height: 26px; width: auto; } */
.logo {
  display: inline-flex; flex-direction: column; align-items: stretch; gap: 2px;
  text-decoration: none; flex: none; line-height: 1;
}
.logo-word {
  font-family: var(--f-display); font-weight: 800; font-size: 21px;
  letter-spacing: -.045em; color: var(--logo-ink);
}
/* the swoosh spans a touch wider than the word and dips well below it */
.logo-swoosh { display: block; width: 106%; margin-left: -3%; height: 9px; color: var(--brand-green); }
.logo-file { height: 26px; width: auto; display: block; }
.nav-links { display: flex; gap: 22px; margin-left: auto; font-size: 14px; }
.nav-links a { text-decoration: none; color: var(--ink-2); padding: 4px 0; border-bottom: 2px solid transparent; }
.nav-links a:hover { color: var(--ink); }
.nav-links a[aria-current="page"] { color: var(--ink); border-bottom-color: var(--blue); }
/* Primary CTA. The green is a fixed brand value, not a theme token: it reads
   the same on paper, on the dark CTA band and in dark mode, always with ink
   text over it. */
.btn {
  font-family: var(--f-mono); font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  padding: 10px 16px; text-decoration: none; border: 1px solid #87D179; background: #87D179; color: #0C1330;
  display: inline-block; transition: transform .12s ease; cursor: pointer;
}
.btn:hover { transform: translate(-1px,-1px); box-shadow: 3px 3px 0 var(--ink); }
.btn.ghost { background: transparent; color: var(--ink); border-color: var(--line-strong); }
.btn.ghost:hover { box-shadow: 3px 3px 0 var(--line-strong); }

.controls { display: flex; align-items: center; gap: 8px; flex: none; }
.seg { display: inline-flex; border: 1px solid var(--line-strong); }
.seg button {
  font-family: var(--f-mono); font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  padding: 7px 10px; border: 0; background: transparent; color: var(--ink-2); cursor: pointer;
  transition: background .15s ease, color .15s ease; line-height: 1.2;
}
.seg button + button { border-left: 1px solid var(--line-strong); }
.seg button[aria-pressed="true"] { background: var(--ink); color: var(--paper); }
.icon-btn {
  border: 1px solid var(--line-strong); background: transparent; color: var(--ink-2);
  padding: 6px 9px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  transition: color .15s ease, border-color .15s ease;
}
.icon-btn:hover { color: var(--ink); border-color: var(--ink); }
.icon-btn svg { width: 15px; height: 15px; display: block; }
.icon-btn .i-sun { display: none; }
.icon-btn .i-moon { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .icon-btn .i-sun { display: block; }
  :root:not([data-theme="light"]) .icon-btn .i-moon { display: none; }
}
:root[data-theme="dark"] .icon-btn .i-sun { display: block; }
:root[data-theme="dark"] .icon-btn .i-moon { display: none; }
:root[data-theme="light"] .icon-btn .i-sun { display: none; }
:root[data-theme="light"] .icon-btn .i-moon { display: block; }

/* nav collapses into a disclosure below 1080 */
.nav-toggle { display: none; }
@media (max-width: 1080px) {
  .nav-toggle { display: inline-flex; }
  .nav-links {
    position: absolute; left: 0; right: 0; top: 100%; margin: 0; flex-direction: column; gap: 0;
    background: var(--paper); border-bottom: 1px solid var(--line); padding: 6px 0;
  }
  .nav-links[hidden] { display: none; }
  .nav-links a { padding: 12px 28px; border-bottom: 0; border-left: 2px solid transparent; }
  .nav-links a[aria-current="page"] { border-left-color: var(--blue); }
  .controls { margin-left: auto; }
}
/* The CTA hands off between the bar and the drawer at 560px. Exactly one of the
   two is displayed at any width, so neither duplicates the other. */
.nav-cta { display: none; }
@media (max-width: 560px) {
  .nav-in > .btn { display: none; }
  .nav-links .nav-cta {
    display: block; margin: 10px 28px 8px; padding: 12px 16px; text-align: center;
    border-left: 0; border: 1px solid #87D179; background: #87D179; color: #0C1330;
    font-family: var(--f-mono); font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  }
  .nav-links .nav-cta:hover { color: #0C1330; }
}

/* ---------- ops rail ---------- */
.rail { border-bottom: 1px solid var(--line); background: var(--surface); }
.rail-in { display: flex; align-items: stretch; overflow-x: auto; }
.rail-item {
  flex: 1; min-width: 128px; padding: 11px 16px; border-right: 1px solid var(--line);
  font-family: var(--f-mono); font-size: 11px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--grey); display: flex; align-items: center; gap: 9px; white-space: nowrap;
}
.rail-item:last-child { border-right: 0; }
.rail-item b { color: var(--ink); font-weight: 400; }
.dot { width: 7px; height: 7px; background: var(--blue); flex: none; }
.rail-item:nth-child(1) .dot { background: var(--green); }
.rail-item:nth-child(5) .dot { background: var(--amber); }

/* ---------- home hero ---------- */
.hero { padding: 76px 0 64px; border-bottom: 1px solid var(--line); }
/* The headline sits above now, so the left column only carries the lede and
   CTAs — give the width to the block monitor, whose Indonesian labels need
   ~660px to show every column without scrolling. */
.hero-grid { display: grid; grid-template-columns: .78fr 1.22fr; gap: 56px; align-items: start; }
@media (max-width: 980px) { .hero-grid { grid-template-columns: 1fr; gap: 40px; } }
/* Judul hero berdiri selebar kontainer supaya kedua kalimatnya masing-masing
   muat dalam satu baris; lede, tombol, dan panel tetap dua kolom di bawahnya. */
/* The headline runs its own full measure so both languages hold two lines at
   full size — the Indonesian second line needs ~874px at 64px. */
.hero-head { margin-bottom: 38px; }
.hero-head h1 { margin: 18px 0 0; max-width: 920px; text-wrap: pretty; }
.hero h1 em { font-style: normal; color: var(--blue); }
.cta-row { display: flex; gap: 12px; margin-top: 30px; flex-wrap: wrap; }
.hero-foot {
  margin-top: 34px; padding-top: 20px; border-top: 1px solid var(--line);
  display: flex; gap: 30px; flex-wrap: wrap; font-family: var(--f-mono); font-size: 11.5px;
  color: var(--grey); letter-spacing: .04em;
}

/* ---------- interior page header ---------- */
.phead { padding: 54px 0 40px; border-bottom: 1px solid var(--line); }
.phead-grid { display: grid; grid-template-columns: 1.15fr .85fr; gap: 48px; align-items: end; }
@media (max-width: 880px) { .phead-grid { grid-template-columns: 1fr; gap: 20px; } }
.phead h1 { font-size: clamp(30px, 4.2vw, 52px); margin: 14px 0 0; }
.crumb { font-family: var(--f-mono); font-size: 11px; letter-spacing: .12em; text-transform: uppercase; color: var(--grey); }
.crumb a { text-decoration: none; color: var(--grey); }
.crumb a:hover { color: var(--ink); }
/* Both the "/" and the current page name are spans here. --line-strong is a
   border token: as text on the page ground it lands at 1.94:1, which fails
   WCAG 1.4.3 for the one word in the trail telling you where you are. --grey
   is the same colour the "Home" link already uses and measures 4.83:1. */
.crumb span { color: var(--grey); margin: 0 8px; }
.crumb span[data-i18n] { margin: 0; color: var(--ink-2); }   /* the current page, slightly firmer */

.metrics-note {
  font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .06em; color: var(--grey);
  padding: 14px 28px 0; max-width: 78ch;
}
@media (max-width: 700px) { .metrics-note { padding: 12px 20px 0; line-height: 1.6; } }

/* Required-field marker. The input's own `required` is what assistive tech
   announces, so the visible word is aria-hidden — otherwise it is said twice. */
.lbl-req { display: flex; align-items: baseline; gap: 8px; }
.req { font-size: 9.5px; letter-spacing: .1em; color: var(--grey); text-transform: uppercase; }

/* Four-door variant used on the home page. `.serve.four` outranks the plain
   `.serve` rules on specificity, so every breakpoint it needs is restated
   here — inheriting the single-column rule below would never have fired. */
.serve.four { grid-template-columns: repeat(4, 1fr); gap: 22px; }
.serve.four > div:nth-child(3) { border-top-color: var(--ink); }
.serve.four > div:nth-child(4) { border-top-color: var(--amber); }
@media (max-width: 1080px) { .serve.four { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px)  { .serve.four { grid-template-columns: 1fr; } }

/* ---------- ops panel ---------- */
.panel { border: 1px solid var(--line-strong); background: var(--surface); box-shadow: var(--shadow); }
.panel-hd {
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
  border-bottom: 1px solid var(--line); background: var(--surface-2);
  font-family: var(--f-mono); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
}
.live { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; color: var(--green); }
.live i { width: 6px; height: 6px; border-radius: 50%; background: var(--green); animation: pulse 2.2s infinite; }
@keyframes pulse { 0%,100% { opacity: 1 } 50% { opacity: .25 } }
.scroll-x { overflow-x: auto; }
table.blocks { width: 100%; border-collapse: collapse; font-size: 12.5px; }
table.blocks th {
  text-align: left; font-weight: 400; font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--grey); padding: 9px 14px; border-bottom: 1px solid var(--line); white-space: nowrap;
}
table.blocks td { padding: 10px 14px; border-bottom: 1px solid var(--line); white-space: nowrap; }
table.blocks tr:last-child td { border-bottom: 0; }
table.blocks tr:hover td { background: var(--surface-2); }
.cell-mono { font-size: 12px; color: var(--ink-2); }
.pill {
  font-family: var(--f-mono); font-size: 10px; letter-spacing: .07em; text-transform: uppercase;
  padding: 3px 8px; white-space: nowrap; border: 1px solid;
}
.pill.ok   { color: var(--green); border-color: var(--green); background: var(--green-soft); }
.pill.run  { color: var(--blue);  border-color: var(--blue);  background: var(--blue-soft); }
.pill.warn { color: var(--amber); border-color: var(--amber); background: var(--amber-soft); }
.ndvi { display: inline-flex; align-items: center; gap: 7px; }
.ndvi-bar { width: 42px; height: 5px; background: var(--surface-2); position: relative; }
.ndvi-bar i { position: absolute; inset: 0 auto 0 0; background: var(--green); display: block; }

/* ---------- metric strip ---------- */
.metrics { border-bottom: 1px solid var(--line); background: var(--surface); }
.metrics-in { display: grid; grid-template-columns: repeat(4, 1fr); }
@media (max-width: 780px) { .metrics-in { grid-template-columns: repeat(2, 1fr); } }
.metric { padding: 26px 28px; border-right: 1px solid var(--line); }
.metric:last-child { border-right: 0; }
@media (max-width: 780px) {
  .metric:nth-child(2n) { border-right: 0; }
  .metric:nth-child(-n+2) { border-bottom: 1px solid var(--line); }
}
.metric .num { font-family: var(--f-display); font-size: clamp(30px, 3.6vw, 44px); font-weight: 800; letter-spacing: -.04em; line-height: 1; }
.metric .lbl { font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--grey); margin-top: 9px; }

/* ---------- sections ---------- */
section { padding: 72px 0; border-bottom: 1px solid var(--line); }
.sec-hd { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: end; margin-bottom: 40px; }
@media (max-width: 880px) { .sec-hd { grid-template-columns: 1fr; gap: 18px; } }
.sec-hd h2 { margin-top: 16px; }

.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 880px) { .grid-3 { grid-template-columns: 1fr; } }
.grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 780px) { .grid-2 { grid-template-columns: 1fr; } }
.card { background: var(--surface); padding: 26px; display: flex; flex-direction: column; gap: 12px; }
/* Product-example slot at the top of a card. Only the cards that carry one get
   it, so the plain .card everywhere else is untouched. Full-bleed against the
   card padding; drop an <img> in and it covers the placeholder. */
.card-img {
  position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  margin: -26px -26px 0; border-bottom: 1px solid var(--line);
  background-color: var(--surface-2);
  background-image: linear-gradient(var(--line) 1px, transparent 1px),
                    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 22px 22px, 22px 22px;
}
.card-img img { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; object-fit: cover; display: block; }
.card-img .ph {
  position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 7px; padding: 12px; text-align: center;
  font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
}
.card-img .ph svg { width: 20px; height: 20px; opacity: .5; }
/* .has-shot puts that slot beside the copy instead of above it: a column at the
   card's left edge, the text in its own column. Cheaper vertically than a
   full-width band, which swamped a six-card grid. */
.card.has-shot {
  display: grid; grid-template-columns: 152px minmax(0, 1fr);
  grid-template-rows: auto auto 1fr;   /* the copy row absorbs the slack, so the
                                          slot fills a card stretched by its row */
  column-gap: 20px; row-gap: 10px;
}
.card.has-shot > .card-img {
  grid-column: 1; grid-row: 1 / -1; aspect-ratio: auto;
  margin: -26px 0 -26px -26px; border-bottom: 0; border-right: 1px solid var(--line);
}
.card.has-shot > :not(.card-img) { grid-column: 2; }
.card.has-shot .ph { font-size: 9px; letter-spacing: .08em; }
/* Below this width a side column is a sliver, so the slot goes back on top. */
@media (max-width: 560px) {
  .card.has-shot { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto; }
  .card.has-shot > .card-img {
    grid-column: 1; grid-row: auto; aspect-ratio: 16 / 9;
    margin: -26px -26px 0; border-right: 0; border-bottom: 1px solid var(--line);
  }
  .card.has-shot > :not(.card-img) { grid-column: 1; }
}
.card .tag { font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--blue); }
.card p { font-size: 14.5px; color: var(--ink-2); }
.card ul { margin: 0; padding-left: 17px; font-size: 14px; color: var(--ink-2); line-height: 1.75; }
.card .money { margin-top: auto; padding-top: 14px; border-top: 1px dashed var(--line); font-family: var(--f-mono); font-size: 11.5px; color: var(--grey); letter-spacing: .04em; }

/* Editorial line breaks written into a heading. Honoured where there is room
   for them; dropped below 700px, where forcing them only worsens the rag and
   text-wrap:balance does a better job on its own. */
.brk-lines br { display: none; }
@media (min-width: 700px) {
  .brk-lines br { display: inline; }
  /* A lede whose breaks are authored takes its measure from those breaks, not
     from the 60ch default or a half-width .sec-hd column — either would wrap
     it before it ever reached the <br>. */
  .lede.brk-lines { max-width: none; }
  .sec-hd > .lede.brk-lines { grid-column: 1 / -1; }
}

/* ---------- home pillars ---------- */
.pillars { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 880px) { .pillars { grid-template-columns: 1fr; } }
.pillar { background: var(--surface); padding: 30px 26px; display: flex; flex-direction: column; gap: 12px; text-decoration: none; transition: background .15s ease; }
.pillar:hover { background: var(--surface-2); }
/* Product-example slot at the top of each card. It runs full-bleed to the card
   edges (hence the negative margins mirroring .pillar's padding) and uses the
   same drop-in mechanism as the field record: put an <img> inside and it covers
   the placeholder underneath. 16:9 keeps three of them level across the row. */
.pillar-img {
  position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  margin: -30px -26px 0; border-bottom: 1px solid var(--line);
  background-color: var(--surface-2);
  background-image: linear-gradient(var(--line) 1px, transparent 1px),
                    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 22px 22px, 22px 22px;
}
.pillar-img img { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; object-fit: cover; display: block; }
.pillar-img .ph {
  position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 7px; padding: 12px; text-align: center;
  font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
}
.pillar-img .ph svg { width: 20px; height: 20px; opacity: .5; }
/* Packshot shelf: the NextBio card stands five bottles from the NextBio page in
   its slot instead of a single photograph. The shots are cut out on alpha, so
   the slot keeps its own graph-paper ground — a white block here was the
   loudest thing on the page in dark mode. The placeholder is dropped; it would
   read through the gaps. */
.pillar-img.shelf-slot .ph { display: none; }
.shelf {
  position: absolute; inset: 13% 6% 9%; z-index: 2;   /* inset, not padding: the
                              flex box is then the shelf itself, so a shot can
                              size against it cleanly */
  display: flex; align-items: flex-end; justify-content: center; gap: 3%;
}
.shelf img {
  position: static; inset: auto; width: auto;   /* undo the cover rule above:
                                                   these sit side by side */
  flex: 1 1 0; min-width: 0; height: 100%;
  object-fit: contain; object-position: bottom;       /* one baseline for all five */
}
/* PasarAgri card: no hand-off photograph exists yet, so the slot carries the
   lot docket itself, drawn as SVG on the same 16:9 box. SVG rather than a
   raster so it stays sharp at any card width and takes its ink, rules and
   grade colours from the theme tokens below. The slot keeps its graph-paper
   ground — the docket reads as a sheet laid on it. Swap in a photograph and
   this whole block goes with the doc-slot class. */
.pillar-img.doc-slot .ph { display: none; }
.lot-doc { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; display: block; }
.lot-doc text { font-family: var(--f-mono); fill: var(--ink); }
.lot-doc .lot-card { fill: var(--surface); stroke: var(--line); stroke-width: 2; }
.lot-doc .lot-rule { stroke: var(--line); stroke-width: 2; }
/* Sizes are set on the 1600-unit viewBox, and the slot is roughly 387px wide
   at desktop — a 0.24 scale. The 34px key therefore lands at about 8px on
   screen, in step with the 9.5px mono the rest of the card uses; anything
   smaller stopped being readable and started being texture. */
.lot-doc .lot-k  { font-size: 34px; letter-spacing: 2.6px; text-transform: uppercase; fill: var(--grey); }
.lot-doc .lot-id { font-size: 84px; letter-spacing: -1px; }
.lot-doc .lot-sub { font-size: 36px; fill: var(--ink-2); }
.lot-doc .lot-v  { font-size: 68px; }
.lot-doc .lot-v.ok { fill: var(--green); }
.lot-doc .lot-segA { fill: var(--green); }
.lot-doc .lot-segB { fill: var(--line-strong); }
.lot-doc .lot-segC { fill: var(--amber); }

.pillar .tag { font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--blue); }
.pillar h3 { font-size: 24px; letter-spacing: -.03em; }
/* The three marks are balanced on CAP HEIGHT, not on box height. Each file
   carries a different amount of air above the caps (NextBio's leaf, PasarAgri's
   sun) and below the baseline (PasarAgri's "g" descender), so equal box heights
   read as unequal logos — PasarAgri looked a fifth shorter than the other two.
   Measured cap/box: NextBio 119/160, PasarAgri 86/160, VarmOS 700/870. The
   heights below give all three a 20.5px cap; the margins sit every baseline on
   the same line, 8.35px above the slot floor, so the caps occupy one band
   across all three cards. Re-measure if a mark is re-exported. */
.pillar h3.brand { display: flex; align-items: flex-end; height: 40px; }
.pillar .brand-logo { display: block; width: auto; }
.pillar .brand-varmos    { height: 25.5px; margin-bottom: 5.9px; color: var(--ink); }
.pillar .brand-nextbio   { height: 27.6px; margin-bottom: 8px; }
.pillar .brand-pasaragri { height: 38.1px; margin-bottom: 0; }
/* Dark mode. VarmOS is inline SVG, so its letterforms already follow
   currentColor. NextBio and PasarAgri are raster, so each ships a second file
   with the type recoloured to the dark-mode --ink (#E9ECF7) and the icon left
   untouched — the same treatment, and all three marks land at one weight.
   Brightening the originals with a filter was the old approach; it washed the
   icons out and never got the type to white. Regenerate the -white files if the
   source marks change. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .pillar .brand-nextbio   { content: url("brand/nextbio-white.png"); }
  :root:not([data-theme="light"]) .pillar .brand-pasaragri { content: url("brand/pasaragri-white.png"); }
}
:root[data-theme="dark"] .pillar .brand-nextbio   { content: url("brand/nextbio-white.png"); }
:root[data-theme="dark"] .pillar .brand-pasaragri { content: url("brand/pasaragri-white.png"); }
.pillar p { font-size: 14.5px; color: var(--ink-2); }
.pillar .go { margin-top: auto; padding-top: 16px; font-family: var(--f-mono); font-size: 11.5px; letter-spacing: .07em; text-transform: uppercase; color: var(--blue); }

/* ---------- yield gap ---------- */
.gap-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; align-items: start; }
@media (max-width: 980px) { .gap-grid { grid-template-columns: 1fr; } }
.bars { display: flex; flex-direction: column; gap: 2px; }
.bar-row { display: grid; grid-template-columns: 92px 1fr 58px; align-items: center; gap: 14px; padding: 9px 0; border-bottom: 1px solid var(--line); }
.bar-row span:first-child { font-family: var(--f-mono); font-size: 12px; letter-spacing: .04em; }
.bar-track { height: 10px; background: var(--surface-2); }
.bar-fill { height: 100%; background: var(--line-strong); display: block; }
.bar-row.me .bar-fill { background: var(--blue); }
.bar-row.me span:first-child { color: var(--blue); }
.bar-row.best .bar-fill { background: var(--green); }
.bar-val { font-family: var(--f-mono); font-size: 12px; text-align: right; color: var(--ink-2); }

/* the three lifts under the before/after bars */
.lift { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); margin-top: 22px; }
@media (max-width: 560px) { .lift { grid-template-columns: 1fr; } }
.lift > * { min-width: 0; background: var(--surface); padding: 18px 20px; }
.lift b {
  display: block; font-family: var(--f-display); font-weight: 800; font-size: 30px;
  letter-spacing: -.04em; line-height: 1; color: var(--green);
}
.lift b span { font-size: .5em; }
.lift > div > span {
  display: block; margin-top: 8px; font-family: var(--f-mono); font-size: 10.5px;
  letter-spacing: .09em; text-transform: uppercase; color: var(--grey);
}

/* ---------- NextBio matrix ---------- */
/* Product grid. Uses gap + per-card borders rather than the 1px-line technique,
   because the catalogue's categories hold uneven counts (4/4/5/4) — an
   incomplete final row must not leave a tinted empty cell. */
.bio-cat + .bio-cat { margin-top: 36px; }
.bio-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-top: 14px; }
@media (max-width: 980px) { .bio-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .bio-grid { grid-template-columns: 1fr; } }
.bio-grid > * { min-width: 0; }
.bio { position: relative; background: var(--surface); border: 1px solid var(--line); display: flex; flex-direction: column; transition: border-color .15s, transform .15s; }
.bio-body { padding: 15px 17px; }
.bio b { display: block; font-size: 14.5px; letter-spacing: -.01em; }
.bio p { font-size: 12.5px; color: var(--grey); margin-top: 5px; line-height: 1.45; }
/* Distribution status, read off the packaging in the catalogue. Registered
   products carry an Izin Edar; the rest are marked 'Untuk Kalangan Sendiri'. */
.bio-flag {
  display: inline-block; margin-top: 10px; padding: 3px 7px; border: 1px solid;
  font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .07em; text-transform: uppercase;
}
.bio-flag.reg { color: var(--green); border-color: var(--green); background: var(--green-soft); }
.bio-flag.int { color: var(--amber); border-color: var(--amber); background: var(--amber-soft); }
.bio-flag .mono { letter-spacing: .02em; }
/* Product shot. Bleeds to the cell edges (cancels .bio's padding). Same slot
   mechanism as .shot-img: the placeholder sits underneath and an <img> dropped
   in covers it — nothing else to change. */
.bio-img {
  position: relative; aspect-ratio: 1 / 1; overflow: hidden;   /* packshots are tall bottles */
  border-bottom: 1px solid var(--line);
  background-color: var(--surface-2);
  background-image: linear-gradient(var(--line) 1px, transparent 1px),
                    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 18px 18px, 18px 18px;
}
.bio-img img { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; object-fit: cover; display: block; }
/* Packshots keep the grid ground rather than a white one. Every render in the
   range is cut out on alpha now — the four vermicompost sacks were the last
   opaque-on-white files and were re-exported from nextbio-assets/ — so the
   shots sit on the page's own surface in both themes. */
.bio-img.packshot img { object-fit: contain; }
.bio-img .ph {
  position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 6px; padding: 10px; text-align: center;
  font-family: var(--f-mono); font-size: 9px; letter-spacing: .09em; text-transform: uppercase; color: var(--ink-2);
}
.bio-img .ph svg { width: 18px; height: 18px; opacity: .5; }

/* ---------- VarmOS ---------- */
.os-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; align-items: start; }
@media (max-width: 980px) { .os-grid { grid-template-columns: 1fr; } }
.layers { display: flex; flex-direction: column; }
.layer { display: grid; grid-template-columns: 34px 1fr; gap: 18px; padding: 20px 0; border-bottom: 1px solid var(--line); }
.layer:first-child { border-top: 1px solid var(--line); }
.layer .idx { font-family: var(--f-mono); font-size: 11px; color: var(--blue); padding-top: 3px; letter-spacing: .06em; }
.layer p { font-size: 14px; color: var(--ink-2); margin-top: 5px; }
.kanban { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 620px) { .kanban { grid-template-columns: 1fr 1fr; } }
.kcol { background: var(--surface); min-height: 190px; }
.kcol h4 {
  margin: 0; padding: 10px 12px; border-bottom: 1px solid var(--line); background: var(--surface-2);
  font-family: var(--f-mono); font-weight: 400; font-size: 10px; letter-spacing: .09em; text-transform: uppercase; color: var(--ink-2);
}
.kcards { padding: 10px; display: flex; flex-direction: column; gap: 8px; }
.kcard { border: 1px solid var(--line); border-left: 3px solid var(--blue); padding: 9px 10px; font-size: 11.5px; line-height: 1.35; background: var(--paper); }
.kcard.g { border-left-color: var(--green); }
.kcard.a { border-left-color: var(--amber); }
.kcard em { display: block; font-style: normal; font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .07em; color: var(--grey); margin-top: 4px; }

/* ---------- economics ---------- */
.tbl-scroll { overflow-x: auto; border: 1px solid var(--line-strong); background: var(--surface); }
table.econ { width: 100%; min-width: 640px; border-collapse: collapse; font-size: 14px; }
table.econ th {
  text-align: right; font-weight: 400; padding: 13px 18px; background: var(--surface-2);
  font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2); border-bottom: 1px solid var(--line-strong);
}
table.econ th:first-child, table.econ td:first-child { text-align: left; }
table.econ td { padding: 13px 18px; text-align: right; border-bottom: 1px solid var(--line); font-family: var(--f-mono); font-variant-numeric: tabular-nums; font-size: 13px; }
table.econ td:first-child { font-family: var(--f-body); font-size: 14px; color: var(--ink-2); }
table.econ tr:last-child td { border-bottom: 0; }
table.econ tr.hi td { background: var(--blue-soft); font-weight: 600; }
table.econ tr.hi td:first-child { color: var(--ink); font-weight: 600; }
.delta { color: var(--green); font-weight: 600; }

.case { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--line); border: 1px solid var(--line); margin-top: 40px; }
@media (max-width: 880px) { .case { grid-template-columns: 1fr; } }
.case > div { background: var(--surface); padding: 28px; }
.case dl { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 10px 20px; font-size: 13.5px; }
.case dt { font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .09em; text-transform: uppercase; color: var(--grey); padding-top: 3px; }
.case dd { margin: 0; }
.pl { display: flex; flex-direction: column; margin-top: 6px; }
.pl-row { display: flex; justify-content: space-between; padding: 9px 0; border-bottom: 1px solid var(--line); font-family: var(--f-mono); font-size: 13px; }
.pl-row.total { border-bottom: 0; border-top: 2px solid var(--ink); margin-top: 6px; font-weight: 700; color: var(--ink); }
.pl-row span:first-child { font-family: var(--f-body); color: var(--ink-2); }
.pl-row.total span:first-child { font-weight: 600; color: var(--ink); }

/* Photo gallery inside the case card. It spans both columns, sits under them,
   and uses the same drop-in mechanism as the field record: put an <img> inside
   a .shot-img and it covers the placeholder. */
.case-gallery { grid-column: 1 / -1; }
.case-shots {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px;
  background: var(--line); border: 1px solid var(--line);
}
.case-shots > * { min-width: 0; }
@media (max-width: 880px) { .case-shots { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px) { .case-shots { grid-template-columns: 1fr; } }

/* ---------- app mock ----------
   The estate map shown at page width. Ported from the same markup varmos.id
   runs in its hero, so it is live HTML rather than a screenshot: it follows
   both themes and it translates with the rest of the page. Colours below are
   the site's own tokens; the app's interior rounding is kept because it depicts
   a product, while the outer frame stays square like every other figure here.
   The block geometry in the SVG is the estate's own — see the note in build.py. */
.app-mock {
  --am-on-green: #FFFFFF;
  border: 1px solid var(--line); background: var(--surface); overflow: hidden; text-align: left;
  font-family: var(--f-body);
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .app-mock { --am-on-green: #06210F; } }
:root[data-theme="dark"] .app-mock { --am-on-green: #06210F; }

.am-bar { display: flex; align-items: center; gap: 8px; padding: 11px 16px; border-bottom: 1px solid var(--line); background: var(--surface-2); }
.am-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line-strong); }
.am-url {
  margin-left: 12px; font-family: var(--f-mono); font-size: 11.5px; color: var(--grey);
  background: var(--surface); padding: 4px 12px; border-radius: 99px; border: 1px solid var(--line);
}
/* min-height, not height: a longer translation makes the frame taller and the
   map grows with it, rather than having the estate rail clipped off the bottom. */
.am-body { display: grid; grid-template-columns: 196px minmax(0, 1fr); min-height: 700px; overflow: hidden; }
.am-body > * { min-width: 0; }

/* sidebar */
.am-side { border-right: 1px solid var(--line); background: var(--surface-2); padding: 12px 10px 14px; min-width: 0; }
.am-side-top { display: flex; align-items: center; gap: 8px; padding: 2px 6px 10px; }
.am-side-top .am-mark { width: 22px; height: 22px; border-radius: 7px; flex: none; background: linear-gradient(135deg, #1E9B34, #4CC356); }
.am-side-top b { font-size: 13px; letter-spacing: -.02em; color: var(--ink); }
.am-side-top i { display: block; font-style: normal; font-size: 8.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--grey); margin-top: 1px; }
.am-select {
  display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--ink-2);
  background: var(--surface); border: 1px solid var(--line); border-radius: 8px; padding: 7px 9px; margin-bottom: 10px;
}
.am-select span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.am-select svg { flex: none; margin-left: auto; color: var(--grey); }
.am-side .grp { font-size: 9.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--grey); padding: 12px 8px 5px; }
.am-side .it { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 7px; font-size: 12.5px; color: var(--ink-2); }
.am-side .it .ic { width: 14px; height: 14px; flex: none; color: var(--grey); }
.am-side .it.on { background: var(--green-soft); color: var(--green); font-weight: 600; }
.am-side .it.on .ic { color: var(--green); }
.am-side .it.act { color: var(--am-on-green); background: var(--green); font-weight: 600; box-shadow: var(--shadow); }
.am-side .it.act .ic { color: var(--am-on-green); }
.am-side .bdg {
  margin-left: auto; font-size: 10px; font-weight: 700; line-height: 1; padding: 3px 6px;
  border-radius: 99px; background: var(--amber-soft); color: var(--red);
}
.am-side .it.act .bdg { background: rgba(0,0,0,.2); color: var(--am-on-green); }
.am-side .arw { margin-left: auto; color: var(--grey); flex: none; }
.am-side-foot { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--line); }
.am-side-own { font-size: 9px; letter-spacing: .1em; text-transform: uppercase; color: var(--grey); padding: 10px 8px 0; }
.am-side-own b { color: var(--ink-2); }

/* topbar */
.am-top { display: flex; align-items: center; gap: 9px; padding: 9px 12px; border-bottom: 1px solid var(--line); background: var(--surface); }
.am-search {
  display: flex; align-items: center; gap: 7px; flex: 1; min-width: 0; max-width: 290px;
  border: 1px solid var(--line); border-radius: 9px; background: var(--surface-2);
  padding: 6px 10px; font-size: 11.5px; color: var(--grey);
}
.am-chip {
  display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--line); border-radius: 8px;
  background: var(--surface); padding: 5px 9px; font-size: 11.5px; color: var(--ink-2); font-weight: 600; white-space: nowrap;
}
.am-chip svg { color: var(--grey); flex: none; }
.am-btn {
  display: inline-flex; align-items: center; gap: 5px; background: var(--green); color: var(--am-on-green);
  font-weight: 600; font-size: 11.5px; border-radius: 8px; padding: 6px 11px; white-space: nowrap;
}
.am-live { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--grey); white-space: nowrap; }
.am-live .d { width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
.am-top .right { margin-left: auto; display: flex; align-items: center; gap: 9px; }
.am-user { display: flex; align-items: center; gap: 8px; text-align: right; }
.am-user b { font-size: 11.5px; display: block; line-height: 1.15; color: var(--ink); }
.am-user i { font-style: normal; font-size: 9.5px; color: var(--grey); }
.am-user .av { order: 2; width: 24px; height: 24px; border-radius: 50%; flex: none; background: linear-gradient(140deg, var(--blue), var(--green)); }

/* map column and estate rail. Whichever column runs longest sets the frame
   height, and the other two stretch to meet it — so the map takes up the slack
   and no column is ever cut off at the bottom. */
.am-right { display: flex; flex-direction: column; min-width: 0; }
.am-main { flex: 1; display: grid; grid-template-columns: 1fr 274px; min-width: 0; min-height: 642px; overflow: hidden; }
.am-col { padding: 12px; min-width: 0; border-right: 1px solid var(--line); display: flex; flex-direction: column; }
.am-map-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 9px; }
.am-map-head .h4 { font-size: 16px; font-weight: 600; letter-spacing: -.02em; color: var(--ink); margin-right: auto; }
.am-flags { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 9px; }
.am-flag { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; border-radius: 99px; padding: 4px 10px; }
.am-flag.ok { background: var(--green-soft); color: var(--green); }
.am-flag.warn { background: var(--amber-soft); color: var(--amber); }
.am-flag u { text-underline-offset: 2px; }

.am-attn { border: 1px solid var(--line); border-radius: 9px; background: var(--surface); padding: 9px 10px; margin-bottom: 10px; }
.am-attn-h { display: flex; align-items: baseline; gap: 8px; font-size: 12px; font-weight: 600; margin-bottom: 7px; color: var(--ink); }
.am-attn-h em { font-style: normal; font-weight: 500; font-size: 10.5px; color: var(--grey); }
.am-attn-g { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.am-attn-i { display: flex; gap: 8px; align-items: flex-start; border: 1px solid var(--line); border-radius: 8px; padding: 6px 8px; background: var(--surface-2); }
.am-attn-i .n {
  width: 16px; height: 16px; border-radius: 50%; background: var(--surface); border: 1px solid var(--line-strong);
  font-size: 9.5px; font-weight: 700; color: var(--grey); display: flex; align-items: center; justify-content: center; flex: none;
}
.am-attn-i b { display: block; font-size: 12px; line-height: 1.2; color: var(--ink); }
.am-attn-i > span > span { display: block; font-size: 10.5px; color: var(--grey); margin-top: 2px; }

/* map. The overlays sit on the imagery, so they keep a light chip in both
   themes — the same call the app makes. */
.am-map { position: relative; flex: 1; min-height: 0; border-radius: 9px; overflow: hidden; border: 1px solid var(--line); }
.am-map-base { position: absolute; inset: 0; width: 100%; height: 100%; }
.am-map .ov { position: absolute; z-index: 2; }
.am-tl { top: 10px; left: 10px; display: flex; gap: 6px; }
.am-pill {
  display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 600;
  background: rgba(255,255,255,.94); color: #12331A; border-radius: 8px; padding: 5px 9px;
  box-shadow: 0 2px 8px rgba(0,0,0,.18);
}
.am-pill.gr { background: rgba(18,94,32,.96); color: #FFFFFF; }
.am-tr { top: 10px; right: 10px; }
.am-rnd {
  width: 28px; height: 28px; border-radius: 50%; background: rgba(255,255,255,.94); border: 1px solid rgba(0,0,0,.08);
  display: flex; align-items: center; justify-content: center; color: #3F4A5A; box-shadow: 0 2px 8px rgba(0,0,0,.18);
}
.am-zoom { right: 10px; bottom: 10px; display: grid; gap: 6px; justify-items: center; }
.am-zoom .z {
  width: 26px; height: 26px; border-radius: 7px; background: rgba(255,255,255,.94); color: #12331A;
  display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600;
  box-shadow: 0 2px 8px rgba(0,0,0,.18); line-height: 1;
}
.am-legend {
  left: 10px; bottom: 10px; background: rgba(255,255,255,.94); border-radius: 9px; padding: 9px 11px;
  box-shadow: 0 4px 14px rgba(0,0,0,.2); color: #12331A; font-size: 10.5px; min-width: 150px;
}
.am-legend b { display: flex; align-items: center; gap: 6px; font-size: 11px; margin-bottom: 6px; }
.am-legend b .d { width: 6px; height: 6px; border-radius: 50%; background: #16A34A; }
.am-legend .r { display: flex; align-items: center; gap: 7px; margin-top: 4px; }
.am-legend .sw { width: 10px; height: 10px; border-radius: 3px; flex: none; }

/* map SVG internals. These classes live on elements inside the inline <svg>,
   so they are scoped here rather than in a <style> block the SVG would leak. */
.app-mock .mg-road { stroke: #D8D2BA; stroke-width: 1.6; fill: none; opacity: .5; stroke-linejoin: round; stroke-linecap: round; }
.app-mock .mg-cluster { stroke: #F0A93F; stroke-width: .9; fill: none; opacity: .5; }
.app-mock .mg-blk { stroke-width: 2.1; stroke-linejoin: round; }
.app-mock .mg-lab rect { fill: rgba(10,18,8,.84); }
.app-mock .mg-lab .mg-l1 { fill: #FFFFFF; font-size: 11.5px; font-weight: 700; }
.app-mock .mg-lab .mg-l2 { fill: rgba(255,255,255,.72); font-size: 8.5px; }
.app-mock .mg-pin circle { fill: #FFFFFF; opacity: .95; }
.app-mock .mg-emb { fill: #2E86C1; }
.app-mock .mg-jog { fill: #6B4A2A; }

/* estate rail */
.am-rail { padding: 12px; background: var(--surface-2); display: grid; gap: 8px; align-content: start; min-width: 0; overflow: hidden; }
.am-card { border: 1px solid var(--line); border-radius: 9px; background: var(--surface); padding: 10px; }
.am-card-h {
  display: flex; align-items: center; gap: 7px; font-size: 9.5px; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--grey); white-space: nowrap; line-height: 1.2;
}
.am-card-h .st { display: inline-flex; align-items: center; gap: 5px; color: var(--amber); letter-spacing: .02em; text-transform: none; font-size: 11px; font-weight: 600; }
.am-card-h .st .d { width: 6px; height: 6px; border-radius: 50%; background: var(--amber); }
.am-card-h .arw { margin-left: auto; color: var(--grey); }
.am-card-t { font-size: 14.5px; font-weight: 700; letter-spacing: -.02em; margin-top: 6px; color: var(--ink); }
.am-card .code { font-family: var(--f-mono); font-size: 10.5px; color: var(--grey); margin-top: 2px; }
.am-score-h { display: flex; align-items: baseline; gap: 8px; margin-top: 9px; padding-top: 9px; border-top: 1px solid var(--line); }
.am-score-h b { font-size: 12.5px; color: var(--ink); }
.am-score-h em { font-style: normal; margin-left: auto; font-size: 10.5px; color: var(--grey); }
.am-score { display: flex; align-items: baseline; gap: 8px; margin-top: 5px; }
.am-score .v { font-size: 27px; font-weight: 700; letter-spacing: -.04em; color: var(--amber); line-height: 1; }
.am-score .u { font-size: 14px; font-weight: 600; color: var(--grey); }
.am-score .dl { margin-left: auto; font-size: 10.5px; font-weight: 600; color: var(--green); }
.am-note { font-size: 9.5px; color: var(--grey); line-height: 1.45; margin-top: 6px; }
.am-cause { margin-top: 9px; border-radius: 8px; background: var(--amber-soft); padding: 8px 9px; }
.am-cause b { display: block; font-size: 11px; color: var(--amber); margin-bottom: 5px; }
.am-cause ul { margin: 0; padding: 0; }
.am-cause li { font-size: 10.5px; color: var(--amber); line-height: 1.55; list-style: none; padding-left: 11px; position: relative; }
.am-cause li::before { content: "·"; position: absolute; left: 3px; font-weight: 700; }
.am-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.am-cell { border: 1px solid var(--line); border-radius: 8px; background: var(--surface); padding: 5px 7px; }
.am-cell .l { font-size: 9px; color: var(--grey); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.am-cell .v { font-size: 13px; font-weight: 700; letter-spacing: -.02em; margin-top: 1px; color: var(--ink); }
.am-cell .v.warn { color: var(--red); }
.am-hyb-h { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 600; color: var(--ink); }
.am-hyb-h .demo { font-size: 8.5px; font-weight: 700; letter-spacing: .08em; background: var(--blue-soft); color: var(--navy); padding: 2px 6px; border-radius: 4px; }
.am-hyb { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-top: 8px; }
.am-hyb .c { border: 1px solid var(--line); border-radius: 7px; padding: 6px 5px; text-align: center; background: var(--surface-2); }
.am-hyb .c .l { font-size: 9px; color: var(--grey); font-weight: 600; }
.am-hyb .c .v { font-size: 13.5px; font-weight: 700; margin-top: 2px; color: var(--ink); }
.am-foot { font-size: 9.5px; color: var(--grey); margin-top: 8px; line-height: 1.45; }
.am-src { font-size: 9.5px; color: var(--grey); line-height: 1.45; padding: 0 2px; }

/* The rail goes first, then the sidebar: each one drops the column the layout
   can no longer hold without squeezing the map below a usable size. */
@media (max-width: 1080px) { .am-main { grid-template-columns: 1fr; } .am-rail { display: none; } .am-col { border-right: 0; } }
@media (max-width: 860px) {
  .am-body { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  .am-side { display: none; }
  .am-attn-g { grid-template-columns: 1fr; }
  .am-main { min-height: 0; }
  .am-map { min-height: 290px; }
  .am-top { flex-wrap: wrap; gap: 7px; }
  .am-search { order: -1; flex: 1 1 100%; max-width: none; }
}
@media (max-width: 640px) { .am-top .right { display: none; } .am-search { max-width: none; } .am-map { min-height: 250px; } }

/* ---------- field record ---------- */
.shots { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); margin-top: 22px; }
@media (max-width: 900px) { .shots { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px) { .shots { grid-template-columns: 1fr; } }
.shot { margin: 0; background: var(--surface); }
.shot-img {
  position: relative; aspect-ratio: 4 / 3; overflow: hidden; background-color: var(--surface-2);
  background-image: linear-gradient(var(--line) 1px, transparent 1px),
                    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 22px 22px, 22px 22px;
}
.shot-img img { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%; object-fit: cover; display: block; }
.shot-img .ph {
  position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 7px; padding: 12px; text-align: center;
  font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
}
.shot-img .ph svg { width: 20px; height: 20px; opacity: .5; }
.shot figcaption { padding: 12px 14px; border-top: 1px solid var(--line); }
.shot figcaption b { display: block; font-family: var(--f-mono); font-size: 11px; letter-spacing: .06em; color: var(--ink); }
.shot figcaption span { display: block; font-size: 12.5px; color: var(--ink-2); margin-top: 4px; }
.shot figcaption em { display: block; font-style: normal; font-family: var(--f-mono); font-size: 10px; letter-spacing: .07em; color: var(--grey); margin-top: 5px; }

/* ---------- logo walls ----------
   Supply monochrome logos where possible: a single-colour PNG/SVG reads on both
   grounds. For colour marks, drop the grayscale filter below. */
.logo-group + .logo-group { margin-top: 26px; }
/* gap + per-cell borders, so an incomplete final row leaves clean ground
   rather than a tinted empty cell */
.logos { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 14px; }
@media (max-width: 760px) { .logos { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .logos { grid-template-columns: repeat(2, 1fr); } }
.logo-cell { position: relative; background: var(--surface); border: 1px solid var(--line); aspect-ratio: 5 / 2; display: flex; align-items: center; justify-content: center; padding: 14px; }
.logo-cell img {
  max-width: 100%; max-height: 100%; object-fit: contain; position: relative; z-index: 2;
  filter: grayscale(1); opacity: .8; transition: opacity .15s ease, filter .15s ease;
}
.logo-cell:hover img { filter: none; opacity: 1; }
.logo-cell .ph {
  position: absolute; inset: 0; z-index: 1; display: flex; align-items: center; justify-content: center;
  font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--grey); text-align: center; padding: 8px;
}
/* Partner marks come in full colour on a white ground; give them a light chip
   so they read on the dark theme too, rather than inverting them. */
.logo-cell:has(img) { background: #FFFFFF; }
/* Safety net for images added by hand later: a filled slot must never show the
   placeholder underneath. object-fit:contain leaves gaps, so the text would
   otherwise read straight through a transparent logo or packshot. */
.logo-cell:has(img) .ph,
.bio-img:has(img) .ph,
.shot-img:has(img) .ph { display: none; }
.logo-cell img { filter: none; opacity: 1; }
.logo-cell:hover img { transform: none; }

/* ---------- lot identifier, taken apart (for-buyers) ---------- */
/* The code is the page's whole argument, so it is set at display size in the
   mono face rather than in a card. Each underlined segment is one level of the
   address: province, cluster, block-and-cycle. */
.lotid {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px;
  font-family: var(--f-mono); font-variant-numeric: tabular-nums;
  font-size: clamp(40px, 8vw, 78px); font-weight: 600;
  letter-spacing: .01em; line-height: 1; color: var(--ink);
}
.lotid .seg { border-bottom: 3px solid var(--blue); padding-bottom: 10px; }
/* The whole .lotid is role="img" with its own description, so the dashes are
   arguably incidental text inside a picture. They are still drawn type at
   1.94:1 though, and --grey costs nothing — the same call as .crumb span. */
.lotid .sep { color: var(--grey); }
.lotkey { display: grid; grid-template-columns: repeat(3, 1fr); gap: 30px; margin-top: 28px; }
@media (max-width: 780px) { .lotkey { grid-template-columns: 1fr; gap: 16px; } }
.lotkey > div { border-top: 1px solid var(--line); padding-top: 13px; }
.lotkey .m { font-family: var(--f-mono); font-size: 12px; letter-spacing: .1em; color: var(--blue); }
.lotkey p { font-size: 14px; color: var(--ink-2); margin: 7px 0 0; }

/* ---------- SLA ---------- */
.sla { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 780px) { .sla { grid-template-columns: 1fr; } }
.sla > div { background: var(--surface); padding: 26px; }
.sla .num { font-family: var(--f-display); font-weight: 800; font-size: 40px; letter-spacing: -.04em; line-height: 1; color: var(--green); }
.sla .lbl { font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--grey); margin-top: 10px; }
.sla p { font-size: 13.5px; color: var(--ink-2); margin-top: 12px; }
.kpi { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; }
.kpi li {
  display: flex; justify-content: space-between; align-items: baseline; gap: 14px;
  padding: 8px 0; border-bottom: 1px dashed var(--line); font-size: 13.5px; color: var(--ink-2);
}
.kpi li:last-child { border-bottom: 0; }
.kpi b { font-family: var(--f-mono); font-variant-numeric: tabular-nums; font-size: 13px; color: var(--ink); white-space: nowrap; }

/* ---------- serve / team ---------- */
.serve { display: grid; grid-template-columns: repeat(3,1fr); gap: 26px; }
@media (max-width: 880px) { .serve { grid-template-columns: 1fr; } }
.serve > div { border-top: 3px solid var(--blue); padding-top: 20px; }
.serve > div:nth-child(2) { border-top-color: var(--green); }
.serve > div:nth-child(3) { border-top-color: var(--amber); }
.serve p { font-size: 14px; color: var(--ink-2); margin-top: 10px; }
.serve ul { margin: 14px 0 0; padding-left: 17px; font-size: 13.5px; color: var(--ink-2); line-height: 1.75; }
.serve .go { display: inline-block; margin-top: 16px; font-family: var(--f-mono); font-size: 11.5px; letter-spacing: .07em; text-transform: uppercase; color: var(--blue); text-decoration: none; }
.serve .go:hover { text-decoration: underline; }
.team { display: grid; grid-template-columns: repeat(3,1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 780px) { .team { grid-template-columns: 1fr; } }
.team > div { background: var(--surface); padding: 26px; }
.team .num { font-family: var(--f-display); font-weight: 800; font-size: 40px; letter-spacing: -.04em; line-height: 1; }
.team .lbl { font-size: 13.5px; color: var(--ink-2); margin-top: 8px; }

/* ---------- contact form ---------- */
.form { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; max-width: 720px; }
@media (max-width: 700px) { .form { grid-template-columns: 1fr; } }
.field { display: flex; flex-direction: column; gap: 7px; }
.field.full { grid-column: 1 / -1; }
.field label { font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--grey); }
.field input, .field select, .field textarea {
  font-family: var(--f-body); font-size: 15px; padding: 11px 13px; color: var(--ink);
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: 0;
}
.field textarea { min-height: 120px; resize: vertical; }
.field input:focus, .field select:focus, .field textarea:focus { outline: 2px solid var(--blue); outline-offset: 1px; }
/* .field is a stretch-aligned flex column — keep the button its own width */
.field .btn { align-self: flex-start; }

/* ---------- CTA band ---------- */
.cta { background: #121B54; color: #F4F5F8; border-bottom: 0; }
.cta h2 { color: #FFF; }
.cta .lede { color: #C3CBF2; }
.cta .eyebrow { color: #8892C9; }
.cta .eyebrow::after { background: #39437B; }
.cta .btn:hover { box-shadow: 3px 3px 0 rgba(255,255,255,.4); }
.cta .btn.ghost { background: transparent; color: #F4F5F8; border-color: #4A548F; }
.cta .btn.ghost:hover { box-shadow: 3px 3px 0 #4A548F; }

/* ---------- impact: reports ----------
   The current report is the highlighted card; every earlier one is a row in the
   list below it. The tint is what carries the highlight, so the NEW chip inside
   goes solid — on the tinted ground its usual soft fill would disappear. */
.report {
  display: flex; flex-wrap: wrap; align-items: center; gap: 20px 26px;
  background: var(--blue-soft); border: 1px solid var(--blue); padding: 24px 26px;
}
.report .pill { background: var(--blue); border-color: var(--blue); color: var(--paper); }
.report > div { flex: 1 1 320px; min-width: 0; }
.report-tag { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.report-tag b { font-family: var(--f-display); font-size: 20px; letter-spacing: -.025em; }
.report p { font-size: 14.5px; color: var(--ink-2); margin-top: 9px; }
.btn svg { width: 14px; height: 14px; vertical-align: -2px; margin-right: 9px; }

.reports { border: 1px solid var(--line); background: var(--surface); }
.rpt {
  display: grid; grid-template-columns: auto 1fr auto; gap: 16px; align-items: center;
  width: 100%; text-align: left; font: inherit; color: inherit; cursor: pointer;
  background: none; border: 0; border-bottom: 1px solid var(--line);
  padding: 15px 26px; text-decoration: none; transition: background .15s ease;
}
.rpt > * { min-width: 0; }
.rpt:last-child { border-bottom: 0; }
.rpt:hover { background: var(--surface-2); }
.rpt > svg { width: 17px; height: 17px; color: var(--grey); }
.rpt b { font-size: 15px; font-weight: 600; }
.rpt .mono { font-size: 10.5px; letter-spacing: .09em; text-transform: uppercase; color: var(--grey); }
@media (max-width: 560px) { .rpt { padding: 15px 20px; gap: 13px; } }

/* ---------- report gate ----------
   The dialog is the only thing between a visitor and a report file. It is a
   native <dialog>, so focus trapping, Escape and the backdrop come for free. */
.gate {
  width: min(560px, calc(100vw - 32px)); padding: 0; color: var(--ink);
  background: var(--surface); border: 1px solid var(--line-strong);
  box-shadow: 0 24px 64px rgba(8, 12, 30, .38);
}
.gate::backdrop { background: rgba(8, 12, 30, .62); }
.gate-in { position: relative; padding: 30px 30px 28px; }
.gate-x { position: absolute; top: 12px; right: 12px; }
.gate h2 { font-size: clamp(24px, 3vw, 30px); margin-top: 14px; }
.gate .lede { font-size: 14.5px; margin-top: 12px; max-width: none; }
.gate-doc {
  display: flex; align-items: baseline; gap: 12px; margin-top: 20px;
  padding: 12px 14px; background: var(--blue-soft); border: 1px solid var(--blue);
}
.gate-doc .mono { font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: var(--blue); }
.gate-doc b { font-size: 15px; }
.gate .form { margin-top: 20px; max-width: none; gap: 16px; }
.gate .form[hidden] { display: none; }
.gate .formstate { margin: 20px 0 0; padding: 17px 19px; font-size: 14.5px; }
/* the consent tick reads as a sentence, not as a field label */
.check label {
  display: flex; align-items: flex-start; gap: 11px;
  font-family: var(--f-body); font-size: 13.5px; line-height: 1.5;
  letter-spacing: 0; text-transform: none; color: var(--ink-2);
}
.check input { width: 17px; height: 17px; flex: none; margin: 2px 0 0; accent-color: var(--blue); }
.gate-actions { flex-direction: row; flex-wrap: wrap; gap: 12px; align-items: center; }
@media (max-width: 560px) {
  .gate .form { grid-template-columns: 1fr; }
  .gate-in { padding: 26px 22px 24px; }
}

/* ---------- product detail ----------
   The card stays a plain div so the packshot, name and status flag keep their
   own semantics; a stretched button on top carries the click and the keyboard
   focus. It sits above .bio-img img, which is z-index 2. */
.bio:hover, .bio:focus-within { border-color: var(--line-strong); }
.bio-open {
  position: absolute; inset: 0; z-index: 3;
  width: 100%; padding: 0; background: none; border: 0; cursor: pointer;
}
.bio-open:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

/* Same native <dialog> as the report gate, so focus trapping, Escape and the
   backdrop come for free. Wider, because this one carries running copy. */
.pmodal {
  width: min(720px, calc(100vw - 32px)); max-height: min(86vh, 900px);
  padding: 0; color: var(--ink); overflow: auto;
  background: var(--surface); border: 1px solid var(--line-strong);
  box-shadow: 0 24px 64px rgba(8, 12, 30, .38);
}
.pmodal::backdrop { background: rgba(8, 12, 30, .62); }
.pmodal-in { position: relative; padding: 30px 30px 28px; }
.pmodal-x { position: absolute; top: 12px; right: 12px; z-index: 2; }

.pdet[hidden] { display: none; }
.pdet-head { display: grid; grid-template-columns: 132px 1fr; gap: 20px; align-items: start; }
.pdet-shot {
  aspect-ratio: 1 / 1; background: #FFFFFF; border: 1px solid var(--line);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.pdet-shot img { width: 100%; height: 100%; object-fit: contain; display: block; }
.pdet-id h2 { font-size: clamp(22px, 2.6vw, 28px); margin-top: 8px; }
.pdet-id .bio-flag { margin-top: 12px; }
.pdet-body { margin-top: 24px; }
.pdet-body p { font-size: 14.5px; line-height: 1.6; color: var(--ink-2); }
.pdet-body p + p { margin-top: 12px; }
.pdet-body .note { margin-top: 16px; }
.pdet-body h3 {
  margin-top: 24px; font-family: var(--f-mono); font-size: 10.5px;
  letter-spacing: .1em; text-transform: uppercase; color: var(--grey);
}
.pdet-list { margin-top: 12px; padding: 0; list-style: none; display: grid; gap: 9px; }
.pdet-list li {
  position: relative; padding-left: 22px;
  font-size: 14px; line-height: 1.55; color: var(--ink-2);
}
/* the catalogue marks every benefit with a green tick; this is that tick */
.pdet-list li::before {
  content: ""; position: absolute; left: 2px; top: 6px; width: 10px; height: 6px;
  border-left: 2px solid var(--green); border-bottom: 2px solid var(--green);
  transform: rotate(-45deg);
}
.pdet-spec { margin-top: 22px; display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); }
.pdet-spec > div { display: grid; grid-template-columns: 128px 1fr; gap: 14px; padding: 12px 14px; background: var(--surface); }
.pdet-spec dt {
  font-family: var(--f-mono); font-size: 9.5px; letter-spacing: .09em;
  text-transform: uppercase; color: var(--grey); padding-top: 2px;
}
.pdet-spec dd { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--ink-2); }
@media (max-width: 560px) {
  .pmodal-in { padding: 26px 20px 24px; }
  .pdet-head { grid-template-columns: 92px 1fr; gap: 15px; }
  .pdet-spec > div { grid-template-columns: 1fr; gap: 5px; }
}

/* ---------- impact: SDG band ----------
   The same fixed navy as the closing CTA, in both themes on purpose: the goal
   colours below are the UN's and cannot be re-tuned per theme, so they need one
   known ground to sit on. */
.band { background: #121B54; color: #F4F5F8; border-bottom: 0; }
.band h2 { color: #FFF; }
.band .lede { color: #C3CBF2; }
.band .eyebrow { color: #8892C9; }
.band .eyebrow::after { background: #39437B; }
.band .note { color: #C3CBF2; }
/* Cards on the band. Fixed hexes for the same reason the band itself is fixed:
   var(--surface) is near-navy in dark mode and would sink into the ground. */
.band .grid-2, .band .grid-3 { background: #39437B; border-color: #39437B; }
.band .card { background: #1B2568; }
.band .card h3 { color: #FFF; }
.band .card p { color: #C3CBF2; }
.band .card .tag { color: #9FB0FF; }
.band .card ul { color: #C3CBF2; }

/* Goal tiles: the UN's official icon artwork, on the band's fixed navy. Each
   file already carries its number and English name, so the caption beneath is
   there to translate — not to repeat. */
.sdgs { display: grid; grid-template-columns: repeat(5, 1fr); gap: 20px 16px; }
@media (max-width: 900px) { .sdgs { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 560px) { .sdgs { grid-template-columns: repeat(2, 1fr); } }
.sdg { display: flex; flex-direction: column; gap: 11px; }
.sdg img { display: block; width: 88px; height: 88px; }
@media (max-width: 560px) { .sdg img { width: 76px; height: 76px; } }
.sdg span {
  font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .08em;
  text-transform: uppercase; color: #C3CBF2; line-height: 1.5;
}

/* ---------- impact: farmer testimony ----------
   .av holds a monogram until a portrait is dropped in as an <img>. */
.voices { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 1000px) { .voices { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 700px)  { .voices { grid-template-columns: 1fr; } }
.voice { background: var(--surface); margin: 0; padding: 26px; display: flex; flex-direction: column; gap: 18px; }
.voice blockquote { margin: 0; }
.voice p { font-size: 14.5px; color: var(--ink-2); }
.voice figcaption { margin-top: auto; padding-top: 16px; border-top: 1px dashed var(--line); display: flex; align-items: center; gap: 12px; }
.voice .av {
  width: 40px; height: 40px; flex: none; overflow: hidden;
  background: var(--surface-2); border: 1px solid var(--line);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--f-mono); font-size: 12px; letter-spacing: .06em; color: var(--grey);
}
.voice .av img { width: 100%; height: 100%; object-fit: cover; }
.voice b { display: block; font-size: 14.5px; }
.voice em {
  display: block; font-style: normal; font-family: var(--f-mono); font-size: 10.5px;
  letter-spacing: .09em; text-transform: uppercase; color: var(--grey); margin-top: 3px;
}

/* ---------- prev / next ---------- */
.nextprev { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--line); border-top: 1px solid var(--line); }
@media (max-width: 700px) { .nextprev { grid-template-columns: 1fr; } }
.nextprev a { background: var(--paper); padding: 26px 28px; text-decoration: none; display: block; transition: background .15s ease; }
.nextprev a:hover { background: var(--surface); }
.nextprev .k { font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .11em; text-transform: uppercase; color: var(--grey); }
.nextprev .t { font-family: var(--f-display); font-weight: 800; font-size: 20px; letter-spacing: -.025em; margin-top: 8px; }
.nextprev a.next { text-align: right; }
/* first and last pages have only one link — let it span, so the empty
   half does not show the grid's tinted background */
.nextprev > a:only-child { grid-column: 1 / -1; }

/* ---------- footer ---------- */
footer { background: var(--surface); border-top: 1px solid var(--line); padding: 52px 0 40px; }
.foot-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 36px; }
@media (max-width: 880px) { .foot-grid { grid-template-columns: 1fr 1fr; gap: 30px; } }
@media (max-width: 520px) { .foot-grid { grid-template-columns: 1fr; } }
.foot-grid .logo-word { font-size: 21px; }
.foot-grid .foot-h { font-family: var(--f-mono); font-weight: 400; font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--grey); margin-bottom: 14px; }
.foot-grid ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 1px; }
.foot-grid a { text-decoration: none; font-size: 14px; color: var(--ink-2);
  display: inline-block; padding: 4px 0; }   /* 25px tall: a thumb target, not just a link */
.foot-grid a:hover { color: var(--ink); }
.foot-addr { font-size: 13.5px; color: var(--ink-2); line-height: 1.65; max-width: 34ch; }
.foot-bar {
  margin-top: 40px; padding-top: 22px; border-top: 1px solid var(--line);
  display: flex; flex-wrap: wrap; gap: 18px; justify-content: space-between;
  font-family: var(--f-mono); font-size: 11px; letter-spacing: .05em; color: var(--grey);
}

/* ---------- insights: post cards ---------- */
.posts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); }
@media (max-width: 980px) { .posts { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .posts { grid-template-columns: 1fr; } }
.posts > * { min-width: 0; }
.post {
  background: var(--surface); padding: 26px; display: flex; flex-direction: column; gap: 12px;
  text-decoration: none; transition: background .15s ease;
}
.post:hover { background: var(--surface-2); }
.post-meta { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; }
.post-cat { color: var(--blue); }
.post-date { color: var(--grey); }
.post h3 { font-size: 20px; line-height: 1.24; }
.post p { font-size: 14.5px; color: var(--ink-2); }
.post .go { margin-top: auto; padding-top: 14px; font-family: var(--f-mono); font-size: 11px; letter-spacing: .07em; text-transform: uppercase; color: var(--blue); }
.post-feat { display: grid; grid-template-columns: 1.15fr .85fr; gap: 0; border: 1px solid var(--line); background: var(--surface); text-decoration: none; margin-bottom: 26px; }
@media (max-width: 880px) { .post-feat { grid-template-columns: 1fr; } }
.post-feat > * { min-width: 0; }
.post-feat .body { padding: 34px; display: flex; flex-direction: column; gap: 14px; }
.post-feat h3 { font-size: clamp(24px, 2.6vw, 34px); line-height: 1.12; letter-spacing: -.028em; }
.post-feat p { font-size: 15.5px; color: var(--ink-2); }
.post-feat .shot-img { aspect-ratio: 16 / 10; border-left: 1px solid var(--line); }
@media (max-width: 880px) { .post-feat .shot-img { border-left: 0; border-top: 1px solid var(--line); } }
.post-feat .shot-img img, .post-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.post.has-cover { padding: 0; gap: 0; }
.post-cover { aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface-2); border-bottom: 1px solid var(--line); }
.post-body { padding: 24px 26px 26px; display: flex; flex: 1; flex-direction: column; gap: 12px; }
.insights-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 20px; }
.insights-filters { display: flex; flex-wrap: wrap; gap: 8px; }
.insights-filter { appearance: none; border: 1px solid var(--line-strong); background: var(--paper); color: var(--ink-2); padding: 10px 13px; font-family: var(--f-mono); font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase; cursor: pointer; }
/* `color: #fff` was fixed white on `--blue`, which is a dark blue in the light
   theme and a light one in the dark theme — 2.70:1 there. `--paper` follows the
   theme the way the language toggle already does, so it is dark ink on the light
   blue and light ink on the dark blue. */
.insights-filter:hover, .insights-filter[aria-pressed="true"] { border-color: var(--blue); background: var(--blue); color: var(--paper); }
.insights-search { width: min(300px, 100%); }
.insights-search input { width: 100%; min-height: 40px; border: 1px solid var(--line-strong); background: var(--paper); color: var(--ink); padding: 9px 12px; font: 14px var(--f-body); }
.insights-search input:focus { outline: 2px solid var(--blue); outline-offset: 2px; }
.insight-count { margin: 0 0 28px; font-family: var(--f-mono); font-size: 11px; letter-spacing: .06em; color: var(--grey); }
.insights-empty { grid-column: 1 / -1; padding: 34px 26px; background: var(--surface); color: var(--ink-2); }
.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; }
@media (max-width: 760px) {
  .insights-toolbar { align-items: stretch; flex-direction: column; }
  .insights-search { width: 100%; }
}

/* ---------- article prose ---------- */
.article { max-width: 720px; }
.article > * + * { margin-top: 22px; }
.article p, .article li { font-size: 17px; line-height: 1.72; color: var(--ink-2); }
.article h2 { font-size: clamp(22px, 2.4vw, 30px); margin-top: 46px; }
.article h3 { font-size: 19px; margin-top: 34px; }
.article ul, .article ol { padding-left: 22px; }
.article li + li { margin-top: 8px; }
.article li::marker { color: var(--blue); }
.article strong { color: var(--ink); }
.article blockquote {
  margin: 34px 0; padding: 4px 0 4px 24px; border-left: 3px solid var(--blue);
  font-family: var(--f-display); font-weight: 800; font-size: clamp(20px, 2.2vw, 26px);
  line-height: 1.28; letter-spacing: -.025em; color: var(--ink);
}
.article figure { margin: 34px 0; }
.article figcaption { font-family: var(--f-mono); font-size: 11px; letter-spacing: .05em; color: var(--grey); margin-top: 10px; }
.article-cover { max-width: 1040px; margin: 0 0 42px; aspect-ratio: 16 / 9; overflow: hidden; border: 1px solid var(--line); background: var(--surface-2); }
.article-cover img { width: 100%; height: 100%; display: block; object-fit: cover; }
.article .article-image { margin: 34px 0; }
.article .article-image img { width: 100%; height: auto; display: block; border: 1px solid var(--line); }
.article-tags { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
.article-tag { padding: 6px 8px; border: 1px solid var(--line); font-family: var(--f-mono); font-size: 10px; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-2); }
.article-meta {
  display: flex; gap: 18px; flex-wrap: wrap; padding: 16px 0; margin-top: 18px;
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
  font-family: var(--f-mono); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--grey);
}
.byline { display: flex; gap: 14px; align-items: center; margin-top: 44px; padding-top: 24px; border-top: 1px solid var(--line); }
.byline .av { width: 44px; height: 44px; background: var(--surface-2); border: 1px solid var(--line); flex: none; }
.byline b { display: block; font-size: 15px; }
.byline span { display: block; font-size: 13.5px; color: var(--grey); margin-top: 2px; }

/* ---------- careers: role rows ---------- */
.roles { border: 1px solid var(--line); background: var(--surface); }
.role {
  display: grid; grid-template-columns: 1fr auto auto; gap: 20px; align-items: center;
  padding: 22px 26px; border-bottom: 1px solid var(--line); text-decoration: none;
  transition: background .15s ease;
}
.role:last-child { border-bottom: 0; }
.role:hover { background: var(--surface-2); }
.role > * { min-width: 0; }
@media (max-width: 760px) { .role { grid-template-columns: 1fr; gap: 8px; } }
.role h3 { font-size: 18px; }
.role-team { font-family: var(--f-mono); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-2); margin-top: 5px; }
.role .where { font-family: var(--f-mono); font-size: 11.5px; color: var(--ink-2); white-space: nowrap; }
.role .go { font-family: var(--f-mono); font-size: 11px; letter-spacing: .07em; text-transform: uppercase; color: var(--blue); white-space: nowrap; }
.empty {
  border: 1px dashed var(--line-strong); background: var(--surface); padding: 34px 26px; text-align: center;
}
.empty p { font-size: 15px; color: var(--ink-2); max-width: 52ch; margin: 0 auto; }

/* ---------- form states ---------- */
.hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.field-err { font-size: 12.5px; color: var(--red, #B3261E); font-family: var(--f-body); }
:root { --red: #B3261E; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --red: #F2A8A2; } }
:root[data-theme="dark"] { --red: #F2A8A2; }
.field input[aria-invalid="true"], .field textarea[aria-invalid="true"], .field select[aria-invalid="true"] { border-color: var(--red); }
.formstate { padding: 22px 24px; border: 1px solid; margin-bottom: 22px; font-size: 15px; }
.formstate[hidden] { display: none; }
.formstate.ok { border-color: var(--green); background: var(--green-soft); color: var(--green); }
.formstate.err { border-color: var(--red); background: var(--amber-soft); color: var(--red); }
.formstate b { display: block; font-family: var(--f-display); font-size: 18px; letter-spacing: -.02em; margin-bottom: 6px; }
button[disabled] { opacity: .55; cursor: not-allowed; }
button[disabled]:hover { transform: none; box-shadow: none; }

/* ---------- figure states ---------- */

.vh { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
