/* ============================================================
   Syracuse University · ITS Data & AI — STATIC site
   Built on the Syracuse University Design System (SUDS).
   ------------------------------------------------------------
   SUDS COLOR TOKENS (only these values or alpha tints are used):
   Primary   #F76900 orange · #FFFFFF white · #000E54 navy
   Secondary #FF8E00 · #203299 · #2B72D7 · #000000
   Text/UI   #333333 (body) · #CD3E00 (links/CTAs) · #D6D9DC (lines)
   Type      ShermanSans (headings + body) · ShermanSerif (blockquote only)
   Corners   sharp (border-radius:0) except pills/badges + circles
   ============================================================ */

:root{
  --navy:      #000E54;   /* primary blue */
  --orange:    #F76900;   /* primary orange */
  --orange-dk: #CD3E00;   /* SUDS orange for text / links / CTAs (>=4.5:1 on white) */
  --orange-lt: #FF8E00;   /* light orange accent */
  --blue:      #2B72D7;   /* light blue accent */
  --blue-dk:   #203299;   /* medium blue */
  --gray-dk:   #333333;   /* body copy (SUDS dark grey text) */
  /* SUDS medium grey #8C939B is a "lines & UI" color and fails WCAG AA (~3:1)
     as text; this token backs muted *text*, so it intentionally keeps a
     darker, AA-passing value rather than the raw SUDS #8C939B. */
  --gray-md:   #636A72;   /* muted labels. SUDS gray-placeholder, ~5.6:1 on white. SUDS gray-medium #7D848C is ~3.9:1 and fails AA for text, so it is not used for type */
  --gray-lt:   #D6D9DC;   /* SUDS light grey — decorative hairlines only */
  --wash:      #EFF0F1;   /* SUDS gray-xlight (surface-subtle): non-text surfaces only */
  --line:      #D6D9DC;   /* SUDS gray-light hairline */
  --line-soft: #EFF0F1;   /* SUDS gray-xlight, the faintest rule */

  --serif: "ShermanSerif", Georgia, serif;   /* blockquote ONLY (SUDS rule) */
  --sans:  "ShermanSans", Verdana, "Helvetica Neue", Arial, sans-serif;

  --header-h: 68px;
  --subnav-h: 0px;    /* the grey sub-bar is gone (one header bar since 2026-10-22); kept at 0 so the offsets below still resolve */
  --maxw: 1180px;
  --radius: 0;            /* SUDS: sharp corners by default */
  --shadow-sm: none;   /* SUDS is flat: no shadow-* by decision. Kept as tokens so old rules resolve to nothing */
  --shadow-md: none;
  --ease: cubic-bezier(.4,0,.2,1);
}

/* ---------- reset / base ---------- */
*{ margin:0; padding:0; box-sizing:border-box; }
html{ -webkit-text-size-adjust:100%; scroll-behavior:smooth; }
@media (prefers-reduced-motion: reduce){ html{ scroll-behavior:auto; } }
/* the header + sub-bar are sticky only above 1080px; tell the browser that strip is
   covered so a focused element scrolled into view never lands under it (WCAG 2.4.11) */
@media (min-width:1081px){ html{ scroll-padding-top:calc(var(--header-h) + var(--subnav-h) + 14px); } }
body{
  font-family:var(--sans); color:var(--gray-dk); background:#fff;
  line-height:1.6; -webkit-font-smoothing:antialiased; overflow-x:hidden;
}
img{ max-width:100%; display:block; }
a{ color:var(--orange-dk); text-decoration:none; }
a:hover{ text-decoration:underline; }
h1,h2,h3,h4{ color:var(--navy); line-height:1.15; font-weight:700; }
strong,b{ color:var(--navy); }
:focus-visible{ outline:3px solid var(--orange); outline-offset:2px; }

.container{ width:100%; max-width:var(--maxw); margin-inline:auto; padding-inline:clamp(1.1rem,4vw,2rem); }
.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; }

/* skip link */
.skip-link{ position:fixed; top:-80px; left:1rem; z-index:1200; background:var(--navy); color:#fff;
  padding:.7rem 1.1rem; border-radius:0; font-weight:700; font-size:.85rem; transition:top .18s ease; }
.skip-link:focus{ top:0; }

/* ============================================================
   HEADER — sticky white bar, brand left, rich nav right
   ============================================================ */
.site-header{ position:sticky; top:0; z-index:1000; background:#fff;
  border-bottom:1px solid var(--line); }
.site-header__bar{ height:var(--header-h); display:flex; align-items:center; gap:1.5rem; }

/* Clear space: brand guidelines require ~1 Block-S width of space around the
   SU logo. The unit name sits beside it as a plain "treat in text" element
   (no divider bar — that would read as an unofficial lockup). */
.brand{ display:flex; align-items:center; gap:clamp(1rem,2vw,2rem); margin-right:auto; color:var(--navy); flex:0 0 auto; }
.brand a:hover{ text-decoration:none; }
/* two links: the SU logo goes to syracuse.edu, the site name to this site's home */
.brand__logo{ display:flex; align-items:center; }
.brand__txt:hover{ color:var(--orange-dk); }
.brand img{ height:32px; width:auto; }
.brand__txt{ font-weight:700; font-size:.8rem; letter-spacing:.02em; line-height:1.15; color:var(--navy);
  white-space:nowrap; }
.brand__txt span{ display:block; font-weight:500; font-size:.66rem; color:var(--gray-md); letter-spacing:.05em; text-transform:uppercase; white-space:nowrap; }
/* phones: trim the brand so the Menu button always fits in the bar */
@media (max-width:600px){
  .site-header__bar{ gap:.75rem; }
  .brand img{ height:28px; }
  .brand__txt span{ display:none; }          /* hide the long "Information Technology Services" line */
}
@media (max-width:360px){
  /* the site name is the only link home, so it shrinks instead of hiding */
  .brand__txt{ font-size:.72rem; max-width:7rem; }
}
/* "AI at Syracuse University" is ~165px at .8rem and was nowrap, which on a
   375px phone pushed the Menu button past the right edge (measured at x=353
   on a 360px viewport, hidden by body overflow-x). Let the brand shrink and the
   wordmark wrap to two lines instead; the 68px header has room for that. */
@media (max-width:640px){
  .brand{ flex:0 1 auto; min-width:0; gap:.75rem; }
  .brand__txt{ white-space:normal; max-width:9rem; }
}

/* primary nav */
.nav{ display:flex; align-items:center; gap:.1rem; }
.nav__item{ position:relative; }
.nav__link{ display:inline-flex; align-items:center; gap:.3rem; padding:.5rem .55rem; border-radius:0;
  font-size:.78rem; font-weight:700; letter-spacing:.02em; text-transform:uppercase; color:var(--navy);
  white-space:nowrap; transition:color .2s var(--ease), background .2s var(--ease); }
/* the three section tabs are disclosure buttons, not links — reset the UA button styling
   so they render identically to the <a> tabs beside them */
button.nav__link{ background:none; border:0; margin:0; font-family:var(--sans); cursor:pointer; }
.nav__link:hover{ color:var(--orange-dk); background:var(--wash); text-decoration:none; }
/* aria-current="page" is the exact page; "true" means "you are in this section"
   (e.g. a story article marking the News tab). Both get the same underline. */
.nav__link[aria-current],
.nav__link[data-current-section="true"]{ color:var(--orange-dk); }
.nav__link[aria-current]::after,
.nav__link[data-current-section="true"]::after{ content:""; position:absolute; left:.75rem; right:.75rem; bottom:.35rem;
  height:2px; background:var(--orange); }
.nav__caret{ width:.6em; height:.6em; border-right:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:rotate(45deg) translateY(-1px); transition:transform .2s var(--ease); }

/* dropdown */
.nav__item--has-menu .nav__menu{ position:absolute; top:calc(100% + .3rem); left:0; min-width:250px;
  background:#fff; border:1px solid var(--line); border-radius:0; box-shadow:var(--shadow-md);
  padding:.5rem; opacity:0; visibility:hidden; transform:translateY(6px); transition:.16s var(--ease);
  list-style:none; z-index:20; }
/* the last tab sits at the right edge; a left-anchored 250px menu under it
   ran 55px past a 1280 viewport and was clipped by body overflow-x. */
.nav__item--has-menu:last-child .nav__menu{ left:auto; right:0; }
.nav__item--has-menu:hover .nav__menu,
.nav__menu[data-open="true"]{ opacity:1; visibility:visible; transform:none; }
.nav__item--has-menu:hover .nav__caret,
.nav__link[aria-expanded="true"] .nav__caret{ transform:rotate(-135deg) translateY(2px); }
/* Escape must dismiss a hover-opened menu without moving the pointer (WCAG 1.4.13).
   nav.js sets data-dismissed on the hovered item; it clears on mouseleave. Desktop only —
   below the breakpoint the menu is a static block governed by display, not visibility. */
@media (min-width:1081px){
  .nav__item--has-menu[data-dismissed="true"]:hover .nav__menu{
    opacity:0; visibility:hidden; transform:translateY(6px); }
  .nav__item--has-menu[data-dismissed="true"]:hover .nav__caret{
    transform:rotate(45deg) translateY(-1px); }
}
.nav__menu a{ display:block; padding:.55rem .7rem; border-radius:0; color:var(--navy); font-weight:600;
  font-size:.9rem; letter-spacing:0; text-transform:none; }
.nav__menu a span{ display:block; font-weight:400; font-size:.76rem; color:var(--gray-dk); }
.nav__menu a:hover{ background:var(--wash); color:var(--orange-dk); text-decoration:none; }
/* mark the current entry inside an open menu, not just the parent tab */
.nav__menu a[aria-current]{ color:var(--orange-dk); box-shadow:inset 2px 0 0 var(--orange); }


/* hamburger */
.nav-toggle{ display:none; margin-left:auto; align-items:center; gap:.5rem; background:var(--navy); color:#fff;
  border:0; border-radius:0; padding:.55rem .8rem; font-family:var(--sans); font-weight:700; font-size:.78rem;
  letter-spacing:.08em; text-transform:uppercase; cursor:pointer; }
.nav-toggle__ico{ position:relative; width:18px; height:12px; }
.nav-toggle__ico span{ position:absolute; left:0; right:0; height:2px; background:#fff; }
.nav-toggle__ico span:nth-child(1){ top:0; } .nav-toggle__ico span:nth-child(2){ top:5px; } .nav-toggle__ico span:nth-child(3){ top:10px; }

@media (max-width: 1080px){
  .nav-toggle{ display:inline-flex; }
  .nav{ position:fixed; inset:var(--header-h) 0 auto 0; flex-direction:column; align-items:stretch; gap:.15rem;
    background:#fff; border-bottom:1px solid var(--line); box-shadow:var(--shadow-md);
    padding:.8rem clamp(1.1rem,4vw,2rem) 1.2rem; max-height:calc(100vh - var(--header-h)); overflow-y:auto;
    transform:translateY(-8px); opacity:0; visibility:hidden; transition:.18s var(--ease); }
  .nav[data-open="true"]{ transform:none; opacity:1; visibility:visible; }
  .nav__link{ font-size:.95rem; padding:.8rem .6rem; }
  /* full-width row + left-aligned text so the button tabs match the link tabs */
  button.nav__link{ width:100%; justify-content:flex-start; text-align:left; }
  .nav__link[aria-current]::after,
  .nav__link[data-current-section="true"]::after{ display:none; }
  .nav__item--has-menu .nav__menu{ position:static; opacity:1; visibility:visible; transform:none;
    box-shadow:none; border:0; border-left:2px solid var(--line); border-radius:0; margin:0 0 .4rem .6rem;
    padding:.1rem 0; display:none; }
  .nav__menu[data-open="true"]{ display:block; }
}

/* ============================================================
   ONE-BAR HEADER (every page, since 2026-10-22)
   The brand (SU logo -> syracuse.edu, site name -> home) on the left and this
   site's #primary-nav on the right. The old syracuse.edu university nav and the
   grey sub-bar under it are gone.
   ============================================================ */
.site-header .nav{ margin-left:auto; }

@media (max-width: 1080px){
  /* No hamburger: below the breakpoint the nav wraps onto its own full-width row
     under the brand and renders statically, so the header grows instead of
     overlaying the page. The header stops being sticky so an opened menu cannot
     pin itself over the content. These rules sit after the dropdown block above
     deliberately: same specificity, later wins. */
  .site-header{ position:static; }
  .site-header__bar{ height:auto; min-height:var(--header-h); flex-wrap:wrap; padding-block:.5rem; row-gap:.25rem; }
  .site-header .nav{ margin-left:0; }
  .nav{ position:static; inset:auto; transform:none; opacity:1; visibility:visible;
    box-shadow:none; border:0; padding:.2rem 0 .4rem; max-height:none; overflow:visible; width:100%;
    flex-direction:row; flex-wrap:wrap; align-items:center; }
  .nav__link{ font-size:.8rem; padding:.55rem .6rem; }
  button.nav__link{ width:auto; }
  /* the three tabs share one row, so a menu opening in place would shove the
     other tabs around: float it over the page as on desktop instead, sized to
     fit a 320px screen */
  .nav__item--has-menu .nav__menu{ position:absolute; top:calc(100% + .3rem); left:0; display:block;
    min-width:min(250px, calc(100vw - 2rem)); margin:0; padding:.5rem; border:1px solid var(--line);
    opacity:0; visibility:hidden; }
  .nav__item--has-menu:last-child .nav__menu{ left:auto; right:0; }
  .nav__menu[data-open="true"]{ opacity:1; visibility:visible; }
}

/* ============================================================
   BUTTONS + shared bits
   ============================================================ */
/* navy text on orange = 5.6:1 (AA); white-on-orange was only 3.0:1 */
.btn{ display:inline-flex; align-items:center; gap:.5rem; background:var(--orange); color:var(--navy);
  font-weight:700; font-size:.9rem; letter-spacing:.02em; padding:.8rem 1.4rem; border-radius:0;
  border:2px solid var(--orange); transition:.2s var(--ease); cursor:pointer; }
.btn:hover{ background:var(--orange-dk); border-color:var(--orange-dk); color:#fff; text-decoration:none; }
.btn--ghost{ background:transparent; color:var(--navy); border-color:var(--navy); }
.btn--ghost:hover{ background:var(--navy); color:#fff; }
.btn--light{ background:#fff; color:var(--navy); border-color:#fff; }
.btn--light:hover{ background:rgba(255,255,255,.82); border-color:rgba(255,255,255,.82); color:var(--navy); }
.btn--ghost-light{ background:transparent; color:#fff; border-color:rgba(255,255,255,.6); }
.btn--ghost-light:hover{ background:#fff; color:var(--navy); }

/* kicker/eyebrow — lives INSIDE its heading as a display:block first-child span
   so screen-reader heading navigation announces it with the title */
.eyebrow{ display:block; font-family:var(--sans); font-size:.76rem; font-weight:700; letter-spacing:.18em;
  text-transform:uppercase; color:var(--orange-dk); margin-bottom:.55rem; }
.eyebrow--light{ color:var(--orange-lt); }

/* in-page anchor targets clear the sticky header when jumped to.
   .cmp-fn li[id] is in here because the footnote markers in the compare table
   link down to it — without this the note lands underneath the sticky bar. */
section[id], .cmp-fn li[id]{ scroll-margin-top:calc(var(--header-h) + var(--subnav-h) + 14px); }

/* section permalinks — a "#" beside a section heading that links straight to it.
   Faded out until the heading is hovered OR the link itself takes focus: a
   hover-only reveal would be unreachable by keyboard, and the link stays in the
   tab order so Tab can always get to it. Pointer-less devices (touch) never fire
   :hover, so there it is simply always visible. */
.anchor-link{ margin-left:.35em; color:var(--orange-dk); text-decoration:none; font-weight:700;
  font-size:.55em; vertical-align:.18em; opacity:0; transition:opacity .15s ease; }
h2:hover > .anchor-link,
.anchor-link:hover,
.anchor-link:focus{ opacity:1; }
.anchor-link:hover{ text-decoration:underline; }
@media (hover: none){ .anchor-link{ opacity:1; } }
@media (prefers-reduced-motion: reduce){ .anchor-link{ transition:none; } }

.section{ padding:clamp(3.5rem,7vw,6rem) 0; }
/* less air on top, for a section that follows a photo hero directly */
.section--snug-top{ padding-top:clamp(2.2rem,4vw,3.2rem); }
/* was a gray wash; now white with a hairline so text keeps ≥4.5:1 on white */
.section--wash{ background:#fff; border-top:1px solid var(--line); }
/* the same hairline on its own, for a plain section that follows a wash one
   and needs the boundary drawn below the wash too */
.section--rule{ border-top:1px solid var(--line); }
.section--navy{ background:var(--navy); color:#fff; }
.section--navy h1,.section--navy h2,.section--navy h3{ color:#fff; }
.section--navy strong{ color:#fff; }
.section__head{ max-width:64ch; margin-bottom:2.6rem; }
.section__head--center{ margin-inline:auto; text-align:center; }
.section-title{ font-size:clamp(1.9rem,3.6vw,2.8rem); letter-spacing:-.01em; }
.section-title--serif{ font-family:var(--sans); font-weight:700; }
.section-lead{ margin-top:1rem; font-size:1.1rem; color:var(--gray-dk); max-width:60ch; }
.section--navy .section-lead{ color:rgba(255,255,255,.85); }
.section__head--center .section-lead{ margin-inline:auto; }

/* ============================================================
   HERO — static campus photo + headline
   ============================================================ */
.hero{ position:relative; color:#fff; background:var(--navy); }
.hero__media{ position:absolute; inset:0; z-index:0; }
.hero__media img{ width:100%; height:100%; object-fit:cover; }
/* Left scrim (behind the left-aligned text) + a light vertical wash, so all hero
   text — including the small eyebrow — clears WCAG AA while the photo stays visible
   on the right. */
.hero__media::after{ content:""; position:absolute; inset:0;
  background:
    linear-gradient(90deg, rgba(0,14,84,.96) 0%, rgba(0,14,84,.95) 46%, rgba(0,14,84,.7) 66%, rgba(0,14,84,.42) 100%),
    linear-gradient(180deg, rgba(0,14,84,.5) 0%, rgba(0,14,84,.4) 45%, rgba(0,14,84,.6) 100%); }
/* on narrow screens the text is full-width, so the left scrim can't cover it —
   use a stronger, near-uniform overlay there (photo is secondary on mobile) */
@media (max-width: 900px){
  .hero__media::after{ background:linear-gradient(180deg, rgba(0,14,84,.9) 0%, rgba(0,14,84,.88) 45%, rgba(0,14,84,.93) 100%); }
}
.hero__inner{ position:relative; z-index:1; padding-block:clamp(4rem,11vw,8.5rem) clamp(3.5rem,8vw,6rem); }
.hero__eyebrow{ display:block; font-family:var(--sans); color:var(--orange-lt); font-weight:700; letter-spacing:.2em; text-transform:uppercase; font-size:.82rem; margin-bottom:.5rem; }
.hero__title{ font-family:var(--sans); font-weight:700; color:#fff; font-size:clamp(2.5rem,6.4vw,5rem);
  line-height:1.02; margin:1.2rem 0 1.4rem; max-width:16ch; }
.hero__title em{ display:block; font-style:italic; color:var(--orange-lt); }
.hero__lead{ font-size:clamp(1.05rem,1.9vw,1.35rem); max-width:52ch; color:rgba(255,255,255,.92); }
.hero__actions{ display:flex; flex-wrap:wrap; gap:.9rem; margin-top:2rem; }

/* compact page hero (interior pages) */
.page-hero{ background:var(--navy); color:#fff; padding:clamp(2.8rem,6vw,4.5rem) 0 clamp(2.4rem,5vw,3.4rem); position:relative; }
/* photo variant: taller so the photo reads, and the navy is weighted to the left
   where the text sits, so faces on the right stay visible. Below 760px the text
   spans the full width, so the overlay goes back to an even, heavier wash. */
.page-hero--photo{ padding:clamp(4.5rem,11vw,8.5rem) 0 clamp(3.5rem,8vw,6rem); }
.page-hero--photo .page-hero__media{ position:absolute; inset:0; z-index:0; }
.page-hero--photo .page-hero__media img{ width:100%; height:100%; object-fit:cover; object-position:center 35%; }
.page-hero--photo .page-hero__media::after{ content:""; position:absolute; inset:0;
  background:linear-gradient(90deg, rgba(0,14,84,.92) 0%, rgba(0,14,84,.8) 45%, rgba(0,14,84,.35) 100%); }
@media (max-width: 760px){
  .page-hero--photo .page-hero__media::after{ background:linear-gradient(180deg, rgba(0,14,84,.78), rgba(0,14,84,.9)); }
}
.page-hero__inner{ position:relative; z-index:1; }
.page-hero h1{ color:#fff; font-family:var(--sans); font-weight:700; font-size:clamp(2rem,4.6vw,3.4rem); max-width:20ch; }
.page-hero__lead{ margin-top:1rem; font-size:1.15rem; color:rgba(255,255,255,.9); max-width:60ch; }

/* breadcrumb */
.crumbs{ font-size:.82rem; color:var(--gray-dk); padding:1rem 0 0; }
/* inline-block + padding lifts these from 19px to the 24px minimum target (WCAG 2.5.8) */
.crumbs a{ color:var(--navy); font-weight:600; display:inline-block; padding:.2rem 0; }
.crumbs span{ margin:0 .45rem; color:var(--gray-lt); }
.page-hero .crumbs{ color:rgba(255,255,255,.7); padding:0 0 .8rem; }
.page-hero .crumbs a{ color:#fff; }

/* ============================================================
   CARD GRIDS
   ============================================================ */
.grid{ display:grid; gap:1.4rem; }
.grid--2{ grid-template-columns:repeat(2,1fr); }
.grid--3{ grid-template-columns:repeat(3,1fr); }
.grid--4{ grid-template-columns:repeat(4,1fr); }
.grid--5{ grid-template-columns:repeat(5,1fr); }
/* 5-up gets an extra step: five narrow cards stop working before four do */
@media (max-width: 1100px){ .grid--5{ grid-template-columns:repeat(3,1fr); } }
@media (max-width: 900px){ .grid--3,.grid--4,.grid--5{ grid-template-columns:repeat(2,1fr); } }
@media (max-width: 620px){ .grid--2,.grid--3,.grid--4,.grid--5{ grid-template-columns:1fr; } }

.card{ position:relative; background:#fff; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden;
  display:flex; flex-direction:column; transition:transform .2s var(--ease), box-shadow .2s var(--ease), border-color .2s var(--ease); }
.card:hover{ border-color:var(--orange); }
.card__media{ aspect-ratio:16/10; overflow:hidden; background:var(--wash); }
.card__media img{ width:100%; height:100%; object-fit:cover; }
/* logo cards (3rd-party stories): show the wordmark uncropped on white */
.card__media--logo{ background:#fff; display:flex; align-items:center; justify-content:center; padding:1.6rem 2rem; }
.card__media--logo img{ width:auto; height:auto; max-width:80%; max-height:56px; object-fit:contain; }
.card__body{ padding:1.3rem 1.35rem 1.4rem; display:flex; flex-direction:column; gap:.5rem; flex:1; }
.card__tag{ font-size:.72rem; font-weight:700; letter-spacing:.12em; text-transform:uppercase; color:var(--orange-dk); }
.card__title{ font-size:1.15rem; }
.card__title a{ color:var(--navy); }
.card__title a:hover,
.card:hover .card__title a{ color:var(--orange-dk); text-decoration:none; }
.card__desc{ font-size:.95rem; color:var(--gray-dk); }
.card__more{ margin-top:auto; padding-top:.7rem; font-weight:700; font-size:.85rem; color:var(--orange-dk);
  display:inline-flex; align-items:center; gap:.35rem; }
/* Whole-card click target: the "Read the story" link is stretched over the card
   with a pseudo-element, so clicking the image, title or text follows the same
   link. The markup is unchanged and there is still exactly one link per action,
   so keyboard and screen-reader users see nothing new. */
.card__more::after{ content:""; position:absolute; inset:0; }
/* icon feature card (Duke-style resource tiles) */
.feature{ background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:1.6rem 1.5rem;
  display:flex; flex-direction:column; gap:.6rem; transition:.2s var(--ease); }
.feature:hover{ border-color:var(--orange); }
/* non-clickable card: keep the tile look, drop the interactive lift */
.feature--static{ cursor:default; }
.feature--static:hover{ box-shadow:none; transform:none; }
.feature__ico{ width:46px; height:46px; border-radius:0; background:rgba(247,105,0,.12); color:var(--orange-dk);
  display:grid; place-items:center; margin-bottom:.3rem; }
.feature__ico svg{ width:24px; height:24px; }
.feature h3{ font-size:1.12rem; }
.feature p{ font-size:.95rem; color:var(--gray-dk); }
.feature__link{ margin-top:auto; padding-top:.6rem; font-weight:700; font-size:.85rem; color:var(--orange-dk); }
.feature--navy{ background:rgba(255,255,255,.05); border-color:rgba(255,255,255,.16); }
.feature--navy h3{ color:#fff; } .feature--navy p{ color:rgba(255,255,255,.82); }
.feature--navy .feature__ico{ background:rgba(255,255,255,.12); color:var(--orange-lt); }
/* story cards inside a navy section (homepage "What we're doing") take the
   same translucent treatment as the Resources tiles above. #doing only, so the
   card in research-highlights.html's navy section is not affected. */
#doing .card{ background:rgba(255,255,255,.05); border-color:rgba(255,255,255,.16); }
#doing .card:hover{ border-color:rgba(255,255,255,.35); box-shadow:none; }
#doing .card__tag{ color:var(--orange-lt); }
#doing .card__title a{ color:#fff; }
#doing .card__title a:hover,
#doing .card:hover .card__title a{ color:var(--orange-lt); }
#doing .card__desc{ color:rgba(255,255,255,.82); }
#doing .card__more{ color:var(--orange-lt); }

/* centre-aligned variant (homepage Resources tiles) */
.feature--center{ text-align:center; }
.feature--center .feature__ico{ margin-left:auto; margin-right:auto; }

/* ============================================================
   STRATEGY + PRINCIPLES
   ============================================================ */
.statement p{ font-size:1.18rem; line-height:1.7; margin-bottom:1.1rem; max-width:64ch; }
/* intro-style lead — SUDS Intro uses ShermanSans Book (regular), not serif */
.statement p:first-child{ font-family:var(--sans); font-size:1.5rem; color:var(--navy); line-height:1.4; }
.section--navy .statement p:first-child{ color:#fff; }

.principles{ list-style:none; display:grid; gap:1rem; counter-reset:p; }
.principle{ position:relative; background:#fff; border:1px solid var(--line); border-left:4px solid var(--orange);
  border-radius:0; padding:1.25rem 1.4rem 1.3rem 3.6rem; }
.principle::before{ counter-increment:p; content:"0" counter(p); position:absolute; left:1.15rem; top:1.15rem;
  font-family:var(--sans); font-weight:700; color:var(--orange); font-size:1.15rem; }
.principle h3{ font-size:1.1rem; margin-bottom:.25rem; }
.principle p{ font-size:.96rem; color:var(--gray-dk); }
.section--navy .principle{ background:rgba(255,255,255,.05); border-color:rgba(255,255,255,.14); border-left-color:var(--orange); }
.section--navy .principle p{ color:rgba(255,255,255,.82); }

/* ============================================================
   TOOLS
   ============================================================ */
.tool{ position:relative; background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:1.7rem 1.5rem;
  display:flex; flex-direction:column; gap:.55rem; transition:.2s var(--ease); }
.tool:hover{ border-color:var(--orange); }
.tool__logo{ height:52px; display:flex; align-items:center; margin-bottom:.4rem; }
.tool__logo img{ max-height:100%; width:auto; }
.tool__logo--lg img{ max-height:56px; }
.tool__name{ font-size:1.2rem; }
.tool__company{ font-size:.8rem; color:var(--gray-dk); text-transform:uppercase; letter-spacing:.08em; font-weight:700; }
.tool__desc{ font-size:.95rem; color:var(--gray-dk); flex:1; }
.tool__cta{ font-weight:700; font-size:.88rem; color:var(--orange-dk); display:inline-flex; gap:.35rem; align-items:center; }
/* whole-tile click target, same technique as .card__more::after */
.tool__cta::after{ content:""; position:absolute; inset:0; }
/* centre-aligned variant (homepage AI Tools cards) */
.tool--center{ text-align:center; }
.tool--center .tool__logo{ justify-content:center; }
.tool--center .tool__cta{ justify-content:center; }

/* ------------------------------------------------------------
   TOOL COMPARISON TABLE (ai-tools.html)
   A real <table> so the row/column relationships survive for
   screen readers. Every ✓ / – carries an sr-only "Yes"/"No"
   so the meaning is never conveyed by the glyph alone.
   Scrolls horizontally on narrow screens with the feature
   column pinned to the left edge.
   ------------------------------------------------------------ */
.cmp-wrap{ position:relative; }
/* contain:paint is load-bearing, not a micro-optimisation. Without it the
   table's width leaks past this scroll container and inflates the whole
   document's scrollWidth (794px inside a 700px viewport when measured) —
   which only body{overflow-x:hidden} was masking. Containing it here means
   the sideways scroll genuinely stays inside the table (WCAG 1.4.10). */
.cmp-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; contain:paint; max-width:100%; }
/* compare-table.js makes this a focusable region ONLY while it actually
   overflows — a scrollable box that keyboard users can't reach fails
   WCAG 2.1.1, but a permanent tabindex would leave a dead tab stop on
   desktop where nothing scrolls. */
.cmp-scroll:focus-visible{ outline:3px solid var(--orange); outline-offset:3px; }
/* min-width in rem, not px, so the table scales with the user's text size
   instead of staying fixed at 200% zoom (WCAG 1.4.4). */
.cmp{ width:100%; min-width:52rem; border-collapse:separate; border-spacing:0;
  font-size:.92rem; background:#fff; }

/* Decorative fade marking "there is more to the right". Purely visual —
   the real affordance is the .cmp-swipe text below the table. */
.cmp-wrap::after{ content:""; position:absolute; top:0; right:0; bottom:0; width:3rem;
  pointer-events:none; opacity:0; transition:opacity .2s var(--ease);
  background:linear-gradient(to right, rgba(255,255,255,0), #fff); }
.cmp-wrap.is-overflowing:not(.is-end)::after{ opacity:1; }
@media (prefers-reduced-motion: reduce){ .cmp-wrap::after{ transition:none; } }

/* ---- head: logo, name, vendor ---- */
.cmp thead th{ vertical-align:top; padding:1.4rem 1rem 1.3rem; text-align:center;
  background:#fff; border-bottom:2px solid var(--navy); }
/* The empty top-left cell pins like the feature column below it, so the
   logos slide *under* it instead of drifting across it when scrolled.
   Opaque background and a z-index above the unpositioned header cells are
   both required for that — a sticky cell alone would still be see-through. */
.cmp thead th.cmp__corner{ border-bottom:2px solid var(--line);
  position:sticky; left:0; z-index:3; background:#fff; }
.cmp__logo{ height:44px; display:flex; align-items:center; justify-content:center; margin-bottom:.7rem; }
.cmp__logo img{ max-height:100%; width:auto; }
.cmp__tool{ display:block; font-size:1.05rem; font-weight:700; color:var(--navy); line-height:1.2; }
.cmp__by{ display:block; font-size:.7rem; font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; color:var(--gray-md); margin-top:.2rem; }
.cmp__cta{ display:inline-flex; align-items:center; gap:.3rem;
  font-size:.85rem; font-weight:700; color:var(--orange-dk); }
.cmp__cta:hover{ text-decoration:underline; }

/* ---- foot: the "get started" row, closing each column ----
   Each CTA is its own cell, boxed like the data cells above it. The first
   cell is a pure spacer holding the columns in line — it carries no rule
   and no label, so the row reads as four buttons, not a labelled row. */
.cmp tfoot td{ text-align:center; padding:0; background:#fff;
  border-top:2px solid var(--navy); border-left:1px solid var(--line-soft); }
/* The whole cell is the target, not just the words. The padding lives on the
   link so the link *is* the cell — one tab stop, one hit area, real link
   semantics. Wrapping the <td> in an anchor is invalid HTML, and a JS click
   handler on the cell would be invisible to keyboards and screen readers. */
.cmp tfoot .cmp__cta{ display:flex; align-items:center; justify-content:center;
  width:100%; height:100%; padding:1.3rem 1rem 1.5rem;
  transition:background-color .15s var(--ease); }
.cmp tfoot .cmp__cta:hover{ background:rgba(247,105,0,.09); text-decoration:underline; }
.cmp tfoot .cmp__cta:focus-visible{ outline:3px solid var(--orange); outline-offset:-3px; }
@media (prefers-reduced-motion: reduce){ .cmp tfoot .cmp__cta{ transition:none; } }
/* White, not transparent: this cell is pinned, so a transparent fill would
   let the CTA cells scrolling beneath it show straight through. On a white
   section #fff reads as empty while still hiding what passes underneath. */
.cmp tfoot td.cmp__spacer{ border:0; background:#fff;
  position:sticky; left:0; z-index:2; }

/* ---- group headings ----
   The cell spans all five columns, so it is as wide as the whole table and
   its text would scroll away to the left with the data cells. Pinning the
   cell itself is wrong (the banded background would slide off the right
   edge), so the *label inside it* is what sticks — the band stays put and
   the words stay beside the pinned feature column. */
.cmp__group th{ text-align:left; padding:1.1rem 1rem .5rem; font-size:.7rem; font-weight:700;
  letter-spacing:.12em; text-transform:uppercase; color:var(--navy);
  background:var(--wash); border-top:1px solid var(--line); }
.cmp__group th span{ position:sticky; left:1rem; display:inline-block; }

/* ---- body ---- */
.cmp tbody th[scope="row"]{ text-align:left; font-weight:600; color:var(--navy);
  padding:.8rem 1rem; background:#fff; border-bottom:1px solid var(--line-soft);
  position:sticky; left:0; z-index:1; min-width:16rem; }
.cmp tbody td{ text-align:center; padding:.8rem 1rem; border-bottom:1px solid var(--line-soft);
  border-left:1px solid var(--line-soft); color:var(--gray-dk); }
.cmp tbody tr:hover td{ background:rgba(247,105,0,.05); }
/* The pinned column must stay OPAQUE. Handing it the same translucent tint
   as the data cells replaces its solid #fff, and the cells scrolling beneath
   it then show straight through — the column reads as transparent on hover.
   #FFF8F2 is that 5% orange already flattened onto white, so it matches the
   data cells exactly while still hiding what passes underneath. */
.cmp tbody tr:hover th[scope="row"]{ background:#FFF8F2; }
.cmp__note{ display:block; font-weight:400; font-size:.8rem; color:var(--gray-md); margin-top:.1rem; }

/* ---- yes / no / value marks ----
   The mark differs by SHAPE (✓ vs –), not colour alone, so it survives
   WCAG 1.4.1. --gray-lt (#D6D9DC) is a *hairline* token — ~1.4:1 on white —
   and must never back text; the "no" dash uses --gray-md (~4.6:1) instead. */
.mark{ display:inline-block; line-height:1; }
.mark--yes{ color:var(--orange-dk); font-size:1.15rem; font-weight:700; }
.mark--no{ color:var(--gray-md); font-size:1.15rem; font-weight:700; }
.mark--txt{ font-size:.85rem; font-weight:600; color:var(--navy); }
.mark--part{ font-size:.78rem; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color:var(--gray-md); }

/* "Scroll sideways" cue — unhidden by compare-table.js only when the table
   really overflows. Persistent text, never hover-only. */
.cmp-swipe{ margin-top:.7rem; font-size:.85rem; font-weight:600; color:var(--navy);
  display:flex; align-items:center; gap:.4rem; }
.cmp-swipe[hidden]{ display:none; }
/* ---- footnotes ----
   Each marker is an in-page link down to its note. The <ol> numbering matches
   the superscripts, so the reference, the href (#cmp-fnN) and the note all stay
   in step — renumber all three together if a note is added or removed. */
/* .66rem, not .72em: the note list sets a smaller font-size than the table, so
   a relative size would render the two markers at visibly different sizes. This
   is the same computed value the table markers already had (.72 x .92rem). */
.fn-ref{ font-size:.66rem; font-weight:700; color:var(--orange-dk);
  margin-left:.12em; vertical-align:super; line-height:0; }
/* Padding widens the tap/click target without disturbing the baseline, since
   the sup is already out of flow vertically. */
.fn-ref a{ color:inherit; text-decoration:underline; text-underline-offset:.14em;
  padding:.15em .12em; }
.fn-ref a:hover,
.fn-ref a:focus-visible{ color:var(--orange); }
/* The note numbers are drawn with a counter rather than the default list
   marker: ::marker takes colour and weight but ignores vertical-align, so it
   can't be raised into a superscript. A counter in ::before is a normal inline
   box, so it can carry the exact .fn-ref treatment and the two markers match.
   The <ol> keeps its semantics — only the painted marker is replaced. */
.cmp-fn{ margin-top:1.1rem; padding-left:1.3rem; font-size:.82rem; color:var(--gray-dk);
  max-width:72ch; list-style:none; counter-reset:fn; }
.cmp-fn li{ margin-bottom:.25rem; counter-increment:fn; position:relative; }
/* Absolute so the raised, tiny number can't drag the note's first line up with
   it, and so wrapped lines stay flush under the text rather than under the
   number. top is the superscript lift .fn-ref gets from vertical-align. */
.cmp-fn li::before{ content:counter(fn); position:absolute; left:-1.3rem; top:-.15em;
  width:1.1rem; text-align:right;
  font-size:.66rem; font-weight:700; color:var(--orange-dk); }
/* :target so a reader who follows a marker can see which note they landed on. */
.cmp-fn li:target{ color:var(--ink); font-weight:600; }

.cmp-hint{ margin-top:.9rem; font-size:.85rem; color:var(--gray-md); }

@media (max-width:900px){
  .cmp tbody th[scope="row"]{ min-width:13rem; box-shadow:1px 0 0 var(--line); }
}
/* Phone: tighten spacing and shrink the pinned label column so TWO tool
   columns fit beside it — at 10.5rem the label alone ate half a 375px
   screen and you could only ever see one tool, which defeats the point of
   a comparison. Nothing is hidden: the sub-notes stay, because dropping
   content on small screens is content loss, not reflow. */
@media (max-width:640px){
  /* table-layout:fixed is the whole fix. With auto layout the column widths are
     content-driven — they depend on the logo SVGs' intrinsic aspect ratios
     (claude.svg is 4.66:1, so at 32px tall it wants 149px) and on ShermanSans'
     metrics. Shrinking a desktop window happened to land at 561px and fit; a
     real phone resolves those differently, the table grows past the container,
     and mobile Safari shrink-to-fits the ENTIRE page to the widest thing on it —
     which is why the header only spanned two-thirds of the screenshot.
     Fixed layout + explicit <col> widths makes the width arithmetic, not a
     measurement: 7.25 + (4 x 7) = 35.25rem, exactly the min-width below. */
  .cmp{ min-width:35.25rem; font-size:.85rem; table-layout:fixed; }
  .cmp col.cmp__c-label{ width:7.25rem; }
  .cmp col.cmp__c-tool{ width:7rem; }
  .cmp thead th{ padding:1rem .45rem .9rem; overflow-wrap:break-word; }
  /* A wordmark must never be able to open its column. object-fit keeps the
     aspect ratio while max-width caps it at its column's share. */
  .cmp__logo{ height:32px; margin-bottom:.5rem; max-width:100%; overflow:hidden; }
  .cmp__logo img{ max-width:100%; max-height:100%; width:auto; height:auto;
    object-fit:contain; }
  .cmp__tool{ font-size:.88rem; }
  .cmp__by{ font-size:.62rem; }
  .cmp__cta{ font-size:.76rem; }
  .cmp tfoot .cmp__cta{ padding:1rem .45rem 1.1rem; }
  /* min-width:0 so the <col> width above is the single source of truth — a
     leftover min-width here would fight it and re-open the column. */
  .cmp tbody th[scope="row"]{ min-width:0; padding:.7rem .45rem;
    overflow-wrap:break-word; hyphens:auto; }
  .cmp tbody td{ padding:.7rem .35rem; overflow-wrap:break-word; }
  .cmp__note{ font-size:.72rem; }
  .cmp__group th{ padding:.9rem .5rem .45rem; }

  /* One swipe = one tool. Snapping stops the scroll from parking a column
     half-off the edge, and scroll-padding offsets the snap by the pinned
     label column's width so a tool never lands underneath it. */
  .cmp-scroll{ scroll-snap-type:x proximity; scroll-padding-left:7.25rem; }
  .cmp thead th:not(.cmp__corner){ scroll-snap-align:start; }
}
/* Sub-360 (iPhone SE 1st gen, Android compacts): at the 7.25/7rem sizing above
   only one and a half tools fit beside the label, so shave both. Still rem, so
   the whole grid scales with the user's text size at 200% zoom (WCAG 1.4.4).
   6.25 + (4 x 5.75) = 29.25rem, so the min-width stays exact arithmetic. */
@media (max-width:360px){
  .cmp{ min-width:29.25rem; }
  .cmp col.cmp__c-label{ width:6.25rem; }
  .cmp col.cmp__c-tool{ width:5.75rem; }
  .cmp-scroll{ scroll-padding-left:6.25rem; }
}
@media (prefers-reduced-motion: reduce){ .cmp-scroll{ scroll-behavior:auto; } }

/* stat row */
.stats{ list-style:none; display:grid; grid-template-columns:repeat(4,1fr); gap:1.2rem; }
@media (max-width:720px){ .stats{ grid-template-columns:repeat(2,1fr); } }
.stat{ text-align:center; padding:1rem .5rem; }
/* block, or the label's margin-top collapses and the two run together on one line */
.stat__num,.stat__label{ display:block; }
.stat__num{ font-family:var(--sans); font-weight:700; font-size:clamp(2rem,4vw,2.8rem); color:var(--orange); line-height:1; }
.section--navy .stat__num{ color:var(--orange-lt); }
.stat__label{ margin-top:.5rem; font-size:.9rem; color:var(--gray-dk); }
.section--navy .stat__label{ color:rgba(255,255,255,.82); }
/* footnote marker on a navy band: orange-dk is too dark to read there */
.section--navy .fn-ref{ color:var(--orange-lt); }
.section--navy .fn-ref a:hover,
.section--navy .fn-ref a:focus-visible{ color:#fff; }
/* the footnote list (.cmp-fn) used for page-level sources, below the closing CTA band */
.page-notes{ margin-top:2rem; }
/* orange-dk is only 2.6:1 against the #333 note text, so colour alone can't mark the link */
.page-notes a{ text-decoration:underline; text-underline-offset:.14em; }

/* in-page anchor targets clear the sticky header when jumped to.
   .cmp-fn li[id] is in here because the footnote markers in the compare table
   link down to it — without this the note lands underneath the sticky bar. */
section[id], .cmp-fn li[id]{ scroll-margin-top:calc(var(--header-h) + var(--subnav-h) + 14px); }

/* ------------------------------------------------------------
   TOOL COMPARISON TABLE (ai-tools.html)
   A real <table> so the row/column relationships survive for
   screen readers. Every ✓ / – carries an sr-only "Yes"/"No"
   so the meaning is never conveyed by the glyph alone.
   Scrolls horizontally on narrow screens with the feature
   column pinned to the left edge.
   ------------------------------------------------------------ */
.cmp-wrap{ position:relative; }
/* contain:paint is load-bearing, not a micro-optimisation. Without it the
   table's width leaks past this scroll container and inflates the whole
   document's scrollWidth (794px inside a 700px viewport when measured) —
   which only body{overflow-x:hidden} was masking. Containing it here means
   the sideways scroll genuinely stays inside the table (WCAG 1.4.10). */
.cmp-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; contain:paint; max-width:100%; }
/* compare-table.js makes this a focusable region ONLY while it actually
   overflows — a scrollable box that keyboard users can't reach fails
   WCAG 2.1.1, but a permanent tabindex would leave a dead tab stop on
   desktop where nothing scrolls. */
.cmp-scroll:focus-visible{ outline:3px solid var(--orange); outline-offset:3px; }
/* min-width in rem, not px, so the table scales with the user's text size
   instead of staying fixed at 200% zoom (WCAG 1.4.4). */
.cmp{ width:100%; min-width:52rem; border-collapse:separate; border-spacing:0;
  font-size:.92rem; background:#fff; }

/* Decorative fade marking "there is more to the right". Purely visual —
   the real affordance is the .cmp-swipe text below the table. */
.cmp-wrap::after{ content:""; position:absolute; top:0; right:0; bottom:0; width:3rem;
  pointer-events:none; opacity:0; transition:opacity .2s var(--ease);
  background:linear-gradient(to right, rgba(255,255,255,0), #fff); }
.cmp-wrap.is-overflowing:not(.is-end)::after{ opacity:1; }
@media (prefers-reduced-motion: reduce){ .cmp-wrap::after{ transition:none; } }

/* ---- head: logo, name, vendor ---- */
.cmp thead th{ vertical-align:top; padding:1.4rem 1rem 1.3rem; text-align:center;
  background:#fff; border-bottom:2px solid var(--navy); }
/* The empty top-left cell pins like the feature column below it, so the
   logos slide *under* it instead of drifting across it when scrolled.
   Opaque background and a z-index above the unpositioned header cells are
   both required for that — a sticky cell alone would still be see-through. */
.cmp thead th.cmp__corner{ border-bottom:2px solid var(--line);
  position:sticky; left:0; z-index:3; background:#fff; }
.cmp__logo{ height:44px; display:flex; align-items:center; justify-content:center; margin-bottom:.7rem; }
.cmp__logo img{ max-height:100%; width:auto; }
.cmp__tool{ display:block; font-size:1.05rem; font-weight:700; color:var(--navy); line-height:1.2; }
.cmp__by{ display:block; font-size:.7rem; font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; color:var(--gray-md); margin-top:.2rem; }
.cmp__cta{ display:inline-flex; align-items:center; gap:.3rem;
  font-size:.85rem; font-weight:700; color:var(--orange-dk); }
.cmp__cta:hover{ text-decoration:underline; }

/* ---- foot: the "get started" row, closing each column ----
   Each CTA is its own cell, boxed like the data cells above it. The first
   cell is a pure spacer holding the columns in line — it carries no rule
   and no label, so the row reads as four buttons, not a labelled row. */
.cmp tfoot td{ text-align:center; padding:0; background:#fff;
  border-top:2px solid var(--navy); border-left:1px solid var(--line-soft); }
/* The whole cell is the target, not just the words. The padding lives on the
   link so the link *is* the cell — one tab stop, one hit area, real link
   semantics. Wrapping the <td> in an anchor is invalid HTML, and a JS click
   handler on the cell would be invisible to keyboards and screen readers. */
.cmp tfoot .cmp__cta{ display:flex; align-items:center; justify-content:center;
  width:100%; height:100%; padding:1.3rem 1rem 1.5rem;
  transition:background-color .15s var(--ease); }
.cmp tfoot .cmp__cta:hover{ background:rgba(247,105,0,.09); text-decoration:underline; }
.cmp tfoot .cmp__cta:focus-visible{ outline:3px solid var(--orange); outline-offset:-3px; }
@media (prefers-reduced-motion: reduce){ .cmp tfoot .cmp__cta{ transition:none; } }
/* White, not transparent: this cell is pinned, so a transparent fill would
   let the CTA cells scrolling beneath it show straight through. On a white
   section #fff reads as empty while still hiding what passes underneath. */
.cmp tfoot td.cmp__spacer{ border:0; background:#fff;
  position:sticky; left:0; z-index:2; }

/* ---- group headings ----
   The cell spans all five columns, so it is as wide as the whole table and
   its text would scroll away to the left with the data cells. Pinning the
   cell itself is wrong (the banded background would slide off the right
   edge), so the *label inside it* is what sticks — the band stays put and
   the words stay beside the pinned feature column. */
.cmp__group th{ text-align:left; padding:1.1rem 1rem .5rem; font-size:.7rem; font-weight:700;
  letter-spacing:.12em; text-transform:uppercase; color:var(--navy);
  background:var(--wash); border-top:1px solid var(--line); }
.cmp__group th span{ position:sticky; left:1rem; display:inline-block; }

/* ---- body ---- */
.cmp tbody th[scope="row"]{ text-align:left; font-weight:600; color:var(--navy);
  padding:.8rem 1rem; background:#fff; border-bottom:1px solid var(--line-soft);
  position:sticky; left:0; z-index:1; min-width:16rem; }
.cmp tbody td{ text-align:center; padding:.8rem 1rem; border-bottom:1px solid var(--line-soft);
  border-left:1px solid var(--line-soft); color:var(--gray-dk); }
.cmp tbody tr:hover td{ background:rgba(247,105,0,.05); }
/* The pinned column must stay OPAQUE. Handing it the same translucent tint
   as the data cells replaces its solid #fff, and the cells scrolling beneath
   it then show straight through — the column reads as transparent on hover.
   #FFF8F2 is that 5% orange already flattened onto white, so it matches the
   data cells exactly while still hiding what passes underneath. */
.cmp tbody tr:hover th[scope="row"]{ background:#FFF8F2; }
.cmp__note{ display:block; font-weight:400; font-size:.8rem; color:var(--gray-md); margin-top:.1rem; }

/* ---- yes / no / value marks ----
   The mark differs by SHAPE (✓ vs –), not colour alone, so it survives
   WCAG 1.4.1. --gray-lt (#D6D9DC) is a *hairline* token — ~1.4:1 on white —
   and must never back text; the "no" dash uses --gray-md (~4.6:1) instead. */
.mark{ display:inline-block; line-height:1; }
.mark--yes{ color:var(--orange-dk); font-size:1.15rem; font-weight:700; }
.mark--no{ color:var(--gray-md); font-size:1.15rem; font-weight:700; }
.mark--txt{ font-size:.85rem; font-weight:600; color:var(--navy); }
.mark--part{ font-size:.78rem; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color:var(--gray-md); }

/* "Scroll sideways" cue — unhidden by compare-table.js only when the table
   really overflows. Persistent text, never hover-only. */
.cmp-swipe{ margin-top:.7rem; font-size:.85rem; font-weight:600; color:var(--navy);
  display:flex; align-items:center; gap:.4rem; }
.cmp-swipe[hidden]{ display:none; }
/* ---- footnotes ----
   Each marker is an in-page link down to its note. The <ol> numbering matches
   the superscripts, so the reference, the href (#cmp-fnN) and the note all stay
   in step — renumber all three together if a note is added or removed. */
/* .66rem, not .72em: the note list sets a smaller font-size than the table, so
   a relative size would render the two markers at visibly different sizes. This
   is the same computed value the table markers already had (.72 x .92rem). */
.fn-ref{ font-size:.66rem; font-weight:700; color:var(--orange-dk);
  margin-left:.12em; vertical-align:super; line-height:0; }
/* Padding widens the tap/click target without disturbing the baseline, since
   the sup is already out of flow vertically. */
.fn-ref a{ color:inherit; text-decoration:underline; text-underline-offset:.14em;
  padding:.15em .12em; }
.fn-ref a:hover,
.fn-ref a:focus-visible{ color:var(--orange); }
/* The note numbers are drawn with a counter rather than the default list
   marker: ::marker takes colour and weight but ignores vertical-align, so it
   can't be raised into a superscript. A counter in ::before is a normal inline
   box, so it can carry the exact .fn-ref treatment and the two markers match.
   The <ol> keeps its semantics — only the painted marker is replaced. */
.cmp-fn{ margin-top:1.1rem; padding-left:1.3rem; font-size:.82rem; color:var(--gray-dk);
  max-width:72ch; list-style:none; counter-reset:fn; }
.cmp-fn li{ margin-bottom:.25rem; counter-increment:fn; position:relative; }
/* Absolute so the raised, tiny number can't drag the note's first line up with
   it, and so wrapped lines stay flush under the text rather than under the
   number. top is the superscript lift .fn-ref gets from vertical-align. */
.cmp-fn li::before{ content:counter(fn); position:absolute; left:-1.3rem; top:-.15em;
  width:1.1rem; text-align:right;
  font-size:.66rem; font-weight:700; color:var(--orange-dk); }
/* :target so a reader who follows a marker can see which note they landed on. */
.cmp-fn li:target{ color:var(--ink); font-weight:600; }

.cmp-hint{ margin-top:.9rem; font-size:.85rem; color:var(--gray-md); }

@media (max-width:900px){
  .cmp tbody th[scope="row"]{ min-width:13rem; box-shadow:1px 0 0 var(--line); }
}
/* Phone: tighten spacing and shrink the pinned label column so TWO tool
   columns fit beside it — at 10.5rem the label alone ate half a 375px
   screen and you could only ever see one tool, which defeats the point of
   a comparison. Nothing is hidden: the sub-notes stay, because dropping
   content on small screens is content loss, not reflow. */
@media (max-width:640px){
  /* table-layout:fixed is the whole fix. With auto layout the column widths are
     content-driven — they depend on the logo SVGs' intrinsic aspect ratios
     (claude.svg is 4.66:1, so at 32px tall it wants 149px) and on ShermanSans'
     metrics. Shrinking a desktop window happened to land at 561px and fit; a
     real phone resolves those differently, the table grows past the container,
     and mobile Safari shrink-to-fits the ENTIRE page to the widest thing on it —
     which is why the header only spanned two-thirds of the screenshot.
     Fixed layout + explicit <col> widths makes the width arithmetic, not a
     measurement: 7.25 + (4 x 7) = 35.25rem, exactly the min-width below. */
  .cmp{ min-width:35.25rem; font-size:.85rem; table-layout:fixed; }
  .cmp col.cmp__c-label{ width:7.25rem; }
  .cmp col.cmp__c-tool{ width:7rem; }
  .cmp thead th{ padding:1rem .45rem .9rem; overflow-wrap:break-word; }
  /* A wordmark must never be able to open its column. object-fit keeps the
     aspect ratio while max-width caps it at its column's share. */
  .cmp__logo{ height:32px; margin-bottom:.5rem; max-width:100%; overflow:hidden; }
  .cmp__logo img{ max-width:100%; max-height:100%; width:auto; height:auto;
    object-fit:contain; }
  .cmp__tool{ font-size:.88rem; }
  .cmp__by{ font-size:.62rem; }
  .cmp__cta{ font-size:.76rem; }
  .cmp tfoot .cmp__cta{ padding:1rem .45rem 1.1rem; }
  /* min-width:0 so the <col> width above is the single source of truth — a
     leftover min-width here would fight it and re-open the column. */
  .cmp tbody th[scope="row"]{ min-width:0; padding:.7rem .45rem;
    overflow-wrap:break-word; hyphens:auto; }
  .cmp tbody td{ padding:.7rem .35rem; overflow-wrap:break-word; }
  .cmp__note{ font-size:.72rem; }
  .cmp__group th{ padding:.9rem .5rem .45rem; }

  /* One swipe = one tool. Snapping stops the scroll from parking a column
     half-off the edge, and scroll-padding offsets the snap by the pinned
     label column's width so a tool never lands underneath it. */
  .cmp-scroll{ scroll-snap-type:x proximity; scroll-padding-left:7.25rem; }
  .cmp thead th:not(.cmp__corner){ scroll-snap-align:start; }
}
/* Sub-360 (iPhone SE 1st gen, Android compacts): at the 7.25/7rem sizing above
   only one and a half tools fit beside the label, so shave both. Still rem, so
   the whole grid scales with the user's text size at 200% zoom (WCAG 1.4.4).
   6.25 + (4 x 5.75) = 29.25rem, so the min-width stays exact arithmetic. */
@media (max-width:360px){
  .cmp{ min-width:29.25rem; }
  .cmp col.cmp__c-label{ width:6.25rem; }
  .cmp col.cmp__c-tool{ width:5.75rem; }
  .cmp-scroll{ scroll-padding-left:6.25rem; }
}
@media (prefers-reduced-motion: reduce){ .cmp-scroll{ scroll-behavior:auto; } }

/* Shorter copy needs less room above and below it. Vertical padding only,
   ~10% off, so the band keeps its horizontal rhythm with every other one.
   A modifier rather than a change to .cta-band itself: the base band is
   shared by claude, clementine and resources, whose copy is still long. */
.cta-band--tight{ padding-top:clamp(1.8rem,4.5vw,2.9rem); padding-bottom:clamp(1.8rem,4.5vw,2.9rem); }

/* team wall */
/* flex (not grid) so an incomplete last row centers instead of left-aligning */
.team-wall{ list-style:none; display:flex; flex-wrap:wrap; justify-content:center; gap:1rem; }
.team-wall li{ flex:0 0 calc((100% - 5rem) / 6); display:flex; flex-direction:column; align-items:center;
  gap:.5rem; text-align:center; }
@media (max-width:760px){ .team-wall li{ flex-basis:calc((100% - 3rem) / 4); } }
@media (max-width:460px){ .team-wall li{ flex-basis:calc((100% - 2rem) / 3); } }
.team-wall__avatar{ width:100%; aspect-ratio:1; object-fit:cover; border-radius:0; background:var(--wash); display:block; }
.team-wall__shadow{ width:100%; aspect-ratio:1; border-radius:0; overflow:hidden; background:var(--wash);
  display:flex; align-items:flex-end; justify-content:center; }
.team-wall__shadow svg{ width:78%; height:auto; color:var(--gray-lt); }
/* the name comes first in the markup so screen readers say "Name, Role";
   order:1 keeps it drawn below the photo */
.team-wall__name{ order:1; font-size:.82rem; font-weight:700; color:var(--navy); line-height:1.2; }
.team-wall__name--open{ color:var(--gray-md); font-weight:600; }
/* student tag — overlaid on the lower-left of the photo/silhouette */
.team-wall__pic{ position:relative; display:block; width:100%; }
.team-wall__badge{ position:absolute; left:50%; bottom:6px; transform:translateX(-50%); display:inline-flex; align-items:center; gap:.28rem;
  background:var(--orange); color:var(--navy); font-size:.6rem; font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  padding:.22rem .5rem; border-radius:9999px; }
.team-wall__badge svg{ width:11px; height:11px; }
/* role/title tag — full-width navy bar across the bottom edge of the headshot,
   so long titles wrap wide-and-short instead of stacking over the face.
   Always visible: it used to be opacity:0 until li:hover, which gave keyboard-only
   users no way to reach it (WCAG 2.1.1 Keyboard, 1.4.13 Content on Hover or Focus).
   Nothing inside the li is focusable, so the old :focus-within rule never fired and
   adding tabindex would have injected 15 dead tab stops — persistent is the fix.
   Solid navy (not an alpha tint) so contrast doesn't depend on the photo underneath. */
.team-wall__role{ position:absolute; left:0; right:0; bottom:0;
  background:var(--navy); color:#fff; font-size:.58rem; font-weight:700; letter-spacing:.05em;
  text-transform:uppercase; text-align:center; line-height:1.3; padding:.4rem .5rem;
  border-radius:0; }
.wall-note{ font-size:.78rem; color:var(--gray-dk); margin-top:1rem; }

/* CTA band */
.cta-band{ background:var(--orange); color:var(--navy); border-radius:var(--radius); padding:clamp(2rem,5vw,3.2rem);
  display:flex; flex-wrap:wrap; align-items:center; gap:1.4rem; justify-content:space-between; }
.cta-band h2{ color:var(--navy); font-family:var(--sans); font-weight:700; font-size:clamp(1.6rem,3vw,2.3rem); max-width:22ch; }
.cta-band p{ color:var(--navy); margin-top:.5rem; max-width:44ch; }
/* the default orange focus ring vanishes on the orange band (1:1); navy is 5.9:1 on it */
.cta-band :focus-visible{ outline-color:var(--navy); }
/* Shorter copy needs less room above and below it. Vertical padding only,
   ~10% off, so the band keeps its horizontal rhythm with every other one.
   A modifier rather than a change to .cta-band itself: the base band is
   shared by claude, agentic-os and resources, whose copy is still long. */
.cta-band--tight{ padding-top:clamp(1.8rem,4.5vw,2.9rem); padding-bottom:clamp(1.8rem,4.5vw,2.9rem); }

/* ============================================================
   ARTICLE (story pages)
   ============================================================ */
.article{ padding:clamp(2.4rem,5vw,3.6rem) 0 clamp(3rem,6vw,4.5rem); }
.article__wrap{ max-width:720px; margin-inline:auto; }
.article__dek{ font-family:var(--sans); font-size:1.15rem; line-height:1.55; color:var(--gray-dk);
  border-left:3px solid var(--orange); padding-left:1rem; margin:0 0 1.8rem; }
.article__meta{ font-size:.82rem; color:var(--gray-dk); text-transform:uppercase; letter-spacing:.08em; font-weight:700; margin-bottom:.6rem; }
.article__body > p{ font-size:1.08rem; line-height:1.75; margin-bottom:1.25rem; }
.article__body h2{ font-size:1.5rem; margin:2.2rem 0 .9rem; }
.article__body h3{ font-size:1.2rem; margin:1.8rem 0 .7rem; }
.article__body ul,.article__body ol{ margin:0 0 1.25rem 1.3rem; }
.article__body li{ margin-bottom:.5rem; font-size:1.05rem; line-height:1.7; }
.article__body blockquote{ margin:1.8rem 0; padding:1.2rem 1.5rem; background:var(--wash);
  border-left:4px solid var(--orange); border-radius:0; }
/* blockquote is the ONLY place SUDS uses the serif (ShermanSerif Book) */
.article__body blockquote p{ font-family:var(--serif); font-weight:400; font-size:1.2rem; line-height:1.55; color:var(--navy); margin-bottom:.6rem; }
.article__body blockquote cite{ font-style:normal; font-size:.9rem; font-weight:700; color:var(--gray-dk); }
.article__body figure{ margin:1.6rem 0; }
.article__body figcaption{ font-size:.85rem; color:var(--gray-dk); margin-top:.5rem; }
.article__hero-img{ width:100%; aspect-ratio:16/8; object-fit:cover; border-radius:var(--radius); margin-bottom:1.8rem; }
/* logo hero (3rd-party logo instead of a photo): contain on white, don't crop */
.article__hero-img--logo{ object-fit:contain; background:#fff; border:1px solid var(--line);
  padding:clamp(1.5rem,6vw,3.5rem) clamp(2rem,12vw,7rem); }
.article__foot{ margin-top:2.4rem; padding-top:1.6rem; border-top:1px solid var(--line); }
.pill-links{ display:flex; flex-wrap:wrap; gap:.6rem; }
.pill-links a{ font-size:.85rem; font-weight:700; border:1px solid var(--line); border-radius:9999px;
  padding:.5rem 1rem; color:var(--navy); }
.pill-links a:hover{ background:var(--wash); text-decoration:none; color:var(--orange-dk); }

/* support.html F.A.Q. block: search form, topic pills, browse-all button.
   The input borrows .video-search's look from the Tutorials gallery below it. */
.faq-search{ display:flex; flex-wrap:wrap; gap:.6rem; align-items:stretch; margin-bottom:1.8rem; }
.faq-search .video-search{ max-width:480px; }
.faq-topics__title{ font-size:.78rem; font-weight:700; letter-spacing:.12em; text-transform:uppercase;
  color:var(--gray-dk); margin-bottom:.8rem; }
.faq-all{ margin-top:1.8rem; }

/* resource list rows */
.reslist{ list-style:none; display:grid; gap:.7rem; }
.reslist a{ display:flex; align-items:center; justify-content:space-between; gap:1rem; flex-wrap:wrap;
  background:#fff; border:1px solid var(--line); border-radius:0; padding:1.1rem 1.4rem; transition:.18s var(--ease); }
.reslist a:hover{ border-color:var(--orange); box-shadow:var(--shadow-sm); text-decoration:none; }
.reslist b{ color:var(--navy); font-size:1.05rem; }
.reslist .meta{ color:var(--gray-dk); font-size:.85rem; font-weight:600; }
.reslist .go{ color:var(--orange-dk); font-weight:700; font-size:.85rem; }

/* FAQ */
.faq{ display:grid; gap:.7rem; }
.faq details{ background:#fff; border:1px solid var(--line); border-radius:0; padding:0 1.3rem; }
.faq summary{ cursor:pointer; list-style:none; padding:1.1rem 0; font-weight:700; color:var(--navy); font-size:1.05rem;
  display:flex; justify-content:space-between; gap:1rem; align-items:center; }
.faq summary::-webkit-details-marker{ display:none; }
.faq summary::after{ content:"+"; color:var(--orange); font-size:1.5rem; line-height:1; font-weight:400; }
.faq details[open] summary::after{ content:"–"; }
.faq details[open] summary{ border-bottom:1px solid var(--line-soft); }
.faq__a{ padding:1rem 0 1.3rem; color:var(--gray-dk); }
.faq__a p{ margin-bottom:.8rem; } .faq__a p:last-child{ margin-bottom:0; }

/* prose helper for simple pages */
.prose{ max-width:720px; }
.prose p{ margin-bottom:1.1rem; font-size:1.05rem; }
.prose h2{ margin:2rem 0 .8rem; font-size:1.5rem; }

/* ============================================================
   FOOTER
   ============================================================ */
.site-footer{ background:var(--navy); color:#fff; }
.site-footer a{ color:rgba(255,255,255,.85); }
.site-footer a:hover{ color:#fff; }
.footer__inner{ padding-top:3.2rem; padding-bottom:2.6rem; }

/* brand lockup */
.footer__brandrow{ display:flex; align-items:center; gap:1rem; margin-bottom:1.3rem; }
.footer__logo{ display:inline-flex; }
.footer__logo img{ display:block; height:38px; width:auto; }
.footer__unit{ padding-left:1rem; border-left:1px solid rgba(255,255,255,.38);
  font-size:1rem; letter-spacing:.01em; }
.footer__unit a{ color:#fff; display:inline-block; padding:.15rem 0; }   /* 23px -> 24px+ target */
.footer__pipe{ color:rgba(255,255,255,.4); margin:0 .45rem; font-weight:400; }

/* contact line — info left, social right */
.footer__contact{ display:flex; flex-wrap:wrap; justify-content:space-between;
  align-items:center; gap:1rem 1.8rem; font-size:.9rem;
  color:rgba(255,255,255,.85); margin-bottom:2rem; }
.footer__contact-info{ display:flex; flex-wrap:wrap; align-items:center; gap:.4rem 1.8rem; }
.footer__contact address{ font-style:normal; margin:0; }
.footer__contact-info a{ display:inline-block; padding:.15rem 0; }        /* 23px -> 24px+ target */
.footer__social{ display:flex; flex-wrap:wrap; gap:1.4rem; }
/* min-width + padding: "X" alone measured 11x23, under the 24px target minimum (WCAG 2.5.8) */
.footer__social a{ font-weight:700; font-size:.9rem; display:inline-block; min-width:24px; text-align:center; padding:.15rem .25rem; }

/* secondary nav + copyright */
.footer__nav{ border-top:1px solid rgba(255,255,255,.16); padding-top:1.6rem;
  display:flex; flex-direction:column; align-items:flex-start; gap:1rem; }
.footer__links{ list-style:none; display:flex; flex-wrap:wrap; gap:.7rem 1.8rem;
  margin:0; padding:0; font-size:.85rem; }
.footer__links a{ display:inline-block; padding:.2rem 0; }                 /* 20px -> 24px+ target */
.footer__copy{ font-size:.82rem; color:rgba(255,255,255,.7); margin:0; }

/* ============================================================
   INTERACTIVE DEMO — "How an AI request works"
   Ported from the previous dynamic site; fully scoped under
   .aidemo so nothing leaks. Runs only on ai-tools.html (ai-demo.js).
   Honors reduced motion via body.reduced (set by the script).
   ============================================================ */
.aidemo :focus-visible{ outline-color:var(--navy); }
.aidemo{ background:transparent; color:var(--ink); padding:0;
  --muted:var(--gray-dk); --aid-otext:var(--orange-dk); --card:#fff;
  --ink:var(--navy); --paper:rgba(173,179,184,.18); --script:var(--sans);
  --aid-node-w:473px; --aid-branch-w:26px; --aid-ghost:.2; }

.aidemo__cols{ display:grid; grid-template-columns:minmax(0,.6fr) minmax(0,1.05fr); gap:clamp(2rem,4vw,4rem);
  margin-top:.5rem; align-items:start; }

/* LEFT: Claude-style chat window */
.aidemo__left{ min-width:0; display:flex; }
.aidemo .ccard{ display:flex; flex-direction:column; width:100%; min-height:560px;
  background:#fff; color:var(--ink); border:1px solid var(--line); border-radius:0;
  overflow:hidden; box-shadow:0 10px 34px rgba(0,14,84,.07); }
.aidemo .ccard__msgs{ flex:1 1 auto; display:flex; flex-direction:column; gap:1.1rem;
  padding:1.5rem 1.6rem; overflow-y:auto; }
.aidemo .cmsg-user{ align-self:flex-end; max-width:82%; background:var(--paper); border:1px solid var(--line); color:var(--ink);
  padding:.6rem 1rem; border-radius:0; font-size:1rem; line-height:1.4;
  opacity:0; transform:translateY(6px); transition:opacity .4s, transform .4s; }
.aidemo .cmsg-user.show{ opacity:1; transform:none; }
.aidemo .cmsg-ai{ align-self:stretch; display:flex; flex-direction:column; gap:.7rem; }
.aidemo .cthink{ display:flex; flex-direction:column; gap:.35rem; }
.aidemo .cthink .step-line{ color:var(--muted); font-size:.92rem; line-height:1.45; }
.aidemo .canswer{ color:var(--ink); font-size:1.02rem; line-height:1.6; }
.aidemo .canswer:empty{ display:none; }
.aidemo .canswer b{ color:var(--aid-otext); }
.aidemo .ccompose{ position:relative; flex:0 0 auto; display:flex; align-items:center; gap:.7rem;
  padding:.85rem 1rem; border-top:1px solid var(--line); background:var(--paper); }
.aidemo .send-hint{ position:absolute; right:6px; bottom:calc(100% - 4px); display:flex; flex-direction:column;
  align-items:flex-end; gap:0; pointer-events:none; opacity:0; transition:opacity .4s; }
.aidemo .send-hint.show{ opacity:1; }
.aidemo .send-hint__text{ font-family:var(--script); color:var(--orange-dk); font-weight:700; font-style:italic;
  font-size:1.05rem; line-height:1; letter-spacing:.01em; transform:rotate(-5deg); }
.aidemo .send-hint__arrow{ width:34px; height:40px; color:var(--orange); margin-right:8px; }
/* 3 x 1.5s: auto-started motion must end within 5s or offer a pause (WCAG 2.2.2) */
.aidemo .ccompose__send.glow{ animation:aidsendglow 1.5s ease-in-out 3; }
@keyframes aidsendglow{ 0%{ box-shadow:0 0 0 0 rgba(247,105,0,.55); } 70%{ box-shadow:0 0 0 13px rgba(247,105,0,0); } 100%{ box-shadow:0 0 0 0 rgba(247,105,0,0); } }
.aidemo .ccompose__field{ flex:1 1 auto; min-width:0; display:flex; align-items:center;
  background:#fff; border:1px solid var(--line); border-radius:0; padding:.7rem .95rem; }
.aidemo .ccompose__text{ min-width:0; color:var(--ink); font-size:.98rem;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.aidemo .ccompose__text::after{ content:""; display:inline-block; width:1px; height:1.05em;
  background:var(--ink); margin-left:2px; vertical-align:-2px; animation:aidcaret 1.1s steps(1) 4; }   /* 4.4s, then a steady caret (WCAG 2.2.2) */
@keyframes aidcaret{ 50%{ opacity:0; } }
.aidemo .ccompose__send{ flex:0 0 auto; width:36px; height:36px; border-radius:0; border:none;
  background:var(--orange); color:#fff; cursor:pointer; display:flex; align-items:center; justify-content:center;
  transition:background .2s, transform .15s; }
.aidemo .ccompose__send:hover{ background:var(--orange-dk); } .aidemo .ccompose__send:active{ transform:scale(.94); }
.aidemo .ccompose__send:disabled,
.aidemo .ccompose__send[aria-disabled="true"]{ opacity:.5; cursor:default; }
.aidemo .ccompose__send svg{ width:18px; height:18px; }

/* RIGHT: request path (blocks + twin chevron connectors + LLM offshoot) */
.aidemo .vflow{ display:flex; flex-direction:column; align-items:flex-start; gap:0; }
.aidemo .vnode{ position:relative; width:100%; max-width:var(--aid-node-w); overflow:hidden;
  display:flex; align-items:flex-start; justify-content:space-between; gap:1.2rem;
  background:var(--card); border:1px solid var(--line); border-radius:0; padding:1.15rem 1.4rem;
  opacity:var(--aid-ghost); transform:translateY(12px) scale(.985);
  transition:opacity .45s var(--ease), transform .45s var(--ease), border-color .3s, box-shadow .3s; }
.aidemo .vnode.shown{ opacity:1; transform:none; }
.aidemo .vnode.active{ border-color:var(--orange); box-shadow:0 12px 34px rgba(247,105,0,.2); }
.aidemo .vnode--grow{ flex-direction:column; gap:0; align-items:stretch; }
.aidemo .vnode--grow .vnode__row{ display:flex; justify-content:flex-start; align-items:center; gap:1rem;
  position:relative; z-index:1; min-height:48px; }
.aidemo .vnode__stage{ position:relative; z-index:1; flex:1 1 0; min-width:0; opacity:0;
  transition:opacity .4s var(--ease); }
.aidemo .vnode__stage > .stage-inner{ overflow:hidden; min-height:0; max-height:0;
  transition:max-height .6s var(--ease); }
.aidemo .vnode.grown{ border-color:var(--orange); box-shadow:0 14px 40px rgba(247,105,0,.22); }
.aidemo .vnode.grown .vnode__stage{ opacity:1; }
.aidemo .vnode.grown .vnode__stage > .stage-inner{ max-height:170px; }
.aidemo .mini{ display:flex; align-items:center; gap:.5rem; background:#fff; border:1px solid var(--line);
  border-radius:0; padding:.5rem .55rem; }
.aidemo .mini__box{ flex:1 1 auto; min-width:0; font-size:.86rem; line-height:1.35; color:var(--ink);
  white-space:normal; overflow-wrap:break-word; }
.aidemo .mini__typed::after{ content:"|"; color:var(--muted); margin-left:1px; }
.aidemo .mini__send{ flex:0 0 auto; width:30px; height:30px; border-radius:0; background:var(--orange); color:#fff;
  display:flex; align-items:center; justify-content:center; }
.aidemo .mini__send svg{ width:15px; height:15px; }
.aidemo .mini__send.press{ animation:aidpress .45s ease; }
@keyframes aidpress{ 40%{ transform:scale(.82); } 70%{ transform:scale(1.08); } }
.aidemo .wbox{ background:#fff; border:1px solid var(--line); border-radius:0; padding:.55rem .65rem; }
.aidemo .wbox__label{ font-size:.62rem; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); font-weight:700; margin-bottom:.35rem; }
.aidemo .gennow{ height:26px; display:flex; align-items:center; gap:.4rem; font-size:.92rem; font-weight:700; white-space:nowrap; }
.aidemo .gennow .gn-num{ color:var(--aid-otext); }
.aidemo .gennow .gn-arrow{ color:var(--muted); }
.aidemo .gennow .gn-word{ color:var(--navy); }
.aidemo .genout{ margin-top:.3rem; font-size:.88rem; color:var(--ink); line-height:1.4; min-height:1.4em; }
.aidemo .genout .gword{ opacity:0; animation:aidovz .3s ease forwards; }
.aidemo .srch{ display:flex; align-items:center; gap:.7rem; }
.aidemo .srch__ico{ position:relative; width:40px; height:40px; flex:0 0 auto; color:var(--navy); }
.aidemo .srch__ico .doc, .aidemo .srch__ico .globe{ position:absolute; inset:0; width:100%; height:100%; }
.aidemo .srch__ico .glass{ position:absolute; width:22px; height:22px; left:5px; top:7px; color:var(--orange);
  animation:aidglass 1.15s ease-in-out infinite; }
@keyframes aidglass{ 0%{ transform:translate(0,0); } 25%{ transform:translate(8px,1px); } 50%{ transform:translate(6px,8px); } 75%{ transform:translate(-1px,4px); } 100%{ transform:translate(0,0); } }
.aidemo .srch__text{ font-size:.9rem; line-height:1.35; color:var(--ink); min-height:2.7em;
  display:flex; align-items:center; }
.aidemo .srch__text.miss{ color:var(--muted); }
.aidemo .srch__text.hit{ color:var(--aid-otext); font-weight:700; }
.aidemo .used{ font-size:.86rem; color:var(--muted); }
.aidemo .used summary{ cursor:pointer; list-style:none; display:flex; align-items:center; gap:.35rem; padding:.14rem 0; }
.aidemo .used summary::-webkit-details-marker{ display:none; }
.aidemo .used summary::before{ content:"\203A"; display:inline-block; transition:transform .2s; color:var(--muted); font-weight:700; }
.aidemo .used[open] > summary::before{ transform:rotate(90deg); }
.aidemo .used .used{ margin-left:1.1rem; }
.aidemo .used__leaf{ margin-left:1.3rem; padding:.14rem 0; color:var(--ink); }
.aidemo .vnode__fill{ position:absolute; inset:0; z-index:0; pointer-events:none;
  background:rgba(247,105,0,.13); transform:scaleX(0); transform-origin:left; }
.aidemo .vnode__head, .aidemo .vnode ul{ position:relative; z-index:1; }
.aidemo .vnode__head{ flex:0 0 auto; display:flex; align-items:center; gap:.8rem; }
.aidemo .vnode__head > div{ min-width:0; }
.aidemo .vnode__ico{ width:48px; height:48px; border-radius:0; flex:0 0 auto; background:var(--paper);
  color:var(--navy); display:flex; align-items:center; justify-content:center; transition:background .3s, color .3s; }
.aidemo .vnode.active .vnode__ico{ background:var(--orange); color:#fff; }
.aidemo .vnode__ico svg{ width:26px; height:26px; }
.aidemo .vnode h3{ font-family:var(--sans); font-weight:700; font-size:1.55rem; color:var(--navy); line-height:1.05; }
.aidemo .vnode ul{ list-style:none; display:flex; flex-direction:row; flex-wrap:wrap;
  align-items:center; gap:.45rem; margin-top:1rem; flex:0 0 auto; }
.aidemo .vnode li{ font-size:.92rem; color:var(--navy); background:var(--paper); border:1px solid var(--line);
  border-radius:999px; padding:.3rem .85rem; transition:background .3s, color .3s, border-color .3s, box-shadow .3s; }
.aidemo .vnode li.hit{ color:#fff; background:var(--aid-otext); border-color:var(--aid-otext); font-weight:700;
  box-shadow:0 0 0 4px rgba(215,65,0,.18); }
.aidemo .vnode li.hit::before{ content:"\2713"; margin-right:.32rem; font-weight:700; }
.aidemo .vlevel--llm{ position:relative; width:100%; }
.aidemo .branch{ position:absolute; left:var(--aid-node-w); top:50%; width:var(--aid-branch-w); height:0;
  border-top:2px dashed rgba(247,105,0,.55); opacity:0; transition:opacity .4s; }
.aidemo .branch.on{ opacity:1; }
.aidemo .offshoot{ position:absolute; top:50%; left:calc(var(--aid-node-w) + var(--aid-branch-w));
  width:calc(100% - var(--aid-node-w) - var(--aid-branch-w)); min-width:210px; max-width:340px;
  background:var(--paper); border:1px solid var(--line); border-radius:0; padding:.85rem .95rem;
  opacity:0; transform:translate(-8px,-50%); visibility:hidden; pointer-events:none;
  transition:opacity .4s var(--ease), transform .4s var(--ease), visibility 0s linear .4s; }
.aidemo .offshoot.on{ opacity:1; transform:translate(0,-50%); visibility:visible; pointer-events:auto;
  transition:opacity .4s var(--ease), transform .4s var(--ease), visibility 0s; }
.aidemo .ostage__title{ font-family:var(--sans); font-weight:700; font-size:1.1rem; color:var(--navy); margin-bottom:.2rem; }
.aidemo .ostage__desc{ font-size:.85rem; line-height:1.45; color:var(--ink); margin-bottom:.55rem; }
.aidemo .ostage__div{ border:none; border-top:1px solid var(--line); margin:.85rem 0; }
.aidemo .ovz{ display:flex; flex-direction:column; align-items:flex-start; gap:.45rem; }
.aidemo .ovz .trow{ display:flex; align-items:center; gap:.55rem; }
.aidemo .ovz .tw{ min-width:62px; text-align:center; background:#fff; border:1px solid var(--line);
  border-radius:0; padding:.26rem .55rem; font-size:.85rem; font-weight:600; color:var(--navy); }
.aidemo .ovz .tn{ min-width:50px; text-align:center; background:#fff; border:1px solid rgba(247,105,0,.45);
  border-radius:0; padding:.26rem .55rem; font-size:.85rem; font-weight:700; color:var(--aid-otext); }
.aidemo .ovz .tar{ color:var(--muted); font-size:1.05rem; }
.aidemo .ovz > *{ opacity:0; transform:translateY(5px); animation:aidovz .5s ease forwards; }
.aidemo .ovz > *:nth-child(1){ animation-delay:.1s } .aidemo .ovz > *:nth-child(2){ animation-delay:.35s }
.aidemo .ovz > *:nth-child(3){ animation-delay:.6s } .aidemo .ovz > *:nth-child(4){ animation-delay:.85s }
@keyframes aidovz{ to{ opacity:1; transform:none; } }
body.reduced .aidemo .ovz > *{ opacity:1; transform:none; }
.aidemo .vconn{ width:100%; max-width:var(--aid-node-w); height:80px; display:flex; justify-content:center;
  align-items:stretch; gap:44px; }
.aidemo .chev-track{ width:22px; opacity:0; transition:opacity .3s;
  background-repeat:repeat-y; background-position:center 0; background-size:22px 20px; }
.aidemo .chev-track.used{ opacity:.32; }
.aidemo .chev-track.flowing{ opacity:1; }
.aidemo .chev--down{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='20' viewBox='0 0 22 20'%3E%3Cpath d='M4 5 L11 12 L18 5' fill='none' stroke='%23F76900' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.aidemo .chev--up{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='20' viewBox='0 0 22 20'%3E%3Cpath d='M4 15 L11 8 L18 15' fill='none' stroke='%23F76900' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.aidemo .chev--down.flowing{ animation:aidchev-down .7s linear infinite; }
.aidemo .chev--up.flowing{ animation:aidchev-up .7s linear infinite; }
@keyframes aidchev-down{ to{ background-position:center 20px; } }
@keyframes aidchev-up{ to{ background-position:center -20px; } }
@keyframes aidfill{ from{ transform:scaleX(0); } to{ transform:scaleX(1); } }
.aidemo.paused, .aidemo.paused *{ animation-play-state:paused !important; }
body.reduced .aidemo .ccompose__text::after{ display:none; }
body.reduced .aidemo .ccompose__send{ pointer-events:none; }

@media (max-width:1400px){
  .aidemo__cols{ grid-template-columns:1fr; gap:2.6rem; }
  .aidemo__left{ max-width:620px; }
  .aidemo .ccard{ min-height:440px; }
}
@media (max-width:860px){
  .aidemo .branch{ display:none; }
  .aidemo .offshoot{ position:static; transform:none; width:auto; max-width:var(--aid-node-w); margin-top:.9rem; }
  .aidemo .offshoot.on{ transform:none; }
  .aidemo .offshoot:not(.on){ display:none; }
}

/* ============================================================
   VIDEO GALLERY (dynamic playlist) + guide steps + callout
   ============================================================ */
.subhead{ font-family:var(--sans); font-weight:700; font-size:1.2rem; color:var(--navy); margin:.4rem 0 .3rem; }
.subhead__note{ color:var(--gray-dk); font-size:.95rem; margin:0 0 1.4rem; max-width:64ch; }

.video-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:1.3rem; }
@media (max-width:900px){ .video-grid{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:560px){ .video-grid{ grid-template-columns:1fr; } }
.video-note{ grid-column:1/-1; color:var(--gray-dk); font-size:.98rem; }
.video-card{ display:flex; flex-direction:column; background:#fff; border:1px solid var(--line);
  border-radius:var(--radius); overflow:hidden; transition:transform .2s var(--ease), box-shadow .2s var(--ease), border-color .2s var(--ease); }
.video-card:hover{ border-color:var(--orange); text-decoration:none; }
.video-card__thumb{ position:relative; display:block; aspect-ratio:16/9; background:var(--wash); overflow:hidden; }
.video-card__thumb img{ width:100%; height:100%; object-fit:cover; }
.video-card__play{ position:absolute; inset:0; margin:auto; width:52px; height:52px; border-radius:50%;
  background:rgba(247,105,0,.92); color:#fff; display:flex; align-items:center; justify-content:center;
  transition:transform .2s var(--ease), background .2s var(--ease); }
.video-card__play svg{ width:22px; height:22px; margin-left:2px; }
.video-card:hover .video-card__play{ transform:scale(1.08); background:var(--orange-dk); }
.video-card__dur{ position:absolute; right:.5rem; bottom:.5rem; background:rgba(0,14,84,.85); color:#fff;
  font-size:.74rem; font-weight:700; padding:.15rem .45rem; border-radius:0; letter-spacing:.02em; }
.video-card__hit{ display:flex; flex-direction:column; color:inherit; text-decoration:none; }
.video-card__hit:hover{ text-decoration:none; }
.video-card__title{ padding:.9rem 1rem 1.05rem; font-weight:700; font-size:.98rem; color:var(--navy); line-height:1.35; }
.video-card--has-desc .video-card__title{ padding-bottom:.4rem; }
.video-card__desc-wrap{ padding:0 1rem 1.05rem; }
.video-card__desc{ font-size:.85rem; color:var(--gray-dk); line-height:1.45; }
.video-card__desc.clamp{ display:-webkit-box; -webkit-line-clamp:2; line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.video-card__toggle{ margin-top:.45rem; background:none; border:0; padding:.25rem 0; cursor:pointer;  /* 19px -> 24px+ target */
  font-family:var(--sans); font-size:.82rem; font-weight:700; color:var(--orange-dk); }
.video-card__toggle:hover{ text-decoration:underline; }

/* callout box (guides) */
.callout{ background:#fff; border:1px solid var(--line); border-left:4px solid var(--orange);
  border-radius:0; padding:1.3rem 1.5rem; margin:1.8rem 0; }
.callout h2{ font-size:1.15rem; }
.callout p{ margin:.4rem 0 0; }

/* numbered step list (guides) */
.steps{ list-style:none; counter-reset:step; display:grid; gap:1.2rem; margin:1.4rem 0 2rem; padding:0; }
.steps > li{ position:relative; counter-increment:step; padding-left:3.4rem; }
.steps > li::before{ content:counter(step); position:absolute; left:0; top:0; width:2.4rem; height:2.4rem;
  border-radius:50%; background:var(--orange); color:#fff; font-family:var(--sans); font-weight:700;
  font-size:1.15rem; display:flex; align-items:center; justify-content:center; }
.steps > li h3{ font-size:1.15rem; margin:.2rem 0 .4rem; }
.steps > li p{ margin:0 0 .7rem; }

/* video search toolbar + pagination */
.video-tools{ display:flex; flex-wrap:wrap; align-items:center; gap:.8rem 1.1rem; margin:0 0 1.3rem; }
.video-search{ flex:1 1 260px; max-width:360px; font-family:var(--sans); font-size:.98rem; color:var(--navy);
  background:#fff; border:1px solid var(--line); border-radius:0; padding:.65rem 1.1rem; }
.video-search::placeholder{ color:var(--gray-md); }
/* visible label on its own row above the field: the placeholder vanishes on typing (WCAG 3.3.2) */
.video-search__label{ flex:1 1 100%; font-size:.9rem; font-weight:700; color:var(--gray-dk); margin-bottom:-.4rem; }
.video-search:focus-visible{ outline:3px solid var(--orange); outline-offset:1px; border-color:var(--orange); }
.video-count{ font-size:.88rem; color:var(--gray-dk); font-weight:600; }
.video-more{ display:flex; justify-content:center; margin-top:1.8rem; }

/* videos: plain "unavailable" / loading panel — simple gray haze */
.video-unavailable{ grid-column:1/-1; background:var(--wash); border:1px solid var(--line-soft);
  border-radius:var(--radius); padding:2.6rem 1.5rem; text-align:center; color:var(--gray-dk);
  font-weight:600; letter-spacing:.01em; }

/* numbered policy list (vendor policy) */
.policy-list{ margin:0 0 1.25rem 1.3rem; }
.policy-list li{ margin-bottom:.55rem; font-size:1.05rem; line-height:1.6; }

/* ============================================================
   COOKIE NOTICE (cookie-notice.js): slim bar along the bottom of the screen.
   Same wording and policy link as syracuse.edu's banner. Navy so it reads as
   site chrome; white text and a white outline button (both well above AA on navy).
   ============================================================ */
.cookie-notice{ position:fixed; left:0; right:0; bottom:0; z-index:1100; background:var(--navy); color:#fff;
  border-top:1px solid rgba(255,255,255,.16); }
.cookie-notice__inner{ display:flex; align-items:center; justify-content:space-between; gap:.8rem 1.4rem;
  flex-wrap:wrap; padding-block:.6rem; }
.cookie-notice__text{ margin:0; font-size:.85rem; line-height:1.45; color:#fff; flex:1 1 20rem; }
.cookie-notice__text a{ color:#fff; text-decoration:underline; text-underline-offset:2px; }
.cookie-notice__text a:hover{ color:var(--orange-lt); }
.cookie-notice__btn{ flex:0 0 auto; min-height:2.5rem; padding:.45rem 1.1rem; background:transparent; color:#fff;
  border:2px solid #fff; border-radius:0; font-family:var(--sans); font-weight:700; font-size:.8rem;
  letter-spacing:.04em; text-transform:uppercase; cursor:pointer; }
.cookie-notice__btn:hover{ background:#fff; color:var(--navy); }
.cookie-notice :focus-visible{ outline-color:var(--orange-lt); }
