/* =========================================================================
   BAY STATE LEARNING CENTER — SITE STYLESHEET
   Single shared stylesheet for all pages.

   Structure:
     1. Design tokens (colors + type scale as CSS variables)
     2. Fonts & reset
     3. Utility classes (labels, buttons, small links)
     4. Navigation (+ mobile menu)
     5. Shared layout components (hero, sections, stripes, headings, body text)
        Where a page needs a different value, the override is scoped with
        the page's body class, e.g. body.page-enroll .hero { ... }, and
        contains ONLY the properties that differ from the shared rule.
     6. Footer
     7. Page-specific styles, one section per page
     8. Responsive / mobile rules

   Each <body> tag carries a page class (e.g. class="page-index") which is
   how page-specific overrides below are targeted.
   ========================================================================= */


/* =========================================================================
   1. DESIGN TOKENS
   Change a color or a font size here and it changes everywhere.
   ========================================================================= */

:root {
  /* Brand palette (the four letters of the BSLC logo) */
  --logo-orange: #EF9F27;
  --logo-pink:   #D4537E;
  --logo-teal:   #3ABCB0;
  --logo-coral:  #E8724A;

  /* Surfaces */
  --charcoal:      #2a2d2e;  /* dark page/section background; also headings & text on cream */
  --charcoal-deep: #1e2122;  /* footer, mobile menu */
  --charcoal-light: #393c3d; /* solid card fill on cream sections — same
                                 perceived lightness as a 7% white tint
                                 over --charcoal (used by .dates-category,
                                 .path-card), so cards read consistently
                                 whether they're floating on charcoal or
                                 on cream */
  --cream:         #f0ece3;  /* light section background */

  /* Accents */
  --teal:        #30b0b0;  /* buttons and links on dark backgrounds */
  --teal-dark:   #1a8a8a;  /* teal links on cream (darker for contrast) */
  --orange-dark: #c06020;  /* orange links on cream (darker for contrast) */

  /* Text on dark backgrounds — "paper" tones, brightest to faintest */
  --paper:        #e8e4dc;                 /* headings */
  --paper-bright: rgba(232,228,220,0.95);  /* active nav link, bolded schedule items */
  --paper-strong: rgba(232,228,220,0.75);  /* schedule text, form checkboxes */
  --paper-body:   rgba(232,228,220,0.7);   /* standard body text */
  --paper-mid:    rgba(232,228,220,0.65);  /* labels, secondary text */
  --paper-soft:   rgba(232,228,220,0.6);   /* nav links */
  --paper-dim:    rgba(232,228,220,0.55);  /* footer text */
  --paper-faint:  rgba(232,228,220,0.45);  /* social icons */

  /* Text on cream backgrounds — "ink" tones */
  --ink-body: #3a3d3e;             /* standard body text */
  --ink-lead: #4a4d4e;             /* lead paragraphs (direct children of section inners) */
  --ink-mid:  rgba(42,45,46,0.7);  /* dates, small labels, secondary text */

  /* Hairline borders */
  --line-dark:       rgba(255,255,255,0.06);  /* on charcoal */
  --line-cream:      rgba(42,45,46,0.1);      /* on cream */
  --line-cream-soft: rgba(42,45,46,0.08);     /* on cream, softer */

  /* Type scale (fluid sizes; min, preferred, max) */
  --fs-body:   clamp(1.05rem, 0.9rem + 0.5vw, 1.4rem);    /* standard paragraph */
  --fs-h2:     clamp(1.4rem, 1.1rem + 1.2vw, 2rem);       /* section heading */
  --fs-h3:     clamp(1rem, 0.9rem + 0.4vw, 1.25rem);      /* card heading */
  --fs-label:  clamp(0.75rem, 0.65rem + 0.3vw, 0.9rem);   /* uppercase labels */
  --fs-meta:   clamp(0.72rem, 0.65rem + 0.25vw, 0.85rem); /* bylines, dates */
  --fs-mini:   clamp(0.75rem, 0.68rem + 0.2vw, 0.88rem);  /* small uppercase links */
  --fs-btn:    clamp(0.95rem, 0.85rem + 0.35vw, 1.15rem); /* large buttons */
  --fs-btn-sm: clamp(0.82rem, 0.75rem + 0.25vw, 1rem);    /* nav button */
  --fs-nav:    clamp(0.9rem, 0.85rem + 0.2vw, 1.05rem);   /* nav links */
  --fs-footer: clamp(0.82rem, 0.75rem + 0.2vw, 0.95rem);  /* footer text */

  /* Layout widths */
  --content-width: 860px;  /* standard centered text-column width, used by
                               section-cream-inner, section-dark-inner, and
                               similar containers across most pages */
}


/* =========================================================================
   2. FONTS & RESET
   ========================================================================= */

/* Outfit font is loaded via <link rel="preload"/stylesheet"> tags in each
   page's <head> instead of @import — @import blocks the parser from
   discovering the font request until this whole file is downloaded and
   parsed, adding a full extra round trip before text renders in the right
   font. See the <head> of any page for the replacement tags. */

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  font-family: 'Outfit', sans-serif;
  background: var(--charcoal);
  color: var(--paper);
  width: 100%;
}

/* Blog pages (listing + posts) are cream with a dark nav. */
body.page-blog {
  background: var(--cream);
  color: var(--charcoal);
}


/* =========================================================================
   3. UTILITY CLASSES
   ========================================================================= */

.label-sm {
  font-size: var(--fs-label);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--paper-mid);
}

/* -- Buttons: shared base, then per-variant color/size -- */

.btn-teal,
.btn-teal-large,
.btn-orange-large,
.vol-submit {
  display: inline-block;
  font-family: inherit;   /* <button>/<input> don't inherit the body font by default */
  font-weight: 600;
  color: #1a1a1a;
  border-radius: 2px;
  cursor: pointer;
  text-decoration: none;
}

.btn-teal {
  font-size: var(--fs-btn-sm);
  letter-spacing: 0.05em;
  padding: 0.55rem 1.3rem;
  white-space: nowrap;
}

.btn-teal-large,
.btn-orange-large,
.vol-submit {
  font-size: var(--fs-btn);
  letter-spacing: 0.07em;
  padding: 0.8rem 2.4rem;
}

.btn-teal,
.btn-teal-large,
.vol-submit {
  background-color: var(--teal);
  border: 2px solid var(--teal);
}

.btn-orange-large {
  background-color: var(--logo-coral);
  border: 2px solid var(--logo-coral);
}

/* -- Small uppercase text links ("See how it works →" etc.) -- */

.more-btn-dark,
.more-btn-orange {
  display: inline-block;
  font-size: var(--fs-label);
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  text-decoration-line: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  align-self: flex-start;
}

.more-btn-dark {
  color: var(--teal-dark);
  text-decoration-color: rgba(26,138,138,0.4);
}

.more-btn-orange {
  color: var(--orange-dark);
  text-decoration-color: rgba(192,96,32,0.4);
}

/* Same idea, slightly smaller/bolder: enroll steps + calendar footers */
.step-link,
.step-link-orange,
.cal-open-link {
  display: inline-block;
  font-size: var(--fs-mini);
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  text-decoration: none;
  padding-bottom: 2px;
}

.step-link,
.cal-open-link {
  color: var(--teal-dark);
  border-bottom: 1px solid rgba(26,138,138,0.4);
}

.step-link-orange {
  color: var(--orange-dark);
  border-bottom: 1px solid rgba(192,96,32,0.4);
}

.step-body .step-link,
.step-body .step-link-orange {
  margin-top: 0.85rem;
}

/* Inline links */
a.link {
  color: var(--teal);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.contact-inline {
  color: var(--teal-dark);
  text-decoration: none;
}


/* =========================================================================
   4. NAVIGATION
   ========================================================================= */

nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1.1rem 2.5rem;
  border-bottom: 1px solid var(--line-dark);
  gap: 2rem;
}

/* Visit page has no "Schedule a visit" button in the nav, so it gets
   extra padding on desktop to keep the bar the same height as the
   other pages. The matching mobile reset lives in the 700px media
   query at the bottom of the file, since at phone widths every page
   just shows the hamburger and this compensation no longer applies. */
body.page-visit nav {
  padding: 1.65rem 2.5rem;
  gap: 2rem;
}

/* Blog pages have a cream <body>, so the nav needs its dark background
   set explicitly. Padding/gap aren't restated here — they'd just
   duplicate the base nav rule's values, and doing so would have
   outranked the mobile nav rule below. */
body.page-blog nav {
  background: var(--charcoal);
}

.nav-logo {
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  line-height: 1;
  text-decoration: none;
  flex-shrink: 0;
}

.nl-b { color: var(--logo-orange); }
.nl-s { color: var(--logo-pink); }
.nl-l { color: var(--logo-teal); }
.nl-c { color: var(--logo-coral); }

.nav-links {
  display: flex;
  gap: 1.5rem;
  list-style: none;
}

.nav-links a {
  font-size: var(--fs-nav);
  color: var(--paper-soft);
  text-decoration: none;
  letter-spacing: 0.04em;
}

.nav-links a.nav-active {
  color: var(--paper-bright);
}

.nav-right {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  flex-shrink: 0;
}

.hamburger {
  display: none;   /* shown at mobile widths */
  flex-direction: column;
  gap: 5px;
  cursor: pointer;
  background: none;
  border: none;
  padding: 4px;
}

.hamburger span {
  display: block;
  width: 22px;
  height: 1.5px;
  background: var(--paper-strong);
}

.mobile-menu {
  display: none;   /* toggled to flex by the hamburger script */
  flex-direction: column;
  background: var(--charcoal-deep);
  border-bottom: 1px solid var(--line-dark);
}

.mobile-menu.open {
  display: flex;
}

.mobile-menu a {
  font-size: var(--fs-nav);
  color: var(--paper-body);
  text-decoration: none;
  padding: 0.9rem 1.5rem;
  border-bottom: 1px solid rgba(255,255,255,0.05);
  letter-spacing: 0.03em;
}

.mobile-menu a:last-child {
  border-bottom: none;
}


/* =========================================================================
   5. SHARED LAYOUT COMPONENTS
   ========================================================================= */

/* -- Hero -- */

.hero,
.page-hero {
  padding: 4rem 2.5rem 3.5rem;
  max-width: 860px;
  margin: 0 auto;
  text-align: center;
}

/* Padding here differs from the base .hero rule (tighter bottom
   spacing for the logo block), so it's kept for desktop widths. The
   matching mobile reset lives in the 640px media query at the bottom
   of the file. */
body.page-index .hero,
body.page-how-it-works .hero {
  max-width: none;
  margin: 0;
  padding: 4rem 2.5rem 2.5rem;
  display: flex;
  flex-direction: column;
  align-items: center;
}

body.page-after-bslc .hero {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.logo-block {
  margin-bottom: 2.5rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
}

.logo-img {
  width: 620px;
  max-width: 90vw;
  height: auto;
  display: block;
}

.hero h1,
.page-hero h1 {
  font-size: clamp(2rem, 1.4rem + 2.5vw, 3.2rem);
  font-weight: 700;
  line-height: 1.18;
  letter-spacing: -0.01em;
  margin: 0.75rem 0 1.5rem;
  color: var(--paper);
}

body.page-index .hero h1,
body.page-how-it-works .hero h1 {
  font-size: clamp(1.7rem, 1rem + 3vw, 3.2rem);
  margin: 0 0 1rem;
}

.hero h1 .teal {
  color: var(--teal);
}

.hero h1 .coral {
  color: #e4843c;   /* softened coral, used in the index hero only */
}

.hero p,
.page-hero p {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--paper-body);
  max-width: 680px;
  margin: 0 auto;
}

body.page-volunteer-donate .hero p {
  margin-bottom: 2rem;   /* clears the hero text from the section below */
}

.hero-cta {
  display: flex;
  gap: 1rem;
  justify-content: center;
  flex-wrap: wrap;
  margin-top: 2.25rem;
}

/* -- Section shells: dark and cream bands with a centered inner column -- */

.section-dark {
  background: var(--charcoal);
  padding: 4rem 2.5rem;
  border-top: 1px solid var(--line-dark);
}

body.page-classes-calendar .section-dark,
body.page-enroll .section-dark {
  padding: 4.5rem 2.5rem;
}

/* The classes-calendar page's class-listing section was converted from
   .section-dark to .section-cream (see CLASSES & CALENDAR below), but
   keeps the same extra vertical padding the page already used. */
body.page-classes-calendar .section-cream {
  padding: 4.5rem 2.5rem;
}

.section-dark-inner {
  max-width: var(--content-width);
  margin: 0 auto;
}

.section-cream {
  background: var(--cream);
  padding: 4rem 2.5rem;
}

.section-cream-inner {
  max-width: var(--content-width);
  margin: 0 auto;
}

/* -- Section headings (h2): one shared style, then color by background
      and a handful of margin exceptions -- */

.section-dark-inner h2,
.sample-day-intro h2,
.testimonials h2,
.ll-section-inner h2,
.split-text h2,
.pillar-text h2,
.section-cream-inner h2,
.calendar-header-inner h2,
.steps-intro h2,
.board-section-header h2,
.donate-text h2,
.form-section-inner h2 {
  font-size: var(--fs-h2);
  font-weight: 700;
  line-height: 1.2;
  margin: 0.75rem 0 1.25rem;
}

.section-dark-inner h2,
.sample-day-intro h2,
.testimonials h2,
.ll-section-inner h2 {
  color: var(--paper);
}

.split-text h2,
.pillar-text h2,
.section-cream-inner h2,
.calendar-header-inner h2,
.steps-intro h2,
.board-section-header h2,
.donate-text h2,
.form-section-inner h2 {
  color: var(--charcoal);
}

.testimonials h2       { margin: 0; }             /* spacing handled inline in the HTML */
.ll-section-inner h2   { margin: 0 0 1.25rem; }
.steps-intro h2        { margin: 0 0 1rem; }
.board-section-header h2 { margin: 0.5rem 0 0; }
.form-section-inner h2 { margin-bottom: 0.5rem; }

body.page-enroll .section-cream-inner h2 {
  font-size: clamp(1.4rem, 1.1rem + 1vw, 1.9rem);
  margin: 0 0 1rem;
}

body.page-visit .section-cream-inner h2 {
  margin-bottom: 1.5rem;
}

/* -- Body paragraphs: one shared style per background, then exceptions.
      "Lead" paragraphs (direct children of a section inner, targeted
      with >) sit directly under the h2 and get their own margins. -- */

/* On dark */
.section-dark-inner p,
.section-dark-intro p {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--paper-body);
}

.section-dark-inner p + p,
.section-dark-intro p + p {
  margin-top: 1rem;
}

.section-dark-inner > p {
  margin-bottom: 1.5rem;
}

.section-dark-inner > p:last-of-type {
  margin-bottom: 0;
}

body.page-volunteer-donate .section-dark-inner p {
  max-width: 640px;
  margin-bottom: 2rem;
}

/* On cream */
.split-text p,
.pillar-text p,
.section-cream-inner p,
.visit-step-body p,
.donate-text p,
.college-note {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--ink-body);
}

.section-cream-inner p + p,
.pillar-text p + p {
  margin-top: 1rem;
}

.section-cream-inner > p {
  color: var(--ink-lead);
  margin-bottom: 1.25rem;
}

.section-cream-inner > p:last-of-type {
  margin-bottom: 0;
}

body.page-volunteer-donate .section-cream-inner p {
  color: var(--ink-body);   /* must restate: outranks the --ink-lead rule above */
  max-width: 640px;
  margin-bottom: 2rem;
}

/* -- Lists (on cream): same containers as the paragraph rule above,
      since a bulleted list is just body text with markers. -- */

.split-text ul,
.pillar-text ul,
.section-cream-inner ul,
.visit-step-body ul,
.donate-text ul {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--ink-body);
  padding-left: 1.4rem;
  margin: 1rem 0;
}

.split-text li,
.pillar-text li,
.section-cream-inner li,
.visit-step-body li,
.donate-text li {
  margin-bottom: 0.5rem;
}

/* -- Split stripes (index: photo + text side by side) -- */

.split-stripe {
  width: 100%;
  background: var(--cream);
  display: grid;
  grid-template-columns: 1fr 1fr;
  margin-top: 3rem;
}

.split-stripe + .split-stripe {
  margin-top: 0;
}

.split-photo {
  overflow: hidden;
}

.split-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
  min-height: 400px;
}

/* max-height is the only thing unique to the index page here; the
   min-height matched the base rule already and isn't needed. */
body.page-index .split-photo img {
  max-height: 100vh;
}

.split-text {
  padding: 3.5rem 3rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  color: var(--charcoal);
}

.split-text p {
  margin-bottom: 1.75rem;
}

body.page-index .split-text p {
  margin-bottom: 1rem;
}

.split-text p .accent-teal {
  color: var(--teal-dark);
}

.split-text p .accent-orange {
  color: var(--orange-dark);
}

.split-text .label-sm {
  color: var(--ink-mid);
  margin-bottom: 1rem;
}

/* -- Pillar stripes (how-it-works: numbered photo + text bands) -- */

.pillar-stripe {
  width: 100%;
  background: var(--cream);
  display: grid;
  grid-template-columns: 1fr 1fr;
}

.pillar-stripe + .pillar-stripe {
  margin-top: 0;
}

.pillar-photo {
  overflow: hidden;
}

.pillar-photo img {
  width: 100%;
  height: 100%;
  max-height: 100vh;
  object-fit: cover;
  object-position: center;
  display: block;
  min-height: 420px;
}

.pillar-text {
  padding: 3.5rem 3rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
  color: var(--charcoal);
}

.pillar-num {
  font-size: clamp(2.5rem, 2rem + 2vw, 4rem);
  font-weight: 700;
  line-height: 1;
  opacity: 0.12;
  color: var(--charcoal);
}

/* -- Testimonials (index) -- */

.testimonials {
  padding: 4.5rem 2.5rem;
  border-top: 1px solid var(--line-dark);
}

.testimonial blockquote {
  margin-bottom: 1rem;
  font-size: clamp(1.05rem, 0.9rem + 0.5vw, 1.3rem);
  line-height: 1.72;
  color: var(--paper-body);
  font-style: italic;
  font-weight: 300;
}

.testimonial cite {
  font-size: clamp(0.7rem, 0.62rem + 0.25vw, 0.85rem);
  font-style: normal;
  letter-spacing: 0.1em;
  color: var(--paper-mid);
  text-transform: uppercase;
}

.testimonial cite span {
  display: block;
  font-size: clamp(0.65rem, 0.58rem + 0.2vw, 0.78rem);
  margin-top: 3px;
}

/* -- Sample day (how-it-works: schedule + photo carousel) -- */

.sample-day {
  background: var(--charcoal);
  padding: 4.5rem 2.5rem;
  border-top: 1px solid var(--line-dark);
}

.sample-day-inner {
  max-width: 1100px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 4rem;
  align-items: start;
}

/* Grid items default to min-width: auto, which means they refuse to
   shrink below their content's intrinsic min-content size. The carousel
   inside .sample-day-intro contains slides with flex-shrink: 0 (set via
   carousel.js), so without this override the browser tries to give the
   grid column enough room for every un-shrinkable slide side-by-side —
   blowing the whole grid (and page) out far past the viewport, especially
   on mobile. This forces both columns to respect the track's actual
   computed width instead. */
.sample-day-intro,
.sample-day-schedule {
  min-width: 0;
}

.sample-day-intro p {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--paper-mid);
  margin-bottom: 1rem;
}

.sample-day-photo {
  border-radius: 4px;
  overflow: hidden;
  margin-top: 0.5rem;
}

.sample-day-photo img {
  width: 100%;
  height: auto;
  display: block;
}

.sample-day-schedule {
  padding-top: 0.25rem;
}

.schedule-item {
  display: grid;
  grid-template-columns: 4.5rem 1fr;
  gap: 0 1rem;
  padding: 0.85rem 0;
  border-bottom: 1px solid var(--line-dark);
}

.schedule-item:last-child {
  border-bottom: none;
}

.schedule-time {
  font-size: clamp(0.7rem, 0.65rem + 0.2vw, 0.82rem);
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--teal);
  padding-top: 0.15rem;
  white-space: nowrap;
}

.schedule-desc {
  font-size: clamp(0.95rem, 0.88rem + 0.3vw, 1.15rem);
  line-height: 1.6;
  color: var(--paper-strong);
}

.schedule-desc strong {
  color: var(--paper-bright);
  font-weight: 500;
}


/* =========================================================================
   6. FOOTER
   ========================================================================= */

footer {
  background: var(--charcoal-deep);
  padding: 3rem 2.5rem 0;
  border-top: 1px solid var(--line-dark);
}

.footer-grid {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
  gap: 2rem;
  padding-bottom: 2.5rem;
  border-bottom: 1px solid var(--line-dark);
}

.footer-col-label {
  margin-bottom: 0.75rem;
}

.footer-links {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
}

.footer-links a,
.footer-contact,
.footer-hours {
  font-size: var(--fs-footer);
  color: var(--paper-dim);
}

.footer-links a {
  text-decoration: none;
}

.footer-contact {
  line-height: 1.9;
  margin-top: 0.75rem;
}

.footer-email {
  color: var(--teal);
}

.footer-cta {
  padding: 3rem 0 2.5rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 1rem;
  border-bottom: 1px solid var(--line-dark);
}

.footer-hours {
  line-height: 1.7;
}

.footer-hours .closed {
  font-size: 0.78rem;
}

.footer-base {
  padding: 1.5rem 0 2rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 1rem;
}

.footer-ll-link {
  color: var(--paper-dim);
  text-decoration: none;
  border-bottom: 1px solid rgba(232,228,220,0.2);
}

.footer-legal {
  font-size: clamp(0.75rem, 0.68rem + 0.2vw, 0.88rem);
  color: var(--paper-dim);
  line-height: 1.6;
}

.social-icons {
  display: flex;
  gap: 1.25rem;
  align-items: center;
}

.social-icon {
  width: 18px;
  height: 18px;
  fill: var(--paper-faint);
  display: block;
}


/* =========================================================================
   7. PAGE-SPECIFIC STYLES
   ========================================================================= */


/* ---------- HOW IT WORKS (how-it-works.html) ---------- */

.carousel {
  position: relative;
  border-radius: 4px;
  overflow: hidden;
}

.carousel-track-wrap {
  overflow: hidden;
  border-radius: 4px;
  aspect-ratio: 4 / 3;
}

.carousel-track {
  display: flex;
  height: 100%;
  transition: transform 0.45s ease;
}

.carousel-slide {
  min-width: 0;
  flex-shrink: 0;
  height: 100%;
}

.carousel-slide img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}

.carousel-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background: rgba(26,29,30,0.65);
  color: #fff;
  border: none;
  width: 2.4rem;
  height: 2.4rem;
  border-radius: 50%;
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s;
  z-index: 10;
  padding-bottom: 0.1rem;
}

.carousel-btn:hover {
  background: rgba(26,29,30,0.9);
}

.carousel-prev { left: 0.65rem; }
.carousel-next { right: 0.65rem; }

.carousel-dots {
  display: flex;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.6rem 0 0.2rem;
}

.carousel-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,0.3);
  cursor: pointer;
  padding: 0;
  transition: background 0.2s;
}

.carousel-dot.active {
  background: var(--logo-orange);
}

/* Arrows disable (rather than wrap) once a carousel reaches either end.
   Used by any carousel with data-loop="false" — currently just the
   testimonial carousel below. */
.carousel-btn:disabled {
  opacity: 0.25;
  cursor: not-allowed;
}

.carousel-btn:disabled:hover {
  background: rgba(26,29,30,0.65);
}


/* ---------- TESTIMONIALS CAROUSEL (index.html) ----------
   Reuses the .carousel/.carousel-track/.carousel-slide engine above,
   but the slides hold text instead of a fixed-ratio photo, and more
   than one slide is visible at once on desktop. carousel.js reads
   data-per-view to size slides in JS (since the number of "stops" —
   and therefore the dot count — changes depending on how many slides
   are visible at once, which isn't something CSS alone can drive). */

.carousel--text .carousel-track-wrap {
  aspect-ratio: auto;
  overflow-x: hidden;
  overflow-y: visible;
}

.carousel--text .carousel-track {
  align-items: stretch;
}

.carousel--text .carousel-slide {
  height: auto;
  padding: 0 1.25rem;
}

/* Side padding gives the arrows their own gutter, clear of the card
   text, instead of floating on top of it the way they do over a photo. */
.carousel--text {
  padding: 0 3.5rem;
}

/* Keeps the arrows clear of the card edges and off the dots row below. */
.carousel--text .carousel-btn {
  top: 45%;
}


/* ---------- CLASSES & CALENDAR (classes-calendar.html) ---------- */

.calendars-section {
  background: var(--cream);
  padding: 4rem 2.5rem;
}

.calendar-header-inner {
  max-width: var(--content-width);
  margin: 0 auto;
}

.calendars-inner {
  max-width: 1080px;
  margin: 0 auto 3rem;
  text-align: center;
}

.calendars-inner:last-child {
  margin-bottom: 0;
}

.calendar-embed {
  width: 100%;
  max-width: 1000px;
  aspect-ratio: 4 / 3;
  border: 1px solid var(--line-cream);
  border-radius: 4px;
  display: block;
  margin: 0 auto;
}

.calendars-inner .cal-open-link {
  margin-top: 1rem;
}

/* ---------- KEY DATES (classes-calendar.html) ----------
   New charcoal stripe between the calendars and the class listings.
   Reuses .path-card's values (from AFTER BSLC below) for the boxes,
   since both are dark cards holding short, scannable text on charcoal. */

.dates-categories-inner {
  max-width: 1080px;
  margin: 0 auto;
}

.dates-categories {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
}

.dates-category {
  background: rgba(255,255,255,0.07);
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: 4px;
  padding: 1.75rem;
}

.dates-category-label {
  margin: 0 0 1rem;
}

.dates-list {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.dates-list li {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

.dates-when {
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--paper-bright);
}

.dates-what {
  font-size: clamp(0.85rem, 0.8rem + 0.15vw, 0.98rem);
  color: var(--paper-body);
  line-height: 1.4;
}

.dates-divider {
  width: 100%;
  height: 1px;
  background: var(--line-dark);
  margin: 0.55rem 0;
}

/* ---------- CLASSES & CALENDAR (classes-calendar.html), continued ---------- */

/* Renamed from .section-dark-intro now that this section is cream (see
   .class-categories-inner below); kept as its own class rather than
   reusing .section-cream-inner > p because it needs a narrower max-width
   and larger bottom margin than a standard cream lead paragraph. */
.classes-intro {
  max-width: 660px;
  margin-bottom: 3rem;
}

.class-categories-inner {
  max-width: 1080px;
  margin: 0 auto;
}

.class-categories {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
}

/* This card now sits on the cream .class-categories-inner section rather
   than a charcoal one (see below), so it needs its own solid fill instead
   of the rgba(255,255,255,0.04) tint it used when it was a subtle
   lightening of a charcoal parent — that tint would be almost invisible
   on cream. --charcoal-light matches the perceived lightness of the
   .dates-category cards above (7% white over charcoal), so the two
   stripes of cards read as the same grey rather than two different
   darks, and everything inside the card (labels, class names, dividers)
   keeps working unchanged since the contrast against its own background
   barely shifts. The shadow gives the card definition now that it's a
   dark shape on a light field rather than a tint on a matching-tone
   background; value reused from .donate-photo for consistency. */
.class-category {
  background: var(--charcoal-light);
  border: 1px solid rgba(255,255,255,0.09);
  border-radius: 4px;
  padding: 1.75rem;
  box-shadow: 0 4px 24px rgba(0,0,0,0.12);
}

.class-category-label {
  font-size: clamp(0.7rem, 0.63rem + 0.2vw, 0.82rem);
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  margin-top: 0;
  margin-bottom: 1rem;
}

/* Category label colors. cat-color-orange is unused right now but kept
   so all six category colors stay available. */
.cat-color-teal     { color: var(--logo-teal); }
.cat-color-pink     { color: var(--logo-pink); }
.cat-color-orange   { color: var(--logo-orange); }
.cat-color-coral    { color: var(--logo-coral); }
.cat-color-lavender { color: #a78fd4; }
.cat-color-sage     { color: #7ab89a; }

.class-list {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.class-list li {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

.class-name {
  font-size: clamp(0.95rem, 0.88rem + 0.25vw, 1.1rem);
  font-weight: 600;
  color: var(--paper);
  line-height: 1.25;
}

.class-instructor {
  font-size: clamp(0.75rem, 0.68rem + 0.18vw, 0.88rem);
  font-weight: 400;
  color: var(--paper-mid);
  letter-spacing: 0.02em;
}

.class-desc {
  font-size: clamp(0.82rem, 0.76rem + 0.2vw, 0.95rem);
  color: var(--paper-mid);
  line-height: 1.5;
}

.class-divider {
  width: 100%;
  height: 1px;
  background: var(--line-dark);
  margin: 0.55rem 0;
}


/* ---------- AFTER BSLC (after-bslc.html) ---------- */

.path-cards {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1.5rem;
  margin-top: 1.5rem;
}

.path-card {
  background: rgba(255,255,255,0.07);
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: 4px;
  padding: 1.75rem;
}

.path-card h3 {
  font-size: var(--fs-h3);
  font-weight: 700;
  margin-bottom: 0.75rem;
  color: var(--paper);
}

.path-card p {
  font-size: var(--fs-body);
  color: var(--paper-body);
  line-height: 1.7;
}

.college-grid {
  columns: 2;
  column-gap: 2rem;
  margin: 0.75rem 0 1.25rem;
}

.college-grid li {
  list-style: none;
  padding-left: 1em;
  position: relative;
  font-size: clamp(0.88rem, 0.8rem + 0.25vw, 1.05rem);
  color: var(--ink-body);
  line-height: 1.4;
  margin: 0 0 0.3rem;
  break-inside: avoid;
}

.college-grid li::before {
  content: '→';
  position: absolute;
  left: 0;
  color: var(--logo-pink);
  font-size: 0.85em;
}

.college-note {
  line-height: 1.7;   /* slightly tighter than standard body text */
}


/* ---------- ABOUT US (about-us.html) ---------- */

/* Staff stripes come in .cream and .dark variants so they can alternate.
   All current stripes are cream; the .dark rules are kept so the option
   still works. */

.staff-stripe {
  width: 100%;
  display: grid;
  grid-template-columns: 1fr 1fr;
  padding: 3.5rem 0;
}

.staff-stripe.dark {
  background: var(--charcoal);
  border-top: 1px solid var(--line-dark);
  border-bottom: 1px solid var(--line-dark);
}

.staff-stripe.cream {
  background: var(--cream);
}

.staff-photo {
  overflow: hidden;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  min-height: 420px;
}

.staff-photo img {
  width: 500px;
  height: 500px;
  max-width: 80%;
  object-fit: cover;
  object-position: center top;
  display: block;
  border-radius: 4px;
}

.staff-photo-placeholder {
  background: rgba(255,255,255,0.04);
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 420px;
}

.staff-stripe.cream .staff-photo-placeholder {
  background: rgba(42,45,46,0.06);
}

.placeholder-initial {
  font-size: clamp(3rem, 2rem + 4vw, 6rem);
  font-weight: 700;
  opacity: 0.12;
  color: var(--paper);
  letter-spacing: -0.02em;
}

.staff-stripe.cream .placeholder-initial {
  color: var(--charcoal);
}

.staff-text {
  padding: 0 3rem;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
}

.staff-text h2 {
  font-size: clamp(1.35rem, 1.05rem + 1.2vw, 1.9rem);
  font-weight: 700;
  line-height: 1.2;
  margin-bottom: 0.2rem;
}

.staff-role {
  font-size: clamp(0.72rem, 0.64rem + 0.25vw, 0.88rem);
  font-weight: 500;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  margin-bottom: 1.25rem;
}

.staff-text blockquote {
  font-size: var(--fs-body);
  line-height: 1.72;
  font-style: italic;
  font-weight: 300;
  margin-bottom: 1.25rem;
  padding-left: 1rem;
  border-left: 2px solid rgba(48,176,176,0.35);
}

.staff-text h2 + blockquote {
  margin-top: 1.05rem;
}

.staff-text p {
  font-size: var(--fs-body);
  line-height: 1.78;
  margin-bottom: 1rem;
}

.staff-text p:last-of-type {
  margin-bottom: 0;
}

/* Text colors per stripe variant */
.staff-stripe.dark .staff-text { color: var(--paper); }
.staff-stripe.dark .staff-text h2 { color: var(--paper); }
.staff-stripe.dark .staff-text blockquote { color: var(--paper-soft); }
.staff-stripe.dark .staff-text p { color: var(--paper-strong); }
.staff-stripe.dark .staff-text .staff-role { color: var(--paper-mid); }
.staff-stripe.dark .staff-text .staff-contact a { color: var(--teal); }
.staff-stripe.dark .staff-text .staff-link a {
  color: var(--paper-mid);
  border-bottom-color: rgba(232,228,220,0.2);
}

.staff-stripe.cream .staff-text { color: var(--charcoal); }
.staff-stripe.cream .staff-text h2 { color: var(--charcoal); }
.staff-stripe.cream .staff-text blockquote { color: rgba(42,45,46,0.6); }
.staff-stripe.cream .staff-text p { color: var(--ink-body); }
.staff-stripe.cream .staff-text .staff-role { color: var(--ink-mid); }
.staff-stripe.cream .staff-text .staff-contact a { color: var(--teal-dark); }
.staff-stripe.cream .staff-text .staff-link a {
  color: var(--ink-mid);
  border-bottom-color: rgba(42,45,46,0.2);
}

.staff-contact {
  margin-top: 1.25rem;
  font-size: clamp(0.78rem, 0.7rem + 0.22vw, 0.92rem);
  font-weight: 500;
  letter-spacing: 0.06em;
}

.staff-contact a {
  text-decoration: none;
}

.staff-link {
  margin-top: 0.4rem;
  font-size: clamp(0.78rem, 0.7rem + 0.22vw, 0.92rem);
}

.staff-link a {
  text-decoration: none;
  border-bottom: 1px solid;
  padding-bottom: 1px;
}

.forthcoming-badge {
  display: inline-block;
  font-size: clamp(0.65rem, 0.6rem + 0.18vw, 0.78rem);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  background: rgba(48,176,176,0.15);
  color: var(--teal);
  border: 1px solid rgba(48,176,176,0.3);
  border-radius: 2px;
  padding: 0.2rem 0.55rem;
  margin-top: 0.75rem;
  align-self: flex-start;
}

.staff-stripe.cream .forthcoming-badge {
  background: rgba(26,138,138,0.1);
  color: var(--teal-dark);
  border-color: rgba(26,138,138,0.25);
}

/* Thick dividers between stripes; same style is used on the blog list. */
.staff-divider-wrap,
.blog-divider-wrap {
  background: var(--cream);
  padding: 0;
}

.staff-divider,
.blog-divider {
  border: none;
  border-top: 3px solid rgba(42,45,46,0.2);
  margin: 0 2.5rem;
}

.board-section {
  background: var(--cream);
  padding: 4.5rem 2.5rem;
  border-top: 1px solid var(--line-cream-soft);
}

.board-section-inner {
  max-width: 1100px;
  margin: 0 auto;
}

.board-section-header {
  margin-bottom: 3rem;
  text-align: center;
}

.board-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 3rem 4rem;
}

.board-member {
  display: flex;
  gap: 1.5rem;
  align-items: flex-start;
}

.board-photo {
  width: 88px;
  height: 88px;
  border-radius: 50%;
  overflow: hidden;
  flex-shrink: 0;
  background: rgba(42,45,46,0.08);
}

.board-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
  display: block;
}

.board-info h3 {
  font-size: var(--fs-h3);
  font-weight: 600;
  color: var(--charcoal);
  margin-bottom: 0.6rem;
  line-height: 1.25;
}

.board-info p {
  font-size: clamp(0.88rem, 0.8rem + 0.3vw, 1rem);
  line-height: 1.72;
  color: var(--ink-mid);
}

.ll-section {
  background: var(--charcoal);
  padding: 4rem 2.5rem;
  border-top: 1px solid var(--line-dark);
}

.ll-section-inner {
  max-width: 1100px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 280px;
  gap: 4rem;
  align-items: center;
}

.ll-text p {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--paper-body);
  margin-bottom: 1rem;
}

.ll-text p:last-of-type {
  margin-bottom: 0;
}

.ll-link {
  color: var(--teal);
  text-decoration: none;
  border-bottom: 1px solid rgba(48,176,176,0.4);
}

.ll-badge-col {
  display: flex;
  justify-content: center;
  align-items: center;
}

.ll-logo {
  width: 150px;
  height: 150px;
  opacity: 0.85;
  display: block;
}


/* ---------- ENROLL (enroll.html) ---------- */

.steps-section {
  background: var(--cream);
  padding: 4.5rem 2.5rem;
}

.steps-inner {
  max-width: var(--content-width);
  margin: 0 auto;
}

.steps-intro {
  margin-bottom: 3rem;
}

.steps-intro p,
.step-body p {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--ink-lead);
}

.steps-intro p {
  max-width: 640px;
}

.steps-list {
  display: flex;
  flex-direction: column;
  gap: 0;
}

.step {
  display: grid;
  grid-template-columns: 3.5rem 1fr;
  gap: 1.5rem;
  align-items: start;
  padding: 2rem 0;
  border-bottom: 1px solid var(--line-cream);
}

.step:last-child {
  border-bottom: none;
}

.step-num {
  font-size: clamp(2rem, 1.6rem + 1.5vw, 2.8rem);
  font-weight: 700;
  line-height: 1;
  color: rgba(42,45,46,0.55);
  padding-top: 0.15rem;
  text-align: right;
}

.step-body h3 {
  font-size: clamp(1.1rem, 1rem + 0.5vw, 1.4rem);
  font-weight: 700;
  color: var(--charcoal);
  margin-bottom: 0.5rem;
  line-height: 1.25;
}

.tuition-aid-row {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 1.5rem;
  margin: 2.5rem 0;
  align-items: start;
}

.tuition-cards {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}

.tuition-total {
  background: rgba(255,255,255,0.04);
  border: 1px solid rgba(255,255,255,0.09);
  border-radius: 3px;
  padding: 1.75rem 2rem;
  text-align: center;
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-width: 220px;
}

.fee-label {
  font-size: clamp(0.72rem, 0.65rem + 0.2vw, 0.84rem);
  font-weight: 500;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--paper-mid);
  margin-bottom: 0.6rem;
}

.fee-amount {
  font-size: clamp(1.8rem, 1.4rem + 1.5vw, 2.6rem);
  font-weight: 700;
  line-height: 1;
  color: var(--teal);
}

.fee-amount .fee-unit {
  font-size: clamp(0.85rem, 0.78rem + 0.25vw, 1rem);
  font-weight: 400;
  color: var(--paper-mid);
  display: block;
  margin-top: 0.4rem;
  letter-spacing: 0.03em;
}

.aid-band {
  background: rgba(232,114,74,0.1);
  border: 1px solid rgba(232,114,74,0.3);
  border-radius: 3px;
  padding: 2rem 2rem;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1.5rem;
}

.aid-band-text h3 {
  font-size: var(--fs-body);
  font-weight: 700;
  color: var(--paper);
  margin-bottom: 0.5rem;
}

.aid-band-text p,
.payment-block p {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--paper-mid);
}

.payment-details {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem;
  margin-top: 2.5rem;
  padding-top: 2.5rem;
  border-top: 1px solid rgba(255,255,255,0.08);
}

.payment-block h4 {
  font-size: clamp(0.78rem, 0.7rem + 0.2vw, 0.92rem);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--paper-mid);
  margin-bottom: 0.6rem;
}

.payment-block a {
  color: var(--teal);
  text-decoration: none;
}


/* ---------- VISIT (visit.html) ---------- */

.visit-steps {
  display: flex;
  flex-direction: column;
  gap: 0;
}

.visit-step {
  display: grid;
  grid-template-columns: 2.5rem 1fr;
  gap: 0 1.5rem;
  padding: 1.5rem 0;
  border-bottom: 1px solid var(--line-cream);
}

.visit-step:last-child {
  border-bottom: none;
}

.visit-step-num {
  font-size: clamp(1.1rem, 1rem + 0.4vw, 1.4rem);
  font-weight: 700;
  color: var(--teal);
  padding-top: 0.1rem;
  line-height: 1.3;
}

.visit-step-body h3 {
  font-size: var(--fs-h3);
  font-weight: 700;
  color: var(--charcoal);
  margin-bottom: 0.5rem;
  line-height: 1.3;
}

.form-section {
  background: var(--cream);
  padding: 4rem 2.5rem 4.5rem;
  border-top: 1px solid var(--line-cream-soft);
}

.form-section-inner {
  max-width: var(--content-width);
  margin: 0 auto;
}

.form-section-inner .form-intro {
  font-size: var(--fs-body);
  line-height: 1.7;
  color: var(--ink-body);
  margin-bottom: 0.75rem;
}

.form-hours {
  font-size: clamp(0.88rem, 0.8rem + 0.3vw, 1.05rem);
  color: var(--ink-mid);
  margin-bottom: 2rem;
}


/* ---------- VOLUNTEER & DONATE (volunteer-donate.html) ---------- */

.donate-layout {
  max-width: var(--content-width);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 3.5rem;
  align-items: center;
}

.donate-text p {
  margin-bottom: 2rem;
  max-width: 520px;
}

.donate-photo {
  width: clamp(160px, 18vw, 260px);
  flex-shrink: 0;
  border-radius: 3px;
  overflow: hidden;
  box-shadow: 0 4px 24px rgba(0,0,0,0.12);
}

.donate-photo img {
  width: 100%;
  height: auto;
  display: block;
}

.vol-form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1rem 2rem;
  margin-top: 0.5rem;
}

.vol-form-full {
  grid-column: 1 / -1;
}

.vol-form fieldset {
  border: none;
  min-width: 0;
}

.vol-form label,
.vol-form legend {
  display: block;
  font-size: clamp(0.75rem, 0.65rem + 0.25vw, 0.88rem);
  font-weight: 500;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--paper-mid);
  margin-bottom: 0.4rem;
}

.vol-form input,
.vol-form textarea,
.vol-form select {
  font-family: inherit;
  font-size: clamp(0.9rem, 0.82rem + 0.3vw, 1.05rem);
  background: rgba(255,255,255,0.05);
  border: 1px solid rgba(255,255,255,0.1);
  color: var(--paper);
  padding: 0.65rem 0.9rem;
  border-radius: 2px;
  width: 100%;
  outline: none;
  transition: border-color 0.15s;
}

.vol-form input:focus,
.vol-form textarea:focus,
.vol-form select:focus {
  border-color: rgba(48,176,176,0.5);
}

.vol-form select option {
  background: var(--charcoal);
}

.vol-form textarea {
  height: 120px;
  resize: vertical;
}

.vol-form-checkboxes {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0.6rem 1.5rem;
  margin-top: 0.25rem;
}

.vol-form-check {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: clamp(0.88rem, 0.8rem + 0.3vw, 1rem);
  color: var(--paper-strong);
  cursor: pointer;
}

/* Undo the shared input styling for checkboxes */
.vol-form-check input[type="checkbox"] {
  width: 1rem;
  height: 1rem;
  accent-color: var(--teal);
  cursor: pointer;
  flex-shrink: 0;
  padding: 0;
  border: none;
  background: none;
}

.vol-availability {
  display: flex;
  gap: 0.6rem 1.2rem;
  flex-wrap: wrap;
  margin-top: 0.25rem;
}

.vol-submit {
  margin-top: 0.5rem;
}

.section-cream-alt {
  background: var(--cream);
  padding: 4rem 2.5rem;
  border-top: 1px solid var(--line-cream-soft);
}


/* ---------- BLOG (blog.html) ---------- */

.blog-list {
  max-width: 1000px;
  margin: 0 auto;
}

.blog-entry {
  background: var(--cream);
  display: grid;
  grid-template-columns: 1fr 280px;
  gap: 3rem;
  align-items: center;
  padding: 3rem 2.5rem;
  max-width: 100%;
}

/* Bylines and dates: shared between the blog list and post pages */
.blog-meta,
.post-meta {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  margin-bottom: 0.9rem;
  flex-wrap: wrap;
}

.blog-author,
.post-author {
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--teal-dark);
}

.blog-date,
.post-date {
  font-size: var(--fs-meta);
  font-weight: 500;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-mid);
}

.blog-entry-title {
  font-size: clamp(1.25rem, 1rem + 1vw, 1.75rem);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
  margin-bottom: 0.9rem;
  color: var(--charcoal);
}

.blog-entry-title a {
  color: inherit;
  text-decoration: none;
}

.blog-entry-title a:hover {
  color: var(--teal-dark);
  transition: color 0.15s;
}

.blog-teaser {
  font-size: var(--fs-body);
  line-height: 1.78;
  color: var(--ink-mid);
  margin-bottom: 1.25rem;
}

.blog-read-more {
  display: inline-block;
  font-size: var(--fs-meta);
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--orange-dark);
  text-decoration: none;
  border-bottom: 1px solid rgba(192,96,32,0.35);
  padding-bottom: 2px;
  transition: color 0.15s, border-color 0.15s;
}

.blog-read-more:hover {
  color: var(--teal-dark);
  border-color: rgba(26,138,138,0.4);
}

.blog-entry-photo {
  overflow: hidden;
  border-radius: 3px;
  aspect-ratio: 1 / 1;
  background: rgba(42,45,46,0.08);
}

.blog-entry-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}

/* Used by the blog pipeline when a post has no photo */
.blog-entry-photo.placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
}

.blog-entry-photo.placeholder::after {
  content: '';
  display: block;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: rgba(42,45,46,0.1);
}


/* ---------- BLOG POST (posts/*.html, via post-template.html) ---------- */

.post-wrap {
  max-width: 720px;
  margin: 0 auto;
  padding: 3.5rem 2.5rem 5rem;
}

.post-back {
  display: inline-block;
  font-size: var(--fs-meta);
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-mid);
  text-decoration: none;
  border-bottom: 1px solid rgba(42,45,46,0.2);
  padding-bottom: 2px;
  margin-bottom: 2.5rem;
  transition: color 0.15s, border-color 0.15s;
}

.post-back:hover {
  color: var(--teal-dark);
  border-color: rgba(26,138,138,0.4);
}

.post-title {
  font-size: clamp(1.7rem, 1.2rem + 2vw, 2.6rem);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.01em;
  margin-bottom: 2rem;
  color: var(--charcoal);
}

/* Hero image inserted by the blog pipeline ({{HERO_IMAGE_BLOCK}}) */
.post-hero {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  object-position: center;
  border-radius: 3px;
  display: block;
  margin-bottom: 2.5rem;
}

.post-body {
  font-size: var(--fs-body);
  line-height: 1.82;
  color: rgba(42,45,46,0.82);
}

.post-body p {
  margin-bottom: 1.5rem;
}

.post-body p:last-child {
  margin-bottom: 0;
}

.post-body em {
  font-style: italic;
}

.post-body strong {
  font-weight: 600;
  color: var(--charcoal);
}

.post-body a {
  color: var(--teal-dark);
  text-decoration: none;
  border-bottom: 1px solid rgba(26,138,138,0.35);
}

.post-body a:hover {
  border-color: var(--teal-dark);
}

.post-body h2 {
  font-size: clamp(1.2rem, 1rem + 0.8vw, 1.55rem);
  font-weight: 700;
  color: var(--charcoal);
  margin: 2.5rem 0 1rem;
  line-height: 1.2;
}

.post-body h3 {
  font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
  font-weight: 600;
  color: rgba(42,45,46,0.85);
  margin: 2rem 0 0.75rem;
  line-height: 1.25;
}

.post-body ul,
.post-body ol {
  padding-left: 1.5rem;
  margin-bottom: 1.5rem;
}

.post-body li {
  margin-bottom: 0.5rem;
}

.post-body figure {
  margin: 2.5rem 0;
}

.post-body figure img {
  width: 100%;
  border-radius: 3px;
  display: block;
}

.post-body figcaption {
  font-size: clamp(0.75rem, 0.68rem + 0.2vw, 0.88rem);
  color: var(--ink-mid);
  letter-spacing: 0.03em;
  margin-top: 0.6rem;
  line-height: 1.5;
}


/* =========================================================================
   8. RESPONSIVE / MOBILE
   ========================================================================= */

@media (max-width: 640px) {

  /* Nav and footer mobile rules live in the 700px block at the bottom
     of this file — they collapse at 700px on every page. */

  /* -- shared hero / sections -- */

  .hero,
  .page-hero {
    padding: 2.5rem 1.25rem 2rem;
  }

  /* The index/how-it-works hero override (near the top of this file)
     outranks the rule above, so it's reset here to match every other
     page's mobile hero padding. */
  body.page-index .hero,
  body.page-how-it-works .hero {
    padding: 2.5rem 1.25rem 2rem;
  }

  .section-dark,
  .section-cream {
    padding: 3rem 1.25rem;
  }

  /* -- stripes stack; text always comes before the photo -- */

  .split-stripe {
    grid-template-columns: 1fr;
    margin-top: 2rem;
  }

  .split-stripe .split-text { order: 1; }
  .split-stripe .split-photo { order: 2; }

  .split-photo img {
    min-height: 260px;
  }

  .split-text {
    padding: 2rem 1.25rem;
  }

  .pillar-stripe {
    grid-template-columns: 1fr;
  }

  .pillar-stripe .pillar-text { order: 1; }
  .pillar-stripe .pillar-photo { order: 2; }

  .pillar-photo img {
    min-height: 260px;
  }

  .pillar-text {
    padding: 2rem 1.25rem;
  }

  .testimonials {
    padding: 3rem 1.25rem;
  }

  /* Smaller gutter and buttons on narrow phones, so the arrows don't
     eat too much of the available card width. Scoped to .carousel--text
     so the how-it-works photo carousel is untouched. */
  .carousel--text {
    padding: 0 2.4rem;
  }

  .carousel--text .carousel-btn {
    width: 1.9rem;
    height: 1.9rem;
    font-size: 1.1rem;
  }

  .carousel--text .carousel-prev { left: 0.25rem; }
  .carousel--text .carousel-next { right: 0.25rem; }

  .sample-day {
    padding: 3rem 1.25rem;
  }

  .sample-day-inner {
    grid-template-columns: 1fr;
    gap: 2rem;
  }

  /* -- CLASSES & CALENDAR -- */

  .calendars-section {
    padding: 3rem 1.25rem;
  }

  .calendars-inner {
    margin-bottom: 2.5rem;
  }

  .calendar-embed {
    aspect-ratio: 3 / 4;
  }

  .class-categories,
  .dates-categories {
    grid-template-columns: 1fr;
  }

  /* -- AFTER BSLC -- */

  .path-cards {
    grid-template-columns: 1fr;
  }

  .college-grid {
    columns: 1;
  }

  /* -- ABOUT US -- */

  .staff-stripe {
    grid-template-columns: 1fr;
    padding: 2rem 0;
    gap: 2rem;
  }

  .page-hero + .staff-stripe {
    padding-top: 2.5rem;
  }

  .staff-stripe .staff-photo { order: 1; }
  .staff-stripe .staff-text { order: 2; }

  .staff-photo {
    min-height: 300px;
    align-items: center;
  }

  .staff-photo img {
    width: 344px;
    height: 344px;
  }

  .staff-photo-placeholder {
    min-height: 220px;
  }

  .staff-text {
    padding: 0 1.25rem;
  }

  .board-section {
    padding: 3rem 1.25rem;
  }

  .board-grid {
    grid-template-columns: 1fr;
    gap: 2.25rem;
  }

  .ll-section {
    padding: 3rem 1.25rem;
  }

  .ll-section-inner {
    grid-template-columns: 1fr;
    gap: 2rem;
  }

  .ll-badge-col {
    justify-content: flex-start;
  }

  /* -- ENROLL -- */

  /* body.page-enroll .section-dark (near the top of this file) outranks
     the generic .section-dark mobile reset above due to higher
     specificity, so it never picked up the reduced mobile padding.
     Restated here to match. */
  body.page-enroll .section-dark {
    padding: 3rem 1.25rem;
  }

  .steps-section {
    padding: 3rem 1.25rem;
  }

  .steps-inner {
    max-width: 100%;
  }

  .step {
    grid-template-columns: 2.5rem 1fr;
    gap: 1rem;
  }

  .step-num {
    font-size: 1.6rem;
  }

  .tuition-aid-row {
    grid-template-columns: 1fr;
    gap: 1rem;
  }

  .tuition-cards {
    flex-direction: row;
    justify-content: center;
    gap: 1rem;
  }

  .tuition-total {
    min-width: 0;
    flex: 1 1 0;
  }

  .payment-details {
    grid-template-columns: 1fr;
    gap: 1.5rem;
  }

  .hero-cta {
    flex-direction: column;
    align-items: center;
  }

  /* -- VISIT -- */

  .form-section {
    padding: 3rem 1.25rem 3.5rem;
  }

  /* -- VOLUNTEER & DONATE -- */

  .section-cream-alt {
    padding: 3rem 1.25rem;
  }

  .vol-form {
    grid-template-columns: 1fr;
  }

  .vol-form-full {
    grid-column: 1;
  }

  .vol-form-checkboxes {
    grid-template-columns: repeat(2, 1fr);
  }

  .donate-layout {
    grid-template-columns: 1fr;
    gap: 2rem;
  }

  .donate-photo {
    width: clamp(120px, 40vw, 200px);
  }

}


/* Below 480px, the two tuition/aid number boxes no longer have room to
   sit side by side — 7-character values like "$14,500" and "$31,825"
   start overflowing their box at that width (the .tuition-total rule
   above lets each box shrink below its content's width via
   min-width: 0, so the digits spill out instead of wrapping, which is
   what pushes the whole page wider than the viewport on small phones).
   Reverting to a stacked column here keeps each box full-width instead. */
@media (max-width: 480px) {

  .tuition-cards {
    flex-direction: column;
  }

  .tuition-total {
    flex: none;
  }

}


/* Between 641 and 960px the class categories (and the new key-dates
   categories, which use the same 3-column layout) drop to 2 columns. */
@media (min-width: 641px) and (max-width: 960px) {

  .class-categories,
  .dates-categories {
    grid-template-columns: 1fr 1fr;
  }

}


/* The nav and footer collapse at 700px on ALL pages (the blog's
   two-column entry layout also stacks here, so blog pages change all at
   once). Hamburger menu falls to the right of the Schedule a Visit button. */
@media (max-width: 700px) {

  nav {
    padding: 1rem 1.25rem;
    gap: 0;
  }

  .nav-right {
  gap: 1rem;
}

.hamburger {
  order: 2;
}

.nav-right .btn-teal {
  order: 1;
}

  /* The visit page's extra desktop padding (near the top of this file)
     outranks the rule above, so it's reset here to match every other
     page's mobile nav. */
  body.page-visit nav {
    padding: 1rem 1.25rem;
    gap: 0;
  }

  .nav-links {
    display: none;
  }

  .hamburger {
    display: flex;
  }

  .nav-right {
    gap: 1rem;
  }

  footer {
    padding: 2.5rem 1.25rem 0;
  }

  .footer-grid {
    grid-template-columns: 1fr 1fr;
    gap: 1.5rem;
  }

  .footer-base {
    flex-direction: column;
    align-items: flex-start;
  }

  .blog-divider,
  .staff-divider {
    margin: 0 1.25rem;
  }

  /* Blog entries stack: meta, title, photo, teaser, read-more */
  .blog-entry {
    grid-template-columns: 1fr;
    gap: 0;
    padding: 2rem 1.25rem;
  }

  .blog-entry-text {
    display: contents;
  }

  .blog-meta { order: 1; }
  .blog-entry-title { order: 2; }

  .blog-entry-photo {
    order: 3;
    display: block;
    margin-bottom: 1.25rem;
  }

  .blog-teaser { order: 4; }

  .blog-read-more {
    order: 5;
    justify-self: start;
  }

  .post-wrap {
    padding: 2.5rem 1.25rem 4rem;
  }

}
