/* /Components/DiceTray.razor.rz.scp.css */
/* THE DICE TRAY (#305) — crude TTRPG table style (the deck-plan aesthetic law: crude is correct, no
   fancy rendering). The z-index rides the OverlayBands scheme via the --z-desks-popups band anchor
   (declared in app.css :root, inherited into this scoped component) — a fine +60 layer that sits over
   the routine desk cards yet safely below the distress lifeline (--z-distress-lifeline). CssZBandSyncTests
   parses this file and fails the build if the z-index ever drifts from OverlayBands.DiceTray, so the
   band law is enforced, not eyeballed. */

.dice-tray[b-mg0a7qoj6m] {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 1.5rem;
    z-index: calc(var(--z-desks-popups) + 60); /* OverlayBands.DiceTray = 1260 */
    display: flex;
    justify-content: center;
    pointer-events: none; /* the backdrop passes clicks; only the card catches them */
}

.dice-tray-card[b-mg0a7qoj6m] {
    pointer-events: auto;
    max-width: min(92vw, 30rem);
    background: #14100a;
    border: 2px solid #b9942f;
    border-radius: 2px;
    box-shadow: 0 0.4rem 1.4rem rgba(0, 0, 0, 0.6);
    padding: 0.7rem 0.9rem 0.8rem;
    color: #efe6d0;
    font-family: "Courier New", monospace;
    text-align: center;
}

.dice-tray-cap[b-mg0a7qoj6m] {
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    color: #b9942f;
    text-transform: uppercase;
    margin-bottom: 0.5rem;
}

.dice-tray-dice[b-mg0a7qoj6m] {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    margin-bottom: 0.4rem;
}

/* A crude boxed die face — a hand-drawn square with the number. No pip art; crude is correct. */
.dice-face[b-mg0a7qoj6m] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.1rem;
    height: 2.1rem;
    border: 2px solid #efe6d0;
    border-radius: 3px;
    background: #efe6d0;
    color: #14100a;
    font-size: 1.3rem;
    font-weight: 700;
    line-height: 1;
    box-shadow: inset 0 -2px 0 rgba(0, 0, 0, 0.25);
}

.dice-tray-eq[b-mg0a7qoj6m] {
    font-size: 1.2rem;
    color: #b9942f;
    padding: 0 0.15rem;
}

.dice-tray-total[b-mg0a7qoj6m] {
    font-size: 1.4rem;
    font-weight: 700;
    color: #f4d67a;
}

.dice-tray-math[b-mg0a7qoj6m] {
    font-size: 0.72rem;
    color: #a99a76;
    margin-bottom: 0.5rem;
    word-break: break-word;
}

.dice-tray-headline[b-mg0a7qoj6m] {
    font-size: 0.95rem;
    font-weight: 700;
    margin-bottom: 0.25rem;
}

.dice-tray-detail[b-mg0a7qoj6m] {
    font-size: 0.8rem;
    color: #c9bd9c;
    margin-bottom: 0.6rem;
}

.dice-tray-close[b-mg0a7qoj6m] {
    background: transparent;
    border: 1px solid #b9942f;
    border-radius: 2px;
    color: #b9942f;
    font-family: inherit;
    font-size: 0.78rem;
    padding: 0.25rem 0.8rem;
    cursor: pointer;
}

.dice-tray-close:hover[b-mg0a7qoj6m] {
    background: #b9942f;
    color: #14100a;
}
/* /Layout/MainLayout.razor.rz.scp.css */
.page[b-8bnjk8t9yt] {
    position: relative;
    display: flex;
    flex-direction: column;
}

main[b-8bnjk8t9yt] {
    flex: 1;
}

.sidebar[b-8bnjk8t9yt] {
    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

.top-row[b-8bnjk8t9yt] {
    background-color: #f7f7f7;
    border-bottom: 1px solid #d6d5d5;
    justify-content: flex-end;
    height: 3.5rem;
    display: flex;
    align-items: center;
}

    .top-row[b-8bnjk8t9yt]  a, .top-row[b-8bnjk8t9yt]  .btn-link {
        white-space: nowrap;
        margin-left: 1.5rem;
        text-decoration: none;
    }

    .top-row[b-8bnjk8t9yt]  a:hover, .top-row[b-8bnjk8t9yt]  .btn-link:hover {
        text-decoration: underline;
    }

    .top-row[b-8bnjk8t9yt]  a:first-child {
        overflow: hidden;
        text-overflow: ellipsis;
    }

@media (max-width: 640.98px) {
    .top-row[b-8bnjk8t9yt] {
        justify-content: space-between;
    }

    .top-row[b-8bnjk8t9yt]  a, .top-row[b-8bnjk8t9yt]  .btn-link {
        margin-left: 0;
    }
}

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

    .sidebar[b-8bnjk8t9yt] {
        width: 250px;
        height: 100vh;
        position: sticky;
        top: 0;
    }

    .top-row[b-8bnjk8t9yt] {
        position: sticky;
        top: 0;
        z-index: 1;
    }

    .top-row.auth[b-8bnjk8t9yt]  a:first-child {
        flex: 1;
        text-align: right;
        width: 0;
    }

    .top-row[b-8bnjk8t9yt], article[b-8bnjk8t9yt] {
        padding-left: 2rem !important;
        padding-right: 1.5rem !important;
    }
}
/* /Layout/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-cxcs1tkcdu] {
    background-color: rgba(255, 255, 255, 0.1);
}

.top-row[b-cxcs1tkcdu] {
    min-height: 3.5rem;
    background-color: rgba(0,0,0,0.4);
}

.navbar-brand[b-cxcs1tkcdu] {
    font-size: 1.1rem;
}

.bi[b-cxcs1tkcdu] {
    display: inline-block;
    position: relative;
    width: 1.25rem;
    height: 1.25rem;
    margin-right: 0.75rem;
    top: -1px;
    background-size: cover;
}

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

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

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

.nav-item[b-cxcs1tkcdu] {
    font-size: 0.9rem;
    padding-bottom: 0.5rem;
}

    .nav-item:first-of-type[b-cxcs1tkcdu] {
        padding-top: 1rem;
    }

    .nav-item:last-of-type[b-cxcs1tkcdu] {
        padding-bottom: 1rem;
    }

    .nav-item[b-cxcs1tkcdu]  a {
        color: #d7d7d7;
        border-radius: 4px;
        height: 3rem;
        display: flex;
        align-items: center;
        line-height: 3rem;
    }

.nav-item[b-cxcs1tkcdu]  a.active {
    background-color: rgba(255,255,255,0.37);
    color: white;
}

.nav-item[b-cxcs1tkcdu]  a:hover {
    background-color: rgba(255,255,255,0.1);
    color: white;
}

@media (min-width: 641px) {
    .navbar-toggler[b-cxcs1tkcdu] {
        display: none;
    }

    .collapse[b-cxcs1tkcdu] {
        /* Never collapse the sidebar for wide screens */
        display: block;
    }

    .nav-scrollable[b-cxcs1tkcdu] {
        /* Allow sidebar to scroll for tall menus */
        height: calc(100vh - 3.5rem);
        overflow-y: auto;
    }
}
/* /Pages/Map.razor.rz.scp.css */
/* Canvas/HUD layer only — everything else in the app stays plain Razor + Bootstrap. */

.map-page[b-0mdj3p5i53] {
    position: fixed;
    inset: 0;
    z-index: 1000;
    background: #06090f;
}

.map-canvas[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    display: block;
    touch-action: none;
    cursor: grab;
}

.map-canvas:active[b-0mdj3p5i53] {
    cursor: grabbing;
}

/* Console quip toast while walking the deck / in first person (the Nav HUD that hosts pulse
   messages is hidden then). Centred near the top, clear of the desk tab bar. */
.deck-pulse-toast[b-0mdj3p5i53] {
    position: absolute;
    top: 6rem;
    left: 50%;
    transform: translateX(-50%);
    max-width: min(40rem, 90vw);
    padding: 0.5rem 1rem;
    text-align: center;
    color: #ffd479;
    font-weight: 600;
    background: rgba(6, 9, 15, 0.82);
    border: 1px solid rgba(255, 200, 120, 0.28);
    border-radius: 0.5rem;
    pointer-events: none;
    /* #302/#299 z-law (mirror of OverlayBands.DeckPulseToast): sit ABOVE the deck offer/bar card (+50) so a
       status/intel line is never occluded by the dialog (#212, owner 2026-07-18 "the rumor is slightly
       blocked by the offer-a-round dialog"). Still below the dice tray (+60), the arrival-brake card (+90),
       every gate, and — by construction — the reserved distress lifeline. */
    z-index: calc(var(--z-desks-popups) + 55);
}

/* A bar stranger's contract offer, over the deck canvas (go-ashore quests). Same overlay family as
   the pulse toast, but interactive (Take / Pass), so it captures pointer events. */
.deck-offer-card[b-0mdj3p5i53] {
    position: absolute;
    top: 9rem;
    left: 50%;
    transform: translateX(-50%);
    max-width: min(34rem, 90vw);
    padding: 1rem 1.25rem;
    text-align: center;
    color: #e8ecf4;
    background: rgba(6, 9, 15, 0.92);
    border: 1px solid rgba(255, 200, 120, 0.4);
    border-radius: 0.6rem;
    box-shadow: 0 0.5rem 2rem rgba(0, 0, 0, 0.55);
    pointer-events: auto;
    z-index: calc(var(--z-desks-popups) + 50);
}

/* #304 — the arrival-brake consent card: the deck-offer-card family, but a heat-of-arrival tint and a
   z-index just above the other deck cards (still below the distress lifeline and the full-screen gates), so
   a brake ask in the heat of arrival is never buried under a stray context menu. #299 band = ArrivalBrakeCard. */
.arrival-brake-card[b-0mdj3p5i53] {
    border-color: rgba(255, 150, 90, 0.6);
    box-shadow: 0 0.5rem 2rem rgba(255, 90, 40, 0.25), 0 0.5rem 2rem rgba(0, 0, 0, 0.55);
    z-index: calc(var(--z-desks-popups) + 90);
}

/* #425 — the station oracle's corner card (deck-offer-card family). A cool, off-channel violet edge marks
   her apart from the warm bar cards; the "quiet" variant (the TELL — the room hushes) deepens the glow and
   the line, a cue that this one MIGHT be true. Never definitive: the hush lies sometimes, the sifting is
   the player's. OracleCard / oracle-quiet. */
.oracle-card[b-0mdj3p5i53] {
    border-color: rgba(170, 140, 255, 0.5);
    box-shadow: 0 0.5rem 2rem rgba(90, 60, 180, 0.2), 0 0.5rem 2rem rgba(0, 0, 0, 0.55);
}

.oracle-card .deck-offer-giver[b-0mdj3p5i53] {
    color: #c9b6ff;
}

.oracle-backstory[b-0mdj3p5i53] {
    font-size: 0.85em;
    opacity: 0.72;
    margin-bottom: 0.5rem;
}

.oracle-line[b-0mdj3p5i53] {
    font-style: italic;
    line-height: 1.5;
    margin: 0.4rem 0 0.7rem;
    color: #e8ecf4;
}

/* The TELL, rendered: when the room goes quiet the whole card cools and the line stills — a faint chill the
   player learns to notice but can never fully trust. */
.oracle-card.oracle-quiet[b-0mdj3p5i53] {
    border-color: rgba(150, 200, 255, 0.7);
    box-shadow: 0 0 2.5rem rgba(120, 170, 255, 0.28), 0 0.5rem 2rem rgba(0, 0, 0, 0.6);
}

.oracle-hush[b-0mdj3p5i53] {
    color: #9fd0ff;
    letter-spacing: 0.04em;
    margin-bottom: 0.3rem;
}

.oracle-line-quiet[b-0mdj3p5i53] {
    color: #eaf3ff;
    text-shadow: 0 0 0.6rem rgba(140, 190, 255, 0.45);
}

.deck-offer-giver[b-0mdj3p5i53] {
    color: #ffd479;
    font-weight: 700;
    letter-spacing: 0.03em;
    margin-bottom: 0.4rem;
}

.deck-offer-blurb[b-0mdj3p5i53] {
    font-style: italic;
    line-height: 1.4;
    margin-bottom: 0.6rem;
}

.deck-offer-reward[b-0mdj3p5i53] {
    color: #9fe6b0;
    font-weight: 600;
    margin-bottom: 0.8rem;
}

.deck-offer-actions[b-0mdj3p5i53] {
    display: flex;
    gap: 0.5rem;
    justify-content: center;
}

/* PR-WIRE — the favor-bank card (deposit / withdraw / borrow). Rides the same overlay family as the
   offer card; left-aligned rows since it's a working ledger, not a single pitch. */
.deck-bank-card[b-0mdj3p5i53] {
    text-align: left;
    border-color: rgba(255, 212, 121, 0.5);
}

.deck-bank-balance[b-0mdj3p5i53] {
    margin-bottom: 0.5rem;
}

.deck-bank-warn[b-0mdj3p5i53] {
    margin-bottom: 0.5rem;
    line-height: 1.35;
}

.deck-bank-actions[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin-bottom: 0.5rem;
}

.deck-bank-row[b-0mdj3p5i53] {
    display: flex;
    gap: 0.35rem;
    align-items: center;
    flex-wrap: wrap;
}

.deck-bank-label[b-0mdj3p5i53] {
    display: inline-block;
    min-width: 4.5rem;
    color: #b7c0d0;
    font-weight: 600;
}

.deck-bank-notice[b-0mdj3p5i53] {
    color: #9fe6b0;
    line-height: 1.35;
    margin-bottom: 0.5rem;
}

/* Owner 2026-07-18 — the bar's offer-moment confirm ("Stand <name> a glass?"), the post-round toast
   state, and the durable "overheard here" strip. All live INSIDE the bar card so a tip a player paid a
   round to hear is readable and never occluded by the dialog (#212 — the words may not hide). */
.bar-offer-moment[b-0mdj3p5i53] {
    align-self: center;
    color: #ffd479;
    font-style: italic;
    margin-right: 0.25rem;
}

.bar-toasted[b-0mdj3p5i53] {
    align-self: center;
    color: #9fe6b0;
    margin-right: 0.25rem;
}

.bar-overheard[b-0mdj3p5i53] {
    margin: 0.35rem 0 0.5rem;
    padding: 0.4rem 0.6rem;
    text-align: left;
    background: rgba(20, 28, 40, 0.6);
    border-left: 2px solid rgba(159, 230, 176, 0.5);
    border-radius: 0.3rem;
}

.bar-overheard-head[b-0mdj3p5i53] {
    color: #b7c0d0;
    font-weight: 700;
    letter-spacing: 0.03em;
    margin-bottom: 0.2rem;
}

.bar-overheard-line[b-0mdj3p5i53] {
    color: #cfe6d6;
    line-height: 1.35;
    margin-bottom: 0.15rem;
}

/* #5 SundayMorningWind — the favourite we've learned, shown beside a known contact. */
.bar-favorite[b-0mdj3p5i53] {
    align-self: center;
    color: #ff9ab0;
    margin-left: 0.35rem;
    white-space: nowrap;
}

/* #4 SundayMorningWind — the drinks menu, where the Leisure-Suit-Larry flavour lives. */
.bar-menu[b-0mdj3p5i53] {
    margin: 0.35rem 0 0.5rem;
    padding: 0.45rem 0.6rem;
    text-align: left;
    background: rgba(30, 22, 40, 0.6);
    border-left: 2px solid rgba(255, 212, 121, 0.55);
    border-radius: 0.3rem;
}

.bar-menu-head[b-0mdj3p5i53] {
    color: #ffd479;
    font-weight: 700;
    letter-spacing: 0.03em;
    margin-bottom: 0.35rem;
}

.bar-menu-item[b-0mdj3p5i53] {
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
    margin-bottom: 0.4rem;
}

.bar-menu-buy[b-0mdj3p5i53] {
    flex: 0 0 auto;
    min-width: 8.5rem;
}

.bar-menu-flavor[b-0mdj3p5i53] {
    color: #d9cfe0;
    line-height: 1.35;
    font-style: italic;
}

/* #195: the top-of-flight-view status column — desk tabs, pilot banner, ship-alert strip. These were
   three independently top-anchored ABSOLUTE layers whose fixed `top`s assumed a one-row banner, so a
   2–3 row banner (#159/#184) floated OVER the Nav toolbar and hid the 'checklist'/'?' buttons (#123's
   living example). This column is IN FLOW now, and the Nav HUD (.map-hud) below it is in flow too, so
   the column claims real height and a taller banner PUSHES the toolbar down instead of covering it. */
.map-topstack[b-0mdj3p5i53] {
    /* In FLOW (position:relative, not absolute) so it claims real height at the top of the map — the
       .map-hud block below then flows under it and a taller banner pushes the toolbar down (#195). */
    position: relative;
    z-index: calc(var(--z-map-chrome) + 14);
    pointer-events: none;   /* the gaps pass clicks to the canvas; each child re-enables its own */
    display: flex;
    flex-direction: column;
    align-items: center;    /* tabs · banner · alert strip stay top-centred */
    gap: 0.4rem;
    padding: 0.5rem 0.75rem 0;
}

/* The shuttle-bay airlock pop-up (#163): same card family as the bar offer, but a scrollable list of
   berths in shuttle range. */
.deck-shuttle-card[b-0mdj3p5i53] {
    position: absolute;
    top: 8rem;
    left: 50%;
    transform: translateX(-50%);
    max-width: min(34rem, 90vw);
    min-width: min(24rem, 90vw);
    padding: 0.9rem 1.1rem;
    color: #e8ecf4;
    background: rgba(6, 9, 15, 0.94);
    border: 1px solid rgba(255, 200, 120, 0.45);
    border-radius: 0.6rem;
    box-shadow: 0 0.5rem 2rem rgba(0, 0, 0, 0.55);
    pointer-events: auto;
    z-index: calc(var(--z-desks-popups) + 50);
}

.deck-shuttle-title[b-0mdj3p5i53] {
    color: #ffd479;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-align: center;
    margin-bottom: 0.6rem;
}

.deck-shuttle-empty[b-0mdj3p5i53] {
    line-height: 1.4;
    text-align: center;
    color: #c8cfda;
    margin-bottom: 0.8rem;
}

.deck-shuttle-rows[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    max-height: 40vh;
    overflow-y: auto;
    margin-bottom: 0.7rem;
}

.deck-shuttle-row[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0.3rem 0.4rem;
    border-radius: 0.35rem;
    background: rgba(255, 255, 255, 0.04);
}

.deck-shuttle-dest[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    text-align: left;
    min-width: 0;
}

.deck-shuttle-name[b-0mdj3p5i53] {
    font-weight: 600;
}

.deck-shuttle-meta[b-0mdj3p5i53] {
    color: #9fb0c4;
    font-size: 0.8rem;
}

.deck-shuttle-noberth[b-0mdj3p5i53] {
    color: #9098a6;
    font-style: italic;
    font-size: 0.85rem;
    white-space: nowrap;
}

/* #368: the beyond-reach tail — the nearest ground the shuttle can't cross yet. A quiet heading and
   dimmed, button-less rows so it reads as information (watch the gap), never as a place to board. */
.deck-shuttle-farhead[b-0mdj3p5i53] {
    color: #8f9bb0;
    font-size: 0.82rem;
    letter-spacing: 0.02em;
    margin: 0.15rem 0 0.4rem;
}

.deck-shuttle-row-far[b-0mdj3p5i53] {
    background: rgba(255, 255, 255, 0.02);
    opacity: 0.68;
    cursor: default;
}

.deck-shuttle-row-far .deck-shuttle-name[b-0mdj3p5i53] {
    font-weight: 500;
    color: #b7c0cf;
}

.deck-shuttle-actions[b-0mdj3p5i53] {
    display: flex;
    justify-content: center;
}

.map-hud[b-0mdj3p5i53] {
    /* #195: an in-flow block that follows .map-topstack (was absolute top:5.9rem), so the banner above
       it can never overlap it — it starts below the banner's real height, whatever that grows to. */
    position: relative;
    z-index: calc(var(--z-map-chrome) + 12);
    pointer-events: none;
    width: fit-content;
    max-width: 100%;
    padding-left: 0.75rem;
    margin-top: 0.4rem;
}

.map-hud .btn-toolbar[b-0mdj3p5i53],
.map-hud .map-readouts[b-0mdj3p5i53],
.map-hud .map-frame[b-0mdj3p5i53],
.map-hud .map-plot[b-0mdj3p5i53] {
    pointer-events: auto;
}

/* #123/#195: the Nav toolbar wraps cleanly. When the strip is too narrow for warp · Pause · Follow ·
   Plot · Dock · Scope · ? · checklist on one line, the row-gap keeps the wrapped line clear of the one
   above instead of letting 'Scope / ? / checklist' collide with their neighbours. */
.map-hud .btn-toolbar[b-0mdj3p5i53] {
    flex-wrap: wrap;
    row-gap: 0.35rem;
}

/* #143 — the frame chip lives outside the Plot panel now (it governs the Play ribbon too), so it
   gets its own compact panel in the HUD column, visible in both views. */
.map-frame[b-0mdj3p5i53] {
    width: 32rem;
    max-width: 100%;
}

/* #206 — the every-body frame overflow. A compact inline control sized to its "frame… ▾" label, not
   the full row, so it sits among the contextual chips rather than dominating them. */
.map-frame-picker[b-0mdj3p5i53] {
    width: auto;
    display: inline-block;
    height: 1.6rem;
    font-size: 0.75rem;
    background-color: rgba(33, 37, 41, 0.9);
    color: #dee2e6;
    border-color: #495057;
}

/* #209 — the honest ribbon-length note, tucked just under the Path-length slider. */
.map-ribbon-note[b-0mdj3p5i53] {
    margin-top: -0.15rem;
    margin-bottom: 0.35rem;
    line-height: 1.15;
}

.map-plot[b-0mdj3p5i53] {
    /* Wide enough that the X-Pilot node row — mode toggle, ↺ heading input ↻, pulses, percent,
       retime, delete — lays out in full without the node list scrolling horizontally, with room
       left for the longest time label (e.g. "365d 23h 59m"). */
    width: 32rem;
    max-width: 100%;
}

.map-plot-nodes[b-0mdj3p5i53] {
    /* PR-D2: only one step editor expands at a time now (accordion), but that one editor is taller than
       an old always-inline row — give the list room so the open editor shows without immediately scrolling. */
    max-height: 20rem;
    overflow-y: auto;
}

.map-plot-pulses[b-0mdj3p5i53] {
    width: 3.75rem;
}

.map-traffic[b-0mdj3p5i53] {
    position: absolute;
    top: 0.75rem;
    right: 0.75rem;
    width: 32rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

.map-traffic-scroll[b-0mdj3p5i53] {
    max-height: 60vh;
    overflow-y: auto;
}

.map-traffic-row[b-0mdj3p5i53] {
    cursor: pointer;
}

.map-dock[b-0mdj3p5i53] {
    position: absolute;
    bottom: 0.75rem;
    right: 0.75rem;
    width: 24rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

.map-tutorial[b-0mdj3p5i53] {
    position: absolute;
    bottom: 0.75rem;
    left: 0.75rem;
    width: 22rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

/* #266: the adrift re-open affordance. The old strip sat at top:0.75rem behind .map-topstack (z-index
   24) — buried under the masthead, the button a stranded captain needs occluded by the ship's own
   nameplate (#262). It now lives at the BOTTOM centre, clear of the masthead and the toolbar, above the
   canvas but below every modal, and viewport-clamped (#253). Not the banner's no-button zone (#236).

   #293 (Lab 34): the lifeline sits in a RESERVED distress band — z-index 1340, above every non-rescue
   overlay the state machine can raise (desk/deck pop-ups top out at 1320), just below the rescue modal
   it opens (.rescue-backdrop, z-index 1360). z-30 merely cleared the base HUD known at #266 time; the
   reserved band makes "nothing may bury the stranded captain's button" an INVARIANT, not an accident of
   hand-tuned values re-checked by eye. The RescueLifeline registry + OverlayLayout law assert it in CI;
   keep this number in sync with SpaceSails.Core.RescueLifeline.LifelineZIndex. */
.map-adrift[b-0mdj3p5i53] {
    position: absolute;
    bottom: 4.5rem;
    left: 50%;
    transform: translateX(-50%);
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
    z-index: var(--z-distress-lifeline);
}

.map-adrift-reopen[b-0mdj3p5i53] {
    border: 1px solid rgba(255, 120, 120, 0.7);
    border-radius: 999px;
    padding: 0.45rem 1.1rem;
    font-weight: 700;
    font-size: 0.95rem;
    color: #fff;
    background: linear-gradient(180deg, rgba(190, 40, 40, 0.96), rgba(130, 20, 20, 0.98));
    box-shadow: 0 0.4rem 1.4rem rgba(0, 0, 0, 0.6), 0 0 1rem rgba(255, 70, 70, 0.35);
    cursor: pointer;
    animation: adrift-pulse-b-0mdj3p5i53 1.8s ease-in-out infinite;
}

.map-adrift-reopen:hover[b-0mdj3p5i53] {
    background: linear-gradient(180deg, rgba(220, 60, 60, 0.98), rgba(160, 30, 30, 1));
}

@keyframes adrift-pulse-b-0mdj3p5i53 {
    0%, 100% { box-shadow: 0 0.4rem 1.4rem rgba(0, 0, 0, 0.6), 0 0 0.6rem rgba(255, 70, 70, 0.3); }
    50% { box-shadow: 0 0.4rem 1.4rem rgba(0, 0, 0, 0.6), 0 0 1.4rem rgba(255, 90, 90, 0.6); }
}

/* #266: the rescue offer modal — the piracy-pop-up family (reuses the .busted card grammar). A real
   gate: the terms are read before the hold is surrendered. */
.rescue-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: var(--z-modal); /* above the desks/deck overlays, in the modal band with view-object/busted */
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(2, 3, 6, 0.82);
    pointer-events: auto;
}

.rescue-card[b-0mdj3p5i53] {
    max-width: min(34rem, 92vw);
    max-height: 90vh;
    overflow-y: auto;
    padding: 1.25rem 1.5rem;
    text-align: center;
    color: #eef1f6;
    background: linear-gradient(180deg, rgba(30, 18, 20, 0.98), rgba(10, 7, 9, 0.99));
    border: 1px solid rgba(255, 120, 120, 0.55);
    border-radius: 0.8rem;
    box-shadow: 0 0.8rem 3rem rgba(0, 0, 0, 0.8), 0 0 1.6rem rgba(255, 90, 90, 0.28);
}

.rescue-hail[b-0mdj3p5i53] {
    color: #ff9a9a;
    font-weight: 800;
    letter-spacing: 0.04em;
    font-size: 1.1rem;
    margin-bottom: 0.4rem;
}

.rescue-quote[b-0mdj3p5i53] {
    font-style: italic;
    color: #d7e0f2;
    margin-bottom: 0.75rem;
}

.rescue-terms[b-0mdj3p5i53] {
    text-align: left;
    margin-bottom: 0.9rem;
}

.rescue-brings[b-0mdj3p5i53] {
    color: #a9e6c0;
    margin-bottom: 0.4rem;
}

.rescue-fee[b-0mdj3p5i53] {
    color: #ffce7a;
    font-weight: 600;
    margin-bottom: 0.3rem;
}

.rescue-manifest[b-0mdj3p5i53] {
    margin: 0.2rem 0 0;
    padding-left: 1.4rem;
    color: #e6d3d3;
    font-size: 0.9rem;
}

.rescue-manifest li[b-0mdj3p5i53] {
    margin-bottom: 0.1rem;
}

.rescue-options[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.map-scope[b-0mdj3p5i53] {
    position: absolute;
    right: 0.75rem;
    bottom: 0.75rem;
    pointer-events: auto;
}

.map-scope-canvas[b-0mdj3p5i53] {
    width: 280px;
    height: 280px;
    display: block;
    border-radius: 0.4rem;
}

.map-plot-horizon[b-0mdj3p5i53] {
    width: 5.2rem;
}

.map-loading[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-map-chrome) + 40);
    background: #060912;
}

.map-warp-control .form-range[b-0mdj3p5i53] {
    width: 9rem;
}

.map-warp-readout[b-0mdj3p5i53] {
    min-width: 3.5rem;
    text-align: right;
}

.map-horizon-readout[b-0mdj3p5i53] {
    min-width: 3.2rem;
    text-align: right;
}

.map-plot-percent[b-0mdj3p5i53] {
    width: 5.5rem;
    flex: 0 0 auto;
}

.map-plot-mode[b-0mdj3p5i53] {
    width: 2rem;
    flex: 0 0 auto;
}

/* #260 — the X-Pilot heading readout crams a signed 1-decimal degree value, its ° suffix AND the
   abs/rel toggle button into one input-group. At 5rem the number clipped exactly where the captain
   flies by hand (the manual close-in, angles off the panel) — widen so "-172.5°" reads in full. The
   step-edit row is flex-wrap inside the width:32rem / max-width:100% plotting panel, so the extra
   width wraps rather than pushing past the viewport (#253 clamping holds). */
.map-plot-heading[b-0mdj3p5i53] {
    width: 8.5rem;
    flex: 0 0 auto;
}

.map-plot-node-selected[b-0mdj3p5i53] {
    outline: 1px solid rgba(150, 220, 255, 0.7);
    border-radius: 0.25rem;
}

/* PR-D1 · the flight plan (docs/WednesdayPlan/UnifiedNavListNotes.md). The burn list, headed as a
   plan, with the owner's NOW/next status line. Cyan for "you", amber for "the machine has it" —
   the same colour language as the pilot banner so the two read as one system. */
.map-flightplan-head[b-0mdj3p5i53] {
    border-left: 2px solid rgba(120, 220, 255, 0.6);
    padding-left: 0.5rem;
}

.map-flightplan-now[b-0mdj3p5i53] {
    font-weight: 700;
    color: #e6f2ff;
    letter-spacing: 0.02em;
}

/* Round-2 audit fix 3: the "what happens next" line was too quiet to read cold. Give the NEXT: line
   its own weight and a cyan tint so who-is-flying (banner) + what-next (this) read as one unit. */
.map-flightplan-next[b-0mdj3p5i53] {
    font-size: 0.9rem;
    font-weight: 600;
    color: #bfe0ff;
}

/* #168 — layout-stability reserves for the plotting panel. Transient text above the burn-step
   editors (a closest pass that comes and goes, the autopilot NOW/NEXT that reflows, the sling/skim
   compose buttons that appear per-pass) was reflowing the step rows mid-click, so the ±15° nudge
   button fled under the player's cursor. Each conditional region now reserves its tallest common
   state instead of toggling height, so the steps below hold still while the sim ticks. */

/* Pass line + "Insert at … pass" button — reserve both rows (≈ small line + btn-sm) so the block
   holding still whether a pass is present, armed, or gone. A rare 2-line pass label may still grow. */
.map-plot-passline[b-0mdj3p5i53] {
    min-height: 3.25rem;
}

/* Autopilot status — the common two-line case (NOW + NEXT). 1↔2-line changes no longer shift the
   list; a rare 3+-line NOW may still grow (acceptable — the frequent flicker is the bug). */
.map-flightplan-status[b-0mdj3p5i53] {
    min-height: 2.7rem;
}

/* Compose row — reserve the tallest state (all of + Add burn / Add sling / Add skim / Planned,
   which wraps to two button rows at this panel width) so toggling the sling/skim buttons in and out
   never rewraps the row and pushes the steps below. */
.map-plot-compose[b-0mdj3p5i53] {
    min-height: 4.25rem;
}

/* A step's state, shown as a coloured pip on the left edge of its row. */
.map-plan-step[b-0mdj3p5i53] {
    position: relative;
    padding-left: 0.55rem;
}

.map-plan-step-pip[b-0mdj3p5i53] {
    position: absolute;
    left: 0;
    top: 0.15rem;
    bottom: 0.15rem;
    width: 3px;
    border-radius: 2px;
    background: rgba(150, 170, 190, 0.5);   /* planned — quiet */
}

.map-plan-step-done .map-plan-step-pip[b-0mdj3p5i53] {
    background: rgba(120, 220, 160, 0.85);  /* flown — green */
}

.map-plan-step-stale .map-plan-step-pip[b-0mdj3p5i53] {
    background: rgba(150, 150, 150, 0.4);   /* struck out */
}

.map-plan-step-armed .map-plan-step-pip[b-0mdj3p5i53] {
    background: #ffb028;                     /* machine armed — amber, banner language */
}

.map-plan-step-active .map-plan-step-pip[b-0mdj3p5i53] {
    background: #7fdfff;                     /* being flown now — bright cyan */
    box-shadow: 0 0 6px rgba(127, 223, 255, 0.8);
}

.map-plan-step-active[b-0mdj3p5i53] {
    animation: pilot-banner-pulse-b-0mdj3p5i53 1.8s ease-in-out infinite;
}

/* PR-D2 · the flight-plan accordion. Each step is a glanceable clickable line; opening it reveals its
   editor in place. The open row lifts (background + inset ring) so the one editor in focus reads as a
   sub-panel, per GeminiUINotes.md (data-state / accordion / lifted editor). */
.map-plan-step-line[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    cursor: pointer;
    padding: 0.15rem 0;
    border-radius: 0.25rem;
}

.map-plan-step-line:hover[b-0mdj3p5i53] {
    background: rgba(120, 200, 255, 0.08);
}

.map-plan-step-caret[b-0mdj3p5i53] {
    flex: 0 0 auto;
    width: 0.85rem;
    text-align: center;
    color: rgba(190, 215, 240, 0.75);
    font-size: 0.8rem;
}

.map-plan-step-open[b-0mdj3p5i53] {
    background: rgba(120, 200, 255, 0.06);
    border-radius: 0.3rem;
}

/* The expanded editor — the step's own buttons live here (owner: the sub-panel IS where the buttons
   live). A lifted panel with an inset cyan ring, opening with a short slide so it reads as an accordion. */
.map-plan-step-edit[b-0mdj3p5i53],
.map-step-editor[b-0mdj3p5i53] {
    animation: map-step-open-b-0mdj3p5i53 0.14s ease-out;
}

.map-plan-step-edit[b-0mdj3p5i53] {
    margin: 0.15rem 0 0.1rem 0.9rem;
    padding: 0.4rem 0.5rem;
    background: rgba(18, 30, 44, 0.75);
    border-radius: 0.35rem;
    box-shadow: inset 0 0 0 1px rgba(120, 200, 255, 0.22);
}

.map-step-editor[b-0mdj3p5i53] {
    box-shadow: inset 0 0 0 1px rgba(120, 200, 255, 0.22);
}

@keyframes map-step-open-b-0mdj3p5i53 {
    from { opacity: 0; transform: translateY(-3px); }
    to { opacity: 1; transform: none; }
}

/* PR-G · the sling — the plot-desk crank panel. The verdict block echoes the war-room verdict:
   a lightly boxed readout the captain scans before committing the aiming burn. */
.map-sling-verdict[b-0mdj3p5i53] {
    border-left: 2px solid rgba(120, 220, 255, 0.6);
    padding-left: 0.5rem;
    margin-top: 0.35rem;
    line-height: 1.35;
}

/* M25: navigation-target panel — the plotted course's pass vs orbit success, in plain words.
   Bottom center, deliberately roomy: it is the whole point of navigating there. */
.map-dest-panel[b-0mdj3p5i53] {
    position: absolute;
    bottom: 0.75rem;
    left: 50%;
    transform: translateX(-50%);
    width: 38rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
    z-index: calc(var(--z-map-chrome) + 2);
    border: 1px solid rgba(120, 220, 255, 0.5);
}

/* M24: planet click menu — anchored at the click point, above the canvas. */
.map-body-menu[b-0mdj3p5i53] {
    position: absolute;
    z-index: calc(var(--z-map-chrome) + 10);
    pointer-events: auto;
    min-width: 12rem;
    max-width: 16rem;
}

.map-orbit-bar[b-0mdj3p5i53] {
    height: 4px;
    margin-top: 3px;
    background: #1c2230;
}

/* #175: the cargo-run delivery next-action, in the nav-target box — parcel amber, the same cue as
   the 📦 map marker and the quest card, so the three read as one thread. */
.map-cargo-deliver[b-0mdj3p5i53] {
    color: #ebbe78;
    font-weight: 600;
    margin-bottom: 2px;
}

/* ---- PR-11: duty-station desks (docs/SaturdayPlan/StationDesks.md) ---- */

.desk-tab-bar[b-0mdj3p5i53] {
    /* #195: a centered flow child of .map-topstack now (was absolute top:0.5rem, left:50%). */
    pointer-events: auto;
    display: flex;
    gap: 0.25rem;
    flex-wrap: wrap;
    justify-content: center;
}

/* #127 · pilot-in-command banner — the single most important line on the flight HUD: who is
   actually flying the ship. Top-center, just under the desk tabs, on every desk. Big and readable
   from across the room; the two states are colour-coded so a glance is enough. */
.pilot-banner[b-0mdj3p5i53] {
    /* #195: a centered flow child of .map-topstack now (was absolute top:3.0rem, left:50%). Because it
       claims real height here, growing to 2–3 rows pushes the toolbar down instead of covering it. */
    pointer-events: auto;
    /* #159/#184: the who indicator on top, the NOW/NEXT plan rows stacked beneath it. */
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.12rem;
    padding: 0.35rem 1.1rem;
    border-radius: 0.6rem;
    border: 2px solid transparent;
    font-family: inherit;
    line-height: 1.1;
    white-space: normal;
    max-width: calc(100% - 1.5rem);
    cursor: pointer;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.55);
    transition: filter 0.12s ease;
}

.pilot-banner:hover[b-0mdj3p5i53] {
    filter: brightness(1.12);
}

.pilot-banner-who[b-0mdj3p5i53] {
    font-weight: 800;
    font-size: 1.35rem;
    letter-spacing: 0.04em;
}

.pilot-banner-rows[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.05rem;
    width: 100%;
}

.pilot-banner-mode[b-0mdj3p5i53] {
    font-size: 0.95rem;
    font-weight: 600;
    opacity: 0.9;
    white-space: nowrap;
}

/* #159/#184: NEXT and its ▲▼ pager sit on one row; the queue reads dimmer than the pinned NOW. */
.pilot-banner-queue[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.pilot-banner-next[b-0mdj3p5i53] {
    opacity: 0.82;
}

.pilot-banner-pager[b-0mdj3p5i53] {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
}

.pilot-banner-arrow[b-0mdj3p5i53] {
    background: transparent;
    border: 1px solid currentColor;
    color: inherit;
    border-radius: 0.25rem;
    line-height: 1;
    font-size: 0.7rem;
    padding: 0 0.25rem;
    cursor: pointer;
    opacity: 0.8;
}

.pilot-banner-arrow:disabled[b-0mdj3p5i53] {
    opacity: 0.3;
    cursor: default;
}

.pilot-banner-pageno[b-0mdj3p5i53] {
    font-size: 0.7rem;
    opacity: 0.7;
}

/* #166: the ship-wide alert strip, just under the pilot banner. Loud while unacknowledged; a
   silenced alert lingers dimmed until its condition clears. */
.ship-alert-strip[b-0mdj3p5i53] {
    /* #195: a centered flow child of .map-topstack now (was absolute top:7.6rem) — it stacks directly
       under the banner, so the two can no longer overlap each other or the toolbar. */
    pointer-events: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.25rem;
    max-width: 100%;
}

.ship-alert[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.25rem 0.8rem;
    border-radius: 0.45rem;
    font-weight: 700;
    font-size: 0.92rem;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.55);
}

.ship-alert-red[b-0mdj3p5i53] {
    background: rgba(120, 12, 12, 0.93);
    border: 2px solid #ff5a5a;
    color: #ffdada;
    animation: pilot-banner-pulse-b-0mdj3p5i53 1.4s ease-in-out infinite;
}

.ship-alert-amber[b-0mdj3p5i53] {
    background: rgba(120, 80, 0, 0.92);
    border: 2px solid #ffb028;
    color: #ffe4ad;
}

/* Acknowledged: the shout is silenced but the condition persists — a quiet, dimmed reminder. */
.ship-alert-ack[b-0mdj3p5i53] {
    opacity: 0.5;
    font-weight: 500;
    animation: none;
    box-shadow: none;
}

/* #205: the approve/stand-down chips on an actionable (boarding) alert — compact so they ride the
   strip without stretching it; the silence ✕ still floats to the far right past them. */
.ship-alert-action[b-0mdj3p5i53] {
    font-size: 0.78rem;
    font-weight: 700;
    line-height: 1.1;
    padding: 0.05rem 0.45rem;
}

.ship-alert-silence[b-0mdj3p5i53] {
    margin-left: auto;
    background: transparent;
    border: 1px solid currentColor;
    color: inherit;
    border-radius: 0.25rem;
    line-height: 1;
    font-size: 0.75rem;
    padding: 0 0.35rem;
    cursor: pointer;
}

/* #180: orbit degrading — amber for the tide-chaotic band, red for a surface-grazing orbit. The
   pilot banner is the surface until the #166 ShipAlerts channel lands. */
.pilot-banner-alert-amber[b-0mdj3p5i53] {
    color: #ffcf6b;
    font-weight: 800;
    opacity: 1;
}

.pilot-banner-alert-red[b-0mdj3p5i53] {
    color: #ff7a7a;
    font-weight: 800;
    opacity: 1;
}

/* Manual: calm, neutral — nothing alarming, you have the stick. */
.pilot-banner-manual[b-0mdj3p5i53] {
    background: rgba(20, 28, 36, 0.85);
    border-color: rgba(150, 170, 190, 0.55);
    color: #cfe0ee;
}

/* Autopilot: a distinct, strong colour so it can never be mistaken for manual — the ship is
   flying itself (the Saturn incident). Amber, the "machine in command" convention. */
.pilot-banner-auto[b-0mdj3p5i53] {
    background: rgba(120, 72, 0, 0.9);
    border-color: #ffb028;
    color: #ffe4ad;
    animation: pilot-banner-pulse-b-0mdj3p5i53 1.8s ease-in-out infinite;
}

.pilot-banner-auto .pilot-banner-who[b-0mdj3p5i53] {
    color: #ffcf6b;
}

@keyframes pilot-banner-pulse-b-0mdj3p5i53 {
    0%, 100% { box-shadow: 0 2px 10px rgba(0, 0, 0, 0.55); }
    50% { box-shadow: 0 0 16px 2px rgba(255, 176, 40, 0.6); }
}

.desk-tab[b-0mdj3p5i53] {
    white-space: nowrap;
}

/* Full-screen desk container (rule 1: the desk's own topic owns the screen). Sensors dims the
   live map through behind it (rule 4); every other desk goes near-opaque. */
.desk-layer[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-map-chrome) + 5);
    background: rgba(6, 9, 15, 0.92);
    pointer-events: auto;
    display: flex;
    align-items: center;
    justify-content: center;
    /* Extra right padding clears the desk-chip-strip's column (9.5rem wide, 0.5rem off the
       edge) so a desk's own right-hand content (e.g. the Comms desk's traffic board) never
       renders underneath the chips. */
    padding: 2rem 11rem 2rem 2rem;
    box-sizing: border-box;
}

/* #127: the desk tab bar + pilot-in-command banner own the top-center strip. Anchor the opaque
   modal desks (Captain / Trade / Comms / Galley) below it — align to the top and reserve the
   strip's height — so a desk's own first row (e.g. the Captain's Orders/Status/Tutorials/Ledger
   tabs) is never hidden behind the banner. Passthrough desks (Sensors, War Room) float their own
   instrument cards clear of the strip and are left untouched. */
.desk-layer:not(.desk-layer-passthrough)[b-0mdj3p5i53] {
    align-items: flex-start;
    /* Clearance under the top stack. 5.75rem was tuned for the ONE-row banner; the #190 voice runs
       2–3 rows ("YOU HAVE THE SHIP / NOW: …/ NEXT: …"), which slid every desk's own header row —
       the owner caught the Captain's Orders/Status/Tutorials/Ledger toggle — underneath it. 8.25rem
       clears the 3-row banner plus the alert strip's first line. (The proper fix is the desks
       joining the #197 flow column; tracked, this is the clearance until then.) */
    padding-top: 8.25rem;
}

.desk-layer:not(.desk-layer-passthrough) .desk-content[b-0mdj3p5i53] {
    height: calc(100vh - 10.25rem);
}

.desk-layer-dimmed[b-0mdj3p5i53] {
    background: rgba(6, 9, 15, 0.55);
}

.desk-content[b-0mdj3p5i53] {
    width: min(96vw, 90rem);
    height: 90vh;
    overflow-y: auto;
}

/* Trade desk — master–detail edition (owner: "like File Explorer"): the places-of-business
   tree + detail pane spans two thirds; the dock market lives INSIDE it now (as the dockyard
   node's detail), so only the cargo manifest keeps its own column. */
.desk-trade-grid[b-0mdj3p5i53] {
    display: grid;
    grid-template-columns: 2.1fr 1fr;
    gap: 0 1.25rem;
    height: 100%;
}

.desk-side-panel[b-0mdj3p5i53] {
    height: 100%;
    overflow-y: auto;
}

.trade-manifest-panel .card-body[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
}

.trade-manifest-transfer[b-0mdj3p5i53] {
    border: 1px solid rgba(125, 211, 255, 0.35);
    border-radius: 0.4rem;
    padding: 0.5rem;
    background: rgba(20, 40, 55, 0.4);
}

.trade-manifest-transfer-label[b-0mdj3p5i53] {
    font-size: 0.85rem;
}

.trade-manifest-transfer-pct[b-0mdj3p5i53] {
    font-size: 1.4rem;
    font-weight: 700;
    text-align: right;
}

.trade-manifest-progress[b-0mdj3p5i53] {
    height: 10px;
    margin: 0.35rem 0;
}

/* ⛽ FILL HER UP (#157): a car-dashboard fuel gauge in the Trade desk. Big readout, a bar banded
   green / amber (<18% reserve) / red (floor), and a fat fill button — the desk's plain answer to
   "how do I refuel her?". */
.fuel-desk-title[b-0mdj3p5i53] {
    font-size: 0.8rem;
    letter-spacing: 0.08em;
    color: rgba(255, 213, 128, 0.9);
    margin-bottom: 0.35rem;
}

.fuel-gauge[b-0mdj3p5i53] {
    position: relative;
    height: 2.4rem;
    border-radius: 0.4rem;
    border: 1px solid rgba(255, 255, 255, 0.15);
    background: rgba(0, 0, 0, 0.45);
    overflow: hidden;
}

.fuel-gauge-fill[b-0mdj3p5i53] {
    position: absolute;
    inset: 0 auto 0 0;
    transition: width 0.25s ease;
}

.fuel-gauge.fuel-green .fuel-gauge-fill[b-0mdj3p5i53] {
    background: linear-gradient(90deg, rgba(46, 204, 113, 0.55), rgba(46, 204, 113, 0.85));
}

.fuel-gauge.fuel-amber .fuel-gauge-fill[b-0mdj3p5i53] {
    background: linear-gradient(90deg, rgba(241, 196, 15, 0.55), rgba(243, 156, 18, 0.9));
}

.fuel-gauge.fuel-red .fuel-gauge-fill[b-0mdj3p5i53] {
    background: linear-gradient(90deg, rgba(231, 76, 60, 0.6), rgba(192, 57, 43, 0.95));
}

.fuel-gauge-readout[b-0mdj3p5i53] {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: baseline;
    justify-content: center;
    height: 100%;
    font-size: 1.35rem;
    font-weight: 800;
    letter-spacing: 0.03em;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}

.fuel-gauge-cap[b-0mdj3p5i53] {
    font-size: 0.85rem;
    font-weight: 600;
    opacity: 0.75;
    margin-left: 0.2rem;
}

.fuel-alongside[b-0mdj3p5i53] {
    color: rgba(255, 213, 128, 0.85);
}

.fuel-fill-btn[b-0mdj3p5i53] {
    letter-spacing: 0.04em;
}

.desk-traffic-scroll[b-0mdj3p5i53] {
    max-height: calc(90vh - 6rem);
    overflow-y: auto;
}

/* The comms room (PR-14, StationDesks.md #14): a ticker band on top, then the departures board
   (a) roomier in its own column and DarkWeb.razor's own two columns for (b) the dark web market
   and (c) tight-beam/laser ranging filling the rest — "one coherent comms room". */
.desk-comms-room[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    height: 100%;
    min-height: 0;
}

.comms-ticker[b-0mdj3p5i53] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: 0.25rem;
    overflow-x: auto;
    white-space: nowrap;
    background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 0.5rem;
    padding: 0.4rem 0.75rem;
}

.comms-ticker-label[b-0mdj3p5i53] {
    flex: 0 0 auto;
    margin-right: 0.5rem;
}

.comms-ticker-item[b-0mdj3p5i53] {
    flex: 0 0 auto;
    color: rgba(220, 230, 240, 0.85);
}

.comms-ticker-item + .comms-ticker-item[b-0mdj3p5i53] {
    padding-left: 1.25rem;
    border-left: 1px solid rgba(255, 255, 255, 0.15);
}

.desk-comms-grid[b-0mdj3p5i53] {
    /* Master-detail: the lean contacts tree takes the narrow column, the selected node's
       generous detail takes the wide one. */
    flex: 1 1 auto;
    min-height: 0;
    display: grid;
    grid-template-columns: 1fr 1.5fr;
    gap: 0 1.5rem;
}

/* "Roomier rows" (owner direction): the departures board gets its own column now, so it no
   longer needs table-sm's cramped padding. */
.comms-traffic-table td[b-0mdj3p5i53],
.comms-traffic-table th[b-0mdj3p5i53] {
    padding: 0.55rem 0.6rem;
}

/* ---- M28: the ship's parrot — a perch above the scope, visible on every desk. ---- */

.parrot-perch[b-0mdj3p5i53] {
    position: absolute;
    right: 0.9rem;
    bottom: 23.5rem;
    z-index: calc(var(--z-map-chrome) + 16);
    pointer-events: none;
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.parrot-bird[b-0mdj3p5i53] {
    font-size: 1.5rem;
    filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.8));
}

.parrot-bubble[b-0mdj3p5i53] {
    background: rgba(245, 245, 240, 0.95);
    color: #1c2230;
    border-radius: 0.6rem;
    padding: 0.25rem 0.6rem;
    font-size: 0.8rem;
    font-weight: 600;
    max-width: 16rem;
}

/* M29: the target dossier — the tactical target's own box, floating bottom-center ABOVE the
   desk layers (z 20 > desk 15) so Nav and Sensors read the same book. */
.map-dossier[b-0mdj3p5i53] {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    bottom: 0.75rem;
    z-index: calc(var(--z-map-chrome) + 10);
    pointer-events: auto;
    border: 1px solid rgba(150, 255, 210, 0.45);
    width: 30rem;
    max-width: calc(100% - 1.5rem);
}

/* M29: the sensors chief works the SKY — the desk layer's empty space passes pointer events
   through to the live map (pan, wheel zoom, ship/planet click), while every real instrument
   re-enables its own. The dim backdrop still paints; only hit-testing changes. */
.desk-layer-passthrough[b-0mdj3p5i53],
.desk-layer-passthrough .desk-content[b-0mdj3p5i53] {
    pointer-events: none; /* inherited by the whole desk tree unless re-enabled below */
}

/* The tracking post card sets its own explicit auto (it's a floating panel on Nav) — undo
   that inside the passthrough desk so the card body is sky, not shield. */
.desk-layer-passthrough[b-0mdj3p5i53]  .tracking-post-card,
.desk-layer-passthrough[b-0mdj3p5i53]  .tracking-post-desk-body {
    pointer-events: none;
}

/* ::deep — these live inside the TrackingPost child component, outside Map's own scope. Note
   .sensors-cards/.sensors-main are NOT re-enabled: the flex containers stretch over empty sky;
   only the actual cards and the live scope take their events back. */
.desk-layer-passthrough[b-0mdj3p5i53]  .card-header,
.desk-layer-passthrough[b-0mdj3p5i53]  .tracking-post-desk-top,
.desk-layer-passthrough[b-0mdj3p5i53]  .sensors-opportunity-box,
.desk-layer-passthrough[b-0mdj3p5i53]  .sensors-radar-box,
.desk-layer-passthrough[b-0mdj3p5i53]  .sensor-tasks-box,
.desk-layer-passthrough[b-0mdj3p5i53]  .sensor-lost-box,
.desk-layer-passthrough[b-0mdj3p5i53]  .sensors-finds-box,
.desk-layer-passthrough[b-0mdj3p5i53]  .sensor-card,
.desk-layer-passthrough[b-0mdj3p5i53]  .tracking-progress {
    pointer-events: auto;
}

/* Same treatment for the war room's instruments (owner: "the war room map seems dead to
   mouse clicks"): its panels take events back, its stretchy grid stays sky. The floating
   war-room-card sets its own auto — undo it inside the passthrough desk, then re-enable
   only the real instruments. */
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-card,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-desk-body,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-desk-grid,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-tactical-col,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-side-col {
    pointer-events: none;
}

.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-range-group,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-scope,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-heat-corner,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-firecontrol,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-intercept,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-track-list,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-hunter-list,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-hunter-warning,
.desk-layer-passthrough[b-0mdj3p5i53]  .war-room-contact-list {
    pointer-events: auto;
}

/* Comms tree (master-detail edition, ui-guidelines.md): lean contact rows + group headers. */
.comms-tree-group[b-0mdj3p5i53] {
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin: 0.4rem 0 0.15rem;
}

.comms-node[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.18rem 0.4rem;
    border-radius: 0.3rem;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.comms-node:hover[b-0mdj3p5i53] {
    background: rgba(255, 255, 255, 0.05);
}

.comms-node-selected[b-0mdj3p5i53] {
    background: rgba(120, 220, 255, 0.12);
    outline: 1px solid rgba(120, 220, 255, 0.35);
}

.comms-breadcrumbs[b-0mdj3p5i53] {
    font-size: 0.78rem;
}

.comms-actions[b-0mdj3p5i53] {
    max-width: 30rem;
}

/* Map-picking PR: the 🗺 Layers control — below the desk switcher, out of every panel's way. */
/* First-person ⇄ deck-plan toggle button — top-left, clear of the centred desk tabs and Layers. */
.deck-view-toggle[b-0mdj3p5i53] {
    position: absolute;
    top: 3.2rem;
    left: 0.75rem;
    z-index: calc(var(--z-map-chrome) + 30);
}

/* #324: on a surface excursion the enlarged SANITY gauge owns the top-left corner (owner: "let's make
   sanity visible"), so the first-person toggle steps down and to the right of it — nothing buries the
   gauge, and the toggle stays plainly pressable (#212 affordances-never-hide). */
.deck-view-toggle.on-surface[b-0mdj3p5i53] {
    top: auto;
    bottom: 2.4rem;
    left: 0.75rem;
}

/* Round-2 audit fix 4: the Layers control was dead-center at top 3.2rem, stacking on top of the
   centered pilot-in-command banner (top 3.0rem) — the "top-center cyan control" collision. Tuck it
   into the top-left corner, clear of the banner and above the HUD toolbar (top 5.9rem). */
.map-layers[b-0mdj3p5i53] {
    position: absolute;
    top: 3.2rem;
    left: 0.75rem;
    z-index: calc(var(--z-map-chrome) + 30);
}

/* #406 Nav search — a compact find-and-jump box seated on the same top-left row as the 🗺 Layers
   toggle, just to its right, so the two map controls read as a pair. The input sits at the Layers
   BUTTON's height (above where the Layers panel drops), and its own results drop straight down. In the
   rare case both dropdowns are open they can overlap in the 7.5–14rem band, so the search sits a layer
   higher (chrome+40 > the panel's +30) and is never buried. */
.nav-search[b-0mdj3p5i53] {
    position: absolute;
    top: 3.2rem;
    left: 7.5rem;
    width: 15rem;
    max-width: calc(100% - 8.25rem);
    z-index: calc(var(--z-map-chrome) + 40);
    pointer-events: auto;
}

.nav-search-input[b-0mdj3p5i53] {
    height: 1.9rem;
    background-color: rgba(33, 37, 41, 0.9);
    color: #dee2e6;
    border-color: #495057;
}

.nav-search-input[b-0mdj3p5i53]::placeholder {
    color: #adb5bd;
}

.nav-search-results[b-0mdj3p5i53] {
    position: absolute;
    top: 2.15rem;
    left: 0;
    right: 0;
    max-height: 60vh;
    overflow-y: auto;
    display: grid;
    gap: 0.15rem;
}

/* rows wrap rather than clip — a body's flavor tail ("· 🛬 landable — shuttle range") can be long */
.nav-search-row[b-0mdj3p5i53] {
    white-space: normal;
    line-height: 1.15;
}

.nav-search-name[b-0mdj3p5i53] {
    font-weight: 600;
}

/* (#195) The Nav-map tutorials advertisement was removed — it floated over the toolbar and presumed
   onboarding the tutorial flow (#160) should own. Its .tutorial-ad / .tutorial-ad-text rules went with it. */

.map-layers-panel[b-0mdj3p5i53] {
    position: absolute;
    top: 2.1rem;
    left: 0;
    min-width: 13.5rem;
    max-height: 70vh;      /* #405: a tall tree scrolls inside the corner panel, never a modal over the sky */
    overflow-y: auto;
}

.map-layers-row[b-0mdj3p5i53] {
    cursor: pointer;
    white-space: nowrap;
}

/* #405 — the collapsible layer tree. A parent row (caret + tri-state box + family name), then its
   children indented under it. Kept tight so the whole tree still reads as a small corner panel. */
.map-layers-group[b-0mdj3p5i53] {
    margin-bottom: 0.1rem;
}

.map-layers-parent[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.15rem;
}

.map-layers-caret[b-0mdj3p5i53] {
    background: none;
    border: 0;
    color: #9fd8ff;
    padding: 0 0.15rem;
    line-height: 1;
    font-size: 0.8rem;
    cursor: pointer;
    width: 1rem;
    flex: 0 0 auto;
}

.map-layers-caret:hover[b-0mdj3p5i53] {
    color: #d8efff;
}

.map-layers-parent-label[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    margin: 0;
}

.map-layers-child[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    padding-left: 1.85rem;   /* indent under the caret + parent box */
    margin: 0.02rem 0;
}

.map-layers-child input[b-0mdj3p5i53],
.map-layers-parent-label input[b-0mdj3p5i53] {
    flex: 0 0 auto;
}

.map-layers-pin[b-0mdj3p5i53] {
    font-size: 0.7rem;
    opacity: 0.8;
}

/* The Mixed tri-state: the parent box is rendered checked, then a dash is laid over its centre so a
   partly-on family reads distinct from a fully-on one (native `indeterminate` can't be data-bound). */
.map-layers-tri.mixed[b-0mdj3p5i53] {
    position: relative;
}

.map-layers-tri.mixed[b-0mdj3p5i53]::after {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    width: 0.55em;
    height: 0.14em;
    background: #041018;
    transform: translate(-50%, -50%);
    pointer-events: none;
}

.map-layers-foot[b-0mdj3p5i53] {
    border-top: 1px solid rgba(255, 255, 255, 0.15);
    padding-top: 0.2rem;
    gap: 0.5rem;
}

.map-layers-reset[b-0mdj3p5i53] {
    white-space: nowrap;
    text-decoration: none;
}

.map-layers-reset:hover[b-0mdj3p5i53] {
    text-decoration: underline;
}

/* #405 pick-menu footer link — the "crowded? filter the map" hint under the "Which one?" chooser. */
.map-pick-filter-hint[b-0mdj3p5i53] {
    text-decoration: none;
    white-space: nowrap;
}

.map-pick-filter-hint:hover[b-0mdj3p5i53] {
    text-decoration: underline;
}

/* The "Peek" fade lives in the GLOBAL app.css, not here: scoped `> *` can't reach the root
   elements of child components (the desk-chip strip, etc.), so peeking must be an unscoped rule. */

/* Start picker (2026-07-08): the boot chooser of named start points. A full-canvas scrim with a
   centred card; each option is a big click target with an icon, a title and a one-line blurb —
   styled like the deck offer card family, but full-screen since it gates the run's opening. */
.start-picker-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-desks-popups) + 100); /* a full-screen gate — above every desk layer and deck overlay (max 1250) */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
    background: rgba(4, 6, 11, 0.82);
    backdrop-filter: blur(2px);
}

.start-picker[b-0mdj3p5i53] {
    width: min(34rem, 94vw);
    max-height: 88vh;
    overflow-y: auto;
    padding: 1.5rem;
    background: rgba(10, 14, 22, 0.97);
    border: 1px solid rgba(120, 200, 255, 0.35);
    border-radius: 0.75rem;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.6);
}

.start-picker-title[b-0mdj3p5i53] {
    font-size: 1.5rem;
    font-weight: 600;
    color: #e8eef6;
    text-align: center;
}

.start-picker-sub[b-0mdj3p5i53] {
    margin: 0.4rem 0 1.1rem;
    color: rgba(224, 228, 236, 0.65);
    font-size: 0.9rem;
    text-align: center;
}

/* Docked-starts rework (2026-07-18): the "pick a berth to begin" heading over the primary berth list. */
.start-picker-berths-intro[b-0mdj3p5i53] {
    margin: 0.2rem 0 0.6rem;
    color: rgba(224, 228, 236, 0.82);
    font-size: 0.92rem;
    font-weight: 600;
    text-align: center;
}

.start-picker-list[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.start-picker-option[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.9rem;
    width: 100%;
    padding: 0.8rem 1rem;
    text-align: left;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.14);
    border-radius: 0.5rem;
    color: #e8eef6;
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease;
}

.start-picker-option:hover[b-0mdj3p5i53],
.start-picker-option:focus-visible[b-0mdj3p5i53] {
    border-color: rgba(120, 200, 255, 0.75);
    background: rgba(120, 200, 255, 0.12);
    outline: none;
}

/* #225: the "Continue — docked at <haven>" lead sits above the fresh starts and reads as the primary
   action — a warm green accent so a returning player's eye lands on it first. */
.start-picker-continue[b-0mdj3p5i53] {
    border-color: rgba(120, 230, 160, 0.6);
    background: rgba(120, 230, 160, 0.1);
    margin-bottom: 0.35rem;
}

.start-picker-continue:hover[b-0mdj3p5i53],
.start-picker-continue:focus-visible[b-0mdj3p5i53] {
    border-color: rgba(120, 230, 160, 0.9);
    background: rgba(120, 230, 160, 0.18);
}

/* #439 · THE DEV START SITES — the service door. Deliberately the plainest, coldest thing on the front
   door: hazard-amber, monospace, collapsed by default, and hard-marked DEV on every row, so nobody ever
   mistakes a smoke-test entrance for a voyage. The whole block is gated on Map.ShowDevStarts. */
.start-picker-devstarts[b-0mdj3p5i53] {
    margin-top: 1rem;
    padding-top: 0.7rem;
    border-top: 1px dashed rgba(240, 190, 110, 0.35);
}

.start-picker-devstarts-head[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    width: 100%;
    padding: 0.35rem 0.5rem;
    background: none;
    border: 1px solid transparent;
    border-radius: 0.4rem;
    color: rgba(240, 190, 110, 0.9);
    font-family: ui-monospace, "Cascadia Mono", "Consolas", monospace;
    font-size: 0.82rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    cursor: pointer;
}

.start-picker-devstarts-head:hover[b-0mdj3p5i53],
.start-picker-devstarts-head:focus-visible[b-0mdj3p5i53] {
    border-color: rgba(240, 190, 110, 0.5);
    background: rgba(240, 190, 110, 0.08);
    outline: none;
}

.start-picker-devstarts-count[b-0mdj3p5i53] {
    padding: 0 0.4rem;
    border: 1px solid rgba(240, 190, 110, 0.4);
    border-radius: 0.6rem;
    font-size: 0.72rem;
}

.start-picker-devstarts-chev[b-0mdj3p5i53] {
    margin-left: auto;
}

.start-picker-devstarts-blurb[b-0mdj3p5i53] {
    margin: 0.1rem 0 0.55rem 0.5rem;
    color: rgba(224, 228, 236, 0.55);
    font-size: 0.8rem;
}

.start-picker-devstart[b-0mdj3p5i53] {
    border-style: dashed;
    border-color: rgba(240, 190, 110, 0.3);
    background: rgba(240, 190, 110, 0.04);
}

.start-picker-devstart:hover[b-0mdj3p5i53],
.start-picker-devstart:focus-visible[b-0mdj3p5i53] {
    border-color: rgba(240, 190, 110, 0.8);
    background: rgba(240, 190, 110, 0.12);
}

.start-picker-devtag[b-0mdj3p5i53] {
    margin-left: 0.5rem;
    padding: 0 0.35rem;
    border: 1px solid rgba(240, 190, 110, 0.55);
    border-radius: 0.25rem;
    color: rgba(240, 190, 110, 0.95);
    font-family: ui-monospace, "Cascadia Mono", "Consolas", monospace;
    font-size: 0.62rem;
    letter-spacing: 0.1em;
    vertical-align: middle;
}

.start-picker-devurl[b-0mdj3p5i53] {
    display: block;
    margin-top: 0.15rem;
    color: rgba(240, 190, 110, 0.6);
    font-family: ui-monospace, "Cascadia Mono", "Consolas", monospace;
    font-size: 0.72rem;
    word-break: break-all;
}

/* The Captain-desk vault buttons (Save / Export / Import) wrap on a narrow desk. */
.captain-vault-actions[b-0mdj3p5i53] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}

.start-picker-icon[b-0mdj3p5i53] {
    font-size: 1.7rem;
    line-height: 1;
    flex: 0 0 auto;
}

.start-picker-text[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}

.start-picker-label[b-0mdj3p5i53] {
    font-weight: 600;
    font-size: 1.05rem;
}

.start-picker-blurb[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.62);
    font-size: 0.85rem;
}

/* #310 — the save/load surface (front door + in-game drawer share these). */
.save-surface[b-0mdj3p5i53] {
    width: min(38rem, 96vw);
}

/* Honest boot state (#310, #212): the door says it is warming rather than eating clicks. */
.save-warming[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    padding: 1.1rem 1rem;
    color: rgba(224, 228, 236, 0.8);
    font-size: 0.95rem;
}

.save-warming-spin[b-0mdj3p5i53] {
    font-size: 1.4rem;
    display: inline-block;
    animation: save-warming-turn-b-0mdj3p5i53 2.2s linear infinite;
}

@keyframes save-warming-turn-b-0mdj3p5i53 {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
}

/* #318 false-hang follow-up: the honest-wait glyphs for the two synchronous boot/board blocks.
   CRITICAL: both animations use ONLY `transform` (and `opacity`), so the browser runs them on the
   COMPOSITOR thread — they keep moving even while the WASM main thread is blocked inside a synchronous
   generation phase. That is the whole point: a glyph that keeps moving proves the app is alive through
   the block. They are NOT driven by JS or Blazor render ticks (those freeze exactly when it matters).
   Do not animate layout properties (width/top/margin) here — that would force main-thread layout. */

/* Boot ('plotting the traffic lanes…') → a slowly turning gear, the warming-the-reactor idiom, live. */
.wait-gear[b-0mdj3p5i53] {
    display: inline-block;
    font-size: 2.6rem;
    line-height: 1;
    animation: save-warming-turn-b-0mdj3p5i53 2.4s linear infinite;
    will-change: transform;
}

/* Board/descent ('shuttle descending…') → a small shuttle flying a slow descending diagonal with a
   fade at each end, so it loops as shuttle-after-shuttle coming down — crude deck-plan style. */
.shuttle-descent[b-0mdj3p5i53] {
    background: rgba(6, 9, 18, 0.86);
}

.wait-shuttle-lane[b-0mdj3p5i53] {
    width: 8rem;
    height: 4rem;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
}

.wait-shuttle[b-0mdj3p5i53] {
    display: inline-block;
    font-size: 1.7rem;
    line-height: 1;
    animation: wait-shuttle-fly-b-0mdj3p5i53 2.6s ease-in-out infinite;
    will-change: transform, opacity;
}

@keyframes wait-shuttle-fly-b-0mdj3p5i53 {
    0%   { transform: translate(-2.6rem, -1.4rem) rotate(6deg); opacity: 0; }
    20%  { opacity: 1; }
    80%  { opacity: 1; }
    100% { transform: translate(2.6rem, 1.4rem) rotate(6deg); opacity: 0; }
}

/* The one prominent "New voyage" (Sol) — a cool blue accent, distinct from the warm Continue green. */
.start-picker-newvoyage[b-0mdj3p5i53] {
    border-color: rgba(120, 200, 255, 0.55);
    background: rgba(120, 200, 255, 0.08);
    margin-bottom: 0.35rem;
}

.start-picker-newvoyage:hover[b-0mdj3p5i53],
.start-picker-newvoyage:focus-visible[b-0mdj3p5i53] {
    border-color: rgba(120, 200, 255, 0.9);
    background: rgba(120, 200, 255, 0.16);
}

.save-slots-label[b-0mdj3p5i53] {
    margin: 0.9rem 0 0.4rem;
    color: rgba(224, 228, 236, 0.55);
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.save-slots-list[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    max-height: 42vh;
    overflow-y: auto;
}

.slot-row[b-0mdj3p5i53] {
    display: flex;
    align-items: stretch;
    gap: 0.35rem;
}

.slot-load[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    flex: 1 1 auto;
    min-width: 0;
    padding: 0.55rem 0.8rem;
    text-align: left;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.14);
    border-radius: 0.5rem;
    color: #e8eef6;
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease;
}

.slot-load:hover[b-0mdj3p5i53],
.slot-load:focus-visible[b-0mdj3p5i53] {
    border-color: rgba(120, 200, 255, 0.75);
    background: rgba(120, 200, 255, 0.12);
    outline: none;
}

.slot-row-auto .slot-load[b-0mdj3p5i53] {
    border-color: rgba(120, 230, 160, 0.45);
}

.slot-load-empty[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.55);
    border-style: dashed;
}

.slot-icon[b-0mdj3p5i53] {
    font-size: 1.3rem;
    line-height: 1;
    flex: 0 0 auto;
}

.slot-text[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}

.slot-where[b-0mdj3p5i53] {
    font-weight: 600;
    font-size: 0.98rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.slot-when[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.62);
    font-size: 0.78rem;
}

.slot-stamp[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.4);
    font-size: 0.68rem;
    font-family: ui-monospace, monospace;
}

.slot-mini[b-0mdj3p5i53] {
    flex: 0 0 auto;
    padding: 0 0.55rem;
    background: rgba(255, 255, 255, 0.05);
    border: 1px solid rgba(255, 255, 255, 0.14);
    border-radius: 0.5rem;
    color: rgba(224, 228, 236, 0.8);
    font-size: 0.78rem;
    cursor: pointer;
}

.slot-mini:hover[b-0mdj3p5i53] {
    border-color: rgba(120, 200, 255, 0.7);
    color: #e8eef6;
}

.slot-mini-danger:hover[b-0mdj3p5i53] {
    border-color: rgba(255, 140, 140, 0.8);
    color: #ffb0b0;
}

.save-surface-foot[b-0mdj3p5i53] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    align-items: center;
    margin-top: 1rem;
}

.save-surface-foot-center[b-0mdj3p5i53] {
    justify-content: center;
    margin-top: 1.3rem;
}

.save-scenarios-toggle[b-0mdj3p5i53] {
    margin-left: auto;
    background: none;
    border: none;
    color: rgba(224, 228, 236, 0.5);
    font-size: 0.8rem;
    cursor: pointer;
}

.save-scenarios-toggle:hover[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.85);
}

.save-scenarios[b-0mdj3p5i53] {
    margin-top: 0.5rem;
    max-height: 34vh;
}

/* #312 — the whole rack. Empty berths read as dashed, dimmed, non-clickable placeholders that still
   carry their file-in button; the newest save wears a '← latest' badge tying it to the Continue head. */
.slot-row-empty .slot-load-empty[b-0mdj3p5i53] {
    cursor: default;
    opacity: 0.75;
}

.slot-where-empty[b-0mdj3p5i53] {
    font-weight: 500;
    font-style: italic;
    color: rgba(224, 228, 236, 0.5);
}

.slot-latest[b-0mdj3p5i53] {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0 0.35rem;
    border-radius: 0.35rem;
    background: rgba(120, 230, 160, 0.18);
    border: 1px solid rgba(120, 230, 160, 0.5);
    color: #9fe9bd;
    font-size: 0.68rem;
    font-weight: 600;
    vertical-align: middle;
}

/* #312 — the 'start docked at a berth' toggle sits left under New voyage, not floated right. */
.save-berth-toggle[b-0mdj3p5i53] {
    margin-left: 0;
    align-self: flex-start;
    text-align: left;
}

/* #312 — the 'start docked at a berth' shelf under New voyage (the bench's parallel-campaign boot). */
.save-berth-starts[b-0mdj3p5i53] {
    margin-top: 0.5rem;
    max-height: 30vh;
}

/* ── The captains' roster (owner 2026-07-19): the front-door saved voyages grouped by universe. One
   captain CARD per game thread — a portrait + seeded name — with that captain's save rows beneath it.
   The card is the graphical separator that tells two adjacent voyages apart. ── */
.save-captain-roster[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    max-height: 46vh;
    overflow-y: auto;
}

.captain-card[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    margin-top: 0.7rem;
    padding: 0.45rem 0.6rem;
    border-radius: 0.55rem;
    background: rgba(255, 255, 255, 0.035);
    /* a subtle rule line so each captain's band reads as its own separator */
    border-top: 1px solid rgba(255, 255, 255, 0.12);
}

.captain-card:first-child[b-0mdj3p5i53] {
    margin-top: 0.2rem;
}

/* the active captain — "at the helm" — glows apart from the parked universes */
.captain-card-active[b-0mdj3p5i53] {
    background: rgba(120, 230, 160, 0.08);
    border-top-color: rgba(120, 230, 160, 0.5);
    box-shadow: inset 0 0 0 1px rgba(120, 230, 160, 0.22);
}

.captain-avatar[b-0mdj3p5i53] {
    position: relative;
    flex: 0 0 auto;
    width: 2.9rem;
    height: 2.9rem;
    border-radius: 50%;
    overflow: hidden;
    border: 1px solid rgba(255, 255, 255, 0.28);
    background: var(--mono-color, #35506a);
}

.captain-card-active .captain-avatar[b-0mdj3p5i53] {
    border-color: rgba(120, 230, 160, 0.75);
}

/* the seeded-colour monogram disc — the fallback that shows through when the portrait is missing
   (the portrait sits on top and hides itself onerror, revealing this). */
.captain-mono[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.3rem;
    font-weight: 700;
    color: rgba(255, 255, 255, 0.92);
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
}

.captain-portrait[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.captain-ident[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.12rem;
    min-width: 0;
}

.captain-name[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    flex-wrap: wrap;
    font-weight: 700;
    font-size: 1rem;
    color: #eef3fa;
}

.captain-helm[b-0mdj3p5i53] {
    padding: 0 0.4rem;
    border-radius: 0.35rem;
    background: rgba(120, 230, 160, 0.18);
    border: 1px solid rgba(120, 230, 160, 0.5);
    color: #9fe9bd;
    font-size: 0.66rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    white-space: nowrap;
}

.captain-where[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.62);
    font-size: 0.77rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Evening wind #20 — the roster's memory of the captains the piracy insurance replaced. Dim and small,
   a headstone footnote under the living captain's card. */
.captain-retired[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.45);
    font-size: 0.7rem;
    font-style: italic;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* a captain's slots are inset a touch so they read as belonging under that captain's card */
.captain-slots[b-0mdj3p5i53] {
    max-height: none;
    overflow: visible;
    margin-left: 0.6rem;
    padding-left: 0.6rem;
    border-left: 2px solid rgba(255, 255, 255, 0.08);
}

.captain-card-active + .captain-slots[b-0mdj3p5i53] {
    border-left-color: rgba(120, 230, 160, 0.3);
}

/* The in-play captain chip (owner 2026-07-19): a small identity-glance disc, bottom-left, while aboard.
   Icon-scale (~34px), quiet. Sits ABOVE the map canvas but BELOW the deck/dock pop-ups, so it never covers
   a control — any card that opens over the corner wins. Reuses .captain-mono / .captain-portrait layering. */
.captain-chip[b-0mdj3p5i53] {
    position: absolute;
    bottom: 0.75rem;
    left: 0.75rem;
    width: 2.15rem;
    height: 2.15rem;
    border-radius: 50%;
    overflow: hidden;
    border: 1px solid rgba(255, 255, 255, 0.4);
    background: var(--mono-color, #35506a);
    box-shadow: 0 0.15rem 0.5rem rgba(0, 0, 0, 0.55);
    z-index: calc(var(--z-map-chrome) + 5);
    pointer-events: auto;
}

.captain-chip .captain-mono[b-0mdj3p5i53] {
    font-size: 0.95rem;
}

/* #312 — the import consent's label, read from the FILE's contents (never the filename). */
.import-preview[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    margin: 0.5rem 0 0.2rem;
    padding: 0.5rem 0.7rem;
    border-radius: 0.5rem;
    background: rgba(120, 200, 255, 0.08);
    border: 1px solid rgba(120, 200, 255, 0.28);
}

.import-preview-where[b-0mdj3p5i53] {
    font-weight: 600;
    font-size: 1rem;
}

.import-preview-when[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.62);
    font-size: 0.78rem;
}

.import-preview-unknown[b-0mdj3p5i53] {
    color: #ffb0b0;
    border-color: rgba(255, 140, 140, 0.4);
    background: rgba(255, 140, 140, 0.08);
    font-size: 0.85rem;
}

/* View-object popup: inspect a Gen-AI image (a souvenir, a lore prop) up close. */
.view-object-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-desks-popups) + 120); /* above the deck overlays and even the start picker */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
    background: rgba(4, 6, 11, 0.85);
    backdrop-filter: blur(2px);
    cursor: zoom-out;
}

.view-object[b-0mdj3p5i53] {
    width: min(40rem, 94vw);
    max-height: 92vh;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    padding: 1rem;
    background: #0c1017;
    border: 1px solid rgba(255, 180, 90, 0.35);
    border-radius: 0.6rem;
    box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.6);
    cursor: default;
}

.view-object-title[b-0mdj3p5i53] {
    color: #ffd9a0;
    font: 600 1rem/1.2 monospace;
    letter-spacing: 0.03em;
    text-align: center;
}

.view-object-img[b-0mdj3p5i53] {
    width: 100%;
    max-height: 70vh;
    object-fit: contain;
    border-radius: 0.4rem;
    background: #05070c;
}

.view-object-caption[b-0mdj3p5i53] {
    color: rgba(232, 236, 244, 0.9);
    font-size: 0.95rem;
    line-height: 1.35;
    text-align: center;
    font-style: italic;
}

.view-object-close[b-0mdj3p5i53] {
    align-self: center;
    margin-top: 0.2rem;
    padding: 0.35rem 1.4rem;
    background: rgba(255, 180, 90, 0.14);
    border: 1px solid rgba(255, 180, 90, 0.45);
    border-radius: 0.35rem;
    color: #ffd9a0;
    font: 600 0.9rem/1 monospace;
    cursor: pointer;
}

.view-object-close:hover[b-0mdj3p5i53] {
    background: rgba(255, 180, 90, 0.26);
}

/* THE CAPTAIN'S SELFIE (#400) — the framed shot: the vista, the captain's #368 portrait disc composited
   into the corner (v1's "no image processing" composite), the boast, and the ledger stamp. */
.selfie-frame[b-0mdj3p5i53] {
    border-color: rgba(120, 200, 255, 0.4);
}

.selfie-stage[b-0mdj3p5i53] {
    position: relative;
    width: 100%;
    min-height: 8rem;
    max-height: 62vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #05070c;
    border-radius: 0.4rem;
    overflow: hidden;
}

.selfie-vista[b-0mdj3p5i53] {
    width: 100%;
    max-height: 62vh;
    object-fit: cover;
    display: block;
}

/* The captain, HERE — a portrait disc pinned into the lower-left corner of the vista. */
.selfie-portrait[b-0mdj3p5i53] {
    position: absolute;
    left: 0.7rem;
    bottom: 0.7rem;
    width: clamp(4.5rem, 22%, 8rem);
    aspect-ratio: 1 / 1;
    object-fit: cover;
    border-radius: 50%;
    border: 2px solid rgba(120, 200, 255, 0.8);
    box-shadow: 0 0.4rem 1.2rem rgba(0, 0, 0, 0.7);
    background: #0c1017;
}

.selfie-caption[b-0mdj3p5i53] {
    color: #dfeaff;
}

.selfie-foot[b-0mdj3p5i53] {
    color: rgba(120, 200, 255, 0.85);
    font: 600 0.78rem/1.2 monospace;
    letter-spacing: 0.03em;
    text-align: center;
}

/* The peak-moment nudge — a small, non-blocking offer at the bottom of the deck. */
.selfie-offer[b-0mdj3p5i53] {
    position: absolute;
    left: 50%;
    bottom: 4.5rem;
    transform: translateX(-50%);
    z-index: calc(var(--z-desks-popups) + 60);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.4rem;
    padding: 0.6rem 1rem;
    max-width: min(30rem, 92vw);
    text-align: center;
    background: rgba(8, 14, 24, 0.94);
    border: 1px solid rgba(120, 200, 255, 0.45);
    border-radius: 0.5rem;
    box-shadow: 0 0.8rem 2rem rgba(0, 0, 0, 0.55);
}

.selfie-offer-text[b-0mdj3p5i53] {
    color: #dfeaff;
    font: 600 0.9rem/1.25 monospace;
}

.selfie-offer-actions[b-0mdj3p5i53] {
    display: flex;
    gap: 0.5rem;
}

/* The roster's legend-ledger strip — a row of clickable portrait-disc thumbs on the captain card. */
.captain-selfies[b-0mdj3p5i53] {
    margin-top: 0.25rem;
}

.captain-selfies-label[b-0mdj3p5i53] {
    display: block;
    color: rgba(120, 200, 255, 0.85);
    font-size: 0.72rem;
    letter-spacing: 0.02em;
}

.captain-selfie-strip[b-0mdj3p5i53] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    margin-top: 0.2rem;
}

.captain-selfie-thumb[b-0mdj3p5i53] {
    width: 2rem;
    height: 2rem;
    padding: 0;
    border-radius: 50%;
    border: 1px solid rgba(120, 200, 255, 0.6);
    background: #0c1017;
    overflow: hidden;
    cursor: pointer;
}

.captain-selfie-thumb img[b-0mdj3p5i53] {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* Hatch keypad: crack a locked door with the code a Fixer quoted. */
.pin-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-desks-popups) + 120);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
    background: rgba(4, 6, 11, 0.85);
    backdrop-filter: blur(2px);
}

.pin-pad[b-0mdj3p5i53] {
    width: min(19rem, 92vw);
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 0.55rem;
    padding: 1.1rem;
    background: #0c1017;
    border: 1px solid rgba(120, 220, 160, 0.35);
    border-radius: 0.6rem;
    box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.6);
}

.pin-pad-hatch[b-0mdj3p5i53] {
    color: #cfe8d6;
    font: 600 0.9rem/1.2 monospace;
    text-align: center;
    letter-spacing: 0.02em;
}

.pin-pad-sub[b-0mdj3p5i53] {
    color: rgba(207, 232, 214, 0.5);
    font: 400 0.7rem/1 monospace;
    text-align: center;
    letter-spacing: 0.22em;
}

.pin-pad-display[b-0mdj3p5i53] {
    margin: 0.15rem auto 0.35rem;
    padding: 0.4rem 1rem;
    min-width: 8rem;
    text-align: center;
    color: #8affc0;
    font: 700 1.9rem/1 monospace;
    letter-spacing: 0.5rem;
    background: #05070c;
    border: 1px solid rgba(120, 220, 160, 0.3);
    border-radius: 0.35rem;
    text-shadow: 0 0 0.5rem rgba(120, 255, 180, 0.5);
}

.pin-pad-keys[b-0mdj3p5i53] {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 0.4rem;
}

.pin-pad-key[b-0mdj3p5i53] {
    padding: 0.7rem 0;
    background: rgba(120, 220, 160, 0.1);
    border: 1px solid rgba(120, 220, 160, 0.28);
    border-radius: 0.35rem;
    color: #dbefe2;
    font: 600 1.15rem/1 monospace;
    cursor: pointer;
}

.pin-pad-key:hover[b-0mdj3p5i53] {
    background: rgba(120, 220, 160, 0.22);
}

.pin-pad-key-fn[b-0mdj3p5i53] {
    color: #ffb0a0;
    border-color: rgba(255, 150, 120, 0.35);
    background: rgba(255, 120, 90, 0.1);
}

.pin-pad-key-go[b-0mdj3p5i53] {
    color: #0c1017;
    background: #8affc0;
    border-color: #8affc0;
}

.pin-pad-key-go:hover[b-0mdj3p5i53] {
    background: #a6ffd0;
}

.pin-pad-cancel[b-0mdj3p5i53] {
    align-self: center;
    margin-top: 0.2rem;
    padding: 0.3rem 1.4rem;
    background: transparent;
    border: 1px solid rgba(224, 228, 236, 0.28);
    border-radius: 0.35rem;
    color: rgba(224, 228, 236, 0.75);
    font: 600 0.85rem/1 monospace;
    cursor: pointer;
}

.pin-pad-cancel:hover[b-0mdj3p5i53] {
    background: rgba(224, 228, 236, 0.1);
}

/* #185 — the completion fanfare. A finished contract is a CELEBRATION, centred over everything,
   the coin arriving in the open, the giver grateful, the parrot singing. */
.mission-celebration-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-modal) + 40);
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(4, 6, 11, 0.6);
    pointer-events: auto;
}

.mission-celebration[b-0mdj3p5i53] {
    max-width: min(30rem, 90vw);
    padding: 1.25rem 1.5rem;
    text-align: center;
    color: #e8ecf4;
    background: linear-gradient(180deg, rgba(20, 26, 40, 0.98), rgba(8, 11, 18, 0.98));
    border: 1px solid rgba(255, 200, 120, 0.55);
    border-radius: 0.8rem;
    box-shadow: 0 0.8rem 3rem rgba(0, 0, 0, 0.7), 0 0 1.5rem rgba(255, 200, 120, 0.25);
}

.mc-fanfare[b-0mdj3p5i53] {
    color: #ffd479;
    font-weight: 800;
    letter-spacing: 0.05em;
    margin-bottom: 0.5rem;
}

.mc-title[b-0mdj3p5i53] {
    font-size: 1.15rem;
    font-weight: 700;
    margin-bottom: 0.15rem;
}

.mc-giver[b-0mdj3p5i53] {
    color: #ffd479;
    font-weight: 700;
    letter-spacing: 0.03em;
    margin-bottom: 0.35rem;
}

.mc-thanks[b-0mdj3p5i53] {
    font-style: italic;
    color: #cfe0f5;
    margin-bottom: 0.6rem;
}

.mc-payment[b-0mdj3p5i53] {
    font-size: 1.3rem;
    font-weight: 800;
    color: #7ee787;
    margin-bottom: 0.5rem;
}

.mc-parrot[b-0mdj3p5i53] {
    color: #f0c674;
    margin-bottom: 0.4rem;
}

.mc-history[b-0mdj3p5i53] {
    font-size: 0.85rem;
    color: #9aa6bd;
}

/* #223 buried treasure — the shuttle-row action cluster, the bury chooser, and the map card. */
.deck-shuttle-row-actions[b-0mdj3p5i53] {
    display: flex;
    gap: 0.35rem;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
}

.bury-chooser-body[b-0mdj3p5i53] {
    margin: 0.4rem 0 0.6rem;
    color: #dbe4f3;
}

.bury-row[b-0mdj3p5i53] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.3rem;
}

.bury-coin[b-0mdj3p5i53] {
    font-weight: 800;
    color: #ffd479;
    font-size: 1.1rem;
}

.bury-steppers[b-0mdj3p5i53] {
    display: flex;
    gap: 0.3rem;
    flex-wrap: wrap;
    margin-bottom: 0.5rem;
}

.bury-cargo[b-0mdj3p5i53] {
    color: #cfe0f5;
}

.bury-note[b-0mdj3p5i53] {
    font-size: 0.8rem;
    font-style: italic;
    color: #9aa6bd;
}

/* #320: the landing-site chooser — a body's seeded set of grounds, each a mood. A tight stack of
   selectable rows in the boarding panel; the picked one glows the house amber. */
.board-sites[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    margin: 0.4rem 0 0.55rem;
    padding: 0.4rem 0.45rem 0.5rem;
    border: 1px solid rgba(120, 160, 210, 0.22);
    border-radius: 0.35rem;
    background: rgba(20, 30, 46, 0.5);
}

.board-sites-head[b-0mdj3p5i53] {
    font-size: 0.78rem;
    font-weight: 600;
    color: #b9c8e0;
    letter-spacing: 0.02em;
}

.board-site-row[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.1rem;
    width: 100%;
    text-align: left;
    padding: 0.35rem 0.5rem;
    border: 1px solid rgba(120, 160, 210, 0.28);
    border-radius: 0.3rem;
    background: rgba(14, 20, 32, 0.6);
    color: #cfe0f5;
    cursor: pointer;
    transition: border-color 0.12s, background 0.12s;
}

.board-site-row:hover[b-0mdj3p5i53] {
    border-color: rgba(255, 212, 121, 0.6);
    background: rgba(30, 40, 58, 0.7);
}

.board-site-sel[b-0mdj3p5i53] {
    border-color: #ffd479;
    background: rgba(60, 46, 18, 0.55);
    box-shadow: 0 0 0 1px rgba(255, 212, 121, 0.35) inset;
}

.board-site-name[b-0mdj3p5i53] {
    font-weight: 700;
    color: #ffe6a8;
    letter-spacing: 0.02em;
}

.board-site-flavor[b-0mdj3p5i53] {
    font-size: 0.76rem;
    font-style: italic;
    color: #9aa6bd;
    line-height: 1.25;
}

/* #348: the standard beach-comber kit + the flight ETA — informational body rows, set off from the
   load-out steppers by a faint rule so they read as "what always comes / what the trip costs", not
   another dial. */
.bury-gear[b-0mdj3p5i53] {
    padding-top: 0.4rem;
    border-top: 1px solid rgba(255, 255, 255, 0.08);
}

.bury-gear > span:first-child[b-0mdj3p5i53],
.bury-eta > span:first-child[b-0mdj3p5i53] {
    color: #cfe0f5;
}

/* #348: the Grok kit thumbnail (art/gear-beachcomber-kit.jpg) rides at the left of the gear line.
   Capped small — object-fit cover + a modest max-height — so it never grows the boarding dialog or
   pushes the Board button off small screens. Sits inside the flex .bury-row, so text flows beside it. */
.bury-gear .gear-thumb[b-0mdj3p5i53] {
    flex: 0 0 auto;
    width: 3.4rem;
    max-height: 2.4rem;
    object-fit: cover;
    border-radius: 0.35rem;
    margin-right: 0.5rem;
    border: 1px solid rgba(255, 255, 255, 0.14);
    align-self: center;
}

/* #348: the empty-sling "are you certain?" line — a fishing-expedition nudge, not a scold, so it wraps
   full width above its confirm buttons. */
.bury-empty-confirm[b-0mdj3p5i53] {
    display: block;
    font-size: 0.85rem;
    line-height: 1.35;
    margin: 0.2rem 0 0.5rem;
}

/* The full-screen treasure-map artifact — celebration family, but built around a big image slot. */
.treasure-map-card[b-0mdj3p5i53] {
    max-width: min(34rem, 92vw);
    padding: 0;
    overflow: hidden;
    text-align: center;
    color: #f3ead2;
    background: linear-gradient(180deg, #2a2114, #17110a);
    border: 1px solid rgba(255, 210, 130, 0.6);
    border-radius: 0.8rem;
    box-shadow: 0 0.8rem 3rem rgba(0, 0, 0, 0.75), 0 0 1.6rem rgba(255, 200, 120, 0.25);
}

.tm-art[b-0mdj3p5i53] {
    position: relative;
    height: 12rem;
    background-size: cover;
    background-position: center;
    border-bottom: 1px solid rgba(255, 210, 130, 0.35);
    display: flex;
    align-items: center;
    justify-content: center;
}

/* X ALWAYS marks the spot — big, red, unmissable, dead centre of the marked ground. */
.tm-x[b-0mdj3p5i53] {
    font-size: 4.5rem;
    font-weight: 900;
    color: #ff3b30;
    text-shadow: 0 0 0.4rem rgba(0, 0, 0, 0.9), 0 0 1.2rem rgba(255, 59, 48, 0.6);
    transform: rotate(-8deg);
    line-height: 1;
}

.tm-caption[b-0mdj3p5i53] {
    font-size: 1.3rem;
    font-weight: 800;
    letter-spacing: 0.04em;
    color: #ffd479;
    margin: 0.7rem 1rem 0.2rem;
}

.tm-bearing[b-0mdj3p5i53] {
    color: #f0e2c2;
    margin: 0.15rem 1rem;
}

.tm-contents[b-0mdj3p5i53] {
    color: #cfe0f5;
    margin: 0.15rem 1rem 0.3rem;
}

.tm-flavor[b-0mdj3p5i53] {
    font-size: 0.8rem;
    font-style: italic;
    color: #b7a988;
    margin: 0.2rem 1rem;
}

.treasure-map-card .btn[b-0mdj3p5i53] {
    margin-bottom: 1rem;
}

/* #370 · THE RESEARCH BRIEF card — the charter service's sugar-coated pitch. Treasure-map card family
   (big image slot over sales copy), in reassuring corporate green. */
.expedition-brief-card[b-0mdj3p5i53] {
    max-width: min(34rem, 92vw);
    padding: 0;
    overflow: hidden;
    text-align: center;
    color: #e7f3e9;
    background: linear-gradient(180deg, #12241a, #0a140e);
    border: 1px solid rgba(120, 220, 150, 0.55);
    border-radius: 0.8rem;
    box-shadow: 0 0.8rem 3rem rgba(0, 0, 0, 0.75), 0 0 1.6rem rgba(90, 210, 130, 0.22);
}

.eb-art[b-0mdj3p5i53] {
    position: relative;
    height: 12rem;
    background-size: cover;
    background-position: center;
    border-bottom: 1px solid rgba(120, 220, 150, 0.3);
}

/* The reassuring "FULLY BENIGN (pending)" rubber stamp, corner-slapped over the hero image. */
.eb-stamp[b-0mdj3p5i53] {
    position: absolute;
    top: 0.7rem;
    right: 0.7rem;
    transform: rotate(7deg);
    padding: 0.2rem 0.5rem;
    font-weight: 900;
    font-size: 0.9rem;
    letter-spacing: 0.05em;
    color: #8affb0;
    border: 2px solid #8affb0;
    border-radius: 0.3rem;
    background: rgba(4, 12, 8, 0.45);
    text-shadow: 0 0 0.3rem rgba(0, 0, 0, 0.8);
}

.eb-stamp span[b-0mdj3p5i53] {
    display: block;
    font-size: 0.6rem;
    font-weight: 700;
    opacity: 0.85;
}

.eb-title[b-0mdj3p5i53] {
    font-size: 1.1rem;
    font-weight: 800;
    letter-spacing: 0.03em;
    color: #8affb0;
    margin: 0.7rem 1rem 0.15rem;
}

.eb-site[b-0mdj3p5i53] {
    color: #bfe6cc;
    font-size: 0.9rem;
    margin: 0 1rem 0.35rem;
}

.eb-body[b-0mdj3p5i53] {
    color: #e2f0e6;
    line-height: 1.4;
    margin: 0.15rem 1.1rem 0.4rem;
}

.eb-flavor[b-0mdj3p5i53] {
    font-size: 0.75rem;
    font-style: italic;
    color: #8fae99;
    margin: 0.2rem 1rem;
}

.expedition-brief-card .btn[b-0mdj3p5i53] {
    margin-bottom: 1rem;
}

/* #370 · THE REVEAL card — the bigger picture, the site's own voice contradicting the brief. The horror
   counterpart: the same image slot gone dark under a red scrim, the copy in dread reds. */
.expedition-reveal-backdrop[b-0mdj3p5i53] {
    background: rgba(2, 3, 6, 0.82);
    z-index: calc(var(--z-modal) + 45); /* above the brief and treasure card — the reveal interrupts */
}

.expedition-reveal-card[b-0mdj3p5i53] {
    max-width: min(34rem, 92vw);
    padding: 0;
    overflow: hidden;
    text-align: center;
    color: #f4dede;
    background: linear-gradient(180deg, #240f0f, #120707);
    border: 1px solid rgba(230, 90, 90, 0.6);
    border-radius: 0.8rem;
    box-shadow: 0 0.8rem 3rem rgba(0, 0, 0, 0.85), 0 0 1.8rem rgba(220, 60, 60, 0.3);
}

.er-art[b-0mdj3p5i53] {
    position: relative;
    height: 12rem;
    background-size: cover;
    background-position: center;
    border-bottom: 1px solid rgba(230, 90, 90, 0.35);
    display: flex;
    align-items: center;
    justify-content: center;
}

/* The reveal drowns the once-cheerful image in dread. */
.er-scrim[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    background: radial-gradient(circle at 50% 40%, rgba(120, 0, 0, 0.35), rgba(4, 0, 0, 0.8) 80%);
    mix-blend-mode: multiply;
}

.er-stamp[b-0mdj3p5i53] {
    position: relative;
    transform: rotate(-6deg);
    padding: 0.25rem 0.7rem;
    font-weight: 900;
    font-size: 1.05rem;
    letter-spacing: 0.06em;
    color: #ff6b6b;
    border: 3px solid #ff6b6b;
    border-radius: 0.3rem;
    background: rgba(10, 0, 0, 0.5);
    text-shadow: 0 0 0.4rem rgba(0, 0, 0, 0.9);
}

.er-headline[b-0mdj3p5i53] {
    font-size: 1.2rem;
    font-weight: 900;
    letter-spacing: 0.03em;
    color: #ff8080;
    margin: 0.7rem 1rem 0.15rem;
}

.er-site[b-0mdj3p5i53] {
    color: #d9a9a9;
    font-size: 0.85rem;
    font-style: italic;
    margin: 0 1rem 0.35rem;
}

.er-body[b-0mdj3p5i53] {
    color: #f0dede;
    line-height: 1.45;
    margin: 0.15rem 1.1rem 0.4rem;
}

.expedition-reveal-card .btn[b-0mdj3p5i53] {
    margin-bottom: 1rem;
}

/* PR-BUSTED — the catch pop-up (owner ruling §5). Reuses the celebration modal's backdrop grammar,
   in the collector's harder colours; the freeze-frame goes full-bleed sepia. */
.busted-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-modal) + 50); /* above the celebration modal — a catch interrupts everything */
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(2, 3, 6, 0.82);
    pointer-events: auto;
}

.busted-backdrop.busted-sepia[b-0mdj3p5i53] {
    background: radial-gradient(circle at 50% 40%, rgba(90, 60, 25, 0.9), rgba(10, 7, 3, 0.97));
}

.busted-card[b-0mdj3p5i53] {
    max-width: min(34rem, 92vw);
    padding: 1.25rem 1.5rem;
    text-align: center;
    color: #eef1f6;
    background: linear-gradient(180deg, rgba(30, 18, 20, 0.98), rgba(10, 7, 9, 0.99));
    border: 1px solid rgba(255, 90, 90, 0.55);
    border-radius: 0.8rem;
    box-shadow: 0 0.8rem 3rem rgba(0, 0, 0, 0.8), 0 0 1.6rem rgba(255, 70, 70, 0.28);
}

.busted-hail[b-0mdj3p5i53] {
    color: #ff8a8a;
    font-weight: 800;
    letter-spacing: 0.04em;
    font-size: 1.1rem;
    margin-bottom: 0.35rem;
}

/* PR-BUSTED art (docs/art-manifest-busted.md item 3): busted-collector-hail.jpg backs ONLY the Demand
   header. A left-weighted dark scrim keeps the callsign legible while the repo captain reads from the
   right of the cockpit; the gradient sits ABOVE the url so a missing asset still leaves dark, readable
   chrome. Text-only readability is preserved — the image is decoration behind the scrim. */
.busted-collector-hail[b-0mdj3p5i53] {
    padding: 0.6rem 0.7rem;
    border-radius: 0.5rem;
    background:
        linear-gradient(90deg, rgba(12, 6, 4, 0.9) 0%, rgba(12, 6, 4, 0.72) 45%, rgba(12, 6, 4, 0.4) 100%),
        url('art/busted-collector-hail.jpg') right center / cover no-repeat;
    text-shadow: 0 0.08rem 0.3rem rgba(0, 0, 0, 0.95);
    border: 1px solid rgba(255, 138, 138, 0.28);
}

.busted-heat[b-0mdj3p5i53] {
    color: #ffce7a;
    font-size: 0.9rem;
    margin-bottom: 0.5rem;
}

.busted-quote[b-0mdj3p5i53] {
    font-style: italic;
    color: #d7e0f2;
    margin-bottom: 0.75rem;
}

/* #480 — the nerve ledger on the death card: the last few named pips, so "what broke me?" is answered at the
   one moment the question is loudest. Monospace and plain, deliberately reading like an instrument readout
   rather than more fiction — the fiction is the line above it. */
.busted-nerve-ledger[b-0mdj3p5i53] {
    margin: 0.15rem 0 0.8rem;
    padding: 0.5rem 0.65rem;
    border: 1px solid rgba(150, 170, 190, 0.28);
    border-radius: 4px;
    background: rgba(10, 14, 20, 0.55);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.78rem;
    line-height: 1.5;
}

.busted-nerve-ledger-head[b-0mdj3p5i53] {
    color: #93a6bd;
    letter-spacing: 0.06em;
    font-size: 0.7rem;
    margin-bottom: 0.3rem;
}

.busted-nerve-ledger-line[b-0mdj3p5i53] {
    color: #e39089;
}

.busted-options[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin-bottom: 0.4rem;
}

.busted-opt[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
    gap: 0.1rem;
    padding: 0.55rem 0.8rem;
    white-space: normal;
}

.busted-opt .bo-title[b-0mdj3p5i53] {
    font-weight: 800;
    letter-spacing: 0.02em;
}

.busted-opt .bo-detail[b-0mdj3p5i53] {
    font-size: 0.8rem;
    opacity: 0.9;
}

.busted-receipt[b-0mdj3p5i53] {
    text-align: left;
    display: inline-block;
    margin: 0.25rem auto 0.75rem;
    color: #ffd0d0;
    font-size: 0.92rem;
}

.busted-receipt div[b-0mdj3p5i53] {
    margin: 0.1rem 0;
}

.busted-math[b-0mdj3p5i53] {
    margin-top: 0.4rem;
    font-size: 0.75rem;
    color: #9aa6bd;
}

/* Evening wind #20 — THE NEW CAPTAIN block on the resurrection card: the policy pays out, a new name and
   face take the license. Reads as a small notarised panel under the brain-backup receipt. */
.busted-succession[b-0mdj3p5i53] {
    margin: 0.5rem auto 0.25rem;
    padding: 0.6rem 0.9rem;
    max-width: 30rem;
    border: 1px solid rgba(120, 230, 160, 0.45);
    border-radius: 0.6rem;
    background: rgba(120, 230, 160, 0.08);
}

.busted-succession-head[b-0mdj3p5i53] {
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    color: #9fe9bd;
    text-transform: uppercase;
}

.busted-succession-line[b-0mdj3p5i53] {
    margin: 0.35rem 0 0.5rem;
    font-style: italic;
    color: #e7f4ec;
}

.busted-succession-names[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    font-weight: 700;
    color: #eef3fa;
}

.busted-succession-names .succ-old[b-0mdj3p5i53] {
    color: rgba(224, 228, 236, 0.6);
    text-decoration: line-through;
    font-weight: 500;
}

.busted-succession-names .succ-arrow[b-0mdj3p5i53] {
    color: #9fe9bd;
}

.busted-succession-names .succ-portrait[b-0mdj3p5i53] {
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    object-fit: cover;
    border: 1px solid rgba(120, 230, 160, 0.55);
}

.busted-roll[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 0.85rem;
    color: #cfe0f5;
    margin: 0.15rem 0;
}

.busted-close[b-0mdj3p5i53] {
    margin-top: 0.6rem;
}

/* The freeze-frame — homage, not film: two silhouetted rogues bursting into muzzle-flash light,
   sepia, held. The <art> slots are placeholders the grok image lane fills (see image manifest). */
.busted-freeze[b-0mdj3p5i53] {
    text-align: center;
    color: #f3e2c4;
}

.busted-freeze-art[b-0mdj3p5i53] {
    position: relative;
    height: 9rem;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0.5rem 0 0.75rem;
    background: radial-gradient(circle at 50% 55%, rgba(255, 236, 180, 0.9), rgba(120, 78, 30, 0.4) 45%, rgba(20, 12, 5, 0.9));
    border-radius: 0.6rem;
    overflow: hidden;
    filter: sepia(0.7) contrast(1.1);
}

.busted-freeze-art .bf-silhouettes[b-0mdj3p5i53] {
    font-size: 3rem;
    filter: brightness(0.15);
    z-index: 2;
}

.busted-freeze-art .bf-flash[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 6rem;
    color: #fff6dc;
    opacity: 0.85;
    animation: busted-flash-b-0mdj3p5i53 1.6s ease-out infinite;
}

.busted-explosion[b-0mdj3p5i53] {
    height: 6rem;
    background: radial-gradient(circle at 50% 50%, rgba(255, 180, 90, 0.95), rgba(120, 40, 10, 0.5) 50%, rgba(15, 8, 4, 0.95));
    filter: sepia(0.3) contrast(1.2);
}

/* PR-BUSTED art (docs/art-manifest-busted.md): the delivered JPGs cover the freeze/explosion boxes,
   sitting on TOP of the placeholder gradient (which stays as the load/404 fallback). The art is already
   painterly-sepia, so has-art drops the box's tinting filter and lets the baked frame read as authored.
   The box keeps overflow:hidden + border-radius, so the image is clipped to the same slot shape. */
.busted-freeze-art .bf-art[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: 1;
}

.busted-freeze-art.has-art[b-0mdj3p5i53] {
    filter: none;
}

.busted-freeze-caption[b-0mdj3p5i53] {
    font-style: italic;
    font-weight: 700;
    font-size: 1.05rem;
    color: #ffe9c0;
    margin-bottom: 0.4rem;
}

/* #380 item 1 — the WHAT HAPPENED block on the resurrection card: the cause image + a place-dependent
   house-voice line, set off above the brain-backup copy so the fiction explains itself. The death art is
   authored (Grok), so it drops the sepia tinting like the other has-art frames; a short one keeps the
   card compact. A hairline rule under the block separates it from the wake receipt below. */
.busted-whathappened[b-0mdj3p5i53] {
    text-align: center;
    margin: 0 0 0.6rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid rgba(255, 138, 138, 0.22);
}

.busted-death-art[b-0mdj3p5i53] {
    height: 8rem;
    filter: none;
    background: radial-gradient(circle at 50% 50%, rgba(60, 20, 40, 0.85), rgba(15, 8, 12, 0.95) 70%);
}

.busted-whathappened-head[b-0mdj3p5i53] {
    font-weight: 800;
    letter-spacing: 0.03em;
    font-size: 0.8rem;
    color: #ff9a9a;
    margin: 0.1rem 0 0.25rem;
}

.busted-whathappened-line[b-0mdj3p5i53] {
    font-style: italic;
    color: #e6d3bd;
    font-size: 0.95rem;
    line-height: 1.35;
}

@keyframes busted-flash-b-0mdj3p5i53 {
    0% { opacity: 0.55; transform: scale(0.9); }
    50% { opacity: 0.95; transform: scale(1.05); }
    100% { opacity: 0.55; transform: scale(0.9); }
}
}

/* #255 — the diegetic long-haul jump overlay. Full-screen theater over the frozen map; the one
   loading bar allowed to be a feature. Above every HUD layer, below nothing. */
.jump-overlay[b-0mdj3p5i53] {
    position: fixed;
    inset: 0;
    z-index: calc(var(--z-modal) + 40);
    display: flex;
    align-items: center;
    justify-content: center;
    background: radial-gradient(ellipse at center, rgba(10, 16, 30, 0.86) 0%, rgba(2, 4, 9, 0.97) 70%);
    backdrop-filter: blur(3px);
    animation: jump-fade-in-b-0mdj3p5i53 0.4s ease-out;
    color: #dfe8ff;
    font-family: 'Segoe UI', system-ui, sans-serif;
    text-align: center;
    user-select: none;
}

@keyframes jump-fade-in-b-0mdj3p5i53 {
    from { opacity: 0; }
    to { opacity: 1; }
}

.jump-overlay-inner[b-0mdj3p5i53] {
    max-width: min(90vw, 34rem);
    padding: 2rem 2.5rem;
}

.jump-overlay-title[b-0mdj3p5i53] {
    font-size: clamp(1.6rem, 5vw, 2.6rem);
    font-weight: 700;
    letter-spacing: 0.35em;
    color: #8fd0ff;
    text-shadow: 0 0 18px rgba(80, 170, 255, 0.5);
    margin-bottom: 1.4rem;
}

.jump-overlay-year[b-0mdj3p5i53] {
    font-size: clamp(1.1rem, 3.5vw, 1.5rem);
    letter-spacing: 0.15em;
    color: #f4d58d;
    margin-bottom: 0.9rem;
    font-variant-numeric: tabular-nums;
}

.jump-overlay-bar[b-0mdj3p5i53] {
    height: 0.55rem;
    border-radius: 0.3rem;
    background: rgba(255, 255, 255, 0.1);
    overflow: hidden;
    box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.6);
    margin-bottom: 1.1rem;
}

.jump-overlay-fill[b-0mdj3p5i53] {
    height: 100%;
    border-radius: 0.3rem;
    background: linear-gradient(90deg, #4a8fd8, #8fd0ff);
    box-shadow: 0 0 12px rgba(120, 190, 255, 0.7);
    transition: width 0.35s ease-out;
}

.jump-overlay-bound[b-0mdj3p5i53] {
    font-size: clamp(0.95rem, 2.6vw, 1.15rem);
    color: #cfe0ff;
    margin-bottom: 1.3rem;
}

.jump-overlay-note[b-0mdj3p5i53] {
    font-size: 0.95rem;
    color: #9fb4d8;
    font-style: italic;
    margin-bottom: 0.5rem;
}

.jump-overlay-nostop[b-0mdj3p5i53] {
    font-size: 0.85rem;
    color: #6f83a6;
    letter-spacing: 0.02em;
}

/* #422 arc 2 — NEBULA MUTUAL fragments delivered ON the BUSTED/resurrection card (the glitch flash, the
   collector's writ, the clinic's second page). A cold, filed-under-it slab set into the warmer death card. */
.busted-nebula[b-0mdj3p5i53] {
    margin: 0.5rem 0.9rem;
    padding: 0.5rem 0.7rem;
    text-align: left;
    background: rgba(6, 10, 16, 0.72);
    border: 1px solid rgba(120, 170, 210, 0.4);
    border-left: 3px solid rgba(150, 190, 230, 0.85);
    border-radius: 0.3rem;
    color: #cdd8e6;
}

.busted-nebula-head[b-0mdj3p5i53] {
    font-weight: 800;
    font-size: 0.78rem;
    letter-spacing: 0.05em;
    color: #a9c4e0;
    margin-bottom: 0.25rem;
}

.busted-nebula-line[b-0mdj3p5i53] {
    font-size: 0.85rem;
    line-height: 1.4;
    color: #c4d1e0;
}

/* The one-flat-second glitch: a monospace, flickering machine line that should not be there. */
.busted-glitch-flash[b-0mdj3p5i53] {
    font-family: "Consolas", "Courier New", monospace;
    font-weight: 800;
    letter-spacing: 0.04em;
    color: #8fe6c8;
    text-shadow: 0 0 0.4rem rgba(80, 220, 170, 0.5);
    margin-bottom: 0.3rem;
    animation: nebula-glitch-flicker-b-0mdj3p5i53 1.1s steps(2, end) 3;
}

@keyframes nebula-glitch-flicker-b-0mdj3p5i53 {
    0%, 100% { opacity: 1; }
    45% { opacity: 0.35; }
    50% { opacity: 1; }
    55% { opacity: 0.55; }
}

/* THE CONVERGENCE — the marquee one-time reveal, above everything (a catch that just fired it sits under).
   Ice-and-archive palette: KAAMOS's cold blue meeting NEBULA's filed grey, the two threads crossing. */
.convergence-backdrop[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-modal) + 60); /* above the BUSTED card (+50) — the recognition tops even a catch */
    display: flex;
    align-items: center;
    justify-content: center;
    background: radial-gradient(circle at 50% 40%, rgba(10, 20, 34, 0.86), rgba(1, 2, 5, 0.95) 85%);
    pointer-events: auto;
}

.convergence-card[b-0mdj3p5i53] {
    max-width: min(38rem, 93vw);
    padding: 1.4rem 1.6rem 1.2rem;
    text-align: center;
    color: #dbe6f2;
    background: linear-gradient(180deg, #0b1826 0%, #0a1220 55%, #0c0f16 100%);
    border: 1px solid rgba(140, 190, 230, 0.55);
    border-radius: 0.85rem;
    box-shadow: 0 1rem 3.5rem rgba(0, 0, 0, 0.9), 0 0 2.4rem rgba(120, 180, 230, 0.28);
}

.convergence-stamp[b-0mdj3p5i53] {
    display: inline-block;
    transform: rotate(-3deg);
    padding: 0.2rem 0.7rem;
    font-weight: 900;
    letter-spacing: 0.08em;
    color: #bfe0ff;
    border: 2px solid rgba(150, 200, 240, 0.75);
    border-radius: 0.3rem;
    background: rgba(6, 14, 26, 0.6);
    margin-bottom: 0.7rem;
}

.convergence-head[b-0mdj3p5i53] {
    font-size: 1.35rem;
    font-weight: 900;
    letter-spacing: 0.02em;
    color: #e7f1ff;
    margin-bottom: 0.15rem;
}

.convergence-sub[b-0mdj3p5i53] {
    font-size: 0.82rem;
    font-style: italic;
    letter-spacing: 0.03em;
    color: #93b2d4;
    margin-bottom: 0.75rem;
}

.convergence-body[b-0mdj3p5i53] {
    line-height: 1.55;
    color: #d3e0ef;
    text-align: left;
    margin-bottom: 0.7rem;
}

.convergence-foot[b-0mdj3p5i53] {
    font-style: italic;
    color: #9db9d8;
    line-height: 1.4;
    margin-bottom: 1rem;
}

/* #440 · THE FIRST GROUND — the one lesson a captain gets before their boots touch regolith. Borrows the
   convergence card's frame (one staged card idiom for the game's staged moments) but drops its cold blue
   for regolith amber, and goes LEFT-aligned inside: this card is read for instruction, not for awe, and
   centred instruction is hard to scan. */
.ground-lesson-card[b-0mdj3p5i53] {
    max-width: min(42rem, 94vw);
    border-color: rgba(240, 190, 110, 0.5);
    box-shadow: 0 1rem 3.5rem rgba(0, 0, 0, 0.9), 0 0 2.4rem rgba(240, 190, 110, 0.2);
}

.ground-lesson-levers[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.7rem;
    margin: 1rem 0 0.9rem;
    text-align: left;
}

.ground-lesson-lever[b-0mdj3p5i53] {
    display: flex;
    align-items: flex-start;
    gap: 0.8rem;
}

/* The keycap. The whole card exists because a key was invisible, so the key is the loudest thing on it. */
.ground-lesson-key[b-0mdj3p5i53] {
    flex: 0 0 auto;
    min-width: 2rem;
    padding: 0.25rem 0;
    color: #ffd479;
    background: rgba(240, 190, 110, 0.1);
    border: 1px solid rgba(240, 190, 110, 0.65);
    border-bottom-width: 3px;
    border-radius: 0.35rem;
    font-family: ui-monospace, "Cascadia Mono", "Consolas", monospace;
    font-size: 1.05rem;
    font-weight: 700;
    text-align: center;
}

.ground-lesson-lever-text[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}

.ground-lesson-lever-title[b-0mdj3p5i53] {
    color: #f4e3c4;
    font-weight: 700;
    font-size: 0.98rem;
}

.ground-lesson-lever-what[b-0mdj3p5i53] {
    color: rgba(219, 230, 242, 0.82);
    font-size: 0.88rem;
    line-height: 1.35;
}

/* The laws — the four things that end a first excursion. Terse, and visually apart from the keys. */
.ground-lesson-laws[b-0mdj3p5i53] {
    margin: 0 0 1rem;
    padding: 0.7rem 0.9rem 0.7rem 2rem;
    text-align: left;
    color: rgba(219, 230, 242, 0.9);
    font-size: 0.87rem;
    line-height: 1.5;
    background: rgba(0, 0, 0, 0.25);
    border-left: 2px solid rgba(240, 190, 110, 0.5);
    border-radius: 0.3rem;
}

.ground-lesson-foot[b-0mdj3p5i53] {
    margin-top: 0.8rem;
    color: rgba(219, 230, 242, 0.5);
    font-size: 0.78rem;
}

/* #488 — the derelict's decision card. Reuses the treasure-map card frame (same "an artifact, full
   screen" idiom) and adds the finding picker: the causes your evidence actually supports, one of which
   you put your name to before the report will file. */
.wreck-choice .wreck-finding[b-0mdj3p5i53] {
    margin: 0.6rem 0 0.5rem;
    padding: 0.5rem 0.65rem;
    border: 1px solid rgba(150, 170, 190, 0.28);
    border-radius: 4px;
    background: rgba(10, 14, 20, 0.55);
}

.wreck-finding-head[b-0mdj3p5i53] {
    color: #93a6bd;
    letter-spacing: 0.05em;
    font-size: 0.72rem;
    margin-bottom: 0.4rem;
}

.wreck-cause[b-0mdj3p5i53] {
    display: block;
    width: 100%;
    text-align: left;
    margin-bottom: 0.3rem;
    font-size: 0.82rem;
}

.wreck-cause.picked[b-0mdj3p5i53] {
    font-weight: 600;
}

/* #488 — THE VALVE BOARD. A damage-control mimic drawn from the ship own geometry: bow taper, transom,
   spine and every compartment in its real place. You point at the PLACE; the name is written in it. */

.vent-actions[b-0mdj3p5i53] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.9rem;
    padding-top: 0.7rem;
    border-top: 1px solid rgba(150, 170, 190, 0.22);
}

/* THE LOG SHE IS STILL KEEPING. The board could only ever show one line, so anything that happened while
   the captain was looking at the map — a pump banking, a soak finishing, a hatch that would not move — was
   gone before it could be read. Newest at the top; scrolls rather than pushing the switches off the
   screen. */
.vent-history[b-0mdj3p5i53] {
    flex-basis: 100%;
    margin-top: 0.45rem;
    max-height: 9.5rem;
    overflow-y: auto;
    border-top: 1px solid rgba(120, 140, 165, 0.25);
    padding-top: 0.3rem;
}

.vent-history-head[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.68rem;
    letter-spacing: 0.12em;
    color: #6f7f95;
    margin-bottom: 0.2rem;
}

.vent-history-line[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    /* The owner's own ruling on this panel's log: amber on black, and big enough to read standing back
       from it. Nothing here is a footnote. */
    font-size: 0.85rem;
    line-height: 1.5;
    color: #d8b877;
}

/* The one just written is brighter — it is the line you came to read. */
.vent-history-line:first-of-type[b-0mdj3p5i53] { color: #f2d79b; }

.vent-picked[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.74rem;
    color: #e0b25a;
    margin-right: 0.3rem;
}

.vent-refusal[b-0mdj3p5i53], .vent-message[b-0mdj3p5i53] {
    flex-basis: 100%;
    /* The board is read standing back from it, so the log reads at arm's length. */
    font-size: 0.95rem;
    color: #e39089;
    margin-top: 0.3rem;
    line-height: 1.45;
}

.vent-message[b-0mdj3p5i53] { color: #d7e0f2; font-style: italic; }

/* The mimic itself. Drawn in DECK UNITS with Y negated, so a compartment sits where it sits on the deck —
   the map cannot drift from the ship, because it is the ship's own numbers. */
.vent-map[b-0mdj3p5i53] {
    display: block;
    width: 100%;
    max-height: 46vh;
    margin: 0.2rem 0 0.5rem;
}

.vent-hull[b-0mdj3p5i53] {
    fill: rgba(10, 14, 20, 0.9);
    stroke: rgba(170, 190, 210, 0.75);
    stroke-width: 0.28;
}

/* No rules of its own. Owner: "no difference with it and the others" — so it takes .vent-area rect whole,
   fill, stroke and every state, and there is nothing here that could ever make it drift. */

/* THE SAME TEXT THE ROOMS GET. Owner: "the grey text like is in the other spaces could be in the spine
   also … why is it any different in the diagram now?" No good reason — it was styled as a faint background
   annotation back when the corridor was scenery you could not select. It is a region you pick like any
   other now, so it reads like one: same fill, same size, same tracking as a compartment's name. */
.vent-spine-label[b-0mdj3p5i53] {
    fill: #cddaeb;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 1.55px;
    letter-spacing: 0.12px;
}

/* Each compartment is a button that looks like a room. */
.vent-area[b-0mdj3p5i53] { cursor: pointer; }

.vent-area rect[b-0mdj3p5i53] {
    fill: rgba(24, 32, 42, 0.9);
    stroke: rgba(150, 170, 190, 0.45);
    stroke-width: 0.16;
    transition: fill 90ms linear;
}

/* The compartment names are INJECTED AS MARKUP — Razor reserves the <text> tag for its own control flow,
   so they are built in code and carry no CSS-isolation scope attribute. ::deep is how this sheet reaches
   them. Kept under .vent-area so the spine label, which is a real element, keeps its own styling. */
.vent-map[b-0mdj3p5i53]  .vent-area text {
    fill: #cddaeb;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 1.55px;
    letter-spacing: 0.12px;
    pointer-events: none;
}

.vent-map[b-0mdj3p5i53]  .vent-area .vent-tag { fill: #8fa1b8; font-size: 1.35px; }
.vent-map[b-0mdj3p5i53]  .vent-area .alive-tag { fill: #e8b45c; }
.vent-map[b-0mdj3p5i53]  .vent-area .here-tag { fill: #78dcaa; }
.vent-map[b-0mdj3p5i53]  .vent-area .pumping-tag { fill: #7fd4e8; }
.vent-map[b-0mdj3p5i53]  .vent-area .banked-tag { fill: #78dcaa; }
.vent-map[b-0mdj3p5i53]  .vent-area.vented text { fill: #4d586d; }

.vent-area:hover rect[b-0mdj3p5i53] { fill: rgba(38, 50, 64, 0.95); }

/* Sealed reads as a solid door onto the spine; open is a broken one. */
.vent-door[b-0mdj3p5i53] {
    stroke: rgba(150, 170, 190, 0.5);
    stroke-width: 0.34;
    stroke-dasharray: 0.7 0.7;
}
.vent-area.sealed .vent-door[b-0mdj3p5i53] { stroke: #e0b25a; stroke-dasharray: none; stroke-width: 0.5; }
.vent-area.sealed rect[b-0mdj3p5i53] { fill: rgba(30, 40, 52, 0.95); }

.vent-area.vented rect[b-0mdj3p5i53] { fill: rgba(4, 6, 9, 0.98); stroke-dasharray: 0.6 0.6; }

.vent-area.here rect[b-0mdj3p5i53] { stroke: rgba(120, 220, 170, 0.85); stroke-width: 0.34; }
.vent-area.picked rect[b-0mdj3p5i53] { stroke: #e0b25a; stroke-width: 0.42; }

/* THE CORRIDOR IS DRAWN AS A SPACE LIKE ANY OTHER. My first pass kept it recessed and border-less on the
   theory that a corridor is "the space BETWEEN the rooms" and should read as different. Owner, looking at
   it: "it should look the same in the panel and be selectable." He is right and the theory was backwards —
   it IS one of the volumes on this board now, it takes the same actions, holds the same vacuum and keeps
   the same clock, so drawing it as scenery only teaches the captain not to press it. Everything below it
   inherits from .vent-area, so hover, picked, standing-in-it and blown all come for free and can never
   drift out of step with the compartments again. */

/* The label is a real element rather than injected markup, so it would otherwise eat the clicks aimed at
   the band underneath it — the one part of the corridor most likely to be pressed. */
.vent-spine-label[b-0mdj3p5i53] { pointer-events: none; }

/* THE CORRIDOR'S CLOCK. A real element, so none of the ::deep rules that size the compartments' injected
   labels reach it — and with no size of its own it fell back to the browser's 16px inside a viewBox
   measured in DECK UNITS, i.e. about ten times the length of the ship. It sat across the whole hull. Every
   text node on this map needs its size stated here; there is no inherited default worth having. */
.vent-spine-tag[b-0mdj3p5i53] {
    fill: #8fa1b8;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 1.35px;
    letter-spacing: 0.12px;
    pointer-events: none;
}

.vent-spine-tag.pumping-tag[b-0mdj3p5i53] { fill: #7fd4e8; }
.vent-spine-tag.banked-tag[b-0mdj3p5i53] { fill: #78dcaa; }
.vent-spine-tag.here-tag[b-0mdj3p5i53] { fill: #78dcaa; }

/* THE CAPTAIN'S OWN CONDITION, on the board. The canvas pips are behind this panel's backdrop, so while
   the board is open they might as well not exist — and the board is exactly where a captain stands still
   with their hands full while something walks up behind them. */
.vent-condition[b-0mdj3p5i53] {
    display: flex;
    align-items: center;
    gap: 0.32rem;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.74rem;
    letter-spacing: 0.06em;
    color: #8fa1b8;
    margin: 0.15rem 0 0.35rem;
}

.vent-condition-label[b-0mdj3p5i53] { color: #6f7f95; }
.vent-condition-word[b-0mdj3p5i53] { color: #b9c8dc; }

.cond-pip[b-0mdj3p5i53] {
    width: 0.62rem;
    height: 0.62rem;
    background: #d1584f;
    border: 1px solid rgba(255, 170, 160, 0.45);
}

/* A spent pip is a hollow socket, not a missing square — you should be able to count what you have LEFT
   and what you have SPENT in the same glance. */
.cond-pip.spent[b-0mdj3p5i53] { background: transparent; border-color: rgba(140, 90, 88, 0.55); }

/* One pip left stops being a readout and starts being an alarm. */
.vent-condition.critical .cond-pip[b-0mdj3p5i53] { animation: cond-pulse-b-0mdj3p5i53 900ms ease-in-out infinite; }
.vent-condition.critical .vent-condition-word[b-0mdj3p5i53] { color: #ff8a7d; }

@keyframes cond-pulse-b-0mdj3p5i53 {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.35; }
}

/* The full reading for the selected room, spelled out under the map. */
.vent-readout[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.98rem;
    /* Was a grey-blue that sat almost on top of the board's own background — the one line the captain most
       needs to read, styled like a disclaimer. Amber on black instead (owner: "that yellow font against
       black works great"), with the ALIVE state pushed hotter so the two never blur into one another. */
    color: #e8c07a;
    padding: 0.35rem 0.1rem 0;
    line-height: 1.45;
}
.vent-readout.alive[b-0mdj3p5i53] { color: #ff9a52; font-weight: 700; }

/* ── The pressure gauge on a loaded door ────────────────────────────────────────────────────────────
   The needle sits hard over on its stop and does not move. That IS the readout: there is no nuance in
   ten tonnes, and a dial pinned at MAX says it faster than any sentence. */
.pressure-door[b-0mdj3p5i53] { max-width: 30rem; }

.pd-gauge[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    margin: 0.6rem 0 0.4rem;
}

.pd-face[b-0mdj3p5i53] {
    position: relative;
    width: 11rem;
    height: 5.9rem;
    border: 2px solid rgba(170, 190, 210, 0.5);
    border-bottom-width: 3px;
    border-radius: 11rem 11rem 0.3rem 0.3rem;
    background:
        radial-gradient(circle at 50% 100%, rgba(224, 178, 90, 0.13), transparent 62%),
        rgba(10, 14, 20, 0.95);
    overflow: hidden;
}

/* Pinned at the top of its travel — a needle against the stop, not a needle at rest. */
.pd-needle[b-0mdj3p5i53] {
    position: absolute;
    left: 50%;
    bottom: 0.25rem;
    width: 2px;
    height: 4.6rem;
    background: linear-gradient(to top, #e0b25a, #ff6b5a);
    transform-origin: 50% 100%;
    transform: rotate(74deg);
    box-shadow: 0 0 6px rgba(255, 107, 90, 0.7);
}

.pd-face[b-0mdj3p5i53]::after {           /* the hub the needle turns on */
    content: "";
    position: absolute;
    left: 50%;
    bottom: 0.25rem;
    width: 0.55rem;
    height: 0.55rem;
    margin-left: -0.275rem;
    margin-bottom: -0.275rem;
    border-radius: 50%;
    background: rgba(190, 205, 220, 0.85);
}

.pd-scale[b-0mdj3p5i53] {
    position: absolute;
    inset: auto 0.55rem 0.35rem;
    display: flex;
    justify-content: space-between;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.62rem;
    color: #6f7f94;
    letter-spacing: 0.4px;
}
.pd-scale .hot[b-0mdj3p5i53] { color: #ff6b5a; }

.pd-sides[b-0mdj3p5i53] {
    display: flex;
    gap: 1.1rem;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.72rem;
}
.pd-sides .vac[b-0mdj3p5i53] { color: #7fb4e8; }
.pd-sides .air[b-0mdj3p5i53] { color: #78dcaa; }

/* ── The clocks, readable from the corridor ─────────────────────────────────────────────────────────
   The pump and the vacuum soak have to be visible while the captain is out fighting for the lane, not
   only from the board they walked away from. Small, top-right, out of the tracker's way. */
.wreck-clocks[b-0mdj3p5i53] {
    position: fixed;
    top: 4.6rem;
    right: 0.9rem;
    z-index: 6;
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    padding: 0.4rem 0.6rem;
    border: 1px solid rgba(170, 190, 210, 0.28);
    border-radius: 0.3rem;
    background: rgba(8, 11, 16, 0.82);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.72rem;
    pointer-events: none;
}

.wc-line[b-0mdj3p5i53] { display: flex; align-items: baseline; gap: 0.5rem; color: #8fa1b8; }
.wc-line.pump[b-0mdj3p5i53] { color: #7fd4e8; }
.wc-tag[b-0mdj3p5i53] { letter-spacing: 0.5px; }
.wc-room[b-0mdj3p5i53] { color: #cddaeb; }
.wc-time[b-0mdj3p5i53] { margin-left: auto; color: #e0b25a; font-variant-numeric: tabular-nums; }
.wc-note[b-0mdj3p5i53] { color: #78dcaa; font-size: 0.66rem; }

/* ── Making sure ────────────────────────────────────────────────────────────────────────────────────
   The scuttling panel and the card you read afterwards from your own cockpit. */
.scuttle-panel[b-0mdj3p5i53], .scuttle-epitaph[b-0mdj3p5i53] { max-width: 34rem; }

.scuttle-art[b-0mdj3p5i53] {
    display: block;
    width: 100%;
    border-radius: 0.25rem;
    margin: 0.4rem 0 0.6rem;
    border: 1px solid rgba(170, 190, 210, 0.25);
}

.scuttle-epitaph-text[b-0mdj3p5i53] {
    white-space: pre-wrap;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.82rem;
    line-height: 1.6;
    color: #cddaeb;
    padding: 0.2rem 0.2rem 0.6rem;
}

/* When there WAS something. The paragraph about what you heard gets the weight. */
.scuttle-epitaph-text.heard[b-0mdj3p5i53] { color: #e8b45c; }

/* ── The board's log ────────────────────────────────────────────────────────────────────────────────
   Both lines together, under the switches: what the instrument said, then what the handle did. They
   used to sit on opposite sides of the button row, which read as one line hidden behind the keys.
   Reserves room for two lines so the panel does not jump as they appear. */
.vent-log[b-0mdj3p5i53] {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    min-height: 2.6rem;
    padding-top: 0.5rem;
    margin-top: 0.5rem;
    border-top: 1px solid rgba(150, 170, 190, 0.18);
}

.vent-log:empty[b-0mdj3p5i53] { display: none; }

/* Inside the log they are plain rows, not flex items borrowed from the action bar. */
.vent-log .vent-message[b-0mdj3p5i53],
.vent-log .vent-readout[b-0mdj3p5i53] {
    flex-basis: auto;
    margin-top: 0;
}

/* ── The operating log, as a card over the board ─────────────────────────────────────────────────────
   Sits ABOVE the valve board's own backdrop, so the board is visibly inert behind it until dismissed. */
.vent-read-backdrop[b-0mdj3p5i53] {
    z-index: calc(var(--z-desks-popups) + 140);
}

.vent-read-card[b-0mdj3p5i53] {
    max-width: 42rem;
    text-align: center;
}

.vent-read-die[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.95rem;
    letter-spacing: 1.2px;
    color: #8fa1b8;
    margin: 0.5rem 0 0.15rem;
}

/* The sentence itself, given the size it earns. */
.vent-read-line[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    /* It has the whole screen and it is the most important sentence the mechanic produces. */
    font-size: clamp(1.15rem, 2.6vw, 1.7rem);
    line-height: 1.45;
    color: #cddaeb;
    padding: 0.5rem 0.6rem 0.7rem;
}
.vent-read-line.alive[b-0mdj3p5i53] { color: #e8b45c; }

/* When something is warm in there the card itself takes the warning colour, so the answer registers
   before a word of it is read. */
.vent-read-card.alive[b-0mdj3p5i53] { border-color: rgba(232, 180, 92, 0.55); }

.vent-read-foot[b-0mdj3p5i53] {
    font-size: 0.98rem;
    line-height: 1.5;
    color: #c3d1e4;
    border-top: 1px solid rgba(150, 170, 190, 0.18);
    padding-top: 0.55rem;
    margin-top: 0.2rem;
}

/* The overload clock: the loudest thing on the HUD, because the whole scene is walking away from the
   panel that owns it. Past the recall point it stops counting down and starts stating a fact. */
.wc-line.overload[b-0mdj3p5i53] { color: #ff8a72; }
.wc-line.overload .wc-time[b-0mdj3p5i53] { color: #ff6b5a; font-weight: 700; }
.wc-line.overload.no-recall[b-0mdj3p5i53] { color: #ff5a45; }
.wc-line.overload.no-recall .wc-tag[b-0mdj3p5i53] { letter-spacing: 1px; }

/* Until a room is picked the board has no switches to offer, so it says so rather than showing a
   lone "Step away" and reading as broken. */
.vent-pick-hint[b-0mdj3p5i53] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.8rem;
    color: #8fa1b8;
    text-align: center;
    padding: 0.7rem 0.2rem 0.2rem;
    margin-top: 0.5rem;
    border-top: 1px solid rgba(150, 170, 190, 0.18);
}

/* #528 · THE STORY PLATE — the non-blocking half of the reveal idiom (owner: the pop-up "should happen
   universally … as long as it does not block the playing too much"). Bottom-left, above the deck HUD and below
   the modals, pointer-events NONE so it can never eat a click during a fight. */
.story-plate[b-0mdj3p5i53] {
    position: absolute;
    left: 1rem;
    bottom: 5.5rem;
    z-index: calc(var(--z-desks-popups) + 40);
    display: flex;
    gap: 0.6rem;
    align-items: stretch;
    width: min(30rem, 66vw);
    padding: 0.5rem;
    background: rgba(8, 11, 17, 0.92);
    border: 1px solid rgba(255, 180, 90, 0.35);
    border-radius: 0.5rem;
    box-shadow: 0 0.6rem 2rem rgba(0, 0, 0, 0.55);
    pointer-events: none;
    animation: story-plate-in-b-0mdj3p5i53 260ms ease-out;
}

@keyframes story-plate-in-b-0mdj3p5i53 {
    from { opacity: 0; transform: translateY(0.5rem); }
    to   { opacity: 1; transform: translateY(0); }
}

.story-plate-art[b-0mdj3p5i53] {
    width: 8.5rem;
    height: 5.4rem;
    object-fit: cover;
    border-radius: 0.35rem;
    background: #05070c;
    flex: 0 0 auto;
}

.story-plate-words[b-0mdj3p5i53] { min-width: 0; }

.story-plate-title[b-0mdj3p5i53] {
    color: #ffd9a0;
    font: 600 0.82rem/1.2 monospace;
    letter-spacing: 0.03em;
    margin-bottom: 0.25rem;
}

.story-plate-caption[b-0mdj3p5i53] {
    color: rgba(232, 236, 244, 0.92);
    font-size: 0.78rem;
    line-height: 1.3;
}

/* #528 · the collector's hail, painted. The art sits BEHIND the heading rather than replacing it. */
.busted-collector-hail[b-0mdj3p5i53] { position: relative; overflow: hidden; }

.busted-hail-art[b-0mdj3p5i53] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0.5;
    z-index: 0;
}

.busted-collector-hail > span[b-0mdj3p5i53] { position: relative; z-index: 1; }

/* #538 · the captain's remote — a small handheld affordance on the deck HUD. It stays visible while an excursion
   is live, because the order it carries is the one whose absence gets a captain shot.

   IT SITS BOTTOM-LEFT, ABOVE THE FIRST-PERSON TOGGLE, AND THE FIRST PLACEMENT WAS WRONG. Owner, on seeing it:
   "look at the sanity and health meters now overlap" — and they did, because I put this at top 3.2rem, which is
   directly on the nerve readout AND on the five condition pips beneath it. Both meters, buried by a button.

   The rule was already written down forty lines up, for the first-person toggle: "on a surface excursion the
   enlarged SANITY gauge owns the top-left corner … nothing buries the gauge, and the toggle stays plainly
   pressable (#212 affordances-never-hide)". The toggle steps down and to the right for exactly this reason. I
   added a control to that corner without reading the rule that corner already had — so this now follows the
   same precedent it should have followed first time: same column as the toggle, one row above it. */
.captains-remote-btn[b-0mdj3p5i53] {
    position: absolute;
    left: 0.75rem;
    bottom: 5.2rem;
    z-index: calc(var(--z-desks-popups) + 30);
    opacity: 0.92;
}
/* /Pages/Stations/Captain.razor.rz.scp.css */
/* The captain's position (PR-15): a stately, uncluttered room. The mission statement gets its
   own quiet block up top (70% rule doesn't apply here the way it does to instrument-heavy desks —
   there's no "big instrument", just the one thing that matters: the current order and the list of
   orders that could replace it). */

.captain-desk[b-9hhpoud1ar] {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    height: 100%;
    overflow-y: auto;
}

.captain-articles[b-9hhpoud1ar] {
    text-align: center;
    padding: 1.5rem 1rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.12);
    flex: 0 0 auto;
}

.captain-articles-label[b-9hhpoud1ar] {
    text-transform: uppercase;
    letter-spacing: 0.15em;
    font-size: 0.8rem;
    color: rgba(224, 228, 236, 0.6);
    margin-bottom: 0.5rem;
}

.captain-articles-mission[b-9hhpoud1ar] {
    font-size: 2rem;
    font-weight: 600;
}

.captain-groups[b-9hhpoud1ar] {
    display: grid;
    /* 12.5rem min lets all five kind-groups sit in one row at the common 1440px-wide desk
       (desk-content is ~1232px there after the chip-strip padding); anything narrower wraps
       gracefully and scrolls via .captain-desk's overflow-y. */
    grid-template-columns: repeat(auto-fit, minmax(12.5rem, 1fr));
    gap: 1.25rem;
    flex: 1 1 auto;
}

.captain-group[b-9hhpoud1ar] {
    background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 0.5rem;
    padding: 1rem;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.captain-group-header[b-9hhpoud1ar] {
    font-size: 1.1rem;
    font-weight: 600;
    margin-bottom: 0.35rem;
}

.captain-group-icon[b-9hhpoud1ar] {
    display: inline-block;
    width: 1.4rem;
}

.captain-group-flavor[b-9hhpoud1ar] {
    font-style: italic;
    color: rgba(224, 228, 236, 0.65);
    font-size: 0.85rem;
    margin-bottom: 0.75rem;
}

.captain-group-cards[b-9hhpoud1ar] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    overflow-y: auto;
}

.captain-card[b-9hhpoud1ar] {
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.14);
    border-radius: 0.35rem;
    padding: 0.6rem 0.8rem;
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease;
}

.captain-card:hover[b-9hhpoud1ar],
.captain-card:focus-visible[b-9hhpoud1ar] {
    border-color: rgba(120, 200, 255, 0.7);
    outline: none;
}

.captain-card-selected[b-9hhpoud1ar] {
    background: rgba(120, 200, 255, 0.18);
    border-color: rgba(120, 200, 255, 0.9);
    font-weight: 600;
}

.captain-empty[b-9hhpoud1ar] {
    color: rgba(224, 228, 236, 0.5);
    font-size: 0.85rem;
    font-style: italic;
}

/* Quests tab (go-ashore contracts): read-only ledger cards, colour-accented by state. */
.captain-quest-active[b-9hhpoud1ar],
.captain-quest-complete[b-9hhpoud1ar],
.captain-quest-paid[b-9hhpoud1ar] {
    cursor: default;
    border-left-width: 3px;
}

.captain-quest-active[b-9hhpoud1ar] { border-left-color: rgba(255, 200, 120, 0.9); }
.captain-quest-complete[b-9hhpoud1ar] { border-left-color: rgba(120, 230, 150, 0.95); }
.captain-quest-paid[b-9hhpoud1ar] { border-left-color: rgba(150, 160, 180, 0.6); opacity: 0.72; }

.captain-quest-active:hover[b-9hhpoud1ar],
.captain-quest-active:focus-visible[b-9hhpoud1ar],
.captain-quest-complete:hover[b-9hhpoud1ar],
.captain-quest-complete:focus-visible[b-9hhpoud1ar],
.captain-quest-paid:hover[b-9hhpoud1ar],
.captain-quest-paid:focus-visible[b-9hhpoud1ar] {
    border-color: rgba(255, 255, 255, 0.14); /* no interactive highlight — these aren't buttons */
    border-left-width: 3px;
}

.captain-quest-active:hover[b-9hhpoud1ar] { border-left-color: rgba(255, 200, 120, 0.9); }
.captain-quest-complete:hover[b-9hhpoud1ar] { border-left-color: rgba(120, 230, 150, 0.95); }
.captain-quest-paid:hover[b-9hhpoud1ar] { border-left-color: rgba(150, 160, 180, 0.6); }

.captain-quest-foot[b-9hhpoud1ar] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 0.75rem;
    margin-top: 0.45rem;
}

/* #175: the live next-action line — parcel amber, a touch brighter than the blurb so the eye lands
   on "what to do now" without shouting. */
.captain-quest-next[b-9hhpoud1ar] { color: #ebbe78; font-weight: 600; }

.captain-quest-status[b-9hhpoud1ar] { font-size: 0.8rem; font-weight: 600; }
.captain-quest-status-active[b-9hhpoud1ar] { color: #ffd479; }
.captain-quest-status-complete[b-9hhpoud1ar] { color: #9fe6b0; }
.captain-quest-status-paid[b-9hhpoud1ar] { color: rgba(224, 228, 236, 0.55); }

/* PR-WIRE — the favor-bank accounts on the ledger: a soft gold left border marks a money line. */
.captain-ledger-account[b-9hhpoud1ar] { border-left: 3px solid rgba(255, 212, 121, 0.6); }
.captain-account-txn[b-9hhpoud1ar] { line-height: 1.4; }

.captain-quest-reward[b-9hhpoud1ar] {
    font-weight: 700;
    color: #9fe6b0;
    white-space: nowrap;
}

/* M26: the status board — every station's chip writ large; click jumps to the desk. */
.captain-view-toggle[b-9hhpoud1ar] {
    flex: 0 0 auto;
    display: flex;
    justify-content: center;
    padding-top: 0.5rem;
}

.captain-status-grid[b-9hhpoud1ar] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
    gap: 1.25rem;
    flex: 1 1 auto;
    align-content: start;
}

.captain-status-card[b-9hhpoud1ar] {
    background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 0.5rem;
    padding: 1rem;
    cursor: pointer;
    transition: border-color 0.15s ease, background 0.15s ease;
}

.captain-status-card:hover[b-9hhpoud1ar],
.captain-status-card:focus-visible[b-9hhpoud1ar] {
    border-color: rgba(120, 200, 255, 0.7);
    outline: none;
}

.captain-status-line[b-9hhpoud1ar] {
    font-size: 1.05rem;
    margin-top: 0.25rem;
}

.captain-status-dim[b-9hhpoud1ar] {
    color: rgba(224, 228, 236, 0.65);
    font-size: 0.9rem;
}

/* Point-and-shoot PR: the captain's weapons authority. */
.captain-weapons-authority[b-9hhpoud1ar] {
    margin-top: 0.5rem;
}

.captain-fire-at-will[b-9hhpoud1ar] {
    cursor: pointer;
    user-select: none;
}

/* "Set course to a start point…" — a quiet chart-room control under the view tabs; reopens Map's
   start-point picker. Centred, understated (it's a travel/testing affordance, not a primary order). */
.captain-start-jump[b-9hhpoud1ar] {
    display: flex;
    justify-content: center;
    flex: 0 0 auto;
    margin-top: -0.5rem;
}

/* ── CREW TEMPERATURE ──────────────────────────────────────────────────────────────────────────────
   The crew's report on the captain. Styled as a sheet handed up from below decks rather than as a
   dashboard: the standing reads like a verdict, the dimensions read like a survey, and the crew's own
   sentences are the part the eye lands on. Deliberately no numerals — the bands and the bars carry it,
   for the same reason the nerve gauge is pips: a crew does not have an opinion to the nearest percent. */

.crew-standing[b-9hhpoud1ar] {
    border-left: 3px solid #6f7f95;
    padding: 0.5rem 0.75rem;
    margin: 0.5rem 0 0.75rem;
    background: rgba(255, 255, 255, 0.03);
}

.crew-standing-word[b-9hhpoud1ar] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.78rem;
    letter-spacing: 0.16em;
    color: #b9c8dc;
}

.crew-standing-line[b-9hhpoud1ar] { font-size: 0.95rem; line-height: 1.5; color: #d8e2ee; margin-top: 0.2rem; }

/* The escalation, coloured so the last two are impossible to read as routine. */
.crew-standing-solid[b-9hhpoud1ar] { border-left-color: #78dcaa; }
.crew-standing-grumbling[b-9hhpoud1ar] { border-left-color: #d8b877; }
.crew-standing-petition[b-9hhpoud1ar] { border-left-color: #e0a35a; }
.crew-standing-ultimatum[b-9hhpoud1ar] { border-left-color: #e07a4a; }
.crew-standing-marooning[b-9hhpoud1ar] { border-left-color: #d1584f; background: rgba(209, 88, 79, 0.08); }

.crew-worst[b-9hhpoud1ar] {
    font-size: 0.9rem;
    color: #e8c07a;
    margin: 0 0 0.75rem;
}

.crew-line[b-9hhpoud1ar] { margin-bottom: 0.85rem; }

.crew-line-head[b-9hhpoud1ar] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 0.5rem;
}

.crew-dim[b-9hhpoud1ar] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.72rem;
    letter-spacing: 0.12em;
    color: #8fa1b8;
}

.crew-band[b-9hhpoud1ar] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.72rem;
    letter-spacing: 0.06em;
}

.crew-band-mutinous[b-9hhpoud1ar] { color: #d1584f; }
.crew-band-sour[b-9hhpoud1ar] { color: #e07a4a; }
.crew-band-grumbling[b-9hhpoud1ar] { color: #d8b877; }
.crew-band-content[b-9hhpoud1ar] { color: #9fd8b0; }
.crew-band-devoted[b-9hhpoud1ar] { color: #78dcaa; }

.crew-bar[b-9hhpoud1ar] {
    height: 0.3rem;
    background: rgba(255, 255, 255, 0.07);
    margin: 0.22rem 0 0.3rem;
}

.crew-bar-fill[b-9hhpoud1ar] { height: 100%; background: #6f8fb0; }

/* The part that matters. An anonymous sentence in the crew's voice does more than any gauge. */
.crew-quote[b-9hhpoud1ar] {
    font-size: 0.95rem;
    line-height: 1.55;
    color: #cddaeb;
    font-style: italic;
}

.crew-cohesion[b-9hhpoud1ar] {
    font-size: 0.88rem;
    color: #8fa1b8;
    border-top: 1px solid rgba(120, 140, 165, 0.25);
    padding-top: 0.5rem;
    margin-top: 0.75rem;
}
/* /Pages/Stations/DarkWeb.razor.rz.scp.css */
/* Standalone floating panel — same "instrument card" language as the tracking post, mirrored to
   the right-middle band of the map HUD (tracking post owns left-middle). */

.dark-web-card[b-mnro3md5x6] {
    position: absolute;
    right: 0.75rem;
    top: 50%;
    transform: translateY(-50%);
    width: 24rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

.dark-web-scroll[b-mnro3md5x6] {
    max-height: 70vh;
    overflow-y: auto;
}

/* Full-screen desk mode: the market is the dark-web node's detail pane in the Comms tree now
   (comms-tree rebuild) — one scrolling column, no console split. */
.dark-web-desk[b-mnro3md5x6] {
    position: static;
    width: 100%;
    height: 100%;
    transform: none;
}

.dark-web-desk-body[b-mnro3md5x6] {
    max-height: none;
    height: calc(100% - 2.25rem);
    overflow-y: auto;
}
/* /Pages/Stations/DeskChips.razor.rz.scp.css */
/* Thin edge strip (StationDesks.md rule 2): narrow enough that it never blocks the map, but
   pointer-events auto so its chips are clickable everywhere it's docked. */

.desk-chip-strip[b-txi0vsjewn] {
    position: absolute;
    top: 4.75rem;
    right: 0.5rem;
    bottom: 0.75rem;
    width: 9.5rem;
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    overflow-y: auto;
    pointer-events: auto;
    z-index: 30;
}

.desk-chip[b-txi0vsjewn] {
    background: rgba(8, 12, 20, 0.85);
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: 0.35rem;
    padding: 0.35rem 0.5rem;
    color: #e0e4ec;
    font-size: 0.72rem;
    line-height: 1.2;
    cursor: pointer;
}

.desk-chip:hover[b-txi0vsjewn],
.desk-chip:focus-visible[b-txi0vsjewn] {
    border-color: rgba(120, 200, 255, 0.6);
    outline: none;
}

.desk-chip-title[b-txi0vsjewn] {
    font-weight: 600;
    margin-bottom: 0.1rem;
}

.desk-chip-icon[b-txi0vsjewn] {
    display: inline-block;
    width: 1rem;
}

.desk-chip-line[b-txi0vsjewn] {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* /Pages/Stations/Galley.razor.rz.scp.css */
/* The Galley owns the screen (70% rule) — news wire on the left gets the lion's share, the rum
   locker sits as a fixed-width card on the right so it doesn't stretch awkwardly at wide sizes.

   Phase 2 (3D renovation): the desk sits in front of a raster bar backdrop (the same "Space Bar"
   painting as the deck cantina, but a sit-at-the-counter close-up) so "Pour a tot" reads as an
   actual bar. The backdrop is heavily darkened by a gradient so the news text and rum card stay
   legible on top — the hybrid-look guardrail: raster behind, vector/HTML UI readable in front. */

.galley-desk[b-6nntp1o4bd] {
    display: flex;
    gap: 1.5rem;
    height: 100%;
    padding: 1rem;
    border-radius: 0.5rem;
    background:
        linear-gradient(rgba(10, 12, 16, 0.82), rgba(10, 12, 16, 0.88)),
        url('art/the-space-bar-desk.jpg') center / cover no-repeat;
}

.galley-news[b-6nntp1o4bd] {
    flex: 1 1 auto;
    min-width: 0;
    overflow-y: auto;
}

.galley-rum[b-6nntp1o4bd] {
    flex: 0 0 20rem;
    max-width: 20rem;
    background: rgba(12, 14, 18, 0.55);
    border: 1px solid rgba(255, 200, 120, 0.18);
    border-radius: 0.5rem;
    padding: 1rem;
    height: fit-content;
    backdrop-filter: blur(2px);
}

.galley-headline[b-6nntp1o4bd] {
    font-size: 1.3rem;
}

.galley-wire-list[b-6nntp1o4bd] {
    max-height: 40vh;
    overflow-y: auto;
}
/* /Pages/Stations/LocalSpace.razor.rz.scp.css */
/* Standalone floating panel — same "instrument card" language as the tracking post, mirrored to
   the right-middle band of the map HUD (tracking post owns left-middle). */

.local-space-card[b-p5x17cqzvn] {
    position: absolute;
    right: 0.75rem;
    top: 50%;
    transform: translateY(-50%);
    width: 22rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

.local-space-icon[b-p5x17cqzvn] {
    width: 1.25rem;
    text-align: center;
}

/* Master–detail (owner: "like File Explorer"): the tree of places of business on the left is
   deliberately LEAN — name plus one reachability badge per row, nothing else — and the detail
   pane on the right can afford to be generous about exactly the one selected node. */
.local-space-master-detail[b-p5x17cqzvn] {
    display: grid;
    grid-template-columns: minmax(13rem, 1fr) 1.6fr;
    gap: 0 1rem;
    height: 100%;
    min-height: 0;
}

.local-space-tree[b-p5x17cqzvn] {
    overflow-y: auto;
    min-height: 0;
    border-right: 1px solid rgba(255, 255, 255, 0.1);
    padding-right: 0.5rem;
}

.local-space-detail[b-p5x17cqzvn] {
    overflow-y: auto;
    min-height: 0;
}

.local-space-node[b-p5x17cqzvn] {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.18rem 0.35rem;
    border-radius: 0.3rem;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.local-space-node:hover[b-p5x17cqzvn] {
    background: rgba(255, 255, 255, 0.05);
}

.local-space-node-selected[b-p5x17cqzvn] {
    background: rgba(120, 220, 255, 0.12);
    outline: 1px solid rgba(120, 220, 255, 0.35);
}

.local-space-progress[b-p5x17cqzvn] {
    height: 6px;
}

/* Full-screen desk mode (PR-11, widened PR-13 as the Trade desk grew a third column for the
   cargo manifest): the contact list still gets real width and a multi-column layout instead of
   squeezing it into a narrow card, just tuned to a narrower first column now that the dock
   market and manifest sit alongside it. */
.local-space-desk[b-p5x17cqzvn] {
    position: static;
    width: 100%;
    height: 100%;
    transform: none;
}

.local-space-desk-body[b-p5x17cqzvn] {
    height: calc(100% - 2.25rem);
    overflow-y: hidden;
    display: flex;
    flex-direction: column;
    font-size: 0.95rem;
}

.local-space-desk-body .local-space-master-detail[b-p5x17cqzvn] {
    flex: 1 1 auto;
}

/* The per-post action list (owner: "clear actions and UI that signals what we can do with
   that particular post") — buy/sell lines grouped under the contact they belong to. */
.local-space-actions[b-p5x17cqzvn] {
    max-width: 30rem;
}

.local-space-hint[b-p5x17cqzvn] {
    font-size: 0.74rem;
    line-height: 1.2;
}

/* Breadcrumbs at the top of the detail pane — the file-manager convention that pays off most
   (design consult): always know where you are, click any segment to climb back up. */
.local-space-breadcrumbs[b-p5x17cqzvn] {
    font-size: 0.78rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.local-space-breadcrumbs a[b-p5x17cqzvn] {
    text-decoration: none;
}
/* /Pages/Stations/TrackingPost.razor.rz.scp.css */
/* Standalone floating panel — same "instrument card" language as the scope/dock, positioned in
   the otherwise-empty left-middle band of the map HUD. */

.tracking-post-card[b-smr9d5u44u] {
    position: absolute;
    left: 0.75rem;
    top: 50%;
    transform: translateY(-50%);
    width: 24rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

/* Full-screen desk mode (PR-11): the tracking post fills its desk container instead of floating
   as a small card — the rosette grows to a real instrument, the ledger gets room to breathe. */
.tracking-post-desk[b-smr9d5u44u] {
    position: static;
    width: 100%;
    height: 100%;
    transform: none;
    display: flex;
    flex-direction: column;
}

.tracking-post-desk-body[b-smr9d5u44u] {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.tracking-post-desk-top[b-smr9d5u44u] {
    flex: 0 0 auto;
}

.tracking-rosette-big .tracking-rosette-svg[b-smr9d5u44u] {
    width: 320px;
    height: 320px;
}

.tracking-ledger-table[b-smr9d5u44u] {
    display: block;
    overflow-y: auto;
    flex: 1 1 auto;
}

.tracking-ledger-table tbody[b-smr9d5u44u] {
    display: table;
    width: 100%;
    table-layout: fixed;
}

/* Scope wall (PR-12): the specialist's whole-desk instrument — one live scope tile per tracked
   target, filling the remaining desk area. Responsive grid: 1 tile alone, up to 2x2 at 4. */
.scope-wall-grid[b-smr9d5u44u] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    display: grid;
    /* auto-fill (not auto-fit) with a capped track max: a lone tile gets a sane ~19rem square
       instead of stretching to the full desk width — 2x2 naturally once 3-4 tiles are present. */
    grid-template-columns: repeat(auto-fill, minmax(15rem, 19rem));
    justify-content: center;
    gap: 0.75rem;
    align-content: start;
}

.scope-wall-tile[b-smr9d5u44u] {
    display: flex;
    flex-direction: column;
    background: #05070b;
    border: 1px solid rgba(90, 200, 190, 0.35);
    border-radius: 0.4rem;
    overflow: hidden;
    max-width: 19rem;
}

.scope-wall-tile-empty[b-smr9d5u44u] {
    border-style: dashed;
    border-color: rgba(150, 160, 180, 0.3);
    opacity: 0.75;
}

.scope-wall-canvas[b-smr9d5u44u] {
    width: 100%;
    aspect-ratio: 1 / 1;
    display: block;
}

.scope-wall-tile-footer[b-smr9d5u44u] {
    padding: 0.3rem 0.5rem;
    font-size: 0.78rem;
}

.scope-wall-tile-empty-label[b-smr9d5u44u] {
    text-align: center;
    color: rgba(200, 210, 225, 0.55);
    font-style: italic;
    padding: 0.5rem;
}

.tracking-rosette-svg[b-smr9d5u44u] {
    width: 108px;
    height: 108px;
    display: block;
}

.tracking-rosette-envelope[b-smr9d5u44u] {
    fill: rgba(90, 200, 190, 0.10);
    stroke: rgba(90, 200, 190, 0.65);
    stroke-width: 1.2;
}

.tracking-rosette-wedge[b-smr9d5u44u] {
    fill: rgba(255, 210, 80, 0.18);
    stroke: rgba(255, 210, 80, 0.55);
    stroke-width: 1;
}

.tracking-rosette-wedge-active[b-smr9d5u44u] {
    fill: rgba(120, 255, 190, 0.28);
    stroke: rgba(120, 255, 190, 0.85);
}

.tracking-rosette-sunline[b-smr9d5u44u] {
    stroke: rgba(255, 220, 120, 0.5);
    stroke-width: 1;
    stroke-dasharray: 2 2;
}

.tracking-rosette-label[b-smr9d5u44u] {
    fill: rgba(255, 220, 120, 0.9);
    font-size: 10px;
}

.tracking-rosette-ship[b-smr9d5u44u] {
    fill: #e0e4ec;
}

.tracking-progress[b-smr9d5u44u] {
    height: 6px;
}

/* ---- M27: the eyes of the ship ---- */

.tracking-vector[b-smr9d5u44u] {
    stroke-width: 1;
    stroke-opacity: 0.55;
}

.tracking-vector-threat[b-smr9d5u44u] {
    stroke-width: 1.6;
    stroke-dasharray: 4 2;
    stroke-opacity: 0.9;
}

.tracking-prograde-line[b-smr9d5u44u] {
    stroke: rgba(255, 210, 80, 0.9);
    stroke-width: 1.6;
}

.tracking-prograde-tip[b-smr9d5u44u] {
    fill: rgba(255, 210, 80, 0.95);
}

.tracking-heading-line[b-smr9d5u44u] {
    font-size: 0.72rem;
    text-align: center;
    margin-top: 0.2rem;
    max-width: 320px;
}

/* PR-D: a live scope box inside every track card — the card carries the whole nav-grade
   picture beside its own image (owner: "boxes with images. Each has its own"). */
.sensors-main[b-smr9d5u44u] {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    gap: 1rem;
    overflow: hidden;
}

.sensor-card-row[b-smr9d5u44u] {
    display: flex;
    gap: 0.6rem;
    align-items: flex-start;
}

.sensor-card-scope[b-smr9d5u44u] {
    width: 9.25rem;
    aspect-ratio: 1 / 1;
    flex: 0 0 auto;
    border: 1px solid rgba(90, 200, 190, 0.35);
    border-radius: 0.4rem;
    background: #05070b;
}

/* PR-D: the Sensor tasks list — the one telescope's visible queue. */
.sensor-tasks-box[b-smr9d5u44u] {
    border: 1px solid rgba(120, 220, 255, 0.45);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
    font-size: 0.82rem;
    max-height: 11rem;
    overflow-y: auto;
}

.sensor-task-active[b-smr9d5u44u] {
    background: rgba(120, 220, 255, 0.10);
    border-radius: 0.25rem;
}

/* PR-D: the cold-case board — lost locks with live search areas. */
.sensor-lost-box[b-smr9d5u44u] {
    border: 1px solid rgba(255, 150, 100, 0.5);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
    font-size: 0.82rem;
    max-height: 9rem;
    overflow-y: auto;
}

/* PR-D: what the last area scan resolved out of the populated sky. */
.sensors-finds-box[b-smr9d5u44u] {
    border: 1px solid rgba(200, 210, 225, 0.3);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
    font-size: 0.82rem;
    max-height: 8rem;
    overflow-y: auto;
}

.sensors-cards[b-smr9d5u44u] {
    min-height: 0;
    overflow-y: auto;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
    gap: 0.6rem;
    align-content: start;
}

.sensor-card[b-smr9d5u44u] {
    background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(90, 200, 190, 0.3);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
    cursor: pointer;
    font-size: 0.82rem;
}

.sensor-card-live[b-smr9d5u44u] {
    border-color: rgba(120, 255, 190, 0.9);
    background: rgba(120, 255, 190, 0.07);
}

.sensor-card-threat[b-smr9d5u44u] {
    border-color: rgba(255, 90, 90, 0.75);
}

.sensors-radar-box[b-smr9d5u44u] {
    border: 1px solid rgba(255, 90, 90, 0.5);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
    font-size: 0.82rem;
    max-height: 9rem;
    overflow-y: auto;
}

.tracking-quality-bar[b-smr9d5u44u] {
    height: 4px;
    width: 100%;
    background: #1c2230;
    border-radius: 2px;
    margin-top: 2px;
}

.tracking-quality-fill[b-smr9d5u44u] {
    height: 100%;
    background: #7dffb0;
    border-radius: 2px;
}

/* M29: the en-route opportunities card — the cover-story instrument. */
.sensors-opportunity-box[b-smr9d5u44u] {
    border: 1px solid rgba(255, 210, 80, 0.45);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
    font-size: 0.82rem;
    max-height: 9rem;
    overflow-y: auto;
}

/* M29: the transponder hint under the LIT/DARK/FAKE switch. */
.tracking-transponder-hint[b-smr9d5u44u] {
    font-size: 0.72rem;
    line-height: 1.15;
    margin-top: 0.15rem;
}
/* /Pages/Stations/WarRoom.razor.rz.scp.css */
/* Standalone floating panel — same "instrument card" language as the scope/dock/tracking-post,
   positioned in the free right-middle band of the map HUD (traffic board owns top-right, dock
   and scope own bottom-right, tracking-post owns left-middle). */

.war-room-card[b-8bsc2klm95] {
    position: absolute;
    right: 0.75rem;
    top: 50%;
    transform: translateY(-50%);
    width: 26rem;
    max-width: calc(100% - 1.5rem);
    pointer-events: auto;
}

.war-room-heat-gauge[b-8bsc2klm95] {
    font-size: 0.9rem;
    letter-spacing: 0.1rem;
}

.war-room-hunter-warning[b-8bsc2klm95] {
    color: #ff8d7d;
    font-weight: 600;
}

.war-room-scope[b-8bsc2klm95] {
    position: relative;
}

.war-room-scope-svg[b-8bsc2klm95] {
    width: 108px;
    height: 108px;
    display: block;
}

.war-room-view-ring[b-8bsc2klm95] {
    fill: rgba(120, 140, 170, 0.05);
    stroke: rgba(120, 140, 170, 0.35);
    stroke-width: 1;
}

.war-room-weapon-ring[b-8bsc2klm95] {
    fill: none;
    stroke: rgba(255, 140, 90, 0.6);
    stroke-width: 1.2;
    stroke-dasharray: 3 2;
}

.war-room-hunter-ring[b-8bsc2klm95] {
    fill: none;
    stroke: rgba(255, 90, 90, 0.55);
    stroke-width: 1;
    stroke-dasharray: 2 2;
}

.war-room-threat-line[b-8bsc2klm95] {
    stroke: rgba(255, 50, 50, 0.85);
    stroke-width: 1.5;
    stroke-dasharray: 4 2;
    animation: war-room-threat-pulse-b-8bsc2klm95 1.2s ease-in-out infinite;
}

@keyframes war-room-threat-pulse-b-8bsc2klm95 {
    0%, 100% { opacity: 0.35; }
    50% { opacity: 1; }
}

.war-room-ship[b-8bsc2klm95] {
    fill: #e0e4ec;
}

.war-room-hunter-dot[b-8bsc2klm95] {
    fill: #ff2d2d;
    stroke: #ffd9d9;
    stroke-width: 0.6;
}

.war-room-hunter-label[b-8bsc2klm95] {
    font-size: 10px;
    fill: #ff8080;
}

.war-room-dot-compliant[b-8bsc2klm95] {
    fill: #7dffb0;
}

.war-room-dot-stubborn[b-8bsc2klm95] {
    fill: #ff8d7d;
}

.war-room-dot-bribed[b-8bsc2klm95] {
    fill: #ffd27d;
}

.war-room-dot-pod[b-8bsc2klm95] {
    fill: #b0b6c4;
}

.war-room-hail-line[b-8bsc2klm95] {
    color: #7dd3ff;
}

/* Full-screen desk mode (PR-13, StationDesks.md 70% rule): the tactical circle owns ~60% of the
   desk width (3fr : 2fr), the heat gauge blows up in its own corner overlay on the circle, and
   the contact/hunter side-list gets a dedicated scroll column instead of squeezing into a card. */
.war-room-desk[b-8bsc2klm95] {
    position: static;
    width: 100%;
    height: 100%;
    transform: none;
    display: flex;
    flex-direction: column;
}

.war-room-desk-body[b-8bsc2klm95] {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.war-room-desk-grid[b-8bsc2klm95] {
    display: grid;
    grid-template-columns: 3fr 2fr;
    gap: 0 1.5rem;
    flex: 1 1 auto;
    min-height: 0;
}

.war-room-tactical-col[b-8bsc2klm95] {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.war-room-side-col[b-8bsc2klm95] {
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.war-room-range-group .btn[b-8bsc2klm95] {
    font-size: 0.7rem;
    padding: 0.15rem 0.5rem;
}

.war-room-scope-big .war-room-scope-svg[b-8bsc2klm95] {
    width: 100%;
    height: auto;
    max-height: 68vh;
    aspect-ratio: 1 / 1;
}

.war-room-heat-corner[b-8bsc2klm95] {
    position: absolute;
    left: 0.6rem;
    bottom: 0.6rem;
    background: rgba(20, 8, 8, 0.6);
    border: 1px solid rgba(255, 90, 90, 0.35);
    border-radius: 0.4rem;
    padding: 0.4rem 0.7rem;
    pointer-events: none;
}

.war-room-heat-gauge-big[b-8bsc2klm95] {
    font-size: 1.6rem;
    letter-spacing: 0.15rem;
}

.war-room-heat-level-label[b-8bsc2klm95] {
    font-size: 0.75rem;
    color: #ffb199;
}

.war-room-heat-cooling[b-8bsc2klm95] {
    font-size: 0.75rem;
}

.war-room-hunter-list[b-8bsc2klm95] {
    border-top: 1px solid rgba(255, 90, 90, 0.25);
    border-bottom: 1px solid rgba(255, 90, 90, 0.25);
    padding: 0.4rem 0;
}

.war-room-hunter-row[b-8bsc2klm95] {
    color: #ffb1a8;
    padding: 0.15rem 0;
}

.war-room-hunter-row-name[b-8bsc2klm95] {
    font-weight: 700;
    margin-right: 0.4rem;
}

.war-room-contact-list[b-8bsc2klm95] {
    flex: 1 1 auto;
    overflow-y: auto;
}

.war-room-contact-row:not(:last-child)[b-8bsc2klm95] {
    border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}

/* ---- M27: sensors feed the war room ---- */

.war-room-track-line[b-8bsc2klm95] {
    stroke: rgba(150, 255, 210, 0.5);
    stroke-width: 1;
}

.war-room-track-line-threat[b-8bsc2klm95] {
    stroke: rgba(255, 90, 90, 0.85);
    stroke-width: 1.5;
    stroke-dasharray: 4 2;
}

.war-room-track-dot[b-8bsc2klm95] {
    fill: rgba(150, 255, 210, 0.9);
}

.war-room-track-dot-interest[b-8bsc2klm95] {
    fill: #ffd24f;
    stroke: #fff;
    stroke-width: 1;
}

.war-room-contact-weapon-ring[b-8bsc2klm95] {
    fill: none;
    stroke: rgba(255, 160, 90, 0.35);
    stroke-width: 1;
    stroke-dasharray: 3 3;
}

.war-room-intercept[b-8bsc2klm95] {
    border: 1px solid rgba(255, 210, 80, 0.5);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
}

.war-room-track-row[b-8bsc2klm95] {
    gap: 0.4rem;
    padding: 0.15rem 0;
}

/* ---- M28: the Norden fire-control panel ---- */

.war-room-firecontrol[b-8bsc2klm95] {
    border: 1px solid rgba(255, 120, 120, 0.5);
    border-radius: 0.4rem;
    padding: 0.5rem 0.65rem;
}

.war-room-calc[b-8bsc2klm95] {
    font-weight: 700;
    letter-spacing: 0.08em;
    animation: warroom-calc-blink-b-8bsc2klm95 1s steps(2) infinite;
}

@keyframes warroom-calc-blink-b-8bsc2klm95 {
    50% { opacity: 0.35; }
}

.war-room-calc-row[b-8bsc2klm95] {
    font-family: monospace;
    font-size: 0.78rem;
    color: rgba(150, 255, 210, 0.85);
}

.war-room-tip[b-8bsc2klm95] {
    border-left: 2px solid rgba(255, 210, 80, 0.6);
    padding-left: 0.5rem;
}

/* Long-shots PR: labeled rings + the teaching empty state + heat glow. */
.war-room-ring-label[b-8bsc2klm95] {
    fill: rgba(180, 200, 220, 0.55);
    font-size: 7px;
}

.war-room-chain div[b-8bsc2klm95] {
    margin-bottom: 0.15rem;
}

.war-room-round-hint[b-8bsc2klm95] {
    font-size: 0.74rem;
    line-height: 1.2;
}

.war-room-heat-hot[b-8bsc2klm95] {
    filter: drop-shadow(0 0 4px rgba(255, 90, 40, 0.8));
}

/* Point-and-shoot PR: the verdict is the biggest information on the desk — set it in the
   biggest type (owner: "it should be BIG and easy to read", not small dark red). */
.war-room-verdict[b-8bsc2klm95] {
    font-size: 1.15rem;
    font-weight: 700;
    line-height: 1.3;
    margin: 0.2rem 0;
}

.war-room-verdict-good[b-8bsc2klm95] {
    color: #3ddc84;
}

.war-room-verdict-bad[b-8bsc2klm95] {
    color: #ffb02e; /* amber reads at a glance; small crimson on near-black did not */
}

.war-room-verdict-armed[b-8bsc2klm95] {
    color: #ff5a40;
    text-shadow: 0 0 6px rgba(255, 90, 64, 0.55);
}

.war-room-stage-label[b-8bsc2klm95] {
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: rgba(160, 190, 210, 0.75);
    border-top: 1px solid rgba(120, 150, 170, 0.25);
    padding-top: 0.25rem;
    margin-top: 0.35rem;
}

.war-room-aim-ray[b-8bsc2klm95] {
    stroke: rgba(255, 120, 120, 0.45);
    stroke-width: 0.7;
    stroke-dasharray: 3 2;
}
