/* ============================================================
   Sathyamangalam Atlas — institutional design system
   Site-wide as of 2026-08-14 (second pass). Originally built
   home-page-only as home-institutional.css; promoted to cover all
   11 pages, renamed institutional.css. Tokens extracted from a real
   public forestry corporation's site (colors, type, spacing measured
   via computed styles) but the layout, copy, and logo mark below are
   original — not a literal copy of their brand identity. Source Sans
   Pro is free (Google Fonts); no proprietary assets used.
   Loaded on every page after shared.css, under body.inst — shared.css
   still supplies the CSS reset, custom-property base and a few
   components (.reveal, palette overlay) that this file's selectors
   build on top of or override.
   ============================================================ */

/* Institutional pages are light-only by design, matching the reference
   site (it has no dark mode). shared.css components reused here (.bib/.bi,
   .tag, .tblwrap, filter pills, etc.) read shared.css's --bg2/--ink/--line/
   --faint tokens, which flip to dark values under :root[data-theme="dark"]
   or prefers-color-scheme — that combination was breaking those components
   (dark card backgrounds with dark text) whenever a visitor had dark mode
   saved from browsing the non-institutional pages. Re-pinning the light
   values here, scoped to body.inst, makes every inherited component
   dark-mode-immune without having to rewrite each one. */
/* ---- design tokens ----
   Radius, spacing and button-shape tokens added 2026-08-14, extracted the
   same way the six "pulled live from weyerhaeuser.com" comments elsewhere
   in this file were: getComputedStyle() against the live reference site,
   not eyeballed. Full scan of every element on weyerhaeuser.com found
   border-radius:4px on exactly one thing (a dropdown menu) and 0px on every
   button, card and content block on the page — there is no pill/rounded
   button anywhere in the reference. That's the source of truth for
   --r-btn below: it exists so every button-shaped selector reads the same
   variable instead of each one hand-writing its own radius, which is how
   .inst-tile-cta ended up shipped as border-radius:100px (a pill) while
   every other button on the site is square — same bug class as the
   body.inst h1/a specificity bugs fixed earlier, different mechanism (no
   shared token instead of no shared selector).
   --r-badge is verified separate: icon badges (.inst-mark, .inst-hero-ic)
   are not buttons and reference-site scanning didn't touch them; both now
   read --r-badge(3px) so the two badges share one value instead of each
   hand-writing its own (.inst-hero-ic was 4px, a 1px difference from
   .inst-mark's pre-existing 3px that had no documented reason to differ).
   --r-card likewise now covers .inst-quoteblock, the one pre-existing 4px
   "card" radius in the file. Avatars and stat-circles (border-radius:50%)
   and the plain 6px scrollbar-thumb radius are genuinely their own shapes,
   not part of this badge/card/button vocabulary — left as literals. */
body.inst{
  --bg:#fffefb!important; --bg2:#ffffff!important; --bg3:#f7f9fc!important;
  --panel:rgba(23,45,32,.035)!important; --line:#dcdcdc!important;
  --ink:#1f252c!important; --dim:#4b5560!important; --faint:#7c8794!important;
  --acc:#016a3a!important; --acc-dk:#014d2a!important; --acc2:#849732!important;
  --i-green:#016a3a; --i-green-dk:#014d2a; --i-teal:#015779;
  --i-ink:#444444; --i-dim:#767676; --i-line:#dcdcdc; --i-footer:#323232;
  --i-bg:#ffffff;
  /* radius scale: --r-btn is the only radius real buttons/CTAs may use. */
  --r-btn:0; --r-badge:3px; --r-card:4px;
  /* shared.css's own --r:14px (added 2026-08-15) — re-pinned here for the
     same reason --bg/--line/--ink above are: shared.css components
     (.card, .chartbox, .tblwrap, .pagenext, etc.) get reused directly on
     institutional pages (record.html alone mixes 23 shared.css components
     with 17 inst- ones), and without this override a 14px-rounded .card
     sits next to a 0px-square .inst-icontile on the same screen — the
     single sharpest "why do these look different" mismatch found in a
     full design-consistency audit. --r-card(4px) isn't used here on
     purpose: shared.css's heavily-rounded 14px reads as a completely
     different design language than this genre's near-square weyerhaeuser
     reference, so this snaps all the way to 0 (matching --r-btn) rather
     than to the smaller-but-still-visibly-rounded 4px card token. */
  --r:0!important;
  /* button padding/type scale — originally matched to weyerhaeuser.com's
     own a.button (5px 13px / 11px), but explicitly overridden 15 Aug 2026
     at the owner's request to make the larger .inst-btn-lg size (used on
     the home hero and heritage band) the sitewide default instead,
     superseding the earlier pixel-fidelity match. .inst-btn-lg itself is
     now redundant with the base size but left defined below rather than
     removed, in case a future request wants the two sizes to diverge
     again. */
  --btn-pad:14px 26px; --btn-fs:15px;
  /* ---- spacing & type scale (added 2026-08-14) ----
     NOT extracted from weyerhaeuser.com — checked first, and its content
     pages don't hold a consistent scale to extract (H2 was 27px/700 on one
     page, 24px/600 on another; vertical rhythm was 10px-dominant on one,
     3px-dominant on the other — real inconsistency in their own templates,
     not measurement error here). The one number that WAS confirmed twice,
     identically, is the H1: 40px/600/44px line-height/uppercase — already
     what .inst-hero-body h1 uses below, so that's independent confirmation
     of an earlier extraction, not new data.
     Everything else here is instead named from Atlas's OWN already-in-use
     values: tallied every font-size/margin/padding/gap in this file, kept
     the numbers that already recur (this is real, load-bearing repetition,
     not coincidence — e.g. 26px is .inst-release-wrap's page gutter and
     shows up 7+ times across header/hero/newsstrip/split-copy). Half-pixel
     one-offs (12.5px, 14.5px, 16.5px — mostly clamp()/viewport-relative
     leftovers) were left alone rather than forced onto this scale; this
     names the pattern that was already there, it doesn't re-lay the page. */
  --sp-1:4px; --sp-2:8px; --sp-3:14px; --sp-4:22px; --sp-5:30px; --sp-6:44px; --sp-7:64px;
  --gutter:26px;
  /* --sp-mid (added 2026-08-15): a second, smaller "heading/section to
     content below it" rhythm value sitting between --sp-5(30px) and
     --sp-6(44px). Found as 34px/36px/38px independently at 5 different
     selectors (.inst-eyebrow, .inst-stripe-h, .inst-timeline-band h2,
     .inst-timeline, .inst-quoteblock, .inst-statcircle-row) — close
     enough to read as one intended rhythm, not five unrelated numbers,
     but genuinely smaller than --sp-6 in most of those contexts (forcing
     them up to 44px would visibly loosen several home-page bands at
     once, a real change nobody asked for). Named and pinned at 36px, the
     middle of the observed cluster, so the drift stops rather than
     silently reappearing next time one of these gets touched. */
  --sp-mid:36px;
  --fs-h1:40px; --lh-h1:44px;
  --fs-h2:27px; --lh-h2:1.3;
  --fs-h3:19px; --lh-h3:1.4;
  --fs-body:18px; --lh-body:1.6;
  --fs-label:13px;
  font-family:'Source Sans Pro',var(--sans);
  background:var(--i-bg);
  color:var(--i-ink);
}
body.inst .grid-bg, body.inst::before{display:none}
body.inst .inst-theme{display:none}
/* Page-wide defaults. Scoped with :where(body.inst) so they contribute ZERO
   specificity — they are meant to be a baseline that any component rule can
   override with a plain class selector. Written as `body.inst h1` these were
   (0,1,2) and silently beat every component rule below: the video-hero
   headings rendered #2a2a2a, and `body.inst a{color:inherit}` overrode both
   .inst-nav a and .inst-btn to #444, so nav links and buttons went dark. */
:where(body.inst) h1,:where(body.inst) h2,:where(body.inst) h3,:where(body.inst) h4{font-family:'Source Sans Pro',sans-serif;color:#2a2a2a}
:where(body.inst) a{color:inherit}

/* ---- header ----
   Logo, nav, search and the theme/menu buttons all live in one row now
   (previously split into .inst-topbar + .inst-navrow, which pushed the
   nav onto its own line below the logo — merged into a single flex row
   once the Explore/Reserve dropdown grouping made the nav short enough
   to fit alongside the logo and search). */
.inst-header{position:relative;z-index:50;background:var(--i-green);border-bottom:1px solid var(--i-green-dk);overflow:visible}
.inst-topbar{max-width:1800px;margin:0 auto;padding:10px var(--gutter);display:flex;align-items:center;gap:20px;overflow:visible}
.inst-brand{display:flex;align-items:center;gap:10px;font-size:22px;font-weight:700;color:#fff;font-family:'Source Sans Pro',sans-serif;flex-shrink:0}
.inst-brand em{font-style:normal;font-weight:400;color:rgba(255,255,255,.78)}
.inst-mark{display:inline-grid;place-items:center;width:30px;height:30px;background:#fff;color:var(--i-green);font-size:15px;border-radius:var(--r-badge)}
.inst-logo{height:44px;width:auto;display:block;filter:brightness(0) invert(1)}
.inst-footer-top .inst-logo{filter:brightness(0) invert(1);height:46px}
@media(max-width:640px){.inst-logo{height:34px}.inst-footer-brand .inst-logo{height:46px}}
.inst-search{display:flex;align-items:center;border:1px solid rgba(255,255,255,.35);border-radius:0;overflow:hidden;align-self:center;flex-shrink:0;background:#fff;height:44px}
.inst-search input{border:none;padding:0 14px;font-family:'Source Sans Pro',sans-serif;font-size:15px;width:210px;height:100%;cursor:pointer;background:#fff;color:var(--i-dim)}
.inst-search button{border:none;background:var(--i-green-dk);color:#fff;width:44px;height:44px;cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;flex-shrink:0;line-height:1}

/* Nav bar height (44px), link font-size (16px), font-weight (600), letter-spacing
   (normal — not tracked out) and uppercase transform are exact getComputedStyle()
   measurements pulled live from weyerhaeuser.com's own nav (re-verified this
   session at the owner's request for pixel-level fidelity, not approximated). */
/* height:auto needed to cancel shared.css's generic `nav{height:66px}`
   (written for the non-institutional pages) — the bare-element selector
   matches this <nav class="inst-nav"> too and was silently fixing its
   height to one row, which only became visible as a bug once the mobile
   .inst-nav.open state needed to actually grow past that. */
.inst-nav{background:var(--i-green);display:flex;align-items:center;flex:1;min-width:0;align-self:center;overflow:visible;height:auto}
.inst-nav a,.inst-nav a:visited{color:#fff;font-size:16px;font-weight:600;letter-spacing:normal;text-transform:uppercase;
 padding:0 16px;height:44px;display:flex;align-items:center;white-space:nowrap;transition:background-color .15s;border-right:1px solid rgba(255,255,255,.12)}
.inst-nav a:hover,.inst-nav a.act,.inst-nav a:visited:hover{background:var(--i-green-dk)}
.inst-theme{background:var(--i-green-dk);border:none;color:#fff;width:44px;height:44px;cursor:pointer;font-size:15px;flex-shrink:0;align-self:center}
.inst-menutoggle{display:none;background:var(--i-green-dk);border:none;color:#fff;width:44px;height:44px;cursor:pointer;font-size:16px;flex-shrink:0;align-self:center}

/* ---- nav dropdown groups (Explore / Reserve) ----
   Desktop: click-toggled panel anchored under the trigger, positioned
   relative to .inst-nav itself (not the header) so nothing upstream
   needs overflow:visible for the panel to escape its box — every
   ancestor up to .inst-header already has overflow:visible set above,
   which was the actual cause of the panel getting clipped/pushed below
   the hero: .inst-nav's old overflow-x:auto (for horizontal scrolling
   on narrow screens, no longer needed now there are only 4 top-level
   items) was clipping the absolutely-positioned dropdown at its own
   bottom edge instead of letting it float freely above the hero. */
.inst-navgroup{position:relative}
.inst-navgroup>.inst-navtrigger{color:#fff;font-size:16px;font-weight:600;text-transform:uppercase;
 padding:0 16px;height:44px;display:flex;align-items:center;gap:6px;white-space:nowrap;cursor:pointer;
 background:none;border:none;border-right:1px solid rgba(255,255,255,.12);font-family:'Source Sans Pro',sans-serif;
 transition:background-color .15s}
.inst-navgroup>.inst-navtrigger:hover,.inst-navgroup.open>.inst-navtrigger,.inst-navgroup.has-act>.inst-navtrigger{background:var(--i-green-dk)}
.inst-navtrigger .caret{font-size:10px;transition:transform .15s}
.inst-navgroup.open .inst-navtrigger .caret{transform:rotate(180deg)}
.inst-navdrop{position:absolute;top:100%;left:0;min-width:220px;background:#fff;border:1px solid var(--i-line);
 box-shadow:0 16px 32px rgba(0,0,0,.18);z-index:100;display:none;flex-direction:column;padding:6px}
.inst-navgroup.open .inst-navdrop{display:flex}
.inst-navdrop a{color:var(--i-ink)!important;font-size:14px;font-weight:600;text-transform:none;letter-spacing:0;
 padding:11px 14px;height:auto!important;border-right:none!important;border-radius:3px}
.inst-navdrop a:hover,.inst-navdrop a.act{background:var(--i-green)!important;color:#fff!important}

/* Mid-range tier: 1252px–1417px.
   Measured, the seven flattened nav items need a 1418px viewport at full
   padding — wider than most laptops, which would have meant showing the
   burger to nearly everyone and defeating the point of flattening the
   Explore menu. So instead of hiding the nav here, we buy the ~290px back:
   nav link padding 16px->10px and the search input 210px->128px. Even
   tightened the row still needs 1252px, so below that the burger takes over. */
@media(min-width:1252px) and (max-width:1417px){
  .inst-nav a,.inst-nav a:visited{padding:0 10px}
  .inst-navgroup>.inst-navtrigger{padding:0 10px}
  .inst-search input{width:128px}
}

/* Burger breakpoint is 1251px, not the 900px you might expect, because the
   Explore dropdown was flattened: Land & Places / Life / People / History now
   sit at the top level alongside Reserve / About / Contact. Measured, those
   seven items need 669px, and with the logo (151) + search (256) + padding the
   single row needs 1252px even with the tightened mid-range padding above.
   Below that the items overflowed the bar and pushed
   a horizontal scrollbar onto the page, so the burger has to take over
   earlier than it used to. Re-measure this if nav labels change. */
@media(max-width:1251px){
  .inst-topbar{flex-wrap:wrap;padding:14px 20px}
  .inst-search{order:3;margin-left:auto}
  .inst-nav{display:none;flex-direction:column;overflow:visible;flex-basis:100%;order:5}
  /* Taken out of the topbar's flex flow entirely (position:absolute,
     anchored to .inst-header which is the nearest positioned ancestor)
     instead of wrapping onto its own flex line in-flow — in-flow, the
     opened list's real height (~420px for 7 items) wasn't being reflected
     in the header's own painted box, so the hero photo showed through
     behind most of the menu. As an absolute overlay with its own explicit
     background this can't happen regardless of the flex sizing above it. */
  .inst-nav.open{display:flex;position:absolute;top:100%;left:0;right:0;background:var(--i-green);
   max-height:calc(100vh - 66px);overflow-y:auto;box-shadow:0 12px 24px rgba(0,0,0,.25);z-index:60}
  .inst-nav a{width:100%;height:auto;padding:13px 20px;border-right:none;border-bottom:1px solid rgba(255,255,255,.12)}
  .inst-menutoggle{display:grid;place-items:center;order:4}
  .inst-theme{order:2}
  .inst-navgroup{width:100%}
  .inst-navgroup>.inst-navtrigger{width:100%;padding:13px 20px;border-right:none;border-bottom:1px solid rgba(255,255,255,.12)}
  .inst-navdrop{position:static;box-shadow:none;border:none;background:rgba(0,0,0,.14);padding:0;min-width:0;display:none}
  .inst-navgroup.open .inst-navdrop{display:flex}
  .inst-navdrop a{color:#fff!important;padding:12px 20px 12px 34px;border-radius:0;border-bottom:1px solid rgba(255,255,255,.08)}
  .inst-navdrop a:hover,.inst-navdrop a.act{background:var(--i-green-dk)!important}
}

/* ---- four-tile hero grid (home page) ---- */
/* 4 columns, zero gap, 400px height (at a 320px-per-tile reference width) are
   exact getComputedStyle() measurements pulled live from weyerhaeuser.com's
   own "row no-gutter" 4-tile hero grid, re-verified this session. */
/* Enlarged from 400px per request — this is the section pointing at Land,
   Life, Places and History, the pages the whole restructure is meant to
   lead with, so it gets more visual weight than the original design gave
   it. Caption type scaled up to match (was 19px/13px). */
.inst-tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:0;height:560px}
/* background-size:cover guarantees the image always fully fills the box
   with no gap, whatever its aspect ratio — background-size:110% (the
   previous approach) only left zoom headroom for images whose ratio
   already matched the box; other ratios left a visible gap on one axis.
   The hover zoom is now a transform:scale() on ::before instead of
   animating background-size, since scale() composes safely with cover
   for any image. */
.inst-tile{position:relative;display:block;overflow:hidden}
.inst-tile::before{content:"";position:absolute;inset:0;background-image:inherit;background-size:cover;background-position:center;
 background-repeat:no-repeat;transition:transform .5s cubic-bezier(.2,.8,.3,1)}
.inst-tile:hover::before,.inst-tile:focus-visible::before{transform:scale(1.1)}
/* z-index:1 on the gradient and z-index:2 on the caption: both are
   position:absolute with no stacking order set before, so paint order fell
   back to DOM order and the darkening gradient could sit on top of the
   title/subtitle text instead of underneath it. */
/* Darkened region deepened (40%→25% start, .82→.92 peak opacity) and a
   text-shadow added to the caption below — the new tile photos (bright
   foliage, white sky, high-key sepia) are lighter than the originals this
   gradient was tuned against, so the old strength no longer guaranteed
   legible white text regardless of source image. */
.inst-tile::after{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(180deg,transparent 25%,rgba(1,20,12,.92) 100%);transition:.3s}
.inst-tile:hover::after{background:linear-gradient(180deg,rgba(1,42,26,.2) 25%,rgba(1,20,12,.95) 100%)}
/* min-height reserves room for the teaser AND the button (.inst-tile-more,
   .inst-tile-cta) at all times, whether or not they're visible — the box's
   total height never changes between resting and hovered state. An earlier
   version let this box grow on hover (animating max-height 0 -> 90px),
   which changed .inst-tile-cap's real height; because .inst-tile-cap is
   bottom-anchored inside a tile with overflow:hidden that was contained on
   desktop, but the four tiles don't all grow by the same amount — "Land &
   Places" carries the longest teaser sentence and wraps to more lines than
   the others — so hovering it specifically was the one most likely to tip
   page content past the viewport height and pop a scrollbar, shifting the
   whole page sideways. Fixed height removes the possibility outright rather
   than tuning around it. Raised from 168 to 210px to fit the button line. */
/* Title/subtitle sit lower at rest (translateY pushes them down within the
   fixed-height box, closer to the bottom edge) and rise back to their
   natural position on hover, timed together with the teaser/CTA fading in
   below — box height itself never changes, only what's already explained
   above about why that matters. */
.inst-tile-cap{position:absolute;left:0;right:0;bottom:0;z-index:2;min-height:210px;padding:26px 26px 12px;color:#fff;text-align:center;text-shadow:0 1px 3px rgba(0,0,0,.6);
 transform:translateY(48px);transition:transform .28s ease}
.inst-tile:hover .inst-tile-cap,.inst-tile:focus-visible .inst-tile-cap{transform:translateY(0)}
.inst-tile-cap b{display:block;font-size:25px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;margin-bottom:7px}
.inst-tile-cap span{font-size:15px;font-weight:400;color:rgba(255,255,255,.88)}
/* Hover-reveal teaser (CSS only, no JS). Always occupies its layout space
   (display:block, real height) so nothing around it moves; only opacity and
   a small upward slide (translateY) animate on hover/focus. -webkit-line-
   clamp caps it at 3 lines so long sentences ("Land & Places") can't exceed
   the reserved min-height above. */
.inst-tile-more{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;
 opacity:0;transform:translateY(6px);font-size:13px;line-height:1.5;
 color:rgba(255,255,255,.82);font-weight:400;text-transform:none;letter-spacing:0;
 margin-top:10px;transition:opacity .28s ease,transform .28s ease}
.inst-tile:hover .inst-tile-more,.inst-tile:focus-visible .inst-tile-more{opacity:1;transform:translateY(0)}
/* Visible call-to-action, styled as .inst-btn-ghost's family (transparent +
   border, matching --r-btn/--btn-pad/--btn-fs tokens) rather than its own
   one-off shape. This used to be border-radius:100px — a pill — which was
   the concrete bug that started the token audit above: every real button on
   the reference site (weyerhaeuser.com) is square, .inst-btn already
   matched that, and this was the one selector that didn't. Same underlying
   mistake as the body.inst specificity bugs fixed earlier this session —
   one rule silently disagreeing with the rest of the system — just at the
   "shape" layer instead of the "which rule wins" layer.
   The whole tile is already the <a>, so this is a styled span, not a nested
   interactive element (a real <button>/<a> can't legally sit inside another
   <a>) — it reads as a button and shares the tile's single click target,
   same pattern as the rest of the site's full-card links (.inst-twocol-item
   etc). Same opacity/translateY reveal as the teaser, briefly delayed so it
   visibly follows the text in rather than arriving in the same instant. */
.inst-tile-cta{display:inline-flex;align-items:center;gap:7px;margin-top:var(--sp-3);padding:var(--btn-pad);
 border:1px solid rgba(255,255,255,.55);border-radius:var(--r-btn);font-size:var(--btn-fs);font-weight:600;
 letter-spacing:.03em;text-transform:uppercase;color:#fff;background:rgba(255,255,255,.08);
 opacity:0;transform:translateY(6px);transition:opacity .28s ease .05s,transform .28s ease .05s,background-color .2s,border-color .2s}
.inst-tile:hover .inst-tile-cta,.inst-tile:focus-visible .inst-tile-cta{opacity:1;transform:translateY(0);background:#fff;color:var(--i-green-dk);border-color:#fff}
/* Below 900px the teaser + CTA button are forced permanently visible (see
   the touch-device rule further down, since hover doesn't exist on
   mobile) — but a fixed aspect-ratio:4/3 box wasn't tall enough to fit
   title + wrapped description + button at 2-column tile widths, so
   .inst-tile's overflow:hidden was clipping the "Explore →" button clean
   off the bottom. min-height instead of aspect-ratio lets the tile grow to
   fit whatever content it's showing. */
@media(max-width:900px){.inst-tiles{grid-template-columns:repeat(2,1fr);height:auto}.inst-tile{aspect-ratio:auto;min-height:340px}.inst-tile-cap{min-height:0;padding:20px 18px 16px;transform:translateY(0)}}
@media(max-width:520px){.inst-tiles{grid-template-columns:1fr}}
/* Hover states like this one don't exist for touch, so the teaser and
   button would never be reachable on a phone/tablet with only a tap. Shown
   permanently below 900px (the same breakpoint the grid itself reflows at)
   instead of hidden and unreachable. The zoom-on-hover background-size is
   left as-is; without a hover event it simply never triggers on touch. */
@media(max-width:900px){.inst-tile-more,.inst-tile-cta{opacity:1;transform:none}}

/* ---- full-screen video hero (home page) ----
   Always exactly the viewport height, on any screen resolution. The
   header would normally sit in document flow above this and push the
   total page height to header-height + 100vh ("over height") — fixed
   here by making the header float on top of the video instead (only
   on the page that has body.inst-home, i.e. index.html; interior pages
   keep the header in normal flow above their static hero image, which
   never had this problem since those heroes aren't 100vh). The hero
   itself starts at the true top of the viewport and the header overlaps
   its first ~64px with its own opaque green background. */
body.inst-home .inst-header{position:fixed;top:0;left:0;right:0}
body.inst-home .inst-videohero{margin-top:0}
.inst-videohero{position:relative;height:100vh;height:100svh;overflow:hidden;background:#0a1a12}
.inst-videohero video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.inst-videohero-overlay{position:absolute;inset:0;z-index:2;display:flex;align-items:flex-end;justify-content:flex-start;
 background:linear-gradient(0deg,rgba(1,10,6,.88) 0%,rgba(1,10,6,.62) 40%,rgba(1,10,6,.2) 75%,rgba(1,10,6,0) 100%)}
.inst-videohero-overlay .inst-release-wrap{padding:var(--gutter) var(--gutter) 90px;text-align:left;margin:0}
/* The real h3 left-alignment fix lives on the .inst-videohero-overlay h3
   rule further down (with the rest of that selector's properties) — a
   duplicate margin-only rule used to sit here, but a later, more complete
   declaration of the same selector was overwriting it with margin:0 auto,
   which is the bug this comment used to hide. Consolidated into one rule. */

/* ---- press-release headline block (home page) ---- */
.inst-release-wrap{max-width:1800px;margin:0 auto;padding:0 var(--gutter)}
.inst-release{padding:64px 0 48px;text-align:center;background:#fff}
.inst-release h1{font-size:29px;font-weight:700;text-transform:uppercase;
 letter-spacing:.01em;color:#333;margin-bottom:20px;line-height:1.3}
.inst-release h3{font-size:var(--fs-h3);font-weight:400;font-style:italic;
 color:#555;line-height:1.6;max-width:760px;margin:0 auto 32px}
.inst-videohero-overlay h1{font-size:clamp(28px,4vw,42px);font-weight:700;text-transform:uppercase;
 letter-spacing:.01em;color:#fff;margin-bottom:22px;line-height:1.3;
 text-shadow:0 1px 0 rgba(0,0,0,.9),0 2px 4px rgba(0,0,0,.8),0 6px 24px rgba(0,0,0,.6)}
/* margin:0 0 34px, not 0 auto 34px: this box has max-width:760px inside a
   much wider hero, and `auto` left/right centers it — pulling the subhead
   right of the headline above it instead of sharing its left edge. The
   earlier .inst-videohero-overlay h3{margin-left:0;margin-right:auto} rule
   was written to prevent exactly this, but this rule is declared later at
   equal specificity and was overwriting it with the shorthand. */
.inst-videohero-overlay h3{font-size:var(--fs-h3);font-weight:400;font-style:italic;
 color:#fff;line-height:1.6;max-width:760px;margin:0 0 34px;
 text-shadow:0 1px 0 rgba(0,0,0,.9),0 2px 4px rgba(0,0,0,.75),0 4px 16px rgba(0,0,0,.55)}
/* Button padding (5px 13px), font-size (11px), border-radius (0 — square, not
   rounded), uppercase, and transition:all are exact getComputedStyle() values
   pulled live from weyerhaeuser.com's own CTA buttons. Kept at this literal
   scale (small, tight, square) rather than the larger pill shape used
   elsewhere on Atlas's other genre, per the owner's pixel-fidelity request —
   gap/letter-spacing were not present on the reference button so those two
   properties are Atlas's own choice, not measured. */
.inst-btn,.inst-btn:visited{display:inline-flex;align-items:center;justify-content:center;gap:7px;background:var(--i-green);color:#fff;font-weight:600;
 font-size:var(--btn-fs);letter-spacing:.03em;text-transform:uppercase;padding:var(--btn-pad);border-radius:var(--r-btn);transition:all .15s;border:none;cursor:pointer}
/* One shared hover animation for every .inst-btn variant (ghost, -lg, and
   the per-context background overrides on .inst-stripe/.inst-split-copy-
   green/.inst-closing) — those only override background-color, so the lift
   + shadow here still applies underneath them since it's on the same base
   selector every variant carries. */
.inst-btn:hover{background:var(--i-green-dk);transform:translateY(-2px);box-shadow:0 6px 16px rgba(1,42,26,.22)}
.inst-btn:active{transform:translateY(0);box-shadow:0 2px 6px rgba(1,42,26,.18)}
/* Larger variant for buttons standing alone against a full-bleed photo/video
   hero (e.g. the home page video hero), where the default --btn-fs/--btn-pad
   reads too small against that much empty space. */
.inst-btn-lg{font-size:15px;padding:14px 26px;gap:9px}
/* Arrow inside .inst-btn, drawn from two rotated borders rather than the
   "»" character: every tested font gives that glyph asymmetric left/right
   side-bearing, so no amount of margin-tweaking centered it reliably
   against the label. A border-drawn chevron has no phantom whitespace, so
   it centers exactly by construction. */
.inst-btn-arrow{position:relative;display:inline-block;width:.62em;height:.6em;align-self:center}
.inst-btn-arrow::before,.inst-btn-arrow::after{content:"";position:absolute;top:50%;left:0;width:.4em;height:.4em;
 margin-top:-.2em;border-right:.14em solid currentColor;border-top:.14em solid currentColor;transform:rotate(45deg)}
.inst-btn-arrow::after{left:.22em}
.inst-btn-ghost,.inst-btn-ghost:visited{background:transparent;border:1px solid var(--i-line);color:var(--i-ink)}
.inst-btn-ghost b{color:var(--i-green);font-variant-numeric:tabular-nums;margin-left:4px}
/* Base .inst-btn:hover sets a dark-green background for every .inst-btn,
   ghost variants included — without this, ghost buttons on a light
   background go dark-text-on-dark-green (invisible) on hover. */
.inst-btn-ghost:hover{color:#fff;border-color:var(--i-green-dk)}
.inst-btn-ghost:hover b{color:#fff}

/* ---- news strip, photo-backed dark section (home page) ---- */
.inst-newsstrip{background-size:cover;background-position:center;padding:52px 0 44px;color:#fff}
.inst-eyebrow{text-align:center;font-size:22px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--sp-mid)}
.inst-newsgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:0}
.inst-newsitem{padding:0 var(--gutter);border-right:1px solid rgba(255,255,255,.28);color:#fff;display:block}
.inst-newsitem:last-child{border-right:none}
.inst-date{display:block;font-size:var(--fs-label);color:rgba(255,255,255,.75);text-align:center;margin-bottom:10px;letter-spacing:.03em}
.inst-newsitem b{display:block;font-size:16px;font-weight:700;text-align:center;line-height:1.4}
.inst-viewall{display:block;text-align:center;margin-top:var(--sp-5);font-size:var(--fs-label);font-weight:700;letter-spacing:.04em;
 text-transform:uppercase;color:#fff}
@media(max-width:760px){.inst-newsgrid{grid-template-columns:1fr;gap:26px}.inst-newsitem{border-right:none;border-bottom:1px solid rgba(255,255,255,.2);padding-bottom:22px}.inst-newsitem:last-child{border-bottom:none}}

.inst-sitemap-bar{text-align:center;padding:22px 0;background:#fff;border-top:1px solid var(--i-line)}

/* ---- eyebrow ---- */
.inst-eyebrow-sm{font-size:var(--fs-label);font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--i-green);margin-bottom:12px}
.inst-eyebrow-sm-dark{color:#fff}

/* ---- species split band (home page) ---- */
.inst-split{display:grid;grid-template-columns:1fr 1fr;min-height:440px}
.inst-split-img{background-size:cover;background-position:center}
.inst-split-copy{padding:60px 64px;display:flex;flex-direction:column;justify-content:center;background:#fafafa}
.inst-split-copy h2{font-size:var(--fs-h2);font-weight:700;color:#2a2a2a;line-height:var(--lh-h2);margin-bottom:16px}
.inst-split-copy p{font-size:15px;color:var(--i-dim);line-height:1.7;margin-bottom:26px}
/* Green variant (Elephant Corridors band) — h2/p colors overridden
   explicitly since the base rules above target #2a2a2a/var(--i-dim),
   both illegible on a dark green background. Button gets its own
   white-on-transparent treatment (matching .inst-stripe/.inst-closing's
   existing pattern for a colored button context) since the default
   .inst-btn green would disappear against a green background. */
.inst-split-copy-green{background:var(--i-green)}
.inst-split-copy-green h2{color:#fff}
.inst-split-copy-green p{color:rgba(255,255,255,.85)}
.inst-split-copy-green .inst-btn{background:#fff;color:var(--i-green)}
.inst-split-copy-green .inst-btn:hover{background:#eee}
@media(max-width:800px){.inst-split{grid-template-columns:1fr}.inst-split-img{height:280px}.inst-split-copy{padding:40px 26px}}

/* ---- recognition band (home page, four sourced-facts cards) ---- */
.inst-recog{background:var(--i-green);padding:64px 0 60px}
/* color:#fff set explicitly for the same reason as .inst-stripe-h above —
   the global :where(body.inst) h2{color:#2a2a2a} rule wins over inherited
   color regardless of specificity, so it has to be stated directly here
   now that the section background is dark green instead of white. */
.inst-recog-h{text-align:center;font-size:var(--fs-h2);font-weight:700;color:#fff;line-height:var(--lh-h2);white-space:nowrap;margin:0 auto var(--sp-mid)}
/* nowrap above is a deliberate desktop fit against the eyebrow's width, but
   it was only switched off below 560px — this heading is long enough to
   clip past the viewport edge anywhere from 560px up to ~900px too. */
@media(max-width:900px){.inst-recog-h{white-space:normal}}
.inst-recog-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--gutter);margin-top:var(--sp-mid)}
.inst-recog-card{display:block;background:#fafafa;border:1px solid var(--i-line);border-radius:var(--r-card);overflow:hidden;text-decoration:none;transition:border-color .15s,transform .15s}
.inst-recog-card:hover,.inst-recog-card:focus-visible{border-color:var(--i-green);transform:translateY(-2px)}
.inst-recog-img{height:190px;background-size:cover;background-position:center}
/* Logo/emblem images (CA|TS mark, ASI crest) sit on white and shouldn't be
   cropped like a photo — contain + padding + explicit white background
   keeps the whole mark visible instead of covering and cutting it off. */
.inst-recog-img-logo{background-size:contain;background-repeat:no-repeat;background-color:#fff;padding:14px}
.inst-recog-body{padding:22px 24px 26px}
.inst-recog-yr{display:inline-block;font-size:var(--fs-label);font-weight:700;color:var(--i-teal);letter-spacing:.04em;margin-bottom:10px;font-variant-numeric:tabular-nums}
.inst-recog-card b{display:block;font-size:16px;font-weight:700;color:#2a2a2a;line-height:1.35;margin-bottom:10px}
.inst-recog-card span{font-size:13.5px;color:var(--i-dim);line-height:1.6}
@media(max-width:900px){.inst-recog-grid{grid-template-columns:1fr 1fr}}
@media(max-width:560px){.inst-recog-grid{grid-template-columns:1fr}.inst-recog-h{white-space:normal}}

/* ---- ten-range interactive map (home page) ----
   Full-width centered map with the 10 range names as a pill-button bar
   overlaid on its top edge, replacing the earlier map-left/8-cards-right
   split and the context-card row above it — both read as too busy across
   several rounds of feedback. Clicking a pill still calls the same
   selectRange(i) as before (see the <script> below in index.html); only
   the layout changed, not the map/marker interaction itself. */
.inst-rangemap{background:var(--i-bg);padding:64px 0 60px}
.inst-rangemap-centered{position:relative;max-width:1500px;margin:0 auto}
.inst-rangemap-map-full{width:100%;height:560px;background:#fafafa;border:1px solid var(--i-line);border-radius:var(--r-card);overflow:hidden}
.inst-rangemap-pillbar{position:absolute;top:14px;left:14px;right:14px;z-index:5;display:flex;flex-wrap:wrap;gap:6px;
 background:rgba(255,255,255,.92);backdrop-filter:blur(4px);border:1px solid var(--i-line);border-radius:var(--r-card);padding:8px}
.inst-rc-pill{background:#fff;border:1px solid var(--i-line);border-radius:100px;padding:6px 14px;font-size:12.5px;font-weight:600;
 color:#2a2a2a;cursor:pointer;transition:border-color .15s,background .15s,color .15s;font-family:inherit}
.inst-rc-pill:hover,.inst-rc-pill:focus-visible{border-color:var(--i-green);outline:none}
.inst-rc-pill.active{background:var(--i-green);border-color:var(--i-green);color:#fff}
.inst-rc-pill-approx{border-style:dashed}
@media(max-width:700px){.inst-rangemap-map-full{height:420px}.inst-rangemap-pillbar{position:static;margin-bottom:10px;backdrop-filter:none;gap:5px;padding:6px}
 .inst-rc-pill{padding:5px 11px;font-size:11.5px}}
@media(max-width:400px){.inst-rc-pill{padding:5px 9px;font-size:11px}}

/* ---- places stat stripe (dark teal, home page) ---- */
.inst-stripe{background:var(--i-teal);color:#fff;padding:56px 0}
/* color:#fff set explicitly rather than relying on inheritance from
   .inst-stripe's color:#fff — the global :where(body.inst) h2{color:#2a2a2a}
   rule (line ~124) has zero specificity via :where(), but a direct rule on
   the element still beats inherited color regardless of specificity, so
   without this the heading rendered near-black on the dark teal band. */
.inst-stripe-h{font-size:25px;font-weight:700;line-height:1.35;margin-bottom:var(--sp-mid);color:#fff}
.inst-stat-row{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:rgba(255,255,255,.18);
 border:1px solid rgba(255,255,255,.18);margin-bottom:32px}
.inst-stat{background:var(--i-teal);padding:20px 22px}
.inst-stat b{display:block;font-size:48px;font-weight:700;font-variant-numeric:tabular-nums;margin-bottom:6px}
.inst-stat span{font-size:var(--fs-label);color:rgba(255,255,255,.8);letter-spacing:.02em}
.inst-stripe .inst-btn{background:#fff;color:var(--i-teal)}
.inst-stripe .inst-btn:hover{background:#eee}
@media(max-width:760px){.inst-stat-row{grid-template-columns:repeat(2,1fr)}}
/* .inst-stat b's 48px font (sized for a 4-column desktop grid) overflows its
   cell once the grid drops to 2 columns below 760px — "1970s–2004" was the
   value long enough to actually clip past the card edge. Scaled down and
   allowed to wrap rather than force a fixed size into a narrower column. */
@media(max-width:760px){.inst-stat{padding:16px 14px}.inst-stat b{font-size:32px;overflow-wrap:break-word}}
@media(max-width:420px){.inst-stat b{font-size:26px}}

/* ---- history timeline band (home page teaser) ---- */
.inst-timeline-band{padding:60px 0;background:#fff}
.inst-timeline-band>.inst-release-wrap>h2{font-size:var(--fs-h2);font-weight:700;color:#2a2a2a;margin-bottom:var(--sp-mid)}
.inst-timeline{display:grid;grid-template-columns:repeat(5,1fr);gap:0;margin-bottom:var(--sp-mid);border-top:3px solid var(--i-green)}
.inst-tl-item{padding:18px 18px 0;border-right:1px solid var(--i-line)}
.inst-tl-item:last-child{border-right:none}
.inst-tl-item b{display:block;font-size:22px;font-weight:700;color:var(--i-green);margin-bottom:8px;font-variant-numeric:tabular-nums}
.inst-tl-item span{font-size:var(--fs-label);color:var(--i-dim);line-height:1.55}
@media(max-width:900px){.inst-timeline{grid-template-columns:repeat(2,1fr);gap:20px 0}.inst-tl-item{border-right:none;border-left:3px solid var(--i-green);padding:0 0 0 16px}}
@media(max-width:520px){.inst-timeline{grid-template-columns:1fr}}

/* ---- governance + visit two-column (home page) ----
   Caption sits below the image in normal flow rather than overlaid on top
   of it — the image stays fully visible instead of being darkened to keep
   overlaid text legible. */
.inst-twocol{display:grid;grid-template-columns:1fr 1fr}
.inst-twocol-item{display:block;background:#fff;text-decoration:none}
.inst-twocol-img{height:260px;background-size:cover;background-position:center}
.inst-twocol-cap{padding:26px 36px 32px;color:#232323}
.inst-twocol-cap .inst-eyebrow-sm{color:var(--i-green)}
.inst-twocol-cap b{display:block;font-size:22px;font-weight:700;margin-bottom:10px;line-height:1.3;color:#181818}
.inst-twocol-cap span{font-size:14px;color:var(--i-dim);line-height:1.6;display:block}
@media(max-width:700px){.inst-twocol{grid-template-columns:1fr}.inst-twocol-img{height:220px}}

/* ============================================================
   INTERIOR PAGE PATTERNS — used on the 10 non-home pages
   ============================================================ */

/* ---- full-bleed photo hero with title-bar overlay ---- */
/* Hero height (550px at the reference's 1280px container width), the exact
   4-stop gradient overlay, and the h1 typography (40px/600/uppercase/44px
   line-height/white) are getComputedStyle() measurements pulled live from
   weyerhaeuser.com's own .banner-image + .has-image.gradient + h1 (re-verified
   this session at the owner's request). Height is fixed px, not viewport-
   relative, matching how the reference itself sets it — scaled down only at
   the same breakpoints Atlas already uses elsewhere for small screens, since
   550px fixed on a phone would be excessive and the reference site is a
   desktop-first Bootstrap layout that visibly shrinks its own banners on
   narrow viewports too. */
.inst-hero{position:relative;min-height:550px;overflow:hidden;display:flex;align-items:flex-end;background:#0a1a12}
.inst-hero img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:saturate(1.02) brightness(.62)}
/* The reference's own 4 gradient stops are matched exactly (0%/70%/98%/100%).
   A light darkening filter on the <img> itself (brightness .82, not present
   as a measurable CSS property on the reference) is layered underneath for
   legibility only — Atlas's real photography runs brighter than whatever
   image the reference happens to use behind this same gradient, and text
   readability was flagged and fixed as a real bug in an earlier session
   (see docs/atlas-multipage-redesign-2026-08-14.md); reverting to zero
   darkening reintroduced that same bug against bright sky/rock photos, so
   this filter stays as a deliberate, documented exception to "measured
   only," not an oversight. */
.inst-hero::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,0) 0%,rgba(0,0,0,0) 70%,rgba(0,0,0,.72) 98%,rgba(0,0,0,.75) 100%)}
/* width:100% is required, not decorative: .inst-hero-body is also
   .inst-release-wrap (max-width:1800px; margin:0 auto), and .inst-hero is a
   flex row. A block-level flex item defaults to shrink-to-fit (width:
   fit-content) rather than filling the row, so without this the wrapper
   only grew as wide as its own text, and margin:0 auto then centered that
   shrunken box — pushing the title ~690px in from the left edge on wide
   screens instead of sitting at the same 26px inset as the header logo and
   every other .inst-release-wrap on the page. */
/* padding-top/bottom only, not the shorthand — same reasoning as .inst-body
   below: this element is also .inst-release-wrap (padding:0 26px for the
   left/right margin shared with the header), and a `padding:… 0 …` shorthand
   here would silently zero that out since this rule comes later in the file. */
.inst-hero-body{position:relative;z-index:2;width:100%;padding-top:28px;padding-bottom:34px;color:#fff}
.inst-hero-ic{display:inline-grid;place-items:center;width:44px;height:44px;border-radius:var(--r-badge);background:var(--i-green);margin-bottom:16px;font-size:21px}
.inst-hero-body h1{color:#fff;font-size:var(--fs-h1);font-weight:600;text-transform:uppercase;line-height:var(--lh-h1);letter-spacing:normal;text-shadow:0 2px 10px rgba(0,0,0,.35)}
.inst-hero-body h1 span{font-weight:400;text-transform:none;color:#e3d9c4;font-style:italic;font-size:18px;line-height:1.5;display:block;margin-top:10px;letter-spacing:0;text-shadow:0 2px 8px rgba(0,0,0,.4)}
/* ---- in-hero CTA (added 2026-08-14) ----
   Every interior-page hero shipped with an h1/subtitle and nothing
   actionable — the only button on the whole page sat in .inst-closing at
   the very bottom. This adds a CTA row directly under the subtitle, using
   .inst-btn as-is for the primary action (already proven legible over a
   dark photo hero — it's what index.html's video hero uses today) plus a
   new .inst-hero-cta-ghost for a secondary link that needs to survive
   sitting on top of a photo rather than the flat green header .inst-btn-
   ghost was designed for: .inst-btn-ghost's var(--i-line) border is a
   light grey meant to read against white body backgrounds, and goes
   near-invisible over a photo. .inst-tile-cta already solved this exact
   problem (a button standing directly on top of a photo) for the home-page
   tile grid, so this reuses its white-on-translucent treatment rather than
   inventing a third button skin. */
.inst-hero-cta{display:flex;flex-wrap:wrap;gap:12px;margin-top:20px}
.inst-hero-cta-ghost,.inst-hero-cta-ghost:visited{display:inline-flex;align-items:center;gap:7px;padding:var(--btn-pad);
 border:1px solid rgba(255,255,255,.55);border-radius:var(--r-btn);font-size:var(--btn-fs);font-weight:600;
 letter-spacing:.03em;text-transform:uppercase;color:#fff;background:rgba(255,255,255,.08);transition:all .15s}
.inst-hero-cta-ghost:hover,.inst-hero-cta-ghost:focus-visible{background:#fff;color:var(--i-green-dk);border-color:#fff;transform:translateY(-2px);box-shadow:0 6px 16px rgba(1,42,26,.22)}
.inst-hero-cta-ghost:active{transform:translateY(0);box-shadow:0 2px 6px rgba(1,42,26,.18)}
/* Compact stat chips for the hero — distinct from .inst-statcircle (150px,
   body-section scale): these sit inline next to the CTA row, a quick
   "here's the number that matters" beat before the visitor even scrolls.
   Optional per page, not every hero needs one. */
.inst-hero-stats{display:flex;flex-wrap:wrap;gap:18px;margin-top:18px}
.inst-hero-stat{display:flex;flex-direction:column}
.inst-hero-stat b{font-size:22px;font-weight:700;color:#fff;line-height:1.1;font-variant-numeric:tabular-nums;text-shadow:0 2px 8px rgba(0,0,0,.4)}
.inst-hero-stat span{font-size:11.5px;color:rgba(255,255,255,.8);letter-spacing:.02em;margin-top:3px}
@media(max-width:560px){.inst-hero-cta{margin-top:14px}.inst-hero-stats{margin-top:12px;gap:14px}.inst-hero-stat b{font-size:18px}}
.inst-hero-credit{position:absolute;right:16px;bottom:14px;z-index:3;font-family:var(--mono);font-size:9.5px;letter-spacing:.05em;color:rgba(255,255,255,.85);
 background:rgba(1,20,12,.45);backdrop-filter:blur(6px);padding:4px 9px;border-radius:100px;max-width:calc(100% - 32px)}
.inst-hero-credit a{color:#fff;text-decoration:underline;text-underline-offset:2px}
@media(max-width:900px){.inst-hero{min-height:460px}.inst-hero-body h1{font-size:30px;line-height:34px}}
/* Below 560px the title block can wrap to 3+ lines and its box bottom-
   aligns with the hero, so the credit chip (also bottom-anchored) started
   overlapping the last line of the tagline — a real layout collision, not
   a text-overflow clip. Moving the chip to the top-right at this breakpoint
   keeps it clear of the title stack regardless of how many lines it wraps
   to. */
@media(max-width:560px){
  /* min-height, not height, so this can grow — but .inst-hero also sets
     overflow:hidden, so on a narrow phone with a long H1 (e.g. people.html's
     three-line subtitle) plus the new hero-stats/hero-cta rows added below
     it, stacked content could genuinely exceed 340px and get silently
     clipped at the top rather than wrapping visibly. Bumped the floor to
     460px specifically to give those two new rows room; still min-height
     so shorter pages don't grow past what they need. */
  .inst-hero{min-height:460px}
  .inst-hero-body h1{font-size:22px;line-height:26px}
  .inst-hero-body h1 span{font-size:14px;line-height:1.5}
  .inst-hero-stats{gap:12px 16px}
  .inst-hero-cta{gap:8px}
  /* Deliberately smaller than --btn-fs(11px)/--btn-pad(5px 13px) at this
     one breakpoint only — two buttons plus the stat row above them need
     to fit in the tightened 460px hero on a narrow phone. Not pulled into
     a --btn-fs-sm/--btn-pad-sm token pair since nothing else on the site
     needs this compact a button yet; a comment is enough to make it read
     as intentional rather than a stray hand-written number. */
  .inst-hero-cta .inst-btn,.inst-hero-cta-ghost{font-size:10px;padding:5px 11px}
  .inst-hero-credit{bottom:auto;top:12px;right:12px;left:12px;text-align:right;max-width:none}
}

/* ---- breadcrumb strip ---- */
/* Background (#eeeeee), height (44px) and font-size (18px)/color (#444444)
   are exact getComputedStyle() measurements pulled live from
   weyerhaeuser.com's own [class*="breadcrumb"] element (re-verified this
   session at the owner's request). The reference's own left-padding included
   ~52px reserved for an icon glyph that doesn't apply to Atlas's simpler
   breadcrumb, so horizontal padding here is Atlas's own choice, not measured. */
.inst-crumbs{background:#eeeeee;border-bottom:1px solid var(--i-line);height:44px;display:flex;align-items:center}
/* width:100% required: .inst-crumbs is a flex row and its .inst-release-wrap
   child is block-level, so without an explicit width it shrinks to fit its
   own text ("Home › The Land") and margin:0 auto then centers that small
   box in the row — landing the breadcrumb hundreds of px right of the 26px
   edge everything else on the page aligns to. Same underlying issue as
   .inst-hero-body above. */
.inst-crumbs .inst-release-wrap{width:100%;font-size:18px;color:#444444;letter-spacing:normal}
.inst-crumbs a,.inst-crumbs a:visited{color:#444444}
.inst-crumbs a:hover{color:var(--i-green)}
.inst-crumbs span.sep{margin:0 9px;color:#999}
.inst-crumbs span.here{color:var(--i-green);font-weight:600}
@media(max-width:560px){.inst-crumbs .inst-release-wrap{font-size:14px}}

/* ---- interior body wrap ----
   padding-top/bottom only, not the `padding` shorthand: every use of this
   class is on an element that is ALSO .inst-release-wrap (e.g. <div
   class="inst-release-wrap inst-body">), which supplies padding:0 26px for
   the left/right margin shared with the header and every other section on
   the page. .inst-release-wrap is defined earlier in this file, so the old
   `padding:52px 0 30px` shorthand here — same specificity, later rule —
   silently overwrote its left/right padding to 0, pulling interior-page
   body copy flush to the viewport edge above 1800px instead of aligning
   with the header logo. */
.inst-body{padding-top:52px;padding-bottom:30px}
.inst-body h2{font-size:clamp(22px,2.6vw,30px);font-weight:700;color:#232323;margin:0 0 16px;text-transform:none;letter-spacing:0}
.inst-body h3{font-size:var(--fs-h3);font-weight:700;color:#2a2a2a;margin:22px 0 10px}
.inst-body p{color:var(--i-ink);font-size:15.5px;line-height:1.75;margin-bottom:15px;text-align:justify}
.inst-body p b,.inst-body p strong{color:#222;font-weight:700}
.inst-body hr.inst-hr{border:0;border-top:1px solid var(--i-line);margin:40px 0}
.inst-body ul.inst-list{list-style:none;margin:14px 0 22px}
.inst-body ul.inst-list li{position:relative;padding-left:20px;margin-bottom:9px;color:var(--i-ink);font-size:15px;line-height:1.6}
.inst-body ul.inst-list li::before{content:"";position:absolute;left:0;top:7px;width:7px;height:7px;background:var(--i-green)}
.inst-body ul.inst-list li b{color:#222}
.inst-body a.inst-link,.inst-body a.inst-link:visited{color:var(--i-green);font-weight:600;text-decoration:underline;text-underline-offset:2px}
.inst-body a.inst-link:hover{color:var(--i-green-dk)}

/* ---- 2x2 / 2-col alternating image/text grid ---- */
.inst-altgrid{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--i-line);margin-top:var(--sp-2)}
.inst-altrow{display:grid;grid-template-columns:1fr 1fr;min-height:230px;border-bottom:1px solid var(--i-line)}
.inst-altrow.rev{direction:rtl}
.inst-altrow.rev>*{direction:ltr}
.inst-altimg{background-size:cover;background-position:center;min-height:230px}
.inst-altcopy{padding:34px 40px;display:flex;flex-direction:column;justify-content:center}
.inst-altcopy h4{color:var(--i-green);font-size:var(--fs-h3);font-weight:700;margin-bottom:10px}
.inst-altcopy p{color:var(--i-dim);font-size:14.5px;line-height:1.7;margin-bottom:8px;text-align:left}
.inst-altcopy a.inst-link{font-size:13.5px}
@media(max-width:760px){.inst-altrow,.inst-altrow.rev{grid-template-columns:1fr;direction:ltr}.inst-altimg{height:200px}.inst-altcopy{padding:26px 22px}}

/* ---- icon-grid strategy nav (6/8/10-item grid) ---- */
.inst-icongrid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--i-line);border:1px solid var(--i-line);margin-top:var(--sp-2)}
.inst-icontile{background:#fff;padding:30px 28px}
.inst-icon-svg{width:40px;height:40px;margin-bottom:16px;display:block}
.inst-icontile h4{color:#232323;font-size:16.5px;font-weight:700;margin-bottom:9px;line-height:1.3}
.inst-icontile p{color:var(--i-dim);font-size:13.5px;line-height:1.65;margin-bottom:10px;text-align:left}
.inst-icontile ul{list-style:none;margin-top:6px}
.inst-icontile ul li{font-size:var(--fs-label);padding:3px 0}
.inst-icontile ul li a{color:var(--i-green);font-weight:600}
.inst-icontile ul li a:hover{text-decoration:underline}
@media(max-width:900px){.inst-icongrid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){.inst-icongrid{grid-template-columns:1fr}}

/* ---- quote block with circular monogram ---- */
.inst-quoteblock{background:#f3f3f1;border-radius:var(--r-card);padding:44px 48px;display:flex;gap:34px;align-items:center;margin:var(--sp-mid) 0}
.inst-quote-avatar{flex-shrink:0;width:96px;height:96px;border-radius:50%;background:var(--i-green);display:grid;place-items:center;color:#fff;font-size:30px;font-weight:700;font-family:'Source Sans Pro',sans-serif}
.inst-quote-body{flex:1;min-width:0}
.inst-quote-mark{font-size:44px;line-height:1;color:var(--i-green);font-family:Georgia,serif;font-weight:700;margin-bottom:6px;display:block}
.inst-quote-body blockquote{font-size:19px;font-weight:600;color:#232323;line-height:1.5;font-style:italic;margin-bottom:14px}
.inst-quote-cite{font-size:var(--fs-label);color:var(--i-dim);font-weight:600}
.inst-quote-cite span{display:block;font-weight:400;font-size:12px;margin-top:2px;color:var(--i-dim);font-style:normal}
@media(max-width:700px){.inst-quoteblock{flex-direction:column;text-align:center;padding:32px 26px}}

/* ---- featured-source card grid (added 2026-08-14) ----
   New section type: a hand-picked sample of real, DOI-linked papers with
   their actual abstracts, distinct from .inst-quoteblock (one big pull-
   quote) and .inst-callout (a disclosure box) — this is a card grid
   because there are several peer items to browse, not one thing to
   foreground. Deliberately plain/institutional (thin border, no photo,
   no colour block) rather than a magazine-style "featured article" card,
   matching this genre's existing .inst-tbl/.inst-icontile restraint. */
.inst-sourcegrid{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:var(--i-line);border:1px solid var(--i-line)}
.inst-sourcecard{background:#fff;padding:30px 28px}
.inst-sourcecard .yr{display:inline-block;font-family:var(--mono);font-size:12px;font-weight:600;color:var(--i-green);letter-spacing:.05em;margin-bottom:8px}
.inst-sourcecard h5{font-size:15px;font-weight:700;color:#232323;line-height:1.4;margin-bottom:8px}
.inst-sourcecard .au{font-size:12px;color:var(--i-dim);font-style:italic;margin-bottom:10px}
.inst-sourcecard .ab{font-size:13px;color:var(--i-ink);line-height:1.65;margin-bottom:12px}
.inst-sourcecard a.inst-link{font-size:var(--fs-label)}
@media(max-width:760px){.inst-sourcegrid{grid-template-columns:1fr}}

/* ---- interactive horizontal timeline ---- */
.inst-hscroll-wrap{position:relative;margin:var(--sp-5) 0}
.inst-hscroll{display:flex;gap:0;overflow-x:auto;scroll-snap-type:x proximity;padding:8px 4px 22px;border-top:3px solid var(--i-green);scrollbar-width:thin}
.inst-hscroll::-webkit-scrollbar{height:7px}
.inst-hscroll::-webkit-scrollbar-thumb{background:var(--i-line);border-radius:6px}
.inst-hitem{flex:0 0 220px;scroll-snap-align:start;padding:18px 18px 0;border-right:1px solid var(--i-line);cursor:default}
.inst-hitem:last-child{border-right:none}
.inst-hitem .yr{font-size:23px;font-weight:700;color:var(--i-green);font-variant-numeric:tabular-nums;margin-bottom:8px;display:block}
.inst-hitem .ti{font-size:14px;font-weight:700;color:#232323;margin-bottom:6px;display:block}
.inst-hitem p{font-size:var(--fs-label);color:var(--i-dim);line-height:1.6;text-align:left;margin-bottom:0}
.inst-hscroll-hint{font-size:11.5px;color:var(--i-dim);text-align:center;margin-top:2px;font-family:var(--mono);letter-spacing:.05em}
@media(max-width:600px){.inst-hitem{flex-basis:180px}}

/* ---- stat callout circle ----
   Sized up from the original 150px and given a scroll-triggered
   fade/scale-in (via the .in-view class, toggled by an IntersectionObserver
   in the inline script below) plus a hover lift, so the row reads as a
   deliberate "reveal" moment rather than static numbers on load. */
.inst-statcircle-row{display:flex;gap:36px;flex-wrap:wrap;justify-content:center;margin:var(--sp-mid) 0}
.inst-statcircle{width:200px;height:200px;border-radius:50%;border:3px solid var(--i-green);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:18px;
 opacity:0;transform:scale(.8) translateY(16px);transition:opacity .5s ease,transform .5s ease,box-shadow .25s ease,border-color .25s ease}
.inst-statcircle-row.in-view .inst-statcircle{opacity:1;transform:scale(1) translateY(0)}
.inst-statcircle-row .inst-statcircle:nth-child(1){transition-delay:0s}
.inst-statcircle-row .inst-statcircle:nth-child(2){transition-delay:.1s}
.inst-statcircle-row .inst-statcircle:nth-child(3){transition-delay:.2s}
.inst-statcircle-row .inst-statcircle:nth-child(4){transition-delay:.3s}
.inst-statcircle:hover{box-shadow:0 8px 24px rgba(1,42,26,.18);border-color:var(--i-green-dk);transform:scale(1.04)}
.inst-statcircle b{font-size:34px;font-weight:700;color:var(--i-green);line-height:1.1;font-variant-numeric:tabular-nums}
.inst-statcircle span{font-size:13px;color:var(--i-dim);line-height:1.35;margin-top:8px}
.inst-statcircle.teal{border-color:var(--i-teal)}
.inst-statcircle.teal b{color:var(--i-teal)}
.inst-statcircle.teal:hover{border-color:var(--i-teal)}
@media(max-width:600px){.inst-statcircle{width:150px;height:150px;padding:14px}.inst-statcircle b{font-size:26px}.inst-statcircle span{font-size:11px}}

/* ---- long-form article sections (reuses .inst-body h2/hr/p/ul above) ---- */
.inst-sechead{display:flex;align-items:baseline;gap:var(--sp-3);margin-top:var(--sp-6);margin-bottom:18px}
.inst-sechead .n{font-family:var(--mono);font-size:12px;color:var(--i-green);font-weight:600;letter-spacing:.08em}

/* ---- teal closing band ---- */
.inst-closing{background:var(--i-teal);color:#fff;padding:50px 0;margin-top:48px}
.inst-closing-wrap{max-width:1800px;margin:0 auto;padding:0 var(--gutter);text-align:center}
/* 24px, not --fs-h2(27px): deliberately smaller than a body h2 — the
   closing band is the last thing on every page, one level down from a
   section heading, not competing with the content above it for weight.
   Left as its own literal rather than forced onto --fs-h2 or given a new
   token for a single-selector size. */
.inst-closing h2{color:#fff;font-size:24px;font-weight:700;margin-bottom:10px;text-transform:none}
.inst-closing p{color:rgba(255,255,255,.85);font-size:14.5px;max-width:620px;margin:0 auto 26px;text-align:center}
.inst-closing-links{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
/* .inst-btn:not(.inst-btn-ghost), not .inst-btn — a plain .inst-btn selector
   here also matches ghost buttons (class="inst-btn inst-btn-ghost"), and
   with no higher-specificity background/color declared for the ghost
   variant, they inherited this white fill + white text — an invisible
   button. Excluding .inst-btn-ghost keeps this rule solid-white-button-only. */
.inst-closing .inst-btn:not(.inst-btn-ghost){background:#fff;color:var(--i-teal)}
.inst-closing .inst-btn:not(.inst-btn-ghost):hover{background:#eee}
.inst-closing .inst-btn-ghost{background:transparent;border-color:rgba(255,255,255,.4);color:#fff}
.inst-closing .inst-btn-ghost:hover{border-color:#fff;background:rgba(255,255,255,.15)}

/* ---- tables in institutional style (reused for coverage/conflicts/land data) ---- */
.inst-tbl{width:100%;border-collapse:collapse;font-size:13.5px;background:#fff}
.inst-tbl th{text-align:left;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--i-dim);padding:11px 14px;border-bottom:2px solid var(--i-green);font-weight:700}
.inst-tbl td{padding:11px 14px;border-bottom:1px solid var(--i-line);color:var(--i-ink);vertical-align:top}
.inst-tbl tr:last-child td{border-bottom:0}
.inst-tbl td b{color:#222}
.inst-tblwrap{overflow-x:auto;border:1px solid var(--i-line)}

/* ---- callout / disclosure box, institutional style ---- */
.inst-callout{border-left:3px solid var(--i-teal);background:#f3f3f1;padding:18px 22px;margin:22px 0}
.inst-callout .lbl{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--i-teal);display:block;margin-bottom:8px}
.inst-callout p{margin-bottom:0;text-align:left;font-size:14.5px}
.inst-callout.grn{border-left-color:var(--i-green)}
.inst-callout.grn .lbl{color:var(--i-green)}
/* shared.css's .callout (used on pages that also render inst-callout,
   e.g. life.html/people.html) hardcodes border-radius:0 12px 12px 0 —
   not var(--r), so the --r:0 override above doesn't touch it. Squared
   here for the same reason: two callout boxes on one page, one square
   and one rounded-right, would look like an accidental inconsistency
   rather than two intentionally different components. */
body.inst .callout{border-radius:0}
/* Same gap as .callout above, for every other shared.css component that
   hardcodes its own border-radius instead of reading var(--r) — the
   --r:0 override at the top of this file only reaches the components
   that reference the token, and these five don't:
   .sp (species cards, life.html's Species Atlas — the specific case
   flagged directly), .tag (species IUCN/WPA badges, same page), .pl
   (gazetteer place cards, land.html), .bi (bibliography rows,
   record.html), ol.steps li::before (numbered step counters, visit.html).
   Confirmed each actually renders on an institutional page before adding
   this — .navlinks/.eyebrow/kbd/the map popup style also hardcode a
   radius in shared.css but don't appear in any institutional-page HTML,
   so left alone rather than pre-emptively overridden for nothing. */
body.inst .sp,body.inst .pl,body.inst .bi{border-radius:0}
body.inst .tag{border-radius:0}
body.inst ol.steps li::before{border-radius:0}

/* ---- placeholder media block, institutional style ---- */
.inst-placeholder{border:1px dashed var(--i-line);padding:28px 24px;text-align:center;color:var(--i-dim);font-size:13px;line-height:1.7;background:#fafafa}
.inst-placeholder b{display:block;color:var(--i-dim);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;margin-bottom:6px}

/* ---- contact form ---- */
.inst-form{max-width:560px;margin:22px 0}
.inst-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}
.inst-form-row{margin-bottom:18px;display:flex;flex-direction:column}
.inst-form-row label{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--i-dim);margin-bottom:7px}
.inst-form-row input,.inst-form-row textarea,.inst-form-row select{font-family:inherit;font-size:15px;color:var(--i-ink);border:1px solid var(--i-line);border-radius:var(--r-btn);padding:11px 13px;background:#fff;resize:vertical;transition:border-color .15s}
.inst-form-row select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--i-dim) 50%),linear-gradient(135deg,var(--i-dim) 50%,transparent 50%);background-position:calc(100% - 20px) center,calc(100% - 15px) center;background-size:5px 5px,5px 5px;background-repeat:no-repeat;cursor:pointer}
.inst-form-row input:focus,.inst-form-row textarea:focus,.inst-form-row select:focus{outline:none;border-color:var(--i-green)}
.inst-form-optional{text-transform:none;font-weight:400;letter-spacing:0;color:var(--i-dim)}
.inst-form-row.invalid input,.inst-form-row.invalid textarea,.inst-form-row.invalid select{border-color:#a83232}
.inst-field-error{display:block;color:#a83232;font-size:12.5px;margin-top:6px;min-height:0}
.inst-field-error:empty{display:none}
.inst-form-status{font-size:13.5px;margin:12px 0 0;min-height:1.4em}
.inst-form-status.ok{color:var(--i-green)}
.inst-form-status.err{color:#a83232}
@media(max-width:600px){.inst-form-grid{grid-template-columns:1fr}}

/* ---- cards (species/gazetteer containers wrapped in inst chrome) ---- */
.inst-cardwrap{border:1px solid var(--i-line);padding:6px}

/* ---- gazetteer "not yet described" plain list (added 2026-08-14) ----
   Deliberately NOT the .gaz/.pl card grid (shared.css) — those cards carry
   a description; these 70 places don't have one, and giving them equal
   card-weight would visually imply parity with the 15 that are actually
   written up. Plain inline tags instead: name + type, nothing invented. */
.gaz-plain{display:flex;flex-wrap:wrap;gap:8px 10px}
.gaz-plain-item{font-size:var(--fs-label);color:var(--i-ink);background:#f4f4f4;border:1px solid var(--i-line);border-radius:var(--r-badge);padding:5px 10px}
.gaz-plain-item i{color:var(--i-dim);font-style:normal;font-size:11px;margin-left:5px}

/* ---- pagenext strip, institutional style ---- */
.inst-pagenext{display:flex;justify-content:space-between;align-items:center;gap:20px;padding:18px 24px;border:1px solid var(--i-line);background:#f9f9f9;margin-top:var(--sp-5);flex-wrap:wrap}
.inst-pagenext a{font-size:var(--fs-label);font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--i-green);display:flex;align-items:center;gap:8px}
.inst-pagenext a:hover{color:var(--i-green-dk)}

/* ---- footer ---- */
/* Footer background (#323232) is an exact getComputedStyle() match to
   weyerhaeuser.com's own <footer>, re-verified this session. Their measured
   padding (0 15px 92px) reserves ~92px of bottom clearance for a sticky
   "View Sitemap" slide-up element Atlas has no equivalent of — using that
   figure verbatim would leave a large dead gap under Atlas's simpler footer,
   so vertical padding here is kept proportionate to Atlas's actual content
   instead of copied literally; horizontal breathing room follows the same
   15px-class scale as the reference. */
/* html bg matches the footer so short pages (fewer sections than viewport
   height) don't show a stray white strip below the footer — the footer's
   own background only covers its own box, not the rest of the window. */
html:has(body.inst){background:var(--i-green-dk)}
/* margin-top:0 needed to cancel shared.css's generic `footer{margin-top:
   42px}` (written for the non-institutional pages) — the plain element
   selector there matches this <footer> too and was leaving a 42px gap
   between .inst-closing and the footer. */
.inst-footer{background:var(--i-green-dk);color:rgba(255,255,255,.7);padding:52px 0 30px;margin-top:0;
 border-top:3px solid var(--i-green)}
/* shared.css sets a generic `footer a{display:block}` for the plain
   (non-institutional) pages' stacked link lists. Every <a> directly in
   this footer needs to stay inline text, including the one plain <a> in
   the copyright paragraph below — left as block, it isolates itself on
   its own line and strands the sentence's trailing "." on the line after. */
.inst-footer a{display:inline}
/* ---- footer main: just logo + badges, centered ---- */
.inst-footer-main{padding-bottom:32px;border-bottom:1px solid rgba(255,255,255,.16);margin-bottom:30px}
.inst-footer-brand{display:flex;flex-direction:column;align-items:center;text-align:center;gap:24px}
.inst-footer-brand .inst-logo{height:60px}
/* ---- footer standards/data badge row (sits under the logo) ----
   All five badges sit on uniform white cards — the three real-world logos
   (UN SDG, IUCN, TX2) are full-colour marks nobody should recolour, so
   rather than fight them the two custom SVG marks (Ghats convergence,
   source-verification seal) were switched from white-on-dark strokes to
   var(--i-green)/var(--i-green-dk), making all five badges read as one
   consistent light card row instead of two different visual languages.
   The <img> badges point at files that may be missing — display:none by
   default, only un-hidden by the onerror-free load (the .loaded class an
   inline onload handler adds), so a missing file shows an empty card
   rather than a broken-image icon. */
.inst-footer-badges{display:flex;flex-wrap:wrap;gap:14px;align-items:stretch;justify-content:center}
.inst-footer-badge{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
 width:100px;text-align:center;padding:12px 8px;background:#fff;border-radius:var(--r-card);
 box-shadow:0 3px 10px rgba(0,0,0,.18);transition:transform .15s,box-shadow .15s}
.inst-footer-badge:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(0,0,0,.24)}
.inst-footer-badge svg{width:40px;height:40px}
.inst-footer-badge img{width:40px;height:40px;object-fit:contain;display:none}
.inst-footer-badge img.loaded{display:block}
.inst-footer-badge span{font-size:10px;color:var(--i-dim);line-height:1.3;font-weight:600}
.inst-footer-bottom{text-align:center}
.inst-footer-links{margin-bottom:14px;font-size:var(--fs-label)}
.inst-footer-links a,.inst-footer-links a:visited{display:inline;color:rgba(255,255,255,.8);font-weight:700}
.inst-footer-links a:hover{color:#fff}
.inst-footer-links span{color:rgba(255,255,255,.3);margin:0 10px}
.inst-footer-bottom p{font-size:12px;color:rgba(255,255,255,.5);max-width:820px;margin:0 auto;line-height:1.6}
@media(max-width:640px){.inst-footer{padding:40px 0 26px}
 .inst-footer-brand{align-items:center;text-align:center}
 .inst-footer-badges{gap:8px;justify-content:center}.inst-footer-badge{width:80px;padding:10px 6px}
 .inst-footer-badge svg,.inst-footer-badge img{width:32px;height:32px}.inst-footer-badge span{font-size:9px}
 .inst-footer-bottom{text-align:center}.inst-footer-bottom p{margin:0 auto}}

/* Was flex-direction:column, stacking brand / full-width search input /
   hamburger into three separate rows — on a phone that ate ~130px of
   vertical space above any real content before a single link was tapped.
   Kept as one compact row instead: the search input (already just a
   read-only trigger for the openPalette() overlay, not real text entry) is
   hidden and only its icon button shows, matching the icon-sized theme
   toggle and hamburger already sitting in this row. */
@media(max-width:640px){
  .inst-topbar{flex-wrap:wrap;align-items:center;gap:8px}
  /* background:transparent here too — .inst-search's desktop white fill
     was still showing as a box around the icon even with the input hidden
     and the border removed, since it's the wrapper (not just the input)
     carrying that white background. Now it's just the button, sized and
     colored the same as the hamburger next to it. */
  .inst-search{border:none;height:40px;background:transparent}
  .inst-search input{display:none}
  .inst-search button{width:40px;height:40px}
  .inst-release h1{font-size:22px}
  .inst-body p{text-align:left}
}

/* ---- command palette (⌘K search overlay), sharp-corner override ----
   Base .palette/.res rules live in shared.css with rounded corners from
   the old design system; this site is sharp-cornered throughout, so
   override radius to 0 here rather than edit the shared base. */
.palette{border-radius:0;font-family:'Source Sans Pro',var(--sans)}
.palette input{font-family:'Source Sans Pro',var(--sans);font-size:17px;padding:22px 24px}
.res{border-radius:0}
.res .t{font-family:'Source Sans Pro',var(--sans);font-size:15px}

/* ---- home hero "Explore" popup ----
   Reuses .overlay (shared.css) for the dimmed backdrop + centering; only
   the modal content itself is new. Cards reuse the same background-image +
   caption pattern as .inst-tile in the grid below the hero, just smaller
   and in a fixed 2x2 layout instead of a full-width row. */
.expl-modal{width:min(720px,92vw);background:var(--bg2);border:1px solid var(--i-line);box-shadow:0 30px 90px rgba(23,45,32,.35)}
.expl-modal-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid var(--i-line);
 font-family:'Source Sans Pro',var(--sans);font-weight:700;font-size:15px;text-transform:uppercase;letter-spacing:.04em;color:var(--i-ink)}
.expl-modal-close{background:none;border:none;font-size:26px;line-height:1;color:var(--i-ink);cursor:pointer;padding:0 4px}
.expl-modal-grid{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--i-line)}
.expl-modal-card{position:relative;display:block;height:180px;background-size:cover;background-position:center;overflow:hidden}
.expl-modal-card::before{content:"";position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,.78),rgba(0,0,0,.08) 55%)}
.expl-modal-card span{position:absolute;z-index:1;left:16px;right:16px;bottom:14px;display:flex;flex-direction:column;gap:2px;text-shadow:0 1px 3px rgba(0,0,0,.6)}
.expl-modal-card b{color:#fff;font-size:16px;font-weight:700}
.expl-modal-card span span{color:rgba(255,255,255,.85);font-size:12px}
@media(max-width:560px){.expl-modal-grid{grid-template-columns:1fr}.expl-modal-card{height:130px}}
