/* /Components/Features/Training/MeetingSetup/MeetingSetup.razor.rz.scp.css */
/* 
  MeetingSetup.razor.css

  This is "scoped CSS" for the MeetingSetup component.
  Blazor will scope these selectors to this component automatically.

  Goals for V1:
  - Clean 3-column layout (Left accordion / Center script / Right qualifying)
  - Big, low-cognitive-load Yes/No buttons (green/red)
  - Right column items look like a checklist you can rip through quickly
  - Simple, obvious affordances (hover, focus)
*/

.meeting-setup[b-kqynqfsmxq] {
    display: grid;
    grid-template-columns: 18rem 1fr 22rem; /* left / center / right */
    gap: 1rem;
    align-items: start;
}

/* Responsive fallback: stack on small screens */
@media (max-width: 900px) {
    .meeting-setup[b-kqynqfsmxq] {
        grid-template-columns: 1fr;
    }
}

/* ---------------------------
   Panels
--------------------------- */

.panel[b-kqynqfsmxq] {
    background: white;
    border: 1px solid rgba(0,0,0,0.08);
    border-radius: 0.75rem;
    box-shadow: 0 1px 2px rgba(0,0,0,0.05);
    overflow: hidden;
}

.panel-header[b-kqynqfsmxq] {
    padding: 0.75rem 0.9rem;
    border-bottom: 1px solid rgba(0,0,0,0.06);
    background: #fafafa;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
}

.panel-title[b-kqynqfsmxq] {
    font-weight: 700;
    margin: 0;
    font-size: 0.95rem;
}

.panel-body[b-kqynqfsmxq] {
    padding: 0.9rem;
}

/* ---------------------------
   Left accordion
--------------------------- */

.accordion-group[b-kqynqfsmxq] {
    border-bottom: 1px solid rgba(0,0,0,0.06);
}

.accordion-toggle[b-kqynqfsmxq] {
    width: 100%;
    text-align: left;
    border: 0;
    background: transparent;
    padding: 0.85rem 0.9rem;
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: space-between;
    cursor: pointer;
}

.accordion-toggle:hover[b-kqynqfsmxq] {
    background: rgba(0,0,0,0.03);
}

.accordion-items[b-kqynqfsmxq] {
    padding: 0.25rem 0.25rem 0.75rem 0.25rem;
}

.nav-step[b-kqynqfsmxq] {
    width: 100%;
    text-align: left;
    border: 0;
    background: transparent;
    padding: 0.55rem 0.65rem;
    border-radius: 0.5rem;
    cursor: pointer;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}

.nav-step:hover[b-kqynqfsmxq] {
    background: rgba(0,0,0,0.03);
}

.nav-step.active[b-kqynqfsmxq] {
    background: rgba(13,110,253,0.10); /* bootstrap-ish blue tint */
    border: 1px solid rgba(13,110,253,0.25);
}

.nav-step .label[b-kqynqfsmxq] {
    font-weight: 700;
    font-size: 0.92rem;
}

.nav-step .sub[b-kqynqfsmxq] {
    font-size: 0.8rem;
    opacity: 0.75;
}

/* ---------------------------
   Center script viewer
--------------------------- */

.name-row[b-kqynqfsmxq] {
    display: flex;
    gap: 0.5rem;
    align-items: center;
}

.name-row label[b-kqynqfsmxq] {
    font-weight: 700;
    font-size: 0.85rem;
    opacity: 0.85;
}

.name-row input[b-kqynqfsmxq] {
    flex: 1;
}

.script-title[b-kqynqfsmxq] {
    font-weight: 800;
    font-size: 1.15rem;
    margin: 0;
}

.script-subtitle[b-kqynqfsmxq] {
    margin: 0.25rem 0 0.75rem 0;
    opacity: 0.75;
    font-size: 0.9rem;
}

.script-lines[b-kqynqfsmxq] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.script-line[b-kqynqfsmxq] {
    padding: 0.55rem 0.65rem;
    border-radius: 0.6rem;
    background: rgba(0,0,0,0.03);
    border: 1px solid rgba(0,0,0,0.06);
    font-size: 0.95rem;
    line-height: 1.3;
}

/* ---------------------------
   Right qualifying checklist
--------------------------- */

.qual-header-actions[b-kqynqfsmxq] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.banner-fail[b-kqynqfsmxq] {
    padding: 0.75rem 0.9rem;
    margin: 0.9rem;
    border-radius: 0.75rem;
    border: 1px solid rgba(220,53,69,0.35);
    background: rgba(220,53,69,0.08);
}

.banner-fail .title[b-kqynqfsmxq] {
    font-weight: 800;
    margin: 0 0 0.25rem 0;
}

.banner-fail .msg[b-kqynqfsmxq] {
    margin: 0;
    opacity: 0.9;
}

.qual-list[b-kqynqfsmxq] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.qual-item[b-kqynqfsmxq] {
    padding: 0.75rem;
    border-radius: 0.75rem;
    border: 1px solid rgba(0,0,0,0.08);
    background: #fff;
}

.qual-item .qtitle[b-kqynqfsmxq] {
    font-weight: 800;
    margin: 0 0 0.25rem 0;
}

.qual-item .help[b-kqynqfsmxq] {
    margin: 0 0 0.6rem 0;
    opacity: 0.8;
    font-size: 0.85rem;
}

/* Inputs inside qualifying items */
.qual-item input[b-kqynqfsmxq],
.qual-item select[b-kqynqfsmxq] {
    width: 100%;
}

/* Inline validation */
.validation[b-kqynqfsmxq] {
    margin-top: 0.4rem;
    color: rgb(180, 35, 50);
    font-weight: 700;
    font-size: 0.85rem;
}

/* ---------------------------
   Big Yes/No buttons
--------------------------- */

.yn-row[b-kqynqfsmxq] {
    display: flex;
    gap: 0.6rem;
    margin-top: 0.2rem;
}

.yn-btn[b-kqynqfsmxq] {
    flex: 1;
    border: 0;
    border-radius: 0.65rem;
    padding: 0.65rem 0.75rem;
    font-weight: 900;
    letter-spacing: 0.2px;
    cursor: pointer;
    box-shadow: 0 1px 2px rgba(0,0,0,0.08);
    transition: transform 80ms ease, box-shadow 120ms ease;
}

.yn-btn:active[b-kqynqfsmxq] {
    transform: translateY(1px);
    box-shadow: 0 0px 1px rgba(0,0,0,0.10);
}

/* Green (Yes) */
.yn-yes[b-kqynqfsmxq] {
    background: #198754; /* bootstrap success */
    color: white;
}

/* Red (No) */
.yn-no[b-kqynqfsmxq] {
    background: #dc3545; /* bootstrap danger */
    color: white;
}

/* Small utility buttons */
.btn-lite[b-kqynqfsmxq] {
    border: 1px solid rgba(0,0,0,0.15);
    background: white;
    padding: 0.35rem 0.6rem;
    border-radius: 0.55rem;
    cursor: pointer;
    font-weight: 700;
    font-size: 0.85rem;
}

.btn-lite:hover[b-kqynqfsmxq] {
    background: rgba(0,0,0,0.03);
}

.btn-primaryish[b-kqynqfsmxq] {
    border: 0;
    background: rgba(13,110,253,0.90);
    color: white;
    padding: 0.4rem 0.65rem;
    border-radius: 0.6rem;
    cursor: pointer;
    font-weight: 800;
    font-size: 0.85rem;
}

.btn-primaryish:hover[b-kqynqfsmxq] {
    background: rgba(13,110,253,1.0);
}

/* Finalize button stands out */
.btn-finalize[b-kqynqfsmxq] {
    width: 100%;
    border: 0;
    border-radius: 0.75rem;
    padding: 0.75rem 0.85rem;
    font-weight: 900;
    background: #0d6efd;
    color: white;
    cursor: pointer;
    margin-top: 0.75rem;
}

.btn-finalize:hover[b-kqynqfsmxq] {
    filter: brightness(1.05);
}

/* Small spacing helpers */
.mt-2[b-kqynqfsmxq] { margin-top: 0.5rem; }
.mt-3[b-kqynqfsmxq] { margin-top: 0.75rem; }
/* /Components/Layout/MainLayout.razor.rz.scp.css */
/* 
  This stylesheet is controlling the *layout* you showed (MainLayout.razor):
  - .page wraps everything
  - .sidebar is the left nav area
  - .top-row is the header bar above content
  - #blazor-error-ui is the hidden error banner shown if Blazor has a client/circuit problem

  In many Blazor templates, this file is "scoped CSS" for a component.
  If it's named like MainLayout.razor.css, the styles apply only to that component
  (Blazor rewrites selectors behind the scenes).
*/


/* The main wrapper for the layout.
   Mobile-first: defaults to column layout (sidebar stacks on top). */
.page[b-eh9rjyfuzo] {
    position: relative;
    display: flex;
    flex-direction: column;
}

/* Let <main> grow to fill remaining vertical space when using column layout. */
main[b-eh9rjyfuzo] {
    flex: 1;
}

/* Sidebar background gradient (template default colors). */
.sidebar[b-eh9rjyfuzo] {
    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

/* The top header row above the main content area.
   - light gray background
   - bottom border
   - height fixed to 3.5rem
   - content aligned to the right (justify-content: flex-end) */
.top-row[b-eh9rjyfuzo] {
    background-color: #f7f7f7;
    border-bottom: 1px solid #d6d5d5;
    justify-content: flex-end;
    height: 3.5rem;
    display: flex;
    align-items: center;
}

/* 
  "::deep" is Blazor scoped-CSS syntax.

  Why it exists:
  - If this file is scoped (e.g., MainLayout.razor.css), selectors normally only match
    elements inside *this component* with a generated attribute.
  - Links/buttons inside child components (or inside rendered content) might NOT match.
  - "::deep" tells Blazor: "apply this rule to matching descendants even across component boundaries."

  So this rule styles:
  - <a> elements inside .top-row
  - elements with class .btn-link inside .top-row
*/
.top-row[b-eh9rjyfuzo]  a,
.top-row[b-eh9rjyfuzo]  .btn-link {
    white-space: nowrap;      /* prevents wrapping (keeps them on one line) */
    margin-left: 1.5rem;      /* spacing between items */
    text-decoration: none;    /* removes underline by default */
}

/* Hover behavior: show underline for affordance. */
.top-row[b-eh9rjyfuzo]  a:hover,
.top-row[b-eh9rjyfuzo]  .btn-link:hover {
    text-decoration: underline;
}

/* Special-case: the first link in the top row.
   - If it’s too long, truncate with "…" rather than wrapping or overflowing. */
.top-row[b-eh9rjyfuzo]  a:first-child {
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Responsive rules for small screens.
   max-width: 640.98px is a common Bootstrap-ish breakpoint around 640px. */
@media (max-width: 640.98px) {
    /* On small screens, spread items to both sides (instead of all on the right). */
    .top-row[b-eh9rjyfuzo] {
        justify-content: space-between;
    }

    /* Remove the left margin so links don't waste space on narrow screens. */
    .top-row[b-eh9rjyfuzo]  a,
    .top-row[b-eh9rjyfuzo]  .btn-link {
        margin-left: 0;
    }
}

/* Responsive rules for larger screens (desktop). */
@media (min-width: 641px) {

    /* Switch the layout from vertical stacking to horizontal layout:
       sidebar on the left, main content on the right. */
    .page[b-eh9rjyfuzo] {
        flex-direction: row;
    }

    /* Desktop sidebar sizing + behavior. */
    .sidebar[b-eh9rjyfuzo] {
        width: 250px;     /* fixed width sidebar */
        height: 100vh;    /* fill the viewport height */
        position: sticky; /* stays visible when scrolling */
        top: 0;           /* sticky anchor at top of viewport */
    }

    /* Make the top row sticky too (so the header stays visible when scrolling). */
    .top-row[b-eh9rjyfuzo] {
        position: sticky;
        top: 0;
        z-index: 1;       /* keep it above content while scrolling */
    }

    /* A special variant: .top-row.auth
       - likely used when auth/login UI is present
       - gives the first link flexible space and aligns it right */
    .top-row.auth[b-eh9rjyfuzo]  a:first-child {
        flex: 1;          /* first link expands to fill available space */
        text-align: right;
        width: 0;         /* helps ellipsis/truncation work with flex layouts */
    }

    /* Add padding to top row and article content on desktop.
       "!important" forces this padding even if Bootstrap classes try to override it. */
    .top-row[b-eh9rjyfuzo], article[b-eh9rjyfuzo] {
        padding-left: 2rem !important;
        padding-right: 1.5rem !important;
    }
}


/* 
  This section styles the "Blazor error UI" banner:

  In MainLayout.razor you had:
    <div id="blazor-error-ui"> ... </div>

  This banner is normally hidden. It appears when:
  - the interactive connection fails
  - a circuit disconnect happens
  - or Blazor decides it needs to alert the user
*/
#blazor-error-ui[b-eh9rjyfuzo] {
    color-scheme: light only;   /* forces light colors even if the browser is in dark mode */
    background: lightyellow;    /* yellow warning-ish background */
    bottom: 0;                  /* dock to bottom of viewport */
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); /* subtle top shadow */
    box-sizing: border-box;     /* padding included in width */
    display: none;              /* hidden by default (JS/CSS toggles to show it) */
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;            /* stays pinned even while scrolling */
    width: 100%;
    z-index: 1000;              /* above most other UI elements */
}

/* Styles for the dismiss "X" inside the banner. */
#blazor-error-ui .dismiss[b-eh9rjyfuzo] {
    cursor: pointer;            /* shows it's clickable */
    position: absolute;         /* positioned within the banner */
    right: 0.75rem;
    top: 0.5rem;
}
/* /Components/Layout/NavMenu.razor.rz.scp.css */
/*
  This CSS controls your NavMenu component (the sidebar navigation you pasted earlier).

  Key concepts this file demonstrates:
  1) The "hamburger button" is actually a CHECKBOX (.navbar-toggler)
     - when checked, the nav menu becomes visible
     - when unchecked, it collapses (mostly for mobile screens)

  2) The nav menu items are Blazor <NavLink> components, but styled like Bootstrap links.

  3) "::deep" is used because this is likely *scoped CSS* for NavMenu.razor
     - it allows styling elements inside child components / generated markup.
*/


/* This styles the checkbox input so it LOOKS like a hamburger menu button. */
.navbar-toggler[b-pc59xf7zps] {
    appearance: none;
    /*
      appearance: none removes the browser’s default checkbox styling.
      Without this, you'd see a normal checkbox instead of a custom button.
    */

    cursor: pointer;
    /* Makes the mouse pointer show "clickable". */

    width: 3.5rem;
    height: 2.5rem;
    /* Size of the custom hamburger button. */

    color: white;
    /* Not doing much here directly (because background image is the main effect),
       but aligns with a dark theme. */

    position: absolute;
    top: 0.5rem;
    right: 1rem;
    /*
      Absolutely positions the toggle button in the top right of the nav area.
      (Relative to its nearest positioned ancestor.)
    */

    border: 1px solid rgba(255, 255, 255, 0.1);

    background:
            url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")
            no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
    /*
      This is the hamburger icon + background color in one line.

      - The SVG is embedded inline as a data URI so you don't need a separate icon file.
      - "no-repeat center" means center the icon and don't tile.
      - "/1.75rem" sets the background image size.
      - rgba(...) at the end gives a semi-transparent background behind the icon.
    */
}

/* Visual change when the hamburger "checkbox" is checked (menu expanded). */
.navbar-toggler:checked[b-pc59xf7zps] {
    background-color: rgba(255, 255, 255, 0.5);
    /*
      This helps the user see it's in "open" mode.
      The hamburger icon is still there (background image), but now brighter.
    */
}

/* This styles the top brand/header bar in the nav menu. */
.top-row[b-pc59xf7zps] {
    min-height: 3.5rem;
    background-color: rgba(0,0,0,0.4);
    /*
      Gives a slightly dark translucent top bar (works over gradient sidebar).
    */
}

/* Brand text styling (the "Wolf Presents" link at the top). */
.navbar-brand[b-pc59xf7zps] {
    font-size: 1.1rem;
}

/*
  .bi is the base class used for your icon <span> elements in NavMenu.razor.

  Instead of using <svg> inline everywhere, the template uses:
  - a span with class="bi ..."
  - and applies background-image SVG via CSS
*/
.bi[b-pc59xf7zps] {
    display: inline-block;
    position: relative;

    width: 1.25rem;
    height: 1.25rem;
    /*
      This is the icon "box size".
      The SVG background images will be scaled to fit this box.
    */

    margin-right: 0.75rem;
    /* Spacing between icon and text label. */

    top: -1px;
    /* Tiny alignment tweak so the icon visually lines up with text baseline. */

    background-size: cover;
    /* Forces background image to fill the icon box. */
}


/*
  These next 3 classes attach specific background icons
  for each nav menu item.

  Example:
  <span class="bi bi-house-door-fill-nav-menu"></span>

  That means:
  - the span gets base sizing rules from ".bi"
  - and gets an actual icon from ".bi-house-door-fill-nav-menu"
*/
.bi-house-door-fill-nav-menu[b-pc59xf7zps] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}

.bi-plus-square-fill-nav-menu[b-pc59xf7zps] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}

.bi-list-nested-nav-menu[b-pc59xf7zps] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}


/* Basic spacing/typography for each nav item. */
.nav-item[b-pc59xf7zps] {
    font-size: 0.9rem;
    padding-bottom: 0.5rem;
}

/* Add extra spacing at the top of the first item. */
.nav-item:first-of-type[b-pc59xf7zps] {
    padding-top: 1rem;
}

/* Add extra spacing at the bottom of the last item. */
.nav-item:last-of-type[b-pc59xf7zps] {
    padding-bottom: 1rem;
}

/*
  Style the actual link that NavLink renders.

  "::deep" is used because:
  - NavLink generates an <a> under the hood
  - In scoped CSS, you need ::deep to reach into it reliably
*/
.nav-item[b-pc59xf7zps]  .nav-link {
    color: #d7d7d7;
    background: none;
    border: none;
    border-radius: 4px;

    height: 3rem;
    display: flex;
    align-items: center;

    line-height: 3rem;
    width: 100%;
    /*
      This makes each nav link a full-width "row" with a nice clickable height.
      The flex alignment centers the icon + text vertically.
    */
}

/* When a NavLink matches the current URL, it gets class="active". */
.nav-item[b-pc59xf7zps]  a.active {
    background-color: rgba(255,255,255,0.37);
    color: white;
    /*
      This is how the menu shows "you are here" visually.
      (NavLink adds active automatically.)
    */
}

/* Hover effect for nav links. */
.nav-item[b-pc59xf7zps]  .nav-link:hover {
    background-color: rgba(255,255,255,0.1);
    color: white;
}


/*
  This controls whether the nav menu items are visible.

  Mobile-first:
  - by default nav-scrollable is hidden (display: none)
  - it appears only when the checkbox is checked
*/
.nav-scrollable[b-pc59xf7zps] {
    display: none;
}

/* 
  This is the key "checkbox hack":

  .navbar-toggler:checked ~ .nav-scrollable

  Means:
  - if the checkbox is checked
  - AND .nav-scrollable appears later in the DOM as a sibling (~)
  - then set display to block

  This is why the checkbox is placed before the nav content in NavMenu.razor.
*/
.navbar-toggler:checked ~ .nav-scrollable[b-pc59xf7zps] {
    display: block;
}


/* Desktop behavior: sidebar is always visible; no toggle needed. */
@media (min-width: 641px) {

    /* Hide the checkbox toggle button entirely on wide screens. */
    .navbar-toggler[b-pc59xf7zps] {
        display: none;
    }

    /* Always show the sidebar navigation on wide screens. */
    .nav-scrollable[b-pc59xf7zps] {
        display: block;

        /*
          height: calc(100vh - 3.5rem)
          - 100vh is full viewport height
          - 3.5rem is the top-row height
          This makes the nav list fill the remaining space below the header.
        */
        height: calc(100vh - 3.5rem);

        /* If the menu list becomes taller than the available space, scroll it. */
        overflow-y: auto;
    }
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
/*
  This CSS controls the "reconnect" modal for interactive Blazor apps (InteractiveServer),
  i.e., what the UI shows when the SignalR connection drops, pauses, retries, or fails.

  It works by:
  - having multiple blocks of content in the modal (first attempt, retry attempt, failed, paused, etc.)
  - hiding all those blocks by default
  - showing exactly the right block depending on CSS classes applied to the modal container

  Think of it like a state machine:
  - the DOM has all the possible messages/animations
  - a class gets added/removed to reflect the current connection state
  - these selectors decide what becomes visible
*/


/* -------------------------------------------------------------------------- */
/* 1) Default state: hide everything that is state-specific                    */
/* -------------------------------------------------------------------------- */

/*
  These classes represent pieces of UI in the modal, each corresponding
  to a reconnect state. Initially they're hidden.

  Example meanings (based on the class names):
  - components-reconnect-first-attempt-visible: "Trying to reconnect..."
  - components-reconnect-repeated-attempt-visible: "Still trying..."
  - components-reconnect-failed-visible: "Reconnect failed"
  - components-pause-visible: "App paused" (user inactive / tab suspended / etc.)
  - components-resume-failed-visible: "Resume failed"
  - components-rejoining-animation: an animation shown while reconnecting
*/
.components-reconnect-first-attempt-visible[b-xnuqt7jwc0],
.components-reconnect-repeated-attempt-visible[b-xnuqt7jwc0],
.components-reconnect-failed-visible[b-xnuqt7jwc0],
.components-pause-visible[b-xnuqt7jwc0],
.components-resume-failed-visible[b-xnuqt7jwc0],
.components-rejoining-animation[b-xnuqt7jwc0] {
    display: none;
}


/* -------------------------------------------------------------------------- */
/* 2) State selectors: show the right block based on modal state classes       */
/* -------------------------------------------------------------------------- */

/*
  The modal has id="components-reconnect-modal".
  Different states are represented by different classes being applied to that
  same element.

  These selectors say:
  - when the modal has class "components-reconnect-show", show the "first attempt" message and animation
  - when paused, show the paused message
  - when resume failed, show the resume failed message
  - when retrying, show repeated-attempt message AND animation
  - when failed, show failed message

  Net effect:
  - You can keep *all* the markup present
  - Only the appropriate parts are visible at a time
*/
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-retrying[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-failed[b-xnuqt7jwc0],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-xnuqt7jwc0] {
    display: block;
}

/*
  Notes on two slightly odd-looking lines above:

  - "#components-reconnect-modal.components-reconnect-retrying,"
    and later
    "#components-reconnect-modal.components-reconnect-failed,"
    These selectors apply "display: block" to the modal itself when those state
    classes are present, ensuring the modal container is shown.

  - The other selectors target *child elements* to show the appropriate message.
*/


/* -------------------------------------------------------------------------- */
/* 3) Base modal styling                                                      */
/* -------------------------------------------------------------------------- */

/*
  Styles the modal itself (likely a <dialog> element if you’re using modern templates).
*/
#components-reconnect-modal[b-xnuqt7jwc0] {
    background-color: white;

    width: 20rem;         /* Fixed modal width */
    margin: 20vh auto;    /* Center-ish vertically (20% viewport height) and horizontally */
    padding: 2rem;

    border: 0;
    border-radius: 0.5rem;

    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);

    opacity: 0;

    /*
      This transition line is unusual if you're not used to newer CSS:
      "allow-discrete" is related to transitioning properties like display/overlay
      that normally don't animate smoothly.

      Practically: it helps the modal appear/disappear more gracefully.
    */
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;

    /*
      Default animation: fade OUT (so it’s invisible unless opened).
      This pairs with the [open] rule below.
    */
    animation: components-reconnect-modal-fadeOutOpacity-b-xnuqt7jwc0 0.5s both;

    /*
      IMPORTANT: The next block looks like SCSS / nested syntax:
      &[open] { ... }

      If this file is plain CSS, that syntax would normally be invalid.
      If this is in a .razor.css *and* is being processed as CSS isolation only,
      it still should be plain CSS (no nesting).

      If your project builds successfully with this, it means:
      - this file might be processed by a preprocessor (SCSS), OR
      - you pasted it from a source that supports nesting, OR
      - you're on a toolchain that supports CSS nesting.

      In standard CSS form, it would be:
      #components-reconnect-modal[open] { ... }
    */
    &[open]
    {
        /*
          When the dialog is open:
          - slide up + fade in
          - small delay (0.3s) before animating
          - animation-fill-mode: both to keep final values applied
        */
        animation: components-reconnect-modal-slideUp-b-xnuqt7jwc0 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s,
        components-reconnect-modal-fadeInOpacity-b-xnuqt7jwc0 0.5s ease-in-out 0.3s;
        animation-fill-mode: both;
    }
}

/*
  Backdrop styling for a <dialog>:
  - makes the background dimmed when modal is open
*/
#components-reconnect-modal[b-xnuqt7jwc0]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-xnuqt7jwc0 0.5s ease-in-out;
    opacity: 1;
}


/* -------------------------------------------------------------------------- */
/* 4) Modal open/close animations                                             */
/* -------------------------------------------------------------------------- */

/* Slide the modal upward slightly as it appears */
@keyframes components-reconnect-modal-slideUp-b-xnuqt7jwc0 {
    0% {
        transform: translateY(30px) scale(0.95);
    }
    100% {
        transform: translateY(0);
    }
}

/* Fade in */
@keyframes components-reconnect-modal-fadeInOpacity-b-xnuqt7jwc0 {
    0% { opacity: 0; }
    100% { opacity: 1; }
}

/* Fade out */
@keyframes components-reconnect-modal-fadeOutOpacity-b-xnuqt7jwc0 {
    0% { opacity: 1; }
    100% { opacity: 0; }
}


/* -------------------------------------------------------------------------- */
/* 5) Layout inside the modal                                                 */
/* -------------------------------------------------------------------------- */

/*
  This container is used to vertically stack the modal contents and center them.
*/
.components-reconnect-container[b-xnuqt7jwc0] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

/* Normalize paragraph spacing inside the modal */
#components-reconnect-modal p[b-xnuqt7jwc0] {
    margin: 0;
    text-align: center;
}


/* -------------------------------------------------------------------------- */
/* 6) Button styling inside the modal                                         */
/* -------------------------------------------------------------------------- */

#components-reconnect-modal button[b-xnuqt7jwc0] {
    border: 0;
    background-color: #6b9ed2;
    color: white;

    padding: 4px 24px;
    border-radius: 4px;
}

/* Hover/active shades for the button */
#components-reconnect-modal button:hover[b-xnuqt7jwc0] {
    background-color: #3b6ea2;
}

#components-reconnect-modal button:active[b-xnuqt7jwc0] {
    background-color: #6b9ed2;
}


/* -------------------------------------------------------------------------- */
/* 7) "Rejoining" animation (the pulsing circles)                              */
/* -------------------------------------------------------------------------- */

/*
  This is a common "ripple" or "ping" animation to indicate reconnecting.
  Typically the markup is something like:
    <div class="components-rejoining-animation">
      <div></div>
      <div></div>
    </div>
*/
.components-rejoining-animation[b-xnuqt7jwc0] {
    position: relative;
    width: 80px;
    height: 80px;
}

/*
  Each inner div is a circle outline that expands outward and fades.
*/
.components-rejoining-animation div[b-xnuqt7jwc0] {
    position: absolute;

    border: 3px solid #0087ff;
    border-radius: 50%;

    opacity: 1;

    animation: components-rejoining-animation-b-xnuqt7jwc0 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}

/*
  The second circle starts earlier (negative delay) so the ripples alternate,
  giving a continuous effect instead of both circles pulsing at once.
*/
.components-rejoining-animation div:nth-child(2)[b-xnuqt7jwc0] {
    animation-delay: -0.5s;
}

/*
  The keyframes build the "ripple" effect:
  - start at the center with size 0 and invisible
  - snap to visible at 5% (so it doesn't show a weird tiny dot)
  - expand to full size (80x80) while fading out
*/
@keyframes components-rejoining-animation-b-xnuqt7jwc0 {
    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;
    }
}
