/* Google Language Translator plugin stylesheets, self-hosted.
   Imported here rather than linked in every page's <head> because the stamper
   only rewrites the header/footer regions — this way all 15 pages pick them up
   from one place. They must come first; @import is only valid at the top.
   NOTE the flag sprites live at assets/css/images/ because this CSS references
   them as ../images/flags*.png relative to its own css/vendor/ location. Put
   them anywhere else and the flags render blank. */
@import url("vendor/google-language-translator.css");
@import url("vendor/glt-toolbar.css");

/* ==========================================================================
   DECAL Scholars — decalscholars.com
   Static rebuild of the WordPress/Elementor site. One stylesheet, no build
   step, hand-editable. Values are transcribed from the live site's Elementor
   "Default Kit" (post-6.css) and the theme's custom_css, not estimated.

   Sections, in order:
     1. Fonts
     2. Tokens (colours, type, layout)
     3. Reset and base elements
     4. Layout helpers
     5. Header  (announcement bar, utility row, logo, nav, search)
     6. Footer
     ... page sections follow as they are built.

   NOTE ON SOURCE ORDER: background shorthands reset background-image, so any
   decorative background-image longhand belongs at the END of this file, after
   the section rules. Same trap as the caresolutions.com build.
   ========================================================================== */


/* 1. Fonts ================================================================
   Self-hosted, from the same Google files Elementor was loading.

   Roboto ships as a VARIABLE font: every weight Google serves is the same
   bytes, so one file per subset covers 100-900. Downloading per-weight gave
   17 files / 436 KB that deduplicated to 5 files / 125 KB.

   Subsets: -3 = latin, -2 = latin-ext, -1 = vietnamese (Roboto only).
   ------------------------------------------------------------------------ */

@font-face {
  font-family: "Roboto";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/assets/fonts/roboto-3.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                 U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F,
                 U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Roboto";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/assets/fonts/roboto-2.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                 U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                 U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                 U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Roboto";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/assets/fonts/roboto-1.woff2") format("woff2");
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                 U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                 U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: "Quando";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/assets/fonts/quando-2.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                 U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F,
                 U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Quando";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/assets/fonts/quando-1.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                 U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                 U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                 U+2113, U+2C60-2C7F, U+A720-A7FF;
}


/* 2. Tokens ===============================================================
   Straight from Elementor's global kit. The hex values are what the site
   actually renders; the opaque token names (7657b82 etc.) are Elementor's
   own and are recorded in the project notes if you need to trace one back.
   ------------------------------------------------------------------------ */

:root {
  /* Colours */
  --navy:        #24366E;   /* kit "primary" and "accent" */
  --blue:        #406BAB;   /* kit "secondary" — links, hovers */
  --text:        #000000;   /* kit "text" — body copy is pure black here */
  --white:       #FFFFFF;
  --yellow:      #F7BE00;   /* the home page banner bar */
  --green:       #83BC41;   /* NOT caresolutions.com's #7FBE41 */
  --green-dark:  #0B6637;
  --grey:        #847E7E;
  --grey-line:   #CCCCCC;   /* FAQ separators, card borders */
  --grey-light:  #EDECEC;
  --highlight:   #FDEFBF;   /* search term highlight */
  --tint-green:  #E0EECF;
  --tint-mint:   #E7F0EB;
  --tint-blue:   #CFDAEA;

  /* Typography — kit "primary" is Quando, everything else Roboto */
  --font-display: "Quando", Georgia, serif;
  --font-body:    "Roboto", "Helvetica Neue", Arial, sans-serif;

  --h-size:      32px;      /* kit primary — Quando, verified on live h2 */
  --h-line:      44px;
  --sub-size:    25px;      /* kit secondary */
  --sub-line:    31px;
  /* ⚠ 17px/26px, NOT the 20px the kit's "text" slot also lists.
     The kit gives that slot TWO sizes (17px and 20px) because it carries
     responsive steps, and an earlier version of this file picked 20 for the
     desktop default. Live's actual desktop prose is 17px/26px — measured on
     /educational-counseling/ (list items, emphasis, links, paragraphs all
     17/26) and on the homepage's video paragraph.

     This was nearly invisible: every homepage section sets its own size, so
     only ONE element on that page inherited the default — and it was wrong.
     Every inner page would have inherited it. Sister bug to the QR site's
     Elementor-slot mix-up; see [[feedback-wordpress-migration-playbook]].
     20px w500 IS a real live value, but it belongs to sub-headings
     ("WATCH:" is Roboto 20px/28px w500) — set those per element, not here. */
  --body-size:   17px;
  --body-line:   26px;
  --accent-size: 17px;      /* kit accent — buttons, small UI */

  /* Layout */
  --content: 1100px;        /* live --content-width */
  --gutter:  20px;

  /* Horizontal inset that lands content on the centred --content column while
     letting a section's background stay full-bleed; collapses to --gutter once
     the viewport is narrower than the column.

     NOTE: percentage padding resolves against the CONTAINING BLOCK, not the
     element. So this belongs on full-bleed sections only — putting it on
     something that is itself already centred insets the content twice. That
     mistake cost three passes on the QR site. */
  --side: max(var(--gutter), calc((100% - var(--content)) / 2));
}


/* 3. Reset and base =======================================================
   Deliberately small. Only what is needed to stop browser defaults fighting
   the transcribed values.
   ------------------------------------------------------------------------ */

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

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--body-size);
  line-height: var(--body-line);
  color: var(--text);
  background: var(--white);
}

img, svg, video { max-width: 100%; height: auto; display: block; }

/* Live sets text-decoration: none on links throughout — nav, footer and body
   copy. Verified on both nav and footer anchors. Underlines are added back
   only where live actually has one. */
a { color: var(--blue); text-decoration: none; }
a:hover, a:focus-visible { color: var(--green); }

/* Live sets link colours only inside body copy; nav and buttons override. */
.prose a          { color: var(--blue); }
.prose a:hover    { color: var(--green); }
.prose h2 a:hover,
.prose h3 a:hover { color: var(--blue); }

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-display);
  font-weight: 400;
  margin: 8px 0;                  /* theme custom_css: .entry-content h1/h2/h3 */
}
h1 { font-size: var(--h-size); line-height: var(--h-line); }

p { margin: 0.5em 0; }            /* theme custom_css: .entry-content p */

ul { list-style-type: disc; }

button { font: inherit; }

/* Accessibility: visible focus everywhere, and a skip link for keyboard users.
   Neither exists on the live site; both are additions we make deliberately. */
:focus-visible { outline: 3px solid var(--blue); outline-offset: 2px; }

.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 100;
  background: var(--navy);
  color: var(--white);
  padding: 10px 18px;
}
.skip-link:focus { left: 0; color: var(--white); }

.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;
}


/* 4. Layout helpers ======================================================= */

.wrap {
  width: 100%;
  max-width: var(--content);
  margin: 0 auto;
  padding: 0 var(--gutter);
}

.prose > :first-child { margin-top: 0; }
.prose > :last-child  { margin-bottom: 0; }


/* 5. Header ===============================================================
   Three stacked full-bleed rows. Measured against live at a 1280px viewport
   (content box 1265):

     row 1  announcement bar   56px    #406BAB blue    inner padding 0
     row 2  logo + buttons     49.3px  transparent     inner padding 0 4%
     row 3  primary nav        66px    #24366E navy    inner padding 0 4%

   ⚠ LIVE IS INTERNALLY INCONSISTENT and this is reproduced deliberately:
   the header insets its content by 4% (50.6px at 1265) while the FOOTER
   centres a 1100px column (82.5px at 1265). So header and footer content do
   NOT share a left edge on the live site — they are ~32px apart. Kept as-is
   per the "look is the contract" rule; flagged for David because the QR
   department manager asked for exactly this kind of thing to be squared up.
   ------------------------------------------------------------------------ */

.site-header { background: var(--white); }

/* row 1 — announcement bar. GREEN #83BC41 with BLACK text.
   ⚠ An earlier version had this blue. Reading the outer .e-con's
   background-color returns #406BAB, but the green is painted on a NESTED
   container inside it — the playbook's "visible colour with no obvious source"
   trap. Confirmed with document.elementsFromPoint(), which is the only
   reliable way to settle this class of question. */
.site-alert {
  background: var(--green);
  min-height: 56px;
  display: flex;
  align-items: center;
}
.site-alert__inner {
  width: 100%;
  padding: 0 4%;
}
.site-alert p {
  margin: 0;
  color: var(--text);
  font-size: 17px;
  line-height: 26px;
  font-weight: 400;
  text-align: left;
}
/* "Click here." is BLUE #406BAB on live, not black like the surrounding text.
   Measured at 1905 — an earlier version had it inheriting --text. */
.site-alert a { color: var(--blue); }
.site-alert a:hover,
.site-alert a:focus-visible { color: var(--navy); }

/* row 2 — logo left, three buttons right.
   The 30px above and below is live's own margin on this row and accounts for
   60 of the header's 231.4px total (56 + 30 + 49.4 + 30 + 66). Without it the
   header came out 171.3 and every page sat 60px too high. */
.site-brand { margin: 30px 0; }
.site-brand__inner {
  padding: 0 4%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  flex-wrap: wrap;
}
.site-logo img { width: 372px; height: auto; }

.site-actions {
  margin: 0;
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

/* All three buttons: 36px tall, 14px/500, padding 10px 13px, square corners.
   One solid navy, two outlined. */
.btn {
  /* inline-flex + min-height pins every variant to live's 36px regardless of
     whether it carries a border. The solid button on live has no border and the
     outlined ones have 1px; letting the border add to the box made ours 38. */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-body);
  /* Measured at 1905, which is the width David views at. An earlier version
     used 14px / 10px 13px / height 36 — those are live's values at a 1265
     viewport, i.e. a narrower responsive step, and made the buttons visibly
     too small. 12 + 15 + 12 + 2px border = live's 41px exactly, so the height
     falls out of the padding and needs no explicit value. */
  font-size: 15px;
  line-height: 15px;
  font-weight: 500;
  padding: 12px 24px;
  border-radius: 0;
  /* All three carry a 1px border on live — including the solid one, where the
     border colour matches its own background. */
  border: 1px solid transparent;
  text-align: center;
  cursor: pointer;
  white-space: nowrap;
}
.btn--solid {
  background: var(--navy);
  border-color: var(--navy);
  color: var(--white);
  /* Live's "Log In" renders 110.5px wide while its own content accounts for
     only 91.5 (41.5 text + 48 padding + 2 border) — verified, and there is no
     icon; the markup is just two spans holding the text. The extra 19px comes
     from its flex parent stretching it, not from anything on the button. The
     other two buttons match live exactly with identical padding, so rather
     than distort the shared .btn box model, this reproduces the observable
     width directly. */
  min-width: 110.5px;
}
.btn--solid:hover,
.btn--solid:focus-visible { background: var(--blue); border-color: var(--blue); color: var(--white); }

.btn--outline {
  background: var(--white);
  border-color: var(--navy);
  color: var(--navy);
}
.btn--outline:hover,
.btn--outline:focus-visible { background: var(--navy); color: var(--white); }

/* row 3 — primary nav on navy */
.site-navbar { background: var(--navy); }
.site-navbar__inner {
  padding: 0 4%;
  min-height: 66px;
  display: flex;
  align-items: center;
  gap: 20px;
}

.nav {
  flex: 1 1 auto;
  /* Same trap as .nav__search below: with the default min-width: auto, .nav
     refuses to shrink below its own min-content, so at 1025 the whole <ul> grew
     11px the moment the search row appeared and all four labels drifted right.
     Capping it means the bar's inner width is authoritative at every size. */
  min-width: 0;
}
.nav > ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  align-items: center;
  /* Live's items are flex: 1 1 auto — they GROW to fill the inset width, and
     each label is CENTRED inside its grown item (symmetric ~101px insets,
     measured at 1905). space-between was wrong: it left each label at its
     item's left edge, which is what made the nav look bunched to the left
     against live. Measured at 1905, not 1265 — live's insets are percentage
     based, so the width you measure at matters. */
  width: 100%;
  /* 44px line-height is what gives each item its 46px box on live —
     the links carry no padding of their own. */
  line-height: 44px;
}
.nav > ul > li {
  position: relative;
  /* grow to fill, and centre the label inside the grown item — this is what
     live does and what gives the nav its evenly-distributed look */
  flex: 1 1 auto;
  display: flex;
  justify-content: center;
}
.nav > ul > li > a {
  display: flex;
  align-items: center;
  gap: 8px;
  /* ⚠ DO NOT add horizontal padding here to chase the flex distribution.
     Live's anchors measure exactly 154.4px wider than their text on all four
     links, which looks like 77.2px of padding — but live's computed padding is
     genuinely 0. That 154.4 comes from SIBLING elements inside the anchor
     (Elementor wraps the label alongside a sub-arrow span that carries margins
     even when the item has no dropdown). Adding real padding on top of it made
     the worst-case drift jump from 27px to 125px. Reverted. */
  padding: 0;
  font-size: 16px;
  line-height: 44px;
  font-weight: 500;
  color: var(--white);
  white-space: nowrap;
}
.nav > ul > li > a:hover,
.nav > ul > li > a:focus-visible { color: var(--yellow); }

/* CURRENT PAGE — #F7BE00, the same yellow as hover. This was missing entirely:
   main.js has always added .is-current to the exact matching anchor, but no rule
   ever coloured it, so every page rendered its own nav item plain white.

   Scoped deliberately:
   * ONLY the exact current item. WordPress also marks the ancestor
     (`current-menu-ancestor` / `current-menu-parent`) and live does NOT colour
     it -- verified on /cda-training-scholarships/, where the child is yellow and
     "CDA Scholarships" above it stays white. That is why .has-current, which
     main.js puts on the parent, gets no colour here.
   * .nav only, NOT the footer. main.js marks footer links too (harmless, and
     the aria-current is a genuine a11y gain), but live has exactly TWO yellow
     elements per page -- its desktop and dropdown nav copies of the one item --
     so the footer is not one of them.

   Specificity: (0,2,1) here beats both .nav > ul > li > a (0,1,3) and
   .nav li > ul a (0,1,3), so it applies at both menu levels without !important. */
.nav a.is-current { color: var(--yellow); }

/* Dropdown panel — MEASURED at 1905. It is NAVY at 95% opacity with white
   text, not the white panel an earlier version guessed at. */
/* Live's caret is Font Awesome's fa-angle-down at 16x16, white, inlined as SVG
   (class e-font-icon-svg e-fas-angle-down). A CSS border triangle was the wrong
   width and skewed the flex distribution, so use the real glyph at the real
   size — inlined here as a background so the markup stays clean. */
.nav__has-sub > a::after {
  content: "";
  display: block;
  flex: 0 0 16px;
  width: 16px;
  height: 16px;
  background: currentColor;
  /* fa-angle-down, masked so it follows the link colour on hover */
  -webkit-mask: center / 15px 15px no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E%3Cpath d='M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0L313 182.4c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.4 9.4-24.6 9.4-34 0z'/%3E%3C/svg%3E");
          mask: center / 15px 15px no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E%3Cpath d='M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0L313 182.4c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.4 9.4-24.6 9.4-34 0z'/%3E%3C/svg%3E");
}
.nav li > ul {
  list-style: none;
  margin: 0;
  padding: 0;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 156px;                        /* live: width 156px */
  background: rgba(36, 54, 110, .95);      /* navy at 95%, measured */
  box-shadow: none;                        /* live has none */
  display: none;
  z-index: 60;
}
.nav li > ul a {
  display: block;
  padding: 8px 10px;
  font-size: 14px;
  line-height: 20px;
  font-weight: 400;
  color: var(--white);
  white-space: normal;   /* the High School item wraps to two lines on live */
}
/* Hover state was not directly measurable (the panel would not open under a
   synthetic mouseover). A slight lift of the same navy is the safe reading of
   live's screenshot; confirm at review. */
.nav li > ul a:hover,
.nav li > ul a:focus-visible { background: rgba(64, 107, 171, .95); color: var(--white); }
.nav li.is-open > ul { display: block; }
/* Hover only where hovering exists — on touch the .is-open class does the work.
   Guarding by width alone is what causes the stuck-hover bug on tablets. */
@media (hover: hover) {
  .nav > ul > li:hover > ul { display: block; }
}

/* Search — COLLAPSED to a magnifier, as live does. The form measures 0x0 on
   live until opened, and only the icon shows in the nav bar. */
/* ==========================================================================
   HEADER SEARCH  —  David's design, 2026-08-22
   ==========================================================================
   Clicking the magnifier REPLACES it, in place inside the navy bar, with the
   row [ input ][ magnifier submit ][ X ]. The X puts the magnifier back.

   This is a deliberate hybrid: live's row STYLE (all three controls in a line)
   but kept in the bar rather than dropped below it. The results panel does drop
   below the bar, because 500px of results will not fit in the bar without
   covering a nav item.

   The row is capped by the space the bar can give it. The search's list item
   only gets 106px of its own at 1200, so when open it claims 320 and the other
   items shrink to suit - they shift left, they are never covered.
   ========================================================================== */
.site-search {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  width: 100%;
}
.site-search__toggle {
  background: transparent;
  border: 0;
  padding: 4px;
  cursor: pointer;
  display: flex;
  align-items: center;
  color: var(--white);
}
.site-search__toggle svg { width: 24px; height: 24px; fill: currentColor; }
.site-search__toggle:hover,
.site-search__toggle:focus-visible { color: var(--yellow); }

/* Open: the magnifier goes, the row takes its place. */
.site-search.is-open .site-search__toggle { display: none; }

/* IN FLOW, not absolute — the row is part of the bar now. Its old absolute
   positioning is also what made the results panel hang off the form instead of
   the bar, which put a 500px panel 100px off the left edge at 768. */
.site-search__form {
  display: none;
  align-items: center;
  width: 100%;          /* fills the reserved slot, so it never pushes anything */
}
.site-search.is-open .site-search__form { display: flex; }

.site-search__input {
  font: inherit;
  font-size: 14px;
  flex: 1 1 auto;
  min-width: 0;                     /* so it can shrink inside the bar */
  height: 36px;
  padding: 0 12px;
  border: 1px solid var(--grey-line);
  border-right: 0;
  background: var(--white);
  color: var(--text);
}
/* Navy square with a WHITE glyph. The old rule filled the glyph navy on a white
   button, so it rendered as an empty white square - the "monstrosity". */
.site-search__submit,
.site-search__close {
  flex: 0 0 36px;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  cursor: pointer;
  padding: 0;
}
.site-search__submit { background: var(--navy); }
.site-search__submit svg { width: 18px; height: 18px; fill: var(--white); }
.site-search__submit:hover,
.site-search__submit:focus-visible { background: var(--blue); }

.site-search__close { background: var(--white); }
.site-search__close svg { width: 18px; height: 18px; fill: var(--navy); }
.site-search__close:hover,
.site-search__close:focus-visible { background: var(--highlight); }

/* Results hang below the NAVY BAR, not off the form — .site-navbar is the
   positioned ancestor, and 4% matches the bar's own inner inset so the panel
   lines up with the right edge of the content. */
.site-navbar { position: relative; }
.site-search__results {
  position: absolute;
  top: 100%;
  right: 4%;
  width: 500px;
  max-width: 92vw;
  max-height: 410px;
  overflow-y: auto;
  padding: 5px;
  background: #E2E2E2;
  box-shadow: 0 6px 16px rgba(0, 0, 0, .2);
  z-index: 70;
}
.site-search__results[hidden] { display: none; }

/* RESERVE the search's slot permanently, whether the row is open or not.

   The first version grew this item only when open, which meant the four nav
   labels shifted left every time someone clicked the magnifier - tidy, but the
   sort of thing a QC pass will rightly flag (David, 2026-08-22). Holding the
   space open at all times costs each label a few pixels of width, and they
   NEVER move.

   clamp() rather than a flat width: 340 is comfortable at 1890, but the same
   340 at 1025 would squeeze "Educational Counseling" hard enough to wrap and
   change the bar's height. 210 is the narrowest the row can be and still hold a
   usable input beside two 36px buttons. */
.nav > ul > li.nav__search {
  flex: 0 0 clamp(210px, 18%, 340px);
  /* min-width: 0 is what actually holds the slot still. A flex item defaults to
     min-width: auto, i.e. it refuses to shrink below its own content - so when
     the row appeared the item grew 210 -> 250 to fit the input's intrinsic
     width, and the four labels shifted after all. With this, the basis wins and
     the input shrinks instead. */
  min-width: 0;
}
.site-search mark { background: var(--highlight); }  /* live: #FDEFBF */

/* Mobile nav toggle — hidden on desktop, shown at the breakpoint in §7. */
.nav-toggle {
  display: none;
  background: transparent;
  border: 1px solid var(--white);
  color: var(--white);
  padding: 8px 12px;
  cursor: pointer;
}
.nav-toggle__bars,
.nav-toggle__bars::before,
.nav-toggle__bars::after {
  display: block;
  width: 20px;
  height: 2px;
  background: currentColor;
  content: "";
}
.nav-toggle__bars::before { transform: translateY(-6px); }
.nav-toggle__bars::after  { transform: translateY(4px); }


/* 6. Footer ===============================================================
   Two rows, 648.7px total, measured against live at 1265:

     main row      1265 x 596.7   rgba(237,236,236,.48)  padding 0 20px
       inner       1100 x 595.7   flex row, gap 6%, padding 40px 0 20px
         col 1      586 x 535.7   logo + description, padding-right 99px
         col 2      191           menu, 6 items
         col 3      191           menu, 2 items
     copyright bar 1265 x 52      #24366E                padding 0 20px

   Unlike the header, the footer centres a 1100px column — see the note in §5.
   ------------------------------------------------------------------------ */

.site-footer__main {
  background: rgba(237, 236, 236, .48);   /* #EDECEC at 48% */
  padding: 0 var(--gutter);
}
.site-footer__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 40px 0 20px;
  display: flex;
  gap: 6%;
  align-items: flex-start;
}

.site-footer__about {
  flex: 0 1 586px;
  display: flex;
  flex-direction: column;
  gap: 20px;
  padding-right: 99px;
}
/* Live's footer logo is 472.4 x 62.7 inside a 487px column — 97%, not 100%.
   (The .4 is what says percentage; at desktop widths the footer column is a
   fixed 1100 either way, so the two only diverge below 1140px. Re-check during
   the mobile pass.)

   Live's logo block is 77.7 tall around a 62.7 image: measured with a Range,
   the line box is exactly the image, and the remaining 15px is dead space
   BELOW it (an orphaned margin on Elementor's widget container). Reproduced as
   padding so the block still measures live's 77.7 in a side-by-side diff.
   The inline-block/middle pair is live's too, and is what stops the global
   img { display: block } from collapsing the box. */
.site-footer__logo {
  padding-bottom: 15px;
}
.site-footer__logo img {
  width: 97%;
  height: auto;
  display: inline-block;
  vertical-align: middle;
}
/* flow-root so the last paragraph's 15px bottom margin stays inside the block,
   as it does inside live's text widget. */
.site-footer__text { display: flow-root; }
.site-footer__about p {
  margin: 0 0 15px;
  font-size: 14px;
  line-height: 21px;
  font-weight: 400;
  color: var(--navy);
}

.site-footer__nav { flex: 0 0 191px; }
.site-footer__nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
.site-footer__nav a {
  display: block;
  font-size: 16px;
  line-height: 44px;   /* sets the row height: 6 items = 264, 2 items = 88 */
  font-weight: 500;
  color: var(--blue);
}
/* ⚠ Live renders the SECOND footer menu in navy while the first is blue.
   That looks like an authoring slip rather than a decision, but it is
   reproduced here. Raise at review. */
.site-footer__nav--short a { color: var(--navy); }
.site-footer__nav a:hover,
.site-footer__nav a:focus-visible { color: var(--green); }

.site-footer__legal {
  background: var(--navy);
  padding: 0 var(--gutter);
}
/* Live pads this 10px top / 1px bottom rather than centring the line, and the
   paragraph carries a 15px bottom margin. That is what adds up to the bar's
   52px: 10 + (26 + 15) + 1. */
.site-footer__legal-inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 10px 0 1px;
  display: flex;
}
.site-footer__legal p {
  margin: 0 0 15px;
  font-size: 12px;
  line-height: 26px;
  color: var(--white);
}


/* 7. Homepage ============================================================
   Six full-bleed sections, measured against live at 1905 client width.

   ⚠ THIS PAGE HAS ITS OWN BUTTON VARIANTS and they do NOT match the header's:
     .btn--cta     yellow #F7BE00 with NAVY text, 15px / 12px 24px
     .btn--cta-lg  the same but 18px / 15px 25px  (hero only)
     .btn--navy    navy with white text, 15px / 12px 24px
   ------------------------------------------------------------------------ */

.btn--cta {
  background: var(--yellow);
  border-color: var(--yellow);
  color: var(--navy);
}
.btn--cta:hover,
.btn--cta:focus-visible { background: var(--navy); border-color: var(--navy); color: var(--white); }

/* Hero CTA is larger: 18px with 15px 25px padding, no border, and — the easy
   one to miss — 0.4px of letter-spacing. Across "Explore programs" that
   tracking is worth 6.4px of width, which was the whole of the gap between our
   button and live's. */
.btn--cta-lg {
  font-size: 18px;
  line-height: 18px;
  letter-spacing: 0.4px;
  padding: 15px 25px;
  border-width: 0;
}

.btn--navy {
  background: var(--navy);
  /* NO border. Unlike the three header buttons, Elementor's body buttons carry
     no border at all: live measures them 39px (12 + 15 + 12) where a 1px border
     would make 41. The 2px was making every band this button drives come out
     tall — it is what put /cda-scholarships/'s intro band 4px over. */
  border-width: 0;
  color: var(--white);
}

/* "Watch the Video" carries a leading play icon: Font Awesome's far-play-circle
   at 15x15, white, BEFORE the label, with a 5px gap. Inlined as a mask so it
   follows the text colour and needs no icon font. */
.btn--play::before {
  content: "";
  flex: 0 0 15px;
  width: 15px;
  height: 15px;
  margin-right: 5px;
  background: currentColor;
  -webkit-mask: center / 15px 15px no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z'/%3E%3C/svg%3E");
          mask: center / 15px 15px no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z'/%3E%3C/svg%3E");
}
.btn--navy:hover,
.btn--navy:focus-visible { background: var(--blue); border-color: var(--blue); color: var(--white); }

/* TRAILING icons — 15x15 with a 5px gap, AFTER the label.
   Elementor's markup is misleading here: the icon <span> comes FIRST in the DOM
   and the content wrapper carries `flex-direction: row-reverse`, so reading the
   HTML tells you the wrong side. These were confirmed from the rendered x
   positions on live (icon at 1012, label at 841). Same mask technique as
   .btn--play so the glyph follows the text colour with no icon font. */
.btn--arrow::after,
.btn--download::after {
  content: "";
  flex: 0 0 15px;
  width: 15px;
  height: 15px;
  margin-left: 5px;
  background: currentColor;
  -webkit-mask: center / 15px 15px no-repeat var(--btn-icon);
          mask: center / 15px 15px no-repeat var(--btn-icon);
}
/* Font Awesome fas-arrow-right */
.btn--arrow {
  --btn-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z'/%3E%3C/svg%3E");
}
/* Font Awesome fas-download */
.btn--download {
  --btn-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z'/%3E%3C/svg%3E");
}


/* --- 1. hero: 472.1px, background photo, 5% inset (NOT the header's 4%) --- */
.home-hero {
  display: flex;
  padding: 0 5%;
  background-image: url("/assets/images/ds_home_hero-scaled.jpg");
  background-repeat: no-repeat;
  background-position: center right;
  background-size: cover;
}
/* A flex ROW of three items. Every length here is a percentage because that is
   how live authored it, and the percentages resolve against the hero's content
   box (1701 at a 1905 client width): 48% = 816.5, 10% = 170.1, padding
   5%/9% = 85.05/153.08. Height is therefore content-driven and lands on
   live's 472.1 without a min-height propping it up. */
.home-hero__inner {
  width: 100%;
  display: flex;
  padding: 5% 0 9%;
}
/* The headline block is 48% wide, sits at the LEFT of the hero, and its text is
   CENTRED inside that block — which is what makes live's headline read as
   shifted right. An earlier version left-aligned it in a 640px box, and the one
   after that used a fixed 823px.
   The 20px gap is live's; without it the button sat ~6px low. */
.home-hero__text {
  width: 48%;
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 20px;
  text-align: center;
  position: relative;
  z-index: 50;                           /* live's own stacking order */
}
.home-hero h1 {
  margin: 8px 0;
  font-family: var(--font-display);
  /* 60px/75px — nearly double the kit's 32px display size, so this is a
     per-section override rather than the token. */
  font-size: 60px;
  line-height: 75px;
  font-weight: 400;
  color: var(--navy);
}

/* Decorative sparkle clusters over the photo.

   These are NOT absolutely positioned on live. Each is a 10%-wide flex item
   sitting after the headline block, then shoved sideways by an Elementor
   transform — sparkle 1 by -100% of its own width (so it lands back over the
   headline block's right edge) and sparkle 2 by +210% (out over the woman's
   shoulder). Reproducing the mechanism rather than the resulting coordinates
   is what keeps them in place as the viewport changes.

   The two verticals differ: sparkle 1 aligns to the BOTTOM of the row,
   sparkle 2 to its CENTRE.

   Live also gives them a scroll-parallax drift and a fade-in-on-entry, both
   pure decoration; omitted here, in line with how the rest of the build
   ignores Elementor's entrance animations.

   Live's other breakpoints, recorded for the mobile pass — tablet (<=1024):
   translateY -12px / -23px; mobile (<=767): translateX 0 with translateY
   50px / -140px, and the hero itself stacks. */
.home-hero__spark {
  width: 10%;
  flex: 0 0 auto;
}
.home-hero__spark img {
  display: block;
  width: 100px;
  height: auto;
}
.home-hero__spark--1 {
  align-self: flex-end;
  transform: translateX(-100%);
}
.home-hero__spark--2 {
  align-self: center;
  transform: translateX(210%);
}
.home-hero__spark--2 img { margin: 0 auto; }   /* centred in its 10% box; sparkle 1 sits left */

@media (min-width: 2400px) {                   /* live's "widescreen" breakpoint */
  .home-hero__spark--1 { transform: translateX(-61%); }
  .home-hero__spark--2 { transform: translateX(180%); }
}
@media (max-width: 1366px) {                   /* live's "laptop" breakpoint */
  .home-hero__spark--1 { transform: translateX(-120%); }
  .home-hero__spark--2 { transform: translateX(280%); }
}

/* --- 2. yellow intro band: 156px, #FDEFBF --- */
.home-intro {
  background: var(--highlight);          /* #FDEFBF */
  min-height: 156px;
  display: flex;
  align-items: center;
  padding: 0 var(--gutter);
}
.home-intro__inner {
  max-width: var(--content);
  margin: 0 auto;
  width: 100%;
}
.home-intro h2 {
  margin: 0;
  font-family: var(--font-body);
  font-size: 29px;
  line-height: 40px;
  font-weight: 400;
  color: var(--navy);
}

/* --- 3. video band: 295.1px, blue-grey. This colour is NOT in the kit
       tokens — it appears only here, so it is declared inline. --- */
/* Shared library block: the video band appears on the homepage and on
   /educational-counseling/ with identical copy, and again on three Academic
   Scholarships pages with different copy and thumbnail. Named .video-band
   rather than .home-video for that reason - one definition, several pages. */
.video-band {
  background: rgb(200, 205, 219);
  min-height: 295.1px;
  display: flex;
  align-items: center;
  padding: 0 var(--gutter);
}
/* ⚠ THE BAND COLOUR VARIES BY PAGE — the geometry does not.
   Blue-grey #C8CDDB on the homepage and /educational-counseling/, but the GREEN
   TINT on /cda-scholarships/. Both are 295.1px tall, so a height-only check
   passes while the colour is wrong; that is how this was missed when the page
   was first built. Check the background on every new page that uses this block. */
/* ⚠ THREE BAND COLOURS SO FAR — the geometry never changes, the colour does:
     blue-grey #C8CDDB   /  and  /educational-counseling/   (the base rule)
     green tint #E0EECF  /cda-scholarships/                 --tint-green
     dark green #0B6637  /academic-scholarships/            --green-dark
   All are 295.1px tall, so a height-only check passes while the colour is
   wrong — that is exactly how /cda-scholarships/ shipped with the wrong band.
   CHECK THE BACKGROUND on every new page that uses this block. */
.video-band--tint-green { background: var(--tint-green); }
.video-band--green-dark { background: var(--green-dark); }

/* Columns are 57% / 38% with a 5% gap = exactly 100%, which is live's
   627 / 418 inside the 1100 column. The thumb was previously `flex: 0 1 420px`
   — a guess, and one of the open items on this build; 418 is measured, and the
   image pass independently found no video thumbnail displays wider than 418. */
.video-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  column-gap: 5%;
}
.video-band__text { width: 57%; }
.video-band__eyebrow {
  margin: 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--navy);
}
.video-band__title {
  margin: 0 0 12px;
  font-family: var(--font-display);
  font-size: 32px;
  line-height: 44px;
  font-weight: 400;
  color: var(--navy);
}
.video-band__text p { margin: 0 0 20px; color: var(--navy); }
.video-band__thumb { width: 38%; }

/* On the dark green band the type reverses to white. Scoped to the modifier so
   the two light bands keep their navy. */
.video-band--green-dark .video-band__eyebrow,
.video-band--green-dark .video-band__title,
.video-band--green-dark .video-band__text p { color: var(--white); }

/* --- 4. explore our programs: 692px, transparent.
       All values below are measured off live at 1905; earlier guesses at the
       section padding (40/60) and grid gap (30) were wrong and made the
       section 36px too tall. --- */
.home-programs {
  padding: 0 var(--gutter);              /* live: no vertical padding at all */
}
.home-programs__inner {
  max-width: var(--content);
  margin: 0 auto;
  /* Live's inner wrapper carries 30px top and bottom. That 60px is what makes
     the section 692: 30 + (44 h1 + 16 margins) + 572 card row + 30. */
  padding: 30px 0;
}
.home-programs h1 {
  margin: 8px 0;                         /* live: 8px 0, not 0 0 30px */
  font-family: var(--font-display);
  font-size: 32px;
  line-height: 44px;
  font-weight: 400;
  color: var(--navy);
}
.program-grid {
  display: grid;
  /* Grid rather than flex so an incomplete final row cannot stretch —
     the caresolutions build hit exactly that with flex card rows.
     4 columns with a 40px gap in the 1100 column gives live's 245px cards:
     (1100 - 3*40) / 4 = 245. */
  grid-template-columns: repeat(4, 1fr);
  gap: 40px;
}
/* Live uses gap: 0 and spaces the card with per-element MARGINS, which is what
   produces its 572px card. A uniform gap gave 547 — 25px short. The margins
   below are measured: image 10px below, h2 8px each side (the theme's
   .entry-content h2 rule), paragraph 0.5em each side (its .entry-content p
   rule), button 10px above. */
.program-card { display: flex; flex-direction: column; gap: 0; }
/* Live's card image renders 245 x 296, which is not the files' natural ratio —
   so it is cropped to fit rather than scaled. */
.program-card img {
  width: 100%;
  aspect-ratio: 245 / 296;
  object-fit: cover;
  margin-bottom: 10px;
}
.program-card h2 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--navy);
}
/* The paragraph absorbs the leftover height so the button keeps live's literal
   10px top margin. Using margin-top:auto on the button instead swallowed that
   10px in the tallest card (no slack for auto to consume) and left the row
   10px short. */
.program-card p { margin: 0.5em 0; font-size: 17px; line-height: 26px; flex: 1 1 auto; }
/* Push every button to the card's bottom so they align across the row
   regardless of copy length.

   The vertical padding used to be forced to 11px here to reach live's 39px,
   because .btn--navy was carrying a 1px border it should never have had. The
   border is gone (see .btn--navy), so the shared 12px now gives 39 on its own
   and the override would make these cards 2px short. */
.program-card .btn {
  margin-top: 10px;
  align-self: flex-start;
}

/* --- 5. other programs: 263.5px — 60% text on #EDECEC, 40% photo ---

   This is NOT a centred 1100px column like the sections above it: the band is
   full-bleed and split 60/40, and the text is centred inside its own half.

   ⚠ The two nested percentages are load-bearing and easy to misread. Both
   resolve against the 60% COLUMN (1134 at a 1905 client width), not against
   whatever they are declared on:
       .home-other__inner  width 80%      -> 907.2
                           padding 0 5%   -> 56.7 each side
   giving a 793.8 text measure. Percentage padding resolving against the
   containing block rather than the element is what cost three passes on the
   QR site; do not "simplify" these to px. */
.home-other {
  display: flex;
  margin-top: 60px;
  background: var(--grey-light);         /* #EDECEC */
}
.home-other__col {
  width: 60%;
  display: flex;
  flex-direction: column;
  align-items: center;                   /* centres the text block in its half */
}
.home-other__inner {
  width: 80%;
  margin: 40px 0 60px;
  padding: 0 5%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
.home-other h2 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
}
.home-other h2 a { color: var(--text); } /* BLACK here, not navy */
/* Bottom margin is 10, NOT 8.5 + 10: on live the paragraph's own 8.5 collapses
   into its text-widget wrapper's 10, and only that 10 survives to meet the
   button's own 10px top margin. Adding them gave the band an extra 8.5px. */
.home-other__inner p { margin: 8.5px 0 10px; font-size: 17px; line-height: 26px; }
.home-other__inner .btn { margin-top: 10px; }
.home-other__photo {
  width: 40%;
  background: url("/assets/images/home_thumb_other.jpg") center center / cover no-repeat;
}

/* --- 6. not sure where to start?: 315.8px, #406BAB ---

   TWO STACKED ROWS, not one three-column row. The section is a wrapping flex
   row whose children are each a full 1100px wide, so each takes its own line;
   justify-content:center then centres both bands. That is live's mechanism, and
   it is why the row gap is 0 while the column gap is 2%. */
.home-help {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  column-gap: 2%;
  row-gap: 0;
  padding: 30px var(--gutter);
  background: var(--blue);
  color: var(--white);
}
.home-help__head,
.home-help__cols {
  width: var(--content);                 /* 1100 */
  max-width: 100%;
}
/* Icon and heading sit side by side, centred as a pair. The 111px right padding
   is live's own — it pulls the pair left of true centre, and dropping it would
   put the heading noticeably further right than live. */
.home-help__head {
  display: flex;
  align-items: center;
  justify-content: center;
  column-gap: 2%;
  padding-right: 111px;
}
/* 119px wide plus live's 10px side margins = the 139px slot it occupies. */
.home-help__icon { width: 119px; height: auto; margin: 0 10px; }
.home-help h2 {
  margin: 8px 10px;
  font-family: var(--font-display);
  font-size: 32px;
  line-height: 44px;
  font-weight: 400;
  text-align: center;
}
.home-help__cols {
  margin-top: 14px;
  display: flex;
  align-items: flex-start;
  column-gap: 6%;
}
/* 44 + 6 + 22 + 6 + 22 = 100%. */
.home-help__lead {
  width: 44%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  padding-bottom: 10px;
}
/* Lighter and larger than body copy: 20px/26px at weight 300. */
.home-help__lead p { margin: 10px 0; font-size: 20px; line-height: 26px; font-weight: 300; }
.home-help__lead .btn { margin-top: 10px; }
.home-help__contact { width: 22%; padding-bottom: 10px; }
.home-help__contact p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.home-help__contact strong { font-weight: 700; }
.home-help__contact a { color: var(--white); }
.home-help__contact a:hover,
.home-help__contact a:focus-visible { color: var(--yellow); }

/* Live's buttons in these two bands carry no border, so they measure 39px tall
   against the 41px of the header's. Zeroing the border width here rather than
   trimming the padding keeps the label metrics identical to live's. */
.home-other .btn,
.home-help .btn { border-width: 0; }


/* ==========================================================================
   §8. FAQ ACCORDION — shared by 8 pages
   ==========================================================================
   Live uses the Ultimate FAQ plugin (`ewd-ufaq-*`), not an Elementor
   accordion. Values below are read from the plugin's own rules on live:

     .ewd-ufaq-faq-title-text h4   Roboto 20px/25px w500 #000, margin 5px
     h4:hover                      #406BAB
     .ewd-ufaq-post-margin-symbol span   18px, #847E7E, hover #406BAB
     symbol box   float left, margin-right 15px, padding 2px 0 0 2px, lh 1
     .ewd-ufaq-faq-title-text      float left, WIDTH 85%
     .ewd-ufaq-faq-body            padding 10px 25px 10px 55px
     body p                        Roboto 17px/27.2px w400 #000, margin 8.5px 0

   Title rows measure 35px on live, which falls out of 25px line-height plus
   the h4's 5px margins — no explicit height needed.

   The 85% width on the label is deliberate, not a stray: it is what decides
   where a long question wraps. Letting the label fill the row instead would
   re-wrap several questions.

   TWO DELIBERATE DEPARTURES, both mechanism not appearance:
   1. The toggle icon is drawn in CSS. Live renders a character from a bespoke
      icon font (`ewd-toggle-icon`, 'a' closed / 'A' open). Identified by
      rasterising both glyphs to a canvas and reading the pixels: 'a' is a
      PLUS, 'A' is a MINUS. Two bars reproduce that exactly and save shipping
      a whole font for one character.
   2. The control is a <button> with aria-expanded, where live uses
      <a href="#">. Same look, and it actually announces its state.
   ========================================================================== */
/* Item separators come from the THEME's inline custom CSS, not the plugin's
   stylesheet, which is why they were missed on the first pass:
     .ewd-ufaq-faq-div { margin: 15px 0; border-bottom: 1px solid #cccccc;
                         padding-bottom: 20px; } */
.faq__item {
  margin: 15px 0;
  /* 2px top / 20px bottom. The theme's inline CSS only shows the 20; the 2px
     comes from the plugin, and it is what makes live's items 58px rather than
     56 (2 + 35 title + 20 + 1 border). Nine items, so it was worth 18px. */
  padding: 2px 0 20px;
  border-bottom: 1px solid var(--grey-line);
}

.faq__q {
  margin: 5px;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 25px;
  font-weight: 500;
  color: var(--text);
}
.faq__toggle {
  display: flex;
  align-items: flex-start;
  gap: 15px;                       /* live's symbol margin-right */
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: inherit;
  text-align: left;
  cursor: pointer;
}
.faq__label { width: 85%; }        /* load-bearing — sets the wrap point */
.faq__toggle:hover .faq__label,
.faq__toggle:focus-visible .faq__label { color: var(--blue); }

/* Plus / minus, 18px to match the glyph's rendered size. The horizontal bar is
   always drawn; the vertical one is removed when the item opens, turning the
   plus into live's minus. */
.faq__icon {
  position: relative;
  flex: 0 0 18px;
  width: 18px;
  height: 25px;                    /* aligns the icon to the first text line */
  color: var(--grey);
}
.faq__icon::before,
.faq__icon::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  background: currentColor;
  transform: translate(-50%, -50%);
}
.faq__icon::before { width: 12px; height: 2px; }            /* horizontal bar */
.faq__icon::after  { width: 2px;  height: 12px; }           /* vertical bar   */
.faq__item.is-open .faq__icon::after { display: none; }     /* plus -> minus  */
.faq__toggle:hover .faq__icon,
.faq__toggle:focus-visible .faq__icon { color: var(--blue); }

.faq__a { padding: 10px 25px 10px 55px; }
.faq__a p {
  margin: 8.5px 0;
  font-size: 17px;
  line-height: 27.2px;             /* the plugin's own 1.6, NOT our 26px body */
  color: var(--text);
}
/* Live's lists here are WordPress `wp-block-list`, whose margin is NOT the 8.5px
   paragraph rhythm: measured `margin: 0 0 25.5px` (25.5 = 1.5 x the 17px font).
   Getting this wrong made every opened FAQ panel 17px short — the whole of that
   discrepancy, nothing to do with live's inner answer wrapper. */
.faq__a ul,
.faq__a ol { margin: 0 0 25.5px; padding-left: 22px; }
.faq__a li { font-size: 17px; line-height: 27.2px; color: var(--text); }


/* ==========================================================================
   §9. INNER-PAGE HERO — full-bleed gradient photo band
   ==========================================================================
   Measured on /educational-counseling/ at a 1890 content width. Every length
   below is a percentage because the pixel values divide EXACTLY into the band's
   1850 content box, which is how you can tell live authored them that way:
       inner width  915.75 / 1850 = 49.5%
       margin-left     111 / 1850 = 6%
       margin-right     37 / 1850 = 2%
   So the headline block sits left of centre by design, not by accident.

   The h1 is WHITE and the h2 below it BLACK, over the same gradient — odd, but
   that is live. Each page supplies its own gradient via an inline
   background-image on the section; kept inline so the per-page value sits next
   to the page it belongs to, and so it cannot be wiped by a later background
   shorthand (the trap noted at the top of this file).
   ========================================================================== */
.page-hero {
  display: flex;
  min-height: 420px;
  padding: 0 var(--gutter);
  background-repeat: no-repeat;
  background-position: 50% 0%;
  background-size: cover;
}
/* Live's landing hero is TWO columns, not one: this 49.5% copy column and a
   40.5% column holding the programme illustration. That second column was
   missing until it was measured directly - it is EMPTY, with the artwork as a
   CSS background, so it contributes no height, and the hero's own min-height
   supplies the 420. The band therefore measured correctly on three pages while
   the illustration was absent from all of them. Heights are not enough. */
.page-hero__art {
  width: 40.5%;                     /* 749.3 of 1850 */
  margin-left: 2%;                  /* 37 */
  background-repeat: no-repeat;
  background-position: left bottom;
  background-size: contain;
}
.page-hero__inner {
  width: 49.5%;
  margin: 0 2% 0 6%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 20px;
}
.page-hero h1 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 65px;
  line-height: 76px;
  font-weight: 400;
  color: var(--white);
  text-align: center;
}
/* Live marks this up as an h2. It is the page's standfirst, so it keeps the
   heading level but not the display font. */
.page-hero__sub {
  margin: 8px 0;
  /* An h2, so it would otherwise inherit Quando from the global heading rule.
     Live sets this one in the body font. */
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  /* White: every one of these sits on a dark gradient hero. It was
     var(--text) (#000), which read as near-invisible on eight of the nine pages
     using it - David, 2026-08-25: "most all of the subtext areas are black
     instead of white".

     EXCEPTION: /educational-counseling/ is BLACK on live, on the same dark green
     hero as its own white h1. I assumed that was an editor's slip and made it
     white; David checked and confirmed live is intended - "The Educational
     Counseling page did have black subtext and it should have stayed. The rest
     are white." Hence the --dark modifier below. Reproduce live, don't correct
     it.

     NOTE the same four declarations appear in four other rules
     (.content-row__aside h2, .prog h2, .res-card h3, .cform-band__aside h2).
     Those sit on LIGHT backgrounds, so black is correct there - do not
     "consistently" change them. */
  color: var(--white);
  text-align: center;
}

/* Live's /educational-counseling/ only. See the note in .page-hero__sub. */
.page-hero__sub--dark { color: var(--text); }


/* ==========================================================================
   §10. CONTENT BANDS — the centred 1100 column used by the inner pages
   ==========================================================================
   Same two-element pattern as the homepage sections: a full-bleed outer that
   carries the gutter, and an inner capped at --content. Live's row is exactly
   1100 wide with `padding: 30px 0`, so the vertical padding belongs on the
   inner and the horizontal gutter on the outer.
   ========================================================================== */
.content-band { padding: 0 var(--gutter); }
.content-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0;
}

/* Two columns, 61.5625% / 33.4375% with a 5% gap — they sum to exactly 100%.
   The odd fractions are live's own computed values, not rounded guesses. */
.content-row {
  display: flex;
  align-items: flex-start;
  column-gap: 5%;
}
.content-row__main {
  width: 61.5625%;
  display: flex;
  flex-direction: column;
  gap: 20px;
}
.content-row__aside {
  width: 33.4375%;
  /* A FLEX COLUMN on live, and that is load-bearing: flex items do not collapse
     margins, so the heading's 8px bottom margin and the first paragraph's 8.5px
     top margin both survive. As a plain block they collapsed to 8.5 and the
     column came out 8px short. */
  display: flex;
  flex-direction: column;
  /* The sparkle sits top-left at 18% of the column's width, and the 60px left
     padding is what keeps the text clear of it. */
  padding: 23px 0 0 60px;
  background: url("/assets/images/icon_insp_cta.png") 0 0 / 18% no-repeat;
}
.content-row h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}
/* The aside's heading is NOT the display font — live sets it in Roboto 20/28
   w500 black, the same treatment as a sub-heading. */
.content-row__aside h2 {
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--text);
}
.content-row ul { margin: 0 0 25.5px 51px; padding: 0; list-style-type: disc; }
.content-row__aside p { margin: 8.5px 0; }


/* ==========================================================================
   §11. FAQ BAND — the eyebrow + title above an accordion (8 pages)
   ==========================================================================
   The eyebrow is uppercased by CSS, not in the content: live's theme carries
   `.pre-sub-header { text-transform: uppercase !important }` and the source
   text is title case. Keeping the markup in title case means screen readers
   say "Educational Counseling", not a string of capitals.
   ========================================================================== */
.faq-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0 40px;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.faq-band__head {
  width: 594px;
  max-width: 100%;
  padding: 10px;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.faq-band__eyebrow {
  margin: 8px 0;
  font-family: var(--font-body);   /* an h2 - must override the display font */
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--navy);
  text-transform: uppercase;
  text-align: center;
}
.faq-band__title {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
  text-align: center;
}
.faq-band__list { width: 100%; }

/* ==========================================================================
   §12  INTRO BAND  —  /cda-scholarships/ section 2
   Cream band of prose beside a stack of anchor buttons. All values measured
   against live at 1905 (content 1100).
   Columns are 679.25 and 365.75 of the 1100 inner with a 5% gap, i.e.
   61.75% + 33.25% + 5% = exactly 100%.
   ========================================================================== */

.intro-band { background: #FDEFBF; padding: 0 var(--gutter); }

.intro-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0;
  display: flex;
  /* stretch, i.e. the default — live lets both columns run the full height of
     the taller one. flex-start left the copy column at its own 95px. */
  column-gap: 5%;
}

.intro-band__text { width: 61.75%; }
/* /academic-scholarships/ has no jump buttons, so its copy runs the whole
   1100 column instead of 61.75% of it. Same band, one column. */
.intro-band__text--full { width: 100%; }
/* 8.5px, not 0. Live's copy column is 108 tall but its paragraph is only 78 —
   the 15px of slack is the paragraph's own margins, and dropping them shifted
   the copy up against the band's padding. The column is not what drives the
   band's height (the button stack is), so this never showed up as a height
   error, only as misplaced text. */
.intro-band__text p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }

/* Live's buttons column carries a 10px top margin, and its two buttons are
   wider than the column so they wrap one per line with a 20px gap
   (39 + 20 + 39 = the 98px live measures). */
.intro-band__actions {
  width: 33.25%;
  margin-top: 10px;
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  align-content: flex-start;
}

/* ==========================================================================
   §13  DISCOVER CARD GRID  —  /cda-scholarships/ section 4
   Four cards of icon + heading + button.

   NOT the homepage's .program-grid: those cards have an h2 and a paragraph,
   these have an h3 and no prose, so they are separate components.

   ⚠ Live's two rows are DIFFERENT WIDTHS, and the reason is structural rather
   than cosmetic. Row 1 is not a sibling of the heading — the heading and row 1
   sit together inside a wrapper (__group), and row 1 is additionally nested in
   a container carrying 10px padding (__pad). That padding is what makes row 1's
   cards 500px while row 2's are 510px.

   It matters because the nesting changes the vertical arithmetic, not just the
   widths. Live's 806 is:

       30              inner padding-top
     + 15              __group margin-top
     + 403             __group  = 60 title + 20 gap + 323 __pad
     + 15              __group margin-bottom
     + 243             row 2
     + 60              row 2 margin-bottom
     + 40              inner padding-bottom
     -----
       806

   and __pad's 323 is 10 + 243 + 60 + 10. Flattening the heading and both rows
   into three siblings — the obvious reading of the design — collapses the 15px
   margins and the nested 60, and came out 74px short. Reproduced as live has it.
   ========================================================================== */

.disc-grid { padding: 0 var(--gutter); }

.disc-grid__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0 40px;
  display: flex;
  flex-direction: column;
}

/* FLEX, not block, and that is load-bearing: the title's 8px bottom margin and
   __pad's 20px top gap have to both survive. As a block they would collapse to
   20 and the group would land 8px short. */
.disc-grid__group {
  margin: 15px 0;
  display: flex;
  flex-direction: column;
  row-gap: 20px;
}
.disc-grid__pad { padding: 10px; }

/* Live marks this heading up as an h1, which would be a second h1 on a page
   that already has one in the hero. Kept as an h2 for correct document
   outline; the type is identical either way. */
.disc-grid__title {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 32px;
  line-height: 44px;
  font-weight: 400;
  color: var(--navy);
}

.disc-grid__row {
  display: flex;
  column-gap: 80px;
  margin: 0 0 60px;
}
.disc-grid__row > * { flex: 1 1 0; min-width: 0; }

.disc-card { display: flex; flex-direction: column; }

/* VERIFIED against live: height 150px with object-fit: contain, so the icons
   letterbox inside the card width rather than stretching or cropping. */
.disc-card img {
  width: 100%;
  height: 150px;
  object-fit: contain;
  object-position: center;
}

/* 8px margins, giving live's 44px heading block — 150 + 44 + 10 + 39 = the 243
   each card measures. */
.disc-card h3 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: #000;
}
.disc-card h3 a { color: inherit; text-decoration: none; }
.disc-card h3 a:hover { color: var(--blue); }

.disc-card .btn { align-self: center; margin-top: 10px; }

/* ==========================================================================
   §14  DOWNLOAD-GUIDE BAND  —  shared library block
   Copy beside a thumbnail of the PDF's first page. Columns are 660 / 440 of
   the 1100 inner with NO gap.

   ⚠ Live's markup has THREE buttons; two of them ("Download English Version",
   "Descargar la versión en español") measure 0x0 on desktop because they are
   the mobile-only variants. Only the single "Download" is built here — the
   other two belong with the mobile work.

   ⚠⚠ The thumbnail is NOT an <img> on live. Its column is an empty container
   with the guide's cover as a CSS background at `61% auto`, top centre. That
   is the whole reason this band is 302 and not taller: the column contributes
   NO height of its own, so the band is driven entirely by the copy column, and
   the graphic is simply clipped where the band ends. Building it as an <img>
   put the band 547px over — as an <img> the 558x1064 portrait file fills the
   440 column and wants 839px of height in what should be a 292px box.
   ========================================================================== */

.dl-band { background: #E0EECF; padding: 0 var(--gutter); }

.dl-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0;
  display: flex;
  /* No column-gap: live's two columns are exactly 660 + 440 = the full 1100.
     align-items stays at stretch so the thumbnail column fills the height. */
}

.dl-band__text { width: 60%; margin: 15px 0; display: flex; flex-direction: column; }
/* -2px bottom, which looks odd and is deliberate: live wraps this heading in a
   container carrying `margin-bottom: -10px`, pulling the 44px heading block up
   to 34 so the title sits tighter beneath it. 8 + 28 - 2 = 34. */
.dl-band__eyebrow {
  margin: 8px 0 -2px;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--navy);
}
.dl-band__title {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 32px;
  line-height: 44px;
  font-weight: 400;
  color: var(--navy);
}
.dl-band__text p { margin: 0.5em 0; font-size: 17px; line-height: 26px; }
/* 34 + 60 + 69 + 49 = the 212 live's copy column measures. */
.dl-band__text .btn { align-self: flex-start; margin-top: 10px; }

/* Live pulls the thumbnail out of the band's padding, -20px at the top and
   -30px at the bottom, so it overhangs the copy column. Stretching plus those
   negative margins is what gives it live's 440x292 box. */
.dl-band__thumb {
  width: 40%;
  margin: -20px 0 -30px;
  background-image: url("/assets/images/7-Steps-CDA-r.png");
  background-position: top center;
  background-repeat: no-repeat;
  background-size: 61% auto;
}

/* /cda-scholarships/'s closing prose band takes 50px of bottom padding rather
   than the shared 30px. Its heading is BLACK here, not the navy used elsewhere
   — measured, not assumed. */
.content-band--prose .content-band__inner { padding: 30px 0 50px; }
.content-band--prose > .content-band__inner > h2 {
  font-size: var(--h-size);
  line-height: var(--h-line);
  color: var(--text);
}
/* flow-root so the paragraphs' 8.5px margins stay INSIDE this block. Without
   it the first paragraph's top margin escapes and collapses with the heading's
   8px bottom margin, losing 8px off the band. */
.content-band__prose { display: flow-root; }
.content-band__prose p { margin: 0.5em 0; font-size: 17px; line-height: 26px; }
/* The WordPress block list default: indented by margin rather than padding, and
   carrying a 25.5px bottom margin instead of the paragraph rhythm — the same
   value that had the FAQ panels 17px short before it was measured. */
.content-band__prose ul { margin: 0 0 25.5px 51px; padding: 0; }
.content-band__prose li { margin-left: 25.5px; line-height: 26px; }


/* ==========================================================================
   §15  SUB-PAGE HERO  —  the seven programme DETAIL pages
   ==========================================================================
   Shorter and smaller-typed than the landing pages' §9 hero: 245.2 tall
   against 420, and the headline is Quando 42/52 rather than 65/76. The height
   is driven entirely by the icon column (20 + 205.2 + 20), so it moves if the
   icon does. The gradient file is per page and set inline, same as §9.
   ========================================================================== */
.subpage-hero {
  display: flex;
  padding: 0 var(--gutter);
  background-repeat: no-repeat;
  background-position: 50% 0%;
  background-size: cover;
}
.subpage-hero__inner {
  max-width: var(--content);
  margin: 0 auto;
  width: 100%;
  padding: 20px 0;
  display: flex;
  justify-content: space-between;
}
.subpage-hero__text {
  width: 70%;                       /* 770 of 1100 */
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
}
.subpage-hero h1 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 42px;
  line-height: 52px;
  font-weight: 400;
  color: var(--white);
}
.subpage-hero__icon { width: 30%; }  /* 330 of 1100 */
.subpage-hero__icon img { width: 100%; height: auto; }


/* ==========================================================================
   §16  TITLE + FAQ-LINK BAND  —  detail pages
   ==========================================================================
   A standfirst paragraph, then a small icon beside an in-page link down to the
   page's own FAQ section.
   ========================================================================== */
.title-band { padding: 0 var(--gutter); }
.title-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 40px 0 0;
}
.title-band__inner > p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.title-band__faq { display: flex; gap: 10px; }
.title-band__faq svg {
  flex: 0 0 25px;
  width: 25px;
  height: 25px;
  fill: var(--navy);
  margin-top: 8px;
}
.title-band__faq p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.title-band__faq a { color: var(--blue); text-decoration: none; }
.title-band__faq a:hover { text-decoration: underline; }


/* ==========================================================================
   §17  APPLY / RENEW CTA PAIR  —  the most-reused detail-page block
   ==========================================================================
   Two dark-green panels side by side, 440 wide each with a 5% gap, so the pair
   totals 935 and is CENTRED inside the 1100 column rather than filling it.

   align-items: stretch is load-bearing — the cards carry different amounts of
   copy and live shows them equal height, driven by the taller (Renew).

   The heading is flanked by two sparkle graphics, and the button is YELLOW with
   WHITE text, not the navy used elsewhere on the site.
   ========================================================================== */
.cta-pair { padding: 0 var(--gutter); }
.cta-pair__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0;
  display: flex;
  justify-content: center;
  align-items: stretch;
  column-gap: 5%;
}
.cta-card {
  width: 40%;                       /* 440 of 1100 */
  padding: 20px 0;
  background: var(--green-dark);
  display: flex;
  flex-direction: column;
}
/* text-align centres the button as well as the copy, which align-self cannot:
   the .btn is a child of THIS block, not of the flex .cta-card, so align-self
   on it was inert. Live does the same thing - its button wrapper carries
   text-align: center. */
.cta-card__body { padding: 10px 30px; text-align: center; }
/* /academic-scholarships-college/ pads its cards 20 top / 30 bottom with NO
   vertical inset on the body, where /academic-scholarships-tcsg/ uses 20/20 with
   a 10px body inset. Same block, genuinely different padding on the two pages —
   worth 10px, and the reason this page came out over on its first build. */
.cta-card--pad-b30 { padding: 20px 0 30px; }
.cta-card--pad-b30 .cta-card__body { padding: 0 30px; }
.cta-card__head {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 15px;
}
.cta-card__head h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 32px;
  line-height: 44px;
  font-weight: 400;
  color: var(--white);
}
/* The two sparkles render 63x39.4 and 68x42.5 on live from the same 259x161
   source, so they are sized individually rather than sharing one rule. */
.cta-card__head img { height: auto; }
.cta-card__head img:first-child { width: 63px; }
.cta-card__head img:last-child  { width: 68px; }
/* Copy and button are CENTRED in these cards (QC team, 2026-08-22). Checked on
   live across the Academic, Montessori and CDA pages, and on both card shapes -
   the Apply/Renew pair AND the single Apply card beside the intro copy - so it
   belongs on the shared .cta-card rather than on a page modifier. */
.cta-card p { margin: 8.5px 0; font-size: 17px; line-height: 26px; color: var(--white); text-align: center; }
.cta-card .btn {
  border-width: 0;
  background: var(--yellow);
  border-color: var(--yellow);
  color: var(--white);
}
.cta-card .btn:hover,
.cta-card .btn:focus-visible {
  background: var(--white);
  border-color: var(--white);
  color: var(--navy);
}


/* ==========================================================================
   §18  APPLICATION WINDOWS
   ==========================================================================
   A heading across the full column, then three date columns that are INSET
   from it — they begin 115px in, not at the column edge. The sub-headings are
   --green-dark, not the navy used for headings elsewhere.
   ========================================================================== */
.windows { padding: 0 var(--gutter); }
/* FLEX so the heading's 8px bottom margin survives against the columns' 10px
   top margin — live's heading block is a full 60. As a plain block they collapse
   to 10 and the band lands 8px short.
   ⚠ /academic-scholarships-tcsg/ and -college/ passed this band BEFORE this fix
   only because two errors cancelled: their date columns were 8.5px too tall
   (unwrapped) which offset the 8px lost here. Both are now correct for the right
   reason — the date pairs are wrapped on those pages too. */
.windows__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 5px 0 40px;
  display: flex;
  flex-direction: column;
}
.windows h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}
.windows__cols {
  display: flex;
  padding: 0 115px;                 /* what insets the three columns */
  /* NO gap: live's columns are contiguous (measured 498..790, 790..1085,
     1085..1378). That matters now the dividers exist - with a gap, a border on
     the column's left edge sits on the FAR side of it and reads as hugging the
     next column's text, which is exactly what the QC team saw. */
  column-gap: 0;
  margin-top: 10px;
}
/* text-align: center - live centres the heading and the dates inside each
   column, so each divider sits midway between the two texts either side of it.
   Left-aligned (our previous state) pushed every column's text hard against its
   own left edge, leaving the divider almost touching the text to its right. */
.windows__col {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
  padding: 0 5px;
  text-align: center;
}
/* Dividers between the date columns (QC team, 2026-08-22).

   Live draws them as borders on the MIDDLE column - left AND right on the
   3-column semester version, and on cols 2 and 3 of the 4-column quarterly one.
   A left border on every column after the first lands the lines in exactly the
   same places for both, without needing to know how many columns there are.

   The colour differs by page family, and that is live's own doing: --green-dark
   on the semester pages, the lighter --green on the CDA quarterly ones. */
.windows__col + .windows__col { border-left: 1px solid var(--green-dark); }
.windows--q .windows__col + .windows__col { border-left-color: var(--green); }
.windows__col h3 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--green-dark);
}
.windows__col p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
/* The QUARTERLY variant's headings are NAVY, not the dark green the semester
   ones use. Live: "1st Quarter 2026" is rgb(36,54,110) on the three CDA pages,
   while "Spring Semester 2026" is rgb(11,102,55) on the Academic ones. Ours had
   been dark green in both, so the three quarterly pages were wrong.
   `.windows--q` already marks exactly those three pages, and already carries a
   different divider colour, so the palette split is where it belongs. */
.windows--q .windows__col h3 { color: var(--navy); }



/* ==========================================================================
   §19  GET STARTED IN 3 EASY STEPS
   ==========================================================================
   Mint band. A heading, then three columns of 347 with 30px gaps. The step
   numbers are 212x212 files that render at 81x81 — a size stated nowhere in
   any stylesheet, only observable once the lazy image is forced to load.
   ========================================================================== */
.steps { background: var(--tint-mint); padding: 0 var(--gutter); }
/* Live's arithmetic, from the container offsets: 30 above the heading, the
   heading block 60, a 20px gap, the row 289, then 60 BELOW the row = 459.
   Flex column so the heading's 8px margins survive inside its own block, the
   way Elementor's widget wrapper makes them. */
.steps__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0 60px;
  display: flex;
  flex-direction: column;
  row-gap: 20px;
}
.steps h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}
.steps__row { display: flex; column-gap: 30px; }
.steps__col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 20px; }
.steps__col img { width: 81px; height: auto; margin: 0 auto; }
.steps__col p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.steps__col .btn { align-self: flex-start; border-width: 0; }


/* ==========================================================================
   §20  ELIGIBILITY BAND  —  "Am I eligible?"
   ==========================================================================
   Cream band. Heading and intro at the full column width, then one group per
   criterion: each INSET 65px, with a 25px navy SVG icon and a 990-wide content
   column beside it.

   The list indentation is live's own and looks like a mistake but is not: the
   ul carries margin-left 51px AND each li a further 25.5px.

   ⚠ Some copy in these groups is BARE TEXT with no <p> wrapper — Elementor
   emits single-paragraph text-editor content unwrapped. Leave it bare; adding
   a <p> introduces a paragraph margin live does not have.
   ========================================================================== */
.elig { background: var(--highlight); padding: 0 var(--gutter); }
.elig__inner {
  max-width: var(--content);
  margin: 0 auto;
  /* Live's is 30 top / 20 bottom. An earlier version had these reversed: the
     total was the same 50, so every page's band height matched and the error
     went unnoticed until a page turned up needing 30/30 and the modifier that
     set only the bottom left it 10px short. */
  padding: 30px 0 20px;
  display: flex;
  flex-direction: column;
}
.elig > .elig__inner > h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}
/* NOT body prose: live sets this intro at 20/28 with 10px margins, so it wraps
   to two lines at 1100 and the block measures 76. At 17/26 it fits on one line
   and the band comes out 33px short. */
.elig__intro { margin: 10px 0; font-size: 20px; line-height: 28px; }
/* /cda-application-fee-scholarships/ closes the band with a note that sits
   OUTSIDE the last group, as its own 10px-padded block, and is set at 18px —
   larger than the 17px used for prose elsewhere. 10 + 9 + 78 + 9 + 10 = 116. */
.elig__note { padding: 10px; }
.elig__note p { margin: 9px 0; font-size: 18px; line-height: 26px; }
/* The High School page has a single group and closes the band with a 10px gap
   below it rather than extra inner padding. */
.elig__group--gap-b10 { margin-bottom: 10px; }
.elig__group { padding-left: 65px; display: flex; gap: 20px; }
.elig__group svg {
  flex: 0 0 25px;
  width: 25px;
  height: 25px;
  fill: var(--navy);
  margin-top: 12px;
}
.elig__body { width: 990px; max-width: 100%; display: flex; flex-direction: column; }
/* Sub-headings are the BODY font at 20/28, not the display font. */
.elig__body h2 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--navy);
}
.elig__body p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.elig__body ul { margin: 0 0 25.5px 51px; padding: 0; list-style-type: disc; }
.elig__body ul ul { margin: 0 0 0 25.5px; }
.elig__body li { margin-left: 25.5px; font-size: 17px; line-height: 26px; }
.elig__body a { color: var(--blue); }


/* ==========================================================================
   §21  DOWNLOAD BAND — dark-green variant (detail pages)
   ==========================================================================
   §14's band has a thumbnail column and sits on green tint with navy type.
   This variant has NO thumbnail, runs a single 1065-wide column centred in the
   1100, reverses the type to white, and uses a WHITE button with navy text.
   ========================================================================== */
.dl-band--green-dark { background: var(--green-dark); }
.dl-band--green-dark .dl-band__inner { justify-content: center; padding: 0; }
.dl-band--green-dark .dl-band__text {
  width: 96.8%;
  margin: 0;
  padding: 30px 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.dl-band--green-dark .dl-band__eyebrow { margin: 8px 0; }
.dl-band--green-dark .dl-band__eyebrow,
.dl-band--green-dark .dl-band__title,
.dl-band--green-dark .dl-band__text p { width: 57%; }   /* 1065 of 1100 */
.dl-band--green-dark .dl-band__eyebrow,
.dl-band--green-dark .dl-band__title,
.dl-band--green-dark .dl-band__text p { color: var(--white); }
.dl-band--green-dark .btn {
  align-self: flex-start;
  border-width: 0;
  /* §14 gives the actions row a 10px top margin; live's button here has none,
     and the column's 10px gap already provides the spacing. */
  margin-top: 0;
  background: var(--white);
  border-color: var(--white);
  color: var(--navy);
}
.dl-band--green-dark .btn:hover,
.dl-band--green-dark .btn:focus-visible {
  background: var(--yellow);
  border-color: var(--yellow);
  color: var(--navy);
}


/* /educational-counseling/ has a 594px head box; the detail pages' eyebrows are
   longer and live lets them run their natural width, centred. Constraining them
   to 594 wraps the eyebrow to two lines and puts the band 28px over. */
.faq-band__head--wide { width: auto; max-width: 100%; padding: 10px 0; }


/* ==========================================================================
   §22  INTRO + APPLY CARD BAND  —  the CDA detail pages
   ==========================================================================
   The CDA detail pages do NOT give the Apply card a band of its own the way the
   Academic pages do. It sits beside the intro copy: a 627 text column and a 418
   card with a 5% gap, band padding 40px 0 20px.

   The card is GREEN (--green #83BC41), not the Academic pages' dark green, it
   is 418 wide rather than 440, and it does NOT stretch — it is shorter than the
   text column, so `align-items` must stay at its default rather than stretch.
   ========================================================================== */
.intro-cta { padding: 0 var(--gutter); }
.intro-cta__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 40px 0 20px;
  display: flex;
  align-items: flex-start;
  column-gap: 5%;
}
.intro-cta__text {
  width: 57%;                       /* 627 of 1100 */
  display: flex;
  flex-direction: column;
}
.intro-cta__lead p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
/* Live gives this block its own 10px padding and a 20px internal gap. */
/* TWO nested 10px paddings on live, not one: the block pads 10, and an inner
   wrapper pads 10 again, which narrows the paragraph to 587 and wraps it to two
   lines. 10 + 10 + (52+17) + 20 gap + 39 button + 10 + 10 = live's 168. */
.intro-cta__guide { padding: 10px; }
.intro-cta__guide-inner {
  padding: 10px;
  display: flex;
  flex-direction: column;
  row-gap: 20px;
}
.intro-cta__guide p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.intro-cta__guide .btn { align-self: flex-start; }

/* /cda-renewal-scholarships/ puts a NOTICE in the same slot as the guide block:
   the same 10px padding, but a plain paragraph carrying its normal margins, so
   10 + 8.5 + 156 + 8.5 + 10 = 193. */
.intro-cta__note { padding: 10px; }
.intro-cta__note p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
/* Live's Apply button in this card sits 8px lower than the §17 pages'. */
/* Live sizes this Apply button and its spacing PER PAGE rather than from the
   shared .btn, so they are page modifiers, not properties of the block:

     /cda-training-scholarships/          23px/23px  47 tall  no margin
     /cda-application-fee-scholarships/   18px/18px  42 tall  no margin
     ...-high-school/                     15px/15px  39 tall  10px margin-top

   An earlier version produced cda-training's 47 from the 15px shared button
   plus an 8px margin — right total, wrong box — which hid a 5px error until a
   page came along where the card, not the text column, drove the band height. */
.intro-cta__card--btn23 .btn { font-size: 23px; line-height: 23px; }
.intro-cta__card--btn18 .btn { font-size: 18px; line-height: 18px; }
/* The High School page sets its card paragraph flush (margin 0, so its 4 lines
   measure exactly 104) and puts the 10px gap above the button instead. */
.intro-cta__card--flush p { margin: 0; }
.intro-cta__card--flush .btn { margin-top: 10px; }
/* ...and that page separates the band from the one below with a real margin
   rather than padding, which is why its four bands sum 30px short of the page. */
.intro-cta--gap-b30 { margin-bottom: 30px; }
/* It also pads the band 40/30 rather than the parent page's 40/20 — so the two
   pages differ by 10px of padding AND 30px of margin in the same place. */
.intro-cta--pad-b30 .intro-cta__inner { padding-bottom: 30px; }
.intro-cta__card { width: 38%; }    /* 418 of 1100 */

/* The green variant of the §17 card. */
.cta-card--green { background: var(--green); }
.cta-card--navy  { background: var(--navy); }


/* ==========================================================================
   §23  APPLICATION WINDOWS — QUARTERLY variant
   ==========================================================================
   Same §18 block with FOUR columns instead of three. The quarterly set is not
   inset the way the semester set is — four columns need the full width — so the
   115px side padding is dropped here.
   ========================================================================== */
/* Four columns need the full width, so the semester version's 115px side
   padding is dropped. The band also pads 10px at the top here, not 5. */
.windows__cols--quarterly { padding: 0; column-gap: 0; }
.windows--q .windows__inner { padding: 10px 0 40px; }
/* The two dates share a wrapper so they collapse against each other but not
   against the h3. flow-root keeps BOTH of the pair's outer 8.5px margins inside
   the wrapper — without it the last one escapes and the column lands 8px short
   of live's 121.5. Same trick as the footer's text block. */
.windows__col > div { display: flow-root; }


/* ==========================================================================
   §24  TRAILING SPACER
   ==========================================================================
   Several detail pages end with an empty 20px band on live. It carries no
   content and no background; reproduced only so the body total matches.
   ========================================================================== */
.page-tail { height: 20px; }


/* The detail pages set their FAQ band white explicitly; /educational-counseling/
   leaves it transparent. Identical over a white page, but recorded as live has it. */
.faq-band--white { background: var(--white); }


/* ==========================================================================
   §25  CROSS-LINK BAND  —  "see the other variant of this programme"
   ==========================================================================
   Green-tint band pairing a heading, a paragraph and a Learn more button with
   an icon. Columns are 679 / 366 of the 1100 inner with a 5% gap, and the
   IMAGE column drives the height (306.2 = 30 + 236.2 + 40), so the band moves
   if the icon size does. Band padding 30px 0 40px.
   ========================================================================== */
.xlink { background: var(--tint-green); padding: 0 var(--gutter); }
.xlink__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0 40px;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  column-gap: 5%;
}
.xlink__text {
  width: 61.7%;                     /* 679 of 1100 */
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
.xlink__text h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}
.xlink__text p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.xlink__text .btn { margin-top: 10px; }
.xlink__image { width: 33.3%; padding: 10px; }   /* 366 of 1100 */
.xlink__image img { width: 100%; height: auto; }


/* ==========================================================================
   §26  /montessori-scholarships/  —  the block variants unique to this page
   ==========================================================================
   The only programme page that pairs a LANDING hero (§9, 65/76 headline) with
   the detail pages' body blocks, so several shared blocks need a variant here.
   ========================================================================== */

/* --- §16 title band ------------------------------------------------------- */
/* Live's standfirst is a bare text run inside its widget, not a <p>, so it
   carries no margins at all: two lines measure exactly 52. Built as a plain
   <div> for the same reason — a <p> would add 17px the band does not have. */
.title-band__lead { font-size: 17px; line-height: 26px; }

/* --- §17 CTA pair, wide variant ------------------------------------------- */
/* The two cards fill the column here (539 each, 2% gap) instead of the 440/5%
   pair that is centred on the Academic pages, and the band pads 40/30 not 30/30.
   The sparkles either side of the heading are bigger to match: 81.2 and 86.2
   against §17's 63 and 68, from the same two source files. */
.cta-pair--wide .cta-pair__inner { padding: 40px 0 30px; column-gap: 2%; }
.cta-pair--wide .cta-card { width: 49%; }          /* 539 of 1100 */
.cta-pair--wide .cta-card__head img:first-child { width: 81.2px; }
.cta-pair--wide .cta-card__head img:last-child  { width: 86.2px; }
/* Card 1 keeps §17's dark green; card 2 is the lighter --green. */

/* --- §18 Application Windows --------------------------------------------- */
/* 25px above the heading rather than the shared 5px. */
.windows--pad-t25 .windows__inner { padding: 25px 0 40px; }

/* --- §20 eligibility ------------------------------------------------------ */
/* Padded 30/30 here, where the CDA pages close the band with 20. */
.elig--pad-b30 .elig__inner { padding-bottom: 30px; }

/* --- §14 download band, thumbnail variant -------------------------------- */
/* Same block as /cda-scholarships/ but on NO background instead of green tint,
   with a 5% gap between 57% and 38% columns, and the thumbnail pulled a little
   less far out of the band (-10 rather than -20 at the top).

   As in §14 the thumbnail column is EMPTY and stretched: it contributes no
   height of its own, so the copy column alone sets the band. 30 + (15 + 256 +
   15) + 30 = 346. */
.dl-band--plain { background: none; }
.dl-band--plain .dl-band__inner { column-gap: 5%; }
.dl-band--plain .dl-band__text { width: 57%; }     /* 627 of 1100 */
.dl-band--plain .dl-band__thumb {
  width: 38%;                                      /* 418 of 1100 */
  margin: -10px 0 -30px;
  background-image: url("/assets/images/montessori-schol-flyer-2025-r.png");
  background-size: 78% auto;
}

/* --- closing prose band, dark green -------------------------------------- */
/* "What is Montessori?" — reversed out of --green-dark, padded 25/50, with the
   link white and bold rather than the usual blue. */
.content-band--green-dark { background: var(--green-dark); }
.content-band--green-dark .content-band__inner { padding: 25px 0 50px; }
.content-band--green-dark h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--white);
}
.content-band--green-dark .content-band__prose p { color: var(--white); }
.content-band--green-dark .content-band__prose a { color: var(--white); font-weight: 700; }


/* ==========================================================================
   §27  /other-programs/  —  a title, a standfirst, and nine programme entries
   ==========================================================================
   The only page with NO hero of any kind. Its first two bands are plain boxes
   carrying a `min-height: 120px` on live, which is where their empty lower half
   comes from — the copy alone accounts for 68 and 120 respectively.
   ========================================================================== */
.head-band,
.lede-band { padding: 0 var(--gutter); min-height: 120px; display: flex; }
.head-band__inner,
.lede-band__inner { max-width: var(--content); margin: 0 auto; width: 100%; }
.head-band h1 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 42px;
  line-height: 52px;
  font-weight: 400;
  color: var(--navy);
}
.lede-band p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }

/* The entries sit in a column that is NOT the full 1100 and is NOT centred:
   889.1 wide, flush with the column's left edge. */
.prog-list { padding: 0 var(--gutter); }
.prog-list__inner { max-width: var(--content); margin: 0 auto; padding: 0 0 50px; }
/* The column carries its OWN 10/30 padding on top of the inner's 50 bottom, so
   the band is entries(2436) + 40 + 50 = 2526. Each entry pads 10/30 as well —
   the same values at two levels, which is easy to apply once and call done. */
.prog-list__col { width: 80.83%; padding: 10px 0 30px; }   /* 889.1 of 1100 */

/* A flex column so the h2's 8px margin and the paragraph's 8.5px do not
   collapse into each other — live's blocks measure a full 44 and 147. */
.prog {
  padding: 10px 0 30px;
  display: flex;
  flex-direction: column;
}
.prog h2 {
  margin: 8px 0;
  /* Body font, not the display face, and BLACK rather than the navy used for
     headings elsewhere on the site. */
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--text);
}
.prog p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
/* Yellow with NAVY text (§ .btn--cta) and no border, so 39 rather than 41. Two
   entries carry two of these; they stack, each with its own 10px top margin. */
.prog .btn { align-self: flex-start; margin-top: 10px; border-width: 0; }


/* ==========================================================================
   §28  /cda-trainer/  —  three prose bands under a sub-page hero
   ==========================================================================
   All three body bands are the §12 content band with 50px of bottom padding
   instead of 30, and their headings are NAVY Quando (the `--prose` variant used
   on /cda-scholarships/ sets its heading black, so that one does not apply).
   ========================================================================== */
.content-band--pad-b50 .content-band__inner { padding: 30px 0 50px; }
.content-band--tint-green { background: var(--tint-green); }
.content-band--pad-b50 > .content-band__inner > h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}

/* The portal band's two columns: 530 each of the 1080 that is left after the
   row's own 10px padding, so `flex: 1` with a 20px gap gives live's widths
   without hard-coding a percentage. The MEDIA column is the taller of the two
   (163.4) and the text column stretches to it. */
/* Both columns are 530 of the 1080 left inside the row's own 10px padding.
   `flex: 1 1 0` will NOT do it: it splits only the FREE space, and the media
   column's own 10px padding is outside that basis, so it comes out 20px wider
   than the text column and the thumbnail with it. Explicit widths instead. */
.portal-row { padding: 10px; display: flex; column-gap: 20px; }
.portal-row__text { width: 49.0741%; min-width: 0; }   /* 530 of 1080 */
.portal-row__text p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.portal-row__text ul { margin: 0 0 25.5px 51px; padding: 0; }
.portal-row__text li { margin-left: 25.5px; line-height: 26px; }
.portal-row__media { width: 49.0741%; min-width: 0; padding: 10px; }
/* Live renders this 16:9 thumbnail at HALF the width of its column - 255 of
   510 - not full width. The extracted file is 510 wide, so 50% also happens to
   serve it at its natural size. */
.portal-row__media img { width: 50%; height: auto; }
/* Live's "Watch the Video" widget sits 10px below the row, making its block 49
   rather than 39 - the whole of the difference on this band. */
.content-band--tint-green > .content-band__inner > .btn { margin-top: 10px; }


/* ==========================================================================
   §29  /resources/  —  the download-card grid
   ==========================================================================
   The largest page on the site, and the one where reading the HTML tells you
   least: EVERY card thumbnail is a CSS background on an empty div, not an
   <img>. Eighteen of them. Only one card on the whole page uses a real <img>
   (the "All Programs Video" placeholder), and that one is the odd case rather
   than the rule.

   Card anatomy, which holds across all three bands:

       thumb wrapper   210   (10px top padding + a 200-tall background box)
       h3              44    one line; 72 where the title wraps to two
       button          49    39 + a 10px top margin, one per available format
       card padding    20    bottom only
       ------------------------------------------------------------------
       so 323 for the common one-button card, 372 with two, 351 with a
       two-line title.

   Rows are separated by a uniform 20px top margin — including the first, which
   is what makes the band arithmetic come out.
   ========================================================================== */

/* --- band 0: the page title, alone on a 30/30 band --- */
.res-head { padding: 0 var(--gutter); }
.res-head__inner { max-width: var(--content); margin: 0 auto; padding: 30px 0; }
.res-head h1 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: 42px;
  line-height: 52px;
  font-weight: 400;
  color: var(--navy);
}

/* --- bands 1-3 --- */
.res-band { padding: 0 var(--gutter); }
/* FLEX column, and that is load-bearing: as a plain block the h2's 8px bottom
   margin collapses with the first row's 20px top margin, and the lead's 8.5
   collapses too - 16.5px lost per band, which is exactly what these three bands
   came out short by. Live never collapses them because each of its blocks sits
   in a widget wrapper. */
.res-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 30px 0 50px;
  display: flex;
  flex-direction: column;
}
/* The Documents band closes with 70 rather than 50. */
.res-band--docs .res-band__inner { padding: 30px 0 70px; }
.res-band h2 {
  margin: 8px 0;
  font-family: var(--font-display);
  font-size: var(--h-size);
  line-height: var(--h-line);
  font-weight: 400;
  color: var(--navy);
}
.res-band__lead { margin: 8.5px 0; font-size: 17px; line-height: 26px; }

.res-row { margin-top: 20px; display: flex; column-gap: 6%; }
/* Live's own inconsistency: the FIRST row of the Instructional guides band gaps
   its cards 6% (66px), the five below it use a flat 20px and are half a pixel
   narrower, so their second column does not line up with the first row's.
   Reproduced rather than tidied. */
.res-row--tight { column-gap: 20px; }

.res-card {
  width: 47%;                       /* 517 of 1100 */
  padding: 0 0 20px;
  display: flex;
  flex-direction: column;
}
.res-row--tight .res-card { width: 46.9545%; }   /* 516.5 */
/* Band 2's last row wraps its cards in another container that adds 20 more. */
.res-row--pad40 .res-card { padding-bottom: 40px; }

/* min-height rather than a fixed height: the background cards reach 210 on
   their own (10 + 200) and the one <img> card needs padding up to it. */
.res-card__thumb { min-height: 210px; padding: 10px 0 0; }
.res-card__thumb--img { padding: 0; }
.res-card__img {
  height: 200px;
  background-repeat: no-repeat;
  background-position: 50% 0%;
  background-size: 53%;
}
.res-card__img--center { background-position: 50% 50%; }
.res-card__img--s33 { background-size: 33%; }
.res-card__img--s40 { background-size: 40%; }
.res-card__thumb--img img { width: 50%; height: auto; }
.res-card h3 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--text);
}
.res-card p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.res-card .btn { align-self: flex-start; margin-top: 10px; }


/* ==========================================================================
   §30  /contact-us/  —  the Elementor Pro form, rebuilt
   ==========================================================================
   Two bands. The title band is §27's, with its inner padding removed so the
   120px min-height is what sets the height. The form band is 60% / 35% with a
   5% gap, and the FORM column drives it: 10 + 576 + 20 = 606, plus the aside's
   overhang, giving live's 616.

   The aside is pulled UP 20px and the band carries a 30px bottom MARGIN, so
   this page's two bands sum to 736 while the page occupies 766 — the same
   margin-not-padding trick as the CDA application-fee pages.

   Field geometry comes from Elementor's negative-margin gutter: the field
   wrapper is inset -5px each side and -10px at the bottom, and every item pads
   5px, which is what makes a "half" field 325 wide inside a 660 column. Keep
   the negative margins — without them every width is 10px out.
   ========================================================================== */

.head-band--flush .head-band__inner { padding: 0; }

.cform-band {
  padding: 0 var(--gutter);
  /* A real margin, not padding — live separates this band from the footer with
     30px that sits OUTSIDE the band box. */
  margin-bottom: 30px;
}
.cform-band__inner {
  max-width: var(--content);
  margin: 0 auto;
  padding: 10px 0 20px;
  display: flex;
  column-gap: 5%;
}
.cform-band__form { width: 60%; margin-top: 10px; }        /* 660 of 1100 */
/* Pulled up 20px so the decorative graphic overhangs the band, and inset 60px
   from the gap. The graphic is a BACKGROUND on this column — there is no <img>
   — so it adds no height and is clipped by the column, which stretches to the
   form's height. */
.cform-band__aside {
  width: 35%;                                              /* 385 of 1100 */
  margin-top: -20px;
  padding: 23px 0 0 60px;
  background-image: url("/assets/images/icon_insp_cta.png");
  background-repeat: no-repeat;
  background-position: 0 0;
  background-size: 18%;
}
.cform-band__aside h2 {
  margin: 8px 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 28px;
  font-weight: 500;
  color: var(--text);
}
.cform-band__aside p { margin: 8.5px 0; font-size: 17px; line-height: 26px; }
.cform-band__aside a { color: var(--blue); text-decoration: none; }
.cform-band__aside a:hover,
.cform-band__aside a:focus-visible { text-decoration: underline; }

/* --- the form ------------------------------------------------------------- */
.cform__fields { display: flex; flex-wrap: wrap; margin: 0 -5px -10px; }
.cform__item { width: 100%; padding: 0 5px; margin-bottom: 10px; }
.cform__item--half { width: 50%; }

.cform label {
  display: block;
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 26px;
  font-weight: 600;
  color: var(--text);
}
/* The required asterisk is decorative — the `required` attribute is what tells
   assistive tech, so the mark itself is hidden from it. */
.cform__req { color: var(--blue); }

.cform input,
.cform select,
.cform textarea {
  /* BLOCK, not the inline-block default. As inline-block the textarea sits on a
     baseline and the line's descender adds 7px UNDER it, which put the message
     row at 153 against live's 146. The inputs happened not to show it, so this
     is the kind of thing that looks like a mystery 7px until you measure the
     row rather than the control. */
  display: block;
  width: 100%;
  height: 59px;
  padding: 7px 20px;
  border: 1px solid #CCCCCC;
  border-radius: 0;
  background: var(--white);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 26px;
}
.cform textarea { height: 120px; resize: vertical; }
.cform input:focus-visible,
.cform select:focus-visible,
.cform textarea:focus-visible { outline: 2px solid var(--navy); outline-offset: 1px; }

/* 47 exactly, which the padding alone does not give — live sets the height. */
.cform button[type="submit"] {
  height: 47px;
  padding: 15px 30px;
  border: 0;
  border-radius: 0;
  background: var(--navy);
  color: var(--white);
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 15px;
  font-weight: 500;
  cursor: pointer;
}
.cform button[type="submit"]:hover,
.cform button[type="submit"]:focus-visible { background: var(--blue); }
.cform button[type="submit"][disabled] { opacity: 0.6; cursor: default; }

/* The v2 checkbox widget renders its own 304x78 iframe; the row is sized by it. */
.cform__captcha { min-height: 78px; }

.cform__trap { display: none; }
.cform__status { margin: 0 0 20px; font-weight: 500; }
.cform__status[hidden] { display: none; }
.cform__status--error { color: #B3261E; }


/* ==========================================================================
   §31  SEARCH RESULTS  —  the dropdown rows and the full results view
   ==========================================================================
   The dropdown container, its 400px cap and the #FDEFBF <mark> highlight are
   already defined with the header (§4). This is only the rows inside it, plus
   the full-page view the home page swaps in when it sees ?s= in the URL.
   ========================================================================== */
/* Live's own values: white card, 15px padding, a hairline #ECEFF1 divider, and
   type at 13-14px rather than the 15-17px this used to use. The title is a
   LINK BLUE (#0073AA) at weight 400 - not navy, not bold. */
.s-result {
  display: block;
  padding: 15px;
  background: var(--white);
  border-bottom: 1px solid #ECEFF1;
  text-decoration: none;
  color: #313131;
}
.s-result:last-child { border-bottom: 0; }
.s-result:hover,
.s-result:focus-visible { background: var(--highlight); }
.s-result__title {
  display: block;
  font-size: 14px;
  line-height: 18px;
  font-weight: 400;
  color: #0073AA;
}
.s-result__desc {
  display: block;
  margin-top: 4px;
  /* 14px, matching live's measured 14px/18px. This was 13. */
  font-size: 14px;
  line-height: 18px;
  color: #313131;
}

/* The two entries that carry a featured image. Live's own markup puts the 70px
   image in a container that computes to 70x0, so its title paints on top of the
   picture and its description collapses to zero height -- see the note in
   main.js. A flex row lays it out the way live is clearly aiming for, and the
   text stays readable. */
.s-result--thumb { display: flex; gap: 10px; align-items: flex-start; }
.s-result__body { min-width: 0; }      /* lets the description wrap, not overflow */
.s-result__thumb {
  flex: 0 0 70px;
  width: 70px;
  height: 70px;
  object-fit: contain;
}
.s-empty,
.s-more {
  display: block;
  padding: 15px;
  background: var(--white);
  font-size: 13px;
  line-height: 18px;
}
.s-more { color: var(--blue); text-decoration: none; font-weight: 500; }
.s-more:hover { text-decoration: underline; }

/* The full results view, rendered into <main> on the home page. */
.s-results { padding: 0 var(--gutter); }
.s-results__inner { max-width: var(--content); margin: 0 auto; padding: 10px 0 60px; }
.s-count { margin: 0 0 20px; font-size: 17px; line-height: 26px; color: var(--text); }
/* The full results PAGE is not the dropdown tray - it keeps page-sized type. */
.s-results .s-result { padding: 16px 0; background: none; }
.s-results .s-result__title { font-size: 20px; line-height: 28px; color: var(--navy); }
.s-results .s-result__desc { font-size: 17px; line-height: 26px; }
.s-page { margin: 30px 0 0; display: flex; gap: 10px; }
.s-page a,
.s-page__current {
  display: inline-block;
  min-width: 36px;
  padding: 6px 10px;
  text-align: center;
  font-size: 15px;
  line-height: 22px;
  text-decoration: none;
}
.s-page a { color: var(--navy); border: 1px solid var(--grey-line); }
.s-page a:hover { background: var(--highlight); }
.s-page__current { background: var(--navy); color: var(--white); font-weight: 500; }


/* ==========================================================================
   §32  MOBILE AND TABLET
   ==========================================================================
   Added 2026-08-22 after the team reported the mobile layout. Until now the
   stylesheet had NO width breakpoint below 1366, so every page rendered its
   desktop layout at every size: at 375 the page came out 725px wide, i.e. 350px
   of horizontal overflow on all 15 pages, and the 698px nav simply ran off the
   side. The .nav-toggle button, its markup and its JS all already existed - the
   breakpoint that reveals it was the missing piece.

   TWO BREAKPOINTS, both taken from live rather than invented:
     1024  live swaps its nav for a 48x48 burger here (Elementor "tablet")
      767  live goes single-column and changes the type scale ("mobile")

   The approach agreed with David: match live's STRUCTURE and behaviour - burger
   nav, stacked columns, no overflow - and its mobile type scale, without
   chasing pixel-exact band heights the way the desktop build did. Elementor's
   own mobile output is inconsistent between pages, so exact-matching it costs a
   great deal and buys very little.
   ========================================================================== */

@media (max-width: 1024px) {

  /* --- nav becomes a burger ------------------------------------------------
     The button is already in every page and already wired in main.js, which
     toggles .is-open on #primary-nav. All that was missing was showing it. */
  .nav-toggle { display: inline-flex; align-items: center; gap: 10px; }

  /* flex-wrap is load-bearing: .nav is `flex: 0 0 100%` so without wrapping it
     sits BESIDE the 48px burger instead of below it, and the open menu pokes
     18px past the viewport. */
  .site-navbar__inner { justify-content: center; padding: 10px 4%; flex-wrap: wrap; }

  .nav { display: none; flex: 0 0 100%; }
  .nav.is-open { display: block; }

  /* Open, the menu is a stacked panel rather than a row. */
  .nav.is-open > ul { flex-direction: column; width: 100%; }
  .nav.is-open > ul > li { flex: 0 0 auto; width: 100%; }
  .nav.is-open > ul > li > a { padding: 12px 0; justify-content: flex-start; }

  /* Submenus sit in the flow when the panel is open - a hover-positioned
     dropdown is meaningless on a touch device. */
  .nav.is-open .dropdown,
  .nav.is-open .nav__sub {
    position: static;
    display: none;
    box-shadow: none;
    width: 100%;
    padding-left: 16px;
  }
  .nav.is-open li.is-open > .dropdown,
  .nav.is-open li.is-open > .nav__sub { display: block; }

  /* --- every two-column band stacks --------------------------------------- */
  .home-hero__inner,
  .home-intro__inner,
  .home-programs__inner,
  .home-other__inner,
  .intro-band__inner,
  .intro-cta__inner,
  .cta-pair__inner,
  .video-band__inner,
  .dl-band__inner,
  .xlink__inner,
  .cform-band__inner,
  .content-row,
  .portal-row,
  .res-row,
  .steps,
  .elig__group {
    flex-direction: column;
    column-gap: 0;
    row-gap: 20px;
  }

  /* ...and their columns give up their fixed percentages. */
  .intro-cta__text,
  .intro-cta__card,
  .cta-card,
  .video-band__text,
  .video-band__thumb,
  .dl-band__text,
  .dl-band__thumb,
  .xlink__text,
  .xlink__image,
  .cform-band__form,
  .cform-band__aside,
  .content-row__main,
  .content-row__aside,
  .portal-row__text,
  .portal-row__media,
  .res-card,
  .prog-list__col,
  .elig__body {
    width: 100%;
  }
  .cta-pair--wide .cta-card,
  .res-row--tight .res-card { width: 100%; }

  /* The Application Windows columns are inset 115px on desktop, which leaves
     nothing at this width. */
  /* Live keeps the date columns side by side at this width (measured at 885:
     three columns, 282 each), so only the 115px desktop inset goes. */
  .windows__cols { padding: 0; }

  /* Eligibility groups lose their 65px inset and the icon sits above. */
  .elig__group { padding-left: 0; }
  .elig__group > svg { flex: 0 0 25px; }

  /* Decorative columns that only ever held a background: they contribute no
     content, so on a stacked layout they are just empty space. */
  .page-hero__art,
  .dl-band__thumb,
  .cform-band__aside { background-position: center top; }

  /* --- footer -------------------------------------------------------------
     Its inner is a flex row whose two nav columns are `flex: 0 0 191px`, so
     the second one started at x=433 in a 375 viewport - the single largest
     source of overflow left after the header was fixed. */
  .site-footer__inner { flex-direction: column; column-gap: 0; row-gap: 24px; }
  .site-footer__about,
  .site-footer__nav { flex: 0 0 auto; width: 100%; }
  .site-footer__legal-inner { flex-direction: column; row-gap: 8px; text-align: center; }

  /* --- home page grids ----------------------------------------------------
     The programme grid is a real CSS grid at 4 fixed columns, so it does not
     stack from the flex rules above and was the last source of overflow: four
     245px cards in a 335px column. Two across at tablet, one at phone (below).
     .home-help__cols is a 44/22/22 flex row and stacks with everything else. */
  .program-grid { grid-template-columns: repeat(2, 1fr); gap: 24px; }

  .home-help__cols { flex-direction: column; column-gap: 0; row-gap: 20px; }
  .home-help__lead,
  .home-help__contact { width: 100%; }

  .home-other__col,
  .home-other__photo { width: 100%; }

  /* --- home hero -----------------------------------------------------------
     .home-hero__text is 48% on desktop, which at 400px is only 173px - narrower
     than the word "potential" set at 60px (286px). The h1 overflowed its parent
     and `align-items: center` split the overflow both ways, so the LEFT of the
     headline was clipped: "Unlock your otential". Reported by the team. */
  .home-hero__text { width: 100%; }
  .home-hero__inner { flex-wrap: wrap; }

  /* Live's recorded tablet values for the sparkles. */
  .home-hero__spark--1 { transform: translateY(-12px); }
  .home-hero__spark--2 { transform: translateY(-23px); }

  /* --- search inside the collapsed menu -----------------------------------
     From here the search lives inside the burger menu - as it does on live,
     where both search inputs are hidden until the menu opens. The 500px
     desktop tray cannot work there: anchored right:0 to a form sized to its
     own content, it ran 100px off the left edge at 768.

     The panel's containing block is the FORM, which is absolutely positioned,
     so widening .site-search alone does nothing - the form has to stretch too,
     and then the panel can simply fill it. */
  .nav.is-open .nav__search,
  .nav.is-open .site-search,
  .nav.is-open .site-search__form { width: 100%; max-width: none; left: 0; right: auto; }
  /* The panel is positioned against .site-navbar, so this simply spans the bar. */
  .site-search__results { left: 4%; right: 4%; width: auto; max-width: none; }
}

@media (max-width: 767px) {

  /* --- type scale, measured on live at 375 --------------------------------
     Live does NOT simply shrink everything: the landing headline drops from
     65/76 to 44/60 and centres, while BODY COPY GOES UP, 17/26 to 20/30. */
  body { font-size: 20px; line-height: 30px; }

  .page-hero h1 { font-size: 44px; line-height: 60px; text-align: center; }
  .page-hero__inner { width: 100%; margin: 0; padding: 30px 0; }
  .page-hero { min-height: 0; }
  .page-hero__art { display: none; }        /* nothing but decoration */

  .subpage-hero__inner { flex-direction: column; }
  .subpage-hero__text { width: 100%; }
  .subpage-hero__icon { width: 60%; margin: 0 auto; }
  .subpage-hero h1 { font-size: 32px; line-height: 42px; }

  .head-band h1,
  .res-head h1 { font-size: 32px; line-height: 42px; }

  /* --- header ------------------------------------------------------------- */
  /* Live lets the logo run nearly the full width (372 of 375), so the 4% inset
     has to go or a 372px logo overflows a 345px box. */
  .site-brand__inner { padding: 0 2%; flex-direction: column; gap: 16px; }
  .site-logo img { width: 100%; max-width: 372px; height: auto; }
  .site-actions { justify-content: center; flex-wrap: wrap; }

  /* --- things with a hard pixel width ------------------------------------- */
  .faq-band__head { width: auto; max-width: 100%; }

  /* --- FAQ accordions ----------------------------------------------------- */
  /* 85% leaves too little for a long question, and the answer's 55px left
     inset is most of a phone's width. */
  .faq__label { width: auto; }
  .faq__a { padding: 10px 0 10px 20px; }

  /* Stacked, so the dividers rotate: live swaps the middle column's left/right
     borders for top/bottom ones. A top border on every column after the first
     puts the rules in the same places. */
  .windows__cols { flex-wrap: wrap; row-gap: 0; }
  .windows__col { flex: 1 1 100%; min-width: 0; }
  .windows__col + .windows__col {
    border-left: 0;
    border-top: 1px solid var(--green-dark);
  }
  .windows--q .windows__col + .windows__col { border-top-color: var(--green); }

  /* Lists: the desktop build reproduces live's 51px + 25.5px indents, which
     together take a third of a 375 screen. */
  .content-band__prose ul,
  .elig__body ul,
  .portal-row__text ul { margin-left: 20px; }
  .content-band__prose li,
  .elig__body li,
  .portal-row__text li { margin-left: 0; }

  /* Buttons wrap rather than overflow. */
  .btn { white-space: normal; }

  /* The search results view and the programme list lose their side padding. */
  .prog-list__col { padding: 10px 0 20px; }

  /* One programme card per row on a phone. */
  .program-grid { grid-template-columns: 1fr; }

  /* --- home hero, matched to live at 400 ----------------------------------
     Live swaps in a PORTRAIT crop here. The desktop file is 1920x544, so using
     it in a 550-tall box with `cover` crops away almost everything - which is
     why our mobile hero looked wrong even before the headline clipped. Live's
     values, measured: ds_home_hero_m-scaled.jpg, cover, 50% 100%, min-height
     550, headline 44/60 centred. */
  .home-hero {
    min-height: 550px;
    background-image: url("/assets/images/ds_home_hero_m-scaled.jpg");
    background-position: 50% 100%;
  }
  /* align-self so the headline FILLS its column as live's does (384 of 400)
     rather than shrinking to its text. The parent is a centred flex column, so
     a shrink-to-fit h1 is centred too and looks the same - until a longer word
     changes where it wraps. Filling the column makes the wrap deterministic. */
  .home-hero h1 { font-size: 44px; line-height: 60px; align-self: stretch; }
  .home-hero__inner { padding: 8% 0; }

  /* Live's recorded mobile values: no sideways shove, vertical only. */
  .home-hero__spark--1 { transform: translateY(50px); }
  .home-hero__spark--2 { transform: translateY(-140px); }
}

/* ==========================================================================
   §33 ENTRANCE ANIMATIONS — reproducing Elementor's, verbatim
   --------------------------------------------------------------------------
   Live carries an `elementor-invisible` class plus a data-settings JSON on each
   animated element; elementor's frontend.min.js swaps that for
   `animated <name>` when the element scrolls into view. We do the same job with
   a data-anim attribute and an IntersectionObserver (main.js §6).

   The keyframes and the two durations below are COPIED from live, not invented:
     elementor/assets/lib/animations/styles/<name>.min.css
     .animated { animation-duration: 1.25s }  .animated-slow { 2s }
   Crawled 2026-08-25; 67 elements over 13 pages. /other-programs/ and
   /resources/ have none on live either, so they get none here.

   WHY THE HIDDEN STATE IS ADDED BY JS, not written into the HTML: Elementor
   ships `elementor-invisible` in the markup, so if its JavaScript ever fails to
   run the content stays permanently invisible. Ours starts visible and JS opts
   it into being hidden, so a JS error degrades to "no animation" rather than
   "no content".
   ========================================================================== */

@keyframes fadeIn      { from { opacity: 0 } to { opacity: 1 } }
@keyframes fadeInUp    { from { opacity: 0; transform: translate3d(0, 100%, 0) }
                         to   { opacity: 1; transform: none } }
@keyframes fadeInLeft  { from { opacity: 0; transform: translate3d(-100%, 0, 0) }
                         to   { opacity: 1; transform: none } }
@keyframes fadeInRight { from { opacity: 0; transform: translate3d(100%, 0, 0) }
                         to   { opacity: 1; transform: none } }
@keyframes zoomIn      { from { opacity: 0; transform: scale3d(.3, .3, .3) }
                         50%  { opacity: 1 } }
@keyframes slideInUp   { from { transform: translate3d(0, 100%, 0); visibility: visible }
                         to   { transform: translate3d(0, 0, 0) } }

/* visibility, not display or opacity: it hides the element without changing
   layout, so nothing reflows when the animation fires. Same as live. */
.anim-hidden { visibility: hidden; }

.anim-run { animation-duration: 1.25s; }
.anim-run[data-anim-speed="slow"] { animation-duration: 2s; }

.anim-run[data-anim="fadeIn"]      { animation-name: fadeIn; }
.anim-run[data-anim="fadeInUp"]    { animation-name: fadeInUp; }
.anim-run[data-anim="fadeInLeft"]  { animation-name: fadeInLeft; }
.anim-run[data-anim="fadeInRight"] { animation-name: fadeInRight; }
.anim-run[data-anim="zoomIn"]      { animation-name: zoomIn; }
.anim-run[data-anim="slideInUp"]   { animation-name: slideInUp; }

/* fadeInLeft/Right translate by 100% of the element's own width, which on a
   narrow screen can push it wide enough to create a horizontal scrollbar
   mid-animation. Clipping the two places they are used costs nothing. */
.cta-card__head,
.home-hero__inner { overflow-x: clip; }

/* Live disables all of this under prefers-reduced-motion
   (`.animated { animation: none !important }`) and so do we — including the
   hidden state, or a reduced-motion visitor would see nothing at all. */
@media (prefers-reduced-motion: reduce) {
  .anim-hidden { visibility: visible; }
  .anim-run { animation: none !important; }
}


/* ==========================================================================
   §34  CDA TESTING CENTERS  —  /cda-testing-centers/
   Map + filterable list of the 81 Pearson VUE centers that deliver the CDA
   Exam. Built to replace a Google My Maps link tied to a personal account.

   The LIST is the primary content and is styled to stand on its own: if tiles
   are blocked or Leaflet fails, .centers__map never gets .is-live and collapses
   to nothing rather than leaving an empty grey box on the page.
   ========================================================================== */

.centers-lede { margin: 0 0 24px; font-size: 17px; line-height: 26px; }

.centers__toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px 20px;
  margin: 0 0 16px;
}
.centers__search { flex: 1 1 320px; }
.centers__search input {
  width: 100%;
  padding: 10px 14px;
  font: inherit;
  font-size: 17px;
  color: var(--text);
  border: 1px solid var(--grey-line);
  border-radius: 3px;
}
.centers__search input:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; }
.centers__count { margin: 0; font-size: 15px; color: var(--grey); }

/* Zero height until centers.js confirms Leaflet is alive, so a failed script
   leaves no empty box behind. */
.centers__map { height: 0; }
.centers__map.is-live {
  /* Shaped to the DATA, on purpose, not to the page. fitBounds picks the zoom
     that fits BOTH axes, so in a wide short box the latitude binds and all the
     spare width fills with Alabama and the Atlantic — that is why this map first
     opened showing Memphis to Orlando.

     The 76 pins span 3.97 deg of latitude by 4.03 of longitude, and at Georgia's
     latitude a degree of longitude is only cos(33 deg) as tall, so the cluster's
     true aspect is 0.85 wide-to-tall. 560x656 matches that, and the state fills
     the frame. Centred, so the narrower box reads as deliberate. */
  height: 656px;
  max-width: 560px;
  margin: 0 auto 28px;
  border: 1px solid var(--grey-line);
}
.centers__map .leaflet-popup-content { font-family: var(--font-body); font-size: 15px; line-height: 21px; }

.centers__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 1px;
  background: var(--grey-line);   /* the 1px gap becomes the divider */
  border: 1px solid var(--grey-line);
}
.center { background: var(--white); padding: 16px 18px; }
.center:hover { background: var(--highlight); cursor: pointer; }
.center__name {
  margin: 0 0 4px;
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 24px;
  font-weight: 500;
  color: var(--navy);
}
.center__addr { margin: 0; font-size: 15px; line-height: 22px; color: var(--text); }
.center__county { display: block; font-size: 14px; color: var(--grey); }
.center__phone { margin: 6px 0 0; font-size: 15px; line-height: 22px; }
/* The 5 centers with no coordinates. Marked so the card explains itself rather
   than leaving someone hunting the map for a pin that is not there. */
.center--unpinned { cursor: default; }
.center__nopin {
  margin: 8px 0 0;
  font-size: 13px;
  line-height: 18px;
  font-style: italic;
  color: var(--grey);
}

.center--error { grid-column: 1 / -1; cursor: default; }
.center--error:hover { background: var(--white); }

.centers__updated {
  margin: 14px 0 0;
  font-size: 14px;
  line-height: 20px;
  color: var(--grey);
}

@media (max-width: 600px) {
  /* Same 0.85 shape at phone width: 360 wide wants ~420 tall. */
  .centers__map.is-live { height: 420px; max-width: none; }
  .centers__list { grid-template-columns: 1fr; }
}
