/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
/* ── Dialog as full-viewport flex overlay ──────────────────────────────────────
   Blazor's runtime never calls showModal() itself — only our .razor.js handler
   does. We style the <dialog> as a viewport-spanning flex container so it looks
   correct in either mode (top-layer modal via showModal() or non-modal via just
   the [open] attribute). The inner div is the visible card.                    */
#components-reconnect-modal[b-48ypysyzq6] {
    position: fixed;
    inset: 0;
    width: 100vw;
    height: 100vh;
    max-width: none;
    max-height: none;
    margin: 0;
    padding: 1rem;
    background-color: rgb(19 19 20 / 0.8);
    border: 0;
    color: inherit;
    z-index: 50;
}

    #components-reconnect-modal[open][b-48ypysyzq6] {
        display: flex;
        align-items: center;
        justify-content: center;
        animation: reconnect-fade-in-b-48ypysyzq6 0.5s ease-in-out 0.3s both;
    }

    /* Delay the fade-in so brief drops — e.g. a .NET graceful-shutdown blip
       where the first reconnect succeeds within ~200 ms — never visually
       surface. Matches stock Blazor's 0.3 s opening delay. */
    @keyframes reconnect-fade-in-b-48ypysyzq6 {
        from {
            opacity: 0;
        }

        to {
            opacity: 1;
        }
    }

    /* When showModal() runs, the dialog enters the top layer and the browser
       paints a separate ::backdrop element. The dialog itself already paints
       our overlay color, so neutralise ::backdrop to avoid stacking two
       semi-transparent layers (which would over-darken). */
    #components-reconnect-modal[b-48ypysyzq6]::backdrop {
        background-color: transparent;
    }

/* ── Visibility-toggle rule chain — uses ::deep so the scope attribute is only
   required on the dialog itself, not on each descendant. Blazor's scoped-CSS
   compiler appends [b-…] to the parent selector and leaves the descendants
   un-attributed, which is the contract we want when state classes drive child
   visibility from outside the .razor render tree.                              */
#components-reconnect-modal[b-48ypysyzq6]  .components-reconnect-first-attempt-visible,
#components-reconnect-modal[b-48ypysyzq6]  .components-reconnect-repeated-attempt-visible,
#components-reconnect-modal[b-48ypysyzq6]  .components-reconnect-failed-visible,
#components-reconnect-modal[b-48ypysyzq6]  .components-pause-visible,
#components-reconnect-modal[b-48ypysyzq6]  .components-resume-failed-visible {
    display: none;
}

#components-reconnect-modal.components-reconnect-show[b-48ypysyzq6]  .components-reconnect-first-attempt-visible,
#components-reconnect-modal.components-reconnect-retrying[b-48ypysyzq6]  .components-reconnect-repeated-attempt-visible,
#components-reconnect-modal.components-reconnect-failed[b-48ypysyzq6]  .components-reconnect-failed-visible,
#components-reconnect-modal.components-reconnect-paused[b-48ypysyzq6]  .components-pause-visible,
#components-reconnect-modal.components-reconnect-resume-failed[b-48ypysyzq6]  .components-resume-failed-visible {
    display: block;
}

/* Blazor adds `retrying` without removing `show` once attempt > 1. Without this
   override both paragraphs would render at once. */
#components-reconnect-modal.components-reconnect-retrying[b-48ypysyzq6]  .components-reconnect-first-attempt-visible {
    display: none;
}

/* ── Rotating-ring spinner — mirrors the shared .btn-spinner pattern in Styles/app.css ── */
#components-reconnect-modal[b-48ypysyzq6]  .reconnect-spinner {
    width: 64px;
    height: 64px;
    border: 2px solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    color: var(--color-primary);
    animation: reconnect-spin-b-48ypysyzq6 0.7s linear infinite;
}

@keyframes reconnect-spin-b-48ypysyzq6 {
    to {
        transform: rotate(360deg);
    }
}
/* /Components/Pages/Admin/Closures.razor.rz.scp.css */
/* ZEI-471 person-card collapse (closureQueueCollapse.js toggles the .collapsed class — always
   render both meta lines and CSS-hide one, per the ZEI-219 Stempeluhr precedent, so a collapse
   round-trip never loses DOM state). */

/* Hides every card's body while <html> carries .closures-collapse-pending — set synchronously
   in <head> by closuresCollapsePending.js before first paint, removed by
   closureQueueCollapse.js's apply() once it has restored (or found none of) the stored collapse
   state. Applies to every card, not just collapsed-candidates, because which cards are
   candidates isn't known this early either — a flash is only actually possible for cards that
   end up collapsed, but hiding all of them for one frame is imperceptible and far simpler than
   threading per-card state through two independent scripts. */
html.closures-collapse-pending .card-weeks[b-3xpijojxty],
html.closures-collapse-pending .card-foot[b-3xpijojxty] {
    display: none;
}

.closure-card .meta-short[b-3xpijojxty] {
    display: none;
}

.closure-card.collapsed .meta-full[b-3xpijojxty],
.closure-card.collapsed .card-weeks[b-3xpijojxty],
.closure-card.collapsed .card-foot[b-3xpijojxty] {
    display: none;
}

.closure-card.collapsed .meta-short[b-3xpijojxty] {
    display: block;
}

.closure-card .card-chevron[b-3xpijojxty] {
    transition: transform 0.15s ease;
}

.closure-card.collapsed .card-chevron[b-3xpijojxty] {
    transform: rotate(180deg);
}
