/* /Components/Account/Pages/Manage/EnableAuthenticator.razor.rz.scp.css */
.qr-panel[b-etdr48pc72] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1.25rem;
}

/* White plate, always: the code is black-on-white so scanners keep their contrast, and in dark
   mode a bare SVG would sit on a near-black page with no quiet zone the camera can see. */
.qr-code[b-etdr48pc72] {
    flex: 0 0 auto;
    width: 13.5rem;
    padding: .5rem;
    background: #fff;
    border: 1px solid var(--cosmyre-card-border);
    border-radius: var(--cosmyre-card-radius);
}

/* The SVG is injected as a MarkupString, so it never carries this component's scope attribute —
   ::deep is what lets the rule reach it. It ships a viewBox and no width/height by design. */
.qr-code[b-etdr48pc72]  svg {
    display: block;
    width: 100%;
    height: auto;
}

.qr-key[b-etdr48pc72] {
    display: inline-block;
    font-size: 1rem;
    letter-spacing: .05em;
    user-select: all;
}
/* /Components/Account/Pages/Warp.razor.rz.scp.css */
/* Opaque overlay above the auth layout so the warp owns the whole viewport. */
.warp-shell[b-6x91ot6apu] {
    position: fixed;
    inset: 0;
    z-index: 100;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2rem;
    overflow: hidden;
    background: #000;
}

.warp-stars[b-6x91ot6apu] {
    position: absolute;
    inset: 0;
    pointer-events: none;
}

/* Each streak is a thin line anchored at the viewport centre, rotated to its
   own angle and thrown outward past the edges. Bright head, tail fading back
   toward the centre. */
.warp-star[b-6x91ot6apu] {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 90px;
    border-radius: 999px;
    background: linear-gradient(90deg, transparent, #fff);
    transform-origin: left center;
    opacity: 0;
    animation: warp-fly-b-6x91ot6apu var(--dur) cubic-bezier(.45, 0, .85, .5) var(--delay) infinite;
}

.warp-star:nth-child(3n)[b-6x91ot6apu] {
    background: linear-gradient(90deg, transparent, #9db4ff);
}

.warp-star:nth-child(7n)[b-6x91ot6apu] {
    background: linear-gradient(90deg, transparent, #c9a6ff);
}

@keyframes warp-fly-b-6x91ot6apu {
    0% {
        transform: rotate(var(--angle)) translateX(3vmax) scaleX(.15);
        opacity: 0;
    }

    12% {
        opacity: .95;
    }

    100% {
        transform: rotate(var(--angle)) translateX(85vmax) scaleX(3.5);
        opacity: 1;
    }
}

/* The logo sits in the calm eye of the warp, easing forward as if approached. */
.warp-logo[b-6x91ot6apu] {
    position: relative;
    z-index: 1;
    width: 340px;
    max-width: 70%;
    height: auto;
    animation: warp-approach-b-6x91ot6apu 2.2s ease-out forwards;
}

@keyframes warp-approach-b-6x91ot6apu {
    from {
        transform: scale(.85);
        opacity: .6;
    }

    to {
        transform: scale(1.08);
        opacity: 1;
    }
}

.warp-skip[b-6x91ot6apu] {
    position: relative;
    z-index: 1;
    color: #6c757d;
    font-size: .85rem;
    text-decoration: none;
}

.warp-skip:hover[b-6x91ot6apu] {
    color: #adb5bd;
    text-decoration: underline;
}

@media (prefers-reduced-motion: reduce) {
    .warp-star[b-6x91ot6apu],
    .warp-logo[b-6x91ot6apu] {
        animation: none;
    }

    .warp-logo[b-6x91ot6apu] {
        opacity: 1;
    }
}
/* /Components/Layout/AuthLayout.razor.rz.scp.css */
/* Black to match the logo's background exactly (#000000), so the PNG blends in. */
.auth-shell[b-ge9ppst932] {
    position: relative;
    overflow: hidden;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 1.75rem;
    padding: 2rem 1rem;
    background: #000;
    /* data-bs-theme=dark swaps the variables but only <body> sets the base text
       colour, so apply it here for the scoped dark theme to take effect. */
    color: var(--bs-body-color);
}

.auth-stars[b-ge9ppst932] {
    position: absolute;
    inset: 0;
    pointer-events: none;
}

.auth-star[b-ge9ppst932] {
    position: absolute;
    border-radius: 50%;
    background: #fff;
    opacity: .15;
    animation: auth-twinkle-b-ge9ppst932 3s ease-in-out infinite;
}

@keyframes auth-twinkle-b-ge9ppst932 {
    0%, 100% {
        opacity: .15;
        transform: scale(1);
    }

    50% {
        opacity: .9;
        transform: scale(1.4);
    }
}

.auth-logo[b-ge9ppst932] {
    position: relative;
    z-index: 1;
    width: 340px;
    max-width: 90%;
    height: auto;
}

.auth-body[b-ge9ppst932] {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 24rem;
}

#blazor-error-ui[b-ge9ppst932] {
    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-ge9ppst932] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/CaseNavigator.razor.rz.scp.css */
/* Mission Console navigator. Fixed "space" palette in both light and dark app themes — it is a
   window into space, so it is deliberately not driven by the page theme.

   Viewport-fixed and a SIBLING of .sidebar (MainLayout renders it after <main>), docked over
   the empty strip that is the sidebar grid's third row (NavMenu's .sidebar-dock). The box is
   sized to that strip exactly — same --cosmyre-navdock-h, same width as .sidebar, no
   background of its own so the sidebar's gradient shows through — which is what makes it read
   as the sidebar's own last row while the tree above ends at the strip and never runs under
   the orb. Living outside .sidebar is also what keeps the popover clear of its overflow clip.
   The rail width and the below-641px visibility are in app.css, next to the sidebar collapse
   rules they mirror. */
.nav-dock[b-ho8201nfda] {
    position: fixed;
    left: 0;
    bottom: 0;
    width: 250px;                 /* tracks .sidebar in MainLayout.razor.css */
    height: var(--cosmyre-navdock-h);
    z-index: 1040;
    display: flex;
    align-items: center;
    --navdock-pad: .75rem;
    padding: var(--navdock-pad);
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    --sky-grad: radial-gradient(130% 130% at 18% 0%, #22306a 0%, #10173d 55%, #080b22 100%);
    --sky-border: rgba(150, 170, 255, .24);
    --sky-glow: 0 12px 40px rgba(30, 22, 80, .5), inset 0 1px 0 rgba(255, 255, 255, .06);
    --sky-text: #d6dcff;
    --sky-muted: #8f97c8;
    --sky-v: #a888f6;
    --sky-b: #5f8cf6;
}

/* ---- Orb trigger (resting) ---- */
.nav-orb-btn[b-ho8201nfda] {
    position: relative;
    width: 100%;
    display: inline-flex;
    align-items: center;
    gap: .6rem;
    padding: .4rem 1rem .4rem .4rem;
    border-radius: 999px;
    background: var(--sky-grad);
    border: 1px solid var(--sky-border);
    box-shadow: var(--sky-glow);
    cursor: pointer;
}

.nav-orb-btn:hover[b-ho8201nfda] {
    filter: brightness(1.06);
}

.nav-orb[b-ho8201nfda] {
    position: relative;
    width: 2.6rem;
    height: 2.6rem;
    flex: 0 0 2.6rem;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.nav-orb-ring[b-ho8201nfda] {
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 1.5px solid rgba(150, 170, 255, .5);
    animation: navPulseRing-b-ho8201nfda 2.6s ease-out infinite;
}

.nav-orb-mark[b-ho8201nfda] {
    width: 1.7rem;
    height: 1.7rem;
    position: relative;
    z-index: 1;
    filter: drop-shadow(0 0 6px rgba(120, 110, 240, .7));
}

.nav-orb-dot[b-ho8201nfda] {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 4px;
    height: 4px;
    margin: -2px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 6px 1px #fff;
    animation: navOrbitDot-b-ho8201nfda 4s linear infinite;
}

.nav-orb-label[b-ho8201nfda] {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    text-align: left;
    line-height: 1.15;
    min-width: 0;
}

.nav-orb-eyebrow[b-ho8201nfda] {
    font-size: .58rem;
    letter-spacing: .13em;
    text-transform: uppercase;
    color: var(--sky-muted);
}

.nav-orb-current[b-ho8201nfda] {
    font-size: .9rem;
    font-weight: 600;
    color: var(--sky-text);
    max-width: 9rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nav-orb-caret[b-ho8201nfda] {
    display: flex;
    color: var(--sky-muted);
    font-size: .9rem;
    transition: transform .2s;
}

.nav-orb-caret.open[b-ho8201nfda] {
    transform: rotate(180deg);
}

/* ---- Console popover (opens upward) ---- */
.nav-console[b-ho8201nfda] {
    position: absolute;
    left: var(--navdock-pad);
    bottom: calc(100% - var(--navdock-pad) + 12px);
    width: 300px;
    border-radius: 16px;
    background: var(--sky-grad);
    border: 1px solid var(--sky-border);
    box-shadow: var(--sky-glow);
    padding: 14px 14px 12px;
    overflow: hidden;
    color: var(--sky-text);
    animation: navWarpIn-b-ho8201nfda .28s ease both;
}

.nav-stars[b-ho8201nfda] {
    position: absolute;
    inset: 0;
    pointer-events: none;
}

.nav-star[b-ho8201nfda] {
    position: absolute;
    border-radius: 50%;
    background: #e6ecff;
    box-shadow: 0 0 4px 1px rgba(190, 205, 255, .5);
    opacity: .5;
    animation-name: navTwk-b-ho8201nfda;
    animation-timing-function: ease-in-out;
    animation-iteration-count: infinite;
}

.nav-console-head[b-ho8201nfda] {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: .6rem;
}

.nav-eyebrow[b-ho8201nfda] {
    font-size: .64rem;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--sky-muted);
}

.nav-close[b-ho8201nfda] {
    width: 1.5rem;
    height: 1.5rem;
    border: none;
    background: rgba(255, 255, 255, .06);
    border-radius: 6px;
    color: var(--sky-muted);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: .7rem;
}

.nav-close:hover[b-ho8201nfda] {
    background: rgba(255, 255, 255, .12);
}

/* ---- Search bar (replaces the "you are here" text) ---- */
.nav-search[b-ho8201nfda] {
    position: relative;
    display: flex;
    align-items: center;
    gap: .45rem;
    padding: .45rem .6rem;
    border-radius: 9px;
    background: rgba(255, 255, 255, .05);
    border: 1px solid rgba(150, 170, 255, .18);
    margin-bottom: .8rem;
}

.nav-search-icon[b-ho8201nfda] {
    display: flex;
    color: var(--sky-muted);
    font-size: .9rem;
}

.nav-search-input[b-ho8201nfda] {
    flex: 1;
    min-width: 0;
    border: none;
    outline: none;
    background: transparent;
    color: var(--sky-text);
    font-size: .85rem;
}

.nav-search-input[b-ho8201nfda]::placeholder {
    color: var(--sky-muted);
}

.nav-search-clear[b-ho8201nfda] {
    border: none;
    background: transparent;
    color: var(--sky-muted);
    cursor: pointer;
    display: inline-flex;
    font-size: .7rem;
    padding: 0;
}

.nav-search-clear:hover[b-ho8201nfda] {
    color: var(--sky-text);
}

/* ---- Flight-log timeline (the relocated breadcrumb) ---- */
.nav-route[b-ho8201nfda] {
    position: relative;
    padding-left: 6px;
    margin-bottom: .2rem;
}

.nav-spine[b-ho8201nfda] {
    position: absolute;
    left: 12px;
    top: 8px;
    bottom: 8px;
    width: 2px;
    background: linear-gradient(180deg, var(--sky-v), var(--sky-b));
}

.nav-route-row[b-ho8201nfda] {
    position: relative;
    display: flex;
    align-items: center;
    gap: .6rem;
    width: 100%;
    padding: .4rem .5rem;
    margin-bottom: .1rem;
    border: none;
    border-radius: 9px;
    background: transparent;
    text-align: left;
    animation: navRisein-b-ho8201nfda .3s ease both;
}

.nav-route-row.clickable[b-ho8201nfda] {
    cursor: pointer;
}

.nav-route-row.clickable:hover[b-ho8201nfda] {
    background: rgba(255, 255, 255, .06);
}

.nav-route-row.current[b-ho8201nfda] {
    background: rgba(168, 131, 246, .14);
}

.nav-dot[b-ho8201nfda] {
    position: relative;
    z-index: 1;
    width: 14px;
    height: 14px;
    flex: 0 0 14px;
    border-radius: 50%;
    background: #4a5488;
    border: 2px solid #0f1638;
}

.nav-dot.current[b-ho8201nfda] {
    background: linear-gradient(135deg, #c3a8ff, #7ea0ff);
    box-shadow: 0 0 8px 2px rgba(150, 150, 255, .8);
}

.nav-route-icon[b-ho8201nfda] {
    display: flex;
    font-size: .9rem;
    color: var(--sky-muted);
}

.nav-route-row.current .nav-route-icon[b-ho8201nfda] {
    color: var(--sky-v);
}

.nav-route-label[b-ho8201nfda] {
    font-size: .85rem;
    font-weight: 500;
    color: var(--sky-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.nav-route-row.current .nav-route-label[b-ho8201nfda] {
    font-weight: 700;
    color: #fff;
}

.nav-here[b-ho8201nfda] {
    margin-left: auto;
    font-size: .6rem;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--sky-v);
}

/* ---- Warp-to grid ---- */
.nav-warp-label[b-ho8201nfda] {
    font-size: .6rem;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--sky-muted);
    margin: .7rem 0 .5rem 6px;
}

.nav-warp-grid[b-ho8201nfda] {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: .35rem;
}

.nav-chip[b-ho8201nfda] {
    display: flex;
    align-items: center;
    gap: .45rem;
    min-width: 0;
    padding: .4rem .5rem;
    border-radius: 8px;
    background: rgba(255, 255, 255, .03);
    border: 1px solid rgba(150, 170, 255, .12);
    color: var(--sky-text);
    text-align: left;
    cursor: pointer;
}

.nav-chip:hover[b-ho8201nfda] {
    background: rgba(255, 255, 255, .08);
}

.nav-chip.active[b-ho8201nfda] {
    background: rgba(168, 131, 246, .16);
    border-color: rgba(168, 131, 246, .4);
}

.nav-chip-icon[b-ho8201nfda] {
    display: flex;
    font-size: .85rem;
    color: var(--sky-muted);
}

.nav-chip.active .nav-chip-icon[b-ho8201nfda] {
    color: var(--sky-v);
}

.nav-chip-label[b-ho8201nfda] {
    font-size: .76rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    color: var(--sky-text);
}

.nav-chip.active .nav-chip-label[b-ho8201nfda] {
    color: #fff;
}

/* ---- Search results (replace the warp grid while typing) ---- */
.nav-results[b-ho8201nfda] {
    position: relative;
    max-height: 320px;
    overflow-y: auto;
    margin: 0 -2px;
    padding: 0 2px;
}

.nav-results-label[b-ho8201nfda] {
    font-size: .6rem;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--sky-muted);
    margin: .4rem 0 .35rem 6px;
}

.nav-result[b-ho8201nfda] {
    display: flex;
    align-items: center;
    gap: .5rem;
    width: 100%;
    padding: .45rem .5rem;
    margin-bottom: .1rem;
    border: none;
    border-radius: 8px;
    background: transparent;
    color: var(--sky-text);
    text-align: left;
    cursor: pointer;
}

.nav-result:hover[b-ho8201nfda] {
    background: rgba(255, 255, 255, .06);
}

.nav-result-icon[b-ho8201nfda] {
    display: flex;
    flex: 0 0 auto;
    font-size: .9rem;
    color: var(--sky-muted);
}

.nav-result-label[b-ho8201nfda] {
    flex: 1;
    min-width: 0;
    font-size: .82rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.nav-result-pill[b-ho8201nfda] {
    flex: 0 0 auto;
    padding: .1rem .45rem;
    border-radius: 999px;
    background: rgba(255, 255, 255, .1);
    font-size: .68rem;
    color: var(--sky-muted);
    white-space: nowrap;
}

.nav-empty[b-ho8201nfda] {
    font-size: .8rem;
    color: var(--sky-muted);
    padding: .5rem .5rem 0;
}

/* ---- Keyframes (nav-prefixed to avoid colliding with global animations) ---- */
@keyframes navPulseRing-b-ho8201nfda {
    0% { transform: scale(.55); opacity: .75; }
    100% { transform: scale(2); opacity: 0; }
}

@keyframes navOrbitDot-b-ho8201nfda {
    from { transform: rotate(0) translateX(19px) rotate(0); }
    to { transform: rotate(360deg) translateX(19px) rotate(-360deg); }
}

@keyframes navWarpIn-b-ho8201nfda {
    0% { opacity: 0; transform: translateY(12px) scale(.96); }
    100% { opacity: 1; transform: none; }
}

@keyframes navRisein-b-ho8201nfda {
    0% { opacity: 0; transform: translateY(8px); }
    100% { opacity: 1; transform: none; }
}

@keyframes navTwk-b-ho8201nfda {
    0%, 100% { opacity: .2; transform: scale(.7); }
    50% { opacity: 1; transform: scale(1.1); }
}
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-dalpx7fg9q] {
    position: relative;
    display: flex;
    flex-direction: column;
}

main[b-dalpx7fg9q] {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    /* Containing block for .nav-throb below. */
    position: relative;
}

/* The navigation throbber: covers the page body between a tab click and the new page landing.
   Inset from the top by the header's 3.75rem so the header, the section name and the user menu
   stay live and legible — you can still see where you are and where you are going. The sidebar
   is outside <main> entirely, so it is untouched. */
.nav-throb[b-dalpx7fg9q] {
    display: none;
    position: absolute;
    inset: 3.75rem 0 0 0;
    z-index: 1010;                 /* under the sticky header's 1020, over everything else */
    align-items: center;
    justify-content: center;
    background: color-mix(in srgb, var(--cosmyre-page-bg) 72%, transparent);
    backdrop-filter: blur(1px);
    pointer-events: none;
}

/* Raised by js/tabs.js on the click and lowered once the new page has its own throbber up.
   Keyed on <html> because that element survives enhanced navigation — see MainLayout.razor. */
:root.nav-busy .nav-throb[b-dalpx7fg9q] {
    display: flex;
}

/* Three rows: the brand/hamburger cell, the scrolling tree, then an empty strip at the foot
   (NavMenu's .sidebar-dock) that the viewport-fixed Navigator (CaseNavigator, a SIBLING of this
   element — see MainLayout.razor) is docked over, so the tree can never scroll underneath it.
   Declared here once rather than at each display site below so the three cannot drift; it is
   inert while display:none. The 1fr track is what sizes .sidebar-nav now — NavMenu.razor.css
   no longer measures 100vh against the header height. */
.sidebar[b-dalpx7fg9q] {
    background: linear-gradient(180deg, #141f4a 0%, #0b1330 100%);
    overflow: hidden;
    display: none;
    grid-template-rows: 3.75rem 1fr auto;
}

[data-bs-theme="dark"] .sidebar[b-dalpx7fg9q] {
    background: linear-gradient(180deg, #141f4a 0%, #090e26 100%);
}

/* The header-mounted toggle (a hidden checkbox in MainLayout) drives the sidebar. */
.sidebar-toggle-state[b-dalpx7fg9q] {
    display: none;
}

.sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q] {
    display: grid;
    position: fixed;
    top: 0;
    left: 0;
    width: 250px;
    height: 100vh;
    z-index: 1030;
    box-shadow: 0 0 30px rgba(0, 0, 0, .4);
}

/* ---- Top app-header ---- */
/* Three flex children: window chrome (hamburger fallback, Back), the centred title
   (.app-header-title — case name + section breadcrumb), then the chat + user controls. The
   title is the header's one elastic child and CENTRES its contents in the space between the two
   pinned groups, so a case name reads as the header's main subject rather than hugging the left
   edge. .app-header-right keeps margin-left:auto so it still pins right on a page with no title
   content. Height is fixed at 3.75rem and must stay so: app.css, NavMenu.razor.css,
   DocumentViewer.razor.css, Home.razor.css and CaseUserSelectionJob.razor.css all measure
   against it. */
.app-header[b-dalpx7fg9q] {
    position: sticky;
    top: 0;
    z-index: 1020;
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: 1rem;
    height: 3.75rem;
    padding: 0 1.25rem;
    background-color: var(--bs-body-bg, #fff);
    border-bottom: 1px solid var(--bs-border-color, #e2e2e2);
}

.app-header-left[b-dalpx7fg9q],
.app-header-right[b-dalpx7fg9q] {
    display: flex;
    align-items: center;
    gap: .75rem;
    min-width: 0;
}

/* Never shrinks: the case bubble and Back button are how you know where you are, and
   letting them squeeze crushed the bubble to an unreadable stub. */
.app-header-left[b-dalpx7fg9q] {
    flex: 0 0 auto;
}

/* The header's one elastic child: takes whatever room is left between the pinned window-chrome
   group and the pinned chat/account group, and centres its contents (the case name + breadcrumb)
   in it — the case name is now the header's main subject, not a left-hugging label.
   min-width: 0 is what lets .case-bubble ellipsise instead of forcing the header wide. */
.app-header-title[b-dalpx7fg9q] {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    flex: 1 1 auto;
    min-width: 0;
}

/* The quiet half of the breadcrumb — "what part of the case I'm in", after the name. Weight and
   colour drop to secondary, the same way a tab rail or a meta row marks anything as quiet;
   nothing in the app italicises, so this is not a font-style change. Fixed-size: the case NAME is
   what ellipsises when the header is tight (see .case-bubble below), not the section. */
.app-header-section[b-dalpx7fg9q] {
    flex: 0 0 auto;
    font-size: .9rem;
    font-weight: 400;
    color: var(--bs-secondary-color, #6b7280);
    white-space: nowrap;
}

/* The separator between name and section — replaces the old ::before hairline, which read as a
   divider between two unrelated things rather than a path through one. */
.app-header-crumb[b-dalpx7fg9q] {
    flex: 0 0 auto;
    font-size: .7rem;
    color: var(--bs-tertiary-color, #9aa1b4);
}

/* Below this the header has room for the case name or the section, not both — so the crumb gives
   way, and the sidebar's nested menu still names the section. Gated on there BEING a case name to
   fall back to: on an app-level page (/cases, /machines) the section is the header's only title,
   and hiding it unconditionally left the bar blank between the hamburger and the account menu. */
@media (max-width: 900px) {
    .app-header-title:has(.case-bubble) .app-header-section[b-dalpx7fg9q],
    .app-header-title:has(.case-bubble) .app-header-crumb[b-dalpx7fg9q] {
        display: none;
    }
}

/* Stays pinned right on pages that have no tab bar to take up the slack. */
.app-header-right[b-dalpx7fg9q] {
    flex: 0 0 auto;
    margin-left: auto;
}

.header-icon-btn[b-dalpx7fg9q] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: .5rem;
    cursor: pointer;
    color: var(--bs-secondary-color, #555);
    font-size: 1.15rem;
}

.header-icon-btn:hover[b-dalpx7fg9q] {
    background-color: var(--bs-secondary-bg, #f0f0f0);
}

/* The case label — the header's main subject now, centred in .app-header-title. Deliberately NOT
   a pill: a 999px radius on a box holding a sentence-length case name reads as a lozenge with the
   text crammed into its flat middle. It is a flat label marked by a single bottom keyline — the
   same accent the tab rail uses, so "where I am" and "what section I am in" (the trailing
   .app-header-section) are marked the same way.
   flex: 0 1 auto + min-width: 0, no max-width cap: this is what makes the NAME the thing that
   ellipsises when the header is tight, rather than the fixed-size crumb/section beside it or the
   pinned Back/chat/account groups running off the edge. The case number is no longer shown here
   at all — it rides the title= tooltip, one hover away, rather than a chip next to the name. */
.case-bubble[b-dalpx7fg9q] {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    flex: 0 1 auto;
    min-width: 0;
    padding: .3rem .15rem .3rem;
    border-radius: 0;
    border-bottom: 2px solid var(--cosmyre-tab-accent, #845adf);
    background: none;
    color: inherit;
    font-size: .9rem;
    line-height: 1.2;
}

.case-bubble-name[b-dalpx7fg9q] {
    font-weight: 600;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* The icon inherited white from the pill; now it carries the accent that marks the label. */
.case-bubble[b-dalpx7fg9q]  .case-bubble-icon {
    color: var(--cosmyre-tab-accent, #845adf);
    flex-shrink: 0;
}

.back-btn[b-dalpx7fg9q] {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    white-space: nowrap;
}

.content[b-dalpx7fg9q] {
    flex: 1;
    padding-top: 1.1rem;
}

@media (min-width: 641px) {
    .page[b-dalpx7fg9q] {
        flex-direction: row;
    }

    .sidebar[b-dalpx7fg9q] {
        display: grid;
        width: 250px;
        height: 100vh;
        position: sticky;
        top: 0;
        flex: 0 0 250px;
    }

    /* On wide screens checked never means the mobile overlay. */
    .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q] {
        display: grid;
        position: sticky;
        top: 0;
        width: 250px;
        height: 100vh;
        z-index: auto;
        box-shadow: none;
    }

    /* Icon-only rail: the toggle's collapsed state on normal pages; the DEFAULT on the
       document view, where .rail-default inverts the checkbox so one click expands. */
    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q],
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q] {
        width: 3.6rem;
        flex: 0 0 3.6rem;
    }

    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .brand-link span,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .brand-link span,
    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .sidebar-section-title,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .sidebar-section-title,
    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .section-link span,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .section-link span {
        display: none;
    }

    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .sidebar-brand,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .sidebar-brand {
        padding: 0;
        justify-content: center;
    }

    /* Collapsed, the rail's top cell is the toggle alone. The moon mark and the toggle will not
       both sit honestly in 3.6rem, and in the one state where space is scarcest the control that
       gets you out of it beats the decoration — the mark returns the moment you expand. */
    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .brand-link,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .brand-link {
        display: none;
    }

    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .sidebar-menu-toggle,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .sidebar-menu-toggle {
        margin-left: 0;
        width: 2.4rem;
        height: 2.4rem;
    }

    /* The sidebar is permanent from here up, so its own toggle is always reachable and the
       header copy is redundant. Below this breakpoint .sidebar is display:none and the header
       button is the only way in — which is why it exists at all. */
    .header-menu-fallback[b-dalpx7fg9q] {
        display: none;
    }

    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .sidebar-nav,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .sidebar-nav {
        padding: 1rem .3rem;
    }

    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .section-link,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .section-link {
        justify-content: center;
        padding: .55rem 0;
    }

    /* The nested tab group goes entirely — hiding only its labels would leave a column of
       orphan icons with nothing to say which parent they belong to. */
    .page:not(.rail-default) > .sidebar-toggle-state:checked ~ .sidebar[b-dalpx7fg9q]  .subsection-menu,
    .page.rail-default > .sidebar-toggle-state:not(:checked) ~ .sidebar[b-dalpx7fg9q]  .subsection-menu {
        display: none;
    }
}

#blazor-error-ui[b-dalpx7fg9q] {
    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-dalpx7fg9q] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }

/* ---- "Viewing as <squad>" chip ----
   The escape hatch out of a SquadViewOverride impersonation. It is loud on purpose: while it is up, nothing on
   screen is what your own account would see, and every other header control is quiet chrome.
   Tertiary (the app's one non-purple accent) marks it as scaffolding rather than a feature, and
   both tokens flip with data-bs-theme so no dark override is needed. */
.view-as-chip[b-dalpx7fg9q] {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .2rem .5rem;
    border: 1px solid var(--cosmyre-tertiary);
    border-radius: 999px;
    background: rgba(var(--cosmyre-tertiary-rgb), .12);
    color: var(--cosmyre-tertiary);
    font-size: .75rem;
    font-weight: 600;
    line-height: 1;
    white-space: nowrap;
    text-decoration: none;
}

.view-as-chip:hover[b-dalpx7fg9q],
.view-as-chip:focus-visible[b-dalpx7fg9q] {
    background: var(--cosmyre-tertiary);
    color: var(--cosmyre-tertiary-fg);
    text-decoration: none;
}

/* The label is the first thing a narrow header should drop — the icons alone still read as
   "something is overridden here", and the tooltip carries the rest. */
@media (max-width: 900px) {
    .view-as-chip-text[b-dalpx7fg9q] {
        display: none;
    }
}
/* /Components/Layout/NavMenu.razor.rz.scp.css */
/* Soft violet corner glow behind the sidebar content (the navy gradient itself is on .sidebar
   in MainLayout.razor.css). Stars live only in the Navigator's flight log, not here. */
.sidebar-glow[b-n59x3h2fnn] {
    position: absolute;
    top: -40px;
    left: -30px;
    width: 180px;
    height: 180px;
    border-radius: 50%;
    background: radial-gradient(circle at 40% 40%, rgba(168, 131, 246, .32), transparent 70%);
    filter: blur(6px);
    pointer-events: none;
    z-index: 0;
}

.sidebar-brand[b-n59x3h2fnn] {
    position: relative;
    z-index: 1;
    height: 3.75rem;
    display: flex;
    align-items: center;
    padding: 0 1.25rem;
    background-color: rgba(0, 0, 0, .25);
    border-bottom: 1px solid rgba(255, 255, 255, .08);
}

.brand-link[b-n59x3h2fnn] {
    display: flex;
    align-items: center;
    gap: .55rem;
    color: #fff;
    font-size: 1.1rem;
    font-weight: 600;
    text-decoration: none;
    white-space: nowrap;
}

.brand-mark[b-n59x3h2fnn] {
    height: 1.75rem;
    width: auto;
    flex-shrink: 0;
}

/* Menu toggle, pushed to the sidebar's right edge so the brand row reads
   [moon] COSMYRE ......... [toggle] instead of leaving a dead gap after the label. */
.sidebar-menu-toggle[b-n59x3h2fnn] {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 2rem;
    height: 2rem;
    border-radius: .4rem;
    cursor: pointer;
    /* Fallback only — see the fill below. Kept a real colour rather than transparent so a
       missing paint server degrades to a visible icon instead of an invisible one. */
    color: #0045BD;
}

/* ::deep is required, not decorative: the <svg> comes from the Icon component and carries ITS
   scope attribute, so an ordinary descendant selector compiled with NavMenu's scope would never
   match it. Targeting the element directly is also necessary — `fill` is inherited, but the
   fill="currentColor" presentation attribute Icon puts on the <svg> beats an inherited value.
   The trailing colour is SVG's own fallback paint if the gradient id cannot be resolved. */
.sidebar-menu-toggle[b-n59x3h2fnn]  svg {
    width: 1.35rem;
    height: 1.35rem;
    fill: url(#cosmyre-moon-grad) #0045BD;
}

.sidebar-menu-toggle:hover[b-n59x3h2fnn] {
    background: rgba(255, 255, 255, .08);
}

.sidebar-nav[b-n59x3h2fnn] {
    position: relative;
    z-index: 1;
    padding: 1rem .75rem;
    min-height: 0;
    overflow-y: auto;
}

/* Row 3: the strip the viewport-fixed Navigator is docked over. Empty — the orb itself is a
   sibling of .sidebar (MainLayout renders <CaseNavigator /> after <main>) whose fixed box is
   sized to exactly this strip, so it reads as the sidebar's own last row. */
.sidebar-dock[b-n59x3h2fnn] {
    height: var(--cosmyre-navdock-h);
}

/* ---- Primary menu (app-level links outside a case, case sections inside one) ---- */
.sidebar-section-title[b-n59x3h2fnn] {
    text-transform: uppercase;
    letter-spacing: .05em;
    font-size: .7rem;
    color: #8f9bb3;
    padding: 0 .5rem .35rem;
}

.section-menu[b-n59x3h2fnn] {
    list-style: none;
    margin: 0;
    padding: 0;
}

.section-menu li[b-n59x3h2fnn] {
    margin-bottom: .25rem;
}

.section-menu[b-n59x3h2fnn]  .section-link {
    display: flex;
    align-items: center;
    gap: .6rem;
    padding: .55rem .75rem;
    color: #8f9bb3;
    text-decoration: none;
    border-radius: 6px;
    font-size: .92rem;
}

.section-menu[b-n59x3h2fnn]  .section-icon {
    font-size: 1.05rem;
    flex-shrink: 0;
}

.section-menu[b-n59x3h2fnn]  .section-link:hover {
    background-color: rgba(255, 255, 255, .05);
    color: #fff;
}

.section-menu[b-n59x3h2fnn]  .section-link.active {
    background-color: rgba(255, 255, 255, .08);
    color: #fff;
    box-shadow: inset 2px 0 0 var(--cosmyre-accent);
}

/* ---- Nested tab group ----
   The TabRegistry group for the current route, indented under its parent item. Only the
   group you are in is expanded (Group is a single URL-derived value, so at most one menu
   renders); the app-header bar shows the same items from the same resolution. */
.subsection-menu[b-n59x3h2fnn] {
    position: relative;
    list-style: none;
    margin: .2rem 0 .45rem;
    padding: 0 0 0 1.65rem;      /* clears the parent's 1.05rem icon + .6rem gap */
}

/* Faint rail tying the children to their parent. */
.subsection-menu[b-n59x3h2fnn]::before {
    content: "";
    position: absolute;
    left: .95rem;
    top: .15rem;
    bottom: .15rem;
    width: 1px;
    background: rgba(255, 255, 255, .1);
}

.subsection-menu li[b-n59x3h2fnn] {
    margin-bottom: .1rem;
}

.subsection-link[b-n59x3h2fnn] {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .32rem .6rem;
    color: #7d879c;
    text-decoration: none;
    border-radius: 5px;
    font-size: .82rem;           /* one step down from .section-link */
}

.subsection-link:hover[b-n59x3h2fnn] {
    background-color: rgba(255, 255, 255, .05);
    color: #fff;
}

/* Same violet keyline as an active section link, so both levels read as one system. */
.subsection-link.active[b-n59x3h2fnn] {
    background-color: rgba(255, 255, 255, .06);
    color: #fff;
    box-shadow: inset 2px 0 0 var(--cosmyre-accent);
}

.subsection-link[b-n59x3h2fnn]  .subsection-icon {
    font-size: .9rem;
    flex-shrink: 0;
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-fgns2l8l2h],
.components-reconnect-repeated-attempt-visible[b-fgns2l8l2h],
.components-reconnect-failed-visible[b-fgns2l8l2h],
.components-pause-visible[b-fgns2l8l2h],
.components-resume-failed-visible[b-fgns2l8l2h],
.components-rejoining-animation[b-fgns2l8l2h] {
    display: none;
}

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


#components-reconnect-modal[b-fgns2l8l2h] {
    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-fgns2l8l2h 0.5s both;
    &[open]

{
    animation: components-reconnect-modal-slideUp-b-fgns2l8l2h 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-fgns2l8l2h 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

}

#components-reconnect-modal[b-fgns2l8l2h]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-fgns2l8l2h 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-fgns2l8l2h {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-fgns2l8l2h {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-fgns2l8l2h {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-fgns2l8l2h] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

#components-reconnect-modal p[b-fgns2l8l2h] {
    margin: 0;
    text-align: center;
}

#components-reconnect-modal button[b-fgns2l8l2h] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    padding: 4px 24px;
    border-radius: 4px;
}

    #components-reconnect-modal button:hover[b-fgns2l8l2h] {
        background-color: #3b6ea2;
    }

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

.components-rejoining-animation[b-fgns2l8l2h] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .components-rejoining-animation div[b-fgns2l8l2h] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-fgns2l8l2h 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .components-rejoining-animation div:nth-child(2)[b-fgns2l8l2h] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-fgns2l8l2h {
    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/CargoBay.razor.rz.scp.css */
/* Cargo Bay: a two-pane blob manager. Left = drop zone + transfer queue, right = Azurite browser.
   Same pane-container contract as .search-workspace / .term-workspace (app.css "fill-and-scroll"):
   flex: 1 1 auto + min-height: 0 divides the page-fill's height between the two fill-cards, and
   the panes touch across with a hairline down rather than a 1rem gutter (see CLAUDE.md → "Card
   panes"; .cargo-panes is already in app.css's detached-seam lists). */
.cargo-panes[b-bq4pzsjon0] {
    flex: 1 1 auto;
    min-height: 0;
    align-items: stretch;
    column-gap: 0;
    row-gap: 2px;
}

.cargo-transfer[b-bq4pzsjon0] {
    flex: 0 0 320px;
    width: 320px;
}

/* The drop zone stays its natural size; the transfer queue below it is what scrolls
   (.fill-card-body in the markup). */
.cargo-dropzone[b-bq4pzsjon0] {
    flex-shrink: 0;
}

/* min-width:0 lets the browser pane shrink so its wide table can scroll instead of overflowing. */
.cargo-browser[b-bq4pzsjon0] {
    min-width: 0;
}

/* The real <input type=file> is laid over the whole zone at opacity 0, so it handles both
   click-to-browse and the native file drop; the wrapper only paints the border and drag highlight. */
.cargo-dropzone[b-bq4pzsjon0] {
    position: relative;
    border: 2px dashed var(--bs-border-color, #ced4da);
    border-radius: .5rem;
    padding: 1.25rem 1rem;
    text-align: center;
    cursor: pointer;
    background: var(--bs-tertiary-bg, #f8f9fa);
    transition: border-color .15s ease, background-color .15s ease;
}

.cargo-dropzone-over[b-bq4pzsjon0] {
    border-color: var(--cosmyre-accent); /* app accent */
    background: rgba(var(--cosmyre-accent-rgb), .08);
}

.cargo-dropzone-busy[b-bq4pzsjon0] {
    opacity: .65;
    pointer-events: none;
}

.cargo-dropzone-input[b-bq4pzsjon0] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
}

/* The label sits under the transparent input; ignore pointer events so clicks/drops reach the input. */
.cargo-dropzone-inner[b-bq4pzsjon0] {
    pointer-events: none;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    color: var(--bs-secondary-color, #6c757d);
    font-size: .85rem;
}

.cargo-dropzone-icon[b-bq4pzsjon0] {
    font-size: 1.5rem;
    opacity: .7;
}

.cargo-folder-name[b-bq4pzsjon0] {
    font-weight: 600;
}

.cargo-crumbs a[b-bq4pzsjon0] {
    text-decoration: none;
}

@media (max-width: 800px) {
    /* Stacked, .page-fill's fixed height would crush two panes down to nothing — the pane
       container becomes the scroller instead, and each pane keeps a floor so it stays usable
       before its own fill-card-body engages. */
    .cargo-panes[b-bq4pzsjon0] {
        flex-direction: column;
        overflow-y: auto;
    }

    .cargo-transfer[b-bq4pzsjon0] {
        flex: 0 0 auto;
        flex-basis: auto;
        width: 100%;
        min-height: 16rem;
    }

    .cargo-browser[b-bq4pzsjon0] {
        flex: 0 0 auto;
        min-height: 16rem;
    }
}
/* /Components/Pages/CaseDedupe.razor.rz.scp.css */
/* ---- panes ----
   Settings | Dedupe rules | Runs. Widths are splitter-driven: js/splitters.js writes
   --dv-settings / --dv-runs onto .list-page-row, and these rules are what consume them, so a drag
   actually moves the boundary. Scoped, so they outrank app.css's
   `.list-page-row > .list-page-list { flex: 1 1 0 }`; the rules pane in the middle is left to that
   rule and takes whatever is left — it is the work surface, and the work surface gets the room.
   Same shape as the Dashboard (Home.razor.css), which is the three-pane FLEX precedent. */
.list-page-row > .dd-settings-pane[b-t2o5ww2p73] { flex: 0 0 var(--dv-settings, 22rem); }
.list-page-row > .dd-runs-pane[b-t2o5ww2p73] { flex: 0 0 var(--dv-runs, 18rem); }

/* Collapsed to a strip (the pane fold — app.css "Collapsible panes"). A flex pane shrinks its own
   basis, so no :has() on the row is needed. Scoped to the .dd-* panes and NEVER to
   .list-page-row, which several two-pane pages share.
   NOTE it does NOT defer to the ≤992px block below by source order: that block is one class less
   specific, and a media query adds no specificity, so it has to name .pane-collapsed itself or
   this basis would apply stacked too — where it is a HEIGHT, clipping the head it is meant to
   show. */
.list-page-row > .dd-settings-pane.pane-collapsed[b-t2o5ww2p73],
.list-page-row > .dd-runs-pane.pane-collapsed[b-t2o5ww2p73] { flex: 0 0 2.75rem; }

/* The right pane's splitter rides its LEFT edge, so it needs a positioning context of its own. */
.dd-runs-pane[b-t2o5ww2p73] { position: relative; }

.pane-head[b-t2o5ww2p73] { gap: .5rem; }

@media (max-width: 991.98px) {
    /* .pane-collapsed named explicitly: stacked, the collapsed basis would be a height and would
       clip the very head it exists to keep visible. */
    .list-page-row > .dd-settings-pane[b-t2o5ww2p73],
    .list-page-row > .dd-runs-pane[b-t2o5ww2p73],
    .list-page-row > .dd-settings-pane.pane-collapsed[b-t2o5ww2p73],
    .list-page-row > .dd-runs-pane.pane-collapsed[b-t2o5ww2p73] {
        flex: 0 0 auto;
    }

    .dd-settings-pane[b-t2o5ww2p73],
    .dd-rules-pane[b-t2o5ww2p73],
    .dd-runs-pane[b-t2o5ww2p73] {
        max-height: 32rem;
    }
}
/* /Components/Pages/CaseSearch.razor.rz.scp.css */
/* Tree beside results, both filling the height under the tab bar. The tree column has a floor so
   folder names stay readable; the results column takes the rest and is the one that benefits from
   width. */
.search-workspace[b-2erk44x730] {
    flex: 1 1 auto;
    min-height: 0;
    display: grid;
    grid-template-columns: var(--dv-picker, minmax(15rem, 24fr)) minmax(0, 76fr);
    /* Panes touch across, hairline down: see "Card panes" in app.css. */
    column-gap: 0;
    row-gap: 2px;
    align-items: stretch;
}

@media (max-width: 991.98px) {
    /* Stacked, two cards splitting one fixed page height is worse than scrolling — the same
       reasoning as the form exception in CLAUDE.md. */
    .search-workspace[b-2erk44x730] {
        grid-template-columns: 1fr;
    }
}

.search-tree[b-2erk44x730] {
    font-size: .9rem;
}

[b-2erk44x730] .folder-row,
[b-2erk44x730] .search-row {
    border-radius: .35rem;
    padding: .2rem .35rem;
    cursor: pointer;
    user-select: none;
}

[b-2erk44x730] .folder-row:hover,
[b-2erk44x730] .search-row:hover {
    background: var(--bs-secondary-bg, #eef0f5);
}

[b-2erk44x730] .folder-row.active,
[b-2erk44x730] .search-row.active {
    background: var(--bs-primary-bg-subtle, #cfe2ff);
}

/* Reveal the per-folder action buttons on hover to keep the tree uncluttered. */
[b-2erk44x730] .folder-actions {
    visibility: hidden;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
}

[b-2erk44x730] .folder-row:hover .folder-actions,
[b-2erk44x730] .folder-row:focus-within .folder-actions {
    visibility: visible;
}

/* ---- Connector lines --------------------------------------------------------------------
   Each node draws the ELBOW into its own row; a node that is not the last of its siblings also
   draws the TRUNK continuing down past its whole subtree. Those two together make one unbroken
   line, and because the last sibling draws no trunk the line stops there on its own — no masking
   and no measuring, which is what makes this hold for any depth or ordering.

   The wrapper's padding is the indent, so nesting alone produces the step-in. */
[b-2erk44x730] .tree-children {
    position: relative;
    padding-left: 17px;
}

[b-2erk44x730] .tree-node {
    position: relative;
}

/* Matte, not saturated: this is structure the eye should follow without it competing with the
   folder and search rows it connects. */
[b-2erk44x730] .tree-node::before {
    content: "";
    position: absolute;
    left: -10px;
    top: 0;
    width: 10px;
    height: 15px;
    border-left: 1.5px solid var(--cosmyre-tree-line);
    border-bottom: 1.5px solid var(--cosmyre-tree-line);
    border-bottom-left-radius: 15px;
    pointer-events: none;
}

[b-2erk44x730] .tree-node:not(.tree-last)::after {
    content: "";
    position: absolute;
    left: -10px;
    top: 15px;
    bottom: 0;
    border-left: 1.5px solid var(--cosmyre-tree-line);
    pointer-events: none;
}

/* The root has nothing above it to connect to. */
[b-2erk44x730] .tree-node.tree-root::before,
[b-2erk44x730] .tree-node.tree-root::after {
    display: none;
}
/* /Components/Pages/CaseSnapshot.razor.rz.scp.css */
/* Case Snapshot: a .snap-workspace pane PAIR (app.css) — Team Activity | Review Pipeline — both
   fill-cards that scroll their own bodies, with the review-progress bar in the section card's
   SubHead above them rather than in a pane of its own. This file styles the pane furniture:
   pinned heads, the head's filter/sort menu, section labels, the rail's KPI row, the progress
   bar, the team list, the chart wrap panel, and a shared inset for unpadded content. */

.snap-pane[b-icfvg4meyv] {
    min-width: 0;
}

/* Pinned title row, same shape as the Dashboard's .side-card-head. A flex row, not a block, so a
   .pane-collapse-btn's own margin-left: auto puts it at the right edge.

   min-height, not vertical padding, is what sets the height — so a head holding CONTROLS (Team
   Activity's filter and sort) is exactly as tall as one holding only a title (Review Pipeline)
   and the two panes' bottom borders line up across the workspace. Padding alone could not: a
   1.6rem control is taller than a 14px line box, so the pane with the controls sat ~5px lower.
   47px is the height the old text-only padding of 13px produced, so nothing else moved. */
.snap-pane-head[b-icfvg4meyv] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: .5rem;
    min-height: 47px;
    padding: .35rem 18px;
    border-bottom: 1px solid var(--bs-border-color, #eef0f5);
    font-size: 14px;
    color: var(--bs-emphasis-color, #14142b);
}

/* The head's height depends on this NOT wrapping: "Team Activity" broken onto two lines is what
   pushed the left pane's bottom border below the right pane's. It truncates instead — a clipped
   title on an absurdly narrow pane is a smaller problem than a head that changes height. */
.snap-pane-title[b-icfvg4meyv] {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* A section label WITHIN a scrolling pane body — not pinned, it scrolls with its content. */
.snap-pane-section[b-icfvg4meyv] {
    padding: 14px 18px 4px;
    font-size: .78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--bs-secondary-color, #6b7280);
}

/* Shared horizontal inset for content that has no padding of its own (charts, review-set rows,
   the Review Flow body, empty-state text) — everything else (.snap-pane-section, DataTable)
   manages its own. */
.snap-pane-pad[b-icfvg4meyv] {
    padding-left: 18px;
    padding-right: 18px;
}

.snap-pane .fill-card-body[b-icfvg4meyv] {
    scrollbar-gutter: stable;
}

/* ---- The four counts, on the rail's meta row ----
   .section-card-meta is already a wrapping flex row, so each KPI is one inline group in it:
   quiet label, then the number at emphasis weight. */
.snap-kpi[b-icfvg4meyv] {
    display: inline-flex;
    align-items: baseline;
    gap: .35rem;
    white-space: nowrap;
}

.snap-kpi-label[b-icfvg4meyv] {
    font-size: .75rem;
    color: var(--bs-secondary-color, #6b7280);
}

.snap-kpi-value[b-icfvg4meyv] {
    font-size: .95rem;
    font-weight: 700;
    color: var(--bs-emphasis-color, #14142b);
}

.snap-kpi-sub[b-icfvg4meyv] {
    font-size: .7rem;
    color: var(--bs-tertiary-color, #9aa1b4);
}

/* ---- Review Progress: the donut as a rail across the page ----
   Row 3 of .snap-page — under the section card, above the panes. Green from the left
   (reviewed), red for the rest (left to review); each zone's WIDTH is its percentage, so the
   bar needs no library and nothing to re-measure on resize. Colours are the donut's own, so the
   reading carries over.

   It rides SectionCard's SubHead slot, so it is inside the card with the counts it draws. The
   .5rem inset is the only margin: enough that the pill's ends do not collide with the card's
   own rounded corners, not so much that it reads as a separate band.

   overflow: hidden is what curves the ENDS without rounding the join between the two zones:
   the pill radius lives here, the zones are plain rectangles clipped by it. Tall enough to
   carry "42% done" inside the fill — the height is set BY the label, so shrinking it again
   means dropping the text (see .snap-progress-zone). */
.snap-progress-bar[b-icfvg4meyv] {
    display: flex;
    height: 1.15rem;
    margin: 0 .5rem .5rem;
    border-radius: 999px;
    overflow: hidden;
    /* Never seen when the two zones tile the width exactly; it is there for the sub-pixel case,
       where two rounded percentages leave a hairline at the join rather than a gap of card
       background inside the pill. */
    background: var(--bs-secondary-bg, #eef0f5);
}

/* A zone below the razor's LabelFloorPct hides its label rather than letting the text spill
   past the colour it belongs to; overflow: hidden is the backstop for the width where the
   label fits the threshold but not the pixels. */
.snap-progress-zone[b-icfvg4meyv] {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 0;
    overflow: hidden;
    font-size: .7rem;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
    color: #fff;
}

.snap-progress-left[b-icfvg4meyv] {
    background: #e6533c;
}

.snap-progress-done[b-icfvg4meyv] {
    background: #26bf94;
}

/* ---- Team Activity: a list, not a grid ----
   The left pane's whole body. One row per reviewer separated by a bottom rule and nothing else
   — no header, no zebra, no cell borders — because this is read down the page rather than
   sorted across it. The rule is on the row (not a border-top on the sibling) so the LAST one
   can be suppressed: a list ending on a line, one row above the card's own edge, reads as a
   dropped row. */
.snap-team-list[b-icfvg4meyv] {
    margin: 0;
    padding: 0;
    list-style: none;
}

.snap-team-row[b-icfvg4meyv] {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .6rem 18px;
    border-bottom: 1px solid var(--bs-border-color, #eef0f5);
}

.snap-team-row:last-child[b-icfvg4meyv] {
    border-bottom: 0;
}

/* Scoped override, NOT a change to the global .snap-avatar (2.1rem) — that size is also what
   CaseMissionAccuracy, CaseMissionFlow and the account page draw. In a dense list the portrait
   is an identifier, not a subject. */
.snap-team-row .snap-avatar[b-icfvg4meyv] {
    width: 1.6rem;
    height: 1.6rem;
}

/* Takes the slack so the two stats sit hard right whatever the name's length. Set small on
   purpose: UserDisplay.Name falls back to the EMAIL for a user with no first/last name, so this
   line is often an address, and an address at body size crowds out the figures beside it. */
.snap-team-name[b-icfvg4meyv] {
    flex: 1 1 auto;
    min-width: 0;
    font-size: .82rem;
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Number over label, right-aligned: the figure is what gets scanned, the word only says which.
   A rem floor keeps the two columns of figures aligned down the list without a table. */
.snap-team-stat[b-icfvg4meyv] {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    min-width: 4.5rem;
    line-height: 1.15;
}

.snap-team-stat-value[b-icfvg4meyv] {
    font-size: .95rem;
    font-weight: 700;
    color: var(--bs-emphasis-color, #14142b);
}

.snap-team-stat-label[b-icfvg4meyv] {
    font-size: .68rem;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--bs-secondary-color, #6b7280);
}

.snap-team-empty[b-icfvg4meyv] {
    padding-top: 14px;
}

/* ---- Case Vitals (administrator view) ----
   The same row vocabulary as the reviewer list, with one difference that matters: a vitals
   sub-label is a SENTENCE of figures ("files 4.1 GB · db 0.9 GB · index 0.3 GB"), not the
   one-word caption the roster's stats carry. Uppercased and floored at 4.5rem it would shout
   and then clip, so here the label reverts to sentence case and the stat column is allowed to
   take half the row and wrap. */
.snap-vitals .snap-team-stat[b-icfvg4meyv] {
    min-width: 8rem;
    max-width: 60%;
}

.snap-vitals .snap-team-stat-label[b-icfvg4meyv] {
    text-transform: none;
    letter-spacing: 0;
    font-size: .72rem;
    text-align: right;
    white-space: normal;
}

/* The name column stops being a single-line identifier here — "Dedupe saved" and friends are
   labels, and a narrow pane should wrap them rather than ellipsis them away. */
.snap-vitals .snap-team-name[b-icfvg4meyv] {
    white-space: normal;
    overflow: visible;
}

/* Capture time and the report link: a footnote to the list above, not a row of it. */
.snap-vitals-foot[b-icfvg4meyv] {
    padding: .5rem 18px 0;
    font-size: .72rem;
}

/* ---- The two 7-day charts, at the foot of the supporting pane ----
   A wrap panel: side by side while each can hold its floor, stacked once the splitter takes the
   pane below roughly twice that. Percentage basis rather than a fixed two-column grid so the
   fold follows the pane's real width, which a splitter changes continuously. */
.snap-charts[b-icfvg4meyv] {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.snap-chart[b-icfvg4meyv] {
    flex: 1 1 15rem;
    min-width: 0;
    margin: 0;
}

.snap-chart-title[b-icfvg4meyv] {
    margin-bottom: .15rem;
    font-size: .72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--bs-secondary-color, #6b7280);
}

/* ---- The filter / sort menu, behind one icon in the head ----
   Flat in the head these two controls pushed "Team Activity" onto a second line, which is what
   broke the two panes' head alignment. Behind a toggle the head is title + two 1.5rem buttons,
   which cannot wrap. */

/* Sits directly after the title, NOT pushed right: the icon is what you reach for having just
   read "Team Activity", so it belongs against the label rather than parked beside an unrelated
   collapse chevron. No margin-left: auto here — .pane-collapse-btn keeps its own, so it takes
   the head's free space and the chevron still lands hard right. */
.snap-team-tools[b-icfvg4meyv] {
    flex: 0 0 auto;
}

/* Deliberately the same box as .pane-collapse-btn (app.css) so the pair reads as one control
   group rather than two unrelated affordances. */
.snap-team-tools-btn[b-icfvg4meyv] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    position: relative;
    width: 1.5rem;
    height: 1.5rem;
    padding: 0;
    border: 0;
    border-radius: .35rem;
    background: transparent;
    color: var(--bs-secondary-color, #6b7280);
    cursor: pointer;
}

.snap-team-tools-btn:hover[b-icfvg4meyv],
.snap-team-tools-btn[aria-expanded="true"][b-icfvg4meyv] {
    background: var(--bs-secondary-bg, #e9ecef);
    color: var(--bs-body-color, #14142b);
}

/* The "something is applied" dot. On the button rather than in the menu because the menu is shut
   whenever it matters. */
.snap-team-tools-btn.is-on[b-icfvg4meyv]::after {
    content: "";
    position: absolute;
    top: .1rem;
    right: .1rem;
    width: .35rem;
    height: .35rem;
    border-radius: 50%;
    background: #845adf;
}

.snap-team-tools-menu[b-icfvg4meyv] {
    min-width: 13rem;
    padding: .6rem .7rem;
}

.snap-team-tools-label[b-icfvg4meyv] {
    display: block;
    margin-bottom: .15rem;
    font-size: .68rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--bs-secondary-color, #6b7280);
}

.snap-team-tools-label + *[b-icfvg4meyv] {
    margin-bottom: .5rem;
}

.snap-team-tools-menu > *:last-child[b-icfvg4meyv] {
    margin-bottom: 0;
}
/* /Components/Pages/CaseUserSelectionJob.razor.rz.scp.css */
/* The page sits on the tinted app surface, full-bleed like .page-surface / .snapshot-page
   in app.css, so the tabs, header and three-pane workspace float on it. Token-driven, so
   dark mode flips via var(--cosmyre-page-bg) with no [data-bs-theme] override here. The
   negative margin cancels .content's padding and the equal padding restores the top offset,
   so .usel-panes keeps its exact height/position; min-height tints the full viewport. */
.usel-page[b-72ccpxn984] {
    background: var(--cosmyre-page-bg);
    margin: -1.1rem -1.5rem 0;
    padding: 1.1rem 1.5rem;
    min-height: calc(100vh - 3.75rem);
}

/* Three-pane annotation workspace: doc list | page viewer | tagging panel. */
.usel-panes[b-72ccpxn984] {
    display: flex;
    gap: 1rem;
    align-items: stretch;
    height: calc(100vh - 240px);
    min-height: 360px;
    /* Never wrap-squish the three panes; a narrow window scrolls instead. */
    min-width: 980px;
}

.usel-docs[b-72ccpxn984] {
    flex: 0 0 var(--dv-lead, 360px);
    min-width: 0;
    overflow: auto;
}

.usel-viewer[b-72ccpxn984] {
    flex: 1 1 auto;
    min-width: 0;
    /* Containing block for the .pane-split overlay that resizes .usel-docs. */
    position: relative;
    display: flex;
    flex-direction: column;
    border: 1px solid var(--bs-border-color);
    border-radius: 0.375rem;
    background: var(--bs-body-bg);
}

.usel-tags[b-72ccpxn984] {
    flex: 0 0 300px;
    overflow: auto;
}

.usel-zoom[b-72ccpxn984] {
    width: 140px;
}

.usel-scroll[b-72ccpxn984] {
    flex: 1;
    overflow: auto;
    padding: 0.75rem;
    background: var(--bs-secondary-bg);
}

/* One rendered page: the img sets the size, the SVG overlay stretches over it so
   normalized fractions are the drawing coordinates directly. */
.sel-page[b-72ccpxn984] {
    position: relative;
    margin: 0 auto 0.75rem;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
}

.sel-page-img[b-72ccpxn984] {
    display: block;
    width: 100%;
    height: auto;
    user-select: none;
    -webkit-user-drag: none;
}

.sel-overlay[b-72ccpxn984] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    cursor: crosshair;
    touch-action: none;
}

.sel-overlay.sel-locked[b-72ccpxn984] {
    pointer-events: none;
}

.sel-box[b-72ccpxn984] {
    stroke-width: 2px;
    cursor: pointer;
}

.sel-box-active[b-72ccpxn984] {
    stroke-width: 3px;
}

/* Box colors cycle by profile index so each example profile reads at a glance. */
.sel-p0[b-72ccpxn984] { stroke: #0d6efd; fill: rgba(13, 110, 253, 0.12); }
.sel-p1[b-72ccpxn984] { stroke: #dc3545; fill: rgba(220, 53, 69, 0.12); }
.sel-p2[b-72ccpxn984] { stroke: #198754; fill: rgba(25, 135, 84, 0.12); }
.sel-p3[b-72ccpxn984] { stroke: #fd7e14; fill: rgba(253, 126, 20, 0.12); }
.sel-p4[b-72ccpxn984] { stroke: #6f42c1; fill: rgba(111, 66, 193, 0.12); }
.sel-p5[b-72ccpxn984] { stroke: #0dcaf0; fill: rgba(13, 202, 240, 0.12); }

.usel-badge-p0[b-72ccpxn984] { background-color: #0d6efd; }
.usel-badge-p1[b-72ccpxn984] { background-color: #dc3545; }
.usel-badge-p2[b-72ccpxn984] { background-color: #198754; }
.usel-badge-p3[b-72ccpxn984] { background-color: #fd7e14; }
.usel-badge-p4[b-72ccpxn984] { background-color: #6f42c1; }
.usel-badge-p5[b-72ccpxn984] { background-color: #0dcaf0; color: #000; }

.usel-box-list li[b-72ccpxn984] {
    cursor: pointer;
    padding: 0.15rem 0.25rem;
    border-radius: 0.25rem;
}

.usel-box-list li:hover[b-72ccpxn984],
.usel-box-row-active[b-72ccpxn984] {
    background: var(--bs-secondary-bg);
}
/* /Components/Pages/DocumentViewer.razor.rz.scp.css */
/* Full-viewport working surface: the page never scrolls, each region scrolls itself.
   Negative margins reclaim the .content padding so the layout reaches the edges. */
.dv-root[b-z64vgwbxq9] {
    --dv-text-scale: 1;
    display: flex;
    flex-direction: column;
    height: calc(100vh - 3.75rem);
    margin: -1.1rem -1.5rem 0;
}

/* Small/Medium/Large text control (toolbar) scales every panel's type via this one var. */
.dv-root.dv-text-small[b-z64vgwbxq9]  { --dv-text-scale: .85; }
.dv-root.dv-text-medium[b-z64vgwbxq9] { --dv-text-scale: 1; }
.dv-root.dv-text-large[b-z64vgwbxq9]  { --dv-text-scale: 1.2; }

/* ---- Toolbar ---- */
.dv-toolbar[b-z64vgwbxq9] {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .4rem .75rem;
    border-bottom: 1px solid var(--bs-border-color);
    flex: 0 0 auto;
}

.dv-toolbar h1[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-width: 0;
}

.dv-status[b-z64vgwbxq9] {
    white-space: nowrap;
}

.dv-toolbar-buttons[b-z64vgwbxq9] {
    display: flex;
    gap: .35rem;
    flex: 0 0 auto;
}

/* ---- Middle row: left panel · document · right card ---- */
.dv-main[b-z64vgwbxq9] {
    display: flex;
    flex: 1 1 auto;
    min-height: 0;
}

.dv-left[b-z64vgwbxq9] {
    flex: 0 0 var(--dv-left, 300px);
    width: var(--dv-left, 300px);
    min-width: 0;
    overflow-y: auto;
    padding: .5rem .6rem;
}

.dv-panel-head[b-z64vgwbxq9] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .4rem;
    padding-bottom: .35rem;
    margin-bottom: .4rem;
    border-bottom: 1px solid var(--bs-border-color);
}

.dv-panel-head span:first-child[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-width: 0;
}

/* Always-visible per-category totals; the active chip mirrors the list's category filter. */
.dv-cat-counts[b-z64vgwbxq9] {
    display: flex;
    gap: .35rem;
    margin-bottom: .4rem;
}

.dv-cat-chip[b-z64vgwbxq9] {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    border: 1px solid var(--bs-border-color);
    background-color: transparent;
    color: var(--bs-body-color);
    border-radius: 999px;
    padding: .1rem .55rem;
    font-size: calc(.75rem * var(--dv-text-scale));
}

.dv-cat-chip:hover[b-z64vgwbxq9] {
    background-color: var(--bs-secondary-bg);
}

.dv-cat-chip.dv-chip-active[b-z64vgwbxq9] {
    border-color: var(--cosmyre-accent);
    box-shadow: inset 0 0 0 1px var(--cosmyre-accent);
}

.dv-cat-chip .badge[b-z64vgwbxq9] {
    font-size: calc(.68rem * var(--dv-text-scale));
}

/* Compact type so the whole form fits with minimal scrolling. */
.dv-left[b-z64vgwbxq9] {
    font-size: calc(.8rem * var(--dv-text-scale));
}

.dv-left[b-z64vgwbxq9]  .form-label,
.dv-left[b-z64vgwbxq9]  .form-check-label {
    font-size: calc(.72rem * var(--dv-text-scale));
}

.dv-left[b-z64vgwbxq9]  .form-control-sm,
.dv-left[b-z64vgwbxq9]  .form-select-sm {
    font-size: calc(.72rem * var(--dv-text-scale));
    padding: .1rem .35rem;
    min-height: calc(1.25em + .3rem);
}

.dv-left[b-z64vgwbxq9]  .form-select-sm {
    padding-right: 1.4rem;
}

/* Field name on the left, its input on the right — half the vertical space. */
.dv-left[b-z64vgwbxq9]  .pf-field {
    display: flex;
    align-items: center;
    gap: .4rem;
    margin-bottom: 0 !important;
}

.dv-left[b-z64vgwbxq9]  .pf-field > label {
    flex: 0 0 44%;
    margin: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.dv-left[b-z64vgwbxq9]  .pf-field > input,
.dv-left[b-z64vgwbxq9]  .pf-field > select {
    flex: 1 1 auto;
    min-width: 0;
}

/* Boolean fields render as a Bootstrap .form-check (checkbox then label). Mirror the
   .pf-field layout instead: field name on the left, checkbox lined up on the right
   where the text boxes begin. */
.dv-left[b-z64vgwbxq9]  .form-check {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding-left: 0;
    margin-bottom: 0;
}

.dv-left[b-z64vgwbxq9]  .form-check > .form-check-label {
    order: 0;
    flex: 0 0 44%;
    margin: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.dv-left[b-z64vgwbxq9]  .form-check > .form-check-input {
    order: 1;
    flex: 0 0 auto;
    margin: 0;
    float: none;
}

/* Light, distinct tint per field group; rgba keeps them subtle in dark mode too.
   Each group is a responsive grid, so a wider panel flows fields into more columns. */
.dv-left[b-z64vgwbxq9]  .pf-group {
    padding: .35rem .5rem .45rem;
    border-radius: .375rem;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
    gap: .15rem .75rem;
    align-content: start;
}

.dv-left[b-z64vgwbxq9]  .pf-group > .fw-bold,
.dv-left[b-z64vgwbxq9]  .pf-group > .table {
    grid-column: 1 / -1;
}

.dv-left[b-z64vgwbxq9]  .pf-group .table-sm th,
.dv-left[b-z64vgwbxq9]  .pf-group .table-sm td {
    padding: .12rem .3rem;
}

.dv-left[b-z64vgwbxq9]  .pf-group-0 { background-color: rgba(77, 137, 244, .10); }
.dv-left[b-z64vgwbxq9]  .pf-group-1 { background-color: rgba(46, 184, 92, .10); }
.dv-left[b-z64vgwbxq9]  .pf-group-2 { background-color: rgba(255, 165, 0, .13); }
.dv-left[b-z64vgwbxq9]  .pf-group-3 { background-color: rgba(132, 90, 223, .10); }
.dv-left[b-z64vgwbxq9]  .pf-group-4 { background-color: rgba(32, 178, 170, .12); }
.dv-left[b-z64vgwbxq9]  .pf-group-5 { background-color: rgba(244, 94, 94, .10); }

.dv-left[b-z64vgwbxq9]  .pf-group .table,
.dv-left[b-z64vgwbxq9]  .pf-group th,
.dv-left[b-z64vgwbxq9]  .pf-group td {
    background-color: transparent;
}

.dv-center[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-width: 240px;
    min-height: 0;
    display: flex;
    flex-direction: column;
    padding: .4rem .5rem 0;
}

.dv-pane-bar[b-z64vgwbxq9] {
    display: flex;
    align-items: center;
    gap: .5rem;
    flex: 0 0 auto;
    padding-bottom: .4rem;
}

.dv-viewport[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-height: 0;
}

/* Zoom / fit cluster pinned to the right end of the pane bar. */
.dv-zoom[b-z64vgwbxq9] {
    display: flex;
    align-items: center;
    gap: .5rem;
    margin-left: auto;
}

/* Fixed width so the percent readout doesn't resize the button as it changes. */
.dv-zoom-pct[b-z64vgwbxq9] {
    min-width: 3.4rem;
    text-align: center;
    padding-left: .25rem;
    padding-right: .25rem;
}

.dv-right[b-z64vgwbxq9] {
    flex: 0 0 var(--dv-right, 380px);
    width: var(--dv-right, 380px);
    min-width: 0;
    min-height: 0;
    display: flex;
    padding: .4rem .5rem .4rem 0;
}

/* ---- Right card: three collapsible sections in one independently scrolling card ---- */
.dv-side-card[b-z64vgwbxq9] {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
    min-width: 0;
}

.dv-side-scroll[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

/* Template picker + ditto row above the sections (scrolls with them; the sticky
   colored section headers keep Save visible). Base section styles live in app.css. */
.dv-side-head[b-z64vgwbxq9] {
    display: flex;
    align-items: center;
    gap: .4rem;
    padding: .4rem .5rem;
    background: var(--bs-body-bg);
    border-bottom: 1px solid var(--bs-border-color);
}

.dv-side-head .dv-template-select[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-width: 0;
}

/* Per-review-set stage badges at the top of the Coding section. */
.dv-stage-badges[b-z64vgwbxq9] {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
    margin-bottom: .5rem;
}

/* Right card text matches the compact profile panel (and scales with the S/M/L control).
   These target inline page markup, so no ::deep is needed. */
.dv-right[b-z64vgwbxq9] {
    font-size: calc(.8rem * var(--dv-text-scale));
}

.dv-right .form-control-sm[b-z64vgwbxq9],
.dv-right .form-select-sm[b-z64vgwbxq9] {
    font-size: calc(.72rem * var(--dv-text-scale));
    padding: .1rem .35rem;
    min-height: calc(1.25em + .3rem);
}

.dv-right .form-select-sm[b-z64vgwbxq9] {
    padding-right: 1.4rem;
}

/* ---- Splitters ---- */
.dv-splitter[b-z64vgwbxq9] {
    flex: 0 0 6px;
    position: relative;
    touch-action: none;
}

.dv-splitter-x[b-z64vgwbxq9] {
    cursor: col-resize;
}

.dv-splitter-y[b-z64vgwbxq9] {
    cursor: row-resize;
}

.dv-splitter[b-z64vgwbxq9]::after {
    content: "";
    position: absolute;
    background-color: var(--bs-border-color);
    transition: background-color .15s;
}

.dv-splitter-x[b-z64vgwbxq9]::after {
    top: 0;
    bottom: 0;
    left: 2px;
    width: 2px;
}

.dv-splitter-y[b-z64vgwbxq9]::after {
    left: 0;
    right: 0;
    top: 2px;
    height: 2px;
}

.dv-splitter:hover[b-z64vgwbxq9]::after,
.dv-dragging .dv-splitter[b-z64vgwbxq9]::after {
    background-color: var(--cosmyre-accent);
}

/* While dragging, iframes must not swallow pointer events and text must not select. */
.dv-root.dv-dragging[b-z64vgwbxq9] {
    user-select: none;
}

.dv-root.dv-dragging iframe[b-z64vgwbxq9] {
    pointer-events: none;
}

/* ---- Document panes: height flows from the viewport, no more fixed 70vh ---- */
.native-frame[b-z64vgwbxq9] {
    width: 100%;
    height: 100%;
    border: 1px solid #dee2e6;
    border-radius: 4px;
    background: #fff;
}

.extracted-text[b-z64vgwbxq9] {
    width: 100%;
    height: 100%;
    overflow: auto;
    white-space: pre-wrap;
    word-break: break-word;
    border: 1px solid #dee2e6;
    border-radius: 4px;
    background: #fff;
    padding: 12px;
    font-size: 0.85rem;
    font-family: Consolas, "Courier New", monospace;
    margin-bottom: 0;
}

/* ---- Bottom dock: the linked-profiles grid scrolls both axes by itself ---- */
.dv-bottom[b-z64vgwbxq9] {
    flex: 0 0 var(--dv-bottom, 20vh);
    min-height: 80px;
    overflow: hidden;
    padding: 0 .25rem .25rem;
    display: flex;
    flex-direction: column;
    font-size: calc(.8rem * var(--dv-text-scale)); /* same compact type as the profile panel */
}

.dv-bottom[b-z64vgwbxq9]  .form-control-sm,
.dv-bottom[b-z64vgwbxq9]  .form-select-sm {
    font-size: calc(.72rem * var(--dv-text-scale));
    padding: .1rem .35rem;
    min-height: calc(1.25em + .3rem);
}

.dv-bottom[b-z64vgwbxq9]  .form-select-sm {
    padding-right: 1.4rem;
}

.dv-bottom[b-z64vgwbxq9]  .btn-sm {
    font-size: calc(.72rem * var(--dv-text-scale));
    padding: .1rem .35rem;
}

.dv-bottom-bar[b-z64vgwbxq9] {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .15rem 0 .3rem;
    flex: 0 0 auto;
}

.dv-cat-select[b-z64vgwbxq9] {
    width: auto;
}

/* Push the profile uploader to the right end of the bar, like .dv-zoom on the pane bar. */
.dv-upload-profiles[b-z64vgwbxq9] {
    margin-left: auto;
}

.dv-bottom-grid[b-z64vgwbxq9] {
    flex: 1 1 auto;
    min-height: 0;
}

.dv-bottom-grid[b-z64vgwbxq9]  .dnt-fill {
    height: 100%;
}

/* Grid lines. Separate borders (not collapsed) so they travel with the sticky header/columns. */
.dv-bottom[b-z64vgwbxq9]  .dnt-fill > table {
    border-collapse: separate;
    border-spacing: 0;
}

.dv-bottom[b-z64vgwbxq9]  .dnt-fill th,
.dv-bottom[b-z64vgwbxq9]  .dnt-fill td {
    border-right: 1px solid var(--bs-border-color);
    border-bottom: 1px solid var(--bs-border-color);
}

.dv-bottom[b-z64vgwbxq9]  .dv-col-pin {
    position: sticky;
    z-index: 4;
    background-color: var(--bs-body-bg);
}

.dv-bottom[b-z64vgwbxq9]  .dv-col-pin-0 {
    left: 0;
    width: 3rem;
    min-width: 3rem;
}

.dv-bottom[b-z64vgwbxq9]  .dv-col-pin-1 {
    left: 3rem;
}

.dv-bottom[b-z64vgwbxq9]  thead th.dv-col-pin {
    z-index: 5;
}

.dv-bottom[b-z64vgwbxq9]  tr.dv-row-selected td {
    box-shadow: inset 0 0 0 9999px rgba(var(--cosmyre-accent-rgb), .08);
}

.dv-bottom[b-z64vgwbxq9]  td .dv-cell-editor {
    min-width: 9rem;
}

/* ---- Narrow screens: stack panels, fixed heights, no splitters ---- */
@media (max-width: 991.98px) {
    .dv-root[b-z64vgwbxq9] {
        height: auto;
        margin: 0;
    }

    .dv-main[b-z64vgwbxq9] {
        flex-direction: column;
    }

    .dv-left[b-z64vgwbxq9],
    .dv-right[b-z64vgwbxq9] {
        width: auto;
        flex: 0 0 auto;
        max-height: 40vh;
        padding: .4rem 0;
    }

    .dv-splitter[b-z64vgwbxq9] {
        display: none;
    }

    .dv-viewport[b-z64vgwbxq9] {
        flex: 0 0 auto;
        height: 60vh;
    }

    .dv-bottom[b-z64vgwbxq9] {
        flex: 0 0 auto;
        height: 40vh;
    }
}
/* /Components/Pages/GroundControl.razor.rz.scp.css */
/* Ground Control → Overview: a .list-page-row pane pair (app.css "Card panes"). Left is the
   instance stats, one per row; right is the cases table. */

/* The stats pane is a single-column stack of one-line rows, not a tile field, so it takes a fixed
   width (28rem default, draggable via the .dv-lead splitter — --dv-lead is the size js/splitters.js
   writes onto .list-page-row) and the cases table gets the rest. Scoped, so this outranks app.css's
   `.list-page-row > .list-page-list { flex: 1 1 0 }` AND its own `.dv-lead { flex: 0 0 var(--dv-lead,
   50%) }` on specificity alone — this rule has to carry the var itself, not just the class, or a
   drag would write --dv-lead and nothing would consume it. Below 992px the row stacks to a column
   and the pane returns to its natural height. */
.list-page-row > .gc-stats[b-4m89nud3ci] {
    flex: 0 0 var(--dv-lead, 28rem);
}

/* One stat per row: label · value · sub-count · icon. Exactly the icon's 3rem box plus 2px tall —
   the row IS the icon's height, nothing more. Hairline between rows, none after the last. */
.gc-stat[b-4m89nud3ci] {
    display: flex;
    align-items: center;
    gap: .75rem;
    height: calc(3rem + 2px);
    padding: 0 .75rem;
    border-bottom: 1px solid var(--bs-border-color);
}

.gc-stat:last-child[b-4m89nud3ci] {
    border-bottom: 0;
}

.gc-stat-label[b-4m89nud3ci] {
    flex: 0 0 11rem;
    font-size: .8rem;
    color: var(--bs-secondary-color);
}

.gc-stat-value[b-4m89nud3ci] {
    flex: 0 0 auto;
    font-size: 1.15rem;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
}

.gc-stat-unit[b-4m89nud3ci] {
    font-size: .8rem;
    font-weight: 400;
    color: var(--bs-secondary-color);
}

/* The sub-count sits in the middle: it takes the slack between the value and the icon and
   centres in it, clipping rather than wrapping so the row height never changes. */
.gc-stat-sub[b-4m89nud3ci] {
    flex: 1 1 auto;
    min-width: 0;
    text-align: center;
    font-size: .75rem;
    color: var(--bs-secondary-color);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* .snap-icon is app.css's 3rem tinted square; the row height is locked to that 3rem regardless
   (calc(3rem + 2px) above), so shrinking the icon here just opens breathing room around it instead
   of shrinking the row. Authored directly in this page's own markup — no ::deep needed, it already
   carries this file's scope attribute. */
.gc-stat > .snap-icon[b-4m89nud3ci] {
    flex: 0 0 2rem;
    width: 2rem;
    height: 2rem;
    font-size: 1rem;
}

@media (max-width: 991.98px) {
    .list-page-row > .gc-stats[b-4m89nud3ci] {
        flex: 0 0 auto;
    }
}
/* /Components/Pages/Home.razor.rz.scp.css */
/* Dashboard landing page. Navy/purple Cosmyre theme. Colors use Bootstrap CSS
   variables so light/dark (data-bs-theme) flip automatically; brand accents
   (purple/status colors) stay fixed. Mirrors the Case Snapshot dashboard. */

/* Tinted page background — the default .page-surface look; tint (and its dark-mode
   variant) come from var(--cosmyre-page-bg). Kept as its own class for the extra
   text color/font rules below. */
/* Exactly the viewport below the 3.75rem header, like .page-fill: the greeting pins at the top
   and the three panes below it divide the rest, each scrolling its own body. The page never
   scrolls — see app.css → "fill-and-scroll". */
.dash[b-pug6dyxlx2] {
    background: var(--cosmyre-page-bg);
    margin: -1.1rem -1.5rem 0;
    padding: 1.1rem 1.5rem;
    height: calc(100vh - 3.75rem);
    display: flex;
    flex-direction: column;
    color: var(--bs-body-color, #14142b);
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}

/* ---- greeting card + actions ----
   The seam under this card CLOSES COMPLETELY rather than taking the 2px stacked-card hairline:
   it is a header for the panes below it, not a card beside them, which is the same carve-out the
   section rail (.section-card-detached) gets. So no bottom margin, no bottom border — the panes
   bring their own top border — and the bottom corners square onto them. Layout gaps elsewhere on
   this page are capped at 10px; the cards' own padding is type inset, not space between cards.
   See CLAUDE.md → "Card panes". */
.dash-greeting[b-pug6dyxlx2] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 0;
    background: var(--bs-body-bg, #fff);
    border: 1px solid var(--bs-border-color, #e8e9ef);
    border-bottom-width: 0;
    border-radius: .65rem .65rem 0 0;
    box-shadow: 0 .25rem .75rem rgba(20, 20, 50, .05);
    padding: 20px 22px;
}

/* The other half of the seam: the panes directly under the greeting lose their top rounding, so
   the two read as one surface instead of two rounded cards colliding. */
.dash-greeting + .list-page-row > .list-page-list[b-pug6dyxlx2] {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
}

.dash-hello[b-pug6dyxlx2] {
    margin: 0;
    font-size: 26px;
    font-weight: 700;
    color: var(--bs-emphasis-color, #14142b);
}

.dash-sub[b-pug6dyxlx2] {
    margin: 5px 0 0;
    color: var(--bs-secondary-color, #6b7280);
    font-size: 14px;
}

.dash-attention[b-pug6dyxlx2] {
    color: #d8961f;
    font-weight: 600;
}

.dash-actions[b-pug6dyxlx2] {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.dash-btn[b-pug6dyxlx2] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    background: var(--bs-body-bg, #fff);
    color: var(--bs-body-color, #374151);
    border: 1px solid var(--bs-border-color, #e2e5ec);
    padding: .58rem .95rem;
    border-radius: 8px;
    font-size: 14px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
    transition: background .15s, border-color .15s;
}

.dash-btn:hover[b-pug6dyxlx2] { background: var(--bs-tertiary-bg, #f0f2f7); }

.dash-btn-primary[b-pug6dyxlx2] {
    background: var(--cosmyre-accent);
    color: #fff;
    border-color: var(--cosmyre-accent);
}

.dash-btn-primary:hover[b-pug6dyxlx2] { background: var(--cosmyre-accent-hover); }

.dash-empty[b-pug6dyxlx2] {
    padding: 28px 4px;
    color: var(--bs-secondary-color, #6b7280);
    font-size: 14px;
}

.dash-empty a[b-pug6dyxlx2] { color: var(--cosmyre-accent); }

/* ---- panes ----
   Widths are splitter-driven: js/splitters.js writes --dv-stats / --dv-side onto .list-page-row,
   and these rules are what consume them, so a drag actually moves the boundary. Scoped, so they
   outrank app.css's `.list-page-row > .list-page-list { flex: 1 1 0 }`; the centre pane is left
   to that rule and takes whatever is left. */
.list-page-row > .dash-stats-pane[b-pug6dyxlx2] { flex: 0 0 var(--dv-stats, 15rem); }
.list-page-row > .dash-side-pane[b-pug6dyxlx2] { flex: 0 0 var(--dv-side, 18rem); }

/* Collapsed to a strip (the pane fold — app.css "Collapsible panes"). A flex pane shrinks its own
   basis, so no :has() on the row is needed. Scoped to the .dash-* panes and NEVER to
   .list-page-row, which seven two-pane pages share.
   NOTE it does NOT defer to the ≤992px block below by source order: that block is one class less
   specific, and a media query adds no specificity, so it has to name .pane-collapsed itself or
   this basis would apply stacked too — where it is a HEIGHT, clipping the head it is meant to
   show. */
.list-page-row > .dash-stats-pane.pane-collapsed[b-pug6dyxlx2],
.list-page-row > .dash-side-pane.pane-collapsed[b-pug6dyxlx2] { flex: 0 0 2.75rem; }

.side-card-head.pane-head[b-pug6dyxlx2] { gap: .5rem; }

/* The right pane's splitter rides its LEFT edge, so it needs a positioning context of its own. */
.dash-side-pane[b-pug6dyxlx2] { position: relative; }

/* ---- stat rows ----
   One per row: label · value · icon. Height is the icon's box plus 2px and nothing more; the
   icon is smaller than that box so it sits centred with air around it rather than filling the row. */
/* 18px horizontal padding, matching .side-card-head and .side-card-body: a row's label has to
   start at the same x as its section header, or the card reads as two misaligned columns. */
.dash-stat[b-pug6dyxlx2] {
    display: flex;
    align-items: center;
    gap: 10px;
    height: calc(3rem + 2px);
    padding: 0 18px;
    border-bottom: 1px solid var(--bs-border-color, #f3f4f8);
}

.dash-stat:last-child[b-pug6dyxlx2] { border-bottom: 0; }

/* The label takes the slack so every label starts at the same x and truncates rather than pushing
   the value out (the pane drags down to 180px). */
.dash-stat-label[b-pug6dyxlx2] {
    flex: 1 1 auto;
    min-width: 0;
    font-size: .82rem;
    color: var(--bs-secondary-color, #6b7280);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* A fixed, right-aligned column — NOT centred in the leftover slack, which is what stopped the
   counts lining up: each row's slack differs with its label length, so each value landed at a
   different x. Fixed width + right-aligned puts every count in one column. */
.dash-stat-value[b-pug6dyxlx2] {
    flex: 0 0 4.5rem;
    text-align: right;
    font-size: 1.15rem;
    font-weight: 700;
    line-height: 1;
    color: var(--bs-emphasis-color, #14142b);
    white-space: nowrap;
}

.stat-icon[b-pug6dyxlx2] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: .5rem;
    font-size: 1rem;
    flex: 0 0 2rem;
}

/* Semi-transparent tints read well on both light and dark cards. */
.icon-purple[b-pug6dyxlx2] { background: rgba(var(--cosmyre-accent-rgb), .15); color: var(--cosmyre-accent); }
.icon-blue[b-pug6dyxlx2] { background: rgba(23, 153, 192, .15); color: #1799c0; }
.icon-green[b-pug6dyxlx2] { background: rgba(38, 191, 148, .15); color: #1aa179; }
.icon-amber[b-pug6dyxlx2] { background: rgba(245, 184, 73, .18); color: #d8961f; }

/* Dark: lift the glyph colors for contrast on the dark tint. */
[data-bs-theme="dark"] .icon-purple[b-pug6dyxlx2] { color: #a380ec; }
[data-bs-theme="dark"] .icon-blue[b-pug6dyxlx2] { color: #35b3d6; }
[data-bs-theme="dark"] .icon-green[b-pug6dyxlx2] { color: #26bf94; }
[data-bs-theme="dark"] .icon-amber[b-pug6dyxlx2] { color: #e0a53a; }

.chip-row[b-pug6dyxlx2] { display: flex; gap: 8px; flex-wrap: wrap; }

.chip[b-pug6dyxlx2] {
    border: 1px solid var(--bs-border-color, #e2e5ec);
    background: var(--bs-body-bg, #fff);
    color: var(--bs-secondary-color, #374151);
    padding: .3rem .75rem;
    border-radius: 999px;
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
    transition: background .15s, border-color .15s, color .15s;
}

.chip:hover[b-pug6dyxlx2] { background: var(--bs-tertiary-bg, #f6f7fb); }

.chip-on[b-pug6dyxlx2] {
    background: var(--cosmyre-accent);
    border-color: var(--cosmyre-accent);
    color: #fff;
}

/* ---- case cards ----
   auto-fill rather than a fixed two columns: the centre pane's width is now splitter-driven, so
   the grid has to reflow to however much room it is given instead of squashing two columns. */
.case-grid[b-pug6dyxlx2] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
    gap: 10px;
}

/* Padding lives on the scrolling body, not the card, so the scrollbar rides the card's edge. */
.dash-cases-body[b-pug6dyxlx2] { padding: 10px; }

.case-card[b-pug6dyxlx2] {
    display: block;
    background: var(--bs-body-bg, #fff);
    border: 1px solid var(--bs-border-color, #e8e9ef);
    border-radius: .65rem;
    box-shadow: 0 .25rem .75rem rgba(20, 20, 50, .05);
    padding: 18px;
    text-decoration: none;
    color: inherit;
    transition: box-shadow .15s, border-color .15s;
}

.case-card:hover[b-pug6dyxlx2] {
    box-shadow: 0 .6rem 1.4rem rgba(20, 20, 50, .12);
    border-color: var(--cosmyre-accent);
}

.case-card-top[b-pug6dyxlx2] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 8px;
}

.case-no[b-pug6dyxlx2] {
    font-family: ui-monospace, Menlo, monospace;
    font-size: 11.5px;
    color: var(--bs-tertiary-color, #9aa1b4);
}

.case-status[b-pug6dyxlx2] {
    color: #fff;
    font-size: 11px;
    font-weight: 600;
    padding: .18rem .5rem;
    border-radius: 999px;
    white-space: nowrap;
}

.st-active[b-pug6dyxlx2] { background: #1aa179; }
.st-inactive[b-pug6dyxlx2] { background: #9aa1b4; }
.st-deleting[b-pug6dyxlx2] { background: #e6533c; }

.case-name[b-pug6dyxlx2] {
    font-size: 15.5px;
    font-weight: 600;
    color: var(--bs-emphasis-color, #14142b);
    line-height: 1.3;
}

.case-client[b-pug6dyxlx2] {
    font-size: 12.5px;
    color: var(--bs-secondary-color, #6b7280);
    margin-top: 2px;
}

.case-progress-row[b-pug6dyxlx2] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin: 10px 0 6px;
    font-size: 12px;
}

.case-pct[b-pug6dyxlx2] { color: var(--bs-body-color, #374151); font-weight: 600; }
.case-docs[b-pug6dyxlx2] { color: var(--bs-tertiary-color, #9aa1b4); }

.progress-track[b-pug6dyxlx2] {
    height: 7px;
    border-radius: 999px;
    background: var(--bs-secondary-bg, #eef0f5);
    overflow: hidden;
}

.progress-bar[b-pug6dyxlx2] {
    height: 100%;
    border-radius: 999px;
    background: var(--cosmyre-accent);
}

.case-card-foot[b-pug6dyxlx2] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-top: 10px;
}

.avatar-row[b-pug6dyxlx2] { display: flex; align-items: center; gap: 8px; }

.avatar[b-pug6dyxlx2] {
    width: 26px;
    height: 26px;
    border-radius: 50%;
    object-fit: cover;
    border: 2px solid var(--bs-body-bg, #fff);
    margin-left: -7px;
    background: var(--bs-secondary-bg, #eef0f5);
}

.avatar:first-child[b-pug6dyxlx2] { margin-left: 0; }

.case-updated[b-pug6dyxlx2] { font-size: 11.5px; color: var(--bs-tertiary-color, #9aa1b4); }

.case-open[b-pug6dyxlx2] {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    color: var(--cosmyre-accent);
    font-size: 12.5px;
    font-weight: 600;
    white-space: nowrap;
}

[data-bs-theme="dark"] .case-open[b-pug6dyxlx2] { color: #a380ec; }

/* ---- section heads and bodies ----
   These are section headers WITHIN a pane now (At a Glance, Your Active Cases, Fleet Health,
   Recent Activity), not cards of their own — .card on the pane supplies the surface. The head is
   flex: 0 0 auto so it pins when it is the pane's first row. */
.side-card-head[b-pug6dyxlx2] {
    flex: 0 0 auto;
    padding: 13px 18px;
    border-bottom: 1px solid var(--bs-border-color, #eef0f5);
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-weight: 600;
    font-size: 14px;
    color: var(--bs-emphasis-color, #14142b);
}

.side-card-head a[b-pug6dyxlx2] { font-size: 12px; color: var(--cosmyre-accent); text-decoration: none; }
.side-card-head a:hover[b-pug6dyxlx2] { text-decoration: underline; }
[data-bs-theme="dark"] .side-card-head a[b-pug6dyxlx2] { color: #a380ec; }

.side-card-body[b-pug6dyxlx2] { padding: 6px 18px 14px; }

.dot[b-pug6dyxlx2] {
    width: 9px;
    height: 9px;
    border-radius: 50%;
    flex: 0 0 9px;
    display: inline-block;
}

.dot-green[b-pug6dyxlx2] { background: #1aa179; }
.dot-amber[b-pug6dyxlx2] { background: #d8961f; }
.dot-red[b-pug6dyxlx2] { background: #e6533c; }
.dot-grey[b-pug6dyxlx2] { background: #c2c7d2; }
.dot-purple[b-pug6dyxlx2] { background: var(--cosmyre-accent); }

/* gap and padding match .activity-row exactly: both are sections of the SAME card now, so their
   dots and labels have to sit on one pair of columns rather than a pixel apart. */
.fleet-row[b-pug6dyxlx2] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 0;
    border-bottom: 1px solid var(--bs-border-color, #f3f4f8);
    text-decoration: none;
    color: inherit;
}

.fleet-row:last-child[b-pug6dyxlx2] { border-bottom: none; }
.fleet-row:hover .fleet-label[b-pug6dyxlx2] { color: var(--cosmyre-accent); }
[data-bs-theme="dark"] .fleet-row:hover .fleet-label[b-pug6dyxlx2] { color: #a380ec; }

.fleet-label[b-pug6dyxlx2] { font-size: 13px; color: var(--bs-body-color, #374151); flex: 1; }
.fleet-meta[b-pug6dyxlx2] { font-size: 12.5px; color: var(--bs-secondary-color, #6b7280); }

.activity-row[b-pug6dyxlx2] {
    display: flex;
    gap: 10px;
    padding: 10px 0;
    border-bottom: 1px solid var(--bs-border-color, #f3f4f8);
    text-decoration: none;
    color: inherit;
}

.activity-row:last-child[b-pug6dyxlx2] { border-bottom: none; }
.activity-row .dot[b-pug6dyxlx2] { margin-top: 5px; }

.activity-body[b-pug6dyxlx2] { min-width: 0; }
.activity-text[b-pug6dyxlx2] { font-size: 12.8px; color: var(--bs-body-color, #374151); line-height: 1.4; }
.activity-text b[b-pug6dyxlx2] { color: var(--bs-emphasis-color, #14142b); }
.activity-time[b-pug6dyxlx2] { font-size: 11px; color: var(--bs-tertiary-color, #9aa1b4); margin-top: 1px; }
.activity-empty[b-pug6dyxlx2] { font-size: 13px; color: var(--bs-tertiary-color, #9aa1b4); padding: 8px 0; }

/* ---- responsive ----
   app.css stacks .list-page-row to one column at this breakpoint. Stacked, a viewport-height page
   would crush three panes to nothing, so the page scrolls again and each pane keeps a floor —
   the same release .xl-page has. */
@media (max-width: 991.98px) {
    .dash[b-pug6dyxlx2] {
        height: auto;
        min-height: calc(100vh - 3.75rem);
        padding-bottom: 2rem;
    }

    /* .pane-collapsed named explicitly: stacked, the collapsed basis would be a height and would
       clip the very head it exists to keep visible. */
    .list-page-row > .dash-stats-pane[b-pug6dyxlx2],
    .list-page-row > .dash-side-pane[b-pug6dyxlx2],
    .list-page-row > .dash-stats-pane.pane-collapsed[b-pug6dyxlx2],
    .list-page-row > .dash-side-pane.pane-collapsed[b-pug6dyxlx2] {
        flex: 0 0 auto;
    }

    .dash-stats-pane[b-pug6dyxlx2],
    .dash-cases-pane[b-pug6dyxlx2],
    .dash-side-pane[b-pug6dyxlx2] {
        max-height: 32rem;
    }
}

@media (max-width: 640px) {
    .case-grid[b-pug6dyxlx2] { grid-template-columns: 1fr; }
}
/* /Components/Shared/AcceptanceRuleModal.razor.rz.scp.css */
/* Acceptance rule canvas. The bracket, rows, cards, slots and chips are the shared .md-*
   primitives; this is the two-column body and the row's own text layout. */

.arm[b-m4gt079kd2] {
    display: flex;
    height: 100%;
    min-height: 0;
}

.arm-canvas[b-m4gt079kd2] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
    background: var(--cosmyre-md-canvas);
}

.arm-sentence[b-m4gt079kd2] {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    flex: 0 0 auto;
    padding: 20px 26px 6px;
    font-size: 17px;
    color: var(--cosmyre-md-ink-2);
}

.arm-cat[b-m4gt079kd2] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 3px 11px;
    border-radius: 8px;
    font-size: 15px;
    font-weight: 600;
}

.arm-cat[b-m4gt079kd2]  .bi { font-size: 13px; }

.arm-cat-ind[b-m4gt079kd2] {
    background: var(--cosmyre-md-cat-ind-bg);
    border: 1px solid var(--cosmyre-md-cat-ind-border);
    color: var(--cosmyre-md-cat-ind-fg);
}

.arm-cat-ind[b-m4gt079kd2]  .bi { color: var(--cosmyre-md-cat-ind-icon); }

.arm-cat-bus[b-m4gt079kd2] {
    background: var(--cosmyre-md-cat-bus-bg);
    border: 1px solid var(--cosmyre-md-cat-bus-border);
    color: var(--cosmyre-md-cat-bus-fg);
}

.arm-cat-bus[b-m4gt079kd2]  .bi { color: var(--cosmyre-md-cat-bus-icon); }

.arm-scroll[b-m4gt079kd2] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 16px 26px 24px;
}

/* The group card's own bracket sits inside its body, so the rule does not indent a second time. */
.arm-substack[b-m4gt079kd2] { padding-left: 56px; }
.arm-substack .md-bracket[b-m4gt079kd2] { left: 28px; top: 14px; bottom: 16px; }
.arm-substack .md-pill[b-m4gt079kd2] { left: 7.5px; }

/* Slots and the add-group button are siblings after the stack, aligned to the rows above it. */
.arm-rootslot[b-m4gt079kd2] { margin: 10px 0 0 52px; }
.arm-addgroup[b-m4gt079kd2] { padding-left: 52px; margin-top: 13px; }

.arm-addbtn[b-m4gt079kd2] {
    width: auto;
    white-space: nowrap;
}

.arm-addbtn:hover[b-m4gt079kd2] {
    border-color: var(--cosmyre-md-slot-or-hot-border);
    color: var(--cosmyre-md-or);
}

/* The field name must not wrap; the group name takes the slack and ellipsises. */
.arm-fieldname[b-m4gt079kd2] {
    flex: 0 0 auto;
    white-space: nowrap;
    font-size: 14.5px;
    color: var(--cosmyre-md-ink);
}

.arm-fieldname-sub[b-m4gt079kd2] { font-size: 14px; }

.arm-groupname[b-m4gt079kd2] {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 12px;
    color: var(--cosmyre-md-muted-4);
}

.arm-enabled[b-m4gt079kd2] {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 13.5px;
    color: var(--cosmyre-md-ink-2);
    cursor: pointer;
    user-select: none;
}
/* /Components/Shared/ChatWidget.razor.rz.scp.css */
/* Sits inline in the app header, to the left of the user menu. */
.dd-chat[b-pbsf8nfmkm] {
    display: inline-flex;
    align-items: center;
}

/* Launcher: small circular Cosmyre logo button */
.dd-chat-launcher[b-pbsf8nfmkm] {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    padding: 5px;
    border: 2px solid var(--bs-primary);
    border-radius: 50%;
    background: #fff;
    overflow: hidden;
    box-shadow: 0 .15rem .5rem rgba(0, 0, 0, .2);
    cursor: pointer;
    transition: transform .15s ease, box-shadow .15s ease;
}

.dd-chat-launcher:hover[b-pbsf8nfmkm] {
    transform: scale(1.07);
    box-shadow: 0 .5rem 1.6rem rgba(0, 0, 0, .4);
}

/* Whole emblem shown (contain), centered with breathing room inside the button. */
.dd-chat-launcher img[b-pbsf8nfmkm] {
    width: 70%;
    height: 70%;
    object-fit: contain;
    object-position: center;
    display: block;
    margin: auto;
}

/* Floating panel — anchored to the viewport's bottom-right when open. */
.dd-chat-panel[b-pbsf8nfmkm] {
    position: fixed;
    right: 1.25rem;
    bottom: 1.25rem;
    z-index: 1080;
    display: flex;
    flex-direction: column;
    width: 360px;
    height: min(560px, calc(100vh - 2.5rem));
    background: var(--bs-body-bg);
    color: var(--bs-body-color);
    border: 1px solid var(--bs-border-color);
    border-radius: .75rem;
    box-shadow: 0 .75rem 2rem rgba(0, 0, 0, .3);
    overflow: hidden;
}

.dd-chat-header[b-pbsf8nfmkm] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: .6rem .85rem;
    background: var(--bs-primary);
    color: #fff;
}

.dd-chat-title[b-pbsf8nfmkm] {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    font-weight: 600;
}

.dd-chat-header-actions[b-pbsf8nfmkm] {
    display: inline-flex;
    gap: .25rem;
}

.dd-chat-icon-btn[b-pbsf8nfmkm] {
    display: inline-flex;
    padding: .2rem .35rem;
    border: none;
    border-radius: .35rem;
    background: transparent;
    color: #fff;
    opacity: .85;
    cursor: pointer;
}

.dd-chat-icon-btn:hover[b-pbsf8nfmkm] {
    opacity: 1;
    background: rgba(255, 255, 255, .15);
}

.dd-chat-body[b-pbsf8nfmkm] {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: .85rem;
    display: flex;
    flex-direction: column;
    gap: .5rem;
}

.dd-chat-msg[b-pbsf8nfmkm] {
    max-width: 85%;
    padding: .5rem .7rem;
    border-radius: .65rem;
    white-space: pre-wrap;
    word-break: break-word;
    line-height: 1.35;
    font-size: .9rem;
}

.dd-chat-user[b-pbsf8nfmkm] {
    align-self: flex-end;
    background: var(--bs-primary);
    color: #fff;
    border-bottom-right-radius: .15rem;
}

.dd-chat-assistant[b-pbsf8nfmkm] {
    align-self: flex-start;
    background: var(--bs-secondary-bg);
    color: var(--bs-body-color);
    border-bottom-left-radius: .15rem;
}

.dd-chat-activity[b-pbsf8nfmkm] {
    align-self: flex-start;
    background: transparent;
    color: var(--bs-secondary-color);
    font-style: italic;
    font-size: .8rem;
    padding: .1rem .3rem;
}

.dd-chat-error[b-pbsf8nfmkm] {
    align-self: stretch;
    max-width: 100%;
    background: var(--bs-danger-bg-subtle);
    color: var(--bs-danger-text-emphasis);
    border: 1px solid var(--bs-danger-border-subtle);
}

.dd-chat-input[b-pbsf8nfmkm] {
    display: flex;
    gap: .4rem;
    padding: .6rem;
    border-top: 1px solid var(--bs-border-color);
}

/* Typing indicator */
.dd-chat-typing[b-pbsf8nfmkm] {
    display: inline-flex;
    gap: .25rem;
    align-items: center;
}

.dd-chat-typing span[b-pbsf8nfmkm] {
    width: .45rem;
    height: .45rem;
    border-radius: 50%;
    background: var(--bs-secondary-color);
    animation: dd-chat-bounce-b-pbsf8nfmkm 1.2s infinite ease-in-out;
}

.dd-chat-typing span:nth-child(2)[b-pbsf8nfmkm] {
    animation-delay: .15s;
}

.dd-chat-typing span:nth-child(3)[b-pbsf8nfmkm] {
    animation-delay: .3s;
}

@keyframes dd-chat-bounce-b-pbsf8nfmkm {
    0%, 80%, 100% { opacity: .3; transform: translateY(0); }
    40% { opacity: 1; transform: translateY(-.2rem); }
}

@media (max-width: 480px) {
    .dd-chat-panel[b-pbsf8nfmkm] {
        right: .5rem;
        bottom: .5rem;
        left: .5rem;
        width: auto;
    }
}
/* /Components/Shared/DataTable.razor.rz.scp.css */
/* Horizontal scroll: the table grows to its natural width instead of squishing. */
.dnt-table[b-6v38mtvd07] {
    overflow-x: auto;
}

.dnt-table > table[b-6v38mtvd07] {
    width: max-content;
    min-width: 100%;
}

.dnt-table th[b-6v38mtvd07],
.dnt-table td[b-6v38mtvd07] {
    white-space: nowrap;
    max-width: 28rem;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Opt-in wrapping for long-text columns via CellClass. */
.dnt-table td.dnt-wrap[b-6v38mtvd07] {
    white-space: normal;
    max-width: 32rem;
}

.dnt-table thead .dnt-filter input[b-6v38mtvd07] {
    min-width: 7rem;
}

.dnt-sortable[b-6v38mtvd07] {
    cursor: pointer;
    user-select: none;
}

.dnt-row-click[b-6v38mtvd07] {
    cursor: pointer;
}

/* Fill-height mode: the table fills its container and scrolls on both axes itself. */
.dnt-fill[b-6v38mtvd07] {
    height: 100%;
    overflow: auto;
}

.dnt-fill > table thead th[b-6v38mtvd07] {
    position: sticky;
    top: 0;
    z-index: 3;
    /* Opaque accent band composited over the card (app.css token) — sticky headers
       must stay opaque or the scrolling rows read through them. */
    background-color: var(--cosmyre-thead-bg, var(--bs-body-bg));
}

/* The filter row stays on the plain card colour so it reads as controls, not header. */
.dnt-fill > table thead tr:nth-child(2) th[b-6v38mtvd07] {
    background-color: var(--cosmyre-card-bg, var(--bs-body-bg));
}

/* With a filter row, the header row gets a fixed height so the second row can stick below it. */
.dnt-fill > table thead tr:first-child th[b-6v38mtvd07] {
    height: 2.35rem;
}

.dnt-fill > table thead tr:nth-child(2) th[b-6v38mtvd07] {
    top: 2.35rem;
}

.dnt-table td.dnt-editable[b-6v38mtvd07] {
    cursor: cell;
}

/* Server mode: dim the current page while the next one loads. */
.dnt-table.dnt-loading tbody[b-6v38mtvd07] {
    opacity: .5;
    transition: opacity .15s;
}
/* /Components/Shared/DedupeRuleModal.razor.rz.scp.css */
/* Dedupe rule canvas — the acceptance canvas without the group cards. */

.drm[b-cjxs5e0w8g] {
    display: flex;
    height: 100%;
    min-height: 0;
}

.drm-canvas[b-cjxs5e0w8g] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
    background: var(--cosmyre-md-canvas);
}

.drm-sentence[b-cjxs5e0w8g] {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    flex: 0 0 auto;
    padding: 20px 26px 6px;
    font-size: 17px;
    color: var(--cosmyre-md-ink-2);
}

.drm-cat[b-cjxs5e0w8g] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 3px 11px;
    border-radius: 8px;
    font-size: 15px;
    font-weight: 600;
}

.drm-cat[b-cjxs5e0w8g]  .bi { font-size: 13px; }

.drm-cat-ind[b-cjxs5e0w8g] {
    background: var(--cosmyre-md-cat-ind-bg);
    border: 1px solid var(--cosmyre-md-cat-ind-border);
    color: var(--cosmyre-md-cat-ind-fg);
}

.drm-cat-ind[b-cjxs5e0w8g]  .bi { color: var(--cosmyre-md-cat-ind-icon); }

.drm-cat-bus[b-cjxs5e0w8g] {
    background: var(--cosmyre-md-cat-bus-bg);
    border: 1px solid var(--cosmyre-md-cat-bus-border);
    color: var(--cosmyre-md-cat-bus-fg);
}

.drm-cat-bus[b-cjxs5e0w8g]  .bi { color: var(--cosmyre-md-cat-bus-icon); }

.drm-scroll[b-cjxs5e0w8g] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 16px 26px 24px;
}

.drm-slot[b-cjxs5e0w8g] { margin: 10px 0 0 52px; }

.drm-hint[b-cjxs5e0w8g] {
    display: flex;
    align-items: center;
    gap: 9px;
    margin-top: 14px;
    padding: 11px 13px;
    border-radius: 11px;
    background: var(--cosmyre-md-group-subrow);
    border: 1px solid var(--cosmyre-md-hairline-2);
    color: var(--cosmyre-md-muted-3);
    font-size: 12.5px;
}

.drm-fieldname[b-cjxs5e0w8g] {
    flex: 0 0 auto;
    white-space: nowrap;
    font-size: 14.5px;
    color: var(--cosmyre-md-ink);
}

.drm-groupname[b-cjxs5e0w8g] {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 12px;
    color: var(--cosmyre-md-muted-4);
}

/* Why an SSN with dashes still matches one without. */
.drm-digits[b-cjxs5e0w8g] {
    flex: 0 0 auto;
    padding: 2px 7px;
    border-radius: 6px;
    background: var(--cosmyre-md-sunken);
    color: var(--cosmyre-md-muted-2);
    font-size: 10.5px;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    cursor: help;
}

.drm-enabled[b-cjxs5e0w8g] {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 13.5px;
    color: var(--cosmyre-md-ink-2);
    cursor: pointer;
    user-select: none;
}
/* /Components/Shared/EyeButton.razor.rz.scp.css */
/* Mirrors TrashButton's chrome: no border, no background — the glyph is the button.
   currentColor carries the ACCENT to the outline; the iris paints itself tertiary. */
.eye-btn[b-dgbm4wvpaf] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: .15rem;
    border: 0;
    background: none;
    color: var(--cosmyre-accent-text);
    cursor: pointer;
    line-height: 1;
    border-radius: .25rem;
    text-decoration: none;
}

.eye-btn:hover[b-dgbm4wvpaf],
.eye-btn:focus-visible[b-dgbm4wvpaf] {
    color: var(--cosmyre-accent-hover);
    text-decoration: none;
}

/* Keyboard users get the same affordance; without this the control is invisible when
   focused, since there is no border to outline. */
.eye-btn:focus-visible[b-dgbm4wvpaf] {
    outline: 2px solid var(--cosmyre-accent);
    outline-offset: 1px;
}

.eye-btn:disabled[b-dgbm4wvpaf] {
    opacity: .45;
    cursor: default;
}

/* The inert face: a marker on a clickable card, not a control of its own. */
.eye-plain[b-dgbm4wvpaf] {
    cursor: inherit;
    color: var(--cosmyre-accent-text);
}

.eye-svg[b-dgbm4wvpaf] {
    display: block;
    width: 1.05rem;
    height: 1.05rem;
}

.eye-iris[b-dgbm4wvpaf] {
    fill: var(--cosmyre-tertiary);
    transform-box: fill-box;
    transform-origin: center;
    transition: transform .16s ease, fill .16s ease;
}

/* Hover dilates the iris — the eye "looks", the way the trash lid lifts. */
.eye-btn:hover .eye-iris[b-dgbm4wvpaf],
.eye-btn:focus-visible .eye-iris[b-dgbm4wvpaf] {
    fill: var(--cosmyre-tertiary-hover);
    transform: scale(1.18);
}

/* Reduce MOTION, not feedback: the iris still brightens, it just doesn't animate.
   Same reasoning as TrashButton's lid — see the note there. */
@media (prefers-reduced-motion: reduce) {
    .eye-iris[b-dgbm4wvpaf] {
        transition: none;
    }
}
/* /Components/Shared/IconActionButton.razor.rz.scp.css */
/* Borderless: the glyph is the button. position: relative anchors the badge to its corner. */
.icon-action-btn[b-0zdo6sll28] {
    position: relative;
    display: inline-block;
    flex: none;
    width: 1.95rem;
    height: 1.95rem;
    padding: 0;
    border: 0;
    background: none;
    color: var(--bs-secondary-color);
    cursor: pointer;
    line-height: 1;
    border-radius: .35rem;
}

/* Top-left, so the badge's corner stays clear. The two sizes below add up to the box exactly, so
   the glyph and the badge touch with no dead space between them — the glyph gets 1.35rem of a
   1.95rem box and the badge the remaining .6rem. font-size drives the <Icon> svg, which is 1em
   square; the scoped stylesheet cannot reach inside Icon's own scope, and does not need to. */
.icon-action-glyph[b-0zdo6sll28] {
    position: absolute;
    top: 0;
    left: 0;
    display: inline-flex;
    font-size: 1.35rem;
}

/* Overlap mode: the glyph gets the whole box and the badge cuts into it. */
.icon-action-glyph.glyph-full[b-0zdo6sll28] {
    inset: 0;
    align-items: center;
    justify-content: center;
    font-size: 1.55rem;
}

/* With nothing in the corner there is no reason to sit off-centre. */
.icon-action-btn.no-badge .icon-action-glyph[b-0zdo6sll28] {
    inset: 0;
    align-items: center;
    justify-content: center;
    font-size: 1.2rem;
}

.icon-action-btn:hover[b-0zdo6sll28],
.icon-action-btn:focus-visible[b-0zdo6sll28] {
    color: var(--bs-body-color);
}

/* With no border there is nothing for the focus ring to follow, so it is drawn explicitly —
   otherwise the control is invisible to a keyboard user. */
.icon-action-btn:focus-visible[b-0zdo6sll28] {
    outline: 2px solid var(--cosmyre-tab-accent, #6f42c1);
    outline-offset: 1px;
}

.icon-action-btn:disabled[b-0zdo6sll28] {
    opacity: .45;
    cursor: default;
}

/* Bottom-right, flush to the corner and to the glyph's box above it. */
.icon-action-badge[b-0zdo6sll28] {
    position: absolute;
    right: 0;
    bottom: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: .6rem;
    height: .6rem;
    font-size: .6rem;
    line-height: 1;
}

/* Sits directly on the glyph with no backing disc, so the globe reads through and behind it. The
   badge is drawn in the body colour against the glyph's lighter secondary, and that contrast is
   what separates the two now that there is no knockout doing it. */
.icon-action-badge.badge-overlap[b-0zdo6sll28] {
    width: .78rem;
    height: .78rem;
    font-size: .78rem;
    background: none;
    color: var(--bs-body-color);
}

/* Labelled variant. The bare button is a fixed 1.95rem square with an absolutely-placed glyph;
   with a caption it has to become a row that grows to fit the text, so the glyph gives up its
   absolute placement and keeps the same square as a flex item. Everything else — hover, focus
   ring, disabled dimming — already lives on the button and applies unchanged. */
.icon-action-btn.has-label[b-0zdo6sll28] {
    display: inline-flex;
    align-items: center;
    gap: .1rem;
    width: auto;
    padding-right: .5rem;
}

.icon-action-btn.has-label .icon-action-glyph[b-0zdo6sll28] {
    position: relative;
    inset: auto;
    flex: none;
    width: 1.95rem;
    height: 1.95rem;
    align-items: center;
    justify-content: center;
}

.icon-action-label[b-0zdo6sll28] {
    font-size: .875rem;
    line-height: 1;
    white-space: nowrap;
}

.icon-action-plus[b-0zdo6sll28] {
    width: 100%;
    height: 100%;
    color: #198754;
}

/* The green stays legible on the dark surface without going neon. */
[data-bs-theme="dark"] .icon-action-plus[b-0zdo6sll28] {
    color: #3ddc84;
}
/* /Components/Shared/ManualProfileUploadModal.razor.rz.scp.css */
/* Drag-and-drop file zone for the Manual Profile Uploader. The real <input type=file> is laid over
   the whole zone at opacity 0 (see .dnt-dropzone-input), so it handles both click-to-browse and the
   native file drop; the wrapper only paints the border and the drag highlight. */
.dnt-dropzone[b-ee5ut7cyxq] {
    position: relative;
    border: 2px dashed var(--bs-border-color, #ced4da);
    border-radius: .5rem;
    padding: 1.25rem 1rem;
    text-align: center;
    cursor: pointer;
    background: var(--bs-tertiary-bg, #f8f9fa);
    transition: border-color .15s ease, background-color .15s ease;
}

.dnt-dropzone-over[b-ee5ut7cyxq] {
    border-color: var(--cosmyre-accent); /* app accent */
    background: rgba(var(--cosmyre-accent-rgb), .08);
}

.dnt-dropzone-busy[b-ee5ut7cyxq] {
    opacity: .65;
    pointer-events: none;
}

/* Rendered by the InputFile child component, so it carries no scope attribute — reach it with ::deep. */
.dnt-dropzone[b-ee5ut7cyxq]  .dnt-dropzone-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
}

/* The label sits under the transparent input; ignore pointer events so clicks/drops reach the input. */
.dnt-dropzone-inner[b-ee5ut7cyxq] {
    pointer-events: none;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    color: var(--bs-secondary-color, #6c757d);
    font-size: .85rem;
}

.dnt-dropzone[b-ee5ut7cyxq]  .dnt-dropzone-icon {
    font-size: 1.5rem;
    opacity: .7;
}
/* /Components/Shared/ModalShell.razor.rz.scp.css */
/* The house modal's shape. This file is the ONE place a modal's dialog measurements are defined —
   a dialog that wants to look different should be asking why, not adding overrides. Colours are
   the --cosmyre-md-* tokens in app.css, so dark mode needs nothing here. */

.md-scrim[b-j5hgtsxw3z] {
    position: fixed;
    inset: 0;
    z-index: 1055;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px;
    background: var(--cosmyre-md-scrim);
    backdrop-filter: blur(3px);
}

/* The frame owns size, resize and the shadow. `resize` requires a non-visible overflow, and that
   overflow would clip a shadow declared on the child surface — hence two elements. */
.md-frame[b-j5hgtsxw3z] {
    resize: both;
    overflow: hidden;
    min-width: 880px;
    min-height: 520px;
    max-width: min(1400px, 100%);
    max-height: min(868px, 100%);
    border-radius: 16px;
    box-shadow: 0 50px 100px -24px rgba(14, 10, 24, .6), 0 0 0 1px rgba(23, 19, 31, .07);
}

/* Maximise fills the viewport rather than jumping to a fixed ceiling: on a laptop the ceiling is
   often larger than the screen, which would make the button do nothing. */
.md-frame-max[b-j5hgtsxw3z] {
    width: 100%;
    height: 100%;
    max-width: 100%;
    max-height: 100%;
    resize: none;
}

.md-surface[b-j5hgtsxw3z] {
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
    overflow: hidden;
    border-radius: 16px;
    background: var(--cosmyre-md-surface);
}

/* ---- header -------------------------------------------------------------- */
.md-header[b-j5hgtsxw3z] {
    display: flex;
    align-items: flex-start;
    gap: 16px;
    flex: 0 0 auto;
    padding: 22px 26px 20px;
    border-bottom: 1px solid var(--cosmyre-md-hairline);
}

.md-tile[b-j5hgtsxw3z] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    flex: 0 0 auto;
    border-radius: 11px;
    background: var(--cosmyre-md-primary-tint);
    color: var(--cosmyre-md-primary);
    font-size: 20px;
}

.md-titles[b-j5hgtsxw3z] {
    min-width: 0;
    flex: 1 1 auto;
}

.md-crumb[b-j5hgtsxw3z] {
    display: flex;
    align-items: center;
    gap: 7px;
    margin-bottom: 3px;
    font-size: 12.5px;
    color: var(--cosmyre-md-muted-3);
}

.md-crumb[b-j5hgtsxw3z]  .bi { font-size: 12px; color: var(--cosmyre-md-primary); }

.md-title-row[b-j5hgtsxw3z] {
    display: flex;
    align-items: center;
    gap: 8px;
}

.md-title[b-j5hgtsxw3z] {
    width: 100%;
    max-width: 520px;
    padding: 0;
    border: 0;
    border-bottom: 1px solid transparent;
    background: transparent;
    font-size: 25px;
    font-weight: 600;
    letter-spacing: -.01em;
    color: var(--cosmyre-md-ink);
}

.md-title[b-j5hgtsxw3z]::placeholder { color: var(--cosmyre-md-muted-5); }
.md-title:hover[b-j5hgtsxw3z] { border-bottom-color: var(--cosmyre-md-hairline); }
.md-title:focus[b-j5hgtsxw3z] { outline: none; border-bottom-color: var(--cosmyre-md-primary); }

.md-title-row[b-j5hgtsxw3z]  .md-title-pencil {
    font-size: 14px;
    color: var(--cosmyre-md-muted-5);
    flex: 0 0 auto;
}

.md-title-optional[b-j5hgtsxw3z] {
    flex: 0 0 auto;
    font-size: 12px;
    color: var(--cosmyre-md-muted-4);
}

.md-header-extra[b-j5hgtsxw3z] {
    flex: 0 0 auto;
    margin-top: 4px;
}

.md-winbtns[b-j5hgtsxw3z] {
    display: flex;
    gap: 6px;
    flex: 0 0 auto;
    margin-top: 5px;
}

.md-winbtns button[b-j5hgtsxw3z] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border: 0;
    border-radius: 8px;
    background: transparent;
    color: var(--cosmyre-md-muted-3);
    font-size: 14px;
    cursor: pointer;
}

.md-winbtns button:hover[b-j5hgtsxw3z] {
    background: var(--cosmyre-md-sunken);
    color: var(--cosmyre-md-ink);
}

/* ---- body ---------------------------------------------------------------- */
.md-body[b-j5hgtsxw3z] {
    flex: 1 1 auto;
    min-height: 0;
    position: relative;
    overflow: hidden;
}

/* ---- footer: summary strip, then actions --------------------------------- */
.md-summary[b-j5hgtsxw3z] {
    display: flex;
    align-items: baseline;
    gap: 14px;
    flex: 0 0 auto;
    padding: 14px 26px;
    border-top: 1px solid var(--cosmyre-md-hairline);
    background: var(--cosmyre-md-group-subrow);
}

.md-summary-label[b-j5hgtsxw3z] {
    flex: 0 0 auto;
    white-space: nowrap;
    font-size: 10.5px;
    font-weight: 700;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--cosmyre-md-muted-4);
}

.md-summary-body[b-j5hgtsxw3z] {
    display: flex;
    flex: 1 1 auto;
    flex-wrap: wrap;
    align-items: center;
    row-gap: 5px;
    font-size: 13.5px;
}

.md-actions[b-j5hgtsxw3z] {
    display: flex;
    align-items: center;
    gap: 14px;
    flex: 0 0 auto;
    padding: 15px 26px;
    border-top: 1px solid var(--cosmyre-md-hairline);
    background: var(--cosmyre-md-surface);
}

.md-actions-left[b-j5hgtsxw3z] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    margin-right: auto;
    font-size: 13px;
    color: var(--cosmyre-md-muted-3);
}

/* Without a left slot the buttons still need pushing to the end. */
.md-cancel[b-j5hgtsxw3z] { margin-left: auto; }
.md-actions-left ~ .md-cancel[b-j5hgtsxw3z] { margin-left: 0; }

.md-cancel[b-j5hgtsxw3z] {
    padding: 9px 18px;
    border: 1px solid var(--cosmyre-md-control-border-em);
    border-radius: 9px;
    background: transparent;
    font-size: 14px;
    font-weight: 500;
    color: var(--cosmyre-md-ink-2);
    cursor: pointer;
}

.md-cancel:hover[b-j5hgtsxw3z] { background: var(--cosmyre-md-canvas); }

.md-save[b-j5hgtsxw3z] {
    padding: 9px 22px;
    border: 0;
    border-radius: 9px;
    background: var(--cosmyre-md-primary);
    color: #fff;
    font-size: 14px;
    font-weight: 600;
    box-shadow: 0 3px 10px var(--cosmyre-md-primary-shadow);
    cursor: pointer;
}

.md-save:hover:not(:disabled)[b-j5hgtsxw3z] { background: var(--cosmyre-md-primary-hover); }

.md-save:disabled[b-j5hgtsxw3z] {
    opacity: .5;
    box-shadow: none;
    cursor: not-allowed;
}
/* /Components/Shared/ProcessingPickerModal.razor.rz.scp.css */
/* Select file/folder picker — own layout only; shared modal parts live in app.css
   (see docs/modal-design.md). */

.ppk[b-08n5mdh9l6] {
    display: flex;
    flex-direction: column;
    height: 100%;
    padding: 14px 18px 16px;
    gap: 10px;
}

.ppk-bar[b-08n5mdh9l6] {
    display: flex;
    align-items: center;
    gap: 8px;
}

.ppk-crumbs[b-08n5mdh9l6] {
    min-width: 0;
}

.ppk-custodian[b-08n5mdh9l6] {
    width: 220px;
}

/* The scroll recipe every modal list uses — overflow-y is load-bearing. */
.ppk-list[b-08n5mdh9l6] {
    display: flex;
    flex-direction: column;
    gap: 4px;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 6px;
    border: 1px solid var(--cosmyre-md-list-border);
    border-radius: 10px;
    background: var(--cosmyre-md-sunken);
}

.ppk-row[b-08n5mdh9l6] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 10px;
    border: 1px solid transparent;
    border-radius: 8px;
    cursor: pointer;
    user-select: none;
}

.ppk-row:hover[b-08n5mdh9l6] {
    background: var(--cosmyre-md-surface);
}

.ppk-on[b-08n5mdh9l6] {
    background: var(--cosmyre-md-surface);
    border-color: var(--cosmyre-md-list-border);
    box-shadow: inset 2px 0 0 var(--bs-primary);
}

.ppk-here[b-08n5mdh9l6] {
    border-bottom: 1px solid var(--cosmyre-md-list-border);
    border-radius: 8px 8px 0 0;
    margin-bottom: 2px;
}

.ppk-ico[b-08n5mdh9l6] {
    flex: 0 0 auto;
    opacity: .7;
}

.ppk-name[b-08n5mdh9l6] {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ppk-size[b-08n5mdh9l6] {
    margin-left: auto;
    font-size: .78rem;
    color: var(--bs-secondary-color);
}

.ppk-open[b-08n5mdh9l6] {
    padding: 0 4px;
    line-height: 1;
}

.ppk-flag[b-08n5mdh9l6] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-left: auto;
    padding: 1px 8px;
    border-radius: 999px;
    font-size: .72rem;
    white-space: nowrap;
}

/* A size + a flag can share a file row; only the first pushes right. */
.ppk-size + .ppk-flag[b-08n5mdh9l6] {
    margin-left: 8px;
}

.ppk-done[b-08n5mdh9l6] {
    color: var(--bs-success);
    border: 1px solid color-mix(in srgb, var(--bs-success) 45%, transparent);
}

.ppk-part[b-08n5mdh9l6] {
    color: var(--bs-secondary-color);
    border: 1px dashed var(--cosmyre-md-list-border);
}

.ppk-empty[b-08n5mdh9l6] {
    padding: 14px;
    font-size: .85rem;
    color: var(--bs-secondary-color);
}
/* /Components/Shared/ProfileFieldPalette.razor.rz.scp.css */
/* The profile field rail. Chips, dots and the segmented control are the shared .md-* primitives;
   what's here is the rail's own layout and its accordion. */

.pfp[b-lrmm60el2e] {
    display: flex;
    flex-direction: column;
    width: 322px;
    flex: 0 0 322px;
    min-height: 0;
    border-left: 1px solid var(--cosmyre-md-hairline);
    background: var(--cosmyre-md-surface);
}

.pfp-head[b-lrmm60el2e] {
    flex: 0 0 auto;
    padding: 18px 20px 12px;
}

.pfp-head[b-lrmm60el2e]  .md-eyebrow { display: block; margin-bottom: 10px; }

.pfp-cats[b-lrmm60el2e] { margin-bottom: 11px; }

.pfp-cats button[b-lrmm60el2e] { flex: 1; }

/* The active segment takes the category's identity colour so the rail says which half of the
   deliverable you are working in without a second label. */
.pfp-cats .pfp-cat-ind[b-lrmm60el2e] { color: var(--cosmyre-md-cat-ind-fg); }
.pfp-cats .pfp-cat-bus[b-lrmm60el2e] { color: var(--cosmyre-md-cat-bus-fg); }
.pfp-cats .pfp-cat-ind[b-lrmm60el2e]  .bi { color: var(--cosmyre-md-cat-ind-icon); }
.pfp-cats .pfp-cat-bus[b-lrmm60el2e]  .bi { color: var(--cosmyre-md-cat-bus-icon); }
.pfp-cats button[b-lrmm60el2e]  .bi { color: var(--cosmyre-md-muted-4); }

.pfp-filter[b-lrmm60el2e] {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 9px 11px;
    border: 1px solid var(--cosmyre-md-list-border);
    border-radius: 9px;
    background: var(--cosmyre-md-surface);
}

.pfp-filter[b-lrmm60el2e]  .bi { font-size: 12px; color: var(--cosmyre-md-muted-4); flex: 0 0 auto; }

.pfp-filter input[b-lrmm60el2e] {
    flex: 1 1 auto;
    min-width: 0;
    border: 0;
    background: transparent;
    font-size: 13px;
    color: var(--cosmyre-md-ink);
}

.pfp-filter input:focus[b-lrmm60el2e] { outline: none; }

.pfp-list[b-lrmm60el2e] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 2px 12px 16px;
}

.pfp-grouprow[b-lrmm60el2e] {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 10px 8px;
    cursor: pointer;
    user-select: none;
}

.pfp-chevron[b-lrmm60el2e] {
    display: inline-flex;
    flex: 0 0 auto;
    font-size: 9px;
    color: var(--cosmyre-md-muted-5);
    transition: transform .22s cubic-bezier(.22, .9, .28, 1);
}

.pfp-chevron-open[b-lrmm60el2e] { transform: rotate(90deg); }

@media (prefers-reduced-motion: reduce) {
    .pfp-chevron[b-lrmm60el2e] { transition: none; }
}

.pfp-groupname[b-lrmm60el2e] {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--cosmyre-md-ink-2);
}

.pfp-groupcount[b-lrmm60el2e] {
    flex: 0 0 auto;
    font-size: 11px;
    color: var(--cosmyre-md-muted-4);
}

.pfp-groupbody[b-lrmm60el2e] {
    display: flex;
    flex-direction: column;
    gap: 5px;
    padding: 0 0 10px 26px;
}

.pfp-groupbody[b-lrmm60el2e]  .pfp-grip { font-size: 12px; color: var(--cosmyre-md-grip); flex: 0 0 auto; }

.pfp-empty[b-lrmm60el2e],
.pfp-footnote[b-lrmm60el2e] {
    margin: 0;
    font-size: 11.5px;
    color: var(--cosmyre-md-muted-4);
}

.pfp-empty[b-lrmm60el2e] { padding: 10px 8px; }

.pfp-footnote[b-lrmm60el2e] {
    margin: 14px 8px 0;
    padding-top: 12px;
    border-top: 1px solid var(--cosmyre-md-hairline-2);
}
/* /Components/Shared/RegexHelpTip.razor.rz.scp.css */
/* Pure-CSS hover popover: no JS interop, flips with the Bootstrap theme variables.
   It opens UPWARD on purpose — scrollable overflow only grows to the bottom/right, so a
   downward popover near the page (or modal) bottom summons a scrollbar, which shifts the
   layout under the cursor and makes the hover flicker. Upward overflow is simply clipped
   and can never move anything. */
.rht[b-68ja6p8g8a] {
    position: relative;
    display: inline-block;
}

.rht-pop[b-68ja6p8g8a] {
    display: none;
    position: absolute;
    bottom: calc(100% + 0.3rem);
    left: -0.75rem;
    z-index: 40;
    width: min(22rem, 80vw);
    padding: 0.6rem 0.75rem;
    font-size: 0.78rem;
    background: var(--bs-body-bg);
    color: var(--bs-body-color);
    border: 1px solid var(--bs-border-color);
    border-radius: 0.5rem;
    box-shadow: 0 0.5rem 1.5rem rgba(20, 20, 50, 0.25);
    cursor: default;
}

/* Invisible bridge across the gap below the card, so moving the mouse from the icon up
   into the popover never drops the :hover on the way. */
.rht-pop[b-68ja6p8g8a]::after {
    content: "";
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    height: 0.4rem;
}

.rht:hover .rht-pop[b-68ja6p8g8a] {
    display: block;
}

.rht-table[b-68ja6p8g8a] {
    width: 100%;
    border-collapse: collapse;
}

.rht-table td[b-68ja6p8g8a] {
    padding: 0.05rem 0.4rem 0.05rem 0;
    vertical-align: top;
}

.rht-table td:first-child[b-68ja6p8g8a] {
    font-family: var(--bs-font-monospace);
    white-space: nowrap;
    color: var(--bs-emphasis-color);
}
/* /Components/Shared/SearchConditionGroup.razor.rz.scp.css */
/* What is specific to the condition builder. The bracket, pill, row, band, grip, dot, icon button
   and dashed add affordance are the shared .md-* primitives in app.css — only this component's own
   chrome and its three-control row layout live here. */

.scg[b-iaxy9b90mf] {
    font-size: 14px;
    color: var(--cosmyre-md-ink);
}

/* A nested group is a card; the root is bare and inherits its host's surface. */
.scg-nested[b-iaxy9b90mf] {
    position: relative;
    background: var(--cosmyre-md-surface);
    border: 1px solid var(--cosmyre-md-group-border);
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 1px 2px rgba(23, 19, 31, .04);
}

.scg-head[b-iaxy9b90mf] {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 12px;
    background: var(--cosmyre-md-group-head);
    border-bottom: 1px solid var(--cosmyre-md-group-rule);
}

.scg-root > .scg-head[b-iaxy9b90mf] {
    background: transparent;
    border-bottom: 0;
    padding: 0 0 10px;
}

.scg-head-label[b-iaxy9b90mf] {
    font-size: 13px;
    color: var(--cosmyre-md-muted);
}

.scg-head-actions[b-iaxy9b90mf] {
    display: flex;
    align-items: center;
    gap: 2px;
    margin-left: auto;
}

.scg-combine-chip[b-iaxy9b90mf] {
    padding: 4px 9px;
    border-radius: 7px;
    background: var(--cosmyre-md-surface);
    border: 1px solid var(--cosmyre-md-group-border);
    font-size: 12.5px;
    font-weight: 700;
    color: var(--cosmyre-md-primary);
    cursor: pointer;
}

.scg-body[b-iaxy9b90mf] {
    position: relative;
    padding: 12px 14px 14px;
}

.scg-root > .scg-body[b-iaxy9b90mf] {
    padding: 0;
}

/* A nested group indents its bracket lane a little further so the two lanes never collide. */
.scg-nested .md-stack[b-iaxy9b90mf] { padding-left: 56px; }
.scg-nested .md-bracket[b-iaxy9b90mf] { left: 28px; top: 14px; bottom: 16px; }
.scg-nested .md-pill[b-iaxy9b90mf] { left: 7.5px; }

/* Sibling of the bracketed stack, never a child — inside it the bracket would overshoot the rules
   and the pill would sit off-centre. The offset keeps it aligned with the rows above. */
.md-stack + .md-add[b-iaxy9b90mf] { margin-top: 10px; margin-left: 52px; width: calc(100% - 52px); }
.scg-nested .md-stack + .md-add[b-iaxy9b90mf] { margin-left: 56px; width: calc(100% - 56px); }

.scg-row-ref[b-iaxy9b90mf] { border-color: var(--cosmyre-md-ref-border); }
.scg-row-ref .md-band[b-iaxy9b90mf] { background: var(--cosmyre-md-band-ref); }

.scg-nested .md-row[b-iaxy9b90mf] { border-color: var(--cosmyre-md-row-border); }

/* ---- the three-control row ------------------------------------------------ */
.scg-field[b-iaxy9b90mf] {
    position: relative;
    display: inline-flex;
    align-items: center;
    width: 190px;
    flex: 0 0 auto;
}

/* The dot sits in the wrapper rather than the option list: a native <select> renders no markup
   inside <option>, and the design rules out a JS-driven custom listbox. */
.scg-field .md-dot[b-iaxy9b90mf] {
    position: absolute;
    left: 10px;
    pointer-events: none;
}

.scg-field-select[b-iaxy9b90mf],
.scg-op[b-iaxy9b90mf],
.scg-value[b-iaxy9b90mf] {
    padding: 7px 10px;
    border: 1px solid var(--cosmyre-md-control-border);
    border-radius: 7px;
    font-size: 14px;
    color: var(--cosmyre-md-ink);
    background: var(--cosmyre-md-surface);
    min-width: 0;
}

.scg-field-select[b-iaxy9b90mf] {
    width: 100%;
    padding-left: 24px;
    cursor: pointer;
}

.scg-op[b-iaxy9b90mf] {
    width: 132px;
    flex: 0 0 auto;
    background: var(--cosmyre-md-sunken);
    color: var(--cosmyre-md-muted);
    cursor: pointer;
}

/* Exclude is the one destructive-reading choice in the builder, so it says so. */
.scg-op-exclude[b-iaxy9b90mf] {
    border-color: var(--cosmyre-md-exclude-border);
    background: var(--cosmyre-md-exclude-bg);
    color: var(--cosmyre-md-exclude-fg);
    font-weight: 600;
}

.scg-value[b-iaxy9b90mf] { flex: 1 1 auto; }

.scg-value-mono[b-iaxy9b90mf] { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }

.scg-subject[b-iaxy9b90mf] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    width: 190px;
    flex: 0 0 auto;
    padding: 7px 10px;
    border: 1px solid var(--cosmyre-md-control-border);
    border-radius: 7px;
    font-size: 14px;
    color: var(--cosmyre-md-ink);
    background: var(--cosmyre-md-sunken);
}

.scg-subject[b-iaxy9b90mf]  .scg-subject-icon { color: var(--cosmyre-md-ref-icon); }
/* /Components/Shared/SearchEditModal.razor.rz.scp.css */
/* The saved-search builder's BODY. The dialog frame, header and footer belong to ModalShell, and
   the row/chip/bracket/slot/segment primitives are the shared .md-* classes in app.css — what's
   left here is this modal's own two-pane layout. */

/* ---- sliding track ------------------------------------------------------- */
.sb-track[b-ngbtzt1ar1] {
    display: flex;
    width: 200%;
    height: 100%;
    transition: transform .46s cubic-bezier(.22, .9, .28, 1);
}

@media (prefers-reduced-motion: reduce) {
    .sb-track[b-ngbtzt1ar1] { transition: none; }
}

.sb-pane[b-ngbtzt1ar1] {
    flex: 0 0 50%;
    width: 50%;
    height: 100%;
    min-height: 0;
}

/* ---- view 1: rules ------------------------------------------------------- */
.sb-rules[b-ngbtzt1ar1] { display: flex; }

.sb-canvas[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
    background: var(--cosmyre-md-canvas);
}

.sb-toolbar[b-ngbtzt1ar1] {
    display: flex;
    align-items: center;
    gap: 14px;
    flex: 0 0 auto;
    padding: 16px 26px;
    border-bottom: 1px solid var(--cosmyre-md-hairline-2);
}

.sb-toolbar-label[b-ngbtzt1ar1] {
    font-size: 15px;
    color: var(--cosmyre-md-ink-2);
}

/* Plain-language wording in place of the AND/OR button group this replaced. */
.sb-combine[b-ngbtzt1ar1] {
    padding: 6px 12px;
    border-radius: 8px;
    background: var(--cosmyre-md-surface);
    border: 1px solid var(--cosmyre-md-control-border-em);
    font-size: 14px;
    font-weight: 600;
    color: var(--cosmyre-md-ink);
    box-shadow: 0 1px 2px rgba(23, 19, 31, .04);
    cursor: pointer;
}

.sb-families[b-ngbtzt1ar1] {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    font-size: 13px;
    color: var(--cosmyre-md-muted);
    cursor: pointer;
    user-select: none;
}

.sb-addwrap[b-ngbtzt1ar1] {
    position: relative;
    margin-left: auto;
}

.sb-add-btn[b-ngbtzt1ar1] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 13px;
    border: 0;
    border-radius: 8px;
    background: var(--cosmyre-md-primary);
    color: #fff;
    font-size: 13.5px;
    font-weight: 600;
    box-shadow: 0 2px 6px var(--cosmyre-md-primary-shadow);
    cursor: pointer;
}

.sb-add-btn:hover[b-ngbtzt1ar1] { background: var(--cosmyre-md-primary-hover); }

/* Invisible full-viewport sheet: the only way to close the menu on an outside click
   without JS interop. It sits under the menu and over everything else. */
.sb-menu-sheet[b-ngbtzt1ar1] {
    position: fixed;
    inset: 0;
    z-index: 1;
}

.sb-menu[b-ngbtzt1ar1] {
    position: absolute;
    right: 0;
    top: calc(100% + 6px);
    z-index: 2;
    display: flex;
    flex-direction: column;
    min-width: 200px;
    padding: 5px;
    border-radius: 10px;
    background: var(--cosmyre-md-surface);
    border: 1px solid var(--cosmyre-md-list-border);
    box-shadow: 0 12px 28px -8px rgba(14, 10, 24, .32);
}

.sb-menu button[b-ngbtzt1ar1] {
    padding: 8px 11px;
    border: 0;
    border-radius: 7px;
    background: transparent;
    font-size: 13.5px;
    color: var(--cosmyre-md-ink);
    text-align: left;
    cursor: pointer;
}

.sb-menu button:hover[b-ngbtzt1ar1] { background: var(--cosmyre-md-sunken); }

.sb-builder[b-ngbtzt1ar1] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 18px 26px 26px;
}

/* ---- right rail ---------------------------------------------------------- */
.sb-rail[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    width: 340px;
    flex: 0 0 340px;
    border-left: 1px solid var(--cosmyre-md-hairline);
    background: var(--cosmyre-md-surface);
}

.sb-rail-head[b-ngbtzt1ar1] {
    display: flex;
    align-items: center;
    flex: 0 0 auto;
    padding: 18px 22px 12px;
}

/* Both blocks flex so neither starves; Available gets the larger share. */
.sb-rail-block[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    flex: 1 1 0;
    min-height: 74px;
    padding: 12px 22px 8px;
}

.sb-rail-block-grow[b-ngbtzt1ar1] {
    flex: 1.7 1 0;
    min-height: 0;
    padding-bottom: 14px;
}

.sb-section-row[b-ngbtzt1ar1] {
    display: flex;
    align-items: baseline;
    gap: 8px;
    flex: 0 0 auto;
    margin-bottom: 7px;
}

.sb-section-label[b-ngbtzt1ar1] {
    font-size: 12.5px;
    font-weight: 600;
    color: var(--cosmyre-md-ink-2);
}

.sb-count[b-ngbtzt1ar1] {
    font-size: 11.5px;
    color: var(--cosmyre-md-muted-4);
}

/* overflow-y is load-bearing: these lists must scroll, never clip. */
.sb-list[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    gap: 5px;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 6px;
    border: 1px solid var(--cosmyre-md-list-border);
    border-radius: 10px;
    background: var(--cosmyre-md-sunken);
}

.sb-filter[b-ngbtzt1ar1],
.sb-filter-lg[b-ngbtzt1ar1] {
    flex: 0 0 auto;
    margin-bottom: 7px;
    padding: 7px 10px;
    border: 1px solid var(--cosmyre-md-list-border);
    border-radius: 8px;
    background: var(--cosmyre-md-surface);
    font-size: 13px;
    color: var(--cosmyre-md-ink);
}

.sb-filter-lg[b-ngbtzt1ar1] {
    padding: 9px 12px;
    border-radius: 9px;
    border-color: var(--cosmyre-md-control-border-em);
    font-size: 13.5px;
}

/* ---- chips: the shared .md-chip plus this modal's variants ---------------- */
.sb-chip-shown[b-ngbtzt1ar1] {
    border-color: var(--cosmyre-md-row-border);
    color: var(--cosmyre-md-ink);
    box-shadow: 0 1px 1px rgba(23, 19, 31, .03);
}

.sb-chip-lg[b-ngbtzt1ar1] {
    padding: 10px 12px;
    font-size: 14px;
    box-shadow: 0 1px 2px rgba(23, 19, 31, .03);
}

.md-chip[b-ngbtzt1ar1]  .sb-chip-grip {
    flex: 0 0 auto;
    font-size: 12px;
    color: var(--cosmyre-md-grip);
}

.sb-order[b-ngbtzt1ar1] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 17px;
    height: 17px;
    flex: 0 0 auto;
    border-radius: 5px;
    background: var(--cosmyre-md-primary-tint);
    color: var(--cosmyre-md-primary);
    font-size: 10.5px;
    font-weight: 700;
}

.sb-order-lg[b-ngbtzt1ar1] { width: 19px; height: 19px; border-radius: 6px; }

.sb-order-plain[b-ngbtzt1ar1] {
    background: var(--cosmyre-md-sunken);
    color: var(--cosmyre-md-muted-2);
    font-size: 10px;
}

.sb-empty[b-ngbtzt1ar1] {
    margin: 0;
    padding: 6px 3px;
    font-size: 12.5px;
    color: var(--cosmyre-md-muted-3);
}

/* ---- view 2: result columns ---------------------------------------------- */
.sb-columns[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    background: var(--cosmyre-md-canvas);
}

.sb-columns-head[b-ngbtzt1ar1] {
    display: flex;
    align-items: center;
    flex: 0 0 auto;
    padding: 20px 26px 15px;
    border-bottom: 1px solid var(--cosmyre-md-hairline-2);
    background: var(--cosmyre-md-surface);
}

.sb-columns-head h2[b-ngbtzt1ar1] {
    margin: 0;
    font-size: 18px;
    font-weight: 600;
    color: var(--cosmyre-md-ink);
}

/* Keeps the majority of the height whatever the sort strip does. */
.sb-panels[b-ngbtzt1ar1] {
    display: flex;
    flex: 1 1 auto;
    min-height: 0;
}

.sb-panel[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    flex: 1 1 0;
    min-width: 0;
    padding: 18px 22px;
    border-right: 1px solid var(--cosmyre-md-hairline);
}

.sb-panel-shown[b-ngbtzt1ar1] {
    border-right: 0;
    background: var(--cosmyre-md-surface);
}

.sb-panel-label[b-ngbtzt1ar1] {
    font-size: 14px;
    font-weight: 600;
    color: var(--cosmyre-md-ink);
}

.sb-panel-list[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    gap: 7px;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

.sb-panel-list-shown[b-ngbtzt1ar1] {
    padding: 9px;
    border: 1px solid var(--cosmyre-md-group-border);
    border-radius: 11px;
    background: var(--cosmyre-md-sunken);
}

/* ---- sort strip ---------------------------------------------------------- */
.sb-sort[b-ngbtzt1ar1] {
    flex: 0 0 auto;
    padding: 12px 22px 14px;
    border-top: 1px solid var(--cosmyre-md-hairline);
    background: var(--cosmyre-md-surface);
}

.sb-sort-head[b-ngbtzt1ar1] {
    display: flex;
    align-items: center;
    margin-bottom: 8px;
}

.sb-sort-add[b-ngbtzt1ar1] {
    margin-left: auto;
    padding: 0;
    border: 0;
    background: transparent;
    font-size: 12px;
    font-weight: 600;
    color: var(--cosmyre-md-primary);
    cursor: pointer;
}

/* Two levels fit; a third scrolls, so the strip never grows into the panels. */
.sb-sort-levels[b-ngbtzt1ar1] {
    display: flex;
    flex-direction: column;
    gap: 7px;
    max-height: 82px;
    overflow-y: auto;
    max-width: 640px;
    padding-right: 4px;
}

.sb-sort-row[b-ngbtzt1ar1] {
    display: flex;
    align-items: center;
    gap: 9px;
}

.sb-sort-field[b-ngbtzt1ar1] {
    position: relative;
    display: inline-flex;
    align-items: center;
    flex: 1 1 auto;
    min-width: 0;
}

.sb-sort-field .md-dot[b-ngbtzt1ar1] {
    position: absolute;
    left: 10px;
    pointer-events: none;
}

.sb-sort-field select[b-ngbtzt1ar1] {
    width: 100%;
    padding: 6px 10px 6px 24px;
    border: 1px solid var(--cosmyre-md-control-border-em);
    border-radius: 7px;
    background: var(--cosmyre-md-surface);
    font-size: 13.5px;
    color: var(--cosmyre-md-ink);
    cursor: pointer;
}

.sb-dir[b-ngbtzt1ar1] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex: 0 0 auto;
    padding: 6px 10px;
    border: 1px solid var(--cosmyre-md-control-border-em);
    border-radius: 7px;
    background: var(--cosmyre-md-surface);
    font-size: 12.5px;
    font-weight: 600;
    color: var(--cosmyre-md-ink-2);
    cursor: pointer;
}

.sb-dir[b-ngbtzt1ar1]  .bi { font-size: 10px; color: var(--cosmyre-md-muted-3); }
/* /Components/Shared/TrashButton.razor.rz.scp.css */
/* No border, no background — the glyph is the button. Sits in a table cell beside text, so it
   keeps a small padding for a comfortable hit area without drawing a box. */
.trash-btn[b-sberotdoz8] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: .15rem;
    border: 0;
    background: none;
    color: var(--bs-secondary-color);
    cursor: pointer;
    line-height: 1;
    border-radius: .25rem;
}

.trash-btn:hover[b-sberotdoz8],
.trash-btn:focus-visible[b-sberotdoz8] {
    color: #dc3545;
}

/* Keyboard users get the same affordance; without this the button is invisible when focused,
   since there is no border to outline. */
.trash-btn:focus-visible[b-sberotdoz8] {
    outline: 2px solid #dc3545;
    outline-offset: 1px;
}

.trash-btn:disabled[b-sberotdoz8] {
    opacity: .45;
    cursor: default;
}

.trash-svg[b-sberotdoz8] {
    display: block;
    width: 1.05rem;
    height: 1.05rem;
    overflow: visible;   /* the tilted lid swings past the 16x16 viewBox */
}

/* The hinge. transform-box: fill-box resolves the percentages against the lid group's own
   bounding box rather than the SVG viewport, so the pivot lands at the lid's left end and the
   bar swings up like a real one. Without it the origin is the viewport's top-left and the lid
   flies off the glyph. */
.trash-lid[b-sberotdoz8] {
    transform-box: fill-box;
    transform-origin: 12% 85%;
    transition: transform .16s ease;
}

.trash-btn:hover .trash-lid[b-sberotdoz8],
.trash-btn:focus-visible .trash-lid[b-sberotdoz8] {
    transform: rotate(-20deg);
}

/* Reduce MOTION, not feedback. The lid still lifts on hover here — it simply snaps instead of
   swinging. Cancelling the transform as well (which this used to do) meant any machine with
   Windows' Settings > Accessibility > Visual effects > "Animation effects" turned OFF got no lid
   movement at all, because that switch is exactly what browsers report as prefers-reduced-motion.
   That reads as a broken hover rather than as a considered accessibility choice. */
@media (prefers-reduced-motion: reduce) {
    .trash-lid[b-sberotdoz8] {
        transition: none;
    }
}
/* /Components/Shared/UploadJobModal.razor.rz.scp.css */
/* Upload-files modal — own layout only; shared modal parts live in app.css. */

.ujm[b-ieed4aegkf] {
    padding: 16px 18px;
    max-width: 560px;
}

.ujm-custodian[b-ieed4aegkf] {
    width: 220px;
}

.ujm-progress[b-ieed4aegkf] {
    margin-top: 14px;
}
/* /Components/Shared/ViewAsPicker.razor.rz.scp.css */
/* Deliberately NOT dressed like the page's own controls: this one changes what everything else
   on screen means, so it should never read as just another filter. The tertiary (orange) accent
   is the app's one non-purple and carries that warning. Both tokens flip with data-bs-theme, so
   nothing here needs a dark-mode override. */
.view-as[b-5yjnp15zq9] {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .1rem .35rem .1rem .5rem;
    border: 1px dashed var(--cosmyre-tertiary);
    border-radius: .35rem;
    background: rgba(var(--cosmyre-tertiary-rgb), .06);
}

.view-as-label[b-5yjnp15zq9] {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    margin: 0;
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .01em;
    color: var(--cosmyre-tertiary);
    white-space: nowrap;
}

.view-as-select[b-5yjnp15zq9] {
    width: auto;
    min-width: 11rem;
    font-size: .8rem;
}

/* Impersonating is a state you must not be able to forget you are in: the frame goes solid and
   fills, so the control stops looking like an idle option. */
.view-as.is-on[b-5yjnp15zq9] {
    border-style: solid;
    background: rgba(var(--cosmyre-tertiary-rgb), .14);
}
