@import '_content/Microsoft.AspNetCore.Components.QuickGrid/Microsoft.AspNetCore.Components.QuickGrid.boiwgh0w5b.bundle.scp.css';

/* /Components/Auth/EnrollmentAgentsPage.razor.rz.scp.css */
/* Scoped glue for the /community/agents body (#1848 — the component moved from
 * the standalone BlazorAuthLayout card into the app shell). Every value mirrors
 * an existing _shell.css idiom; no new visual language.
 *
 * - .wep-agents-lede / -help / -muted replace the old wep-auth-* prose classes
 *   (which were never defined outside the auth card): body copy at text-sm on
 *   fg-2, help at text-xs on fg-3, the 60ch measure the kit empty-state uses.
 * - .wep-token-card is the minted-result card: the .wep-card chrome (bg-1,
 *   border-1, radius-sm) with the section rhythm, so the one-time material
 *   reads as one evidence-grade block rather than loose paragraphs.
 * - .wep-enroll-form / .wep-enroll-actions are the modal form's stack + the
 *   right-aligned submit row (the WepModal foot rhythm, flex + gap-2).
 */

.wep-agents-lede[b-qv2n0ok444] {
    max-width: 72ch;
    margin: 0 0 var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    line-height: 1.5;
    color: var(--wep-color-fg-2);
}

.wep-agents-help[b-qv2n0ok444] {
    max-width: 72ch;
    margin: 0 0 var(--wep-space-3);
    font-size: var(--wep-size-text-sm);
    line-height: 1.5;
    color: var(--wep-color-fg-3);
}

.wep-agents-muted[b-qv2n0ok444] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

.wep-token-card[b-qv2n0ok444] {
    margin: 0 0 var(--wep-space-5);
    padding: var(--wep-space-4);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

.wep-token-card-title[b-qv2n0ok444] {
    margin-bottom: var(--wep-space-3);
}

.wep-token-card-subtitle[b-qv2n0ok444] {
    margin: var(--wep-space-4) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-bootstrap-template[b-qv2n0ok444] {
    margin: 0 0 var(--wep-space-3);
    white-space: pre-wrap;
    word-break: break-all;
}

.wep-agent-installer-unavailable[b-qv2n0ok444] {
    font-style: italic;
}

.wep-agents-status[b-qv2n0ok444] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-1);
    align-items: center;
}

.wep-enroll-form[b-qv2n0ok444] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    margin: var(--wep-space-3) 0;
}

.wep-enroll-phrase[b-qv2n0ok444] {
    margin: calc(-1 * var(--wep-space-2)) 0 0;
}

.wep-enroll-actions[b-qv2n0ok444] {
    display: flex;
    justify-content: flex-end;
    gap: var(--wep-space-2);
}

/* #2543 — the "Enrolled agents" section header: the kit section label on the
 * left, the show/hide-decommissioned toggle (the kit .wep-btn-ghost) on the
 * right. Copied from CommunityBrokers.razor.css's .wep-brokers-section-head
 * (#1848); the label's own bottom margin moves to the row so the two align. */
.wep-agents-section-head[b-qv2n0ok444] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--wep-space-3);
    margin-bottom: var(--wep-space-2);
}

.wep-agents-section-head .wep-section-title[b-qv2n0ok444] {
    margin-bottom: 0;
}
/* /Components/Banners/DetonationReadinessAnnunciator.razor.rz.scp.css */
/*
    #3114 — the annunciator's Action slot holds two controls on the layout mount: the
    "Enable a broker" link and the ghost "Dismiss" button. WepBanner's .wep-banner-action
    is a plain block, and Razor drops the whitespace between the two components, so this
    row spaces them with the kit's own gap token. No new primitive, no new slot.
*/
.wep-readiness-actions[b-i4uu4931sq] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}
/* /Components/Catalog/BaselineGateWaiverCard.razor.rz.scp.css */
/* #2505 — the spacing wrapper of the "not on the audit trail" notice a revoke whose record was
   lost renders directly under its result line: the banner is spaced like the card's other
   blocks, never pressed against the line it qualifies. */
.wep-waiver-banner[b-htr0fzsr6b] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Catalog/CatalogAppList.razor.rz.scp.css */
/* #4213 U12 — the catalog app table. One <tbody> per app; the app row is the whole app
 * while folded, and its versions open beneath it in place. Mirrored, declaration for
 * declaration, in docs/design/prototypes/_catalog-scoped.css (where `.wep-table td.`
 * stands in for the scope attribute). */

.wep-catalog-app-row[b-tgm8cmarrm] {
    cursor: pointer;
}

.wep-catalog-app-row.is-open > td[b-tgm8cmarrm] {
    background: var(--wep-color-bg-2);
}

.wep-catalog-app-cell[b-tgm8cmarrm] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-3);
    min-width: 0;
}

/* The fold control: the one button in the row. A real <button>, so it is Tab-reachable
 * and operable with Enter and Space; aria-expanded carries its state and turns the chevron. */
.wep-catalog-fold-toggle[b-tgm8cmarrm] {
    flex: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.25rem;
    height: 1.25rem;
    padding: 0;
    border: none;
    border-radius: var(--wep-radius-xs);
    background: transparent;
    color: var(--wep-color-fg-3);
    cursor: pointer;
}

.wep-catalog-fold-toggle:hover[b-tgm8cmarrm] {
    background: var(--wep-color-bg-3);
    color: var(--wep-color-fg-1);
}

.wep-catalog-fold-chevron[b-tgm8cmarrm] {
    display: inline-block;
    line-height: 1;
    transition: transform var(--wep-motion-fast) var(--wep-ease-standard);
}

.wep-catalog-fold-toggle[aria-expanded="true"] .wep-catalog-fold-chevron[b-tgm8cmarrm] {
    transform: rotate(90deg);
}

@media (prefers-reduced-motion: reduce) {
    .wep-catalog-fold-chevron[b-tgm8cmarrm] {
        transition: none;
    }
}

/* The slot an app with no fold leaves empty, so every name starts on one line. */
.wep-catalog-fold-none[b-tgm8cmarrm] {
    flex: none;
    width: 1.25rem;
}

/* THE APP COLUMN GIVES WAY FIRST. An id line can be 60 characters of mono, and in an
 * auto-layout table a nowrap line is its column's minimum, so one long id pushed the
 * last columns behind the wrap's sideways scroll. `max-width: 0` takes the cell's content
 * out of the column's minimum, the name and the id line each end in an ellipsis of their
 * own (each carries its full text in `title`), and the column takes the share its width
 * asks for. Every other column keeps its content's own minimum, so nothing in them is
 * ever clipped. */
.wep-catalog-app-td[b-tgm8cmarrm] {
    width: 30%;
    max-width: 0;
}

.wep-catalog-app-text[b-tgm8cmarrm] {
    min-width: 0;
}

/* #4323: the name's line, so the attention dot sits before the name, as drawn. */
.wep-catalog-app-name[b-tgm8cmarrm] {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
}

/* The app's name: the row's one link to its package page. Prose weight at 14px, not the
 * table's 12px. */
.wep-catalog-app-link[b-tgm8cmarrm] {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
    text-decoration: none;
}

.wep-catalog-app-link:hover[b-tgm8cmarrm] {
    text-decoration: underline;
}

/* A current version of the app is in Needs attention: the drawing's dot before the name,
 * on the kit's attention colour. Its words ride in the dot for assistive technology
 * (.wep-sr-only) and in its title, so colour is never the only channel. */
.wep-catalog-app-flag[b-tgm8cmarrm] {
    flex: none;
    width: 6px;
    height: 6px;
    border-radius: var(--wep-radius-pill);
    background: var(--wep-state-detonating-fg);
}

/* Windows High Contrast paints no author background, so there the dot is drawn by its border, which forced colours
 * paint in a system colour (design.md §10: a state survives High Contrast; forced-color-adjust stays untouched). */
@media (forced-colors: active) {
    .wep-catalog-app-flag[b-tgm8cmarrm] {
        box-sizing: border-box;
        border: 3px solid CanvasText;
    }
}

/* The Serving and Newest cells wrap BETWEEN their pieces (the version, the ring marks,
 * the verdict glyph, the lifecycle pill, a badge), so a row with more of them is taller,
 * never wider (#3743's rule). The scope attribute makes this (0,2,0), which beats the
 * kit's nowrap `.wep-table tbody td` (0,1,2). */
.wep-catalog-serving-cell[b-tgm8cmarrm],
.wep-catalog-newest-cell[b-tgm8cmarrm] {
    white-space: normal;
}

.wep-catalog-marks[b-tgm8cmarrm] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1) var(--wep-space-2);
    vertical-align: middle;
}

.wep-catalog-rings[b-tgm8cmarrm] {
    display: inline-flex;
    gap: 2px;
    white-space: nowrap;
    vertical-align: middle;
}

/* #4323: the ring dots as drawn, 9px squares two apart, in the kit's ring colours. Each
 * is an image named by its ring and state (role="img", aria-label and title). */
.wep-catalog-rings .wep-ring-mini[b-tgm8cmarrm] {
    width: 9px;
    height: 9px;
    margin-right: 0;
    border-radius: 2px;
    vertical-align: middle;
}

/* The version beside its dots or its pill: mono at the label size. */
.wep-catalog-version[b-tgm8cmarrm] {
    margin-right: var(--wep-space-1);
}

/* The Serving header's ring order: faint, as a note to the column name. */
.wep-catalog-ring-order[b-tgm8cmarrm] {
    font-family: var(--wep-font-mono);
    font-weight: var(--wep-weight-regular);
    letter-spacing: normal;
    color: var(--wep-color-fg-4);
}

/* #4323: an update upstream has for the app, beside Newest: a quiet note, never a button. It is a link to the ingest
 * dialog on the package, underlined on hover and on focus. */
.wep-catalog-upstream[b-tgm8cmarrm] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
    white-space: nowrap;
    text-decoration: none;
}

.wep-catalog-upstream:hover[b-tgm8cmarrm],
.wep-catalog-upstream:focus-visible[b-tgm8cmarrm] {
    color: var(--wep-color-fg-1);
    text-decoration: underline;
}

/* #4341, #4360: the stage pill of Newest and of each version row of the fold, in the drawing's four tones (good, warn, bad, idle) on the kit's own colours: the clean
 * verdict's green for a version that serves, the warn ramp for one in motion or waiting on a look, the danger ink on a
 * danger wash for one that is stopped, and the quiet ink on the sunk ground for one at rest. The shape and the
 * lowercase are the list pages' pill (_shell.css, `.wep-list-page .wep-content-cap .wep-pill`). */
.wep-catalog-stage-good[b-tgm8cmarrm] {
    color: var(--wep-verdict-cell-pass-fg);
    background: var(--wep-verdict-cell-pass-bg);
}

.wep-catalog-stage-warn[b-tgm8cmarrm] {
    color: var(--wep-color-warn-fg);
    background: var(--wep-color-warn-bg);
}

.wep-catalog-stage-bad[b-tgm8cmarrm] {
    color: var(--wep-color-danger-text);
    background: color-mix(in srgb, var(--wep-color-danger) 14%, transparent);
}

.wep-catalog-stage-idle[b-tgm8cmarrm] {
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

/* #4323: a version row's version is the drawing's plain mono text in ink; it is still the link to its package page,
 * underlined on hover and on focus. */
.wep-catalog-version-link[b-tgm8cmarrm] {
    color: var(--wep-color-fg-1);
    text-decoration: none;
}

.wep-catalog-version-link:hover[b-tgm8cmarrm],
.wep-catalog-version-link:focus-visible[b-tgm8cmarrm] {
    text-decoration: underline;
}

/* #4323: a version row's one sentence beside its pill, quiet, as drawn. */
.wep-catalog-what[b-tgm8cmarrm] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* "+canary on 1.83.118": a lower ring runs a version ahead of serving. One piece, never split. */
.wep-catalog-ahead[b-tgm8cmarrm] {
    display: inline-block;
    white-space: nowrap;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-2);
}

/* A version row of an open fold: on the page surface, under the app's name. The indent
 * is the app cell's own run-in: the cell padding, the fold control, the avatar and their
 * two gaps. */
.wep-catalog-version-row > td[b-tgm8cmarrm] {
    padding-top: 6px;
    padding-bottom: 6px;
    border-bottom-style: dashed;
    background: var(--wep-color-bg-1);
}

.wep-catalog-version-row > td.wep-catalog-version-cell[b-tgm8cmarrm],
.wep-catalog-older-row > td[b-tgm8cmarrm] {
    padding-left: calc(var(--wep-space-3) + 1.25rem + var(--wep-space-3) + 26px + var(--wep-space-3));
}

/* (#3715) The Version cell wraps between its pieces: the Update badge and the auto-update
 * chip move below the version whole instead of widening the table past its wrap. The chip
 * is UpdatePipelinePositionBadge's element, reached through ::deep; its 24ch floor stops a
 * docked drawer squeezing it to five lines. */
.wep-catalog-version-cell[b-tgm8cmarrm] { white-space: normal; }

.wep-catalog-version-cell[b-tgm8cmarrm]  .wep-pill-sub { display: inline-block; min-width: 24ch; }

/* The same chip on an app row's Serving or Newest cell moves whole too, with no floor:
 * those two columns share the row with five others. */
.wep-catalog-serving-cell[b-tgm8cmarrm]  .wep-pill-sub,
.wep-catalog-newest-cell[b-tgm8cmarrm]  .wep-pill-sub {
    display: inline-block;
}

/* (#3743) The Status and CVEs cells wrap between their pieces as well; the sub-label and
 * the acceptance mark stay whole, as the pills and the drift badge already do. */
.wep-catalog-status-cell[b-tgm8cmarrm], .wep-catalog-cve-cell[b-tgm8cmarrm] { white-space: normal; }

.wep-catalog-status-cell[b-tgm8cmarrm]  .wep-pill-sub, .wep-catalog-status-cell[b-tgm8cmarrm]  .wep-acceptance-mark { white-space: nowrap; }

.wep-catalog-more-cell[b-tgm8cmarrm] {
    text-align: right;
}

/* #4213 U20 (KTD12): All versions, ONE LINE PER ROW. The table's virtualized mode draws each cell exactly the row's
 * height with the fixed column widths of these header cells, so a cell never wraps and the columns never move as rows
 * scroll by. The app is its initials and its name (the id is in the name's title); the status is the version's one pill
 * and a "+N" for the marks beside it; a Chocolatey or Scoop row's Ring cell holds its two verbs, so it is wider there. */
.wep-catalog-flat-th-app[b-tgm8cmarrm] { width: 28%; }
.wep-catalog-flat-th-version[b-tgm8cmarrm] { width: 13%; }
.wep-catalog-flat-th-status[b-tgm8cmarrm] { width: 21%; }
.wep-catalog-flat-th-status-narrow[b-tgm8cmarrm] { width: 16%; }
.wep-catalog-flat-th-ring[b-tgm8cmarrm] { width: 10%; }
.wep-catalog-flat-th-ring-verbs[b-tgm8cmarrm] { width: 20%; }

/* The version and the auto-update chip beside it end in an ellipsis together, the version's whole text in its title. */
.wep-catalog-flat-version[b-tgm8cmarrm] {
    overflow: hidden;
    text-overflow: ellipsis;
}

/* The name gives way inside its cell: a flex item's automatic minimum would keep the whole name and push the cell. */
.wep-catalog-flat-app .wep-catalog-app-link[b-tgm8cmarrm] {
    min-width: 0;
}

/* The pill and its marks stay on the row's one line; the cell's ellipsis takes what does not fit. */
.wep-catalog-flat-status .wep-catalog-marks[b-tgm8cmarrm] {
    flex-wrap: nowrap;
}

/* "+2": the marks a version row carries beside its pill, counted; its title names each one. */
.wep-catalog-flat-more[b-tgm8cmarrm] {
    display: inline-block;
    padding: 0 5px;
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-2);
    color: var(--wep-color-fg-3);
    font-size: var(--wep-size-text-xs);
    vertical-align: middle;
}

/* #2985 — the muted "live refresh failed" line above the list. It rides .wep-fg-3 for
 * colour; this is its own mono typography and top margin. */
.wep-live-refresh-note[b-tgm8cmarrm] {
    margin: var(--wep-space-3) 0 0;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-sm);
}
/* /Components/Catalog/CatalogBulkAdoptModal.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the bulk-adopt modal's eleven inline style=
 * attributes, moved here. Declarations relocated verbatim; this is a
 * relocation, not a redesign.
 *
 * This modal rides here rather than with the Fleet cluster because the
 * mechanism is identical, not because it is a Fleet surface: it is a modal, and
 * a modal is the surface where a fixed inline composition hurts most, since its
 * body is the thing that has to reflow when the viewport shrinks.
 *
 * Colours stay on the shared .wep-fg-3 kit utility throughout; only spacing and
 * size are local.
 */

/* The secondary package name under each row's id. */
.wep-bulk-adopt-row-name[b-b1l0r2vyrg] {
    display: block;
    font-size: var(--wep-size-text-sm);
}

/* The will-upgrade disclosure: its lead, its list, and the "none" variant. */
.wep-bulk-adopt-upgrade-lead[b-b1l0r2vyrg] {
    margin: var(--wep-space-2) 0 var(--wep-space-1) 0;
}

.wep-bulk-adopt-upgrade-list[b-b1l0r2vyrg] {
    margin: 0 0 var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}

.wep-bulk-adopt-upgrade-none[b-b1l0r2vyrg] {
    margin: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}

.wep-bulk-adopt-reinstall-note[b-b1l0r2vyrg] {
    margin: var(--wep-space-2) 0;
}

/* The excluded-rows block: wrapper, its lead line and its list. */
.wep-bulk-adopt-excluded[b-b1l0r2vyrg] {
    margin: var(--wep-space-2) 0 0 0;
}

.wep-bulk-adopt-excluded-lead[b-b1l0r2vyrg] {
    margin: 0 0 var(--wep-space-1) 0;
    font-size: var(--wep-size-text-sm);
}

.wep-bulk-adopt-excluded-list[b-b1l0r2vyrg] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
}

/* Per-row outcome trailers: the adopted version, and the benign
 * already-adopted note. */
.wep-bulk-adopt-outcome-version[b-b1l0r2vyrg] {
    margin-left: var(--wep-space-1);
    font-size: var(--wep-size-text-sm);
}

.wep-bulk-adopt-outcome-benign[b-b1l0r2vyrg] {
    font-size: var(--wep-size-text-sm);
}

.wep-bulk-adopt-retry-hint[b-b1l0r2vyrg] {
    margin: var(--wep-space-2) 0 0 0;
    font-size: var(--wep-size-text-sm);
}
/* /Components/Catalog/CatalogBulkPromoteRingModal.razor.rz.scp.css */
/*
    Sub-policy provenance-gate override warning (KTD4). A STACKED callout —
    title above body, full modal width — not the page-level flex-row WepBanner,
    which crams a paragraph into two narrow columns inside the narrow modal.
    Uses the amber "detonating"/warn palette (a deliberate, sanctioned override
    is a warning, not the red cve-blocked deny).
*/
.override-warning[b-952phvddqf] {
    border-left: 3px solid var(--wep-state-detonating-rule);
    background: var(--wep-state-detonating-bg);
    color: var(--wep-state-detonating-fg);
    padding: var(--wep-space-3) var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
}

.override-warning-title[b-952phvddqf] {
    font-weight: var(--wep-weight-semi);
    margin-bottom: var(--wep-space-2);
}

.override-warning-body[b-952phvddqf] {
    margin: 0;
}

/*
    Plan 2026-09-11-0056 U8: a release a standing unsigned acceptance COVERS. Informational —
    a covered release is the ordinary path, so it wears a neutral hairline, never the amber
    override treatment above (a normal state is not a warning). The acceptance sentence itself
    wears the global .wep-acceptance-note, the one rule every surface shares.
*/
.wep-promote-acceptance[b-952phvddqf] {
    border-left: 3px solid var(--wep-color-border-2);
    padding: var(--wep-space-3) var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2);
}

.wep-promote-acceptance-body[b-952phvddqf] {
    margin: 0;
    flex-basis: 100%;
    color: var(--wep-color-fg-2);
}
/* /Components/Catalog/CatalogCveCountCell.razor.rz.scp.css */
/* #3743 — A CVE COUNT BREAKS BETWEEN ITS PHRASES, NEVER INSIDE ONE. On
 * /catalog/winget the CVEs cell wraps (CatalogAppList.razor.css,
 * .wep-catalog-cve-cell) so the table fits beside the docked evidence drawer,
 * and a cell that wrapped at every space read "+1" on one line and "possible"
 * on the next. Each phrase ("0/1/0/0", "+1 unscored", "+1 possible",
 * "+3 can't tell") is one of these spans, so the only break opportunities are
 * the spaces around the separators between them. Where the cell does not wrap
 * (the evidence drawer's field list, the kit's nowrap table cells) the rule
 * changes nothing. Mirrored in docs/design/prototypes/_catalog-scoped.css. */
.wep-cve-count-phrase[b-yjxiv9tiw0] {
    white-space: nowrap;
}
/* /Components/Catalog/CatalogEmptyState.razor.rz.scp.css */
/* #1860 (console polish batch 4, part J) — the three catalog-specific tokens
 * this component keeps after the card, title and lead moved onto the kit
 * (.wep-empty-state / .wep-empty-title / .wep-empty-lead). All five were
 * previously defined in NO stylesheet in the repo, which is why the first-run
 * catalog rendered as unstyled body copy. Layout glue only; every value is a
 * kit token (KTD5). No edits to docs/design/prototypes/_shell.css or
 * docs/design/tokens.css.
 */

/* The card is the kit .wep-empty-state; this hook is what the /catalog page
 * pins, and carries only the card's rhythm against the page head above it. */
.wep-catalog-empty[b-dl8ocw9jgi] {
    margin-top: var(--wep-space-4);
}

/* The two next steps. These are ALTERNATIVES ("click Ingest… / or wait for an
 * agent…"), not an ordered procedure, so this is the kit .wep-steps li rhythm
 * with a disc marker rather than .wep-steps' decimal one — centred like the
 * card copy and held to the same 60ch measure as .wep-empty-lead (the
 * CommunityBrokers.razor.css idiom). */
.wep-catalog-empty-steps[b-dl8ocw9jgi] {
    display: inline-block;
    max-width: 60ch;
    margin: var(--wep-space-3) 0 0;
    padding-left: var(--wep-space-6);
    list-style: disc;
    text-align: left;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-3);
}

.wep-catalog-empty-steps li[b-dl8ocw9jgi] {
    padding: var(--wep-space-2) 0;
}

.wep-catalog-empty-learn-more[b-dl8ocw9jgi] {
    margin: var(--wep-space-4) 0 0;
    font-size: var(--wep-size-text-sm);
}
/* /Components/Catalog/CatalogEvidenceFieldList.razor.rz.scp.css */
/* #1860 (console polish batch 4, part I) — the three component-local classes the
 * shared evidence field list has always referenced and no stylesheet defined
 * (Finding 0). Component-scoped, so BOTH call sites — the docked evidence drawer
 * and the package detail page — inherit the same treatment (the R16 parity
 * contract this component exists to hold).
 *
 * Kit tokens only; no edits to docs/design/prototypes/_shell.css or
 * docs/design/tokens.css. The `wep-text-muted` uses that used to sit beside these
 * are gone — they are the kit's own .wep-fg-3 now.
 */

/* The per-component CVE panel is an ADDITIVE surface below the calibrated
   top-level count (Plan 2026-06-08-001 U5, RD6) — one group per component. */
.wep-catalog-component-cve-group[b-2gnrz7clgj] {
    margin-top: var(--wep-space-2);
}

.wep-catalog-component-cve-name[b-2gnrz7clgj] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

/* RD8 honesty line: presence, not exploitability. Reads as a caption under the
   badge it qualifies, at the console's prose measure. */
.wep-catalog-cve-disclaimer[b-2gnrz7clgj] {
    max-width: 60ch;
    margin: var(--wep-space-1) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

/* #2705: the declared manifest switches the install-args resolution drops, under the
   Command row. A flat list at the CVE rows' rhythm; a switch is one unbroken token
   (/mergetasks=!runcode), so it wraps rather than widening the narrow drawer. */
.wep-catalog-dropped-switches[b-2gnrz7clgj] {
    margin: var(--wep-space-1) 0 0;
    padding: 0;
    list-style: none;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    overflow-wrap: anywhere;
}

/* #1860: the probe list moved behind the kit disclosure, under the summary line.
   The disclosure's own frame is the kit's; only the rhythm is local. */
.wep-evidence-probe-disclosure[b-2gnrz7clgj] {
    margin-top: var(--wep-space-2);
}

.wep-evidence-probe-disclosure .wep-evidence-probes[b-2gnrz7clgj] {
    margin: 0;
}

/* #3577 U6 (R20): the re-evaluation note under a pending CVE line, at the console's prose
   measure, and the collapsed can't-tell group, which sits under the line it belongs to. */
.wep-catalog-cve-note[b-2gnrz7clgj] {
    max-width: 60ch;
    margin: var(--wep-space-1) 0 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-catalog-cve-cant-tell[b-2gnrz7clgj] {
    margin-top: var(--wep-space-2);
}

/* The evidence column is narrow: the summary wraps rather than squeezing its label to one
   letter a line, and the label keeps its own width. */
.wep-catalog-cve-cant-tell > .wep-disclosure-summary[b-2gnrz7clgj] {
    flex-wrap: wrap;
}

.wep-catalog-cve-cant-tell > .wep-disclosure-summary > .wep-disclosure-summary-label[b-2gnrz7clgj] {
    flex: none;
}
/* /Components/Catalog/CatalogInstallerVerdictTable.razor.rz.scp.css */
/* #3925 U13 — the version's installers, each with its own verdict (CatalogInstallerVerdictTable).
 *
 * A card in the kit's own vocabulary: a head with the count, one sentence, and a kit table in its wrap. Every
 * value comes from the design tokens; nothing here introduces a colour of its own. Mirrored in
 * docs/design/prototypes/_catalog-scoped.css for the artboard.
 */

.wep-installer-verdicts[b-yllqbf5mlc] {
    margin: var(--wep-space-3) 0;
}

.wep-installer-verdicts-head[b-yllqbf5mlc] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--wep-space-2);
}

.wep-installer-verdicts-meta[b-yllqbf5mlc] {
    color: var(--wep-color-fg-3);
    font-size: var(--wep-size-text-sm);
}

.wep-installer-verdicts-lede[b-yllqbf5mlc] {
    margin: var(--wep-space-1) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}

/* The derived-MSI note sits under the declared type, on its own line. */
.wep-installer-verdicts-sub[b-yllqbf5mlc] {
    display: block;
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-sm);
}
/* /Components/Catalog/CatalogManualAttestModal.razor.rz.scp.css */
/* #3925 U7 — the vouch modal's own layout. Every value is a kit token.
 *
 * A radio keeps its size: the kit's .wep-check-row is a flex row, so a long option squeezed the
 * disabled radio of a refused architecture to a 7px pill. A refused option's explanation sits on
 * its own .wep-form-hint line under the row now; this keeps the radio whole whatever its row holds. */
.wep-check-row .wep-radio[b-5uq6ip68cg] {
    flex-shrink: 0;
}

/* The reason sits one field step under the acceptance preview, never flush against its last line. */
.wep-fieldlist + textarea.wep-input[b-5uq6ip68cg] {
    margin-top: var(--wep-space-3);
}
/* /Components/Catalog/CatalogObservedUnattestedCard.razor.rz.scp.css */
/* #1860 (console polish batch 4, part J) — every `wep-catalog-observed-card*`
 * token this component emits was defined in NO stylesheet in the repo, so the
 * drawer's observed-unattested body rendered as an unstyled heading + label
 * stack. The treatment below is the kit's own drawer-section idiom
 * (_shell.css .wep-catalog-drawer-head / -package / -version / .wep-dl /
 * .wep-section-title) reproduced on this component's class names, three of
 * which the drawer tests pin. Every value is a kit token (KTD5). No edits to
 * docs/design/prototypes/_shell.css or docs/design/tokens.css.
 */

.wep-catalog-observed-card[b-bkevhes9kg] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-4);
}

/* Identity line: the package id and its version share one baseline, the
   .wep-catalog-drawer-head-identity idiom. */
.wep-catalog-observed-card-header[b-bkevhes9kg] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-3);
}

.wep-catalog-observed-card-title[b-bkevhes9kg] {
    margin: 0;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-md);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
    color: var(--wep-color-fg-1);
    /* Long ARP ids wrap inside the drawer rather than widening it. */
    overflow-wrap: anywhere;
}

.wep-catalog-observed-card-version[b-bkevhes9kg] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-catalog-observed-card-publisher[b-bkevhes9kg] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-3);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-1);
}

/* The kit's field label (.wep-field-label / .wep-dl dt) treatment. */
.wep-catalog-observed-card-label[b-bkevhes9kg] {
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    font-weight: var(--wep-weight-medium);
}

/* The two observation metrics as the kit's definition-list grid, laid side by
   side rather than stacked (there are only two, and both are short). */
.wep-catalog-observed-card-metrics[b-bkevhes9kg] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-3) var(--wep-space-6);
    margin: 0;
}

.wep-catalog-observed-card-metrics dt[b-bkevhes9kg] {
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    font-weight: var(--wep-weight-medium);
}

.wep-catalog-observed-card-metrics dd[b-bkevhes9kg] {
    margin: var(--wep-space-1) 0 0;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-1);
}

/* The kit action-row rhythm (flex + gap-2). */
.wep-catalog-observed-card-actions[b-bkevhes9kg] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}
/* /Components/Catalog/CatalogRowPromoteRingVerb.razor.rz.scp.css */
/* #2778: the per-row promote verb sits in the Ring cell after the four ring squares.
 * Layout glue only, every value a kit token; the button itself is the kit's
 * .wep-btn .wep-btn-ghost .wep-btn-sm, the size the kit reserves for per-row actions. */
.wep-row-promote-ring[b-asfj08btbo] {
    display: inline-block;
    margin-left: var(--wep-space-2);
    vertical-align: middle;
}
/* /Components/Catalog/CatalogRowServeControlVerb.razor.rz.scp.css */
/* #1951: the per-row serve-control verb sits in the Ring cell after the promote verb.
 * Layout glue only, every value a kit token; the button itself is the kit's
 * .wep-btn .wep-btn-ghost .wep-btn-sm, the size the kit reserves for per-row actions. */
.wep-row-serve-control[b-ydoynuvbp3] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin-left: var(--wep-space-2);
    vertical-align: middle;
}
/* /Components/Catalog/CatalogServeControl.razor.rz.scp.css */
/* #1951: the serve-control verbs (Withhold / Serve again / Retire). Layout glue only, every value a
 * kit token; the buttons are the kit's .wep-btn family, the inputs .wep-input, the copy .wep-meta. */
.wep-serve-control[b-16hcofiaf7] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
}

.wep-serve-control-verbs[b-16hcofiaf7] {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: var(--wep-space-2);
}

.wep-serve-control-panel[b-16hcofiaf7] {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--wep-space-2);
    flex-basis: 100%;
}

.wep-serve-control-endpoints[b-16hcofiaf7] {
    margin: 0;
    padding-left: var(--wep-space-4);
}
/* /Components/Catalog/CatalogSignedStatement.razor.rz.scp.css */
/* #3485 U5: the "Signed statement" row of the shared evidence field list (drawer and package page alike).
 * Kit tokens only. The row stacks: the facts line, the downloads, the verify line, the component summary. */

.wep-catalog-statement[b-28pzaojv5i] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
    min-width: 0;
}

/* The downloads: one per line, the file name muted beside its link. */
.wep-catalog-statement-downloads[b-28pzaojv5i] {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: var(--wep-size-text-xs);
    line-height: var(--wep-line-snug);
}

/* The copy-paste verify line is one long command: it wraps anywhere rather than widening the drawer. */
.wep-catalog-statement-command[b-28pzaojv5i] {
    display: block;
    margin: var(--wep-space-1) 0;
    padding: var(--wep-space-1) var(--wep-space-2);
    overflow-wrap: anywhere;
    font-size: var(--wep-size-text-2xs);
    background: var(--wep-color-bg-2);
    border-radius: var(--wep-radius-sm);
}

.wep-catalog-statement-summary[b-28pzaojv5i] {
    max-width: 100%;
}

/* The component summary table scrolls inside its disclosure on a narrow drawer. flex-shrink: 0 is its floor
   (KTD3): a clipping box in a column flex must never be shrunk to nothing. */
.wep-catalog-statement-components[b-28pzaojv5i] {
    display: block;
    flex-shrink: 0;
    max-width: 100%;
    overflow-x: auto;
    font-size: var(--wep-size-text-2xs);
}

/* Only a revoked signing key wears an attention colour: a current or retired one is normal. */
.wep-catalog-statement-revoked[b-28pzaojv5i] {
    color: var(--wep-color-danger-text);
}
/* /Components/Catalog/CatalogVersionPromoteRing.razor.rz.scp.css */
/* #3629 — the single-version promote on the package page's Ring promotion card.
 *
 * The page's action-row and result-message rhythm (CatalogPackage.razor.css's .wep-pkg-actions and
 * .wep-pkg-msg), stated here because a plain scoped rule reaches only the component that declares it:
 * worn from this component, the page's classes would render bare. Every value is a kit token; the
 * message's colour comes from the kit's .wep-ok / .wep-error.
 */
.wep-version-promote[b-2u2vvk2or8] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-3);
}

.wep-version-promote-msg[b-2u2vvk2or8] {
    margin: var(--wep-space-3) 0 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}
/* /Components/Catalog/CatalogVersionRollbackRing.razor.rz.scp.css */
/* #3647 — the single-version ring rollback on the package page's Ring promotion card.
 *
 * The same action-row and result-message rhythm as the promote beside it (CatalogVersionPromoteRing.razor.css),
 * stated here because a scoped rule reaches only the component that declares it. Every value is a kit token;
 * the message's colour comes from the kit's .wep-ok / .wep-error.
 */
.wep-version-rollback[b-qaeny8ekda] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-3);
}

.wep-version-rollback-msg[b-qaeny8ekda] {
    margin: var(--wep-space-3) 0 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}
/* /Components/Catalog/DivergenceFindingCard.razor.rz.scp.css */
/* #2505 — the spacing wrapper of the "not on the audit trail" notice a revoke whose record was
   lost renders directly under its sticky result line: the banner is spaced like the card's other
   blocks, never pressed against the line it qualifies. */
.wep-waiver-banner[b-e0tqojtkhi] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Catalog/LaunchesAppOnInstallNote.razor.rz.scp.css */
/* #2704 — the launches-app-on-install note's OWN sheet.
 *
 * It re-declares the console's explanatory-note measure rather than inheriting
 * it, because a Blazor scoped rule reaches only its own component: the package
 * page's `.wep-pkg-note` cannot reach into a child (the recorded `::deep`
 * lesson; SystemHollowWithheldNote.razor.css is the precedent). Every value is
 * a kit token. `.wep-disclosure` is inherited from _shell.css, not redefined.
 */

.wep-launch-on-install[b-w76gnbwq4r] {
    margin: var(--wep-space-2) 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-3);
}

.wep-launch-on-install-line[b-w76gnbwq4r] {
    margin: 0 0 var(--wep-space-1) 0;
}

/* The badge: a quiet bordered mono label, deliberately NOT a status pill — an
   inferred installer habit is information, not an attention state. */
.wep-launch-on-install-badge[b-w76gnbwq4r] {
    display: inline-block;
    padding: 0 var(--wep-space-1);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-xs);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
}

.wep-launch-on-install-paths[b-w76gnbwq4r] {
    margin: 0 0 var(--wep-space-1) 0;
    padding-left: var(--wep-space-4);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    overflow-wrap: anywhere;
}

.wep-launch-on-install-why[b-w76gnbwq4r] {
    margin-top: var(--wep-space-2);
}
/* /Components/Catalog/ListSlots/ManagerSubscribeSlot.razor.rz.scp.css */
/* The post-subscribe status line's TYPOGRAPHY. The colour is the kit's `.wep-ok`
 * role; the mono face and the top margin are this line's own. */
.wep-subscribe-flash[b-hd2v3f11hm] {
    margin: var(--wep-space-3) 0 0;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-sm);
}

/* #2904 — the note that says why a Chocolatey version serves or not, declaration for
 * declaration the WingetListPanels.razor.css block (#1061 U5): a scoped rule reaches
 * only its own component, so the winget copy never styles this one. */
.wep-unverified-indicator[b-hd2v3f11hm] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin: var(--wep-space-2) 0;
    max-width: 72ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}
/* /Components/Catalog/ListSlots/WingetListPanels.razor.rz.scp.css */
/* #1061 U5 — the standing "unverified deployments" indicator above the winget list
 * (#3925 U13: it counts installers). It rides .wep-fg-3 for colour; this only lays the
 * pill and its sentence on one row, at prose size and measure. */
.wep-unverified-indicator[b-h9b5kgwiwc] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin: var(--wep-space-2) 0;
    max-width: 72ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

/* The pill is WepStatusPill's own element, so the scoped rule reaches it through ::deep. */
.wep-unverified-indicator[b-h9b5kgwiwc]  .wep-pill {
    flex: none;
}
/* /Components/Catalog/PackageActions/CatalogPackageActionsMenu.razor.rz.scp.css */
/* #3742 U6 — the package page's Actions menu: a disclosure, its list anchored under the button.
 * The list is drawn after the approved board's menu (catalog-package-redesign.html at 66eb5b0b1): 420px,
 * the pop shadow, group labels in the kit's section-title face, two-line items. #4256: it anchors to the
 * button's RIGHT edge, as the drawing's does: the button ends the title's row now, at the head's right, and
 * a list anchored at its left edge would run off the window. */
.wep-pkg-actions[b-zk8xu61hdk] {
    position: relative;
    display: inline-flex;
}

/* An outside click closes the menu: while it is open this scrim covers the viewport beneath the list and takes
 * the click. It sits on the popover tier, above a drawer, so a click in the drawer closes the menu first. */
.wep-pkg-actions-scrim[b-zk8xu61hdk] {
    position: fixed;
    inset: 0;
    z-index: var(--wep-z-popover);
}

/* Absolutely positioned, so out of flow: the overflow here clips nothing a flex parent would shrink. Every verb
 * listed at once runs taller than a 900px window, so the list scrolls inside its own bound. */
.wep-pkg-actions-list[b-zk8xu61hdk] {
    position: absolute;
    top: calc(100% + var(--wep-space-1));
    right: 0;
    z-index: var(--wep-z-popover);
    width: 420px;
    max-width: calc(100vw - 2 * var(--wep-space-4));
    max-height: calc(100vh - 200px);
    overflow-y: auto;
    padding: var(--wep-space-2) 0;
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    box-shadow: var(--wep-shadow-pop);
}

.wep-pkg-actions-heading[b-zk8xu61hdk] {
    margin: 0;
    padding: var(--wep-space-3) var(--wep-space-4) var(--wep-space-1);
}

/* height: auto, because an item is a button and the :where(button) baseline in _shell.css fixes every button at
 * 28px: an item held there fits its label and draws its sub-text over the next item (the #2905 shape).
 * PackageActionsMenuItemHeightDesignTests pins it. */
.wep-pkg-actions-item[b-zk8xu61hdk] {
    display: block;
    width: 100%;
    height: auto;
    padding: var(--wep-space-2) var(--wep-space-4);
    border: 0;
    background: none;
    font: inherit;
    color: var(--wep-color-fg-1);
    text-align: left;
    cursor: pointer;
}

.wep-pkg-actions-item:hover[b-zk8xu61hdk],
.wep-pkg-actions-item:focus-visible[b-zk8xu61hdk] {
    background: var(--wep-color-bg-2);
}

/* A verb the version's state does not allow: listed, muted, with its reason as the sub-text. */
.wep-pkg-actions-item[aria-disabled="true"][b-zk8xu61hdk] {
    color: var(--wep-color-fg-3);
    cursor: default;
}

.wep-pkg-actions-item[aria-disabled="true"]:hover[b-zk8xu61hdk] {
    background: none;
}

.wep-pkg-actions-label[b-zk8xu61hdk] {
    display: block;
}

/* The sub-text is a sentence (the verb's state, the reason it is disabled, or the grant it lacks), so it is prose
 * at 14px under ADR 2026-10-12-001; the approved board drew it at 12px before that ADR. */
.wep-pkg-actions-sub[b-zk8xu61hdk] {
    display: block;
    color: var(--wep-color-fg-3);
    font-size: var(--wep-size-text-sm);
}
/* /Components/Catalog/PackageCoverageCard.razor.rz.scp.css */
/* #2477 (plan 2026-10-07-1806 U17; #3966) — the coverage card's verbs, laid out on one wrapping line as the grant
 * page's Coverage section lays a row's verbs out (UpdateGrantCoverageSection.razor.css, the same declarations). The
 * card's frame and head are the page's kit card; its lines are the kit's .wep-meta; each confirmation carries its own
 * scoped sheet. */
.wep-coverage-verbs[b-7w8h11p6p9] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}
/* /Components/Catalog/PackageHeader/PackageLeadBlock.razor.rz.scp.css */
/* #3742 U10 (R2), #4256 — the lead block under the package page's pinned row: the reasons line, the rollout strip and
 * the Needs-you slot (PackageNeedsYouBanner.razor.css draws the item), as the approved drawing has them
 * (catalog-package-redesign.html at 605401896: .rd-reasons, .rd-rollout, .rd-ring). Every size is a type token at or
 * above the 12px floor, and nothing here clips. The status icons are the page's (.wep-pkg-icon and its four tones, in
 * CatalogPackage.razor.css). Mirrored for the artboards in docs/design/prototypes/_package.css (#887), declaration for
 * declaration; PackageHeadDesignTests holds the two together. */
.wep-pkg-lead[b-4t9ep6k6ln] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    margin: var(--wep-space-4) 0 0;
}

/* The reasons line (R4): one item per verdict leg, then the markers that are never green, each behind the status icon
 * of its tone (a failure's in the foundation's fail tone). Prose at 14px in the secondary text colour, whatever the
 * tone: the icon and the words carry it. */
.wep-pkg-reasons[b-4t9ep6k6ln] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2) var(--wep-space-6);
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: var(--wep-size-text-md);
    color: var(--wep-color-fg-2);
}

.wep-pkg-reason[b-4t9ep6k6ln] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
}

/* The rollout strip (R5): ONE joined bar of four segments. The border is the strip's, and a segment has only the rule
 * to the segment after it. Nothing clips here (#3742 KTD8), so the end segments round their own outer corners to the
 * strip's. The drawing leaves a step more room above the strip than the block's gap gives. */
.wep-pkg-strip[b-4t9ep6k6ln] {
    display: flex;
    align-items: stretch;
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
}

.wep-pkg-reasons + .wep-pkg-strip[b-4t9ep6k6ln] {
    margin-top: var(--wep-space-1);
}

.wep-pkg-ring[b-4t9ep6k6ln] {
    flex: 1;
    min-width: 0;
    padding: var(--wep-space-2) var(--wep-space-3);
    border-right: 1px solid var(--wep-color-border-1);
    background: var(--wep-color-bg-0);
}

.wep-pkg-ring:first-child[b-4t9ep6k6ln] {
    border-top-left-radius: inherit;
    border-bottom-left-radius: inherit;
}

.wep-pkg-ring:last-child[b-4t9ep6k6ln] {
    border-right: 0;
    border-top-right-radius: inherit;
    border-bottom-right-radius: inherit;
}

/* A ring's name: the page's sans, semi-bold, behind its 14px status icon. Under it one muted line at the label size:
 * since when, how many endpoints are on this version, or what the ring waits for. Plain words: no uppercase, no mono. */
.wep-pkg-ring-name[b-4t9ep6k6ln] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
}

.wep-pkg-ring-meta[b-4t9ep6k6ln] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* The state grounds, as drawn. A ring that is done wears the promoted ground, and so does one kept armed as the
 * rollback target; one still in its soak keeps the plain ground. A stall wears the warn ground inside a rule of the
 * attention ramp. A halted ring takes the stall's form on the alarm ramp, and a ring a policy decision holds takes it
 * on the rolled-back ramp, so each stays its own state. A ring still waiting has a muted name. */
.wep-pkg-ring.is-done[b-4t9ep6k6ln],
.wep-pkg-ring.is-armed[b-4t9ep6k6ln] {
    background: var(--wep-state-promoted-bg);
}

.wep-pkg-ring.is-stalled[b-4t9ep6k6ln] {
    background: var(--wep-color-warn-bg);
    box-shadow: inset 0 0 0 1px var(--wep-state-detonating-rule);
}

.wep-pkg-ring.is-halted[b-4t9ep6k6ln] {
    background: var(--wep-state-cveblocked-bg);
    box-shadow: inset 0 0 0 1px var(--wep-state-cveblocked-rule);
}

.wep-pkg-ring.is-halted .wep-pkg-icon[b-4t9ep6k6ln] {
    color: var(--wep-state-cveblocked-fg);
}

.wep-pkg-ring.is-blocked[b-4t9ep6k6ln] {
    background: var(--wep-state-rolledback-bg);
    box-shadow: inset 0 0 0 1px var(--wep-state-rolledback-rule);
}

.wep-pkg-ring.is-blocked .wep-pkg-icon[b-4t9ep6k6ln] {
    color: var(--wep-state-rolledback-fg);
}

.wep-pkg-ring.is-pending .wep-pkg-ring-name[b-4t9ep6k6ln] {
    color: var(--wep-color-fg-3);
}

/* The line under the strip when the flight store could not be read: muted, never an attention colour. */
.wep-pkg-strip-unavailable[b-4t9ep6k6ln] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}
/* /Components/Catalog/PackageHeader/PackageNeedsYouBanner.razor.rz.scp.css */
/* #3742 U10 (R6, R23), #4256 — a "Needs you" item, as the approved drawing has it (catalog-package-redesign.html at
 * 605401896, .rd-needs): a box with a dashed border in the ramp's rule colour on the ramp's ground; a status icon; a
 * body of at most 75 characters; and the item's buttons to the right of the body. Three columns, packed at the box's
 * start: the icon, the body, the buttons right after it. The text inside is the page's own (14px, the primary colour):
 * the ramp is the border, the ground and the icon. Mirrored for the artboards in docs/design/prototypes/_package.css (#887), declaration for declaration;
 * PackageHeadDesignTests holds the two together. */

/* Attention is the box's own rule: the ramp a halt, a failure, a lapsed waiver, a trust prompt, a held flip and a
 * withdrawal notice wear. Its rule colour is the attention ramp's own. */
.wep-pkg-needs[b-3ridorcnfa] {
    display: grid;
    grid-template-columns: auto minmax(0, 75ch) auto;
    justify-content: start;
    column-gap: var(--wep-space-3);
    align-items: start;
    padding: var(--wep-space-3) var(--wep-space-4);
    border: 1px dashed var(--wep-state-detonating-rule);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-warn-bg);
    font-size: var(--wep-size-text-md);
}

/* An alarm: withdrawn upstream on an attested version, a CVE deny match, an open HIGH divergence. */
.wep-pkg-needs.is-alarm[b-3ridorcnfa] {
    border-color: var(--wep-state-cveblocked-rule);
    background: var(--wep-state-cveblocked-bg);
}

/* A decision already taken that waits for the sweep: the kit's neutral advisory pair, because it is not a state of
 * the version and not an instruction. */
.wep-pkg-needs.is-advisory[b-3ridorcnfa] {
    border-color: var(--wep-color-accent-1);
    background: var(--wep-color-accent-bg);
}

/* Two items in a row (the needs-you drawer) are two boxes. */
.wep-pkg-needs + .wep-pkg-needs[b-3ridorcnfa] {
    margin-top: var(--wep-space-3);
}

/* The status icon sits on the first line's middle, as the drawing's does, in the ramp's text colour. */
.wep-pkg-needs-icon[b-3ridorcnfa] {
    margin-top: 3px;
    color: var(--wep-color-warn-fg);
}

.wep-pkg-needs.is-alarm .wep-pkg-needs-icon[b-3ridorcnfa] {
    color: var(--wep-state-cveblocked-fg);
}

.wep-pkg-needs.is-advisory .wep-pkg-needs-icon[b-3ridorcnfa] {
    color: var(--wep-color-accent-text);
}

/* The body: a semi-bold first line, the item's text under it, then its detail line. A long token (a failure's recorded
 * detail) breaks inside the body instead of widening it. */
.wep-pkg-needs-body[b-3ridorcnfa] {
    min-width: 0;
    overflow-wrap: anywhere;
}

.wep-pkg-needs-title[b-3ridorcnfa] {
    font-weight: var(--wep-weight-semi);
}

.wep-pkg-needs-body > p[b-3ridorcnfa] {
    margin: 0;
}

.wep-pkg-needs-body > p + p[b-3ridorcnfa] {
    margin-top: var(--wep-space-1);
}

/* The buttons, to the right of the body: the kit's small ghost and secondary buttons. */
.wep-pkg-needs-actions[b-3ridorcnfa] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}

/* #4255 — stacked, for the needs-you drawer: no third column, and no 75ch cap on a body narrower than that already.
 * The body takes every column but the icon's, and the buttons a row of their own under it, pulled left by their own
 * padding so that their words start where the text above them starts. */
.wep-pkg-needs.is-stacked[b-3ridorcnfa] {
    grid-template-columns: auto minmax(0, 1fr);
}

.wep-pkg-needs.is-stacked .wep-pkg-needs-actions[b-3ridorcnfa] {
    grid-column: 2;
    margin: var(--wep-space-2) 0 0 calc(-1 * var(--wep-space-2));
}
/* /Components/Catalog/PackageTabs/CatalogPackageCustody.razor.rz.scp.css */
/* #3742 U12, #4256 — the Chain of custody tab (CatalogPackageCustody.razor), built to the approved drawing
 * (catalog-package-redesign.html at 605401896): its `.rd-chain`, `.rd-step*` and `.rd-chain-foot` rules under the
 * page's names, with the drawing's values. Every rule here is mirrored in docs/design/prototypes/_package.css,
 * declaration for declaration (#887): a board opened over file:// draws the plain selectors there. The lead
 * sentence (.wep-pkg-lede), mono (.wep-pkg-mono), the links and the icon's wrapper and tones are the page's shared
 * foundation, which reaches this component from CatalogPackage.razor.css.
 *
 * Every size is a type token at or above the 12px floor (ADR 2026-10-12-001), and no rule clips. */

/* The timeline (.rd-chain): one dated step per line, oldest first, with no card around it. It fills the tab: the
 * drawing's 1100px measure on the list went with the page's content cap on 2026-10-16 (Marc). A step keeps the 75ch
 * reading measure and its proof follows it (the step rule below), so a wide window widens the row and never a line of
 * text, and never the distance from a step to its proof. */
.wep-pkg-custody[b-9bdlnwpzk6] {
    list-style: none;
    margin: var(--wep-space-6) 0 0;
    padding: 0;
}

/* A step (.rd-step), four parts in a row: when, the status mark on the joining line, the step, its proof. Each
 * step is its own grid, so the first two columns are fixed widths and line up down the list: 150px holds a date to
 * the minute in the mono face at 12px (16 characters, 115px), and 28px holds the 20px mark. The space under a step
 * is its padding, so the joining line can run through it.
 *
 * The step's column is at most the reading measure, 75ch (the step sentence's own), and the proof's column follows it:
 * a proof sits beside the step it proves, not at the far edge of a row that fills the tab (Marc, 2026-10-16). The
 * column still lines up down the list, and the tracks pack to the start, so the width past the proof stays empty
 * rather than stretching the proof's cell to the edge. */
.wep-pkg-custody > li[b-9bdlnwpzk6] {
    display: grid;
    grid-template-columns: 150px 28px minmax(0, 75ch) auto;
    justify-content: start;
    gap: var(--wep-space-3);
    position: relative;
    padding-bottom: var(--wep-space-5);
}

/* When (.rd-step-when): the date in mono on a line of its own, and the clock under it. Right-aligned, against the
 * line. The date is an identifier, set in the mono face at the size of its column (the drawing's
 * `.rd-step-when .rd-mono`). */
.wep-pkg-custody-when[b-9bdlnwpzk6] {
    padding-top: 2px;
    font-size: var(--wep-size-text-xs);
    text-align: right;
    color: var(--wep-color-fg-3);
}

.wep-pkg-custody-date[b-9bdlnwpzk6] {
    display: block;
    font-family: var(--wep-font-mono);
    color: var(--wep-color-fg-2);
}

/* The status mark's column (.rd-step-dot), and the line that joins a step to the next one: from under the mark,
 * through the step's own padding, to the top of the next step. The last line of the list joins nothing. */
.wep-pkg-custody-rail[b-9bdlnwpzk6] {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: flex-start;
    width: 28px;
}

.wep-pkg-custody-rail[b-9bdlnwpzk6]::after {
    content: "";
    position: absolute;
    top: 24px;
    bottom: calc(-1 * var(--wep-space-5));
    width: 1px;
    background: var(--wep-color-border-2);
}

.wep-pkg-custody > li:last-child .wep-pkg-custody-rail[b-9bdlnwpzk6]::after {
    display: none;
}

/* The step: a semi-bold title (.rd-step-title), one sentence at the reading measure (.rd-step-text), and one small
 * muted line (.rd-step-by). The words of a status mark follow the title in the regular weight, as the drawing's
 * "did not complete" does. A value a record holds wraps inside the step whatever it is. */
.wep-pkg-custody-body[b-9bdlnwpzk6] {
    min-width: 0;
    overflow-wrap: anywhere;
}

.wep-pkg-custody-title[b-9bdlnwpzk6] {
    font-weight: var(--wep-weight-semi);
}

.wep-pkg-custody-state[b-9bdlnwpzk6] {
    font-weight: var(--wep-weight-regular);
    color: var(--wep-color-fg-3);
}

.wep-pkg-custody-text[b-9bdlnwpzk6] {
    max-width: 75ch;
    color: var(--wep-color-fg-2);
}

.wep-pkg-custody-by[b-9bdlnwpzk6] {
    margin-top: 2px;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* The step that has not happened yet (.rd-step.is-pending): its words are muted, as its mark is. */
.wep-pkg-custody > li[data-mark="pending"] .wep-pkg-custody-title[b-9bdlnwpzk6],
.wep-pkg-custody > li[data-mark="pending"] .wep-pkg-custody-text[b-9bdlnwpzk6] {
    color: var(--wep-color-fg-3);
}

/* The proof's cell (.rd-step-proof), on the title's line: the link named by what it opens, or the words that stand
 * for a proof that is not there yet. A step with no proof leaves it empty. */
.wep-pkg-custody-proof[b-9bdlnwpzk6] {
    padding-top: 1px;
    white-space: nowrap;
}

/* The foot under the timeline (.rd-chain-foot): the record behind the steps, the control that shows every step,
 * and a family's marker (R15). Each line starts where the steps' words start: past the date column, the mark's
 * column and the two gaps between them. A fact about the record, not an alarm: the muted ink. */
.wep-pkg-custody-foot[b-9bdlnwpzk6] {
    margin: var(--wep-space-2) 0 0 calc(150px + 28px + 2 * var(--wep-space-3));
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

/* The tab's one line while its read has not answered, or when it could not run: no timeline is drawn, so the line
 * starts at the lead sentence's edge. */
.wep-pkg-custody-status[b-9bdlnwpzk6] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}
/* /Components/Catalog/PackageTabs/CatalogPackageCustodyDrawer.razor.rz.scp.css */
/* #3742 U12, #4256 — the drawer bodies the Chain of custody tab opens (CatalogPackageCustodyDrawer.razor), as
 * docs/design/prototypes/catalog-package-custody.html draws them. Mirrored in docs/design/prototypes/_package.css,
 * declaration for declaration (#887). The lists themselves are the page's shared key-value list (.wep-pkg-kv), which
 * reaches this component from CatalogPackage.razor.css: a plain label and its value per row, a value that wraps
 * inside its cell and breaks between its words.
 *
 * The raw event log draws one list per provenance row; a rule between two rows keeps them apart. */
.wep-pkg-custody-row + .wep-pkg-custody-row[b-ord3n9gqwk] {
    margin-top: var(--wep-space-4);
    padding-top: var(--wep-space-3);
    border-top: 1px solid var(--wep-color-border-1);
}
/* /Components/Catalog/PackageTabs/CatalogPackageEvidence.razor.rz.scp.css */
/* #4256 — the Evidence tab (CatalogPackageEvidence.razor), to the approved drawing: four short cards in the page's
 * two-column grid. The cards, their titles, the plain table, the key-value list, the file list, the code block and
 * the links are the page's shared foundation (CatalogPackage.razor.css); what follows is the little this tab alone
 * needs. Each rule is rooted at the tab's own root and reaches the cards a child component draws (PackageSignedFiles).
 * Mirrored in docs/design/prototypes/_package.css, declaration for declaration (#887). */

/* The links in a card's head that open the records the card belongs to: at the head's right end, on its baseline. */
.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-evidence-links {
    display: inline-flex;
    flex-wrap: wrap;
    gap: var(--wep-space-1) var(--wep-space-4);
    margin-left: auto;
}

/* What stands under the runs table: the link that lists the version's other runs. */
.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-evidence-foot {
    margin: var(--wep-space-3) 0 0;
}

/* "Verify offline", the label over the command: one step-4 under the file list, as the drawing sets it. */
.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-evidence-verify {
    margin-top: var(--wep-space-4);
}

/* A table of this tab keeps what does not run long to one line: a time, a scope, a count, an id, a pill. The cell
 * that can run long — a failed run's outcome, a CVE's match — is the one that wraps. */
.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-table tbody td.wep-pkg-evidence-keep {
    white-space: nowrap;
}

/* A row's second line, across the table's width: a failed run's stored detail, a CVE's title. The row above it gives
 * up its rule and its bottom padding, so the two read as one row; the second line is muted, as the drawing mutes
 * what qualifies a fact. Each selector passes through the table's own rows, to out-rank the shared table's cell
 * rule (CatalogPackage.razor.css). */
.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-table tbody tr.wep-pkg-evidence-lead td {
    padding-bottom: 0;
    border-bottom: 0;
}

.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-table tbody tr.wep-pkg-evidence-second td {
    padding-top: var(--wep-space-1);
    color: var(--wep-color-fg-3);
}

/* A card that ends on its sentence (no signed statement; no known vulnerability) ends there: the sentence's own
 * bottom margin is for what follows it. */
.wep-pkg-evidence[b-nuch0odfo2]  .wep-pkg-card > .wep-pkg-lede:last-child {
    margin-bottom: 0;
}
/* /Components/Catalog/PackageTabs/CatalogPackageEvidenceDrawer.razor.rz.scp.css */
/* #4256 — the drawer bodies the Evidence tab opens (CatalogPackageEvidenceDrawer.razor): one column at 14px on the
 * page's key-value list, which is the shared foundation's (CatalogPackage.razor.css). Each rule is rooted at the
 * record's root and reaches what its child components draw. Mirrored in docs/design/prototypes/_package.css,
 * declaration for declaration (#887). */

/* A record sets the type its lists inherit: prose at 14px on the relaxed line, as a tab panel does. */
.wep-pkg-evidence-record[b-hpg6rmrxkf] {
    font-size: var(--wep-size-text-md);
    line-height: var(--wep-line-relaxed);
}

/* A part of a record: a plain heading in the record's own size over the list it names. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-pkg-evidence-part {
    margin: var(--wep-space-5) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-md);
    font-weight: var(--wep-weight-semi);
}

/* A sentence of a record that stands on its own under a list. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-pkg-evidence-say {
    margin: var(--wep-space-3) 0 0;
    max-width: 75ch;
}

/* A bundled component's name over its CVEs. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-pkg-evidence-component {
    margin-top: var(--wep-space-4);
    color: var(--wep-color-fg-2);
}

/* The shared evidence field list, in the statement record. It sits under the record's own list, behind a rule, and
 * its labels are plain words in the record's size: the kit sets them as a small uppercase eyebrow, which is the
 * /catalog drawer's look and not this page's. Its values, and the order of its fields, are the component's own. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-catalog-drawer-fields {
    margin-top: var(--wep-space-4);
    padding-top: var(--wep-space-4);
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-catalog-drawer-fields dt {
    font-size: var(--wep-size-text-sm);
    letter-spacing: normal;
    text-transform: none;
}

/* The installers table is a kit card with a title of its own. In the drawer the record is its frame and the drawer's
 * title names it, so the card's frame and its title step back; its count, its sentence and its table stay. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-installer-verdicts {
    margin: 0;
    padding: 0;
    border: 0;
    background: none;
}

.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-installer-verdicts-head .wep-section-title {
    display: none;
}

/* #1960 PR 8: a Chocolatey or Scoop row's table fits the drawer. The kit keeps every table cell on one line, and its
 * installer type ("downloads from the vendor") and its "Verified on" ("with Chocolatey 2.4.3") each carry a second
 * line, which pushed the table past the drawer's edge at 1440, behind a sideways scroll. A cell's first line ("x64
 * sandbox", "chocolatey", "machine", the pill) stays whole, as the kit draws it: only the second line wraps. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-installer-verdicts-sub {
    white-space: normal;
}

/* With every first line whole the table is still 3px too wide, so the gap after each of its columns narrows from 12px
 * to 10px; 11px would fit with a pixel to spare. A cell keeps its left padding, so each value still starts under its
 * column's name. A winget row's table carries no second line, so this reaches only a table that does. */
.wep-pkg-evidence-record[b-hpg6rmrxkf]  .wep-installer-verdicts .wep-table:has(.wep-installer-verdicts-sub) td {
    padding-right: calc(var(--wep-space-3) - 2px);
}
/* /Components/Catalog/PackageTabs/CatalogPackageOverview.razor.rz.scp.css */
/* #3742 U11 (R12, R20), #4256 — the package page's Overview tab. Its two columns, its cards, their sentence-case
 * titles, the icon rows of "Why it is safe to deploy" and "Compared to", and the fact lists of "How it is deployed"
 * and "On the fleet" are the page's shared foundation (`.wep-pkg-grid`, `.wep-pkg-card`, `.wep-pkg-card-title`,
 * `.wep-pkg-rows` and `.wep-pkg-facts` in CatalogPackage.razor.css, rooted at `.wep-pkg-page ::deep`), which every
 * tab draws with: the root wears `wep-pkg-grid` beside its own name. What is left here is the tab's own. Nothing here
 * clips. Mirrored for the artboards in docs/design/prototypes/_package.css (#887), declaration for declaration. */

/* A card head's link ("Open 1.3.315" on "Compared to") sits at the head's right edge, on the title's baseline, where
 * a row's link to its proof sits under it. The approved drawing's head holds a title and a note; the link to the
 * compared version is the page's own (#3742 U11), so it takes the column the rows' links already make. */
.wep-pkg-overview .wep-pkg-card-head > .wep-pkg-more[b-3zy2liuk8l] {
    margin-left: auto;
}
/* /Components/Catalog/PromoteReadBackChecklist.razor.rz.scp.css */
/*
 * PromoteReadBackChecklist — production-tier promote evidence read-back (Plan
 * 2026-06-25-006 U2). Layout only: the per-package groups sit in a height-bounded
 * scroll region so the modal's typed-confirm input + submit stay visible regardless
 * of fact count (KTD6 — keeps the acknowledge→arm relationship on screen). All colors
 * come from the --wep-* token contract — no hex literals (§11). NO motion is declared
 * (design.md three-motion rule): arming is the existing reactive CanSubmit recompute,
 * not a transition.
 */

.wep-readback[b-fipwai79pk] {
    display: block;
    min-width: 0;
}

/* Height-bounded so the phrase input below the checklist stays on screen for the
 * common 1–10 row case; longer selections scroll within the region (layout only). */
.wep-readback-scroll[b-fipwai79pk] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    max-height: 14rem;
    overflow-y: auto;
}

/* One labelled group per package (R6). */
.wep-readback-group[b-fipwai79pk] {
    margin: 0;
    padding: var(--wep-space-3);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
}

.wep-readback-group legend[b-fipwai79pk] {
    padding: 0 var(--wep-space-1);
}

/* One acknowledge-check per fact (the BaselineGateWaiverCard checkbox-row mechanic). */
.wep-readback-fact[b-fipwai79pk] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-2);
    padding: var(--wep-space-1) 0;
}

.wep-readback-fact input[b-fipwai79pk] {
    flex-shrink: 0;
}

/* Red (unfavorable) facts: tone via the danger token AND a textual marker in the
 * markup — never color alone (a11y / no-color-alone). */
/* #1759 completeness — the fact line is prose, so it takes the danger TEXT
   role; --wep-color-danger is the non-text danger colour (rails, borders) and
   measures 4.38:1 at best as a foreground in light. */
.wep-readback-fact-red .wep-readback-fact-line[b-fipwai79pk] {
    color: var(--wep-color-danger-text);
}

/* #1759 completeness — the flagged marker is the no-color-alone TEXT affordance
   for colour-blind and screen-reader operators. It carried the fill token, so
   the very marker that exists to not rely on colour was itself below AA. */
.wep-readback-flag[b-fipwai79pk] {
    flex-shrink: 0;
    color: var(--wep-color-danger-text);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: 600;
}
/* /Components/Catalog/PublisherTrustCard.razor.rz.scp.css */
/* #2504: the "not on the audit trail" notice after a waiver revoke or an allowlist remove whose
   record was lost — a Warn banner in its own spacing wrapper (the CommunityUsers / PolicyGrants /
   emergency-stop / update-grant shape), rendered directly with the state it qualifies. A WepBanner
   carries its own frame; the wrapper only spaces it from that state and the content around it.
   Every value is a kit token. */
.wep-trust-banner[b-njz61jpsaa] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Catalog/UnsignedAcceptanceCard.razor.rz.scp.css */
/* #2504: the "not on the audit trail" notice after an acceptance revoke whose record was lost —
   a Warn banner in its own spacing wrapper (the CommunityUsers / PolicyGrants / emergency-stop /
   update-grant shape), rendered directly under the acceptance's fields, the state it qualifies.
   A WepBanner carries its own frame; the wrapper only spaces it. Every value is a kit token. */
.wep-trust-banner[b-0u5115l4jy] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Catalog/UnverifiedInstallerAcceptanceCard.razor.rz.scp.css */
/* #3925 U7: the "not on the audit trail" notice after an acceptance revoke whose record was lost — the
   UnsignedAcceptanceCard shape: a Warn banner in its own spacing wrapper. A WepBanner carries its own
   frame; the wrapper only spaces it. Every value is a kit token. */
.wep-trust-banner[b-sax39xwd7e] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Catalog/UnverifiedInstallerDeploymentAcceptanceControl.razor.rz.scp.css */
/* #3925 U7 — the deployment-wide control's own layout. Every value is a kit token.
 * The line that says why it cannot be turned on (a broker is enrolled) sits one field step under
 * the field list, never flush against it. */
.wep-fieldlist + .wep-meta[b-np5uj5scaa] {
    margin-top: var(--wep-space-3);
}
/* /Components/Catalog/UpdateHaltQueue.razor.rz.scp.css */
/* Plan 2026-09-04-0815 U4 (R7, KTD7) — the halts queue's closed-rung empty state.
 *
 * One dashed .wep-empty-state card (kit, _shell.css) serves every "not moving" arm;
 * this modifier is its ATTENTION variant, worn ONLY by a configured, consented pipeline
 * that still cannot move versions — and by an unreadable posture (over-warn, never
 * hide). The not-configured and not-consented arms are the fleet's normal states and
 * never wear it. Colour is the kit's warn ramp: no new token, no new pill language.
 */
.wep-empty-state-attention[b-rsmo5fxyfv] {
    border-style: solid;
    border-color: var(--wep-color-warn-fg);
}

.wep-empty-state-attention .wep-empty-title[b-rsmo5fxyfv] {
    color: var(--wep-color-warn-fg);
}

/* #3350: the latched queue and the dismissed-ingest list are stacks of .wep-card rows. The
 * cards are the list's visual unit, so the browser's default disc marker (and the 40px inline
 * padding that holds it) is reset — it drew a stray bullet left of every card's border. The
 * values are the artboard's .cat-queue-list (catalog-update-halts.html), verbatim. */
.wep-halt-queue-list[b-rsmo5fxyfv] {
    list-style: none;
    margin: var(--wep-space-4) 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
}

/* Plan 2026-09-07-1635 U6 — the composed explanation, the two tenses, and the four
 * verb states. No new token and no new colour language: everything below is the kit's
 * existing type scale, spacing scale and fg / warn ramps.
 */

/* The lead is the row's primary sentence — the one thing an operator reads if they
 * read nothing else. It is body-weight, not mono: the machine token is downstairs. */
.wep-halt-lead[b-rsmo5fxyfv] {
    margin: var(--wep-space-3) 0 0;
    color: var(--wep-color-fg-1);
    line-height: var(--wep-line-relaxed);
}

/* KTD3: the two tenses are two REGIONS, each with a visible label. The label is what
 * stops "what was true when this latched" and "what the store says now" reading as one
 * paragraph, which is the whole of R14. */
.wep-halt-tense[b-rsmo5fxyfv] {
    margin-top: var(--wep-space-3);
    padding-left: var(--wep-space-3);
    border-left: 2px solid var(--wep-color-border-1);
}

.wep-halt-tense-label[b-rsmo5fxyfv] {
    margin: 0 0 var(--wep-space-1);
    font-size: var(--wep-size-text-2xs);
    font-weight: var(--wep-weight-medium);
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--wep-color-fg-3);
}

/* The row's ONE weighting rule, keyed on the clause topic (see ClauseClass). */
.wep-halt-clause-secondary[b-rsmo5fxyfv] {
    color: var(--wep-color-fg-3);
}

/* #2334: a recorded resume that will not clear on its own (nothing admits it, its precondition is
 * lost, its package is not covered) is not a normal wait, so its clause wears the warn ramp the
 * blast-radius disclosure below already wears. A resume waiting its turn for a slot wears none. */
.wep-halt-clause-attention[b-rsmo5fxyfv] {
    color: var(--wep-color-warn-fg);
}

/* One verb, its disclosure and its reason, as one block — so an always-visible reason
 * cannot drift away from the control it explains. */
.wep-halt-verb-row[b-rsmo5fxyfv] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-2);
}

/* R26 / KTD8: the reason is ALWAYS-VISIBLE text, never a tooltip. An aria-disabled
 * WepButton is pointer-inert, so a reason that only a hover or a click could uncover
 * would be a reason nobody can reach. */
.wep-halt-verb-reason[b-rsmo5fxyfv] {
    margin: 0;
    flex: 1 1 24ch;
    min-width: 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

/* R20: the blast radius is stated in every verb state, because it is a fact about the
 * verb and not about this principal's authority to run it. */
.wep-halt-blast-radius[b-rsmo5fxyfv] {
    margin: 0;
    flex: 1 1 24ch;
    min-width: 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-warn-fg);
}

/* #2334: what the last verb did — the row's outcome notice and the page-level acceptance and re-arm
 * notices. Substantive information, not metadata: fg-2, and a readable measure at EVERY width (the
 * kit's .wep-meta is fg-3 and gains its 90ch only at the 1920 rung, so a 217-character outcome set
 * at ~180 characters a line at 1440). The rest is .wep-meta's recipe. */
.wep-halt-outcome[b-rsmo5fxyfv] {
    margin: 0 0 var(--wep-space-2);
    max-width: 90ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-2);
}

/* R27: per ROW, never the whole table. The queue's own read-fault banner is a different
 * statement and still wins over every empty state. */
.wep-halt-degraded[b-rsmo5fxyfv] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

/* #2516: the "not on the audit trail" notice after a reject whose record was lost — a Warn
 * banner in its own spacing wrapper (the grant page / emergency-stop shape). A WepBanner carries
 * its own frame; the wrapper only spaces it from the posture strip above and the queue below.
 * Every value is a kit token. */
.wep-halt-banner[b-rsmo5fxyfv] {
    margin: var(--wep-space-3) 0;
}

/* KD2: the raw token survives as the audit detail — present, copyable, and no longer
 * the explanation. */
.wep-halt-audit[b-rsmo5fxyfv] {
    margin-top: var(--wep-space-3);
    font-size: var(--wep-size-text-xs);
}

/* #2390: the dismissed ingest attempts sit below the latched queue as a section of their own, spaced
 * from it so the two lists never read as one. Every value is a kit token. */
.wep-halt-dismissed[b-rsmo5fxyfv] {
    margin-top: var(--wep-space-5);
}
/* /Components/Catalog/UpdatePipelineSlotsPanel.razor.rz.scp.css */
/* #2513 — a slot holder's clock (its dwell, its pending age against the stall bound and the time left)
   sits on its own muted line beneath the holder's reason. `.wep-meta` gives the size and the colour; this
   makes the inline span a line of its own and drops the kit's bottom margin, which inside a table cell
   would only pad the row. The artboard (catalog-update-halts.html) restates this rule; the two copies
   move together. */
.wep-slot-wait-clock[b-4xavkyj9c5] {
    display: block;
    margin: 0;
}
/* /Components/Fleet/AgentRolloutPanel.razor.rz.scp.css */
/*
    Agent-version rollout panel — Plan 2026-06-28-001 (Automatic Agent Updater) U12; moved from
    Pages/AdminAgentRollout.razor.css when #1364 extracted the shared AgentRolloutPanel component
    (scoped CSS follows its markup). Serves BOTH /admin/agent-rollout and /community/agent-rollout.
    Scoped styles for the ambient rollout view: cards, ring ladder, health strip, action rows.
    All color/spacing via --wep-* tokens (no hard-coded hex); responsive down to a narrow column.
*/

.wep-rollout-empty[b-q89cmkv33b] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-3);
    padding: var(--wep-space-6);
    border: 1px dashed var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    color: var(--wep-color-fg-3);
}

.wep-rollout-empty p[b-q89cmkv33b] {
    margin: 0;
}

.wep-rollout-card[b-q89cmkv33b] {
    margin: var(--wep-space-4) 0;
    padding: var(--wep-space-4);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
    box-shadow: var(--wep-shadow-sm);
}

.wep-rollout-card-head[b-q89cmkv33b] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--wep-space-3);
}

.wep-rollout-card-title[b-q89cmkv33b] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

.wep-rollout-version[b-q89cmkv33b] {
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-rollout-card-actions[b-q89cmkv33b] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
}

/* Abort confirm — inline danger affordance. */
.wep-rollout-confirm[b-q89cmkv33b] {
    margin-top: var(--wep-space-3);
    padding: var(--wep-space-3);
    border: 1px solid var(--wep-state-rolledback-rule, var(--wep-color-border-2));
    border-radius: var(--wep-radius-xs);
    background: var(--wep-state-rolledback-bg, var(--wep-color-bg-2));
}

.wep-rollout-confirm p[b-q89cmkv33b] {
    margin: 0 0 var(--wep-space-2);
    color: var(--wep-color-fg-2);
}

.wep-rollout-reason[b-q89cmkv33b],
.wep-rollout-arm-input[b-q89cmkv33b] {
    width: 100%;
    max-width: 22rem;
    padding: var(--wep-space-2);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-1);
    color: var(--wep-color-fg-1);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-sm);
}

.wep-rollout-reason:focus[b-q89cmkv33b],
.wep-rollout-arm-input:focus[b-q89cmkv33b] {
    outline: 2px solid var(--wep-color-border-focus);
    outline-offset: 1px;
}

.wep-rollout-confirm-actions[b-q89cmkv33b] {
    display: flex;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-2);
}

/* Ring ladder — the rollout wavefront. */
.wep-rollout-ladder[b-q89cmkv33b] {
    list-style: none;
    margin: var(--wep-space-4) 0 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}

.wep-rollout-rung[b-q89cmkv33b] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    padding: var(--wep-space-2) var(--wep-space-3);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-2);
}

.wep-rollout-rung-frontier[b-q89cmkv33b] {
    border-color: var(--wep-color-accent-1);
    background: var(--wep-color-bg-1);
}

.wep-rollout-rung-name[b-q89cmkv33b] {
    min-width: 3.5rem;
    color: var(--wep-color-fg-2);
    text-transform: uppercase;
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
}

.wep-rollout-frontier-tag[b-q89cmkv33b] {
    font-size: var(--wep-size-text-2xs);
    text-transform: uppercase;
    color: var(--wep-color-accent-text);
    letter-spacing: var(--wep-tracking-wide);
}

/* Frontier health strip. */
.wep-rollout-health[b-q89cmkv33b] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-3);
    margin-top: var(--wep-space-4);
}

.wep-rollout-health-counts[b-q89cmkv33b] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-rollout-health-reason[b-q89cmkv33b] {
    flex-basis: 100%;
    margin: var(--wep-space-1) 0 0;
    color: var(--wep-color-fg-2);
    font-size: var(--wep-size-text-sm);
}

.wep-rollout-members[b-q89cmkv33b] {
    margin-top: var(--wep-space-3);
}

/* Explicit-arm row. */
.wep-rollout-arm[b-q89cmkv33b] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

@media (max-width: 720px) {
    .wep-rollout-card-head[b-q89cmkv33b] {
        flex-direction: column;
        align-items: stretch;
    }

    .wep-rollout-card-actions[b-q89cmkv33b] {
        justify-content: flex-start;
    }
}
/* /Components/Fleet/AppOwnerHoldsTable.razor.rz.scp.css */
/* #1960 U16 (R26-R28) — the Holds page's owner holds (AppOwnerHoldsTable), to the approved drawing (fleet-holds.html,
 * which mirrors these rules under the same names).
 *
 * One row per app and manager pair, the endpoints under the row that opened them, and the multi-endpoint switch's
 * dialog. Every value comes from the design tokens; an owner hold is a normal state, so its row wears no attention
 * colour; only a refusal is danger text.
 */

.wep-holds-owner-rows[b-u2n7utpix6] {
    margin-top: var(--wep-space-3);
}

.wep-holds-owner-rows td[b-u2n7utpix6] {
    white-space: nowrap;
    vertical-align: middle;
}

.wep-table td.wep-holds-owner-managers[b-u2n7utpix6] {
    color: var(--wep-color-fg-2);
}

.wep-table td.wep-holds-owner-action[b-u2n7utpix6] {
    width: 1%;
    text-align: right;
}

.wep-table .wep-holds-owner-endpoints-row td[b-u2n7utpix6] {
    white-space: normal;
    border-top: 0;
    padding-top: 0;
}

.wep-holds-owner-rows tr:has(+ tr.wep-holds-owner-endpoints-row) td[b-u2n7utpix6] {
    border-bottom: 0;
}

.wep-holds-owner-endpoint-list[b-u2n7utpix6] {
    margin: 0;
    padding-left: var(--wep-space-5);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-holds-owner-endpoint-list li[b-u2n7utpix6] {
    margin: 0 0 2px;
}

.wep-holds-owner-switch-boxes[b-u2n7utpix6] {
    margin: 0 0 var(--wep-space-3);
    padding-left: var(--wep-space-5);
    line-height: var(--wep-line-snug);
}

.wep-holds-owner-switch-boxes li[b-u2n7utpix6] {
    margin: 0 0 2px;
}

.wep-holds-owner-dialog-note[b-u2n7utpix6] {
    margin: 0 0 var(--wep-space-3);
}

.wep-holds-owner-switch-error[b-u2n7utpix6] {
    color: var(--wep-color-danger-text);
    margin: 0 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}

.wep-holds-owner-notice[b-u2n7utpix6] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
    max-width: 60ch;
}

@media (forced-colors: active) {
    .wep-holds-owner-switch-error[b-u2n7utpix6] {
        border-left: 3px double CanvasText;
        padding-left: var(--wep-space-1);
    }
}
/* /Components/Fleet/AppOwnerPanel.razor.rz.scp.css */
/* #1960 U16 (R26-R28) — the endpoint page's apps another manager owns (AppOwnerPanel), to the approved drawing
 * (endpoint-detail.html, which mirrors these rules under the same names).
 *
 * One line per app, a Details row under the line it belongs to, and the switch's dialog. Every value comes from the
 * design tokens; nothing here introduces a colour of its own. An owner hold is a normal state, so its row wears no
 * attention colour; only a refusal or a fault the panel could not get past is danger text.
 */

.wep-app-owner-panel[b-o16xmmu3gv] {
    margin: var(--wep-space-3) 0;
}

.wep-app-owner-lede[b-o16xmmu3gv] {
    margin: var(--wep-space-1) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}

.wep-app-owner-rows[b-o16xmmu3gv] {
    width: 100%;
}

.wep-app-owner-rows td[b-o16xmmu3gv] {
    white-space: nowrap;
    vertical-align: middle;
}

.wep-table td.wep-app-owner-managers[b-o16xmmu3gv] {
    color: var(--wep-color-fg-2);
}

.wep-table td.wep-app-owner-action[b-o16xmmu3gv] {
    width: 1%;
    text-align: right;
}

.wep-app-owner-verb[b-o16xmmu3gv] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
}

/* the reason beside a disabled Switch (review #1): in words, muted; the full sentence is the button's tooltip */
.wep-app-owner-verb-note[b-o16xmmu3gv] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

.wep-table .wep-app-owner-details-row td[b-o16xmmu3gv] {
    white-space: normal;
    border-top: 0;
    padding-top: 0;
}

.wep-app-owner-rows tr:has(+ tr.wep-app-owner-details-row) td[b-o16xmmu3gv] {
    border-bottom: 0;
}

.wep-app-owner-details[b-o16xmmu3gv] {
    margin: 0;
    max-width: 76ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-2);
}

.wep-app-owner-details p[b-o16xmmu3gv] {
    margin: 0 0 var(--wep-space-1);
}

.wep-app-owner-steps[b-o16xmmu3gv] {
    margin: var(--wep-space-1) 0 var(--wep-space-1);
    padding-left: var(--wep-space-5);
}

.wep-app-owner-steps li[b-o16xmmu3gv] {
    margin: 0 0 2px;
}

.wep-app-owner-step-now[b-o16xmmu3gv] {
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-app-owner-dialog-note[b-o16xmmu3gv] {
    margin: 0 0 var(--wep-space-3);
}

.wep-app-owner-error[b-o16xmmu3gv] {
    color: var(--wep-color-danger-text);
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
}

.wep-app-owner-notice[b-o16xmmu3gv] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
}

@media (forced-colors: active) {
    .wep-app-owner-error[b-o16xmmu3gv] {
        border-left: 3px double CanvasText;
        padding-left: var(--wep-space-1);
    }
}
/* /Components/Fleet/CveCoverageRemainder.razor.rz.scp.css */
/* The CVE exposure view's coverage block (#1852, #1915). Page glue only: the coverage meta line, the pin and
 * dismissal well, and the bulk bar. Every colour, size and control is a kit token or an existing global class
 * (.wep-disclosure, WepDataTable, WepButton, .wep-check, .wep-radio, .wep-field-label) — no new visual language.
 *
 * The first half was the page's own sheet (FleetCveExposure.razor.css): these rules moved here with the markup
 * they style when #1915 made the coverage block a component, declarations unchanged.
 *
 * Note (#1865 part M): .wep-meta has a kit rule in _shell.css with this recipe's size, line-height and colour.
 * The rule below stays because the coverage line also needs its own flex/gap layout, and a scoped selector
 * outranks the bare kit class.
 */

/* Coverage: one compact meta line under the lookup row. The numbers step up to fg-1 semibold the way the
   catalog filter summary does ("<strong>45</strong> of <strong>2,418</strong>"). */
.wep-cve-coverage[b-8zs7mo920u] {
    margin: var(--wep-space-3) 0;
}

.wep-cve-coverage-meta[b-8zs7mo920u] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-1) var(--wep-space-2);
    margin: 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-3);
}

.wep-cve-coverage-meta strong[b-8zs7mo920u] {
    color: var(--wep-color-fg-1);
    font-weight: var(--wep-weight-semi);
}

.wep-cve-coverage-sep[b-8zs7mo920u] {
    color: var(--wep-color-fg-4);
}

.wep-cve-coverage-list[b-8zs7mo920u] {
    margin: var(--wep-space-2) 0;
    list-style: none;
    padding: 0;
}

/* The small-print family. Colour stays on the shared .wep-fg-3 kit utility; only the size is local. */
.wep-cve-smallprint[b-8zs7mo920u] {
    font-size: var(--wep-size-text-sm);
}

/* The dismissed list sits under the unmatched one, at its rhythm. */
.wep-cve-dismissed[b-8zs7mo920u] {
    margin-top: var(--wep-space-2);
}

/* The pin-authoring and dismissal panel: a bordered well, its flush heading, the candidate chip listbox and
 * the negative-pin checkbox row. */
.wep-cve-pin-author[b-8zs7mo920u] {
    border: 1px solid var(--wep-color-border-2);
    padding: var(--wep-space-3);
    margin: var(--wep-space-3) 0;
}

.wep-cve-pin-author-title[b-8zs7mo920u] {
    margin-top: 0;
}

.wep-cve-pin-candidates[b-8zs7mo920u] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-1);
    margin: var(--wep-space-2) 0;
}

.wep-cve-pin-negative[b-8zs7mo920u] {
    display: block;
    margin: var(--wep-space-2) 0;
}

/* #1915 — the selection column: the width of one kit checkbox, no more. */
.wep-cve-select-cell[b-8zs7mo920u] {
    width: 22px;
    padding-right: 0;
}

/* A sibling cluster's header row: the product, how many identities, and its select-all, on one line. */
.wep-cve-cluster-header[b-8zs7mo920u] {
    font-size: var(--wep-size-text-sm);
}

/* The bulk bar: what is selected and the two verbs, above the list it acts on. */
.wep-cve-bulk-bar[b-8zs7mo920u] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2) var(--wep-space-3);
    margin: 0 0 var(--wep-space-2);
    padding: var(--wep-space-2) var(--wep-space-3);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-accent-bg);
    font-size: var(--wep-size-text-sm);
}

/* The dismissal's closed reasons: a stacked radio list with no fieldset chrome. */
.wep-cve-dismiss-reasons[b-8zs7mo920u] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
    margin: var(--wep-space-2) 0;
    padding: 0;
    border: 0;
}

.wep-cve-dismiss-reason[b-8zs7mo920u] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
}

.wep-cve-dismiss-note[b-8zs7mo920u] {
    display: block;
    margin: var(--wep-space-2) 0;
}

.wep-cve-dismiss-note textarea[b-8zs7mo920u] {
    display: block;
    width: 100%;
    max-width: 640px;
    height: auto;
    margin-top: var(--wep-space-1);
}

/* The per-identity outcomes of the last bulk verb. */
.wep-cve-bulk-outcomes[b-8zs7mo920u] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Fleet/CveExposureFilterBar.razor.rz.scp.css */
/* #1918 — the exposure view's facet chips as one kit chip group, in the /inventory filter bar's recipe: a
 * wrapping flex row of facet groups, each a small uppercase caption beside a kit .wep-chip-row (global,
 * _shell.css) of untouched WepFilterChips. This sheet owns only the group glue. Tokens only.
 */

.wep-cve-filter-bar[b-7ckghubamb] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2) var(--wep-space-5);
    margin: var(--wep-space-3) 0;
}

/* A facet: caption + chip row, wrapping as one unit. */
.wep-cve-filter-group[b-7ckghubamb] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
    min-width: 0;
}

/* The facet caption: the global .wep-section-title tokens, laid inline. Not a click target. */
.wep-cve-filter-group-label[b-7ckghubamb] {
    flex: none;
    font-size: var(--wep-size-text-2xs);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
}
/* /Components/Fleet/CveExposureProductTable.razor.rz.scp.css */
/* #1918 / #3855 — the exposure view's product rollup. Page glue only: the toggle that opens a product, the
 * run that holds a CVE id beside its KEV pill, and the two nested levels' indent. Every colour, size and pill
 * is a kit token or an existing kit class (WepDataTable, WepStatusPill, WepButton Ghost, .wep-cve-possible).
 */

/* The product's toggle: a text button, so the whole name is the click target and it is a real control
   (keyboard, aria-expanded) rather than a row click. */
.wep-cve-product-toggle[b-hw9bkhb9dj] {
    display: inline-flex;
    align-items: baseline;
    gap: var(--wep-space-2);
    padding: 0;
    border: 0;
    background: none;
    color: var(--wep-color-fg-1);
    font: inherit;
    font-weight: var(--wep-weight-semi);
    text-align: left;
    cursor: pointer;
}

.wep-cve-product-toggle:hover .wep-cve-product-label[b-hw9bkhb9dj] {
    text-decoration: underline;
}

.wep-cve-product-toggle:focus-visible[b-hw9bkhb9dj],
.wep-cve-sources-toggle:focus-visible[b-hw9bkhb9dj] {
    /* Transparent, never none: forced colours drops the box-shadow ring and paints this in a system colour. */
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

.wep-cve-product-chevron[b-hw9bkhb9dj] {
    flex: none;
    width: 1ch;
    color: var(--wep-color-fg-3);
}

.wep-cve-product-small[b-hw9bkhb9dj] {
    font-size: var(--wep-size-text-sm);
}

/* The CVE id beside its KEV pill (and the withdrawn tombstone): one inline-flex run with a kit gap. The
   whitespace-only text node the markup emits between them is not a flex item, so the gap is the only spacing
   the eye sees. Same recipe the page's own sheet carried for the pair row. */
.wep-cve-id[b-hw9bkhb9dj] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
    min-width: 0;
}

.wep-cve-kev[b-hw9bkhb9dj] {
    display: inline-flex;
    align-items: center;
    flex: none;
}

/* Level 2: the product's hits, set in from the product row so the nesting reads at a glance. The detail cell
   carries the indent; the nested table is the primitive's own, unframed. */
.wep-cve-product-detail[b-hw9bkhb9dj] {
    padding: var(--wep-space-2) var(--wep-space-3) var(--wep-space-3) var(--wep-space-6);
    background: var(--wep-color-bg-0);
}

.wep-cve-product-more[b-hw9bkhb9dj] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-3);
    margin: var(--wep-space-2) 0 0;
}

/* A hit's "N sources" toggle: small print that is a control. */
.wep-cve-sources-toggle[b-hw9bkhb9dj] {
    padding: 0;
    border: 0;
    background: none;
    color: var(--wep-color-fg-3);
    font: inherit;
    font-size: var(--wep-size-text-sm);
    text-decoration: underline dotted;
    cursor: pointer;
}

.wep-cve-sources-toggle:hover[b-hw9bkhb9dj] {
    color: var(--wep-color-fg-1);
}

/* Level 3: a hit's package keys, one more step in. */
.wep-cve-sources[b-hw9bkhb9dj] {
    padding: var(--wep-space-2) var(--wep-space-3) var(--wep-space-3) var(--wep-space-6);
}
/* /Components/Fleet/CveExposureSummaryStrip.razor.rz.scp.css */
/* #1918 — the exposure view's summary strip. The cells are the kit stat cards (.wep-stat, .wep-stat-num,
 * .wep-stat-label from _shell.css) at the strip's own density, and each is a control: a button that filters,
 * or the coverage link. Tokens only; no new colour, and no attention colour on any count (#3856: a zero is the
 * normal state, and a non-zero count here is a fact, not an alarm; the list below carries the alarm).
 */

.wep-cve-strip[b-ietpkre3nm] {
    margin: var(--wep-space-4) 0 var(--wep-space-3);
}

.wep-cve-strip-caption[b-ietpkre3nm] {
    margin: 0 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-3);
}

.wep-cve-strip-row[b-ietpkre3nm] {
    gap: var(--wep-space-2);
}

/* The kit stat card, denser, and reset as a control. A scoped selector outranks the bare kit class, so these
   win the cascade without touching the kit rule the package page's footprint cards use.
   height: auto, because a count was a button and the :where(button) baseline fixes every button at 28px: a
   card held there fits its number and draws its label below its own border (the #2905 shape). A count is a link
   since #4561 U3b, and a zero count a span; the reset stays so neither depends on what the element is. */
.wep-cve-strip-count[b-ietpkre3nm] {
    flex: 0 1 auto;
    min-width: 96px;
    height: auto;
    padding: var(--wep-space-2) var(--wep-space-3);
    font: inherit;
    text-align: left;
    text-decoration: none;
    color: inherit;
    cursor: pointer;
    appearance: none;
}

.wep-cve-strip-count .wep-stat-num[b-ietpkre3nm] {
    display: block;
    font-size: var(--wep-size-text-lg);
}

.wep-cve-strip-count .wep-stat-label[b-ietpkre3nm] {
    display: block;
}

a.wep-cve-strip-count:hover[b-ietpkre3nm] {
    border-color: var(--wep-color-border-2);
    background: var(--wep-color-bg-2);
}

.wep-cve-strip-count:focus-visible[b-ietpkre3nm] {
    /* Transparent, never none: forced colours drops the box-shadow ring and paints this in a system colour. */
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

/* The count whose link is the filter in force (#4561 U3b: aria-current, the address the page is on). */
.wep-cve-strip-count[aria-current="true"][b-ietpkre3nm] {
    border-color: var(--wep-color-accent-1);
}

/* A zero count: a fact, not a control (a span, not a link). Quiet, and no pointer. */
span.wep-cve-strip-count[b-ietpkre3nm] {
    cursor: default;
}

span.wep-cve-strip-count .wep-stat-num[b-ietpkre3nm] {
    color: var(--wep-color-fg-3);
}
/* /Components/Fleet/EmergencyStopPanel.razor.rz.scp.css */
/* Scoped glue for the shared emergency-stop panel — #1848 console polish
 * (application of the existing system only; every value is a kit token).
 * Serves BOTH /admin/emergency-stop and /community/emergency-stop.
 *
 * The state readout and the trip / reset ceremony each sit in a kit card
 * (.wep-card from _shell.css) under the section's uppercase label — the
 * AgentRolloutPanel "label, then card" structure — instead of an unspaced
 * stack of small-caps labels and prose. Only rhythm lives here; every surface
 * is a kit class (.wep-card / .wep-field / .wep-input / .wep-dl / the §18
 * typed-confirm anatomy).
 */

.wep-estop-section[b-sxvuyqg5ub] {
    margin-bottom: var(--wep-space-6);
}

.wep-estop-card[b-sxvuyqg5ub] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    margin: 0 0 var(--wep-space-5);
}

/* The flex gap is the rhythm — the panel's own paragraphs drop their UA margins. */
.wep-estop-card p[b-sxvuyqg5ub] {
    margin: 0;
}

/* The typed-confirm anatomy carries a top margin for modal use; inside the
   card the flex gap already spaces it from the field above. */
.wep-estop-card[b-sxvuyqg5ub]  .wep-typed-confirm-label {
    margin-top: 0;
}

/* The reason input matches the phrase input below it: the full card width
   (the kit .wep-input's 320px default is a toolbar width, not a form width). */
.wep-estop-reason[b-sxvuyqg5ub] {
    width: 100%;
}

/* #2472: the "not on the audit trail" notice after an unrecorded trip — a Warn
   banner in its own spacing wrapper (the CommunityUsers / PolicyGrants shape),
   rendered directly under the state card it qualifies and spaced like a card, so
   the section label after it keeps the panel's card rhythm. */
.wep-estop-banner[b-sxvuyqg5ub] {
    margin: 0 0 var(--wep-space-5);
}

.wep-estop-actions[b-sxvuyqg5ub] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}
/* /Components/Fleet/EmergencyStopSignerPanel.razor.rz.scp.css */
/* Scoped glue for the shared signer-registry panel — #1848 console polish
 * (application of the existing system only; every value is a kit token).
 * Serves BOTH /admin/emergency-stop and /community/emergency-stop, and
 * mirrors EmergencyStopPanel.razor.css so the two panels on one page read as
 * one structure: the section label, then a kit card (.wep-card) holding the
 * list / empty state, the self-enrollment form, and the revocation ceremony.
 */

.wep-estop-section[b-8p7t5ytb7s] {
    margin-bottom: var(--wep-space-6);
}

.wep-estop-card[b-8p7t5ytb7s] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    margin: 0 0 var(--wep-space-5);
}

/* The flex gap is the rhythm — the panel's own paragraphs drop their UA margins. */
.wep-estop-card p[b-8p7t5ytb7s] {
    margin: 0;
}

/* Sub-blocks inside the card ("Enroll yourself", "Revoke …") open under the
   kit section rule rather than floating as bare small-caps labels. */
.wep-estop-card .wep-section-title[b-8p7t5ytb7s] {
    margin: var(--wep-space-2) 0 0;
    padding-top: var(--wep-space-3);
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-estop-card[b-8p7t5ytb7s]  .wep-typed-confirm-label {
    margin-top: 0;
}

.wep-estop-actions[b-8p7t5ytb7s] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}
/* /Components/Fleet/EndpointAgentRestartPanel.razor.rz.scp.css */
/* #2597 — the endpoint page's "restart agent" section (EndpointAgentRestartPanel).
 *
 * The quiet section (a checking-in endpoint) sits between the page-level banners and
 * the primary region; inside the stuck banner the same verb line follows the banner's
 * sentence. The status line wraps under the button on a narrow viewport rather than
 * widening the row.
 */

.wep-endpoint-restart[b-3dacrwtq44] {
    margin-block: var(--wep-space-2);
}

.wep-endpoint-restart-verb[b-3dacrwtq44] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-1);
}

/* A refusal or fault: the service's sentence, verbatim, as danger TEXT (#1759). */
.wep-endpoint-restart-error[b-3dacrwtq44] {
    display: block;
    margin-top: var(--wep-space-1);
    color: var(--wep-color-danger-text);
}
/* /Components/Fleet/EndpointAgentUpdateSuppressions.razor.rz.scp.css */
/* #3191 — the endpoint page's agent-update suppressions (EndpointAgentUpdateSuppressions).
 *
 * One line per suppressed version under the banner's sentence; the Clear verb and its confirm follow
 * the line and wrap under it rather than widening the row.
 */

/* The page gives every banner this vertical margin (FleetEndpointDetail.razor.css), but its rule is
 * scoped to the page and does not reach a child component, so the wrapper carries it here (the
 * EndpointArchitectureFinding precedent). */
.wep-endpoint-banner[b-k6lkgy4dr9] {
    margin: var(--wep-space-3) 0;
}

.wep-endpoint-suppressions[b-k6lkgy4dr9] {
    margin: var(--wep-space-2) 0 0;
    padding-left: var(--wep-space-4);
}

.wep-endpoint-suppressions li + li[b-k6lkgy4dr9] {
    margin-top: var(--wep-space-1);
}

.wep-endpoint-suppression-verb[b-k6lkgy4dr9] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
    margin-left: var(--wep-space-2);
}

/* A refusal or fault: the service's sentence, verbatim, as danger TEXT (#1759). */
.wep-endpoint-suppression-error[b-k6lkgy4dr9] {
    display: block;
    margin-top: var(--wep-space-1);
    color: var(--wep-color-danger-text);
}

/* The clear's outcome (scoped here: the page's rule of the same name does not reach a child). */
.wep-endpoint-notice[b-k6lkgy4dr9] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
}
/* /Components/Fleet/EndpointArchitectureFinding.razor.rz.scp.css */
/* #3925 U1 — the endpoint page's architecture finding (EndpointArchitectureFinding).
 *
 * The confirm verb follows the banner's sentence on its own line; a refusal wraps under it rather
 * than widening the row.
 */

.wep-endpoint-architecture-verb[b-ei52z2mfqf] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-1);
}

/* #3925 PR A design fidelity: the page gives every banner this vertical margin
 * (FleetEndpointDetail.razor.css), but its rule is scoped to the page and does not reach a child
 * component, so the finding's wrapper carries the same rule here. Without it the banner butted
 * onto the Installed packages card. */
.wep-endpoint-banner[b-ei52z2mfqf] {
    margin: var(--wep-space-3) 0;
}

/* A refusal or fault: the service's sentence, verbatim, as danger TEXT (#1759). */
.wep-endpoint-architecture-error[b-ei52z2mfqf] {
    display: block;
    margin-top: var(--wep-space-1);
    color: var(--wep-color-danger-text);
}

/* The confirm's outcome after the finding is gone (scoped here: the page's rule of the same name
 * does not reach a child component). */
.wep-endpoint-notice[b-ei52z2mfqf] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
}
/* /Components/Fleet/EndpointServedCapabilities.razor.rz.scp.css */
/* #2592 U2 — "What this box gets", the served-capability panel's OWN sheet.
 *
 * A Blazor scoped rule reaches only its own component, so the endpoint page's
 * panel/note measures are re-declared here rather than borrowed. Every value is a
 * kit token. The kit `.wep-disclosure` family is inherited from _shell.css and
 * deliberately NOT redefined. No overflow value anywhere: the panel sits in the
 * page's column flex flow (the clipping-container rule).
 */

.wep-served-caps[b-g70173hzr0] {
    margin: var(--wep-space-3) 0;
}

.wep-served-caps-title[b-g70173hzr0] {
    margin: 0 0 var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-2);
}

.wep-served-caps-unavailable[b-g70173hzr0] {
    margin: 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-served-caps-list[b-g70173hzr0] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: var(--wep-space-1);
}

/* Label · pill · reason on one line when there is room; the reason wraps
   beneath on a narrow viewport instead of forcing a horizontal scroll. */
.wep-served-caps-row[b-g70173hzr0] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-served-caps-label[b-g70173hzr0] {
    min-width: 16ch;
    color: var(--wep-color-fg-1);
}

.wep-served-caps-text[b-g70173hzr0] {
    flex: 1 1 24ch;
    min-width: 0;
}

.wep-served-caps-floors[b-g70173hzr0] {
    margin-top: var(--wep-space-2);
}
/* /Components/Fleet/FleetAgentHealth.razor.rz.scp.css */
/* #3966 U6 — the Agent health page draws its sections with the kit's metric-card
 * vocabulary (`wep-fleet-metrics`, `-mcard`, the distribution bar, the row lists),
 * whose rules live in _shell.css. This sheet keeps what only this component
 * decides.
 *
 * Plan 2026-09-06-2144 U4 — the distribution and gap BAR FILLS. The track chrome
 * (height, radius, border, overflow) stays in _shell.css; only the fill colour is
 * here, because only the fill varies. They were FleetEndpointList's until #3966 U5
 * took the metric strip off /fleet, and came here with the bars.
 *
 * The colour is a modifier (.is-stale, .is-rolling, .is-over), never an inline
 * style. What deliberately STAYS inline is the bar WIDTH. A bar length is
 * per-render data (a share of the live endpoints), not a rule, and no stylesheet
 * can hold it. See InlineStyleRelocationTests, which pins those attributes to
 * width-only so a colour or a margin can never quietly move back in beside it.
 *
 * #4054 — a version behind the fleet head that an armed, running agent rollout
 * is moving off (.is-rolling) is the fleet's steady state after every release:
 * its segment and swatch are the muted fg-4, the console's neutral, beside the
 * neutral "rolling out" pill. The CVE-blocked red (.is-stale) is kept for
 * a version behind that nothing is moving.
 */

.wep-fleet-distbar > i[b-y04osx84vq] { background: var(--wep-color-accent-1); }
.wep-fleet-distbar > i.is-stale[b-y04osx84vq] { background: var(--wep-state-cveblocked-rule); }
.wep-fleet-distbar > i.is-rolling[b-y04osx84vq] { background: var(--wep-color-fg-4); }

.wep-fleet-vswatch[b-y04osx84vq] { background: var(--wep-color-accent-1); }
.wep-fleet-vswatch.is-stale[b-y04osx84vq] { background: var(--wep-state-cveblocked-rule); }
.wep-fleet-vswatch.is-rolling[b-y04osx84vq] { background: var(--wep-color-fg-4); }

/* #4054 walk — the version a running rollout is moving the fleet TO is a muted
 * line of its own, beneath the version, in the same row. The pill reads the
 * short "rolling out": at the 1440 rung the card row is 239px wide, and with
 * the whole sentence in the pill, beside the version and the count in a row
 * that does not wrap, the label ellipsized to "ROLLING OUT TO 0.…" — the
 * version was the part cut. Only a row that carries the line may wrap, so no
 * other row's pill starts wrapping where it would have ellipsized before. The
 * line sits after the count in visual order only (`order`); the DOM keeps the
 * sentence order, "0.242.0 rolling out to 0.243.0 1". It is indented by the
 * swatch's 8px and the row's gap, so it starts under the version text. */
.wep-fleet-vrow.is-rolling[b-y04osx84vq] {
    flex-wrap: wrap;
    row-gap: var(--wep-space-1);
}
.wep-fleet-vtarget[b-y04osx84vq] {
    order: 1;
    flex: 0 0 100%;
    padding-left: calc(8px + var(--wep-space-2));
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-fleet-gtrack > i[b-y04osx84vq] { background: var(--wep-state-clean-rule); }
.wep-fleet-gtrack > i.is-over[b-y04osx84vq] { background: var(--wep-state-detonating-rule); }

/* The kit pushes a card's row list to the card's foot (`margin-top: auto`),
 * which suited a strip of cards 148px tall. Here the winget card lists eight
 * states, a grid row is as tall as its tallest card, and a three-row list at
 * the foot of that row would sit far below its own heading. Every list starts
 * under its heading instead. */
.wep-fleet-vrows[b-y04osx84vq],
.wep-fleet-gaprows[b-y04osx84vq] { margin-top: 0; }

/* A figure slot that holds no number: the word "none" (R3: a row of this page
 * exists at zero and reads a word, no numeral and no link), or the dash of a
 * figure that could not be a link to its list. Muted, like the kit's zero gap
 * row; the word and the reason line carry the meaning, never the colour. */
.wep-fleet-vcount.is-none[b-y04osx84vq] {
    color: var(--wep-color-fg-4);
    font-weight: var(--wep-weight-regular);
}
/* /Components/Fleet/FleetCveEvaluationLimits.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the evaluation-limits panel's composition, moved
 * off six inline style= attributes. Declarations relocated verbatim; this is a
 * relocation, not a redesign.
 *
 * Why it matters beyond tidiness: an inline style cannot answer a media query,
 * so the pin row below would stay a single fixed arrangement at every rung of
 * the viewport ladder no matter what the ladder asked for. Now it can be told
 * to reflow from one place.
 *
 * Colours stay on the shared .wep-fg-3 utility in the kit; only spacing and
 * size are local to this component.
 */

.wep-cve-limits[b-jqncw6kbeu] {
    margin-top: var(--wep-space-4);
}

.wep-cve-limits-note[b-jqncw6kbeu] {
    margin: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}

.wep-cve-limits-pin[b-jqncw6kbeu] {
    margin-top: var(--wep-space-3);
}

.wep-cve-limits-pin-lede[b-jqncw6kbeu] {
    font-size: var(--wep-size-text-sm);
}

.wep-cve-limits-pin-row[b-jqncw6kbeu] {
    display: flex;
    gap: var(--wep-space-2);
    align-items: center;
    flex-wrap: wrap;
}
/* /Components/Fleet/FleetCveInconsistencyBanner.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the inconsistency banner's package list, moved off
 * an inline style= attribute. Declarations relocated verbatim; no redesign.
 *
 * The list is written in this component's markup even though it renders inside
 * WepBanner's ChildContent, so Blazor stamps it with this component's scope
 * attribute and the rule below reaches it without ::deep.
 */

.wep-cve-inconsistency-list[b-so8bh65zpm] {
    margin: var(--wep-space-2) 0 0 0;
    padding-left: var(--wep-space-3);
}
/* /Components/Fleet/FleetCveLookupBranch.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the on-demand disclosure line, moved off an inline
 * style= attribute. Declarations relocated verbatim; no redesign. Colour stays
 * on the shared .wep-fg-3 utility in the kit.
 */

.wep-cve-ondemand-disclosure[b-44iwm42mjk] {
    margin: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}
/* /Components/Fleet/FleetCveProductSection.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the CVE product section's composition.
 *
 * This one component carried 22 of the repo's 74 inline style= attributes, the
 * largest concentration anywhere. They collapse to the eleven rules below,
 * which is the point: `margin-left: var(--wep-space-2)` was written three
 * times, `display:block; font-size: sm` four times, `margin: var(--wep-space-2) 0`
 * four times. Every one of those was a copy that could drift from its siblings,
 * and none of them could be reached by a media query.
 *
 * Declarations are the relocated ones verbatim — this is a relocation, not a
 * redesign. Colours stay on the shared .wep-fg-3 / .wep-mono kit utilities; the
 * card chrome stays on .wep-card in _shell.css. Only spacing, size and the two
 * layout modes are local here.
 */

/* The product card's own box — .wep-card supplies the chrome, this supplies the
 * rhythm between stacked product sections. */
.wep-cve-product[b-xjlc9c1pnn] {
    margin: var(--wep-space-3) 0;
    padding: var(--wep-space-3);
}

/* Flush against the card's own padding. */
.wep-cve-product-title[b-xjlc9c1pnn] {
    margin-top: 0;
}

/* The vendor:product key trailing the display name in the heading. */
.wep-cve-product-key[b-xjlc9c1pnn] {
    font-size: var(--wep-size-text-sm);
    margin-left: var(--wep-space-2);
}

/* The provenance lede under the heading, and the ring-state line that shares
 * its metrics. */
.wep-cve-product-lede[b-xjlc9c1pnn] {
    margin: 0 0 var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}

/* hedged / confident / quarantined — the three mutually exclusive confidence
 * markers on the lede. One rule, not three copies. */
.wep-cve-product-marker[b-xjlc9c1pnn] {
    margin-left: var(--wep-space-2);
}

/* A remediation branch's block: deploy-fix, no-fix-yet, adopt-first,
 * not-manageable-here. Four branches, one rhythm. */
.wep-cve-block[b-xjlc9c1pnn] {
    margin: var(--wep-space-2) 0;
}

.wep-cve-fix-headline[b-xjlc9c1pnn] {
    margin: 0 0 var(--wep-space-1) 0;
}

/* #2851 — "2.0.0: <verdict glyph> [acceptance mark]": the fixing release's version
 * label and its verdict read as one line, and wrap as a unit on a narrow rung. */
.wep-cve-fix-verdict[b-xjlc9c1pnn] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1);
    margin: 0 0 var(--wep-space-2) 0;
}

/* The gated / fully-live notes inside the deploy-fix block: flush, small. */
.wep-cve-note[b-xjlc9c1pnn] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
}

/* Per-endpoint (and per-user) remediation state, stacked under the row's
 * identity so the two read as one cell rather than a run-on line. */
.wep-cve-endpoint-state[b-xjlc9c1pnn] {
    display: block;
    font-size: var(--wep-size-text-sm);
}

/* Small print that is not stacked: the empty-table cell and the pager's
 * position readout. */
.wep-cve-smalltext[b-xjlc9c1pnn] {
    font-size: var(--wep-size-text-sm);
}

/* The endpoint pager. A horizontal control row, and therefore one of the first
 * things a narrow rung has to stack — which a media query can now do, because
 * this is a class and not a style= attribute. */
.wep-cve-endpoint-paging[b-xjlc9c1pnn] {
    display: flex;
    gap: var(--wep-space-2);
    align-items: center;
    margin-top: var(--wep-space-2);
}
/* /Components/Fleet/FleetCveRecordBanners.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the pin-notice line, moved off an inline style=
 * attribute. Declarations relocated verbatim; no redesign. Colour stays on the
 * shared .wep-fg-3 utility in the kit.
 */

.wep-cve-pin-notice[b-xih6rh9fmm] {
    margin: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}
/* /Components/Fleet/FleetEndpointList.razor.rz.scp.css */
/* #3966 U5 — the overview's bands (the trust sentence, the exception views, the
 * ring rows) are kit vocabulary and live in _shell.css with the rest of the
 * `wep-fleet-*` family, where the artboards that draw them read the same rules.
 * This sheet keeps what only this component draws.
 *
 * It held the distribution and gap BAR FILLS (plan 2026-09-06-2144 U4) and the
 * strip's "as of" caption (#2852). Both left with the metric strip: no markup
 * of this component carries those classes any more, and a scoped rule reaches
 * no other component. The Agent health page (plan unit U6) draws the bars again
 * and takes the fill rules into its own sheet.
 */

/* The chip of a view this load could not evaluate (R3). It is a dash, not a
 * count, so it is not a link: nothing is behind it to open. The kit chip is a
 * control (a pointer cursor, a solid border); this one is neither, and says so
 * with a dashed border and the default cursor. The reason is the line beneath
 * the chips, in text, so the border is never the only channel. */
.wep-fleet-view-unevaluated[b-grfh457e1b] {
    border-style: dashed;
    cursor: default;
}
/* /Components/Fleet/FleetEndpointUnadoptAction.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the un-adopt affordance's composition, moved off
 * inline style= attributes.
 *
 * `.wep-unadopt-confirm` and `.wep-unadopt-action` were already on the markup
 * and had a rule in NO stylesheet: they rendered bare while an inline
 * `style="display:block;margin-top:…"` did the actual work. That is the exact
 * shape KitClassDefinitionCensusTests counts, so this file resolves two of its
 * dead classes as well as retiring the inline styles.
 *
 * Declarations are the relocated ones verbatim — this is a relocation, not a
 * redesign. An inline style cannot answer a media query, which is the whole
 * reason the ladder cannot reach these surfaces today.
 */

.wep-unadopt-confirm[b-5y57aef7vb],
.wep-unadopt-action[b-5y57aef7vb] {
    display: block;
    margin-top: var(--wep-space-1);
}

/* The disclosure sentence beside the confirm/cancel pair. Colour stays on the
 * shared .wep-fg-3 utility in the kit; only the size is local. */
.wep-unadopt-disclosure[b-5y57aef7vb] {
    font-size: var(--wep-size-text-sm);
}
/* /Components/Fleet/GroupManagerConsentDialog.razor.rz.scp.css */
/* #1960 U17/U18 (PR 10b) — the consent dialog's own rules, to the approved drawing (fleet-group-detail.html), whose
 * style block draws them under the board's proposal names (consent-*): the declarations are the drawing's, verbatim,
 * under the names the page ships. Everything else is the kit's (WepModal, WepTypedConfirm, .wep-disclosure,
 * .wep-banner). New rules sit on text-xs and text-sm, never the deprecated 2xs (design.md §3.1). */

.wep-group-consent-buckets .wep-disclosure[b-e3doh8a6fs] {
    margin-top: var(--wep-space-2);
}

/* A bucket's endpoints: mono, wrapping, one per item. */
.wep-group-consent-hosts[b-e3doh8a6fs] {
    display: flex;
    flex-wrap: wrap;
    gap: 2px var(--wep-space-3);
    margin: 0;
    padding: 0;
    list-style: none;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    line-height: var(--wep-line-relaxed);
}

.wep-group-consent-hosts li[b-e3doh8a6fs] {
    white-space: nowrap;
}

/* The cannot bucket: each endpoint with its reason and what clears it. */
.wep-group-consent-cannot[b-e3doh8a6fs] {
    margin: 0;
    padding-left: var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-consent-cannot li[b-e3doh8a6fs] {
    margin: 0 0 var(--wep-space-1);
}

/* A bucket with nothing in it is a plain line reading "none", never an empty disclosure. */
.wep-group-consent-empty[b-e3doh8a6fs] {
    margin: var(--wep-space-2) 0 0;
    padding: var(--wep-space-3) var(--wep-space-4);
    border: 1px dashed var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    font-size: var(--wep-size-text-xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-3);
}

.wep-group-consent-what[b-e3doh8a6fs] {
    margin: var(--wep-space-3) 0 0;
}

.wep-group-consent-expiry[b-e3doh8a6fs] {
    margin: var(--wep-space-2) 0 0;
}

/* The server's refusal, and an error the confirm can be retried after. */
.wep-group-consent-error[b-e3doh8a6fs] {
    margin: var(--wep-space-3) 0 0;
    color: var(--wep-color-danger-text);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-consent-banner[b-e3doh8a6fs] {
    margin: 0 0 var(--wep-space-3);
}

/* Scoop's two places it installs: a heading above each set of three buckets. */
.wep-group-consent-scope[b-e3doh8a6fs] {
    margin: var(--wep-space-4) 0 0;
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-group-consent-scope:first-child[b-e3doh8a6fs] {
    margin-top: 0;
}

@media (forced-colors: active) {
    .wep-group-consent-error[b-e3doh8a6fs] {
        border-left: 3px double CanvasText;
        padding-left: var(--wep-space-1);
    }
}
/* /Components/Fleet/GroupManagersSection.razor.rz.scp.css */
/* #1960 U14 (R30) — the Managers section ends on a data table, whose wrap carries no margin, and a section title
 * carries none above it: the section keeps the gap a form row leaves before the next section (.wep-form-row's bottom
 * margin). Moved here from FleetGroupDetail.razor.css with the section (#1960 U17 PR 10b).
 */
.wep-group-managers[b-wkahxls2ao] {
    margin-bottom: var(--wep-space-6);
}

/* #1960 U17/U18 (PR 10b) — the section's own rules, to the approved drawing (fleet-group-detail.html), whose style
 * block draws them under the board's proposal names (mgr-*): the declarations are the drawing's, verbatim, under the
 * names the page ships. New rules sit on text-xs and text-sm, never the deprecated 2xs (design.md §3.1). */

/* A count's second line (what Getting it, Lacks it and Unusable are made of), and the granted consent's when and who. */
.wep-group-managers-sub[b-wkahxls2ao] {
    display: block;
    margin-top: 2px;
    white-space: normal;
    color: var(--wep-color-fg-3);
}

.wep-group-managers-consent-state[b-wkahxls2ao] {
    display: block;
}

.wep-group-managers-consent-cell[b-wkahxls2ao]  .wep-btn {
    margin-top: var(--wep-space-1);
}

/* The consent recorded above the table, and the consent a removal withdrew under the base-install set. */
.wep-group-managers-notice[b-wkahxls2ao] {
    margin: var(--wep-space-2) 0;
    max-width: 78ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-managers-legend[b-wkahxls2ao] {
    margin: var(--wep-space-2) 0 0;
    max-width: 78ch;
}

.wep-group-managers .wep-disclosure[b-wkahxls2ao] {
    max-width: 110ch;
}

.wep-group-managers-reasons-title[b-wkahxls2ao] {
    margin: var(--wep-space-3) 0 var(--wep-space-1);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-1);
}

.wep-group-managers-reasons-title:first-child[b-wkahxls2ao] {
    margin-top: 0;
}

.wep-group-managers-reasons[b-wkahxls2ao] {
    margin: 0;
    padding-left: var(--wep-space-5);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-managers-reasons li[b-wkahxls2ao] {
    margin: 0 0 var(--wep-space-1);
}

.wep-group-managers-drift[b-wkahxls2ao] {
    margin-top: var(--wep-space-3);
    max-width: 110ch;
}
/* /Components/Fleet/HeldAppReleasePanel.razor.rz.scp.css */
/* #1960 U14 (R31) — the endpoint page's held apps (HeldAppReleasePanel).
 *
 * A card: one sentence, a row per held app with its two verbs, and the confirm under the row it belongs to. Every value
 * comes from the design tokens; nothing here introduces a colour of its own. A held app is a normal state, so its row
 * wears no attention colour; only a fault the panel could not get past is danger text.
 */

.wep-held-release-panel[b-fqw4yljv7t] {
    margin: var(--wep-space-3) 0;
}

.wep-held-release-lede[b-fqw4yljv7t] {
    margin: var(--wep-space-1) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}

.wep-held-release-rows[b-fqw4yljv7t] {
    width: 100%;
}

/* The shell's table cells never wrap (_shell.css `.wep-table tbody td`): the action cell stays one line and as narrow as
   its verbs (a real table cell; the verbs sit in an inner flex row, never a flex td), and the table scrolls inside the
   shell's .wep-table-wrap at any width rather than letting the page scroll. The verbs end at the cell's right edge, so
   a manager's own package, which offers Stop managing alone, draws it under the other rows' Stop managing rather than
   under their Uninstall from this box. */
.wep-held-release-action[b-fqw4yljv7t] {
    white-space: nowrap;
    width: 1%;
    text-align: right;
}

.wep-held-release-verb[b-fqw4yljv7t] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

.wep-held-release-action .wep-held-release-verb[b-fqw4yljv7t] {
    flex-wrap: nowrap;
}

/* The confirm sits on a full-width line of its own under its row, where its sentence wraps. It belongs to the row above
   it, so it carries no rule of its own. */
.wep-held-release-confirm-row td[b-fqw4yljv7t] {
    white-space: normal;
    border-top: 0;
    padding-top: 0;
}

.wep-held-release-rows tr:has(+ tr.wep-held-release-confirm-row) td[b-fqw4yljv7t] {
    border-bottom: 0;
}

.wep-held-release-note[b-fqw4yljv7t] {
    margin: 0 0 var(--wep-space-2);
}

.wep-held-release-error[b-fqw4yljv7t] {
    color: var(--wep-color-danger-text);
}

.wep-held-release-error[b-fqw4yljv7t],
.wep-held-release-notice[b-fqw4yljv7t] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
}

/* Under forced colours the browser strips the hue, so a fault would read like every other line. Border STYLE is the
   channel forced colours keeps (#2053), in the system's own text colour: a fault takes the BLOCKED family's 3px double
   rule. Everything here is inside the media query, so normal rendering is unchanged. */
@media (forced-colors: active) {
    .wep-held-release-error[b-fqw4yljv7t] {
        border-left: 3px double CanvasText;
        padding-left: var(--wep-space-1);
    }
}
/* /Components/Fleet/PerUserRevealCeremony.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the per-user reveal ceremony's composition, moved
 * off four inline style= attributes. Declarations relocated verbatim; this is a
 * relocation, not a redesign.
 *
 * `.wep-per-user-reveal` was already on the markup with a rule in no stylesheet
 * — the inline style was doing the work — so this file also resolves one of
 * KitClassDefinitionCensusTests' dead classes.
 *
 * The row is the reason the inline styles had to go: it is a flex line holding
 * a prompt, a text input and up to two buttons, and at a narrow rung it needs
 * to stack. A media query can reach a class; it can never reach a style=.
 */

.wep-per-user-reveal[b-yg49jffm7e] {
    display: flex;
    gap: var(--wep-space-2);
    align-items: center;
    flex-wrap: wrap;
    margin: var(--wep-space-2) 0;
}

/* The post-reveal confirmation and the pre-reveal masked note. Colour stays on
 * the shared .wep-fg-3 utility in the kit. */
.wep-per-user-reveal-notice[b-yg49jffm7e] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
}

.wep-per-user-reveal-masked[b-yg49jffm7e] {
    font-size: var(--wep-size-text-sm);
}

/* flex-basis:100% breaks the error onto its own line beneath the controls
 * rather than squeezing them — it is layout, not decoration. */
.wep-per-user-reveal-error[b-yg49jffm7e] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
    flex-basis: 100%;
}
/* /Components/Fleet/ReplaceWithVerifiedInstallerPanel.razor.rz.scp.css */
/* #3925 U12 — the replace with the verified installer (ReplaceWithVerifiedInstallerPanel).
 *
 * A card: a head with the bulk verb, one sentence, a row per (endpoint, package) with its directive's
 * status and its verbs, and the preview with its typed phrase. Every value comes from the design
 * tokens; nothing here introduces a colour of its own.
 */

.wep-replace-panel[b-fvjqter6yi] {
    margin: var(--wep-space-3) 0;
}

.wep-replace-head[b-fvjqter6yi] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--wep-space-2);
}

.wep-replace-lede[b-fvjqter6yi] {
    margin: var(--wep-space-1) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}

.wep-replace-rows[b-fvjqter6yi] {
    width: 100%;
}

/* #3925 PR G (capture defect 10): the shell's table cells never wrap (_shell.css `.wep-table tbody td`), so a long
   status pushed the Action column out of the card. The status cell wraps instead; the action cell (a real table cell: its verbs sit in an
   inner .wep-replace-verb flex row, never a flex td) stays one line and as narrow as its buttons; and the table sits in the shell's .wep-table-wrap, which scrolls inside the card at any width
   rather than letting the page scroll. */
.wep-replace-rows .wep-replace-status[b-fvjqter6yi] {
    white-space: normal;
    overflow-wrap: anywhere;
    min-width: 16ch;
}

.wep-replace-action[b-fvjqter6yi] {
    white-space: nowrap;
    width: 1%;
}

.wep-replace-verb[b-fvjqter6yi] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

/* #4153 (cosmetic note 1): in the 1%-wide action cell the verbs' flex row wrapped to its narrowest, so Withdraw and the
   disabled Replace stacked one above the other even where the card had room for both. The td's `nowrap` never reached
   them: a flex row wraps its items by flex-wrap, not white-space. In the action cell the row keeps one line, so the cell
   is as wide as both verbs; where the card is narrower, the table scrolls inside its wrap (capture defect 10). The
   preview's verbs keep wrapping. */
.wep-replace-action .wep-replace-verb[b-fvjqter6yi] {
    flex-wrap: nowrap;
}

/* #3925 PR H (fix round 2, the screenshot pass): what a withdrawal means sits on a full-width line under the row while
   the confirm is open, where it wraps; in the action cell it widened the row past its wrap and clipped Replace. The line
   belongs to the row above it, so it carries no rule of its own. Mirrored in docs/design/prototypes/_replace.css. */
.wep-replace-withdraw-note-row td[b-fvjqter6yi] {
    white-space: normal;
    border-top: 0;
    padding-top: 0;
}

.wep-replace-rows tr:has(+ tr.wep-replace-withdraw-note-row) td[b-fvjqter6yi] {
    border-bottom: 0;
}

.wep-replace-withdraw-note[b-fvjqter6yi] {
    margin: 0;
}

.wep-replace-preview[b-fvjqter6yi] {
    margin-top: var(--wep-space-3);
}

.wep-replace-preview-rows[b-fvjqter6yi] {
    margin: var(--wep-space-2) 0;
    padding-left: var(--wep-space-4);
}

.wep-replace-preview-rows li + li[b-fvjqter6yi] {
    margin-top: var(--wep-space-1);
}

/* #3925 PR G (capture defect 15): a refused preview row the operator has to act on (an agent too old, an extra copy, a
   policy Forbid, …) is ATTENTION, not danger: the reason as warning TEXT. A fault the page could not get past is danger
   TEXT (#1759). An expected exclusion (a replace already active, no verified installer yet, nothing to replace) is no
   fault at all, so it is muted: a normal state never wears an attention colour. */
.wep-replace-refused[b-fvjqter6yi] {
    color: var(--wep-color-warn-fg);
}

.wep-replace-error[b-fvjqter6yi] {
    color: var(--wep-color-danger-text);
}

.wep-replace-excluded[b-fvjqter6yi] {
    color: var(--wep-color-fg-3);
}

.wep-replace-error[b-fvjqter6yi],
.wep-replace-notice[b-fvjqter6yi] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
}

/* #3925 PR G — under forced colours the browser strips the hue, so a refused row and a fault would read like every
   other line. Border STYLE is the channel forced colours keeps (#2053), in the system's own text colour: a refusal to
   act on takes the ATTENTION family's 3px dashed rule, a fault the BLOCKED family's 3px double rule. A muted exclusion
   needs none. Everything here is inside the media query, so normal rendering is unchanged. Pinned by
   ForcedColorsStateCensusTests. */
@media (forced-colors: active) {
    .wep-replace-refused[b-fvjqter6yi] {
        border-left: 3px dashed CanvasText;
        padding-left: var(--wep-space-1);
    }

    .wep-replace-error[b-fvjqter6yi] {
        border-left: 3px double CanvasText;
        padding-left: var(--wep-space-1);
    }
}
/* /Components/Fleet/SignedChallengeInputs.razor.rz.scp.css */
/* #1852 — scoped glue for the signed-challenge trio (application of the
 * existing kit only; every value is a kit token). Rendered mid-ceremony on
 * the emergency-stop reset / signer enroll + revoke flows.
 *
 * The credential + signature inputs are kit form fields (.wep-field /
 * .wep-field-label / .wep-input from _shell.css, design.md §17) at the full
 * card width — the kit .wep-input's 320px default is a toolbar width, not a
 * form width; this is the same sizing the EmergencyStopPanel reason field
 * carries (#1848). The request / re-issue button sits in its own row so it
 * keeps its intrinsic width inside the owning panel's column-flex card. */

.wep-signed-challenge-input[b-xmpvagwuhp] {
    width: 100%;
}

.wep-signed-challenge-actions[b-xmpvagwuhp] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}
/* /Components/Fleet/SystemHollowWithheldNote.razor.rz.scp.css */
/* #2166 U2 (KTD2) — the withheld-note's OWN sheet.
 *
 * It re-declares the console's explanatory-note measure (margin, 60ch, text-sm,
 * snug, fg-3) rather than inheriting it, because a Blazor scoped rule reaches
 * only its own component: `.wep-holds-note` on FleetHolds and
 * `.wep-endpoint-note` on FleetEndpointDetail are page-scoped and cannot reach
 * into a child. That is the recorded `::deep` lesson, and CatalogWinget's
 * `.wep-unverified-indicator` is the worked precedent for re-declaring it here.
 *
 * Every value is a kit token. The kit's `.wep-disclosure` family is inherited
 * from _shell.css and deliberately NOT redefined; nothing else is borrowed, so
 * the kit-class census sees no new dead vocabulary.
 */

.wep-hollow-withheld[b-tzi00t4kji] {
    margin: var(--wep-space-2) 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-3);
}

/* Each sentence is its own block so the reason, the queued fact and the posture
   cannot run together into one wall — and so the queued line can appear and
   disappear without shifting the reason's baseline. */
.wep-hollow-withheld-line[b-tzi00t4kji] {
    margin: 0 0 var(--wep-space-1) 0;
}

.wep-hollow-withheld-line:last-child[b-tzi00t4kji] {
    margin-bottom: 0;
}

/* The kit disclosure sits tighter under a one-line note than under a card —
   the same relationship FleetHolds gives `.wep-holds-why`. */
.wep-hollow-withheld-why[b-tzi00t4kji] {
    margin-top: var(--wep-space-2);
}
/* /Components/Fleet/WepByteRetest.razor.rz.scp.css */
/* #2157 plan U12 — the Re-test verb beside an amber byte chip.
 *
 * The page's `.wep-endpoint-row-action` and `.wep-endpoint-note-inline` rules are scoped to
 * FleetEndpointDetail and cannot reach this component's markup, so the verb carries its own
 * composition: the ghost button and its outcome line sit inline with the chip they follow and
 * wrap under it on a narrow row.
 */

.wep-byte-retest[b-byy6ku5p6j] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1) var(--wep-space-2);
}

/* The outcome line after the click. Colour stays on the shared .wep-fg-3 utility.
 *
 * #3944: it is a sentence (the queued notice, with what the feed serves meanwhile in its second
 * half), and it sits in the same `white-space: nowrap` status cell as the dialog below, outside the
 * dialog's host. Unwrapped it is one line that widens the table, so it restores wrapping for itself.
 * The verb beside it keeps the cell's flow.
 */
.wep-byte-retest-notice[b-byy6ku5p6j] {
    font-size: var(--wep-size-text-sm);
    white-space: normal;
}

/* #3944 — the confirm dialog wraps, wherever the verb is mounted.
 *
 * WepModal renders in place (it is not portalled), so the dialog is a descendant of the cell that
 * hosts this verb. On the endpoint page that is `.wep-endpoint-status-cell`, which is
 * `white-space: nowrap` so a pill label never breaks mid-word — and `white-space` inherits. Measured
 * on a live stack: each paragraph one line, 1000-1160 px of text in a 446 px dialog, a horizontal
 * scrollbar on the modal body, and the sentence that says what the feed serves never on screen.
 *
 * The host is this component's own element, so this scoped rule reaches it without `::deep`, and
 * everything inside inherits the wrap. `display: contents` gives it no box, so the cell's layout is
 * what it was. The verb and its outcome line sit outside the host and keep the cell's flow.
 */
.wep-byte-retest-dialog-host[b-byy6ku5p6j] {
    display: contents;
    white-space: normal;
}
/* /Components/Forms/WepCheckbox.razor.rz.scp.css */
.wep-check[b-fstp0owlfl],
.wep-radio[b-fstp0owlfl] {
    appearance: none;
    width: 14px;
    height: 14px;
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-1);
    margin: 0;
    vertical-align: -2px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.wep-radio[b-fstp0owlfl] {
    border-radius: 999px;
}

.wep-check:checked[b-fstp0owlfl],
.wep-radio:checked[b-fstp0owlfl] {
    background: var(--wep-color-accent-1);
    border-color: var(--wep-color-accent-1);
}

.wep-check:checked[b-fstp0owlfl]::after {
    content: "";
    width: 4px;
    height: 8px;
    border-right: 2px solid var(--wep-color-accent-fg);
    border-bottom: 2px solid var(--wep-color-accent-fg);
    transform: rotate(45deg) translate(0, -1px);
}

.wep-radio:checked[b-fstp0owlfl]::after {
    content: "";
    width: 6px;
    height: 6px;
    border-radius: 999px;
    background: var(--wep-color-accent-fg);
}

.wep-check:focus-visible[b-fstp0owlfl],
.wep-radio:focus-visible[b-fstp0owlfl] {
    box-shadow: var(--wep-focus-ring);
    outline: 2px solid transparent;
}

.wep-check[disabled][b-fstp0owlfl],
.wep-radio[disabled][b-fstp0owlfl] {
    opacity: .5;
    cursor: not-allowed;
}

.wep-check[aria-invalid="true"][b-fstp0owlfl],
.wep-radio[aria-invalid="true"][b-fstp0owlfl] {
    border-color: var(--wep-state-cveblocked-rule);
}

.wep-check-row[b-fstp0owlfl] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    cursor: pointer;
}

.wep-check-row[data-disabled="true"][b-fstp0owlfl] {
    cursor: not-allowed;
    color: var(--wep-color-fg-4);
}

.wep-check-row-error[b-fstp0owlfl] {
    color: var(--wep-state-cveblocked-fg);
}
/* /Components/Forms/WepDateRange.razor.rz.scp.css */
.wep-daterange-row[b-jqdp5iaohg] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-3);
    flex-wrap: wrap;
}

.wep-daterange-row .wep-input[b-jqdp5iaohg] {
    width: 200px;
}

.wep-daterange-arrow[b-jqdp5iaohg] {
    color: var(--wep-color-fg-3);
    font-family: var(--wep-font-mono);
    user-select: none;
}
/* /Components/Forms/WepFilePicker.razor.rz.scp.css */
.wep-filedrop[b-8svjxiwfb6] {
    display: block;
    width: 480px;
    border: 1px dashed var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    padding: var(--wep-space-4);
    text-align: center;
    background: var(--wep-color-bg-1);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    cursor: pointer;
    position: relative;
    box-sizing: border-box;
}

.wep-filedrop:focus-within[b-8svjxiwfb6] {
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
    outline: 2px solid transparent;
}

.wep-filedrop strong[b-8svjxiwfb6] {
    color: var(--wep-color-fg-1);
    font-weight: var(--wep-weight-semi);
}

.wep-filedrop .wep-filedrop-meta[b-8svjxiwfb6] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    margin-top: var(--wep-space-1);
}

.wep-filedrop[data-state="accepted"][b-8svjxiwfb6] {
    border-style: solid;
    background: var(--wep-state-clean-bg);
    border-color: var(--wep-state-clean-rule);
    color: var(--wep-state-clean-fg);
}

.wep-filedrop[data-state="rejected"][b-8svjxiwfb6] {
    border-style: solid;
    background: var(--wep-state-cveblocked-bg);
    border-color: var(--wep-state-cveblocked-rule);
    color: var(--wep-state-cveblocked-fg);
}

.wep-filedrop[data-state="rejected"] .wep-filedrop-meta[b-8svjxiwfb6] {
    color: var(--wep-state-cveblocked-fg);
}

.wep-filedrop input[type="file"][b-8svjxiwfb6] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}
/* /Components/Forms/WepInput.razor.rz.scp.css */
.wep-field[b-irr4ai9yhk] {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.wep-field-label[b-irr4ai9yhk] {
    display: block;
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    font-weight: var(--wep-weight-medium);
}

/* #1865 N.3 — the scoped copy of the required marker. Kept in LOCKSTEP with
 * _shell.css: this selector gains the scope attribute at build time and so
 * out-specifies the global rule, which is why a fix applied only to
 * _shell.css would render as no fix at all (the #887 lesson restated in
 * WepButton.razor.css and pinned by LabelledFillContrastTests).
 *
 * Was --wep-state-cveblocked-fg: required-ness rendered in the CVE-blocked
 * colour, so every label shouted a red "REQUIRED" at rest. Muted hint now;
 * .wep-field-error and .wep-input[aria-invalid="true"] keep the alarm
 * colour, so red on this form means an actual error again. */
.wep-field-label .wep-field-required[b-irr4ai9yhk] {
    color: var(--wep-color-fg-4);
    font-weight: var(--wep-weight-regular);
    letter-spacing: var(--wep-tracking-normal);
    text-transform: none;
    margin-left: 4px;
}

.wep-field-help[b-irr4ai9yhk] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
    font-family: var(--wep-font-mono);
}

.wep-field-error[b-irr4ai9yhk] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-state-cveblocked-fg);
}

.wep-input[b-irr4ai9yhk] {
    height: 28px;
    padding: 0 var(--wep-space-3);
    font: inherit;
    font-size: var(--wep-size-text-sm);
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    color: var(--wep-color-fg-1);
    width: 320px;
    box-sizing: border-box;
}

.wep-input.wep-input-mono[b-irr4ai9yhk] {
    font-family: var(--wep-font-mono);
}

.wep-input:hover[b-irr4ai9yhk] {
    border-color: var(--wep-color-border-2);
}

.wep-input:focus[b-irr4ai9yhk] {
    outline: 2px solid transparent;
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
}

.wep-input[disabled][b-irr4ai9yhk] {
    background: var(--wep-color-bg-2);
    color: var(--wep-color-fg-4);
    cursor: not-allowed;
}

.wep-input[aria-invalid="true"][b-irr4ai9yhk] {
    border-color: var(--wep-state-cveblocked-rule);
    box-shadow: 0 0 0 1px var(--wep-state-cveblocked-rule) inset;
}

.wep-textarea[b-irr4ai9yhk] {
    min-height: 80px;
    padding: var(--wep-space-2) var(--wep-space-3);
    font: inherit;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    resize: vertical;
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    color: var(--wep-color-fg-1);
    width: 480px;
    box-sizing: border-box;
}

.wep-textarea:hover[b-irr4ai9yhk] {
    border-color: var(--wep-color-border-2);
}

.wep-textarea:focus[b-irr4ai9yhk] {
    outline: 2px solid transparent;
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
}

.wep-textarea[disabled][b-irr4ai9yhk] {
    background: var(--wep-color-bg-2);
    color: var(--wep-color-fg-4);
    cursor: not-allowed;
}

.wep-textarea[aria-invalid="true"][b-irr4ai9yhk] {
    border-color: var(--wep-state-cveblocked-rule);
    box-shadow: 0 0 0 1px var(--wep-state-cveblocked-rule) inset;
}

.wep-input-group[b-irr4ai9yhk] {
    display: inline-flex;
    align-items: stretch;
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-1);
    height: 28px;
    width: 320px;
    box-sizing: border-box;
}

.wep-input-group:focus-within[b-irr4ai9yhk] {
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
    outline: 2px solid transparent;
}

.wep-input-group .wep-input[b-irr4ai9yhk] {
    border: none;
    height: auto;
    flex: 1;
    width: auto;
    box-shadow: none;
    background: transparent;
}

.wep-input-group .wep-input:focus[b-irr4ai9yhk] {
    box-shadow: none;
}

.wep-input-group .wep-input-affix[b-irr4ai9yhk] {
    display: inline-flex;
    align-items: center;
    padding: 0 var(--wep-space-2);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

.wep-input-group .wep-input-affix-prefix[b-irr4ai9yhk] {
    border-right: 1px solid var(--wep-color-border-1);
}

.wep-input-group .wep-input-affix-suffix[b-irr4ai9yhk] {
    border-left: 1px solid var(--wep-color-border-1);
}
/* /Components/Forms/WepMultiSelect.razor.rz.scp.css */
.wep-multi[b-d44juoqv5x] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1);
    min-height: 28px;
    padding: 2px var(--wep-space-2);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-1);
    width: 480px;
    box-sizing: border-box;
}

/* The inner .wep-multi-input sets `outline: none` for itself, so under forced
   colours, where box-shadow is forced to none, this container's transparent
   outline, painted in a system colour, is the only focus cue left (#2053). */
.wep-multi:focus-within[b-d44juoqv5x] {
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
    outline: 2px solid transparent;
}

.wep-multi[aria-invalid="true"][b-d44juoqv5x] {
    border-color: var(--wep-state-cveblocked-rule);
    box-shadow: 0 0 0 1px var(--wep-state-cveblocked-rule) inset;
}

.wep-multi[data-disabled="true"][b-d44juoqv5x] {
    background: var(--wep-color-bg-2);
    cursor: not-allowed;
}

.wep-multi .wep-chip[b-d44juoqv5x] {
    height: 20px;
    min-height: 0; /* the kit chip is 26px tall at least (#4561 U3); a chip inside the field keeps 20 */
}

.wep-multi-input[b-d44juoqv5x] {
    border: none;
    outline: none;
    background: transparent;
    flex: 1;
    min-width: 80px;
    padding: 0 4px;
    font: inherit;
    font-size: var(--wep-size-text-xs);
    font-family: var(--wep-font-mono);
    color: var(--wep-color-fg-1);
}
/* /Components/Forms/WepSelect.razor.rz.scp.css */
.wep-select[b-dfwz0pk0ns] {
    height: 28px;
    padding: 0 28px 0 var(--wep-space-3);
    font: inherit;
    font-size: var(--wep-size-text-sm);
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    color: var(--wep-color-fg-1);
    width: 320px;
    appearance: none;
    background-image:
        linear-gradient(45deg, transparent 50%, var(--wep-color-fg-2) 50%),
        linear-gradient(135deg, var(--wep-color-fg-2) 50%, transparent 50%);
    background-position: calc(100% - 14px) 12px, calc(100% - 9px) 12px;
    background-size: 5px 5px;
    background-repeat: no-repeat;
    cursor: pointer;
    box-sizing: border-box;
}

.wep-select:hover[b-dfwz0pk0ns] {
    border-color: var(--wep-color-border-2);
}

.wep-select:focus[b-dfwz0pk0ns] {
    outline: 2px solid transparent;
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
}

.wep-select[disabled][b-dfwz0pk0ns] {
    background-color: var(--wep-color-bg-2);
    color: var(--wep-color-fg-4);
    cursor: not-allowed;
}

.wep-select[aria-invalid="true"][b-dfwz0pk0ns] {
    border-color: var(--wep-state-cveblocked-rule);
    box-shadow: 0 0 0 1px var(--wep-state-cveblocked-rule) inset;
}
/* /Components/Forms/WepToggle.razor.rz.scp.css */
.wep-toggle[b-7ishmdb4jj] {
    appearance: none;
    width: 28px;
    height: 16px;
    border: 1px solid var(--wep-color-border-2);
    border-radius: 999px;
    background: var(--wep-color-bg-2);
    position: relative;
    cursor: pointer;
    transition: background 120ms var(--wep-ease-standard);
    vertical-align: -2px;
    flex-shrink: 0;
}

.wep-toggle[b-7ishmdb4jj]::after {
    content: "";
    position: absolute;
    top: 1px;
    left: 1px;
    width: 12px;
    height: 12px;
    border-radius: 999px;
    background: var(--wep-color-bg-1);
    box-shadow: 0 1px 2px rgb(0 0 0 / 0.2);
    transition: left 120ms var(--wep-ease-standard);
}

.wep-toggle:checked[b-7ishmdb4jj] {
    background: var(--wep-color-accent-1);
    border-color: var(--wep-color-accent-1);
}

.wep-toggle:checked[b-7ishmdb4jj]::after {
    left: 13px;
}

.wep-toggle:focus-visible[b-7ishmdb4jj] {
    box-shadow: var(--wep-focus-ring);
    outline: 2px solid transparent;
}

.wep-toggle[disabled][b-7ishmdb4jj] {
    opacity: .5;
    cursor: not-allowed;
}

@media (prefers-reduced-motion: reduce) {
    .wep-toggle[b-7ishmdb4jj],
    .wep-toggle[b-7ishmdb4jj]::after {
        transition: none;
    }
}
/* /Components/Home/DecisionRow.razor.rz.scp.css */
/*
    DecisionRow styles (Plan 2026-06-25-007 U7). Tokens only — [data-theme]/--wep-*,
    no hardcoded colors (design.md §5); no new motion beyond the inherited primitive
    hovers (R10). Scoped (b-...) to DecisionRow.razor.

    The Tier-0 at-rest emphasis is a left accent rail + a denser surface so an act-now
    row reads distinct from a Tier-2 housekeeping row at a glance — importance is NOT
    conveyed by sort position alone (anti-slop). The "act now" tag carries the same
    meaning as TEXT for non-visual / colorblind reads.
*/

/* U6b (Plan 2026-07-28-001, OQ3): populated-Home containment.
   - The body track is minmax(0, 1fr), never bare 1fr (= minmax(auto, 1fr):
     its minimum is the content min-content, so a long unbreakable package id
     forces the row wider than .wep-main — the U6 card-grid trap, R8).
   - position: relative anchors the row's .wep-sr-only spans (the act-button
     description + the defer aria-describedby target, both position:absolute).
     Without it they anchor to the initial containing block, escape
     .wep-main's overflow clip, and inflate the DOCUMENT past the 100vh shell
     on both axes — the .wep-table-wrap catalog phantom-scrollbar precedent,
     which is exactly the populated-Home body overscroll. */
.wep-decision-row[b-sbsq0mwx8i] {
    display: grid;
    grid-template-columns: minmax(7rem, max-content) minmax(0, 1fr) max-content;
    align-items: start;
    gap: var(--wep-space-4);
    padding: var(--wep-space-4) var(--wep-space-5);
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    /* Reserve the left accent gutter on every row so the two tier shapes align. */
    border-left: 3px solid var(--wep-color-border-1);
    position: relative;
}

/* Tier-0 (act-now): danger rail + a slightly stronger surface.
   #1759 — this used to read var(--wep-color-danger-1, var(--wep-color-accent-1)),
   and --wep-color-danger-1 was defined NOWHERE, so the rail always rendered the
   indigo fallback: the "emphasized" tier-0 rail resolved to the exact same
   accent-1 as tier-1's "muted" one below, and the rail carried no information at
   all. A rail is non-text, so it takes --wep-color-danger under the 3:1 floor
   (4.121:1 against the bg-0 canvas in light, 5.234:1 in dark). */
.wep-decision-row-tier0[b-sbsq0mwx8i] {
    border-left-color: var(--wep-color-danger);
    background: var(--wep-color-bg-2);
}

/* Tier-1 (decide-soon): a muted accent so it sits between act-now and housekeeping. */
.wep-decision-row-tier1[b-sbsq0mwx8i] {
    border-left-color: var(--wep-color-accent-1);
}

.wep-decision-state[b-sbsq0mwx8i] {
    /* The verdict/pill column. Reserved (min-width) on non-package rows so the list
       reads as one coherent column even when the verdict glyph is absent. */
    min-width: 7rem;
    display: flex;
    align-items: center;
}

.wep-decision-body[b-sbsq0mwx8i] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
    min-width: 0;
}

.wep-decision-head[b-sbsq0mwx8i] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-3);
    flex-wrap: wrap;
}

.wep-decision-title[b-sbsq0mwx8i] {
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
    /* U6b: emergency break for unbreakable tokens (package ids) — wrap inside
       the width-capped track instead of painting past the row into .wep-main's
       scroll area. `anywhere` also zeroes the min-content contribution, so
       track sizing and painting agree (the U6 card precedent). */
    overflow-wrap: anywhere;
}

.wep-decision-tier0-tag[b-sbsq0mwx8i] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    /* #1759 — the ACT NOW tag is the urgency affordance; it now reads danger
       instead of the accent indigo it has always rendered. Text takes the
       4.5:1 role token (6.058:1 on this row's bg-2 in light, 8.453:1 dark);
       the outline is non-text and takes danger under the 3:1 floor. */
    color: var(--wep-color-danger-text);
    border: 1px solid var(--wep-color-danger);
    border-radius: var(--wep-radius-xs);
    padding: 0 var(--wep-space-2);
}

.wep-decision-detail[b-sbsq0mwx8i] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
    line-height: var(--wep-line-relaxed);
    /* U6b: same emergency break — blocked-demand detail lines carry long mono
       package ids + endpoint names. */
    overflow-wrap: anywhere;
}

.wep-decision-deferred[b-sbsq0mwx8i] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-2);
}

.wep-decision-defer-error[b-sbsq0mwx8i] {
    font-size: var(--wep-size-text-sm);
    /* #1759 — a defer write-failure reads as danger, not as an accent-coloured
       line indistinguishable from a selected row. */
    color: var(--wep-color-danger-text);
}

.wep-decision-actions[b-sbsq0mwx8i] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
}
/* /Components/Home/DecisionsEmptyState.razor.rz.scp.css */
/*
    DecisionsEmptyState styles (Plan 2026-06-25-007 U7). Tokens only; no new motion.
    A calm, low-chrome state — not a metric wall (U0 ADR). Scoped to the component.
*/

.wep-decisions-empty[b-il0yposp1c] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-8);
    margin-top: var(--wep-space-8);
}

.wep-decisions-empty-headline[b-il0yposp1c] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
}

.wep-decisions-empty-title[b-il0yposp1c] {
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
    color: var(--wep-color-fg-1);
}

.wep-decisions-empty-body[b-il0yposp1c] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    line-height: var(--wep-line-relaxed);
    margin: 0;
    max-width: 48rem;
}

.wep-decisions-empty-launcher[b-il0yposp1c] {
    margin: 0;
}
/* /Components/Home/HomeLauncher.razor.rz.scp.css */
/*
    HomeLauncher styles (Plan 2026-06-25-007 U8). The card-grid geometry is REPLICATED
    here from Pages/Home.razor.css because Blazor scoped CSS does not cross the
    component boundary (the parent's b-... attribute is not inherited by this child).
    Tokens only; no hex literals; no new motion beyond the existing card hover.
*/

.wep-home-launcher[b-lnulm4k25x] {
    margin: var(--wep-space-8) 0 0;
}

.wep-home-launcher-head[b-lnulm4k25x] {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--wep-space-4);
    flex-wrap: wrap;
    margin: 0 0 var(--wep-space-3);
}

.wep-home-launcher-label[b-lnulm4k25x] {
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    font-weight: var(--wep-weight-medium);
}

.wep-home-launcher-palette[b-lnulm4k25x] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-home-kbd[b-lnulm4k25x] {
    display: inline-flex;
    align-items: center;
    padding: 1px 6px;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    font-weight: var(--wep-weight-medium);
    color: var(--wep-color-fg-2);
    background: var(--wep-color-bg-2);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
}

.wep-home-grid[b-lnulm4k25x] {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--wep-space-4);
}

@media (min-width: 1200px) {
    .wep-home-grid[b-lnulm4k25x] {
        grid-template-columns: repeat(3, 1fr);
    }
}

.wep-home-card[b-lnulm4k25x] {
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    padding: var(--wep-space-5);
    text-decoration: none;
    color: inherit;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
    transition: border-color var(--wep-motion-fast) var(--wep-ease-standard),
                background var(--wep-motion-fast) var(--wep-ease-standard);
}

.wep-home-card:hover[b-lnulm4k25x] {
    border-color: var(--wep-color-border-2);
    background: var(--wep-color-bg-2);
}

.wep-home-card:focus-visible[b-lnulm4k25x] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

.wep-home-card-head[b-lnulm4k25x] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-3);
    justify-content: space-between;
}

.wep-home-card-name[b-lnulm4k25x] {
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
}

.wep-home-card-hotkey[b-lnulm4k25x] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    letter-spacing: var(--wep-tracking-normal);
}

.wep-home-card-route[b-lnulm4k25x] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-home-card-desc[b-lnulm4k25x] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    line-height: var(--wep-line-relaxed);
}
/* /Components/Inventory/InventoryBulkManage.razor.rz.scp.css */
/* #4213 U18 (R22) — the bulk Manage's confirm list and its results: one line per app, its name, its coordinate in
 * mono, and what its subscribe would seed (or how it ended). */
.wep-inventory-bulk-lead[b-4hievuubhy] {
    margin: 0 0 var(--wep-space-3);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-inventory-bulk-list[b-4hievuubhy] {
    list-style: none;
    margin: 0 0 var(--wep-space-3);
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
}

.wep-inventory-bulk-item[b-4hievuubhy] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-1) var(--wep-space-3);
}

.wep-inventory-bulk-seed[b-4hievuubhy] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* A seed that could not be read is a warning in words, never "nothing to seed". */
.wep-inventory-bulk-seed.is-unread[b-4hievuubhy] {
    color: var(--wep-color-warn-fg);
}

.wep-inventory-bulk-result[b-4hievuubhy] {
    margin: var(--wep-space-3) 0;
    padding: var(--wep-space-3) var(--wep-space-4);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
}

.wep-inventory-bulk-summary[b-4hievuubhy] {
    margin: 0 0 var(--wep-space-2);
    font-weight: var(--wep-weight-semi);
}

.wep-inventory-bulk-status[b-4hievuubhy] {
    font-size: var(--wep-size-text-xs);
    text-transform: uppercase;
    letter-spacing: var(--wep-tracking-wide);
    color: var(--wep-color-fg-2);
}
/* /Components/Inventory/InventoryEndpointsDrawer.razor.rz.scp.css */
/* #4213 U17 (R20) — the endpoints drawer's body: one sentence on the spread, then one line per endpoint (hostname,
 * versions, a held marker, last seen). The drawer itself is the kit's WepEvidenceDrawer. */
.wep-inventory-drawer-lead[b-j9lnw4bt2t] {
    margin: 0 0 var(--wep-space-3);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-inventory-drawer-endpoints[b-j9lnw4bt2t] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}

.wep-inventory-drawer-endpoint[b-j9lnw4bt2t] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-3);
    padding: var(--wep-space-1) 0;
    border-bottom: 1px solid var(--wep-color-border-1);
}

.wep-inventory-drawer-versions[b-j9lnw4bt2t] {
    flex: 1 1 auto;
    min-width: 0;
    color: var(--wep-color-fg-2);
}

.wep-inventory-drawer-seen[b-j9lnw4bt2t] {
    flex: none;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-inventory-drawer-note[b-j9lnw4bt2t] {
    margin: 0;
}

/* #4323 — a flat row's compliance flag, in the drawer's footer: its name, then the toggle the row carried. */
.wep-inventory-drawer-flag[b-j9lnw4bt2t] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin: 0 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}
/* /Components/Inventory/InventoryFilterBar.razor.rz.scp.css */
/* #1852 — the /inventory filter bar as ONE kit chip group. #4323 — as the approved #4213 drawing has it: one row of
 * chips under the search box (the kit's .wep-chip-row, global), the manager chips and msstore, "Class ▾" and
 * "Catalog ▾" (ListFilterMenu), and Flagged, with no visible facet captions; each facet keeps its group and its name
 * for assistive technology. The chips' look is the list pages' (_shell.css, .wep-list-page). Tokens only. */

.wep-inventory-filter-bar[b-1v5vsfsukg] {
    margin: 0 0 var(--wep-space-3);
}

/* A facet's chips stay together and wrap as one run when the row is short of room. */
.wep-inventory-filter-group[b-1v5vsfsukg] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    min-width: 0;
}

/* #3966 U14 (R3) — the catalog chip of a view this load could not evaluate,
 * drawn as the Fleet overview draws its own (FleetEndpointList.razor.css). It
 * is a dash, not a count, so it is not a control: the kit chip has a pointer
 * cursor and a solid border, this one has neither. The reason is the line under
 * the bar, in text, so the border is never the only channel. */
.wep-inventory-chip-unevaluated[b-1v5vsfsukg] {
    border-style: dashed;
    cursor: default;
}

/* The line that says why (the kit's .wep-fleet-view-note, _shell.css) takes a
   line of its own under the chips. */
.wep-inventory-filter-note[b-1v5vsfsukg] {
    margin: var(--wep-space-2) 0 0;
}
/* /Components/Inventory/InventoryForeignBucket.razor.rz.scp.css */
/* #4213 U16 (R19) — the foreign installs as one counted bucket: the count (a link to the Foreign view), what it
 * counts, and the link again in words. Never an attention colour: software the platform does not manage is a fact
 * about the fleet, not a fault.
 *
 * #4323 (the approved #4213 drawing): a dashed outline on the page's own ground, set apart from the tables above it
 * without claiming a state; the count in mono at a step above the body, the line at prose size with its quiet second
 * line under it, and "Review foreign →" as a button at the far end. */
.wep-inventory-bucket[b-jmjbqqf3c5] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-4);
    margin: var(--wep-space-5) 0;
    padding: var(--wep-space-3) 14px;
    border: 1px dashed var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-0);
}

.wep-inventory-bucket-count[b-jmjbqqf3c5] {
    flex: none;
    font-family: var(--wep-font-mono);
    font-variant-numeric: tabular-nums;
    font-size: 18px;
    font-weight: var(--wep-weight-medium);
    color: var(--wep-color-fg-1);
    text-decoration: none;
}

a.wep-inventory-bucket-count:hover[b-jmjbqqf3c5],
a.wep-inventory-bucket-count:focus-visible[b-jmjbqqf3c5] {
    text-decoration: underline;
}

.wep-inventory-bucket-text[b-jmjbqqf3c5] {
    flex: 1 1 auto;
    margin: 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-inventory-bucket-sub[b-jmjbqqf3c5] {
    display: block;
    margin-top: 2px;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}
/* /Components/Inventory/InventoryManagedTable.razor.rz.scp.css */
/* #4213 U16 (R18) — the Managed table's own cells. The spread reads "1.83.112 on 9 · 1.83.109 on 1": each version
 * mono, the "on N" muted, and the cell wraps between versions rather than pushing the table wide.
 *
 * #4323 (the approved #4213 drawing): a bar opens the spread, 120px by 8px, each version a segment in fixed tenths
 * (InventorySpreadBar). Ten width classes, never a width from the data: InlineStyleRelocationTests forbids a style
 * attribute, and Marc chose tenths (2026-10-14). The newest version's segment is in the lead colour (the drawing's
 * green), the others quiet: a spread is a fact about the fleet, so no attention colour. */
.wep-inventory-spread[b-6bvd096opc] {
    white-space: normal;
    min-width: 18ch;
}

.wep-inventory-spread-bar[b-6bvd096opc] {
    display: inline-flex;
    width: 120px;
    height: 8px;
    margin-right: var(--wep-space-2);
    border-radius: 2px;
    background: var(--wep-color-bg-2);
    vertical-align: middle;
}

.wep-inventory-spread-seg[b-6bvd096opc] {
    display: block;
    height: 100%;
    background: var(--wep-color-fg-4);
}

.wep-inventory-spread-seg:first-child[b-6bvd096opc] {
    border-radius: 2px 0 0 2px;
}

.wep-inventory-spread-seg:last-child[b-6bvd096opc] {
    border-radius: 0 2px 2px 0;
}

.wep-inventory-spread-seg:only-child[b-6bvd096opc] {
    border-radius: 2px;
}

.wep-inventory-spread-seg.is-lead[b-6bvd096opc] {
    background: var(--wep-verdict-cell-pass-fg);
}

.wep-inventory-spread-w1[b-6bvd096opc] { width: 10%; }
.wep-inventory-spread-w2[b-6bvd096opc] { width: 20%; }
.wep-inventory-spread-w3[b-6bvd096opc] { width: 30%; }
.wep-inventory-spread-w4[b-6bvd096opc] { width: 40%; }
.wep-inventory-spread-w5[b-6bvd096opc] { width: 50%; }
.wep-inventory-spread-w6[b-6bvd096opc] { width: 60%; }
.wep-inventory-spread-w7[b-6bvd096opc] { width: 70%; }
.wep-inventory-spread-w8[b-6bvd096opc] { width: 80%; }
.wep-inventory-spread-w9[b-6bvd096opc] { width: 90%; }
.wep-inventory-spread-w10[b-6bvd096opc] { width: 100%; }

.wep-inventory-spread-on[b-6bvd096opc] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* The catalog labels of an app's installs: pills that wrap between one another. */
.wep-inventory-states[b-6bvd096opc] {
    white-space: normal;
}

/* #4213 L4 walk: a display name may be 512 characters (InventoryFieldRules.MaxNameLength), and the kit table nowraps
 * its cells, so one long name pushed every other column past the page's edge for every row. The name cell wraps
 * instead, within a measure, breaking inside a word only when it must; a short name sits as it did. */
.wep-inventory-name[b-6bvd096opc] {
    width: 34%;
    white-space: normal;
    min-width: 20ch;
}

.wep-inventory-name .wep-pkg-text[b-6bvd096opc] {
    max-width: 48ch;
    overflow-wrap: anywhere;
}
/* /Components/Inventory/InventoryNeedsYouBlock.razor.rz.scp.css */
/* #4213 U16 (R17) — the Needs-you block that leads /inventory's default view.
 *
 * #4323 (the approved #4213 drawing): a lead block. A bordered box on the surface with the attention rule on its left
 * edge, which is right here because the block exists only when something needs the operator (it is absent at zero,
 * and a calm page never wears it); its head holds the title and, at the far end, its one-line lead; then the lines,
 * with no header row on screen (the column names stay in the table for assistive technology) and no rule under the
 * last one. The pills carry each line's state. */
.wep-inventory-needs[b-2tr3lnq47u] {
    margin: 0 0 var(--wep-space-5);
    border: 1px solid var(--wep-color-border-2);
    border-left: 3px solid var(--wep-state-detonating-fg);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

.wep-inventory-needs-head[b-2tr3lnq47u] {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--wep-space-1) var(--wep-space-3);
    margin: 0;
    padding: 10px 14px;
    border-bottom: 1px solid var(--wep-color-border-1);
}

.wep-inventory-needs-title[b-2tr3lnq47u] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-inventory-needs-lead[b-2tr3lnq47u] {
    margin: 0;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* The column names, out of sight: the drawing's lines have no header row. */
.wep-inventory-needs[b-2tr3lnq47u]  .wep-inventory-needs-table thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
}

.wep-inventory-needs[b-2tr3lnq47u]  .wep-inventory-needs-table tbody tr:last-child > td {
    border-bottom: 0;
}

/* The one line that says what a line means is prose: quiet, and it wraps, where the kit table nowraps its cells. */
.wep-inventory-needs-why[b-2tr3lnq47u] {
    white-space: normal;
    min-width: 24ch;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* #4213 L4 walk: a display name may be 512 characters (InventoryFieldRules.MaxNameLength), and the kit table nowraps
 * its cells, so one long name pushed every other column past the page's edge for every row. The name cell wraps
 * instead, within a measure, breaking inside a word only when it must; a short name sits as it did. */
.wep-inventory-name[b-2tr3lnq47u] {
    width: 34%;
    white-space: normal;
    min-width: 20ch;
}

.wep-inventory-name .wep-pkg-text[b-2tr3lnq47u] {
    max-width: 48ch;
    overflow-wrap: anywhere;
}

/* The capped-lines note, inside the box. */
.wep-inventory-needs > .wep-fleet-view-note[b-2tr3lnq47u] {
    margin: 0;
    padding: var(--wep-space-2) 14px;
}
/* /Components/Inventory/InventoryStatusPill.razor.rz.scp.css */
/* #4213 U16 (R18) — one catalog label: the endpoint page's pill, then a muted "on N" when fewer than all of the
 * app's endpoints read it. The pair never breaks apart; two labels wrap between them. */
.wep-inventory-state[b-40oz2yuuau] {
    display: inline-flex;
    align-items: baseline;
    gap: var(--wep-space-1);
    margin-right: var(--wep-space-2);
    white-space: nowrap;
}

.wep-inventory-state-on[b-40oz2yuuau] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}
/* /Components/Inventory/InventoryTable.razor.rz.scp.css */
/* #4213 U16 — /inventory's flat views, Foreign and Everything.
 *
 * #4323 (the approved #4213 drawing): EVERY ROW IS ONE LINE AT ONE HEIGHT. #4213 L5 virtualizes these views, and
 * Virtualize needs every row to be one item size, so no cell may wrap: the kit table already nowraps its cells, and
 * #1852 and the L4 walk had let the Sources and Name cells wrap. Now the name gives way first (the catalog list's
 * rule: `max-width: 0` takes its content out of the column's minimum, and the name ends in an ellipsis with the whole
 * name in its title and in the drawer), the version clips the same way, and the sources hold at most two chips and a
 * "+N" on their one line. */
/* #4213 U20 (KTD12): the table is virtualized now, and the mode itself draws every cell the row's height
 * (WepFlatRow, the 45 px the 44 px cells plus their rule made) on one line, with table-layout: fixed. The columns take
 * these header widths, measured on the L5 walk so that at 1440 the class ("online-installer"), two source chips and
 * the endpoint count with its "1 of 3 held" chip fit whole; the name gives way first; Last seen takes the rest. */
.wep-inventory-table-wrap[b-vd6cf0zt94]  .wep-inventory-flat tbody td {
    white-space: nowrap;
}

.wep-inventory-flat-th-name[b-vd6cf0zt94] { width: 26%; }
.wep-inventory-flat-th-version[b-vd6cf0zt94] { width: 11%; }
.wep-inventory-flat-th-class[b-vd6cf0zt94] { width: 14%; }
.wep-inventory-flat-th-compliance[b-vd6cf0zt94] { width: 10%; }
.wep-inventory-flat-th-sources[b-vd6cf0zt94] { width: 16%; }
.wep-inventory-flat-th-endpoints[b-vd6cf0zt94] { width: 13%; }

.wep-inventory-flat-name[b-vd6cf0zt94] {
    max-width: 0;
}

.wep-inventory-flat-name .wep-pkg-text[b-vd6cf0zt94] {
    min-width: 0;
}

.wep-inventory-flat-name .wep-list-name[b-vd6cf0zt94] {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.wep-inventory-flat-clip[b-vd6cf0zt94] {
    max-width: 16ch;
    overflow: hidden;
    text-overflow: ellipsis;
}

.wep-inventory-sources[b-vd6cf0zt94] {
    white-space: nowrap;
}
/* /Components/Layout/AppLayout.razor.rz.scp.css */
/*
 * Per design.md §4.1 + prototypes/_shell.css — canonical grid composition.
 * The matching token-driven layout rules live in /css/_shell.css; this
 * isolated file scopes the .wep-shell, .wep-main, and .wep-shell-foot rules
 * to AppLayout's render tree so a sibling layout (e.g. the WPF-preview
 * bootstrap-wizard web rendering) doesn't accidentally inherit them.
 */

/* Plan 2026-07-01-002 U1 (R1): third `auto` row = the optional footer
 * status-bar. Collapses to zero when AppLayout renders no .wep-shell-foot
 * (Footer null under Saas/OnPrem), so the shell always fits exactly 100vh
 * and footer chrome can never spawn a second, page-level scrollbar.
 *
 * Plan 2026-07-28-001 U6b: flexible tracks are minmax(0, 1fr), never bare
 * 1fr (= minmax(auto, 1fr): the track minimum is the items' min-content,
 * so tall/wide content grows the track past the viewport instead of
 * .wep-main scrolling). Same trap + fix as the Home card grid (U6, R8). */
.wep-shell[b-on87be99ad] {
    display: grid;
    grid-template-columns: 220px minmax(0, 1fr);
    grid-template-rows: 44px minmax(0, 1fr) auto;
    grid-template-areas:
        "ctx ctx"
        "nav main"
        "foot foot";
    height: 100vh;
}

/* The shell's SINGLE scroll region (U6b hardening): explicit zero minimums
 * pin the grid-item containment floor, and position: relative makes
 * .wep-main the containing block for un-anchored absolute descendants
 * (.wep-sr-only spans) so they scroll + clip WITH the region instead of
 * anchoring to the initial containing block and inflating the document
 * past the 100vh shell (the .wep-table-wrap catalog phantom-scrollbar
 * mechanism, reproduced by populated-Home DecisionRows on both axes).
 * Mirrors _shell.css (both copies move together — #887). */
.wep-main[b-on87be99ad] {
    grid-area: main;
    overflow: auto;
    display: flex;
    flex-direction: column;
    min-width: 0;
    min-height: 0;
    position: relative;
}

.wep-shell-foot[b-on87be99ad] {
    grid-area: foot;
    min-height: 0;
}

/* THE DESKTOP VIEWPORT LADDER IS NOT MIRRORED HERE — plan 2026-09-06-2142 U1.
 *
 * The #887 rule above is about the DECLARATIONS: `.wep-shell`'s grid and
 * `.wep-main`'s containment floor exist in both files and move together.
 * The ladder's viewport rules (1920 and 2560 rungs, and the 1200px docking
 * gutter that shipped before them) live ONLY in /css/_shell.css, matching
 * the shipped precedent — the catalog drawer's gutter was never mirrored
 * here either, and it works. Two reasons, and both still hold:
 *
 *   1. The gutter is a `:has()` rule. Blazor's scoped-CSS rewrite appends
 *      the scope attribute to the LAST compound selector, and neither
 *      drawer is part of AppLayout's render tree, so a mirrored copy would
 *      not match the elements it names.
 *   2. The shared sheet already reaches this element. The scoped copy
 *      declares no `padding-right` and no `transition`, so it does not
 *      outrank the shared rule for the properties the ladder sets.
 *
 * THE SAME SEAM NOW CARRIES THE WORKSPACE GUTTER (#2086). `.wep-main`'s
 * base `padding-left`/`padding-right` — the 24px body gutter that 45 of 45
 * surfaces were missing — is declared in /css/_shell.css for reason 2
 * above, and only reaches this element because the copy below declares no
 * padding of its own.
 *
 * If you ever add a `padding-*` or `transition` declaration to `.wep-main`
 * here, you will silently kill the workspace gutter AND the docked
 * drawer's. Read /css/_shell.css's ladder header before you do.
 * ViewportLadderTests.Scoped_AppLayout_copy_never_outranks_the_shared_gutter
 * fails if you try.
 */
/* /Components/Layout/BlazorAuthLayout.razor.rz.scp.css */
/* Scoped styles for BlazorAuthLayout. Per Plan 2026-05-15-002 U1 / D1
 * (centered card vs density tension): auth surfaces are a single-action
 * known exception to design.md's density-over-whitespace principle.
 * No tabular data, no row density to optimize for — a centered card
 * with limited width on a wide viewport is the right composition.
 *
 * design.md visual thesis (Bloomberg-terminal-meets-court-record) is
 * preserved via the underlying _shell.css tokens — typography,
 * border discipline, accent-blue, mono digests stay on-brand. The
 * card itself is a small token-driven concession to auth being a
 * single-action surface, not a console.
 */

.wep-auth-body[b-d130njsqh9] {
    margin: 0;
    min-height: 100vh;
    background: var(--wep-color-bg-0);
    color: var(--wep-color-fg-1);
}

.wep-auth-main[b-d130njsqh9] {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    padding: var(--wep-space-6);
}

.wep-auth-card[b-d130njsqh9] {
    /* Limited width — keeps the form legible at 1440+ without sprawling.
     * The .wep-card base provides bg, border, padding, radius via tokens. */
    width: 100%;
    max-width: 420px;
}

/* Wide variant for /community/agents — bootstrap JSON pre-block needs
 * horizontal room without horizontal scroll on typical token shapes.
 * Same single-action exception as the narrow card, just larger. */
.wep-auth-card-wide[b-d130njsqh9] {
    max-width: 720px;
}
/* /Components/Layout/CommunityFooter.razor.rz.scp.css */
/*
 * CommunityFooter — scoped styles for the Plan 2026-06-25-003 U8 milestone slot
 * (the next-step nudge / post-activation conversion CTA). Colors come from the
 * --wep-* token contract only — no hex literals; theming is the global
 * [data-theme] token remap (KTD6). No motion declared (R10).
 *
 * The pre-existing footer label/count/disclosure spans keep their inherited
 * layout; these rules only restrain the added nudge/CTA so it reads as one quiet
 * line, density over whitespace.
 */

/*
 * #1479-adjacent UI defect (2026-07-27 screenshot walk): the footer element
 * itself had NO container rule anywhere — not here, not in _shell.css. It was a
 * plain block of adjacent inline spans, and Blazor's compiler strips the
 * whitespace-only text nodes between elements, so the four segments rendered
 * butted together on every authenticated page:
 *
 *   "…0 of 50 endpoints activeNext step: Enroll an agentNo compliance claims."
 *
 * Flex + gap fixes it at the container, which is whitespace-trimming-proof —
 * relying on inter-element whitespace would reintroduce the bug the next time
 * the markup is reformatted. The interpuncts are decorative separators marked
 * aria-hidden via ::before so screen readers hear four fields, not punctuation.
 */
.wep-community-footer[b-gqclt3k1gy] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-1) var(--wep-space-3);
    padding: var(--wep-space-2) var(--wep-space-6);
    border-top: 1px solid var(--wep-color-border-1);
    background: var(--wep-color-bg-1);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* Separator between segments — never before the first, and never orphaned when
   the milestone slot is absent (fail-soft renders 3 spans, not 4). */
.wep-community-footer > span + span[b-gqclt3k1gy]::before {
    content: "·";
    margin-right: var(--wep-space-3);
    color: var(--wep-color-fg-4);
}

.wep-community-footer-label[b-gqclt3k1gy] {
    color: var(--wep-color-fg-2);
}

.wep-community-footer-nudge[b-gqclt3k1gy],
.wep-community-footer-cta[b-gqclt3k1gy] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-community-footer-nudge a[b-gqclt3k1gy],
.wep-community-footer-cta a[b-gqclt3k1gy] {
    color: var(--wep-color-link);
    text-decoration: none;
}

.wep-community-footer-nudge a:hover[b-gqclt3k1gy],
.wep-community-footer-nudge a:focus-visible[b-gqclt3k1gy],
.wep-community-footer-cta a:hover[b-gqclt3k1gy],
.wep-community-footer-cta a:focus-visible[b-gqclt3k1gy] {
    text-decoration: underline;
}
/* /Components/Layout/ContextBar.razor.rz.scp.css */
/*
 * Context bar layout. All token references go through /css/_shell.css —
 * this file is the placement-only surface for the bar grid area. Its ground,
 * rule and text colour are the navy shell's (#4654) and mirror _shell.css's
 * .wep-ctxbar; the two copies move together (#887).
 */

.wep-ctxbar[b-x0vd7zop0c] {
    grid-area: ctx;
    display: flex;
    align-items: center;
    gap: var(--wep-space-3);
    padding: 0 var(--wep-space-4);
    background: var(--wep-shell-bg);
    border-bottom: 1px solid var(--wep-shell-border);
    color: var(--wep-shell-fg);
    font-size: var(--wep-size-text-sm);
}

[b-x0vd7zop0c] .wep-platform {
    background: var(--wep-state-cveblocked-bg);
    border-color: var(--wep-state-cveblocked-rule);
}

[b-x0vd7zop0c] .wep-platform-badge {
    background: var(--wep-state-cveblocked-rule);
    color: var(--wep-color-fg-inv);
}
/* /Components/Layout/KeyboardMapOverlay.razor.rz.scp.css */
.wep-overlay-backdrop[b-a89oc4xome] {
    position: fixed;
    inset: 0;
    background: rgb(0 0 0 / 0.4);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: var(--wep-z-modal);
}

.wep-overlay-card[b-a89oc4xome] {
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    box-shadow: var(--wep-shadow-pop);
    width: 480px;
    max-height: 80vh;
    overflow: auto;
}

.wep-overlay-head[b-a89oc4xome] {
    display: flex;
    align-items: center;
    padding: var(--wep-space-3) var(--wep-space-4);
    border-bottom: 1px solid var(--wep-color-border-1);
}

.wep-overlay-head h2[b-a89oc4xome] {
    flex: 1;
    margin: 0;
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
}

.wep-overlay-close[b-a89oc4xome] {
    background: transparent;
    border: none;
    color: var(--wep-color-fg-3);
    font-size: var(--wep-size-text-lg);
    cursor: pointer;
    padding: 0 var(--wep-space-2);
}

.wep-overlay-close:hover[b-a89oc4xome] {
    color: var(--wep-color-fg-1);
}

.wep-overlay-body[b-a89oc4xome] {
    padding: var(--wep-space-3) var(--wep-space-4) var(--wep-space-4);
}

.wep-overlay-section[b-a89oc4xome] {
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    margin: var(--wep-space-3) 0 var(--wep-space-2);
}

.wep-overlay-section:first-child[b-a89oc4xome] {
    margin-top: 0;
}

.wep-overlay-row[b-a89oc4xome] {
    display: grid;
    grid-template-columns: 90px 1fr;
    gap: var(--wep-space-3);
    padding: 4px 0;
    align-items: baseline;
}

.wep-overlay-combo[b-a89oc4xome] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-1);
    background: var(--wep-color-bg-2);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    padding: 1px 6px;
    text-align: center;
    justify-self: start;
}

.wep-overlay-desc[b-a89oc4xome] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}
/* /Components/Layout/ListFilterMenu.razor.rz.scp.css */
/* #4323 — a chip that opens a short list of filter chips (the drawing's "Class ▾"). The list is anchored under the
 * chip's left edge and laid out as a wrapping row of the same chips. Mirrored in
 * docs/design/prototypes/_inventory-scoped.css for the board that draws it. */
.wep-list-menu[b-03wexb4cw2] {
    position: relative;
    display: inline-flex;
}

.wep-list-menu-caret[b-03wexb4cw2] {
    color: var(--wep-color-fg-3);
}

/* An outside click closes the list: while it is open this scrim covers the viewport beneath the list and takes the
 * click. It sits on the popover tier, as the Actions menu's does. */
.wep-list-menu-scrim[b-03wexb4cw2] {
    position: fixed;
    inset: 0;
    z-index: var(--wep-z-popover);
}

/* Absolutely positioned, so out of flow: nothing a flex parent would shrink. */
.wep-list-menu-list[b-03wexb4cw2] {
    position: absolute;
    top: calc(100% + var(--wep-space-1));
    left: 0;
    z-index: var(--wep-z-popover);
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    width: max-content;
    max-width: min(420px, calc(100vw - 2 * var(--wep-space-4)));
    padding: var(--wep-space-3);
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    box-shadow: var(--wep-shadow-pop);
}

.wep-list-menu-list[hidden][b-03wexb4cw2] {
    display: none;
}
/* /Components/Layout/MainLayout.razor.rz.scp.css */
/*
    Plan 2026-06-25-005 U4: the pending g-chord live region.

    A subtle bottom-left status line that lists the available continuations while a
    chord prefix is pending — NOT a toast (design.md §10 bars toasts): no motion, no
    auto-dismiss animation, no shadow pop. The element is ALWAYS in the DOM (a
    persistent aria-live region) but renders no visible box until a chord is pending,
    so it occupies no space and announces reliably on entry.
*/
.wep-chord-hint[b-vxpck8lzka] {
    position: fixed;
    left: var(--wep-space-4);
    bottom: var(--wep-space-4);
    z-index: var(--wep-z-modal);
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2) var(--wep-space-3);
    align-items: baseline;
}

.wep-chord-hint.is-pending[b-vxpck8lzka] {
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    box-shadow: var(--wep-shadow-pop);
    padding: var(--wep-space-2) var(--wep-space-3);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    max-width: 480px;
}

.wep-chord-hint kbd[b-vxpck8lzka] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-1);
    background: var(--wep-color-bg-2);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    padding: 1px 6px;
}

.wep-chord-hint-prefix[b-vxpck8lzka] {
    color: var(--wep-color-fg-3);
}

.wep-chord-hint-opt[b-vxpck8lzka] {
    color: var(--wep-color-fg-2);
    white-space: nowrap;
}
/* /Components/Layout/NavRail.razor.rz.scp.css */
/* The rail on navy (#4654). These rules mirror _shell.css's .wep-nav block;
 * the two copies move together (#887), and ShellStylesheetTests holds both to
 * the --wep-shell-* tokens, so neither can drift back to a page colour that
 * flips with the theme. */
.wep-nav[b-jceelu0n72] {
    grid-area: nav;
    background: var(--wep-shell-bg);
    border-right: 1px solid var(--wep-shell-border);
    color: var(--wep-shell-fg-muted);
    padding: var(--wep-space-3) var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    display: flex;
    flex-direction: column;
}

.wep-nav-section[b-jceelu0n72] {
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-shell-label);
    padding: var(--wep-space-3) var(--wep-space-3) var(--wep-space-1);
}

.wep-nav-link[b-jceelu0n72] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    padding: 6px var(--wep-space-3);
    border-radius: var(--wep-radius-xs);
    color: var(--wep-shell-fg-muted);
    text-decoration: none;
}

.wep-nav-link:hover[b-jceelu0n72] {
    background: var(--wep-shell-raised);
    color: var(--wep-shell-fg);
}

.wep-nav-link[aria-current="page"][b-jceelu0n72] {
    background: var(--wep-shell-current);
    color: var(--wep-shell-fg);
    font-weight: var(--wep-weight-medium);
    border-left: 2px solid var(--wep-shell-fg);
    padding-left: 10px;
}

.wep-nav-link:focus-visible[b-jceelu0n72] {
    outline: 2px solid var(--wep-shell-focus);
    outline-offset: 2px;
    box-shadow: none;
}

.wep-nav-key[b-jceelu0n72] {
    margin-left: auto;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-3xs);
    color: var(--wep-shell-key);
}

.wep-nav-link:hover .wep-nav-key[b-jceelu0n72],
.wep-nav-link[aria-current="page"] .wep-nav-key[b-jceelu0n72] {
    color: var(--wep-shell-fg-muted);
}

.wep-nav-foot[b-jceelu0n72] {
    margin-top: auto;
    padding: var(--wep-space-3);
    border-top: 1px solid var(--wep-shell-border);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-shell-key);
    font-family: var(--wep-font-mono);
}

/* Control-plane build version. Own line above the SHA/region so the string an
 * operator reads for "which build am I on" isn't buried mid-sentence; one step
 * up from the slot's key tone (mist against key) to carry that emphasis
 * WITHOUT inventing a token. Inherits the slot's mono face + 2xs size — no
 * new type scale. */
.wep-nav-version[b-jceelu0n72] {
    display: block;
    color: var(--wep-shell-fg-muted);
}
/* /Components/Layout/PageActionsMenu.razor.rz.scp.css */
/* #4213 U11 — the list pages' Actions menu: a disclosure, its list anchored under the button's LEFT edge. The page
 * head lays its actions out under the title, at the head's left, and a list anchored right would run off the
 * workspace (CatalogPackageActionsMenu's reason). Mirrored in docs/design/prototypes/_catalog-scoped.css for the
 * board that draws it. */
.wep-page-menu[b-obpwqmoblg] {
    position: relative;
    display: inline-flex;
}

/* An outside click closes the menu: while it is open this scrim covers the viewport beneath the list and takes the
 * click. It sits on the popover tier, above a drawer, so a click in the drawer closes the menu first. */
.wep-page-menu-scrim[b-obpwqmoblg] {
    position: fixed;
    inset: 0;
    z-index: var(--wep-z-popover);
}

/* Absolutely positioned, so out of flow: the overflow here clips nothing a flex parent would shrink. */
.wep-page-menu-list[b-obpwqmoblg] {
    position: absolute;
    top: calc(100% + var(--wep-space-1));
    left: 0;
    z-index: var(--wep-z-popover);
    width: 420px;
    max-width: calc(100vw - 2 * var(--wep-space-4));
    max-height: calc(100vh - 200px);
    overflow-y: auto;
    padding: var(--wep-space-2) 0;
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    box-shadow: var(--wep-shadow-pop);
}

/* height: auto, because an item is a button and the :where(button) baseline in _shell.css fixes every button at
 * 28px: an item held there fits its label and draws its sub-text over the next item (the #2905 shape).
 * PageActionsMenuTests pins it. */
.wep-page-menu-item[b-obpwqmoblg] {
    display: block;
    width: 100%;
    height: auto;
    padding: var(--wep-space-2) var(--wep-space-4);
    border: 0;
    background: none;
    font: inherit;
    color: var(--wep-color-fg-1);
    text-align: left;
    cursor: pointer;
}

.wep-page-menu-item:hover[b-obpwqmoblg],
.wep-page-menu-item:focus-visible[b-obpwqmoblg] {
    background: var(--wep-color-bg-2);
}

/* A verb the page cannot run now: listed, muted, with its reason as the sub-text. */
.wep-page-menu-item[aria-disabled="true"][b-obpwqmoblg] {
    color: var(--wep-color-fg-3);
    cursor: default;
}

.wep-page-menu-item[aria-disabled="true"]:hover[b-obpwqmoblg] {
    background: none;
}

.wep-page-menu-label[b-obpwqmoblg] {
    display: block;
}

/* The sub-text is a sentence (what the verb acts on, or why it cannot run), so it is prose at 14px (ADR
 * 2026-10-12-001). */
.wep-page-menu-sub[b-obpwqmoblg] {
    display: block;
    color: var(--wep-color-fg-3);
    font-size: var(--wep-size-text-sm);
}

/* #4323 — the button reads "Actions ▾", as the approved #4213 drawing has it: the caret says the button opens a list.
 * Decoration (aria-hidden): aria-expanded already says it to assistive technology. */
.wep-page-menu-caret[b-obpwqmoblg] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}
/* /Components/Layout/PageHead.razor.rz.scp.css */
/* THE FULL-BLEED ESCAPE IS NOT MIRRORED HERE — #2086, and deliberately.
 *
 * `.wep-main` gained a 24px workspace gutter, and this band is the one child
 * that must still reach the rail on one side and the viewport edge on the
 * other (60 of 60 artboards draw it that way). The escape is a negative
 * `margin-left`/`margin-right` declared in /css/_shell.css, sized from the
 * same `--wep-space-6` token as the gutter it escapes, plus two resets in
 * the drawer-dock blocks so a docked panel never has this band slide under
 * it. Those are `:has()` rules on an ancestor that is not part of this
 * component's render tree — the same reason AppLayout.razor.css does not
 * mirror the ladder — and the shared sheet reaches this element anyway
 * PRECISELY BECAUSE this rule declares no margin.
 *
 * Add a `margin` (or `margin-left`/`margin-right`) declaration here and the
 * scoped copy outranks the shared escape, the header stops reaching the
 * rail, and nothing else changes — the silent failure this note exists to
 * prevent. ViewportLadderTests.Page_head_keeps_its_full_bleed_escape fails
 * if you try. Everything else below is the shared sheet's rule, mirrored.
 *
 * #4561 U2: the head is the kit's two-column head on every page now (the
 * shared sheet's "ONE HEAD, EVERY PAGE"). Its bottom margin and its `:has()`
 * rule (no padding under a tab strip) live in the shared sheet only, for the
 * reasons above; the declarations mirrored here are the rest of it. */
.wep-page-head[b-6w7u1z2xto] {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: var(--wep-space-4);
    align-items: center;
    padding: var(--wep-space-4) var(--wep-space-6);
    border-bottom: 1px solid var(--wep-color-border-1);
    background: var(--wep-color-bg-1);
    position: relative;
}

.wep-crumbs[b-6w7u1z2xto] {
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
    margin-bottom: var(--wep-space-2);
}

.wep-page-title[b-6w7u1z2xto] {
    grid-column: 1;
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-1) var(--wep-space-3);
    font-size: var(--wep-size-text-xl);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
    margin: 0;
    flex-wrap: wrap;
}

.wep-page-meta[b-6w7u1z2xto] {
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-regular);
    color: var(--wep-color-fg-3);
    font-family: var(--wep-font-sans);
}

.wep-page-actions[b-6w7u1z2xto] {
    grid-column: 2;
    display: flex;
    justify-content: flex-end;
    gap: var(--wep-space-2);
    flex-wrap: wrap;
    align-items: center;
}

/*
 * 1-px indeterminate progress rule per design.md §3.5. Visible when
 * data-loading="true". Reduced-motion collapses to a static 1-px line.
 */
.wep-page-progress[b-6w7u1z2xto] {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 1px;
    background: var(--wep-color-bg-2);
    overflow: hidden;
    pointer-events: none;
    visibility: hidden;
}

.wep-page-head[data-loading="true"] .wep-page-progress[b-6w7u1z2xto] {
    visibility: visible;
}

.wep-page-head[data-loading="true"] .wep-page-progress[b-6w7u1z2xto]::after {
    content: "";
    position: absolute;
    left: -40%;
    top: 0;
    bottom: 0;
    width: 40%;
    background: var(--wep-color-accent-1);
    animation: wep-page-progress-slide-b-6w7u1z2xto 1400ms cubic-bezier(0.4, 0, 0.2, 1) infinite;
}

@keyframes wep-page-progress-slide-b-6w7u1z2xto {
    0%   { left: -40%; }
    100% { left: 100%; }
}

@media (prefers-reduced-motion: reduce) {
    .wep-page-head[data-loading="true"] .wep-page-progress[b-6w7u1z2xto]::after {
        animation: none;
        left: 0;
        width: 100%;
    }
}
/* /Components/Primitives/WepBanner.razor.rz.scp.css */
.wep-banner[b-z2f787tuiu] {
    display: flex;
    align-items: flex-start;
    gap: var(--wep-space-3);
    padding: var(--wep-space-3) var(--wep-space-4);
    border-left: 3px solid;
    font-size: var(--wep-size-text-sm);
}

.wep-banner-title[b-z2f787tuiu] {
    font-weight: var(--wep-weight-semi);
    flex-shrink: 0;
}

.wep-banner-body[b-z2f787tuiu] {
    flex: 1;
}

.wep-banner-action[b-z2f787tuiu] {
    margin-left: auto;
    flex-shrink: 0;
}

/* Variants — token-driven left-border + tinted background. */

.wep-banner-cveblocked[b-z2f787tuiu] {
    border-left-color: var(--wep-state-cveblocked-rule);
    background: var(--wep-state-cveblocked-bg);
    color: var(--wep-state-cveblocked-fg);
}

.wep-banner-warn[b-z2f787tuiu],
.wep-banner-degraded[b-z2f787tuiu] {
    border-left-color: var(--wep-state-detonating-rule);
    background: var(--wep-state-detonating-bg);
    color: var(--wep-state-detonating-fg);
}
/* /Components/Primitives/WepButton.razor.rz.scp.css */
.wep-btn[b-z2jkprvvcf] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
    height: 28px;
    padding: 0 var(--wep-space-3);
    font: inherit;
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-medium);
    border: 1px solid var(--wep-color-border-2);
    background: var(--wep-color-bg-1);
    color: var(--wep-color-fg-1);
    border-radius: var(--wep-radius-xs);
    cursor: pointer;
    text-decoration: none;
    /* button reset */
    appearance: none;
}

.wep-btn:hover[b-z2jkprvvcf] {
    background: var(--wep-color-bg-2);
}

.wep-btn:focus-visible[b-z2jkprvvcf] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

.wep-btn:disabled[b-z2jkprvvcf],
.wep-btn[aria-disabled="true"][b-z2jkprvvcf] {
    opacity: .45;
    cursor: not-allowed;
    pointer-events: none;
}

/* Primary — accent fill. #1725: this scoped copy duplicated _shell.css's
   .wep-btn-primary and still had the pre-fix fg-1/fg-inv rule (identical
   to body text) after that fix landed — Blazor CSS isolation scopes this
   file's selectors, giving them higher specificity than the global
   stylesheet, so THIS copy is what actually renders. Both copies must
   move together (the #887 lesson, same as WepStatusPill.razor.css). */

/* #1764: the fill moved from accent-1 to the accent-SOLID role. accent-1 was
   cleared under the 3:1 non-text floor as a "button fill", but this control
   writes a label on that fill — measured live on v0.137.0 at 3.163:1 (dark)
   and 4.473:1 (light) against a 13px/500 label, i.e. normal text at 4.5:1.
   This scoped copy is the one that renders (see above); _shell.css moved with
   it. */

.wep-btn-primary[b-z2jkprvvcf] {
    background: var(--wep-color-accent-solid);
    color: var(--wep-color-accent-fg);
    border-color: var(--wep-color-accent-solid);
    box-shadow: var(--wep-shadow-sm);
}

.wep-btn-primary:hover[b-z2jkprvvcf] {
    background: var(--wep-color-accent-solid-hover);
    border-color: var(--wep-color-accent-solid-hover);
}

/* Danger — paired with typed-confirm. */

.wep-btn-danger[b-z2jkprvvcf] {
    background: var(--wep-color-danger-bg);
    color: var(--wep-color-danger-fg);
    border-color: var(--wep-color-danger-bg);
}

.wep-btn-danger:hover[b-z2jkprvvcf] {
    background: var(--wep-color-danger-bg-hover);
    border-color: var(--wep-color-danger-bg-hover);
}

/* Danger-outline (#1848) — the DEMOTED danger: a rare, typed-confirm-gated
   destructive action (unassign-from-all-rings on FleetEndpointDetail) that
   must read as dangerous without being the loudest element on the page.
   Outline on bg-1 with the TEXT-tuned danger token (--wep-color-danger-text,
   #1759: --wep-color-danger fails AA as a foreground on every light
   surface); the border stays on --wep-color-danger, which is non-text
   and clears the 3:1 floor everywhere. Hover paints the cveblocked tint so the
   control still answers the pointer. Lives ONLY in this scoped sheet — the
   _shell.css prototype copy of the button ramp has no outline variant, and
   WepButton always renders with this scope, so nothing depends on it. */

.wep-btn-danger-outline[b-z2jkprvvcf] {
    background: var(--wep-color-bg-1);
    color: var(--wep-color-danger-text);
    border-color: var(--wep-color-danger);
}

.wep-btn-danger-outline:hover[b-z2jkprvvcf] {
    background: var(--wep-state-cveblocked-bg);
}

/* Ghost — borderless. */

.wep-btn-ghost[b-z2jkprvvcf] {
    border-color: transparent;
    background: transparent;
}

.wep-btn-ghost:hover[b-z2jkprvvcf] {
    background: var(--wep-color-bg-2);
}

/* Hotkey cap. */

.wep-btn-key[b-z2jkprvvcf] {
    margin-left: var(--wep-space-2);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-3xs);
    padding: 1px 5px;
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-1);
}

.wep-btn-primary .wep-btn-key[b-z2jkprvvcf] {
    color: var(--wep-color-fg-inv);
    border-color: rgb(255 255 255 / 0.25);
    background: transparent;
}

.wep-btn-danger .wep-btn-key[b-z2jkprvvcf] {
    color: var(--wep-color-danger-fg);
    border-color: rgb(255 255 255 / 0.25);
    background: transparent;
}

.wep-btn-danger-outline .wep-btn-key[b-z2jkprvvcf] {
    color: var(--wep-color-danger-text);
    border-color: var(--wep-color-danger);
    background: transparent;
}

/* /Components/Primitives/WepCommandPalette.razor.rz.scp.css */
/*
    Command-palette dimming for Cedar-denied Run commands
    (Plan 2026-06-25-005 U3; design.md §10 hard rule).

    A denied entry's glyph and title render at 55% opacity; its deny reason, in
    the meta line, stays at full strength. The row ALSO carries aria-disabled and
    is skipped by arrow/Enter selection — it rides the existing #004
    non-selectable machinery (the widened IsSelectable predicate), so this file
    only adds what the row looks like (the dim, and no pointer affordance), not a
    parallel behaviour.

    The dim is a static state, never animated (no toast, no transition). It sits
    on the glyph and the title, never on the row: opacity below 1 composites an
    element and all its descendants as one group, and a child's own opacity
    applies inside that group, so a dimmed row cannot hold an undimmed reason.
    Until #2964 the row carried the dim and `.is-denied .meta { opacity: 1 }`
    "restored" the reason, which did nothing: the reason rendered at 55%, about
    2.3:1 in light and 2.6:1 in dark. The reason's ancestors now carry no
    opacity, so it reads as .meta always does (fg-3, 5.1:1 or better on the
    palette's surface and on a hovered row) — the operator must be able to READ
    why. CommandPaletteDeniedReasonOpacityDesignTests measures both.

    Every rule in this file is mirrored in docs/design/prototypes/_shell.css (both
    copies move together — the #887 lesson): the prototypes cannot see a scoped
    sheet, and drew these rows untreated until #2906.
    CommandPaletteRowTreatmentDesignTests fails when the two copies disagree.
*/
.wep-cmdk-row.is-denied .kind[b-lpb1uk2kws],
.wep-cmdk-row.is-denied strong[b-lpb1uk2kws] {
    opacity: 0.55;
}

/*
    No pointer affordance (#3041, operator decision). A click on a denied row does nothing, yet
    _shell.css gives every row the pointer cursor and a bg-2 fill under the pointer, and once #2964
    took the dim off the row that fill drew at full strength, the same as on a row a click runs.
    The denied row keeps the default cursor, as the status rows below do, and under the pointer
    it keeps the transparent ground it has at rest. The reason stays at full strength.
*/
.wep-cmdk-row.is-denied[b-lpb1uk2kws] {
    cursor: default;
}

.wep-cmdk-row.is-denied:hover[b-lpb1uk2kws] {
    background: transparent;
}

/* The dim is a discrete state — never a transition — and explicitly motion-free
   under prefers-reduced-motion discipline (design.md §10). */
@media (prefers-reduced-motion: reduce) {
    .wep-cmdk-row.is-denied[b-lpb1uk2kws],
    .wep-cmdk-row.is-denied .kind[b-lpb1uk2kws],
    .wep-cmdk-row.is-denied strong[b-lpb1uk2kws] {
        transition: none;
    }
}

/*
    "?" Audit-scope informational rows (Plan 2026-06-25-005 U6): the non-result states
    (prompt / searching / no-match / error) and the rejected-facet hint. They are
    role="status" (announced), non-actionable, and read at reduced emphasis — never the
    pointer affordance of a selectable hit. A static state, no motion.

    That covers the fill as well as the cursor (#3237, operator decision). Until then only the
    cursor was dropped: no rule outranked _shell.css's `.wep-cmdk-row:hover`, so a status row
    under the pointer took the bg-2 fill of a row a click runs. It keeps the transparent ground
    it has at rest, as the denied row above does.
*/
.wep-cmdk-row.is-status[b-lpb1uk2kws] {
    opacity: 0.7;
    cursor: default;
    font-style: italic;
}

.wep-cmdk-row.is-status:hover[b-lpb1uk2kws] {
    background: transparent;
}

/*
    The keyboard-selected row (#2965): the row Enter will run. The component gives it
    `is-active` and points the input's aria-activedescendant at it, and focus stays in the
    input, so until #2965 nothing on screen moved with ↑/↓ — no stylesheet had a rule for it.
    It takes the hover fill, so the keys and the pointer mark a row the same way, plus a 2px
    accent rail on its left edge, which is what tells it from a row the pointer is merely over.
    accent-1 is the kit's rail token (tokens.css: "rails/borders"): 4.49:1 on the fill in light
    and 5.98:1 in dark, over the 3:1 a non-text state cue needs. A static state: no transition
    (design.md §10).

    Forced colours replace the fill and drop box-shadow, so both halves are gone under High
    Contrast. An outline survives, in Highlight, the system's colour for a selected item. The
    negative offset draws it inside the row, since the palette clips at its edges.
*/
.wep-cmdk-row.is-active[b-lpb1uk2kws] {
    background: var(--wep-color-bg-2);
    box-shadow: inset 2px 0 0 var(--wep-color-accent-1);
}

/*
    The rows are plain buttons, so Tab from the input puts focus on the first one, which is the
    selected row whenever it can be selected. The rail is a box-shadow, like the global focus ring
    (tokens.css `:focus-visible`), and this selector outranks that one, so on its own the rail
    replaced the ring and the row looked the same before and after Tab. Focus is always visible,
    never removed (tokens.css): the focused selected row paints both, the rail and the ring. The
    transparent outline is the #2053 High Contrast fallback every ring carries
    (ForcedColorsFocusIndicatorTests).
*/
.wep-cmdk-row.is-active:focus-visible[b-lpb1uk2kws] {
    outline: 2px solid transparent;
    box-shadow: inset 2px 0 0 var(--wep-color-accent-1), var(--wep-focus-ring);
}

@media (forced-colors: active) {
    .wep-cmdk-row.is-active[b-lpb1uk2kws] {
        outline: 2px solid Highlight;
        outline-offset: -2px;
    }
}
/* /Components/Primitives/WepDataTable.razor.rz.scp.css */
.wep-table-wrap[b-zwlzp5z2s0] {
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    overflow: auto;
    /* LOAD-BEARING, paired with the overflow above — deleting it is not a
       tidy-up. `.wep-main` is a COLUMN flex container (_shell.css: display:flex;
       flex-direction:column; min-height:0; overflow:auto) and a table rendered
       straight into the workspace is a direct flex item of it. A flex item's
       automatic minimum size (min-height:auto) applies only while its overflow
       is `visible` — CSS Box Sizing 3 §4.1 — so the `overflow: auto` above
       resolves this wrap's minimum height to 0 and makes it the only shrinkable
       item on the page: the flex algorithm hands it every pixel the page is over
       budget. There is no per-axis escape either — `overflow-x: auto` with
       `overflow-y: visible` computes the visible half to `auto`
       (CSS Overflow 3 §3.1).
       Measured live on v0.177.0 at 1440: /fleet/groups/{id} rendered BOTH its
       tables at clientHeight 0 (of 257px and 1035px of rows); /audit/search
       739px of 3351px; /catalog/activity 738px of 1691px. Comfortable density is
       strictly worse — it grows the rows, not the room. This is the #1859
       .wep-endpoint-facts trap with `auto` in place of `hidden`: the spec
       condition is "overflow is not visible", never "overflow is hidden", which
       is why both guards written after #1859 (they match only the `hidden`
       spelling) missed it. bUnit does no layout, so no render test can see this;
       the guard is the live clip census. Mirrored in
       docs/design/prototypes/_shell.css — both copies move together (#887). */
    flex-shrink: 0;
    /* Containing block for absolute descendants (the .wep-sr-only
       ineligible-reason spans on non-selectable rows). Without this they
       anchor to the initial containing block, ESCAPE this overflow clip,
       and stretch the document below the 100vh shell — the catalog page
       grew a phantom window scrollbar (sr-only spans at y=905..1742
       inflated documentElement.scrollHeight to ~1760). */
    position: relative;
}

/* ScrollContainer=false — the table was MEASURED to need no horizontal room at
   the authored 1440 rung, so it does not get a scroll container of its own and
   `.wep-main` becomes the nearest scrollport, which is what makes the sticky
   `thead` below work again. `flex-shrink: 0` restores the wrap's height but
   leaves it a scroll container, so `position: sticky` resolves against a
   scrollport that never moves: measured on the repro, the floor alone leaves the
   header scrolling away with the table (top −71), and dropping the overflow pins
   it at the scroll region's top edge (44). The wrap element itself stays — it is
   the frame and the row-flash anchor — and the sr-only spans the `position:
   relative` above anchors are still clipped by `.wep-main`'s own overflow, so
   nothing escapes the 100vh shell. Only for tables with zero horizontal
   overflow: without the container a wide table pushes the whole workspace
   sideways, which is what the wrap was added to prevent. Out-specifies the
   shared sheet's bare .wep-table-wrap (0,1,0) by construction. */
.wep-table-wrap.wep-table-wrap-noscroll[b-zwlzp5z2s0] {
    overflow: visible;
}

/* Give the sticky header back the corner clip the overflow above used to do.
   `overflow: auto` clipped the table to the wrap's `border-radius`; `visible`
   does not, so `thead th`'s bg-2 — a DIFFERENT ground from the wrap's bg-1 —
   painted square into the two rounded top corners. Measured, not theorised:
   the 1440 light shot of catalog-activity moved 20 channel levels against a
   gate that allows 6, and all eight of that artboard's shots failed while the
   other 624 held. `- 1px` because the wrap's 1px border sits outside the
   radius, so the INNER curve the old clip followed is one pixel tighter.
   Framed only: `.wep-table-wrap-flush` has no border and no radius, so there
   is no corner to restore. No `::deep`: the `thead`/`th` markup is this
   component's own, which is why the `.wep-table thead th` rule below reaches it
   unqualified — adding `::deep` here would move the scope attribute off the
   cells and silently match nothing. Mirrored in
   docs/design/prototypes/_shell.css — both copies move together (#887). */
.wep-table-wrap.wep-table-wrap-noscroll:not(.wep-table-wrap-flush) .wep-table thead th:first-child[b-zwlzp5z2s0] {
    border-top-left-radius: calc(var(--wep-radius-sm) - 1px);
}
.wep-table-wrap.wep-table-wrap-noscroll:not(.wep-table-wrap-flush) .wep-table thead th:last-child[b-zwlzp5z2s0] {
    border-top-right-radius: calc(var(--wep-radius-sm) - 1px);
}

/* The two BOTTOM corners are deliberately NOT rounded here, and the matching
   `tbody tr:last-child td` rules were tried and removed rather than left in.
   `.wep-table` is `border-collapse: collapse`, and a collapsed border ignores
   `border-radius` on the cell — Chrome still clips a cell's BACKGROUND to the
   radius, which is why the `thead th` rules above work (they carry bg-2), but
   the last row's 1px `border-bottom` is a border, not a background, so nothing
   rounds it. Measured with a same-session A/B of catalog-activity against the
   pre-opt-out render: exactly 6 pixels differ in dark and 8 in light, three at
   each bottom corner plus one at each top corner, out of a 1440-wide shot.
   Rounding them would mean `border-collapse: separate`, which changes how every
   table in the kit draws every border. Not worth six pixels — the eight
   catalog-activity baselines carry the residual instead. */

/* Plan 2026-09-06-2144 U5: Framed=false — the table sits inside a .wep-card,
   whose border / radius / ground are these same three declarations. The wrap
   stays for overflow and the flash anchor; its frame goes. Out-specifies the
   shared sheet's bare .wep-table-wrap (0,1,0) by construction. */
.wep-table-wrap.wep-table-wrap-flush[b-zwlzp5z2s0] {
    border: 0;
    border-radius: 0;
    background: transparent;
}

.wep-table[b-zwlzp5z2s0] {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--wep-size-text-xs);
}

.wep-table thead th[b-zwlzp5z2s0] {
    position: sticky;
    top: 0;
    z-index: var(--wep-z-sticky);
    background: var(--wep-color-bg-2);
    text-align: left;
    font-weight: var(--wep-weight-semi);
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    padding: var(--wep-space-2) var(--wep-space-3);
    /* #2495: the rule is drawn by the ::after below, not by this border. The
       border stays, transparent, so the collapsed grid keeps its 1px and no row
       below the header moves. */
    border-bottom: 1px solid transparent;
}

/* #2495: THE HEADER RULE BELONGS TO THE STICKY CELL. As a collapsed
   `border-bottom` it was painted by the TABLE, beneath the cells that stick,
   and Chrome lost it three ways — measured in headed Chrome 154 on the
   Coverage table of /policy/update-grant, 2026-09-30:
   - Shifted in 0.05px steps, the table lost the rule under EVERY header cell
     at 12 of 80 subpixel offsets (the header's bottom edge in the last ~0.13px
     of a device pixel). With the cells not sticky: 0 of 80.
   - Unsubscribing a row in place at a 1280px viewport lost it under MANAGER
     and ACTIONS only — the #2067 U4 walk's picture — for Git.Git as much as
     for Microsoft.PowerToys, and a reload brought it back. At 1440 neither
     removal lost it: what matters is where the in-place update leaves the
     table, not which row went.
   - Once the header actually sticks, the rule scrolled away with the table.
   `background-clip: padding-box` on the cell brings none of it back.
   Drawn here instead, in the sticky cell's own layer, it sticks with the
   header and painted in all three: 0 of 80 offsets, every step of both
   removals, and stuck. `bottom: -1px` against the padding edge puts it where
   the collapsed border was: a collapsed cell holds HALF its 1px border, so the
   padding edge sits 0.5px above the grid line and this box spans the line
   ±0.5px. At 1x the render is byte-identical wherever the old rule painted —
   68 of 80 sweep offsets, and 655 of the 686 design captures (the other 31
   differ by 1-12 antialiased pixels on pill dots and corners, none on a
   rule). What remains is Chrome's: right after an in-place update, cells can
   snap this box to adjacent device rows — a 1px step at a column edge where
   there used to be a gap — until the next full layout. `border-collapse:
   separate`, or an inset box-shadow in place of the border, also restore the
   rule, but move every row under every kit header by half a pixel. print.css
   cancels this box: printed, the header is static. Mirrored in
   docs/design/prototypes/_shell.css — both copies move together (#887). */
.wep-table thead th[b-zwlzp5z2s0]::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: -1px;
    height: 1px;
    background: var(--wep-color-border-2);
    pointer-events: none;
}

.wep-table tbody td[b-zwlzp5z2s0] {
    padding: var(--wep-space-2) var(--wep-space-3);
    border-bottom: 1px solid var(--wep-color-border-1);
    vertical-align: middle;
    white-space: nowrap;
}

/* Plan 2026-09-06-2144 U5: the pointer is an affordance and is claimed only
   when OnRowClick is wired (the component stamps .wep-table-rowclick). Before
   this every row took it, which was true of every consumer at the time. */
.wep-table.wep-table-rowclick tbody tr[b-zwlzp5z2s0] {
    cursor: pointer;
}

/* Plan 2026-09-06-2144 U5: a row whose subject is SPENT — a revoked or
   exhausted enrollment token — reads struck and dimmed, at the same opacity
   as the kit's .wep-row-dim (which the expired-but-unspent row wears). A
   RowClass hook, like .wep-row-dim; see AdminAgent. */
.wep-table tbody tr.wep-row-struck[b-zwlzp5z2s0] {
    text-decoration: line-through;
    opacity: 0.55;
}

.wep-table tbody tr:hover[b-zwlzp5z2s0] {
    background: var(--wep-color-bg-2);
}

.wep-table tbody tr.wep-row-selected[b-zwlzp5z2s0] {
    background: var(--wep-color-accent-bg);
}

/*
 * Row-flash motion per design.md §3.5. 1 frame highlight, decays to bg-1
 * over 800 ms via CSS. Reduced-motion collapses to instant.
 */

.wep-table tbody tr.wep-row-flash[b-zwlzp5z2s0] {
    background: var(--wep-state-clean-bg);
    animation: wep-row-flash-b-zwlzp5z2s0 800ms var(--wep-ease-decelerate);
}

@keyframes wep-row-flash-b-zwlzp5z2s0 {
    0%   { background: var(--wep-state-clean-bg); }
    100% { background: var(--wep-color-bg-1); }
}

@media (prefers-reduced-motion: reduce) {
    .wep-table tbody tr.wep-row-flash[b-zwlzp5z2s0] {
        animation: none;
        background: var(--wep-color-bg-1);
    }
}

/* Numeric / mono columns — caller adds these classes per cell. */

.wep-num[b-zwlzp5z2s0],
.wep-table th.wep-num[b-zwlzp5z2s0] {
    text-align: right;
    font-family: var(--wep-font-mono);
    font-variant-numeric: tabular-nums;
}

.wep-mono[b-zwlzp5z2s0] {
    font-family: var(--wep-font-mono);
    font-variant-numeric: tabular-nums;
}

.wep-table-checkbox[b-zwlzp5z2s0] {
    width: 22px;
    padding-right: 0;
}

/* #1896 — the optional per-row DETAIL row (RowDetailTemplate). A quiet
   inset ground distinguishes it from data rows without stealing attention;
   the top border reads as "belongs to the row above". */
.wep-datatable-detail-row[b-zwlzp5z2s0] >  td {
    background: var(--wep-color-bg-2);
    border-top: 1px dashed var(--wep-color-border-1);
    padding: var(--wep-space-2) var(--wep-space-3);
    white-space: normal;
}

/* Plan 2026-09-06-2144 U5 (KTD3) — HELD-BACK COLUMNS, implemented once.

   design.md §3.6: 1440 is the authored rung and has no media query; 1920 and
   2560 are the wide rungs and spend surplus width on evidence. A column the
   1440 artboard omits but the page can render is held back: the consumer
   stamps the rung class on the column's <th> and every <td> in it, and the
   cells are display:none until the viewport reaches that rung.

   `::deep` is deliberate and load-bearing. The <th>/<td> are authored by the
   CONSUMER (ColumnHeaders / RowTemplate), so they carry the consumer's scope
   attribute, not this component's — a plain scoped rule would never match
   them. `.wep-table ::deep .wep-col-reveal-1920` compiles to
   `.wep-table[b-…] .wep-col-reveal-1920`, anchored on this component's own
   <table>, which is exactly the reach wanted: a cell inside a WepDataTable
   and nothing else. A hand-built <table class="wep-table"> has no scope
   attribute and cannot borrow the rule, so the ladder's column behaviour
   has one implementation by construction, not by convention.

   These are the ONLY media queries this sheet may declare, and they are the
   ladder's own rungs — WepDataTableColumnRevealTests pins both facts. */
.wep-table[b-zwlzp5z2s0]  .wep-col-reveal-1920,
.wep-table[b-zwlzp5z2s0]  .wep-col-reveal-2560 {
    display: none;
}

@media (min-width: 1920px) {
    .wep-table[b-zwlzp5z2s0]  .wep-col-reveal-1920 {
        display: table-cell;
    }
}

@media (min-width: 2560px) {
    .wep-table[b-zwlzp5z2s0]  .wep-col-reveal-2560 {
        display: table-cell;
    }
}

/* A cell that WRAPS. `.wep-table tbody td` is nowrap so digests, ids and
   timestamps never break mid-token; a prose column (a description, a reason,
   a condition) needs the opposite, and before U5 four surfaces had each
   written their own class for it (.wep-pkg-cell-prose, .wep-holds-cell-prose,
   two more in scoped sheets). Same ::deep seam as the reveal, same reason. */
.wep-table[b-zwlzp5z2s0]  .wep-cell-prose {
    white-space: normal;
}

/* The optional in-table EMPTY row (EmptyContent). Render-only: it is not a
   row the operator can act on, so it takes neither the pointer nor the hover
   ground, and its text sits at the muted foreground like every other kit
   empty line (.wep-empty). */
.wep-table tbody tr.wep-table-empty-row[b-zwlzp5z2s0] {
    cursor: default;
}

.wep-table tbody tr.wep-table-empty-row:hover[b-zwlzp5z2s0] {
    background: var(--wep-color-bg-1);
}

.wep-table-empty-row[b-zwlzp5z2s0] >  td {
    color: var(--wep-color-fg-3);
    white-space: normal;
}

/* #4213 U19 (R27; KTD12) — THE VIRTUALIZED FLAT MODE (Virtualized=true).

   The framework's Virtualize draws a window of rows between two spacer rows
   and places them by arithmetic: every row must be the same height. Measured
   in Chrome on the 2,000-row fixture (WepDataTableVirtualizeBrowserTests),
   the kit's ordinary rows are not: 32.69px, and 33.19px for the first row of
   the window, which has no bordered row above it to share a collapsed border
   with. Two things here make every row one height, and a third keeps the
   columns still.

   - Every cell is a border box exactly the row's height, with no vertical
     padding: the height is the caller's ItemSize, carried by the wrap as
     `--wep-table-virtual-row`, and the content sits on the cell's middle
     line. A row is then as tall as its cells whatever it shares a border
     with. The density rule's padding is undone here, so the row height in
     either density is the ItemSize the caller passes for it.
   - Every cell is one line that ends in an ellipsis. `wep-cell-prose` is undone
     here on purpose: a wrapped cell is a taller row.
   - `table-layout: fixed`. With the automatic layout a column is as wide as the
     widest cell CURRENTLY DRAWN, so the columns would move as rows scroll
     through the window, and a `nowrap` cell would widen its column instead of
     truncating. Fixed, the widths come from the header cells and never change.

   `::deep` for the cells, as for the held-back columns above: the <td>s are the
   consumer's markup. The two spacer rows are Virtualize's: they hold no cell,
   carry no class and take their height from its inline style. The placeholder
   row is a row the provider has not returned yet; it is as tall as any other
   and takes no hover. */
.wep-table-wrap[b-zwlzp5z2s0] {
    /* The stylesheet's own value of the row height: none. The wrap's inline
       style carries the caller's ItemSize over it when the mode is on. */
    --wep-table-virtual-row: auto;
}

.wep-table.wep-table-virtual[b-zwlzp5z2s0] {
    table-layout: fixed;
}

.wep-table.wep-table-virtual[b-zwlzp5z2s0]  tbody td,
.wep-table.wep-table-virtual[b-zwlzp5z2s0]  tbody td.wep-cell-prose {
    box-sizing: border-box;
    height: var(--wep-table-virtual-row);
    padding-top: 0;
    padding-bottom: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.wep-table.wep-table-virtual tbody tr.wep-table-placeholder-row[b-zwlzp5z2s0] {
    cursor: default;
}

.wep-table.wep-table-virtual tbody tr.wep-table-placeholder-row:hover[b-zwlzp5z2s0] {
    background: var(--wep-color-bg-1);
}
/* /Components/Primitives/WepFilterChip.razor.rz.scp.css */
/* #4561 U3 — the kit chip, which is the approved #4213 drawing's (_shell.css
   "ONE CHIP, EVERY PAGE"): sans at the label size, a pill outline, the chip in
   force on the accent's tint. Mirrored here (#887). */
.wep-chip[b-qg3ddps8ie] {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    min-height: 26px;
    padding: 0 10px;
    border: 1px solid var(--wep-color-border-2);
    background: var(--wep-color-bg-1);
    border-radius: var(--wep-radius-pill);
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-xs);
    line-height: 1;
    color: var(--wep-color-fg-2);
    white-space: nowrap;
    cursor: pointer;
    /* button reset */
    appearance: none;
    text-align: inherit;
}

.wep-chip:hover[b-qg3ddps8ie] {
    background: var(--wep-color-bg-2);
}

.wep-chip:focus-visible[b-qg3ddps8ie] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

.wep-chip:disabled[b-qg3ddps8ie] {
    opacity: .5;
    cursor: not-allowed;
}

.wep-chip-on[b-qg3ddps8ie],
.wep-chip-on:hover[b-qg3ddps8ie] {
    background: var(--wep-color-accent-bg);
    color: var(--wep-color-fg-1);
    border-color: var(--wep-color-accent-1);
}

/* #1852 — the optional muted count suffix ("msi-installed (411)"). The label
   keeps fg-2; the count drops to fg-3 so counted and un-counted chips in one
   row read as the same shape. On the chip in force it is a step stronger,
   fg-2, as the × beside it is (#4561 U3). Tokens only — no new colour language. */
.wep-chip-count[b-qg3ddps8ie] {
    font-weight: var(--wep-weight-medium);
    font-variant-numeric: tabular-nums;
    color: var(--wep-color-fg-3);
}

.wep-chip-on .wep-chip-count[b-qg3ddps8ie] {
    color: var(--wep-color-fg-2);
}

.wep-chip-x[b-qg3ddps8ie] {
    margin-left: 2px;
    color: var(--wep-color-fg-3);
    cursor: pointer;
    user-select: none;
}

.wep-chip-on .wep-chip-x[b-qg3ddps8ie] {
    color: var(--wep-color-fg-2);
}

.wep-chip-on .wep-chip-x:hover[b-qg3ddps8ie] {
    color: var(--wep-color-fg-1);
}

/* #3966 U5 (KTD4) — anchor mode. A chip that is a link keeps the chip's look:
   no underline (the pill shape is the affordance, as on the toggle button), and
   the label colour the chip already sets, since no bare `a { color }` exists to
   override it. The remove link inside an active chip is the × the button mode
   draws as a span; it takes the same focus ring as the chip itself. An active
   chip shown with its remove link is a label, not a control, so it loses the
   pointer cursor and the hover fill that would promise a click on its body. */
a.wep-chip[b-qg3ddps8ie],
a.wep-chip-x[b-qg3ddps8ie] {
    text-decoration: none;
}

a.wep-chip-x:focus-visible[b-qg3ddps8ie] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
    border-radius: var(--wep-radius-xs);
}

span.wep-chip[b-qg3ddps8ie] {
    cursor: default;
}

span.wep-chip.wep-chip-on:hover[b-qg3ddps8ie] {
    background: var(--wep-color-accent-bg);
    border-color: var(--wep-color-accent-1);
}
/* /Components/Primitives/WepGuidedMilestone.razor.rz.scp.css */
/*
 * WepGuidedMilestone — the guided-state engine renderer (Plan 2026-06-25-003 U3).
 * Mirrors the docs/design/prototypes/onboarding.html step affordances
 * (.is-done / .is-current / .is-pending) and ADDS a 4th .is-stalled degraded
 * affordance (R11) using the warn/detonating token ramp, distinct from Current.
 * That artboard draws all four in the class names below, the fourth in its own
 * labelled section. This sheet used to cite state-empty-tenant.html, which was
 * retired on 2026-09-07 as a duplicate drawing of the same page (design.md §22)
 * — and which had been the source of the mirror running the WRONG way: the
 * artboard was describing this sheet rather than the other way round.
 *
 * All colors come from the --wep-* token contract only — no hex literals; theming
 * is the global [data-theme] token remap (KTD6). NO motion is declared (R10): no
 * transition, no animation, no skeleton. The aria-live region is polite text, not
 * a toast.
 */

.wep-guided[b-j2kyue94ns] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    min-width: 0;
}

.wep-guided-title[b-j2kyue94ns] {
    margin: 0;
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
    color: var(--wep-color-fg-1);
}

/* ─────────── aria-live region: the stalled/degraded line (R11) ─────────── */
/* Empty (zero-height) until a step stalls, so AT registers the live region
 * without a visible empty box. */
.wep-guided-annunciator[b-j2kyue94ns] {
    display: block;
}

.wep-guided-stalled-line[b-j2kyue94ns] {
    display: block;
    padding: var(--wep-space-2) var(--wep-space-3);
    border-left: 3px solid var(--wep-state-detonating-rule);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-warn-bg);
    color: var(--wep-color-warn-fg);
    font-size: var(--wep-size-text-sm);
}

/* ─────────── Ordered step list (R10 ordered-list semantics) ─────────── */
.wep-guided-steps[b-j2kyue94ns] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}

.wep-guided-step[b-j2kyue94ns] {
    display: grid;
    grid-template-columns: 28px 1fr;
    gap: var(--wep-space-3);
    padding: var(--wep-space-3) 0;
    border-bottom: 1px solid var(--wep-color-border-1);
}

.wep-guided-step:last-child[b-j2kyue94ns] {
    border-bottom: none;
}

.wep-guided-step-num[b-j2kyue94ns] {
    width: 24px;
    height: 24px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-pill);
    background: var(--wep-color-bg-1);
    color: var(--wep-color-fg-1);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
}

/* Current — the next action: inverse-fill number, matching the prototype. */
.wep-guided-step.is-current .wep-guided-step-num[b-j2kyue94ns] {
    background: var(--wep-color-fg-1);
    color: var(--wep-color-fg-inv);
    border-color: var(--wep-color-fg-1);
}

/* Pending — muted, gated behind an earlier step. */
.wep-guided-step.is-pending[b-j2kyue94ns] {
    opacity: 0.55;
}

/* Stalled — the 4th affordance (R11): a warn ramp on the number, DISTINCT from
 * the Current inverse-fill. No countdown is rendered for this step. */
.wep-guided-step.is-stalled .wep-guided-step-num[b-j2kyue94ns] {
    background: var(--wep-state-detonating-bg);
    color: var(--wep-state-detonating-fg);
    border-color: var(--wep-state-detonating-rule);
}

.wep-guided-step-main[b-j2kyue94ns] {
    min-width: 0;
}

.wep-guided-step-head[b-j2kyue94ns] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    flex-wrap: wrap;
}

.wep-guided-step-title[b-j2kyue94ns] {
    font-size: var(--wep-size-text-md);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-guided-progress[b-j2kyue94ns] {
    margin-top: var(--wep-space-1);
    display: flex;
    flex-direction: column;
    gap: 2px;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-guided-progress-soft[b-j2kyue94ns] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

/* Inline equal-weight action group, declared order, density preserved. */
.wep-guided-actions[b-j2kyue94ns] {
    margin-top: var(--wep-space-2);
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    flex-wrap: wrap;
}

.wep-guided-action-error[b-j2kyue94ns] {
    margin-top: var(--wep-space-2);
}

/* ─────────── "What's already true" — Done steps only (R3) ─────────── */
.wep-guided-truths[b-j2kyue94ns] {
    padding: var(--wep-space-3) var(--wep-space-4);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

/* #4561 U3: a heading one level down reads as the kit's subtitle, a sentence. */
.wep-guided-truths-head[b-j2kyue94ns] {
    margin: 0 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-2);
}

.wep-guided-truths-list[b-j2kyue94ns] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
}

.wep-guided-truth[b-j2kyue94ns] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-guided-truth-check[b-j2kyue94ns] {
    color: var(--wep-state-clean-rule);
    font-weight: var(--wep-weight-semi);
}

/* ─────────── Quickstart REST disclosure — collapsed by default (R4) ─────────── */
.wep-guided-quickstart[b-j2kyue94ns] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
}

.wep-guided-quickstart-toggle[b-j2kyue94ns] {
    appearance: none;
    padding: var(--wep-space-2) var(--wep-space-3);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-xs);
    background: transparent;
    color: var(--wep-color-fg-2);
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    text-align: left;
    cursor: pointer;
}

.wep-guided-quickstart-toggle:hover[b-j2kyue94ns],
.wep-guided-quickstart-toggle:focus-visible[b-j2kyue94ns] {
    color: var(--wep-color-fg-1);
}

.wep-guided-quickstart-panel[b-j2kyue94ns] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
    padding: var(--wep-space-4);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

.wep-guided-rest-label[b-j2kyue94ns] {
    margin: 0 0 var(--wep-space-1);
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
}

.wep-guided-rest-code[b-j2kyue94ns] {
    margin: 0;
    padding: var(--wep-space-3);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-2);
    color: var(--wep-color-fg-1);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    white-space: pre-wrap;
    overflow: auto;
}
/* /Components/Primitives/WepIcon.razor.rz.scp.css */
.wep-icon-host[b-k6txgl1j3v] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    line-height: 0;
    color: inherit;
}

[b-k6txgl1j3v] svg {
    width: 100%;
    height: 100%;
    stroke: currentColor;
    fill: none;
    stroke-width: 1.5;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.wep-icon-missing[b-k6txgl1j3v] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    color: var(--wep-state-cveblocked-fg);
    background: var(--wep-state-cveblocked-bg);
    border-radius: var(--wep-radius-xs);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    font-weight: var(--wep-weight-semi);
}
/* /Components/Primitives/WepStatusPill.razor.rz.scp.css */
.wep-pill[b-k333mw7b4t] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    /* #4561 U3: the kit pill is the approved #4213 drawing's, lowercase at the
       label size with no dot (_shell.css "ONE PILL, EVERY PAGE"); mirrored here (#887). */
    padding: 3px 7px;
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-xs);
    font-weight: var(--wep-weight-medium);
    letter-spacing: normal;
    text-transform: lowercase;
    line-height: 1.1;
    border-radius: var(--wep-radius-xs);
    border: 1px solid transparent;
    white-space: nowrap;
    /* Plan 2026-05-14-002 U15: overflow truncation. Long labels
     * ellipsize; full label exposed via title + aria-label
     * (WepStatusPill.AriaLabel parameter from U4). The flex
     * parent (drawer head, table cell) controls layout; the pill
     * shrinks but never wraps. */
    /* Nightfall: 24ch fit the catalog lifecycle labels
       (OBSERVED-UNATTESTED / ATTESTED REAL-SANDBOX) without the ugly ellipsis. */
    /* #1621: 30ch, measured live on /community/brokers. `ch` is the width of
       the digit 0 (6.78px at Geist 11px) while an UPPERCASE wide-tracked label
       averages ~7.4px per character, and the dot + gap + padding spend from
       the same border-box budget — so REENROLLMENTREQUIRED (20 chars, the
       longest live status) truncated under 24ch with 120px of spare cell
       width (the cell was NOT the binding constraint; flex-shrink was
       innocent). Untruncated from 29ch up; 30ch = measured minimum + 1ch
       font-metric headroom. The parity test in WepStatusPillTests pins both
       mirrored copies to the same value. */
    /* #1320: NO text-overflow here — it never applies to an inline-flex
       container (its text is an anonymous flex item), so it silently
       degraded to a hard mid-word clip. The container keeps the width
       budget + shrink permission; the ellipsis lives on .wep-pill-label. */
    max-width: 30ch;
    min-width: 0;
    overflow: hidden;
    flex-shrink: 1;
}

/* #1320 — the ellipsis surface. text-overflow requires a block-level box
 * with overflow hidden and a constrained width; the label span is a flex
 * item (blockified), and min-width:0 lets it shrink below its content so
 * long labels degrade to "…" instead of a silent mid-word cut. The
 * ::before status dot never truncates; the sub-label yields (below).
 * Mirrored in docs/design/prototypes/_shell.css (both copies move
 * together — the #887 lesson). */
.wep-pill-label[b-k333mw7b4t] {
    display: block;
    flex: 0 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* #2259 — the state name is the identity; the sub-label yields. The label
 * and the sub-label share the 30ch budget above. With no rule here the
 * sub-label kept its automatic minimum size and could not shrink, so the
 * label was the only item that gave up width: `AHEAD OF ATTESTA…  DISMISSED`.
 *
 * The sub-label is sized from a ZERO basis and grows into whatever the
 * label leaves, so the label keeps its whole content width until it alone,
 * plus the sub-label's 3ch floor, is over budget. A heavier shrink weight
 * (`flex: 0 1000 auto`) is not the same thing, and it was measured: flex
 * shrink still hands the label its weighted share of the overflow, 1/32px
 * in Chrome 153, and a label 1/32px narrower than its text ellipsizes. The
 * full reading stays on title + aria-label. Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — #887). */
.wep-pill > .wep-pill-sub[b-k333mw7b4t] {
    flex: 1 1 0;
    min-width: 3ch;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* #2259 — the trust-tier origin chips never truncate: they are what an
 * auditor reads at a glance, and their words are short. `flex: none`, not
 * `flex-shrink: 0`: under the zero basis above a non-shrinking chip would
 * still start at the 3ch floor and be cut to what the label left. */
.wep-pill > .wep-pill-sub.wep-origin-manualattest[b-k333mw7b4t],
.wep-pill > .wep-pill-sub.wep-origin-waived[b-k333mw7b4t],
.wep-pill > .wep-pill-sub.wep-origin-waived-expired[b-k333mw7b4t] {
    flex: none;
}

.wep-pill > .wep-pill-sub[b-k333mw7b4t] {
    font-weight: var(--wep-weight-regular);
}

/*
 * Seven product states. Token references; no hex literals here.
 */

.wep-pill-clean[b-k333mw7b4t] {
    color: var(--wep-state-clean-fg);
    background: var(--wep-state-clean-bg);
}

.wep-pill-detonating[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
}

.wep-pill-sbomready[b-k333mw7b4t] {
    color: var(--wep-state-sbomready-fg);
    background: var(--wep-state-sbomready-bg);
}

.wep-pill-cveblocked[b-k333mw7b4t] {
    color: var(--wep-state-cveblocked-fg);
    background: var(--wep-state-cveblocked-bg);
}

.wep-pill-quarantined[b-k333mw7b4t] {
    color: var(--wep-state-quarantined-fg);
    background: var(--wep-state-quarantined-bg);
}

.wep-pill-promoted[b-k333mw7b4t] {
    color: var(--wep-state-promoted-fg);
    background: var(--wep-state-promoted-bg);
}

.wep-pill-rolledback[b-k333mw7b4t] {
    color: var(--wep-state-rolledback-fg);
    background: var(--wep-state-rolledback-bg);
}

/*
 * Cross-cutting: offline (muted) + degraded (warn ramp).
 */

.wep-pill-offline[b-k333mw7b4t] {
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

.wep-pill-degraded[b-k333mw7b4t] {
    color: var(--wep-color-warn-fg);
    background: var(--wep-color-warn-bg);
}

/*
 * Plan 2026-05-11-001 Unit 7 — match-state pills for endpoint-detail
 * Section A. Distinct classes (NOT aliases of detonating/quarantined)
 * so future divergence (e.g. a striped "drift · pinned older" variant)
 * lands without breaking the shared-token semantics.
 */

.wep-pill-drift[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
}

.wep-pill-foreign[b-k333mw7b4t] {
    color: var(--wep-state-quarantined-fg);
    background: var(--wep-state-quarantined-bg);
}

/*
 * Plan 2026-05-11-002 (Plan A) U12 — Attested + ObservedUnattested.
 * Mirrors clean/sbomready ramps with a SubLabel surface for the
 * attestation tier (e.g., "attested · manual-sbom").
 */

.wep-pill-attested[b-k333mw7b4t] {
    color: var(--wep-state-clean-fg);
    background: var(--wep-state-clean-bg);
}

.wep-pill-observedunattested[b-k333mw7b4t] {
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

/*
 * Plan 2026-05-14-002 (detonation mechanism) U15 — five new pill
 * states wired by U4. Token reuse rationale:
 *
 *   NetworkPostureOffline:  clean ramp — vNIC disconnected is the
 *                           safe default; no network exposure.
 *   NetworkPostureMitm:     detonating ramp — "look closer; traffic
 *                           was intercepted, scrubbed flows in bundle".
 *   NetworkPostureUnknown:  sbomready ramp (muted blue) — neither good
 *                           nor bad; pre-detonation or legacy row.
 *   UnsignedAttestation:    rolledback ramp (warm orange) — evidence
 *                           gathered but primary exe unsigned; requires
 *                           typed-confirm Cedar gate for ring promotion.
 *   Cancelled:              quarantined ramp (muted purple) — operator
 *                           interrupted the detonation; out of band.
 */

.wep-pill-networkpostureoffline[b-k333mw7b4t] {
    color: var(--wep-state-clean-fg);
    background: var(--wep-state-clean-bg);
}

.wep-pill-networkposturemitm[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
}

.wep-pill-networkpostureunknown[b-k333mw7b4t] {
    color: var(--wep-state-sbomready-fg);
    background: var(--wep-state-sbomready-bg);
}

.wep-pill-unsignedattestation[b-k333mw7b4t] {
    color: var(--wep-state-rolledback-fg);
    background: var(--wep-state-rolledback-bg);
}

.wep-pill-cancelled[b-k333mw7b4t] {
    color: var(--wep-state-quarantined-fg);
    background: var(--wep-state-quarantined-bg);
}

/*
 * Plan 2026-06-10-001 U6 — exceeds-detonation-budget. Warning-amber ramp
 * (detonating tokens, same reuse as .wep-pill-drift): a coverage limit
 * the operator can resolve, NOT quarantine-purple — no sandbox verdict
 * exists for these rows. Mirrored in docs/design/prototypes/_shell.css
 * (both copies move together — the #887 lesson).
 */
.wep-pill-exceedsdetonationbudget[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
}

/*
 * Plan 2026-06-10-002 U5 — requires-interaction. Warning-amber ramp
 * (detonating tokens, same reuse as exceeds-detonation-budget): an
 * actionable behavioral verdict, NOT quarantine-purple — the pipeline
 * worked; the installer demands a human. Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — the
 * #887 lesson).
 */
.wep-pill-requiresinteraction[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
}

/*
 * Plan 2026-06-26-002 U8 — exceeds-observability-budget. Warning-amber ramp
 * (detonating tokens, same reuse as exceeds-detonation-budget / requires-
 * interaction): a Succeeded-but-over-bound run is over-observable, not
 * suspicious — a coverage limit the operator resolves (raise the global bound +
 * re-detonate, or sign a per-version waiver), NOT quarantine-purple (no malicious
 * verdict). A DISTINCT pill class (NOT an alias of exceedsdetonationbudget): this
 * state deliberately offers no manual-attest valve, so it must read distinctly.
 * Mirrored in docs/design/prototypes/_shell.css (both copies move together — the
 * #887 lesson).
 */
.wep-pill-exceedsobservabilitybudget[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
}

/*
 * Plan 2026-06-10-002 U12 — derived-artifact provenance badge
 * (DERIVED-MSI). Promoted-teal ramp ("currently serving" semantics):
 * the feed serves the extracted inner MSI, not the vendor bytes. Its
 * own pill — NOT an attestation-origin sub-label — so auditors can
 * tell the provenance axis from the trust-tier axis at a glance.
 * Mirrored in docs/design/prototypes/_shell.css (both copies move
 * together — the #887 lesson).
 */
.wep-pill-derivedartifact[b-k333mw7b4t] {
    color: var(--wep-state-promoted-fg);
    background: var(--wep-state-promoted-bg);
}

/*
 * Plan 2026-06-13-001 U5 (KTD8) — winget recognition pills. Each carries its
 * OWN ramp (--wep-state-recognized{confident,possible}-*), NOT an alias of
 * Foreign/Drift/Promoted (the repo's no-pill-color-aliasing convention):
 *   RecognizedConfident: informational-teal — a confident read-only catalog
 *                        correlation, distinct from the promoted-teal
 *                        "currently serving" ramp.
 *   RecognizedPossible:  muted advisory (slate) — correlated but unconfirmed,
 *                        distinct from the muted-grey un-correlated Foreign row.
 * Mirrored in docs/design/prototypes/_shell.css (both copies move together —
 * the #887 lesson).
 */
.wep-pill-recognizedconfident[b-k333mw7b4t] {
    color: var(--wep-state-recognizedconfident-fg);
    background: var(--wep-state-recognizedconfident-bg);
}

.wep-pill-recognizedpossible[b-k333mw7b4t] {
    color: var(--wep-state-recognizedpossible-fg);
    background: var(--wep-state-recognizedpossible-bg);
}

/*
 * Plan 2026-06-16-001 U3 (KTD5) — auto-rollback HOLD pill. Its OWN amber-gold
 * ramp (--wep-state-held-*), NOT an alias of rolledback/quarantined (the repo's
 * no-pill-color-aliasing convention): a held endpoint is FROZEN at the breached
 * version (a rollback held it installed, not a ring demotion). Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — the #887 lesson).
 */
.wep-pill-held[b-k333mw7b4t] {
    color: var(--wep-state-held-fg);
    background: var(--wep-state-held-bg);
}

/*
 * Plan 2026-06-29-002 U8 (R4/R5) — per-user last-known / unverified pill. Its
 * OWN muted "aged/stone" ramp (--wep-state-lastknownunverified-*): a per-user
 * package remembered for an unobservable SID (logout/headless), present but not
 * re-observed. NOT an alias of Held (amber-gold — a rollback froze a version),
 * ObservedUnattested (grey), or RecognizedPossible (slate) — the repo's
 * no-pill-color-aliasing convention. Mirrored in docs/design/prototypes/_shell.css
 * (both copies move together — the #887 lesson).
 */
.wep-pill-lastknownunverified[b-k333mw7b4t] {
    color: var(--wep-state-lastknownunverified-fg);
    background: var(--wep-state-lastknownunverified-bg);
}

/*
 * Plan 2026-09-08-1838 U3 (KTD4) — the management axis's `not driven` rung: a
 * catalog-covered row whose bytes the platform has no evidence of placing. Its
 * OWN cool graphite ramp (--wep-state-notdriven-*), deliberately OFF the clean
 * ramp — the defect being fixed is a green `match` that claimed management it
 * never checked. NOT an alias of ObservedUnattested (grey — `provenance pending`
 * holds that ramp in the SAME column and means the opposite thing about
 * management), Foreign (purple — un-correlated; this row IS covered),
 * RecognizedPossible (slate — an identity hedge), or Drift (amber — asserts a
 * managed package moved, which this row cannot claim) — the repo's
 * no-pill-color-aliasing convention. Mirrored in docs/design/prototypes/_shell.css
 * (both copies move together — the #887 lesson).
 */
.wep-pill-notdriven[b-k333mw7b4t] {
    color: var(--wep-state-notdriven-fg);
    background: var(--wep-state-notdriven-bg);
}

/*
 * #2540 — a decommissioned endpoint: tokens revoked, device key distrusted, fleet
 * rows kept. Its OWN muted stone ramp (--wep-state-decommissioned-*): NOT an alias
 * of offline (grey — the defect being fixed is a retired machine reading as an
 * offline one that may come back), brokerdecommissioned (the quarantined purple, an
 * attention treatment), or lastknownunverified (a warmer taupe; an aging signal).
 * Quiet on purpose: retirement is a settled operator decision. Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — the #887 lesson).
 */
.wep-pill-decommissioned[b-k333mw7b4t] {
    color: var(--wep-state-decommissioned-fg);
    background: var(--wep-state-decommissioned-bg);
}

/*
 * #2597 — an endpoint whose agent answers the wake probe but has stopped checking in
 * (its check-in loop is stuck): label `not checking in (probing)`. Its OWN teal-cyan
 * ramp (--wep-state-notcheckingin-*): NOT an alias of offline (grey — the box IS
 * reachable), settling (slate-blue — "wait, nothing is wrong"), degraded (warn-amber —
 * the `update stuck` pill in the same cell), or decommissioned (stone). Actionable, so
 * it joins the ATTENTION forced-colours family. Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — the #887 lesson).
 */
.wep-pill-notcheckingin[b-k333mw7b4t] {
    color: var(--wep-state-notcheckingin-fg);
    background: var(--wep-state-notcheckingin-bg);
}

/*
 * #2829 — the ahead-of-attestation exception, drawn beside an endpoint package row's own
 * pill. The SAME warn ramp as degraded, which it used before, so nothing moves in colour:
 * this is a class for forced colours, not a new hue. There `degraded` is dashed 2px, the
 * pair `drift` renders in the same cell, and narrowing `degraded` would move dozens of
 * other surfaces, so this state takes dashed 1px of its own (the forced-colors block
 * below). Mirrored in docs/design/prototypes/_shell.css (both copies move together — the
 * #887 lesson).
 */
.wep-pill-aheadofattestation[b-k333mw7b4t] {
    color: var(--wep-color-warn-fg);
    background: var(--wep-color-warn-bg);
}

/*
 * #3577 R19, #3645 (U6) — a confident Critical CVE that no policy holds ("Critical CVE"). The
 * CVE ramp, because it is a CVE, and the severity chip's own rule border, because it is a
 * severity and not a block: `cveblocked` carries the transparent base border, so the two read
 * apart at a glance before the word is read. Under forced colours it is ATTENTION (dashed),
 * not BLOCKED (double): nothing refuses this version until an operator policy does (#3390).
 * Mirrored in docs/design/prototypes/_shell.css (#887).
 */
.wep-pill-criticalcve[b-k333mw7b4t] {
    color: var(--wep-state-cveblocked-fg);
    background: var(--wep-state-cveblocked-bg);
    border-color: var(--wep-state-cveblocked-rule);
}

/*
 * #3925 U13 (R16, R18; KTD15) — the installer label's states: `verified`, `unverified` (the catalog's
 * verdict table), `unverified · accepted`, `unverified · not accepted` and the R18 finding `other
 * installer`. Each borrows the ramp of the meaning it shares and is a class of its own for the label
 * vocabulary and for forced colours (the #2829 precedent): clean for a verified installer; the muted
 * claim-without-proof grey for an unverified sibling on the catalog page AND (#3925 PR H) for accepted
 * bytes — an operator consented, a settled state that wants nobody; the warn ramp for unverified bytes
 * nobody consented to (#3925 PR H) and for the R18 finding — both want an operator. Mirrored in
 * docs/design/prototypes/_shell.css (#887).
 */
.wep-pill-installerverified[b-k333mw7b4t] {
    color: var(--wep-state-clean-fg);
    background: var(--wep-state-clean-bg);
}

.wep-pill-installerunverified[b-k333mw7b4t] {
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

.wep-pill-installeraccepted[b-k333mw7b4t] {
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

.wep-pill-installermismatch[b-k333mw7b4t] {
    color: var(--wep-color-warn-fg);
    background: var(--wep-color-warn-bg);
}

.wep-pill-installernotaccepted[b-k333mw7b4t] {
    color: var(--wep-color-warn-fg);
    background: var(--wep-color-warn-bg);
}

/*
 * Plan 2026-07-08-001 (#1251) — requires-user-context pill. Its OWN warm
 * copper/sepia amber ramp (--wep-state-requiresusercontext-*): a per-user
 * installer exited 0 as SYSTEM into HKU\S-1-5-18 — installed, but visible to
 * no real user; un-converged, NOT failed. NOT an alias of Held (amber-gold —
 * auto-rollback froze a version), CveBlocked (red — a real failure), or
 * Detonating (amber — in-flight) — the repo's no-pill-color-aliasing
 * convention. Mirrored in docs/design/prototypes/_shell.css (both copies move
 * together — the #887 lesson).
 */
.wep-pill-requiresusercontext[b-k333mw7b4t] {
    color: var(--wep-state-requiresusercontext-fg);
    background: var(--wep-state-requiresusercontext-bg);
}

/*
 * Plan 2026-07-16-001 (#1421) U1 — withdrawn-upstream tombstone pill. Its OWN
 * muted slate-violet ramp (--wep-state-withdrawnupstream-*): the vendor deleted
 * this version's winget-pkgs manifest upstream after ingest — a never-served
 * ghost. NOT an alias of quarantined/cancelled (violet — a pipeline-broke triage
 * verdict the operator re-detonates) or observedunattested (grey) — the repo's
 * no-pill-color-aliasing convention. Mirrored in docs/design/prototypes/_shell.css
 * (both copies move together — the #887 lesson).
 */
.wep-pill-withdrawnupstream[b-k333mw7b4t] {
    color: var(--wep-state-withdrawnupstream-fg);
    background: var(--wep-state-withdrawnupstream-bg);
}

/*
 * Plan 2026-07-18-001 U1 (#1454) — app-in-use deferred pill. Its OWN muted
 * olive/moss ramp (--wep-state-appinusedeferred-*): the target application is
 * running in a user session, so the silent SYSTEM upgrade is confirmed blocked
 * and backed off until the app closes — un-converged, NOT failed, never
 * "cancelled by user". NOT an alias of RequiresUserContext (copper — needs a
 * user context), Held (amber-gold — auto-rollback froze a version), Degraded
 * (amber — operator action available), or Detonating (amber — in-flight) —
 * the repo's no-pill-color-aliasing convention. Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — the #887
 * lesson).
 */
.wep-pill-appinusedeferred[b-k333mw7b4t] {
    color: var(--wep-state-appinusedeferred-fg);
    background: var(--wep-state-appinusedeferred-bg);
}

/*
 * Plan 2026-07-23-004 U4 (#1569, R6) — self-rejecting rollout member pill. Its OWN muted
 * mustard-amber ramp (--wep-state-selfrejecting-*): a ring member excluded from the agent-rollout
 * health denominators for rejecting two or more distinct unsurpassed agent versions — a CAUTION,
 * NOT a failure. NOT an alias of cveblocked/rolledback (red/orange — a real failure), offline (grey
 * — an excluded member must never read as offline), quarantined (violet — a catalog-admin hold, a
 * different axis; KTD6), held/detonating (gold), or appinusedeferred (olive) — the repo's
 * no-pill-color-aliasing convention. Mirrored in docs/design/prototypes/_shell.css (both copies
 * move together — the #887 lesson).
 */
.wep-pill-selfrejecting[b-k333mw7b4t] {
    color: var(--wep-state-selfrejecting-fg);
    background: var(--wep-state-selfrejecting-bg);
}

/*
 * Plan 2026-07-28-002 U7 (#1616) — ring member that joined already on the target and is settling.
 * Its OWN calm slate-blue ramp (--wep-state-settling-*), deliberately COOL: the defect being fixed
 * is that this member read as a broken upgrade, so a warm ramp would re-create the misread one hue
 * over. NOT an alias of detonating (amber — in-flight, the exact wrong read), selfrejecting
 * (mustard — an exclusion; a settling member still counts toward ring health), rolledback/cveblocked
 * (failures), or offline (grey — a settling box is checking in). Mirrored in
 * docs/design/prototypes/_shell.css (both copies move together — the #887 lesson).
 */
.wep-pill-settling[b-k333mw7b4t] {
    color: var(--wep-state-settling-fg);
    background: var(--wep-state-settling-bg);
}

/*
 * Plan 2026-08-09-001 U5 (#1733) — undeclared/looping SYSTEM-hollow debt pill. Its OWN
 * muted plum ramp (--wep-state-uninstalllooping-*): a machine uninstall stuck in backoff
 * because only the SYSTEM-profile hollow copy remains — actionable remediation debt, not
 * a failure verdict. NOT an alias of CveBlocked (red — a real failure),
 * Quarantined/WithdrawnUpstream (violet — catalog axes), RequiresUserContext (copper —
 * the declared+held sibling shape on the same Holds surface, which must read distinct at
 * a glance), or Held (amber-gold — the auto-rollback domain; the no-aliasing
 * convention). Mirrored in docs/design/prototypes/_shell.css (both copies move together
 * — the #887 lesson).
 */
.wep-pill-uninstalllooping[b-k333mw7b4t] {
    color: var(--wep-state-uninstalllooping-fg);
    background: var(--wep-state-uninstalllooping-bg);
}

/*
 * #1061 U3 — dev-grade / not-sandbox-verified serve badge (ServedUnverified).
 * The DASHED OUTLINE is the primary discriminator, not the hue: the warm pill
 * family is saturated (detonating amber, held gold, requiresusercontext
 * copper, selfrejecting mustard, rolledback orange, the coverage trio), and
 * "actively served without detonation evidence" reads as UNFINISHED — which a
 * dashed border says at a glance in both themes, color-vision-independent.
 * Pale-saffron ramp (--wep-state-servedunverified-*), near-transparent bg so
 * the outline stays the loudest element. NOT an alias of ObservedUnattested
 * grey (passive inventory; this is actively served — the whole warning).
 * Mirrored in docs/design/prototypes/_shell.css (both copies move together —
 * the #887 lesson).
 */
.wep-pill-servedunverified[b-k333mw7b4t] {
    color: var(--wep-state-servedunverified-fg);
    background: var(--wep-state-servedunverified-bg);
    border: 1px dashed var(--wep-state-servedunverified-rule);
}

/*
 * Plan 2026-06-10-001 U9 — manual-attest origin badge. The valve origin
 * ("operator-vouched, NO sandbox evidence") must read visually DISTINCT
 * from the muted manual-sbom sub-label ("operator-uploaded SBOM") so an
 * auditor can tell the trust tiers apart at a glance. Warm rolledback
 * ramp + outlined chip, vs the plain inherited text of a default
 * sub-label. Mirrored in docs/design/prototypes/_shell.css (both copies
 * move together — the #887 lesson).
 */
.wep-pill-sub.wep-origin-manualattest[b-k333mw7b4t] {
    color: var(--wep-state-rolledback-fg);
    background: var(--wep-state-rolledback-bg);
    border: 1px solid currentColor;
    border-radius: var(--wep-radius-xs);
    padding: 0 4px;
}

/*
 * Plan 2026-06-18-001 U6 — baseline-gate-waiver origin sub-labels. A waived
 * attestation ("attested (waived)") reached attested through an operator
 * ceiling waiver — the verbatim probe failure stays in evidence, so the
 * sub-label must read DISTINCT from a clean real-sandbox attestation. The
 * expired variant ("waiver expired", lazy-window, still Attested) escalates
 * to the cveblocked ramp so the lapsed time-box reads as action-required.
 * Mirrored in docs/design/prototypes/_shell.css (both copies move together —
 * the #887 lesson).
 */
.wep-pill-sub.wep-origin-waived[b-k333mw7b4t] {
    color: var(--wep-state-detonating-fg);
    background: var(--wep-state-detonating-bg);
    border: 1px solid currentColor;
    border-radius: var(--wep-radius-xs);
    padding: 0 4px;
}

.wep-pill-sub.wep-origin-waived-expired[b-k333mw7b4t] {
    color: var(--wep-state-cveblocked-fg);
    background: var(--wep-state-cveblocked-bg);
    border: 1px solid currentColor;
    border-radius: var(--wep-radius-xs);
    padding: 0 4px;
}

/*
 * Linked variant — the pill is the click target for §5.5 evidence drawer.
 * 1-px inner ring on hover signals "this opens proof".
 */
.wep-pill-linked[b-k333mw7b4t] {
    text-decoration: none;
    cursor: pointer;
}

.wep-pill-linked:hover[b-k333mw7b4t] {
    box-shadow: 0 0 0 1px var(--wep-color-border-2) inset;
}

/* The ring is a box-shadow, which forced colours removes. The transparent
   outline paints nothing here and is painted in a system colour under High
   Contrast, so a keyboard user can still see the focused pill (#2053). */
.wep-pill-linked:focus-visible[b-k333mw7b4t] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

/* ─────────────────────────────────────────────────────────────────────────
 * #2053 — the risk vocabulary survives Windows High Contrast.
 *
 * Every state above is separated by HUE alone: the base is
 * `border: 1px solid transparent` and each state sets a fg/bg token pair,
 * under the no-pill-color-aliasing convention that says each must "read
 * distinctly". Under `forced-colors: active` the browser strips author
 * background and colour, so all of them collapse into one another — Safe to
 * deploy, Blocked · CVE, Quarantined and Held become the same pill on a
 * product whose thesis is proving things to people who get sued if they are
 * wrong.
 *
 * The design system already conceded this once, for exactly one state:
 * .wep-pill-servedunverified carries a dashed border "because it must read at
 * a glance, color-vision-independent". This generalises that concession.
 *
 * BORDER STYLE is the channel, because forced-colors overrides colour but not
 * style or width. Five families, grouped by what an operator must DO rather
 * than by which token ramp a state happens to use — under High Contrast the
 * ramps are indistinguishable anyway, so grouping by ramp would preserve a
 * distinction nobody can see and lose the one that matters:
 *
 *   double 3px   BLOCKED      — do not proceed; something is refusing
 *   dashed       ATTENTION    — proceeded but wants an operator
 *   dotted       UNVERIFIED   — the claim exists, the proof does not
 *   solid        GOOD         — verified, attested, done
 *   solid+Gray   INERT        — transient or nothing to act on
 *
 * Where two states of one family share a column, WIDTH separates them. The
 * endpoint status column pairs `match` solid 1px, `recognized` solid 2px,
 * `not driven` dotted 1px, `provenance pending` dotted 2px, `possible`
 * dotted 3px, `ahead of attestation` dashed 1px, `drift` dashed 2px,
 * `foreign` dashed 3px and `held` double 3px. ForcedColorsStateCensusTests
 * fails when two pills in one status column share a style-and-width pair.
 *
 * `forced-color-adjust: none` is deliberately NOT used. It would keep the
 * author palette and defeat the operator's own accessibility setting — the
 * point is to work WITH the system colours, not to opt out of them.
 *
 * Everything here is inside the media query, so normal rendering is
 * byte-identical. Mirrored in the other copy (#887 — both move together).
 * ───────────────────────────────────────────────────────────────────────── */
@media (forced-colors: active) {
    /* The transparent base border vanishes when backgrounds are stripped;
       without this every pill renders as bare text with no shape. */
    .wep-pill[b-k333mw7b4t] {
        border-style: solid;
        border-width: 1px;
    }

    /* BLOCKED — deliberately the loudest. A 3px double border is chunky at the
       12px dense size, and that is the point: this family is the one an
       operator must not misread. `double` collapses to `solid` below 3px, so
       the width is load-bearing, not decoration. */
    .wep-pill-cveblocked[b-k333mw7b4t],
    .wep-pill-quarantined[b-k333mw7b4t],
    .wep-pill-held[b-k333mw7b4t],
    .wep-pill-withdrawnupstream[b-k333mw7b4t],
    .wep-pill-sub.wep-origin-waived-expired[b-k333mw7b4t] {
        border-style: double;
        border-width: 3px;
    }

    /* ATTENTION — it moved, and it wants someone. */
    .wep-pill-degraded[b-k333mw7b4t],
    .wep-pill-drift[b-k333mw7b4t],
    .wep-pill-rolledback[b-k333mw7b4t],
    .wep-pill-requiresinteraction[b-k333mw7b4t],
    .wep-pill-selfrejecting[b-k333mw7b4t],
    .wep-pill-uninstalllooping[b-k333mw7b4t],
    .wep-pill-exceedsdetonationbudget[b-k333mw7b4t],
    .wep-pill-exceedsobservabilitybudget[b-k333mw7b4t],
    .wep-pill-networkposturemitm[b-k333mw7b4t],
    .wep-pill-notcheckingin[b-k333mw7b4t],
    .wep-pill-criticalcve[b-k333mw7b4t],
    .wep-pill-installermismatch[b-k333mw7b4t],
    .wep-pill-installernotaccepted[b-k333mw7b4t],
    .wep-pill-sub.wep-origin-waived[b-k333mw7b4t] {
        border-style: dashed;
        border-width: 2px;
    }

    /* The same family at its two other widths (#2829). `foreign` and `ahead of
       attestation` both render in the endpoint status column beside `drift`
       (dashed 2px above), and `ahead of attestation` is drawn BESIDE the row's
       own pill, so it can sit next to `drift` in one row. `foreign` (present
       on the machine, never declared) came here from BLOCKED, where it shared
       `held`'s double 3px: the next step is to adopt it or remove it, which
       wants an operator rather than refuses. It keeps 3px, so the row does not
       grow. `ahead of attestation` is its own class rather than a narrower
       `degraded`, which dozens of other surfaces use. Its dismissed form
       stays on `not driven`'s dotted 1px, the #2212 answered weight, and the
       `dismissed` sub-label tells the two apart. Mirrored in _shell.css
       (#887). */
    .wep-pill-foreign[b-k333mw7b4t] {
        border-style: dashed;
        border-width: 3px;
    }

    .wep-pill-aheadofattestation[b-k333mw7b4t] {
        border-style: dashed;
        border-width: 1px;
    }

    /* UNVERIFIED — the claim is present and the evidence is not. Keeps
       servedunverified's existing dashed intent but separates it from
       ATTENTION, which is a different operator question. */
    .wep-pill-servedunverified[b-k333mw7b4t],
    .wep-pill-lastknownunverified[b-k333mw7b4t],
    .wep-pill-networkpostureunknown[b-k333mw7b4t],
    .wep-pill-observedunattested[b-k333mw7b4t],
    .wep-pill-unsignedattestation[b-k333mw7b4t],
    .wep-pill-requiresusercontext[b-k333mw7b4t],
    .wep-pill-installerunverified[b-k333mw7b4t],
    .wep-pill-installeraccepted[b-k333mw7b4t],
    .wep-pill-sub.wep-origin-manualattest[b-k333mw7b4t] {
        border-style: dotted;
        border-width: 2px;
    }

    /* UNVERIFIED at 1px — `not driven` (Plan 2026-09-08-1838 U3, R2a). It belongs
       in this family (the claim of catalog coverage exists; the proof of placement
       does not) but it shares the endpoint status column with `provenance pending`
       (observedunattested, dotted 2px above), and the two mean OPPOSITE things about
       management. Only four border styles exist, so family alone cannot separate
       them; WIDTH is the channel — the same one BLOCKED (3px double) already uses to
       differ from ATTENTION (2px dashed). Mirrored in _shell.css (#887). */
    .wep-pill-notdriven[b-k333mw7b4t] {
        border-style: dotted;
        border-width: 1px;
    }

    /* Recognition — `recognized` and `possible` (#2053). Both mean "identity
       known, placement unproven", and both render in the endpoint status
       column beside `match` (solid 1px), `not driven` (dotted 1px) and
       `provenance pending` (dotted 2px). `recognized` keeps a solid line at
       2px, apart from GOOD's 1px. `possible` is the loudest dotted, apart from
       both of its dotted neighbours. Mirrored in _shell.css (#887). */
    .wep-pill-recognizedconfident[b-k333mw7b4t] {
        border-style: solid;
        border-width: 2px;
    }

    .wep-pill-recognizedpossible[b-k333mw7b4t] {
        border-style: dotted;
        border-width: 3px;
    }

    /* INERT — transient or nothing to act on. GrayText is a real forced-colors
       system colour and carries "inactive" semantically, so this family reads
       as quiet rather than as another alarm. */
    .wep-pill-offline[b-k333mw7b4t],
    .wep-pill-decommissioned[b-k333mw7b4t],
    .wep-pill-cancelled[b-k333mw7b4t],
    .wep-pill-appinusedeferred[b-k333mw7b4t],
    .wep-pill-settling[b-k333mw7b4t],
    .wep-pill-detonating[b-k333mw7b4t] {
        border-style: solid;
        border-width: 1px;
        color: GrayText;
        border-color: GrayText;
    }

    /* GOOD is the 1px solid base — stated explicitly so a future state added
       to this family is a deliberate choice rather than a default it fell
       into. .wep-pill-clean, -attested, -sbomready, -promoted,
       -derivedartifact, -networkpostureoffline, -installerverified. */
}
/* /Components/Primitives/WepVerdict.razor.rz.scp.css */
/*
 * WepVerdict — safe-to-deploy verdict glyph + checklist (design.md §5.15,
 * Plan 2026-06-25-001 U2). The four-cell strip encodes each leg's LegState by
 * FILL/SHAPE, never color alone (R11): solid = VerifiedPass, diagonal hatch =
 * NotEvaluated (the gap), hollow + × = Fail. The strip reads as ONE solid block
 * only when every cell is a solid pass (R9). All colors come from the
 * --wep-verdict-cell-* / --wep-state-* token contract — no hex literals (§11).
 *
 * NO motion is declared here (KTD3 / design.md three-motion rule): the only
 * affordance is the hover ring WepStatusPill already owns on its linked variant,
 * which the verdict word inherits unchanged. No transition, no animation.
 *
 * The .wep-verdict-cell-* classes are mirrored into docs/design/prototypes/_shell.css
 * (both copies move together — the #887 lesson).
 *
 * #2903: this whole sheet is also mirrored, verbatim, into
 * docs/design/prototypes/_verdict.css — the artboard-side copy a file:// drawing
 * can load. A change here lands there too, in the same PR;
 * RouteDesignArtifactCensusTests compares the two rule for rule.
 */

/* ─────────── Shared shell ─────────── */
.wep-verdict[b-i6c1f3nv0h] {
    display: inline-flex;
    align-items: center;
    min-width: 0;
}

.wep-verdict-glyph[b-i6c1f3nv0h] {
    gap: 6px;
}

/* ─────────── Glyph: the four-cell strip ─────────── */
/* gap:0 so four solid pass cells MERGE into a single block (R9); a hatch or
 * hollow cell visually interrupts that block. A neutral hairline frames the
 * strip so it reads as a defined four-leg axis, distinct from the row's separate
 * 8px mini-ring strip. */
.wep-verdict-cells[b-i6c1f3nv0h] {
    display: inline-flex;
    gap: 0;
    flex-shrink: 0;
    border-radius: var(--wep-radius-xs);
    overflow: hidden;
    box-shadow: inset 0 0 0 1px var(--wep-color-border-2);
}

/* All four legs verified-pass: tint the frame to the clean rule so the solid
 * green bar reads as an intentional, unmistakable "all good" block (R9). */
.wep-verdict-cells-solid[b-i6c1f3nv0h] {
    box-shadow: inset 0 0 0 1px var(--wep-verdict-cell-pass-rule);
}

.wep-verdict-cell[b-i6c1f3nv0h] {
    width: 9px;
    height: 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}

/* VerifiedPass — solid clean fill (no pattern). */
.wep-verdict-cell-pass[b-i6c1f3nv0h] {
    background: var(--wep-verdict-cell-pass-bg);
}

/* NotEvaluated — diagonal hatch over the sunken surface. Visibly NOT a solid
 * cell: this is the gap that must never read as a pass (KD2, R5). */
.wep-verdict-cell-noteval[b-i6c1f3nv0h] {
    background-image: var(--wep-verdict-cell-noteval-hatch);
}

/* Fail — hollow cell, rule border + × mark. Reads as a punched-out hole, the
 * strongest break in the strip. */
.wep-verdict-cell-fail[b-i6c1f3nv0h] {
    background: transparent;
    box-shadow: inset 0 0 0 1px var(--wep-verdict-cell-fail-rule);
    color: var(--wep-verdict-cell-fail-fg);
}

.wep-verdict-cell-x[b-i6c1f3nv0h] {
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-2xs);
    font-weight: var(--wep-weight-semi);
    line-height: 1;
    color: var(--wep-verdict-cell-fail-fg);
}

/* ─────────── Checklist: the drawer-header leg list ─────────── */
.wep-verdict-checklist[b-i6c1f3nv0h] {
    display: flex;
    flex-direction: column;
    gap: 8px;
    min-width: 0;
}

.wep-verdict-checklist-head[b-i6c1f3nv0h] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}

/* Plan 2026-09-11-0056 U8: the compact acceptance mark sits BESIDE the glyph (a sibling,
 * outside its role="img"), so it takes the glyph's own 6px gap as a margin. The mark's
 * treatment itself is global (.wep-acceptance-mark in _shell.css) — one rule for every
 * surface. */
.wep-verdict-glyph + .wep-acceptance-mark[b-i6c1f3nv0h] {
    margin-left: 6px;
}

.wep-verdict-legs[b-i6c1f3nv0h] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 3px;
}

.wep-verdict-leg[b-i6c1f3nv0h] {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: var(--wep-size-text-2xs);
}

.wep-verdict-leg .wep-verdict-cell[b-i6c1f3nv0h] {
    border-radius: var(--wep-radius-xs);
}

/* A not-evaluated / failed leg in the checklist needs the same hairline framing
 * the glyph strip provides, since these single cells are not adjacent. */
.wep-verdict-leg-noteval .wep-verdict-cell[b-i6c1f3nv0h],
.wep-verdict-leg-pass .wep-verdict-cell[b-i6c1f3nv0h] {
    box-shadow: inset 0 0 0 1px var(--wep-color-border-2);
}

.wep-verdict-leg-label[b-i6c1f3nv0h] {
    color: var(--wep-color-fg-2);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
}

/* R8: a leg label wired to its evidence anchor (U4 drawer wiring). Reads as a
 * label first, an affordance second — the underline appears only on hover so the
 * dense checklist stays calm. No motion beyond the inherited text-decoration
 * (KTD3 / three-motion rule). */
.wep-verdict-leg-link[b-i6c1f3nv0h] {
    text-decoration: none;
    cursor: pointer;
}

.wep-verdict-leg-link:hover[b-i6c1f3nv0h],
.wep-verdict-leg-link:focus-visible[b-i6c1f3nv0h] {
    color: var(--wep-color-fg-1);
    text-decoration: underline;
}

.wep-verdict-leg-state[b-i6c1f3nv0h] {
    margin-left: auto;
    color: var(--wep-color-fg-3);
    font-family: var(--wep-font-mono);
}
/* /Components/Settings/AutoAdoptPolicyPanel.razor.rz.scp.css */
/* #2517: the "not on the audit trail" notice after a kill switch whose record was lost — a Warn
   banner in its own spacing wrapper (the PublisherTrustCard / UpdateGrantPanel shape), rendered
   directly with the OFF state it qualifies. A WepBanner carries its own frame; the wrapper only
   spaces it from that state and the content around it. Every value is a kit token. */
.wep-auto-adopt-banner[b-iea1owe45n] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Settings/BackupStatusPanel.razor.rz.scp.css */
/*
    Backups card — #4212 U18 (KTD20), built to Marc's approved drawing of the card (2026-10-15): a bordered surface that
    opens /community/settings/storage; a head with the sentence-case title and either "Learn more" (calm) or one pill;
    the summary sentence; a callout per warning; three facts on a grid; and a foot line. The drawing's sheet is the
    console's tokens (its --pg-* names alias --wep-*); its sizes are set on the type scale here (ADR 2026-10-12-001:
    prose 14px, nothing under 12px) and its spacing on the space scale. A normal state wears no attention colour: only a
    warning's pill and callout carry the warn or danger ramp.
*/

/* The card is the first thing under the page head, and the gap above it is the head's own bottom margin, the kit's one
 * gap under every head (#4561 U2). Until then the head had none, and the card carried the page board's top inset itself;
 * the mirrored rule on the board kept a zero top margin, as this one does now. */
.wep-backup-card[b-1lxx2ditmk] {
    display: flex;
    flex-direction: column;
    min-width: 0;
    margin: 0 0 var(--wep-space-6);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

.wep-backup-card-head[b-1lxx2ditmk] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--wep-space-3);
    padding: var(--wep-space-4) var(--wep-space-5) 0;
}

.wep-backup-card-title[b-1lxx2ditmk] {
    margin: 0;
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-backup-card-more[b-1lxx2ditmk] {
    font-size: var(--wep-size-text-sm);
}

/* The pill: sentence case, never the kit's uppercase status pill, because it is a sentence fragment ("never backed up"). */
.wep-backup-pill[b-1lxx2ditmk] {
    display: inline-flex;
    align-items: center;
    padding: var(--wep-space-1) var(--wep-space-2);
    border-radius: var(--wep-radius-xs);
    font-size: var(--wep-size-text-xs);
    font-weight: var(--wep-weight-medium);
    line-height: 1;
    white-space: nowrap;
}

.wep-backup-pill-warn[b-1lxx2ditmk] {
    color: var(--wep-color-warn-fg);
    background: var(--wep-color-warn-bg);
}

.wep-backup-pill-bad[b-1lxx2ditmk] {
    color: var(--wep-color-danger-text, var(--wep-color-danger));
    background: color-mix(in srgb, var(--wep-color-danger) 14%, transparent);
}

.wep-backup-pill-idle[b-1lxx2ditmk] {
    color: var(--wep-color-fg-3);
    background: var(--wep-color-bg-2);
}

.wep-backup-card-sum[b-1lxx2ditmk] {
    max-width: 72ch;
    margin: 0;
    padding: var(--wep-space-1) var(--wep-space-5) 0;
    color: var(--wep-color-fg-2);
}

/* UNKNOWN and loading: the sentence is the whole card, so it carries the card's bottom padding. */
.wep-backup-card-sum-alone[b-1lxx2ditmk] {
    padding-bottom: var(--wep-space-4);
}

/* A warning's callout: its bold sentence and one next step. A bad state's sentence reads in the danger ramp. */
.wep-backup-alert[b-1lxx2ditmk] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
    margin: var(--wep-space-3) var(--wep-space-5) 0;
    padding: var(--wep-space-2) var(--wep-space-3);
    border-left: 3px solid var(--wep-color-warn-fg);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-warn-bg);
    color: var(--wep-color-fg-1);
}

.wep-backup-alert-bad[b-1lxx2ditmk] {
    border-left-color: var(--wep-color-danger-text, var(--wep-color-danger));
    background: color-mix(in srgb, var(--wep-color-danger) 14%, transparent);
    color: var(--wep-color-danger-text, var(--wep-color-danger));
}

.wep-backup-alert b[b-1lxx2ditmk] {
    font-weight: var(--wep-weight-semi);
}

.wep-backup-alert-next[b-1lxx2ditmk] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-backup-card code[b-1lxx2ditmk] {
    padding: 1px var(--wep-space-1);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-2);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
}

.wep-backup-facts[b-1lxx2ditmk] {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--wep-space-3) var(--wep-space-6);
    padding: var(--wep-space-3) var(--wep-space-5) var(--wep-space-4);
}

.wep-backup-fact[b-1lxx2ditmk] {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

.wep-backup-fact-label[b-1lxx2ditmk],
.wep-backup-fact-sub[b-1lxx2ditmk] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-backup-fact-val[b-1lxx2ditmk] {
    font-size: var(--wep-size-text-md);
    color: var(--wep-color-fg-1);
}

/* What the card says beyond the drawing's three facts: an older failure, the last restore, an upgrade, a signer change. */
.wep-backup-more[b-1lxx2ditmk] {
    margin: 0;
    padding: 0 var(--wep-space-5) var(--wep-space-4);
}

.wep-backup-more > div[b-1lxx2ditmk] {
    display: grid;
    grid-template-columns: minmax(120px, auto) minmax(0, 1fr);
    gap: var(--wep-space-4);
    padding: var(--wep-space-2) 0;
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-backup-more dt[b-1lxx2ditmk] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-backup-more dd[b-1lxx2ditmk] {
    margin: 0;
    min-width: 0;
    overflow-wrap: anywhere;
}

.wep-backup-checks[b-1lxx2ditmk] {
    margin: var(--wep-space-1) 0 0;
    padding-left: var(--wep-space-5);
}

.wep-backup-checks li[b-1lxx2ditmk] {
    margin: 0 0 var(--wep-space-1);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-backup-line[b-1lxx2ditmk] {
    display: block;
    margin-top: var(--wep-space-1);
    color: var(--wep-color-fg-2);
}

.wep-backup-card-foot[b-1lxx2ditmk] {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: var(--wep-space-3);
    padding: var(--wep-space-2) var(--wep-space-5);
    border-top: 1px solid var(--wep-color-border-1);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

/* `wep-mono` has a rule only inside .wep-table, so the card sets the mono face for its own spans. */
.wep-backup-card .wep-mono[b-1lxx2ditmk] {
    font-family: var(--wep-font-mono);
    font-variant-numeric: tabular-nums;
}

@media (max-width: 900px) {
    .wep-backup-facts[b-1lxx2ditmk] {
        grid-template-columns: 1fr;
    }
}
/* /Components/Settings/ConsoleSessionCapsPanel.razor.rz.scp.css */
/* Plan 2026-10-04-1018 U14 amendment: the session caps card, as the two artboards draw it
   (admin-settings-behavior, community-settings-users). The enforce switch sits on its own line
   above the per-role table, and the hour and minute inputs are narrow mono fields. Every value is
   a kit token. */
.wep-caps-enforce[b-7298zdive6] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin-bottom: var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-1);
}

.wep-caps-num[b-7298zdive6] {
    width: 96px;
    font-family: var(--wep-font-mono);
}
/* /Components/Settings/CoverageDeclineAction.razor.rz.scp.css */
/*
    The Decline confirmation — #2480 U16. Scoped styles for the confirmation the grant page's Coverage
    section opens in a full-width row beneath the deployed-but-uncovered package it declines, and that
    U17's coverage card opens beneath its card: the treatment of the Subscribe and Unsubscribe
    confirmations (UpdateGrantSubscribeAction.razor.css), because the section's acts must read as one kind
    of thing. All colour and spacing via --wep-* tokens.

    LOAD-BEARING: `.wep-table tbody td` is `white-space: nowrap` in the kit, and this confirmation renders
    INSIDE such a cell. Without `white-space: normal` here every sentence runs off the right edge on one
    line. The measure caps the prose at the page lead's 96ch.

    The three reasons are one radio group, stacked, each radio beside its label and what it means — the
    CVE coverage dismissal's reason group (CveCoverageRemainder.razor.css), the one other fixed-reason
    choice in the console.
*/

.wep-coverage-confirm[b-3srm2cxk9j] {
    white-space: normal;
    max-width: 96ch;
    padding: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-coverage-decline-reasons[b-3srm2cxk9j] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
    margin: var(--wep-space-2) 0;
    padding: 0;
    border: 0;
}

.wep-coverage-decline-reason[b-3srm2cxk9j] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
}
/* /Components/Settings/CoverageDeclineRevokeAction.razor.rz.scp.css */
/*
    The Revoke confirmation — #2480 U16. Scoped styles for the confirmation the grant page's Coverage
    section opens in a full-width row beneath the "Not covered by choice" row it revokes: the treatment of
    the section's other confirmations (UpdateGrantUnsubscribeAction.razor.css). All colour and spacing via
    --wep-* tokens.

    LOAD-BEARING: `.wep-table tbody td` is `white-space: nowrap` in the kit, and this confirmation renders
    INSIDE such a cell, so its sentence must be let wrap. The measure caps the prose at the page lead's 96ch.
*/

.wep-coverage-confirm[b-sqyghrz6g6] {
    white-space: normal;
    max-width: 96ch;
    padding: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}
/* /Components/Settings/InstallerByteMigrationPanel.razor.rz.scp.css */
/*
    Installer-byte migration panel — Plan 2026-07-14-001 U5 (#1372).
    Scoped styles for the migration surface on /community/settings/storage:
    action row, inline confirm, the aria-live progress strip, the readiness
    verdict checklist, and the gap table. All color/spacing via --wep-* tokens
    (no hard-coded hex — wwwroot/css is a build mirror of the prototype shell;
    scoped .razor.css is the only right place for component styling).
*/

.wep-migration-subtitle[b-80cvka4rch] {
    margin: var(--wep-space-5) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-md);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

/* #1396 — the modest secondary direction affordance (a Ghost-tier switch
   under the direction line): the return trip must stay reachable without
   competing with the primary Start action. */
.wep-migration-direction-alt[b-80cvka4rch] {
    margin: var(--wep-space-1) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
}

/* Action row — the Start trigger + the running-state Cancel. */


/* Inline confirm — the KTD7 plain-button tier (copy-only, non-destructive:
   an informative bordered box, deliberately NOT the danger ramp the abort
   ceremony uses). */






.wep-migration-egress[b-80cvka4rch] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-state-detonating-fg, var(--wep-color-fg-2));
}



/* Fail-soft inline action error. */
.wep-migration-error[b-80cvka4rch] {
    margin: var(--wep-space-2) 0;
    padding: var(--wep-space-2) var(--wep-space-3);
    border: 1px solid var(--wep-state-cveblocked-rule, var(--wep-color-border-2));
    border-radius: var(--wep-radius-xs);
    background: var(--wep-state-cveblocked-bg, var(--wep-color-bg-2));
    color: var(--wep-color-fg-1);
    font-size: var(--wep-size-text-sm);
}

/* The persistent aria-live progress strip — the AgentRolloutPanel health-strip
   idiom (pill + mono counters), present across idle/running/terminal states. */
.wep-migration-live[b-80cvka4rch] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-3);
    margin: var(--wep-space-3) 0;
    padding: var(--wep-space-3);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

.wep-migration-counters[b-80cvka4rch] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-migration-run-meta[b-80cvka4rch] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-migration-abort-reason[b-80cvka4rch] {
    flex-basis: 100%;
    margin: var(--wep-space-1) 0 0;
    color: var(--wep-color-fg-2);
    font-size: var(--wep-size-text-sm);
}

/* Readiness verdict — the WepVerdict checklist shape: word pill + reason list. */
.wep-migration-verdict[b-80cvka4rch] {
    margin: var(--wep-space-2) 0;
    padding: var(--wep-space-3);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
}

.wep-migration-verdict-head[b-80cvka4rch] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-3);
}

.wep-migration-asof[b-80cvka4rch] {
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-migration-verdict-reasons[b-80cvka4rch] {
    margin: var(--wep-space-2) 0 0;
    padding-left: var(--wep-space-5);
}

.wep-migration-verdict-reason[b-80cvka4rch] {
    margin: var(--wep-space-1) 0;
    color: var(--wep-color-fg-2);
    font-size: var(--wep-size-text-sm);
}

/* #1768 — this was written in the state-ramp shape (-rule + -bg) against
   `degraded`, a ramp that does not exist: the ramp set is clean / detonating /
   sbomready / cveblocked / quarantined / promoted / rolledback /
   uninstalllooping. Both var()s therefore fell through to their neutral
   fallbacks, so a CAVEAT — "this verdict holds only if the filesystem root
   survives the restart" — rendered as an ordinary grey panel with no cautionary
   signal at all.
   Resolved to `detonating`, which is the console's established warn treatment:
   .wep-banner-warn is exactly `detonating-{rule,bg,fg}`. Taking the ramp's own
   fg too (rather than leaving fg-2 on an amber tint) keeps this a pairing the
   ramp already contrast-checks — mixing a ramp background with an unrelated
   foreground is how #1750 started. */
.wep-migration-caveat[b-80cvka4rch] {
    margin: var(--wep-space-2) 0 0;
    padding: var(--wep-space-2) var(--wep-space-3);
    border-left: 3px solid var(--wep-state-detonating-rule);
    color: var(--wep-state-detonating-fg);
    font-size: var(--wep-size-text-sm);
    background: var(--wep-state-detonating-bg);
}

.wep-migration-trust[b-80cvka4rch],
.wep-migration-coverage[b-80cvka4rch] {
    margin: var(--wep-space-2) 0 0;
    color: var(--wep-color-fg-3);
}

/* ADR 2026-10-12-001: the trust basis is a sentence, so it is prose at 14px; the covered
   tenants are a list of ids, so they stay at the 12px label size. */
.wep-migration-trust[b-80cvka4rch] {
    font-size: var(--wep-size-text-sm);
}

.wep-migration-coverage[b-80cvka4rch] {
    font-size: var(--wep-size-text-xs);
}

/* Gap table rides the shared .wep-diff table styling; only spacing is scoped. */
.wep-migration-gaps[b-80cvka4rch] {
    margin-top: var(--wep-space-2);
}

@media (max-width: 720px) {
    .wep-migration-actions[b-80cvka4rch],
    
}
/* /Components/Settings/LocalAccountsSection.razor.rz.scp.css */
/* Plan 2026-07-28-001 U5b — layout-only scoped styles for the Users & Roles
   design pass. Visual identity (field chrome, typed-confirm anatomy, table,
   empty state, card) comes from the shared kit classes in _shell.css; this
   file only arranges those kit pieces with --wep-* tokens. */

/* #2464: the "Not on the audit trail" banner under the intro banner. A WepBanner already
   carries its own frame — the wrapper only spaces it, as CatalogPackage's .wep-pkg-banner
   does; flush, the two amber banners read as one box. */
.wep-users-banner[b-6ik8qbtjso] {
    margin: var(--wep-space-4) 0 0;
}

/* Create form: fields + submit flow as one wrapping row, baseline-aligned. */
.wep-users-create-row[b-6ik8qbtjso] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-3);
    align-items: flex-end;
}

.wep-users-create-row .wep-field[b-6ik8qbtjso] {
    min-width: 220px;
    margin: 0;
}

/* Actions cell: the enable/disable row, the two typed-confirm ceremonies, and
   the credential affordances stack with kit spacing instead of colliding. */
.wep-users-actions[b-6ik8qbtjso] {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--wep-space-3);
    padding-top: var(--wep-space-2);
    padding-bottom: var(--wep-space-2);
}

.wep-users-ceremony[b-6ik8qbtjso] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-1);
}

.wep-users-ceremony-controls[b-6ik8qbtjso] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

/* One-time-secret block (kit-modals "one-time-only secret" treatment inline):
   card frame from .wep-card; the value is selectable mono on bg-2. */
.wep-secret-reveal[b-6ik8qbtjso] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-3);
    max-width: 560px;
}

/* Composes the kit .wep-code block (font/bg/border/radius from _shell.css);
   only the true delta stays scoped: tighter size + padding, the stronger
   border-2 tone, and selectable-wrapping text — the kit's `white-space: pre`
   would stop a long generated password from wrapping. */
.wep-secret-value[b-6ik8qbtjso] {
    font-size: var(--wep-size-text-sm);
    border-color: var(--wep-color-border-2);
    padding: var(--wep-space-2) var(--wep-space-3);
    white-space: normal;
    user-select: all;
    word-break: break-all;
}
/* /Components/Settings/UpdateGrantCoverageSection.razor.rz.scp.css */
/*
    The grant page's Coverage section — #2067 U4. Scoped styles; the section is otherwise drawn
    entirely in kit classes, and this sheet holds only what the kit cannot say.

    The Coverage table's state notes (a notify-only reason, the carve-out that matched) sit in a kit
    cell, and `.wep-table tbody td` is `white-space: nowrap`. A notify-only reason is a full
    sentence, so on one line it widens the Coverage column until the Actions column (the
    Unsubscribe verb) is pushed off the right edge of the table. The note wraps instead; the pill
    and every other cell keep the kit's one-line treatment. The deployed-but-uncovered table
    (#2067 U6) wraps its reasons the same way.

    #2067 U6: the deployed-but-uncovered list follows the subscribed table directly, and its heading
    would otherwise sit against the table's last rule — the kit gives a section title no top margin.
*/

.wep-coverage-note[b-27v7q6gm3v] {
    white-space: normal;
}

.wep-coverage-uncovered[b-27v7q6gm3v] {
    margin-top: var(--wep-space-6);
}

/*
    #2480 U16: "Not covered by choice" follows the uncovered list the same way, with the same top margin, so the
    two lists of packages the grant does not advance read as siblings under one section.
*/

.wep-coverage-declined[b-27v7q6gm3v] {
    margin-top: var(--wep-space-6);
}

/*
    #2480 U16: a row's Actions cell can now hold more than one verb (Subscribe… or Ingest… beside Decline…, the
    one-click "Updates itself" on a presence-only row, Revoke… beside Subscribe… on a declined row). They sit in one
    line at the kit's gap between buttons, and wrap rather than widen the column when the cell is narrow.
*/

.wep-coverage-verbs[b-27v7q6gm3v] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

/*
    #2067 U6 live walk: the deployed-but-uncovered table measured 1301 px in a 1172 px section at a
    1440 px viewport, so every Subscribe and Ingest verb sat past the viewport's right edge and main
    scrolled sideways. Three of its cells held their whole width on one line: a three-ring version
    list ("canary 129.0.6668.90, pilot 129.0.6668.90, broad 129.0.6668.90"), the declaring groups, and
    an id with its presence-only pill.

    A LIST wraps between its entries and never inside one: an entry is one token to the operator
    ("canary 129.0.6668.90" parted after "canary" reads as two things, and a group name split across
    lines reads as two groups). The ", " between entries is where a line may break.
*/

.wep-coverage-list[b-27v7q6gm3v] {
    white-space: normal;
}

.wep-coverage-list-item[b-27v7q6gm3v] {
    white-space: nowrap;
}

/*
    The id and its presence-only pill share one wrapping box, so the pill drops beneath the id when
    the column is narrow and the column is never wider than its longest id. The gap is the kit's pill
    spacing: a pill beside text sits var(--wep-space-2) from it (the page heads' pills,
    CatalogPackage and FleetEndpointDetail). A row with no pill holds the id alone.
*/

.wep-coverage-package[b-27v7q6gm3v] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1) var(--wep-space-2);
}
/* /Components/Settings/UpdateGrantPanel.razor.rz.scp.css */
/*
    The standing update-grant panel — #2067 U6 review R8. Scoped styles; the panel is otherwise drawn
    entirely in kit classes, and this sheet holds only what the kit cannot say.

    The ceremony form's covered-set table puts a notify-only or carved-out row's note (a full sentence)
    in a kit cell, and `.wep-table tbody td` is `white-space: nowrap`. On one line a long note widens the
    Coverage column until the table runs off the page. The note wraps instead; the pill and every other
    cell keep the kit's one-line treatment — the rule the Coverage section's own sheet
    (UpdateGrantCoverageSection.razor.css) gives its notes.
*/

.wep-coverage-note[b-iswd2th6er] {
    white-space: normal;
}

/* #2473: the "not on the audit trail" notice after a brake (a disarm, a revoke or a
   narrow) whose record was lost — a Warn banner in its own spacing wrapper (the
   CommunityUsers / PolicyGrants / emergency-stop shape), rendered directly under the
   state it qualifies. A WepBanner carries its own frame; the wrapper only spaces it
   from that state above and the section content below. Every value is a kit token. */
.wep-update-grant-banner[b-iswd2th6er] {
    margin: var(--wep-space-3) 0;
}
/* /Components/Settings/UpdateGrantStoredForms.razor.rz.scp.css */
/*
    A stored subscription form named in a sentence — #2067 U4. The form (winget-com/winget/7zip.7zip)
    is one token to the operator, but its hyphen is a line-break opportunity in any font: the live
    walk found it broken as "winget-" / "com/winget/7zip.7zip". It is held on one line; the sentence
    around it still wraps at its spaces.
*/

.wep-stored-form[b-d1hpn91uoc] {
    white-space: nowrap;
}
/* /Components/Settings/UpdateGrantSubscribeAction.razor.rz.scp.css */
/*
    The Subscribe confirmation — #2067 U6. Scoped styles for the confirmation the grant page's Coverage
    section opens in a full-width row beneath the deployed-but-uncovered package it covers: the same
    treatment as the Unsubscribe confirmation (UpdateGrantUnsubscribeAction.razor.css), because the two
    are the section's two acts and must read as one kind of thing. All colour and spacing via --wep-*
    tokens (scoped .razor.css is the only right place for component styling).

    LOAD-BEARING: `.wep-table tbody td` is `white-space: nowrap` in the kit, and this confirmation renders
    INSIDE such a cell. Without `white-space: normal` here every sentence of the consequence runs off the
    right edge on one line. The measure caps the prose at the page lead's 96ch.
*/

.wep-coverage-confirm[b-wgvy1yn2ab] {
    white-space: normal;
    max-width: 96ch;
    padding: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-coverage-confirm .wep-table[b-wgvy1yn2ab] {
    margin: var(--wep-space-2) 0;
}
/* /Components/Settings/UpdateGrantUnsubscribeAction.razor.rz.scp.css */
/*
    The Unsubscribe confirmation — #2067 U4. Scoped styles for the confirmation the grant page's
    Coverage section opens in a full-width row beneath the row it removes. All colour and spacing
    via --wep-* tokens (scoped .razor.css is the only right place for component styling).

    LOAD-BEARING: `.wep-table tbody td` is `white-space: nowrap` in the kit (a record listing is one
    line per cell), and this confirmation renders INSIDE such a cell. Without `white-space: normal`
    here every sentence of the what-ends / what-stays list runs off the right edge on one line.
    The measure caps the prose at the page lead's 96ch (PolicyUpdateGrant.razor.css) so a 2560 row
    does not stretch a sentence across the whole table.
*/

.wep-coverage-confirm[b-m89mecvrx0] {
    white-space: normal;
    max-width: 96ch;
    padding: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-coverage-confirm ul[b-m89mecvrx0] {
    margin: 0;
    padding-left: var(--wep-space-5);
}

.wep-coverage-confirm li + li[b-m89mecvrx0] {
    margin-top: var(--wep-space-1);
}

.wep-coverage-confirm .wep-kv[b-m89mecvrx0] {
    margin-top: var(--wep-space-2);
}
/* /Components/Settings/WepSettingsList.razor.rz.scp.css */
/*
    Shared two-column settings list — Plan 2026-07-28-001 U1 (KTD1, R1/R2/R4).
    Design source: docs/design/prototypes/community-settings-advanced.html
    (the archetype block + its dense variant). All color/spacing via --wep-*
    tokens — wwwroot/css is a generated mirror; scoped .razor.css is the only
    right place for component styling.

    Entry markup is rendered by the child WepSettingsEntry (which deliberately
    has NO stylesheet of its own), so entry internals are styled from here via
    ::deep — the archetype's geometry lives in exactly one file.

    RHYTHM PROPERTIES — the density seam (AE4 / U4). Every vertical measure a
    density state may move flows through a --wep-set-* custom property declared
    on the root below. The dense variant (wep-set-list-dense, U3) and the
    host's [data-density="comfortable"] attribute (App.razor, density cookie)
    re-declare the properties; the consuming rules never change, and the
    two-column grid is declared exactly ONCE so normal and dense cannot drift.
    U4b widened the comfortable deltas (the U4 values were invisible in a
    side-by-side) and added --wep-set-desc-leading so prose leading — the
    strongest perceptual lever — rides the same seam.
*/

.wep-set-list[b-xse3yqtzle] {
    --wep-set-entry-pad-y: var(--wep-space-4);
    --wep-set-col-gap: var(--wep-space-6);
    --wep-set-col-width: 400px;
    --wep-set-group-gap: var(--wep-space-8);
    --wep-set-desc-leading: var(--wep-line-relaxed);
    width: 100%;
}

/* Dense variant — same archetype, tighter vertical rhythm, wider control
   column (a raw JSON value needs the room). */
.wep-set-list-dense[b-xse3yqtzle] {
    --wep-set-entry-pad-y: 9px;
    --wep-set-col-gap: var(--wep-space-5);
    --wep-set-col-width: 520px;
    --wep-set-desc-leading: var(--wep-line-snug);
}

/* Comfortable density (host attribute, written from the operator's density
   cookie) loosens the rhythm without touching any consuming rule. U4b:
   entry pad normal 16px -> 24px, dense 9px -> 14px, group gap one scale
   step further — clearly visible side-by-side, still vertical-only (the
   horizontal col gap stays dense per design.md §26). The dense variant's
   prose leading loosens snug -> relaxed; normal prose is already relaxed. */
:root[data-density="comfortable"] .wep-set-list[b-xse3yqtzle] {
    --wep-set-entry-pad-y: var(--wep-space-6);
    --wep-set-group-gap: var(--wep-space-12);
}

:root[data-density="comfortable"] .wep-set-list-dense[b-xse3yqtzle] {
    --wep-set-entry-pad-y: 14px;
    --wep-set-desc-leading: var(--wep-line-relaxed);
}

/* ── group heading per namespace ─────────────────────────────────────── */

.wep-set-group + .wep-set-group[b-xse3yqtzle] {
    margin-top: var(--wep-set-group-gap);
}

.wep-set-group-head[b-xse3yqtzle] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-3);
    padding-bottom: 5px;
    border-bottom: 1px solid var(--wep-color-border-2);
}

.wep-set-group-name[b-xse3yqtzle] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-set-group-note[b-xse3yqtzle] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    font-family: var(--wep-font-mono);
}

.wep-set-group-count[b-xse3yqtzle] {
    margin-left: auto;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

/* ── entry: the two columns + the rule between entries ───────────────── */

.wep-set-list[b-xse3yqtzle]  .wep-set-entry {
    display: grid;
    grid-template-columns: minmax(0, 1fr) var(--wep-set-col-width);
    gap: var(--wep-set-col-gap);
    padding: var(--wep-set-entry-pad-y) 0;
    border-bottom: 1px solid var(--wep-color-border-1);
    align-items: start;
}

.wep-set-list[b-xse3yqtzle]  .wep-set-entry:hover {
    background: linear-gradient(to right, var(--wep-color-bg-2), transparent 78%);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-l {
    min-width: 0;
}

/* ── left column: name, key, meta, prose ─────────────────────────────── */

.wep-set-list[b-xse3yqtzle]  .wep-set-name {
    font-size: var(--wep-size-text-md);
    font-weight: var(--wep-weight-semi);
    margin: 0;
    letter-spacing: var(--wep-tracking-tight);
    line-height: var(--wep-line-tight);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-key {
    display: block;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-4);
    font-weight: var(--wep-weight-regular);
    margin-top: 3px;
    letter-spacing: 0;
}

.wep-set-list[b-xse3yqtzle]  .wep-set-meta {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 6px;
    flex-wrap: wrap;
}

/* #4561 U3 — a setting's tags are kit pills (`wep-pill wep-set-tag …`): the pill's
   lowercase shape, and these rules only their tones, an outline on a quiet fill. */
.wep-set-list[b-xse3yqtzle]  .wep-set-tag {
    background: var(--wep-color-bg-2);
    color: var(--wep-color-fg-3);
    border: 1px solid var(--wep-color-border-1);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-tag-scope {
    background: transparent;
    color: var(--wep-color-fg-2);
    border-color: var(--wep-color-border-2);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-tag-live {
    background: transparent;
    color: var(--wep-state-clean-fg);
    border-color: var(--wep-state-clean-rule);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-tag-restart {
    background: transparent;
    color: var(--wep-state-rolledback-fg);
    border-color: var(--wep-state-rolledback-rule);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-tag-default {
    background: var(--wep-color-bg-2);
    color: var(--wep-color-fg-3);
    border-color: var(--wep-color-border-1);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-tag-override {
    background: var(--wep-color-accent-bg);
    color: var(--wep-color-accent-text);
    border-color: var(--wep-color-accent-1);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-tag-secret {
    background: var(--wep-state-quarantined-bg);
    color: var(--wep-state-quarantined-fg);
    border-color: var(--wep-state-quarantined-rule);
}

/* R17: the setting's write path is owned by a dedicated ceremony, not this
   generic surface — same informational weight as the scope tag, distinct
   only by label, since it names a fact rather than raising an alarm. */
.wep-set-list[b-xse3yqtzle]  .wep-set-tag-ceremony {
    background: transparent;
    color: var(--wep-color-fg-2);
    border-color: var(--wep-color-border-2);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-sep {
    color: var(--wep-color-border-2);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-kind {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-desc {
    margin: 8px 0 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    max-width: 68ch;
    line-height: var(--wep-set-desc-leading);
    text-wrap: pretty;
}

.wep-set-list[b-xse3yqtzle]  .wep-set-desc code {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-1);
    background: var(--wep-color-bg-2);
    padding: 0 3px;
    border-radius: var(--wep-radius-xs);
}

/* ── per-setting warning — attaches to the entry, never the page (R2) ── */

.wep-set-list[b-xse3yqtzle]  .wep-set-warn {
    margin-top: var(--wep-space-3);
    max-width: 68ch;
    padding: var(--wep-space-2) var(--wep-space-3);
    border-left: 3px solid var(--wep-state-cveblocked-rule);
    background: var(--wep-state-cveblocked-bg);
    color: var(--wep-state-cveblocked-fg);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-relaxed);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-warn strong {
    font-weight: var(--wep-weight-semi);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-warn code {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    background: transparent;
    font-weight: var(--wep-weight-medium);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-warn-amber {
    border-left-color: var(--wep-state-detonating-rule);
    background: var(--wep-state-detonating-bg);
    color: var(--wep-state-detonating-fg);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-warn-head {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin-bottom: 2px;
}

.wep-set-list[b-xse3yqtzle]  .wep-set-warn-title {
    /* #4561 U3: a title, so a sentence beside its pill, not caps */
    font-size: var(--wep-size-text-xs);
    font-weight: var(--wep-weight-semi);
}

/* ── right column: control, effective value / held affordance, actions ── */

.wep-set-list[b-xse3yqtzle]  .wep-set-r {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
    min-width: 0;
}

/* #3742: the slot drew at 11 px until ADR 2026-10-12-001 raised it to 12, and
   rollout & safety's "effective: off — off by default (neither side turns it
   on)" then wrapped with "on)" alone on its last line. A wrapped effective
   line breaks so its last line carries more than one word. */
.wep-set-list[b-xse3yqtzle]  .wep-set-eff {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    line-height: var(--wep-line-snug);
    text-wrap: pretty;
}

/* R17: names the ceremony that owns a ceremony-managed key's write path, in
   place of the control and actions slots (the page never supplies those
   alongside this). The effective-value slot may still follow it — R17
   forbids the editor and the save action, not the value. */
.wep-set-list[b-xse3yqtzle]  .wep-set-ceremony {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    align-self: flex-start;
}

.wep-set-list[b-xse3yqtzle]  .wep-set-ceremony-link {
    color: var(--wep-color-accent-text);
    font-weight: var(--wep-weight-medium);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-ceremony-name {
    font-family: var(--wep-font-mono);
}

.wep-set-list[b-xse3yqtzle]  .wep-set-eff b {
    color: var(--wep-color-fg-1);
    font-weight: var(--wep-weight-medium);
}

/* Held-value affordance — the only thing the component ever says about a
   secret's stored value. */
.wep-set-list[b-xse3yqtzle]  .wep-set-held {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-state-quarantined-fg);
    background: var(--wep-state-quarantined-bg);
    border: 1px solid var(--wep-state-quarantined-rule);
    border-radius: var(--wep-radius-xs);
    padding: 2px var(--wep-space-2);
    align-self: flex-start;
}

.wep-set-list[b-xse3yqtzle]  .wep-set-acts {
    display: flex;
    gap: var(--wep-space-2);
    flex-wrap: wrap;
    align-items: center;
}

/* ── dense variant — same skeleton, tighter type + collapsed meta run ── */

.wep-set-list-dense[b-xse3yqtzle]  .wep-set-name {
    font-size: var(--wep-size-text-sm);
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-2);
    flex-wrap: wrap;
}

.wep-set-list-dense[b-xse3yqtzle]  .wep-set-key {
    display: inline;
    margin-top: 0;
    font-size: var(--wep-size-text-2xs);
}

.wep-set-list-dense[b-xse3yqtzle]  .wep-set-meta {
    margin-top: 3px;
    gap: 5px;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

/* #3742: no line clamp. The dense description was clamped to two lines (six
   on hover). At 14 px (ADR 2026-10-12-001) a deployment-config description
   needs three at 1440, and the clamp hid its last line from anyone not
   hovering it, keyboard readers included. A description is prose the
   operator reads before changing a knob; the variant is dense by its rhythm,
   not by hiding text. */
.wep-set-list-dense[b-xse3yqtzle]  .wep-set-desc {
    margin-top: 4px;
    font-size: var(--wep-size-text-sm);
    /* leading flows from --wep-set-desc-leading (snug here, relaxed under
       comfortable) via the shared .wep-set-desc rule — U4b density seam. */
    max-width: 82ch;
}

.wep-set-list-dense[b-xse3yqtzle]  .wep-set-warn {
    margin-top: 6px;
    max-width: 82ch;
    font-size: var(--wep-size-text-sm);
    padding: 6px var(--wep-space-2);
}

.wep-set-list-dense[b-xse3yqtzle]  .wep-set-r {
    gap: 4px;
}

.wep-set-list-dense[b-xse3yqtzle]  .wep-set-eff {
    font-size: var(--wep-size-text-3xs);
}
/* /Pages/AuditEvidence.razor.rz.scp.css */
/* Scoped glue for /audit/evidence — #1848 console polish.
 *
 * .wep-facet-unavailable is the muted "—" an unrecorded best-effort facet
 * renders in the signed-span timeline (the honest note rides the title /
 * aria-label; same pattern as /audit/search). fg-3 is the kit's muted
 * foreground — the .wep-section-link-meta / .wep-field-help tone.
 */

.wep-facet-unavailable[b-srcm6lh61x] {
    color: var(--wep-color-fg-3);
}

/* #4561 U1: the summary is the page lead, drawn (audit-evidence.html) at the
 * page's own 96ch measure, the one its manifest and verify block also keep. The
 * kit's 60ch would wrap the trace id onto its own line. Page-local, as
 * PolicyUpdateGrant.razor.css overrides the same rule for the same reason. */
.wep-section-intro[b-srcm6lh61x] {
    max-width: 96ch;
}
/* /Pages/AuditSearch.razor.rz.scp.css */
/* Scoped glue for /audit/search — #1848 console polish (application of the
 * existing system only; every value is a kit token).
 *
 * - .wep-audit-searchbar had no rule anywhere, so the kit .wep-input's fixed
 *   320px width truncated the typed-prefix placeholder mid-example. The bar
 *   is one flex row (label · input · button) and the input takes the slack.
 * - .wep-facet-unavailable is the muted "—" an unrecorded best-effort facet
 *   renders (the honest note rides the title / aria-label). fg-3 is the kit's
 *   muted foreground — the .wep-section-link-meta / .wep-field-help tone.
 * - the export ceremony's input keeps the kit ceremony's space-3 below the
 *   phrase box (#3219, below).
 */

.wep-audit-searchbar[b-wt179h16cf] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-3);
    margin: 0 0 var(--wep-space-4);
}

.wep-audit-searchbar .wep-field-label[b-wt179h16cf] {
    flex: 0 0 auto;
}

.wep-audit-searchbar .wep-input[b-wt179h16cf] {
    flex: 1 1 auto;
    width: auto;
    min-width: 0;
}

.wep-facet-unavailable[b-wt179h16cf] {
    color: var(--wep-color-fg-3);
}

/* #3715 — THE FREE-FORM ID COLUMNS WRAP. The kit's table cells are nowrap, and
 * this table is seven mono columns, so its minimum width was the sum of every
 * column's longest value. Measured on a seeded v0.238-equivalent console at 1440:
 * the September window needed 1194px in a 1170px wrap (Action 283px, from
 * "catalog.reclassificationAcknowledged"), and the default view, which includes
 * the platform's own events, 1389px (Resource 319px, from
 * "package:winget-com|winget|mozilla.firefox"; Principal 226px). No one cell
 * forced it: the Span column, last, is what fell behind the wrap's sideways scroll.
 *
 * Action, Principal and Resource now wrap, at the break opportunities the page
 * puts after each separator (AuditSearch.SoftBreaks); timestamp, decision, key
 * version, Rekor entry and span id stay one line. Each column's minimum is now
 * its longest segment, and both views fit at 1440 (minimum 1,029px). Wide rungs are
 * unchanged: a table wider than every column's longest line hands out its slack
 * by those lines, which this rule does not change, so 1920 and 2560 draw the same
 * column widths and nothing wraps (measured). The wrap keeps its scroll container
 * for a single segment longer than the room left. Mirrored in audit-search.html. */
.wep-audit-cell-wrap[b-wt179h16cf] {
    white-space: normal;
}

/* #3219: the export phrase is the kit's .wep-typed-confirm-phrase box. The kit's
 * ceremony spaces that box from its input with the input's own margin-top
 * (.wep-typed-confirm-input, space-3); this page's input is a .wep-input, which
 * carries none, so without this it would sit flush against the box's border. */
.wep-typed-confirm .wep-input[b-wt179h16cf] {
    margin-top: var(--wep-space-3);
}
/* /Pages/CatalogActivity.razor.rz.scp.css */
/* #1860 (console polish batch 4, part J) — the one `wep-*` token
 * CatalogActivity.razor asks for that had no rule anywhere (the page's other
 * two, wep-loading-placeholder and wep-text-muted, were swapped for the kit
 * .wep-empty / .wep-fg-3 in the markup). Layout glue only, kit tokens
 * throughout (KTD5). No edits to docs/design/prototypes/_shell.css or
 * docs/design/tokens.css.
 *
 * .wep-button-row is the pagination footer: the kit action-row rhythm
 * (flex + gap-2, the same one #1854 gave /fleet/holds), with the page
 * indicator sharing the buttons' vertical centre.
 */



/* The page indicator between Prev / Next. `.wep-mono` only carries a font
   inside a .wep-table in the kit sheet, so state it here. */
.wep-button-row .wep-mono[b-jtqwnukgkc] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}
/* /Pages/CatalogList.razor.rz.scp.css */
/* The manager's standing notes in the page head: the CVE limits that remain for
 * Chocolatey and Scoop versions (#1960 U12), and Scoop's "attested-only serving"
 * note beside them. They ride .wep-fg-3 for colour; this only keeps a note from
 * crowding the Subscribe button and stops its label wrapping inside the action
 * row. The class keeps its Chocolatey name on the Scoop list too; renaming it is
 * left as a follow-up. */
.wep-choco-deferred-note[b-6syqrxf8ot] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    white-space: nowrap;
}
/* /Pages/CatalogPackage.razor.rz.scp.css */
/* #1860 (console polish batch 4, part I) — /catalog/pkg/{id}/{version} onto the
 * kit. Layout glue only: every value below is a kit token or mirrors an existing
 * kit rule (KTD5 — apply the shell + the kit, no new design). No edits to
 * docs/design/prototypes/_shell.css or docs/design/tokens.css.
 *
 * - .wep-pkg-card       rides the kit .wep-card (bg-1 / border-1 / radius-sm).
 *                       Its padding, its stacking and its head are the approved
 *                       drawing's now: see the shared foundation below (#4256).
 * - .wep-pkg-card-head  was the endpoint-detail prototype's .ep-section-head, under
 *                       the kit's uppercase section label. It is the approved
 *                       drawing's head now, a sentence-case title and an optional
 *                       muted note: see the shared foundation below (#4256).
 * - .wep-pkg-note       is the console's 60ch prose measure (.wep-empty-lead) at
 *                       text-sm — the ONE class every explanatory line wears. It
 *                       replaces the two inline `margin-top:var(--wep-space-1)`
 *                       runs on the adopt-across notes.
 * - .wep-pkg-kv         is the definition-list treatment for the page's own
 *                       label/value lists. (When this was written the kit had
 *                       NO .wep-kv rule; #1865 part M defined one for the four
 *                       settings panels that ask for it. This page keeps its
 *                       own.) It is what replaced the undefined `wep-fieldlist`,
 *                       and it is the approved drawing's label | value list now:
 *                       see the shared foundation below (#4256).
 *
 * A ::deep block at the bottom used to resolve the undefined classes that the
 * CARDS THIS PAGE HOSTS reference (Finding 0), page-scoped so it reached them
 * without touching the shared sheet. Right first move, wrong resting place:
 * most of those cards are hosted from OTHER surfaces — the typed-confirm modal
 * alone has six hosts, and the promote read-back checklist has none on this page
 * — where the same markup still asked for a class no rule answered. The six
 * shared idioms moved to _shell.css (#1865 follow-up block there, declarations
 * verbatim, so this page renders identically). What remains below is genuinely
 * specific to this page.
 *
 * #3742 U10 (KTD8): the page's own `wep-pkg-*` vocabulary is now `.wep-pkg-page ::deep`. The tab panels'
 * contents move into their own components (U11 to U13), and a plain scoped rule reaches only the elements this
 * file authors, so each rule is rooted at the page and reaches every component inside it, the drawer's forms
 * included (the drawer is the page root's last child for that reason). Two exceptions:
 *   - `.wep-pkg-actions` stays plain: the Actions menu's root (CatalogPackageActionsMenu) wears the same name for a
 *     different thing, and a ::deep copy would give it this page's button-row margin and display;
 *   - DeadStateClassTests forbids `.wep-pkg-page ::deep` copies of `wep-checkbox-row`, `wep-fieldset` and
 *     `wep-modal-preconfirm`, which live in the kit; none is redeclared here.
 * Every rule below is mirrored for the artboards in docs/design/prototypes/_catalog-scoped.css (the #1860 block,
 * whose selectors stay unrooted because boards outside this page draw the same classes) or in
 * docs/design/prototypes/_package.css (the #3742 block, and the shared foundation's section), declaration for
 * declaration (#887).
 */

/* Sections stack; the page root is a plain block so nothing here becomes a flex
 * item of the column-flex .wep-main (the #1859 regression: `overflow:hidden` on
 * such a child zeroes its automatic minimum size and the block renders empty).
 * No rule in this sheet clips — nothing between the pinned PageHead and
 * .wep-main may (#3742 KTD8), and ClippingContainerFlexGuardCensusTests reads
 * every overflow in the corpus. */
.wep-pkg-page[b-ehzzvzctnt] {
    display: block;
}

/* ---- #3742 U10: the pinned row (KTD8, R1) -------------------------------- */

/* PageHead itself is the pinned element: the first child of the page root, sticky against .wep-main, the
 * workspace's scroll container. Its element is PageHead's own, so the rule reaches it through ::deep; it is never
 * wrapped (PageHeadPlacementCensusTests), and the content cap below sits on an inner wrapper, never on
 * .wep-pkg-page, so the band stays full-bleed (the #2086 escape still reaches it).
 *
 * Its layer is one step above the sticky tier (#3742 PR 4 walk). A kit table's header cells sit on that tier too
 * (WepDataTable.razor.css) and come later in the document, so on the same layer they painted over the pinned row
 * and took the clicks meant for the tabs and the Actions button, and painted through the open Actions menu, whose
 * popover tier lives inside this element's stacking context. One step up, everything the panels draw passes under
 * the row and the menu sits above the page; the drawer and its backdrop (the drawer tier) still overlay it. The
 * `calc()` from a tier token is the kit's spelling for a neighbouring layer (.wep-drawer-backdrop). */
.wep-pkg-page[b-ehzzvzctnt] >  .wep-page-head:first-child {
    position: sticky;
    top: 0;
    z-index: calc(var(--wep-z-sticky) + 1);
}

/* In a tab panel a table's header does not stick. The panels scroll with .wep-main, the row above is pinned at its
 * top and its height is not a constant (the title's meta wraps), so a header that stuck at `top: 0` would stick
 * behind it, and the tables there are short. The cell stays positioned, off the sticky tier: its rule is a box
 * placed against it (#2495).
 *
 * Only in a tab panel. The page's root also holds the ceremony modals it mounts and the drawer, and a table there
 * scrolls in a container of its own (.wep-modal-body, .wep-drawer-body), where the kit's header sticks as it does on
 * every other page: the bulk-adopt dialog's batch and outcome tables keep their column names while their rows scroll. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-panel .wep-table thead th {
    position: relative;
    z-index: auto;
}

/* #4256 — the pinned row's layout, as the approved drawing has it (catalog-package-redesign.html at 605401896,
 * .rd-head), is the kit's head on every page since #4561 U2: the crumbs above, the title and the actions slot on one
 * row, the tabs under it with no padding below them. The rules that laid it out here, and the underline tabs further
 * down, left for _shell.css's `.wep-page-head` and `.wep-subtabs`. What stays is this page's own. */

/* The title: the package's name and its version, a step closer together than the kit sets a title and its meta. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-page-head > .wep-page-title {
    column-gap: var(--wep-space-2);
}

/* The version, in mono beside the name: a step under the title's 20px, as the drawing has it, because the mono face
 * runs wider than the sans. The kit has no 18px step, so the size is a literal. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-head-version {
    font-size: 18px;
    color: var(--wep-color-fg-2);
}

/* The title's last meta holds the verdict cluster: on the title's middle line, a step further from the version. (A
 * row that is not winget's names its manager and source in a meta before it, which stays on the title's baseline.) */
.wep-pkg-page[b-ehzzvzctnt]  .wep-page-head > .wep-page-title > .wep-page-meta:last-child {
    align-self: center;
    margin-left: var(--wep-space-2);
}

/* The verdict glyph and its one pill. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-head-verdict {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
    font-family: var(--wep-font-sans);
}

/* The glyph: the verdict's four cells, with no pill of its own (PackageHeadVerdict). It is as tall as its cells, so
 * the cluster sets it on the pill's middle line. The cells are the kit's (.wep-verdict-cells, in the shared sheet). */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-head-glyph {
    display: inline-flex;
}

/* The one pill says the lifecycle and the verdict ("ATTESTED safe to deploy"). The kit caps a pill at 30ch and lets
 * its sub-label give way first, which is right in a table cell; here the verdict is the sub-label, and the row has the
 * room, so the pill is as wide as its words. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-head-verdict .wep-pill {
    max-width: none;
}

/* The actions slot ends the title's row (the kit's); the Auto-update status and the Actions button sit a wide step
 * apart. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-page-head > .wep-page-actions {
    gap: var(--wep-space-4);
}

/* "Auto-update: …": muted prose, its state a step stronger. The same at every state: where the pipeline has the
 * version is said here, and a stall's attention colour is the strip's and Needs you's, under the row. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-head-flight {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-head-flight > strong {
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-2);
}

/* ---- #3742 U10: the content cap (R7) ------------------------------------- */

/* The wrapper under the pinned row. It held everything to 1440px (1600px at 2560) until Marc removed the cap on
 * 2026-10-16: on a wide screen the page filled a half to two thirds of the workspace. It fills the workspace now, at
 * every width, and carries no max-width. Prose keeps its measure (.wep-pkg-lede and the rows' sentences at 75ch,
 * .wep-pkg-note at 60ch), so the cards, the fact grids and the tables widen and a line of text does not. From 1920
 * the docked drawer takes its gutter from the workspace and the wrapper narrows beside it (design.md §3.6). */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-content {
    padding-bottom: var(--wep-space-12);
}

/* ---- #4256: the shared presentation foundation ----------------------------
 *
 * The package page is built to the approved drawing (catalog-package-redesign.html at 605401896). Each class in this
 * section is one of that drawing's `rd-*` rules under the page's name, with the drawing's values, in tokens. The lead
 * block, Overview, the chain of custody, Evidence and the drawer's content all draw with them, so each is declared
 * once, here, rooted at `.wep-pkg-page ::deep` so that it reaches every component inside the page. A rule that one
 * area alone needs belongs in that area's own sheet, not here.
 *
 * Two of the drawing's values are left out, by the operator's later decisions: a card has no shadow, and the
 * two-column grid has no 1280px breakpoint. The drawing's body line is 1.5, which the kit has no step for; the
 * relaxed line (1.55) is the nearest.
 *
 * Mirrored in the "shared foundation" section of docs/design/prototypes/_package.css, declaration for declaration
 * (#887). PackagePageFoundationDesignTests lists every rule here and holds the two sheets together. */

/* A tab panel (.rd-panel, inside .rd-wrap). It sets the type its cards inherit, prose at 14px on the relaxed line,
 * and the space above a tab's first card. An inactive panel carries `hidden`, so nothing here may set its display. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-panel {
    margin-top: var(--wep-space-6);
    font-size: var(--wep-size-text-md);
    line-height: var(--wep-line-relaxed);
}

/* The two-column panel grid (.rd-grid), 7 to 5: each column is a plain <div> of stacked cards. No breakpoint. Each
 * track's minimum is 0, so a column keeps its share of the width whatever a card holds. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-grid {
    display: grid;
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    gap: var(--wep-space-6);
    align-items: start;
}

/* The card (.rd-card). It rides the kit's .wep-card, which already is the drawing's ground, border and radius, and
 * sets the drawing's padding. No shadow. A card with a card before it in the same container sits one step-6 below it;
 * the first sits flush. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-card {
    margin: 0;
    padding: var(--wep-space-4) var(--wep-space-5);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-card ~ .wep-pkg-card {
    margin-top: var(--wep-space-6);
}

/* The card's head (.rd-card-head): its title and an optional muted note, on one baseline. The title (.rd-card-title)
 * is a sentence at 16px, semi-bold: never uppercase, never the kit's eyebrow label. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-card-head {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-3);
    margin-bottom: var(--wep-space-3);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-card-title {
    margin: 0;
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-card-meta {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

/* The lead paragraph (.rd-card-lead): one sentence under a card's head, or at the top of a panel. Its size and its
 * line are its container's. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-lede {
    margin: 0 0 var(--wep-space-3);
    max-width: 75ch;
    color: var(--wep-color-fg-2);
}

/* The icon row list (.rd-legs): one fact per row. Four cells in order: the icon, the row's name, its sentence with an
 * optional muted second line under it (.wep-pkg-sub), and a trailing link; a row with no link leaves the last cell
 * out. The sentence wraps inside its cell whatever it holds, as a fact's value does. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-rows {
    list-style: none;
    margin: 0;
    padding: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-row {
    display: grid;
    grid-template-columns: 20px 120px minmax(0, 1fr) auto;
    gap: var(--wep-space-3);
    align-items: start;
    padding: var(--wep-space-3) 0;
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-row:first-child {
    border-top: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-row-name {
    font-weight: var(--wep-weight-semi);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-row-text {
    max-width: 75ch;
    overflow-wrap: anywhere;
}

/* A muted second line under a sentence (the drawing's .rd-muted inside .rd-leg-text): in a row's sentence, or in a
 * fact's or a key-value's value. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-sub {
    display: block;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

/* The fact list (.rd-facts): one fact per row, its label, its value and a trailing cell for its Edit. The list is one
 * grid, so the label column is as wide as the longest label in it, and each row is a <div> laid on that grid's
 * columns, which keeps a row its own hook and its own rule line. A value wraps inside its cell whatever it holds: an
 * install switch is one unbroken token, and with nowhere to break it ran over the Edit link and out of the card
 * (#3742 PR 4 walk). */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts {
    display: grid;
    grid-template-columns: minmax(150px, auto) minmax(0, 1fr) auto;
    margin: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts > div {
    display: grid;
    grid-template-columns: subgrid;
    grid-column: 1 / -1;
    align-items: baseline;
    padding: var(--wep-space-3) 0;
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts > div:first-child {
    border-top: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts dt {
    padding-right: var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts dd {
    margin: 0;
    min-width: 0;
    overflow-wrap: anywhere;
}

/* #4432 follow-up (#4388 PR D, Marc): since the page fills the workspace, a fact's value column runs to the card's edge,
 * and a long value (an install-arguments override) ran on one line across a 2560 screen. A value is read like prose,
 * so it keeps the prose measure the page's sentences keep (75ch, as .wep-pkg-row-text); the Edit link stays in its own
 * column at the row's end, and a token longer than the measure still wraps (overflow-wrap above). */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts dd:first-of-type {
    max-width: 75ch;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts dd + dd {
    padding-left: var(--wep-space-4);
    text-align: right;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-facts dd > p {
    margin: 0;
}

/* The key-value list (.rd-kv), for a card and for a drawer: a label and its value per row, each row a <div> on the
 * list's two columns, as in the fact list. A value wraps inside its cell: a thumbprint or a digest is one unbroken
 * token. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-kv {
    display: grid;
    grid-template-columns: minmax(160px, auto) minmax(0, 1fr);
    margin: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-kv > div {
    display: grid;
    grid-template-columns: subgrid;
    grid-column: 1 / -1;
    align-items: baseline;
    padding: var(--wep-space-2) 0;
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-kv > div:first-child {
    border-top: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-kv dt {
    padding-right: var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-kv dd {
    margin: 0;
    min-width: 0;
    overflow-wrap: anywhere;
}

/* The plain table (.rd-table): a quiet uppercase header at 12px, cells at 14px, and numbers right-aligned in mono
 * (the kit's .wep-num, on the header cell and on the cell). The class goes on a WepDataTable through TableClass,
 * drawn Framed="false", and as well on a bare <table> with a <thead> and a <tbody>. On the primitive's table it takes
 * the kit's treatment down to the drawing's: no header band, no stick, cells that wrap, no hover. Each selector has
 * the shape of the kit rule it answers (.wep-table thead th, .wep-table tbody td), so that the artboard mirror, which
 * has no scope to out-rank the kit with, wins by coming later. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--wep-size-text-sm);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table thead th {
    position: static;
    padding: var(--wep-space-2) var(--wep-space-3) var(--wep-space-2) 0;
    border-bottom: 1px solid var(--wep-color-border-2);
    background: none;
    font-family: var(--wep-font-sans);
    font-size: var(--wep-size-text-xs);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    text-align: left;
    color: var(--wep-color-fg-3);
}

/* The kit draws a sticky header's rule in a box placed against the cell (#2495). This header does not stick, so its
 * rule is its own border, and the box goes. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table thead th::after {
    content: none;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table tbody td {
    padding: var(--wep-space-2) var(--wep-space-3) var(--wep-space-2) 0;
    border-bottom: 1px solid var(--wep-color-border-1);
    vertical-align: top;
    white-space: normal;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table tbody tr:hover {
    background: none;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table thead th.wep-num {
    font-family: var(--wep-font-sans);
    text-align: right;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-table tbody td.wep-num {
    font-family: var(--wep-font-mono);
    text-align: right;
}

/* The file list (.rd-files): one file per row behind a leading icon: the icon, the file's link, and its extension in
 * muted mono. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-files {
    list-style: none;
    margin: 0;
    padding: 0;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-files > li {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    padding: var(--wep-space-1) 0;
}

/* The one-line code block (.rd-code): a command to copy, on one line that scrolls sideways inside its own box and
 * never widens the card. `flex-shrink: 0` is the floor every scroll region carries
 * (ClippingContainerFlexGuardCensusTests): it does nothing in a card's block flow, and keeps the block its height if
 * it is ever a flex item. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-code {
    display: block;
    flex-shrink: 0;
    margin-top: var(--wep-space-2);
    padding: var(--wep-space-2) var(--wep-space-3);
    overflow-x: auto;
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-2);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    white-space: nowrap;
}

/* The link (.rd-link), on an <a> or on a <button>: the link colour, and no underline until it is pointed at. `height:
 * auto` and the reset of padding, border and ground take the kit's button baseline off a <button>, whose 28px box is
 * for a button that looks like one. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-link {
    height: auto;
    padding: 0;
    border: 0;
    background: none;
    font: inherit;
    color: var(--wep-color-link);
    text-decoration: none;
    cursor: pointer;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-link:hover {
    color: var(--wep-color-link-hover);
    text-decoration: underline;
}

/* The "more" link: a .wep-pkg-link that ends in the 14px chevron and never wraps. The gap stands for the space the
 * drawing leaves between the words and the chevron. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-more {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-1);
    white-space: nowrap;
}

/* The small uppercase label (.rd-label), 12px. Used sparingly, over a block that has no sentence of its own to name
 * it ("Verify offline"); never as a card's title. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-label {
    font-size: var(--wep-size-text-xs);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
}

/* Mono (.rd-mono), for a value that is an identifier: a digest, a time, a command, an id. 13px is the drawing's size
 * for it: the mono face runs wider than the sans, and at the sans' 14px an identifier in a sentence reads a size up.
 * The kit has no 13px step, so the size is a literal, above the 12px floor. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-mono {
    font-family: var(--wep-font-mono);
    font-size: 13px;
}

/* An icon's wrapper (.rd-icon). WepIcon draws at the size it is given (14, 16 or 20) in the colour it inherits, and
 * takes no class, so the wrapper carries the tone. In a line of text it sits 3px under the baseline, as the drawing's
 * icons do. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-icon {
    display: inline-flex;
    flex: none;
    line-height: 0;
    vertical-align: -3px;
}

/* The four tones, on an icon's wrapper or on a word. Three are the drawing's (.rd-ok, .rd-warn, .rd-muted). The
 * fourth is a failure's: a failed check on the reasons line and on Overview, and an open halt on the timeline that is
 * no stall. The drawing draws no failed check (its one x in a circle is a step that did not complete, which stays
 * muted), and a failed check has to look failed, so it wears the alarm colour the verdict glyph's failed cell wears
 * (--wep-verdict-cell-fail-fg is this same token). Declared here alone: no area colours a failure by a rule of its
 * own. The words beside the icon always say the status (ADR 2026-10-13-001). */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-tone-ok {
    color: var(--wep-state-clean-fg);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-tone-warn {
    color: var(--wep-color-warn-fg);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-tone-fail {
    color: var(--wep-state-cveblocked-fg);
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-tone-muted {
    color: var(--wep-color-fg-3);
}

/* ---- the #1860 vocabulary the drawer's forms keep --------------------------- */

/* The one explanatory-note class: text-sm at the console's 60ch measure. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-note {
    margin: var(--wep-space-2) 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

/* A result message keeps the note's measure; its colour comes from the
   .wep-ok / .wep-error rules below. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-msg {
    margin: var(--wep-space-3) 0 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

/* A WepBanner already carries its own frame — the wrapper only spaces it. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-banner {
    margin: var(--wep-space-4) 0 0;
}

/* A nested block inside a card (the MSI property picker). */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-subblock {
    margin-top: var(--wep-space-3);
}

/* Typed-confirm blocks keep the console's 36rem measure (the #1854 convention);
   the phrase and its input read as one control, not three stacked paragraphs. */
.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-confirm {
    margin-top: var(--wep-space-3);
    max-width: 36rem;
}

.wep-pkg-page[b-ehzzvzctnt]  .wep-pkg-confirm > p {
    margin: 0 0 var(--wep-space-2);
}

/* The kit action-row rhythm (flex + gap-2) for every button pair on the page. Plain, not ::deep (#3742 U10): the
   Actions menu's root wears this name too, and its own sheet lays it out. */
.wep-pkg-actions[b-ehzzvzctnt] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-3);
}
/* /Pages/CommunityAccount.razor.rz.scp.css */
/* Plan 2026-07-28-001 U5b — layout-only scoped styles for the My Account
   design pass. Visual identity (field chrome, fact strip, code block, card,
   buttons, banners) comes from the shared kit classes in _shell.css; this
   file only arranges those kit pieces with --wep-* tokens. */

/* Form rows: fields + the action button flow as one wrapping row. */
.wep-account-fields[b-jy4vvklgn3] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-3);
    align-items: flex-end;
}

.wep-account-fields .wep-field[b-jy4vvklgn3] {
    min-width: 240px;
    margin: 0;
}

/* Recovery codes: a selectable mono grid, one code per cell. */
.wep-recovery-codes[b-jy4vvklgn3] {
    list-style: none;
    margin: var(--wep-space-4) 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: var(--wep-space-2);
}

/* Each cell composes the kit .wep-code block (font/bg/border/radius from
   _shell.css — the .wep-secret-value pattern); only the true delta stays
   scoped: centered, tighter vertical padding, whole-code selection. */
.wep-recovery-codes li[b-jy4vvklgn3] {
    padding: var(--wep-space-2) var(--wep-space-3);
    text-align: center;
    user-select: all;
}

.wep-account-actions[b-jy4vvklgn3] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-3);
    margin-top: var(--wep-space-3);
}

/* Enrollment: QR card beside the manual-key fallback. */
.wep-account-enroll[b-jy4vvklgn3] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-5);
    align-items: flex-start;
    margin: var(--wep-space-3) 0;
}

.wep-account-qr[b-jy4vvklgn3] {
    padding: var(--wep-space-3);
    max-width: 240px;
}
/* /Pages/CommunityBrokers.razor.rz.scp.css */
/* Design-pass glue for /community/brokers — Plan 2026-07-28-001 U5c (KTD5:
 * application of the existing system only; every value mirrors its source
 * idiom, no new visual language).
 *
 * - .wep-steps base (decimal list + li rhythm) lives in _shell.css now
 *   (the KTD5 promotion); this file keeps only the centering glue so the
 *   list sits inside the centered .wep-empty-state card at the same 60ch
 *   measure as .wep-empty-lead.
 * - .wep-empty-state-actions is the CTA row inside the kit empty-state card
 *   (flex + gap-2, the kit action-row rhythm), centered like the card copy.
 * - .wep-drawer-actions mirrors _shell.css .wep-drawer-foot (the drawer
 *   action row: flex + gap-2 above a border-1 rule) — the row stays in the
 *   drawer body between the identity dl and the config section, so the foot
 *   treatment is reproduced in place rather than moving the flow.
 */

.wep-steps[b-dfg5f5cy3s] {
    display: inline-block;
    max-width: 60ch;
    margin: var(--wep-space-3) 0 0;
    text-align: left;
}

.wep-empty-state-actions[b-dfg5f5cy3s] {
    display: flex;
    justify-content: center;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-4);
}

.wep-drawer-actions[b-dfg5f5cy3s] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-4);
    padding-top: var(--wep-space-3);
    border-top: 1px solid var(--wep-color-border-1);
}

/* #1848 — the registry section header: the kit section label on the left,
 * the show/hide-decommissioned toggle (the kit .wep-btn-ghost) on the right.
 * The label's own bottom margin moves to the row so the two align. */
.wep-brokers-section-head[b-dfg5f5cy3s] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--wep-space-3);
    margin-bottom: var(--wep-space-2);
}

.wep-brokers-section-head .wep-section-title[b-dfg5f5cy3s] {
    margin-bottom: 0;
}
/* /Pages/CommunitySettingsAdvanced.razor.rz.scp.css */
/*
    Plan 2026-07-28-001 U3: this page composes the shared settings-list
    archetype's DENSE variant (WepSettingsList Dense="true"), so the two-column
    geometry lives in EXACTLY one place — the entry rule in
    Components/Settings/WepSettingsList.razor.css. The interim per-page fixed
    table sizing rules (added after the 2026-07-27 screenshot walk measured the
    stacked .wep-diff tables jittering: the VALUE column landed at
    650/672/626px across three groups at 1440px) are deleted together with the
    tables they constrained. This file styles only the
    page-supplied fragments: the namespace index chips, the meta run, the
    raw-JSON editor, the read-only value of a ceremony-managed key and the
    save/outcome actions row.
*/

/* ── namespace index — one chip per group (the prototype's ns-index row) ── */

.wep-adv-ns-index[b-zmdjknxxkx] {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    margin: 0 0 var(--wep-space-4);
}

.wep-adv-ns-chip[b-zmdjknxxkx] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px var(--wep-space-2);
    border-radius: var(--wep-radius-pill);
    border: 1px solid var(--wep-color-border-1);
    background: var(--wep-color-bg-1);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-2);
}

.wep-adv-ns-n[b-zmdjknxxkx] {
    color: var(--wep-color-fg-4);
}

/* ── meta run in the entry's description slot ────────────────────────── */

.wep-adv-meta[b-zmdjknxxkx] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

/* ── raw-JSON editor — fills the SHARED control column, never its content
      width (per-content sizing is exactly what made the old tables jitter) ── */

.wep-adv-json[b-zmdjknxxkx] {
    width: 100%;
    box-sizing: border-box;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-1);
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
    padding: var(--wep-space-1) var(--wep-space-2);
    resize: vertical;
}

.wep-adv-json:focus[b-zmdjknxxkx] {
    outline: 2px solid transparent;
    border-color: var(--wep-color-border-focus);
    box-shadow: var(--wep-focus-ring);
}

/* ── read-only value of a ceremony-managed key (U11, R17) — the same mono
      JSON the editor would have pre-filled, in the entry's effective-value
      slot. No border and no background, so it never reads as an input; the
      size inherits the slot's (2xs, 3xs in the dense list). ── */

.wep-adv-json-ro[b-zmdjknxxkx] {
    margin: 0;
    font-family: var(--wep-font-mono);
    font-size: inherit;
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-2);
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

/* ── save + outcome pill + field error, one wrapping row in the actions
      slot ── */

.wep-adv-actions[b-zmdjknxxkx] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    flex-wrap: wrap;
}

.wep-adv-actions .wep-field-error[b-zmdjknxxkx] {
    flex-basis: 100%;
}
/* /Pages/CommunitySettingsCatalogPolicy.razor.rz.scp.css */
/*
    #2592 U6 — the catalog-policy page composes the shared settings-list
    archetype (WepSettingsList), so the two-column geometry lives in
    Components/Settings/WepSettingsList.razor.css. This file styles only the
    page-supplied control fragments: the per-ring hours row, the two trusted
    lists and their add row.
*/

.wep-policy-add[b-rr2vojkqm6] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2) var(--wep-space-3);
}

.wep-policy-field[b-rr2vojkqm6] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-2);
}

.wep-policy-field input[type="number"][b-rr2vojkqm6] {
    width: 88px;
    box-sizing: border-box;
}

.wep-policy-list[b-rr2vojkqm6] {
    list-style: none;
    margin: 0 0 var(--wep-space-2);
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.wep-policy-item[b-rr2vojkqm6] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--wep-space-3);
    padding: 2px 0;
    border-bottom: 1px solid var(--wep-color-border-1);
}
/* /Pages/CommunitySettingsDeploymentConfig.razor.rz.scp.css */
/*
    #2592 U7 — the deployment-config page composes the shared settings-list archetype
    (WepSettingsList, dense), so the two-column geometry lives in
    Components/Settings/WepSettingsList.razor.css. This file styles only the page-supplied
    fragments: the fence notice and the value · source line.
*/

.wep-deploy-fence[b-9ykpwyz521] {
    margin: var(--wep-space-1) 0 0;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-2);
}

.wep-deploy-values[b-9ykpwyz521] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0 6px;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
}

.wep-deploy-value[b-9ykpwyz521] {
    color: var(--wep-color-fg-1);
    font-weight: 600;
}

.wep-deploy-value-absent[b-9ykpwyz521] {
    color: var(--wep-color-fg-3);
    font-weight: 400;
}

.wep-deploy-source[b-9ykpwyz521] {
    color: var(--wep-color-fg-2);
}

.wep-deploy-override[b-9ykpwyz521] {
    color: var(--wep-color-fg-2);
}
/* /Pages/CommunitySettingsRolloutSafety.razor.rz.scp.css */
/*
    #2592 U5 — the rollout & safety page composes the shared settings-list archetype
    (WepSettingsList), so the two-column geometry lives in
    Components/Settings/WepSettingsList.razor.css. This file styles only the page-supplied
    control fragment: the fence checkbox and the threshold fields.
*/

.wep-rollout-controls[b-arq2klp8o0] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2) var(--wep-space-4);
}

.wep-rollout-field[b-arq2klp8o0] {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-2);
}

.wep-rollout-field input[type="text"][b-arq2klp8o0] {
    width: 72px;
    box-sizing: border-box;
}

.wep-rollout-values[b-arq2klp8o0] {
    display: block;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-2);
}
/* /Pages/EmptyTenant.razor.rz.scp.css */
.wep-empty-tenant[b-4soz0r9ihg] {
    padding: var(--wep-space-6);
    max-width: 720px;
    color: var(--wep-color-fg-2);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-relaxed);
}

/*
 * There is deliberately NO `.wep-empty-tenant h2` rule. The page had one until
 * 2026-09-07, styling a heading that duplicated the milestone's own title; the
 * page dropped the heading, so the rule styled nothing. Scoped CSS could never
 * have reached the milestone's h2 anyway — that element carries
 * WepGuidedMilestone's scope id, not this page's, and .wep-guided-title in the
 * component's own sheet is what styles it.
 */

.wep-empty-tenant p[b-4soz0r9ihg] {
    margin: 0 0 var(--wep-space-4);
}
/* /Pages/FleetCveExposure.razor.rz.scp.css */
/* /fleet/cve (CVE exposure) — page glue. Every colour, size and pill is a kit token or an existing global
 * class (.wep-disclosure, WepStatusPill, WepButton Ghost); no new visual language.
 *
 * What the page itself still lays out is small: the lookup front door, the list's tool line and pager, and the
 * can't-tell group's rhythm. The coverage line and the pin panel moved to Components/Fleet/CveCoverageRemainder
 * with #1915, and the id-cell run to Components/Fleet/CveExposureProductTable with #1918; each took its rules
 * with it, because a Blazor scoped sheet styles only the component that owns it.
 *
 * Plan 2026-09-06-2144 U4: these flex rows were inline style= attributes once. They are the first things a
 * narrow rung has to stack, and a media query can reach a class and can never reach a style=.
 */

.wep-cve-lookup[b-s80jxocgq1] {
    display: flex;
    gap: var(--wep-space-2);
    align-items: center;
    margin: var(--wep-space-3) 0;
}

.wep-cve-paging[b-s80jxocgq1] {
    display: flex;
    gap: var(--wep-space-2);
    align-items: center;
    margin: var(--wep-space-2) 0;
}

/* The small-print family. Colour stays on the shared .wep-fg-3 kit utility; only the size is local. */
.wep-cve-smallprint[b-s80jxocgq1] {
    font-size: var(--wep-size-text-sm);
}

/* #1918 — the list's tool line: how many hits and products the list shows, then expand / collapse. */
.wep-cve-list-tools[b-s80jxocgq1] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2) var(--wep-space-3);
    margin: var(--wep-space-3) 0 var(--wep-space-2);
}

.wep-cve-list-summary[b-s80jxocgq1] {
    margin: 0 auto 0 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}

.wep-cve-list-summary strong[b-s80jxocgq1] {
    color: var(--wep-color-fg-1);
    font-weight: var(--wep-weight-semi);
}

/* #3577 R20 (U6): the collapsed can't-tell group sits under the confident and possible table,
   at the unmatched remainder's rhythm. */
.wep-cve-cant-tell[b-s80jxocgq1] {
    margin-top: var(--wep-space-4);
}
/* /Pages/FleetCveResponse.razor.rz.scp.css */
/* Plan 2026-09-06-2144 U4 — the CVE-response page's three inline style=
 * attributes, moved here. Declarations relocated verbatim; this is a
 * relocation, not a redesign.
 *
 * `.wep-filter-row` was already on the filter group with a rule in no
 * stylesheet — the inline style was doing the work — so this file also resolves
 * one of KitClassDefinitionCensusTests' dead classes. It is also the rule the
 * viewport ladder will need: a horizontal row of three selects is the first
 * thing that has to stack at a narrow rung, and a media query can reach a class
 * where it can never reach a style=.
 */

.wep-filter-row[b-7p3ekmtdzc] {
    display: flex;
    gap: var(--wep-space-3);
    align-items: center;
    margin: var(--wep-space-3) 0;
}

/* Status lines: the deploy notice under the banners, and the "N more products
 * matched" overflow note. Colour stays on the shared .wep-fg-3 kit utility. */
.wep-cve-deploy-notice[b-7p3ekmtdzc] {
    margin: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}

.wep-cve-product-overflow[b-7p3ekmtdzc] {
    margin: var(--wep-space-3) 0;
    font-size: var(--wep-size-text-sm);
}
/* /Pages/FleetEndpointDetail.razor.rz.scp.css */
/* FleetEndpointDetail.razor.css — #1854 (part G): the endpoint detail page on
 * docs/design/prototypes/endpoint-detail.html, applied with the kit that already
 * exists. This sheet is LAYOUT GLUE ONLY — every colour, size and radius is a
 * kit token, every chrome class (.wep-card, .wep-fact-strip, .wep-diff,
 * .wep-disclosure, .wep-pill-*, .wep-btn-*) stays in _shell.css. The page
 * carries zero inline styles; what used to be 81 style="" attributes is the set
 * of small classes below. Scoped (Blazor's b-… attribute), so nothing here
 * leaks into another page.
 */

/* ── Page head ─────────────────────────────────────────────────────────── */

/* The head's ONE status pill, after the meta text. */
.wep-endpoint-head-pill[b-qgscdeusl3] {
    margin-left: var(--wep-space-2);
}

/* #1848 / #1854 — the unassign-from-all-rings opener: its own action group at
 * the END of the page head's actions row, so the outline-danger button keeps
 * its intrinsic width and never reads as the page's primary action. */
.wep-fleet-unassign-actions[b-qgscdeusl3] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin-left: auto;
}

/* ── Fact strip: ONE ruled row of seven tiles ──────────────────────────── */

/* The kit .wep-fact-strip is a wrapping flex row; on this page it is the
 * prototype's seven-column grid with a hairline rule between tiles.
 * minmax(0, 1fr) tracks + min-width: 0 tiles: a long value wraps INSIDE its
 * tile instead of pushing the strip into a second row. */
.wep-endpoint-facts[b-qgscdeusl3] {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 0;
    padding: 0;
    overflow: hidden;
    /* LOAD-BEARING, paired with the overflow above. `.wep-main` is a COLUMN flex
     * container (_shell.css:345-351: display:flex; flex-direction:column;
     * min-height:0; overflow:auto) and this strip is a direct flex item of it.
     * A flex item's automatic minimum size (min-height:auto) applies only while
     * its overflow is `visible` — CSS Box Sizing 3 §4.1. The `overflow: hidden`
     * that clips the tile hairlines to the strip's rounded corners therefore
     * collapses min-height to 0, and the flex algorithm shrinks the strip to a
     * 2px sliver (its own borders) with every 176px tile clipped away: the
     * strip renders EMPTY on the live page while the DOM is perfectly correct.
     * Shipped that way in v0.149.0 and caught only by the post-deploy walk —
     * bUnit does no layout, so no render test can see it. Never remove this
     * without removing `overflow: hidden` too. */
    flex: none;
}

.wep-endpoint-facts > .wep-fact[b-qgscdeusl3] {
    min-width: 0;
    gap: 2px;
    padding: var(--wep-space-3) var(--wep-space-4);
    border-right: 1px solid var(--wep-color-border-1);
}

.wep-endpoint-facts > .wep-fact:last-child[b-qgscdeusl3] {
    border-right: 0;
}

.wep-endpoint-facts .wep-fact-value[b-qgscdeusl3] {
    font-size: var(--wep-size-text-md);
    overflow-wrap: anywhere;
}

/* The tile's mono sub-line (fqdn, provenance, absolute sync time, update /
 * winget state). .wep-fact-provenance is the #1852 name the ring tile keeps. */
.wep-fact-sub[b-qgscdeusl3],
.wep-fact-provenance[b-qgscdeusl3] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    overflow-wrap: anywhere;
}

/* A sub-line made of small label + pill pairs (agent update; winget fence /
 * health). Wraps inside the tile. */
.wep-endpoint-fact-kv[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1) var(--wep-space-2);
}

.wep-endpoint-fact-k[b-qgscdeusl3] {
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
}

/* The Owner tile's sub-line ACTION (the per-user reveal ceremony). */
.wep-endpoint-fact-action[b-qgscdeusl3] {
    display: block;
    min-width: 0;
}

@media (max-width: 1080px) {
    .wep-endpoint-facts[b-qgscdeusl3] {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }

    .wep-endpoint-facts > .wep-fact[b-qgscdeusl3] {
        border-bottom: 1px solid var(--wep-color-border-1);
    }
}

/* ── Section cards ─────────────────────────────────────────────────────── */

.wep-endpoint-section[b-qgscdeusl3] {
    margin: 0 0 var(--wep-space-5);
}

/* Head row: the kit section label, a mono meta line, right-aligned actions. */
.wep-endpoint-section-head[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-3);
    margin-bottom: var(--wep-space-3);
}

.wep-endpoint-section-head .wep-section-title[b-qgscdeusl3] {
    margin: 0;
}

.wep-endpoint-section-meta[b-qgscdeusl3] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-endpoint-section-actions[b-qgscdeusl3] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin-left: auto;
}

/* A sub-head block inside a card (orphan adoptions, per-profile coverage). */
.wep-endpoint-subsection[b-qgscdeusl3] {
    margin-top: var(--wep-space-4);
    padding-top: var(--wep-space-3);
    border-top: 1px solid var(--wep-color-border-1);
}

.wep-endpoint-subhead[b-qgscdeusl3] {
    margin: 0 0 var(--wep-space-1);
}

/* Plan 2026-09-08-0816 U5 — the head line each of the two installed-package
   tables carries: the table's name and the population IT renders (R7). Same
   baseline row as the card's section head, one step down in the hierarchy, so
   the two heads read as siblings rather than as two more section cards. */
.wep-endpoint-table-head[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-3);
    margin: var(--wep-space-4) 0 var(--wep-space-2);
}

.wep-endpoint-table-head .wep-endpoint-subhead[b-qgscdeusl3] {
    margin: 0;
}

/* The second table's caption sits directly under its head, so it drops the
   leading gap the per-user caption needs. */
.wep-endpoint-table-head + .wep-endpoint-caption[b-qgscdeusl3] {
    margin-top: 0;
}

/* The kit empty line sits inside a card here — the card carries the spacing. */
.wep-endpoint-section .wep-empty[b-qgscdeusl3] {
    margin: var(--wep-space-3) 0;
}

/* ── Text roles (colour comes from the global .wep-fg-3 utility) ───────── */

.wep-endpoint-note[b-qgscdeusl3] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-endpoint-note-inline[b-qgscdeusl3] {
    font-size: var(--wep-size-text-sm);
}

/* #4594 E4 — the Export evidence dialog's purpose field fills the dialog's body, as /fleet's Export inventory's does:
 * the kit's .wep-textarea is the WepModal's whole width, so inside the body's padding it would scroll sideways. */
.wep-endpoint-export-purpose[b-qgscdeusl3] {
    width: 100%;
}

.wep-endpoint-para[b-qgscdeusl3] {
    margin: 0 0 var(--wep-space-2);
}

.wep-endpoint-notice[b-qgscdeusl3] {
    margin: 0;
    font-size: var(--wep-size-text-sm);
}

.wep-endpoint-indicator[b-qgscdeusl3] {
    margin: var(--wep-space-2) 0;
    font-size: var(--wep-size-text-sm);
}

.wep-endpoint-caption[b-qgscdeusl3] {
    margin: var(--wep-space-3) 0 var(--wep-space-1);
    font-size: var(--wep-size-text-sm);
}

.wep-endpoint-foot-note[b-qgscdeusl3] {
    margin: var(--wep-space-2) 0 0;
    font-size: var(--wep-size-text-sm);
}

.wep-endpoint-block-note[b-qgscdeusl3] {
    display: block;
    margin-top: var(--wep-space-1);
}

.wep-endpoint-confirm-box[b-qgscdeusl3] {
    display: block;
    max-width: 32rem;
    margin-top: var(--wep-space-1);
}

.wep-endpoint-relaunch-list[b-qgscdeusl3] {
    margin: var(--wep-space-2) 0 0;
    padding-left: var(--wep-space-3);
}

/* #1882 — the unconverged update-only target list under its indicator. */
.wep-endpoint-unconverged-list[b-qgscdeusl3] {
    margin: var(--wep-space-1) 0 0;
    padding-left: var(--wep-space-3);
}

.wep-endpoint-actions-row[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

.wep-endpoint-hollow[b-qgscdeusl3] {
    margin: var(--wep-space-2) 0;
}

/* #2221 — the per-user waits: the same section spacing as the SYSTEM-hollow
 * section, and deliberately NOT its copper requires-user-context rule — a wait
 * installed nothing, so it wears the plain muted note, no attention colour. */
.wep-endpoint-user-context-waits[b-qgscdeusl3] {
    margin: var(--wep-space-2) 0;
}

/* ── Tables ────────────────────────────────────────────────────────────── */

/* Plan 2026-09-06-2144 U5: `.wep-endpoint-table-wrap` is GONE. Its whole body
 * was `overflow-x: auto`, which is what WepDataTable's own `.wep-table-wrap`
 * already provides; the four tables now render through the primitive
 * (Framed=false, since this page's wrapper drew no border and the framed wrap
 * would have added one). A rule left behind for markup that no longer exists
 * is the mirror image of the dead classes #1860 chased, and no census catches
 * it — so it is deleted here rather than left to rot.
 *
 * The header rule stays and still applies: `::deep` is not needed because the
 * <th> elements are authored by THIS page (inside ColumnHeaders), so they carry
 * this sheet's scope attribute; only the <table> and <thead> — which the
 * primitive authors — sit above it as unscoped ancestors in the selector. */
.wep-endpoint-table thead th[b-qgscdeusl3] {
    white-space: nowrap;
}

.wep-endpoint-th-actions[b-qgscdeusl3],
.wep-endpoint-actions-cell[b-qgscdeusl3] {
    text-align: right;
}

.wep-endpoint-pkg-name[b-qgscdeusl3] {
    display: block;
}

/* The ONE identity sub-line under a package name. */
.wep-endpoint-pkg-sub[b-qgscdeusl3] {
    display: block;
    font-size: var(--wep-size-text-sm);
}

.wep-endpoint-cell-sub[b-qgscdeusl3] {
    display: block;
    margin-top: var(--wep-space-1);
    font-size: var(--wep-size-text-sm);
}

/* #3925 U13 (R16) — the installer label under an installed version: it names the installer and the sandbox that
   verified it, so it wraps between its words rather than widening the Version column (the kit's cells are nowrap,
   and this table already holds its digest back to fit 1440, #2086). A floor keeps it from folding to one word a
   line. Mirrored in docs/design/prototypes/_endpoint.css for the artboard. */
.wep-endpoint-installer-label[b-qgscdeusl3] {
    white-space: normal;
    min-width: 24ch;
}

/* The static update badge sits on its own line under the installed version
 * (the kit badge is inline-flex with a leading margin for the catalog page). */
.wep-endpoint-update-badge[b-qgscdeusl3] {
    display: flex;
    width: max-content;
    margin: var(--wep-space-1) 0 0;
}

.wep-endpoint-when-cell[b-qgscdeusl3],
.wep-endpoint-digest-cell[b-qgscdeusl3],
.wep-endpoint-status-cell[b-qgscdeusl3] {
    white-space: nowrap;
}

/* Plan 2026-09-10-1011 U5 — the ahead-of-attestation exception on a covered row.
   The status cell above is `white-space: nowrap` so a pill label never breaks
   mid-word, and this block must NOT inherit it: its four lines run to a sentence
   each, and unwrapped they widen the table past the viewport and carry the
   Actions column — the dismiss verb — off the right edge with them (measured on
   the artboard at the authored 1440 before this rule existed). Scoped to the
   block, so the pills beside it keep the nowrap they need. */
.wep-endpoint-ahead[b-qgscdeusl3] {
    display: block;
    max-width: 46ch;
    margin-top: var(--wep-space-1);
    white-space: normal;
}

.wep-provenance-pending[b-qgscdeusl3] {
    display: inline-flex;
}

/* Row actions: kit ghost buttons in the trailing ACTIONS column, laid out in a
 * row (never stacked under the status pill). The un-adopt child renders its
 * own block-level span; as a flex item it lines up with its siblings. */
.wep-endpoint-row-actions[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: center;
    gap: var(--wep-space-1) var(--wep-space-2);
}

.wep-endpoint-row-action[b-qgscdeusl3] {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-1) var(--wep-space-2);
}

/* The "· N more … collapsed ·" line under a table with its show-all toggle —
 * the prototype's footer row, as a block below the table (never a <tr>). */
.wep-endpoint-collapsed[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: var(--wep-space-2);
    padding: var(--wep-space-2) var(--wep-space-3);
    border-bottom: 1px solid var(--wep-color-border-1);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-endpoint-orphan-row[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2);
}

/* ── Per-user card ─────────────────────────────────────────────────────── */

.wep-endpoint-pending-list[b-qgscdeusl3] {
    list-style: none;
    margin: 0;
    padding: 0;
}

.wep-endpoint-pending-row[b-qgscdeusl3] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
    margin: var(--wep-space-1) 0;
}

.wep-endpoint-data-controls[b-qgscdeusl3] {
    font-size: var(--wep-size-text-sm);
}

.wep-endpoint-data-row[b-qgscdeusl3] {
    margin: var(--wep-space-1) 0;
}

.wep-endpoint-export-json[b-qgscdeusl3] {
    max-height: 20rem;
    margin-top: var(--wep-space-2);
    overflow: auto;
    white-space: pre-wrap;
}

/* ── Manage endpoint: the ceremony panels as kit disclosures ───────────── */

/* The kit section label doubles as the disclosure's summary label. */
.wep-endpoint-panel-title[b-qgscdeusl3] {
    margin: 0;
    font: inherit;
    letter-spacing: inherit;
    text-transform: inherit;
    color: inherit;
}

.wep-endpoint-panel-body[b-qgscdeusl3] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
}

/* The primary-user read facts: a nested strip one layer down (sunken bg-2,
 * no shadow, no outer margin) — the pre-#1854 .wep-primary-user rule. */
.wep-endpoint-panel-facts[b-qgscdeusl3] {
    margin: 0;
    background: var(--wep-color-bg-2);
    box-shadow: none;
}

/* The one-sentence-plus-"why" disclosure the long ceremony prose became. */
.wep-endpoint-why[b-qgscdeusl3] {
    font-size: var(--wep-size-text-sm);
}

/* #4561 U3: a fold's summary is a sentence, not caps. This one is a hint
   inside a row ("why this never uninstalls"), so it stays at the label size. */
.wep-endpoint-why-summary[b-qgscdeusl3] {
    cursor: pointer;
    font-size: var(--wep-size-text-xs);
    color: var(--wep-color-fg-3);
}

.wep-endpoint-why-summary:hover[b-qgscdeusl3],
.wep-endpoint-why[open] > .wep-endpoint-why-summary[b-qgscdeusl3] {
    color: var(--wep-color-fg-1);
}

.wep-endpoint-why > .wep-endpoint-note[b-qgscdeusl3] {
    margin-top: var(--wep-space-1);
}

/* The primary-user CHANGE proposal card (Plan 2026-07-08-002 U11). */
.wep-primary-user-change[b-qgscdeusl3] {
    padding: var(--wep-space-2);
    border: 1px solid var(--wep-color-border-2);
    border-radius: var(--wep-radius-sm);
}

.wep-endpoint-change-head[b-qgscdeusl3] {
    display: flex;
    align-items: center;
    gap: var(--wep-space-2);
    margin-bottom: var(--wep-space-1);
}

.wep-endpoint-change-apps[b-qgscdeusl3] {
    margin: 0 0 var(--wep-space-2);
    padding-left: var(--wep-space-3);
    font-size: var(--wep-size-text-sm);
}

/* #1848 — the unassign note zone beside the reassign control: a plain muted
 * note + the outcome notice (the opener itself lives in the page head). */
.wep-fleet-unassign-note[b-qgscdeusl3] {
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-2);
}

/* ── Signed install spans / device security ────────────────────────────── */

.wep-endpoint-span-summary[b-qgscdeusl3] {
    cursor: pointer;
}

.wep-endpoint-span-body[b-qgscdeusl3] {
    margin-top: var(--wep-space-3);
}

.wep-endpoint-danger-zone[b-qgscdeusl3] {
    margin-top: var(--wep-space-3);
}

/* #3689 R26 — the span-key panel in Device security: a stacked block under the token table,
   spaced like the danger zone, its children spaced without a flex container. */
.wep-endpoint-span-key[b-qgscdeusl3] {
    margin-top: var(--wep-space-3);
}

.wep-endpoint-span-key > * + *[b-qgscdeusl3] {
    margin-top: var(--wep-space-2);
}

/* #2517: the "not on the audit trail" notice under an un-adopt's or an un-dismissal's success line
   whose record was lost — a Warn banner in its own spacing wrapper (the PublisherTrustCard /
   UpdateGrantPanel shape), rendered directly with the state it qualifies. A WepBanner carries its
   own frame; the wrapper only spaces it from that line and the content around it. */
.wep-endpoint-banner[b-qgscdeusl3] {
    margin: var(--wep-space-3) 0;
}
/* /Pages/FleetGroupDetail.razor.rz.scp.css */
/* #1848 — /fleet/groups/{id} form rows. The page's markup has always used
 * .wep-form-row for its label + control + button rows, but no sheet ever
 * defined it, so every row stacked as blocks — and the two pickers wore the
 * fleet toolbar's .wep-fleet-select wrapper on top (block wrapper, absolutely
 * positioned chevron at the page's far right, native select ~145px). The
 * pickers now use the kit .wep-select; this sheet defines the row itself,
 * scoped to this page: label, control and button on one line, wrapping on
 * narrow widths. Layout glue only — control chrome stays in _shell.css.
 */



/* Plan 2026-09-06-2144 U4 — three inline style= attributes moved here.
 * Declarations relocated verbatim; this is a relocation, not a redesign.
 *
 * The two checkbox labels ("Allow name-based presence", "Assert present") sat
 * on identical inline styles, which is exactly the duplication a class removes:
 * one rule now, not two copies to drift.
 */

.wep-group-pkg-id[b-4c1lk6dgmq] {
    display: block;
    font-size: var(--wep-size-text-sm);
}

.wep-group-entry-toggle[b-4c1lk6dgmq] {
    display: inline-flex;
    align-items: center;
    gap: 0.4em;
}

/* #2209 (plan 2026-09-10 U4) — the declaration-time no-code advisory. The
 * console's note idiom on this subject, taken verbatim from the SYSTEM-hollow
 * withheld note (SystemHollowWithheldNote.razor.css): text-sm, snug, fg-3,
 * a 60ch measure. It sits in the base-set table's Package cell, and the kit's
 * `td` is nowrap for FACTS — so the prose must be told to wrap, or this
 * opted-out table (no scroll container; see the markup) grows past the column
 * and re-opens the 1440 measurement recorded in the flex-guard census.
 */
.wep-group-base-advisory[b-4c1lk6dgmq] {
    margin: var(--wep-space-1) 0 0;
    max-width: 60ch;
    white-space: normal;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
    color: var(--wep-color-fg-3);
}

/* Beside the add button: .wep-form-row is a wrapping flex line, and a flex
   item's base size is clamped by its OWN max-width — so the 60ch advisory
   given flex-basis: 100% directly resolves to 60ch and sits beside the button
   on the same line (measured on the 2560 capture, 2026-09-10). The wrapper
   carries no measure, so it takes the whole line; the advisory inside it
   keeps the measure. */
.wep-group-base-advisory-precommit[b-4c1lk6dgmq] {
    flex-basis: 100%;
}

.wep-group-base-advisory-precommit > .wep-group-base-advisory[b-4c1lk6dgmq] {
    margin: 0;
}

/* #1960 U16 (R27) — the add-time warning, to the approved drawing (fleet-group-detail.html mirrors these rules under the
 * same names): one sentence with the counts, the endpoints behind a disclosure, and Cancel / Add anyway. A quiet panel on
 * the second background: a warning that advises, never an attention colour. */
.wep-group-base-owner-warning[b-4c1lk6dgmq] {
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    padding: var(--wep-space-3);
    max-width: 78ch;
    background: var(--wep-color-bg-2);
}

.wep-group-base-owner-warning-title[b-4c1lk6dgmq] {
    margin: 0 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-base-owner-warning .wep-disclosure[b-4c1lk6dgmq] {
    margin: 0 0 var(--wep-space-2);
}

.wep-group-base-owner-warning-boxes[b-4c1lk6dgmq] {
    margin: var(--wep-space-1) 0 0;
    padding-left: var(--wep-space-5);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-base-owner-warning-boxes li[b-4c1lk6dgmq] {
    margin: 0 0 2px;
}

.wep-group-base-owner-warning-actions[b-4c1lk6dgmq] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}

/* #2725 — the Assert present OFF confirmation. It sits in the base-set
 * table's Package cell under the package name, the cell that already
 * carries row prose at the 60ch measure (the #2209 advisory above), so the
 * narrow toggle column never widens and the opted-out table keeps its 1440
 * measurement. The kit's `td` is nowrap for FACTS, so the sentence is told
 * to wrap. The copy is the decision itself, so it keeps the cell's own
 * foreground rather than the advisory's fg-3; the buttons are the kit's.
 */
.wep-group-base-assert-off[b-4c1lk6dgmq] {
    margin: var(--wep-space-2) 0 0;
    max-width: 60ch;
    white-space: normal;
}

.wep-group-base-assert-off-copy[b-4c1lk6dgmq] {
    margin: 0 0 var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

.wep-group-base-assert-off-actions[b-4c1lk6dgmq] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
}

/* #1960 U14 (R16) — an item's manager, as text beside its id: quiet metadata in the
 * inventory source chip's idiom (mono, the 12px floor, fg-3 on bg-2, a hairline
 * border), never a state colour. Every row carries one, winget included, so a
 * manager is read, never inferred from a missing tag.
 */
.wep-group-base-manager[b-4c1lk6dgmq] {
    display: inline-flex;
    align-items: center;
    margin-top: var(--wep-space-1);
    padding: 1px 6px;
    border-radius: var(--wep-radius-xs);
    background: var(--wep-color-bg-2);
    border: 1px solid var(--wep-color-border-1);
    color: var(--wep-color-fg-3);
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-xs);
    white-space: nowrap;
}

/* A row with no catalog name shows its id inline, and the tag follows it on the same line. Razor
 * trims the whitespace between the two spans, so without this the tag's border touched the id
 * (1px, seen on the U14 design-fidelity capture). A named row's id is a block, and its tag starts
 * the next line flush with it, so the gap is for the inline id only.
 */
.wep-mono:not(.wep-group-pkg-id) + .wep-group-base-manager[b-4c1lk6dgmq] {
    margin-left: var(--wep-space-2);
}

/* The add row's manager selector is short: three names. */
.wep-group-base-manager-picker[b-4c1lk6dgmq] {
    width: auto;
}

/* #1960 U14 (R30) — the Managers section's own rules (.wep-group-managers and the U17 consent column) live with the
 * section, in Components/Fleet/GroupManagersSection.razor.css (#1960 U17 PR 10b). */
/* /Pages/FleetHolds.razor.rz.scp.css */
/* #1854 (console polish batch 3, part H) — /fleet/holds onto the kit. Layout
 * glue only: every value below is a kit token or mirrors an existing kit rule
 * (KTD5 — apply the shell + the kit, no new design). No edits to
 * docs/design/prototypes/_shell.css or docs/design/tokens.css.
 *
 * - .wep-holds-card        rides the kit .wep-card (bg-1 / border-1 / radius-sm
 *                          / space-5) and adds only the page's section rhythm.
 * - .wep-holds-card-head   is the endpoint-detail prototype's .ep-section-head:
 *                          title · neutral count (.wep-subtab-count) · mono
 *                          meta on one baseline.
 * - .wep-holds-note        is the console's 60ch prose measure (.wep-empty-lead)
 *                          at text-sm — the ONE class every explanatory line and
 *                          every demoted all-clear note wears (it replaces the
 *                          inline `margin;font-size;max-width:60ch` runs).
 * - .wep-holds-cluster-row.is-pending is the kit .wep-row-dim ramp (0.55) —
 *                          the fully-pending mute as a modifier class.
 * - .wep-chip.is-queued    mirrors the kit's disabled treatment (the values are
 *                          .wep-btn:disabled's, _shell.css:457-462 — .wep-chip
 *                          has no :disabled rule of its own) on a chip that
 *                          cannot be :disabled itself (a label / span carrying
 *                          a native checkbox) — no third chip.
 */

.wep-holds-card[b-cr3fdg5f06] {
    margin: var(--wep-space-4) 0 0;
}

/* Card head: the kit section label, the count pill and the mono meta share one
   baseline (the prototype's .ep-section-head). The label's own bottom margin
   moves to the row so the three align — the #1850 brokers-head idiom. */
.wep-holds-card-head[b-cr3fdg5f06] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-3);
    margin-bottom: var(--wep-space-3);
}

.wep-holds-card-head .wep-section-title[b-cr3fdg5f06] {
    margin-bottom: 0;
}

.wep-holds-card-meta[b-cr3fdg5f06] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

/* The one explanatory-note class: text-sm at the console's 60ch measure. */
.wep-holds-note[b-cr3fdg5f06] {
    margin: var(--wep-space-2) 0;
    max-width: 60ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

/* The kit disclosure sits tighter under a one-line note than under a card. */
.wep-holds-note .wep-holds-why[b-cr3fdg5f06] {
    margin-top: var(--wep-space-2);
}

/* Tables inside a card: the card is the frame, so no .wep-table-wrap. The
   report's DETAIL cell carries a human sentence and may wrap (the kit's td
   nowrap is for facts, not prose). */
.wep-holds-table[b-cr3fdg5f06] {
    margin-top: var(--wep-space-2);
}

.wep-holds-table .wep-holds-cell-prose[b-cr3fdg5f06] {
    white-space: normal;
}

/* ---- hollow-debt proposal cards (inside the hollow card) ---- */

.wep-holds-cluster-list[b-cr3fdg5f06] {
    list-style: none;
    margin: 0;
    padding: 0;
}

.wep-holds-cluster-row[b-cr3fdg5f06] {
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    padding: var(--wep-space-3);
    margin: 0 0 var(--wep-space-3);
}

.wep-holds-cluster-row:last-child[b-cr3fdg5f06] {
    margin-bottom: 0;
}

/* R14/AE8 — fully pending: muted, the kit .wep-row-dim ramp. */
.wep-holds-cluster-row.is-pending[b-cr3fdg5f06] {
    opacity: 0.55;
}

.wep-holds-cluster-head[b-cr3fdg5f06] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2);
}

.wep-holds-proposal[b-cr3fdg5f06] {
    margin: var(--wep-space-2) 0;
}

/* The endpoint picker: the kit .wep-chip-row / .wep-chip; a queued endpoint's
   chip carries the kit chip's disabled treatment (opacity .5, not-allowed). */
.wep-holds-endpoints[b-cr3fdg5f06] {
    margin: var(--wep-space-2) 0;
}

.wep-holds-endpoints .wep-chip.is-queued[b-cr3fdg5f06] {
    opacity: 0.5;
    cursor: not-allowed;
}

/* #2166 R8 — the INERT chip: an unhealable cluster's endpoints stay listed for
 * triage but nothing in the row is selectable, so the chip carries no checkbox
 * at all. It is NOT the queued treatment: that one dims a chip whose work is in
 * flight, and dimming the one debt the badge counts as needing attention would
 * bury it. The chip keeps full contrast and loses only the pointer affordance —
 * the endpoint link inside it is the one thing that IS interactive. */
.wep-holds-endpoints .wep-chip.is-inert[b-cr3fdg5f06] {
    cursor: default;
}

.wep-holds-endpoints .wep-chip.is-inert .wep-link[b-cr3fdg5f06] {
    cursor: pointer;
}

/* The armed typed-confirm block keeps its 36rem measure (moved from inline). */
.wep-holds-confirm[b-cr3fdg5f06] {
    margin-top: var(--wep-space-2);
    max-width: 36rem;
}

/* The kit action-row rhythm (flex + gap-2) for the confirm / cancel pair and
   the report's dismiss. */
.wep-holds-actions[b-cr3fdg5f06] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
    margin-top: var(--wep-space-3);
}

/* #2517: the "not on the audit trail" notice under an un-adopt leg whose record was lost — a Warn
   banner in its own spacing wrapper (the PublisherTrustCard / UpdateGrantPanel shape), in a
   full-width row directly under the leg it qualifies. The wrapper only spaces it from that leg. */
.wep-holds-banner[b-cr3fdg5f06] {
    margin: var(--wep-space-2) 0;
}
/* /Pages/FleetIndex.razor.rz.scp.css */
/* #1848 — the /fleet safety strip: ONE compact row for the two read-only
 * safety facts (rollout firing, emergency stop) that used to render as two
 * full-width prose lines directly under the tab strip. Short label + kit
 * status pill (WepStatusPill — its own scoped sheet) per item; the sentences
 * ride title= tooltips and the .wep-fleet-safety-note attention line when a
 * fact is not nominal. This file holds only the row glue — no new colour,
 * type or pill language (everything is a kit token or an existing class).
 */

.wep-fleet-safety-strip[b-8t5na7p30k] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--wep-space-2) var(--wep-space-6);
    margin: var(--wep-space-3) 0 var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-fleet-safety-item[b-8t5na7p30k] {
    display: inline-flex;
    align-items: center;
    gap: var(--wep-space-2);
}

.wep-fleet-safety-sep[b-8t5na7p30k] {
    color: var(--wep-color-fg-4);
}

/* Trailing ceremony link — its own element after the pill, one size down so
   the strip stays a readout, not a call to action. */
.wep-fleet-safety-link[b-8t5na7p30k] {
    margin-left: var(--wep-space-2);
    font-size: var(--wep-size-text-xs);
}

/* The single muted attention line (firing unavailable / stop tripped or
   possibly tripped). Colour comes from the global .wep-fg-3 utility. */
.wep-fleet-safety-note[b-8t5na7p30k] {
    margin: 0 0 var(--wep-space-4);
    max-width: 90ch;
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-snug);
}

/* #3485 U9 — the Export inventory dialog's purpose field fills the dialog's body. The kit's .wep-textarea is 480px,
 * the WepModal Medium's whole width, so inside the body's padding it overflowed and the body scrolled sideways
 * (seen on the live capture before merge). */
.wep-fleet-export-purpose[b-8t5na7p30k] {
    width: 100%;
}
/* /Pages/FleetReconciliation.razor.rz.scp.css */
/* #1852 — the all-thin calm state on the per-ring beacon cards (application of
 * the existing system only; every value is a kit token).
 *
 * On a fleet under the firing loop's 25-sample floor EVERY ring is thin, and
 * permanently so — the amber detonating ramp (.wep-recon-ring-card.is-thin in
 * _shell.css) then shouts about the normal state three times over. When the
 * page marks the card group is-all-thin, the cards fall back to the neutral
 * card chrome and the thin / no-data badge to the muted meta colour. The
 * figures and the badge text stay (an operator still sees which ring has no
 * beacon at all); the ONE note above the group carries the reason.
 *
 * A thin ring beside a well-sampled one is NOT marked all-thin and keeps the
 * amber ramp untouched — that IS a signal. The cards are rendered from the
 * @code block (no scope attribute), hence ::deep from the marked-up group. */

.wep-recon-ring-cards.is-all-thin[b-hd1g7tj3wy]  .wep-recon-ring-card.is-thin {
    border-left: 1px solid var(--wep-color-border-1);
    background: transparent;
}

.wep-recon-ring-cards.is-all-thin[b-hd1g7tj3wy]  .wep-recon-ring-thin-badge {
    color: var(--wep-color-fg-3);
    border-color: var(--wep-color-border-1);
}

/* #3392 — a summary card for a signal the platform does not capture (crash
 * delta, AV blocks, apply rate). It says "not measured" in words, at body size
 * in the muted meta colour, instead of the 28px mono figure a measured card
 * draws: no number, no unit, no trend. Neutral chrome — nothing is wrong, so
 * no attention ramp. Every value is a kit token. The cards are rendered from
 * the @code block (no scope attribute), hence ::deep from the marked-up group. */

.wep-recon-cards[b-hd1g7tj3wy]  .wep-recon-card-value.is-unmeasured {
    font-family: inherit;
    font-size: var(--wep-size-text-md);
    font-weight: var(--wep-weight-regular);
    line-height: 1.4;
    color: var(--wep-color-fg-3);
}

.wep-recon-cards[b-hd1g7tj3wy]  .wep-recon-card-note {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-3);
}
/* /Pages/Home.razor.rz.scp.css */
/*
    Plan 2026-05-05-006 Unit 2: surface-index card grid styles. Mirrors
    the geometry in docs/design/prototypes/_admin-index.html using
    docs/design/tokens.css custom properties. No hex literals; no px
    constants beyond layout sizing the prototype already settled.

    Scoped CSS attribute (`b-...`) is auto-generated by the Blazor
    build — these rules apply only inside Pages/Home.razor.
*/

.wep-home-onboarding[b-9vb08ah7rl] {
    margin: var(--wep-space-8) 0 0;
    padding: var(--wep-space-4) var(--wep-space-5);
    border: 1px solid var(--wep-color-accent-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-accent-bg);
}

.wep-home-onboarding-title[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-sm);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
    margin-bottom: var(--wep-space-1);
}

.wep-home-onboarding-body[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    line-height: var(--wep-line-relaxed);
}

.wep-home-onboarding-body a[b-9vb08ah7rl] {
    color: var(--wep-color-link);
    font-family: var(--wep-font-mono);
    text-decoration: none;
}

.wep-home-onboarding-body a:hover[b-9vb08ah7rl] {
    text-decoration: underline;
}

/* #3115 (Plan 2026-06-25-002 U4): the READY state of the detonation-readiness
   milestone on the first-run Home. The engine draws a complete milestone as nothing,
   so this line borrows its completed-step vocabulary from WepGuidedMilestone's
   "What's already true" panel: a neutral bordered box (border-1 on bg-1, never the
   accent tint the not-ready panel wears), a check in the clean rule colour, fg-2
   copy. Flex with a gap, so the spacing never depends on Razor's whitespace. */
.wep-home-readiness-ready[b-9vb08ah7rl] {
    margin: var(--wep-space-8) 0 0;
    padding: var(--wep-space-3) var(--wep-space-4);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    background: var(--wep-color-bg-1);
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: var(--wep-space-2);
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-home-readiness-check[b-9vb08ah7rl] {
    color: var(--wep-state-clean-rule);
    font-weight: var(--wep-weight-semi);
}

.wep-home-readiness-title[b-9vb08ah7rl] {
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}

.wep-home-readiness-body[b-9vb08ah7rl] {
    flex-basis: 100%;
}

/* Plan 2026-06-25-007 U3: the ranked decisions queue list (flag on). The rows are
   the DecisionRow component (its own scoped CSS); this only lays out the stack. */
.wep-decisions[b-9vb08ah7rl] {
    list-style: none;
    margin: var(--wep-space-8) 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
}

/* #3122 — the copy-briefing bar above the queue (or the calm state): the button
   right-aligned with its inline outcome line beside it (no toast, R10). The bar wraps
   so the failure sentence never pushes the button past .wep-main; the queue that
   follows it tucks up under the bar instead of taking its own space-8 top margin. */
.wep-home-briefing[b-9vb08ah7rl] {
    margin: var(--wep-space-8) 0 0;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-3);
}

.wep-home-briefing + .wep-decisions[b-9vb08ah7rl] {
    margin-top: var(--wep-space-3);
}

.wep-home-briefing-bar[b-9vb08ah7rl] {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex-wrap: wrap;
    gap: var(--wep-space-3);
}

.wep-home-briefing-copied[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
}

.wep-home-briefing-error[b-9vb08ah7rl] {
    min-width: 0;
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-danger-text);
    overflow-wrap: anywhere;
}

/* A refused clipboard write lays the briefing out for a manual copy: the plain text
   exactly as it would have been copied (pre-wrap keeps its line breaks, `anywhere`
   breaks a long package id inside the box), and one click selects all of it. */
.wep-home-briefing-text[b-9vb08ah7rl] {
    margin: 0;
    padding: var(--wep-space-3) var(--wep-space-4);
    font-size: var(--wep-size-text-sm);
    line-height: var(--wep-line-relaxed);
    color: var(--wep-color-fg-1);
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    white-space: pre-wrap;
    overflow-wrap: anywhere;
    user-select: all;
}

.wep-home-section[b-9vb08ah7rl] {
    margin: var(--wep-space-12) 0 0;
}

.wep-home-section:first-of-type[b-9vb08ah7rl] {
    margin-top: var(--wep-space-8);
}

.wep-home-section-label[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-2xs);
    letter-spacing: var(--wep-tracking-wide);
    text-transform: uppercase;
    color: var(--wep-color-fg-3);
    font-weight: var(--wep-weight-medium);
    margin: 0 0 var(--wep-space-3);
}

/* Plan 2026-07-28-001 U6 (R8): minmax(0, 1fr), never bare 1fr. A bare `1fr`
   track is minmax(auto, 1fr) — its minimum is the widest card's min-content —
   so one long unbreakable token (mono route, long section name) forces the
   whole grid wider than the .wep-main region and Home clips horizontally at
   the supported 1440×900 viewport. minmax(0, 1fr) hard-caps the grid at its
   container; the card-level min-width/overflow-wrap rules below make the
   content wrap inside the capped track. (Same trap + fix as _shell.css's
   .wep-fleet-metrics.) */
.wep-home-grid[b-9vb08ah7rl] {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--wep-space-4);
}

@media (min-width: 1200px) {
    .wep-home-grid[b-9vb08ah7rl] {
        /* Three columns on wide displays so the 5-card workspace row
           reads as a balanced 3+2 layout rather than 2+2+1. */
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

.wep-home-card[b-9vb08ah7rl] {
    /* U6 (R8): a grid item's default min-width:auto floors its used width at
       min-content even when its track is narrower — the card box itself would
       overflow the grid area. 0 lets the card shrink to the capped track. */
    min-width: 0;
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
    padding: var(--wep-space-5);
    text-decoration: none;
    color: inherit;
    display: flex;
    flex-direction: column;
    gap: var(--wep-space-2);
    transition: border-color var(--wep-motion-fast) var(--wep-ease-standard),
                background var(--wep-motion-fast) var(--wep-ease-standard);
}

/* U6 (R8): emergency break for the card's unbreakable tokens (mono routes,
   long names) — wrap inside the width-capped track instead of painting past
   the card into .wep-main's scroll area. `anywhere` (not break-word) also
   zeroes the min-content contribution, so track sizing and painting agree. */
.wep-home-card-name[b-9vb08ah7rl],
.wep-home-card-route[b-9vb08ah7rl],
.wep-home-card-desc[b-9vb08ah7rl] {
    overflow-wrap: anywhere;
}

.wep-home-card:hover[b-9vb08ah7rl] {
    border-color: var(--wep-color-border-2);
    background: var(--wep-color-bg-2);
}

.wep-home-card:focus-visible[b-9vb08ah7rl] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

.wep-home-card-head[b-9vb08ah7rl] {
    display: flex;
    align-items: baseline;
    gap: var(--wep-space-3);
    justify-content: space-between;
}

.wep-home-card-name[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    letter-spacing: var(--wep-tracking-tight);
}

.wep-home-card-hotkey[b-9vb08ah7rl] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
    letter-spacing: var(--wep-tracking-normal);
}

.wep-home-card-route[b-9vb08ah7rl] {
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}

.wep-home-card-desc[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-sm);
    color: var(--wep-color-fg-2);
    line-height: var(--wep-line-relaxed);
}

/* #1852 — the at-a-glance strip. Five kit stat tiles (the shell's
   .wep-fleet-mcard / .wep-fleet-bignum pattern, reused verbatim) laid out as ONE
   row. The grid rule follows the U6 (R8) width contract above: minmax(0, 1fr)
   tracks (never bare 1fr, never px), tiles with min-width: 0 so they shrink into
   the capped track, and overflow-wrap on the caption so a long version list
   wraps inside the tile instead of painting past .wep-main.
   #2488: a sixth tile (Decisions) renders when the decisions home is on, so the
   row is one implicit column per tile — five or six, equal widths, never a
   wrapped orphan — rather than a fixed repeat(5). Below 1080px it wraps to the
   same 3 / 2-column grid as before (two full rows of three with six tiles). */
.wep-home-glance[b-9vb08ah7rl] {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: minmax(0, 1fr);
    gap: var(--wep-space-4);
    margin: var(--wep-space-8) 0 0;
}

@media (max-width: 1080px) {
    .wep-home-glance[b-9vb08ah7rl] {
        grid-auto-flow: row;
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (max-width: 620px) {
    .wep-home-glance[b-9vb08ah7rl] {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

.wep-home-glance-tile[b-9vb08ah7rl] {
    min-width: 0;
    /* The fleet metric card floors at a chart-card height (148px); a glance
       tile is a label + a figure and takes only what it needs. */
    min-height: 0;
    text-decoration: none;
    color: inherit;
    transition: border-color var(--wep-motion-fast) var(--wep-ease-standard),
                background var(--wep-motion-fast) var(--wep-ease-standard);
}

.wep-home-glance-tile:hover[b-9vb08ah7rl] {
    border-color: var(--wep-color-border-2);
    background: var(--wep-color-bg-2);
}

.wep-home-glance-tile:focus-visible[b-9vb08ah7rl] {
    outline: 2px solid transparent;
    box-shadow: var(--wep-focus-ring);
}

/* A count is a headline, not a verdict: the neutral ink, not the fleet
   card's green "all clear" ramp (that ramp means "0 failures" there). */
.wep-home-glance-tile .wep-fleet-bnum[b-9vb08ah7rl] {
    color: var(--wep-color-fg-1);
}

.wep-home-glance-tile.is-unavailable .wep-fleet-bnum[b-9vb08ah7rl] {
    color: var(--wep-color-fg-4);
}

/* #3742 — every figure in the strip sits at one height. The caption used to sit
   beside its figure when it fitted and under it when it did not, so the figures
   stood at two heights, and at three once 14 px type wrapped "no hold needs
   attention" onto a second line. The caption now always sits under its figure,
   and the figure follows the label instead of the tile's foot, so a caption that
   wraps adds a line below its figure and moves no figure. */
.wep-home-glance-tile .wep-fleet-bigval[b-9vb08ah7rl] {
    flex-direction: column;
    align-items: flex-start;
    margin-top: 0;
}

/* The caption labels its figure ("no updates available", "unread · 142 total"),
   it is not prose: ADR 2026-10-12-001 sets labels at the 12 px floor. */
.wep-home-glance-tile .wep-fleet-bcap[b-9vb08ah7rl] {
    font-size: var(--wep-size-text-xs);
    overflow-wrap: anywhere;
}

.wep-home-kbd[b-9vb08ah7rl] {
    display: inline-flex;
    align-items: center;
    padding: 1px 6px;
    font-family: var(--wep-font-mono);
    font-size: var(--wep-size-text-2xs);
    font-weight: var(--wep-weight-medium);
    color: var(--wep-color-fg-2);
    background: var(--wep-color-bg-2);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-xs);
}
/* /Pages/Inventory.razor.rz.scp.css */
/* #4213 U16 — the heading of the Managed table on /inventory's default view, under the Needs-you block. The
 * section-heading step of the type scale (ADR 2026-10-12-001), as the Needs-you block's own heading. */
.wep-inventory-section-title[b-wrk72quwuu] {
    margin: var(--wep-space-6) 0 var(--wep-space-2);
    font-size: var(--wep-size-text-lg);
    font-weight: var(--wep-weight-semi);
    color: var(--wep-color-fg-1);
}
/* /Pages/NotificationsInbox.razor.rz.scp.css */
/*
    NotificationsInbox scoped styles (review batch A). Tokens only —
    [data-theme]/--wep-*, no hardcoded colors (design.md §5). The shared inbox
    list styles stay in _shell.css; only the two review-added elements are
    scoped here, mirroring DecisionRow.razor.css's defer-error idiom.
*/

/* Inline (non-toast) ack-write-failure alert — rows stay, circuit lives. */
.wep-inbox-ack-error[b-3sb2tquryu] {
    font-size: var(--wep-size-text-sm);
    /* #1759 — an ack write FAILURE must not render in the same indigo as a
       selected row. Was var(--wep-color-danger-1, ...), a fallback to a token
       defined nowhere, so it had always rendered the accent. */
    color: var(--wep-color-danger-text);
}

/* Honest saturation marker: renders only when the read returns exactly the
   page's generous limit — the list below is the newest slice, not everything. */
.wep-inbox-truncated[b-3sb2tquryu] {
    font-size: var(--wep-size-text-2xs);
    color: var(--wep-color-fg-3);
}
/* /Pages/PolicyCedarAuthoring.razor.rz.scp.css */
/* PolicyCedarAuthoring.razor.css — #1860 (console polish batch 4, part K).
 * Layout glue only: every value is a kit token, and every chrome class
 * (.wep-card, .wep-disclosure, .wep-section-title, .wep-subtab-count,
 * .wep-section-intro, .wep-field-error) stays in _shell.css. Scoped, so nothing
 * here reaches another page. The three-column grid itself (.wep-cedar-grid and
 * its .wep-cedar-* children) is already the kit's — untouched.
 */

/* The columns are kit cards now, so the sidebar's label no longer sits flush
   against the shell edge. `min-height: 0` keeps a card from stretching its
   siblings; the grid stays the one in _shell.css. */
.wep-policy-card[b-x8ti0xmb6j] {
    min-height: 0;
}

/* Title and count on one baseline — the #1850 brokers-head / #1854 holds-head
   idiom. The title's own bottom margin moves to the row so the two align. */
.wep-policy-card-head[b-x8ti0xmb6j] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2);
    margin-bottom: var(--wep-space-2);
}

.wep-policy-card-head .wep-section-title[b-x8ti0xmb6j] {
    margin-bottom: 0;
}

/* The "Why read-only" disclosure sits under the lead at the same measure. */
.wep-policy-why[b-x8ti0xmb6j] {
    max-width: 60ch;
    margin: 0 0 var(--wep-space-3);
}

/* The gate-preview toggle gets its own row with a rule under it, so it reads as
   a control on the simulator rather than a stray line above it. */
.wep-policy-toggle-row[b-x8ti0xmb6j] {
    padding: 0 0 var(--wep-space-3);
    margin: 0 0 var(--wep-space-3);
    border-bottom: 1px solid var(--wep-color-border-1);
}
/* /Pages/PolicyCedarMerge.razor.rz.scp.css */
/* PolicyCedarMerge.razor.css — #1860 (console polish batch 4, part K).
 * The page's single inline style, as a scoped class. Kit token, no new chrome.
 */

.wep-merge-output-title[b-6411o9efbm] {
    margin-top: var(--wep-space-6);
}
/* /Pages/PolicyDenyList.razor.rz.scp.css */
/* PolicyDenyList.razor.css — #1860 (console polish batch 4, part K).
 * Layout glue only: every value is a kit token, and every chrome class
 * (.wep-card, .wep-table, .wep-disclosure, .wep-section-title,
 * .wep-subtab-count, .wep-section-intro) stays in _shell.css. Scoped, so
 * nothing here reaches another page.
 */

.wep-policy-card[b-okijsd5vxx] {
    margin: var(--wep-space-4) 0 0;
}

/* Title and count share one baseline — the #1850 brokers-head / #1854 holds-head
   idiom. The title's own bottom margin moves to the row so the two align. */
.wep-policy-card-head[b-okijsd5vxx] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--wep-space-2);
    margin-bottom: var(--wep-space-2);
}

.wep-policy-card-head .wep-section-title[b-okijsd5vxx] {
    margin-bottom: 0;
}

/* The "Why read-only" disclosure sits under the lead at the same measure. */
.wep-policy-why[b-okijsd5vxx] {
    max-width: 60ch;
    margin: 0 0 var(--wep-space-3);
}
/* /Pages/PolicyGrants.razor.rz.scp.css */
/* PolicyGrants.razor.css — layout glue only: every value is a kit token, and every
 * chrome class (.wep-banner, .wep-table, .wep-section-intro) stays in the kit.
 * Scoped, so nothing here reaches another page.
 */

/* #2469: the "Not on the audit trail" banner between the lead and the table. A
   WepBanner already carries its own frame — the wrapper only spaces it, as
   CommunityUsers' .wep-users-banner does. The lead above keeps its own bottom margin,
   so the wrapper adds only the gap to the table below. */
.wep-grants-banner[b-lv681i5rwr] {
    margin: 0 0 var(--wep-space-3);
}

/* #2469: a refused toggle's result in the Actions cell — the pill's short label and the
   wrapping .wep-form-hint sentence (#2464's shape) — spaced off the button below it. */
.wep-grants-row-result[b-lv681i5rwr] {
    margin: 0 0 var(--wep-space-2);
}
/* /Pages/PolicyIndex.razor.rz.scp.css */
/*
    The Policy hub — #2480 (plan 2026-10-07-1806 U16; KTD24; #3966). The hub is drawn in kit classes
    (.wep-section-list, .wep-section-links, .wep-section-link); this sheet holds only what the kit cannot say.

    The update grant's tile carries the coverage line, whose two numbers are each a link to its list on
    /policy/update-grant. The tile itself is one anchor (.wep-section-link) and an anchor cannot hold another,
    so the line sits BESIDE the tile's link, in the same list item. To keep it on the tile rather than under
    it, the list item wears the tile's frame — the kit card's border, radius and fill — and the anchor inside
    gives up its own, keeping its padding, its hover fill and its focus ring; the line takes the card's side
    padding and the kit's line gap, so the tile reads exactly as one card with one more meta line. The other
    tiles are untouched. All colour and spacing via --wep-* tokens.
*/

.wep-policy-hub-tile[b-u80msw39qz] {
    display: flex;
    flex-direction: column;
    background: var(--wep-color-bg-1);
    border: 1px solid var(--wep-color-border-1);
    border-radius: var(--wep-radius-sm);
}

.wep-policy-hub-tile > .wep-section-link[b-u80msw39qz] {
    border: 0;
    border-radius: inherit;
    background: transparent;
}

.wep-policy-hub-tile > .wep-section-link:hover[b-u80msw39qz] {
    background: var(--wep-color-bg-2);
}

/* The anchor keeps the card's top padding; the line below closes the card with its bottom padding. */
.wep-policy-hub-tile > .wep-section-link:not(:last-child)[b-u80msw39qz] {
    padding-bottom: var(--wep-space-1);
}

.wep-policy-hub-coverage[b-u80msw39qz] {
    margin: 0;
    padding: 0 var(--wep-space-4) var(--wep-space-3);
}
/* /Pages/PolicyUpdateGrant.razor.rz.scp.css */
/* PolicyUpdateGrant.razor.css — Plan 2026-09-04-0815 U6 (R10; KTD10).
 *
 * ONE measure for the page.
 *
 * The shared `.wep-section-intro` / `.wep-section-lead` rule in
 * `docs/design/prototypes/_shell.css` wraps every console lead at 60ch — a book
 * measure, and the right one for the leads that sit over prose. This page is not
 * that page: `.wep-main` puts no cap on anything, so the panel below the lead is
 * five full-bleed tables (the covered set, the arm preview, the backlog, the
 * resting versions, the carve-outs) plus the readiness ladder. The lead therefore
 * wrapped at roughly half the width of the first thing it introduces, and the page
 * read as two stacked columns of different widths rather than one surface.
 *
 * KTD10: this is a page-local override, NOT a change to the shared rule. 60ch is
 * still correct for every lead that does not stand over a full-width table, and
 * that is most of the console — a shared-rule change to fix one page would re-measure
 * roughly forty others that are not broken.
 *
 * Scoped, so it reaches only the elements this page itself renders (the lead is the
 * page's own <p>; everything the <UpdateGrantPanel/> child renders keeps the kit's
 * treatment untouched). The value is `ch` for the same reason the shared rule uses
 * it: the measure follows the text, not the viewport.
 *
 * 96ch is the widest measure that still reads as prose — past roughly a hundred
 * characters the eye loses the line on the return sweep, which is why the shared rule
 * exists at all. So this does NOT align the lead with the tables, and is not trying to:
 * measured on the isolated smoke stack at a 1440px viewport, the lead goes from 420px
 * to 673px against a 1220px widest table — from about a third of the table's width to
 * about half. The tables stay wider because they are data, not prose; matching them
 * exactly would mean a ~174ch lead, which would be unreadable. What this buys is that
 * the lead no longer reads as a narrow column stacked on a full-bleed one — the two
 * share a rhythm (R10), not an edge.
 */
.wep-section-intro[b-dlydojvs0y] {
    max-width: 96ch;
}
