/* =====================================================================
   Golf Groupies - Unified Theme
   All visuals (turf, flags, greens, textures) are pure CSS/SVG:
   no external image files required.
   ===================================================================== */

:root {
    --masters-green: #006747;
    --masters-green-dark: #004d34;
    --fairway-green: #2c5f2d;
    --rough-green: #3f7d3f;
    --sand-trap: #E1D5B8;
    --sand-trap-light: #f0e9d8;
    --flag-red: #D22730;
    --flag-red-dark: #a81f26;
    --clubhouse-wood: #4A3C31;
    --clubhouse-wood-light: #6b5847;
    --sky-blue: #cfe8f3;
    --gold: #c8a951;
    /* Hover/active shades of --gold, see the unified Buttons section
       below, where every button on the site (whatever its original
       Bootstrap variant) renders in these same three tones. */
    --gold-light: #d9c385;
    --gold-dark: #8c7639;
    --white: #ffffff;

    /* Team 2's color: a muted, deepened "water hazard" blue, picked to sit
       comfortably next to the masters green and gold rather than Bootstrap's
       bright default blue, which was the one un-themed color on the site. */
    --team2-blue: #2E5F7A;
    --team2-blue-dark: #234A61;

    /* Sage/moss green: the Group tile background (see .group-tile below),
       picked to sit quietly behind the site's gold buttons instead of
       fighting them the way the old sky-blue tint did. */
    --sage: #8A9A6E;
    --sage-light: #E7EBDD;
    --sage-dark: #5C6B45;

    --radius-md: 10px;
    --radius-lg: 16px;
    --shadow-soft: 0 4px 14px rgba(0, 0, 0, 0.10);
    --shadow-hover: 0 8px 22px rgba(0, 0, 0, 0.16);

    /* Shared status pair (background/text) for the four "where things
       stand" states repeated across .tile-flag, .status-*, and .state-badge
       below (code review, 2026-09-09): the same four hex pairs were
       hardcoded three separate times, so a future edit to one green badge
       could silently drift from the other two. One definition here means
       all three now visually move together by construction. */
    --status-good-bg: #d4edda;
    --status-good-text: #155724;
    --status-pending-bg: #fff3cd;
    --status-pending-text: #856404;
    --status-bad-bg: #f8d7da;
    --status-bad-text: #721c24;
    --status-neutral-bg: #e2e3e5;
    --status-neutral-text: #383d41;
}

/* ---------------------------------------------------------------------
   Base
   --------------------------------------------------------------------- */
body {
    background-color: var(--sand-trap-light);
    background-image:
        radial-gradient(circle at 15% 10%, rgba(0, 103, 71, 0.05) 0, transparent 45%),
        radial-gradient(circle at 85% 90%, rgba(0, 103, 71, 0.06) 0, transparent 40%);
    background-attachment: fixed;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    color: var(--clubhouse-wood);
}

/* The sticky-footer layout has to live on the <form> tag, not body: body's
   only direct child is ASP.NET's <form id="form1">, and nav/main/footer are
   children of THAT, not of body, so display:flex on body alone never
   reaches them. */
body > form {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

h1, h2, h3, h4, h5 {
    color: var(--masters-green-dark);
    font-weight: 700;
}

a {
    color: var(--masters-green);
}
a:hover {
    color: var(--masters-green-dark);
}

/* Frosted "clubhouse card" used across all forms and panels */
.bg-white {
    background-color: var(--white) !important;
}
.rounded, .card, .bg-white.rounded {
    border-radius: var(--radius-lg) !important;
}
.shadow, .card.shadow {
    box-shadow: var(--shadow-soft) !important;
}

/* ---------------------------------------------------------------------
   Navbar - mowed-fairway stripe effect
   --------------------------------------------------------------------- */
.navbar-golf {
    background-color: var(--masters-green);
    background-image: repeating-linear-gradient(
        110deg,
        rgba(255, 255, 255, 0.05) 0px,
        rgba(255, 255, 255, 0.05) 40px,
        rgba(0, 0, 0, 0.04) 40px,
        rgba(0, 0, 0, 0.04) 80px
    );
    border-bottom: 4px solid var(--clubhouse-wood);
}
.navbar-golf .navbar-brand {
    font-weight: 700;
    letter-spacing: .3px;
    white-space: nowrap;
}
.navbar-golf .nav-link {
    position: relative;
    transition: color .15s ease;
    white-space: nowrap;
}
.navbar-golf .nav-link.active,
.navbar-golf .nav-link:hover {
    color: var(--gold) !important;
}
.navbar-golf .nav-link.active::after {
    content: "";
    position: absolute;
    left: 8px; right: 8px; bottom: 2px;
    height: 2px;
    background: var(--gold);
    border-radius: 2px;
}
/* The account menu toggle uses ::after for Bootstrap's caret, so on
   Profile.aspx it keeps the caret (in gold) instead of the underline bar. */
.navbar-golf .nav-link.dropdown-toggle.active::after {
    position: static;
    height: 0;
    background: none;
    border-radius: 0;
}

/* Page help link in the top right of each interior hero banner. Opens
   the FAQ answer for that page. Floated so a long title wraps around it
   on a phone instead of running underneath it. */
.hero-help {
    float: right;
    position: relative;
    z-index: 1;
    margin: -10px -8px 0 10px;
    padding: 3px 10px;
    border-radius: 999px;
    background-color: rgba(255, 255, 255, .15);
    color: var(--white);
    font-size: .85rem;
    text-decoration: none;
    white-space: nowrap;
}
.hero-help:hover,
.hero-help:focus {
    background-color: rgba(255, 255, 255, .28);
    color: var(--white);
}

/* Unread-messages dot on the Matches/Groups nav links (review item 26).
   Gold to match the site's own "something needs your attention" color
   (same family as .nav-link.active::after above), small and inline so it
   never pushes the nav layout around. */
.nav-unread-badge {
    display: inline-block;
    width: 8px;
    height: 8px;
    margin-left: 5px;
    margin-bottom: 2px;
    border-radius: 50%;
    background: var(--gold);
    vertical-align: middle;
}
/* The same dot on the phone menu button, at its top right corner. */
.navbar-toggler-dot {
    position: absolute;
    top: 4px;
    right: 4px;
    width: 10px;
    height: 10px;
    margin: 0;
    box-shadow: 0 0 0 2px var(--masters-green);
}

/* ---------------------------------------------------------------------
   Hero banner - used at the top of interior pages
   --------------------------------------------------------------------- */
.hero-golf {
    position: relative;
    border-radius: var(--radius-lg);
    overflow: hidden;
    color: var(--white);
    padding: 28px 24px;
    margin-bottom: 24px;
    background: linear-gradient(135deg, var(--masters-green) 0%, var(--fairway-green) 55%, var(--rough-green) 100%);
    box-shadow: var(--shadow-soft);
}
.hero-golf::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image: repeating-radial-gradient(circle at 20% 30%, rgba(255,255,255,0.06) 0, rgba(255,255,255,0.06) 2px, transparent 2px, transparent 22px);
    opacity: .6;
    pointer-events: none;
}
.hero-golf h1, .hero-golf h2 {
    color: var(--white);
    margin-bottom: 4px;
}
.hero-golf p {
    color: rgba(255,255,255,0.9);
    margin-bottom: 0;
}
.hero-flag {
    position: absolute;
    right: 20px;
    top: 50%;
    transform: translateY(-50%);
    width: 46px;
    height: 70px;
    opacity: .9;
}

/* Home page hero banner (Default.aspx), same dark-green gradient
   treatment as the interior-page .hero-golf banner, so the home page
   opens with the same look as the rest of the site. */
.hero-home {
    position: relative;
    border-radius: var(--radius-lg);
    overflow: hidden;
    padding: 40px 24px 32px;
    margin-bottom: 24px;
    text-align: center;
    color: var(--white);
    background: linear-gradient(135deg, var(--masters-green) 0%, var(--fairway-green) 55%, var(--rough-green) 100%);
    box-shadow: var(--shadow-soft);
}
.hero-home::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image: repeating-radial-gradient(circle at 20% 30%, rgba(255,255,255,0.06) 0, rgba(255,255,255,0.06) 2px, transparent 2px, transparent 22px);
    opacity: .6;
    pointer-events: none;
}
.hero-home > * {
    position: relative;
}

/* Home page hero heading (Default.aspx), text-color only, so it reads
   against its dark background without touching anything else on the page.
   !important guards against the global "h1, h2, h3, h4, h5" dark-green
   rule earlier in this file, which was winning out over the plain version
   of this override. */
.hero-home h1 {
    color: var(--white) !important;
}
.hero-home .hero-sub {
    color: rgba(255, 255, 255, 0.92);
    max-width: 640px;
    margin: 0 auto 14px;
}
.hero-home .hero-quip {
    display: inline-block;
    color: rgba(255, 255, 255, 0.85);
    font-style: italic;
    margin-bottom: 22px;
}

/* Hero call-to-action buttons (Default.aspx) */
.cta-row {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
}
.btn-hero, .btn-hero-ghost {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background-color: var(--gold);
    border: 2px solid var(--gold);
    color: #3a2f10;
    font-weight: 700;
    padding: 12px 22px;
    border-radius: 30px;
    text-decoration: none;
    box-shadow: var(--shadow-soft);
    transition: transform .15s ease, box-shadow .15s ease, background-color .15s ease, border-color .15s ease;
}
.btn-hero:hover, .btn-hero:focus, .btn-hero-ghost:hover, .btn-hero-ghost:focus {
    background-color: var(--gold-light);
    border-color: var(--gold-light);
    color: #3a2f10;
    transform: translateY(-2px);
    box-shadow: var(--shadow-hover);
}
.btn-hero:active, .btn-hero-ghost:active {
    background-color: var(--gold-dark);
    border-color: var(--gold-dark);
    color: #3a2f10;
    transform: translateY(0);
}

/* ---------------------------------------------------------------------
   FAQ.aspx, a Bootstrap accordion, re-themed to match the site's palette
   instead of Bootstrap's default blue/grey.
   --------------------------------------------------------------------- */
.hero-faq {
    padding-bottom: 24px;
}
/* Section jump links under the FAQ banner. */
.faq-jump {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 8px;
    margin: 16px 0 4px;
}
.faq-jump a {
    padding: 4px 12px;
    border: 1px solid var(--sand-trap);
    border-radius: 999px;
    background-color: var(--white);
    color: var(--masters-green-dark);
    font-size: .85rem;
    text-decoration: none;
}
.faq-jump a:hover,
.faq-jump a:focus {
    border-color: var(--gold);
}
.faq-section {
    scroll-margin-top: 12px;
}
.faq-accordion .accordion-item {
    background-color: var(--white);
    border: 1px solid var(--sand-trap);
    border-radius: var(--radius-md);
    overflow: hidden;
    margin-bottom: 10px;
}
.faq-accordion .accordion-button {
    font-weight: 600;
    color: var(--masters-green-dark);
    background-color: var(--white);
}
.faq-accordion .accordion-button:not(.collapsed) {
    color: var(--masters-green-dark);
    background-color: var(--sage-light);
    box-shadow: none;
}
.faq-accordion .accordion-button:focus {
    box-shadow: 0 0 0 3px rgba(200, 169, 81, 0.35);
    border-color: var(--gold);
}
.faq-accordion .accordion-body {
    color: var(--clubhouse-wood-light);
}

/* ---------------------------------------------------------------------
   Home page content sections (Default.aspx), perk cards, the round-by-
   round steps, and the role cards below the hero.
   --------------------------------------------------------------------- */
.perk-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 18px;
    margin-bottom: 8px;
}
.perk-card {
    background-color: var(--white);
    border: 1px solid var(--sand-trap);
    border-radius: var(--radius-lg);
    padding: 22px 18px;
    text-align: center;
    box-shadow: var(--shadow-soft);
    transition: box-shadow .15s ease, transform .15s ease;
}
.perk-card:hover {
    box-shadow: var(--shadow-hover);
    transform: translateY(-3px);
}
/* Was an <h5>; now a real <h3> so the page reads h1 -> h2 (section) -> h3
   (card) with no skipped level. font-size is set explicitly here so the
   card heading still renders at the old h5 size instead of picking up
   h3's larger browser default. */
.perk-card h3 {
    margin: 10px 0 8px;
    font-size: .83rem;
}
.perk-card p {
    color: var(--clubhouse-wood-light);
    font-size: .92rem;
    margin-bottom: 0;
}
.perk-icon {
    font-size: 2rem;
    line-height: 1;
}

.flow-track {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
    gap: 16px;
    margin-bottom: 8px;
}
.flow-step {
    background-color: var(--white);
    border-top: 3px solid var(--masters-green);
    border-radius: var(--radius-md);
    padding: 20px 16px 16px;
    text-align: center;
    box-shadow: var(--shadow-soft);
}
.flow-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    background-color: var(--masters-green);
    color: var(--white);
    font-weight: 700;
    margin-bottom: 10px;
}
/* Was an <h6>; now a real <h3> for the same outline reason as
   .perk-card h3 above. font-size pinned to the old h6 default so the
   step title doesn't grow to h3's default size. */
.flow-step h3 {
    color: var(--masters-green-dark);
    font-weight: 700;
    margin-bottom: 6px;
    font-size: .67rem;
}
.flow-step p {
    font-size: .85rem;
    color: var(--clubhouse-wood-light);
    margin-bottom: 8px;
}
.flow-where {
    display: inline-block;
    background-color: var(--sand-trap-light);
    color: var(--masters-green-dark);
    font-size: .72rem;
    font-weight: 600;
    padding: 3px 10px;
    border-radius: 20px;
}

.role-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
    gap: 18px;
    margin-bottom: 8px;
}
.role-card {
    background-color: var(--white);
    border-top: 4px solid var(--sand-trap);
    border-radius: var(--radius-lg);
    padding: 22px 20px;
    box-shadow: var(--shadow-soft);
    transition: box-shadow .15s ease, transform .15s ease;
}
.role-card:hover {
    box-shadow: var(--shadow-hover);
    transform: translateY(-3px);
}
/* Was an <h5>; now a real <h3>, same reasoning as .perk-card h3 above. */
.role-card h3 {
    margin-bottom: 4px;
    font-size: .83rem;
}
.role-card p {
    color: var(--clubhouse-wood-light);
    font-size: .9rem;
}
.role-card ul {
    padding-left: 20px;
    margin-bottom: 0;
    font-size: .88rem;
    color: var(--clubhouse-wood);
}
.role-card ul li {
    margin-bottom: 4px;
}
.role-scope {
    display: inline-block;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--masters-green-dark);
    margin-bottom: 8px;
}
.role-card.is-player { border-top-color: var(--masters-green); }
.role-card.is-commish { border-top-color: var(--gold); }
.role-card.is-captain { border-top-color: var(--flag-red); }
.role-card.is-manager { border-top-color: var(--clubhouse-wood); }

/* ---------------------------------------------------------------------
   Footer
   --------------------------------------------------------------------- */
.footer-golf {
    background-color: var(--clubhouse-wood);
    background-image: linear-gradient(180deg, rgba(255,255,255,0.03), transparent);
    color: var(--sand-trap);
    margin-top: auto;
    padding: 20px 0;
    text-align: center;
    border-top: 4px solid var(--masters-green);
}

/* ---------------------------------------------------------------------
   Buttons. Three kinds, so the main action on any screen stands out:

   1. Main action (solid gold): .btn-success, .btn-primary, .btn-warning,
      .btn-secondary. Save, Post, End Match, Log in and so on.
   2. Secondary action (gold outline, clear inside): every .btn-outline-*
      except danger. Cancel, Not now, Edit setup, Open Match and so on.
      Fills with gold on hover, so it still reads as the same family.
   3. Destructive action (red): .btn-danger solid, .btn-outline-danger
      outlined. Stays red on hover and press, so the warning never
      disappears right as someone goes to click.

   .btn-link stays a plain text link. Set through Bootstrap's own button
   variables, so hover, pressed, focus and disabled all follow without
   separate rules. Team 2's blue (--team2-blue) on .bg-primary,
   .border-primary and .text-primary below styles Team 2's card, not a
   button, so Team 1 and Team 2 stay visually distinct.
   --------------------------------------------------------------------- */
.btn-success, .btn-primary, .btn-warning, .btn-secondary {
    --bs-btn-color: #3a2f10;
    --bs-btn-bg: var(--gold);
    --bs-btn-border-color: var(--gold);
    --bs-btn-hover-color: #3a2f10;
    --bs-btn-hover-bg: var(--gold-light);
    --bs-btn-hover-border-color: var(--gold-light);
    --bs-btn-active-color: #3a2f10;
    --bs-btn-active-bg: var(--gold-dark);
    --bs-btn-active-border-color: var(--gold-dark);
    --bs-btn-disabled-color: #3a2f10;
    --bs-btn-disabled-bg: var(--gold);
    --bs-btn-disabled-border-color: var(--gold);
    --bs-btn-focus-shadow-rgb: 200, 169, 81;
}
.btn-outline-success, .btn-outline-primary, .btn-outline-secondary,
.btn-outline-warning, .btn-outline-dark {
    --bs-btn-color: #3a2f10;
    --bs-btn-bg: transparent;
    --bs-btn-border-color: var(--gold-dark);
    --bs-btn-hover-color: #3a2f10;
    --bs-btn-hover-bg: var(--gold-light);
    --bs-btn-hover-border-color: var(--gold);
    --bs-btn-active-color: #3a2f10;
    --bs-btn-active-bg: var(--gold-dark);
    --bs-btn-active-border-color: var(--gold-dark);
    --bs-btn-disabled-color: #3a2f10;
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: var(--gold-dark);
    --bs-btn-focus-shadow-rgb: 200, 169, 81;
}
/* On a dark green tile (Groups.aspx's group selector): white outline. */
.btn-outline-light {
    --bs-btn-color: var(--white);
    --bs-btn-bg: transparent;
    --bs-btn-border-color: var(--white);
    --bs-btn-hover-color: #3a2f10;
    --bs-btn-hover-bg: var(--gold-light);
    --bs-btn-hover-border-color: var(--gold-light);
    --bs-btn-active-color: #3a2f10;
    --bs-btn-active-bg: var(--gold-dark);
    --bs-btn-active-border-color: var(--gold-dark);
    --bs-btn-focus-shadow-rgb: 200, 169, 81;
}
.btn-danger {
    --bs-btn-color: var(--white);
    --bs-btn-bg: var(--flag-red);
    --bs-btn-border-color: var(--flag-red);
    --bs-btn-hover-color: var(--white);
    --bs-btn-hover-bg: var(--flag-red-dark);
    --bs-btn-hover-border-color: var(--flag-red-dark);
    --bs-btn-active-color: var(--white);
    --bs-btn-active-bg: #861920;
    --bs-btn-active-border-color: #861920;
    --bs-btn-disabled-color: var(--white);
    --bs-btn-disabled-bg: var(--flag-red);
    --bs-btn-disabled-border-color: var(--flag-red);
    --bs-btn-focus-shadow-rgb: 210, 39, 48;
}
.btn-outline-danger {
    --bs-btn-color: var(--flag-red);
    --bs-btn-bg: transparent;
    --bs-btn-border-color: var(--flag-red);
    --bs-btn-hover-color: var(--white);
    --bs-btn-hover-bg: var(--flag-red);
    --bs-btn-hover-border-color: var(--flag-red);
    --bs-btn-active-color: var(--white);
    --bs-btn-active-bg: var(--flag-red-dark);
    --bs-btn-active-border-color: var(--flag-red-dark);
    --bs-btn-disabled-color: var(--flag-red);
    --bs-btn-disabled-bg: transparent;
    --bs-btn-disabled-border-color: var(--flag-red);
    --bs-btn-focus-shadow-rgb: 210, 39, 48;
}
.btn-link {
    --bs-btn-color: var(--masters-green);
    --bs-btn-hover-color: var(--masters-green-dark);
    --bs-btn-active-color: var(--masters-green-dark);
}
/* Who won the hole (Match.aspx): the big taps on the course, so every
   choice is a solid main action button even though the markup uses the
   outline classes. */
.btn.hole-result-btn {
    --bs-btn-color: #3a2f10;
    --bs-btn-bg: var(--gold);
    --bs-btn-border-color: var(--gold);
    --bs-btn-hover-color: #3a2f10;
    --bs-btn-hover-bg: var(--gold-light);
    --bs-btn-hover-border-color: var(--gold-light);
    --bs-btn-active-color: #3a2f10;
    --bs-btn-active-bg: var(--gold-dark);
    --bs-btn-active-border-color: var(--gold-dark);
}

/* Team 2 / secondary actions, the site's one deliberately-picked blue,
   in place of Bootstrap's default #0d6efd. Buttons above are all gold
   now, so this is just Team 2's card header/border/text tint. */
.bg-primary {
    background-color: var(--team2-blue) !important;
}
.border-primary {
    border-color: var(--team2-blue) !important;
}
.text-primary {
    color: var(--team2-blue) !important;
}

/* Themed alternative to Bootstrap's plain bg-dark, for card headers that
   want a dark treatment (chat, roster lists), ties back to the same
   clubhouse-wood brown already used for the footer, instead of a fourth,
   off-palette near-black. */
.bg-clubhouse {
    background-color: var(--clubhouse-wood) !important;
}

/* Alerts, tinted toward the theme instead of stock Bootstrap yellow/
   red/green/gray, to match the level of care already given to buttons,
   badges, and cards. */
.alert-success {
    background-color: #e3f1e8;
    border-color: #bfe0cc;
    color: var(--masters-green-dark);
}
.alert-danger {
    background-color: #fbe7e5;
    border-color: #f0c4c0;
    color: var(--flag-red-dark);
}
.alert-warning {
    background-color: var(--sand-trap-light);
    border-color: var(--sand-trap);
    color: #7a5f1f;
}
.alert-secondary {
    background-color: #eceae5;
    border-color: var(--sand-trap);
    color: var(--clubhouse-wood-light);
}

/* ---------------------------------------------------------------------
   Calendar & Status Styling
   --------------------------------------------------------------------- */
.calendar-day {
    background-color: #fff;
    border: 1px solid var(--masters-green);
    border-radius: var(--radius-md);
    padding: 10px 12px 12px;
    margin: 6px;
    display: inline-block;
    width: 170px;
    vertical-align: top;
    text-align: center;
    box-shadow: var(--shadow-soft);
    transition: box-shadow .15s ease, transform .15s ease;
}
.calendar-day:hover {
    box-shadow: var(--shadow-hover);
    transform: translateY(-2px);
}
.calendar-day.is-today {
    border: 2px solid var(--gold);
    background-color: #fffdf5;
}
.calendar-day .day-summary {
    font-size: .75rem;
    color: var(--clubhouse-wood-light);
    margin: 2px 0 6px;
}

/* Calendar day tiles are now <a> links to that date's Matches page,
   neutralize default link styling so they still look like plain cards. */
a.calendar-day, a.calendar-day:hover, a.calendar-day:visited {
    text-decoration: none;
    color: inherit;
    cursor: pointer;
}

/* Tile heading: the date, then its status flag (Set / Live / Ended /
   Today, plus any "x2" marker) centered on its own line below, so every
   line of the tile lines up down the middle. The gap keeps the date and
   flag from running together ("09-03-2026Set"). */
.tile-head {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    margin-bottom: 2px;
}
.tile-badges {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.tile-flag {
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    border-radius: 20px;
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .02em;
    white-space: nowrap;
}
.tile-flag.ready { background-color: var(--status-good-bg); color: var(--status-good-text); }
.tile-flag.live { background-color: var(--status-pending-bg); color: var(--status-pending-text); }
.tile-flag.ended { background-color: var(--status-bad-bg); color: var(--status-bad-text); }
/* In Progress on a past date: the round is over but nobody ended the
   match, so it's no longer Live (see MatchHelper.IsLeftOpen). */
.tile-flag.open { background-color: var(--status-neutral-bg); color: var(--status-neutral-text); }

/* "x2" marker next to a tile's status flag when a date has more than one
   match (Calendar.aspx's Tile()), the tile itself is too narrow to name
   each match, this just flags that there's more than the single badge/
   name line can show. Never rendered on a single-match day. */
.tile-match-count {
    display: inline-flex;
    align-items: center;
    padding: 2px 6px;
    border-radius: 20px;
    font-size: .68rem;
    font-weight: 700;
    background-color: var(--sand-trap-light);
    color: var(--clubhouse-wood);
}

.player-name {
    cursor: pointer;
    font-weight: 600;
    display: block;
    margin: 3px 0;
    padding: 4px 6px;
    border-radius: var(--radius-md);
    text-decoration: none;
    font-size: .85rem;
}

.status-in { background-color: var(--status-good-bg); color: var(--status-good-text); }
.status-out { background-color: var(--status-bad-bg); color: var(--status-bad-text); }
.status-maybe { background-color: var(--status-pending-bg); color: var(--status-pending-text); }
.status-placeholder { background-color: var(--status-neutral-bg); color: var(--status-neutral-text); }

/* Status radio "pills" on the Calendar page, reuse the status-* background
   colors above, just add clickable-chip layout on top. Placeholder is hidden
   for most groups (Groups.aspx's "Enable 'Placeholder' option" setting), so
   the row is a flex layout that splits evenly across whatever pills are
   actually visible: three wide "In / Out / Maybe" pills by default, four
   narrower ones for a group that has turned Placeholder on. */
.status-pill-row {
    display: flex;
    gap: 8px;
}
.status-radio-label {
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    font-weight: 600;
    padding: 8px 14px;
    font-size: .9rem;
    flex: 1 1 0;
}
.status-radio-label input[type="radio"] {
    margin: 0;
    cursor: pointer;
}
/* Once a status is saved, that pill stands out and the others step back,
   so it's obvious at a glance which answer is on file. With no answer yet
   (nothing checked) all three stay at full strength. */
.status-pill-row:has(input:checked) .status-radio-label {
    opacity: .7;
}
.status-pill-row .status-radio-label:has(input:checked) {
    opacity: 1;
    box-shadow: 0 0 0 3px var(--clubhouse-wood);
}

.status-legend .badge {
    font-weight: 500;
    padding: 6px 10px;
    margin-right: 6px;
}

/* Handicap index badge, deliberately tiny: just the number, no label */
/* A 1px border keeps this pill visible no matter what it's sitting on,
   without it, the old sky blue fill vanished into the group tiles once those
   picked up the same sky blue background, since the pill had no edge of
   its own to separate it from the surface behind it. The fill is now a
   deeper blue (dark enough for white text, same as every lifecycle stage
   below), and the darker blue border still frames it. The border also
   nudges the padding out half a pixel so the pill's overall size doesn't
   visibly shrink now that part of it is a stroke instead of pure fill. */
.badge-index {
    background-color: #2b7bb9;
    color: var(--white);
    border: 1px solid #1f6396;
    font-weight: 600;
    border-radius: 20px;
    padding: 1px 5px;
    font-size: .7rem;
}

/* Index pill lifecycle (GroupHelper.IndexStageCss), one step a week like a
   flower: fresh bright green (0 to 7 days since an update), yellow green (8
   to 14), olive (15 to 21), brown (22 to 28), black (29 to 35), then bright
   red with a "!" (36 and up). Each step is darker than the one before, so
   the order still reads without telling green from brown. Every pill uses
   white text, so each fill is dark enough to keep it readable. Guests keep
   the plain blue badge-index above. Team totals take their stalest
   member's color, locked once scoring starts (GroupHelper.
   TeamIndexStageCss). FAQ.aspx shows these
   same classes as its color key. */
.badge-index.index-stage-fresh {
    background-color: #16a34a;
    color: var(--white);
    border-color: #128a3e;
}
.badge-index.index-stage-green {
    background-color: #5e8c1e;
    color: var(--white);
    border-color: #4b7018;
}
.badge-index.index-stage-olive {
    background-color: #545f1e;
    color: var(--white);
    border-color: #424b17;
}
.badge-index.index-stage-brown {
    background-color: #5c3714;
    color: var(--white);
    border-color: #472a0f;
}
.badge-index.index-stage-black {
    background-color: #111;
    color: var(--white);
    border-color: #111;
}
.badge-index.index-stage-red {
    background-color: #e3141e;
    color: var(--white);
    border-color: #b30f17;
}
/* The "!" means the pill isn't relying on red alone to say "overdue". */
.badge-index.index-stage-red::after {
    content: "!";
    margin-left: 3px;
    font-weight: 800;
}

/* Index reminder popup (Site.master): the current pill shown big enough
   to read its color at a glance. */
.index-prompt-pill {
    font-size: .95rem;
    padding: 2px 10px;
}

/* FAQ color key (FAQ.aspx): one row per lifecycle stage. */
.index-stage-key {
    list-style: none;
    padding-left: 0;
    margin-bottom: 1rem;
}
.index-stage-key li {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .3rem 0;
}
.index-stage-key .badge-index {
    min-width: 3.6rem;
    text-align: center;
    font-size: .85rem;
}

/* ---------------------------------------------------------------------
   Draft board
   --------------------------------------------------------------------- */
.draft-list .list-group-item {
    transition: background-color .15s ease;
}
.draft-list .list-group-item:hover {
    background-color: var(--sand-trap-light);
}
.captain-star {
    color: var(--gold);
}

/* One small "Tn" draft button per team (Draft.aspx's available-players
   list), each colored via inline style from that team's own entry in
   MatchHelper.TeamColors, since there can be any number of teams, not
   just the two Bootstrap variant classes used to cover. */
.draft-team-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}
.draft-team-btn {
    font-weight: 700;
    min-width: 40px;
    line-height: 1.2;
}
/* Filled in the team's color (inline style), so hover just dims it a
   touch instead of Bootstrap's outline swap. */
.draft-team-btn:hover,
.draft-team-btn:focus {
    filter: brightness(1.12);
}

/* Match switcher (Draft.aspx), the tab strip a Commissioner sees once
   a day has more than one match (MatchHelper.MatchesForDate), plus the
   "Build Another Match" button that creates the second one. A day with
   only one match renders none of this, so no new styling is ever seen
   by a regular player, see Draft.aspx's Load(). */
.match-switcher-bar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 1rem;
}
.match-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.match-tab-item {
    display: flex;
    align-items: center;
    gap: 2px;
}
.match-tab {
    display: inline-block;
    padding: 6px 14px;
    border-radius: 20px;
    border: 1px solid var(--masters-green);
    color: var(--masters-green-dark);
    background-color: var(--white);
    font-weight: 600;
    font-size: .85rem;
    text-decoration: none;
    transition: background-color .15s ease, color .15s ease;
}
.match-tab:hover {
    background-color: var(--sand-trap-light);
    text-decoration: none;
    color: var(--masters-green-dark);
}
.match-tab-active {
    background-color: var(--masters-green);
    color: var(--white);
    border-color: var(--masters-green);
}
.match-tab-edit-row {
    display: flex;
    align-items: center;
    gap: 4px;
}
.match-tab-edit-row .form-control {
    max-width: 140px;
}

/* ---------------------------------------------------------------------
   Chat box
   --------------------------------------------------------------------- */
.chat-box {
    height: 300px;
    overflow-y: auto;
    background-color: #fff;
    border: 1px solid var(--sand-trap);
    padding: 10px;
}
.chat-box::-webkit-scrollbar {
    width: 8px;
}
.chat-box::-webkit-scrollbar-thumb {
    background-color: var(--masters-green);
    border-radius: 8px;
}

/* Moderator-only delete link on a chat/message-board row (review item 10).
   Muted by default so it doesn't compete with the message text itself,
   most viewers never see it at all, since it's only rendered server-side
   for a Manager/Commissioner/Admin in the first place. */
.chat-delete-link {
    color: var(--sand-trap);
    text-decoration: none;
    margin-left: 4px;
    opacity: 0.7;
}
.chat-delete-link:hover {
    color: #b3261e;
    opacity: 1;
}

/* Emoji reaction pills under a chat message (BuildChat's ReactionBarHtml /
   Scripts/live-updates.js's buildReactionBar). Every palette emoji is
   always rendered so there's something to tap to add a first reaction;
   an unused one stays faint until hovered, same muted-until-relevant
   treatment as .chat-delete-link above. A pill with a count, or one this
   viewer has reacted with, is fully opaque so it reads at a glance. */
.chat-reactions {
    margin-top: 2px;
}
.reaction-pill {
    display: inline-block;
    text-decoration: none;
    font-size: 0.85rem;
    line-height: 1.4;
    padding: 0 5px;
    margin-right: 3px;
    border-radius: 10px;
    opacity: 0.35;
}
.reaction-pill:hover {
    opacity: 1;
    background-color: rgba(0, 0, 0, 0.06);
}
.reaction-pill.active {
    opacity: 1;
    background-color: rgba(30, 90, 50, 0.12);
}

/* "Make Commissioner" link on the Sign-ups In row (review item 24).
   Same muted-until-hovered treatment as .chat-delete-link above, since
   it's the same idea: a small, easy-to-ignore action next to a name that
   only a Manager/Commissioner/Admin ever sees rendered at all. */
.make-commissioner-link {
    color: var(--sand-trap);
    text-decoration: none;
    margin-left: 4px;
    opacity: 0.7;
}
.make-commissioner-link:hover {
    color: var(--masters-green);
    opacity: 1;
}

/* ---------------------------------------------------------------------
   Scoreboard: traditional golf scorecard coloring. Medal play: a score
   under par (negative, e.g. -5) is red, the universal "good score"
   convention; at or over par is black. Match play's headline figure has
   no under/over par concept, so it always uses the red class regardless
   of who's ahead (see ScoringHelper.MatchPlayScoreCss).
   --------------------------------------------------------------------- */
.scoreboard-under-par { color: var(--flag-red); font-weight: 700; }
.scoreboard-black { color: #000; font-weight: 700; }

/* ---------------------------------------------------------------------
   Hole-by-hole score entry (Match.aspx), one small stepper card per
   hole: a minus/even/plus button row under the current score. Every tap
   posts back and saves immediately, so there's no separate "Save Card"
   step and no risk of losing a half-typed row. A posted hole's tile goes
   a shade darker so it's obvious at a glance which holes are already in.
   --------------------------------------------------------------------- */
.scorecard-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
    gap: 10px;
}
.hole-cell {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
    background-color: var(--sand-trap-light);
    border-radius: var(--radius-lg);
    padding: 10px 6px;
    text-align: center;
    transition: background-color .15s ease;
}
.hole-cell.hole-posted {
    background-color: var(--sand-trap);
}
/* The first hole on the card with nothing posted yet (Match.aspx), so a
   player on the course can find where to tap at a glance. */
.hole-cell.hole-next {
    box-shadow: inset 0 0 0 2px var(--gold);
}
/* On the tile itself, not inside .hole-label, so the label's own text
   stays exactly "Hole N". */
.hole-cell.hole-next::before {
    content: "Up next";
    font-size: .65rem;
    font-weight: 600;
    line-height: 1;
    color: var(--clubhouse-wood);
}
/* Round progress bar (NextRoundHelper.RoundProgressHtml): Who's In, Setup,
   Teams, Play, Done for one date's match, on the Calendar day panel, Match
   and Teams. Finished steps are green with a check, the step the round is
   on is gold, later steps are plain. A thin line joins the dots. */
.round-progress {
    margin: 0 0 16px;
}
.round-steps {
    display: flex;
    list-style: none;
    margin: 0;
    padding: 0;
}
.round-step {
    flex: 1 1 0;
    position: relative;
    text-align: center;
    min-width: 0;
}
.round-step + .round-step::before {
    content: "";
    position: absolute;
    top: 13px;
    left: -50%;
    width: 100%;
    height: 2px;
    background-color: var(--sand-trap);
    z-index: 0;
}
.round-step.is-done + .round-step::before {
    background-color: var(--fairway-green);
}
.round-step a {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 3px;
    color: inherit;
    text-decoration: none;
}
.round-step-dot {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background-color: var(--white);
    border: 2px solid var(--sand-trap);
    color: var(--clubhouse-wood);
    font-size: .8rem;
    font-weight: 700;
}
.round-step-label {
    font-size: .75rem;
    color: var(--clubhouse-wood);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}
.round-step.is-done .round-step-dot {
    background-color: var(--fairway-green);
    border-color: var(--fairway-green);
    color: var(--white);
}
.round-step.is-current .round-step-dot {
    background-color: var(--gold);
    border-color: var(--gold);
    color: var(--white);
}
.round-step.is-current .round-step-label {
    font-weight: 700;
}
.round-step a:hover .round-step-dot,
.round-step a:focus .round-step-dot {
    box-shadow: 0 0 0 3px rgba(200, 169, 81, .35);
}

/* Registration.aspx without an invite link: two big choices, "Start a new
   group" and "Join friends", before the form appears. The radio itself is
   visually hidden; the whole card is the tap target. */
.signup-choice-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
}
@media (max-width: 400px) {
    .signup-choice-grid { grid-template-columns: 1fr; }
}
.signup-choice {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    padding: 14px 10px;
    border: 2px solid var(--sand-trap);
    border-radius: var(--radius-lg);
    background-color: var(--white);
    text-align: center;
    cursor: pointer;
}
.signup-choice input[type=radio] {
    position: absolute;
    opacity: 0;
    pointer-events: none;
}
.signup-choice-icon {
    font-size: 1.6rem;
    line-height: 1;
}
.signup-choice:hover,
.signup-choice:focus-within {
    border-color: var(--gold);
}
.signup-choice.is-selected {
    border-color: var(--fairway-green);
    background-color: var(--sand-trap-light);
}

/* Match Setup's "Start from a format" picker (Match.aspx), and the brief
   gold glow on each box it fills in, so the change is easy to spot. */
.setup-presets {
    background-color: var(--sand-trap-light);
    border-radius: var(--radius-md);
    padding: 10px 12px;
}
@keyframes setupFilled {
    from { box-shadow: 0 0 0 3px rgba(200, 169, 81, .6); }
    to { box-shadow: 0 0 0 0 rgba(200, 169, 81, 0); }
}
.setup-filled {
    animation: setupFilled 1.2s ease-out;
}

/* A tap saving in the background (Match.aspx's wireScoreTaps). */
.hole-cell.hole-saving {
    opacity: .6;
}
/* One score line in a hole tile: the score and its stepper. A Yellow Ball
   tile labels it, and a 2BB tile adds a second, Other Ball, line. */
.hole-line {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
}
.hole-line + .hole-line {
    margin-top: 4px;
    padding-top: 4px;
    border-top: 1px solid var(--sand-trap);
}
.hole-ball-label {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: .68rem;
    font-weight: 600;
    color: var(--clubhouse-wood-light);
}
/* A small yellow golf ball in front of the Yellow Ball label. */
.hole-ball-yellow::before {
    content: "";
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background-color: #fff04d;
    border: 1px solid #5a4500;
}
/* Yellow Ball's own section, at the bottom of the tile: mustard, so it
   stands apart from the Other Ball line above it, with its Lost toggle. */
.hole-line.hole-line-yellow {
    align-self: stretch;
    margin-top: 4px;
    padding: 6px 4px;
    border-top: 0;
    border-radius: var(--radius-md);
    background-color: #e1ad01;
}
.hole-line-yellow .hole-ball-label,
.hole-line-yellow .hole-score {
    color: #2e2305;
}
/* Yellow Ball's Lost toggle: plain until tapped, red once the penalty is on. */
.hole-lost-btn {
    margin-top: 4px;
    padding: 1px 8px;
    border-radius: 999px;
    font-size: .68rem;
    font-weight: 600;
    text-decoration: none;
    color: var(--clubhouse-wood-light);
    background-color: var(--white);
    box-shadow: var(--shadow-soft);
}
.hole-lost-btn:hover {
    color: var(--clubhouse-wood);
}
.hole-lost-btn.is-lost {
    color: var(--white);
    background-color: var(--flag-red);
}
.hole-lost-btn.is-lost:hover {
    color: var(--white);
    background-color: var(--flag-red-dark);
}
.hole-label {
    font-weight: 700;
    color: var(--masters-green-dark);
    font-size: .82rem;
}
.hole-score {
    min-width: 22px;
    font-weight: 700;
    font-size: 1.05rem;
    color: var(--clubhouse-wood);
    margin-bottom: 4px;
}
.hole-stepper {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
}
.icon-btn.icon-stepper {
    width: 22px;
    height: 22px;
    font-size: .82rem;
    background-color: var(--white);
    box-shadow: var(--shadow-soft);
}

/* ---------------------------------------------------------------------
   Match-play "who won the hole" entry (Match.aspx), the simplified
   alternative to the stepper grid above, used for a genuine two-team
   match-play match: pick a hole, tap which team won it (or Halved). See
   MatchHelper.UsesHoleResults / ScoringHelper.BuildFromHoleResults.
   --------------------------------------------------------------------- */
.hole-result-entry {
    background-color: var(--sand-trap-light);
    border-radius: var(--radius-lg);
    padding: 14px;
}
.hole-result-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.hole-result-btn {
    flex: 1 1 160px;
    font-weight: 700;
}
.hole-result-history {
    max-height: 220px;
    overflow-y: auto;
}
.hole-result-history-row {
    padding: 3px 0;
    border-bottom: 1px solid var(--sand-trap);
}
.hole-result-history-row:last-child {
    border-bottom: none;
}

/* ---------------------------------------------------------------------
   Point Quota entry (Match.aspx): one block per team, a row per player
   with the name on the left and the score picker on the right, then the
   hole total and the Post Team Hole Scores button. Pickers are big enough
   to tap on a phone. The block's edge turns green once every player has
   a score (pq-ready, set by the page script). See BuildPointQuotaEntry.
   --------------------------------------------------------------------- */
.pq-team {
    background-color: var(--sand-trap-light);
    border-radius: var(--radius-lg);
    border: 2px solid transparent;
    padding: 14px;
    margin-bottom: 12px;
}
.pq-team.pq-ready {
    border-color: var(--masters-green);
}
.pq-team-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 6px;
    border-left: 6px solid var(--masters-green);
    padding-left: 8px;
    margin-bottom: 10px;
}
.pq-hole-row {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 4px;
}
.pq-hole-row .pq-hole {
    max-width: 220px;
}
.pq-player {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 0;
    border-bottom: 1px solid var(--sand-trap);
}
.pq-name-wrap {
    flex: 1 1 40%;
    min-width: 0;
}
.pq-name {
    display: block;
    margin: 0;
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.pq-sub {
    line-height: 1.2;
}
.pq-player .pq-score {
    flex: 1 1 60%;
    max-width: 260px;
    min-height: 40px;
    font-size: 1rem;
}
.pq-hole-total {
    text-align: right;
    margin: 8px 0;
}
.pq-strip {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 10px;
}
.pq-chip {
    border: 1px solid var(--sand-trap);
    background-color: var(--white);
    border-radius: 999px;
    padding: 2px 10px;
    font-size: .82rem;
    line-height: 1.6;
}
.pq-chip:hover,
.pq-chip:focus {
    border-color: var(--masters-green);
}
.pq-others > summary {
    cursor: pointer;
    font-weight: 600;
    margin-bottom: 10px;
}

/* Point Quota Players card (Match.aspx, Viewer.aspx): each team's combined
   +/- on a shaded row, its players underneath, and the Set targets form. */
.quota-board td,
.quota-board th {
    vertical-align: middle;
}
.quota-team-row td {
    background-color: var(--sand-trap-light);
}
.quota-team-swatch {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin-right: 6px;
}
/* A player's pace bar under their name (ScoringHelper.QuotaBarHtml): the
   fill is points out of the target, the dark tick is where pace says they
   should be by now. Green once the fill reaches the tick, gray while short (red already
   means ahead of quota in the scores beside it). Past the target, the
   extra shows as .quota-bar-over below. */
.quota-bar {
    position: relative;
    height: 6px;
    max-width: 160px;
    margin-top: 4px;
    border-radius: 3px;
    background-color: rgba(0, 0, 0, 0.08);
}
.quota-bar-fill {
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    border-radius: 3px;
    background-color: #adb5bd;
}
.quota-bar-ahead .quota-bar-fill {
    background-color: #198754;
}
.quota-bar-behind .quota-bar-fill {
    background-color: #6c757d;
}
/* Points past the target: the fill stops at the target and this brighter
   green section carries on to the points earned, with a thin white gap
   marking where the target was. */
.quota-bar-over {
    position: absolute;
    top: -1px;
    bottom: -1px;
    border-radius: 0 3px 3px 0;
    border-left: 2px solid var(--white);
    background-color: #2ee66b;
    box-shadow: 0 0 4px rgba(46, 230, 107, 0.7);
}
.quota-bar-overachieved .quota-bar-fill {
    border-radius: 3px 0 0 3px;
}
.quota-bar-pace {
    position: absolute;
    top: -3px;
    bottom: -3px;
    width: 2px;
    margin-left: -1px;
    background-color: #212529;
}
.quota-edit {
    background-color: var(--sand-trap-light);
    border-radius: var(--radius-lg);
    padding: 12px;
}
.quota-edit-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px 10px;
    padding: 6px 0;
    border-bottom: 1px solid var(--sand-trap);
}
.quota-edit-name {
    flex: 1 1 160px;
    margin: 0;
}
.quota-target-input {
    width: 90px;
    min-height: 38px;
    font-size: 1rem;
}
.quota-edit-hint {
    flex-basis: 100%;
}

/* ---------------------------------------------------------------------
   No-match empty state (Match.aspx), stands in for the whole scoreboard
   when there's nothing set up for the selected date, so it's obvious at a
   glance that's the situation rather than reading like a quiet, easy-to-
   miss inline notice. A big icon, a real heading, and, whenever there's
   somewhere useful to go, one prominent button front and center.
   --------------------------------------------------------------------- */
.no-match-card {
    background-color: var(--white);
    border: 1px dashed var(--sand-trap);
    border-radius: var(--radius-lg);
    padding: 40px 20px;
    box-shadow: var(--shadow-soft);
}
.no-match-icon {
    font-size: 2.6rem;
    line-height: 1;
    margin-bottom: 10px;
}
.no-match-heading {
    color: var(--masters-green-dark);
    margin-bottom: 8px;
}
.no-match-text {
    color: var(--clubhouse-wood);
    max-width: 420px;
    margin: 0 auto 18px;
}
.no-match-cta-btn {
    font-weight: 600;
}

/* ---------------------------------------------------------------------
   "Your next round" and invite cards (NextRoundHelper), shown at the top
   of the Calendar and on the signed in homepage.
   --------------------------------------------------------------------- */
.next-round-card,
.invite-card,
.checklist-card {
    background-color: var(--white);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-soft);
    padding: 16px 20px;
    margin-bottom: 16px;
}
.next-round-card {
    border-left: 6px solid var(--gold);
}

/* Signed in homepage panels (DashboardHelper): Coming up, Group chat and
   Recent rounds. Same white card family as the next round card above them. */
.dash-panel {
    background-color: var(--white);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-soft);
    padding: 14px 18px;
    height: 100%;
}
.dash-panel-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 8px;
}
.dash-panel-title {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--masters-green-dark);
    margin: 0;
}
.dash-panel-link {
    color: var(--clubhouse-wood);
}
.dash-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.dash-row,
.dash-chat-row {
    padding: 7px 0;
}
.dash-row + .dash-row,
.dash-chat-row + .dash-chat-row {
    border-top: 1px solid var(--sand-trap-light);
}
.dash-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 10px;
}
.dash-row-main {
    display: flex;
    flex-direction: column;
    min-width: 0;
    color: inherit;
    text-decoration: none;
}
.dash-row-main:hover .dash-row-title,
.dash-row-main:focus .dash-row-title {
    text-decoration: underline;
}
.dash-row-title {
    font-weight: 600;
    color: var(--masters-green-dark);
}
.dash-row-meta {
    font-size: .78rem;
    color: var(--clubhouse-wood);
}
.dash-chat-name {
    font-weight: 600;
}
.dash-chat-body {
    overflow-wrap: anywhere;
}
.dash-empty {
    color: var(--clubhouse-wood);
    margin: 0;
}

/* Getting started checklist (NextRoundHelper.ChecklistHtml). */
.checklist-card {
    border-left: 6px solid var(--fairway-green);
}
.checklist-title {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--masters-green-dark);
    margin: 0;
}
.checklist-count {
    font-size: .78rem;
    font-weight: 600;
    color: var(--clubhouse-wood);
    margin-left: 6px;
}
.checklist-hide {
    color: var(--clubhouse-wood);
}
.checklist-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.checklist-item {
    display: flex;
    gap: 10px;
    align-items: flex-start;
    padding: 6px 0;
}
.checklist-item + .checklist-item {
    border-top: 1px solid var(--sand-trap-light);
}
.checklist-mark {
    font-size: 1.1rem;
    line-height: 1.3;
}
.checklist-item-body {
    display: flex;
    flex-direction: column;
}
.checklist-item-title {
    font-weight: 600;
}
.checklist-item.is-done .checklist-item-title {
    color: var(--clubhouse-wood);
    text-decoration: line-through;
    font-weight: 400;
}
.checklist-item-hint {
    font-size: .8rem;
    color: var(--clubhouse-wood);
}
.next-round-card.next-round-empty {
    border-left-color: var(--sand-trap);
}
.next-round-label {
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: var(--gold-dark);
}
.next-round-date {
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--masters-green-dark);
    line-height: 1.2;
}
.next-round-subdate {
    font-size: .9rem;
    font-weight: 400;
    color: var(--clubhouse-wood-light);
    margin-left: 4px;
}
.next-round-roles {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 8px;
}
.next-round-action {
    color: var(--clubhouse-wood);
    margin: 10px 0 12px;
}
.next-round-empty .next-round-action {
    margin-bottom: 0;
}

.invite-card {
    display: flex;
    gap: 16px;
    align-items: flex-start;
    border: 2px solid var(--masters-green);
    background-color: var(--sage-light);
}
.invite-card-icon {
    font-size: 2rem;
    line-height: 1;
}
.invite-card-body {
    flex: 1;
    min-width: 0;
}
.invite-card-title {
    font-size: 1.15rem;
    font-weight: 700;
    color: var(--masters-green-dark);
    margin-bottom: 6px;
}
.invite-card-row {
    display: flex;
    gap: 8px;
}
.invite-card-link {
    min-width: 0;
    background-color: var(--white);
}
@media (max-width: 575.98px) {
    .invite-card { flex-direction: column; gap: 8px; }
    .invite-card-row { flex-direction: column; }
}

/* Read only link box that replaces a Copy button after the tap (see
   copyLinkThenShowBox in Site.master). Sized to the button by script;
   16px text keeps iPhone from zooming in when it's tapped. */
.copy-link-box {
    max-width: 100%;
    min-width: 0;
    padding: 2px 8px;
    font-size: 16px;
    background-color: var(--white);
}

/* Match.aspx: Match Details leads the page while whoever runs the match
   still has rules or teams to sort out (see SetupFirst in Match.aspx). */
.match-flow {
    display: flex;
    flex-direction: column;
}
.match-flow.setup-first .match-details-block {
    order: -1;
}
.setup-first-intro {
    background-color: var(--status-pending-bg);
    color: var(--status-pending-text);
    border-left: 6px solid var(--gold);
    border-radius: var(--radius-md);
    padding: 10px 14px;
    margin-bottom: 10px;
}

/* Tap to explain bubble (Site.master): shows an element's title text on
   touch screens, where hover tooltips never appear. */
.tap-tip {
    position: absolute;
    z-index: 2000;
    max-width: 280px;
    padding: 6px 10px;
    border-radius: 8px;
    background-color: var(--clubhouse-wood);
    color: var(--white);
    font-size: .82rem;
    line-height: 1.3;
    box-shadow: var(--shadow-hover);
    pointer-events: none;
}

.home-next-round {
    max-width: 720px;
    margin-left: auto;
    margin-right: auto;
}

/* ---------------------------------------------------------------------
   Small helpers
   --------------------------------------------------------------------- */
.golf-divider {
    display: flex;
    align-items: center;
    text-align: center;
    color: var(--masters-green);
    margin: 18px 0;
}
.golf-divider::before, .golf-divider::after {
    content: "";
    flex: 1;
    border-bottom: 2px dashed var(--sand-trap);
}
.golf-divider span {
    padding: 0 12px;
}

/* Default.aspx's three section dividers use a real <h2> now instead of a
   plain <span> (see the fix-heading-levels comment in Default.aspx), so
   the page has a proper h1 -> h2 -> h3 outline for assistive tech. This
   cancels out both the browser's larger default h2 size and the bold
   h1-h5 rule further up this file, so the divider looks exactly as it
   did as a span: normal weight, body-text size, inheriting the dashed
   divider's own green from .golf-divider rather than the darker
   heading green. */
.golf-divider h2 {
    display: inline;
    padding: 0 12px;
    margin: 0;
    font-size: 1rem;
    font-weight: 400;
    color: inherit;
}

@media (max-width: 576px) {
    .calendar-day { width: 100%; }
}

/* ---------------------------------------------------------------------
   Flatpickr activity dots, dates with sign-up/draft/match activity get
   a small colored dot under the day number in the calendar popup.
   --------------------------------------------------------------------- */
.flatpickr-day.has-activity {
    position: relative;
    font-weight: 700;
}
.flatpickr-day.has-activity::after {
    content: "";
    position: absolute;
    bottom: 4px;
    left: 50%;
    transform: translateX(-50%);
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background-color: var(--masters-green);
}
.flatpickr-day.has-activity.selected::after,
.flatpickr-day.has-activity.today::after {
    background-color: var(--white);
}
/* Gold underscore below the green dot (Calendar.aspx only): a match on
   this date is live or has ended, so there is scoring to look at. */
.flatpickr-day.has-scoring {
    position: relative;
}
.flatpickr-day.has-scoring::before {
    content: "";
    position: absolute;
    bottom: 1px;
    left: 50%;
    transform: translateX(-50%);
    width: 16px;
    height: 2px;
    border-radius: 1px;
    background-color: var(--gold);
}

/* Group switcher badge/dropdown in the navbar */
.navbar-golf .form-select-sm {
    min-width: 120px;
}

/* ---------------------------------------------------------------------
   Profile page tabs (Account / Groups)
   --------------------------------------------------------------------- */
#profileTabs .nav-link {
    color: var(--clubhouse-wood-light);
    font-weight: 600;
    border: none;
    border-bottom: 3px solid transparent;
}
#profileTabs .nav-link.active {
    color: var(--masters-green-dark);
    background-color: transparent;
    border-bottom: 3px solid var(--masters-green);
}
#profileTabs .nav-link:hover:not(.active) {
    color: var(--masters-green);
    border-bottom-color: var(--sand-trap);
}

/* ---------------------------------------------------------------------
   Admin page tabs. Same underline treatment as the Profile tabs above.
   Labels are kept short so the whole strip fits on one line on a
   desktop; it wraps onto a second line on a phone rather than scrolling
   sideways. Only the pane whose tab is active is shown (toggled by the
   tab script in Admin.aspx).
   --------------------------------------------------------------------- */
.admin-tabs {
    flex-wrap: wrap;
    border-bottom: 1px solid var(--sand-trap);
}
.admin-tabs .nav-link {
    color: var(--clubhouse-wood-light);
    font-weight: 600;
    padding: .5rem .75rem;
    border: none;
    border-bottom: 3px solid transparent;
    margin-bottom: -1px;
    white-space: nowrap;
}
.admin-tabs .nav-link.active {
    color: var(--masters-green-dark);
    background-color: transparent;
    border-bottom: 3px solid var(--masters-green);
}
.admin-tabs .nav-link:hover:not(.active) {
    color: var(--masters-green);
    border-bottom-color: var(--sand-trap);
}
.admin-tab-pane {
    display: none;
}
.admin-tab-pane.active {
    display: block;
}
.admin-search {
    max-width: 420px;
}
.admin-pager {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
    margin-top: .75rem;
}

/* An open row edit panel on Admin.aspx (the Groups tab's group editor).
   Tinted and edged in the same sage as the Groups page tiles so the
   whole block reads as one group's content, set apart from the list. */
.admin-edit-panel {
    margin-top: .5rem;
    padding: .75rem 1rem 1rem;
    background-color: var(--sage-light);
    border: 1px solid var(--sage);
    border-left: 4px solid var(--sage-dark);
    border-radius: var(--radius-md);
}
.admin-edit-panel-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: .5rem;
    padding-bottom: .5rem;
    margin-bottom: .75rem;
    border-bottom: 1px solid var(--sage);
}
.admin-edit-panel-header h6 {
    color: var(--masters-green-dark);
    font-weight: 700;
    overflow-wrap: anywhere;
}

/* Group tile cards on the Groups page. A light sage/moss tint over a
   deeper moss border, chosen to sit quietly behind the site's gold
   buttons (the old sky-blue tint clashed with them) while still reading
   as a clear step away from the tan/brown sand-trap and clubhouse-wood
   tones used elsewhere. The 2px border plus a shadow that never fully
   disappears (not just on hover) is what keeps tile-to-tile delineation
   obvious even when two tiles sit right next to each other. */
.group-tile {
    background-color: var(--sage-light);
    border: 2px solid var(--sage-dark);
    box-shadow: var(--shadow-soft);
    transition: box-shadow .15s ease, transform .15s ease;
}
.group-tile:hover {
    box-shadow: var(--shadow-hover);
    transform: translateY(-2px);
}
.group-tile .card-title {
    color: var(--masters-green-dark);
}
/* Fixed/read-only fields (Group Name display, etc.) inside a group tile
   need their own muted treatment now that the tile itself is no longer
   the same tan as .form-control[readonly]'s default background. */
.group-tile .form-control[readonly] {
    background-color: var(--white);
    color: var(--clubhouse-wood-light);
}
/* A setting-row's hover highlight is meant for a long settings list
   (Match.aspx) where it helps a reader track which row their cursor is
   on. On a group tile it just made the description row flash sand/tan
   against the sage tile, so it's switched off here, the row stays the
   tile's own background no matter what. */
.group-tile .setting-row:hover {
    background-color: transparent;
}
/* .setting-row/.setting-label were sized and padded for Match.aspx's
   wide settings grid, and BuildLeaderboard's h6 headers were never
   matched to the "Players in this Group"/"Message Board" form-labels
   sitting right next to them, between those two sources, a group
   tile ended up with three different left indents and font sizes
   (Description, Your Record in this Group, Leaderboard headers) rather
   than one consistent block. This lines them all up on the tile's own
   card-body padding and one shared text size. */
.group-tile .setting-row {
    padding: 0;
    border-bottom: none;
}
.group-tile .setting-label,
.group-tile .setting-value,
.group-tile .tile-subsection h6 {
    font-size: .875rem;
}
.group-tile .setting-label {
    min-width: 0;
}
.group-tile .tile-subsection table {
    font-size: .875rem;
}
/* Uniform, compact divider between a group tile's stacked subsections
   (Message Board, Players in this Group, Group History & Leaderboard,
   Manage Group Settings), replaces a mix of mb-3/mt-auto/pt-2 that
   left some gaps far bigger than others (mt-auto in particular pushed
   the roster all the way to the bottom of the tile regardless of how
   much content came before it). */
/* Group page tabs (Chat, Players, Leaderboard, Settings). On a phone the
   tab row scrolls sideways rather than wrapping onto a second line. */
.group-tabs {
    border-bottom: 1px solid var(--sage-dark);
    flex-wrap: nowrap;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
}
.group-tabs::-webkit-scrollbar {
    display: none;
}
.group-tabs .nav-link {
    color: var(--masters-green-dark);
    font-weight: 600;
    white-space: nowrap;
    padding: 8px 14px;
}
.group-tabs .nav-link:hover,
.group-tabs .nav-link:focus {
    border-color: transparent;
    color: var(--masters-green);
}
.group-tabs .nav-link.active {
    background-color: var(--white);
    border-color: var(--sage-dark) var(--sage-dark) var(--white);
    color: var(--masters-green-dark);
}
.group-tab-count {
    font-weight: 400;
    opacity: .75;
}
.group-tab-content {
    background-color: var(--white);
    border: 1px solid var(--sage-dark);
    border-top: none;
    border-radius: 0 0 var(--radius-md) var(--radius-md);
    padding: 16px;
}
.group-tab-content h6,
.group-tab-content table {
    font-size: .875rem;
}

.group-tile .tile-subsection {
    margin-top: 14px;
    padding-top: 14px;
    border-top: 1px solid var(--sand-trap-light);
}
/* Groups.aspx: the single wide "Group Tile" detail panel reuses
   .group-tile's sage background/border, but it's the page's one main
   content panel (chosen via the Select Group dropdown above it), not one
   of several small tiles side by side in a grid, the hover-lift that
   helps tell tiles apart from each other doesn't apply here, and the
   first subsection in each of its two columns shouldn't carry the divider
   line + top gap meant to separate it from a subsection stacked above it. */
.group-tile-detail:hover {
    transform: none;
}
.group-tile-detail .tile-subsection:first-child {
    margin-top: 0;
    padding-top: 0;
    border-top: none;
}
/* Group History & Leaderboard now spans the tile's full width (it used to
   be confined to the narrower Message Board column), but a "Your Record"
   row and a leaderboard table both read better as a compact block than
   stretched edge to edge across the whole tile, so this keeps that block
   a fixed readable width and centers it under the heading. */
.group-leaderboard-content {
    max-width: 640px;
    margin: 0 auto;
}
/* Groups.aspx: the stationary Select Group / Create New Group bar that
   sits between the green hero header and the sage Group Details tile. A
   deep green fill (instead of another sage tile) is what makes it read as
   its own fixed control bar rather than one more tile in the stack. */
.group-selector-tile {
    background: linear-gradient(135deg, var(--masters-green) 0%, var(--fairway-green) 100%);
    border: 2px solid var(--gold);
    color: var(--white);
}
.group-selector-tile label {
    color: var(--white);
}
.group-selector-tile-hint {
    color: rgba(255,255,255,0.85);
}
/* A narrower twin of .btn-sm: same padding-top/bottom (so the height
   matches its row-mates) with less horizontal padding, for the "Leave"
   button next to Invite Players To This Group in a tile's action row. */
.btn-narrow {
    padding-left: .45rem;
    padding-right: .45rem;
}

/* Group chat panel, nested inside a group tile, same scrollable pattern
   as Match.aspx's Live Trash Talk box, just shorter, since it lives inside
   a tile alongside a description, roster and rules block rather than
   having a full card of its own. */
.group-chat-box {
    height: 180px;
    overflow-y: auto;
    background-color: var(--white);
    border: 1px solid var(--masters-green);
    border-radius: var(--radius-md);
    padding: 8px 10px;
}
.group-chat-box::-webkit-scrollbar {
    width: 8px;
}
.group-chat-box::-webkit-scrollbar-thumb {
    background-color: var(--masters-green);
    border-radius: 8px;
}

/* Scroll hints for short scrolling boxes. Phones (iOS especially) hide
   the scrollbar until you actually swipe, so a clipped list looked like
   the whole list. A soft shadow now appears along whichever edge has
   more content past it, and goes away once you scroll to that end.
   The "local" cover layers scroll with the content and hide the "scroll"
   shadow layers when you're at an edge. Each box sets --scroll-hint-bg
   to its own background so the covers blend in. */
.roster-list,
.hole-result-history,
.chat-box,
.group-chat-box {
    background:
        linear-gradient(var(--scroll-hint-bg, #fff) 30%, rgba(255,255,255,0)) center top / 100% 36px no-repeat local,
        linear-gradient(rgba(255,255,255,0), var(--scroll-hint-bg, #fff) 70%) center bottom / 100% 36px no-repeat local,
        radial-gradient(farthest-side at 50% 0, rgba(0,0,0,.22), rgba(0,0,0,0)) center top / 100% 12px no-repeat scroll,
        radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,.22), rgba(0,0,0,0)) center bottom / 100% 12px no-repeat scroll;
    background-color: var(--scroll-hint-bg, #fff);
}
/* Android Chrome honors these, so the bar itself stays visible there too
   (same look as the chat boxes). */
.roster-list::-webkit-scrollbar,
.hole-result-history::-webkit-scrollbar {
    width: 6px;
}
.roster-list::-webkit-scrollbar-thumb,
.hole-result-history::-webkit-scrollbar-thumb {
    background-color: var(--masters-green);
    border-radius: 6px;
}

/* Group rules block, a standing, longer statement (etiquette, handicap
   policy, no-show policy), visually distinct from the short one-line
   Description above it so members don't confuse the two. */
.group-rules-box {
    background-color: var(--white);
    border: 1px solid var(--masters-green);
    border-radius: var(--radius-md);
    padding: 10px 12px;
    white-space: pre-wrap;
}

/* Roster list nested inside a group tile */
.roster-list {
    max-height: 220px;
    overflow-y: auto;
    --scroll-hint-bg: var(--sage-light);
}
.roster-list .list-group-item {
    /* Fixed data, not an input, blend into the tile's own background
       instead of sitting on Bootstrap's default white, which made a
       read-only roster look like an editable control. */
    background-color: transparent;
    border-left: none;
    border-right: none;
}
.roster-list .list-group-item:first-child {
    border-top: none;
}

/* Manage Group Settings collapse panel inside a group tile */
.group-manage-collapse .golf-divider {
    margin: 10px 0;
}

/* A locked/fixed field, shown for reference but not editable here (Group
   Name and Group ID, set once at creation), same muted treatment as
   Profile.aspx's own "Username (Fixed)" field on the Account tab, so a
   read-only field looks the same wherever it shows up. */
.form-control[readonly] {
    background-color: var(--sand-trap-light);
    color: var(--clubhouse-wood-light);
    cursor: not-allowed;
}

/* ---------------------------------------------------------------------
   Weather forecast (Match.aspx, Calendar.aspx), shown only when the
   match's course has a zip code on file, since that's what the forecast
   lookup needs.
   --------------------------------------------------------------------- */
.weather-card {
    background-color: var(--white);
    border: 1px solid var(--sky-blue);
    border-radius: var(--radius-md);
    padding: 12px 18px;
    box-shadow: var(--shadow-soft);
    text-align: center;
}
.weather-line {
    font-size: .95rem;
    color: var(--clubhouse-wood);
}
.weather-icon {
    font-size: 1.15rem;
    vertical-align: -2px;
    margin-right: 4px;
}
.weather-sep {
    color: var(--sand-trap);
    margin: 0 6px;
}
.weather-empty {
    font-size: .85rem;
    color: var(--clubhouse-wood-light);
}

/* Compact weather line inside the Calendar day panel and hover tooltip */
.weather-inline {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: .82rem;
    color: var(--clubhouse-wood-light);
    margin-top: 4px;
}
.weather-inline .weather-icon {
    font-size: 1rem;
    margin-right: 2px;
}

/* ---------------------------------------------------------------------
   Match day info bar (Match.aspx, Draft.aspx), course card, date
   picker, weather, laid out as a tidy row of equal-treatment cards
   instead of stacked, narrow, centered boxes. Draft.aspx reuses the same
   .match-info-bar/.date-card treatment for its own date picker even
   though it's the only card in the row, so "pick a date for this page"
   looks identical wherever it shows up.
   --------------------------------------------------------------------- */
.match-info-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    gap: 16px;
    margin-bottom: 20px;
}
.match-info-card {
    flex: 1 1 260px;
    background-color: var(--white);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-soft);
    padding: 16px 20px;
}

/* Course card: logo (or placeholder) + name + meta, left to right. Fixed at
   a wide share of the info bar's width (flex-grow 0, a percentage basis
   instead of the shared 260px one other cards use) so it reliably reads as
   the biggest of the three regardless of how much space the row has to
   hand out.

   The logo is a fixed 126px circle, not a stretch-to-fit one: an earlier
   pass sized it off the card's own (auto) height via align-self:stretch +
   aspect-ratio, but that let the tile's height, and the circle with it,
   balloon to whatever an uploaded logo's native pixel size or a tall
   sibling card demanded. 126px is exactly the old tile height (132px,
   back when the logo was a fixed 100px inside 16px top/bottom padding)
   minus this card's own 3px top/bottom padding, so the tile lands back at
   its original ~132px height with a bigger, but bounded, circle inside
   it, still 3px from the tile's top, left, and bottom edges. */
.course-card {
    display: flex;
    align-items: center;
    gap: 16px;
    flex: 0 1 46%;
    min-width: 300px;
    padding: 3px 20px 3px 3px;
}
.course-logo,
.course-logo-placeholder {
    width: 126px;
    height: 126px;
    border-radius: 50%;
    flex-shrink: 0;
}
.course-logo {
    object-fit: cover;
    border: 2px solid var(--sand-trap);
    background-color: var(--sand-trap-light);
}
.course-logo-placeholder {
    background-color: var(--masters-green);
    color: var(--white);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 3rem;
}
.course-name {
    font-weight: 700;
    color: var(--masters-green-dark);
    font-size: 1.4rem;
    line-height: 1.2;
}
.course-meta {
    color: var(--clubhouse-wood-light);
    font-size: .8rem;
    margin-top: 2px;
}

/* Date card, an obvious "you can click this" affordance: a calendar icon
   inside the field, a hint line underneath, and a hover/focus color change.
   Used for the single date-picker card on Draft.aspx as well as one of the
   three cards in Match.aspx's info bar.

   min-width is sized so the longest date ("12-28-2026", bold) always fits
   between the input's symmetric side padding below, so the calendar icon
   can never sit on top of the text. Side padding is trimmed from the
   shared 20px to give the field more room. */
.date-card {
    text-align: center;
    flex: 0 1 16%;
    min-width: 200px;
    padding-left: 14px;
    padding-right: 14px;
}
/* On phones the date card wraps onto its own row anyway, so let it fill
   that row instead of sitting there as a narrow 200px tile. */
@media (max-width: 576px) {
    .date-card { flex: 1 1 100%; }
}
/* Draft.aspx's "Who's Running This Match" card, sharing the info bar's row
   with .date-card instead of a separate row below it, same fixed height
   and shadow as every other match-info-card, just wider since it carries
   more text. */
.commissioner-card {
    flex: 1 1 260px;
}
.date-card h5 {
    font-size: 1rem;
    margin-bottom: 10px;
}

/* Match picker (Match.aspx): same info-bar card treatment as the date
   picker next to it, holding the same .match-tab pill strip Draft.aspx's
   match switcher uses, only ever rendered once a date has more than one
   match (see Match.aspx's Load()). */
.match-picker-card {
    flex: 1 1 260px;
}
.match-picker-card h5 {
    font-size: 1rem;
    margin-bottom: 10px;
}
.date-card label {
    display: block;
    font-weight: 600;
    color: var(--masters-green-dark);
}
.date-picker-wrap {
    position: relative;
}
/* Equal left and right padding keeps the centered date truly centered and
   always clear of the icon on the right, instead of drifting under it. */
.date-picker-wrap .form-control {
    cursor: pointer;
    padding-left: 34px;
    padding-right: 34px;
    white-space: nowrap;
    text-overflow: ellipsis;
    background-color: var(--sand-trap-light);
    border: 1px solid var(--sand-trap);
    font-weight: 600;
    text-align: center;
    transition: background-color .15s ease, border-color .15s ease;
}
.date-picker-wrap .form-control:hover,
.date-picker-wrap .form-control:focus {
    background-color: var(--white);
    border-color: var(--masters-green);
}
.date-picker-icon {
    position: absolute;
    right: 12px;
    top: 50%;
    transform: translateY(-50%);
    pointer-events: none;
    font-size: 1rem;
}
.date-hint {
    font-size: .72rem;
    color: var(--clubhouse-wood-light);
    margin-top: 6px;
}

/* Match.aspx while a round is being scored, on a phone: a short banner
   with no description, and the course, date and weather cards in one
   short strip that scrolls sideways, so Enter Scores sits near the top
   instead of a full screen down. */
@media (max-width: 576px) {
    .hero-golf.live-compact {
        padding: 12px 16px;
        margin-bottom: 12px;
    }
    .hero-golf.live-compact h1 {
        font-size: 1.35rem;
        margin-bottom: 0;
    }
    .hero-golf.live-compact p {
        display: none;
    }
    .match-info-bar.live-compact {
        flex-wrap: nowrap;
        overflow-x: auto;
        gap: 8px;
        margin-bottom: 12px;
        padding-bottom: 4px;
    }
    .match-info-bar.live-compact .match-info-card,
    .match-info-bar.live-compact .date-card {
        flex: 0 0 auto;
        min-width: 0;
        max-width: 80vw;
        padding: 6px 12px;
    }
    .match-info-bar.live-compact .course-card {
        gap: 8px;
        padding: 4px 12px 4px 4px;
    }
    .match-info-bar.live-compact .course-logo,
    .match-info-bar.live-compact .course-logo-placeholder {
        width: 40px;
        height: 40px;
        font-size: 1.2rem;
    }
    .match-info-bar.live-compact .course-name {
        font-size: 1rem;
    }
    .match-info-bar.live-compact .course-meta,
    .match-info-bar.live-compact .date-hint {
        display: none;
    }
    .match-info-bar.live-compact .date-card .form-label {
        font-size: .75rem;
        margin-bottom: 2px;
    }
}

/* The weather card slots into the info bar as just another match-info-card,
   so it drops its own standalone box treatment and just handles its text. */
.weather-card {
    text-align: left;
}

/* ---------------------------------------------------------------------
   Match Setup card (Match.aspx), role chips, lock-state badge, and a
   clean label/value settings list in place of a run-together text block.
   --------------------------------------------------------------------- */
.match-setup-card .card-header {
    background-color: var(--sand-trap-light);
}

.role-line {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    margin-bottom: 16px;
}
.role-badge {
    display: inline-flex;
    align-items: center;
    padding: 3px 12px;
    border-radius: 20px;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    background-color: var(--sand-trap-light);
    color: var(--masters-green-dark);
}
.role-badge.role-admin { background-color: var(--flag-red); color: var(--white); }
.role-badge.role-groupmanager { background-color: var(--clubhouse-wood); color: var(--white); }
.role-badge.role-matchcommissioner { background-color: var(--gold); color: #3a2f10; }
.role-badge.role-matchcaptain { background-color: var(--masters-green); color: var(--white); }
.role-badge.role-player { background-color: var(--sand-trap-light); color: var(--masters-green-dark); }
.role-badge.role-guest { background-color: var(--clubhouse-wood-light); color: var(--white); }

.state-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 12px;
    border-radius: 20px;
    font-size: .78rem;
    font-weight: 600;
    white-space: nowrap;
}
.state-badge.state-pending { background-color: var(--status-neutral-bg); color: var(--status-neutral-text); }
.state-badge.state-ready { background-color: var(--masters-green); color: var(--white); }
.state-badge.state-live { background-color: var(--status-pending-bg); color: var(--status-pending-text); }
.state-badge.state-ended { background-color: var(--status-bad-bg); color: var(--status-bad-text); }
.state-badge.state-open { background-color: var(--status-neutral-bg); color: var(--status-neutral-text); }
.state-badge.state-empty { background-color: var(--status-neutral-bg); color: var(--status-neutral-text); }

/* NET/GROSS scoring reminder pill (Match.aspx), shown next to the
   Scoreboard heading and again on the Enter Scores card header, so
   players always know which way they're supposed to be counting
   strokes. Both Net and Gross use the same flag-red treatment already
   used for "pay attention, this changes the read" elsewhere on the site
   (role-admin), which mode a match is using changes how every player
   should already be converting strokes in their head, so it's worth the
   same red flag either way, not just for the less common Gross setting. */
.net-gross-badge {
    display: inline-flex;
    align-items: center;
    padding: 3px 12px;
    border-radius: 20px;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
}
.net-gross-badge.net-gross-net { background-color: var(--flag-red); color: var(--white); }
.net-gross-badge.net-gross-gross { background-color: var(--flag-red); color: var(--white); }

/* Field groups inside the settings grid (Match.aspx), Terms & Tee,
   Format & Scoring, Teams & Captains each get their own grid + heading
   instead of one 11-row flat list, so the busiest form on the site is
   scannable in a glance rather than a wall of rows. */
.settings-grid {
    border-top: 1px solid var(--sand-trap-light);
}
.settings-group + .golf-divider {
    margin-top: 4px;
}
.setting-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    padding: 11px 6px;
    border-bottom: 1px solid var(--sand-trap-light);
}
.setting-row:hover {
    background-color: var(--sand-trap-light);
}
.setting-label {
    font-weight: 600;
    color: var(--clubhouse-wood);
    min-width: 160px;
    flex: 0 0 auto;
}
.setting-read {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 10px;
    flex: 1 1 auto;
}
.setting-value {
    color: var(--clubhouse-wood-light);
    text-align: right;
}
.setting-edit {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 8px;
    flex: 1 1 auto;
}
.setting-edit .form-control,
.setting-edit .form-select {
    max-width: 200px;
}
.icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    color: var(--masters-green);
    text-decoration: none;
    flex-shrink: 0;
    transition: background-color .15s ease;
}
.icon-btn:hover {
    background-color: var(--sand-trap-light);
    color: var(--masters-green-dark);
    text-decoration: none;
}
.icon-btn.icon-save { color: var(--masters-green); }
.icon-btn.icon-cancel { color: var(--flag-red); }
.icon-btn.icon-delete { color: var(--flag-red); }

/* Compact info marker for a setting-label (Profile.aspx's Email/Handicap
   Index rows), explanatory text that used to sit inline in the label
   itself now lives in the title attribute instead, shown on hover, so the
   label stays short while still carrying the full explanation. */
.info-icon {
    display: inline;
    vertical-align: super;
    font-size: .6rem;
    cursor: help;
    margin-left: 2px;
}

/* Icon buttons sitting on a colored card header (the team-name pencil/
   check/cancel) need a light variant, the default icon-btn colors were
   picked for a white background and disappear against bg-success/bg-primary. */
.icon-btn-light {
    color: rgba(255, 255, 255, .9);
}
.icon-btn-light:hover {
    background-color: rgba(255, 255, 255, .2);
    color: var(--white);
}

/* A description-style row inside the settings grid (Profile.aspx's Group
   description) needs the label above the text and the text left-justified,
   not squeezed to the right edge the way a short one-word setting value
   is, .setting-row's flex space-between layout is right for "Scoring:
   Medal" but wrong for a sentence. This stacks it into a normal top-to-
   bottom field instead, while still reusing the same pencil/check/cancel
   icons and edit-mode markup as every other settings row on the site. */
.group-desc-row {
    flex-direction: column;
    align-items: flex-start;
}
.group-desc-row .setting-read,
.group-desc-row .setting-edit {
    justify-content: flex-start;
    width: 100%;
}
.group-desc-row .setting-value {
    text-align: left;
}
.group-desc-row .setting-edit .form-control {
    max-width: none;
    flex: 1 1 auto;
}

/* ---------------------------------------------------------------------
   Team card and team name, editable inline (Match.aspx, Draft.aspx),
   pencil to edit, check to save, X to cancel, same interaction as the
   Match Setup grid above, just laid out for a card header instead of a
   settings row. A match can have any number of teams now, so each card's
   border/header color is set inline from that team's own entry in
   MatchHelper.TeamColors rather than a fixed success/primary pair,
   .team-card only supplies the border thickness/style, the color itself
   is per-team.
   --------------------------------------------------------------------- */
.team-card {
    border-width: 2px;
    border-style: solid;
}
.team-card .card-header {
    border-bottom: none;
}
.team-name-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}
.team-name-text {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
}
/* Slightly larger than the default badge-index pill, this one sits over
   a solid team color instead of white, and reads as the team's own figure
   rather than one player's, so it earns a touch more presence. */
.team-header-index {
    font-size: .78rem;
}
.team-name-edit-row {
    display: flex;
    align-items: center;
    gap: 6px;
}
.team-name-edit-row .form-control {
    max-width: 220px;
}

/* ---------------------------------------------------------------------
   Match Details toggle (Match.aspx), Sign-ups and Match Setup collapse
   behind this once scoring starts, so the scoreboard above doesn't have
   to compete with match metadata for the screen.
   --------------------------------------------------------------------- */
.match-details-toggle {
    font-weight: 600;
}

/* ---------------------------------------------------------------------
   Viewer Only link row (Match.aspx), collapsed down to just the eyeball
   icon: no visible URL, no label, nothing else competing for space next
   to the Scoreboard heading. A click copies the link straight to the
   clipboard (see copyViewerLink() below); the eyeball is this feature's
   one consistent visual marker, here and again on Viewer.aspx's own hero
   banner, so a read-only share link is never confused with an ordinary
   edit/settings control anywhere it shows up.
   --------------------------------------------------------------------- */
.viewer-link-row {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.viewer-link-icon-btn {
    border: none;
    outline: none;
    box-shadow: none;
    background: transparent;
    font-size: 1.15rem;
    line-height: 1;
    padding: 4px;
    cursor: pointer;
    border-radius: var(--radius-md);
}
.viewer-link-icon-btn:hover, .viewer-link-icon-btn:focus, .viewer-link-icon-btn:active {
    background-color: var(--sand-trap-light);
    border: none;
    outline: none;
    box-shadow: none;
}
.viewer-link-copied {
    font-weight: 700;
}
/* Keeps the underlying link text selectable (needed for the
   document.execCommand('copy') fallback) while showing nothing on
   screen, the standard visually-hidden pattern, not display:none,
   which some browsers won't let you select text out of. */
.viewer-link-hidden-input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
/* Same visually hidden, still selectable pattern as
   .viewer-link-hidden-input above, applied to the Error Log tile's
   per-row Copy Debug Information textarea (see Admin.aspx's
   copyErrorDebugInfo). Not sharing that class directly since its name
   is specific to the viewer link feature. */
.error-debug-hidden-input {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* ---------------------------------------------------------------------
   Match Ended notification bar (Match.aspx), the top-of-page banner
   that replaces the old inline alert once a match is completed. Reopen
   Match lives here, not back up by the Scoreboard heading, since this
   banner is what told you the match ended in the first place.
   --------------------------------------------------------------------- */
.match-ended-banner {
    background-color: var(--sand-trap-light);
    border: 1px solid var(--sand-trap);
    border-radius: var(--radius-md);
    padding: 12px 16px;
}
.match-ended-icon {
    font-size: 1.3rem;
    line-height: 1;
}

/* Every hole posted but the match still open (Match.aspx): same shape as
   the Match Ended banner, with a gold edge so it reads as "your move". */
.all-posted-prompt {
    background-color: var(--sand-trap-light);
    border: 1px solid var(--sand-trap);
    border-left: 4px solid var(--gold);
    border-radius: var(--radius-md);
    padding: 12px 16px;
}
.all-posted-icon {
    font-size: 1.3rem;
    line-height: 1;
}

/* ---------------------------------------------------------------------
   Toast notifications (Match.aspx/Viewer.aspx), lightweight, corner
   popups for something a poller might miss without staring at the page:
   the match ending, or a new hole open to score in a match-play round.
   A plain CSS transition (no Bootstrap Toast JS component), self
   dismissing, and stacked rather than replacing one already showing.
   See Scripts/live-updates.js showToast().
   --------------------------------------------------------------------- */
.app-toast-stack {
    position: fixed;
    top: 16px;
    right: 16px;
    z-index: 1080;
    display: flex;
    flex-direction: column;
    gap: 10px;
    max-width: min(340px, calc(100vw - 32px));
}
.app-toast {
    display: flex;
    align-items: center;
    gap: 8px;
    background-color: var(--white);
    border-left: 4px solid var(--masters-green);
    border-radius: var(--radius-md);
    box-shadow: 0 4px 14px rgba(0, 0, 0, .18);
    padding: 10px 12px;
    opacity: 0;
    transform: translateX(16px);
    transition: opacity .25s ease, transform .25s ease;
    cursor: pointer;
}
.app-toast-visible {
    opacity: 1;
    transform: translateX(0);
}
.app-toast-ended {
    border-left-color: var(--flag-red);
}
.app-toast-icon {
    font-size: 1.1rem;
    line-height: 1;
}
.app-toast-msg {
    font-size: .9rem;
    color: var(--clubhouse-wood);
    flex: 1;
}
.app-toast-close {
    background: none;
    border: none;
    color: var(--clubhouse-wood-light);
    font-size: 1.1rem;
    line-height: 1;
    padding: 0 0 0 4px;
    cursor: pointer;
}

/* ---------------------------------------------------------------------
   Scoring mode badge (Match.aspx), NET/GROSS and MEDAL/MATCH together,
   right next to the Scoreboard heading. Same pill shape and brand red as
   .net-gross-badge (the on-palette red used for "pay attention" elsewhere
   on the site, role-admin, .net-gross-badge itself) rather than a
   separate floating block, so it reads correctly no matter how many team
   cards the match has, not just exactly two. See ScoringModeBadgeHtml.
   --------------------------------------------------------------------- */
.scoring-mode-badge {
    display: inline-flex;
    align-items: center;
    padding: 4px 14px;
    border-radius: 20px;
    font-size: .75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    background-color: var(--flag-red);
    color: var(--white);
}

/* ---------------------------------------------------------------------
   Player list line (Calendar.aspx, Match.aspx), the one uniform,
   comma separated line used everywhere a match's players are listed,
   in place of the old chip based markup that had no spacing between
   adjacent spans and ran names together.
   --------------------------------------------------------------------- */
.player-list {
    font-size: .88rem;
    color: var(--clubhouse-wood);
    line-height: 1.5;
    margin: 4px 0;
}
.roster-line {
    font-size: .9rem;
    color: var(--clubhouse-wood);
    line-height: 1.6;
}

/* Calendar tile preview, names only, single line, truncated with an
   ellipsis since the tile is a fixed 170px wide; the full list is still
   available via the title attribute on hover. */
.tile-names {
    font-size: .78rem;
    color: var(--clubhouse-wood-light);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-top: 4px;
}

/* Calendar day panel summary (Format / Holes / Teams), label/value
   pairs, which need real spacing between them or they run together. */
.summary-grid {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 8px 0;
    font-size: .85rem;
}
.summary-item {
    display: flex;
    justify-content: space-between;
    gap: 8px;
}
.summary-key {
    font-weight: 600;
    color: var(--clubhouse-wood-light);
    margin-right: 6px;
}

/* Calendar hover tooltip */
.mt-head {
    font-weight: 700;
    color: var(--masters-green-dark);
    margin-bottom: 4px;
}
.mt-line {
    display: block;
    font-size: .82rem;
    color: var(--clubhouse-wood);
    margin: 2px 0;
}
.mt-k {
    font-weight: 600;
    color: var(--clubhouse-wood-light);
    margin-right: 4px;
}
.mt-ended { color: var(--flag-red); }
.mt-live { color: var(--masters-green-dark); font-weight: 700; }
.mt-open { color: var(--status-pending-text); font-weight: 700; }
.mt-muted { color: var(--clubhouse-wood-light); font-style: italic; }

/* ---------------------------------------------------------------------
   Sign-ups card (Match.aspx), In / Maybe / Out / Placeholder, one
   labeled row each, so the full availability picture for the date is
   visible even before teams are drafted or assigned.
   --------------------------------------------------------------------- */
.availability-grid {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.availability-row {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 10px;
}
.availability-label {
    flex: 0 0 auto;
    min-width: 100px;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--masters-green-dark);
}

/* Manage Player Status (Match.aspx, Sign-ups card): the collapsed table a
   Commissioner/Captain uses to set statuses for other players. Every
   status column is the same fixed width with its radio centered, so the
   buttons line up in even columns no matter how long a name is. The name
   column takes whatever width is left and wraps if it has to. */
.status-manager {
    margin-top: 14px;
}
.status-manager-pending {
    background-color: var(--status-pending-bg);
    color: var(--status-pending-text);
    font-weight: 600;
    margin-left: 4px;
}
.status-manager-table {
    table-layout: fixed;
    width: 100%;
}
.status-manager-table .status-col {
    width: 4.5rem;
}
.status-manager-table th {
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--masters-green-dark);
    vertical-align: bottom;
}
.status-manager-table .status-head,
.status-manager-table .status-cell {
    text-align: center;
    vertical-align: middle;
    padding-left: 0;
    padding-right: 0;
}
.status-manager-table .status-head-in { color: var(--masters-green); }
.status-manager-table .status-head-maybe { color: var(--gold-dark); }
.status-manager-table .status-head-out { color: var(--flag-red); }
.status-manager-table .status-head-placeholder { color: var(--clubhouse-wood-light); }
.status-manager-table .status-name {
    vertical-align: middle;
    overflow-wrap: anywhere;
}
.status-manager-table .status-cell .form-check-input {
    float: none;
    margin: 0;
    width: 1.25rem;
    height: 1.25rem;
    cursor: pointer;
}
.status-manager-table .status-cell .form-check-input:disabled {
    cursor: not-allowed;
}
.status-manager-table .status-cell-in .form-check-input:checked {
    background-color: var(--masters-green);
    border-color: var(--masters-green);
}
.status-manager-table .status-cell-maybe .form-check-input:checked {
    background-color: var(--gold-dark);
    border-color: var(--gold-dark);
}
.status-manager-table .status-cell-out .form-check-input:checked {
    background-color: var(--flag-red);
    border-color: var(--flag-red);
}
.status-manager-table .status-cell-placeholder .form-check-input:checked {
    background-color: var(--clubhouse-wood-light);
    border-color: var(--clubhouse-wood-light);
}
/* No status yet for this date: the rows the table mostly exists for. */
.status-manager-table .status-row-pending > td {
    background-color: var(--status-pending-bg);
}
/* The row just changed, briefly highlighted after the postback. */
.status-manager-table .status-row-updated > td {
    animation: status-row-flash 1.6s ease-out;
}
@keyframes status-row-flash {
    from { background-color: var(--status-good-bg); }
}
.status-manager-table .status-note {
    font-size: .75rem;
    color: var(--clubhouse-wood-light);
    font-style: italic;
}
@media (max-width: 400px) {
    .status-manager-table .status-col {
        width: 3.5rem;
    }
}

/* ---------------------------------------------------------------------
   Accessibility: focus visibility and reduced motion
   --------------------------------------------------------------------- */

/* A keyboard user tabbing through the site had no reliable way to see
   which control they were on: Bootstrap's own focus ring was fighting
   with several of the color overrides above, and a few custom controls
   (.icon-btn, .calendar-day, .status-radio-label, .player-name) never
   had a focus style defined at all. :focus-visible only shows this ring
   for keyboard/programmatic focus, not for a mouse click, so it doesn't
   add a border around every button a player taps on a touchscreen. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible,
.btn:focus-visible,
.icon-btn:focus-visible,
.nav-link:focus-visible,
.calendar-day:focus-visible,
.status-radio-label:focus-visible,
.player-name:focus-visible,
[tabindex]:focus-visible {
    outline: 3px solid var(--gold);
    outline-offset: 2px;
}

/* Several cards, buttons, and nav links above use hover transitions and
   translateY() lift effects purely as decoration. A visitor who has told
   their OS they get motion sickness or vestibular symptoms from movement
   (prefers-reduced-motion: reduce) never asked for any of that, so this
   turns transitions/animations into instant, motionless state changes
   site-wide instead of trying to track down and override each one by
   hand, new hover effects added later inherit the same protection
   automatically. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}