/* -----------------------------------------------------------------------------
    Stylesheet bundle

    Keep imports ordered from low-level foundations to higher-level components.
    Later files may rely on tokens, reset rules, typography roles, and layout
    primitives defined earlier in the bundle.
----------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
    Design tokens — Modern Athletic Grit

    Professional sports branding with raw, earned authenticity: one dark world,
    one electric orange signal, condensed italic display type over a clean
    system sans. Color ratio: 70% dark foundation, 20% white/near-white,
    10% accent. Restraint is the point — when the accent is everywhere it is
    noise; used selectively it is a signal.
----------------------------------------------------------------------------- */

:root {
    /* One scheme only. NY Dynamo has a single, dark color scheme. There is no
       light mode and no theme toggle — the dark world is the brand. Do not add
       prefers-color-scheme variants or light-surface alternatives. */
    color-scheme: dark;

    /* =========================================================================
       COLOR — a three-tier token system: reference -> semantic -> component.

       References flow ONE direction only:
           component  ->  semantic  ->  reference (palette)
       A component RULE never names a raw --palette-* token or a literal color;
       it reads a semantic --color-* token (or a component token built from
       one). Only the blocks below resolve the palette into roles. The Colors
       section of the style guide documents the full contract.
       ========================================================================= */

    /* --- Tier 1 · Reference palette ----------------------------------------
       Raw, theme-agnostic values. The ONLY place literal colors may live. */

    /* Brand accent — electric orange. The only high-chroma color in the
       system. Appears sparingly but decisively: CTAs, eyebrows, rules, active
       states, and key data. */
    --palette-orange: hsl(20 85% 52%);
    --palette-orange-deep: hsl(20 85% 38%);
    --palette-orange-glow: hsl(20 85% 65%);
    /* Soft orange bloom used by the primary button's hover shadow. */
    --palette-orange-a30: hsl(20 77% 51% / 0.3);

    /* Neutral ramp — the dark world, stepping from the deepest well up to
       hover states, plus the near-black ink used ON orange surfaces. */
    --palette-black: #0a0a0a;
    --palette-well: #060606;
    --palette-foundation: #0c0c0c;
    --palette-surface: #141414;
    --palette-surface-raised: #1a1a1a;
    --palette-surface-card: #202020;
    --palette-surface-hover: #2a2a2a;

    /* Text ramp — a soft off-white, never pure #fff for body copy. Pure white
       is reserved for display type over photography and the one white strip. */
    --palette-white: #ffffff;
    --palette-text: #f0f0f0;
    --palette-text-muted: #888888;
    --palette-text-dim: #555555;

    /* Translucent white ramp — hairlines and interactive edges read
       consistently on any of the dark surfaces because they are white at low
       alpha, not a fixed grey. */
    --palette-white-a06: rgba(255, 255, 255, 0.06);
    --palette-white-a07: rgba(255, 255, 255, 0.07);
    --palette-white-a14: rgba(255, 255, 255, 0.14);
    --palette-white-a35: rgba(255, 255, 255, 0.35);
    --palette-white-a70: rgba(255, 255, 255, 0.7);
    --palette-white-a90: rgba(255, 255, 255, 0.9);

    /* Translucent black ramp — dark-on-orange controls, texture stripes, and
       the photographic scrim gradient stops. */
    --palette-black-a04: rgba(0, 0, 0, 0.04);
    --palette-black-a06: rgba(0, 0, 0, 0.06);
    --palette-black-a10: rgba(0, 0, 0, 0.1);
    --palette-black-a30: rgba(0, 0, 0, 0.3);
    --palette-black-a60: rgba(0, 0, 0, 0.6);
    --palette-black-a70: rgba(0, 0, 0, 0.7);
    --palette-black-a80: rgba(0, 0, 0, 0.8);

    /* Near-black veils — the sticky header's blurred ground and the carousel
       slide scrim stops. */
    --palette-veil: rgba(10, 10, 10, 0.96);
    --palette-veil-solid: rgba(10, 10, 10, 0.98);
    --palette-scrim-92: rgba(8, 8, 8, 0.92);
    --palette-scrim-80: rgba(8, 8, 8, 0.8);
    --palette-scrim-0: rgba(8, 8, 8, 0);

    /* Faint orange bloom used by the interior page banner's corner glow. */
    --palette-orange-a05: rgba(230, 100, 30, 0.05);

    /* Status — win/success and loss/error signals, kept off the brand accent
       so "something is wrong" never shares a color with a call to action. */
    --palette-green: #5dbb7a;
    --palette-red: #e05252;

    /* Warning-callout family — a deeper crimson than the status red, tinted
       into a panel treatment for urgent document notices. */
    --palette-crimson: #b91c1c;
    --palette-crimson-bright: #dc2626;
    --palette-rose: #fca5a5;
    --palette-rose-bright: #f87171;

    /* --- Tier 2 · Semantic (system) ----------------------------------------
       Role-aware tokens resolved FROM the palette. This is what component
       rules consume; a rule should never reach past this layer. */

    /* The accent trio. Primary carries actions and signals; deep is for
       hover/pressed shifts on light-on-orange contexts; glow lifts the primary
       button on hover. */
    --color-primary: var(--palette-orange);
    --color-primary-dark: var(--palette-orange-deep);
    --color-primary-glow: var(--palette-orange-glow);

    /* Surfaces — alternate foundation and surface between page sections; use
       raised and card for cards and list entries layered on top; hover is the
       interactive brightening step. The well is the deepest ground (hero
       backdrops, recessed value fields). */
    --color-foundation: var(--palette-foundation);
    --color-surface: var(--palette-surface);
    --color-surface-raised: var(--palette-surface-raised);
    --color-surface-card: var(--palette-surface-card);
    --color-surface-hover: var(--palette-surface-hover);
    --color-surface-well: var(--palette-well);
    /* The one white surface on the site: the federation logo strip. */
    --color-surface-white: var(--palette-white);

    /* Text — three steps of emphasis, plus bright display white over
       photography and near-black ink for text ON orange fills. */
    --color-text: var(--palette-text);
    --color-text-muted: var(--palette-text-muted);
    --color-text-dim: var(--palette-text-dim);
    --color-text-bright: var(--palette-white);
    --color-text-soft: var(--palette-white-a90);
    --color-text-on-primary: var(--palette-black);

    /* Borders — translucent white hairlines. Default for card edges and
       dividers; strong for emphasized edges, table header rules, and control
       borders; bright/vivid for interactive resting and hover edges. */
    --color-border: var(--palette-white-a07);
    --color-border-strong: var(--palette-white-a14);
    --color-border-bright: var(--palette-white-a35);
    --color-border-vivid: var(--palette-white-a70);

    /* Dark-on-orange edges and fills, for controls that sit on the orange
       highlight and stat bands. */
    --color-border-on-primary: var(--palette-black-a30);
    --color-border-on-primary-hover: var(--palette-black-a60);
    --color-fill-on-primary-hover: var(--palette-black-a06);
    /* White-on-dark fill for outline button hovers. */
    --color-fill-hover: var(--palette-white-a06);

    /* Status pair — wins and form success are green; losses and validation
       errors are red. Pair color with a text label or mark; color never
       carries meaning alone. */
    --color-success: var(--palette-green);
    --color-error: var(--palette-red);

    /* Focus is the orange accent everywhere — one signal for "you are here". */
    --color-focus-outline: var(--color-primary);

    /* Text selection — the accent as ground, ink on top. */
    --color-highlight: var(--palette-orange);
    --color-ink-highlight: var(--palette-black);

    /* --- Tier 3 · Component -------------------------------------------------
       Scoped tokens, resolved here so component rules stay declarative. */

    /* Fields — recessed dark fill, hairline border, square corners. */
    --field-border-width: 1px;
    --color-field-border: var(--color-border-strong);
    --color-field-border-hover: var(--color-border-bright);
    --color-field-border-error: var(--color-error);
    --color-field-bg: var(--color-surface-raised);

    /* Buttons — a 1.5px edge reads as confident without going heavy. */
    --btn-border-width: 1.5px;
    --btn-shadow-hover: 0 8px 24px var(--palette-orange-a30);

    /* Photographic scrim — keeps white text legible over any photograph while
       preserving the cinematic atmosphere. Composed here so hero rules stay
       declarative. */
    --hero-overlay-gradient: linear-gradient(
        250deg,
        var(--palette-black-a10) 0%,
        var(--palette-black-a30) 30%,
        var(--palette-black-a70) 50%,
        var(--palette-black-a80) 100%
    );
    --color-hero-ground: var(--palette-well);

    /* Sticky header veil — near-black at high alpha over a backdrop blur. */
    --color-header-veil: var(--palette-veil);
    --color-header-veil-solid: var(--palette-veil-solid);

    /* Diagonal stripe texture for the orange bands — subtle grit that keeps a
       full-orange section from feeling flat. */
    --band-stripe-overlay: repeating-linear-gradient(
        45deg,
        transparent,
        transparent 20px,
        var(--palette-black-a04) 20px,
        var(--palette-black-a04) 40px
    );

    /* The interior page banner's faint diagonal orange glow, top-right. */
    --banner-glow-overlay: linear-gradient(135deg, transparent 40%, var(--palette-orange-a05) 100%);

    /* Bottom scrim for carousel slides — text sits on this, never raw over
       the photo. */
    --carousel-scrim-gradient: linear-gradient(
        to top,
        var(--palette-scrim-92) 0%,
        var(--palette-scrim-80) 45%,
        var(--palette-scrim-0) 100%
    );

    /* Warning callout — a red-tinted panel for deadlines and urgent notices. */
    --color-callout-warning-bg: color-mix(in srgb, var(--palette-crimson) 8%, transparent);
    --color-callout-warning-border: color-mix(in srgb, var(--palette-crimson) 28%, transparent);
    --color-callout-warning-edge: var(--palette-crimson-bright);
    --color-callout-warning-text: var(--palette-rose);
    --color-callout-warning-strong: var(--palette-rose-bright);

    /* Rules and radii — thin accent rules do the visual work; corners are
       square. The 3px doc radius is the single sanctioned rounding, used by
       long-form document cards. */
    --rule-width: 1px;
    --hairline-width: 1px;
    --accent-rule-height: 3px;
    --radius-sm: 0;
    --radius-md: 0;
    --radius-doc: 3px;

    /* Spacing & layout. Containers never let content touch the screen edge on
       small viewports — --ctn-margin owns the mobile gutter. */
    --ctn-margin: 4vw;
    --space-page-gutter: var(--ctn-margin);
    --space-section-gap: clamp(2rem, 5vw, 3.5rem);
    --section-inner-max: 1100px;
    --section-pad-block: 5.5rem;
    --section-pad-block-narrow: 4rem;
    --sidebar-width: clamp(12rem, 20vw, 15rem);

    /* Reading measures. Section bodies stay scannable at 520px; forms cap at
       480px; long-form documents at 860px. --measure-prose feeds the .center
       primitive's default. */
    --measure-prose: 72ch;
    --measure-section-body: 520px;
    --measure-form: 480px;
    --measure-doc: 860px;

    /* Vertical spacing scale — fixed rem steps, consumed by the .flow
       primitive (and anywhere a gap is needed). */
    --space-3xs: 0.25rem;
    --space-2xs: 0.5rem;
    --space-xs: 0.75rem;
    --space-sm: 1rem;
    --space-md: 1.5rem;
    --space-lg: 2rem;
    --space-xl: 3rem;
    --space-2xl: 4.5rem;

    /* -------------------------------------------------------------------------
        Typography

        Two voices. Barlow Condensed (self-hosted WOFF2, 600/700/800, normal +
        italic) carries all display, headline, and UI label text — the oblique
        angle communicates speed and forward momentum. The system sans stack
        carries all prose. A mono stack exists for code, tokens, and data
        values. Never name a font family directly in a component rule.
    ------------------------------------------------------------------------- */
    --font-display: 'Barlow Condensed', 'Arial Narrow', sans-serif;
    --font-body: ui-sans-serif, system-ui, sans-serif;
    --font-mono: ui-monospace, 'SF Mono', Consolas, monospace;

    /* -------------------------------------------------------------------------
        Type scale

        Display roles are fluid by design — dramatic size contrast against the
        1rem body is the energy of the aesthetic. Each clamp() keeps a rem term
        in the preferred value so browser zoom still scales the text
        (WCAG 1.4.4); the vw term only adds viewport response on top. Body and
        label roles are fixed rem.

        Role mapping:
          --text-display-hero     hero headline (page-hero)
          --text-display-banner   interior page banner title
          --text-display-section  section headline
          --text-body             default prose (1rem)
          --text-sm               dense rows, hints, meta
          --text-btn              button labels
          --text-label            field labels, nav, small caps labels
          --text-eyebrow          eyebrow overline labels
    ------------------------------------------------------------------------- */
    --text-display-hero: clamp(3rem, calc(1.9rem + 3.7vw), 5rem);
    --text-display-banner: clamp(2.5rem, calc(1.6rem + 3.4vw), 5rem);
    --text-display-section: clamp(2rem, calc(1.55rem + 1.6vw), 3.25rem);
    --text-body: 1rem;
    --text-sm: 0.8rem;
    --text-btn: 0.78rem;
    --text-label: 0.7rem;
    --text-eyebrow: 0.68rem;

    /* Leading. Display type runs razor-tight; prose opens up. */
    --leading-display: 0.92;
    --leading-section: 0.95;
    --leading-body: 1.65;
    --leading-prose: 1.72;
    --leading-normal: 1.5;

    /* Tracking. Small condensed uppercase needs generous letter-spacing for
       legibility (0.1–0.22em); display headlines tuck in slightly. */
    --tracking-display: -0.01em;
    --tracking-label: 0.16em;
    --tracking-eyebrow: 0.22em;
    --tracking-wide: 0.14em;

    /* Weight ramp — Barlow Condensed ships at 600/700/800 only. */
    --weight-semibold: 600;
    --weight-bold: 700;
    --weight-black: 800;
}

/* -----------------------------------------------------------------------------
    Reset

    A small browser-normalization layer influenced by Josh Comeau's custom CSS
    reset: https://www.joshwcomeau.com/css/custom-css-reset/

    The reset intentionally stays low-specificity. It establishes predictable
    sizing, inheritance, native element defaults, and the dark-world document
    ground; component classes should be able to override it without selector
    games.
----------------------------------------------------------------------------- */

html {
    /* Keep rem math explicit for tokens and component dimensions. */
    font-size: 16px;
    scroll-behavior: smooth;
}

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

body {
    margin: 0;
    font-family: var(--font-body);
    font-size: var(--text-body);
    line-height: var(--leading-body);
    color: var(--color-text);
    background: var(--color-foundation);
    /* The dark ground benefits from lighter antialiasing everywhere — there is
       no light scheme to preserve subpixel rendering for. */
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

/* Media defaults: block-level, responsive, and never wider than the container. */
img,
picture,
video,
canvas,
svg {
    display: block;
    max-width: 100%;
}

/* Form controls should inherit the one-font system unless a component opts out. */
input,
button,
textarea,
select {
    font: inherit;
}

/* Text-bearing block elements should wrap long tokens instead of overflowing. */
p,
h1,
h2,
h3,
h4,
h5,
h6 {
    overflow-wrap: break-word;
    margin: 0;
}

/* Lists and block elements carry no default block margin; vertical rhythm comes
   from parent-owned gaps and component rules. Keep this at ELEMENT specificity
   so component classes can still opt into their own margins when needed. */
ul,
ol,
dl,
pre {
    margin-block: 0;
}

/* Prefer nicer prose wrapping where the browser supports it. */
p {
    text-wrap: pretty;
}

/* Headings default to the display voice. The full uppercase-italic headline
   treatment is applied by the heading-role classes (.section-headline,
   .page-banner__title, ...) so plain document headings stay usable. */
h1,
h2,
h3,
h4,
h5,
h6 {
    font-family: var(--font-display);
    font-weight: var(--weight-bold);
    line-height: 1.1;
}

button {
    cursor: pointer;
}

/* Venues and addresses render as ordinary text, not italic. */
address {
    font-style: normal;
}

/* Horizontal rule — a quiet hairline divider on the dark ground. */
hr {
    height: 0;
    margin-block: var(--space-lg);
    border: 0;
    border-top: var(--hairline-width) solid var(--color-border-strong);
}

/* Links carry the one accent color with a quiet underline that strengthens on
   hover. Components that render links as buttons, tabs, or cards override
   this deliberately. */
a {
    color: var(--color-primary);
    text-decoration-line: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.15em;
}

a:hover {
    color: var(--color-primary-glow);
}

a:focus-visible {
    outline: 2px solid var(--color-focus-outline);
    outline-offset: 2px;
}

::selection {
    background: var(--color-highlight);
    color: var(--color-ink-highlight);
}

/* -----------------------------------------------------------------------------
    Typography — two voices

    Barlow Condensed (self-hosted WOFF2, weights 600/700/800 in normal and
    italic) handles all display, headline, and UI label text. The system body
    stack handles all prose. Hierarchy comes from dramatic size contrast
    between the two voices, not from decoration. Display type is always
    uppercase; headlines are always italic — in this system italics are not
    emphasis, they are the default state of the headline voice.

    Reference the faces through --font-display and --font-body only; never name
    a font family directly in a component rule.
----------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
    Self-hosted fonts

    font-display: fallback keeps first paint fast: text renders in the fallback
    face and only swaps if the WOFF2 arrives quickly. The unicode-range subset
    matches the Latin subset the files were built with.
----------------------------------------------------------------------------- */

@font-face {
    font-family: 'Barlow Condensed';
    font-style: normal;
    font-weight: 600;
    font-display: fallback;
    src: url('/fonts/barlow-condensed-600.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Barlow Condensed';
    font-style: normal;
    font-weight: 700;
    font-display: fallback;
    src: url('/fonts/barlow-condensed-700.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Barlow Condensed';
    font-style: normal;
    font-weight: 800;
    font-display: fallback;
    src: url('/fonts/barlow-condensed-800.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Barlow Condensed';
    font-style: italic;
    font-weight: 600;
    font-display: fallback;
    src: url('/fonts/barlow-condensed-600-italic.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Barlow Condensed';
    font-style: italic;
    font-weight: 700;
    font-display: fallback;
    src: url('/fonts/barlow-condensed-700-italic.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Barlow Condensed';
    font-style: italic;
    font-weight: 800;
    font-display: fallback;
    src: url('/fonts/barlow-condensed-800-italic.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* -----------------------------------------------------------------------------
    Eyebrow — shared overline label

    The condensed, tracked, orange overline that opens the three-part section
    heading sequence (eyebrow + headline + rule). The ::before dash is the
    accent bar; flex keeps it vertically centered against the text.

    Modifiers:
      .eyebrow          inline label before a headline (the default)
      .eyebrow--hero    slightly larger, wider accent bar (page heroes)
      .eyebrow--banner  tighter bottom margin (interior page banners)
      .eyebrow--block   full-width flex, for centered or stacked layouts
----------------------------------------------------------------------------- */

.eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
    font-family: var(--font-display);
    font-size: var(--text-eyebrow);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-eyebrow);
    text-transform: uppercase;
    color: var(--color-primary);
    margin-bottom: 1rem;
}

.eyebrow::before {
    content: '';
    display: inline-block;
    width: 20px;
    height: 2px;
    background-color: var(--color-primary);
    flex-shrink: 0;
}

.eyebrow--hero {
    font-size: var(--text-label);
    gap: 0.75rem;
    margin-bottom: 1.25rem;
}

.eyebrow--hero::before {
    width: 28px;
}

.eyebrow--banner {
    margin-bottom: 0.75rem;
}

/* Uses flex (not block) to preserve ::before vertical alignment. */
.eyebrow--block {
    display: flex;
    margin-bottom: 1.5rem;
}

/* -----------------------------------------------------------------------------
    Section headline — the italic display voice

    The <em> inside a headline renders in the primary orange. Use it to
    highlight the most important word or phrase — limit to one per headline.
    Choose the heading level (h1–h4) for document structure; this class
    carries the visual style.
----------------------------------------------------------------------------- */

.section-headline {
    font-family: var(--font-display);
    font-size: var(--text-display-section);
    font-style: italic;
    font-weight: var(--weight-black);
    line-height: var(--leading-section);
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 1.5rem;
}

.section-headline em {
    color: var(--color-primary);
    font-style: italic;
}

/* The orange rule — a visual pause between the headline and body copy. */
.section-rule {
    width: 48px;
    height: var(--accent-rule-height);
    background-color: var(--color-primary);
    margin-bottom: 1.75rem;
}

/* Lead paragraphs in content sections: muted, generous leading, constrained
   measure so line lengths stay readable. Add --full to span the column. */
.section-body {
    color: var(--color-text-soft);
    font-size: var(--text-body);
    line-height: var(--leading-prose);
    margin-bottom: 1.75rem;
    max-width: var(--measure-section-body);
}

.section-body--full {
    max-width: none;
}

/* -----------------------------------------------------------------------------
    Code and keyboard tokens

    Inline code sits on a raised dark ground in the mono face so tokens and
    file paths read as distinct values inside prose.
----------------------------------------------------------------------------- */

code {
    font-family: var(--font-mono);
    font-size: 0.85em;
    padding: 0.1em 0.35em;
    border-radius: var(--radius-sm);
    background: var(--color-surface-raised);
    color: var(--color-text);
}

kbd {
    font-family: var(--font-mono);
    font-size: 0.85em;
    padding: 0.1em 0.4em;
    border: var(--hairline-width) solid var(--color-border-strong);
    border-radius: var(--radius-sm);
    background: var(--color-surface-raised);
}

/* -----------------------------------------------------------------------------
    Layout

    Two layers live here:

    1. The Modern Athletic Grit page-layout system — constrained containers,
       the generic page-content wrapper, and the alternating content-section
       blocks that structure every public page. Full-bleed sections with
       constrained inner columns; content never touches the screen edge on
       small viewports (--ctn-margin owns the mobile gutter).

    2. A small family of composable, single-purpose layout primitives in the
       Every Layout tradition (.flow, .cluster, .grid-auto, .switcher,
       .with-sidebar, .center), used by the admin shell and available for
       shell-level composition. Component families ship their own purpose-built
       grids (see components.css); reach for those on public pages.
----------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
    Containers — constrained widths with mobile edge margins

    Mobile-first: each container holds --ctn-margin side margins until the
    viewport is wide enough for its max-width, then hands off to auto
    centering. The --full variants go edge-to-edge below their handoff width.
----------------------------------------------------------------------------- */

.ctn-full {
    margin-left: 0;
    margin-right: 0;
}

.ctn-xl {
    max-width: calc(80rem - (var(--ctn-margin) * 2));
    margin-left: var(--ctn-margin);
    margin-right: var(--ctn-margin);
}

.ctn-xl--full {
    margin-left: 0;
    margin-right: 0;
}

.ctn-lg {
    max-width: calc(64rem - (var(--ctn-margin) * 2));
    margin-left: var(--ctn-margin);
    margin-right: var(--ctn-margin);
}

.ctn-lg--full {
    margin-left: 0;
    margin-right: 0;
}

.ctn-md {
    max-width: calc(52rem - (var(--ctn-margin) * 2));
    margin-left: var(--ctn-margin);
    margin-right: var(--ctn-margin);
}

.ctn-md--full {
    margin-left: 0;
    margin-right: 0;
}

.ctn-sm {
    max-width: calc(48rem - (var(--ctn-margin) * 2));
    margin-left: var(--ctn-margin);
    margin-right: var(--ctn-margin);
}

/* Progressively center each container once the viewport is wide enough that
   the margin approach hands off to auto. */
@media screen and (min-width: 48rem) {
    .ctn-sm {
        margin-left: auto;
        margin-right: auto;
    }

    .ctn-md--full {
        margin-left: auto;
        margin-right: auto;
    }
}

@media screen and (min-width: 52rem) {
    .ctn-md {
        margin-left: auto;
        margin-right: auto;
    }

    .ctn-lg--full {
        margin-left: auto;
        margin-right: auto;
    }
}

@media screen and (min-width: 64rem) {
    .ctn-lg {
        margin-left: auto;
        margin-right: auto;
    }

    .ctn-xl--full {
        margin-left: auto;
        margin-right: auto;
    }
}

@media screen and (min-width: 80rem) {
    .ctn-xl {
        margin-left: auto;
        margin-right: auto;
    }
}

/* -----------------------------------------------------------------------------
    Page content — generic constrained page body

    Modifiers:
      .page-content--narrow  900px cap for narrower data pages
      .page-content--padded  top/bottom padding when no section wraps it
      .page-content--doc     860px cap + document spacing for long-form pages
----------------------------------------------------------------------------- */

.page-content {
    max-width: calc(68.75rem - (var(--ctn-margin) * 2));
    margin-left: var(--ctn-margin);
    margin-right: var(--ctn-margin);
}

@media screen and (min-width: 68.75rem) {
    .page-content {
        margin-left: auto;
        margin-right: auto;
    }
}

.page-content--narrow {
    max-width: 900px;
}

.page-content--padded {
    padding-top: 2.5rem;
    padding-bottom: 2.5rem;
}

.page-content--doc {
    max-width: var(--measure-doc);
    padding-top: 3rem;
    padding-bottom: 5rem;
}

/* -----------------------------------------------------------------------------
    Content section — the primary page section wrapper

    Alternate the default (foundation) and --raised (surface) backgrounds on
    consecutive sections to create visible page rhythm without hard borders.
    --card steps up once more for sections that must read as a raised panel.
    __inner is the constrained centered column inside every section.
----------------------------------------------------------------------------- */

.content-section {
    padding: var(--section-pad-block) 0;
    background-color: var(--color-foundation);
}

.content-section--raised {
    background-color: var(--color-surface);
}

.content-section--card {
    background-color: var(--color-surface-raised);
}

.content-section__inner {
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
}

/* Two-column split: media beside body copy. --reversed flips the visual order
   with direction:rtl so the markup order (media first) never changes — DOM and
   reading order stay stable for assistive tech. */
.content-section__split {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 5rem;
    align-items: center;
}

.content-section__split--reversed {
    direction: rtl;
}

.content-section__split--reversed > * {
    direction: ltr;
}

.content-section__media {
    position: relative;
}

.content-section__media img {
    width: 100%;
    height: auto;
    display: block;
    object-fit: cover;
}

/* The diagonal cut on the media's bottom edge — the signature forward-motion
   transition of the aesthetic. */
.content-section__media--angled {
    clip-path: polygon(0 0, 100% 0, 100% 88%, 0 100%);
}

.content-section__media--stack {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

.content-section__media--stack img {
    clip-path: polygon(0 0, 100% 0, 100% 88%, 0 100%);
}

.content-section__split + .content-section__split {
    margin-top: 5rem;
}

@media (max-width: 768px) {
    .content-section {
        padding: var(--section-pad-block-narrow) 0;
    }

    .content-section__split {
        grid-template-columns: 1fr;
        gap: 2.5rem;
        direction: ltr;
    }

    .content-section__split--reversed {
        direction: ltr;
    }

    .content-section__split + .content-section__split {
        margin-top: 3rem;
    }
}

/* -----------------------------------------------------------------------------
    Flow — vertical rhythm primitive

    The Stack / "flow" idea (Andy Bell / Every Layout / Piccalilli). Add .flow
    to any container and its DIRECT children get consistent vertical spacing
    from the container's row gap. Spacing is a relationship BETWEEN siblings,
    so it lives on the parent flow, not on per-element classes. Tune a
    container's rhythm by setting --flow-space on that container.
----------------------------------------------------------------------------- */
.flow {
    --flow-space: var(--space-sm);
    display: flex;
    flex-direction: column;
    gap: var(--flow-space);
}

/* -----------------------------------------------------------------------------
    Cluster — wrapping inline groups

    Use .cluster for toolbars, button rows, tag/chip lists, header controls,
    and any horizontal group where wrapping is acceptable.

    Custom properties:
      --cluster-space    row and column gap
      --cluster-align    cross-axis alignment (default: center)
      --cluster-justify  main-axis alignment (default: flex-start)
----------------------------------------------------------------------------- */
.cluster {
    --cluster-space: var(--space-sm);
    display: flex;
    flex-wrap: wrap;
    gap: var(--cluster-space);
    align-items: var(--cluster-align, center);
    justify-content: var(--cluster-justify, flex-start);
}

/* -----------------------------------------------------------------------------
    Grid — auto-fit responsive tracks

    Use .grid-auto for galleries and repeated equal-width items. Tracks fill
    the available row and never drop below --grid-min; the min() guard stops a
    single track from overflowing a viewport narrower than that minimum.

    Custom properties:
      --grid-min    minimum track width before wrapping
      --grid-space  row and column gap
----------------------------------------------------------------------------- */
.grid-auto {
    --grid-min: 14rem;
    --grid-space: var(--space-md);
    display: grid;
    gap: var(--grid-space);
    grid-template-columns: repeat(auto-fit, minmax(min(var(--grid-min), 100%), 1fr));
}

/* -----------------------------------------------------------------------------
    Switcher — row-to-column without a breakpoint

    Use .switcher when a group should sit in a row while there is room, then
    become one item per row when the container is narrower than
    --switcher-threshold. Below the threshold the flex-basis calculation goes
    negative, forcing each child onto its own row.

    Custom properties:
      --switcher-threshold  minimum container width before switching to rows
      --switcher-space      row and column gap
----------------------------------------------------------------------------- */
.switcher {
    --switcher-threshold: 30rem;
    --switcher-space: var(--space-sm);
    display: flex;
    flex-wrap: wrap;
    gap: var(--switcher-space);
}

.switcher > * {
    flex-grow: 1;
    flex-basis: calc((var(--switcher-threshold) - 100%) * 999);
}

/* -----------------------------------------------------------------------------
    Sidebar — fixed-ish rail beside fluid content

    Use .with-sidebar when the first child should behave as a sidebar and the
    last child should take the remaining width. The content holds at least
    --sidebar-content-min of the inline size; when that cannot be satisfied,
    the pair wraps and both tracks become full-width. Shells opt in by setting
    their own --sidebar-content-min value.

    Custom properties:
      --sidebar-width        preferred sidebar track width
      --sidebar-content-min  minimum content track share before wrapping
      --sidebar-space        gap between tracks (default: 0 for divider rules)
----------------------------------------------------------------------------- */
.with-sidebar {
    --sidebar-space: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--sidebar-space);
}

.with-sidebar > :first-child {
    flex-basis: var(--sidebar-width);
    flex-grow: 1;
}

.with-sidebar > :last-child {
    flex-basis: 0;
    flex-grow: 999;
    min-inline-size: var(--sidebar-content-min, 60%);
}

/* -----------------------------------------------------------------------------
    Center — measured centered column

    Use .center for readable prose or constrained utility pages. It caps the
    inline size to --center-max and centers the box horizontally.

    Custom properties:
      --center-max  maximum inline size (default: prose measure)
----------------------------------------------------------------------------- */
.center {
    --center-max: var(--measure-prose);
    max-inline-size: var(--center-max);
    margin-inline: auto;
}

/* Form modifier: compose with .center for standalone form pages. */
.center--form {
    --center-max: var(--measure-form);
}

/* Site modifier: compose with .center for the default public page shell. */
.center--site {
    --center-max: 68rem;
}

/* -----------------------------------------------------------------------------
    Utilities
----------------------------------------------------------------------------- */

/* Visually hidden — screen-reader-only text. */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* -----------------------------------------------------------------------------
    Components — the Modern Athletic Grit BEM library

    Every component shares the same DNA: a dark surface, a hairline translucent
    border, square corners, and at most one orange accent edge. Hover states
    brighten a border or lift the card — never both a shadow and a glow.
    Emphasis comes from the display voice (condensed italic uppercase) and the
    one accent, never from decoration.
----------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
    Buttons

    One base class, four variants, one size modifier. Always Barlow Condensed
    uppercase with high letter-spacing. Works on <a> and <button>.

    Modifiers:
      .btn--primary       orange fill — the single most important action
      .btn--outline       white outline — secondary action on dark backgrounds
      .btn--ghost         orange outline, transparent fill — tertiary
      .btn--outline-dark  dark outline — ONLY for orange band backgrounds
      .btn--sm            compact size, works with any variant
----------------------------------------------------------------------------- */

.btn {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-family: var(--font-display);
    font-size: var(--text-btn);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-label);
    text-transform: uppercase;
    text-decoration: none;
    padding: 0.75rem 1.75rem;
    cursor: pointer;
    border: none;
    border-radius: var(--radius-sm);
    transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease;
    white-space: nowrap;
}

.btn--primary {
    background-color: var(--color-primary);
    color: var(--color-text-on-primary);
}

.btn--primary:hover {
    background-color: var(--color-primary-glow);
    /* Re-assert the label color: the global `a:hover` rule (reset.css) would
       otherwise out-specify the resting `.btn--primary` color and repaint the
       text `--color-primary-glow` — the same value as this hover background,
       making the label vanish. */
    color: var(--color-text-on-primary);
    transform: translateY(-2px);
    box-shadow: var(--btn-shadow-hover);
}

.btn--outline {
    background-color: transparent;
    color: var(--color-text-bright);
    border: var(--btn-border-width) solid var(--color-border-bright);
}

.btn--outline:hover {
    border-color: var(--color-border-vivid);
    background-color: var(--color-fill-hover);
    /* Hold the bright label color through hover; without this the global
       `a:hover` rule shifts it to orange. */
    color: var(--color-text-bright);
    transform: translateY(-2px);
}

/* For orange band backgrounds only — the dark border is invisible on dark. */
.btn--outline-dark {
    background-color: transparent;
    color: var(--color-text-on-primary);
    border: var(--btn-border-width) solid var(--color-border-on-primary);
}

.btn--outline-dark:hover {
    border-color: var(--color-border-on-primary-hover);
    background-color: var(--color-fill-on-primary-hover);
    /* On the orange band the label must stay near-black; without this the
       global `a:hover` rule turns it orange — invisible against the band. */
    color: var(--color-text-on-primary);
    transform: translateY(-2px);
}

.btn--ghost {
    background-color: transparent;
    color: var(--color-primary);
    border: var(--btn-border-width) solid var(--color-primary);
}

.btn--ghost:hover {
    background-color: var(--color-primary);
    color: var(--color-text-on-primary);
}

.btn--sm {
    font-size: var(--text-label);
    padding: 0.55rem 1.2rem;
    letter-spacing: var(--tracking-wide);
}

.btn:focus-visible {
    outline: 2px solid var(--color-focus-outline);
    outline-offset: 2px;
}

/* Group a primary CTA with at most one secondary action. */
.section-actions {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    margin-top: 2rem;
}

/* -----------------------------------------------------------------------------
    Page hero — full-viewport opening section

    A photographic background under the scrim gradient plus a grain texture,
    with bottom-left anchored content. White text needs the overlay; never use
    the hero without it.

    Expected structure:
        .page-hero
          .page-hero__image  (img, full-bleed)
          .page-hero__overlay
          .page-hero__content
            .eyebrow.eyebrow--hero
            .page-hero__headline  (em carries the orange highlight)
            .page-hero__body
            .page-hero__actions
----------------------------------------------------------------------------- */

.page-hero {
    position: relative;
    width: 100%;
    min-height: clamp(62svh, 56vw, 96svh);
    display: flex;
    align-items: flex-end;
    overflow: hidden;
    background-color: var(--color-hero-ground);
}

.page-hero__image {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center center;
    opacity: 0.75;
}

.page-hero__overlay {
    position: absolute;
    inset: 0;
    background: var(--hero-overlay-gradient);
}

/* Subtle noise grain — the signature grit that keeps the surface from feeling
   over-produced. Inline SVG turbulence, so no image request. */
.page-hero__overlay::after {
    content: '';
    position: absolute;
    inset: 0;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23noise)' opacity='0.04'/%3E%3C/svg%3E");
    background-repeat: repeat;
    background-size: 200px 200px;
    pointer-events: none;
    opacity: 0.5;
}

.page-hero__content {
    position: absolute;
    top: 0;
    z-index: 10;
    padding-block: clamp(1.25rem, 4vw, 3rem);
    padding-inline: var(--ctn-margin);
    max-width: 900px;
}

@media (min-width: 640px) {
    .page-hero__content {
        padding-inline: clamp(2rem, 7vw, 8rem);
    }
}

.page-hero__headline {
    font-family: var(--font-display);
    font-size: var(--text-display-hero);
    font-style: italic;
    font-weight: var(--weight-black);
    line-height: var(--leading-display);
    text-transform: uppercase;
    letter-spacing: var(--tracking-display);
    color: var(--color-text-bright);
    margin: 0 0 2rem;
}

.page-hero__headline em {
    font-style: italic;
    color: var(--color-primary);
}

.page-hero__body {
    font-size: clamp(1.125rem, calc(0.7rem + 1vw), 1.25rem);
    color: var(--color-text-soft);
    max-width: 480px;
    line-height: 1.7;
    margin: 0 0 2.25rem;
}

.page-hero__actions {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    align-items: center;
}

/* -----------------------------------------------------------------------------
    Page banner — interior page header

    The header for pages without full-bleed hero photography (teams, schedule,
    data pages). A faint diagonal orange glow sits in the top-right corner.
    Supports an optional logo above the eyebrow.
----------------------------------------------------------------------------- */

.page-banner {
    background-color: var(--color-surface);
    border-bottom: var(--hairline-width) solid var(--color-border);
    padding: 3.5rem 0 3rem;
    position: relative;
    overflow: hidden;
}

.page-banner::before {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    width: 40%;
    background: var(--banner-glow-overlay);
    pointer-events: none;
}

.page-banner__inner {
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
    position: relative;
}

.page-banner__logo {
    height: 48px;
    width: auto;
    margin-bottom: 1rem;
    opacity: 0.9;
}

.page-banner__title {
    font-family: var(--font-display);
    font-size: var(--text-display-banner);
    font-style: italic;
    font-weight: var(--weight-black);
    line-height: var(--leading-display);
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 0.75rem;
}

.page-banner__subtitle {
    font-size: var(--text-body);
    color: var(--color-text-muted);
    margin: 0;
    max-width: 600px;
}

@media (max-width: 640px) {
    .page-banner {
        padding: 2.5rem 0 2rem;
    }
}

/* -----------------------------------------------------------------------------
    Highlight band — full-width orange CTA strip

    The one context where the primary color dominates a full section. The
    diagonal stripe texture keeps it from feeling flat. Use once or twice per
    page maximum; any button inside must be .btn--outline-dark, and text stays
    near-black.
----------------------------------------------------------------------------- */

.highlight-band {
    background-color: var(--color-primary);
    padding: 3rem 0;
    position: relative;
    overflow: hidden;
}

.highlight-band::before {
    content: '';
    position: absolute;
    inset: 0;
    background: var(--band-stripe-overlay);
}

.highlight-band__inner {
    position: relative;
    z-index: 1;
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 2rem;
    flex-wrap: wrap;
}

.highlight-band__headline {
    font-family: var(--font-display);
    font-size: clamp(1.5rem, calc(1.1rem + 1.4vw), 2.5rem);
    font-style: italic;
    font-weight: var(--weight-black);
    text-transform: uppercase;
    color: var(--color-text-on-primary);
    line-height: 1;
    margin: 0;
}

.highlight-band__sub {
    font-size: 0.9rem;
    color: color-mix(in srgb, var(--color-text-on-primary) 65%, transparent);
    margin: 0.4rem 0 0;
    font-weight: 500;
}

/* -----------------------------------------------------------------------------
    Stat band — the orange band's data-driven sibling

    A full-width strip of headline statistics in big italic numerals. Two
    columns on mobile, four on desktop.
----------------------------------------------------------------------------- */

.stat-band {
    background-color: var(--color-primary);
    position: relative;
    overflow: hidden;
}

.stat-band::before {
    content: '';
    position: absolute;
    inset: 0;
    background: var(--band-stripe-overlay);
    pointer-events: none;
}

.stat-band__inner {
    position: relative;
    z-index: 1;
    list-style: none;
    margin: 0 auto;
    max-width: var(--section-inner-max);
    padding: 2.25rem var(--ctn-margin);
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.75rem 1rem;
}

.stat-band__item {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    line-height: 1;
}

.stat-band__value {
    font-family: var(--font-display);
    font-size: clamp(2.5rem, calc(1.6rem + 2.9vw), 3.75rem);
    font-style: italic;
    font-weight: var(--weight-black);
    color: var(--color-text-on-primary);
}

.stat-band__label {
    font-family: var(--font-display);
    font-size: var(--text-eyebrow);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-label);
    text-transform: uppercase;
    color: color-mix(in srgb, var(--color-text-on-primary) 65%, transparent);
    margin-top: 0.6rem;
}

@media (min-width: 768px) {
    .stat-band__inner {
        grid-template-columns: repeat(4, 1fr);
        padding-block: 2.75rem;
    }
}

/* -----------------------------------------------------------------------------
    Federation strip — horizontal logo strip

    The white background is intentional: it creates a sharp boundary between
    the dark hero and the next section, and it is the ONLY white surface on
    the site. Place directly after the home page hero.
----------------------------------------------------------------------------- */

.federation-strip {
    background-color: var(--color-surface-white);
    border-top: var(--hairline-width) solid var(--color-border);
    border-bottom: var(--hairline-width) solid var(--color-border);
    padding: 1.75rem 0;
}

.federation-strip__inner {
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 3rem;
    flex-wrap: wrap;
}

.federation-strip__item {
    display: flex;
    align-items: center;
}

.federation-strip__item img {
    height: 72px;
    width: auto;
    object-fit: contain;
}

@media (max-width: 640px) {
    .federation-strip {
        padding: 1.5rem 0;
    }

    .federation-strip__inner {
        gap: 1.75rem;
    }

    .federation-strip__item img {
        height: 56px;
    }
}

/* -----------------------------------------------------------------------------
    Roster header — juniors roster page header

    League and team logos side-by-side, inverted to white, with a title and
    subtitle. Pair with .nav-tabs directly below.
----------------------------------------------------------------------------- */

.roster-header {
    background-color: var(--color-surface);
    padding: 3rem 0 2.5rem;
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.roster-header__inner {
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
    display: flex;
    align-items: center;
    gap: 2rem;
    flex-wrap: wrap;
}

.roster-header__logos {
    display: flex;
    align-items: center;
    gap: 1.25rem;
    flex-shrink: 0;
}

/* brightness(0) invert(1) renders any logo white on the dark surface. */
.roster-header__logos img {
    height: 52px;
    width: auto;
    object-fit: contain;
    filter: brightness(0) invert(1);
    opacity: 0.9;
}

.roster-header__divider {
    width: 1px;
    height: 40px;
    background-color: var(--color-border-strong);
}

.roster-header__info {
    flex: 1;
}

.roster-header__title {
    font-family: var(--font-display);
    font-size: clamp(1.75rem, calc(1.2rem + 1.8vw), 3rem);
    font-style: italic;
    font-weight: var(--weight-black);
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 0.25rem;
    line-height: 1;
}

.roster-header__subtitle {
    font-size: 0.9rem;
    color: var(--color-text-muted);
    margin: 0;
}

@media (max-width: 640px) {
    .roster-header {
        padding: 2rem 0;
    }
}

/* -----------------------------------------------------------------------------
    Info card + info grid — two-up feature callouts

    A dark card with an orange left accent border. .info-grid collapses to a
    single column below 640px.
----------------------------------------------------------------------------- */

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

.info-card {
    background-color: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    border-left: var(--accent-rule-height) solid var(--color-primary);
    padding: 1.75rem;
}

.info-card__title {
    font-family: var(--font-display);
    font-size: 1.1rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 0.75rem;
}

.info-card p {
    color: color-mix(in srgb, var(--color-text) 65%, transparent);
    font-size: 0.9rem;
    line-height: 1.65;
    margin: 0 0 1.25rem;
}

/* Inline links inside card copy — mirrors .info-block a. The :not(.btn) guard
   keeps buttons rendered as links from inheriting the inline underline and
   orange hover color, which would otherwise out-specify the .btn variants and,
   for .btn--primary, repaint the label to match its hover fill and vanish. */
.info-card a:not(.btn) {
    color: var(--color-primary);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
    transition: color 0.15s ease;
}

.info-card a:not(.btn):hover {
    color: var(--color-primary-glow);
}

@media (max-width: 640px) {
    .info-grid {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Info block — standalone stacked content block

    Like .info-card but standalone: a title, optional orange subtitle, body
    copy with inline links, and a CTA. Common for registration blocks.
----------------------------------------------------------------------------- */

.info-block {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    border-left: var(--accent-rule-height) solid var(--color-primary);
    padding: 2rem 2rem 2rem 2.25rem;
    margin-bottom: 1.5rem;
}

.info-block__title {
    font-family: var(--font-display);
    font-size: 1.35rem;
    font-weight: var(--weight-black);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 0.75rem;
    line-height: 1;
}

.info-block__subtitle {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-primary);
    letter-spacing: 0.06em;
    margin: 1.5rem 0 0.75rem;
    line-height: 1.2;
}

.info-block p {
    color: color-mix(in srgb, var(--color-text) 70%, transparent);
    font-size: 0.95rem;
    line-height: 1.65;
    margin: 0 0 1rem;
}

.info-block p:last-child {
    margin-bottom: 0;
}

/* The :not(.btn) guard keeps buttons rendered as links from inheriting the
   inline underline and orange hover color — see the matching note on
   .info-card a:not(.btn) above. */
.info-block a:not(.btn) {
    color: var(--color-primary);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
    transition: color 0.15s ease;
}

.info-block a:not(.btn):hover {
    color: var(--color-primary-glow);
}

/* -----------------------------------------------------------------------------
    Juniors card + grid — program cards with a logo bar
----------------------------------------------------------------------------- */

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

.juniors-card {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: border-color 0.15s ease;
}

.juniors-card:hover {
    border-color: var(--color-border-strong);
}

.juniors-card__logo-bar {
    background-color: var(--color-surface-card);
    padding: 1.75rem 2rem;
    display: flex;
    align-items: center;
    gap: 1.5rem;
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.juniors-card__logo-bar img {
    height: 48px;
    width: auto;
    object-fit: contain;
    opacity: 0.85;
}

.juniors-card__body {
    padding: 1.75rem 2rem;
    flex: 1;
    display: flex;
    flex-direction: column;
}

.juniors-card__tier {
    font-family: var(--font-display);
    font-size: var(--text-eyebrow);
    font-weight: var(--weight-bold);
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--color-primary);
    margin-bottom: 0.5rem;
}

.juniors-card__title {
    font-family: var(--font-display);
    font-size: 1.4rem;
    font-weight: var(--weight-black);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 0.5rem;
    line-height: 1;
}

/* margin-bottom:auto pins the CTA to the card bottom across the grid row. */
.juniors-card__location {
    font-size: 0.85rem;
    color: var(--color-text-muted);
    margin-bottom: auto;
    padding-bottom: 1.5rem;
}

@media (max-width: 640px) {
    .juniors-grid {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Event card + grid — tournaments and camps listing

    Square media on top, orange-ruled body with type label, title, meta
    definition list, description or bullet list, and actions. Media zooms
    subtly on hover.
----------------------------------------------------------------------------- */

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

.event-card {
    background-color: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: border-color 0.2s ease;
}

.event-card:hover {
    border-color: var(--color-primary);
}

.event-card__media {
    aspect-ratio: 1 / 1;
    overflow: hidden;
    flex-shrink: 0;
}

.event-card__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center top;
    display: block;
    transition: transform 0.35s ease;
}

.event-card:hover .event-card__media img {
    transform: scale(1.03);
}

.event-card__body {
    padding: 2rem;
    display: flex;
    flex-direction: column;
    flex: 1;
    border-top: var(--accent-rule-height) solid var(--color-primary);
}

.event-card__type {
    font-family: var(--font-display);
    font-size: 0.65rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--color-primary);
    margin-bottom: 0.6rem;
    display: block;
}

.event-card__title {
    font-family: var(--font-display);
    font-size: clamp(1.6rem, calc(1.4rem + 0.7vw), 2rem);
    font-weight: var(--weight-black);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 1.25rem;
    line-height: 1;
}

.event-card__meta {
    margin: 0 0 1.25rem;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.event-card__meta-item {
    display: grid;
    grid-template-columns: 3.75rem 1fr;
    gap: 0.5rem;
    align-items: start;
}

.event-card__meta-item dt {
    font-family: var(--font-display);
    font-size: 0.6rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--color-text-muted);
    padding-top: 0.15em;
    white-space: nowrap;
}

.event-card__meta-item dd {
    font-size: 0.88rem;
    color: var(--color-text);
    margin: 0;
    line-height: 1.45;
    font-weight: 500;
}

/* margin-bottom:auto keeps actions pinned to the card bottom. */
.event-card__description {
    font-size: 0.88rem;
    color: var(--color-text-muted);
    line-height: 1.65;
    margin: 0 0 auto;
    padding-bottom: 1.75rem;
}

.event-card__description--lead {
    margin-bottom: 0.875rem;
    padding-bottom: 0;
}

.event-card__list {
    list-style: none;
    padding: 0 0 1.75rem;
    margin: 0 0 auto;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.event-card__list li {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    font-size: 0.88rem;
    color: var(--color-text-muted);
    line-height: 1.5;
}

.event-card__list li::before {
    content: '';
    display: block;
    width: 7px;
    height: 7px;
    min-width: 7px;
    border-radius: 50%;
    background: var(--color-primary);
    margin-top: 0.4em;
}

.event-card__actions {
    margin-top: 0;
}

@media (max-width: 768px) {
    .event-grid {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Player card + grid — juniors roster cards

    A 3:4 portrait photo (slightly desaturated, full color on hover) with
    number, name, and a stats grid below.
----------------------------------------------------------------------------- */

.player-grid {
    list-style: none;
    padding: 0;
    margin: 0;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 1rem;
}

.player-card {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    overflow: hidden;
    transition: border-color 0.2s ease, transform 0.2s ease;
}

.player-card:hover {
    border-color: var(--color-primary);
    transform: translateY(-3px);
}

.player-card__image {
    width: 100%;
    aspect-ratio: 3 / 4;
    object-fit: cover;
    object-position: top;
    display: block;
    filter: grayscale(20%);
    transition: filter 0.3s ease;
}

.player-card:hover .player-card__image {
    filter: grayscale(0%);
}

.player-card__info {
    padding: 0.875rem 1rem;
    background-color: var(--color-surface-card);
}

.player-card__number {
    font-family: var(--font-display);
    font-size: 0.65rem;
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-primary);
    display: block;
    margin-bottom: 0.15rem;
}

.player-card__name {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 0.5rem;
    line-height: 1.1;
}

.player-card__stats {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.3rem 0.5rem;
    margin-top: 0.5rem;
    border-top: var(--hairline-width) solid var(--color-border);
    padding-top: 0.5rem;
}

.player-card__stat {
    font-size: 0.72rem;
    color: var(--color-text-muted);
    line-height: 1.3;
}

.player-card__stat strong {
    color: var(--color-text);
    display: block;
    font-weight: 500;
    font-size: 0.72rem;
}

@media (max-width: 640px) {
    .player-grid {
        grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    }
}

/* -----------------------------------------------------------------------------
    Alumni card + pathway — player pathway timeline

    Orange-top-ruled card charting a player's path. The .alumni-path timeline
    runs along a left spine with diamond node markers; the final step —
    the player's top achievement — gets the filled orange chip automatically.
----------------------------------------------------------------------------- */

.alumni-grid {
    list-style: none;
    padding: 0;
    margin: 2.5rem 0 0;
    display: grid;
    grid-template-columns: 1fr;
    gap: 1rem;
}

@media (min-width: 40rem) {
    .alumni-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 64rem) {
    .alumni-grid {
        grid-template-columns: repeat(3, 1fr);
    }
}

.alumni-card {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    border-top: var(--accent-rule-height) solid var(--color-primary);
    padding: 1.5rem 1.5rem 1.6rem;
    display: flex;
    flex-direction: column;
    transition: border-color 0.15s ease, transform 0.15s ease;
}

.alumni-card:hover {
    border-color: var(--color-border-strong);
    border-top-color: var(--color-primary);
    transform: translateY(-3px);
}

.alumni-card__years {
    font-family: var(--font-display);
    font-size: 0.62rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--color-text-muted);
}

.alumni-card__name {
    font-family: var(--font-display);
    font-size: 1.4rem;
    font-style: italic;
    font-weight: var(--weight-black);
    line-height: 1;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0.3rem 0 1.1rem;
}

.alumni-path {
    list-style: none;
    padding: 0;
    margin: auto 0 0;
    display: flex;
    flex-direction: column;
    gap: 0;
}

.alumni-path__step {
    position: relative;
    display: grid;
    grid-template-columns: 4.25rem 1fr;
    align-items: baseline;
    gap: 0.75rem;
    padding: 0.7rem 0 0.7rem 1rem;
    border-left: 2px solid var(--color-border-strong);
}

/* Node marker on the pathway spine. */
.alumni-path__step::before {
    content: '';
    position: absolute;
    left: -5px;
    top: 1rem;
    width: 8px;
    height: 8px;
    background-color: var(--color-surface-card);
    border: 2px solid var(--color-border-strong);
    transform: rotate(45deg);
}

.alumni-path__step:first-child {
    padding-top: 0;
}

.alumni-path__step:first-child::before {
    top: 0.3rem;
}

.alumni-path__step:last-child {
    padding-bottom: 0;
    border-left-color: var(--color-primary);
}

.alumni-path__step:last-child::before {
    background-color: var(--color-primary);
    border-color: var(--color-primary);
}

.alumni-path__label {
    font-family: var(--font-display);
    font-size: 0.58rem;
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-text-dim);
    padding-top: 0.15rem;
}

.alumni-path__detail {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
}

.alumni-path__level {
    font-family: var(--font-display);
    font-size: 0.6rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--color-primary);
    align-self: flex-start;
    border: var(--hairline-width) solid var(--color-border-strong);
    padding: 0.12rem 0.45rem;
}

/* Filled accent chip for the player's furthest step. */
.alumni-path__step:last-child .alumni-path__level {
    background-color: var(--color-primary);
    border-color: var(--color-primary);
    color: var(--color-text-on-primary);
}

.alumni-path__team {
    font-size: 0.9rem;
    font-weight: 500;
    color: var(--color-text);
    line-height: 1.35;
}

/* -----------------------------------------------------------------------------
    Staff group + grid — coaching staff cards
----------------------------------------------------------------------------- */

.staff-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
    margin-top: 1.5rem;
}

.staff-group {
    background: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    border-top: var(--accent-rule-height) solid var(--color-primary);
    border-radius: var(--radius-doc);
    padding: 1.25rem 1.5rem 1.5rem;
}

.staff-group__title {
    font-family: var(--font-display);
    font-size: 0.85rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-primary);
    letter-spacing: 0.08em;
    margin: 0 0 1.25rem;
}

.staff-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0;
}

.staff-list__item {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.75rem 0;
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.staff-list__item:first-child {
    padding-top: 0;
}

.staff-list__item:last-child {
    border-bottom: none;
    padding-bottom: 0;
}

.staff-list__name {
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--color-text);
}

.staff-list__role {
    font-size: 0.775rem;
    color: var(--color-text-muted);
}

@media (max-width: 700px) {
    .staff-grid {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Pricing tier + grid — fee cards with a raised header band
----------------------------------------------------------------------------- */

.pricing-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
    margin: 0 0 1.5rem;
}

.pricing-tier {
    background: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    border-radius: var(--radius-doc);
    overflow: hidden;
}

.pricing-tier__header {
    padding: 0.75rem 1.25rem;
    background: var(--color-surface-raised);
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.pricing-tier__label {
    font-family: var(--font-display);
    font-size: 0.8rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-primary);
}

.pricing-tier__body {
    padding: 0.875rem 1.25rem 1.25rem;
}

.pricing-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0;
}

.pricing-list__item {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 0.75rem;
    padding: 0.5rem 0;
    border-bottom: var(--hairline-width) solid var(--color-border);
    font-size: 0.85rem;
    color: var(--color-text-muted);
}

.pricing-list__item:last-child {
    border-bottom: none;
    padding-bottom: 0;
}

.pricing-list__price {
    font-weight: var(--weight-bold);
    font-size: 0.9rem;
    color: var(--color-text);
    white-space: nowrap;
}

@media (max-width: 700px) {
    .pricing-grid {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Store — info cards, intro block, and embed column
----------------------------------------------------------------------------- */

.store-page {
    padding: 3rem 0 5rem;
}

.store-info-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
    margin-bottom: 3rem;
    max-width: calc(64rem - (var(--ctn-margin) * 2));
    margin-left: auto;
    margin-right: auto;
}

@media (max-width: 64rem) {
    .store-info-grid {
        margin-left: var(--ctn-margin);
        margin-right: var(--ctn-margin);
    }
}

@media (max-width: 700px) {
    .store-info-grid {
        grid-template-columns: 1fr;
        margin-left: var(--ctn-margin);
        margin-right: var(--ctn-margin);
    }
}

.store-info-card {
    background: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    border-top: var(--accent-rule-height) solid var(--color-primary);
    border-radius: var(--radius-doc);
    padding: 1.25rem 1.5rem;
}

.store-info-card__label {
    font-family: var(--font-display);
    font-size: 0.8rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--color-primary);
    margin: 0 0 0.5rem;
}

.store-info-card__body {
    font-size: 0.875rem;
    color: var(--color-text-muted);
    line-height: 1.6;
    margin: 0;
}

.store-block {
    display: flex;
    align-items: center;
    gap: 4rem;
}

.store-block__logo {
    flex-shrink: 0;
    width: 140px;
    opacity: 0.85;
}

.store-block__logo img {
    width: 100%;
}

@media (max-width: 640px) {
    .store-block {
        flex-direction: column;
        gap: 2rem;
    }

    .store-block__logo {
        width: 100px;
    }
}

/* Constrain a third-party store widget to a centered column. */
.store-embed {
    max-width: 900px;
    margin-inline: auto;
}

/* -----------------------------------------------------------------------------
    Game day + game entry — the schedule view

    .game-day groups games by date with a headline, stretch rule, and count.
    .game-entry is a three-column row (time | teams | venue); on mobile the
    venue wraps below the teams column. Hover reveals the orange left edge.
----------------------------------------------------------------------------- */

.game-day {
    margin-bottom: 4rem;
}

.game-day__header {
    display: flex;
    align-items: center;
    gap: 1rem;
    margin-bottom: 1.25rem;
    padding-bottom: 0.75rem;
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.game-day__date {
    font-family: var(--font-display);
    font-size: clamp(1.4rem, calc(1.1rem + 1vw), 2rem);
    font-style: italic;
    font-weight: var(--weight-black);
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0;
    line-height: 1;
}

.game-day__rule {
    flex: 1;
    height: 1px;
    background-color: var(--color-border);
}

.game-day__count {
    font-family: var(--font-display);
    font-size: var(--text-label);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-primary);
}

.game-day__list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.game-entry {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    display: grid;
    grid-template-columns: 80px 1fr auto;
    gap: 0 1.5rem;
    align-items: center;
    padding: 1rem 1.25rem;
    transition: background-color 0.15s ease, border-color 0.15s ease;
    position: relative;
}

/* State lives in the 3px left edge — transparent at rest, orange on hover. */
.game-entry::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background-color: transparent;
    transition: background-color 0.15s ease;
}

.game-entry:hover {
    background-color: var(--color-surface-card);
    border-color: var(--color-border-strong);
}

.game-entry:hover::before {
    background-color: var(--color-primary);
}

.game-entry__time {
    font-family: var(--font-display);
    font-size: 1.15rem;
    font-weight: var(--weight-bold);
    color: var(--color-primary);
    line-height: 1;
    text-align: center;
}

.game-entry__time-label {
    display: block;
    font-size: 0.58rem;
    font-weight: var(--weight-semibold);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-text-dim);
    margin-top: 0.2rem;
    text-align: center;
}

.game-entry__teams {
    font-size: 0.95rem;
    font-weight: 500;
    color: var(--color-text);
    line-height: 1.4;
    margin: 0;
}

.game-entry__venue {
    text-align: right;
    flex-shrink: 0;
}

.game-entry__venue-name {
    font-family: var(--font-display);
    font-size: 0.85rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-text);
    display: block;
    line-height: 1.2;
}

.game-entry__venue-address {
    font-size: 0.75rem;
    color: var(--color-text-muted);
    display: block;
    margin-top: 0.2rem;
    line-height: 1.3;
}

@media (max-width: 768px) {
    .game-entry {
        grid-template-columns: 60px 1fr;
        grid-template-rows: auto auto;
        gap: 0.25rem 1rem;
        padding: 0.875rem 1rem 0.875rem 1.25rem;
    }

    .game-entry__venue {
        grid-column: 2;
        text-align: left;
    }
}

/* -----------------------------------------------------------------------------
    Team record — W/L/T stat strip

    Segmented by hairline gaps. Only the --wins and --losses values borrow the
    status pair; ties stay neutral.
----------------------------------------------------------------------------- */

.team-record {
    display: flex;
    gap: 1px;
    background-color: var(--color-border);
    border: var(--hairline-width) solid var(--color-border);
    overflow: hidden;
    margin-bottom: 2.5rem;
    max-width: 520px;
}

.team-record__stat {
    flex: 1;
    background-color: var(--color-surface-raised);
    padding: 1.5rem 1.25rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.3rem;
}

.team-record__value {
    font-family: var(--font-display);
    font-size: 2.5rem;
    font-weight: var(--weight-black);
    font-style: italic;
    line-height: 1;
    color: var(--color-text);
}

.team-record__label {
    font-family: var(--font-display);
    font-size: 0.6rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--color-text-muted);
}

.team-record__stat--wins .team-record__value {
    color: var(--color-success);
}

.team-record__stat--losses .team-record__value {
    color: var(--color-error);
}

/* -----------------------------------------------------------------------------
    Game result — past results view

    Each row shows the W/L/T outcome and score, opponent, and venue/date meta.
    The --win / --loss / --tie modifiers color the 3px left edge and the
    outcome letter — never the whole row.
----------------------------------------------------------------------------- */

.game-results-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.game-result {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    display: grid;
    grid-template-columns: 72px 1fr auto;
    gap: 0 1.25rem;
    align-items: center;
    padding: 0.875rem 1.25rem;
    transition: background-color 0.15s ease;
    position: relative;
}

.game-result::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background-color: transparent;
}

.game-result--win::before {
    background-color: var(--color-success);
}

.game-result--loss::before {
    background-color: var(--color-error);
}

.game-result--tie::before {
    background-color: var(--color-text-muted);
}

.game-result:hover {
    background-color: var(--color-surface-card);
}

.game-result__outcome {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.15rem;
}

.game-result__label {
    font-family: var(--font-display);
    font-size: 1.4rem;
    font-weight: var(--weight-black);
    font-style: italic;
    line-height: 1;
    color: var(--color-text-muted);
}

.game-result--win .game-result__label {
    color: var(--color-success);
}

.game-result--loss .game-result__label {
    color: var(--color-error);
}

.game-result__score {
    font-family: var(--font-display);
    font-size: var(--text-label);
    font-weight: var(--weight-bold);
    letter-spacing: 0.06em;
    color: var(--color-text-muted);
    line-height: 1;
}

.game-result__teams {
    font-size: 0.9rem;
    font-weight: 500;
    color: var(--color-text);
    line-height: 1.4;
    margin: 0;
}

.game-result__meta {
    text-align: right;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
}

.game-result__venue {
    font-family: var(--font-display);
    font-size: 0.8rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-text);
    display: block;
    line-height: 1.2;
}

.game-result__date {
    font-size: 0.72rem;
    color: var(--color-text-muted);
    display: block;
}

@media (max-width: 768px) {
    .game-result {
        grid-template-columns: 56px 1fr;
        grid-template-rows: auto auto;
        gap: 0.2rem 1rem;
    }

    .game-result__meta {
        grid-column: 2;
        text-align: left;
    }
}

/* -----------------------------------------------------------------------------
    Team division + team link — the teams listing page

    Divisions group teams under an italic headline with an orange tier label.
    Each team entry is a card-like link with an arrow that shifts on hover.
----------------------------------------------------------------------------- */

.team-division {
    margin-bottom: 4rem;
}

.team-division__header {
    display: flex;
    align-items: baseline;
    gap: 1rem;
    margin-bottom: 1.5rem;
    padding-bottom: 0.75rem;
    border-bottom: 2px solid var(--color-border);
}

.team-division__title {
    font-family: var(--font-display);
    font-size: clamp(1.5rem, calc(1.2rem + 1.1vw), 2.25rem);
    font-style: italic;
    font-weight: var(--weight-black);
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0;
    line-height: 1;
}

.team-division__label {
    font-family: var(--font-display);
    font-size: var(--text-eyebrow);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-label);
    text-transform: uppercase;
    color: var(--color-primary);
}

.team-division__list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 0.75rem;
}

.team-link {
    display: flex;
    align-items: center;
    justify-content: space-between;
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    padding: 0.9rem 1.1rem;
    text-decoration: none;
    color: var(--color-text);
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
    position: relative;
}

.team-link::after {
    content: '→';
    color: var(--color-text-dim);
    font-size: 0.85rem;
    transition: color 0.15s ease, transform 0.15s ease;
}

.team-link:hover {
    background-color: var(--color-surface-card);
    border-color: var(--color-primary);
    color: var(--color-primary);
}

.team-link:hover::after {
    color: var(--color-primary);
    transform: translateX(3px);
}

@media (max-width: 640px) {
    .team-division__list {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Roster table — tabular player data

    Jersey numbers render in orange display type; names in bright text. Rows
    highlight on hover — hairline row borders, no zebra striping. Wrap in an
    overflow-x:auto container for narrow viewports.
----------------------------------------------------------------------------- */

.roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.9rem;
}

.roster-table thead tr {
    border-bottom: 2px solid var(--color-border-strong);
}

.roster-table th {
    font-family: var(--font-display);
    font-size: 0.65rem;
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-label);
    text-transform: uppercase;
    color: var(--color-text-muted);
    text-align: left;
    padding: 0.6rem 0.75rem;
}

.roster-table th:first-child {
    width: 50px;
}

.roster-table td {
    padding: 0.7rem 0.75rem;
    color: color-mix(in srgb, var(--color-text) 80%, transparent);
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.roster-table tbody tr {
    transition: background-color 0.1s ease;
}

.roster-table tbody tr:hover {
    background-color: var(--color-surface-raised);
}

.roster-table__number {
    font-family: var(--font-display);
    font-size: 1.1rem;
    font-weight: var(--weight-black);
    color: var(--color-primary);
}

.roster-table__name {
    font-weight: 600;
    color: var(--color-text);
}

/* -----------------------------------------------------------------------------
    Commit grid — player commitment photo grid
----------------------------------------------------------------------------- */

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

@media (max-width: 768px) {
    .commit-grid {
        grid-template-columns: 1fr 1fr;
    }
}

@media (max-width: 480px) {
    .commit-grid {
        grid-template-columns: 1fr;
    }
}

.commit-grid__item img {
    width: 100%;
    height: auto;
    display: block;
}

.commit-grid__caption {
    padding: 0.5rem 0 0.4rem;
}

.commit-grid__player {
    display: block;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    font-size: 0.95rem;
    color: var(--color-text);
    line-height: 1.2;
}

.commit-grid__team {
    display: block;
    font-size: 0.8rem;
    font-weight: var(--weight-semibold);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--color-primary);
    margin-top: 0.15rem;
}

/* -----------------------------------------------------------------------------
    Lists — tier, date, highlights, includes

    Each list signals its content type with a distinct orange marker: diamonds
    for tiers, dots for feature highlights, checkmarks for inclusions. Never
    mix marker styles inside one list.
----------------------------------------------------------------------------- */

.tier-list {
    list-style: none;
    padding: 0;
    margin: 0 0 1.75rem;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.tier-list__item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-text);
}

.tier-list__item::before {
    content: '';
    display: inline-block;
    width: 6px;
    height: 6px;
    background-color: var(--color-primary);
    transform: rotate(45deg);
    flex-shrink: 0;
}

.date-list {
    list-style: none;
    padding: 0;
    margin: 0 0 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.date-list__item {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    font-size: 0.9rem;
    color: color-mix(in srgb, var(--color-text) 75%, transparent);
    line-height: 1.4;
    padding: 0.25rem 0;
}

.date-list__item strong {
    color: var(--color-text);
    font-weight: 600;
    white-space: nowrap;
}

.date-list__item em {
    font-style: italic;
    color: var(--color-text-muted);
}

/* Program highlights — orange dot bullets in bordered cells, two columns
   collapsing to one. */
.highlights-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.625rem;
}

.highlights-list > li {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    padding: 0.875rem 1rem;
    background: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    border-radius: var(--radius-doc);
    color: var(--color-text-muted);
    font-size: 0.875rem;
    line-height: 1.5;
}

.highlights-list > li::before {
    content: '';
    display: block;
    width: 7px;
    height: 7px;
    min-width: 7px;
    border-radius: 50%;
    background: var(--color-primary);
    margin-top: 0.4em;
}

@media (max-width: 600px) {
    .highlights-list {
        grid-template-columns: 1fr;
    }
}

/* What's included — orange checkmarks in bordered cells. */
.includes-list {
    list-style: none;
    padding: 0;
    margin: 0 0 2rem;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.5rem;
}

.includes-list > li {
    display: flex;
    align-items: flex-start;
    gap: 0.625rem;
    padding: 0.5rem 0.75rem;
    font-size: 0.85rem;
    color: var(--color-text-muted);
    line-height: 1.5;
    background: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border);
    border-radius: var(--radius-doc);
}

.includes-list > li::before {
    content: '✓';
    color: var(--color-primary);
    font-weight: var(--weight-bold);
    font-size: 0.75rem;
    flex-shrink: 0;
    margin-top: 0.15em;
}

@media (max-width: 600px) {
    .includes-list {
        grid-template-columns: 1fr;
    }
}

/* -----------------------------------------------------------------------------
    Callouts and notes — document notices

    The warning callout is a red-tinted panel for deadlines and important
    notices; use sparingly (one per document section at most). The notes are
    low-emphasis: .aside-note for supplementary commentary under a rule,
    .section-note for fine print. .empty-state marks lists with no entries.
----------------------------------------------------------------------------- */

.callout {
    padding: 1.25rem 1.5rem;
    border-radius: var(--radius-doc);
    margin: 1.5rem 0;
    font-size: 0.875rem;
    line-height: 1.65;
}

.callout--warning {
    background: var(--color-callout-warning-bg);
    border: var(--hairline-width) solid var(--color-callout-warning-border);
    border-left: var(--accent-rule-height) solid var(--color-callout-warning-edge);
    color: var(--color-callout-warning-text);
}

.callout--warning strong {
    color: var(--color-callout-warning-strong);
}

.aside-note {
    font-size: 0.82rem;
    color: var(--color-text-muted);
    font-style: italic;
    border-top: var(--hairline-width) solid var(--color-border);
    padding-top: 0.75rem;
    margin-top: 0.5rem;
}

.section-note {
    color: var(--color-text-dim);
    font-size: var(--text-sm);
    font-style: italic;
    line-height: 1.6;
    margin: 1rem 0 0;
}

.empty-state {
    color: var(--color-text-muted);
    font-style: italic;
}

/* -----------------------------------------------------------------------------
    Section block — long-form document sections

    Divides program guides and other document pages into labeled, scannable
    sections: italic title, optional orange subtitle, constrained body copy,
    hairline separators between blocks.
----------------------------------------------------------------------------- */

.section-block {
    padding: 2.5rem 0;
    border-top: var(--hairline-width) solid var(--color-border);
}

.section-block__title {
    font-family: var(--font-display);
    font-size: 1.65rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-text);
    margin: 0 0 1.25rem;
    line-height: 1.1;
}

.section-block__subtitle {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    font-style: italic;
    text-transform: uppercase;
    color: var(--color-primary);
    letter-spacing: 0.06em;
    margin: 2rem 0 0.75rem;
}

.section-block__body {
    color: var(--color-text-muted);
    line-height: 1.75;
    margin: 0 0 1rem;
    max-width: var(--measure-prose);
}

.section-block__body strong {
    color: var(--color-text);
}

.section-block__body a {
    color: var(--color-primary);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
    transition: color 0.15s ease;
}

.section-block__body a:hover {
    color: var(--color-primary-glow);
}

/* PDF download bar at the top of long-form document pages. */
.doc-download {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1.5rem;
    padding: 1.25rem 1.75rem;
    background: var(--color-surface-card);
    border: var(--hairline-width) solid var(--color-border-strong);
    border-left: var(--accent-rule-height) solid var(--color-primary);
    border-radius: var(--radius-doc);
    margin-bottom: 3rem;
}

.doc-download p {
    color: var(--color-text-muted);
    font-size: 0.875rem;
    margin: 0;
}

/* -----------------------------------------------------------------------------
    Media carousel — announcement slides

    Native CSS scroll-snap rail with numbered square tab navigation below.
    Each slide overlays its message and actions on a bottom gradient scrim.
    Navigation tabs need a small script that scrolls the rail and toggles
    .media-carousel__tab--active; never auto-advance.
----------------------------------------------------------------------------- */

.media-carousel {
    max-width: 720px;
    margin-left: var(--ctn-margin);
    margin-right: var(--ctn-margin);
}

/* Center once the viewport clears the 720px content width + gutters. */
@media screen and (min-width: 768px) {
    .media-carousel {
        margin-left: auto;
        margin-right: auto;
    }
}

.media-carousel__rail {
    display: flex;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    background-color: var(--color-surface);
    border: var(--hairline-width) solid var(--color-border);
    /* Hide the scrollbar — navigation is handled by the tabs below. */
    scrollbar-width: none;
    -ms-overflow-style: none;
}

.media-carousel__rail::-webkit-scrollbar {
    display: none;
}

.media-carousel-slide {
    height: clamp(100px, 90vw, 580px);
    position: relative;
    flex: 0 0 100%;
    /* Size each slide to its own image so the body sticks to the image
       bottom, regardless of the image's aspect ratio. */
    align-self: flex-start;
    scroll-snap-align: start;
    scroll-snap-stop: always;
}

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

/* Dark, semi-transparent scrim overlaying the bottom of the image. */
.media-carousel-slide__body {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 3rem 1.75rem 1.5rem;
    background: var(--carousel-scrim-gradient);
}

.media-carousel-slide__body p {
    font-family: var(--font-display);
    font-size: clamp(1.15rem, calc(1rem + 0.7vw), 1.5rem);
    font-weight: var(--weight-bold);
    line-height: 1.15;
    color: var(--color-text-bright);
    margin: 0 0 1rem;
    max-width: 36ch;
}

.media-carousel-slide__actions {
    display: flex;
    gap: 0.75rem;
    flex-wrap: wrap;
}

/* Slide navigation — numbered square outlined buttons below the rail. */
.media-carousel__nav {
    display: flex;
    justify-content: center;
    gap: 0.6rem;
    margin-top: 1.5rem;
}

.media-carousel__tab {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;
    border: var(--btn-border-width) solid var(--color-border-strong);
    background-color: transparent;
    color: var(--color-text-muted);
    font-family: var(--font-display);
    font-size: 0.95rem;
    font-weight: var(--weight-bold);
    line-height: 1;
    cursor: pointer;
    transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease;
    -webkit-tap-highlight-color: transparent;
}

.media-carousel__tab:hover {
    color: var(--color-text);
    border-color: var(--color-text-muted);
}

/* Marks the button for the slide currently in view. */
.media-carousel__tab--active {
    color: var(--color-text);
    border-color: var(--color-primary);
}

@media (prefers-reduced-motion: reduce) {
    .media-carousel__rail {
        scroll-behavior: auto;
    }
}

/* -----------------------------------------------------------------------------
    Article media + video embed

    .article-media frames document imagery on a raised surface with a hairline
    border — unframed images float awkwardly on dark surfaces.
    .youtube-video gives any embedded iframe a responsive 16:9 ratio.
----------------------------------------------------------------------------- */

.article-media {
    background-color: var(--color-surface-raised);
    border: var(--hairline-width) solid var(--color-border);
    margin: 0 0 1.5rem;
}

.article-media img {
    display: block;
    width: 100%;
    height: auto;
}

.youtube-video > iframe {
    aspect-ratio: 16 / 9;
    width: 100%;
    display: block;
}

/* -----------------------------------------------------------------------------
    Location block — map + address pairing

    The grayscale + invert treatment turns a standard light map into a
    dark-world graphic.
----------------------------------------------------------------------------- */

.location-block {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 4rem;
    align-items: center;
    margin-top: 2rem;
}

.location-block__image img {
    width: 100%;
    object-fit: cover;
    display: block;
    filter: grayscale(1) invert(1) brightness(1);
    opacity: 0.75;
}

.location-block__address {
    font-family: var(--font-body);
    font-size: 1rem;
    color: color-mix(in srgb, var(--color-text) 70%, transparent);
    line-height: 1.8;
    margin: 0.75rem 0 1.25rem;
}

.location-block__address a {
    color: var(--color-primary);
    transition: opacity 0.15s ease;
}

.location-block__address a:hover {
    opacity: 0.8;
}

@media (max-width: 768px) {
    .location-block {
        grid-template-columns: 1fr;
        gap: 2rem;
    }
}

/* -----------------------------------------------------------------------------
    Site header — sticky top bar

    A sticky, blurred near-black bar holding the three-line brand mark,
    uppercase nav links, an optional dropdown submenu, and the one orange CTA.
    Below 800px the nav collapses behind a hamburger toggle into a full-width
    drawer; submenus become accordions. State classes toggled by script:
    .site-header__nav--mobile-open, .site-header__menu-toggle--open, and
    .site-header__nav-item--open. Keep aria-expanded in sync with each toggle.
----------------------------------------------------------------------------- */

.site-header {
    position: sticky;
    top: 0;
    z-index: 100;
    background-color: var(--color-header-veil);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.site-header__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
}

.site-header__nav {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.site-header__nav-link {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-semibold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-text-muted);
    text-decoration: none;
    padding: 0.5rem 1rem;
    transition: color 0.15s ease;
    white-space: nowrap;
}

.site-header__nav-link:hover {
    color: var(--color-text);
}

/* The one orange action in the header — never add a second. */
.site-header__nav-cta {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-text-on-primary);
    background-color: var(--color-primary);
    text-decoration: none;
    padding: 0.6rem 1.4rem;
    margin-left: 0.75rem;
    transition: background-color 0.15s ease, transform 0.1s ease;
    white-space: nowrap;
    display: inline-block;
}

.site-header__nav-cta:hover {
    background-color: var(--color-primary-glow);
    /* Re-assert the label color: the global `a:hover` rule (reset.css) would
       otherwise repaint the text `--color-primary-glow` — the same value as
       this hover background — making the label vanish. */
    color: var(--color-text-on-primary);
    transform: translateY(-1px);
}

/* Submenu (dropdown) — desktop. */
.site-header__nav-item {
    position: relative;
}

.site-header__submenu-toggle {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-semibold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-text-muted);
    background: transparent;
    border: 0;
    padding: 0.5rem 1rem;
    cursor: pointer;
    transition: color 0.15s ease;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    -webkit-tap-highlight-color: transparent;
}

.site-header__submenu-toggle:hover {
    color: var(--color-text);
}

.site-header__nav-item--open .site-header__submenu-toggle {
    color: var(--color-text);
}

.site-header__submenu-caret {
    transition: transform 0.15s ease;
}

.site-header__nav-item--open .site-header__submenu-caret {
    transform: rotate(180deg);
}

.site-header__submenu {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 16rem;
    background-color: var(--color-header-veil-solid);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border: var(--hairline-width) solid var(--color-border-strong);
    padding: 0.5rem 0;
    z-index: 99;
}

.site-header__nav-item--open .site-header__submenu {
    display: block;
}

.site-header__submenu-link {
    display: block;
    font-family: var(--font-display);
    font-size: 0.95rem;
    font-weight: var(--weight-semibold);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-text-muted);
    text-decoration: none;
    padding: 0.75rem 1.25rem;
    border-left: 2px solid transparent;
    transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;
    white-space: nowrap;
}

.site-header__submenu-link:hover {
    color: var(--color-text);
    background-color: var(--color-surface-hover);
    border-left-color: var(--color-primary);
}

/* Hide the hamburger button on desktop. */
.site-header__menu-toggle {
    display: none;
    padding: 0;
}

/* Brand mark — three stacked text elements beside the logo. */
.site-header-brand {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-shrink: 0;
    padding: 1rem 0;
    text-decoration: none;
}

.site-header-brand__image-container {
    width: 80px;
}

.site-header-brand__image-container > img {
    display: block;
    width: 100%;
}

.site-header-brand__text {
    margin-top: 0;
    margin-bottom: 0;
    line-height: 1;
}

.site-header-brand__text-element {
    display: block;
    text-transform: uppercase;
}

.site-header-brand__text-element--super {
    font-style: italic;
    font-weight: var(--weight-bold);
    font-size: 1.125rem;
    letter-spacing: var(--tracking-wide);
    padding-left: 0.25rem;
    color: var(--color-text-muted);
    font-family: var(--font-display);
}

.site-header-brand__text-element--main {
    font-style: italic;
    font-weight: var(--weight-black);
    font-size: 2.5rem;
    letter-spacing: 0.02em;
    color: var(--color-text);
    font-family: var(--font-display);
}

/* The skewed orange chip under the name — the one place the brand carries a
   filled accent. */
.site-header-brand__text-element--sub {
    transform: skew(-10deg);
    font-weight: var(--weight-bold);
    font-size: 1.125rem;
    background-color: var(--color-primary);
    color: var(--color-text-on-primary);
    margin-top: 0.2rem;
    padding: 0.2rem 0.5rem 0.18rem 0.45rem;
    letter-spacing: 0.12em;
    font-family: var(--font-display);
}

@media (max-width: 800px) {
    .site-header-brand__image-container {
        width: 64px;
    }

    .site-header-brand__text-element--super {
        font-size: 1rem;
    }

    .site-header-brand__text-element--main {
        font-size: 1.86rem;
    }

    .site-header-brand__text-element--sub {
        font-size: 0.86rem;
    }

    /* Hamburger toggle button. */
    .site-header__menu-toggle {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 44px;
        height: 44px;
        background: transparent;
        border: var(--hairline-width) solid var(--color-border-strong);
        color: var(--color-text-muted);
        cursor: pointer;
        -webkit-tap-highlight-color: transparent;
        transition: color 0.15s ease, border-color 0.15s ease;
    }

    .site-header__menu-toggle:hover {
        color: var(--color-text);
        border-color: var(--color-primary);
    }

    /* Icon swap: hamburger shown, close hidden (default closed state). */
    .site-header__menu-icon--open {
        display: block;
    }

    .site-header__menu-icon--close {
        display: none;
    }

    .site-header__menu-toggle--open .site-header__menu-icon--open {
        display: none;
    }

    .site-header__menu-toggle--open .site-header__menu-icon--close {
        display: block;
    }

    /* Orange accent on toggle when menu is open. */
    .site-header__menu-toggle--open {
        color: var(--color-primary);
        border-color: var(--color-primary);
    }

    /* Nav hidden by default on mobile. */
    .site-header__nav {
        display: none;
    }

    /* Full-width dropdown when open. .site-header (position: sticky) is the
       containing block; top: 100% tracks the header height dynamically. */
    .site-header__nav--mobile-open {
        display: flex;
        flex-direction: column;
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        background-color: var(--color-header-veil-solid);
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
        border-top: var(--hairline-width) solid var(--color-border-strong);
        border-bottom: var(--hairline-width) solid var(--color-border);
        padding: 0.75rem var(--ctn-margin) var(--ctn-margin);
        z-index: 99;
        gap: 0;
    }

    /* Nav links in drawer: full-width tap targets with dividers. */
    .site-header__nav--mobile-open .site-header__nav-link {
        display: block;
        padding: 1rem 0.5rem;
        font-size: 1.25rem;
        letter-spacing: 0.1em;
        color: var(--color-text-muted);
        border-bottom: var(--hairline-width) solid var(--color-border);
        text-align: left;
        width: 100%;
    }

    .site-header__nav--mobile-open .site-header__nav-link:hover {
        color: var(--color-text);
    }

    /* CTA: full-width, centered, separated from links. */
    .site-header__nav--mobile-open .site-header__nav-cta {
        display: block;
        width: 100%;
        text-align: center;
        margin-left: 0;
        margin-top: 1rem;
        padding: 0.85rem 1.4rem;
        font-size: 1.125rem;
    }

    /* Submenu — accordion behavior inside the mobile drawer. */
    .site-header__nav--mobile-open .site-header__nav-item {
        width: 100%;
        border-bottom: var(--hairline-width) solid var(--color-border);
    }

    .site-header__nav--mobile-open .site-header__submenu-toggle {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 0.4rem;
        width: 100%;
        padding: 1rem 0.5rem;
        font-size: 1.25rem;
        letter-spacing: 0.1em;
        color: var(--color-text-muted);
        text-align: left;
    }

    .site-header__nav--mobile-open .site-header__submenu {
        position: static;
        display: none;
        min-width: 0;
        background: transparent;
        backdrop-filter: none;
        -webkit-backdrop-filter: none;
        border: 0;
        padding: 0 0 0.5rem 0;
    }

    .site-header__nav--mobile-open .site-header__nav-item--open .site-header__submenu {
        display: block;
    }

    .site-header__nav--mobile-open .site-header__submenu-link {
        padding: 0.85rem 0.5rem 0.85rem 1.25rem;
        font-size: 1rem;
        border-left: 2px solid var(--color-border-strong);
    }
}

/* -----------------------------------------------------------------------------
    Nav tabs — horizontal sub-page navigation

    For sibling-page navigation on team detail pages. Mark exactly one link
    --active; add .nav-tabs--wrap when the tab set is too long for one row.
----------------------------------------------------------------------------- */

.nav-tabs {
    background-color: var(--color-surface);
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.nav-tabs__inner {
    display: flex;
    gap: 0;
}

@media screen and (min-width: 68.75rem) {
    .nav-tabs__inner {
        max-width: calc(68.75rem - (var(--ctn-margin) * 2));
        margin-left: auto;
        margin-right: auto;
    }
}

.nav-tabs__link {
    font-family: var(--font-display);
    font-size: 0.75rem;
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-text-muted);
    text-decoration: none;
    padding: 1rem 1.25rem;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: color 0.15s ease, border-color 0.15s ease;
    white-space: nowrap;
}

.nav-tabs__link:hover {
    color: var(--color-text);
}

.nav-tabs__link--active {
    color: var(--color-primary);
    border-bottom-color: var(--color-primary);
}

/* Wrap modifier — for tab sets too long for a single row. Also supplies the
   standard gutters so callers don't need extra padding. */
.nav-tabs--wrap .nav-tabs__inner {
    flex-wrap: wrap;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
}

/* -----------------------------------------------------------------------------
    Site footer

    A raised surface with a 3px orange top rule, a three-column grid
    (location / social + jobs / site nav), and a copyright bottom bar.
    Columns collapse to two at 768px and one at 480px.
----------------------------------------------------------------------------- */

.site-footer {
    background-color: var(--color-surface);
    border-top: var(--accent-rule-height) solid var(--color-primary);
    padding: 4rem 0 0;
    margin-top: 0;
    position: relative;
}

.site-footer__grid {
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding-left: var(--ctn-margin);
    padding-right: var(--ctn-margin);
    display: grid;
    grid-template-columns: 1fr 1fr auto;
    gap: 3rem 4rem;
    padding-bottom: 3rem;
    border-bottom: var(--hairline-width) solid var(--color-border);
}

.site-footer__heading {
    font-family: var(--font-display);
    font-size: 1.125rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--color-primary);
    margin: 0 0 1rem;
}

.site-footer__address {
    font-size: 1rem;
    line-height: 1.7;
    color: color-mix(in srgb, var(--color-text) 60%, transparent);
}

.site-footer__address a {
    color: var(--color-text);
    font-weight: 500;
    text-decoration: none;
    transition: color 0.15s ease;
    display: block;
    margin-bottom: 0.25rem;
}

.site-footer__address a:hover {
    color: var(--color-primary);
}

.site-footer__map-link {
    color: var(--color-primary);
    font-size: 0.9rem;
    font-family: var(--font-display);
    font-weight: var(--weight-bold);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    text-decoration: none;
    margin-top: 0.5rem;
    display: inline-block;
}

.site-footer__map-link:hover {
    opacity: 0.8;
}

.site-footer__social {
    list-style: none;
    padding: 0;
    margin: 0 0 1.5rem;
    display: flex;
    flex-direction: column;
    gap: 0;
}

.site-footer__social a {
    font-size: 1rem;
    color: color-mix(in srgb, var(--color-text) 60%, transparent);
    text-decoration: none;
    transition: color 0.15s ease;
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.35rem 0;
}

.site-footer__social a:hover {
    color: var(--color-primary);
}

.site-footer__jobs {
    font-size: 0.875rem;
    color: var(--color-text-dim);
    line-height: 1.5;
}

.site-footer__jobs a {
    color: var(--color-text-muted);
    transition: color 0.15s ease;
}

.site-footer__jobs a:hover {
    color: var(--color-text);
}

.site-footer__nav {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0;
}

.site-footer__nav a {
    font-family: var(--font-display);
    font-size: 1rem;
    font-weight: var(--weight-bold);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: color-mix(in srgb, var(--color-text) 50%, transparent);
    text-decoration: none;
    transition: color 0.15s ease;
    display: block;
    padding: 0.35rem 0;
}

.site-footer__nav a:hover {
    color: var(--color-primary);
}

.site-footer__bottom {
    max-width: var(--section-inner-max);
    margin: 0 auto;
    padding: 1.25rem var(--ctn-margin);
}

.site-footer__copyright {
    font-size: 0.75rem;
    color: var(--color-text-dim);
    margin: 0;
}

@media (max-width: 768px) {
    .site-footer__grid {
        grid-template-columns: 1fr 1fr;
        gap: 2rem;
    }
}

@media (max-width: 480px) {
    .site-footer {
        padding: 3rem 0 0;
    }

    .site-footer__grid {
        grid-template-columns: 1fr;
        gap: 2rem;
    }
}

/* -----------------------------------------------------------------------------
    Forms — dark, square, and quiet until engaged

    A form is a composition of primitives: a .form wrapper stacks .field rows
    in a single column and closes with a .form__actions button row. Controls
    are intentionally plain — a recessed dark fill, a hairline border, square
    corners — so nothing distracts from the data being entered. Orange is for
    focus and actions; red is for errors.
----------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
    Form — vertical layout wrapper

    Fields cap at a scannable width by default; use .form--full when the form
    must span its column (e.g. inside a narrow card).
----------------------------------------------------------------------------- */

.form {
    display: flex;
    flex-direction: column;
    gap: 1.75rem;
    max-width: var(--measure-form);
}

.form--full {
    max-width: none;
}

.form__actions {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    align-items: center;
}

/* -----------------------------------------------------------------------------
    Field — label + control + hint/error column

    Expected structure:
        .field
          .field__label
          .field__input
          .field__hint   (optional persistent guidance)
          .field__error  (optional validation feedback)

    Add .field--error to the wrapper (with aria-invalid="true" on the control)
    for validation failures. Read-only and disabled are HTML attributes, not
    class modifiers.
----------------------------------------------------------------------------- */

.field {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.field__label {
    font-family: var(--font-display);
    font-size: var(--text-label);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-label);
    text-transform: uppercase;
    color: var(--color-text-muted);
}

.field__input {
    font-family: var(--font-body);
    /* 1rem minimum prevents iOS Safari from zooming the page on focus. */
    font-size: 1rem;
    color: var(--color-text);
    background-color: var(--color-field-bg);
    border: var(--field-border-width) solid var(--color-field-border);
    /* Square corners + appearance:none neutralize native control chrome. */
    border-radius: var(--radius-sm);
    appearance: none;
    padding: 0 1rem;
    min-height: 2.75rem;
    width: 100%;
    transition: border-color 0.15s ease, background-color 0.15s ease;
}

.field__input::placeholder {
    color: var(--color-text-dim);
}

.field__input:hover {
    border-color: var(--color-field-border-hover);
}

.field__input:focus-visible {
    outline: 2px solid var(--color-focus-outline);
    outline-offset: 2px;
}

.field__input:disabled {
    opacity: 0.45;
    cursor: not-allowed;
    background-color: var(--color-surface);
}

/* Dashed border signals "visible but not editable" — the value remains
   focusable and selectable, unlike a disabled control. */
.field__input[readonly] {
    border-style: dashed;
    color: var(--color-text-muted);
}

/* Multi-line text areas share the control styles via the same element class
   plus this modifier: taller minimum, comfortable leading, and a
   vertical-only resize grip (horizontal resize would break the column). */
.field__input--multiline {
    min-height: 9rem;
    padding: 0.75rem 1rem;
    line-height: 1.6;
    resize: vertical;
}

.field__hint {
    font-size: var(--text-sm);
    color: var(--color-text-muted);
    line-height: var(--leading-normal);
    margin: 0;
}

.field__error {
    font-size: var(--text-sm);
    font-weight: var(--weight-semibold);
    color: var(--color-error);
    line-height: var(--leading-normal);
    margin: 0;
}

.field--error .field__input {
    border-color: var(--color-field-border-error);
    /* Error takes precedence over readonly's dashed affordance. */
    border-style: solid;
}

/* -----------------------------------------------------------------------------
    Copy field — read-only value with a copy action

    The display primitive for any value someone might want to copy verbatim
    (a one-time secret, a URL, an id). The value is a read-only <input> in the
    mono face on the deepest well ground, joined edge-to-edge with the copy
    button. Progressive: without JavaScript the value is selectable and
    copyable by hand; the delegated script in site.js
    (data-js-behavior="copy-field" + data-copy-target) adds click-to-select,
    one-click clipboard writes, and status feedback.

    Expected structure:
        .copy-field
          .copy-field__label
          .copy-field__row
            .copy-field__value
            .copy-field__button
              .copy-field__icon
          .copy-field__status
----------------------------------------------------------------------------- */

.copy-field {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.copy-field__label {
    font-family: var(--font-display);
    font-size: var(--text-label);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-label);
    text-transform: uppercase;
    color: var(--color-text-muted);
}

.copy-field__row {
    display: flex;
    align-items: stretch;
}

.copy-field__value {
    flex: 1;
    min-width: 0;
    font-family: var(--font-mono);
    font-size: 0.85rem;
    color: var(--color-text-muted);
    background-color: var(--color-surface-well);
    border: var(--field-border-width) solid var(--color-field-border);
    /* Joined edge — the button supplies the right border of the pair. */
    border-right: none;
    border-radius: var(--radius-sm);
    appearance: none;
    padding: 0.6rem 1rem;
    min-height: 2.75rem;
    white-space: nowrap;
    overflow-x: auto;
}

.copy-field__value:focus-visible {
    outline: 2px solid var(--color-focus-outline);
    outline-offset: 2px;
}

.copy-field__button {
    font-family: var(--font-display);
    font-size: var(--text-label);
    font-weight: var(--weight-bold);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--color-text-muted);
    background-color: var(--color-surface-card);
    border: var(--field-border-width) solid var(--color-field-border);
    border-radius: var(--radius-sm);
    padding: 0 1.1rem;
    cursor: pointer;
    flex-shrink: 0;
    transition: color 0.15s ease, border-color 0.15s ease;
}

.copy-field__button:hover {
    color: var(--color-primary);
    border-color: var(--color-primary);
}

.copy-field__button:focus-visible {
    outline: 2px solid var(--color-focus-outline);
    outline-offset: 2px;
}

.copy-field__icon {
    font-size: 1.05em;
    font-style: normal;
}

.copy-field__status {
    /* Reserve space so status text appearing or clearing does not shift
       layout. */
    min-height: 1em;
    font-size: var(--text-sm);
    line-height: var(--leading-normal);
    color: var(--color-text-muted);
}

