/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-511kpiwq9l] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

main[b-511kpiwq9l] {
    flex: 1;
    min-width: 0;
    background: var(--ink);
}

/* The rail is a shade deeper than the page it frames, so it reads as chrome
   and lets the content sit forward. */
.sidebar[b-511kpiwq9l] {
    background: var(--rail);
    border-right: 1px solid var(--line);
}

/* Capped: six columns of console data do not need 1900px, and letting the
   tables sprawl that wide only opens gutters inside the rows. */
.content[b-511kpiwq9l] {
    padding: 2rem 1.75rem 4rem;
    min-width: 0;
    max-width: 1500px;
}

@media (min-width: 641px) {
    .page[b-511kpiwq9l] {
        flex-direction: row;
    }

    .sidebar[b-511kpiwq9l] {
        width: 250px;
        flex: none;
        height: 100vh;
        position: sticky;
        top: 0;
    }

    .content[b-511kpiwq9l] {
        /* Little tail padding: it is dead space, and on a laptop screen it was
           the difference between a page that fits and one that scrolls. */
        padding: 2.5rem 2.75rem 2rem;
    }
}

#blazor-error-ui[b-511kpiwq9l] {
    display: none;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1000;
    box-sizing: border-box;
    padding: 0.75rem 1.25rem;
    background: #4a1f1f;
    border-top: 1px solid rgba(217, 100, 94, 0.5);
    color: var(--text);
    font-size: 0.875rem;
    box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.35);
}

    #blazor-error-ui .bar[b-511kpiwq9l] {
        display: flex;
        align-items: center;
        gap: 1rem;
    }

    #blazor-error-ui .msg[b-511kpiwq9l] {
        flex: 1;
    }

    #blazor-error-ui .reload[b-511kpiwq9l] {
        color: #f0b7b4;
        text-decoration: underline;
        font-weight: 560;
    }

    #blazor-error-ui .dismiss[b-511kpiwq9l] {
        cursor: pointer;
        color: #f0b7b4;
        line-height: 1;
    }
/* /Components/Layout/NavMenu.razor.rz.scp.css */
/* The rail: wordmark, navigation, the instruments worth watching, and the
   account block pinned to the bottom. */

.brand[b-20p38fgp6r] {
    display: flex;
    align-items: center;
    height: 4rem;
    padding: 0 1.25rem;
    border-bottom: 1px solid var(--line);
}

.brand__link[b-20p38fgp6r] {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    color: var(--text);
    text-decoration: none;
}

.brand__link:hover[b-20p38fgp6r] {
    color: var(--text);
    text-decoration: none;
}

/* A small brass keystone rather than a logo: it ties the rail to the accent
   without pretending there is a brand mark to show. */
.brand__mark[b-20p38fgp6r] {
    width: 0.5rem;
    height: 1.15rem;
    border-radius: 1px;
    background: linear-gradient(180deg, var(--brass-bright), var(--brass-dim));
    flex: none;
}

.brand__name[b-20p38fgp6r] {
    font-size: 0.9375rem;
    font-weight: 620;
    letter-spacing: 0.02em;
}

/* --- Navigation ---------------------------------------------------------- */

.nav[b-20p38fgp6r] {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 1.1rem 0.75rem;
}

.nav-scrollable[b-20p38fgp6r]  .nav-link {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    width: 100%;
    padding: 0.6rem 0.8rem;
    border: none;
    border-radius: var(--radius-sm);
    background: none;
    color: var(--muted);
    font-family: inherit;
    font-size: 0.875rem;
    font-weight: 500;
    text-align: left;
    text-decoration: none;
    transition: background-color 0.12s ease, color 0.12s ease;
}

.nav-scrollable[b-20p38fgp6r]  .nav-link:hover {
    background: rgba(255, 255, 255, 0.04);
    color: var(--text);
    text-decoration: none;
}

/* Active state carries a brass edge as well as a fill, so the current page is
   still obvious to anyone who cannot separate the two greys. */
.nav-scrollable[b-20p38fgp6r]  a.nav-link.active {
    background: var(--brass-wash);
    color: var(--brass-bright);
    box-shadow: inset 2px 0 0 var(--brass);
}

/* The critic's disposition on its own nav row, pushed to the right edge by the
   row's flex. Working gets the fleet-up palette; Stopped sits a step above
   Idle's faintness so "a run ended" and "nothing ever ran" read differently
   even before the tooltip. */
.nav-scrollable[b-20p38fgp6r]  .nav-status {
    margin-left: auto;
    padding: 0.05rem 0.5rem;
    border: 1px solid var(--line);
    border-radius: 999px;
    font-size: 0.625rem;
    font-weight: 620;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--faint);
}

.nav-scrollable[b-20p38fgp6r]  .nav-status--working {
    border-color: transparent;
    background: var(--up-wash);
    color: var(--up);
}

.nav-scrollable[b-20p38fgp6r]  .nav-status--stopped {
    color: var(--muted);
}

/* --- Icons --------------------------------------------------------------- */

/* Masked rather than filled, so each icon inherits the link's colour and
   changes with hover and active state instead of staying flat white. */
.nav-scrollable[b-20p38fgp6r]  .nav-ico {
    width: 1rem;
    height: 1rem;
    flex: none;
    background-color: currentColor;
    -webkit-mask: var(--ico) center / contain no-repeat;
    mask: var(--ico) center / contain no-repeat;
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--dashboard {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z'/%3E%3Cpath fill-rule='evenodd' d='M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--telegram {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.287 5.906c-.778.324-2.334.994-4.666 2.01-.378.15-.577.298-.595.442-.03.243.275.339.69.47l.175.055c.408.133.958.288 1.243.294.26.006.549-.1.868-.32 2.179-1.471 3.304-2.214 3.374-2.23.05-.012.12-.026.166.016.047.041.042.12.037.141-.03.129-1.227 1.241-1.846 1.817-.193.18-.33.307-.358.336a8.154 8.154 0 0 1-.188.186c-.38.366-.664.64.015 1.088.327.216.589.393.85.571.284.194.568.387.936.629.093.06.183.125.27.187.331.236.63.448.997.414.214-.02.435-.22.547-.82.265-1.417.786-4.486.906-5.751a1.426 1.426 0 0 0-.013-.315.337.337 0 0 0-.114-.217.526.526 0 0 0-.31-.093c-.3.005-.763.166-2.984 1.09z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--searchbot {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--clicks {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M0 0h1v15h15v1H0V0Zm14.817 3.113a.5.5 0 0 1 .07.704l-4.5 5.5a.5.5 0 0 1-.74.037L7.06 6.767l-3.656 5.027a.5.5 0 0 1-.808-.588l4-5.5a.5.5 0 0 1 .758-.06l2.609 2.61 4.15-5.073a.5.5 0 0 1 .704-.07Z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--validation {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 14.5A1.5 1.5 0 0 1 1.5 13V3A1.5 1.5 0 0 1 3 1.5h8a.5.5 0 0 1 0 1H3a.5.5 0 0 0-.5.5v10a.5.5 0 0 0 .5.5h10a.5.5 0 0 0 .5-.5V8a.5.5 0 0 1 1 0v5a1.5 1.5 0 0 1-1.5 1.5H3z'/%3E%3Cpath d='m8.354 10.354 7-7a.5.5 0 0 0-.708-.708L8 9.293 5.354 6.646a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--critic {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z'/%3E%3Cpath d='M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--prompt {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M14 1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H4.414A2 2 0 0 0 3 11.586l-2 2V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12.793a.5.5 0 0 0 .854.353l2.853-2.853A1 1 0 0 1 4.414 12H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z'/%3E%3Cpath d='M3 3.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zM3 6a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9A.5.5 0 0 1 3 6zm0 2.5a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--users {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M7 14s-1 0-1-1 1-4 5-4 5 3 5 4-1 1-1 1H7Zm4-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z'/%3E%3Cpath d='M5.216 14A2.238 2.238 0 0 1 5 13c0-1.355.68-2.75 1.936-3.72A6.325 6.325 0 0 0 5 9c-4 0-5 3-5 4s1 1 1 1h4.216Z'/%3E%3Cpath d='M4.5 8a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--account {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z'/%3E%3Cpath fill-rule='evenodd' d='M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z'/%3E%3C/svg%3E");
}

.nav-scrollable[b-20p38fgp6r]  .nav-ico--logout {
    --ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M6 12.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-9a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v2a.5.5 0 0 1-1 0v-2A1.5 1.5 0 0 1 6.5 2h8A1.5 1.5 0 0 1 16 3.5v9a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 5 12.5v-2a.5.5 0 0 1 1 0v2z'/%3E%3Cpath fill-rule='evenodd' d='M.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L1.707 7.5H10.5a.5.5 0 0 1 0 1H1.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z'/%3E%3C/svg%3E");
}

/* --- Instruments --------------------------------------------------------- */

.instruments[b-20p38fgp6r] {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    padding: 0.75rem 1.25rem 1.5rem;
}

.coverage[b-20p38fgp6r] {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.coverage__map[b-20p38fgp6r] {
    display: block;
    width: 100%;
    /* One item per pixel: keep the pixels square rather than smeared. */
    image-rendering: pixelated;
    background: rgba(0, 0, 0, 0.35);
    border: 1px solid var(--line);
    border-radius: 2px;
    padding: 2px;
}

/* --- Account ------------------------------------------------------------- */

.account[b-20p38fgp6r] {
    margin-top: auto;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 0.75rem;
    border-top: 1px solid var(--line);
}

.account__name[b-20p38fgp6r] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

.account form[b-20p38fgp6r] {
    margin: 0;
}

/* --- Mobile -------------------------------------------------------------- */

.navbar-toggler[b-20p38fgp6r] {
    appearance: none;
    cursor: pointer;
    width: 3rem;
    height: 2.25rem;
    position: absolute;
    top: 0.65rem;
    right: 1rem;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.5rem;
}

.navbar-toggler:checked[b-20p38fgp6r] {
    background-color: rgba(255, 255, 255, 0.08);
}

.nav-scrollable[b-20p38fgp6r] {
    display: none;
}

.navbar-toggler:checked ~ .nav-scrollable[b-20p38fgp6r] {
    display: flex;
    flex-direction: column;
}

@media (min-width: 641px) {
    .navbar-toggler[b-20p38fgp6r] {
        display: none;
    }

    .nav-scrollable[b-20p38fgp6r] {
        /* Never collapse the sidebar for wide screens */
        display: flex;
        flex-direction: column;

        /* Allow sidebar to scroll for tall menus */
        height: calc(100vh - 4rem);
        overflow-y: auto;
    }
}
/* /Components/Pages/Clicks.razor.rz.scp.css */
/* --- By product ---------------------------------------------------------- */

.by-product[b-b1d0wt581f] {
    table-layout: fixed;
    min-width: 40rem;
}

.by-product .col-count[b-b1d0wt581f] {
    width: 6rem;
    text-align: right;
    font-weight: 600;
}

.by-product .col-share[b-b1d0wt581f] {
    width: 40%;
}

/* The count answers "how many"; the bar answers "compared to what", which is
   the question you actually have when scanning a ranked list. */
.bar[b-b1d0wt581f] {
    display: block;
    height: 6px;
    border-radius: 3px;
    background: linear-gradient(to right, var(--brass) var(--share), var(--line) var(--share));
}

/* --- Click log ----------------------------------------------------------- */

.log[b-b1d0wt581f] {
    table-layout: fixed;
    min-width: 68rem;
}

.log .col-when[b-b1d0wt581f] { width: 12rem; }
.log .col-ip[b-b1d0wt581f]   { width: 10rem; }
.log .col-link[b-b1d0wt581f] { width: 16rem; }
.log .col-post[b-b1d0wt581f] { width: 6rem; }
.log .col-ref[b-b1d0wt581f]  { width: 14rem; }

/* One row per click: every long value truncates rather than wrapping, so the
   log stays scannable and the timestamps keep their column. */
.url[b-b1d0wt581f],
.ua[b-b1d0wt581f] {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ua[b-b1d0wt581f] {
    font-family: var(--font-mono);
    font-size: 0.75rem;
    color: var(--muted);
}
/* /Components/Pages/Critic.razor.rz.scp.css */
/* A reading page with one working surface: the automatic-validation panel
   acts, everything below it describes. Same generous measure and air. */

.auto[b-v8rliihcb9] {
    display: flex;
    flex-direction: column;
    gap: 1.4rem;
}

.auto__lead[b-v8rliihcb9] {
    margin: 0;
    max-width: 46rem;
    line-height: 1.65;
    color: var(--text-dim);
}

.auto__controls[b-v8rliihcb9] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 1.25rem 2rem;
}

.auto__field[b-v8rliihcb9] {
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}

.auto__field input[b-v8rliihcb9] {
    width: 9.5rem;
}

.auto__estimate[b-v8rliihcb9] {
    padding-bottom: 0.45rem;
    font-size: 0.875rem;
    color: var(--muted);
}

.auto__summary[b-v8rliihcb9] {
    margin: 0;
    color: var(--text-dim);
}

.auto__stats[b-v8rliihcb9] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 1.25rem 2.5rem;
}

.auto__stat[b-v8rliihcb9] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.auto__stat--wide[b-v8rliihcb9] {
    min-width: 10rem;
}

.auto__value[b-v8rliihcb9] {
    font-size: 1.25rem;
    font-weight: 620;
    font-variant-numeric: tabular-nums;
    color: var(--text);
}

.auto__of[b-v8rliihcb9] {
    font-size: 0.875rem;
    font-weight: 400;
    color: var(--muted);
}

.auto__stop[b-v8rliihcb9] {
    margin-inline-start: auto;
    align-self: center;
}

.auto-meter[b-v8rliihcb9] {
    height: 0.4rem;
    border-radius: 999px;
    background: var(--line);
    overflow: hidden;
}

.auto-meter__fill[b-v8rliihcb9] {
    display: block;
    height: 100%;
    border-radius: 999px;
    background: var(--up);
    transition: width 0.4s ease;
}

/* The run's story, newest first. The detail column carries the critic's
   findings for posts it left behind - Hebrew quotes, so dir=auto per cell. */
.auto__outcomes[b-v8rliihcb9] {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.875rem;
}

.auto__outcomes th[b-v8rliihcb9] {
    text-align: start;
    padding: 0.45rem 0.9rem 0.45rem 0;
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--faint);
    border-bottom: 1px solid var(--line);
}

.auto__outcomes td[b-v8rliihcb9] {
    padding: 0.55rem 0.9rem 0.55rem 0;
    border-bottom: 1px solid var(--line);
    vertical-align: top;
    color: var(--text-dim);
}

.auto__detail[b-v8rliihcb9] {
    max-width: 34rem;
    overflow-wrap: anywhere;
}

.kind[b-v8rliihcb9] {
    display: inline-block;
    padding: 0.1rem 0.55rem;
    border-radius: 999px;
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    white-space: nowrap;
}

.kind--approved[b-v8rliihcb9] {
    color: var(--up);
    background: var(--up-wash);
}

.kind--left[b-v8rliihcb9] {
    color: var(--muted);
    border: 1px solid var(--line);
}

/* Not a verdict on the post: the fleet had no picture to give. Dashed, so it
   reads as unfinished rather than as a judgement. */
.kind--unfetched[b-v8rliihcb9] {
    color: var(--muted);
    border: 1px dashed var(--line);
}

.kind--error[b-v8rliihcb9] {
    color: var(--down);
    background: var(--down-wash);
}

.prose[b-v8rliihcb9] {
    max-width: 46rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.prose p[b-v8rliihcb9] {
    margin: 0;
    line-height: 1.65;
    color: var(--text-dim);
}

.prose strong[b-v8rliihcb9] {
    color: var(--text);
    font-weight: 620;
}

/* The three gates and the parameter list share one shape: a name column and a
   telling column, roomy enough that each entry reads as its own paragraph. */
.gates[b-v8rliihcb9],
.params[b-v8rliihcb9] {
    display: grid;
    grid-template-columns: 12rem minmax(0, 46rem);
    gap: 1.4rem 2.5rem;
    margin: 0;
}

.gates dt[b-v8rliihcb9],
.params dt[b-v8rliihcb9] {
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--faint);
    padding-top: 0.2rem;
}

.gates dd[b-v8rliihcb9],
.params dd[b-v8rliihcb9] {
    margin: 0;
    line-height: 1.65;
    color: var(--text-dim);
}

.params__note[b-v8rliihcb9] {
    display: block;
    margin-top: 0.35rem;
    font-size: 0.875rem;
    color: var(--muted);
}

.tag[b-v8rliihcb9] {
    display: inline-block;
    margin-inline-start: 0.6rem;
    padding: 0.1rem 0.55rem;
    border: 1px solid var(--line);
    border-radius: 999px;
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--muted);
    vertical-align: middle;
}

/* The prompts verbatim: monospace, kept to a readable measure, scrolling in
   their own box if a line insists rather than widening the page. */
.prompt-text[b-v8rliihcb9] {
    margin: 0;
    max-width: 60rem;
    overflow-x: auto;
    font-family: var(--font-mono);
    font-size: 0.8125rem;
    line-height: 1.6;
    color: var(--text-dim);
}

@media (max-width: 760px) {
    .gates[b-v8rliihcb9],
    .params[b-v8rliihcb9] {
        grid-template-columns: minmax(0, 1fr);
        gap: 0.4rem;
    }

    .gates dd[b-v8rliihcb9],
    .params dd[b-v8rliihcb9] {
        margin-bottom: 1rem;
    }
}
/* /Components/Pages/Dashboard.razor.rz.scp.css */
.job[b-1f53efa20e] {
    max-width: 52rem;
}

.job__body[b-1f53efa20e] {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

.job__desc[b-1f53efa20e] {
    margin: 0;
    max-width: 62ch;
    color: var(--text-dim);
    font-size: 0.9rem;
    line-height: 1.6;
}

.job__count[b-1f53efa20e] {
    color: var(--muted);
    font-size: 0.875rem;
}

/* Publishing is either happening or it is not, and the head of the panel says
   which without being read. */
.state[b-1f53efa20e] {
    display: inline-block;
    padding: 0.2em 0.7em;
    border: 1px solid var(--line);
    border-radius: 999px;
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.09em;
    text-transform: uppercase;
}

.state--on[b-1f53efa20e] {
    border-color: var(--up);
    color: var(--up);
    background: var(--up-wash);
}

.state--off[b-1f53efa20e] {
    color: var(--muted);
}

.publish__note[b-1f53efa20e] {
    padding: 0.85rem 1rem;
    border: 1px solid var(--line);
    border-left: 3px solid var(--brass);
    border-radius: var(--radius-sm);
    background: var(--panel-raised);
    color: var(--text-dim);
    font-size: 0.85rem;
    line-height: 1.6;
    max-width: 62ch;
}

/* The build cannot publish at all in this state - that outranks the rest of
   the note. */
.publish__note strong[b-1f53efa20e] {
    display: block;
    margin-top: 0.5rem;
    color: var(--down);
    font-weight: 560;
}

/* Channels with a real audience. The only state on this page that is loud
   without being a warning - which is exactly why it cannot look like the rest of
   the notes. */
.publish__note--live[b-1f53efa20e] {
    border-left-color: var(--up);
    background: var(--up-wash);
    color: var(--text);
}

.publish__note--live strong[b-1f53efa20e] {
    margin-top: 0;
    color: var(--up);
}

.publish__who[b-1f53efa20e] {
    color: var(--muted);
    font-size: 0.8125rem;
}

/* Folded away by default: this answers a question asked long afterwards - which
   windows was a channel live for - not one you have on the way past the button. */
.flips[b-1f53efa20e] {
    font-size: 0.8125rem;
}

.flips > summary[b-1f53efa20e] {
    cursor: pointer;
    color: var(--muted);
}

.flips__list[b-1f53efa20e] {
    margin: 0.9rem 0 0;
    padding: 0;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
}

.flips__list li[b-1f53efa20e] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.85rem;
}

.flips__when[b-1f53efa20e] {
    color: var(--faint);
    white-space: nowrap;
}

.flips__what[b-1f53efa20e] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
    color: var(--text-dim);
}

.flips__arrow[b-1f53efa20e] {
    color: var(--muted);
}

.flips__who[b-1f53efa20e] {
    margin-left: auto;
    color: var(--faint);
}

/* The post text is Hebrew and the item id is not: isolate the run so the line
   reads in the order it was written. */
.test__pick[b-1f53efa20e] {
    max-width: 36rem;
    unicode-bidi: isolate;
}

.test__sent[b-1f53efa20e] {
    color: var(--up);
    font-size: 0.875rem;
}

.test__sent a[b-1f53efa20e] {
    margin-left: 0.4rem;
}

.test__failed[b-1f53efa20e] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0.75rem 1rem;
    border: 1px solid rgba(217, 100, 94, 0.45);
    border-radius: var(--radius-sm);
    background: var(--down-wash);
    color: var(--down);
    font-size: 0.8125rem;
    max-width: 72ch;
}

/* The explanation ends with Telegram's own sentence after a blank line; that
   break is the difference between what we think and what it said. */
.test__why[b-1f53efa20e] {
    margin: 0;
    white-space: pre-line;
    line-height: 1.6;
}

.test__url[b-1f53efa20e] {
    color: var(--text-dim);
    font-size: 0.75rem;
    overflow-wrap: anywhere;
}

.job__error[b-1f53efa20e] {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

/* A stack trace is machine output: mono, scrollable in its own box, and never
   allowed to stretch the page sideways. */
.job__trace[b-1f53efa20e] {
    margin: 0;
    max-height: 22rem;
    overflow: auto;
    padding: 0.85rem;
    background: var(--ink);
    border: 1px solid var(--line);
    border-left: 3px solid var(--down);
    border-radius: var(--radius-sm);
    font-family: var(--font-mono);
    font-size: 0.78rem;
    line-height: 1.5;
    color: var(--text-dim);
    white-space: pre;
}
/* /Components/Pages/PostValidation.razor.rz.scp.css */
.editor__heading[b-z0j3bdrrpd] {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    min-width: 0;
}

.editor__title[b-z0j3bdrrpd] {
    font-size: 0.95rem;
    font-weight: 560;
    color: var(--text-dim);
}

/* Facts on the left, the message itself on the right: reference material and
   the thing being judged, side by side. */
.editor__body[b-z0j3bdrrpd] {
    display: grid;
    grid-template-columns: minmax(14rem, 20rem) minmax(0, 1fr);
    gap: 2rem 2.75rem;
    padding: 1.75rem 1.35rem;
    align-items: start;
}

@media (max-width: 900px) {
    .editor__body[b-z0j3bdrrpd] {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* --- Facts --------------------------------------------------------------- */

.facts[b-z0j3bdrrpd] {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: 0.85rem 1.25rem;
    margin: 0;
    font-size: 0.875rem;
}

.facts dt[b-z0j3bdrrpd] {
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--faint);
    padding-top: 0.15em;
}

.facts dd[b-z0j3bdrrpd] {
    margin: 0;
    min-width: 0;
    color: var(--text-dim);
    overflow-wrap: anywhere;
}

.facts__ago[b-z0j3bdrrpd] {
    color: var(--muted);
    margin-left: 0.4rem;
}

/* --- Message preview ------------------------------------------------------

   Everything below is Telegram's, not this console's: the numbers were read off
   a real channel post in the web client under mobile emulation of a 360px phone
   (bubble 288px — the viewport less 72 — on #212121, radius 15/15/15/0, caption
   16/21 at 8px margins, clock 12px in #aaa, tail path and all) and are
   deliberately literal rather than expressed in the design tokens. The
   validator is judging a message that will be rendered by Telegram; a preview
   wearing the console's own type and palette makes them judge a layout no
   subscriber will ever be shown — and the 400px desktop bubble this was drawn
   at until 2026-08-18 hid every wrap a phone shows. The bubble width here and
   TelegramLayout.BubbleWidth are the same number by hand, not by reference;
   change one, change the other.
   -------------------------------------------------------------------------- */

.preview[b-z0j3bdrrpd] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    min-width: 0;
}

/* The channel ground the bubble sits on. Without it the bubble floats on a
   panel and reads as a card; with it, as a message. */
.preview__chat[b-z0j3bdrrpd] {
    padding: 1.25rem 1.25rem 1.25rem 1.75rem;
    background: #181818;
    border: 1px solid var(--line);
    border-radius: var(--radius);
}

/* A post the channel sent, so it hangs off the left with the squared corner and
   the tail — the same side and the same shape the client gives it. */
.bubble[b-z0j3bdrrpd] {
    position: relative;
    width: fit-content;
    max-width: min(100%, 288px);
    background: #212121;
    border-radius: 15px 15px 15px 0;
    box-shadow: 0 1px 2px rgba(16, 35, 47, 0.15);
    color: #fff;
    font-family: var(--font-telegram);
    font-size: 16px;
    line-height: 21px;
}

/* Bled to the bubble's edges under the top corners, and squared off against the
   caption — Telegram gives a photo the full width and crops it to at most a
   square, which is the shape a KSP product shot arrives in anyway. */
.bubble__image[b-z0j3bdrrpd] {
    display: block;
    width: 100%;
    max-height: 400px;
    object-fit: cover;
    border-radius: 15px 15px 0 0;
    background: rgba(0, 0, 0, 0.25);
}

/* Stands where the photo would, at the width the photo would have, so a bubble
   waiting for a picture is the same shape as one that has it. */
.bubble__noimage[b-z0j3bdrrpd] {
    width: 288px;
    max-width: 100%;
    padding: 3.5rem 1rem;
    text-align: center;
    color: var(--muted);
    font-size: 0.8125rem;
    line-height: 1.5;
    background: rgba(0, 0, 0, 0.25);
    border-radius: 15px 15px 0 0;
}

/* Why the Approve button is dead, said next to the reason it is dead, so the
   two are never read as unrelated problems. */
.bubble__noimage-why[b-z0j3bdrrpd] {
    display: block;
    margin-top: 0.35rem;
    color: var(--faint);
}

.bubble__body[b-z0j3bdrrpd] {
    margin: 2px 8px 5px;
    word-break: break-word;
    text-align: start;
}

/* pre-wrap sits on the text and never on the container that holds it: the
   blocks below are separated in the .razor source by a newline and three levels
   of indentation, and a pre-wrap container renders every character of that. */
.bubble__alert[b-z0j3bdrrpd],
.bubble__text[b-z0j3bdrrpd],
.bubble__line[b-z0j3bdrrpd] {
    margin: 0;
    white-space: pre-wrap;
}

/* The caption is one text. Each block after the first is preceded by a blank
   line in what MyBot actually sends, and a blank line is one line-height —
   not a gap chosen to look right. Stated after the reset above, which would
   otherwise win the tie and flatten every gap. */
.bubble__body > * + *[b-z0j3bdrrpd] {
    margin-top: 21px;
}

/* Telegram renders bold at 500, not 700: at 16px Roboto the heavier weight is
   visibly not what the subscriber gets. */
.bubble__body :is(b, strong)[b-z0j3bdrrpd] {
    font-weight: 500;
}

.bubble__body a[b-z0j3bdrrpd] {
    color: #8774e1;
    text-decoration: underline;
}

/* Telegram swaps every emoji for a 20px image with a 1px margin — 21px of
   advance. Left as a glyph it is 21.97px here, and a row within a pixel of the
   caption's edge wraps in the preview while fitting on the phone (item 68859's
   second row, 2026-08-18). The box is 21px and the glyph is centred in it; the
   half-pixel it bleeds each side is invisible, the advance is the client's.
   ::deep because the spans in the post text arrive via MarkupString from
   PostMarkdown.ToPreviewHtml and carry no scope attribute. */
.bubble__body[b-z0j3bdrrpd]  .emoji,
.bubble__body .emoji[b-z0j3bdrrpd] {
    display: inline-block;
    width: 21px;
    text-align: center;
}

/* Its own line at the end, which is where the client puts it once the last line
   of text has no room for it — the usual case for a post this long. It follows
   the link line directly, so it is the one block the blank-line rule above must
   not reach. Right, not start: the clock sits at the end of the interface's
   direction, which stays left-to-right however the message reads. */
.bubble__body > .bubble__time[b-z0j3bdrrpd] {
    margin-top: 4px;
    direction: ltr;
    text-align: right;
    font-size: 12px;
    line-height: 12px;
    color: #aaa;
}

/* Grows out of the squared bottom-left corner and overhangs the bubble, the way
   the client hangs it off the edge. */
.bubble__tail[b-z0j3bdrrpd] {
    position: absolute;
    left: 0;
    bottom: 0;
    margin-left: -8.4px;
    transform: translateY(1px);
    fill: #212121;
}

/* Editing shows the source, so it is a field rather than a message - but sized
   and set like the text it replaces, so the bubble does not resize under the
   validator when they start typing. */
.bubble__edit[b-z0j3bdrrpd] {
    width: 100%;
    direction: rtl;
    font-family: var(--font-telegram);
    font-size: 16px;
    line-height: 21px;
    resize: vertical;
}

.preview__editing[b-z0j3bdrrpd] {
    display: flex;
    gap: 0.5rem;
}

/* --- Actions ------------------------------------------------------------- */

/* One primary action, the rest quiet, and Reject held apart so it is never
   hit on the way to Approve. */
.editor__actions[b-z0j3bdrrpd] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.65rem;
    padding: 1.1rem 1.35rem;
    border-top: 1px solid var(--line);
    background: var(--panel-raised);
}

.editor__actions .btn-outline-danger[b-z0j3bdrrpd] {
    margin-left: auto;
}

/* The wait caption stands in for a whole row of btn-sm, so it has to be as tall
   as one or the panel jumps every time an action starts and finishes: 0.78125rem
   of text at line-height 1.6, plus 0.38rem of padding a side, plus the border. */
.editor__actions .working[b-z0j3bdrrpd] {
    min-height: calc(0.78125rem * 1.6 + 0.76rem + 2px);
}
/* /Components/Pages/Prompt.razor.rz.scp.css */
.editor[b-yasrdfrk1b] {
    display: grid;
    grid-template-columns: 18rem minmax(0, 1fr);
    gap: 1.75rem;
    align-items: start;
}

@media (max-width: 900px) {
    .editor[b-yasrdfrk1b] {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* --- Version tree -------------------------------------------------------- */

.versions__list[b-yasrdfrk1b] {
    list-style: none;
    margin: 0;
    padding: 0.6rem;
    max-height: 34rem;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.version[b-yasrdfrk1b] {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: baseline;
    gap: 0.6rem;
    width: 100%;
    padding: 0.6rem 0.8rem;
    border: none;
    border-radius: var(--radius-sm);
    background: none;
    color: var(--text-dim);
    font-family: inherit;
    font-size: 0.8125rem;
    text-align: left;
    cursor: pointer;
    transition: background-color 0.12s ease, color 0.12s ease;
}

.version:hover[b-yasrdfrk1b] {
    background: rgba(255, 255, 255, 0.04);
    color: var(--text);
}

.version--selected[b-yasrdfrk1b] {
    background: var(--brass-wash);
    color: var(--brass-bright);
    box-shadow: inset 2px 0 0 var(--brass);
}

.version__id[b-yasrdfrk1b] {
    color: var(--faint);
}

.version--selected .version__id[b-yasrdfrk1b] {
    color: var(--brass);
}

.version__tag[b-yasrdfrk1b] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

.version__badge[b-yasrdfrk1b] {
    font-size: 0.625rem;
    font-weight: 620;
    letter-spacing: 0.08em;
    text-transform: uppercase;
}

.version__badge--open[b-yasrdfrk1b] {
    color: var(--up);
}

.version__badge--live[b-yasrdfrk1b] {
    color: var(--brass-bright);
}

/* --- The prompt itself --------------------------------------------------- */

.sheet__meta[b-yasrdfrk1b] {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    font-size: 0.8125rem;
    color: var(--muted);
}

.sheet__sep[b-yasrdfrk1b] {
    color: var(--faint);
}

.sheet__flags[b-yasrdfrk1b] {
    display: flex;
    align-items: center;
    gap: 1rem;
}

.locked[b-yasrdfrk1b] {
    font-size: 0.75rem;
    font-weight: 560;
    color: var(--brass-bright);
}

.live[b-yasrdfrk1b] {
    font-size: 0.75rem;
    font-weight: 620;
    color: var(--up);
}

.sheet__error[b-yasrdfrk1b] {
    padding: 0.75rem 1rem;
    border: 1px solid rgba(217, 100, 94, 0.45);
    border-radius: var(--radius-sm);
    background: var(--down-wash);
    color: var(--down);
    font-size: 0.8125rem;
}

.sheet__body[b-yasrdfrk1b] {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

/* Instruction text is read line by line and counted in tokens, so it is set
   in the mono face at a comfortable measure rather than as prose. */
.sheet__text[b-yasrdfrk1b] {
    width: 100%;
    font-family: var(--font-mono);
    font-size: 0.8125rem;
    line-height: 1.65;
    resize: vertical;
}

.sheet__foot[b-yasrdfrk1b] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
}

/* The prompt's posts, and the one action on them, sit between the text and its
   footer: a count first, the danger button at the far end, a line's worth of
   air above and below so it reads as its own matter rather than a footnote. */
.sheet__posts[b-yasrdfrk1b] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem 2rem;
    padding: 1rem 0;
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
}

.sheet__posts-count[b-yasrdfrk1b] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    font-size: 0.875rem;
}

.sheet__posts-done[b-yasrdfrk1b] {
    font-size: 0.8125rem;
    font-weight: 560;
    color: var(--up);
}

.sheet__tag[b-yasrdfrk1b] {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    min-width: 14rem;
}

.sheet__actions[b-yasrdfrk1b] {
    display: flex;
    gap: 0.5rem;
}
/* /Components/Pages/SearchBotAdmin.razor.rz.scp.css */
/* Spacious, like the rest of the Backoffice: room between panels comes from
   the shared .stack; this file only lays out the page's own grids. */

.state[b-s2qej6b7mh] {
    display: flex;
    flex-wrap: wrap;
    gap: 2.5rem;
    align-items: flex-start;
}

.state__switch[b-s2qej6b7mh] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    max-width: 26rem;
}

.state__note[b-s2qej6b7mh] {
    color: var(--muted, #6c757d);
    font-size: 0.875rem;
    line-height: 1.5;
}

.lights[b-s2qej6b7mh] {
    display: grid;
    grid-template-columns: auto auto;
    gap: 0.5rem 1.5rem;
    margin: 0;
}

.lights dt[b-s2qej6b7mh] {
    font-weight: 500;
    color: var(--muted, #6c757d);
}

.lights dd[b-s2qej6b7mh] {
    margin: 0;
}

.today[b-s2qej6b7mh] {
    display: flex;
    flex-wrap: wrap;
    gap: 2.5rem;
}

.today__stat[b-s2qej6b7mh] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.today__value[b-s2qej6b7mh] {
    font-size: 1.5rem;
    font-variant-numeric: tabular-nums;
}

.today__of[b-s2qej6b7mh] {
    font-size: 0.9rem;
    color: var(--muted, #6c757d);
}

.today__tallies[b-s2qej6b7mh] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-top: 1.5rem;
}

/* .tag exists only in other pages' scoped CSS, which isolation keeps away
   from here; .status--warn exists nowhere else at all. Both defined locally
   so the warn badges and outcome chips actually render styled. */
[b-s2qej6b7mh] .status--warn,
.status--warn[b-s2qej6b7mh] {
    color: #b45309;
    background: rgba(245, 158, 11, 0.12);
    border-radius: 999px;
    padding: 0.15rem 0.6rem;
    font-weight: 600;
}

.tag[b-s2qej6b7mh] {
    display: inline-block;
    padding: 0.15rem 0.6rem;
    border-radius: 999px;
    background: rgba(100, 116, 139, 0.12);
    font-size: 0.8rem;
    white-space: nowrap;
}

.tag--muted[b-s2qej6b7mh] {
    opacity: 0.65;
}

.knobs[b-s2qej6b7mh] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
    gap: 1.25rem 1.75rem;
}

.knob[b-s2qej6b7mh] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.knobs__actions[b-s2qej6b7mh] {
    display: flex;
    align-items: center;
    gap: 1rem;
    margin-top: 1.5rem;
}

.knobs__note[b-s2qej6b7mh] {
    color: var(--muted, #6c757d);
}

.integration[b-s2qej6b7mh] {
    display: flex;
    flex-wrap: wrap;
    gap: 2.5rem 4rem;
}

.integration__col[b-s2qej6b7mh] {
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
    max-width: 28rem;
}

.integration__col h4[b-s2qej6b7mh] {
    margin: 0;
    font-size: 1rem;
}

.integration__seen[b-s2qej6b7mh] {
    font-size: 0.875rem;
    color: var(--muted, #6c757d);
}

.check[b-s2qej6b7mh] {
    display: flex;
    gap: 0.6rem;
    align-items: baseline;
}

.list[b-s2qej6b7mh] {
    width: 100%;
    margin-top: 1.5rem;
    border-collapse: collapse;
}

.list th[b-s2qej6b7mh] {
    text-align: left;
    font-size: 0.75rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--muted, #6c757d);
    padding: 0.5rem 0.75rem;
}

.list td[b-s2qej6b7mh] {
    padding: 0.5rem 0.75rem;
    border-top: 1px solid var(--line, #e5e7eb);
    vertical-align: top;
}

.list--queries td.prewrap[b-s2qej6b7mh] {
    max-width: 28rem;
}

.row--flagged td[b-s2qej6b7mh] {
    background: rgba(255, 193, 7, 0.08);
}

.row--blocked td[b-s2qej6b7mh] {
    background: rgba(220, 53, 69, 0.07);
}

.cell--actions[b-s2qej6b7mh] {
    display: flex;
    gap: 0.5rem;
    align-items: center;
}

.muted[b-s2qej6b7mh] {
    color: var(--muted, #6c757d);
}
/* /Components/Pages/Telegram.razor.rz.scp.css */
.channels .col-name[b-gdsl4eva1t] {
    width: 22rem;
    font-weight: 560;
}

.channels .col-kind[b-gdsl4eva1t] {
    width: 8rem;
}

.channels .col-dest[b-gdsl4eva1t] {
    width: 15rem;
}

.channels .col-last[b-gdsl4eva1t] {
    width: 18rem;
    white-space: nowrap;
}

.channels .col-act[b-gdsl4eva1t] {
    width: 12rem;
}

/* Channel names are often Hebrew: isolate the run so it cannot reorder the
   rest of the cell. */
.name[b-gdsl4eva1t] {
    unicode-bidi: isolate;
}

/* The chat id is what identifies the channel to Telegram, so it rides under
   the name rather than taking a column of its own. */
.chat-id[b-gdsl4eva1t] {
    display: block;
    margin-top: 0.15rem;
    font-size: 0.75rem;
    font-weight: 400;
    color: var(--faint);
}

.chips[b-gdsl4eva1t] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
}

/* A category is a label the channel wears, not prose - so it is set as one. */
.chip[b-gdsl4eva1t] {
    display: inline-block;
    padding: 0.15em 0.5em;
    border: 1px solid var(--line);
    border-radius: 999px;
    background: var(--panel-raised);
    color: var(--text-dim);
    font-size: 0.75rem;
    white-space: nowrap;
}

/* In the editor a chip is the handle for taking the category off again. */
.chip--removable[b-gdsl4eva1t] {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    cursor: pointer;
    font: inherit;
    font-size: 0.75rem;
}

.chip--removable:hover[b-gdsl4eva1t] {
    border-color: var(--down);
    color: var(--text);
}

.chip__x[b-gdsl4eva1t] {
    color: var(--faint);
    font-size: 0.9rem;
    line-height: 1;
}

.chip--removable:hover .chip__x[b-gdsl4eva1t] {
    color: var(--down);
}

/* The kind is the first thing to know about a channel, so it reads as a state
   rather than as another category. */
.kind-badge[b-gdsl4eva1t] {
    display: inline-block;
    padding: 0.15em 0.55em;
    border: 1px solid var(--line);
    border-radius: 4px;
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-dim);
}

.kind-badge--main[b-gdsl4eva1t],
.kind-badge--turbo[b-gdsl4eva1t] {
    border-color: var(--brass);
    color: var(--brass);
}

.kind-badge--debug[b-gdsl4eva1t] {
    border-style: dashed;
}

.kind-badge--ignore[b-gdsl4eva1t] {
    color: var(--faint);
}

/* Three states of one setting, so they read as one control rather than as three
   buttons that happen to sit together. */
.dests[b-gdsl4eva1t] {
    display: inline-flex;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    overflow: hidden;
}

.dest[b-gdsl4eva1t] {
    padding: 0.3rem 0.6rem;
    border: 0;
    border-left: 1px solid var(--line);
    background: var(--panel-raised);
    color: var(--text-dim);
    font: inherit;
    font-size: 0.75rem;
    cursor: pointer;
}

.dest:first-child[b-gdsl4eva1t] {
    border-left: 0;
}

.dest:hover:not(:disabled)[b-gdsl4eva1t] {
    color: var(--text);
}

.dest:disabled[b-gdsl4eva1t] {
    cursor: default;
}

.dest--on[b-gdsl4eva1t] {
    font-weight: 620;
}

/* Rehearsal is quiet, and on air is not: the colour is the fastest way to see
   which channels currently have an audience. */
.dest--divert.dest--on[b-gdsl4eva1t] {
    background: var(--line);
    color: var(--text);
}

.dest--mirror.dest--on[b-gdsl4eva1t] {
    background: var(--brass-wash);
    color: var(--brass);
}

.dest--live.dest--on[b-gdsl4eva1t] {
    background: var(--up);
    color: var(--panel);
}

.dest-na[b-gdsl4eva1t] {
    color: var(--faint);
}

.ago[b-gdsl4eva1t] {
    color: var(--muted);
    font-size: 0.8125rem;
    margin-left: 0.4rem;
}

.never[b-gdsl4eva1t] {
    color: var(--faint);
    font-style: italic;
}

.row-acts[b-gdsl4eva1t] {
    display: flex;
    gap: 0.5rem;
}

/* The row being edited stays findable while the editor is open above it. */
.row--editing[b-gdsl4eva1t] {
    background: var(--panel-raised);
}

/* --- Editor -------------------------------------------------------------- */

.editor__id[b-gdsl4eva1t] {
    color: var(--faint);
    font-size: 0.8125rem;
}

/* The link box is wider than a field, because what goes in it is a URL. */
.lookup[b-gdsl4eva1t] {
    max-width: none;
}

.lookup__row[b-gdsl4eva1t] {
    display: flex;
    gap: 0.65rem;
    max-width: 44rem;
}

.lookup__row .form-control[b-gdsl4eva1t] {
    flex: 1;
    min-width: 0;
}

.lookup__row .btn[b-gdsl4eva1t] {
    white-space: nowrap;
}

.lookup__ok[b-gdsl4eva1t] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
    color: var(--up);
    font-size: 0.8125rem;
}

.lookup__ok strong[b-gdsl4eva1t] {
    unicode-bidi: isolate;
    font-weight: 600;
}

.lookup__ok .mono[b-gdsl4eva1t] {
    color: var(--muted);
}

/* Not an error: the link was read, it just has not been confirmed. */
.lookup__warn[b-gdsl4eva1t] {
    color: var(--brass-bright);
    font-size: 0.8125rem;
    line-height: 1.5;
}

/* Chat id and name are one line of identity, side by side until the panel is
   too narrow to hold them. */
.editor__grid[b-gdsl4eva1t] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
    gap: 1.5rem 2rem;
}

.editor__grid .field[b-gdsl4eva1t] {
    max-width: none;
}

.editor__kind[b-gdsl4eva1t] {
    max-width: none;
}

.kinds[b-gdsl4eva1t] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.kind[b-gdsl4eva1t] {
    padding: 0.45rem 1rem;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--panel-raised);
    color: var(--text-dim);
    font: inherit;
    font-size: 0.875rem;
    cursor: pointer;
}

.kind:hover[b-gdsl4eva1t] {
    border-color: var(--brass);
    color: var(--text);
}

.kind--on[b-gdsl4eva1t] {
    border-color: var(--brass);
    background: var(--brass);
    color: var(--panel);
    font-weight: 560;
}

.editor__error[b-gdsl4eva1t] {
    padding: 0.75rem 1rem;
    border: 1px solid rgba(217, 100, 94, 0.45);
    border-radius: var(--radius-sm);
    background: var(--down-wash);
    color: var(--down);
    font-size: 0.8125rem;
}

/* --- Category picker ----------------------------------------------------- */

/* Chosen above, the catalogue below: what the channel is now, then what it
   could be. */
.cats[b-gdsl4eva1t] {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
}

.cats__chosen[b-gdsl4eva1t] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.cats__head[b-gdsl4eva1t] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem;
}

/* The model's answer, said as what it is: something to check, not something
   that has been decided. */
.cats__note[b-gdsl4eva1t] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    color: var(--text-dim);
    font-size: 0.8125rem;
    line-height: 1.5;
}

/* An answer of "none" is still an answer, and a state that stops the button
   working is not a footnote - both are said in the colour that gets read. */
.cats__note--empty[b-gdsl4eva1t],
.cats__note--warn[b-gdsl4eva1t] {
    color: var(--brass-bright);
}

.cats__why[b-gdsl4eva1t] {
    color: var(--muted);
    font-style: italic;
    unicode-bidi: isolate;
}

.cats__none[b-gdsl4eva1t] {
    color: var(--muted);
    font-size: 0.8125rem;
}

.cats__pick[b-gdsl4eva1t] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.cats__search[b-gdsl4eva1t] {
    display: flex;
    gap: 0.65rem;
    max-width: 34rem;
}

.cats__search .form-control[b-gdsl4eva1t] {
    flex: 1;
    min-width: 0;
}

/* Hundreds of categories: the list scrolls rather than pushing the buttons off
   the bottom of the page. */
.cats__list[b-gdsl4eva1t] {
    list-style: none;
    margin: 0;
    padding: 0.4rem;
    max-height: 22rem;
    overflow-y: auto;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--panel-raised);
}

.cats__empty[b-gdsl4eva1t] {
    padding: 1.5rem 0.75rem;
    text-align: center;
    color: var(--muted);
    font-size: 0.875rem;
}

.cat[b-gdsl4eva1t] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    width: 100%;
    padding: 0.5rem 0.65rem;
    border: none;
    border-radius: 4px;
    background: none;
    color: var(--text-dim);
    font: inherit;
    font-size: 0.875rem;
    text-align: left;
    cursor: pointer;
}

.cat:hover[b-gdsl4eva1t] {
    background: var(--panel);
    color: var(--text);
}

.cat__mark[b-gdsl4eva1t] {
    flex: none;
    width: 0.95rem;
    height: 0.95rem;
    border: 1px solid var(--line);
    border-radius: 3px;
    background: var(--panel);
}

.cat--on .cat__mark[b-gdsl4eva1t] {
    border-color: var(--brass);
    background: var(--brass);
}

.cat--on[b-gdsl4eva1t] {
    color: var(--text);
    font-weight: 560;
}

.cat__title[b-gdsl4eva1t] {
    flex: 1;
    min-width: 0;
    unicode-bidi: isolate;
    overflow-wrap: anywhere;
}

.cat__id[b-gdsl4eva1t] {
    flex: none;
    color: var(--faint);
    font-size: 0.75rem;
}
/* /Components/Pages/Users.razor.rz.scp.css */
/* Two columns of short text do not need the full width of a wide screen. */
.stack .panel[b-da6mjc1yft] {
    max-width: 64rem;
}

.pending .col-decide[b-da6mjc1yft],
.active .col-roles[b-da6mjc1yft] {
    width: 24rem;
}

.decide[b-da6mjc1yft] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.roles[b-da6mjc1yft] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
}

/* Roles are worth telling apart at a glance: admin carries the accent, every
   other grant stays quiet. */
.role[b-da6mjc1yft] {
    display: inline-block;
    padding: 0.15em 0.55em;
    border: 1px solid var(--line);
    border-radius: 999px;
    background: var(--panel-raised);
    color: var(--text-dim);
    font-size: 0.75rem;
    font-weight: 560;
}

.role--admin[b-da6mjc1yft] {
    border-color: var(--brass-dim);
    background: var(--brass-wash);
    color: var(--brass-bright);
}
/* /Components/Pages/UserStats.razor.rz.scp.css */
.stats[b-29qfpg3o2t] {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.stats__list[b-29qfpg3o2t] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

/* Name and count on one line, the ranking bar tucked underneath. */
.stats__row[b-29qfpg3o2t] {
    display: grid;
    grid-template-columns: 1fr auto;
    align-items: baseline;
    gap: 0 0.5rem;
    font-size: 0.75rem;
}

.stats__name[b-29qfpg3o2t] {
    color: var(--text-dim);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

.stats__count[b-29qfpg3o2t] {
    font-family: var(--font-mono);
    font-variant-numeric: tabular-nums;
    color: var(--text);
}

.stats__bar[b-29qfpg3o2t] {
    grid-column: 1 / -1;
    height: 2px;
    border-radius: 1px;
    background: linear-gradient(to right, var(--brass) var(--share), var(--line) var(--share));
}
/* /Components/Pages/Validation.razor.rz.scp.css */
/* --- Toolbar ------------------------------------------------------------- */

.toolbar[b-v0joporm18] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 1.1rem 2rem;
    padding: 1rem 1.35rem;
}

.toolbar__progress[b-v0joporm18] {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    min-width: 11rem;
}

.toolbar__progress .of[b-v0joporm18] {
    color: var(--muted);
    font-size: 0.875rem;
    font-weight: 400;
}

.toolbar__group[b-v0joporm18] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.65rem;
    margin: 0;
}

.toolbar__caption[b-v0joporm18] {
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--faint);
}

.toolbar__hint[b-v0joporm18] {
    font-size: 0.8125rem;
    color: var(--muted);
    white-space: nowrap;
}

.page-input[b-v0joporm18] {
    width: 5rem;
}

.find-input[b-v0joporm18] {
    width: 11rem;
}

/* --- Failure notice ------------------------------------------------------ */

/* Loud enough not to be missed on a page this dense, quiet enough that it is
   not mistaken for the fleet being down: the queue below it is still usable,
   and usually the only thing wrong is the one fetch that was asked for. */
.notice[b-v0joporm18] {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    padding: 1.1rem 1.35rem;
    border-color: var(--down);
    background: var(--down-wash);
}

.notice__mark[b-v0joporm18] {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 1.5rem;
    height: 1.5rem;
    border-radius: 50%;
    background: var(--down);
    color: var(--ink);
    font-weight: 700;
    line-height: 1;
}

.notice__body[b-v0joporm18] {
    flex: 1;
    min-width: 0;
}

.notice__head[b-v0joporm18] {
    font-weight: 620;
    color: var(--down);
}

/* The orchestrator's own words, which for a store or driver fault run long and
   arrive with newlines in them — kept readable rather than clipped, because the
   whole point of showing it is that it names something no one guessed. */
.notice__detail[b-v0joporm18] {
    margin: 0.2rem 0 0;
    color: var(--text-dim);
    font-family: var(--font-mono);
    font-size: 0.8125rem;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

/* Holds whichever critic banner arrived, right above the editor whose button
   asked for it. Focusable only so FocusAsync can scroll it into view; the
   banner's own colour is the highlight, so no focus ring on top of it. */
.verdict[b-v0joporm18] {
    outline: none;
}

/* Blocks pad the wrapper's height into the stack gap; the banner is the only
   child, so let it be the wrapper's whole box. */
.verdict > .notice[b-v0joporm18] {
    margin: 0;
}

/* The critic's pass verdict: the failure notice's shape and place, in the
   fleet-up palette — same spot the fail banner would occupy, opposite answer. */
.notice--ok[b-v0joporm18] {
    border-color: var(--up);
    background: var(--up-wash);
}

.notice--ok .notice__mark[b-v0joporm18] {
    background: var(--up);
}

.notice--ok .notice__head[b-v0joporm18] {
    color: var(--up);
}

/* --- Queue table --------------------------------------------------------- */

.queue[b-v0joporm18] {
    /* Fixed layout keeps the metadata columns from being shoved about by an
       unusually long product name. */
    table-layout: fixed;
    min-width: 60rem;
}

/* Rows are tighter here than anywhere else in the app, deliberately: this is
   the one table you scan a whole page of at a time, and a page of it should
   fit a laptop screen without scrolling. Only the padding gives way - the
   type stays the size it is everywhere else. */
.queue thead th[b-v0joporm18] {
    padding-top: 0.55rem;
    padding-bottom: 0.55rem;
}

.queue tbody td[b-v0joporm18],
.queue tbody th[b-v0joporm18] {
    padding-top: 0.4rem;
    padding-bottom: 0.4rem;
}

.queue .col-ops[b-v0joporm18]   { width: 4rem; }
.queue .col-act[b-v0joporm18]   { width: 13rem; }
.queue .col-when[b-v0joporm18]  { width: 16rem; }
.queue .col-id[b-v0joporm18]    { width: 6rem; }
.queue .col-price[b-v0joporm18] { width: 8rem; }

/* The table has two zones - what the machine knows on the left, the product
   itself on the right - and the rule is that boundary. The Hebrew name keeps
   its right-to-left ordering but sits flush against the rule rather than
   drifting to the far edge, which left a gutter that read as a mistake. */
.queue .col-name[b-v0joporm18] {
    border-left: 1px solid var(--line);
    padding-left: 1.75rem;
}

.queue .col-when[b-v0joporm18] {
    white-space: nowrap;
}

.queue .col-price[b-v0joporm18] {
    text-align: right;
}

.ops[b-v0joporm18] {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.9rem;
    line-height: 1;
}

.row-actions[b-v0joporm18] {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    /* As tall as the btn-sm it swaps a wait caption in for, so a row starting
       work does not pull every row under it up a couple of pixels. */
    min-height: calc(0.78125rem * 1.6 + 0.76rem + 2px);
}

.ago[b-v0joporm18] {
    color: var(--muted);
    font-size: 0.8125rem;
    margin-left: 0.4rem;
}

.tag[b-v0joporm18] {
    display: inline-block;
    padding: 0.15em 0.45em;
    border-radius: var(--radius-sm);
    background: var(--down-wash);
    color: var(--down);
    font-size: 0.6875rem;
    font-weight: 620;
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

/* --- Money --------------------------------------------------------------- */

/* A discount is a before and an after, so it is set as one: the old figure
   small and struck, the price you actually pay carrying the weight. */
.col-price .was[b-v0joporm18] {
    font-family: var(--font-mono);
    font-variant-numeric: tabular-nums;
    font-size: 0.75rem;
    color: var(--faint);
    text-decoration: line-through;
    margin-right: 0.35rem;
}

.col-price .now[b-v0joporm18] {
    font-family: var(--font-mono);
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    color: var(--text);
}

/* --- Row states ---------------------------------------------------------- */

tbody tr.approved td[b-v0joporm18] {
    background: var(--up-wash);
}

tbody tr.approved.previous-prompt td[b-v0joporm18] {
    background: var(--brass-wash);
}

tbody tr.gone td[b-v0joporm18] {
    color: var(--muted);
}

/* The row whose post is open in the editor below, marked with a brass edge
   rather than a full outline that would fight the hairline grid. */
tbody tr.selected td[b-v0joporm18] {
    background: rgba(255, 255, 255, 0.04);
    border-top: 1px solid var(--brass-dim);
    border-bottom: 1px solid var(--brass-dim);
}

tbody tr.selected td:first-child[b-v0joporm18] {
    box-shadow: inset 3px 0 0 var(--brass);
}

/* The row an item link from another page named (?item=...). The selected
   row's brass edge plus a wash that flares on arrival and settles - the eye
   should land on it before reading a single id. Declared after .approved so
   the wash wins on a row that is both. */
tbody tr.highlight td[b-v0joporm18] {
    background: var(--brass-wash);
    border-top: 1px solid var(--brass-dim);
    border-bottom: 1px solid var(--brass-dim);
    animation: highlight-flare-b-v0joporm18 1.5s ease-out;
}

tbody tr.highlight td:first-child[b-v0joporm18] {
    box-shadow: inset 3px 0 0 var(--brass);
}

@keyframes highlight-flare-b-v0joporm18 {
    from { background: var(--brass-dim); }
}

/* A page mid-fetch is dimmed and inert, so a second click cannot land on rows
   that are about to be replaced. The row being worked on keeps its full
   strength: it is the one thing on the table worth reading just then, and the
   spinner in it is the whole reason the rest has gone quiet. */
.busy[b-v0joporm18] {
    pointer-events: none;
}

.busy thead th[b-v0joporm18],
.busy tbody tr:not(.working-row) td[b-v0joporm18] {
    opacity: 0.45;
}
/* /Components/Pages/Watermark.razor.rz.scp.css */
.watermark[b-y4dgkc3gpp] {
    position: fixed;
    inset: 0;
    z-index: 900;
    pointer-events: none;
    background: repeating-linear-gradient(
        135deg,
        rgba(200, 152, 63, 0.055) 0,
        rgba(200, 152, 63, 0.055) 10px,
        transparent 10px,
        transparent 26px
    );
}

.watermark__chip[b-y4dgkc3gpp] {
    position: fixed;
    right: 1.25rem;
    bottom: 1.25rem;
    z-index: 901;
    pointer-events: none;
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 0.75rem;
    border: 1px solid var(--brass-dim);
    border-radius: 999px;
    background: var(--panel-raised);
    color: var(--brass-bright);
    font-size: 0.75rem;
    font-weight: 620;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.45);
}

.watermark__chip[b-y4dgkc3gpp]::before {
    content: "";
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--brass);
}
