Files
gods-eye-view/src/ui/styles/cockpit.css
T
Sameh Khamis f269f5be4f refactor(cockpit): share one header frame between the Cockpit cards
The Contact and briefing cards' headers repeated the same frame: the title
grid over a hairline, the accent kicker and the square action buttons. It
lives in cockpit-card-header, cockpit-card-kicker and cockpit-card-actions
now, beside each card's own classes, which keep only their spacing and
sizes; the cyber theme targets the shared classes. The computed styles of
every header element are unchanged in the default and cyber themes,
expanded and collapsed.
2026-11-01 13:13:55 -08:00

2216 lines
54 KiB
CSS

/* ── Aircraft Cockpit View ─────────────────── */
#cockpit-entry {
position: fixed;
left: calc(50% + 270px);
bottom: 34px;
z-index: 151;
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 38px;
padding: 0 12px;
border: 1px solid rgba(0, 220, 255, 0.5);
border-radius: 8px;
background: rgba(2, 12, 18, 0.9);
color: #dceeff;
font: 600 10px/1 var(--font-mono);
letter-spacing: 0.14em;
box-shadow: 0 0 18px rgba(0, 220, 255, 0.14);
cursor: pointer;
}
#cockpit-entry[hidden],
#cockpit-hud[hidden] {
display: none;
}
#cockpit-entry:hover,
#cockpit-entry:focus-visible {
border-color: #00dcff;
color: #fff;
outline: none;
}
#cockpit-entry .material-symbols-outlined {
color: #00dcff;
font-size: 18px;
}
#cockpit-entry kbd {
padding: 3px 5px;
border: 1px solid rgba(220, 238, 255, 0.25);
border-radius: 4px;
color: rgba(220, 238, 255, 0.6);
font: inherit;
}
#cockpit-hud {
--cockpit-accent: #00dcff;
/* Matches EMERGENCY_TINT_CSS in src/data/aircraftEmergency.js. */
--cockpit-emergency: #ff4444;
--cockpit-side-panel-width: min(340px, 28vw);
/* HUD bottom offset + tallest scaled telemetry block + 20px clear border. */
--cockpit-bottom-rail-safe: calc(clamp(84px, 11vh, 118px) + 100px);
position: fixed;
inset: 0;
z-index: 145;
overflow: hidden;
pointer-events: none;
color: #f4fbff;
font-family: var(--font-mono);
text-shadow:
0 0 10px color-mix(in srgb, var(--cockpit-accent) 60%, transparent),
0 1px 2px #000;
perspective: 920px;
}
#cockpit-hud[data-layer='military'] {
--cockpit-accent: #ffb800;
}
.cockpit-visor-shell {
position: absolute;
inset: clamp(62px, 9vh, 90px) clamp(18px, 3vw, 48px) clamp(38px, 5vh, 56px);
transform-style: preserve-3d;
perspective: 880px;
}
.cockpit-roll-arc {
position: absolute;
top: 2px;
left: 50%;
width: min(620px, 56vw);
height: 96px;
transform: translateX(-50%) rotateX(-8deg);
transform-style: preserve-3d;
}
.cockpit-roll-arc::after {
content: '';
position: absolute;
inset: 18px 6% 0;
border-top: 1px solid
color-mix(in srgb, var(--cockpit-accent) 62%, transparent);
border-radius: 50%;
opacity: 0.72;
}
.cockpit-roll-arc span {
position: absolute;
left: 50%;
top: 0;
color: rgba(244, 251, 255, 0.46);
font-size: 8px;
letter-spacing: 0.1em;
transform: translateX(calc(-50% + (var(--slot) * 74px)))
translateY(calc(var(--depth) * 9px)) rotateZ(calc(var(--slot) * 4deg))
rotateY(calc(var(--slot) * -5deg));
}
.cockpit-roll-arc span::after {
content: '';
display: block;
width: 1px;
height: calc(11px + (3 - var(--depth)) * 2px);
margin: 5px auto 0;
background: color-mix(in srgb, var(--cockpit-accent) 62%, transparent);
}
.cockpit-roll-arc span.active {
color: #fff;
font-size: 10px;
}
.cockpit-pitch-rail {
position: absolute;
top: 25%;
bottom: 21%;
display: grid;
grid-template-rows: repeat(5, 1fr);
align-items: center;
color: rgba(244, 251, 255, 0.38);
font-size: 8px;
letter-spacing: 0.08em;
transform-style: preserve-3d;
}
.cockpit-pitch-rail-left {
left: clamp(190px, 22vw, 330px);
text-align: right;
transform: rotateY(24deg) translateZ(-18px);
}
.cockpit-pitch-rail-right {
right: clamp(190px, 22vw, 330px);
text-align: left;
transform: rotateY(-24deg) translateZ(-18px);
}
body.cockpit-mode:has(#left-panel-stack > .panel-collapsible:not(.collapsed))
.cockpit-pitch-rail-left {
opacity: 0;
transition: opacity 0.25s;
}
.cockpit-pitch-rail span {
display: flex;
align-items: center;
gap: 7px;
}
.cockpit-pitch-rail-left span {
justify-content: flex-end;
}
.cockpit-pitch-rail span::after {
content: '';
width: 24px;
border-top: 1px solid
color-mix(in srgb, var(--cockpit-accent) 46%, transparent);
}
.cockpit-pitch-rail-right span::after {
order: -1;
}
.cockpit-pitch-rail span.active {
color: var(--cockpit-accent);
}
.cockpit-pitch-rail span.active::after {
width: 42px;
border-color: var(--cockpit-accent);
}
.cockpit-horizon-guide {
position: absolute;
top: 46%;
left: 50%;
display: grid;
grid-template-columns: minmax(74px, 190px) auto minmax(74px, 190px);
align-items: center;
gap: 16px;
width: min(470px, 42vw);
transform: translate(-50%, -50%) translateZ(22px);
color: color-mix(in srgb, var(--cockpit-accent) 72%, white);
}
.cockpit-horizon-guide span {
border-top: 1px solid currentColor;
}
.cockpit-horizon-guide span:first-child {
transform: rotateZ(2deg);
transform-origin: right;
}
.cockpit-horizon-guide span:last-child {
transform: rotateZ(-2deg);
transform-origin: left;
}
.cockpit-horizon-guide small {
font-size: 7px;
letter-spacing: 0.16em;
}
.cockpit-route-direction {
--route-angle: 0deg;
position: absolute;
z-index: 3;
/* Keep the cue in one predictable center slot. Its rotation communicates
relative destination bearing; lateral movement made it look like a random
scene arrow and allowed it to collide with the speed/heading readouts. */
top: 62%;
left: 50%;
display: grid;
justify-items: center;
gap: 5px;
color: color-mix(in srgb, var(--cockpit-accent) 24%, #79b8ff);
opacity: 0.84;
transform: translate(-50%, -50%) translateZ(24px);
transition: opacity 180ms ease;
filter: drop-shadow(
0 0 8px color-mix(in srgb, var(--cockpit-accent) 34%, transparent)
);
}
.cockpit-route-direction[hidden] {
display: none;
}
.cockpit-route-direction .cockpit-route-chevron {
display: block;
width: clamp(56px, 6vw, 78px);
height: clamp(56px, 6vw, 78px);
overflow: visible;
color: color-mix(in srgb, var(--cockpit-accent) 28%, #79b8ff);
fill: currentColor;
stroke: color-mix(in srgb, var(--cockpit-accent) 58%, #d8f3ff);
stroke-width: 0.7px;
stroke-linejoin: round;
filter: drop-shadow(0 0 4px rgba(213, 242, 255, 0.68))
drop-shadow(0 5px 6px rgba(0, 53, 102, 0.5));
/* Present the direction cue on the apparent ground plane while its parent
remains locked to the same fixed HUD position. */
transform: perspective(220px) rotateX(62deg) rotateZ(var(--route-angle))
scaleY(1.35);
transform-origin: center;
transition: transform 180ms ease;
}
.cockpit-route-direction small {
padding: 2px 5px;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 20%, transparent);
border-radius: 3px;
background: rgba(0, 7, 12, 0.24);
font-size: 7px;
text-align: center;
letter-spacing: 0.14em;
white-space: nowrap;
}
.cockpit-altitude-rim {
--cockpit-keyhole-radius: min(40vw, 52vh);
position: absolute;
z-index: 2;
top: calc(50vh - var(--cockpit-keyhole-radius) + 20px);
right: calc(50vw - var(--cockpit-keyhole-radius) + 20px);
bottom: auto;
width: 230px;
height: calc((var(--cockpit-keyhole-radius) - 20px) * 2);
overflow: hidden;
color: var(--cockpit-accent);
opacity: 0.9;
}
.cockpit-altitude-rim-label {
position: absolute;
top: 20%;
right: calc(12px + (0.2 * (var(--cockpit-keyhole-radius) - 20px)));
color: color-mix(in srgb, var(--cockpit-accent) 82%, white);
font-size: 7px;
font-weight: 700;
letter-spacing: 0.18em;
white-space: nowrap;
}
.cockpit-altitude-rim-rail {
position: absolute;
inset: 0;
overflow: hidden;
-webkit-mask-image: linear-gradient(
to bottom,
transparent 0%,
rgba(0, 0, 0, 0.04) 10%,
rgba(0, 0, 0, 0.28) 24%,
#000 42%,
#000 58%,
rgba(0, 0, 0, 0.28) 76%,
rgba(0, 0, 0, 0.04) 90%,
transparent 100%
);
mask-image: linear-gradient(
to bottom,
transparent 0%,
rgba(0, 0, 0, 0.04) 10%,
rgba(0, 0, 0, 0.28) 24%,
#000 42%,
#000 58%,
rgba(0, 0, 0, 0.28) 76%,
rgba(0, 0, 0, 0.04) 90%,
transparent 100%
);
}
.cockpit-altitude-rim-rail::before {
content: '';
position: absolute;
top: 0;
right: 0;
box-sizing: border-box;
width: calc((var(--cockpit-keyhole-radius) - 20px) * 2);
height: calc((var(--cockpit-keyhole-radius) - 20px) * 2);
border: 2px solid color-mix(in srgb, var(--cockpit-accent) 72%, transparent);
border-radius: 50%;
box-shadow: 5px 0 18px
color-mix(in srgb, var(--cockpit-accent) 18%, transparent);
}
.cockpit-altitude-rim-scale {
position: absolute;
inset: 0;
overflow: hidden;
-webkit-mask-image: linear-gradient(
to bottom,
transparent 0%,
rgba(0, 0, 0, 0.03) 9%,
rgba(0, 0, 0, 0.22) 23%,
#000 41%,
#000 59%,
rgba(0, 0, 0, 0.22) 77%,
rgba(0, 0, 0, 0.03) 91%,
transparent 100%
);
mask-image: linear-gradient(
to bottom,
transparent 0%,
rgba(0, 0, 0, 0.03) 9%,
rgba(0, 0, 0, 0.22) 23%,
#000 41%,
#000 59%,
rgba(0, 0, 0, 0.22) 77%,
rgba(0, 0, 0, 0.03) 91%,
transparent 100%
);
}
.cockpit-altitude-rim-scale > span {
position: absolute;
top: calc(50% + (var(--slot) * 8%));
right: calc(7px + (var(--curve) * (var(--cockpit-keyhole-radius) - 20px)));
display: flex;
align-items: center;
gap: 6px;
color: rgba(244, 251, 255, 0.68);
transform: translateY(-50%) rotateZ(calc(var(--slot) * -1.7deg));
transform-origin: right center;
transition:
top 120ms linear,
right 120ms linear,
transform 120ms linear;
}
.cockpit-altitude-rim-scale > span i {
order: 2;
display: block;
width: 20px;
border-top: 1px solid
color-mix(in srgb, var(--cockpit-accent) 58%, transparent);
}
.cockpit-altitude-rim-scale > span b {
min-width: 46px;
padding: 1px 3px;
border-radius: 2px;
background: rgba(0, 7, 12, 0.28);
font-size: 8px;
font-weight: 500;
letter-spacing: 0.08em;
text-align: right;
}
.cockpit-altitude-rim-scale > span.major {
color: rgba(244, 251, 255, 0.9);
}
.cockpit-altitude-rim-scale > span.major i {
width: 32px;
border-color: color-mix(in srgb, var(--cockpit-accent) 86%, transparent);
}
.cockpit-altitude-rim-pointer {
position: absolute;
top: 50%;
right: 0;
display: flex;
align-items: center;
color: #fff;
transform: translateY(-50%);
text-shadow: 0 0 12px var(--cockpit-accent);
}
.cockpit-altitude-rim-pointer strong {
min-width: 48px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
text-align: right;
}
.cockpit-altitude-rim-pointer .material-symbols-outlined {
margin-left: 4px;
color: var(--cockpit-accent);
font-size: 24px;
font-variation-settings:
'FILL' 1,
'wght' 600;
animation: cockpit-altitude-pointer 1.8s ease-in-out infinite;
}
@keyframes cockpit-altitude-pointer {
50% {
transform: translateX(-3px);
filter: brightness(1.35);
}
}
.cockpit-altitude-rim.unavailable {
opacity: 0.24;
}
.cockpit-speed-rim {
--speed-tape-inset: clamp(112px, 9vw, 148px);
right: auto;
left: calc(50vw - var(--cockpit-keyhole-radius) + 20px);
width: 300px;
}
.cockpit-speed-rim .cockpit-altitude-rim-label {
right: auto;
left: var(--speed-tape-inset);
}
.cockpit-speed-rim .cockpit-altitude-rim-rail::before {
right: auto;
left: 0;
box-shadow: -5px 0 18px
color-mix(in srgb, var(--cockpit-accent) 18%, transparent);
}
.cockpit-speed-rim .cockpit-altitude-rim-scale > span {
right: auto;
left: calc(1px + (var(--curve) * (var(--cockpit-keyhole-radius) - 20px)));
flex-direction: row-reverse;
/* Speed rises toward the top of the tape; altitude intentionally runs the
opposite way on the mirrored right-hand ruler. */
top: calc(50% - (var(--slot) * 8%));
transform: translateY(-50%) rotateZ(calc(var(--slot) * 1.7deg));
transform-origin: left center;
}
.cockpit-speed-rim .cockpit-altitude-rim-scale > span b {
text-align: left;
}
.cockpit-speed-rim .cockpit-altitude-rim-pointer {
right: auto;
left: 0;
}
.cockpit-speed-rim .cockpit-altitude-rim-pointer strong {
text-align: left;
}
.cockpit-speed-rim .cockpit-altitude-rim-pointer .material-symbols-outlined {
margin-right: 4px;
margin-left: 0;
animation-name: cockpit-speed-pointer;
}
@keyframes cockpit-speed-pointer {
50% {
transform: translateX(3px);
filter: brightness(1.35);
}
}
.cockpit-visor-status {
position: absolute;
bottom: 3px;
color: color-mix(in srgb, var(--cockpit-accent) 54%, transparent);
font-size: 7px;
letter-spacing: 0.22em;
}
.cockpit-visor-status-left {
left: clamp(110px, 15vw, 220px);
transform: rotateY(22deg);
}
.cockpit-visor-status-right {
right: clamp(110px, 15vw, 220px);
transform: rotateY(-22deg);
}
.cockpit-topline {
position: absolute;
z-index: 5;
top: clamp(18px, 3vh, 34px);
left: clamp(22px, 4vw, 58px);
right: clamp(22px, 4vw, 58px);
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: start;
gap: 24px;
}
.cockpit-topline > div:first-child {
display: flex;
flex-direction: column;
gap: 4px;
}
.cockpit-kicker,
.cockpit-readout-label {
color: var(--cockpit-accent);
font-size: 9px;
font-weight: 600;
letter-spacing: 0.22em;
}
#cockpit-callsign {
font-size: 18px;
letter-spacing: 0.12em;
}
.cockpit-aircraft-meta {
color: rgba(244, 251, 255, 0.48);
font-size: 7px;
letter-spacing: 0.16em;
}
.cockpit-aircraft-meta.emergency {
color: var(--cockpit-emergency);
font-weight: 600;
}
.cockpit-mode-chip {
margin-top: 2px;
padding: 7px 11px;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 45%, transparent);
border-radius: 20px;
background: rgba(0, 7, 12, 0.62);
color: var(--cockpit-accent);
font-size: 9px;
font-weight: 600;
letter-spacing: 0.16em;
}
.cockpit-live-dot {
display: inline-block;
width: 5px;
height: 5px;
margin-right: 6px;
border-radius: 50%;
background: var(--cockpit-accent);
box-shadow: 0 0 8px var(--cockpit-accent);
animation: cockpit-live 1.6s ease-in-out infinite;
}
@keyframes cockpit-live {
50% {
opacity: 0.35;
}
}
.cockpit-readout {
position: relative;
display: grid;
min-width: 118px;
padding: 6px 10px 7px;
border-top: 1px solid
color-mix(in srgb, var(--cockpit-accent) 50%, transparent);
border-bottom: 1px solid
color-mix(in srgb, var(--cockpit-accent) 18%, transparent);
background: linear-gradient(
90deg,
transparent,
rgba(0, 7, 12, 0.34),
transparent
);
transform-style: preserve-3d;
}
.cockpit-speed {
justify-self: end;
text-align: right;
transform: perspective(760px) rotateY(10deg) translateZ(-5px);
transform-origin: right center;
}
.cockpit-altitude {
justify-self: start;
text-align: left;
transform: perspective(760px) rotateY(-10deg) translateZ(-5px);
transform-origin: left center;
}
.cockpit-readout strong {
margin-top: 1px;
font-size: clamp(30px, 3.6vw, 48px);
font-weight: 500;
line-height: 0.98;
letter-spacing: -0.06em;
white-space: nowrap;
}
.cockpit-roll-token {
position: relative;
display: inline-block;
min-width: 0.56em;
height: 1em;
overflow: hidden;
line-height: 1;
text-align: center;
vertical-align: -0.08em;
}
/* Grouping and decimal separators (a space or comma in Spanish and Russian)
get a narrow cell; English keeps the full 0.56em cell. */
html:not([lang='en']) .cockpit-roll-token.is-separator {
min-width: 0.3em;
}
.cockpit-roll-token.is-rolling {
color: color-mix(in srgb, currentColor 92%, var(--cockpit-accent));
text-shadow: 0 0 10px
color-mix(in srgb, var(--cockpit-accent) 35%, transparent);
}
.cockpit-roll-track {
display: flex;
flex-direction: column;
height: 2em;
will-change: transform;
}
.cockpit-roll-track > span {
display: block;
flex: 0 0 1em;
height: 1em;
line-height: 1;
}
.cockpit-roll-token.roll-up .cockpit-roll-track {
animation: cockpit-number-roll-up 200ms cubic-bezier(0.2, 0.75, 0.25, 1) both;
}
.cockpit-roll-token.roll-down .cockpit-roll-track {
animation: cockpit-number-roll-down 200ms cubic-bezier(0.2, 0.75, 0.25, 1)
both;
}
@keyframes cockpit-number-roll-up {
from {
transform: translateY(0);
}
to {
transform: translateY(-1em);
}
}
@keyframes cockpit-number-roll-down {
from {
transform: translateY(-1em);
}
to {
transform: translateY(0);
}
}
@media (prefers-reduced-motion: reduce) {
.cockpit-roll-token .cockpit-roll-track {
animation-duration: 1ms;
}
}
.cockpit-readout-unit {
margin-top: 2px;
color: rgba(244, 251, 255, 0.7);
font-size: 11px;
font-weight: 600;
letter-spacing: 0.2em;
}
.cockpit-reticle {
position: absolute;
top: 46%;
left: 50%;
transform: translate(-50%, -50%) translateZ(34px);
color: var(--cockpit-accent);
font-size: clamp(30px, 3vw, 44px);
font-variation-settings: 'wght' 200;
opacity: 0.8;
}
.cockpit-compass {
position: absolute;
left: 50%;
bottom: clamp(44px, 7vh, 72px);
width: min(760px, 72vw);
transform: translateX(-50%) rotateX(7deg) translateZ(18px);
transform-style: preserve-3d;
perspective: 760px;
text-align: center;
}
.cockpit-instrument-row {
display: grid;
grid-template-columns: minmax(118px, 1fr) auto minmax(118px, 1fr);
align-items: center;
gap: clamp(18px, 3vw, 42px);
}
.cockpit-heading-value {
min-width: 74px;
font-size: 34px;
font-weight: 600;
line-height: 1;
white-space: nowrap;
}
.cockpit-heading-value small {
color: var(--cockpit-accent);
font-size: 12px;
}
.cockpit-heading-caret {
display: block;
height: 20px;
color: var(--cockpit-accent);
font-size: 28px;
line-height: 20px;
}
.cockpit-compass-tape {
position: relative;
height: 74px;
margin-top: -2px;
transform-style: preserve-3d;
}
.cockpit-compass-tape::before {
content: '';
position: absolute;
inset: 10px 2% 0;
border-top: 1px solid
color-mix(in srgb, var(--cockpit-accent) 78%, transparent);
border-radius: 50%;
background: rgba(0, 7, 12, 0.16);
}
.cockpit-compass-tape span {
position: absolute;
top: 8px;
left: 50%;
color: rgba(244, 251, 255, 0.52);
font-size: 12px;
letter-spacing: 0.12em;
transform: translateX(calc(-50% + (var(--slot) * 86px)))
translateY(calc(var(--depth) * 8px)) rotateZ(calc(var(--slot) * 3.6deg))
rotateY(calc(var(--slot) * -9deg));
}
.cockpit-compass-tape span::before {
content: '';
display: block;
width: 1px;
height: calc(17px - (var(--depth) * 2px));
margin: 0 auto 7px;
background: color-mix(in srgb, var(--cockpit-accent) 70%, transparent);
}
.cockpit-compass-tape span.active {
color: #fff;
font-size: 18px;
font-weight: 700;
text-shadow: 0 0 14px var(--cockpit-accent);
}
.cockpit-position-readout {
position: absolute;
right: clamp(24px, 4vw, 58px);
bottom: clamp(22px, 4vh, 42px);
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 4px;
color: rgba(244, 251, 255, 0.72);
font-size: 10px;
letter-spacing: 0.1em;
}
.cockpit-vision-controls {
display: grid;
/* The current style grows for a long translated name (ЗВИЧАЙНИЙ). */
grid-template-columns: 48px minmax(58px, max-content) 48px;
align-items: stretch;
gap: 2px;
margin-top: 2px;
padding: 2px;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 22%, transparent);
border-radius: 7px;
background: rgba(0, 7, 12, 0.46);
box-shadow: inset 0 0 14px rgba(0, 0, 0, 0.28);
pointer-events: auto;
}
.cockpit-vision-controls button {
display: flex;
min-width: 0;
min-height: 31px;
align-items: center;
justify-content: center;
gap: 1px;
padding: 4px 5px;
border: 1px solid transparent;
border-radius: 5px;
background: rgba(0, 7, 12, 0.38);
color: rgba(244, 251, 255, 0.64);
font: 700 7px/1 var(--font-mono);
letter-spacing: 0.08em;
cursor: pointer;
}
.cockpit-vision-controls button:hover,
.cockpit-vision-controls button:focus-visible {
border-color: color-mix(in srgb, var(--cockpit-accent) 62%, transparent);
color: #fff;
outline: none;
}
.cockpit-vision-controls .material-symbols-outlined {
font-size: 14px;
}
.cockpit-vision-controls small {
font: 700 6px/1 var(--font-mono);
letter-spacing: 0.1em;
}
.cockpit-vision-current {
flex-direction: column;
}
.cockpit-vision-current small {
color: color-mix(in srgb, var(--cockpit-accent) 70%, #fff);
}
.cockpit-vision-current strong {
color: #fff;
font: 700 9px/1 var(--font-mono);
letter-spacing: 0.12em;
}
.cockpit-vision-controls .cockpit-vision-current {
border-color: var(--cockpit-accent);
background: color-mix(
in srgb,
var(--cockpit-accent) 10%,
rgba(0, 7, 12, 0.72)
);
box-shadow: 0 0 10px
color-mix(in srgb, var(--cockpit-accent) 30%, transparent);
}
.cockpit-route-card {
display: grid;
gap: 8px;
min-width: 0;
padding: 2px 6px 10px 8px;
border-bottom: 1px solid
color-mix(in srgb, var(--cockpit-accent) 22%, transparent);
color: rgba(224, 247, 255, 0.9);
font: 7px/1.25 var(--font-mono);
letter-spacing: 0.09em;
}
.cockpit-route-card[hidden] {
display: none;
}
.cockpit-route-heading {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.cockpit-route-kicker {
flex: 0 0 auto;
color: var(--cockpit-accent);
font-size: 7px;
font-weight: 700;
letter-spacing: 0.16em;
}
.cockpit-route-heading small {
overflow: hidden;
color: color-mix(
in srgb,
var(--cockpit-accent) 68%,
rgba(244, 251, 255, 0.46)
);
font-size: 5px;
letter-spacing: 0.08em;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-route-endpoints {
display: grid;
grid-template-columns: minmax(0, 1fr) 18px minmax(0, 1fr);
align-items: center;
gap: 7px;
}
.cockpit-route-airport {
display: grid;
min-width: 0;
gap: 3px;
padding: 6px 7px;
border-left: 1px solid
color-mix(in srgb, var(--cockpit-accent) 52%, transparent);
background: rgba(0, 7, 12, 0.3);
}
.cockpit-route-airport > span {
color: color-mix(in srgb, var(--cockpit-accent) 76%, white);
font-size: 6px;
font-weight: 700;
letter-spacing: 0.14em;
}
.cockpit-route-airport strong {
overflow: hidden;
color: #fff;
font-size: 8px;
letter-spacing: 0.06em;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-route-arrow {
color: var(--cockpit-accent);
font-size: 15px;
text-align: center;
}
#view-switcher {
position: fixed;
z-index: 146;
right: 36px;
bottom: calc(2vh + 4.5rem);
display: grid;
gap: 6px;
}
#view-switcher button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 32px;
padding: 7px 10px;
border: 1px solid rgba(116, 219, 255, 0.38);
border-radius: 6px;
background: rgba(2, 12, 20, 0.82);
color: #bceeff;
font: 700 8px/1 var(--font-mono);
letter-spacing: 0.12em;
cursor: pointer;
box-shadow: 0 0 18px rgba(0, 0, 0, 0.24);
}
#view-switcher button[hidden] {
display: none;
}
#view-switcher button:hover,
#view-switcher button:focus-visible {
border-color: #fff;
color: #fff;
outline: none;
}
#view-switcher .material-symbols-outlined {
font-size: 16px;
}
body.cockpit-mode #view-switcher {
right: auto;
bottom: max(clamp(128px, 15vh, 150px), env(safe-area-inset-bottom));
display: flex;
max-width: calc(100vw - 24px);
align-items: center;
justify-content: center;
margin-bottom: -95px;
left: 50%;
transform: translateX(-50%);
}
body.cockpit-mode #view-switcher button {
flex: 0 1 auto;
min-width: 0;
min-height: 28px;
padding: 6px 11px;
border-radius: 999px;
background: rgba(0, 7, 12, 0.74);
white-space: nowrap;
}
.cockpit-context-window {
position: absolute;
z-index: 4;
top: auto;
left: var(--cockpit-context-left, clamp(24px, 4vw, 58px));
bottom: var(--cockpit-bottom-rail-safe);
display: grid;
gap: 7px;
width: var(--cockpit-side-panel-width);
max-height: min(42vh, 410px);
overflow-x: hidden;
overflow-y: auto;
box-sizing: border-box;
padding: 11px 12px 10px;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 30%, transparent);
border-top-color: color-mix(in srgb, var(--cockpit-accent) 64%, transparent);
border-radius: 8px 24px 24px 8px;
background: rgba(0, 7, 12, 0.68);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.04),
0 0 28px rgba(0, 0, 0, 0.26);
transform: perspective(900px) rotateY(4deg) translateZ(18px);
transform-origin: left center;
transform-style: preserve-3d;
pointer-events: auto;
text-shadow: 0 0 8px
color-mix(in srgb, var(--cockpit-accent) 45%, transparent);
scrollbar-color: color-mix(in srgb, var(--cockpit-accent) 45%, transparent)
transparent;
scrollbar-width: thin;
transition:
width 180ms ease,
background-color 180ms ease,
border-radius 180ms ease;
}
#cockpit-context[hidden] {
display: none;
}
.cockpit-context-window[data-state='uncertain'] {
border-top-color: rgba(116, 219, 255, 0.72);
}
/* CONTACT LOST reuses the amber the app already spends on unknown/stale inputs
(.cockpit-context-cohorts > div.unknown, .cockpit-brief-status[data-state="unavailable"]),
so a held last-known readout never reads as a live one. */
.cockpit-context-window[data-state='lost'] {
border-top-color: rgba(213, 168, 99, 0.72);
}
/* The Cockpit cards' headers (Contact, the briefing) share their frame: a
title column over a hairline, a kicker in the accent, and a row of square
actions. Each card sets only its spacing and sizes. */
.cockpit-card-header {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
border-bottom: 1px solid
color-mix(in srgb, var(--cockpit-accent) 22%, transparent);
}
.cockpit-card-header > div {
display: grid;
gap: 2px;
}
.cockpit-card-kicker {
color: var(--cockpit-accent);
font-weight: 700;
}
.cockpit-card-actions {
display: flex;
}
.cockpit-card-actions button {
display: grid;
height: 24px;
place-items: center;
padding: 0;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 30%, transparent);
border-radius: 5px;
background: rgba(0, 7, 12, 0.72);
color: color-mix(in srgb, var(--cockpit-accent) 82%, white);
cursor: pointer;
}
.cockpit-card-actions button:hover,
.cockpit-card-actions button:focus-visible {
border-color: var(--cockpit-accent);
color: #fff;
outline: none;
}
.cockpit-context-header {
gap: 5px 10px;
padding: 0 5px 7px;
}
.cockpit-context-kicker {
font-size: 8px;
letter-spacing: 0.2em;
}
#cockpit-context-subject {
color: #fff;
font-size: 10px;
font-weight: 600;
letter-spacing: 0.12em;
}
.cockpit-context-qualifier {
grid-column: 1 / -1;
justify-self: start;
color: rgba(116, 219, 255, 0.82);
font-size: 7px;
letter-spacing: 0.16em;
white-space: nowrap;
}
.cockpit-context-weather {
display: inline-flex;
min-width: 48px;
height: 20px;
align-items: center;
justify-content: center;
gap: 5px;
padding: 0 7px;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 46%, transparent);
border-radius: 999px;
background: color-mix(
in srgb,
var(--cockpit-accent) 8%,
rgba(0, 7, 12, 0.78)
);
color: color-mix(in srgb, var(--cockpit-accent) 82%, white);
font: 700 6px/1 var(--font-mono);
letter-spacing: 0.1em;
cursor: pointer;
}
.cockpit-context-weather strong {
color: #fff;
font: inherit;
}
.cockpit-context-weather[aria-pressed='false'] {
border-color: rgba(244, 251, 255, 0.15);
background: rgba(0, 7, 12, 0.54);
color: rgba(244, 251, 255, 0.42);
}
.cockpit-context-weather[aria-pressed='false'] strong {
color: rgba(244, 251, 255, 0.5);
}
.cockpit-context-weather:hover,
.cockpit-context-weather:focus-visible {
border-color: var(--cockpit-accent);
color: #fff;
outline: none;
}
.cockpit-context-actions {
gap: 4px;
}
.cockpit-context-actions button {
width: 28px;
}
.cockpit-context-actions button:disabled {
border-color: rgba(244, 251, 255, 0.1);
color: rgba(244, 251, 255, 0.2);
cursor: default;
}
.cockpit-context-actions .material-symbols-outlined {
font-size: 15px;
}
.cockpit-context-cohorts {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 6px;
}
.cockpit-context-cohorts > div {
display: grid;
grid-template-columns: auto 1fr;
align-items: baseline;
gap: 3px 8px;
min-width: 0;
padding: 6px 9px;
border-left: 1px solid
color-mix(in srgb, var(--cockpit-accent) 40%, transparent);
background: rgba(0, 7, 12, 0.34);
}
.cockpit-context-cohorts span {
color: var(--cockpit-accent);
font-size: 8px;
font-weight: 700;
letter-spacing: 0.14em;
}
.cockpit-context-cohorts strong {
justify-self: end;
color: #fff;
font-size: 17px;
font-weight: 600;
}
.cockpit-context-cohorts small {
grid-column: 1 / -1;
overflow: hidden;
color: rgba(244, 251, 255, 0.4);
font-size: 6px;
letter-spacing: 0.05em;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-context-cohorts > div.unknown {
border-left-color: rgba(213, 168, 99, 0.58);
}
.cockpit-context-cohorts > div.unknown strong {
color: #d5a863;
}
.cockpit-context-nearest {
display: grid;
grid-template-columns: 22px minmax(0, 1fr) auto;
grid-template-rows: auto auto;
align-items: center;
gap: 2px 8px;
padding: 3px 5px 2px;
}
#cockpit-context-direction {
grid-row: 1 / 3;
color: var(--cockpit-accent);
font-size: 22px;
transform-origin: 50% 50%;
transition: transform 180ms ease-out;
}
#cockpit-context-direction.unknown {
opacity: 0.3;
}
.cockpit-context-nearest > div {
grid-column: 2;
grid-row: 1;
display: grid;
gap: 2px;
min-width: 0;
}
.cockpit-context-nearest small {
color: rgba(244, 251, 255, 0.42);
font-size: 6px;
letter-spacing: 0.12em;
}
#cockpit-context-nearest-label {
overflow: hidden;
color: #fff;
font-size: 9px;
letter-spacing: 0.1em;
text-overflow: ellipsis;
white-space: nowrap;
}
#cockpit-context-bearing,
#cockpit-context-distance {
color: var(--cockpit-accent);
font-size: 10px;
font-weight: 700;
letter-spacing: 0.08em;
white-space: nowrap;
}
#cockpit-context-bearing {
grid-column: 2;
grid-row: 2;
justify-self: start;
}
#cockpit-context-distance {
grid-column: 3;
grid-row: 1 / 3;
}
#cockpit-context-distance {
color: #fff;
}
.cockpit-context-footer {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
align-items: center;
gap: 8px;
padding: 6px 8px 0;
border-top: 1px solid rgba(244, 251, 255, 0.08);
color: rgba(244, 251, 255, 0.4);
font-size: 6px;
letter-spacing: 0.11em;
}
.cockpit-context-window[data-state='uncertain'] #cockpit-context-uncertainty {
color: #74dbff;
}
.cockpit-context-window[data-state='lost'] #cockpit-context-uncertainty {
color: #d5a863;
font-weight: 600;
}
/* The held values are last-known, not current — dim them to match the cue. */
.cockpit-context-window[data-state='lost']
:is(.cockpit-context-cohorts, .cockpit-context-nearest) {
opacity: 0.55;
}
#cockpit-hud.context-active .cockpit-pitch-rail-left {
opacity: 0.16;
transition: opacity 180ms ease;
}
.cockpit-context-window[data-layout-mode='rail-left-constrained'] {
gap: 5px;
padding-top: 8px;
padding-bottom: 8px;
}
.cockpit-context-window[data-collapsed='true'] {
width: min(248px, 22vw);
max-height: none;
gap: 0;
padding: 9px 10px;
border-radius: 7px 18px 18px 7px;
background: rgba(0, 7, 12, 0.54);
}
.cockpit-context-window[data-collapsed='true'] .cockpit-context-header {
gap: 8px;
padding: 0;
border-bottom: 0;
}
.cockpit-context-window[data-collapsed='true']
:is(
.cockpit-context-qualifier,
.cockpit-context-cohorts,
.cockpit-context-nearest,
.cockpit-context-footer,
.cockpit-context-actions button:not(#cockpit-context-toggle)
) {
display: none;
}
.cockpit-context-window[data-collapsed='true'] #cockpit-context-subject {
font-size: 8px;
letter-spacing: 0.08em;
}
#cockpit-hud.signals-active .cockpit-pitch-rail-right {
opacity: 0.16;
transition: opacity 180ms ease;
}
.cockpit-signal-window {
position: absolute;
z-index: 3;
top: auto;
right: var(--cockpit-signal-right, clamp(24px, 4vw, 58px));
bottom: var(--cockpit-bottom-rail-safe);
display: grid;
gap: 7px;
width: var(--cockpit-side-panel-width);
max-height: min(42vh, 410px);
overflow-x: hidden;
overflow-y: auto;
box-sizing: border-box;
padding: 11px 12px 9px;
border: 1px solid color-mix(in srgb, var(--cockpit-accent) 30%, transparent);
border-top-color: color-mix(in srgb, var(--cockpit-accent) 64%, transparent);
border-radius: 24px 8px 8px 24px;
background: rgba(0, 7, 12, 0.68);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.04),
0 0 28px rgba(0, 0, 0, 0.26);
transform: perspective(900px) rotateY(-4deg) translateZ(18px);
transform-origin: right center;
pointer-events: auto;
text-shadow: 0 0 8px
color-mix(in srgb, var(--cockpit-accent) 45%, transparent);
scrollbar-color: color-mix(in srgb, var(--cockpit-accent) 45%, transparent)
transparent;
scrollbar-width: thin;
transition:
width 180ms ease,
background-color 180ms ease,
border-radius 180ms ease;
}
#cockpit-signal-stream[hidden] {
display: none;
}
.cockpit-utility-controls {
position: absolute;
z-index: 5;
top: var(
--cockpit-utility-top,
var(--left-stack-safe-top, var(--left-stack-top))
);
right: clamp(24px, 4vw, 58px);
bottom: auto;
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: flex-end;
gap: 7px;
pointer-events: auto;
}
.cockpit-utility-control {
position: relative;
}
.cockpit-utility-control.is-expanded {
width: 272px;
box-sizing: border-box;
padding: 8px;
border: 1px solid var(--glass-border);
border-radius: var(--panel-radius);
background: var(--glass-bg);
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.05);
backdrop-filter: blur(24px) saturate(1.4);
-webkit-backdrop-filter: blur(24px) saturate(1.4);
max-height: var(
--cockpit-utility-expanded-max-height,
var(--cockpit-utility-max-height, min(44vh, 430px))
);
overflow-y: auto;
}
.cockpit-utility-control.is-expanded:has([data-cockpit-launcher='display']) {
width: var(--display-panel-expanded-width);
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 7px;
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.42),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
}
.cockpit-utility-control.is-expanded:has([data-cockpit-launcher='radio']) {
width: var(--cockpit-radio-expanded-width, 232px);
}
.cockpit-utility-controls.layout-primary-only
> .cockpit-utility-control:not(.is-expanded) {
display: none;
}
.cockpit-utility-launcher {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 7px;
width: var(--left-collapsed-width, 176px);
min-height: 50px;
padding: 8px 10px 8px 14px;
border: 1px solid var(--glass-border);
border-radius: var(--panel-radius);
background: var(--glass-bg);
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.42),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
backdrop-filter: blur(24px) saturate(1.4);
-webkit-backdrop-filter: blur(24px) saturate(1.4);
color: var(--text-dim);
font: 8px/1.1 var(--font-mono);
letter-spacing: 1.4px;
text-align: left;
}
[data-cockpit-launcher='display'] {
width: var(--left-collapsed-width, 176px);
}
[data-cockpit-launcher='radio'] {
width: var(--cockpit-radio-collapsed-width, 148px);
}
.cockpit-utility-control.is-expanded .cockpit-utility-launcher {
width: 100%;
min-height: 42px;
padding: 6px 2px 8px 6px;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.cockpit-utility-control.is-expanded .cockpit-utility-launcher {
width: 100%;
}
.cockpit-utility-control.is-expanded:has([data-cockpit-launcher='display'])
.cockpit-utility-launcher {
min-height: 42px;
box-sizing: border-box;
margin-left: auto;
margin-bottom: 0;
padding: 6px 2px 8px 6px;
gap: 8px;
}
.cockpit-utility-divider {
height: 1px;
background: linear-gradient(to right, var(--glass-border), transparent);
box-shadow: none;
}
.cockpit-utility-control.is-expanded .cockpit-utility-divider {
background: linear-gradient(
90deg,
rgb(0 212 255 / 28%),
rgba(0, 212, 255, 0.18) 58%,
transparent
);
box-shadow: 0 0 7px rgba(0, 212, 255, 0.22);
}
.cockpit-utility-glyph {
display: grid;
width: 20px;
height: 20px;
padding: 0;
place-items: center;
border: 1px solid var(--glass-border);
border-radius: 6px;
background: rgba(255, 255, 255, 0.03);
color: var(--text-secondary);
font-family: var(--font-mono);
font-size: 12px;
line-height: 1;
cursor: pointer;
}
.cockpit-utility-glyph:focus-visible {
border-color: var(--glass-border-hover);
color: var(--text-primary);
outline: 2px solid var(--text-primary);
outline-offset: -3px;
}
.cockpit-utility-popover {
position: static;
display: grid;
width: 100%;
box-sizing: border-box;
gap: 7px;
padding: 9px;
border: 0;
border-top: 1px solid var(--glass-border);
border-radius: 0;
background: transparent;
box-shadow: none;
}
.cockpit-utility-popover[hidden] {
display: none !important;
}
.cockpit-display-slot {
display: block;
min-width: 0;
}
#cockpit-display-panel {
display: flex;
flex-direction: column;
gap: 7px;
padding: 0;
border-top: 0;
max-height: min(52vh, 470px);
overflow-y: auto;
}
#cockpit-display-panel .pp-toggle-group {
width: 100%;
min-width: 0;
}
#cockpit-display-panel
[data-cockpit-display-slot='parameters']
#param-slider-panel.active {
width: 100%;
max-height: none;
overflow-y: visible;
}
#cockpit-display-panel .pp-toggle-btn {
width: 100%;
min-height: 38px;
box-sizing: border-box;
}
.cockpit-radio-compact {
width: 100%;
}
.cockpit-radio-station {
overflow: hidden;
color: #fff;
font: 500 8px/1.2 var(--font-mono);
letter-spacing: 0.08em;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-radio-transport {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 6px;
}
.cockpit-radio-transport button {
min-height: 32px;
border: 1px solid rgba(65, 220, 231, 0.24);
border-radius: 6px;
background: rgba(65, 220, 231, 0.05);
color: #9ceaf1;
cursor: pointer;
}
.cockpit-radio-transport button:disabled {
opacity: 0.38;
cursor: not-allowed;
}
.cockpit-radio-transport button.active {
border-color: var(--cockpit-accent);
color: #fff;
}
.cockpit-radio-volume {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
gap: 8px;
color: rgba(244, 251, 255, 0.58);
font: 7px/1 var(--font-mono);
letter-spacing: 0.1em;
}
.cockpit-radio-volume input {
width: 100%;
}
.cockpit-signal-header {
gap: 10px;
padding: 0 4px 7px 8px;
}
html:not([lang='en']) .cockpit-signal-header > div {
min-width: 0;
}
html:not([lang='en']) .cockpit-signal-kicker {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-signal-header strong {
color: #fff;
font-size: 8px;
letter-spacing: 0.1em;
}
.cockpit-signal-kicker {
font-size: 8px;
letter-spacing: 0.18em;
}
.cockpit-signal-kicker i {
display: inline-block;
width: 5px;
height: 5px;
margin-right: 5px;
border-radius: 50%;
background: var(--cockpit-accent);
box-shadow: 0 0 7px var(--cockpit-accent);
animation: cockpit-live 1.6s ease-in-out infinite;
}
.cockpit-brief-actions {
align-items: center;
gap: 3px;
}
/* A longer translated state label widens the cycle button; the other
controls keep their size instead of being squeezed. */
html:not([lang='en']) .cockpit-brief-actions > * {
flex-shrink: 0;
}
.cockpit-brief-actions button {
width: 23px;
}
.cockpit-brief-actions .material-symbols-outlined {
font-size: 14px;
}
#cockpit-brief-auto {
width: 50px;
color: rgba(244, 251, 255, 0.42);
font: 700 6px/1 var(--font-mono);
letter-spacing: 0.05em;
}
html:not([lang='en']) #cockpit-brief-auto {
width: auto;
min-width: 50px;
padding: 0 4px;
white-space: nowrap;
}
#cockpit-brief-auto[aria-pressed='true'] {
border-color: var(--cockpit-accent);
background: color-mix(
in srgb,
var(--cockpit-accent) 14%,
rgba(0, 7, 12, 0.72)
);
color: #fff;
box-shadow: 0 0 10px
color-mix(in srgb, var(--cockpit-accent) 24%, transparent);
}
#cockpit-signal-toggle {
width: 28px;
margin-left: 2px;
}
#cockpit-brief-position {
min-width: 25px;
color: rgba(244, 251, 255, 0.48);
font-size: 6px;
letter-spacing: 0.08em;
text-align: center;
}
.cockpit-brief-stage {
min-height: 178px;
overflow: hidden;
}
[data-cockpit-brief-page] {
animation: cockpit-brief-enter 220ms ease-out both;
}
[data-cockpit-brief-page][hidden] {
display: none;
}
.cockpit-signal-list {
display: grid;
gap: 3px;
margin: 0;
padding: 0;
list-style: none;
}
.cockpit-signal-list li {
display: grid;
grid-template-columns: 54px minmax(0, 1fr);
gap: 8px;
padding: 7px 7px 7px 9px;
border-left: 1px solid rgba(244, 251, 255, 0.2);
background: rgba(0, 7, 12, 0.3);
}
.cockpit-signal-list li.actionable {
transition:
border-color 160ms ease,
background 160ms ease;
}
.cockpit-signal-list li.actionable:hover,
.cockpit-signal-list li.actionable:focus-within {
border-left-color: var(--cockpit-accent);
background: color-mix(
in srgb,
var(--cockpit-accent) 10%,
rgba(0, 7, 12, 0.4)
);
}
.cockpit-signal-list li.track,
.cockpit-signal-list li.current {
border-left-color: var(--cockpit-accent);
}
.cockpit-signal-list li.nearby {
border-left-color: #fff;
}
.cockpit-signal-list li.military {
border-left-color: #d5a863;
}
.cockpit-signal-list li.warning {
border-left-color: #d5a863;
}
.cockpit-signal-list time {
color: rgba(244, 251, 255, 0.38);
font-size: 6px;
letter-spacing: 0.06em;
}
.cockpit-signal-list li > div {
display: grid;
gap: 2px;
min-width: 0;
}
.cockpit-signal-list strong {
color: color-mix(in srgb, var(--cockpit-accent) 78%, white);
font-size: 10px;
letter-spacing: 0.11em;
}
.cockpit-signal-target {
display: grid;
grid-template-columns: minmax(0, auto) minmax(14px, 1fr) 12px;
align-items: center;
gap: 7px;
width: 100%;
padding: 0;
border: 0;
background: transparent;
color: color-mix(in srgb, var(--cockpit-accent) 78%, white);
font: inherit;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.11em;
text-align: left;
cursor: pointer;
}
.cockpit-signal-list li.military .cockpit-signal-target {
color: #f0c968;
}
.cockpit-signal-target-label {
overflow: hidden;
color: currentColor !important;
font: inherit;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-signal-target-rule {
height: 1px;
overflow: visible !important;
background: linear-gradient(90deg, currentColor, transparent);
opacity: 0.42;
transition:
opacity 160ms ease,
transform 160ms ease;
transform-origin: left center;
}
.cockpit-signal-target-chevron {
overflow: visible !important;
color: currentColor !important;
font-size: 12px !important;
line-height: 1;
transition: transform 160ms ease;
}
.cockpit-signal-target:hover,
.cockpit-signal-target:focus-visible {
color: #fff;
outline: none;
text-shadow: 0 0 8px
color-mix(in srgb, var(--cockpit-accent) 72%, transparent);
}
.cockpit-signal-target:hover .cockpit-signal-target-rule,
.cockpit-signal-target:focus-visible .cockpit-signal-target-rule {
opacity: 0.82;
transform: scaleX(1.04);
}
.cockpit-signal-target:hover .cockpit-signal-target-chevron,
.cockpit-signal-target:focus-visible .cockpit-signal-target-chevron {
transform: translateX(2px);
}
.cockpit-signal-list li.warning strong {
color: #d5a863;
}
.cockpit-signal-list span {
overflow: hidden;
color: rgba(244, 251, 255, 0.66);
font-size: 8px;
letter-spacing: 0.06em;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-news-list {
display: grid;
gap: 4px;
margin: 0;
padding: 0;
list-style: none;
}
.cockpit-news-list:empty {
display: none;
}
.cockpit-news-list li {
border-left: 1px solid
color-mix(in srgb, var(--cockpit-accent) 62%, transparent);
background: rgba(0, 7, 12, 0.3);
}
.cockpit-news-list a {
display: grid;
gap: 4px;
padding: 7px 9px;
color: inherit;
text-decoration: none;
}
.cockpit-news-list a:hover,
.cockpit-news-list a:focus-visible {
background: color-mix(in srgb, var(--cockpit-accent) 8%, transparent);
outline: 1px solid color-mix(in srgb, var(--cockpit-accent) 46%, transparent);
}
.cockpit-news-list strong {
display: -webkit-box;
overflow: hidden;
color: rgba(244, 251, 255, 0.88);
font-size: 8px;
font-weight: 600;
line-height: 1.35;
letter-spacing: 0.045em;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.cockpit-news-list span {
color: color-mix(
in srgb,
var(--cockpit-accent) 65%,
rgba(244, 251, 255, 0.42)
);
font-size: 6px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.cockpit-brief-status {
display: grid;
min-height: 0;
place-items: center;
padding: 18px 10px;
border: 0;
color: rgba(244, 251, 255, 0.45);
font-size: 7px;
letter-spacing: 0.13em;
text-align: center;
}
.cockpit-brief-status[data-state='unavailable'] {
color: #d5a863;
}
.cockpit-local-place {
display: grid;
gap: 3px;
padding: 5px 8px 8px;
border-bottom: 1px solid rgba(244, 251, 255, 0.08);
}
.cockpit-local-place strong {
overflow: hidden;
color: #fff;
font-size: 9px;
letter-spacing: 0.1em;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-local-place small {
color: rgba(244, 251, 255, 0.44);
font-size: 6px;
letter-spacing: 0.09em;
}
.cockpit-local-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1px;
margin-top: 5px;
background: rgba(244, 251, 255, 0.07);
}
.cockpit-local-grid > div {
display: grid;
min-height: 60px;
align-content: center;
gap: 3px;
padding: 7px 9px;
background: rgba(0, 7, 12, 0.76);
}
.cockpit-local-grid span {
color: var(--cockpit-accent);
font-size: 7px;
font-weight: 700;
letter-spacing: 0.13em;
}
.cockpit-local-grid strong {
overflow: hidden;
color: #fff;
font-size: 13px;
font-weight: 500;
letter-spacing: 0.06em;
text-overflow: ellipsis;
white-space: nowrap;
}
#cockpit-local-condition {
font-size: 10px;
line-height: 1.15;
letter-spacing: 0.03em;
text-overflow: clip;
white-space: normal;
}
.cockpit-local-grid small {
color: rgba(244, 251, 255, 0.35);
font-size: 6px;
letter-spacing: 0.07em;
}
.cockpit-weather-credit {
display: inline-block;
margin-top: 7px;
color: rgba(182, 226, 241, 0.72);
font: 600 7px/1.2 var(--font-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.cockpit-signal-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 5px 8px 0;
border-top: 1px solid rgba(244, 251, 255, 0.08);
color: rgba(244, 251, 255, 0.34);
font-size: 6px;
letter-spacing: 0.1em;
}
.cockpit-signal-footer > span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cockpit-brief-tabs {
display: flex;
gap: 3px;
}
/* Translated tab names are longer: the tabs keep their words whole and the
footer text beside them gives way. */
html:not([lang='en']) .cockpit-signal-footer > span {
flex: 1 1 auto;
min-width: 0;
}
html:not([lang='en']) .cockpit-brief-tabs {
flex: 0 0 auto;
}
html:not([lang='en']) .cockpit-brief-tabs button {
white-space: nowrap;
}
.cockpit-brief-tabs button {
padding: 2px 4px;
border: 0;
border-bottom: 1px solid rgba(244, 251, 255, 0.16);
background: transparent;
color: rgba(244, 251, 255, 0.34);
font: inherit;
letter-spacing: 0.08em;
cursor: pointer;
}
.cockpit-brief-tabs button[aria-current='true'] {
border-bottom-color: var(--cockpit-accent);
color: color-mix(in srgb, var(--cockpit-accent) 80%, white);
}
.cockpit-brief-tabs button:hover,
.cockpit-brief-tabs button:focus-visible {
color: #fff;
outline: none;
}
.cockpit-signal-window[data-layout-mode='rail-right-constrained'] {
gap: 5px;
}
.cockpit-signal-window[data-collapsed='true'] {
width: min(248px, 22vw);
max-height: none;
gap: 0;
padding: 9px 10px;
border-radius: 18px 7px 7px 18px;
background: rgba(0, 7, 12, 0.54);
}
.cockpit-signal-window[data-collapsed='true'] .cockpit-signal-header {
padding: 0;
border-bottom: 0;
}
.cockpit-signal-window[data-collapsed='true'] .cockpit-route-card {
display: none;
}
.cockpit-signal-window[data-collapsed='true']
:is(.cockpit-brief-stage, .cockpit-signal-footer) {
display: none;
}
.cockpit-signal-window[data-collapsed='true']
.cockpit-brief-actions
> :not(#cockpit-signal-toggle) {
display: none;
}
@keyframes cockpit-brief-enter {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.cockpit-help {
position: absolute;
left: clamp(24px, 4vw, 58px);
bottom: clamp(22px, 4vh, 42px);
color: rgba(244, 251, 255, 0.55);
font-size: 9px;
letter-spacing: 0.14em;
}
.cockpit-help span {
color: var(--cockpit-accent);
}
body.cockpit-mode
:is(
#title-bar,
#style-indicator,
#top-center-actions,
#traffic-sync-chip,
#cctv-sync-chip,
#command-dock,
#military-awareness-panel,
#military-awareness-direction-overlay,
#cockpit-entry
) {
display: none !important;
}
body.cockpit-mode
:is(
#clear-selected-layers,
#share-btn,
#tilt-map-view,
#north-up-view,
#reset-globe-view
) {
display: none !important;
}
body.cockpit-mode #left-panel-stack {
z-index: 147;
display: flex;
top: var(--left-stack-safe-top, var(--left-stack-top));
bottom: var(--left-stack-safe-bottom, 24px);
height: auto;
max-height: none;
transition: none;
}
body.cockpit-mode #left-panel-stack > #scene-panel {
display: none !important;
}
body.cockpit-mode #right-context-rail {
display: none !important;
}
/* Keep the user's intelligence HUD text available in first person. It stays
subordinate to the visor instruments and occupies the four peripheral
corridors, leaving the optical center, context rails, and heading tape free. */
body.cockpit-mode #intel-hud.active {
z-index: 146;
opacity: 0.72;
visibility: visible;
}
body.cockpit-mode #intel-hud .hud-top-left,
body.cockpit-mode #intel-hud .hud-bottom-left {
left: clamp(18px, 3vw, 44px);
transform: scale(0.78);
transform-origin: left center;
}
body.cockpit-mode #intel-hud .hud-top-right,
body.cockpit-mode #intel-hud .hud-bottom-right {
right: clamp(18px, 3vw, 44px);
transform: scale(0.78);
transform-origin: right center;
}
body.cockpit-mode #intel-hud .hud-top-left,
body.cockpit-mode #intel-hud .hud-top-right {
top: clamp(104px, 13vh, 138px);
}
body.cockpit-mode #intel-hud .hud-bottom-left,
body.cockpit-mode #intel-hud .hud-bottom-right {
bottom: clamp(84px, 11vh, 118px);
}
body.cockpit-mode #intel-hud .hud-summary-wrap {
max-width: min(34vw, 380px);
}
body.cockpit-mode #intel-hud .hud-summary {
font-size: 9px;
}
body.cockpit-mode #intel-hud .hud-left-edge {
left: 22px;
}
body.cockpit-mode #intel-hud .hud-right-edge {
right: 22px;
}
@media (max-width: 760px) {
#view-switcher {
right: 16px;
bottom: 16px;
}
body.cockpit-mode #view-switcher {
right: auto;
bottom: max(76px, env(safe-area-inset-bottom));
width: max-content;
max-width: calc(100vw - 20px);
margin-bottom: 0;
}
body.cockpit-mode #view-switcher button {
padding-inline: 9px;
font-size: 7px;
}
#cockpit-entry {
left: auto;
right: 16px;
bottom: 88px;
}
body.cockpit-mode #left-panel-stack,
body.cockpit-mode #intel-hud,
body.cockpit-mode .cockpit-context-window,
body.cockpit-mode .cockpit-signal-window {
display: none !important;
}
body.cockpit-mode #right-context-rail {
display: none !important;
}
body.cockpit-mode .cockpit-utility-controls {
top: auto;
right: 12px;
bottom: 152px;
max-width: calc(100vw - 24px);
}
body.cockpit-mode .cockpit-utility-controls {
flex-direction: row;
}
body.cockpit-mode .cockpit-utility-launcher {
width: min(150px, calc((100vw - 31px) / 2));
min-height: 42px;
}
body.cockpit-mode .cockpit-utility-control.is-expanded {
position: fixed;
top: 96px;
right: 12px;
width: min(272px, calc(100vw - 24px));
max-height: calc(100vh - 260px);
}
body.cockpit-mode
.cockpit-utility-controls:has(.cockpit-utility-control.is-expanded)
> .cockpit-utility-control:not(.is-expanded) {
display: none;
}
body.cockpit-mode .cockpit-utility-popover {
position: static;
width: 100%;
}
.cockpit-topline {
grid-template-columns: 1fr auto;
}
.cockpit-mode-chip {
display: none;
}
.cockpit-readout {
min-width: 76px;
padding: 4px 6px 5px;
}
.cockpit-readout strong {
font-size: clamp(24px, 8vw, 34px);
}
.cockpit-readout-label {
font-size: 7px;
letter-spacing: 0.12em;
}
.cockpit-readout-unit {
font-size: 8px;
}
.cockpit-speed {
transform: perspective(600px) rotateY(7deg);
}
.cockpit-altitude {
transform: perspective(600px) rotateY(-7deg);
}
.cockpit-compass {
width: 92vw;
}
.cockpit-instrument-row {
grid-template-columns: minmax(76px, 1fr) auto minmax(76px, 1fr);
gap: 8px;
}
.cockpit-context-window {
top: auto;
left: 12px;
right: 12px;
bottom: 180px;
width: auto;
max-height: min(38vh, 280px);
padding: 10px 12px 8px;
border-radius: 20px 20px 10px 10px;
transform: translateZ(22px);
}
.cockpit-context-window[data-collapsed='true'] {
right: auto;
width: min(248px, calc(100vw - 24px));
max-height: none;
}
.cockpit-signal-window {
top: 112px;
right: 12px;
width: calc(100vw - 24px);
max-height: min(28vh, 220px);
padding: 10px 12px 8px;
border-radius: 20px 10px 10px 20px;
transform: translateZ(22px);
}
.cockpit-signal-window[data-collapsed='true'] {
left: auto;
width: min(248px, calc(100vw - 24px));
max-height: none;
}
.cockpit-context-header {
grid-template-columns: 1fr auto;
}
.cockpit-context-qualifier {
display: none;
}
.cockpit-context-cohorts small {
display: none;
}
.cockpit-context-cohorts {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.cockpit-context-cohorts > div {
padding: 4px 6px;
}
.cockpit-context-nearest {
grid-template-columns: 20px minmax(0, 1fr) auto;
gap: 6px;
}
#cockpit-context-bearing {
display: none;
}
.cockpit-context-footer {
font-size: 5px;
}
.cockpit-compass-tape span {
transform: translateX(calc(-50% + (var(--slot) * 52px)))
translateY(calc(var(--depth) * 7px)) rotateZ(calc(var(--slot) * 3deg));
}
.cockpit-pitch-rail {
display: none;
}
.cockpit-altitude-rim {
display: none;
}
.cockpit-visor-status {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.cockpit-altitude-rim-pointer .material-symbols-outlined {
animation: none;
}
.cockpit-altitude-rim-scale > span {
transition: none;
}
[data-cockpit-brief-page] {
animation: none;
}
}