/* ============================================================
   ICPA Homepage — standalone implementation of the
   "ICPA Homepage -02-03 flipped-" design.
   Responsive: desktop (≥1200px), tablet (768–1199px), mobile (<768px)
   ============================================================ */

*,*::before,*::after{box-sizing:border-box}

html{scroll-behavior:smooth}
/* scrollbar-color disables ::-webkit-scrollbar-* styling in Chrome/Edge, so keep it Firefox-only */
@supports (-moz-appearance:none){html{scrollbar-color:var(--icpa-accent) var(--icpa-ink-2)}}
::-webkit-scrollbar{width:14px;height:14px;background:var(--icpa-ink-2)}
::-webkit-scrollbar-track{background:var(--icpa-ink-2);border-left:1px solid var(--icpa-ink-hairline)}
::-webkit-scrollbar-thumb{background:var(--icpa-gold-gradient);border:3px solid var(--icpa-ink-2);border-radius:7px}
::-webkit-scrollbar-thumb:hover{background:var(--icpa-gold-gradient);border-width:2px}
::-webkit-scrollbar-corner{background:var(--icpa-ink-2)}
::-webkit-scrollbar-button{width:14px;height:14px;background-color:var(--icpa-ink-2);background-repeat:no-repeat;background-position:center;background-size:8px 8px}
::-webkit-scrollbar-button:vertical:decrement{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%238A6A17'/%3E%3Cstop offset='.3' stop-color='%23C9A227'/%3E%3Cstop offset='.5' stop-color='%23F3DA8C'/%3E%3Cstop offset='.7' stop-color='%23C9A227'/%3E%3Cstop offset='1' stop-color='%238A6A17'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='url(%23g)' d='M5 1.5 9.2 8H.8z'/%3E%3C/svg%3E")}
::-webkit-scrollbar-button:vertical:increment{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%238A6A17'/%3E%3Cstop offset='.3' stop-color='%23C9A227'/%3E%3Cstop offset='.5' stop-color='%23F3DA8C'/%3E%3Cstop offset='.7' stop-color='%23C9A227'/%3E%3Cstop offset='1' stop-color='%238A6A17'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='url(%23g)' d='M5 8.5.8 2h8.4z'/%3E%3C/svg%3E")}
::-webkit-scrollbar-button:horizontal:decrement{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%238A6A17'/%3E%3Cstop offset='.3' stop-color='%23C9A227'/%3E%3Cstop offset='.5' stop-color='%23F3DA8C'/%3E%3Cstop offset='.7' stop-color='%23C9A227'/%3E%3Cstop offset='1' stop-color='%238A6A17'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='url(%23g)' d='M1.5 5 8 .8v8.4z'/%3E%3C/svg%3E")}
::-webkit-scrollbar-button:horizontal:increment{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%238A6A17'/%3E%3Cstop offset='.3' stop-color='%23C9A227'/%3E%3Cstop offset='.5' stop-color='%23F3DA8C'/%3E%3Cstop offset='.7' stop-color='%23C9A227'/%3E%3Cstop offset='1' stop-color='%238A6A17'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='url(%23g)' d='M8.5 5 2 9.2V.8z'/%3E%3C/svg%3E")}

body{
  margin:0;
  background:var(--icpa-ink);
  color:var(--text-body);
  font:var(--type-body);
  -webkit-font-smoothing:antialiased;
  text-wrap:pretty;
  overflow-x:hidden;
}
h1,h2,h3,h4{margin:0;font-family:var(--font-sans)}
p{margin:0}
a{color:var(--text-link);text-decoration:none;transition:var(--transition-control)}
a:hover{color:var(--text-link-hover)}
img{max-width:100%}
:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

/* ---------- browser-drawn surfaces ----------
   Selection, the caret and underline metrics ship with browser defaults that
   belong to no design system: the stock selection blue is the one un-branded
   rectangle a reader can produce on any page here. Themed once, site-wide.
   Selection uses the light-blue tint at full strength so the ink registers
   keep white text legible through it. */
::selection{background:var(--icpa-light-blue);color:var(--icpa-dark-navy)}
/* On the ink/navy bands the same tint would wash out; hold the gold register. */
.nav ::selection,.hero ::selection,.phero ::selection,
.join ::selection,.footer ::selection,.icpa-dark ::selection{
  background:var(--icpa-accent);color:var(--icpa-accent-ink);
}
/* Text caret follows the brand rather than the OS default black. */
input,textarea,select,[contenteditable]{caret-color:var(--icpa-navy)}
/* Underlines only ever appear on hover/focus in this system; when they do,
   clear the descenders instead of striking through them. */
a{text-underline-offset:3px;text-decoration-thickness:1px}

/* ---------- link colour on the ink bands ----------
   `a`/`a:hover` above resolve --text-link/--text-link-hover from the light
   register, which is navy #30588F over #101B2E (2.0:1) and dark navy #232460
   on hover (1.2:1) -- a link that all but disappears at the moment the reader
   points at it. Every band that paints itself dark re-points the two tokens at
   the dark register, so a link with no component rule of its own still lands
   legible. Component rules keep winning on specificity; nothing styled today
   changes appearance. */
.nav,.hero,.phero,.join,.footer,.skip-link{
  --text-link:#9CB4D8;
  --text-link-hover:var(--off-white);
}

/* keyboard users: first tab stop jumps past nav + rail */
.skip-link{
  position:fixed;top:12px;left:12px;z-index:100;transform:translateY(-250%);
  background:var(--icpa-ink-2);color:var(--off-white);border:1px solid var(--icpa-accent);
  border-radius:var(--radius-sm);padding:10px 18px;
  font-family:var(--font-sans);font-size:.875rem;font-weight:var(--weight-semibold);
  transition:var(--transition-control);
}
.skip-link:focus{transform:none}

/* ---------- layout scaffolding ---------- */
:root{
  /* Full-bleed shell: backgrounds span the viewport, content sits inside the
     gutters. They used to be fixed at 64/132, which let the home page run
     nearly edge to edge on a wide monitor; they now track --frame
     (tokens/spacing.css) and never fall below the old 64px floor. The right
     gutter keeps its extra 68px of scroll-rail clearance. */
  --pad-l:max(64px, var(--frame));                       /* left content gutter   */
  --pad-r:calc(max(64px, var(--frame)) + 68px);          /* right gutter incl. rail clearance */
  --rail-w:104px;    /* 104, not 96: see .rail__label — "COMMUNITY" needs 78.67px */
}
.shell{position:relative}
.pad{padding-left:var(--pad-l);padding-right:var(--pad-r)}

/* ---------- shared components ---------- */
.eyebrow{
  font:var(--type-caption);
  font-weight:var(--weight-bold);
  font-size:var(--size-eyebrow);
  text-transform:uppercase;
  letter-spacing:var(--tracking-eyebrow);
  color:var(--text-meta);
}
.eyebrow--accent{color:var(--icpa-accent-bright)}
.eyebrow--accent-light{color:var(--icpa-accent-on-light)}
.eyebrow--reverse{color:#9CB4D8}

/* eyebrow spacing (replaces inline margin spacers) */
.eyebrow-row{margin-bottom:20px}
.eyebrow-row--tight{margin-bottom:14px}
/* card / panel heads are real headings for screen-reader outline; visual style stays eyebrow */
.card__head{margin:0 0 14px}
.card__head--flush{margin-bottom:0}
.panel__head{margin:0 0 12px}
.panel__more{display:inline-block;margin-top:16px}
.panel__links{display:flex;flex-direction:column;align-items:flex-start;gap:8px}
.panel__links .panel__more{margin-top:0}
.panel__links{margin-top:16px}
.focus__head{margin:0}

.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  font-family:var(--font-sans);font-weight:var(--weight-semibold);
  border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;flex-shrink:0;
  padding:10px 22px;font-size:1rem;border:1px solid transparent;
  transition:var(--transition-control);text-decoration:none;
}
.btn--lg{padding:14px 30px;font-size:1.0625rem}
/* Option C: metallic light-sweep gradient — buttons, plus scrollbar thumb/arrows and rail dots */
.btn--gold{background:var(--icpa-gold-gradient);color:var(--icpa-accent-ink);border-color:transparent}
.btn--gold:hover{background:var(--icpa-gold-gradient);border-color:transparent;color:var(--icpa-accent-ink);filter:brightness(1.08)}
.btn--gold:active{filter:brightness(.94)}
.btn--navy{background:var(--icpa-dark-navy);color:var(--white);border-color:var(--icpa-dark-navy)}
.btn--navy:hover{background:var(--icpa-ink-navy-hover);border-color:var(--icpa-ink-navy-hover);color:var(--white)}
.btn--navy:active{background:var(--icpa-ink-navy-active);border-color:var(--icpa-ink-navy-active)}

/* numeric roles: tabular figures so columns of numbers and dates align */
.ledger,.events__date,.stat__big,.stat__mid,.brief__date{font-variant-numeric:tabular-nums}

/* ---------- standalone "go" links ----------
   The arrow links that close a card or panel are the section's actual exit,
   but at 13px they rendered a 20px-tall target -- under the 24px floor WCAG
   2.5.8 sets for a pointer target. They are laid out as their own line, so the
   height can grow without shifting anything around them; the text baseline
   does not move. Inline links inside a paragraph are deliberately untouched:
   there the surrounding line spacing carries the exemption. */
.partners__link a,.events__all a,.cert a,.pillar a,.link-dim,.panel__more{
  display:inline-flex;align-items:center;min-height:24px;
}

/* lucide line icon via CSS mask (inherits currentColor) */
.icon{
  display:inline-block;width:20px;height:20px;flex:0 0 auto;
  background-color:currentColor;
  -webkit-mask-image:var(--i);mask-image:var(--i);
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-position:center;mask-position:center;
}
.icon--15{width:15px;height:15px}
.icon--14{width:14px;height:14px}
.icon--22{width:22px;height:22px}
.icon--24{width:24px;height:24px}

.chip{
  display:inline-flex;align-items:center;gap:8px;padding:6px 12px;
  border-radius:var(--radius-pill);border:1px solid #33445F;
  background:rgba(255,255,255,.03);color:var(--off-white);
  font:var(--type-caption);font-weight:var(--weight-semibold);white-space:nowrap;
}
.chip__dot{width:8px;height:8px;border-radius:50%;background:var(--status-monitoring);flex:0 0 auto}

/* visually hidden, screen-reader available */
.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;
}

/* ---------- the ink cap + the floating nav ----------
   Decision of 2026-08-17, built 2026-08-23. The header is two rows: a 36px
   solid ink utility cap pinned to the very top, and the primary nav floating
   transparent on the dark hero beneath it.

   Why the cap exists rather than a pure-transparent header: the nav can be
   transparent because every hero on this site is already ink, but the 12.5px
   utility type has no such guarantee the moment the header scrolls off the
   hero or a page ships without one. A solid 36px strip gives that type a
   ground it keeps in all three states, and the header's silhouette is then
   identical floating, scrolled and hero-less.

   .siteheader wraps both rows so the scrolled state is one position change on
   one element instead of two elements kept in sync. Absolute at rest (over
   the hero, out of flow, exactly as .nav was on its own) and fixed once the
   page scrolls -- at scrollY 0 the two render identically, so the swap has no
   jump to hide. */
.siteheader{position:absolute;top:0;left:0;right:0;z-index:6}

/* ---- the cap ---- */
.utilcap{
  /* above the nav row: the open search panel hangs down out of the cap and
     has to clear the dropdown menus, which are positioned and later in DOM
     order and would otherwise paint over it. */
  position:relative;z-index:2;
  /* One child, right-aligned: the cap is a utility row, not a two-sided
     bar. The support@ address that used to hold the left end came off on
     2026-08-23 -- Contact Us four items along goes to the real form, and
     two ways to say the same thing in a 36px strip is one too many. */
  display:flex;align-items:center;justify-content:flex-end;gap:24px;
  min-height:36px;padding:0 var(--pad-r) 0 var(--pad-l);
  /* A shade under --icpa-ink, not equal to it. Every hero on this site opens
     on --icpa-ink, so a cap painted in the token disappears into the hero and
     only the hairline says it is there -- which was the whole failure mode
     the cap was meant to avoid. Going one step darker makes the strip read as
     its own band against the hero and still reads as ink against white. */
  background:#050A13;
  border-bottom:1px solid var(--icpa-ink-hairline);
  font-size:.78125rem;line-height:1;              /* 12.5px */
  font-weight:var(--weight-semibold);
  color:#8FA0B8;
}
.utilcap__right{display:flex;align-items:center;gap:6px;min-width:0}

/* Every cap control is the same shape: a 34px-tall text button that lights up
   on hover. 34 rather than the 44 the nav buttons use because the row is 36
   tall by decision; these are pointer-only controls (below the drawer
   breakpoint the drawer carries full-size versions of all of them). */
.utilcap__link{
  display:inline-flex;align-items:center;gap:7px;
  min-height:34px;padding:0 10px;border-radius:3px;
  color:#B7C4D6;white-space:nowrap;
  transition:var(--transition-control);
}
.utilcap__link:hover{background:rgba(255,255,255,.07);color:#FCFCFC}
.utilcap__link .icon{width:13px;height:13px}
.utilcap__sep{width:1px;height:16px;background:var(--icpa-ink-hairline);flex:0 0 auto;margin:0 4px}

/* social -- square icon buttons, one shade quieter than the text links so
   four marks in a row do not out-shout Contact Us next to them. */
.utilcap__soc{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  min-width:30px;min-height:30px;padding:0 7px;border-radius:3px;
  color:#8FA0B8;white-space:nowrap;
  transition:var(--transition-control);
}
.utilcap__soc:hover{background:rgba(255,255,255,.07);color:#FCFCFC}
.utilcap__soc .icon{width:15px;height:15px}
/* The LinkedIn group takes a word: it and the LinkedIn page are two real,
   different destinations, and two identical marks side by side would make
   the reader hover to find out which is which. */
.utilcap__soc--label{padding-right:10px}

/* the member state -- the one cap item that reads as a control, not a link */
.utilcap__login{
  display:inline-flex;align-items:center;gap:7px;
  min-height:26px;padding:0 12px;border-radius:3px;
  border:1px solid rgba(255,255,255,.24);
  color:#D8E2EE;white-space:nowrap;
  transition:var(--transition-control);
}
.utilcap__login:hover{background:rgba(255,255,255,.1);border-color:#FCFCFC;color:#FCFCFC}
.utilcap__login .icon{width:12px;height:12px}

/* Signed in, the same pill becomes the greeting. Both halves are in the
   markup and this picks one, so with JS off the cap shows "Log in" -- the
   safe half. .is-member is set from body.logged-in, the same signal
   js/login.js and every gate on the site already read. */
.utilcap__me{
  display:none;align-items:center;gap:7px;
  min-height:26px;padding:0 12px;border-radius:3px;
  border:1px solid rgba(255,255,255,.24);
  color:#D8E2EE;white-space:nowrap;
  transition:var(--transition-control);
}
.utilcap__me:hover{background:rgba(255,255,255,.1);border-color:#FCFCFC;color:#FCFCFC}
.utilcap__me .icon{width:13px;height:13px;color:var(--icpa-accent)}
.siteheader.is-member .utilcap__login{display:none}
.siteheader.is-member .utilcap__me{display:inline-flex}

/* Search moves out of the nav row and into the cap. The markup, its ids and
   its classes are unchanged, so js/main.js binds to it exactly as before --
   only the box it sits in and the direction the panel opens are new. */
.utilcap .nav__searchtoggle{min-width:34px;min-height:34px;padding:0 9px;border:0;color:#B7C4D6}
.utilcap .nav__searchtoggle:hover{background:rgba(255,255,255,.07);border:0;color:#FCFCFC}
.utilcap .nav__searchtoggle .icon{width:15px;height:15px}
/* The open field is taller than the 36px row, so in the cap it hangs below
   the strip onto the hero instead of centring on it and overflowing both
   edges. */
.utilcap .nav__searchform{top:calc(100% - 2px);transform:none;width:min(420px,44vw)}

/* ---- the nav, now floating under the cap ---- */
.siteheader .nav{position:static;padding-top:22px;padding-bottom:22px;z-index:auto}
/* the two controls the cap took over */
.siteheader .nav .nav__search,.siteheader .nav .nav__login{display:none}

/* ---- scrolled state ----
   Fixed, and the nav row takes the cap's ground so the pair reads as one
   solid bar once there is page content behind it. */
.siteheader{
  transition:background-color 200ms var(--ease-standard),box-shadow 200ms var(--ease-standard);
}
.siteheader .nav{transition:padding 200ms var(--ease-standard),background-color 200ms var(--ease-standard)}
.siteheader.is-stuck{position:fixed;box-shadow:0 10px 30px rgba(4,10,20,.45)}
.siteheader.is-stuck .nav{
  padding-top:12px;padding-bottom:12px;
  background:var(--icpa-ink);
  border-bottom:1px solid var(--icpa-ink-hairline);
}
.siteheader.is-stuck .nav__logo{width:150px}
@media (prefers-reduced-motion:reduce){
  .siteheader,.siteheader .nav{transition:none}
}

/* ---- the hero-less fallback ----
   Nothing on the site ships without a dark hero today, so this is defensive:
   put .siteheader--solid on the wrapper and the floating row gets the cap's
   ground from the start, which is exactly the scrolled state standing still. */
.siteheader--solid .nav{background:var(--icpa-ink);border-bottom:1px solid var(--icpa-ink-hairline)}

@media (max-width:1379px){
  /* The nav collapses to the drawer here, but the cap does not: Contact,
     search and the member state stay one tap away on tablet instead of
     going behind the burger with everything else. */
  .utilcap{padding-right:var(--pad-r)}
}
@media (max-width:767px){
  .utilcap{padding-left:var(--pad-l);gap:8px}
  .utilcap__me{padding:0 10px}
  .utilcap .nav__search{display:none}   /* the drawer carries a full-size field */
  .utilcap__soc,.utilcap__sep{display:none}
}

/* ---------- nav ---------- */
.nav{
  position:absolute;top:0;left:0;right:0;z-index:6;
  display:flex;align-items:center;justify-content:space-between;gap:32px;
  padding:28px var(--pad-r) 0 var(--pad-l);
}
.nav__home{display:block;flex:0 0 auto}
.nav__logo{width:190px;height:auto;display:block}
.nav__group{display:flex;align-items:center;gap:20px}
.nav__links{display:flex;align-items:center;gap:22px;margin-right:64px;font-size:.875rem;font-weight:600;color:#C4D0DF}

/* dropdown menus */
.nav__item{position:relative}
.nav__link{
  display:inline-flex;align-items:center;gap:5px;padding:0;
  background:none;border:0;cursor:pointer;
  font:inherit;color:inherit;white-space:nowrap;
  transition:var(--transition-control);
}
.nav__link:hover,.nav__item.is-open .nav__link{color:#FCFCFC}
.nav__link .icon{transition:transform 200ms var(--ease-standard)}
.nav__item.is-open .nav__link .icon{transform:rotate(180deg)}
.nav__menu{
  position:absolute;top:calc(100% + 14px);left:-14px;min-width:236px;
  background:var(--icpa-ink-2);border:1px solid var(--icpa-ink-hairline);
  border-radius:6px;padding:10px;box-shadow:var(--shadow-card);
  opacity:0;visibility:hidden;transform:translateY(6px);
  transition:opacity 160ms var(--ease-standard),transform 160ms var(--ease-standard),visibility 160ms;
}
/* invisible bridge so the pointer can cross the gap without closing the menu */
.nav__menu::before{content:"";position:absolute;top:-16px;left:0;right:0;height:16px}
.nav__item.is-open .nav__menu{opacity:1;visibility:visible;transform:none}
@media (prefers-reduced-motion:reduce){.nav__menu,.nav__link .icon{transition:none}}
.nav__menu--wide{min-width:280px}
.nav__menu--right{left:auto;right:-14px}
.nav__menu a{
  display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:4px;
  font-size:.875rem;font-weight:500;color:#C4D0DF;white-space:nowrap;
}
.nav__menu a:hover{background:rgba(255,255,255,.06);color:#FCFCFC}
.nav__menu-label{
  margin:10px 12px 4px;padding-top:12px;border-top:1px solid var(--icpa-ink-hairline);
  font-size:.6875rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:var(--icpa-accent-bright);
}
.nav__lock{width:12px;height:12px;margin-left:auto;color:var(--icpa-accent)}

/* flat top-level links (Jobs) — .nav__link is shared by <button> and <a>,
   and the anchor needs the text-decoration reset the button never needed. */
a.nav__link{text-decoration:none}

/* The lock on a flat top-level link. In a dropdown row .nav__lock takes
   margin-left:auto so every glyph lines up on the right edge of the
   panel; a top-level link is shrink-to-fit and has no right edge to line
   up on, so the auto margin is reset and the link's own 5px gap does the
   spacing — the same gap the chevron sits on in the sibling links. */
.nav__link .nav__lock{margin-left:0}

/* The lock on the two "Ask the ICPA Community" buttons. Same reasoning as
   the flat top-level link above: a shrink-to-fit button has no right edge
   for the glyph to line up against, so the auto margin gives way to a
   plain gap. On the desktop button the lock sits inside the second line,
   in an inline context, which is why it needs the baseline nudge. */
.nav__cta .nav__lock{margin-left:5px}
.nav__cta--ask .nav__lock{width:11px;height:11px;margin-left:4px;vertical-align:-1px}

/* nav actions — Log in gets the same boxed treatment as the CTAs */
.nav__login{
  display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;padding:9px 18px;
  border:1px solid rgba(255,255,255,.28);border-radius:3px;
  font-size:.875rem;font-weight:600;color:#C4D0DF;
}
.nav__login:hover{background:rgba(255,255,255,.08);border-color:#FCFCFC;color:#FCFCFC}
.nav__cta{
  display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;padding:9px 18px;
  border:1px solid rgba(255,255,255,.28);border-radius:3px;
  font-size:.875rem;font-weight:600;color:#C4D0DF;
}
.nav__cta:hover{background:rgba(255,255,255,.08);border-color:#FCFCFC;color:#FCFCFC}
/* two-line community button — "ICPA Community" stays one unit on the second line */
.nav__cta--ask{
  flex-direction:column;line-height:1.1;text-align:center;
  padding:6px 16px;font-size:.8125rem;color:#FCFCFC;border-color:rgba(255,255,255,.4);
}
.nav__cta--ask:hover{background:rgba(255,255,255,.1);border-color:#FCFCFC}
/* Contact Us call-out — brighter border/text than the default cta, same weight as Ask */
.nav__cta--contact{color:#FCFCFC;border-color:rgba(255,255,255,.4)}
.nav__cta--contact:hover{background:rgba(255,255,255,.1);border-color:#FCFCFC}
/* Option C: metallic gradient is buttons-only, so the primary nav CTA may carry it */
.nav__cta--gold{
  background:var(--icpa-gold-gradient);border-color:transparent;
  color:var(--icpa-accent-ink);font-weight:700;
}
.nav__cta--gold:hover{
  background:var(--icpa-gold-gradient);border-color:transparent;
  color:var(--icpa-accent-ink);filter:brightness(1.08);
}
.nav__cta--gold:active{filter:brightness(.94)}
/* ---------- nav search ----------
   Closed it is a 44px icon button, which is all the width the nav row can
   spare; open it becomes a field that grows leftward over the menu labels
   rather than pushing the buttons to its right off the end of the bar.
   The form is a real GET on `s`, the same parameter search.html and
   WordPress both answer, so it works with scripts off: without JS the
   button is a plain link to search.html and the field is never needed. */
.nav__search{position:relative;display:flex;align-items:center}
.nav__searchtoggle{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:44px;min-height:44px;padding:8px 10px;cursor:pointer;
  background:none;border:1px solid rgba(255,255,255,.28);border-radius:3px;
  color:#C4D0DF;transition:var(--transition-control);
}
.nav__searchtoggle:hover{background:rgba(255,255,255,.08);border-color:#FCFCFC;color:#FCFCFC}
.nav__searchtoggle .icon{width:18px;height:18px}
.nav__search.is-open .nav__searchtoggle{visibility:hidden}

.nav__searchform{
  display:none;position:absolute;right:0;top:50%;transform:translateY(-50%);
  z-index:2;align-items:center;gap:6px;
  width:min(420px,52vw);padding:4px 6px 4px 12px;
  background:var(--icpa-ink-2);
  border:1px solid var(--icpa-accent);border-radius:3px;
  box-shadow:0 6px 24px rgba(4,10,20,.5);
}
.nav__search.is-open .nav__searchform{display:flex}
.nav__searchinput{
  flex:1 1 auto;min-width:0;min-height:36px;padding:6px 2px;
  font-family:var(--font-sans);font-size:.9375rem;color:#FCFCFC;
  background:none;border:0;-webkit-appearance:none;appearance:none;
}
.nav__searchinput::placeholder{color:#7C8EA8;opacity:1}
.nav__searchinput:focus{outline:none}
.nav__searchinput::-webkit-search-decoration,
.nav__searchinput::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}
.nav__searchgo,.nav__searchclose{
  display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
  min-width:36px;min-height:36px;padding:0;cursor:pointer;
  background:none;border:0;border-radius:3px;color:#C4D0DF;
  transition:var(--transition-control);
}
.nav__searchgo:hover,.nav__searchclose:hover{color:#FCFCFC;background:rgba(255,255,255,.08)}
.nav__searchgo .icon,.nav__searchclose .icon{width:16px;height:16px}

/* ---------- drawer search ----------
   The icon button is hidden with the rest of the bar below the drawer
   breakpoint, so the drawer carries a real field of its own rather than
   sending a phone reader to search.html to find one. */
.mobile-menu__search{
  display:flex;align-items:center;gap:8px;margin:0 0 18px;
  padding:6px 8px 6px 14px;
  background:rgba(255,255,255,.05);
  border:1px solid var(--icpa-ink-hairline);border-radius:3px;
}
.mobile-menu__search .nav__searchinput{min-height:40px;font-size:1rem}
.mobile-menu__search:focus-within{border-color:var(--icpa-accent)}

/* 44px square minimum: this is the only way into the menu on every viewport
   that shows it, and 8px padding round a 22px icon left it 40px tall. */
.nav__toggle{
  display:none;align-items:center;justify-content:center;
  background:none;border:1px solid rgba(255,255,255,.28);border-radius:3px;
  color:#FCFCFC;padding:8px 10px;min-width:44px;min-height:44px;cursor:pointer;
}
.nav__toggle .icon{width:22px;height:22px}

/* mobile menu drawer */
.mobile-menu{
  display:none;position:fixed;inset:0;z-index:40;background:rgba(10,18,32,.97);
  padding:88px 32px 32px;flex-direction:column;overflow-y:auto;
}
.mobile-menu.is-open{display:flex}
.mobile-menu summary{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  list-style:none;cursor:pointer;
  color:#E8EDF4;font-size:1.25rem;font-weight:600;padding:14px 4px;
  border-bottom:1px solid var(--icpa-ink-hairline);
}
.mobile-menu summary::-webkit-details-marker{display:none}
.mobile-menu summary .icon{color:#94A6BE;transition:transform 200ms var(--ease-standard)}
.mobile-menu details[open] summary .icon{transform:rotate(180deg)}
.mobile-menu__list{display:flex;flex-direction:column;padding:4px 0 12px;border-bottom:1px solid var(--icpa-ink-hairline)}
.mobile-menu__list a{
  display:flex;align-items:center;gap:10px;
  color:#B9C6D6;font-size:1rem;font-weight:500;padding:10px 16px;
}
.mobile-menu__list a:hover{color:#FCFCFC}
.mobile-menu__label{
  margin:8px 16px 0;padding-top:12px;border-top:1px solid var(--icpa-ink-hairline);
  font-size:.6875rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:var(--icpa-accent-bright);
}
/* flat drawer row — matches a <summary> without being a disclosure */
.mobile-menu__flat{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  color:#E8EDF4;font-size:1.25rem;font-weight:600;padding:14px 4px;
  border-bottom:1px solid var(--icpa-ink-hairline);
}
.mobile-menu__flat:hover{color:#FCFCFC}
.mobile-menu__close{
  position:absolute;top:26px;right:24px;background:none;border:1px solid rgba(255,255,255,.28);
  border-radius:3px;color:#FCFCFC;padding:8px 10px;cursor:pointer;
}
.mobile-menu__ctas{display:flex;gap:14px;margin-top:26px;flex-wrap:wrap}
.mobile-menu__ctas .nav__cta{flex:1 1 auto}

/* ---------- section rail ---------- */
.rail{
  position:fixed;top:0;right:0;bottom:0;width:var(--rail-w);z-index:5;
  background:var(--icpa-ink-2);border-left:1px solid var(--icpa-ink-hairline);
  opacity:1;transition:opacity 300ms var(--ease-standard);
}
/* auto-hide after scroll inactivity — stays in the DOM & focusable */
.rail.rail--idle{opacity:0}
.rail:hover,.rail:focus-within{opacity:1}
@media (prefers-reduced-motion:reduce){.rail{transition:none}}
.rail__inner{height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;overflow:hidden}
.rail__item{display:flex;flex-direction:column;align-items:center;gap:14px}
.rail__link{
  display:flex;flex-direction:column;align-items:center;gap:10px;text-decoration:none;
  opacity:.45;transition:opacity 200ms var(--ease-standard);
}
.rail__link.is-active{opacity:1}
.rail__top{display:flex;align-items:center;gap:8px}
.rail__dot{width:9px;height:9px;border-radius:50%;background:var(--icpa-gold-gradient)}
.rail__num{font-size:.8125rem;font-weight:700;letter-spacing:.08em;color:#E8EDF4}
.rail__label{
  /* 86px, not 78. At 11px/.1em tracking "COMMUNITY" measures 78.67px — including
     the phantom letter-space after the final Y — so it overflowed a 78px box by
     0.67px. Harmless here, fatal under a theme that sets overflow-wrap:break-word
     (the Orbital theme does): the word broke mid-letter and orphaned the Y onto a
     line of its own, making that one rail item a line taller than the rest.
     The three no-break declarations are the belt to that braces — a label in this
     rail is a fixed phrase, and there is no width at which breaking one mid-word
     is the right answer. --rail-w went 96 -> 104 to keep the same 9px either side. */
  width:86px;text-align:center;font-size:.6875rem;line-height:1.4;font-weight:600;
  letter-spacing:.1em;text-transform:uppercase;color:#94A6BE;
  overflow-wrap:normal;word-break:normal;hyphens:none;
}
.rail__more{display:flex;flex-direction:column;align-items:center;gap:6px;color:#3C5074}
.rail__more span{width:1px;height:26px;background:currentColor}

/* ---------- hero ---------- */
.hero{
  position:relative;overflow:hidden;
  background:linear-gradient(180deg,var(--icpa-ink) 0%,var(--icpa-ink-2) 100%);
}
.hero__globe{
  /* The shell is full-bleed, so the hero spans the viewport and -70px keeps the
     sphere's limb (~65px inside the canvas box) tucked under the fixed rail at any width. */
  position:absolute;top:-70px;right:-70px;width:980px;height:1034px;
  /* Two mask layers: the radial fades the canvas edges; the linear dissolves the
     sphere's left side gradually into the ink so text and globe flow together. */
  -webkit-mask-image:linear-gradient(90deg,transparent 2%,#000 46%),
                     radial-gradient(98% 84% at 50% 46%,#000 70%,transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(90deg,transparent 2%,#000 46%),
             radial-gradient(98% 84% at 50% 46%,#000 70%,transparent 100%);
  mask-composite:intersect;
}
.hero__globe canvas{display:block;width:100%;height:100%;touch-action:pan-y;cursor:grab}
.hero__globe canvas:active{cursor:grabbing}
/* fallback render shows by default; hidden only once the live globe boots */
.hero__globe .globe-fallback{width:100%;height:100%;object-fit:cover;display:block}
.hero__globe.is-live .globe-fallback{display:none}
.hero__globe.is-static canvas{display:none}
.hero__scrim{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(90deg,var(--icpa-ink) 26%,rgba(10,18,32,.55) 46%,rgba(10,18,32,0) 66%);
}
/* The header floats over the hero and takes no height from it, so every hero
   clears it with hard top padding. On 2026-08-23 the ink cap put a 36px strip
   above the nav row and the row itself went from 28/0 padding to 22/22: 52px
   more header. Every hero top padding on the site was raised by that same 52px
   -- .phero and .phero--insights, .tr-hero, .kkhero and this one -- so each
   hero keeps exactly the clearance it was drawn with. Header height today is
   136px at full width and 127px below 1380px, where the logo steps down. */
.hero__content{position:relative;padding:228px var(--pad-r) 0 var(--pad-l)}
.hero__eyebrow{margin-bottom:22px}
.hero h1{
  max-width:16ch;font-weight:800;font-size:4rem;line-height:1.08;
  letter-spacing:-.02em;color:#FCFCFC;
}
.hero h1 em{
  font-family:var(--font-serif-display);font-weight:400;font-style:italic;letter-spacing:0;
  /* metallic gold sweep clipped to the glyphs; the flat gold remains the fallback color */
  color:var(--icpa-accent-bright);
  background:var(--icpa-gold-gradient);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
}
/* editorial ledes: light weight against the 800 headlines; dark surfaces get a
   half-step more weight (350) so light-on-dark doesn't go thin */
.hero__lede{margin:28px 0 0;max-width:50ch;font:var(--type-body);font-size:1.125rem;font-weight:350;color:#B9C6D6}
/* brand tagline lockup: the nouns carry the bold, connectives stay light —
   matches assets/A Network of People A World of Knowledge tagline.png */
.tagline b{font-weight:700}
.hero__lede .tagline{color:#DCE5F0}
.hero__ctas{display:flex;align-items:center;gap:32px;margin-top:40px;flex-wrap:wrap}
.hero__link{
  display:inline-flex;align-items:center;gap:10px;font-size:1rem;font-weight:600;
  color:#E8EDF4;border-bottom:1px solid rgba(255,255,255,.25);padding-bottom:3px;
}
.hero__link:hover{border-bottom-color:#FCFCFC;color:#FCFCFC}

.hero__stats{
  /* 4 stat tiles + an auto column so the globe pause pill sits in the spare
     space beside "Next webinar" (collapses to nothing while the button is hidden) */
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) auto;align-items:stretch;margin-top:40px;
}
/* hairlines live on the tiles, not the row, so they stop at "Next webinar"
   instead of running on over the globe pause pill */
.stat{
  display:flex;align-items:center;gap:14px;padding:26px 22px;
  border-top:1px solid var(--icpa-ink-hairline);border-bottom:1px solid var(--icpa-ink-hairline);
  border-right:1px solid var(--icpa-ink-hairline);
}
.stat:first-child{padding-left:0}
.stat:last-of-type{border-right:none}
.stat .icon{color:var(--icpa-accent)}
/* stat tiles can be sheet-driven links; without an href they behave like plain tiles */
a.stat{color:inherit;text-decoration:none}
a.stat[href]{cursor:pointer}
a.stat[href]:hover .stat__mid{text-decoration:underline;text-underline-offset:3px}
.stat__big{font-size:1.25rem;font-weight:700;color:#FCFCFC}
.stat__mid{font-size:1.125rem;font-weight:700;color:#FCFCFC}
.stat__label{font-size:.875rem;color:#94A6BE}
/* "Next event / Next webinar" — a real title above the date, not part of it */
.stat__title{
  font-size:.8125rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;
  color:var(--icpa-accent-bright);margin-bottom:3px;
}

/* ---------- hero globe: pause/resume control ----------
   Lives as the last cell of the stats row, in the spare space by "Next webinar" */
.hero__globe-pause{
  align-self:center;justify-self:end;margin-left:22px;
  display:inline-flex;align-items:center;gap:8px;padding:7px 14px;
  background:rgba(10,18,32,.55);border:1px solid rgba(255,255,255,.22);border-radius:var(--radius-pill);
  color:#E8EDF4;font-family:var(--font-sans);font-size:.875rem;font-weight:600;
  cursor:pointer;white-space:nowrap;transition:var(--transition-control);
}
/* author display beats the UA [hidden] rule — restate it so the button truly
   disappears when the live globe never boots (no WebGL, reduced motion) */
.hero__globe-pause[hidden]{display:none}
.hero__globe-pause:hover{border-color:#FCFCFC;color:#FCFCFC}
@media (prefers-reduced-motion:reduce){.hero__globe-pause{display:none}}

/* ---------- partners band ---------- */
.partners{background:var(--white);padding:26px var(--pad-r) 22px var(--pad-l)}
.partners__eyebrow{text-align:center;margin-bottom:20px}
/* horizontally rotating logo marquee (seamless loop via duplicated set) */
.partners__marquee{
  overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 6%,#000 94%,transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 6%,#000 94%,transparent 100%);
}
.partners__track{
  display:flex;align-items:center;gap:56px;width:max-content;
  /* 24 logos, not the 8 the band shipped with: the duration scales with the
     set width so the pixel speed is unchanged (8 logos/64s -> 24 logos/192s). */
  animation:partners-scroll 192s linear infinite;
}
.partners__marquee:hover .partners__track{animation-play-state:paused}
.partners__track > div{height:44px;width:150px;display:flex;align-items:center;justify-content:center;flex:0 0 auto}
.partners__track img{max-width:100%;max-height:100%;object-fit:contain;display:block}
/* The marquee images are deliberately NOT loading="lazy". The track is ~9,800px
   wide at 24 logos, so most of it sits far outside the viewport horizontally;
   lazy loading only fires as the animation carries each logo in, which left a
   visible run of empty 150px slots scrolling past. 24 unique files, ~350KB, and
   the duplicate set reuses the same URLs so it costs no extra requests. */
@keyframes partners-scroll{
  from{transform:translateX(-50%)}
  to{transform:translateX(0)}
}
@media (prefers-reduced-motion:reduce){
  .partners__track{animation:none;flex-wrap:wrap;width:auto;justify-content:center}
  .partners__track > [aria-hidden="true"]{display:none}
  .partners__marquee{-webkit-mask-image:none;mask-image:none}
}
.partners__foot{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:16px}
.partners__pause{
  background:none;border:1px solid var(--icpa-light-blue);border-radius:var(--radius-sm);
  color:var(--ink-meta);font-family:var(--font-sans);font-size:.875rem;font-weight:var(--weight-semibold);
  padding:6px 12px;cursor:pointer;transition:var(--transition-control);
}
.partners__pause:hover{border-color:var(--icpa-navy);color:var(--icpa-navy)}
/* Press. Same squeeze the interior chips take, so a tap reads as landing. */
.partners__pause,.hero__globe-pause{transition:var(--transition-control),transform var(--duration-fast) var(--ease-standard)}
.partners__pause:active,.hero__globe-pause:active{transform:scale(.97)}
@media (prefers-reduced-motion:reduce){
  .partners__pause,.hero__globe-pause{transition:none}
  .partners__pause:active,.hero__globe-pause:active{transform:none}
}
.partners__marquee.is-paused .partners__track{animation-play-state:paused}
@media (prefers-reduced-motion:reduce){.partners__pause{display:none}}
.partners__link{display:flex;justify-content:flex-end}
.partners__link a{
  font-size:.875rem;font-weight:600;color:var(--icpa-navy);
  border-bottom:1px solid var(--icpa-light-blue);padding-bottom:2px;
}
.partners__link a:hover{color:var(--icpa-dark-navy)}

/* ---------- learning & events (warm) ---------- */
.learning{background:var(--icpa-zone-warm);padding:88px var(--pad-r) 80px var(--pad-l)}
.learning__top{display:grid;grid-template-columns:.85fr 1.15fr;gap:48px;align-items:start}
.learning h2,.section-h2{
  font-weight:800;font-size:2.375rem;line-height:1.12;letter-spacing:-.015em;color:var(--icpa-dark-navy);
}
.learning__lede{margin:24px 0 0;max-width:40ch;font:var(--type-body);font-weight:var(--weight-light);color:var(--ink-body)}

.conference{
  position:relative;border-radius:10px;overflow:hidden;min-height:344px;
  border:1px solid var(--icpa-ink-hairline);
}
.conference__img{position:absolute;inset:0}
.conference__img img{width:100%;height:100%;object-fit:cover;display:block}
.conference__scrim{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(90deg,rgba(10,18,32,.88) 0%,rgba(10,18,32,.74) 50%,rgba(10,18,32,.4) 100%);
}
.conference__body{position:relative;padding:34px 36px;max-width:58%}
.conference h3{font-weight:700;font-size:1.75rem;line-height:1.2;color:#FCFCFC}
.conference__meta{display:flex;align-items:center;gap:24px;margin-top:16px;font-size:.875rem;color:#C4D0DF;flex-wrap:wrap}
.conference__meta span{display:inline-flex;align-items:center;gap:8px}
.conference__meta .icon{color:var(--icpa-accent)}
.conference__lede{margin:20px 0 0;font-size:1rem;line-height:1.55;color:#B9C6D6}
.conference__link{
  display:inline-block;margin-top:22px;font-size:.9375rem;font-weight:600;color:#FCFCFC;
  border-bottom:1px solid rgba(255,255,255,.3);padding-bottom:3px;
}

.learning__bottom{display:grid;grid-template-columns:.85fr 1.15fr;gap:48px;margin-top:32px;align-items:start}
.card{
  background:var(--white);border:1px solid var(--icpa-light-blue);
  box-shadow:var(--shadow-card);border-radius:10px;padding:24px 26px;
}
.events__row{display:flex;align-items:flex-start;gap:18px;padding:16px 0;border-top:1px solid var(--icpa-light-blue)}
/* Fixed, not min-width: a "13-15" range measures 56px against a bare "25" at
   38px, and with min-width the title column starts 18px further right on the
   range rows -- a visibly ragged left edge down a list whose whole job is to be
   scanned. One width holds every row's title on the same axis.

   Re-measured after the 2026-08-15 type bump: the binding string is no longer
   the day range (54px) but the month range "Sep-Oct", which needs 75px at the
   month's new 13px. At 56px it wrapped to two lines and made that one row
   taller than its neighbours. */
.events__date{text-align:center;width:76px;flex:0 0 76px}
.events__mon{font-size:.8125rem;letter-spacing:.1em;text-transform:uppercase;color:var(--icpa-accent-on-light)}
.events__day{font-size:1.25rem;font-weight:700;color:var(--icpa-dark-navy)}
.events__yr{font-size:.8125rem;color:var(--ink-meta);margin-top:2px}
.events__title{font-size:1rem;font-weight:600;color:var(--icpa-dark-navy)}
/* What the meeting is about, one sentence between the title and the
   date/place meta. Darker than .events__where so the three lines read as
   substance-then-logistics, and clamped to two lines so a long topic cannot
   push the fourth event out of the card's height. */
.events__topic{font-size:.875rem;line-height:1.45;color:var(--ink-body);margin-top:5px;
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
.events__where{font-size:.875rem;color:var(--ink-meta);margin-top:4px}
.events__all{display:flex;justify-content:flex-end;padding-top:16px;border-top:1px solid var(--icpa-light-blue)}
.events__all a,.link-navy{font-size:.875rem;font-weight:600;color:var(--icpa-navy)}
.events__all a:hover,.link-navy:hover{color:var(--icpa-dark-navy)}

.cert__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin-top:18px}
.cert{border:1px solid var(--icpa-light-blue);border-radius:6px;padding:20px}
.cert .icon{color:var(--icpa-accent-on-light)}
.cert__title{margin-top:16px;font-size:1.0625rem;font-weight:700;color:var(--icpa-dark-navy)}
.cert p{margin:8px 0 0;font-size:.875rem;line-height:1.5;color:var(--ink-meta)}
.cert a{display:inline-block;margin-top:16px;font-size:.875rem;font-weight:600;color:var(--icpa-navy)}
.cert a:hover{color:var(--icpa-dark-navy)}

/* ---------- trusted intelligence (ink) ---------- */
.intel{background:var(--icpa-ink);padding:88px var(--pad-r) 72px var(--pad-l)}
.intel__grid{display:grid;grid-template-columns:1.05fr 1fr 1fr;gap:40px;align-items:start}
.intel h2{
  font-weight:800;font-size:2.375rem;line-height:1.12;letter-spacing:-.015em;color:#FCFCFC;
}
.intel__lede{margin:24px 0 0;max-width:44ch;font:var(--type-body);font-weight:350;color:#B9C6D6}
.intel__cta{margin-top:32px}

.brief{
  background:rgba(255,255,255,.04);border:1px solid var(--icpa-ink-hairline);
  border-radius:6px;padding:28px 28px 22px;
  display:flex;flex-direction:column;min-height:308px;
}
.brief__kicker{font-size:.875rem;font-weight:700;letter-spacing:.06em;color:var(--icpa-accent-bright);margin-bottom:14px}
.brief h3{font-weight:700;font-size:1.375rem;line-height:1.25;color:#FCFCFC}
.brief p{margin:18px 0 0;font-size:1rem;line-height:1.55;color:#B9C6D6}
.brief__foot{
  margin-top:auto;padding-top:26px;display:flex;align-items:center;justify-content:space-between;
  border-top:1px solid var(--icpa-ink-hairline);
}
.brief__date{font-size:.875rem;letter-spacing:.1em;text-transform:uppercase;color:#94A6BE}
.link-dim{font-size:.875rem;font-weight:600;color:#C4D0DF}
.link-dim:hover{color:#FCFCFC}

.intel__stack{display:flex;flex-direction:column;gap:20px}
.panel{background:rgba(255,255,255,.04);border:1px solid var(--icpa-ink-hairline);border-radius:6px;padding:22px 24px}
.panel p{margin:14px 0 0;font-size:.875rem;line-height:1.5;color:#94A6BE}
.ledger{display:flex;flex-direction:column;margin-top:14px}
.ledger__row{
  display:flex;justify-content:space-between;padding:9px 0;font-size:.875rem;color:#B9C6D6;
  border-bottom:1px solid var(--icpa-ink-hairline);
}
.ledger__row:last-child{border-bottom:none}
.ledger__row strong{color:#FCFCFC}

.focus{margin-top:52px;padding-top:26px;border-top:1px solid var(--icpa-ink-hairline)}
.focus__grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:24px;color:#C4D0DF;margin-top:18px}
.focus__item{display:flex;align-items:center;gap:12px;font-size:.9375rem;font-weight:600}
.focus__item span:last-child{color:#FCFCFC}

/* ---------- community & careers (warm) ---------- */
.community{background:var(--icpa-zone-warm);padding:88px var(--pad-r) 80px var(--pad-l)}
.community__top{display:grid;grid-template-columns:.9fr 1.1fr;gap:48px;align-items:start}
.community__timeline{display:flex;align-items:center;gap:16px;margin-top:28px}
.community__since{font-size:1rem;font-weight:700;color:var(--icpa-accent-on-light)}
.community__arrow{flex:1;display:flex;align-items:center;color:var(--icpa-pastel-grey-blue)}
.community__arrow i{flex:1;height:1px;background:currentColor}
.community__arrow b{
  width:0;height:0;border-left:8px solid currentColor;
  border-top:4px solid transparent;border-bottom:4px solid transparent;
}
.community__lede{margin:18px 0 0;max-width:42ch;font:var(--type-body);font-weight:var(--weight-light);color:var(--ink-body)}

.founders{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
.founder{
  background:var(--white);border:1px solid var(--icpa-light-blue);border-radius:6px;
  overflow:hidden;box-shadow:var(--shadow-card);
}
.founder__img{aspect-ratio:3/4}   /* portrait box — shows the full headshot */
.founder__img img{width:100%;height:100%;object-fit:cover;object-position:top;display:block}
.founder__body{padding:16px 18px 18px}
.founder__name{font-size:1rem;font-weight:700;color:var(--icpa-dark-navy)}
.founder__role{font-size:.875rem;color:var(--ink-meta);margin-top:3px}

.pillars{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;margin-top:40px}
.pillar{
  background:var(--white);border:1px solid var(--icpa-light-blue);
  border-radius:6px;box-shadow:var(--shadow-card);padding:24px 26px;
}
.pillar__head{display:flex;align-items:center;gap:12px;color:var(--icpa-navy)}
.pillar__title{font-size:1.125rem;font-weight:700;color:var(--icpa-dark-navy)}
.pillar p{margin:14px 0 0;font-size:.875rem;line-height:1.55;color:var(--ink-body)}
.pillar a{display:inline-block;margin-top:18px;font-size:.875rem;font-weight:600;color:var(--icpa-navy)}
.pillar a:hover{color:var(--icpa-dark-navy)}

/* ---------- join band (closing conversion moment) ---------- */
.join{
  background:var(--surface-brand-dark);
  padding:76px var(--pad-r) 80px var(--pad-l);
  border-top:1px solid var(--icpa-ink-hairline);
}
.join h2{
  font-weight:800;font-size:2.375rem;line-height:1.12;letter-spacing:-.015em;
  color:var(--off-white);max-width:22ch;
}
.join__lede{margin:20px 0 0;max-width:56ch;font:var(--type-body);font-size:1.125rem;font-weight:350;color:var(--blue-9)}
.join__ctas{display:flex;align-items:center;gap:32px;margin-top:36px;flex-wrap:wrap}
.join__link{
  display:inline-flex;align-items:center;gap:10px;font-size:1rem;font-weight:600;
  color:#E8EDF4;border-bottom:1px solid rgba(255,255,255,.25);padding-bottom:3px;
}
.join__link:hover{border-bottom-color:var(--off-white);color:var(--off-white)}

/* ---------- footer ---------- */
.footer{
  background:var(--icpa-ink-2);padding:64px var(--pad-r) 40px var(--pad-l);
  border-top:1px solid var(--icpa-ink-hairline);
}
/* Option C: the footer is the sitemap. Brand block on its own row, then eight
   columns covering every page, so no section is more than one scroll away. */
.footer__brand{
  display:flex;align-items:flex-end;justify-content:space-between;gap:40px;flex-wrap:wrap;
  padding-bottom:38px;margin-bottom:38px;border-bottom:1px solid var(--icpa-ink-hairline);
}
.footer__actions{display:flex;align-items:center;gap:28px;flex-wrap:wrap}
.footer__cta{
  display:inline-flex;align-items:center;padding:11px 22px;border-radius:999px;
  border:1px solid rgba(255,255,255,.28);font-size:.8125rem;font-weight:600;color:#E8EDF4;
}
.footer__cta:hover{border-color:var(--off-white);background:rgba(255,255,255,.06)}
.footer__contact{font-size:.8125rem;color:#94A6BE}
.footer__contact:hover{color:#E8EDF4}
.footer__map{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:34px 40px}
.footer__logo{width:180px;height:auto;display:block}
/* title case, matching the hero lockup — no text-transform, and lighter tracking
   than an eyebrow since mixed case doesn't need it to stay readable */
.footer__motto{
  margin-top:20px;font-size:.75rem;font-weight:400;letter-spacing:.05em;
  white-space:nowrap;color:var(--icpa-accent-bright);
}
.footer__motto b{font-weight:700}
.footer__about{margin:16px 0 0;max-width:34ch;font-size:.8125rem;line-height:1.6;color:#94A6BE}
.footer__col{display:flex;flex-direction:column;gap:10px}
.footer__head{
  font-size:.75rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
  color:#E8EDF4;margin-bottom:6px;
}
.footer__col a{font-size:.8125rem;color:#94A6BE;display:flex;align-items:center;gap:7px}
.footer__col a:hover{color:#E8EDF4}
.footer__lock{width:11px;height:11px;flex:none;color:var(--icpa-accent)}
.footer__note{margin:4px 0 0;font-size:.6875rem;line-height:1.5;color:#7E90A8}
.footer__legal{
  display:flex;align-items:center;justify-content:space-between;gap:24px;margin-top:44px;
  padding-top:22px;border-top:1px solid var(--icpa-ink-hairline);font-size:.75rem;color:#7E90A8;
  flex-wrap:wrap;
}
.footer__legal a{color:#7E90A8}
.footer__legal a:hover{color:#E8EDF4}
.footer__legal span:last-child{display:flex;gap:22px}

/* ============================================================
   TABLET  (768px – 1199px)
   ============================================================ */
@media (max-width:1199px){
  :root{--pad-l:28px;--pad-r:28px}
  .rail{display:none}                    /* rail needs vertical room; hide below desktop */

  .hero h1{font-size:clamp(2.375rem,5.5vw,3.25rem)}
  .hero__globe{
    top:-20px;right:-160px;width:660px;height:700px;opacity:.9;
  }
  .hero__content{padding-top:202px}
  .stat{padding-left:14px;padding-right:14px;gap:10px}
  .stat:first-child{padding-left:0}
  /* not enough room beside the 4th tile — drop the pause pill under the row */
  .hero__globe-pause{grid-column:1 / -1;justify-self:end;margin:14px 0 0}

  .partners__track{gap:44px}

  .learning__top,.learning__bottom,.community__top{grid-template-columns:1fr;gap:32px}
  .intel__grid{grid-template-columns:1fr 1fr}
  .intel__grid > :first-child{grid-column:1 / -1}
  .focus__grid{grid-template-columns:repeat(3,minmax(0,1fr));row-gap:18px}
  .conference__body{max-width:74%}

  .footer__map{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:32px}
}

/* Compact nav: 5 menus + 3 actions need tighter metrics below 1440.
   Ceiling is 1459, not 1439: the width media feature counts the scrollbar,
   so at a 1440 viewport the content box is ~1426 and the full-size nav
   (which needs ~1445) overflowed by a scrollbar's width. 1479 rather than
   1459 because the full nav clears by only 1.9px at 1460; below 1480 the
   compact metrics keep ~40px of slack.

   Raised 1479 -> 1599 when the search button joined the bar. Measured on an
   interior page, where interior.css puts --frame on both nav gutters: the
   full-size row (190px logo + 32px gap + a 1180px action group) needs about
   1565px of viewport, and the scrollbar this site draws is 14px of that. */
@media (max-width:1599px){
  .nav{padding-right:calc(var(--rail-w) + 32px);gap:20px}
  .nav__logo{width:150px}
  .nav__group{gap:14px}
  .nav__links{gap:16px;font-size:.8125rem}
  .nav__login{padding:8px 14px;font-size:.8125rem}
  .nav__cta{padding:8px 14px;font-size:.8125rem}
  .nav__cta--ask{padding:6px 12px;font-size:.75rem}
  .nav__searchtoggle{min-width:40px;padding:8px}
}

/* nav collapses to the drawer once the full menu row can't fit.

   1319, not 1279. Same scrollbar trap the 1479 ceiling above documents, and
   this breakpoint had not been given the same treatment: the `width` media
   feature counts the scrollbar, so a 1280px viewport reports 1280 (the query
   does not match, full nav renders) while the content box is only ~1266. The
   compact nav needs ~1285, so the row ran 19px past the right edge and the
   Log in button was clipped on every page of the site. 1280x800 and 1280x1024
   are common laptop and desktop sizes, so this was not an edge case.

   1319 rather than the 1299 that would just barely clear, for the same reason
   the block above chose 1479 over 1459: leave the breakpoint ~20px of slack so
   a wider scrollbar or a longer nav label does not put it straight back.

   Raised 1319 -> 1379 for the search button, measured the same way as the
   block above: the compact row needs ~1356px at a 1380px viewport, which
   leaves the ~20px of slack this comment asks for. The button is hidden
   with the rest of the bar below it -- the drawer carries its own search
   field, so nothing is lost. */
@media (max-width:1379px){
  .nav{padding-right:var(--pad-r)}
  .nav .nav__links,.nav .nav__login,.nav .nav__cta,.nav .nav__search{display:none}
  .nav__toggle{display:inline-flex}
  .nav__logo{width:160px}
}

/* ============================================================
   MOBILE  (<768px)
   ============================================================ */
@media (max-width:767px){
  :root{--pad-l:20px;--pad-r:20px}

  .hero__content{padding-top:172px}
  .hero h1{font-size:clamp(1.9rem,8.5vw,2.375rem);max-width:none}
  .hero__lede{font-size:1.0625rem}
  .hero__globe{
    position:absolute;top:-40px;right:-140px;width:420px;height:445px;opacity:.5;
  }
  .hero__globe-pause{justify-self:start;margin:16px 0 4px;padding:5px 11px;font-size:.8125rem}
  .hero__scrim{background:linear-gradient(90deg,var(--icpa-ink) 15%,rgba(10,18,32,.8) 55%,rgba(10,18,32,.35) 100%)}
  .hero__ctas{gap:20px}
  .hero__ctas .btn{width:100%;justify-content:center}
  .hero__stats{grid-template-columns:1fr;border:none;margin-top:32px}
  .stat{border-right:none;border-bottom:none;border-top:1px solid var(--icpa-ink-hairline);padding:18px 0}
  .stat:last-of-type{border-bottom:1px solid var(--icpa-ink-hairline)}

  .partners{padding-top:22px;padding-bottom:20px}
  .partners__track{gap:32px;animation-duration:144s}
  .partners__track > div{height:36px;width:120px}
  .partners__foot{flex-direction:column;gap:12px}
  .partners__link{justify-content:center}

  .learning,.intel,.community{padding-top:56px;padding-bottom:52px}
  .section-h2,.learning h2,.intel h2,.join h2{font-size:clamp(1.625rem,6.5vw,2rem)}
  .join{padding-top:56px;padding-bottom:52px}
  .join__ctas{gap:20px}
  .join__ctas .btn{width:100%;justify-content:center}

  .conference{min-height:0}
  .conference__body{max-width:none;padding:26px 22px}
  .conference h3{font-size:1.375rem}

  .cert__grid{grid-template-columns:1fr}
  .intel__grid{grid-template-columns:1fr}
  .intel__grid > :first-child{grid-column:auto}
  .brief{min-height:0}
  .focus__grid{grid-template-columns:repeat(2,minmax(0,1fr))}

  .founders{grid-template-columns:1fr 1fr;gap:14px}
  .pillars{grid-template-columns:1fr;gap:16px;margin-top:28px}

  .footer{padding-top:44px}
  .footer__brand{align-items:flex-start;gap:26px}
  .footer__map{grid-template-columns:1fr;gap:28px}
  .footer__legal{flex-direction:column;align-items:flex-start;gap:12px}
}

/* very small phones: soften the globe further */
@media (max-width:420px){
  .hero__globe{right:-180px;opacity:.4}
}

/* Sheet-driven event rows: keep linked rows styled like static ones */
a.events__row{color:inherit;text-decoration:none}
a.events__row:hover .events__title{text-decoration:underline}

/* ============================================================
   Justified body copy — site-wide (2026-08-18)

   Body paragraphs set justified rather than ragged-right. Three
   declarations, and none of them is optional:

     text-align:justify   the ask.
     text-justify:inter-word
                          stretch the word spaces only. Without it a
                          UA is free to letter-space instead, which
                          breaks the Seasons/sans pairing on sight.
     hyphens:auto         the one that makes justification survivable.
                          This site's copy is full of long unbreakable
                          terms (classification, substantial
                          transformation, recertification, USMCA
                          rules-of-origin). A justified column that
                          cannot hyphenate opens rivers on every line
                          that ends in one. Every page carries
                          lang="en", so auto has a dictionary to use.

   Scope is body copy only. Display copy — headings, .sec-h2,
   pull-quote blockquotes, the ink-band ledes — stays ragged, which
   is the normal editorial split: justify what you read in runs, rag
   what you read at a glance.

   The precedent for all of the above is .ins-row__sum / .ins-sec > p
   in insights.css, which shipped justified first; this generalises
   it. Those rules stay where they are (they carry their own measure
   caps) and simply agree with this one.
   ============================================================ */
body p,
body dd,
body ul:where(:not([class])) > li,
body ol:where(:not([class])) > li{
  text-align:justify;
  text-justify:inter-word;
  hyphens:auto;
}

/* ---- kept ragged ----------------------------------------------
   `inherit` rather than `left`: inside a centred block (empty
   states, CTA panels, timeline steps) the right answer is the
   centring the parent already set, not a hard left. Everywhere else
   inherit resolves to start, which is what these had before.

   Class-substring selectors carry (0,1,1) and so outrank the
   (0,0,2) rule above without needing !important. --------------- */

/* site chrome. The rule is anchored on body rather than main so it
   survives the WordPress port — wordpress/build-*.js scopes every
   selector under the page wrapper, and there is no <main> inside
   that wrapper, so a main-anchored rule would silently do nothing
   there. The cost of the wider anchor is that nav and footer are
   now in range; they are short-line chrome, so take them back out. */
.nav p,
.nav li,
.mobile-menu p,
.mobile-menu li,
.footer p,
.footer li{
  text-align:inherit;
  hyphens:manual;
}

/* short UI copy: metadata, notes, labels, eyebrows, date columns,
   tag rails, captions, form help. One or two lines each — there is
   nothing to justify and the gaps show. */
body [class*="__meta"],
body [class*="__note"],
body [class*="__label"],
body [class*="__eyebrow"],
body [class*="__date"],
body [class*="__tags"],
body [class*="__help"],
body [class*="__status"],
body [class*="__caption"],
body [class*="__seats"],
body [class*="__extra"],
body [class*="-meta"],
body [class*="-note"],
body figcaption,
body .crumbs,
body .crumbs *,
body .subnav,
body .subnav *,
body .field,
body .field p,
body label,
body label p,
body button p,
body summary p{
  text-align:inherit;
  hyphens:manual;
}

/* table cells: a justified cell in a 3-column comparison table is
   all gaps, and the column rules in membership/levels/ce-process
   already decide their own alignment. */
body th p,
body td p,
body caption p{
  text-align:inherit;
  hyphens:manual;
}

/* centred set-pieces — the paragraph inherits the centring its
   panel sets, so it must not be re-aligned here. */
.oempty,
.s301-empty,
.s232-cycle__tbc-v,
.askc-feed__empty p,
.events-empty p,
.ins-empty p,
.ms-empty p,
.sp-empty p,
.accmark p,
.field__drop p,
.tr-hero__content p,
.kk-thanks p,
.td-tl p,
.tr-tl p{
  text-align:inherit;
  hyphens:manual;
}

/* the four homepage band ledes run 40–50ch in a light weight on
   dark ground. At that measure justification is visible as gaps
   before it is visible as a straight edge. Display copy — rag it.
   (.phero__lede on the interior pages runs 58ch and does justify.) */
.hero__lede,
.learning__lede,
.intel__lede,
.community__lede{
  text-align:left;
  hyphens:manual;
}

/* Below phone width the measure is 5–6 words a line: justifying it
   costs a gap on every line and buys a straight edge nobody reads
   as one. Same 560px threshold insights.css already uses. */
@media (max-width:560px){
  body p,
  body dd,
  body ul:where(:not([class])) > li,
  body ol:where(:not([class])) > li{
    text-align:left;
    hyphens:manual;
  }
}

/* ---- narrow columns stay ragged --------------------------------
   Measured in the browser after the rule above went in: these are
   the paragraphs and list items that land under ~36ch in their
   grid column. Justification needs words per line before it needs
   anything else — at 34ch and below there are five or six of them,
   and every line pays a visible gap for an edge nobody reads as
   straight. Hyphenation cannot rescue a column this narrow; it
   just moves the gap.

   This is a measured list, not a guessed one. If a new card grid
   lands under 36ch, add it here. --------------------------------- */
.cert p,                 /* home — certification cards, 21ch */
.ins-toc li,             /* insight article — contents rail, 20ch */
.kk-card p,              /* kidz kamp — three-up cards, 27ch */
.bg-sw__use,             /* brand guidelines — swatch usage note, 27ch */
.critcard__body,         /* CE accreditation — criteria cards, 32ch */
.ppstep__body,           /* CE process & pricing — step cards, 33ch */
.jn-stuck__aside p,      /* join — sticky aside, 33ch */
.acard__body,            /* about + reference hub — section cards, 34ch */
.gcard__body,            /* focused trade groups — group cards, 34ch */
.incl__card p,           /* membership — "every level includes" cards, 34ch */
.rstep__body,            /* ask the community — step cards, 34ch */
.cg-card__body,          /* communities & groups — group cards, 33ch */
.cg-card__chair,         /* communities & groups — chair line, 33ch */
.cg-card__forming,       /* communities & groups — forming note, 35ch */
.askc-card li{        /* ask the community — rail lists, 35ch */
  text-align:inherit;
  hyphens:manual;
}
