/* =============================================================================
   HOMEPAGE (Phase 2) — promoted to "/" on 2026-07-25, replacing the sitemap
   homepage. The old copy lives on at "/guide".

   Scoped entirely under `.frhome` (plus `body.fh-skin` for the page ground and
   the `.fr-spoilers-*` state classes on <html>), so it is inert on every other
   page in the site.

   Built from the parts the rest of the site already uses, so this reads as the
   same site as the redesigned /episode page:
     · the dark ground + 3px accent rule of the navbar and footer
     · the Massive Dynamic ink/body/muted/line palette and Futura display face
     · the five bright verse accents from the navbar mega-menu markers
   ============================================================================= */

body.fh-skin {
    background-color: #fff;
    font-family: Helvetica, Arial, "Helvetica Neue", sans-serif;
}

.frhome {
    /* Massive Dynamic palette (public/css/massive-dynamic.css) */
    --fh-ink: #2a3540;
    --fh-body: #3c4a57;
    --fh-muted: #6b7a86;
    --fh-line: #d3dfea;
    --fh-accent: #0056b7;
    --fh-accent-lit: #4d9de0;

    --fh-display: "Futura", "Century Gothic", "Twentieth Century", "Avant Garde", system-ui, sans-serif;

    color: var(--fh-ink);
}

.frhome a { text-decoration: none }


/* ================================================================= *
 |  SPOILER STATE
 |
 |  Three states, driven by a class the inline <head> script puts on
 |  <html> from localStorage.fringeSpoilers:
 |
 |    (no class)           undecided  — full curtain, safe copy
 |    .fr-spoilers-shown   finished   — everything visible
 |    .fr-spoilers-hidden  mid-watch  — compact notice, safe copy
 |
 |  The SAFE state is the default in plain CSS, so JS-off, cold loads
 |  and the moment before hydration all protect a first-time viewer.
 |  Nothing here hides content the server didn't also intend to hide —
 |  it's spoiler courtesy, not access control.
 * ================================================================= */

/* Safe-vs-spoiler copy pairs (the grid legend, the feature tiles).
   All four carry the extra `.frhome` so they out-specify the component's own
   `display` — `.frhome-features { display: grid }` is declared further down this
   file and would otherwise win the tie on source order and leak the spoiler set. */
.frhome .frhome-spoiler-only { display: none }
.fr-spoilers-shown .frhome .frhome-spoiler-only { display: block }
.fr-spoilers-shown .frhome .frhome-features.frhome-spoiler-only { display: grid }
.fr-spoilers-shown .frhome .frhome-safe { display: none }

.frhome-cards-wrap { position: relative }

/* SAFE DEFAULT — the whole strip ships blurred, so an undecided reader, a JS-off
   reader, and the pre-hydration moment of every state are all protected. The
   `shown` state and the JS per-card gate only ever REMOVE blur. `filter` on the
   grid rather than a cover over it, so nothing is readable by squinting past an
   overlay, and the shape of what's hidden still shows through. */
.frhome-cards {
    filter: blur(14px) saturate(0.6);
    opacity: 0.5;
    pointer-events: none;
    user-select: none;
    transition: filter 0.25s ease, opacity 0.25s ease;
}
.fr-spoilers-shown .frhome-cards {
    filter: none;
    opacity: 1;
    pointer-events: auto;
    user-select: auto;
}

/* Declared first-time viewer (watched nothing, data-fr-watched="0"): collapse the
   strip — no point reserving three cards' worth of blurred height they've asked
   not to see — and show the compact notice instead. A MID-WATCH reader (position
   1..99) keeps the strip; see the per-card gate below. */
html[data-fr-watched="0"] .frhome-cards-wrap { min-height: 0 }
html[data-fr-watched="0"] .frhome-cards { display: none }

/* MID-WATCH per-card gate. JS tags each card against the reader's position, then
   marks the strip `.is-gated` — at which point the whole-strip blur gives way to
   PER-CARD blur: cards up to where they've watched are legible, everything past
   stays blurred and unclickable. Gated only once JS has run, so the safe default
   above still covers the pre-hydration flash. */
.frhome-cards.is-gated {
    filter: none;
    opacity: 1;
    pointer-events: auto;
    user-select: auto;
}
.frhome-cards.is-gated .frhome-card--locked {
    pointer-events: none;
    cursor: default;
    position: relative;
}
/* Blur the card's contents but NOT the lock badge (a sibling), so it stays crisp. */
.frhome-cards.is-gated .frhome-card--locked > :not(.frhome-card__lock) {
    filter: blur(14px) saturate(0.6);
    opacity: 0.55;
    user-select: none;
}

/* The crisp "locked" affordance, so a blurred card reads as withheld, not broken. */
.frhome-card__lock { display: none }
.frhome-cards.is-gated .frhome-card--locked .frhome-card__lock {
    display: flex;
    position: absolute;
    inset: 0;
    z-index: 2;
    align-items: center;
    justify-content: center;
    color: var(--fh-ink);
    font-size: 1.4rem;
    opacity: 0.7;
    pointer-events: none;
}

/* Shuffle makes sense once ANY card is legible — the shown state, and mid-watch
   (but not the first-timer, who has none). "Hide spoilers" only once everything
   is showing. */
.frhome-shuffle, .frhome-recover { display: none }
.fr-spoilers-shown .frhome-shuffle { display: inline-block }
html.fr-spoilers-hidden:not([data-fr-watched="0"]) .frhome-shuffle { display: inline-block }
.fr-spoilers-shown .frhome-recover { display: inline-block }
.frhome-discover-tools { display: flex; gap: 0.6rem; align-items: center; flex-wrap: wrap }

/* Mid-watch footnote (position 1..99): explains the blurred cards and offers the
   settings gear. Not a spoiler, so a pre-JS flash is harmless — pure CSS. */
.frhome-cards-note { display: none }
html.fr-spoilers-hidden:not([data-fr-watched="0"]) .frhome-cards-note {
    display: block;
    margin: 1.1rem 0 0;
    font-size: 0.9rem;
    line-height: 1.55;
    color: var(--fh-muted);
}
.frhome-cards-note__link {
    border: 0;
    background: none;
    padding: 0;
    font: inherit;
    color: var(--fh-accent);
    text-decoration: underline;
    cursor: pointer;
}

/* --- the curtain ---------------------------------------------------------- */
.frhome-curtain {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 2rem 1.5rem;
    border: 1px solid var(--fh-line);
    border-radius: 4px;
    background: rgba(255, 255, 255, 0.72);
    -webkit-backdrop-filter: blur(2px);
            backdrop-filter: blur(2px);
}
.fr-spoilers-shown .frhome-curtain { display: none }

/* The full curtain is off in every hidden state; the compact variant replaces it
   ONLY for the declared first-timer (watched nothing). A mid-watch reader gets the
   per-card strip + footnote instead, not this notice. */
.frhome-curtain--compact { display: none }
.fr-spoilers-hidden .frhome-curtain { display: none }
html[data-fr-watched="0"] .frhome-curtain--compact {
    display: flex;
    position: static;
    padding: 1.15rem 1.25rem;
    background: #f6f9fc;
    -webkit-backdrop-filter: none;
            backdrop-filter: none;
}

.frhome-curtain__eyebrow {
    font-family: var(--fh-display);
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.2em;
    color: var(--fh-muted);
    margin: 0 0 0.9rem;
}
.frhome-curtain__eyebrow i { margin-right: 0.4rem }
.frhome-curtain__lead {
    max-width: 34rem;
    margin: 0 0 0.5rem;
    font-size: 1rem;
    line-height: 1.6;
    color: var(--fh-body);
}
.frhome-curtain__warn {
    margin: 0 0 1.4rem;
    font-family: var(--fh-display);
    font-size: 0.95rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    color: var(--fh-ink);
}
.frhome-curtain__actions { display: flex; gap: 0.7rem; flex-wrap: wrap; justify-content: center }
.frhome-curtain__btn {
    font-family: var(--fh-display);
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    padding: 0.7rem 1.2rem;
    border-radius: 3px;
    border: 1px solid var(--fh-line);
    background: #fff;
    color: var(--fh-body);
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
}
.frhome-curtain__btn:hover { border-color: var(--fh-muted) }
.frhome-curtain__btn--go {
    border-color: var(--fh-accent);
    background: var(--fh-accent);
    color: #fff;
}
.frhome-curtain__btn--go:hover { background: #00448f; border-color: #00448f }

.frhome-curtain__link {
    border: 0;
    background: none;
    padding: 0;
    font: inherit;
    color: var(--fh-accent);
    text-decoration: underline;
    cursor: pointer;
}

.frhome-recover {
    font-family: var(--fh-display);
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.14em;
    color: var(--fh-muted);
    background: transparent;
    border: 1px solid var(--fh-line);
    border-radius: 3px;
    padding: 0.6rem 0.9rem;
    cursor: pointer;
    transition: color 0.15s ease, border-color 0.15s ease;
}
.frhome-recover:hover { color: var(--fh-ink); border-color: var(--fh-muted) }
.frhome-recover i { margin-right: 0.35rem }

@media (prefers-reduced-motion: reduce) {
    .frhome-cards { transition: none }
}


/* ================================================================= *
 |  HERO
 * ================================================================= */
.frhome-hero {
    position: relative;
    isolation: isolate;
    margin-top: 57px;                       /* navbar is .fixed-top; body has no offset */
    padding: 4.5rem 0 0;
    overflow: hidden;
    background: radial-gradient(120% 130% at 15% 0%, #1d2836 0%, #12161d 55%, #0d1014 100%);
    color: #e8edf3;
}

/* --- the arc diagram ------------------------------------------------------
   Sits behind the copy, anchored to the hero's bottom edge, scaled uniformly
   (height:auto) so the 100 nodes stay circles. Masked out at the top so the
   tall cross-season arcs dissolve rather than colliding with the headline. */
.frhome-hero__arc {
    position: absolute;
    inset: auto 0 0 0;
    z-index: -1;
    line-height: 0;
    opacity: 0.85;
    -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 45%, #000 100%);
            mask-image: linear-gradient(180deg, transparent 0%, #000 45%, #000 100%);
}
.frhome-hero__arc svg { width: 100%; height: auto; display: block }

.frhome-arc {
    fill: none;
    stroke: rgba(120, 176, 232, 0.22);
    stroke-width: 1;
    vector-effect: non-scaling-stroke;
}
/* A connection that reaches most of the way across the run is the site's
   entire argument — those get drawn brighter. */
.frhome-arc.is-far { stroke: rgba(150, 205, 255, 0.42) }

.frhome-arc-baseline { stroke: rgba(160, 190, 220, 0.28); stroke-width: 1; vector-effect: non-scaling-stroke }
.frhome-arc-tick     { stroke: rgba(190, 215, 240, 0.5);  stroke-width: 1; vector-effect: non-scaling-stroke }
.frhome-arc-node     { opacity: 0.9 }

/* Bottom padding has to clear the arc's node line, which sits just above the
   hero's bottom edge (baseline 244 of the 260-unit viewBox). */
.frhome-hero__body { position: relative; padding-bottom: 4.25rem }

.frhome-kicker {
    font-family: var(--fh-display);
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.3em;
    color: var(--fh-accent-lit);
    margin: 0 0 0.9rem;
}
.frhome-kicker a { color: inherit }
.frhome-kicker a:hover { color: #fff }

.frhome-title {
    font-family: "Montserrat", var(--fh-display);
    font-weight: 700;
    font-size: clamp(2.4rem, 5.6vw, 4.25rem);
    line-height: 1.03;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    margin: 0 0 1.1rem;
}
/* fringeshadownav is a light-on-light letterpress; it needs an explicit fill to
   survive on a dark ground (same fix as the navbar brand and the footer wordmark). */
.frhome .fringeshadownav { color: #ece8df; -webkit-text-fill-color: #ece8df }

.frhome-lead {
    max-width: 46rem;
    font-size: clamp(1.02rem, 1.35vw, 1.2rem);
    line-height: 1.6;
    color: rgba(232, 237, 243, 0.78);
    margin: 0 0 2.2rem;
}
.frhome-lead--sm { font-size: 1rem; margin-top: -1.2rem }
.frhome-lead a { color: var(--fh-accent-lit); border-bottom: 1px solid rgba(77, 157, 224, 0.4) }
.frhome-lead a:hover { color: #fff; border-bottom-color: #fff }

/* --- the two doors -------------------------------------------------------
   The one decision a visitor actually has to make on arrival: are you about to
   be spoiled or not. Everything else on the page is browsing. */
.frhome-doors {
    display: grid;
    /* Capped at 360 (was 380) so THREE doors fit the ~1130px container at 1280px
       (3 x 360 + 2 x 16 gap = 1112). auto-fit collapses the empty track when the
       middle door is JS-gated off, so the no-JS two-door fallback stays clean. */
    grid-template-columns: repeat(auto-fit, minmax(270px, 360px));
    gap: 1rem;
    margin-bottom: 2rem;
}
/* The doors stay translucent so the arc diagram runs behind them, but the wash is
   DARK, not light: the arcs are pale strokes on a dark ground and the label text is
   white, so lightening the panel (the obvious "more opaque") closes the contrast gap
   instead of opening it. A dark scrim dims the arcs and pushes white text further
   away from them at the same time. The blur is doing as much work as the alpha —
   it softens the 1px stroke edges exactly where they cut through letterforms, while
   the arcs still read as arcs. */
.frhome-doors {
    /* ONE DIAL for how much the doors dim the arcs behind them. Raise it if the
       labels still fight the diagram, lower it to let more of the arcs through.
       At 0.44 the worst-case text contrast (the note line, under a bright
       cross-season arc) is 4.97:1 — just over AA — and the arcs keep about 40% of
       the contrast they have in the open. Below ~0.40 the note line drops under AA. */
    --fh-door-scrim: 0.44;
}
.frhome-door {
    display: block;
    padding: 1.15rem 1.35rem 1.25rem;
    border: 1px solid rgba(255, 255, 255, 0.16);
    border-radius: 4px;
    background: rgba(9, 13, 18, var(--fh-door-scrim));
    -webkit-backdrop-filter: blur(1.5px);
            backdrop-filter: blur(1.5px);
    transition: border-color 0.16s ease, background 0.16s ease, transform 0.16s ease;
}
.frhome-door:hover {
    border-color: rgba(var(--frnav-accent, 115, 159, 199), 0.85);
    background: rgba(16, 26, 40, calc(var(--fh-door-scrim) + 0.06));
    transform: translateY(-2px);
}
.frhome-door--primary {
    border-color: rgba(77, 157, 224, 0.55);
    /* Same scrim depth, tinted toward the accent so it still reads as the primary. */
    background: rgba(14, 34, 58, calc(var(--fh-door-scrim) + 0.04));
}
.frhome-door--primary:hover { background: rgba(18, 44, 74, calc(var(--fh-door-scrim) + 0.1)) }

/* Without backdrop-filter the strokes stay crisp under the panel, so the scrim has
   to carry the whole job on its own. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    .frhome-doors { --fh-door-scrim: 0.58 }
}
.frhome-door__eyebrow {
    display: block;
    font-family: var(--fh-display);
    font-size: 0.68rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.22em;
    /* Lighter than --fh-accent-lit (#4d9de0), which is a mid blue sitting on a dark
       panel that a pale-blue arc can pass straight through — at 0.68rem that fell
       under AA. Same hue, enough lift to clear it in the worst case. */
    color: #a3cbf0;
    margin-bottom: 0.4rem;
}
.frhome-door__label {
    display: block;
    font-family: "Montserrat", var(--fh-display);
    font-weight: 700;
    font-size: 1.16rem;
    color: #fff;
    margin-bottom: 0.35rem;
}
.frhome-door__label i { font-size: 0.85em; margin-left: 0.3rem; transition: transform 0.16s ease }
.frhome-door:hover .frhome-door__label i { transform: translateX(3px) }

/* The middle door is a <button> (it opens the picker, it doesn't navigate), so
   reset the UA button chrome the two <a> doors never had. .frhome-door already
   supplies its own display/border/background/padding, which win over the UA
   defaults; these are the bits it doesn't set. */
button.frhome-door {
    width: 100%;
    margin: 0;
    text-align: left;
    font: inherit;
    cursor: pointer;
    -webkit-appearance: none;
            appearance: none;
}
/* The gear turns rather than slides — a sliding cog reads wrong, and the arrow
   slide belongs to the two navigating doors. */
.frhome-door--set:hover .frhome-door__label i { transform: rotate(40deg) }

/* Gated on fr-js: without JS there is no picker to open (the navbar gear hides
   for the same reason), so no-JS readers get the two working end doors and the
   grid falls back to two columns. The class lands on <html> via the synchronous
   head script before first paint, so this never flashes. */
.frhome-door--set { display: none }
.fr-js .frhome-door--set { display: block }
/* The faintest text on the page and the first thing the arcs ate — nudged up now
   that the scrim gives it somewhere darker to sit. */
.frhome-door__note {
    display: block;
    font-size: 0.86rem;
    line-height: 1.45;
    color: rgba(232, 237, 243, 0.72);
}

/* Legend for the arc field, so the backdrop reads as data rather than decoration. */
.frhome-arc-legend {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    font-size: 0.8rem;
    color: rgba(232, 237, 243, 0.52);
    margin: 0;
}
.frhome-arc-legend__key {
    display: inline-block;
    width: 34px;
    height: 10px;
    border-top: 1px solid rgba(150, 205, 255, 0.75);
    border-radius: 50% 50% 0 0 / 100% 100% 0 0;
    flex: none;
}

/* --- stats strip ----------------------------------------------------------
   A sibling of the hero, not a child: the arc diagram is anchored to the hero's
   bottom edge, so a strip inside it would cover the node line. */
.frhome-stats {
    position: relative;
    border-top: 1px solid rgba(255, 255, 255, 0.09);
    background: #0b0e12;
    color: #e8edf3;
}
.frhome-stats ul {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 3rem;
    list-style: none;
    margin: 0;
    padding: 1rem 0;
}
.frhome-stats strong {
    font-family: "Montserrat", var(--fh-display);
    font-size: 1.3rem;
    color: #fff;
    margin-right: 0.4rem;
}
.frhome-stats span {
    font-family: var(--fh-display);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.19em;
    color: rgba(232, 237, 243, 0.5);
}


/* ================================================================= *
 |  SECTIONS
 * ================================================================= */
.frhome-section { padding: 4rem 0 }
.frhome-section--alt {
    background: linear-gradient(180deg, #f4f8fc 0%, #eef4fa 100%);
    border-block: 1px solid var(--fh-line);
}

.frhome-section__head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1.5rem;
    flex-wrap: wrap;
    margin-bottom: 2rem;
}

/* Deliberately IDENTICAL to the episode page's section headings
   (`.md-skin .subsection-header h2` in massive-dynamic.css): Futura 1.4rem / 400,
   uppercase, 0.1em tracking, ink #2a3540, with the 6px accent dot at a 0.85rem gap.
   Measured off /episode/101/pilot rather than copied by eye — 22.4px, weight 400,
   2.24px tracking, 13.6px gap. Do not reintroduce a size clamp here: the episode
   headings are a fixed size at every width, and a homepage that grew its headings
   on wide screens is exactly the inconsistency this replaced. */
.frhome-h2 {
    font-family: var(--fh-display);
    font-weight: 400;
    font-size: 1.4rem;
    line-height: 1.2;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--fh-ink);
    margin: 0;
    display: flex;
    align-items: center;
    gap: 0.85rem;
}
.frhome-h2::before {
    content: "";
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--fh-accent);
    flex: none;
}
/* Indent to the heading's text, not its dot: dot width + the flex gap. */
.frhome-sub {
    margin: 0.45rem 0 0 calc(6px + 0.85rem);
    color: var(--fh-muted);
    font-size: 0.94rem;
}


/* ================================================================= *
 |  DISCOVERY CARDS
 * ================================================================= */
.frhome-shuffle {
    font-family: var(--fh-display);
    font-size: 0.76rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.16em;
    color: var(--fh-accent);
    background: transparent;
    border: 1px solid rgba(0, 86, 183, 0.35);
    border-radius: 3px;
    padding: 0.6rem 1.05rem;
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.frhome-shuffle:hover { background: var(--fh-accent); border-color: var(--fh-accent); color: #fff }
.frhome-shuffle i { margin-right: 0.4rem }

.frhome-cards {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1.5rem;
}

.frhome-card {
    display: flex;
    flex-direction: column;
    background: #fff;
    border: 1px solid var(--fh-line);
    border-radius: 4px;
    overflow: hidden;
    color: var(--fh-body);
    transition: box-shadow 0.18s ease, transform 0.18s ease, border-color 0.18s ease;
}
.frhome-card:hover {
    transform: translateY(-3px);
    border-color: rgba(0, 86, 183, 0.4);
    box-shadow: 0 10px 30px rgba(28, 48, 74, 0.14);
    color: var(--fh-body);
}
.frhome-card[hidden] { display: none }

/* "Show me another" swaps which three of the pool are shown; a short fade keeps
   the replacement from reading as a layout glitch. */
.frhome-cards.is-swapped .frhome-card { animation: frhome-fade 0.28s ease }
@keyframes frhome-fade { from { opacity: 0; transform: translateY(6px) } to { opacity: 1; transform: none } }
@media (prefers-reduced-motion: reduce) {
    .frhome-cards.is-swapped .frhome-card { animation: none }
}

.frhome-card__media { position: relative; aspect-ratio: 16 / 9; background: #dde7f1; overflow: hidden }
.frhome-card__media img { width: 100%; height: 100%; object-fit: cover; display: block }

.frhome-card__kind {
    position: absolute;
    left: 0; bottom: 0;
    font-family: var(--fh-display);
    font-size: 0.65rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.17em;
    color: #fff;
    background: rgba(13, 16, 20, 0.86);
    padding: 0.36rem 0.7rem;
    border-top: 2px solid var(--fh-accent-lit);
}
.frhome-card__kind--connection { border-top-color: #4d9de0 }
.frhome-card__kind--glyph      { border-top-color: #f1c232 }
.frhome-card__kind--item       { border-top-color: #2ca6bf }

.frhome-card__body { padding: 1rem 1.1rem 0.4rem; flex: 1 }
.frhome-card__text { margin: 0; font-size: 0.93rem; line-height: 1.55 }
.frhome-card__text a { color: var(--fh-accent); text-decoration: underline }

.frhome-card__foot {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.7rem 1.1rem 0.95rem;
    border-top: 1px solid #eef3f8;
    margin-top: 0.6rem;
}
.frhome-card__where {
    font-family: var(--fh-display);
    font-size: 0.74rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--fh-accent);
}
.frhome-card__where i { margin: 0 0.42rem; font-size: 0.72em; color: var(--fh-muted) }
.frhome-card__ts { font-size: 0.74rem; color: var(--fh-muted); white-space: nowrap; flex: none }


/* ================================================================= *
 |  EPISODE GRID
 * ================================================================= */
.frhome-readout {
    margin: 0;
    min-height: 1.4rem;
    font-family: var(--fh-display);
    font-size: 0.85rem;
    letter-spacing: 0.05em;
    color: var(--fh-accent);
}

.frhome-grid { display: flex; flex-direction: column; gap: 0.85rem }

.frhome-season { display: grid; grid-template-columns: 6.5rem minmax(0, 1fr); align-items: center; gap: 1rem }
.frhome-season__label {
    margin: 0;
    font-family: var(--fh-display);
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.18em;
    color: var(--fh-muted);
    text-align: right;
}
.frhome-season__tiles { display: flex; flex-wrap: wrap; gap: 0.35rem }

.frhome-tile {
    --tile-accent: #4d9de0;
    display: grid;
    place-items: center;
    width: 2.3rem;
    height: 2.3rem;
    border-radius: 3px;
    border: 1px solid color-mix(in srgb, var(--tile-accent) 40%, #ffffff);
    background: color-mix(in srgb, var(--tile-accent) 12%, #ffffff);
    color: var(--fh-body);
    font-family: var(--fh-display);
    font-size: 0.85rem;
    font-weight: 600;
    transition: background 0.13s ease, color 0.13s ease, transform 0.13s ease;
}
.frhome-tile:hover,
.frhome-tile:focus-visible {
    background: var(--tile-accent);
    border-color: var(--tile-accent);
    color: #fff;
    transform: translateY(-2px);
}


/* ================================================================= *
 |  FEATURE TILES
 * ================================================================= */
.frhome-features {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1.25rem;
}
.frhome-feature {
    display: block;
    padding: 1.4rem 1.4rem 1.5rem;
    border: 1px solid var(--fh-line);
    border-left: 3px solid var(--fh-accent);
    border-radius: 3px;
    background: #fff;
    transition: box-shadow 0.18s ease, transform 0.18s ease;
}
.frhome-feature:hover { transform: translateY(-3px); box-shadow: 0 10px 26px rgba(28, 48, 74, 0.12) }
.frhome-feature__icon { display: block; font-size: 1.35rem; color: var(--fh-accent); margin-bottom: 0.75rem }
.frhome-feature__name {
    display: block;
    font-family: var(--fh-display);
    font-size: 1.1rem;
    font-weight: 600;
    color: var(--fh-ink);
    margin-bottom: 0.4rem;
}
.frhome-feature__blurb { display: block; font-size: 0.9rem; line-height: 1.55; color: var(--fh-muted) }


/* ================================================================= *
 |  GUIDE BAND  +  GUIDE PAGE
 * ================================================================= */
.frhome-guide { background: #10141a; color: #e8edf3; padding: 2.6rem 0 }
.frhome-guide > .container {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1.5rem;
    flex-wrap: wrap;
}
.frhome-guide h2 {
    font-family: var(--fh-display);
    font-size: 1.3rem;
    font-weight: 600;
    margin: 0 0 0.35rem;
}
.frhome-guide p { margin: 0; font-size: 0.92rem; color: rgba(232, 237, 243, 0.62) }
.frhome-guide__cta {
    font-family: var(--fh-display);
    font-size: 0.8rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.16em;
    color: #fff;
    border: 1px solid rgba(255, 255, 255, 0.3);
    border-radius: 3px;
    padding: 0.72rem 1.2rem;
    white-space: nowrap;
    transition: background 0.15s ease, border-color 0.15s ease;
}
.frhome-guide__cta:hover { background: rgba(255, 255, 255, 0.1); border-color: #fff; color: #fff }
.frhome-guide__cta i { margin-left: 0.4rem }

.frhome-guidehead {
    margin-top: 57px;
    padding: 3.5rem 0 3rem;
    background: radial-gradient(120% 130% at 15% 0%, #1d2836 0%, #12161d 55%, #0d1014 100%);
    color: #e8edf3;
}

/* Deliberately sets NO max-width: `.frhome-prose` rides on a Bootstrap
   `.container`, so the container's own breakpoint widths govern and the guide
   lines up with the homepage's sections exactly (owner, 2026-07-25). It used to
   cap at 56rem for a shorter reading measure, which just made /guide look like a
   different, narrower site. `max-width: none` would be WRONG here — this sheet
   loads after Bootstrap at equal specificity, so it would cancel `.container`
   itself and run the text full-bleed to the viewport edge. */
.frhome-prose > p { color: var(--fh-body); line-height: 1.7 }
.frhome-prose .frhome-h2 { margin-bottom: 1.2rem }
/* Body copy is inset from its heading, matching /episode (owner, 2026-07-25).
   Every episode section is `.container > .px-4 > .col-lg`, so its prose starts
   1.5rem inside the container while the heading sits at the container edge.
   Reproducing that 1.5rem here lands the guide's copy on exactly the same x as
   an episode page's (98px in at a 1280 viewport, symmetric on the right). The
   heading is excluded so it keeps holding the outer line. */
.frhome-prose > :not(.frhome-h2) {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
}
/* ...except the spoiler note, which draws its own box: padding would inflate the
   yellow box and leave its left edge behind at the container line. It takes the
   same inset as margin, and keeps its own padding. */
.frhome-prose > .frhome-spoiler {
    padding: 0.5rem 0.8rem;
    margin-left: 1.5rem;
    margin-right: 1.5rem;
}
.frhome-deflist { list-style: none; padding: 0; margin: 1.4rem 0 0 }
.frhome-deflist li {
    padding: 0.85rem 0 0.85rem 1.1rem;
    border-left: 2px solid var(--fh-line);
    color: var(--fh-body);
    line-height: 1.65;
}
.frhome-deflist li:hover { border-left-color: var(--fh-accent) }
.frhome-deflist b { color: var(--fh-ink) }
.frhome-deflist a { color: var(--fh-accent); text-decoration: underline }
.frhome-prose__cta { margin-top: 1.8rem }
.frhome-prose__cta a { color: var(--fh-accent); font-weight: 700 }
.frhome-spoiler {
    display: inline-block;
    font-size: 0.85rem;
    color: #8a5a00;
    background: #fdf3d9;
    border: 1px solid #f0dca6;
    border-radius: 3px;
    padding: 0.5rem 0.8rem;
    margin-bottom: 1.2rem;
}
.frhome-spoiler i { margin-right: 0.4rem }


/* ================================================================= *
 |  RESPONSIVE
 * ================================================================= */
@media (max-width: 991.98px) {
    .frhome-cards   { grid-template-columns: repeat(2, minmax(0, 1fr)) }
    .frhome-features { grid-template-columns: repeat(2, minmax(0, 1fr)) }
    .frhome-hero__arc { opacity: 0.6 }
    /* Three doors need the width to sit side by side; below the desktop container
       they stack to one column rather than the awkward 2 + 1 wrap. */
    .frhome-doors { grid-template-columns: minmax(0, 1fr) }
}

@media (max-width: 767.98px) {
    .frhome-hero { padding-top: 3rem }
    .frhome-hero__body { padding-bottom: 2.5rem }
    .frhome-cards    { grid-template-columns: minmax(0, 1fr) }
    .frhome-features { grid-template-columns: minmax(0, 1fr) }
    .frhome-section  { padding: 2.75rem 0 }
    .frhome-section__head { margin-bottom: 1.5rem }
    .frhome-stats ul { gap: 0.4rem 1.6rem }

    /* Season label moves above its row so the tiles get the full width. */
    .frhome-season { grid-template-columns: minmax(0, 1fr); gap: 0.35rem }
    .frhome-season__label { text-align: left }
    .frhome-grid { gap: 1.25rem }
    .frhome-tile { width: 2.15rem; height: 2.15rem; font-size: 0.8rem }

    .frhome-guide > .container { flex-direction: column; align-items: flex-start }
}

@media (prefers-reduced-motion: reduce) {
    .frhome-door, .frhome-card, .frhome-tile, .frhome-feature,
    .frhome-door__label i { transition: none }
    .frhome-door:hover, .frhome-card:hover, .frhome-tile:hover, .frhome-feature:hover { transform: none }
}
