/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-739djkm78g] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

main[b-739djkm78g] {
    flex: 1;
}

#blazor-error-ui[b-739djkm78g] {
    color-scheme: light only;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss[b-739djkm78g] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.topbar[b-rg61plsfb0] {
    background-image: linear-gradient(90deg, rgb(5, 39, 103) 0%, #3a0647 100%);
    padding: 0.5rem 1rem;
    position: sticky;
    top: 0;
    z-index: 10;
}

.navbar-brand[b-rg61plsfb0] {
    font-size: 1.25rem;
    font-weight: 600;
    text-transform: none;
}

.navbar-nav[b-rg61plsfb0]  .nav-link {
    color: #d7d7d7;
    padding: 0.5rem 1rem;
}

.navbar-nav[b-rg61plsfb0]  .nav-link:hover {
    color: #fff;
}

.navbar-nav[b-rg61plsfb0]  a.active {
    color: #fff;
    font-weight: 600;
}

.logout-link[b-rg61plsfb0] {
    background: none;
    border: none;
    width: 100%;
    text-align: left;
}

@media (min-width: 768px) {
    .logout-link[b-rg61plsfb0] {
        width: auto;
        text-align: inherit;
    }
}

/* Flyout submenus (My Leagues -> each league -> Create Session / Sessions).
   Bootstrap's JS bundle isn't loaded in this app, so submenu open/close is
   driven entirely by Blazor state toggling the "show" class -- these rules
   just handle positioning the flyout once it's shown. */
.dropdown-submenu[b-rg61plsfb0] {
    position: relative;
}

.dropdown-submenu > .dropdown-menu[b-rg61plsfb0] {
    top: 0;
    left: 100%;
    margin-top: -0.25rem;
}

.submenu-toggle[b-rg61plsfb0] {
    background: none;
    border: none;
    color: inherit;
    padding: 0.25rem 0.5rem;
}

/* A full season can have 30+ sessions -- keep the flyout from running off the
   bottom of the screen. */
.sessions-flyout[b-rg61plsfb0] {
    max-height: 320px;
    overflow-y: auto;
}

/* The League and Admin toggles are buttons rather than href="#" anchors -- see
   the note in NavMenu.razor. Bootstrap styles .nav-link the same either way;
   this just keeps a button from picking up the browser's default chrome and,
   in the stacked mobile layout, lets it span the row like the anchors did. */
.navbar-nav[b-rg61plsfb0]  button.nav-link {
    background: none;
    border: 0;
    width: 100%;
    text-align: left;
}

@media (min-width: 768px) {
    .navbar-nav[b-rg61plsfb0]  button.nav-link {
        width: auto;
    }
}

@media (max-width: 767.98px) {
    /* The navbar collapses to a stacked list below md -- a flyout-to-the-right
       submenu would run off screen, so just indent it inline instead. */
    .dropdown-submenu > .dropdown-menu[b-rg61plsfb0] {
        position: static;
        left: 0;
        margin-left: 1rem;
    }

    /* A finger needs more than a bare caret to hit. Anything smaller and a
       tap meant for the arrow lands on the "My Leagues" link beside it, which
       navigates away and closes the menu instead of expanding it. */
    .submenu-toggle[b-rg61plsfb0] {
        min-width: 2.75rem;
        min-height: 2.75rem;
        display: flex;
        align-items: center;
        justify-content: center;
        border-left: 1px solid rgba(0, 0, 0, 0.1);
    }
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-mzcemie4t6],
.components-reconnect-repeated-attempt-visible[b-mzcemie4t6],
.components-reconnect-failed-visible[b-mzcemie4t6],
.components-pause-visible[b-mzcemie4t6],
.components-resume-failed-visible[b-mzcemie4t6],
.components-rejoining-animation[b-mzcemie4t6] {
    display: none;
}

#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-retrying[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-failed[b-mzcemie4t6],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-mzcemie4t6] {
    display: block;
}


#components-reconnect-modal[b-mzcemie4t6] {
    background-color: white;
    width: 20rem;
    margin: 20vh auto;
    padding: 2rem;
    border: 0;
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-mzcemie4t6 0.5s both;
    &[open]

{
    animation: components-reconnect-modal-slideUp-b-mzcemie4t6 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-mzcemie4t6 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

}

#components-reconnect-modal[b-mzcemie4t6]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-mzcemie4t6 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-mzcemie4t6 {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-mzcemie4t6 {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-mzcemie4t6 {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-mzcemie4t6] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

#components-reconnect-modal p[b-mzcemie4t6] {
    margin: 0;
    text-align: center;
}

#components-reconnect-modal button[b-mzcemie4t6] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    padding: 4px 24px;
    border-radius: 4px;
}

    #components-reconnect-modal button:hover[b-mzcemie4t6] {
        background-color: #3b6ea2;
    }

    #components-reconnect-modal button:active[b-mzcemie4t6] {
        background-color: #6b9ed2;
    }

.components-rejoining-animation[b-mzcemie4t6] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .components-rejoining-animation div[b-mzcemie4t6] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-mzcemie4t6 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .components-rejoining-animation div:nth-child(2)[b-mzcemie4t6] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-mzcemie4t6 {
    0% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    4.9% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    5% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 1;
    }

    100% {
        top: 0px;
        left: 0px;
        width: 80px;
        height: 80px;
        opacity: 0;
    }
}
/* /Components/Pages/Home.razor.rz.scp.css */
/* Hero: the logo is a fixed backdrop, pinned to the same spot on screen for
   the entire page -- it never moves, scroll position or not. .home-pitch's
   actual text is a full viewport-height below it on load (off-screen until
   the visitor scrolls), then scrolls up over the logo like a curtain as they
   do.

   .home-logo uses position:fixed rather than sticky specifically so it's
   static from the very first pixel of scroll -- sticky still tracks normal
   document flow until it "catches" at its offset, which reads as the logo
   drifting upward before it locks in place. Fixed elements are removed from
   the document flow entirely, so .home-pitch doesn't need to account for the
   logo's height the way a sticky version would -- its own margin-top is
   enough on its own to push it below the initial full-viewport logo view.

   Fixed elements always stack purely by z-index against other positioned
   elements (nav bar included, itself position:sticky) rather than by DOM
   order -- the nav bar's z-index:10 vs. this element's z-index:0 is what
   keeps the nav on top, not scroll timing. */
.home-logo[b-l0gfn74exd] {
    position: fixed;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 1.5rem;
    z-index: 0;
    pointer-events: none;
}

.home-logo img[b-l0gfn74exd] {
    width: 50vw;
    max-width: 700px;
    height: auto;
}

/* Sits in normal flex flow right under the logo (rather than pinned to the
   sticky box's own bottom edge) so it stays visible on load regardless of
   exactly how tall the nav bar above it renders. */
.home-scroll-cue[b-l0gfn74exd] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.35rem;
    color: #767676;
    font-size: 0.85rem;
    letter-spacing: 0.03em;
    animation: home-scroll-cue-bounce-b-l0gfn74exd 1.6s ease-in-out infinite;
}

.home-scroll-cue svg[b-l0gfn74exd] {
    width: 1.25rem;
    height: 1.25rem;
}

@keyframes home-scroll-cue-bounce-b-l0gfn74exd {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(0.4rem); }
}

@media (prefers-reduced-motion: reduce) {
    .home-scroll-cue[b-l0gfn74exd] {
        animation: none;
    }
}

/* Translucent + blurred rather than a solid fill, so the fixed logo stays
   visible (softened, not sharp) behind the text for the whole rest of the
   scroll, instead of getting hidden the instant .home-pitch reaches it. */
.home-pitch[b-l0gfn74exd] {
    position: relative;
    z-index: 1;
    background-color: rgba(255, 255, 255, 0.55);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    margin-top: 100vh;
    margin-top: 100dvh;
    max-width: 60rem;
    margin-left: auto;
    margin-right: auto;
    padding: 3rem 1rem 3rem;
    text-align: center;
}

.home-tagline[b-l0gfn74exd] {
    font-size: 1.25rem;
    font-weight: 500;
    color: #333;
    max-width: 42rem;
    margin: 0 auto 2rem;
}

/* Each callout is sized to its own text -- no forced full-screen height --
   but still reveals one at a time via a sticky reveal per callout. A naive
   version of this (just .home-point { position:sticky }, no wrapper) doesn't
   work: a sticky element's "stuck" range is bounded by its own PARENT's box,
   and every .home-point's parent would otherwise be .home-pitch itself --
   the one giant container spanning all the way to the CTA button. That would
   pin the last callout in place for the *entire remaining page*, permanently
   hiding the games section and CTA behind it.

   So each callout gets its own small wrapper (.home-point-wrap) taller than
   the callout itself -- that becomes the sticky element's containing block,
   giving it a bounded "dwell" range (stick, hold while the extra wrapper
   height scrolls by, then release) before the *next* wrapper's callout does
   the same and covers it. Translucent + blurred like .home-pitch, so the
   logo keeps showing through underneath the whole stack. */
.home-point-wrap[b-l0gfn74exd] {
    position: relative;
    min-height: 50vh;
    min-height: 50dvh;
}

.home-point-wrap-last[b-l0gfn74exd] {
    min-height: 10vh;
    min-height: 10dvh;
}

.home-point[b-l0gfn74exd] {
    position: sticky;
    top: 0;
    z-index: 1;
    max-width: 34rem;
    margin: 0 auto;
    background-color: rgba(255, 255, 255, 0.9);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    border-radius: 0.75rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.08);
    padding: 2.25rem 1.75rem;
    text-align: center;
}

.home-point-tint[b-l0gfn74exd] {
    background-color: rgba(245, 245, 245, 0.9);
}

.home-point h3[b-l0gfn74exd] {
    font-size: 1.4rem;
    font-weight: 600;
    margin-bottom: 0.6rem;
}

.home-point p[b-l0gfn74exd] {
    margin: 0 auto;
    color: #495057;
    font-size: 1rem;
}

.home-point-upcoming[b-l0gfn74exd] {
    border-top: 3px dashed #adb5bd;
}

.home-point-upcoming h3[b-l0gfn74exd]::after {
    content: "Planned";
    display: inline-block;
    margin-left: 0.5rem;
    font-size: 0.7rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: #6c757d;
    background-color: #eee;
    border-radius: 0.25rem;
    padding: 0.1rem 0.4rem;
    vertical-align: middle;
}

.home-section-title[b-l0gfn74exd] {
    font-size: 1.3rem;
    font-weight: 600;
    margin-bottom: 1.25rem;
}

.home-games[b-l0gfn74exd] {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
    text-align: left;
    margin-bottom: 2.5rem;
}

@media (max-width: 992px) {
    .home-games[b-l0gfn74exd] {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 700px) {
    .home-games[b-l0gfn74exd] {
        grid-template-columns: 1fr;
    }
}

/* NavLink renders its own <a> internally, so plain scoped selectors here never
   match it -- Blazor CSS isolation doesn't cascade into a child component's own
   markup without ::deep (same reason SessionSubNav.razor.css needs it for its
   NavLink pills). */
.home-games[b-l0gfn74exd]  .home-game-card {
    display: block;
    background-color: #fff;
    border: 1px solid #dee2e6;
    border-top: 3px solid #0681a1;
    border-radius: 0.5rem;
    padding: 1.1rem 1.25rem;
    color: inherit;
    text-decoration: none;
    transition: box-shadow 0.15s ease, transform 0.15s ease;
}

.home-games[b-l0gfn74exd]  .home-game-card:hover {
    box-shadow: 0 0.35rem 0.75rem rgba(0, 0, 0, 0.12);
    transform: translateY(-2px);
    color: inherit;
}

.home-games[b-l0gfn74exd]  .home-game-card h3 {
    font-size: 1.05rem;
    font-weight: 600;
    margin-bottom: 0.4rem;
    color: #0681a1;
}

.home-games[b-l0gfn74exd]  .home-game-card p {
    margin-bottom: 0;
    color: #495057;
    font-size: 0.9rem;
}

.home-pitch[b-l0gfn74exd]  .home-cta {
    padding: 0.6rem 2rem;
    font-weight: 600;
}
/* /Components/Pages/Leagues/CreateLeague.razor.rz.scp.css */
.setup-warning-backdrop[b-0rvrsimqyu] {
    position: fixed;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1050;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding-top: 4rem;
}

.setup-warning-dialog[b-0rvrsimqyu] {
    background-color: #fff;
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.3);
    padding: 1.25rem;
    width: 100%;
    max-width: 28rem;
}
/* /Components/Pages/Leagues/EnterScores.razor.rz.scp.css */
/* Bootstrap's .table-responsive sets overflow-x: auto, and per the CSS overflow
   spec a non-"visible" overflow-x forces the computed overflow-y to "auto" too
   -- even though nothing ever actually scrolls inside this div (it has no
   max-height, so it's always exactly as tall as the table). That silently
   makes .table-responsive itself the "nearest scrolling ancestor" that
   `position: sticky` below measures against, instead of the page. Since that
   div's own scroll offset never moves (the *page* scrolls it, not the other
   way around), sticky had nothing to react to and the header just scrolled
   away with everything else. Turning off its overflow here restores the page
   as the sticky containing block; the tradeoff is this table no longer gets
   Bootstrap's automatic horizontal scrollbar on narrow screens. */
.table-responsive[b-qqx5q89ko7] {
    overflow: visible;
}

/* Keeps the column headers in view while scrolling through a long roster.
   top matches where SessionSubNav's own sticky bar ends (59px topbar + ~67.4px
   subnav, see SessionSubNav.razor.css for the topbar/subnav offsets) so the
   header settles directly under it with no gap and no overlap, and the body
   rows scroll on underneath it. z-index sits just below the subnav's (9) so
   the subnav still wins if they ever touch. */
.table-responsive thead th[b-qqx5q89ko7] {
    position: sticky;
    top: 127px;
    z-index: 8;
    background-color: #fff;
}
/* /Components/Pages/Leagues/EnterScoresByLane.razor.rz.scp.css */
/* Sized for a phone held one-handed at the lanes, not for a desk. Everything here is
   about thumb targets and legibility under bowling-alley lighting. */

.lane-entry[b-9hf871ym9k] {
    max-width: 34rem;
    margin: 0 auto;
}

.lane-entry-header[b-9hf871ym9k] {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--bs-body-bg);
    padding: 0.5rem 0 0.75rem;
    border-bottom: 1px solid var(--bs-border-color);
    margin-bottom: 0.75rem;
}

/* One bowler per row: name on its own line, then the game boxes. Two columns of
   name-and-inputs would halve the input width, which is the one thing that can't
   shrink. */
.lane-bowler[b-9hf871ym9k] {
    padding: 0.6rem 0;
    border-bottom: 1px solid var(--bs-border-color);
}

.lane-bowler-name[b-9hf871ym9k] {
    font-weight: 600;
    margin-bottom: 0.35rem;
}

.lane-bowler-scores[b-9hf871ym9k] {
    display: flex;
    gap: 0.5rem;
}

.lane-score[b-9hf871ym9k] {
    flex: 1 1 0;
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}

.lane-score-label[b-9hf871ym9k] {
    font-size: 0.75rem;
    color: var(--bs-secondary-color);
}

/* 1.25rem text and a tall box: a three-digit score typed with a thumb, checked at
   arm's length. 16px minimum also stops iOS zooming the page on focus. */
.lane-score-input[b-9hf871ym9k] {
    font-size: 1.25rem;
    text-align: center;
    padding: 0.5rem 0.25rem;
    height: auto;
}

.lane-actions[b-9hf871ym9k] {
    display: flex;
    gap: 0.5rem;
    margin-top: 1rem;
}

.lane-actions .btn[b-9hf871ym9k] {
    flex: 1 1 0;
    padding-top: 0.6rem;
    padding-bottom: 0.6rem;
}

.lane-nav[b-9hf871ym9k] {
    display: flex;
    justify-content: space-between;
    gap: 0.5rem;
    margin-top: 1rem;
}
/* /Components/Pages/Leagues/EnterThreeSixNineResults.razor.rz.scp.css */
.markfinal-backdrop[b-iq1g3znxyz] {
    position: fixed;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1050;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding-top: 4rem;
}

.markfinal-dialog[b-iq1g3znxyz] {
    background-color: #fff;
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.3);
    padding: 1.25rem;
    width: 100%;
    max-width: 28rem;
}
/* /Components/Pages/Leagues/MySessionDetail.razor.rz.scp.css */
/* Bowler-facing session view. Built for a phone first: stacked cards, two-up
   summary tiles, and nothing wider than the screen. The desktop layout is just
   the same cards given more room. */

.min-w-0[b-p6gozp4aov] {
    min-width: 0;
}

.tile[b-p6gozp4aov] {
    border: 1px solid var(--bs-border-color);
    border-radius: 0.5rem;
    padding: 0.6rem 0.8rem;
    background: var(--bs-body-bg);
    height: 100%;
}

.tile-label[b-p6gozp4aov] {
    font-size: 0.75rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--bs-secondary-color);
}

.tile-value[b-p6gozp4aov] {
    font-size: 1.35rem;
    font-weight: 600;
    line-height: 1.2;
}

.tile-due[b-p6gozp4aov] {
    border-color: var(--bs-warning);
    background: var(--bs-warning-bg-subtle);
}

.tile-won[b-p6gozp4aov] {
    border-color: var(--bs-success);
    background: var(--bs-success-bg-subtle);
}

.winner-me[b-p6gozp4aov] {
    background: var(--bs-primary-bg-subtle);
}

/* Comfortable thumb-sized rows on a phone. */
@media (max-width: 576px) {
    .list-group-item[b-p6gozp4aov] {
        padding-top: 0.75rem;
        padding-bottom: 0.75rem;
    }
}
/* /Components/Pages/Leagues/MySessions.razor.rz.scp.css */
/* Whole-row tap targets for the bowler's session list; sized for a thumb. */

.min-w-0[b-av428ebdeo] {
    min-width: 0;
}

.session-row[b-av428ebdeo] {
    padding: 0.85rem 1rem;
    min-height: 3.5rem;
}

.session-name[b-av428ebdeo] {
    overflow-wrap: anywhere;
}
/* /Components/Pages/Leagues/SessionDetail.razor.rz.scp.css */
/* Bootstrap/Bootswatch Journal tints an expanded accordion-button with the
   theme's danger-ish accent (pale red background, dark red text/border) --
   fine for a genuine warning, but "Enter a Participant" isn't one. Swap the
   expanded-state colors back to a neutral gray so it reads as a normal
   section header, not an alert. */
.entry-accordion-button:not(.collapsed)[b-uw38h8zr13] {
    background-color: var(--bs-tertiary-bg, #f5f5f5);
    color: var(--bs-body-color, #212529);
    box-shadow: inset 0 -1px 0 var(--bs-border-color, #dee2e6);
}

.entry-accordion-button:not(.collapsed)[b-uw38h8zr13]::after {
    /* Reuse the same chevron used in the collapsed state instead of
       Bootstrap's active-state icon, which is tinted to match the accent
       color being overridden above. */
    background-image: var(--bs-accordion-btn-icon);
}

/* SubmitEntries scrolls here (#enter-a-participant) after every save, via a
   plain #fragment navigation -- the browser's native anchor-scroll puts the
   target's top edge at viewport y:0, which is exactly where it'd end up
   hidden behind the two stacked sticky bars above it (.topbar, 59px, then
   .session-subnav, ~67px more). scroll-margin-top reserves that same space
   so the anchor-scroll stops with the form actually visible below both bars
   instead of tucked behind them. */
#enter-a-participant[b-uw38h8zr13] {
    scroll-margin-top: 130px;
}

/* Same modal treatment as SessionSubNav's Print Scoresheet dialog -- a
   centered card over a dimmed backdrop -- shown when the operator tries to
   leave the currently-viewed event (or step) with its payout still
   unaccepted. */
.setup-warning-backdrop[b-uw38h8zr13] {
    position: fixed;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1050;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding-top: 4rem;
}

.setup-warning-dialog[b-uw38h8zr13] {
    background-color: #fff;
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.3);
    padding: 1.25rem;
    width: 100%;
    max-width: 28rem;
    /* Most dialogs using this class are short and fixed-height (a confirm
       prompt, a short form), but Lane Assignments' row list grows with the
       session's team count -- a big league can run past the viewport with
       no way to reach Save/Cancel below the fold. Capping height and
       scrolling inside the card (rather than the page) keeps the backdrop,
       header and action buttons all in place regardless of row count; short
       dialogs never hit the ceiling so nothing changes for them. */
    max-height: calc(100vh - 8rem);
    overflow-y: auto;
}

/* The Enter a Participant row. Cell padding is trimmed and the per-event entry/bracket count
   wraps so the bowler search box (min-width:300px in the markup) fits beside five or six
   events without the row growing wider than it used to. */
.entry-grid th[b-uw38h8zr13],
.entry-grid td[b-uw38h8zr13] {
    padding-left: 0.4rem;
    padding-right: 0.4rem;
}

.entry-grid-count[b-uw38h8zr13] {
    display: block;
    max-width: 7.5rem;
    white-space: normal;
    line-height: 1.2;
}
/* /Components/Pages/Leagues/ViewBrackets.razor.rz.scp.css */
.bracket-filter[b-bgud20wod6] {
    display: flex;
    align-items: center;
}

.bracket-filter select[b-bgud20wod6] {
    max-width: 18rem;
}

.bracket-nav[b-bgud20wod6] {
    display: flex;
    align-items: center;
    gap: 1rem;
}

.bracket-nav-btn[b-bgud20wod6] {
    flex: 0 0 auto;
    font-size: 1.25rem;
    line-height: 1;
    padding: 0.5rem 0.9rem;
}

.bracket-sheet[b-bgud20wod6] {
    flex: 1 1 auto;
    min-width: 0;
    overflow-x: auto;
}

.bracket-sheet-header[b-bgud20wod6] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.5rem;
}

.bracket-sheet-title[b-bgud20wod6] {
    font-weight: 600;
    font-size: 1.05rem;
}

.bracket-sheet-count[b-bgud20wod6] {
    color: #6c757d;
    font-size: 0.9rem;
}

/* Sits above the final round's own column (see ViewBrackets.razor) rather
   than as a sheet-wide banner -- the "Round N" title/matches below it are the
   same column width, so this naturally stays within that column. */
.bracket-round-results[b-bgud20wod6] {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    margin-bottom: 0.5rem;
    font-size: 0.95rem;
}

/* Sits below whichever round's matches it explains (see ViewBrackets.razor),
   inside that same .bracket-round column, so it wraps within that column's
   width instead of spanning the whole sheet. */
.bracket-tiebreak-note[b-bgud20wod6] {
    margin: 0.5rem 0 0;
    font-size: 0.8rem;
    color: #495057;
    font-style: italic;
}

.bracket-tree[b-bgud20wod6] {
    display: flex;
    align-items: stretch;
    gap: 2.5rem;
    padding-bottom: 0.5rem;
}

.bracket-round[b-bgud20wod6] {
    display: flex;
    flex-direction: column;
    min-width: 15rem;
}

.bracket-round-title[b-bgud20wod6] {
    font-weight: 600;
    font-size: 0.8rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin-bottom: 0.5rem;
    white-space: nowrap;
}

.bracket-matches[b-bgud20wod6] {
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    flex: 1;
    gap: 1.5rem;
}

.bracket-match[b-bgud20wod6] {
    position: relative;
    border: 1px solid #dee2e6;
    border-radius: 0.375rem;
    background: #fff;
}

.bracket-seat[b-bgud20wod6] {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    padding: 0.35rem 0.6rem;
    font-size: 0.9rem;
}

.bracket-seat:first-child[b-bgud20wod6] {
    border-bottom: 1px solid #eee;
}

.bracket-name[b-bgud20wod6] {
    font-weight: 500;
    flex: 1 1 auto;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.bracket-name-highlight[b-bgud20wod6] {
    background-color: #fff3cd;
    border-radius: 0.2rem;
    padding: 0 0.25rem;
    margin: 0 -0.25rem;
}

.bracket-score[b-bgud20wod6] {
    color: #495057;
    font-size: 0.82rem;
    white-space: nowrap;
}

.bracket-bye[b-bgud20wod6],
.bracket-tbd[b-bgud20wod6] {
    color: #adb5bd;
    font-style: italic;
    padding: 0.35rem 0.6rem;
}

.bracket-seat-tbd[b-bgud20wod6] {
    padding: 0;
}

/* Elbow connector from each match's right edge into the next round -- only
   visible once round 2+ exists (round-advancement isn't built yet), but costs
   nothing to have ready for when it is. */
.bracket-round:not(:last-child) .bracket-match[b-bgud20wod6]::after {
    content: "";
    position: absolute;
    top: 50%;
    right: -1.25rem;
    width: 1.25rem;
    height: 1px;
    background: #adb5bd;
}
/* /Components/Pages/Leagues/ViewDoubles.razor.rz.scp.css */
.doubles-event-picker[b-2del96p1f4],
.doubles-pot-picker[b-2del96p1f4] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.doubles-pot[b-2del96p1f4] {
    min-width: 0;
}

.doubles-pot-header[b-2del96p1f4] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.5rem;
    max-width: 48rem;
}

.doubles-pot-title[b-2del96p1f4] {
    font-weight: 600;
    font-size: 1.05rem;
}

.doubles-pot-count[b-2del96p1f4] {
    color: #6c757d;
    font-size: 0.9rem;
}

.doubles-table[b-2del96p1f4] {
    max-width: 48rem;
}
/* /Components/Pages/Leagues/ViewEliminator.razor.rz.scp.css */
.eliminator-game-picker[b-k1knkr669i] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.eliminator-carousel[b-k1knkr669i] {
    display: flex;
    align-items: center;
    gap: 1rem;
}

.eliminator-nav-btn[b-k1knkr669i] {
    flex: 0 0 auto;
    font-size: 1.25rem;
    line-height: 1;
    padding: 0.5rem 0.9rem;
}

.eliminator-game[b-k1knkr669i] {
    flex: 1 1 auto;
    min-width: 0;
}

.eliminator-game-header[b-k1knkr669i] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.5rem;
}

.eliminator-game-title[b-k1knkr669i] {
    font-weight: 600;
    font-size: 1.05rem;
}

.eliminator-game-count[b-k1knkr669i] {
    color: #6c757d;
    font-size: 0.9rem;
}

.eliminator-table[b-k1knkr669i] {
    max-width: 40rem;
}

.eliminator-cut-line-row td[b-k1knkr669i] {
    padding: 0.35rem 0;
    border: none;
}

/* Real CSS dotted borders here, unlike EliminatorPdfGenerator's PDF version --
   QuestPDF's public API has no dashed/dotted line support (see that file's own
   remarks), but plain CSS does, so the on-screen cut line doesn't need the
   repeated-character workaround. */
.eliminator-cut-line[b-k1knkr669i] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.eliminator-cut-line-leader[b-k1knkr669i] {
    flex: 1 1 auto;
    border-top: 2px dotted #6c757d;
}

.eliminator-cut-line-label[b-k1knkr669i] {
    flex: 0 0 auto;
    font-weight: 600;
    font-size: 0.85rem;
    color: #495057;
    white-space: nowrap;
}
/* /Components/Pages/Leagues/ViewMysteryScore.razor.rz.scp.css */
.mysteryscore-table[b-azrpw7qvej] {
    max-width: 40rem;
}
/* /Components/Pages/Leagues/ViewSidePots.razor.rz.scp.css */
.sidepot-event-picker[b-qjv48g2lxq],
.sidepot-game-picker[b-qjv48g2lxq] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.sidepot-carousel[b-qjv48g2lxq] {
    display: flex;
    align-items: center;
    gap: 1rem;
}

.sidepot-nav-btn[b-qjv48g2lxq] {
    flex: 0 0 auto;
    font-size: 1.25rem;
    line-height: 1;
    padding: 0.5rem 0.9rem;
}

.sidepot-game[b-qjv48g2lxq] {
    flex: 1 1 auto;
    min-width: 0;
}

.sidepot-game-header[b-qjv48g2lxq] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.5rem;
}

.sidepot-game-title[b-qjv48g2lxq] {
    font-weight: 600;
    font-size: 1.05rem;
}

.sidepot-game-count[b-qjv48g2lxq] {
    color: #6c757d;
    font-size: 0.9rem;
}

.sidepot-table[b-qjv48g2lxq] {
    max-width: 40rem;
}

.sidepot-separator-row td[b-qjv48g2lxq],
.sidepot-cut-line-row td[b-qjv48g2lxq] {
    padding: 0.35rem 0;
    border: none;
}

/* Real CSS dotted borders here, unlike SidePotPdfGenerator's PDF version --
   QuestPDF's public API has no dashed/dotted line support (see that file's own
   remarks), but plain CSS does, so the on-screen separator/cut line don't need
   the repeated-character workaround -- same reasoning as ViewEliminator.razor.css. */
.sidepot-separator[b-qjv48g2lxq],
.sidepot-cut-line[b-qjv48g2lxq] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.sidepot-separator-leader[b-qjv48g2lxq],
.sidepot-cut-line-leader[b-qjv48g2lxq] {
    flex: 1 1 auto;
    border-top: 2px dotted #6c757d;
}

.sidepot-separator-label[b-qjv48g2lxq],
.sidepot-cut-line-label[b-qjv48g2lxq] {
    flex: 0 0 auto;
    font-weight: 600;
    font-size: 0.85rem;
    color: #495057;
    white-space: nowrap;
}
/* /Components/Pages/Leagues/ViewThreeSixNine.razor.rz.scp.css */
.undo-warning-backdrop[b-c5d4xvma1m] {
    position: fixed;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1050;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding-top: 4rem;
}

.undo-warning-dialog[b-c5d4xvma1m] {
    background-color: #fff;
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.3);
    padding: 1.25rem;
    width: 100%;
    max-width: 28rem;
}
/* /Components/Shared/LeagueSubNav.razor.rz.scp.css */
/* Deliberately a copy of SessionSubNav.razor.css's bar rules, not a share --
   Blazor's scoped-CSS isolation means a rule defined there doesn't apply to
   markup rendered by this component. Kept in step with it: if the session bar's
   look changes, change this too, so a league page and a session page read as
   the same stacked header. */
.league-subnav[b-knp7aiz3kd] {
    background-color: #f5f5f5;
    border-bottom: 1px solid #dee2e6;
    padding: 0.3rem 1rem;
    /* Locks in place right below the topbar (sticky at top:0) so the two nav
       bars stay stacked and visible together while the page scrolls. */
    position: sticky;
    top: 59px;
    z-index: 9;
    /* Bleeds out to the topbar's edge-to-edge width and butts against it --
       cancels the page's own top padding (app.css .content: 1.1rem) and side
       padding (MainLayout's px-4: 1.5rem). Assumes this is the first thing in
       the page's content, which is where every page renders it. */
    margin: -1.1rem -1.5rem 0.5rem;
}

.league-subnav-header[b-knp7aiz3kd] {
    display: flex;
    align-items: center;
    justify-content: space-between;
}

/* Bootstrap's .navbar-toggler reads its border color and icon off custom
   properties that only a .navbar element defines -- set explicitly here (no
   .navbar wrapper) so the button has a border and an icon at all. */
.league-subnav-header .navbar-toggler[b-knp7aiz3kd] {
    padding: 0.15rem 0.5rem;
    border: 1px solid rgba(33, 37, 41, 0.15);
    border-radius: 0.375rem;
    background-color: transparent;
}

.league-subnav-header .navbar-toggler-icon[b-knp7aiz3kd] {
    display: inline-block;
    width: 1.5em;
    height: 1.5em;
    vertical-align: middle;
    background-repeat: no-repeat;
    background-position: center;
    background-size: 100%;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(33, 37, 41, 0.75)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}

.league-subnav-labels[b-knp7aiz3kd] {
    font-weight: 600;
    margin-bottom: 0.15rem;
}

/* Below md the pill row starts collapsed behind the hamburger, same as the
   session bar -- a sticky bar under the also-sticky topbar can't afford to
   wrap across several lines of a phone screen. */
@media (max-width: 767.98px) {
    .league-subnav-pills[b-knp7aiz3kd] {
        display: none;
        flex-direction: column;
        align-items: stretch;
    }

    .league-subnav-pills.show[b-knp7aiz3kd] {
        display: flex;
    }
}

.league-subnav-pills .nav-link[b-knp7aiz3kd],
.league-subnav-pills[b-knp7aiz3kd]  .nav-link {
    padding: 0.2rem 0.6rem;
}

/* A plain <button>, not an <a href="#"> -- see SessionSubNav.razor.css. */
.nav-link-button[b-knp7aiz3kd] {
    background: none;
    border: none;
    font: inherit;
}

/* Flyout submenu (Print -> Rules Sheet by Event -> one entry per event).
   Positioning only; open/close is Blazor state toggling "show". */
.dropdown-submenu[b-knp7aiz3kd] {
    position: relative;
}

.dropdown-submenu > .dropdown-menu[b-knp7aiz3kd] {
    top: 0;
    left: 100%;
    margin-top: -0.25rem;
}

@media (max-width: 767.98px) {
    .dropdown-submenu > .dropdown-menu[b-knp7aiz3kd] {
        position: static;
        left: 0;
        margin-left: 1rem;
    }
}

/* Invisible click-catcher behind the bar while a menu is open. The bar itself
   is z-index 9 and stays above this, so its buttons and any open dropdown stay
   clickable; a click anywhere else closes every open menu. */
.nav-dropdown-backdrop[b-knp7aiz3kd] {
    position: fixed;
    inset: 0;
    z-index: 1;
    background: transparent;
}
/* /Components/Shared/PageTour.razor.rz.scp.css */
.tour-help-backdrop[b-hoyk25clss] {
    position: fixed;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1050;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding-top: 4rem;
}

.tour-help-dialog[b-hoyk25clss] {
    background-color: #fff;
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.3);
    padding: 1.25rem;
    width: 100%;
    max-width: 28rem;
}
/* /Components/Shared/SessionSubNav.razor.rz.scp.css */
.session-subnav[b-y2007cgjos] {
    background-color: #f5f5f5;
    border-bottom: 1px solid #dee2e6;
    padding: 0.3rem 1rem;
    /* Locks in place right below the topbar (which is sticky at top:0) so the
       two nav bars stay stacked and visible together while the page content
       underneath scrolls -- like a frozen header row in a spreadsheet. */
    position: sticky;
    top: 59px;
    z-index: 9;
    /* Bleeds out to the same edge-to-edge width as the topbar above it and
       butts directly against it, with no gap and no side inset -- cancels
       the page's own top padding (app.css .content: 1.1rem) and side padding
       (MainLayout's px-4: 1.5rem) so the two bars read as one continuous
       stacked header instead of an indented card floating below the navbar. */
    margin: -1.1rem -1.5rem 0.5rem;
}

.session-subnav-header[b-y2007cgjos] {
    display: flex;
    align-items: center;
    justify-content: space-between;
}

/* Bootstrap's .navbar-toggler/.navbar-toggler-icon read their border color
   and icon SVG off CSS custom properties (--bs-navbar-toggler-*) that only
   ever get defined on a .navbar element itself -- reused here bare (no
   .navbar ancestor), those variables are unset, so the button rendered with
   no border and no visible icon at all. Set explicitly instead, copied from
   Bootstrap's own default (light) values, so it looks identical to a normal
   navbar-toggler without depending on a .navbar wrapper to supply them. */
.session-subnav-header .navbar-toggler[b-y2007cgjos] {
    padding: 0.15rem 0.5rem;
    border: 1px solid rgba(33, 37, 41, 0.15);
    border-radius: 0.375rem;
    background-color: transparent;
}

.session-subnav-header .navbar-toggler-icon[b-y2007cgjos] {
    display: inline-block;
    width: 1.5em;
    height: 1.5em;
    vertical-align: middle;
    background-repeat: no-repeat;
    background-position: center;
    background-size: 100%;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(33, 37, 41, 0.75)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}

.session-subnav-labels[b-y2007cgjos] {
    font-weight: 600;
    margin-bottom: 0.15rem;
}

/* Below md, the pill row starts collapsed behind the hamburger toggle in
   .session-subnav-header -- a session with several side-action events adds
   an "Enter X Results" pill per game type on top of the fixed ones, which
   wrapped across 3+ lines and, since this bar is sticky right under the also-
   sticky topbar, permanently ate a large chunk of a phone screen. At md and
   up the row stays exactly as it always has: always visible, in a line. */
@media (max-width: 767.98px) {
    .session-subnav-pills[b-y2007cgjos] {
        display: none;
        flex-direction: column;
        align-items: stretch;
    }

    .session-subnav-pills.show[b-y2007cgjos] {
        display: flex;
    }
}

.session-subnav-sep[b-y2007cgjos] {
    margin: 0 0.35rem;
    opacity: 0.5;
}

.session-subnav-pills .nav-link[b-y2007cgjos],
.session-subnav-pills[b-y2007cgjos]  .nav-link {
    padding: 0.2rem 0.6rem;
}

.session-subnav-pills .nav-link.disabled[b-y2007cgjos] {
    color: #adb5bd;
}

/* A plain <button>, not an <a href="#">, on purpose -- an anchor with a
   fragment-only href here got hijacked by Blazor's enhanced-navigation script
   into a full page navigation instead of running @onclick, even with
   @onclick:preventDefault set. A <button> has no default navigation behavior
   at all, so there's nothing for it to intercept. Just strips the browser's
   default button chrome so it reads identically to the other nav-link pills. */
.nav-link-button[b-y2007cgjos] {
    background: none;
    border: none;
    font: inherit;
}

/* Flyout submenu (Print -> Entry Sheets -> Blank/Bowler Sheets). Duplicated
   from NavMenu.razor.css rather than shared -- Blazor's scoped-CSS isolation
   means a rule defined there doesn't apply to markup rendered by this
   component. Same positioning-only rules, same reasoning: Bootstrap's JS
   bundle isn't loaded, so open/close is Blazor state toggling "show". */
.dropdown-submenu[b-y2007cgjos] {
    position: relative;
}

.dropdown-submenu > .dropdown-menu[b-y2007cgjos] {
    top: 0;
    left: 100%;
    margin-top: -0.25rem;
}

@media (max-width: 767.98px) {
    .dropdown-submenu > .dropdown-menu[b-y2007cgjos] {
        position: static;
        left: 0;
        margin-left: 1rem;
    }
}

/* Invisible click-catcher behind the nav bar while any dropdown is open (see
   the razor file's CloseAllMenus) -- .session-subnav itself is z-index:9
   (sticky header) and stays above this, so the nav buttons and any open
   dropdown/submenu remain directly clickable; everything else on the page
   sits below this and a click there closes every open menu instead. z-index
   1 keeps it above ordinary static page content (z-index:auto) without
   coming anywhere near the print dialog's modal backdrop (1050). */
.nav-dropdown-backdrop[b-y2007cgjos] {
    position: fixed;
    inset: 0;
    z-index: 1;
    background: transparent;
}

/* No Bootstrap JS bundle in this app (established convention) -- this modal is
   plain Blazor conditional rendering + CSS, not data-bs-toggle. z-index 1050
   matches Bootstrap's own .modal convention so it reliably sits above the
   sticky topbar (10) and subnav (9). */
.print-dialog-backdrop[b-y2007cgjos] {
    position: fixed;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 1050;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding-top: 4rem;
}

.print-dialog[b-y2007cgjos] {
    background-color: #fff;
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.3);
    padding: 1.25rem;
    width: 100%;
    max-width: 26rem;
}

/* Payouts' two dialogs (Aggregate, By Event) each stack a report section AND
   a labels section -- including a label-sheet dropdown with long option text
   ("Avery 5164 -- 6/sheet, 4" x 3.33"") -- so the base .print-dialog width
   was cramping them enough to push the Print Labels button out of view.
   Double width, this modifier only -- every other print dialog (Eliminator,
   Side Pot, Blank Sheets, etc.) keeps the normal .print-dialog size. */
.print-dialog-wide[b-y2007cgjos] {
    max-width: 52rem;
}
