/* ============================================================================
   NYC DIGITAL DESIGN SYSTEM — Theme Override Layer
   
   When <html data-theme="nyc"> is set, every CSS custom property from
   tokens.css is overridden to match the NYC Digital Design System specs
   (designsystem.nyc.gov). The toggle lives in the prototype toolbar.
   
   This is a REPLICA theme — the actual @nycds/core package is private
   (Azure DevOps registry, NYC government only). All values here come
   from the publicly documented specs on designsystem.nyc.gov.
   
   Fonts:
     Heading: Clash Grotesk (Fontshare, free)
     Body/UI: Noto Sans (Google Fonts, free)
   
   Primary interactive color: #103FEF (Blue 40)
   ============================================================================ */

/* ── Token Overrides ─────────────────────────────────────────────────────── */

[data-theme="nyc"] {
  /* ── NYC Brand Colors ──────────────────────────────────────────────── */
  --nyc-dark:            #000000;
  --nyc-red:             #1B2C8F;        /* Navy — default interactive blue */
  --nyc-red-hover:       #103FEF;        /* Bright Blue 40 — hover/active feedback */
  --nyc-red-light:       var(--nyc-ref-color-blue-80);        /* Blue 80 — selection highlight */
  --nyc-red-bg:          #E8EEFF;        /* Light blue tint — subtle bg */

  /* ── Page & Surface Colors ─────────────────────────────────────────── */
  --page-bg:             #FFFFFF;
  --page-pink:           #E8EEFF;        /* Neutral blue instead of pink */
  --page-pink-light:     #F0F4FF;
  --page-pink-deep:      #C5D4F0;
  --surface-white:       #FFFFFF;
  --surface-card:        #FFFFFF;
  --surface-muted:       #F5F5F5;
  --surface-hover:       #EEEEEE;

  /* ── Page Background — internal-page gradient. Top matches the page-header
     bg (#F0EFF8) so the header blends into the body; bottom keeps the
     existing light blue. ── */
  --page-gradient-start: #FAFAFE;
  --page-gradient-end:   #F0EFF8;
  --page-gradient:       linear-gradient(180deg, #FAFAFE 0%, #FAFAFE 45%, #F0EFF8 100%);

  /* ── Text Colors ───────────────────────────────────────────────────── */
  --text-primary:        #000000;
  --text-secondary:      #333333;        /* Gray 20 */
  --text-muted:          #555555;        /* Gray 30 */
  --text-inverse:        #FFFFFF;
  --text-link:           #1B2C8F;        /* Navy — default link color */
  --text-link-hover:     #103FEF;        /* Bright Blue 40 — hover feedback */
  --text-link-visited:   #6B3FA0;        /* Purple — visited state */

  /* ── Status Colors ─────────────────────────────────────────────────── */
  /* All mapped to NYC DS reference tokens (designsystem.nyc.gov) */
  --status-verified-bg:     var(--nyc-ref-color-green-100);
  --status-verified-text:   var(--nyc-ref-color-green-50);
  --status-verified-border: var(--nyc-ref-color-green-70);

  --status-checking-bg:     var(--nyc-ref-color-blue-100);
  --status-checking-text:   var(--nyc-ref-color-blue-40);
  --status-checking-border: var(--nyc-ref-color-blue-70);

  --status-progress-bg:     var(--nyc-ref-color-yellow-100);
  --status-progress-text:   var(--nyc-ref-color-orange-50);
  --status-progress-border: var(--nyc-ref-color-orange-70);

  --status-reviews-bg:      var(--nyc-ref-color-red-100);
  --status-reviews-text:    var(--nyc-ref-color-red-50);
  --status-reviews-border:  var(--nyc-ref-color-red-70);

  /* Application-status pills */
  --status-draft-bg:           #F5F5F5;
  --status-draft-text:         var(--nyc-ref-color-gray-20, #333);
  --status-draft-border:       var(--nyc-ref-color-gray-70, #ccc);

  --status-draft-expired-bg:   var(--nyc-ref-color-red-100);
  --status-draft-expired-text: var(--nyc-ref-color-red-50);
  --status-draft-expired-border: var(--nyc-ref-color-red-70);

  --status-in-process-bg:      var(--nyc-ref-color-blue-100);
  --status-in-process-text:    var(--nyc-ref-color-blue-40);
  --status-in-process-border:  var(--nyc-ref-color-blue-70);

  --status-approved-bg:        var(--nyc-ref-color-green-100);
  --status-approved-text:      var(--nyc-ref-color-green-50);
  --status-approved-border:    var(--nyc-ref-color-green-70);

  --status-waitlisted-bg:      var(--nyc-ref-color-yellow-100);
  --status-waitlisted-text:    var(--nyc-ref-color-orange-50);
  --status-waitlisted-border:  var(--nyc-ref-color-orange-70);

  --status-denied-bg:          #FFFFFF;
  --status-denied-text:        var(--nyc-ref-color-red-50);
  --status-denied-border:      var(--nyc-ref-color-red-50);

  /* ── Stepper Colors ────────────────────────────────────────────────── */
  --stepper-completed:     var(--nyc-ref-color-green-50);
  --stepper-current:       var(--nyc-ref-color-blue-40);
  --stepper-line:          var(--nyc-ref-color-green-50);
  --stepper-line-current:  var(--nyc-ref-color-blue-40);

  /* ── Alert / Banner Colors ─────────────────────────────────────────── */
  --alert-warning-bg:      var(--nyc-ref-color-yellow-100);
  --alert-warning-border:  var(--nyc-ref-color-orange-70);
  --alert-warning-text:    var(--text-primary);
  --alert-info-bg:         var(--nyc-ref-color-blue-100);
  --alert-info-border:     var(--nyc-ref-color-blue-70);
  --alert-info-text:       var(--text-primary);
  --alert-error-bg:        var(--nyc-ref-color-red-100);
  --alert-error-border:    var(--nyc-ref-color-red-70);
  --alert-error-text:      var(--text-primary);
  --alert-success-bg:      var(--nyc-ref-color-green-100);
  --alert-success-border:  var(--nyc-ref-color-green-70);
  --alert-success-text:    var(--text-primary);

  /* ── Panel Colors ──────────────────────────────────────────────────── */
  --panel-info-bg:         var(--nyc-ref-color-blue-100);
  --panel-info-text:       var(--text-primary);
  --panel-info-accent:     var(--nyc-ref-color-blue-70);

  --panel-warning-bg:      var(--nyc-ref-color-yellow-100);
  --panel-warning-text:    var(--text-primary);
  --panel-warning-accent:  var(--nyc-ref-color-orange-70);

  --panel-success-bg:      var(--nyc-ref-color-green-100);
  --panel-success-text:    var(--text-primary);
  --panel-success-accent:  var(--nyc-ref-color-green-70);

  --panel-error-bg:        var(--nyc-ref-color-red-100);
  --panel-error-text:      var(--text-primary);
  --panel-error-accent:    var(--nyc-ref-color-red-70);

  --panel-muted-bg:        var(--nyc-ref-color-gray-90, #eee);
  --panel-muted-text:      var(--text-primary);
  --panel-muted-accent:    var(--nyc-ref-color-gray-70, #ccc);

  --surface-info-soft:     var(--nyc-ref-color-blue-100);
  --border-info-soft:      var(--nyc-ref-color-blue-80);

  /* ── NYC Design System Reference Tokens ──────────────────────────── */
  /* Primitive color scales from designsystem.nyc.gov — used by
     component-level overrides below (e.g. color-mix backgrounds). */
  --nyc-ref-color-orange-90: #ffe0c2;
  --nyc-ref-color-orange-80: #fcc788;
  --nyc-ref-color-orange-70: #fba95b;
  --nyc-ref-color-orange-60: #f98d26;
  --nyc-ref-color-orange-50: #e57000;
  --nyc-ref-color-blue-100:  #e7f0fa;
  --nyc-ref-color-blue-90:   #d1e9ff;
  --nyc-ref-color-blue-80:   #b5dbff;
  --nyc-ref-color-blue-70:   #70baff;
  --nyc-ref-color-blue-60:   #3185fc;
  --nyc-ref-color-blue-40:   #1B2C8F;   /* Navy — unified interactive blue (was #103fef) */
  --nyc-ref-color-red-100:   #fde7e8;
  --nyc-ref-color-red-90:    #f9b8bb;
  --nyc-ref-color-red-70:    #f47178;
  --nyc-ref-color-red-50:    #ec131e;
  --nyc-ref-color-green-100: #e6f8e6;
  --nyc-ref-color-green-90:  #b3e9b3;
  --nyc-ref-color-green-70:  #66d468;
  --nyc-ref-color-green-50:  #00b703;
  --nyc-ref-color-yellow-100:#fff9e5;
  --nyc-ref-color-yellow-90: #ffeeb2;
  --nyc-ref-color-gray-90:   #eee;
  --nyc-ref-color-gray-80:   #ddd;
  --nyc-ref-color-gray-70:   #ccc;
  --nyc-ref-color-gray-30:   #555;
  --nyc-ref-color-gray-20:   #333;

  /* System-level semantic surfaces & auxiliary colors */
  --nyc-sys-color-surface-warning:  var(--nyc-ref-color-yellow-100);
  --nyc-sys-color-surface-error:    var(--nyc-ref-color-red-100);
  --nyc-sys-color-surface-success:  var(--nyc-ref-color-green-100);
  --nyc-sys-color-surface-info:     var(--nyc-ref-color-blue-100);
  --nyc-sys-color-auxiliary-warning: var(--nyc-ref-color-orange-70);
  --nyc-sys-color-auxiliary-error:   var(--nyc-ref-color-red-50);
  --nyc-sys-color-auxiliary-success: var(--nyc-ref-color-green-50);
  --nyc-sys-color-auxiliary-info:    var(--nyc-ref-color-blue-70);
  --nyc-sys-radius-xs: 8px;

  /* ── Border Colors ─────────────────────────────────────────────────── */
  --border-light:          #DDDDDD;      /* Gray 80 */
  --border-medium:         #CCCCCC;      /* Gray 70 */
  --border-dark:           #555555;      /* Gray 30 */
  --border-input:          #555555;      /* Thicker contrast */
  --border-focus:          #1B2C8F;      /* Navy focus ring — unified interactive blue */

  /* ── Typography ────────────────────────────────────────────────────── */
  --font-heading:          'Clash Grotesk', 'Noto Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  --font-body:             'Noto Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  --font-ui:               'Noto Sans', -apple-system, BlinkMacSystemFont, sans-serif;
  /* NYC trims "bold" to 600 everywhere — only the page <h1> stays 700 (restored
     below). Redefining the token flips all var(--font-weight-bold) usages at
     once; the 16 literal-700 NYC rules were lowered to 600 alongside. */
  --font-weight-bold:      600;

  /* ── Spacing (aligned to NYC 8px base) ─────────────────────────────── */
  --space-sm:              8px;
  --space-base:            16px;
  --space-lg:              24px;
  --space-xl:              24px;
  --space-2xl:             32px;
  --space-3xl:             48px;
  --space-4xl:             64px;

  /* ── Border Radius — NYC DS uses sharper corners ───────────────────── */
  --radius-xs:             2px;
  --radius-sm:             2px;
  --radius-md:             4px;
  --radius-lg:             4px;
  --radius-xl:             8px;

  /* ── Shadows — NYC DS is flatter ───────────────────────────────────── */
  --shadow-sm:             0 1px 2px rgba(0,0,0,0.06);
  --shadow-md:             0 2px 4px rgba(0,0,0,0.08);
  --shadow-lg:             0 4px 12px rgba(0,0,0,0.10);
  --shadow-card:           0 1px 3px rgba(0,0,0,0.05);
  --shadow-card-hover:     0 2px 6px rgba(0,0,0,0.08);

  /* ── Reading Measure ───────────────────────────────────────────────── */
  --reading-max-width:     860px;  /* NYC DS: 860px max line length */
}

/* ── Component-Level Overrides ─────────────────────────────────────────── */

/* ── Buttons — NYC DS (designsystem.nyc.gov) ─────────────────────────── */
/* Spec source: DevTools computed values from production nyc.gov buttons.
   Primary: 40px radius, Blue 40 fill + Blue 40 border, white text.
   Secondary: 40px radius, white bg, gray (#DDD) border, Blue 40 text.
   Both: Noto Sans 22px / 600 / line-height 26.4px / padding 12px 32px. */

[data-theme="nyc"] .btn {
  border-radius: 40px;            /* NYC DS: 40px, not full pill */
  letter-spacing: normal;         /* NYC DS: no letter-spacing */
  text-transform: none;
  font-weight: 600;               /* NYC DS: one step bolder than body 500 */
  font-size: 22px;                /* NYC DS: 22px */
  line-height: 1.2;               /* NYC DS: 26.4px / 22px */
  padding: 12px 32px;             /* NYC DS: 12px vertical, 32px horizontal */
  transition: background 0.3s ease,
              color 0.3s ease,
              border-color 0.3s ease,
              box-shadow 0.3s ease;
}
[data-theme="nyc"] .btn--primary {
  box-shadow: none;
  background: var(--nyc-red);
  color: #FFFFFF;
  border: 2px solid var(--nyc-red);
}
[data-theme="nyc"] .btn--primary:hover {
  background: var(--nyc-red-hover);
  border-color: var(--nyc-red-hover);
  color: #FFFFFF;
}
[data-theme="nyc"] .btn--primary:focus-visible {
  outline: 2px dotted #000000;
  outline-offset: 2px;
}
/* Secondary: white bg, gray border, Blue 40 text.
   Hover: background + border stay, only text color shifts darker.
   Must use explicit color on :visited and :hover to prevent
   the generic a.btn:visited { color: inherit } from killing blue. */
[data-theme="nyc"] .btn--secondary,
[data-theme="nyc"] .btn--secondary:visited,
[data-theme="nyc"] .page-body a.btn--secondary,
[data-theme="nyc"] .page-body a.btn--secondary:visited {
  background: #FFFFFF;
  color: var(--nyc-red);
  border: 2px solid #DDDDDD;
}
[data-theme="nyc"] .btn--secondary:hover,
[data-theme="nyc"] .page-body a.btn--secondary:hover {
  background: #FFFFFF;
  border-color: #DDDDDD;
  color: var(--nyc-red-hover);
}
[data-theme="nyc"] .btn--secondary:focus-visible {
  outline: 2px dotted #000000;
  outline-offset: 2px;
}
[data-theme="nyc"] .btn:disabled {
  background: #EEEEEE;
  color: #777777;
  border-color: #CCCCCC;
  cursor: not-allowed;
}
/* Medium button — proportionally scaled for card-level actions */
[data-theme="nyc"] .btn--md {
  font-size: 18px;
  padding: 8px 24px;
}

/* ── Icon-only button (NYC DS) ───────────────────────────────────────────
   Circular icon-only button using the SECONDARY text-button palette
   (designsystem.nyc.gov "Icon button"): white fill, gray border, Blue 40
   glyph, navy glyph on hover, dotted focus ring, gray disabled. Every
   icon-only button in the NYC theme uses this one secondary treatment.
   CC theme has no `.icon-btn` rules, so icon-only buttons there keep
   their bare-icon look.

   The doubled class (.icon-btn.icon-btn) raises specificity above the base
   entry-list `.entry-list__row-action--delete:hover { color: var(--nyc-red) }`
   rule — which is blue under the NYC theme and loads after this file — so
   the glyph color isn't hijacked on hover. */
[data-theme="nyc"] .icon-btn.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border-radius: 50%;
  background: #FFFFFF;
  color: var(--nyc-red);                   /* Blue 40 glyph */
  border: 2px solid #DDDDDD;
  box-shadow: none;
  cursor: pointer;
  transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
}
[data-theme="nyc"] .icon-btn.icon-btn:hover {
  background: #FFFFFF;
  border-color: #DDDDDD;
  color: var(--nyc-red-hover);             /* navy glyph on hover */
}
[data-theme="nyc"] .icon-btn.icon-btn:focus-visible {
  outline: 2px dotted #000000;
  outline-offset: 2px;
}
[data-theme="nyc"] .icon-btn.icon-btn:disabled {
  background: #EEEEEE;
  color: #777777;
  border-color: #CCCCCC;
  cursor: not-allowed;
}
/* The glyph inherits the button's text color (Blue 40 / navy on hover). */
[data-theme="nyc"] .icon-btn .material-symbols-outlined {
  color: inherit;
  font-size: 20px;
}
/* Mobile: slightly smaller, per the spec. */
@media (max-width: 480px) {
  [data-theme="nyc"] .icon-btn {
    width: 38px;
    height: 38px;
  }
}

/* ── Doc Upload — gap below the "About the application form" info note ───
   The shared .inline-note carries no bottom margin, so on the Doc Upload
   step the blue info card sat flush against the first requirement card.
   Give the requirement card that immediately follows the note a top gap
   matching its own bottom margin. Scoped to NYC (CC stays the control). */
[data-theme="nyc"] .inline-note + .doc-upload__card {
  margin-top: var(--space-lg);
}
/* Gap below the in-card guardian note (the amber "Legal guardian?" tip on
   the relationship requirement) so it doesn't sit flush against the
   "Pick the document type" radio-group label beneath it. */
[data-theme="nyc"] .doc-upload__card .inline-note {
  margin-bottom: var(--space-xl);
}

/* Income — give the amber "different amounts" tip room above it. The base
   collapses both the radios' bottom margin (§5 reveal rule) and the note's top
   margin to 0, leaving it flush against "No". Restore a clear gap on the note
   itself (more specific than income.css's margin-top:0, and the reveal rule
   only zeroes the group, not the note). */
[data-theme="nyc"] .income-amounts-vary .inline-note {
  margin-top: var(--space-base);
}

/* Income total — NYC grey card: drop the flat border, use the 8px radius +
   soft shadow that every other NYC container uses (no flat corners / borders
   in NYC). Grey fill stays. */
[data-theme="nyc"] .income-info__total {
  border: none;
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* ── Headings — NYC DS tighter line-height ───────────────────────────── */
/* Noto Sans bold at large sizes needs tighter leading than the base
   theme's 1.7 body line-height. Most component titles are <div>s with
   heading font (not <h> tags), so we target both h-tags AND the common
   __title classes to ensure consistent tight leading. */
[data-theme="nyc"] h1,
[data-theme="nyc"] h2 {
  line-height: 1.15;
}
/* Only the page <h1> keeps the full 700 weight; the --font-weight-bold token is
   600 in NYC, so everything else (h2–h6, titles, buttons, labels) renders at
   600. Literal 700 so the token swap can't pull it back down. */
[data-theme="nyc"] h1 {
  font-weight: 600;
}
[data-theme="nyc"] h3,
[data-theme="nyc"] h4,
[data-theme="nyc"] h5,
[data-theme="nyc"] h6 {
  line-height: 1.2;
}
/* Component title classes — these use font-heading but are <div>s,
   so the h-tag rules above don't reach them. */
[data-theme="nyc"] .cta-card__title,
[data-theme="nyc"] .dash-block__title,
[data-theme="nyc"] .dash-callout__title,
[data-theme="nyc"] .card__title,
[data-theme="nyc"] .panel__title,
[data-theme="nyc"] .prompt-card__title,
[data-theme="nyc"] .modal__title,
[data-theme="nyc"] .status-banner__title,
[data-theme="nyc"] .confirm-card__title,
[data-theme="nyc"] .welcome-section__title,
[data-theme="nyc"] .page-intro__title,
[data-theme="nyc"] .choice-card__title,
[data-theme="nyc"] .consent-affirm__title,
[data-theme="nyc"] .journey__title,
[data-theme="nyc"] .progress-card__title,
[data-theme="nyc"] .recap__title,
[data-theme="nyc"] .priority-tiers__title,
[data-theme="nyc"] .program-compare__title,
[data-theme="nyc"] .elig-check__title,
[data-theme="nyc"] .voucher-display-card__title,
[data-theme="nyc"] .dash-block--deadline-hero__title {
  line-height: 1.2;
}

/* ============================================================================
   PAGE-LEVEL STRUCTURAL OVERRIDES — NYC Digital Design System
   
   These rules reshape the prototype's global page anatomy when the NYC
   theme is active. The production nyc.gov uses:
   
   1. "Official website" banner — thin expandable strip above everything
   2. Global header — solid black, NYC logo + nav + Search + Language
   3. Breadcrumb bar — clean neutral (not pink), with back-chevron pattern
   4. Content area — flat white, no gradient
   5. Footer — black background, 3-column link grid
   ============================================================================ */

/* ── 1. Official Website Banner ──────────────────────────────────────── */
/* Always in the DOM; hidden by default, shown only on NYC theme.
   Production nyc.gov: dark strip, white text, left-aligned with bar below. */
.nyc-official-banner {
  display: none;
}
[data-theme="nyc"] .nyc-official-banner {
  display: block;
  background: #000000;
  border-bottom: 1px solid #333333;
  font-family: var(--font-body);
  font-size: 14px;
  color: #FFFFFF;
}

/* Trigger button — uses same max-width + auto-margin centering as
   nyc-bar__inner so "Official website…" left-aligns with the NYC logo. */
[data-theme="nyc"] .nyc-official-banner__trigger {
  display: flex;
  align-items: center;
  gap: 6px;
  background: none;
  border: none;
  font: inherit;
  color: inherit;
  cursor: pointer;
  padding: 8px var(--space-3xl);
  max-width: var(--content-max-width);
  margin: 0 auto;
  width: 100%;
  text-align: left;
}
[data-theme="nyc"] .nyc-official-banner__link {
  color: #FFFFFF;
  text-decoration: underline;
  font-weight: 500;
}
[data-theme="nyc"] .nyc-official-banner__chevron {
  font-size: 12px;
  margin-left: 2px;
  transition: transform 200ms ease;
}
[data-theme="nyc"] .nyc-official-banner__trigger[aria-expanded="true"] .nyc-official-banner__chevron {
  transform: rotate(180deg);
}

/* Expandable panel — slightly lighter dark, same centering as trigger */
[data-theme="nyc"] .nyc-official-banner__panel {
  background: #2B2B2B;
  color: #E0E0E0;
  border-top: 1px solid #444;
}
[data-theme="nyc"] .nyc-official-banner__panel-inner {
  display: flex;
  gap: 48px;
  padding: 20px var(--space-3xl);
  max-width: var(--content-max-width);
  margin: 0 auto;
}
[data-theme="nyc"] .nyc-official-banner__col {
  flex: 1;
}
[data-theme="nyc"] .nyc-official-banner__col strong {
  display: block;
  color: #FFFFFF;
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 600;
  margin-bottom: 6px;
}
[data-theme="nyc"] .nyc-official-banner__col p {
  margin: 0;
  font-family: var(--font-body);
  font-size: 14px;
  line-height: 1.5;
  color: #CCCCCC;
}

/* ── 2. Global Header (NYC Bar) ──────────────────────────────────────── */
[data-theme="nyc"] .nyc-bar {
  background: #000000;
}
[data-theme="nyc"] .nyc-bar__inner {
  padding: 0 var(--space-3xl);
  min-height: 64px;
  align-items: stretch;
}

/* Left group: logo + nav links */
[data-theme="nyc"] .nyc-bar__left {
  display: flex;
  align-items: center;
  gap: 40px;
}

/* NYC SVG logo — production uses the white blocky wordmark */
[data-theme="nyc"] .nyc-bar__logo-svg {
  display: block;
  height: 32px;
  width: auto;
}
[data-theme="nyc"] .nyc-bar__logo {
  display: flex;
  align-items: center;
  line-height: 1;
}

/* Primary nav links — white on black, matching production nyc.gov.
   Hover shows dark-gray bg with rounded top + thick white bottom border. */
[data-theme="nyc"] .nyc-bar__nav {
  display: flex;
  align-items: stretch;
  align-self: stretch;
  gap: 0;
}
[data-theme="nyc"] .nyc-bar__nav-link {
  position: relative;
  isolation: isolate;
  color: #FFFFFF;
  font-family: var(--font-body);
  font-size: 18px;
  font-weight: 600;
  text-decoration: none;
  padding: 10px 18px 0 18px;
  border-bottom: 10px solid transparent;
  transition: border-color 400ms ease;
  display: flex;
  align-items: center;
}
[data-theme="nyc"] .nyc-bar__nav-link::before {
  content: '';
  position: absolute;
  top: 5px;
  left: 0;
  right: 0;
  bottom: 0;
  border-radius: 8px 8px 0 0;
  background: transparent;
  transition: background 400ms ease;
  z-index: -1;
}
[data-theme="nyc"] .nyc-bar__nav-link:hover::before {
  background: #333333;
}
[data-theme="nyc"] .nyc-bar__nav-link:hover {
  border-bottom-color: #FFFFFF;
  text-decoration: none;
  color: #FFFFFF;
}

/* Search button — solid white pill, black text + icon, per production.
   Icon and font are large but horizontal padding is tight. */
[data-theme="nyc"] .nyc-bar__search {
  display: flex;
  align-items: center;
  gap: 8px;
  background: #FFFFFF;
  border: none;
  border-radius: 100px;
  color: #000000;
  font-family: var(--font-ui);
  font-size: 18px;
  font-weight: 600;
  padding: 10px 18px;
  cursor: pointer;
  transition: background 150ms ease;
}
[data-theme="nyc"] .nyc-bar__search:hover {
  background: #E6E6E6;
}
[data-theme="nyc"] .nyc-bar__search-icon {
  font-size: 22px;
  color: #000000;
}

/* Right section: wider gap between Search and lang button */
[data-theme="nyc"] .nyc-bar__right {
  gap: 24px;
  align-items: center;
}

/* CC theme: text-based logo (preserved for default theme) */
[data-theme="nyc"] .nyc-bar__logo-nyc {
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: 24px;
  padding: 2px 6px;
  letter-spacing: 0.06em;
}
[data-theme="nyc"] .nyc-bar__tagline {
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 400;
}

/* Language button — NYC DS gradient icon + gradient text (no pill border).
   Uses --font-ui token. Positioned to right-align with user-nav below. */
[data-theme="nyc"] .nyc-bar__lang {
  font-family: var(--font-ui);
  border: none;
  border-radius: 0;
  padding: 4px 0;
  font-size: 16px;
  gap: 8px;
  background: none;
}
[data-theme="nyc"] .nyc-bar__lang:hover {
  opacity: 0.85;
}
/* Gradient text on the language label */
[data-theme="nyc"] .nyc-bar__lang-label {
  background: linear-gradient(135deg, #6DA1FF 0%, #FFA049 40%, #BA63FF 70%, #6FBAFF 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: 18px;
}
/* Hide default caret in NYC theme */
[data-theme="nyc"] .nyc-bar__lang-caret {
  display: none;
}
/* Gradient icon — sized to match production */
[data-theme="nyc"] .nyc-lang-icon {
  display: inline-block;
  vertical-align: middle;
  width: 30px;
  height: 30px;
}

/* ── 3. Secondary Brand Bar (Child Care) ─────────────────────────────── */
/* NYC DS brand architecture: secondary brand bar sits below the primary
   NYC bar. Background: soft periwinkle (#c4bdff). All text/links use the
   default link color so they read as interactive on the light bar.
   Font: same size as primary nav (18px) but one step lighter (600). */
[data-theme="nyc"] .page-header {
  background: #F0EFF8;
  border-bottom: none;
}
[data-theme="nyc"] .page-header__inner {
  padding: 12px var(--space-3xl);
}
/* Breadcrumb: brand link color (#0029F7), scoped to the page-header bar */
[data-theme="nyc"] .page-header .breadcrumb {
  font-family: var(--font-body);
  font-size: 18px;
  font-weight: 600;
}
[data-theme="nyc"] .page-header .breadcrumb a {
  color: #1B2C8F;
  text-decoration: none;
}
[data-theme="nyc"] .page-header .breadcrumb a:hover {
  color: #1B2C8F;
  text-decoration: underline;
}
[data-theme="nyc"] .page-header .breadcrumb a:visited {
  color: #1B2C8F;
}
[data-theme="nyc"] .page-header .breadcrumb__separator {
  color: #1B2C8F;
}
[data-theme="nyc"] .page-header .breadcrumb__current {
  color: #1B2C8F;
  font-weight: 600;
}

/* User nav — brand link color (#0029F7), scoped to the page-header bar */
[data-theme="nyc"] .page-header .user-nav a {
  color: #1B2C8F;
  font-family: var(--font-body);
  font-size: 18px;
  font-weight: 600;
  text-decoration: none;
}
[data-theme="nyc"] .page-header .user-nav a:hover {
  color: #1B2C8F;
  text-decoration: underline;
}
[data-theme="nyc"] .page-header .user-nav__profile {
  font-family: var(--font-body);
  color: #1B2C8F;
  font-size: 16px;
  font-weight: 600;
}
/* All icons and text inside page-header use the brand link color */
[data-theme="nyc"] .page-header .user-nav__icon,
[data-theme="nyc"] .page-header .user-nav__icon .material-symbols-outlined,
[data-theme="nyc"] .page-header .notif-bell,
[data-theme="nyc"] .page-header .notif-bell .material-symbols-outlined,
[data-theme="nyc"] .page-header .nav-drawer-trigger,
[data-theme="nyc"] .page-header .nav-drawer-trigger .material-symbols-outlined {
  color: #1B2C8F;
}
/* Hover states on brand bar — subtle tint, keep link color */
[data-theme="nyc"] .page-header .notif-bell:hover {
  background: rgba(27, 44, 143, 0.12);
  color: #1B2C8F;
}
[data-theme="nyc"] .page-header .notif-bell:hover .material-symbols-outlined {
  color: #1B2C8F;
}
/* Increase bell + profile icon size ~25% (22→28px).
   renderIcon() sets font-size inline, so !important is needed. */
[data-theme="nyc"] .page-header .notif-bell .material-symbols-outlined,
[data-theme="nyc"] .page-header .user-nav__icon .material-symbols-outlined {
  font-size: 26px !important;
}
/* Brand name — first breadcrumb item is the product name, 2 sizes bigger.
   On the homepage it's a <span>, on deeper pages it's an <a>. */
[data-theme="nyc"] .breadcrumb > :first-child {
  font-size: 22px;
  font-weight: 600;
}

/* ── 4. Content Area ─────────────────────────────────────────────────── */
/* Warm beige-to-white gradient adopted from the production nyc.gov */
[data-theme="nyc"] .page-body {
  background: var(--page-gradient);
  background-attachment: fixed;
}

/* ── Hero Banner (middle column only) ────────────────────────────────── */
/* A gradient image banner at the top of the center content column.
   Page titles and greeting text render on top in white.
   - Landing page: .state-greeting is the first child (overlays banner)
   - Other pages: h2 is the first child (overlays banner)               */
[data-theme="nyc"] .layout-dashboard__main {
  position: relative;
  padding-top: 120px;
  display: flex;
  flex-direction: column;
}
/* Suppress hero banner on redirect pages (Documents, MyCity Dashboard)
   where the first child is a .card, not a heading or greeting. */
[data-theme="nyc"] .layout-dashboard__main:has(> .card:first-child) {
  padding-top: 0;
}
[data-theme="nyc"] .layout-dashboard__main:has(> .card:first-child)::before {
  display: none;
}
[data-theme="nyc"] .layout-dashboard__main::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 120px;
  background: url('../images/hero-home.png') center / cover no-repeat;
  border-radius: var(--radius-lg);
  z-index: 0;
}
/* Per-page hero banner images */
[data-theme="nyc"] .layout-dashboard__main[data-page="home"]::before {
  background-image: url('../images/hero-home.png');
}
[data-theme="nyc"] .layout-dashboard__main[data-page="applications"]::before {
  background-image: url('../images/hero-applications.png');
}
[data-theme="nyc"] .layout-dashboard__main[data-page="profile"]::before {
  background-image: url('../images/hero-profile.png');
}
/* Voucher download keeps the warm case banner; legacy 'case'/'update-case'
   ids stay on it too. */
[data-theme="nyc"] .layout-dashboard__main[data-page="voucher"]::before,
[data-theme="nyc"] .layout-dashboard__main[data-page="case"]::before,
[data-theme="nyc"] .layout-dashboard__main[data-page="update-case"]::before {
  background-image: url('../images/hero-case.png');
}
/* Recertification reuses the cool pastel NYC banner so it never reads the same
   as the warm-gold voucher-download page. */
[data-theme="nyc"] .layout-dashboard__main[data-page="recertify"]::before {
  background-image: url('../images/hero-banner-nyc.png');
}
[data-theme="nyc"] .layout-dashboard__main[data-page="programs"]::before,
[data-theme="nyc"] .layout-dashboard__main[data-page="priority"]::before {
  background-image: url('../images/hero-programs.png');
}
/* Greeting on landing page — match h2 font for consistency */
[data-theme="nyc"] .layout-dashboard__main > .state-greeting {
  position: relative;
  z-index: 1;
  margin-top: -120px;
  padding: 0 var(--space-xl);
  min-height: 120px;
  display: flex;
  align-items: center;
  color: var(--text-primary);
  font-size: var(--font-size-xl);
  font-weight: var(--font-weight-bold);
  font-family: var(--font-heading);
}
/* Page title h2 as first child — other pages (Applications, Profile, etc.) */
[data-theme="nyc"] .layout-dashboard__main > h2:first-child {
  position: relative;
  z-index: 1;
  margin-top: -120px;
  padding: 0 var(--space-xl);
  min-height: 120px;
  display: flex;
  align-items: center;
  color: var(--text-primary);
}

/* ── Link States (NYC DS spec) ───────────────────────────────────────── */
/* Per NYC DS: body content links are Blue 40, underlined, with purple
   visited state. Scoped to known prose containers so underlines don't
   bleed into nav chrome, buttons, card CTAs, or icon-bearing links.

   Components with their own link patterns (sidebar-nav, CTA buttons,
   stat-card CTAs, etc.) get explicit overrides below so they never
   inherit the prose underline. */

/* Prose content links — underline per NYC DS */
[data-theme="nyc"] .page-body .dash-block__body a,
[data-theme="nyc"] .page-body .dash-block__intro a,
[data-theme="nyc"] .page-body .dash-block__footer a,
[data-theme="nyc"] .page-body .status-banner__body a,
[data-theme="nyc"] .page-body .status-banner__detail a,
[data-theme="nyc"] .page-body .panel__body a,
[data-theme="nyc"] .page-body .panel__bullets a,
[data-theme="nyc"] .page-body .cta-card__body a,
[data-theme="nyc"] .page-body .inline-note__body a,
[data-theme="nyc"] .page-body .dash-callout__body a,
[data-theme="nyc"] .page-body .modal__body a,
[data-theme="nyc"] .page-body .welcome-section__lede a,
[data-theme="nyc"] .page-body .confirm-card__action-row-text a,
[data-theme="nyc"] .page-body .state-greeting a,
[data-theme="nyc"] .page-body .page-intro__body a {
  color: var(--text-link);
  text-decoration: underline;
}
[data-theme="nyc"] .page-body .dash-block__body a:visited,
[data-theme="nyc"] .page-body .status-banner__body a:visited,
[data-theme="nyc"] .page-body .status-banner__detail a:visited,
[data-theme="nyc"] .page-body .panel__body a:visited,
[data-theme="nyc"] .page-body .cta-card__body a:visited,
[data-theme="nyc"] .page-body .inline-note__body a:visited {
  color: var(--text-link-visited);
}
[data-theme="nyc"] .page-body .dash-block__body a:hover,
[data-theme="nyc"] .page-body .status-banner__body a:hover,
[data-theme="nyc"] .page-body .panel__body a:hover,
[data-theme="nyc"] .page-body .cta-card__body a:hover {
  color: var(--text-link-hover);
  text-decoration: underline;
}

/* Buttons rendered as <a> tags — explicit specificity match so they
   never inherit prose underline regardless of nesting.
   IMPORTANT: do NOT set color here — each variant (.btn--primary,
   .btn--secondary) owns its color in the component overrides above.
   A generic 'color: inherit' here would kill secondary's Blue 40. */
[data-theme="nyc"] .page-body a.btn,
[data-theme="nyc"] .page-body a.btn:visited,
[data-theme="nyc"] .page-body a.btn:hover {
  text-decoration: none;
}
[data-theme="nyc"] .btn,
[data-theme="nyc"] .btn:visited {
  text-decoration: none;
}

/* Source / attribution links — blue + underlined like all content links */
[data-theme="nyc"] .dash-source,
[data-theme="nyc"] .dash-source:visited {
  color: var(--text-link);
  text-decoration: underline;
}
[data-theme="nyc"] .dash-source:hover {
  color: var(--text-link-hover);
  text-decoration: underline;
}

/* Stat card CTAs — blue + underlined */
[data-theme="nyc"] .stat-card__cta,
[data-theme="nyc"] .stat-card__cta:visited {
  color: var(--text-link);
  text-decoration: underline;
  font-weight: 600;
}
[data-theme="nyc"] .stat-card__cta:hover {
  color: var(--text-link-hover);
  text-decoration: underline;
}




/* Confirm card source links — blue, underline on the LABEL span only.
   The anchor is display:inline-flex (label + icon as flex items); underlining
   the anchor would draw the line across the icon. Underline the label span so
   the external-link / edit icon stays clean. */
[data-theme="nyc"] .confirm-card__source-link,
[data-theme="nyc"] .confirm-card__source-link:visited {
  color: var(--text-link);
  text-decoration: none;
}
[data-theme="nyc"] .confirm-card__source-link:hover {
  color: var(--text-link-hover);
  text-decoration: none;
}
[data-theme="nyc"] .confirm-card__source-link .confirm-card__source-label {
  text-decoration: underline;
}

/* Nav drawer links (mobile) — blue + label-only underline */
[data-theme="nyc"] .nav-drawer__link,
[data-theme="nyc"] .nav-drawer__link:visited {
  color: var(--text-link);
  text-decoration: none;
}
[data-theme="nyc"] .nav-drawer__link .nav-drawer__label {
  text-decoration: underline;
}
[data-theme="nyc"] .nav-drawer__link:hover {
  color: var(--text-link-hover);
}

/* User dropdown links — blue, label-only underline (icon protected) */
[data-theme="nyc"] .user-dropdown__item,
[data-theme="nyc"] .user-dropdown__item:visited {
  color: var(--nyc-red);
  text-decoration: none;
}
[data-theme="nyc"] .user-dropdown__item .user-dropdown__item-label {
  text-decoration: underline;
}
[data-theme="nyc"] .user-dropdown__item:hover {
  color: var(--nyc-red);
  text-decoration: none;
}
[data-theme="nyc"] .user-dropdown__item:hover .user-dropdown__item-label {
  text-decoration: underline;
}
/* External link icon in dropdown — blue to match item text */
[data-theme="nyc"] .user-dropdown__ext {
  color: var(--nyc-red);
  opacity: 1;
}

/* ── NYC Bar links — white on black, no visited/underline ────────────── */
[data-theme="nyc"] .nyc-bar a,
[data-theme="nyc"] .nyc-bar a:visited,
[data-theme="nyc"] .nyc-bar a:hover {
  color: #FFFFFF;
  text-decoration: none;
}

/* ── Foundational: icons inside links/buttons never show underlines ──── */
/* Material Symbols icons are text ligatures — the browser underlines
   them like any other text when a parent sets text-decoration: underline.
   display: inline-flex creates an atomic inline box that text-decoration
   from ancestors cannot propagate into. This is a global defense — every
   icon inside every <a> or <button> in the NYC theme is protected. */
[data-theme="nyc"] a .material-symbols-outlined,
[data-theme="nyc"] button .material-symbols-outlined {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Belt-and-suspenders: inline-flex already stops an ancestor's underline
     from propagating into the icon box, but set it explicitly too so the
     underline NEVER covers an external-link / action icon, regardless of
     how the link sets text-decoration. */
  text-decoration: none;
}

/* ── Icon-link: default underline on label, never on icon ────────────── */
[data-theme="nyc"] .icon-link .icon-link__label {
  text-decoration: underline;
}
[data-theme="nyc"] .icon-link:hover .icon-link__label {
  text-decoration: underline;
}

/* ── Results-table actions: default underline on label, never on icon ── */
[data-theme="nyc"] .results-table__action > span:not(.material-symbols-outlined) {
  text-decoration: underline;
}

/* ── Status-banner details summary (▼ Learn more): default underline ── */
[data-theme="nyc"] .status-banner__details-summary {
  text-decoration: underline;
}

/* ── Entry-list row link: blue primary label + underline ─────────────── */
[data-theme="nyc"] .entry-list__row--link {
  color: var(--text-link);
}
[data-theme="nyc"] .entry-list__row--link:visited {
  color: var(--text-link);
}
[data-theme="nyc"] .entry-list__row--link .entry-list__row-primary {
  text-decoration: underline;
}
[data-theme="nyc"] .entry-list__row--link:hover {
  color: var(--text-link-hover);
}

/* Body base weight — NYC DS specifies Noto Sans Medium (500) for body
   text. This matches the NYC typography spec for the Body scale. */
[data-theme="nyc"] body {
  font-weight: 500;
}

/* Layout containers — slightly more room between columns for shadows */
[data-theme="nyc"] .layout-full,
[data-theme="nyc"] .layout-dashboard {
  gap: 28px;
}
[data-theme="nyc"] .layout-dashboard__main {
  gap: 24px;
}
[data-theme="nyc"] .layout-dashboard__main > * {
  margin-top: 0;
  margin-bottom: 0;
}
[data-theme="nyc"] .layout-dashboard__ctas {
  gap: 24px;
}
[data-theme="nyc"] .layout-dashboard__ctas > * {
  margin-bottom: 0;
}

/* Wizard content card */
[data-theme="nyc"] .layout-wizard__content {
  border-radius: 32px;
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
/* Screening (Check your eligibility) and the priority self-check share the
   wizard content card's treatment — 32px radius + the same generous padding —
   so these standalone form pages match the application flow's get-started
   container. (border:none + soft shadow already come from the .card NYC rule.) */
[data-theme="nyc"] .card[data-screen-form],
[data-theme="nyc"] .card.priority-check__panel,
[data-theme="nyc"] .card.case-validation__panel {
  border-radius: 32px;
  padding: var(--space-3xl) var(--space-3xl) var(--space-xl);
}

/* More breathing room between the page header (red bar) and the content area,
   across all page layouts. */
[data-theme="nyc"] .layout-wizard,
[data-theme="nyc"] .layout-full,
[data-theme="nyc"] .layout-dashboard {
  padding-top: var(--space-3xl);
}

/* Dashboard cards */
[data-theme="nyc"] .card,
[data-theme="nyc"] .prompt-card,
[data-theme="nyc"] .employer-card,
[data-theme="nyc"] .cta-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* ── 5. Form Fields — boxed text input / textarea / select (NYC DS) ────────
   CC uses an underline input whose border-BOTTOM-color shifts by state via
   fairly specific selectors. NYC uses a boxed field, so these rules are
   scoped through the .form-field wrapper (one extra class of specificity) to
   beat the base rules in every state regardless of stylesheet order.

   States — default: white, #555 box. Hover + focus: Blue-40 border + a light-
   blue fill (this is the real nyc.gov production behavior; the static design
   spec is stale). Focus adds a dotted ring. Filled: same neutral box. Error:
   §5h below. Disabled: gray. Raw `.form-input` fields (update-case, etc.) get
   the same treatment (their base rules are weak, so no wrapper needed). */
[data-theme="nyc"] .form-field__input,
[data-theme="nyc"] .form-field__select,
[data-theme="nyc"] .form-field__textarea,
[data-theme="nyc"] .form-input:not(.dash-subscribe__input) {
  border: 2px solid var(--border-light);    /* light grey default — matches the selection-card boundary */
  border-radius: 8px;                        /* match the checkbox/radio selection-card radius */
  background: #FFFFFF;
  font-family: var(--font-ui);              /* Noto Sans, not the display font */
  font-weight: 500;                         /* match the selection-control label scale */
  font-size: 20px;
  line-height: 25px;
  padding: 13px 12px;                        /* vertical tuned so total height matches the radio/checkbox cards */
}
/* Default / empty — force the light-grey box. CC darkens the BOTTOM border via
   :not(:placeholder-shown), which also fires on EMPTY fields that have no
   placeholder (e.g. the cell-phone field); this high-specificity rule keeps
   those light grey until the field is actually filled/hovered/focused. */
[data-theme="nyc"] .form-field .form-field__input:not([data-filled]):not(:focus):not(:hover):not(:disabled),
[data-theme="nyc"] .form-field .form-field__textarea:not([data-filled]):not(:focus):not(:hover):not(:disabled),
[data-theme="nyc"] .form-input:not(.dash-subscribe__input):not([data-filled]):not(:focus):not(:hover):not(:disabled) {
  border-color: var(--border-light);
  background: #FFFFFF;
}
/* Filled / engaged — once the field has a value it stays in the engaged look
   (Blue-40 border + light-blue fill), like a selected radio/checkbox card, so
   completed fields are obvious at a glance after the user blurs out. */
[data-theme="nyc"] .form-field .form-field__input[data-filled]:not(:focus):not(:disabled),
[data-theme="nyc"] .form-field .form-field__textarea[data-filled]:not(:focus):not(:disabled),
[data-theme="nyc"] .form-input[data-filled]:not(.dash-subscribe__input):not(:focus):not(:disabled) {
  border-color: var(--nyc-red);
  background: var(--nyc-red-bg);
}
/* Hover & focus — Blue-40 border + light-blue fill (real nyc.gov production
   behavior; the static design spec is stale). Scoped through .form-field so
   they outrank the CC filled rule when a filled field is hovered/focused. */
[data-theme="nyc"] .form-field .form-field__input:hover,
[data-theme="nyc"] .form-field .form-field__select:hover,
[data-theme="nyc"] .form-field .form-field__textarea:hover,
[data-theme="nyc"] .form-input:not(.dash-subscribe__input):hover {
  border-color: var(--nyc-red);             /* Blue 40 — #103FEF */
  background: var(--nyc-red-bg);            /* light blue — #E8EEFF */
}
[data-theme="nyc"] .form-field .form-field__input:focus,
[data-theme="nyc"] .form-field .form-field__select:focus,
[data-theme="nyc"] .form-field .form-field__textarea:focus,
[data-theme="nyc"] .form-input:not(.dash-subscribe__input):focus {
  border-color: var(--nyc-red);
  background: var(--nyc-red-bg);
  outline: 2px dotted #1B1B1B;              /* dotted focus ring */
  outline-offset: 2px;
  box-shadow: none;
}
/* Disabled — gray (shared disabled tokens; one treatment for every control:
   text input, textarea, AND select all resolve to the same rule via
   .form-field__input, so the select matches the input exactly). */
[data-theme="nyc"] .form-field .form-field__input:disabled,
[data-theme="nyc"] .form-field .form-field__select:disabled,
[data-theme="nyc"] .form-field .select-field__input:disabled,
[data-theme="nyc"] .form-field .form-field__textarea:disabled,
[data-theme="nyc"] .form-input:not(.dash-subscribe__input):disabled {
  background-color: var(--field-disabled-bg);
  background-image: none;
  border-color: var(--field-disabled-border);
  color: var(--field-disabled-text);
  -webkit-text-fill-color: var(--field-disabled-text);
  box-shadow: none;
  /* The browser dims/lightens disabled <select> controls by default — force
     full opacity + suppress the native appearance so our grey fills it the
     same as the text inputs. */
  opacity: 1;
  appearance: none;
  -webkit-appearance: none;
  cursor: not-allowed;
}
[data-theme="nyc"] .form-field__label {
  font-family: var(--font-ui);
  font-weight: 600;
  color: #000000;
}

/* Interactive elements use the pointer (hand) cursor. Selection cards,
   buttons and links already do (cursor is inherited); this extends it to the
   text/select/textarea controls. Disabled controls keep `not-allowed` (set
   above, higher specificity). Convention for all future NYC components: any
   interactive element → cursor: pointer. */
[data-theme="nyc"] .form-field__input,
[data-theme="nyc"] .form-field__textarea,
[data-theme="nyc"] .form-field__select,
[data-theme="nyc"] .form-input:not(.dash-subscribe__input) {
  cursor: pointer;
}

/* ── 5i. Drop-down select (native, custom-styled) ─────────────────────────
   The native <select> inherits every box state from §5 (default grey, hover/
   focus/filled blue + light-blue fill, disabled gray) via .form-field__input —
   so a chosen value shows the engaged blue style like the other fields. These
   rules only own the select-specific chrome: reserve room for the chevron
   (the generic 12px right padding isn't enough) and place + size the guideline
   chevron (expand_more). */
[data-theme="nyc"] .form-field .select-field__input {
  padding-right: 44px;
}
[data-theme="nyc"] .select-field__chevron {
  right: 14px;
  font-size: 24px;
  color: var(--text-primary);                /* dark in every state, per guideline */
}
[data-theme="nyc"] .select-field__input:disabled + .select-field__chevron {
  color: var(--field-disabled-text);
}

/* ── 5j. Marker convention flip (NYC marks REQUIRED) ──────────────────────
   CC marks optional fields "(optional)"; nyc.gov instead marks REQUIRED fields
   with a "*" before the label and drops the optional pills. CSS-only flip so
   toggling the theme updates markers live. */
[data-theme="nyc"] .field-optional {
  display: none;                             /* no optional pills in NYC */
}
[data-theme="nyc"] .field-required-marker {
  display: inline;
  color: var(--text-primary);
  font-weight: 600;
}
[data-theme="nyc"] .field-required-marker::after {
  content: "*\00a0";                         /* asterisk + nbsp, before the label */
}

/* Required-note line: CC default text vs NYC "* Required field". */
.required-note__nyc { display: none; }
[data-theme="nyc"] .required-note__default { display: none; }
[data-theme="nyc"] .required-note__nyc { display: inline; }
[data-theme="nyc"] .required-note__nyc .field-required-marker {
  display: inline;
}

/* ── 5k. Top-of-form error summary (NYC only) ─────────────────────────────
   nyc.gov surfaces a count + guidance banner at the top of the form on a
   failed submit, in addition to per-field errors. Rendered by steps whenever
   their error slice is non-empty; only visible in the NYC theme. */
.error-summary { display: none; }
[data-theme="nyc"] .error-summary {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  padding: var(--space-md) var(--space-base);
  margin-bottom: var(--space-lg);
  border: 2px solid var(--nyc-ref-color-red-50);   /* #EC131E */
  border-radius: 8px;
  background: var(--nyc-ref-color-red-100);         /* #FDE7E8 */
  color: var(--text-primary);
  font-family: var(--font-ui);
  font-weight: 600;
}
[data-theme="nyc"] .error-summary:focus-visible {
  outline: 2px dashed #1B1B1B;
  outline-offset: 2px;
}
[data-theme="nyc"] .error-summary__icon {
  color: var(--nyc-ref-color-red-50);
  flex-shrink: 0;
}

/* ── 5g2. Contextual card hugs its trigger ────────────────────────────────
   When a contextual card (inline-note / panel / dash-callout) is revealed
   immediately after a selection group based on the user's answer, the group's
   trailing margin-bottom (meant to separate it from the NEXT question) makes
   the card read as a detached block. Drop that margin so the revealed card
   sits within the same question's rhythm. Structure-agnostic: covers both the
   wrapped ([data-field] > group) and unwrapped (group as direct sibling)
   layouts, and a wrapped form-field (e.g. a note revealed after a text field). */
[data-theme="nyc"] [data-field]:has(+ .inline-note, + .panel, + .dash-callout) .radio-group,
[data-theme="nyc"] [data-field]:has(+ .inline-note, + .panel, + .dash-callout) .checkbox-group,
[data-theme="nyc"] [data-field]:has(+ .inline-note, + .panel, + .dash-callout) .form-field,
[data-theme="nyc"] .radio-group:has(+ .inline-note, + .panel, + .dash-callout),
[data-theme="nyc"] .checkbox-group:has(+ .inline-note, + .panel, + .dash-callout) {
  margin-bottom: 0;
}

/* ── 5h. Text field error state (NYC DS) ──────────────────────────────────
   Pink wrapper around the field, the "why is there an error" message (icon +
   bold) pulled ABOVE the control, red box border — mirrors the checkbox /
   radio group error treatment. */
[data-theme="nyc"] .form-field--error {
  background: var(--nyc-ref-color-red-100);   /* #FDE7E8 */
  border-radius: 8px;
  padding: var(--space-base);
}
/* Reorder: control becomes the last flex item so the message sits above it
   (label and message keep source order before the control). */
[data-theme="nyc"] .form-field--error .form-field__input,
[data-theme="nyc"] .form-field--error .form-field__textarea {
  order: 1;
}
/* Select fields wrap their control in .select-field__wrap, so the rule above
   (which targets the inner control) can't reorder it — the wrap is the actual
   flex child. Push the wrap last so the message sits above it, matching every
   other field. */
[data-theme="nyc"] .select-field.form-field--error .select-field__wrap {
  order: 1;
}
[data-theme="nyc"] .form-field--error .form-field__error {
  color: var(--text-primary);                /* black message, red icon */
  margin: var(--space-3xs) 0 0;
}
/* Title stays black in the error state (CC turns it red; --nyc-red is Blue
   here, which would read as a non-error color). */
[data-theme="nyc"] .form-field--error .form-field__label {
  color: var(--text-primary);
}
/* Red box border on the control, scoped to beat the CC underline error rules. */
[data-theme="nyc"] .form-field.form-field--error .form-field__input,
[data-theme="nyc"] .form-field.form-field--error .form-field__textarea,
[data-theme="nyc"] .form-field.form-field--error .form-field__input:focus,
[data-theme="nyc"] .form-field.form-field--error .form-field__input:not(:placeholder-shown):not(:focus) {
  border-color: var(--nyc-ref-color-red-50); /* #EC131E */
  background: #FFFFFF;
}
[data-theme="nyc"] .form-field__error-icon {
  color: var(--nyc-ref-color-red-50);
}
/* Standalone inline error messages read RED in NYC, not blue. The base rule
   colors them var(--nyc-red), which is Blue 40 in this theme — wrong for an
   error. (Errors inside the pink field wrapper stay black, set above.) */
[data-theme="nyc"] .form-field__error {
  color: var(--nyc-ref-color-red-50);
}
[data-theme="nyc"] .form-field--error .form-field__error {
  color: var(--text-primary);
}

/* ── 5a. Shared selection surface (checkbox buttons + radio cards) ─────────
   ONE clickable-card pattern, shared by the checkbox button variant
   (.checkbox--button) and the radio card variant (.radio-option--card) via
   the common `.selection-card` hook. Spec: designsystem.nyc.gov checkbox /
   radio button components + production DSS screening forms.

     Default   — white bg, 2px gray (#DDD) border, 8px radius.
     Hover     — light-blue (#F0F4FF) wash, border unchanged.
     Focus     — 2px dotted black focus ring, offset 2px (matches .btn focus).
     Selected  — light-blue (#E8EEFF) bg + 2px Blue-40 (#103FEF) border.
     Sel+hover — border deepens to Blue-10 (#050560).
     Disabled  — gray (#EEE) bg, #CCC border, muted text.

   Border width is held at 2px in every state so selecting never shifts layout
   by a pixel; only the color changes. */
[data-theme="nyc"] .selection-card {
  background: #FFFFFF;
  border: 2px solid var(--border-light);   /* Gray 80 — #DDD */
  border-radius: 8px;
  padding: 14px 16px;
  box-shadow: none;
  transition: background var(--transition-fast), border-color var(--transition-fast);
}
[data-theme="nyc"] .selection-card:hover {
  background: var(--page-pink-light);       /* #F0F4FF light-blue wash */
  border-color: var(--border-light);
  box-shadow: none;                         /* NYC is flat; kill base card hover shadow */
}
[data-theme="nyc"] .selection-card:has(.checkbox__input:focus-visible),
[data-theme="nyc"] .selection-card:has(.radio-option__input:focus-visible) {
  outline: 2px dotted #1B1B1B;
  outline-offset: 2px;
  background: var(--page-pink-light);
}
/* Selected highlight is driven SOLELY by the live `:has(input:checked)` state,
   NOT the render-time `.is-selected` / `.is-checked` class. A radio change
   updates the DOM's `:checked` natively but leaves the previously-rendered
   card's stale class in place (no re-render) — keying off it lit up BOTH the
   old and new option. `:has(:checked)` always matches the real selection.
   (Matches the base-theme fix in components.css.) */
[data-theme="nyc"] .selection-card:has(input:checked) {
  background: var(--nyc-red-bg);            /* #E8EEFF */
  border-color: var(--nyc-red);            /* Blue 40 — #103FEF */
  box-shadow: none;
}
[data-theme="nyc"] .selection-card:has(input:checked):hover {
  border-color: var(--nyc-red-hover);      /* Blue 10 — #050560 */
}
[data-theme="nyc"] .selection-card:has(input:disabled),
[data-theme="nyc"] .selection-card.is-disabled {
  background: #EEEEEE;
  border-color: #CCCCCC;
  cursor: not-allowed;
  color: #777777;
}
[data-theme="nyc"] .selection-card.is-disabled .checkbox__label,
[data-theme="nyc"] .selection-card.is-disabled .checkbox__description,
[data-theme="nyc"] .selection-card.is-disabled .radio-option__label,
[data-theme="nyc"] .selection-card.is-disabled .radio-option__desc {
  color: #777777;
}

/* ── 5b. Checkbox box (square control) ─────────────────────────────────────
   Used by BOTH the standalone checkbox and the checkbox button. NYC spec:
   24px square, 2px dark-gray (#555) border, 4px radius. Checked = Blue-40
   fill + white tick. Error = Red-50 border. */
[data-theme="nyc"] .checkbox__box {
  width: 24px;
  height: 24px;
  border: 2px solid var(--border-input);    /* #555 */
  border-radius: 4px;
  background: #FFFFFF;
  margin-top: 1px;
}
[data-theme="nyc"] .checkbox__tick {
  width: 16px;
  height: 16px;
}
/* Hover feedback on the CONTROL glyph — matches NYC production: on hover the
   checkbox box / radio dot boundary darkens to navy (Blue 10), in addition to
   the card's light-blue wash. Hovering the control OR the label triggers it
   (the whole .checkbox / .radio-option label wraps both). Checked + hover
   fills the control navy. This is the reusable hover pattern for all current
   and future selection controls. */
[data-theme="nyc"] .checkbox:not(.is-disabled):hover .checkbox__box {
  border-color: var(--nyc-red-hover);       /* navy — Blue 10 #050560 */
  /* +1px boundary on hover, drawn as an inner ring so the box never changes
     size (no layout shift) — hover-only. */
  box-shadow: inset 0 0 0 1px var(--nyc-red-hover);
}
[data-theme="nyc"] .checkbox:not(.is-disabled):has(.checkbox__input:checked):hover .checkbox__box {
  background: var(--nyc-red-hover);
  border-color: var(--nyc-red-hover);
}
/* Checked — Blue 40 fill + white tick. (Base theme already fills with
   --nyc-red, which is Blue 40 in this theme; we restate for the larger
   24px box + crisp border.) */
[data-theme="nyc"] .checkbox:has(.checkbox__input:checked) .checkbox__box {
  background: var(--nyc-red);               /* Blue 40 — #103FEF */
  border-color: var(--nyc-red);
  color: #FFFFFF;
}
/* Error — standalone checkbox box turns Red 50. */
[data-theme="nyc"] .checkbox.is-error .checkbox__box {
  border-color: var(--nyc-ref-color-red-50); /* #EC131E */
}
/* Focus ring on a STANDALONE checkbox (button variant gets its ring from the
   surface above). */
[data-theme="nyc"] .checkbox--standalone .checkbox__input:focus-visible + .checkbox__box {
  outline: 2px dotted #1B1B1B;
  outline-offset: 2px;
}
/* Disabled box. */
[data-theme="nyc"] .checkbox.is-disabled .checkbox__box,
[data-theme="nyc"] .checkbox__input:disabled + .checkbox__box {
  border-color: #999999;
  background: #EEEEEE;
}
[data-theme="nyc"] .checkbox.is-disabled .checkbox__input:checked + .checkbox__box {
  background: #999999;
  border-color: #999999;
  color: #FFFFFF;
}

/* ── 5c. Selection-control label + description typography (NYC DS) ──────────
   Main label and option description for BOTH checkbox and radio, matching the
   nyc.gov computed values:
     Main label  — 16.6667px / 500 / black.
     Description — 13.3333px / 400 / gray (e.g. the race "For example: …"
                   caption under the checkbox options).
   The 'simple' radio selector is included so it outranks the CC heading-font
   rule for that variant. */
[data-theme="nyc"] .checkbox__label,
[data-theme="nyc"] .radio-option__label,
[data-theme="nyc"] .radio-option--simple .radio-option__label {
  display: block;
  font-family: var(--font-ui);
  font-size: 20px;
  font-weight: 500;
  color: #000000;
  line-height: 25px;
}
[data-theme="nyc"] .checkbox__description,
[data-theme="nyc"] .radio-option__desc {
  font-family: var(--font-ui);
  font-size: 16.6667px;
  font-weight: 500;
  color: var(--text-muted);
  line-height: normal;
  margin: 5px 0;
}

/* ── 5d. Checkbox group + NYC error treatment ──────────────────────────────
   Error state wraps the whole group in a Red-100 (#FDE7E8) surface with the
   "Why is there an error and how to fix it" message above the options; each
   option card sits on a faint pink so the cards stay legible on the wash. */
[data-theme="nyc"] .checkbox-group.is-error,
[data-theme="nyc"] .radio-group.is-error {
  background: var(--nyc-ref-color-red-100);  /* #FDE7E8 */
  border-radius: 8px;
  padding: var(--space-base);
}
[data-theme="nyc"] .checkbox-group.is-error .selection-card,
[data-theme="nyc"] .radio-group.is-error .selection-card {
  background: #FFF5F6;
}
[data-theme="nyc"] .checkbox-group.is-error .selection-card:has(input:checked),
[data-theme="nyc"] .radio-group.is-error .selection-card:has(input:checked) {
  background: var(--nyc-red-bg);
}
/* Error icon + message always read red, even though --nyc-red is Blue in this
   theme. */
[data-theme="nyc"] .checkbox-group__error-icon,
[data-theme="nyc"] .radio-group__error-icon {
  color: var(--nyc-ref-color-red-50);        /* #EC131E */
}

/* ── 5g. Radio dot (round control) — parity with the checkbox box ──────────
   EVERY radio in NYC renders as the card-style radio button (the NYC DS has
   only one radio button), so these target `.selection-card` — which both the
   card AND simple variants now carry — not a single variant. Spec: 22px
   circle, 2px #555 unchecked, Blue 40 ring + filled center checked, navy on
   checked-hover, gray disabled. */
[data-theme="nyc"] .selection-card .radio-option__dot {
  width: 22px;
  height: 22px;
  border: 2px solid var(--border-input);     /* #555 */
  background: #FFFFFF;
  margin-top: 1px;
}
[data-theme="nyc"] .selection-card:has(.radio-option__input:checked) .radio-option__dot {
  border-color: var(--nyc-red);              /* Blue 40 ring */
  background: radial-gradient(var(--nyc-red) 0 5px, #FFFFFF 6px 100%);  /* filled center */
}
/* (Simple-variant radio label typography is handled in §5c, alongside the
   checkbox + card-radio labels.) */
/* A touch more air between stacked radio buttons than the CC compact list. */
[data-theme="nyc"] .radio-group--stack {
  gap: var(--space-md);
}
/* Unchecked + hover → dot boundary darkens to navy (matches NYC production,
   alongside the card's light-blue wash). */
[data-theme="nyc"] .radio-option:not(.is-disabled).selection-card:hover .radio-option__dot {
  border-color: var(--nyc-red-hover);
  /* +1px boundary on hover, inner ring → no size change / layout shift. */
  box-shadow: inset 0 0 0 1px var(--nyc-red-hover);
}
/* Checked + hover → navy ring + center, matching the .selection-card hover. */
[data-theme="nyc"] .selection-card:has(.radio-option__input:checked):hover .radio-option__dot {
  border-color: var(--nyc-red-hover);
  background: radial-gradient(var(--nyc-red-hover) 0 5px, #FFFFFF 6px 100%);
}
/* Disabled dot. */
[data-theme="nyc"] .radio-option.is-disabled .radio-option__dot,
[data-theme="nyc"] .radio-option__input:disabled + .radio-option__dot {
  border-color: #999999;
  background: #EEEEEE;
}
[data-theme="nyc"] .radio-option__input:disabled:checked + .radio-option__dot {
  border-color: #999999;
  background: radial-gradient(#999999 0 5px, #EEEEEE 6px 100%);
}

/* ── 5e. Get Started page surfaces (NYC card pattern) ──────────────────────
   The CC theme uses flat fills + a left-bordered inline note here. NYC never
   uses flat corners or left-bar notes — every container is the rounded,
   borderless, soft-shadow card used across the dashboard (see .dash-block,
   .program-card, etc.). These overrides bring the Get Started page in line.

   Card recipe: 8px radius (--nyc-sys-radius-xs), NO border, soft shadow. */

/* Privacy & consent section — soft-blue NYC card instead of a flat fill. */
[data-theme="nyc"] .get-started__section--consent {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
/* "Don't want to share…" note — a white NYC card nested inside, NOT a
   left-bordered inline note. Drop the blue left bar; round all four corners. */
[data-theme="nyc"] .get-started__decline-alt {
  background: #FFFFFF;
  border-left: none;
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* "What you'll need" checklist — white rounded shadow card, not a flat grey
   box with square corners. Row dividers stay; overflow:hidden (base) clips
   the rows to the rounded corners. */
[data-theme="nyc"] .get-started__checklist {
  background: #FFFFFF;
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* ── 6. Notice Components (NYC Design System) ───────────────────────── */
/* Production nyc.gov uses TWO distinct notice patterns:
   A) "You should know" — color-mix translucent bg (25% ref-color +
      transparent), backdrop-filter blur, NO border, icon in brighter
      shade circle, bold h4-sized heading. Used by: alert-banner,
      dash-callout.
   B) Left-bordered inline — surface-warning cream bg, THICK left
      auxiliary-color border, bold italic olive-brown title.
      Used by: panel, inline-note.
   ─────────────────────────────────────────────────────────────────────── */

/* ─── 6a. Alert Banner (Pattern A — "You should know" card) ────────── */
[data-theme="nyc"] .alert-banner {
  border-radius: var(--nyc-sys-radius-xs);
  border-left: none;
  padding: 1.5rem 1rem;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
}
/* Warning — exact production: color-mix(orange-60 25%, transparent) */
[data-theme="nyc"] .alert-banner--warning {
  background: #FFBE67;
  border-left: none;
  color: var(--text-primary);
}
/* Info — blue-70 25% translucent */
[data-theme="nyc"] .alert-banner--info {
  background: #F0EFF8;
  border-left: none;
  color: var(--text-primary);
}
/* Error — red-70 25% translucent */
[data-theme="nyc"] .alert-banner--error,
[data-theme="nyc"] .alert-banner--error-strong {
  background: color-mix(in srgb, var(--nyc-ref-color-red-70) 25%, transparent);
  border-left: none;
  color: var(--text-primary);
}
/* Success — green-70 25% translucent */
[data-theme="nyc"] .alert-banner--success {
  background: color-mix(in srgb, var(--nyc-ref-color-green-70) 25%, transparent);
  border-left: none;
  color: var(--text-primary);
}

/* Icon circle — brighter shade of the card's base color */
[data-theme="nyc"] .alert-banner--with-icon {
  gap: var(--space-lg);
}
[data-theme="nyc"] .status-banner__icon {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  padding: 0;
}
[data-theme="nyc"] .alert-banner--warning .status-banner__icon {
  background: var(--nyc-ref-color-orange-60);
  color: #000;
}
[data-theme="nyc"] .alert-banner--info .status-banner__icon {
  background: var(--nyc-ref-color-blue-70);
  color: #000;
}
[data-theme="nyc"] .alert-banner--error .status-banner__icon,
[data-theme="nyc"] .alert-banner--error-strong .status-banner__icon {
  background: var(--nyc-ref-color-red-70);
  color: #000;
}
[data-theme="nyc"] .alert-banner--success .status-banner__icon {
  background: var(--nyc-ref-color-green-70);
  color: #000;
}

/* Status banner title/body — same standardized notice-card sizing as the
   panel / scan-limit banner: 16px (base) semibold title, 14px (sm) body. */
[data-theme="nyc"] .status-banner__title {
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: var(--font-size-base);
  color: var(--text-primary);
  font-style: normal;
}
[data-theme="nyc"] .status-banner__body {
  color: var(--text-primary);
  font-size: var(--font-size-sm);
}
/* Recommended program card uses the design-system blue surface (the same
   light-blue used for selected selection-cards) instead of an outline border. */
[data-theme="nyc"] .program-card--recommended {
  background: var(--nyc-red-bg);
  outline: none;
}

/* Screening section descriptions read at body size with a gap below the
   heading (the base 14px / margin:0 sat cramped against the title) — matching
   the title+description rhythm used elsewhere. */
[data-theme="nyc"] .screen__section-helper {
  font-size: var(--font-size-base);
  margin-top: var(--space-sm);
}

/* Screening eligibility result card ("You may qualify.") is an alert-banner but
   uses its own title/body classes — align them to the standardized banner
   sizing: 16px/600 title, 14px body. */
[data-theme="nyc"] .screen__result-title {
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: var(--font-size-base);
}
[data-theme="nyc"] .screen__result-body {
  font-size: var(--font-size-sm);
}

/* ─── 6b. Inline Note (Pattern A — "You should know" card) ─────────── */
/* ALL NYC notices use the same "You should know" card pattern:
   color-mix translucent bg, NO border, shadow, backdrop-filter,
   bold (not italic) heading. */
[data-theme="nyc"] .inline-note {
  border-radius: var(--nyc-sys-radius-xs);
  border-left: none;
  padding: 1.5rem 1rem;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
}
[data-theme="nyc"] .inline-note--tip,
[data-theme="nyc"] .inline-note--warning {
  background: #FFBE67;
  border-left: none;
}
[data-theme="nyc"] .inline-note--tip .inline-note__icon,
[data-theme="nyc"] .inline-note--warning .inline-note__icon {
  color: var(--text-primary);
}
[data-theme="nyc"] .inline-note--tip .inline-note__label,
[data-theme="nyc"] .inline-note--warning .inline-note__label {
  color: var(--text-primary);
  font-weight: 600;
  font-style: normal;
}
[data-theme="nyc"] .inline-note--info {
  background: #F0EFF8;
  border-left: none;
}
[data-theme="nyc"] .inline-note--info .inline-note__icon {
  color: var(--text-primary);
}
[data-theme="nyc"] .inline-note--info .inline-note__label {
  color: var(--text-primary);
  font-weight: 600;
  font-style: normal;
}
[data-theme="nyc"] .inline-note--success {
  background: color-mix(in srgb, var(--nyc-ref-color-green-70) 25%, transparent);
  border-left: none;
}
[data-theme="nyc"] .inline-note--success .inline-note__icon {
  color: var(--text-primary);
}
[data-theme="nyc"] .inline-note--success .inline-note__label {
  color: var(--text-primary);
  font-weight: 600;
  font-style: normal;
}

/* ─── 6c. Panel (Pattern A — "You should know" card) ───────────────── */
/* ALL panel variants adopt the translucent card pattern in NYC theme.
   No left border, color-mix bg, shadow, bold non-italic title, icon. */
[data-theme="nyc"] .panel {
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
  color: var(--text-primary);
}
[data-theme="nyc"] .panel--inline {
  border-left: none;
}
/* Force text inside panels to pure black in NYC theme — NOT links */
[data-theme="nyc"] .panel__title,
[data-theme="nyc"] .panel__body,
[data-theme="nyc"] .panel__bullets,
[data-theme="nyc"] .panel__bullets li {
  color: var(--text-primary);
}
/* Panel links stay blue + underlined */
[data-theme="nyc"] .panel__link {
  color: var(--text-link);
  text-decoration: underline;
}
[data-theme="nyc"] .panel__link:hover {
  color: var(--text-link-hover);
}

/* Icon circle via ::before pseudo-element on .panel__title
   — renders the orange circle with lightbulb SVG inline with the heading,
   matching the production "You should know" layout. */
[data-theme="nyc"] .panel__title {
  display: flex;
  align-items: center;
  gap: 12px;
  font-style: normal;
  font-weight: 600;
  font-size: var(--font-size-base); /* notice-card title — one step down */
  color: var(--text-primary);
}
[data-theme="nyc"] .panel--sm .panel__title {
  font-size: var(--font-size-base);
}
/* Notice-card body / bullets one step down (16px → 14px) to pair with the
   smaller title. */
[data-theme="nyc"] .panel__body,
[data-theme="nyc"] .panel__bullets,
[data-theme="nyc"] .panel__bullets li {
  font-size: var(--font-size-sm);
}
[data-theme="nyc"] .panel--warning .panel__title::before,
[data-theme="nyc"] .panel--amber .panel__title::before {
  content: '';
  display: flex;
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background-color: var(--nyc-ref-color-orange-60);
  background-image: url("data:image/svg+xml,%3Csvg width='16' height='21' viewBox='0 0 16 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 20H10M4 12.7H12M1 7.3C1 5.629 1.738 4.027 3.05 2.845 4.363 1.664 6.143 1 8 1c1.857 0 3.637.664 4.95 1.845C14.262 4.027 15 5.629 15 7.3c0 1.015-.273 2.014-.794 2.913-.523.899-1.28 1.67-2.206 2.248l-.542 2.309c-.072.426-.31.814-.673 1.095-.363.28-.825.435-1.304.435H6.52c-.48 0-.942-.155-1.304-.435a1.817 1.817 0 01-.673-1.095L4 12.47c-.927-.58-1.684-1.353-2.206-2.253A5.844 5.844 0 011 7.3z' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 16px 21px;
}
[data-theme="nyc"] .panel--info .panel__title::before {
  /* Removed — icons are opt-in via the panel component's `icon` param */
  content: none;
}

/* ── Explicit panel icons (opt-in via renderPanel({ icon: '...' })) ── */
[data-theme="nyc"] .panel__icon {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
}
[data-theme="nyc"] .panel__icon svg {
  width: 16px;
  height: 16px;
}
[data-theme="nyc"] .panel__icon--check {
  background-color: var(--nyc-ref-color-blue-70);
}
[data-theme="nyc"] .panel__icon--cross {
  background-color: #d4d4d4;
}

[data-theme="nyc"] .panel--warning {
  --panel-bg: #FFBE67;
  --panel-text: var(--text-primary);
  --panel-accent: transparent;
}
[data-theme="nyc"] .panel--amber {
  --panel-bg: #FFBE67;
  --panel-text: var(--text-primary);
  --panel-accent: transparent;
}
[data-theme="nyc"] .panel--info {
  --panel-bg: #F0EFF8;
  --panel-text: var(--text-primary);
  --panel-accent: transparent;
}
[data-theme="nyc"] .panel--success {
  --panel-bg: color-mix(in srgb, var(--nyc-ref-color-green-70) 25%, transparent);
  --panel-text: var(--text-primary);
  --panel-accent: transparent;
}
/* Panel header-style band — also use translucent treatment */
[data-theme="nyc"] .panel--header .panel__header {
  background: color-mix(in srgb, var(--nyc-ref-color-orange-60) 35%, transparent);
  color: var(--text-primary);
  font-weight: 600;
  font-style: normal;
}

/* ─── 6d. Dash Callout (Pattern A — "You should know" card) ────────── */
[data-theme="nyc"] .dash-callout {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
  padding: 1.25rem 1rem;
}
[data-theme="nyc"] .dash-callout--info {
  background: #F0EFF8;
  border: none;
}
[data-theme="nyc"] .dash-callout--success {
  background: color-mix(in srgb, var(--nyc-ref-color-green-70) 25%, transparent);
  border: none;
}
[data-theme="nyc"] .dash-callout--warning {
  background: #FFBE67;
  border: none;
}
/* Icon circle — brighter shade of base color */
[data-theme="nyc"] .dash-callout__icon {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  font-size: 20px;
}
[data-theme="nyc"] .dash-callout--warning .dash-callout__icon {
  background: var(--nyc-ref-color-orange-60);
  color: #000;
}
[data-theme="nyc"] .dash-callout--info .dash-callout__icon {
  background: var(--nyc-ref-color-blue-70);
  color: #000;
}
[data-theme="nyc"] .dash-callout--success .dash-callout__icon {
  background: var(--nyc-ref-color-green-70);
  color: #000;
}
[data-theme="nyc"] .dash-callout__title {
  font-weight: 600;
  font-style: normal;
}

/* ─── 6e. Dashboard Blocks ─────────────────────────────────────────── */
[data-theme="nyc"] .dash-block {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
[data-theme="nyc"] .dash-block--warning {
  background: var(--nyc-sys-color-surface-warning);
}
[data-theme="nyc"] .dash-block--info {
  background: var(--nyc-sys-color-surface-info);
}
[data-theme="nyc"] .dash-block--success {
  background: var(--nyc-sys-color-surface-success);
}
[data-theme="nyc"] .dash-block--error {
  background: var(--nyc-sys-color-surface-error);
}
[data-theme="nyc"] .dash-block__highlight {
  background: var(--nyc-sys-color-surface-warning);
  border-left: 5px solid var(--nyc-sys-color-auxiliary-warning);
  border-radius: var(--nyc-sys-radius-xs);
}

/* ─── 6f. Program Card Notice ──────────────────────────────────────── */
[data-theme="nyc"] .program-card__notice {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  background: var(--nyc-sys-color-surface-warning);
  color: var(--text-primary);
}

/* NYC DS avoids all-caps labels (same direction as the stat-card de-cap
   above). Meta labels on program cards and the eligibility-reminder block
   read in sentence case instead of uppercase. */
[data-theme="nyc"] .program-card__meta-label,
[data-theme="nyc"] .dash-block__col-heading {
  text-transform: none;
  letter-spacing: normal;
}
[data-theme="nyc"] .program-card__notice--positive {
  background: transparent;
  box-shadow: none;
  padding: 0;
  color: var(--text-primary);
}

/* ─── 6g. Notification Tray ───────────────────────────────────────── */
[data-theme="nyc"] .notif-tray {
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}

/* ─── 6h. Paystub-specific notices ─────────────────────────────────── */
[data-theme="nyc"] .ps-outstanding-note {
  border-radius: var(--nyc-sys-radius-xs);
  border-left-width: 5px;
}
[data-theme="nyc"] .ps-employer-reassure {
  border-radius: var(--nyc-sys-radius-xs);
}
[data-theme="nyc"] .ps-employer-manual-review {
  border-radius: var(--nyc-sys-radius-xs);
}

/* ─── 6i. Status Pills ────────────────────────────────────────────── */
/* Production nyc.gov uses lightest-tone backgrounds with default body
   text so pills read as status labels, NOT buttons. */
[data-theme="nyc"] .ps-pill {
  font-weight: 600;
}
[data-theme="nyc"] .ps-pill--reviews {
  background: var(--nyc-ref-color-orange-90);
  color: var(--text-primary);
}
[data-theme="nyc"] .ps-pill--verified {
  background: var(--nyc-ref-color-green-100);
  color: var(--text-primary);
}
[data-theme="nyc"] .ps-pill--progress {
  background: var(--nyc-ref-color-blue-100);
  color: var(--text-primary);
}
[data-theme="nyc"] .ps-pill--progress::before {
  border-color: var(--nyc-ref-color-blue-40);
  border-top-color: transparent;
}
[data-theme="nyc"] .ps-pill--checking {
  background: var(--nyc-ref-color-gray-90, #eee);
  color: var(--text-secondary);
}

/* ── 7. Stepper ──────────────────────────────────────────────────────── */
[data-theme="nyc"] .stepper__marker--current {
  background: var(--nyc-ref-color-blue-40);
  border-color: var(--nyc-ref-color-blue-40);
}
[data-theme="nyc"] .stepper__line--current {
  background: var(--nyc-ref-color-blue-40);
}

/* ── 8. Footer ───────────────────────────────────────────────────────── */
[data-theme="nyc"] .site-footer {
  background: #000000;
  color: #FFFFFF;
  border-top: none;
  padding: 48px 32px 32px;
}
[data-theme="nyc"] .site-footer__brand {
  font-family: 'Clash Grotesk', 'Noto Sans', sans-serif;
  color: #FFFFFF;
}
[data-theme="nyc"] .site-footer__copy {
  color: rgba(255,255,255,0.7);
}
[data-theme="nyc"] .site-footer__links {
  gap: 32px;
}
[data-theme="nyc"] .site-footer__links a {
  color: #FFFFFF;
  font-weight: 400;
  text-decoration: underline;
}
[data-theme="nyc"] .site-footer__links a:hover {
  color: var(--nyc-ref-color-blue-80);
  text-decoration: underline;
}

/* ── 9. Welcome Section (Unauth Landing) ─────────────────────────────── */
[data-theme="nyc"] .welcome-section--hero {
  background: none;
}
[data-theme="nyc"] .welcome-section__title {
  font-family: 'Clash Grotesk', 'Noto Sans', sans-serif;
}

/* ── 9b. Dashboard Containers ────────────────────────────────────────── */
/* Same NYC card pattern as alert-banner / status-banner:
   8px radius, no border, soft shadow, backdrop-filter blur. */
[data-theme="nyc"] .journey,
[data-theme="nyc"] .recap,
[data-theme="nyc"] .progress-card,
[data-theme="nyc"] .priority-tiers,
[data-theme="nyc"] .stat-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
}
/* Stat card variant backgrounds — same color-mix translucent approach
   as alert-banner--warning / --success / --info / --error. */
[data-theme="nyc"] .stat-card--warning {
  background: #FFBE67;
}
[data-theme="nyc"] .stat-card--success {
  background: color-mix(in srgb, var(--nyc-ref-color-green-70) 25%, transparent);
}
[data-theme="nyc"] .stat-card--info {
  background: #F0EFF8;
}
[data-theme="nyc"] .stat-card--error {
  background: color-mix(in srgb, var(--nyc-ref-color-red-70) 25%, transparent);
}

/* ── 9c. Journey — NYC Accent Colors ─────────────────────────────────── */
/* The journey dot ring uses a hardcoded CC-red rgba value; override it
   to the NYC blue palette for brand consistency. */
[data-theme="nyc"] .journey__stage--current .journey__dot::after {
  border-color: rgba(16, 63, 239, 0.18);
}
/* Completed line + dot use --stepper-completed (green) — override to
   NYC blue so the entire timeline is blue-tinted. */
[data-theme="nyc"] .journey__stage--completed .journey__line {
  background: var(--nyc-ref-color-blue-40);
}
[data-theme="nyc"] .journey__stage--completed .journey__dot {
  background: var(--nyc-ref-color-blue-40);
  border-color: var(--nyc-ref-color-blue-40);
}
/* Half-colored line on current stage */
[data-theme="nyc"] .journey__stage--current .journey__line {
  background: linear-gradient(to right, var(--nyc-ref-color-blue-40) 0% 50%, var(--border-light) 50% 100%);
}

/* ── 9d. Progress Card Segments — NYC Colors ─────────────────────────── */
[data-theme="nyc"] .progress-card__segment--completed {
  background: var(--nyc-ref-color-blue-40);
}
[data-theme="nyc"] .progress-card__segment--current {
  background: var(--nyc-ref-color-blue-60);
}
[data-theme="nyc"] .progress-card__segment--in-progress {
  background: var(--nyc-ref-color-blue-70);
}

/* ── 10. Stat Card — text always black for legibility ────────────────── */
[data-theme="nyc"] .stat-card__value-num,
[data-theme="nyc"] .stat-card__value-unit,
[data-theme="nyc"] .stat-card__body {
  color: var(--text-primary);
}
[data-theme="nyc"] .stat-card__label {
  color: var(--text-primary);
  font-weight: 600;
}

/* ── 10a. Progress Card Notes ────────────────────────────────────────── */
[data-theme="nyc"] .progress-card__notes {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
  background: #F0EFF8;
}
[data-theme="nyc"] .progress-card__note {
  color: var(--text-primary);
  gap: var(--space-sm);   /* more room between the check and the text */
}
/* Swap the Material "check" glyph for the brand check SVG, sized small to
   match the note text. The glyph is hidden (transparent) and the SVG fills
   the box. Blue here — these notes sit on the light lavender info card. */
[data-theme="nyc"] .progress-card__note-icon {
  color: transparent;
  width: 14px;
  height: 14px;
  font-size: 14px !important;
  background: url('../images/check-blue.svg') no-repeat center center;
  background-size: contain;
}
/* "You're subscribed" confirmation — green check (success context) */
[data-theme="nyc"] .dash-subscribe__ok .material-symbols-outlined {
  color: transparent;
  display: inline-block;
  width: 16px;
  height: 16px;
  font-size: 16px !important;
  margin-right: var(--space-2xs);
  vertical-align: middle;
  background: url('../images/check-green.svg') no-repeat center center;
  background-size: contain;
}

/* ── 10b. Priority Tiers ─────────────────────────────────────────────── */
/* Numbered rank chips — NYC blue gradient, dark to medium. */
[data-theme="nyc"] .priority-tiers__rank {
  background: var(--nyc-ref-color-blue-40);
  color: #FFFFFF;
}
[data-theme="nyc"] .priority-tiers__tier:nth-child(1) .priority-tiers__rank {
  background: var(--nyc-ref-color-blue-40);
}
[data-theme="nyc"] .priority-tiers__tier:nth-child(2) .priority-tiers__rank {
  background: #2562f5;
}
[data-theme="nyc"] .priority-tiers__tier:nth-child(3) .priority-tiers__rank {
  background: var(--nyc-ref-color-blue-60);
}
[data-theme="nyc"] .priority-tiers__tier:nth-child(4) .priority-tiers__rank {
  background: var(--nyc-ref-color-blue-70);
}

/* ── 11. User Dropdown ───────────────────────────────────────────────── */
[data-theme="nyc"] .user-dropdown {
  border-radius: var(--nyc-sys-radius-xs);
  border: 1px solid #DDDDDD;
  min-width: 320px;
}

/* ── 12. Selection Highlight ─────────────────────────────────────────── */
[data-theme="nyc"] ::selection {
  background: var(--nyc-ref-color-blue-80);
  color: #000000;
}

/* ── 13. Focus Rings ─────────────────────────────────────────────────── */
[data-theme="nyc"] :focus-visible {
  outline-color: #103FEF;
}

/* ── 14. Modals ──────────────────────────────────────────────────────── */
[data-theme="nyc"] .modal__content {
  border-radius: var(--nyc-sys-radius-xs);
}

/* ── 15. Button Bar ──────────────────────────────────────────────────── */
[data-theme="nyc"] .button-bar {
  border-top-color: #DDDDDD;
  gap: var(--space-md);
}
[data-theme="nyc"] .button-bar__left {
  gap: var(--space-md);
}
[data-theme="nyc"] .button-bar__right {
  gap: var(--space-md);
}

/* ── 16. Sidebar Nav (Dashboard) ─────────────────────────────────────── */
/* Matches the nyc.gov left nav pattern: black text, blue active state,
   blue left border on active, underline on hover. */
/* ── Sidebar Navigation (NYC DS) ─────────────────────────────────────── */
/* Blue 40 = interactive/clickable. Black = current (non-navigable).
   All clickable nav items are blue; the active "you are here" item
   is black with a black left border to indicate state, not action.
   Font-weight 600 (semibold) for all items so they carry visual
   weight against the pale gradient background. */

/* Default: blue, clickable — underline on LABEL only (not icon) */
[data-theme="nyc"] .sidebar-nav__link,
[data-theme="nyc"] .sidebar-nav__link:visited {
  color: var(--nyc-red);
  font-size: 18px;
  font-weight: 600;
  text-decoration: none;
  border-left: 3px solid transparent;
  padding: var(--space-lg) 16px;
  gap: var(--space-sm);
  transition: background 0.3s ease, border-color 0.3s ease, color 0.3s ease;
  background: #F0EFF8;   /* default matches the page-header bg */
}
[data-theme="nyc"] .sidebar-nav__link .sidebar-nav__label {
  text-decoration: underline;
  text-decoration-color: var(--nyc-red);
}
[data-theme="nyc"] .sidebar-nav__link .sidebar-nav__icon {
  color: var(--nyc-red);
  text-decoration: none;
}

/* Hover: darker blue + white bg */
[data-theme="nyc"] .sidebar-nav__link:hover {
  color: #091A8A;
  background: #FFFFFF;
}
[data-theme="nyc"] .sidebar-nav__link:hover .sidebar-nav__label {
  text-decoration: underline;
  text-decoration-color: #091A8A;
}
[data-theme="nyc"] .sidebar-nav__link:hover .sidebar-nav__icon {
  color: #091A8A;
}

/* Active = "you are here" — black text + black border.
   Not a clickable action, so no blue, no underline. */
[data-theme="nyc"] .sidebar-nav__link.is-active,
[data-theme="nyc"] .sidebar-nav__link.is-active:visited {
  border-left-color: #000000;
  color: #000000;
  font-size: 18px;
  font-weight: 600;
  text-decoration: none;
  background: #FFFFFF;   /* active = pure white */
}
[data-theme="nyc"] .sidebar-nav__link.is-active .sidebar-nav__label {
  text-decoration: none;
}
[data-theme="nyc"] .sidebar-nav__link.is-active .sidebar-nav__icon {
  color: #000000;
}

/* Sub-menu toggle button ("Other services") — same blue as nav links.
   It's a <button> but visually identical to a nav <a>. */
[data-theme="nyc"] .sidebar-nav__link--toggle,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle {
  color: var(--nyc-red);
  font-size: 18px;
  font-weight: 600;
  text-decoration: none;
  padding: var(--space-lg) 16px;
  gap: var(--space-sm);
  transition: background 0.3s ease, color 0.3s ease;
  background: #F0EFF8;   /* default matches the page-header bg */
}
[data-theme="nyc"] .sidebar-nav__link--toggle .sidebar-nav__label,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle .sidebar-nav__label {
  text-decoration: underline;
  text-decoration-color: var(--nyc-red);
}
/* Toggle default state — blue, clickable */
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle .sidebar-nav__icon {
  color: var(--nyc-red);
  text-decoration: none;
}
[data-theme="nyc"] .sidebar-nav__chevron {
  color: var(--nyc-red);
  text-decoration: none;
}
[data-theme="nyc"] .sidebar-nav__link--toggle:hover,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle:hover {
  color: #091A8A;
  background: #FFFFFF;
}
[data-theme="nyc"] .sidebar-nav__link--toggle:hover .sidebar-nav__label {
  text-decoration: underline;
  text-decoration-color: #091A8A;
}
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle:hover .sidebar-nav__icon {
  color: #091A8A;
}

/* Toggle ACTIVE state (expanded) — must come AFTER default hover rules
   so cascade order guarantees black overrides blue.
   The parent <li> owns the chip surface (components.css sets it to 0.45
   opacity white); override to pure white here. The button itself is
   transparent, so we set the <li> background. */
[data-theme="nyc"] .sidebar-nav__item--submenu:has(.sidebar-nav__submenu.is-open) {
  background: #FFFFFF;
}
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle.is-active {
  color: #000000;
}
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active .sidebar-nav__label {
  text-decoration: none;
}
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active:hover,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle.is-active:hover {
  color: #000000;
}
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active:hover .sidebar-nav__label {
  text-decoration: none;
}
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active .sidebar-nav__icon,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle.is-active .sidebar-nav__icon,
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active .sidebar-nav__chevron,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle.is-active .sidebar-nav__chevron,
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active:hover .sidebar-nav__icon,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle.is-active:hover .sidebar-nav__icon,
[data-theme="nyc"] .sidebar-nav__link--toggle.is-active:hover .sidebar-nav__chevron,
[data-theme="nyc"] .sidebar-nav__item--submenu > .sidebar-nav__link--toggle.is-active:hover .sidebar-nav__chevron {
  color: #000000;
}

/* Sidebar sub-links (inside expanded submenu) — blue, clickable */
[data-theme="nyc"] .sidebar-nav__sublink,
[data-theme="nyc"] .sidebar-nav__sublink:visited {
  color: var(--nyc-red);
  font-size: 18px;
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: var(--nyc-red);
}
[data-theme="nyc"] .sidebar-nav__sublink:hover {
  color: #091A8A;
  text-decoration: underline;
  text-decoration-color: #091A8A;
  text-decoration-skip-ink: auto;
}
/* External-link icon inside sub-links — atomic box blocks underline */
[data-theme="nyc"] .sidebar-nav__sublink .sidebar-nav__sublink-ext {
  display: inline-flex;
  text-decoration: none;
}

/* ── 17. Image Placeholders ──────────────────────────────────────────── */
[data-theme="nyc"] .image-placeholder {
  background: linear-gradient(135deg, var(--nyc-ref-color-blue-100), var(--nyc-ref-color-blue-90));
}

/* ── 18. Tables ──────────────────────────────────────────────────────── */
/* Production nyc.gov tables: dark header (gray-20 #333), white text,
   bolder/larger font. Cell borders use gray-80 (#ddd). */
[data-theme="nyc"] .results-table__th,
[data-theme="nyc"] .results-table th {
  background: var(--nyc-ref-color-gray-20);
  color: var(--nyc-ref-color-gray-white, #fff);
  font-family: var(--font-heading);
  font-weight: 500;
  font-size: var(--font-size-sm);
  letter-spacing: 0.02em;
  border-bottom-color: var(--nyc-ref-color-gray-30);
}
[data-theme="nyc"] .results-table__td,
[data-theme="nyc"] .results-table td {
  border-bottom-color: var(--nyc-ref-color-gray-80);
  font-family: var(--font-body);
}
/* Body cells read in Noto Sans — only the dark header keeps the Clash Grotesk
   display face. Cover every descendant (status text, Preview links, amounts,
   the "—" placeholders) so nothing inside a cell falls back to --font-heading.
   EXCLUDE .material-symbols-outlined — those spans must keep the icon font, or
   they render their ligature text ("visibility", "check_circle") instead of
   the glyph. */
[data-theme="nyc"] .results-table__td *:not(.material-symbols-outlined),
[data-theme="nyc"] .results-table td *:not(.material-symbols-outlined) {
  font-family: var(--font-body);
}

/* Uploaded file names read in Noto Sans too (the chip sets --font-heading and
   the name inherits it). The delete glyph keeps its icon font. A slight corner
   radius softens the otherwise near-square chip (NYC's --radius-sm is only 2px). */
[data-theme="nyc"] .uploaded-files__chip {
  font-family: var(--font-body);
  border-radius: var(--nyc-sys-radius-xs);
}
/* Match the deletable chip's right (remove-button) corners to the new chip
   radius so the outer corner stays rounded when an × is present. */
[data-theme="nyc"] .uploaded-files__delete {
  border-radius: 0 var(--nyc-sys-radius-xs) var(--nyc-sys-radius-xs) 0;
}

/* Entry-form titles ("Add a job" / "Add a provider" / "Add a child") bumped up
   so they read above the field labels (which are 20px in NYC). */
[data-theme="nyc"] .employment__form-title,
[data-theme="nyc"] .provider__form-title,
[data-theme="nyc"] .your-family__form-title {
  font-size: var(--font-size-lg);
}
/* Entry-form sub-group labels ("Where you work" / "About this job") in sentence
   case at a readable size — same approach as the schedule sub-labels, no all-caps
   eyebrow. */
[data-theme="nyc"] .employment__form-section-title,
[data-theme="nyc"] .provider__form-section-title {
  text-transform: none;
  letter-spacing: normal;
  font-size: var(--font-size-base);
  font-weight: var(--font-weight-medium);
}

/* Income-details panel header in sentence case at base size (source copy is
   already "Income details" — only the all-caps eyebrow transform is dropped). */
[data-theme="nyc"] .income-details__header {
  text-transform: none;
  letter-spacing: normal;
  font-size: var(--font-size-base);
}

/* Notice-card consistency: match the amber scan-limit banner's title + body to
   the blue panel (the reference) — title 18px (md), body 16px (base). It was
   16px title / 14px body, out of step with the panel variants. */
[data-theme="nyc"] .ps-scan-limit-banner > strong {
  font-size: var(--font-size-base); /* match panel title (one step down) */
  font-weight: var(--font-weight-semibold); /* match the panel title (600), not <strong>'s default 700 */
}
[data-theme="nyc"] .ps-scan-limit-banner__body {
  font-size: var(--font-size-sm); /* match panel body (one step down) */
}

/* All upload-zone text reads in Noto (button "Upload files", "or drop files",
   accepted-formats hint, tutorial link, multi-file note). Targeted by the
   class prefix because the footer + multi-file note render as SIBLINGS outside
   the .upload-zone box, so a descendant selector wouldn't reach them. The
   upload glyph (also an upload-zone__ class) keeps its icon font via :not(). */
[data-theme="nyc"] [class*="upload-zone__"]:not(.material-symbols-outlined) {
  font-family: var(--font-body);
}

/* Match the upload drop zone's resting border + background to the schedule
   "Pick at least one day…" empty-state card (.schedule__no-days-hint): a thin
   1px light-grey dashed border on a white fill, instead of the heavier 1.5px
   medium-grey. The interactive hover/drag states are left intact. */
[data-theme="nyc"] .upload-zone {
  border: 1px dashed var(--border-light);
  background: var(--surface-muted);
}

/* The "Select an option above to continue" placeholder reads in the same calm
   style as the schedule "Pick at least one day…" hint: sentence-case italic
   body text (not the all-caps heading-font eyebrow), with the thin light dashed
   border. */
[data-theme="nyc"] .field-placeholder {
  font-family: var(--font-body);
  font-style: italic;
  text-transform: none;
  letter-spacing: normal;
  border-color: var(--border-light);
}

/* Replacement-file trash icon (flagged paystub rows) reads true red. The base
   uses var(--nyc-red), which is Blue 40 in this theme — wrong for a destructive
   remove affordance — so pin it to the red error token. */
[data-theme="nyc"] .ps-flag-file-remove {
  color: var(--nyc-ref-color-red-50);
}
[data-theme="nyc"] .ps-flag-file-remove:hover {
  color: var(--nyc-ref-color-red-50);
  background: var(--nyc-ref-color-red-100);
}

/* Destructive text button ("Discard entry" / cancel-entry on the add-entry
   sub-forms). The base --alert-error-text resolves to --text-primary in this
   theme, so pin the destructive action to the true red token (Blue 40 is the
   NYC primary, which would read as a normal link — wrong for a destructive
   affordance). */
[data-theme="nyc"] .btn--text-danger,
[data-theme="nyc"] .btn--text-danger:hover {
  color: var(--nyc-ref-color-red-50);
}

/* ── 19. Container Unification — NYC Card Pattern ────────────────────── */
/* Every card/container gets: 8px radius, no border, soft shadow.
   This replaces the default 1px solid border on all card-like surfaces. */

/* Application card (dashboard — case number, status, actions) */
[data-theme="nyc"] .app-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Accordion (FAQ / collapsible sections) */
[data-theme="nyc"] .accordion {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Confirm card (wizard review/summary cards) */
[data-theme="nyc"] .confirm-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Entry list rows (family members, children, providers) */
[data-theme="nyc"] .entry-list__rows {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Results table wrapper (eligibility/paystub results) */
[data-theme="nyc"] .results-table-wrap {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  overflow: hidden;
}

/* Document forms card (document upload) */
[data-theme="nyc"] .doc-forms__card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Choice card (document type picker) */
[data-theme="nyc"] .choice-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Radio option card (card-style radio inputs) */
[data-theme="nyc"] .radio-option--card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
/* Selected state — ring via shadow instead of border */
[data-theme="nyc"] .radio-option--card:has(.radio-option__input:checked) {
  border: none;
  box-shadow: 0 0 0 2px var(--nyc-red), 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Consent affirm card (consent checkbox) */
[data-theme="nyc"] .consent-affirm {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
[data-theme="nyc"] .consent-affirm.is-selected {
  border: none;
  box-shadow: 0 0 0 2px var(--nyc-red), 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Update case card */
[data-theme="nyc"] .update-case-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Program card (apply page) */
[data-theme="nyc"] .program-card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Program card X (landing/programs page) */
[data-theme="nyc"] .program-card-x {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Other programs row */
[data-theme="nyc"] .other-programs__row {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Eligibility checker (landing page) */
[data-theme="nyc"] .elig-check {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
[data-theme="nyc"] .elig-check__question {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
[data-theme="nyc"] .elig-check__result {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}

/* Recertification verified summary */
[data-theme="nyc"] .recert-verified-summary__grid {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  column-gap: 24px;
}

/* Remaining content containers — same NYC card recipe (8px radius, NO border,
   soft shadow). Applied app-wide so every grey/white panel matches the system
   without per-page borders: wizard form panels (employment / income / provider
   / your-family / schedule), the schedule grey section + nested white quick-fill
   + travel + provider-gate cards, dashboard/journey/recap/priority cards, the
   employer + progress + action-prompt cards, and the paystub flag-detail panel.
   Background (white vs grey) stays whatever each card already declares. */
[data-theme="nyc"] .employer-card,
[data-theme="nyc"] .progress-card,
[data-theme="nyc"] .prompt-card--action,
[data-theme="nyc"] .priority-tiers,
[data-theme="nyc"] .journey,
[data-theme="nyc"] .recap,
[data-theme="nyc"] .employment__form,
[data-theme="nyc"] .income-details,
[data-theme="nyc"] .provider__form,
[data-theme="nyc"] .your-family__form,
[data-theme="nyc"] .schedule__section,
[data-theme="nyc"] .schedule__quickfill,
[data-theme="nyc"] .schedule__travel-block,
[data-theme="nyc"] .schedule__provider-gate,
[data-theme="nyc"] .ps-flag-detail__data,
[data-theme="nyc"] .ps-cert-section,
[data-theme="nyc"] .ps-consent-summary,
[data-theme="nyc"] .thank-you__card {
  border-radius: var(--nyc-sys-radius-xs);
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
/* Consent section: its body is the self-contained blue summary card, so the
   outer white cert card would be a redundant container-in-container. Strip the
   outer card's surface (keep the section's spacing + heading) and let the blue
   summary be the only container. */
[data-theme="nyc"] .ps-cert-section--bare {
  background: transparent;
  box-shadow: none;
  padding: 0;
}

/* Schedule sub-section labels in sentence case (not the all-caps eyebrow). The
   source copy is already sentence case; drop the uppercase transform + its
   tracking, and bump the size so they read as real sub-headings rather than a
   tiny eyebrow label. */
[data-theme="nyc"] .schedule__quickfill-title,
[data-theme="nyc"] .schedule__per-day-title {
  text-transform: none;
  letter-spacing: normal;
  font-size: var(--font-size-md);
  font-weight: var(--font-weight-medium);
}
/* A little more breathing room at the bottom of the quick-fill card so the
   Start/End fields don't sit right against the edge. */
[data-theme="nyc"] .schedule__quickfill {
  padding-bottom: var(--space-xl);
}

/* Thank-you page section headings in sentence case (source copy is already
   sentence case) and bumped up for readability — the all-caps eyebrow at the
   small size read as cramped labels rather than section headings. */
[data-theme="nyc"] .thank-you__heading {
  text-transform: none;
  letter-spacing: normal;
  font-size: var(--font-size-lg);
  font-weight: var(--font-weight-semibold);
}
/* Top-level section headings across the wizard/form pages — consistent lighter
   weight (600) and 22px. Matches ps-section-heading (Review & Submit) to the
   per-page section titles (schedule, about-you, employment, your-family,
   provider, child-family-needs, screening). The small uppercase eyebrow
   sub-labels (e.g. .form-section-title, __form-section-title) are intentionally
   excluded — they're a different, smaller heading level. */
[data-theme="nyc"] .ps-section-heading,
[data-theme="nyc"] .ps-employer-title,
[data-theme="nyc"] .schedule__section-title,
[data-theme="nyc"] .about-you__section-title,
[data-theme="nyc"] .employment__section-title,
[data-theme="nyc"] .your-family__section-title,
[data-theme="nyc"] .provider__section-title,
[data-theme="nyc"] .cfn__section-title,
[data-theme="nyc"] .screen__section-title,
[data-theme="nyc"] .income-group__title,
[data-theme="nyc"] .get-started__heading,
[data-theme="nyc"] .doc-upload__heading,
[data-theme="nyc"] .doc-forms__heading {
  font-weight: var(--font-weight-semibold);
  font-size: 1.375rem; /* 22px */
}
/* Results-table heading band (e.g. "Paystubs details") — same treatment, plus
   drop the all-caps eyebrow transform + tracking (source copy is sentence case). */
[data-theme="nyc"] .results-table__heading {
  text-transform: none;
  letter-spacing: normal;
  font-weight: var(--font-weight-semibold);
  font-size: var(--font-size-base); /* 16px */
}

/* ── 20. Side-by-side Card Grid Gaps ─────────────────────────────────── */
/* With borders replaced by shadows, side-by-side cards need more
   horizontal breathing room so their shadows don't overlap. */
[data-theme="nyc"] .dash-block__grid {
  column-gap: 24px;
}
[data-theme="nyc"] .dash-alternatives {
  column-gap: 24px;
}
[data-theme="nyc"] .stat-grid {
  column-gap: 24px;
}
[data-theme="nyc"] .recap__columns {
  column-gap: 24px;
}
[data-theme="nyc"] .form-grid-2col {
  column-gap: 24px;
}
[data-theme="nyc"] .voucher-display-card__grid {
  column-gap: 24px;
}

/* ── 21. Unauth Landing — Visual Polish ──────────────────────────────── */

/* Hero section: when a real image is present, make it the star.
   Round the image, add shadow, and give the hero section breathing room. */
[data-theme="nyc"] .welcome-section--hero .image-placeholder {
  display: none;
}
[data-theme="nyc"] .welcome-section--hero {
  gap: var(--space-2xl);
  padding: var(--space-md) 0;
  align-items: center;
}
[data-theme="nyc"] .welcome-section--hero .hero-photo {
  width: 100%;
  max-height: 380px;
  min-height: 340px;
  border-radius: var(--nyc-sys-radius-xs);
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.12);
  background-size: cover;
  background-position: center center;
  background-repeat: no-repeat;
}

/* Hero title: larger, bolder for the landing marquee */
[data-theme="nyc"] .layout-full > .welcome-section--hero .welcome-section__title {
  font-size: 2.4rem;
  line-height: 1.12;
  letter-spacing: -0.02em;
}

/* Lede text: slightly larger for readability */
[data-theme="nyc"] .welcome-section__lede {
  font-size: var(--font-size-base);
  line-height: 1.6;
  color: var(--text-secondary);
}

/* CTA buttons: more generous padding on landing hero */
[data-theme="nyc"] .welcome-section__cta-row .btn {
  padding: 14px 36px;
}

/* ── 22. Stat Cards — Unauth Landing Polish ──────────────────────────── */
/* Keep values + labels in black (blue is reserved for clickable items).
   Wider gaps between cards; remove uppercase from labels for readability. */
[data-theme="nyc"] .stat-grid {
  gap: var(--space-lg);
}
[data-theme="nyc"] .layout-full .stat-card__label {
  text-transform: none;
  letter-spacing: normal;
  font-size: var(--font-size-sm);
}

/* ── 23. Image Band — Full Photo Treatment ───────────────────────────── */
[data-theme="nyc"] .image-band {
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15);
  min-height: 300px;
}
[data-theme="nyc"] .image-band__placeholder {
  display: none;
}
/* Scrim: dark on LEFT (where text sits), transparent on RIGHT
   (so the families in the photo stay visible). */
[data-theme="nyc"] .image-band__scrim {
  background: linear-gradient(
    to right,
    rgba(0, 0, 0, 0.82) 0%,
    rgba(0, 0, 0, 0.6) 40%,
    rgba(0, 0, 0, 0.2) 65%,
    transparent 100%
  );
}
/* Overlay takes ~55% when placeholder is hidden — leaves
   the right side clear for the photo. */
[data-theme="nyc"] .image-band__overlay {
  width: 55%;
}
[data-theme="nyc"] .image-band__quote {
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
}
[data-theme="nyc"] .image-band__attribution {
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}

/* ── 24. Eligibility Checker — Clean Treatment ───────────────────────── */
[data-theme="nyc"] .elig-check {
  background: white;
}
/* When stacked below image-band, no border — the shared shadow wraps the merged unit */
[data-theme="nyc"] .image-band + .elig-check {
  border: none;
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
[data-theme="nyc"] .image-band:has(+ .elig-check) {
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
}
/* Question cards: light blue background signals interactivity */
[data-theme="nyc"] .elig-check__question {
  background: #F0EFF8;
  border-color: var(--nyc-ref-color-gray-80);
  padding: var(--space-lg);
}
/* Result panel must share the cards' padding + icon column so its icon and
   text line up vertically with the question cards above. Without this the
   cards use space-lg (24px) and the result keeps the base space-md (12px),
   so the content edges don't align. */
[data-theme="nyc"] .elig-check__result {
  padding: var(--space-lg);
}
/* Number bullets: black, NOT blue — blue is reserved for interactive items */
[data-theme="nyc"] .elig-check__q-number {
  background: var(--text-primary);
  color: #fff;
}
/* Yes/No toggles: secondary style default, primary style when selected */
[data-theme="nyc"] .elig-check__toggle-row {
  margin-top: var(--space-md);
  border-color: var(--nyc-ref-color-gray-80);
}
[data-theme="nyc"] .elig-check__toggle {
  font-weight: 600;
  padding: var(--space-2xs) var(--space-lg);
  background: white;
  color: var(--nyc-ref-color-blue-40);
  border-color: var(--nyc-ref-color-gray-80);
}
[data-theme="nyc"] .elig-check__toggle + .elig-check__toggle {
  border-left-color: var(--nyc-ref-color-gray-80);
}
[data-theme="nyc"] .elig-check__toggle:hover {
  background: var(--nyc-ref-color-gray-95);
  color: var(--nyc-ref-color-blue-30);
}
[data-theme="nyc"] .elig-check__toggle.is-active {
  background: var(--nyc-ref-color-blue-40);
  color: #fff;
  border-color: var(--nyc-ref-color-blue-40);
}
[data-theme="nyc"] .elig-check__toggle.is-active:hover {
  background: var(--nyc-ref-color-blue-30);
  color: #fff;
}

/* ── 25. Program Compare Cards — NYC DS Card Component ───────────────── */
/* NYC DS card pattern from reference: rounded corners, 1px light-gray
   border, white background, clean typography hierarchy. No colored
   accent stripes, no square corners. */
[data-theme="nyc"] .program-compare__grid {
  gap: var(--space-lg);
}
[data-theme="nyc"] .program-card-x {
  background: white;
  border: none;
  border-radius: var(--nyc-sys-radius-xs);
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, .15);
  backdrop-filter: blur(12.5px);
  -webkit-backdrop-filter: blur(12.5px);
  padding: var(--space-xl);
}
[data-theme="nyc"] .program-card-x:hover {
  box-shadow: 0 0 12px 2px rgba(0, 0, 0, .2);
}
/* Card name — large bold heading, matching the production detail cards */
[data-theme="nyc"] .program-card-x__name {
  font-family: 'Clash Grotesk', 'Noto Sans', sans-serif;
  font-size: 1.85rem;
  font-weight: 600;
  line-height: 1.2;
}
/* Tagline — secondary description text */
[data-theme="nyc"] .program-card-x__tagline {
  font-size: var(--font-size-base);
  color: var(--text-secondary);
}
/* Facts — no divider lines (production uses icon rows + spacing instead) */
[data-theme="nyc"] .program-card-x__facts {
  border: none;
  padding: 0;
  margin-top: var(--space-lg);
  display: flex;
  flex-direction: column;
  gap: var(--space-lg);
}
/* Hidden by default (CC theme keeps its plain labels); shown only in NYC. */
.program-card-x__fact-icon {
  display: none;
}
[data-theme="nyc"] .program-card-x__fact-icon {
  display: inline-flex;
  align-items: center;
  font-size: 26px !important;
  color: var(--nyc-landing-navy, var(--nyc-red));
}
/* Label row: icon + bold title-case label (no uppercase), value beneath */
[data-theme="nyc"] .program-card-x__fact-label {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  text-transform: none;
  letter-spacing: normal;
  font-weight: 600;
  font-size: var(--font-size-sm);
  color: var(--text-primary);
  margin-bottom: var(--space-3xs);
}
/* Fact values: regular weight, dark — sit directly under the label */
[data-theme="nyc"] .program-card-x__fact-value {
  font-size: var(--font-size-sm);
  font-weight: 400;
  color: var(--text-primary);
  line-height: 1.4;
}
/* Status pill — neutral gray background, no bright colors */
[data-theme="nyc"] .program-card-x__status .pill {
  background: var(--nyc-ref-color-gray-95);
  color: var(--text-primary);
  border: 1px solid var(--nyc-ref-color-gray-80);
  font-weight: 600;
  border-radius: 20px;
}
[data-theme="nyc"] .program-card-x__status .pill--approved,
[data-theme="nyc"] .program-card-x__status .pill--waitlisted {
  background: var(--nyc-ref-color-gray-95);
  color: var(--text-primary);
  border-color: var(--nyc-ref-color-gray-80);
}
/* Footnote — dark grey, italic */
[data-theme="nyc"] .program-card-x__footnote {
  font-style: italic;
  color: var(--text-muted);
  font-size: var(--font-size-xs);
  line-height: 1.5;
}

/* ── 26. Voucher Pause Notice — Softer on Unauth ─────────────────────── */
[data-theme="nyc"] .layout-full > .alert-banner {
  border-radius: var(--nyc-sys-radius-xs);
}

/* ── 27. Sources Footer — Hidden ─────────────────────────────────────── */
[data-theme="nyc"] .dash-sources {
  display: none;
}

/* ── 28. Section Spacing — More Air Between Blocks ───────────────────── */
[data-theme="nyc"] .layout-full > .welcome-section--hero {
  margin-bottom: var(--space-2xl);
}
[data-theme="nyc"] .layout-full > .stat-grid-wrap {
  margin-bottom: var(--space-2xl);
}
[data-theme="nyc"] .layout-full > .image-band {
  margin-bottom: var(--space-2xl);
}
/* When merged with elig-check, kill the gap */
[data-theme="nyc"] .layout-full > .image-band:has(+ .elig-check) {
  margin-bottom: 0;
}
[data-theme="nyc"] .layout-full > .elig-check {
  margin-bottom: var(--space-2xl);
}
[data-theme="nyc"] .layout-full > .program-compare {
  margin-bottom: var(--space-2xl);
}

/* ── 29. Unauth Landing — full-bleed band layout (NYC, landing only) ──────
   Mirrors the live nyc.gov Child Care landing: alternating full-width color
   bands. The black NYC bar → page-header → voucher notice → hero → stats all
   share the #F0EFF8 light field (header merges into the hero). The screener
   band (.nyc-screener-band, wrapping .image-band + .elig-check) is a navy
   full-bleed stripe: circular image on the left, gold title + three stacked
   question rows on the right, white result card spanning below. "Pick the
   program that fits" (.program-compare) returns to the light field. Scoped to
   .nyc-landing so the dashboard / wizard (which also use .layout-full) are
   untouched; no component internals change.

   Tweak the navy + the production-style gold heading here in one place: */
[data-theme="nyc"] .nyc-landing {
  --nyc-landing-navy: #1B2C8F;
  --nyc-landing-gold: #F7A53B;
}

/* Light field behind the whole landing so the header merges into the hero.
   overflow-x: clip absorbs the 100vw band breakout so it never adds a
   horizontal scrollbar. */
[data-theme="nyc"] .page-body:has(> .nyc-landing) {
  background: #F0EFF8;
  overflow-x: clip;
}

/* Voucher-pause notice (landing only): pull the right edge in so the body
   copy wraps to a comfortable measure instead of running edge-to-edge. */
[data-theme="nyc"] .nyc-landing > .alert-banner {
  padding-right: 18%;
}

/* The screener band wraps image-band + elig-check. Transparent in the CC
   theme (no box) so that theme is untouched; the NYC theme below turns it
   into the full-bleed navy band. */
.nyc-screener-band {
  display: contents;
}

/* Navy band — full-bleed, a simple 2-column grid: circular image on the left,
   and the whole screener (title → questions → result) stacked in the right
   column. Keeping the right side as one block (rather than splitting title /
   questions into separate grid rows the image spans) means the image height
   no longer inflates the gap between the title and the first question. */
[data-theme="nyc"] .nyc-landing .nyc-screener-band {
  display: grid;
  grid-template-columns: clamp(300px, 30vw, 420px) minmax(0, 1fr);
  grid-template-areas:
    "media   header"
    "media   questions"
    "result  result";
  column-gap: var(--space-3xl);
  row-gap: var(--space-xl);
  align-items: start;
  background: var(--nyc-landing-navy);
  /* full-bleed to the viewport, inner content re-aligned to the page column */
  width: 100vw;
  position: relative;
  left: 50%;
  margin-left: -50vw;
  margin-right: -50vw;
  padding: 72px max(var(--space-3xl), calc((100vw - var(--content-max-width)) / 2 + var(--space-3xl)));
  box-sizing: border-box;
  margin-bottom: var(--space-2xl);
}

/* Column 1 — circular image (image-band reduced to just its photo). Spans the
   header + questions rows and is vertically centered against that group. */
[data-theme="nyc"] .nyc-landing .nyc-screener-band > .image-band {
  grid-area: media;
  align-self: center;
  display: block;
  background: transparent;
  border: none;
  border-radius: 0;
  box-shadow: none;
  overflow: visible;
  min-height: 0;
  margin: 0;
  padding: 0;
}
[data-theme="nyc"] .nyc-landing .nyc-screener-band .image-band__media {
  position: static;
  width: 100%;
  aspect-ratio: 1 / 1;
  height: auto;
  border-radius: 50%;
  overflow: hidden;
}
/* Zoom in so the families fill the circle instead of the street/buildings */
[data-theme="nyc"] .nyc-landing .nyc-screener-band .image-band__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 55%;
  transform: scale(1.35);
}
/* Heading lives with the questions now, so the image-band overlay is unused */
[data-theme="nyc"] .nyc-landing .nyc-screener-band .image-band__scrim,
[data-theme="nyc"] .nyc-landing .nyc-screener-band .image-band__overlay {
  display: none;
}

/* elig-check dissolves into the band grid so its title / questions / result
   can occupy their own cells (title + questions next to the image, result
   spanning full width below). */
[data-theme="nyc"] .nyc-landing .nyc-screener-band > .elig-check {
  display: contents;
}

/* Title sits at the bottom of its row and questions at the top of theirs, so
   the title+questions pair hugs the vertical center of the image. drop the
   description + secondary skip link. text-wrap:balance keeps the two title
   lines even instead of orphaning "program". */
[data-theme="nyc"] .nyc-landing .nyc-screener-band .elig-check__header {
  grid-area: header;
  align-self: end;
  display: block;
  margin: 0 0 var(--space-lg) 0;   /* extra gap below the title before the questions */
}
[data-theme="nyc"] .nyc-landing .nyc-screener-band .elig-check__intro,
[data-theme="nyc"] .nyc-landing .nyc-screener-band .elig-check__skip-link {
  display: none;
}
[data-theme="nyc"] .nyc-landing .nyc-screener-band .elig-check__title {
  color: var(--nyc-landing-gold);
  font-family: 'Clash Grotesk', 'Noto Sans', sans-serif;
  font-size: 2.3rem;
  font-weight: 600;
  line-height: 1.12;
  margin: 0;
  text-wrap: balance;
}

/* Questions — stacked rows, each "label … Yes/No", divided by subtle rules
   so the column reads as a clean list (lighter than panels). */
[data-theme="nyc"] .nyc-landing .nyc-screener-band .elig-check__questions {
  grid-area: questions;
  align-self: start;
  display: flex;
  flex-direction: column;
  gap: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}
[data-theme="nyc"] .nyc-landing .elig-check__question {
  display: block;            /* full-width row so the toggle can reach the edge */
  background: transparent;
  border: none;
  border-bottom: 1px solid rgba(255, 255, 255, 0.16);
  padding: var(--space-lg) 0;   /* more breathing room between questions */
}
[data-theme="nyc"] .nyc-landing .elig-check__question:first-child {
  padding-top: 0;
}
[data-theme="nyc"] .nyc-landing .elig-check__question:last-child {
  border-bottom: none;
  padding-bottom: 0;
}
/* Lay each question as a single row: label on the left, Yes/No on the right */
[data-theme="nyc"] .nyc-landing .elig-check__q-body {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-xl);
  width: 100%;
}
[data-theme="nyc"] .nyc-landing .elig-check__q-number,
[data-theme="nyc"] .nyc-landing .elig-check__q-hint {
  display: none;
}
[data-theme="nyc"] .nyc-landing .elig-check__q-label {
  color: #FFFFFF;
  font-size: var(--font-size-lg);
  line-height: 1.35;
  margin-bottom: 0;
  flex: 1 1 auto;
}
[data-theme="nyc"] .nyc-landing .elig-check__toggle-row {
  margin-top: 0;
  margin-left: auto;   /* push every Yes/No pill to the right edge */
  flex: 0 0 auto;
}
[data-theme="nyc"] .nyc-landing .elig-check__toggle {
  font-size: var(--font-size-base);
}

/* Yes/No toggles on navy: ghost (white text) when unselected, solid white
   with navy text when selected — readable contrast in every state. */
[data-theme="nyc"] .nyc-landing .elig-check__toggle-row {
  border-color: rgba(255, 255, 255, 0.55);
}
[data-theme="nyc"] .nyc-landing .elig-check__toggle {
  background: transparent;
  color: #FFFFFF;
  border-color: rgba(255, 255, 255, 0.55);
}
[data-theme="nyc"] .nyc-landing .elig-check__toggle + .elig-check__toggle {
  border-left-color: rgba(255, 255, 255, 0.55);
}
[data-theme="nyc"] .nyc-landing .elig-check__toggle:hover {
  background: rgba(255, 255, 255, 0.16);
  color: #FFFFFF;
}
[data-theme="nyc"] .nyc-landing .elig-check__toggle.is-active,
[data-theme="nyc"] .nyc-landing .elig-check__toggle.is-active:hover {
  background: #FFFFFF;
  color: var(--nyc-landing-navy);
  border-color: #FFFFFF;
}
/* Result / feedback panel: a distinct LIGHT card so the recommendation lifts
   off the navy instead of disappearing into it. Dark text on the light field
   color; the navy "Continue" button reads clearly on it. */
[data-theme="nyc"] .nyc-landing .elig-check__result {
  grid-area: result;
  background: #FFFFFF;
  border: none;
  border-radius: var(--nyc-sys-radius-xs);
  padding: var(--space-lg) var(--space-xl);
  box-shadow: 0 2px 14px rgba(0, 0, 0, 0.18);
}
[data-theme="nyc"] .nyc-landing .elig-check__result-headline {
  color: var(--text-primary);
}
[data-theme="nyc"] .nyc-landing .elig-check__result-body {
  color: var(--text-secondary);
}
/* Lay the result content in two columns: headline + body on the left, the
   "Continue" button vertically centered and right-aligned in the same row. */
[data-theme="nyc"] .nyc-landing .elig-check__result-content {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-areas:
    "headline cta"
    "body     cta";
  align-items: start;
  column-gap: var(--space-2xl);
  row-gap: var(--space-2xs);
}
[data-theme="nyc"] .nyc-landing .elig-check__result-headline {
  grid-area: headline;
}
[data-theme="nyc"] .nyc-landing .elig-check__result-body {
  grid-area: body;
}
[data-theme="nyc"] .nyc-landing .elig-check__result-ctas {
  grid-area: cta;
  align-self: center;
  justify-self: end;
  margin: 0;
}
/* Icon: navy by default; once there's a recommendation (complete states) show
   the production red check (check.svg) — the one place a check is logical. */
[data-theme="nyc"] .nyc-landing .elig-check__result-icon {
  color: var(--nyc-landing-navy);
}
[data-theme="nyc"] .nyc-landing .elig-check__result[data-state="likely"] .elig-check__result-icon,
[data-theme="nyc"] .nyc-landing .elig-check__result[data-state="maybe"] .elig-check__result-icon {
  color: transparent;
  display: inline-block;
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  margin-right: var(--space-xs);   /* breathing room before the headline */
  background: url('../images/check-green.svg') no-repeat center center;   /* green = positive recommendation on the white card */
  background-size: contain;
}

/* Hero photo → circle, to match the production site's circular imagery
   (pairs with the circular quote photo in the navy band above). Zoomed in
   on the family rather than the street/buildings. */
[data-theme="nyc"] .nyc-landing .welcome-section--hero .hero-photo {
  border-radius: 50%;
  aspect-ratio: 1 / 1;
  width: 100%;
  max-width: 420px;
  height: auto;
  min-height: 0;
  max-height: none;
  margin-inline: auto;
  background-size: 165%;
  background-position: 50% 42%;
}
/* Hero title matches the screener's gold title size for a consistent rhythm */
[data-theme="nyc"] .nyc-landing .welcome-section--hero .welcome-section__title {
  font-size: 2.3rem;
  line-height: 1.12;
}

/* ── Stat cards → production-style stacked cards (landing only) ───────────
   Reuse the stat-card component as-is; only the landing layout changes:
   a single stacked column of full-width cards, each with a periwinkle
   left-accent bar like the live site's announcement cards. The big number
   sits in a left column, label + body to its right. No component internals
   touched. */
[data-theme="nyc"] .nyc-landing .stat-grid {
  display: flex;
  flex-direction: row;        /* both cards side by side — plenty of room */
  gap: var(--space-md);
  max-width: none;            /* stretch full content width like production */
}
[data-theme="nyc"] .nyc-landing .stat-card {
  flex: 1 1 0;                /* equal-width cards filling the row */
  display: grid;
  grid-template-columns: auto 1fr;   /* value column hugs the number — no dead space */
  grid-template-areas:
    "value label"
    "value body";
  column-gap: var(--space-lg);
  row-gap: var(--space-3xs);
  align-items: center;
  border: 1px solid var(--nyc-ref-color-gray-90, #e6e6e6);
  border-left: 6px solid #C4BDFF;
  border-radius: var(--nyc-sys-radius-xs);
  padding: var(--space-md) var(--space-lg);
  box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.06);
}
[data-theme="nyc"] .nyc-landing .stat-card__value {
  grid-area: value;
  align-self: center;
}
/* Numbers at body scale — no more oversized hero figures */
[data-theme="nyc"] .nyc-landing .stat-card__value-num {
  font-size: var(--font-size-lg);
}
[data-theme="nyc"] .nyc-landing .stat-card__value-unit {
  font-size: var(--font-size-sm);
}
[data-theme="nyc"] .nyc-landing .stat-card__label {
  grid-area: label;
  align-self: end;
  font-size: var(--font-size-base);
}
[data-theme="nyc"] .nyc-landing .stat-card__body {
  grid-area: body;
  align-self: start;
  margin: 0;
  font-size: var(--font-size-sm);
}
/* More breathing room below the stats (the light region's last child) before
   the navy band begins. */
[data-theme="nyc"] .layout-full.nyc-landing > .stat-grid-wrap {
  margin-bottom: 64px;
}

/* ── "Child Care for All" band — production footer lockup ─────────────────
   A navy band just above the global footer: the Child Care for All logo on
   the left, the managed-by line + Mayor's Office link on the right. Hidden in
   the CC theme; shown only on the NYC landing. */
.nyc-cc-for-all {
  display: none;
}
[data-theme="nyc"] .nyc-landing .nyc-cc-for-all {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2xl);
  background: var(--nyc-landing-navy);
  box-sizing: border-box;
  /* Contained to the content column (matches production); rounded top corners,
     square bottom that sits flush on top of the full-width footer. */
  border-radius: var(--nyc-sys-radius-xs) var(--nyc-sys-radius-xs) 0 0;
  padding: var(--space-2xl) var(--space-3xl);
  margin-top: var(--space-2xl);
  margin-bottom: calc(-1 * var(--space-2xl));   /* cancel layout-full bottom padding → flush with footer */
}
[data-theme="nyc"] .nyc-landing .nyc-cc-for-all__logo {
  height: 56px;
  width: auto;
  flex: 0 0 auto;
}
[data-theme="nyc"] .nyc-landing .nyc-cc-for-all__managed {
  margin: 0;
  text-align: right;
  color: #FFFFFF;
  font-size: var(--font-size-sm);
  line-height: 1.4;
}
[data-theme="nyc"] .nyc-landing .nyc-cc-for-all__link,
[data-theme="nyc"] .nyc-landing .nyc-cc-for-all__link:visited {
  color: #FFFFFF;
  font-weight: 600;
  text-decoration: underline;
}
[data-theme="nyc"] .nyc-landing .nyc-cc-for-all__link:hover {
  color: var(--nyc-landing-gold);
}

/* "Pick the program that fits" — title consistent with the hero / screener
   titles, plus matching top + bottom breathing room on its container. */
[data-theme="nyc"] .nyc-landing > .program-compare {
  padding-top: 72px;
  padding-bottom: 72px;
}
[data-theme="nyc"] .nyc-landing > .program-compare .program-compare__title {
  font-size: 2.3rem;
  font-weight: 600;
  line-height: 1.12;
}
