/* SOL-955 — THE CANVAS IS PAINTED BY THE THEME. Decision recorded here because it was a choice, not a tidy-up:
   the two decorative radial-gradient washes and the green-tinted off-white beneath them are GONE, and nothing
   replaces them. Four reasons, in the order they decided it:

     1. They were the retired control-plane palette wearing a different notation. SOL-951 removed that skin's
        HEXES; these two washes were rgba() triples of two OTHER members of the same retired ramp, which is
        precisely why PlaneTellStylesheetTests — a hex scan — could not see them. (Deliberately not named here:
        this file's rule is that a value written in a comment is indistinguishable from a live one to a grep.
        The retired ramp is recorded once, in ADR-PlatformAdmin-Design-System-Alignment.md, Amendment 1.)
     2. Decorative saturated colour is the one thing ui-design-system.md rule 4 forbids outright — colour is
        reserved for status and risk. A brand wash behind an operations console spends the budget on flourish.
     3. The literal beneath them was a SECOND canvas colour, a green-tinted neutral disagreeing with the
        theme's own Background token. Two sources of truth for one surface; the theme wins.
     4. It was hardcoded LIGHT. A fixed wash cannot follow a palette switch, so it is exactly what would have
        to be unpicked again for dark mode (SOL-956). Expressing the gradient in theme variables was the other
        option on the table and was rejected: it would keep a decorative layer alive — and a dark-mode-correct
        gradient needs its own dark stops, i.e. new decorative tokens nobody wants to own.

   Why a background-color rule survives at all, given MudBlazor's own stylesheet already sets
   body { background-color: var(--mud-palette-background) }: it sets BODY, not HTML. Without this, the canvas
   outside the body box — the overscroll/rubber-band area — falls back to white and flashes against the
   theme's off-white on every scroll bounce. One token, applied to both elements, and dark mode moves it.

   font-family is the same story in the type axis: the stack that was here was a THIRD Segoe variant, narrower
   than the theme's and missing its Variable Text head. It now reads the theme token, with the ClearVue stack
   as the literal fallback for the pre-hydration frame before MudThemeProvider has emitted its variables (same
   token-with-fallback shape as .cv-fileimport-verbatim in TDAP). */
html, body {
    margin: 0;
    font-family: var(--mud-typography-default-family, "Segoe UI Variable Text", "Segoe UI", system-ui, -apple-system, sans-serif);
    background-color: var(--mud-palette-background);
}

/* SOL-962 — THE INTERIM SIGN-IN FORM'S FIELDS, IN CLASSES WE OWN.

   ⚠️ Inserted HERE rather than appended at the end of the file, deliberately: SOL-957 is appending its
   layout-chrome rules at EOF on a parallel branch, and two branches both adding at EOF is a merge conflict
   that carries no information about either change.

   WHAT THIS REPLACES. Login.razor's Interim branch dressed two raw <input> elements in MudBlazor's OWN class
   names — .mud-input-slot on the input, .mud-input-label on the label — plus an inline
   width/padding/margin-top triple. Those are library internals: MudBlazor publishes no compatibility
   guarantee for them, they are emitted by MudTextField's internal render tree rather than by a documented
   utility API, and a patch release may rename or restructure them. The failure mode is cosmetic-silent —
   build green, no test red, the form simply renders unstyled — and nothing in this repo renders a page.
   PlatformAdmin is on MudBlazor 9.1.0 with 9.3.0 available, so the bump is a live prospect, not a thought
   experiment.

   ⚠️ AND THEY WERE NEVER BUYING THE STYLING THEY LOOK LIKE THEY BUY. Read off the installed 9.1.0
   MudBlazor.min.css, the BARE selectors are: .mud-input-slot { height: auto; min-height: 19px;
   overflow: hidden; white-space: nowrap; text-overflow: ellipsis } and .mud-input-label { display: block;
   transform-origin; ellipsis }. No border, no background, no colour, no font, no padding in either. Every
   rule that actually paints a Mud input is compounded with .mud-input-root-outlined /
   .mud-input-label-inputcontrol, which a hand-written <input> never carries. So the form's whole appearance
   came from the inline 8px padding plus the browser's default input chrome; the borrowed classes carried the
   compatibility risk and returned nothing. Replacing them is a small visual improvement, not just a rename.

   WHY A RAW <input> AT ALL, AND WHY NOT MudTextField. Login is [ExcludeFromInteractiveRouting] — static SSR
   — because a cookie can only be issued inside the request pipeline, so the Interim branch posts a plain form
   to /platform-auth/login and the server binds [FromForm] username/password/returnUrl. MudTextField needs an
   interactive circuit to be worth anything and would defeat that post. The constraint is correct; borrowing
   the library's internals to dress it was not.

   FLUENT, FROM TOKENS ONLY. A hairline border rather than a Material underline or a shadow, the theme's own
   radius, dense padding, Surface fill, the theme type scale. Every value is a variable MudThemeProvider
   emits (verified against the installed 9.1.0 assembly: it writes --mud-palette-lines-inputs,
   --mud-default-borderradius, --mud-typography-caption-size and --mud-typography-body2-size, and all four
   survive into 9.3.0), so the fields follow a palette change including dark mode (SOL-956).
   --mud-palette-lines-inputs is ClearVue-owned rather than a stock Material default —
   ClearVueDesignTokens.LightLinesInputs / DarkLinesInputs, commented "input outlines, more visible" — which
   is precisely the SOL-978 BackgroundGray check applied before the fact.

   The type sizes carry literal fallbacks, matching the token-with-fallback shape `html, body` uses above for
   the font stack, and for the same reason: static SSR paints this page before MudThemeProvider has emitted
   its variables, and a login field with no font-size for that frame is a visible jump. This is NOT the
   duplicated-literal case .mud-main-content argues against below — these fall back to plain CSS defaults,
   not to a copy of a ClearVue-owned token.

   Guarded by StyleClassOwnershipTests: it refuses any mud-* class in our markup that is not on a named
   permitted set, refuses inline box-model declarations, and asserts these three classes still exist here —
   because renaming a class in the .razor and leaving the rule behind is the same cosmetic-silent failure in
   the other direction. */

/* One labelled field. The inter-field rhythm lives here rather than on a spacing utility so the form's
   vertical spacing is one decision in one place. */
.pa-form-field {
    margin-bottom: 1rem;
}

.pa-form-label {
    display: block;
    margin-bottom: 0.25rem;
    font-size: var(--mud-typography-caption-size, 0.75rem);
    font-weight: 600;
    letter-spacing: 0.01em;
    color: var(--mud-palette-text-secondary);
}

.pa-form-input {
    /* border-box or the 100% width EXCLUDES the padding and border and the field overflows its column. */
    box-sizing: border-box;
    width: 100%;
    padding: 0.375rem 0.5rem;
    border: 1px solid var(--mud-palette-lines-inputs);
    border-radius: var(--mud-default-borderradius);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    /* An <input> does NOT inherit the page font — without this it renders in the UA's own default while
       every other word on the card is the theme stack. */
    font-family: inherit;
    font-size: var(--mud-typography-body2-size, 0.875rem);
    line-height: 1.5;
}

/* Focus is :focus-visible with a REAL outline, never `outline: none` plus a border-colour swap. This form is
   the one surface an operator reaches with no session, so it is also the one most likely to be driven from
   the keyboard, and a suppressed focus ring is the most common way a sign-in page fails WCAG 2.4.7. */
.pa-form-input:focus-visible {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 1px;
    border-color: var(--mud-palette-primary);
}

.brand-mark {
    letter-spacing: 0.08em;
    font-weight: 700;
}

/* SOL-951 — the STRUCTURAL PLANE TELL (three layers; see MainLayout.razor for what each one covers).
   Replaces the retired SOL-236 control-plane skin, whose banner rules restated that skin's teal/sand accent
   hexes as literals here. Those four values are gone from the product — deliberately not re-listed in this
   comment, because PlaneTellStylesheetTests scans this whole file for them and a "documentation" copy is
   indistinguishable from a real one to a grep. The retired values are recorded once, in
   docs/architecture/adr/ADR-PlatformAdmin-Design-System-Alignment.md, Amendment 1.

   ⚠️ Every colour below is a shared MudTheme token, deliberately. The tell is carried by FORM — placement,
   solid fill, square corners, uppercase, the rail spine — not by a bespoke hue, so it survives the next
   palette change including dark mode (SOL-956). Do not reintroduce a literal hex in these rules. */

/* Layer 1 — the hard plane badge, at the LEFT ORIGIN of the command bar. Solid-filled and square-cornered
   so it cannot be read as one of this app's outlined/rounded status chips. */
.pa-plane-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    flex: 0 0 auto;
    padding: 0.15rem 0.5rem;
    background-color: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
    border-radius: 0;                 /* square: the theme's 2px radius is the DECORATION grammar, not this */
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    line-height: 1.7;
    white-space: nowrap;
}

/* Three classes deep on purpose: MudBlazor.min.css loads AFTER app.css, so a selector merely TYING with
   .mud-icon-root.mud-icon-size-small loses and the icon renders oversized with a stray 4px end-margin
   (.mud-icon-root ships one) on top of this rule's own gap. */
.pa-plane-badge .mud-icon-root.mud-icon-size-small {
    font-size: 0.95rem;
    margin-inline-end: 0;
}

/* Layer 2 — the plane spine: a full-height band down the outer edge of the nav rail. Pre-attentive; it
   registers before the badge is read, which is what covers an unfocused window and peripheral vision. */
.pa-plane-spine {
    border-left: 4px solid var(--mud-palette-primary);
}

/* Layer 3 — the demoted consequence strip. Quiet on purpose: it states the COST of a wrong click, not the
   identity of the plane (layer 1 does that). Semantic colour is confined to the icon, per the design system's
   "saturated colour is reserved for status and risk" rule. */
.pa-plane-consequence {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 1rem;
    background-color: var(--mud-palette-background-gray);
    border-bottom: 1px solid var(--mud-palette-lines-default);
    color: var(--mud-palette-text-primary);
    font-size: 0.8rem;
    line-height: 1.4;
}

.pa-plane-consequence__icon {
    color: var(--mud-palette-warning);
}

.pa-plane-consequence .mud-icon-root.mud-icon-size-small {
    font-size: 1rem;
    margin-inline-end: 0;
}

.mud-main-content {
    /* SOL-955 — was a literal 48px whose own comment named the token it was duplicating
       (ClearVueDesignTokens.AppbarHeight). MudThemeProvider emits that value as --mud-appbar-height at
       runtime, so read it: changing the command-bar height in the shared tokens now moves this with it
       instead of leaving a silently disagreeing copy. No fallback on purpose — before the theme provider
       has emitted its variables the calc() is simply invalid and the min-height does not apply, which is
       harmless for one frame, whereas a fallback would be the duplicated literal coming straight back. */
    min-height: calc(100vh - var(--mud-appbar-height));

    /* SOL-500 — the sticky-footer half, matching TDAP's .mud-main-content. The column is what gives
       .layout-meta-footer's `margin-top: auto` something to absorb; without it the stamp would sit
       immediately under the last content row, mid-screen, on every short page. Cross-axis alignment is
       flex's default `stretch`, so the consequence strip and MudContainer keep their full width — this
       changes where the free vertical space goes, not how anything is sized across. */
    display: flex;
    flex-direction: column;
}

/* MudBlazor upgrade hop 2 (docs/architecture/mudblazor-upgrade-decision.md), 9.7.0 -> 9.9.0 — floating-label
   font-weight, restored.

   MudBlazor 9.8 rebound the floating input label's typography from four hardcoded literals to the theme's
   own Subtitle1 tokens. Diffed the installed stylesheets to find the exact change (grep -o against
   .mud-input-label-inputcontrol in each version's MudBlazor.min.css):

     9.7.0: font-size:1rem;font-weight:400;letter-spacing:.00938em
     9.9.0: font-size:var(--mud-typography-subtitle1-size);font-weight:var(--mud-typography-subtitle1-weight);
            letter-spacing:var(--mud-typography-subtitle1-letterspacing)  (font-family and text-transform added too)

   Three of those four now resolve to what the hardcoded literals already meant (MudBlazor's own Subtitle1
   defaults match the old hardcoded size/letter-spacing, and Default's FluentFontStack already reaches every
   label through inheritance) — EXCEPT font-weight. ClearVueDesignTokens.BuildTypography() sets
   Subtitle1.FontWeight to "600" deliberately, for real subtitle text (see that file). Rebinding the LABEL to
   the same token makes every floating label bold across every MudTextField in both apps — a real, unreviewed
   regression this hop would otherwise ship silently, not a MudBlazor bug.

   Restored here rather than in ClearVueThemeFactory: changing Subtitle1 itself would also un-bold genuine
   subtitle text, which is the opposite mistake. This targets only the label's role, at equal specificity,
   winning by load order (MudBlazor.min.css loads before app.css in Components/App.razor).

   Mirrored in TDAP's app.css (src/BinaryPlate.BlazorPlate.Tdap/wwwroot/css/app.css) — same shape as the
   SOL-500 .layout-meta-footer mirror above; the two stylesheets cannot be shared, so change one, change
   the other. */
.mud-input-label-inputcontrol {
    font-weight: 400;
}

/* SOL-237 — grayed roadmap affordance for unbuilt nav items (skeleton-on-a-switch, nav guide §4).
   Muted + non-interactive so a grayed roadmap item never reads as a live-but-broken link. Distinct
   from the "built-but-unentitled" upsell treatment that will replace it at MVP. */
.pa-nav-unbuilt {
    opacity: 0.45;
    font-style: italic;
    pointer-events: none;             /* belt-and-suspenders with Disabled="true" — never navigable */
    cursor: default;
}

.pa-nav-footer {
    opacity: 0.85;
}

/* SOL-71 Operations — shared right-alignment for the per-row action column and a friendly empty done-state. */
.pa-text-right {
    text-align: right;
}

.pa-empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 2rem 1rem;
}

/* SOL-72 Operations posture — per-row expand toggle column (narrow, chevron only) and the deep-posture
   detail panel (a compact key/value grid, Fluent-dense, hairline-bordered — not a shadowed card). */
.pa-col-expand {
    width: 44px;
}

.pa-detail-cell {
    padding: 0.75rem 1rem;
    background-color: var(--mud-palette-background-gray);
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

.pa-detail-grid {
    display: grid;
    grid-template-columns: max-content 1fr;
    column-gap: 1.5rem;
    row-gap: 0.35rem;
    max-width: 40rem;
}

.pa-detail-key {
    color: var(--mud-palette-text-secondary);
    font-size: 0.8125rem;
}

.pa-detail-val {
    font-size: 0.8125rem;
}

/* SOL-1350 Announcements — operator-authored prose (an announcement's message and details) keeps the line
   breaks it was typed with. Text is still rendered as text: this changes whitespace handling, nothing else. */
.pa-prose {
    white-space: pre-line;
}

/* SOL-347 Integration Hub — headline stat tiles: Fluent-dense, hairline-bordered blocks (no shadow, modest
   radius), and a hairline frame for the compact roll-up tables. Values read businesslike, not consumer-airy. */
.pa-stat-row {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.pa-stat-tile {
    flex: 1 1 8rem;
    min-width: 8rem;
    padding: 0.75rem 1rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    background-color: var(--mud-palette-surface);
}

.pa-stat-value {
    font-size: 1.5rem;
    font-weight: 600;
    line-height: 1.2;
}

.pa-stat-value-muted {
    color: var(--mud-palette-text-secondary);
}

.pa-stat-label {
    margin-top: 0.15rem;
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);
}

.pa-hairline {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
}

/* SOL-378 entitlement viewer — the module → capability tree.
   Depth is carried by a hairline rule and an indent, never by a nested card or a shadow: a capability row
   must read as SUBORDINATE to its module row, not as a peer entitlement of its own. Row separation is a
   1px top border rather than padding, so a 13-row list stays dense/spreadsheet-grade. */
.pa-ent-row {
    padding: 0.35rem 0;
}

.pa-ent-row + .pa-ent-row {
    border-top: 1px solid var(--mud-palette-lines-default);
}

.pa-ent-children {
    margin: 0.2rem 0 0.1rem 0.35rem;
    padding-left: 0.75rem;
    border-left: 2px solid var(--mud-palette-lines-default);
}

.pa-ent-child-row {
    padding: 0.2rem 0;
}

/* A group heading inside a panel (entitled / not-entitled / one ungated surface) with its count on the
   right. Deliberately NOT styled like .pa-ent-row — a heading must never be mistaken for a key row. */
.pa-ent-group-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.75rem;
}

.pa-ent-group + .pa-ent-group {
    margin-top: 1.25rem;
    padding-top: 1rem;
    border-top: 1px solid var(--mud-palette-lines-default);
}

/* SOL-382 license-history add-on cell — the purchased add-on chips plus the three-way not-captured /
   none-sold markers on one dense grid line. Wraps rather than truncates: every recorded key stays
   readable in the cell. */
.pa-addon-cell {
    display: inline-flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.25rem;
}

/* SOL-964 — the detail-panel-beside-a-list emphasis, expressed the Fluent way.

   Three panels (Tenants, TenantLicenses, PriceBookVersionDetail) carried Elevation="2" to say "this is the
   thing you selected; it sits on top of the list". That message is CORRECT — a heavier drop shadow is just
   the Material way of saying it, and it is outside the mandate's stated 0-1 elevation band. Flattening the
   three to a plain panel would have removed the shadow AND the distinction, which is uniformity bought with
   a real signal. This is the same message as a background step instead: one notch off the panel it sits
   beside, no shadow.

   The token is BackgroundGray, which SOL-978 made ClearVue-owned (#F3F2F1 light / #292827 dark) after ten
   live rules had been resolving it to MudBlazor's stock Material default. Its guarantees are what make this
   rule work and are guarded by BackgroundGrayTokenTests: BackgroundGray never equals Surface (so the step is
   always visible) and never equals Divider (so the outline stays legible on top of it). */
.pa-panel-emphasis {
    background-color: var(--mud-palette-background-gray);
}

/* SOL-500 — Layout Meta Footer. Deliberately the SAME class names and the same values as TDAP's
   (src/BinaryPlate.BlazorPlate.Tdap/wwwroot/css/app.css), because the ticket asks the control plane to carry
   the same treatment rather than a second design. The two stylesheets cannot be shared — TDAP's is a WASM
   static asset and this one is served by the Blazor Server host — so this is a mirror, and it is the kind of
   mirror that drifts. Change one, change the other.

   Theme-aware via --mud-palette-text-secondary rather than a fixed colour: this plane renders the shared
   ClearVue palette (SOL-951) and MudBlazor recomputes the token per theme, so the footer stays legible in
   light and dark without a prefers-color-scheme fork. */
.layout-meta-footer {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 10px;
    margin-top: auto;                 /* sticky footer — absorbs the free space in .mud-main-content's column */
    padding: 22px 12px 8px;
    font-size: 0.75rem;
    letter-spacing: 0.2px;
    color: var(--mud-palette-text-secondary);
}

.layout-meta-footer__separator {
    opacity: 0.5;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════════════════
   SOL-957 — THE LAYOUT CHROME PASS: the nav-rail toggle, the brand mark, the account menu, breadcrumbs.

   ⚠️ Every colour below is a theme token or `currentColor`. Two reasons, and the second is not obvious:
   PlaneTellStylesheetTests refuses any colour literal that is not on the ClearVue palette, and the command
   bar is one of the few surfaces whose background changes with the palette — a fixed hue that reads on
   today's ClearVue blue is unreadable the moment dark mode (SOL-956) lands. `currentColor` inherits the
   app bar's own text colour, so it cannot go wrong in either direction.

   ⚠️ Anything overriding a MudBlazor class is written as a COMPOUND selector (.mud-x.pa-x), never as the
   ClearVue class alone. MudBlazor.min.css is loaded AFTER app.css in App.razor, so a selector that merely
   TIES on specificity loses — the same trap .pa-plane-badge's icon rule documents above.
   ═══════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* The rail toggle. Deliberately quiet: it is furniture beside the plane badge, and it must not compete with
   the identity marker that sits at the command bar's left origin (SOL-951 layer 1). */
.pa-rail-toggle {
    flex: 0 0 auto;
    opacity: 0.85;
}

.pa-rail-toggle:hover {
    opacity: 1;
}

/* The brand mark. Sized in rem so it tracks the operator's browser text size rather than pinning to a
   device pixel, and shrink-proofed (flex-shrink: 0) so a long operator name in the account area on a narrow
   window squeezes the NAME, never the mark. */
.pa-brand-logo {
    display: block;
    flex: 0 0 auto;
    width: 1.5rem;
    height: 1.5rem;
    border-radius: 0.2rem;
}

/* ── The account menu ────────────────────────────────────────────────────────────────────────────────── */

/* The activator: avatar + name + caret as one target. Sized as a real hit area rather than a text run —
   the operator's name used to be a bare label with a submit button beside it, and a menu whose trigger is
   ambiguous is worse than no menu. */
.pa-user-menu__activator {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.2rem 0.4rem;
    border-radius: var(--mud-default-borderradius);
    cursor: pointer;
    user-select: none;
}

.pa-user-menu__activator:hover {
    background-color: var(--mud-palette-action-default-hover);
}

/* Keyboard reachability, in the app bar's own ink: the bar's background follows the palette, so a fixed
   focus colour would be invisible against one of them. currentColor cannot be.

   ⚠️ The selector is MudBlazor's .mud-menu-activator, NOT .pa-user-menu__activator inside it. MudMenu wraps
   a custom activator in its own focusable element (tabindex + role=button), so the ClearVue div is never
   what receives focus — a rule hung on it would be dead CSS that looks like a focus style. */
.pa-user-menu .mud-menu-activator:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 2px;
}

/* An operator identity is an email address as often as a username, so it is truncated rather than allowed
   to push the command bar's contents around. The full string is repeated inside the menu, untruncated. */
.pa-user-menu__name {
    max-width: 14rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.8125rem;
}

.mud-avatar.pa-user-avatar {
    font-size: 0.7rem;
    font-weight: 600;
}

/* The identity block at the head of the open menu. Its min-width is what stops the popover collapsing to
   the width of the "Sign out" button, which reads as a stray tooltip rather than an account menu. */
.pa-user-menu__identity {
    min-width: 14rem;
    padding: 0.5rem 0.75rem 0.35rem;
}

.pa-user-menu__identity-name {
    font-size: 0.8125rem;
    font-weight: 600;
    line-height: 1.3;
    word-break: break-all;
}

.pa-user-menu__identity-plane {
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);
}

/* Sign out reads as a menu ROW: full width, left-aligned, like every other item in a menu. The form itself
   is unchanged — see the SignOutForm template in MainLayout.razor for why it must stay a form post. */
.pa-signout-form {
    display: inline;
}

.pa-user-menu__signout .pa-signout-form {
    display: block;
}

.pa-user-menu__signout .mud-button-root {
    width: 100%;
    justify-content: flex-start;
}

/* ── Breadcrumbs (Components/Shared/PageBreadcrumbs.razor) ───────────────────────────────────────────── */

/* Dense and quiet: a trail is orientation, not content. MudBlazor's own padding is built for a roomier
   Material page, so it is flattened here — compound selector, per the note at the top of this block. */
.mud-breadcrumbs.pa-breadcrumbs {
    padding: 0;
    margin-bottom: 0.25rem;
    font-size: 0.75rem;
}

/* ⚠️ NOTHING HERE MUTES THE NON-LINK CRUMBS, on purpose. A first draft of this block did, and it was dead
   CSS: MudBlazor already ships `.mud-breadcrumb-item.mud-disabled > a { pointer-events: none; color:
   var(--mud-palette-action-disabled) }` — the right treatment, from a palette token, and it targets the
   ANCHOR while a rule hung on the item cannot override an anchor's own colour. A rule that looks like it
   styles something and does not is worse than no rule, because the next reader stops looking. */
