Spaces:
Running
Running
Download modules/space_exploration/src/ui/uga_command.css from CREATORJD/massfront-playtest: direct link, hf CLI and curl.
- Browser
- Download file 175 kB
-
https://huggingface.co/spaces/CREATORJD/massfront-playtest/resolve/main/modules/space_exploration/src/ui/uga_command.css
- Command line
-
hf download hf://spaces/CREATORJD/massfront-playtest/modules/space_exploration/src/ui/uga_command.css
-
curl -L -o uga_command.css https://huggingface.co/spaces/CREATORJD/massfront-playtest/resolve/main/modules/space_exploration/src/ui/uga_command.css
175 kB
| /* MASSFRONT UGA command overlay. Room views keep the authored Three.js cutaway | |
| as the interactive authority inside a procedural inspection bay. Directory | |
| views use sealed contextual interiors; no ship screen exposes outer space. */ | |
| .uga-return-services { display: flex; flex-direction: column; gap: 12px; } | |
| .uga-return-services > .uga-primary-button { flex: 0 0 auto; width: 100%; min-height: 44px; } | |
| .uga-return-services > p { margin: 0; font-size: 12px; line-height: 1.5; color: #b5cad5; } | |
| .uga-command-shell { | |
| --uga-cyan: #42ddff; | |
| --uga-blue: #159bd5; | |
| --uga-amber: #ffb54a; | |
| --uga-green: #74e0a2; | |
| --uga-red: #ff5e62; | |
| --uga-text: #e8f4ff; | |
| --uga-muted: #7995aa; | |
| --uga-line: rgba(92, 196, 232, .3); | |
| --uga-panel: rgba(5, 15, 24, .86); | |
| --uga-panel-soft: rgba(6, 19, 30, .67); | |
| position: absolute; | |
| inset: 0; | |
| z-index: 80; | |
| color: var(--uga-text); | |
| font-family: "Arial Narrow", "Roboto Condensed", "Segoe UI", sans-serif; | |
| font-size: 12px; | |
| letter-spacing: .035em; | |
| pointer-events: none; | |
| isolation: isolate; | |
| } | |
| /* Galactic Command reads the front before it offers anything else. The mode | |
| cards that used to open this block belonged to a duplicate terminal no | |
| route reached; BASIC ACCESS is the one mode picker now. */ | |
| .uga-command-front { | |
| position: relative; | |
| isolation: isolate; | |
| min-height: 70px; | |
| padding: 9px 10px; | |
| display: grid; | |
| grid-template-columns: 32px minmax(0, 1fr) auto; | |
| grid-template-rows: auto auto; | |
| gap: 4px 8px; | |
| align-items: center; | |
| border: 1px solid var(--uga-line); | |
| border-radius: 8px; | |
| background: rgba(3, 18, 28, .88); | |
| } | |
| /* No second frame. The PLATED SURFACES rule below gives this card the same | |
| panel_player_info plate the objective above it wears, so the older context | |
| overlay would draw a frame inside a frame on the one card a player reads | |
| first. The plate is the frame. */ | |
| .uga-command-front > span { grid-row: 1 / 3; width: 32px; height: 32px; display: grid; place-items: center; color: var(--uga-green); } | |
| .uga-command-front.is-warning > span { color: var(--uga-amber); } | |
| .uga-command-front.is-danger > span { color: #ff665e; } | |
| .uga-command-front > span .uga-svg { width: 21px; height: 21px; } | |
| .uga-command-front > div { min-width: 0; } | |
| .uga-command-front > div small, | |
| .uga-command-front > div strong, | |
| .uga-command-front > div p { overflow: hidden; display: block; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-command-front > div small { color: #718f9c; font: 6px/1 Consolas, monospace; letter-spacing: .1em; } | |
| .uga-command-front > div strong { margin-top: 3px; color: #e3f1f7; font-size: 12px; } | |
| .uga-command-front > div p { margin: 3px 0 0; color: var(--uga-green); font: 7px/1 Consolas, monospace; letter-spacing: .06em; } | |
| .uga-command-front.is-warning > div p { color: var(--uga-amber); } | |
| .uga-command-front.is-danger > div p { color: #ff7770; } | |
| .uga-command-front dl { grid-column: 2; display: flex; gap: 10px; margin: 0; } | |
| .uga-command-front dl div { display: flex; align-items: baseline; gap: 4px; } | |
| .uga-command-front dt { color: #617e8a; font: 6px/1 Consolas, monospace; } | |
| .uga-command-front dd { margin: 0; color: #bcd3dc; font: 700 7px/1 Consolas, monospace; } | |
| /* L1 duty watch: the front card now carries its own action pair. The watch is | |
| the one control that advances the strategic clock from the home screen, so | |
| it wears the shared amber pulse only while the front is not breached. The | |
| card's grid columns are icon / copy / actions instead of icon / copy / nav. */ | |
| .uga-front-actions { | |
| grid-column: 3; | |
| grid-row: 1 / 3; | |
| display: flex; | |
| max-height: 68px; | |
| flex-direction: column; | |
| align-items: stretch; | |
| justify-content: center; | |
| gap: 4px; | |
| } | |
| .uga-front-actions button { | |
| min-width: 88px; | |
| min-height: 30px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 5px; | |
| padding: 0 8px; | |
| } | |
| .uga-front-actions button[data-front-watch] { font-size: 7px; letter-spacing: .05em; } | |
| .uga-front-actions button:not([data-front-watch]) { min-height: 26px; } | |
| .uga-command-front > button { | |
| grid-column: 3; | |
| grid-row: 1 / 3; | |
| min-width: 88px; | |
| min-height: 44px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 5px; | |
| border: 1px solid rgba(61, 199, 235, .3); | |
| border-radius: 7px; | |
| background: rgba(12, 61, 81, .4); | |
| color: #b5ddea; | |
| font: 700 7px/1 Consolas, monospace; | |
| letter-spacing: .05em; | |
| cursor: pointer; | |
| } | |
| .uga-command-front > button .uga-svg { width: 12px; height: 12px; } | |
| .uga-command-quick { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 5px; } | |
| .uga-command-quick button { | |
| position: relative; | |
| isolation: isolate; | |
| min-width: 0; | |
| min-height: 44px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 5px; | |
| border: 1px solid var(--uga-line); | |
| border-radius: 7px; | |
| background: rgba(4, 23, 34, .72); | |
| color: #86a2ae; | |
| cursor: pointer; | |
| } | |
| /* Fourth and last place the tab plate was repeated. The quick row is a row of | |
| small passive shortcuts; it keeps the border-radius and line it already has | |
| above, and gains its cyan edge on hover/focus below. */ | |
| .uga-command-quick button:hover, | |
| .uga-command-quick button:focus-visible { color: var(--uga-cyan); border-color: rgba(57, 215, 255, .5); } | |
| .uga-command-quick button:disabled { color: #5f717a; cursor: not-allowed; } | |
| .uga-command-quick .uga-svg { width: 15px; height: 15px; } | |
| .uga-command-quick span { overflow: hidden; font-size: 8px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } | |
| @media (max-width: 480px) and (orientation: portrait) { | |
| .uga-command-front { min-height: 68px; padding: 7px 8px; grid-template-columns: 27px minmax(0, 1fr) 82px; gap: 3px 6px; } | |
| .uga-command-front > span { width: 27px; height: 27px; } | |
| .uga-command-front > span .uga-svg { width: 18px; height: 18px; } | |
| .uga-command-front > div strong { font-size: 11px; } | |
| .uga-command-front dl { gap: 7px; } | |
| .uga-command-front > button { min-width: 82px; padding: 0 5px; font-size: 7px; } | |
| .uga-front-actions { gap: 3px; max-height: 66px; } | |
| .uga-front-actions button { min-width: 82px; min-height: 28px; padding: 0 5px; font-size: 7px; } | |
| .uga-command-quick { gap: 3px; } | |
| .uga-command-quick button { min-height: 44px; flex-direction: column; gap: 2px; } | |
| .uga-command-quick .uga-svg { width: 14px; height: 14px; } | |
| .uga-command-quick span { font-size: 7px; } | |
| } | |
| .uga-command-shell[hidden] { display: none ; } | |
| .uga-command-shell *, .uga-command-shell *::before, .uga-command-shell *::after { box-sizing: border-box; } | |
| .uga-command-shell button, .uga-command-shell select { font: inherit; } | |
| .uga-command-shell button { color: inherit; } | |
| .uga-command-shell button:focus-visible, .uga-command-shell select:focus-visible { outline: 1px solid var(--uga-cyan); outline-offset: 2px; } | |
| .uga-command-shell button:disabled { cursor: not-allowed; opacity: .55; } | |
| .uga-command-shell.is-busy { cursor: progress; } | |
| /* The host leaves the UGA scene layer click-through so the shared WebGL canvas | |
| can receive district picks. These authored scene controls opt back in. */ | |
| .uga-scene-controls, .uga-scene-controls button { pointer-events: auto; } | |
| .uga-svg { width: 20px; height: 20px; flex: 0 0 auto; } | |
| .sr-only { | |
| position: absolute ; | |
| width: 1px ; | |
| height: 1px ; | |
| padding: 0 ; | |
| margin: -1px ; | |
| overflow: hidden ; | |
| clip: rect(0, 0, 0, 0) ; | |
| white-space: nowrap ; | |
| border: 0 ; | |
| } | |
| .uga-command-header { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| min-height: 70px; | |
| padding: max(10px, env(safe-area-inset-top)) 62px 9px 18px; | |
| display: grid; | |
| grid-template-columns: minmax(238px, 1fr) auto; | |
| align-items: center; | |
| gap: 22px; | |
| pointer-events: auto; | |
| background: linear-gradient(180deg, rgba(2, 10, 17, .97) 0%, rgba(3, 14, 23, .9) 74%, rgba(3, 14, 23, .18) 100%); | |
| border-bottom: 1px solid rgba(82, 185, 225, .28); | |
| } | |
| .uga-command-header::after { | |
| content: ""; | |
| position: absolute; | |
| left: 18px; | |
| bottom: -1px; | |
| width: 132px; | |
| height: 2px; | |
| background: var(--uga-cyan); | |
| box-shadow: 0 0 16px rgba(66, 221, 255, .75); | |
| } | |
| .uga-command-identity { display: flex; align-items: center; gap: 11px; min-width: 0; } | |
| .uga-command-crest { | |
| width: 38px; | |
| height: 38px; | |
| display: grid; | |
| place-items: center; | |
| color: var(--uga-cyan); | |
| border: 1px solid rgba(83, 211, 248, .5); | |
| background: rgba(20, 87, 117, .18); | |
| clip-path: polygon(18% 0, 82% 0, 100% 18%, 100% 82%, 82% 100%, 18% 100%, 0 82%, 0 18%); | |
| filter: drop-shadow(0 0 8px rgba(66, 221, 255, .25)); | |
| } | |
| .uga-command-crest .uga-svg { width: 24px; height: 24px; } | |
| .uga-command-identity div { min-width: 0; } | |
| .uga-command-identity strong { | |
| display: block; | |
| font-size: 14px; | |
| line-height: 1.05; | |
| letter-spacing: .13em; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .uga-command-identity span:not(.uga-command-crest) { | |
| display: block; | |
| margin-top: 5px; | |
| color: var(--uga-cyan); | |
| font: 8px/1.1 Consolas, monospace; | |
| letter-spacing: .14em; | |
| } | |
| .uga-resource-ribbon { display: flex; align-items: stretch; justify-content: flex-end; min-width: 0; } | |
| .uga-resource-ribbon:focus-visible { outline: 1px solid var(--uga-cyan); outline-offset: 2px; } | |
| .uga-scroll-cue { display: none; } | |
| .uga-resource { | |
| position: relative; | |
| min-width: 62px; | |
| height: 43px; | |
| padding: 4px 7px 3px 29px; | |
| display: grid; | |
| align-content: center; | |
| border-left: 1px solid rgba(92, 196, 232, .18); | |
| background: rgba(14, 39, 54, .2); | |
| } | |
| .uga-resource:first-child { border-left-color: rgba(92, 196, 232, .38); } | |
| .uga-resource > span { position: absolute; left: 7px; top: 9px; color: var(--uga-cyan); } | |
| .uga-resource > span .uga-svg { width: 15px; height: 15px; } | |
| .uga-resource b { font: 700 12px/1 Consolas, monospace; letter-spacing: 0; color: #fff; } | |
| .uga-resource small { margin-top: 3px; font-size: 6px; line-height: 1; color: var(--uga-muted); text-transform: uppercase; white-space: nowrap; } | |
| .uga-icon-button { | |
| width: 44px; | |
| height: 44px; | |
| border: 1px solid rgba(92, 196, 232, .36); | |
| background: rgba(8, 26, 39, .76); | |
| display: grid; | |
| place-items: center; | |
| cursor: pointer; | |
| clip-path: polygon(7px 0, 100% 0, 100% calc(100% - 7px), calc(100% - 7px) 100%, 0 100%, 0 7px); | |
| } | |
| .uga-icon-button:hover { border-color: var(--uga-cyan); color: var(--uga-cyan); background: rgba(20, 74, 96, .68); } | |
| .uga-icon-button .uga-svg { width: 18px; height: 18px; } | |
| .uga-command-exit { position: absolute; right: 16px; top: max(15px, env(safe-area-inset-top)); } | |
| .uga-command-stage { position: absolute; inset: 70px 0 112px; } | |
| .uga-district-rail { | |
| position: absolute; | |
| top: 16px; | |
| bottom: 8px; | |
| left: 14px; | |
| width: 224px; | |
| display: flex; | |
| flex-direction: column; | |
| min-height: 0; | |
| pointer-events: auto; | |
| } | |
| .uga-overview-button { | |
| position: relative; | |
| min-height: 44px; | |
| flex: 0 0 44px; | |
| display: flex; | |
| align-items: center; | |
| gap: 9px; | |
| padding: 0 12px; | |
| border: 1px solid var(--uga-line); | |
| border-bottom: none; | |
| color: var(--uga-cyan); | |
| background: rgba(5, 18, 29, .78); | |
| font-size: 8px; | |
| font-weight: 800; | |
| letter-spacing: .16em; | |
| cursor: pointer; | |
| text-align: left; | |
| } | |
| .uga-overview-button::after { content: ""; width: 26px; height: 1px; margin-left: auto; background: currentColor; opacity: .5; } | |
| .uga-overview-button .uga-svg { width: 15px; height: 15px; } | |
| .uga-overview-button:hover { background: rgba(18, 60, 80, .8); } | |
| .uga-district-list { | |
| min-height: 0; | |
| overflow-y: auto; | |
| scrollbar-width: thin; | |
| scrollbar-color: rgba(66, 221, 255, .44) rgba(4, 17, 26, .4); | |
| border: 1px solid var(--uga-line); | |
| background: linear-gradient(90deg, rgba(3, 13, 22, .94), rgba(3, 14, 23, .67)); | |
| box-shadow: 12px 14px 32px rgba(0, 0, 0, .2); | |
| } | |
| .uga-district-button { | |
| position: relative; | |
| width: 100%; | |
| min-height: 52px; | |
| padding: 5px 7px 5px 3px; | |
| border: 0; | |
| border-bottom: 1px solid rgba(92, 196, 232, .12); | |
| background: transparent; | |
| display: grid; | |
| grid-template-columns: 22px 31px 1fr 13px; | |
| align-items: center; | |
| gap: 6px; | |
| cursor: pointer; | |
| text-align: left; | |
| transition: background .16s ease, color .16s ease; | |
| } | |
| .uga-district-button::before { | |
| content: ""; | |
| position: absolute; | |
| inset: 5px auto 5px 0; | |
| width: 2px; | |
| background: transparent; | |
| } | |
| .uga-district-button:hover { background: rgba(43, 126, 160, .18); } | |
| .uga-district-button.is-active { background: linear-gradient(90deg, rgba(28, 138, 183, .34), rgba(15, 63, 84, .06)); color: #fff; } | |
| .uga-district-button.is-active::before { background: var(--uga-cyan); box-shadow: 0 0 10px var(--uga-cyan); } | |
| .uga-district-index { color: #486679; font: 7px/1 Consolas, monospace; transform: rotate(-90deg); } | |
| .uga-district-icon { width: 30px; height: 30px; display: grid; place-items: center; color: #7da6bc; border: 1px solid rgba(96, 169, 198, .18); } | |
| .uga-district-icon .uga-svg { width: 17px; height: 17px; } | |
| .uga-district-button.is-active .uga-district-icon { color: var(--uga-cyan); border-color: rgba(66, 221, 255, .46); filter: drop-shadow(0 0 7px rgba(66, 221, 255, .38)); } | |
| .uga-district-copy { min-width: 0; } | |
| .uga-district-copy b { display: block; font-size: 9px; letter-spacing: .06em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } | |
| .uga-district-copy small { display: block; margin-top: 4px; color: var(--uga-muted); font: 6px/1 Consolas, monospace; letter-spacing: .11em; } | |
| .uga-row-chevron { width: 11px; height: 11px; color: #466779; } | |
| .uga-district-button.is-active .uga-row-chevron { color: var(--uga-cyan); } | |
| .uga-scene-overlay { position: absolute; inset: 0; overflow: hidden; pointer-events: none; } | |
| .uga-scene-title { position: absolute; left: 260px; top: 18px; display: flex; flex-direction: column; text-shadow: 0 2px 10px #000; } | |
| .uga-scene-title span { color: var(--uga-cyan); font: 7px/1 Consolas, monospace; letter-spacing: .2em; } | |
| .uga-scene-title strong { margin-top: 5px; font-size: 17px; font-weight: 500; letter-spacing: .09em; } | |
| .uga-camera-readout { position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%); display: flex; align-items: center; gap: 8px; color: rgba(163, 212, 231, .78); font: 7px/1 Consolas, monospace; letter-spacing: .16em; white-space: nowrap; text-shadow: 0 1px 8px #000; } | |
| .uga-camera-readout i { display: block; width: 20px; height: 1px; background: rgba(83, 211, 248, .65); } | |
| .uga-context-panel { | |
| position: absolute; | |
| top: 16px; | |
| right: 14px; | |
| bottom: 8px; | |
| width: min(390px, 31vw); | |
| min-width: 316px; | |
| pointer-events: auto; | |
| border: 1px solid var(--uga-line); | |
| background: linear-gradient(155deg, rgba(5, 17, 27, .93), rgba(5, 17, 27, .78)); | |
| box-shadow: -18px 20px 48px rgba(0, 0, 0, .25); | |
| clip-path: polygon(13px 0, 100% 0, 100% calc(100% - 13px), calc(100% - 13px) 100%, 0 100%, 0 13px); | |
| } | |
| .uga-context-panel::before { content: ""; position: absolute; top: 0; left: 13px; width: 78px; height: 2px; background: var(--uga-cyan); z-index: 2; box-shadow: 0 0 13px rgba(66, 221, 255, .5); } | |
| .uga-context-body { position: absolute; inset: 0; } | |
| .uga-sheet-toggle { display: none; } | |
| .uga-deployment-toolbar { display: none; } | |
| .uga-sheet-toggle[hidden], .uga-deployment-toolbar[hidden] { display: none ; } | |
| .uga-context-scroll { position: absolute; inset: 0; padding: 16px 15px 18px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(66, 221, 255, .4) transparent; } | |
| /* Preparation keeps a compact route back to the authored ship sections. | |
| The detailed management chrome is restored by that route, not duplicated | |
| over the hangar while the commander is arranging an expedition. */ | |
| .uga-command-shell.is-deployment-mode .uga-command-header, | |
| .uga-command-shell.is-deployment-mode .uga-district-rail, | |
| .uga-command-shell.is-deployment-mode .uga-scene-overlay, | |
| .uga-command-shell.is-deployment-mode .uga-command-nav, | |
| .uga-command-shell.is-deployment-mode .uga-quick-actions { display: none; } | |
| .uga-command-shell.is-deployment-mode .uga-command-stage { inset: 0; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar { | |
| position: absolute; | |
| inset: 0 0 auto; | |
| min-height: 48px; | |
| padding: 0 10px 0 6px; | |
| display: grid; | |
| grid-template-columns: minmax(132px, auto) minmax(0, 1fr) auto; | |
| align-items: center; | |
| gap: 8px; | |
| border-bottom: 1px solid rgba(92, 196, 232, .3); | |
| background: linear-gradient(90deg, rgba(3, 24, 35, .99), rgba(6, 35, 47, .97)); | |
| z-index: 4; | |
| } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar > button { | |
| min-height: 44px; | |
| padding: 0 9px; | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| border: 0; | |
| border-right: 1px solid rgba(92, 196, 232, .2); | |
| background: transparent; | |
| color: #9dc4d3; | |
| font-size: 8px; | |
| font-weight: 800; | |
| letter-spacing: .06em; | |
| } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar > button .uga-svg { width: 13px; height: 13px; transform: rotate(180deg); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar > b { min-width: 0; overflow: hidden; color: #d8edf4; font-size: 10px; letter-spacing: .12em; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar > small { padding: 4px 5px; color: var(--uga-green); border: 1px solid rgba(114, 229, 178, .36); font: 7px/1 Consolas, monospace; } | |
| .uga-command-shell.is-deployment-mode .uga-context-body { inset: 48px 0 0; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness { position: sticky; bottom: 0; z-index: 5; box-shadow: 0 -8px 20px rgba(0, 0, 0, .42); } | |
| .uga-context-heading { display: grid; grid-template-columns: 42px 1fr auto; align-items: center; gap: 10px; padding-bottom: 12px; border-bottom: 1px solid rgba(92, 196, 232, .18); } | |
| .uga-heading-icon { width: 40px; height: 40px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .34); background: rgba(31, 106, 137, .14); } | |
| .uga-heading-icon .uga-svg { width: 22px; height: 22px; } | |
| .uga-context-heading small, .uga-section-title > small { display: block; color: var(--uga-cyan); font: 6px/1 Consolas, monospace; letter-spacing: .16em; } | |
| .uga-context-heading h2, .uga-section-title h2 { margin: 5px 0 0; font-size: 17px; line-height: 1; letter-spacing: .05em; font-weight: 650; } | |
| .uga-tier-badge { padding: 6px 7px; color: var(--uga-amber); border: 1px solid rgba(255, 181, 74, .42); background: rgba(111, 63, 8, .18); font: 7px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .uga-tier-rail { height: 29px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 3px; margin: 12px 0 10px; } | |
| .uga-tier-rail span { position: relative; display: flex; align-items: center; padding: 0 7px; gap: 6px; color: #6f8fa3; border: 1px solid rgba(98, 151, 175, .14); background: rgba(26, 55, 69, .14); } | |
| .uga-tier-rail span i { width: 5px; height: 5px; border: 1px solid currentColor; transform: rotate(45deg); } | |
| .uga-tier-rail span b { font: 7px/1 Consolas, monospace; } | |
| .uga-tier-rail span.is-on { color: var(--uga-cyan); border-color: rgba(66, 221, 255, .3); background: rgba(19, 98, 126, .22); } | |
| .uga-tier-rail span.is-on i { background: currentColor; box-shadow: 0 0 7px currentColor; } | |
| .uga-district-description, .uga-section-title p { margin: 0; color: #9bb2c2; font-size: 9px; line-height: 1.55; letter-spacing: .02em; } | |
| .uga-activity-line { margin: 10px 0 12px; min-height: 27px; padding: 6px 8px; display: flex; align-items: center; gap: 7px; background: rgba(38, 88, 67, .18); border-left: 2px solid var(--uga-green); color: #aee4c1; font: 7px/1.25 Consolas, monospace; } | |
| .uga-activity-line i { width: 5px; height: 5px; border-radius: 50%; background: var(--uga-green); box-shadow: 0 0 8px var(--uga-green); animation: uga-pulse 2.2s ease-in-out infinite; } | |
| .uga-activity-line b { margin-left: auto; color: var(--uga-green); font-size: 6px; } | |
| @keyframes uga-pulse { 50% { opacity: .35; } } | |
| .uga-panel-section { margin-top: 12px; } | |
| /* Frontier dedication ladder — the rung board under the objective card. | |
| Status colors reuse the convention the rooms already teach: cyan = live | |
| work, dim = fog. Locked rungs are visible but greyed; the note line, not a | |
| lock glyph, says why ("Requires: Outer Relay Phase Trace"). */ | |
| /* The shell styles list items elsewhere, so the ladder resets every nested | |
| list itself — an `ol`-only rule leaked the shell's markers onto the planet | |
| rungs as stray rings. */ | |
| .uga-ladder ol, .uga-ladder ul { list-style: none; margin: 0; padding: 0; } | |
| .uga-ladder li::before { content: none; } | |
| .uga-ladder-systems { display: grid; gap: 8px; margin-top: 8px ; } | |
| .uga-ladder-system { border: 1px solid rgba(92, 196, 232, .14); border-left-width: 3px; padding: 7px 9px; } | |
| .uga-ladder-system.is-reached { border-left-color: rgba(92, 196, 232, .75); } | |
| .uga-ladder-system.is-fog { opacity: .55; } | |
| .uga-ladder-system > b { display: block; font-size: 12px; letter-spacing: .04em; color: #cfe9f6; } | |
| .uga-ladder-system > small { display: block; margin-top: 1px; color: #6f8fa3; font: 8px/1.2 Consolas, monospace; letter-spacing: .08em; } | |
| .uga-ladder-planets { display: grid; gap: 6px; margin-top: 6px ; } | |
| .uga-ladder-planet { border: 1px solid rgba(92, 196, 232, .12); padding: 6px 8px; } | |
| .uga-ladder-planet.is-fog { opacity: .6; } | |
| .uga-ladder-planet > b { display: inline-block; font-size: 11px; color: #e6f4fb; } | |
| .uga-ladder-planet > span { float: right; font: 8px/1.6 Consolas, monospace; letter-spacing: .1em; color: #63d9ff; } | |
| .uga-ladder-planet.is-fog > span { color: #b7803c; } | |
| .uga-ladder-planet > small { display: block; margin-top: 2px; color: #8fa9ba; font-size: 9px; line-height: 1.35; } | |
| .uga-ladder-areas { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 4px; margin-top: 5px ; } | |
| .uga-ladder-area { display: flex; align-items: baseline; gap: 6px; border: 1px solid rgba(92, 196, 232, .1); padding: 4px 6px; } | |
| .uga-ladder-area > span { flex: 1; min-width: 0; font-size: 9px; color: #cfe9f6; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-ladder-area > b { font: 9px/1 Consolas, monospace; color: #9db8ca; } | |
| .uga-ladder-area > small { font: 7px/1 Consolas, monospace; letter-spacing: .1em; color: #63d9ff; } | |
| .uga-ladder-area.is-held > small { color: #6fe3a5; } | |
| .uga-ladder-area.is-fog { opacity: .55; } | |
| .uga-ladder-area.is-fog > small { color: #b7803c; } | |
| .uga-ladder > footer { margin-top: 6px; color: #6f8fa3; } | |
| .uga-ladder > footer small { font: 8px/1 Consolas, monospace; letter-spacing: .1em; } | |
| @media (max-width: 480px) { | |
| .uga-ladder-areas { grid-template-columns: 1fr; } | |
| } | |
| .uga-panel-section > header { min-height: 44px; display: flex; align-items: center; justify-content: space-between; color: #9db8ca; border-bottom: 1px solid rgba(92, 196, 232, .18); } | |
| .uga-panel-section > header span { font-size: 7px; font-weight: 800; letter-spacing: .13em; } | |
| .uga-panel-section > header small { color: #6f8fa3; font: 9px/1 Consolas, monospace; } | |
| .uga-feature { min-height: 44px; display: flex; align-items: center; gap: 8px; padding: 5px 3px; color: #6f8fa3; border-bottom: 1px solid rgba(92, 196, 232, .08); } | |
| .uga-feature .uga-svg { width: 13px; height: 13px; } | |
| .uga-feature span { display: grid; grid-template-columns: 48px 1fr; align-items: center; gap: 7px; font-size: 8px; } | |
| .uga-feature span b { color: #6f8fa3; font: 7px/1 Consolas, monospace; } | |
| .uga-feature.is-unlocked { color: #c4dbe9; } | |
| .uga-feature.is-unlocked .uga-svg, .uga-feature.is-unlocked span b { color: var(--uga-green); } | |
| .uga-socket-list { margin-top: 3px; } | |
| .uga-socket { min-height: 46px; display: grid; grid-template-columns: 31px minmax(75px, 1fr) minmax(84px, .8fr) auto; align-items: center; gap: 7px; border-bottom: 1px solid rgba(92, 196, 232, .1); } | |
| .uga-socket.is-locked { color: #7b9cb0; } | |
| .uga-socket-mark { position: relative; width: 28px; height: 28px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .26); } | |
| .uga-socket-mark .uga-svg { width: 13px; height: 13px; } | |
| .uga-socket-mark span { position: absolute; top: -4px; right: -4px; padding: 1px 2px; color: #7696a8; background: #07131d; font: 5px/1 Consolas, monospace; } | |
| .uga-socket-copy { min-width: 0; } | |
| .uga-socket-copy small { display: block; color: #6e8b9d; font-size: 6px; line-height: 1; text-transform: uppercase; } | |
| .uga-socket-copy b { display: block; margin-top: 4px; font-size: 7px; line-height: 1.1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } | |
| /* What an installed module does, under its name. constructionEffectMarkup | |
| emits bare <span>s meant for a flex row, so without this they inherit the | |
| <em> italic and butt straight into one another — "survey intelligence10 MW | |
| draw" on one line at body size. Small, upright, and spaced apart. */ | |
| .uga-socket-effects { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 2px 8px; | |
| margin-top: 3px; | |
| font-style: normal; | |
| font-size: 6px; | |
| line-height: 1.25; | |
| color: #6e8b9d; | |
| text-transform: uppercase; | |
| letter-spacing: .04em; | |
| } | |
| .uga-socket-effects span { display: inline-flex; gap: 3px; white-space: nowrap; } | |
| .uga-socket-effects b { color: #8fd8ff; font-size: 6px; font-weight: 700; } | |
| .uga-module-picker select, .uga-deployment-planner select { | |
| width: 100%; | |
| min-height: 44px; | |
| padding: 0 20px 0 6px; | |
| color: #c7dfeb; | |
| border: 1px solid rgba(82, 172, 205, .27); | |
| border-radius: 0; | |
| background: #0a1b28; | |
| font-size: 7px; | |
| text-transform: uppercase; | |
| } | |
| .uga-mini-button { | |
| min-height: 44px; | |
| padding: 0 8px; | |
| border: 1px solid rgba(66, 221, 255, .36); | |
| background: rgba(15, 71, 94, .26); | |
| color: var(--uga-cyan); | |
| font-size: 6px; | |
| font-weight: 800; | |
| letter-spacing: .1em; | |
| cursor: pointer; | |
| } | |
| .uga-mini-button:hover:not(:disabled) { background: rgba(25, 119, 155, .4); border-color: var(--uga-cyan); } | |
| .uga-empty-state { margin: 9px 0; padding: 14px; color: #718da0; border: 1px dashed rgba(92, 196, 232, .18); font-size: 8px; line-height: 1.55; text-align: center; } | |
| .uga-upgrade-block { margin-top: 14px; padding: 11px; border: 1px solid rgba(255, 181, 74, .3); background: linear-gradient(115deg, rgba(82, 47, 9, .25), rgba(18, 32, 41, .12)); } | |
| .uga-upgrade-block > div:first-child small { display: block; color: var(--uga-amber); font: 11px/1.3 Consolas, monospace; letter-spacing: .04em; } | |
| .uga-upgrade-block > div:first-child b { display: block; margin-top: 5px; font-size: 14px; } | |
| .uga-upgrade-block p { font-size: 12px; line-height: 1.4; } | |
| .uga-upgrade-cost { display: flex; gap: 7px; margin: 10px 0; } | |
| .uga-upgrade-cost > span { flex: 1; min-width: 0; padding: 4px; display: grid; grid-template-columns: 15px 1fr; grid-template-rows: 1fr 1fr; align-items: center; column-gap: 4px; background: rgba(0, 0, 0, .18); } | |
| .uga-upgrade-cost .uga-svg { width: 13px; height: 13px; grid-row: span 2; color: var(--uga-amber); } | |
| .uga-upgrade-cost b { font: 8px/1 Consolas, monospace; } | |
| .uga-upgrade-cost small { color: #748b99; font-size: 5px; text-transform: uppercase; } | |
| .uga-primary-button { | |
| width: 100%; | |
| min-height: 44px; | |
| padding: 0 10px 0 13px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| border: 1px solid rgba(66, 221, 255, .62); | |
| background: linear-gradient(90deg, rgba(17, 111, 145, .46), rgba(7, 48, 67, .42)); | |
| color: #eafbff; | |
| font-size: 7px; | |
| font-weight: 800; | |
| letter-spacing: .12em; | |
| cursor: pointer; | |
| clip-path: polygon(0 0, calc(100% - 9px) 0, 100% 9px, 100% 100%, 9px 100%, 0 calc(100% - 9px)); | |
| } | |
| .uga-primary-button:hover { background: rgba(25, 132, 170, .62); box-shadow: inset 0 0 20px rgba(66, 221, 255, .12); } | |
| .uga-primary-button .uga-svg { width: 13px; height: 13px; } | |
| .uga-max-tier { margin-top: 13px; padding: 10px; color: var(--uga-green); border: 1px solid rgba(116, 224, 162, .25); text-align: center; font: 7px/1 Consolas, monospace; letter-spacing: .13em; } | |
| .uga-classic-terminal { margin-top: 14px; padding: 10px; border: 1px solid rgba(255, 181, 74, .31); background: rgba(25, 19, 10, .36); box-shadow: inset 0 0 28px rgba(255, 181, 74, .04); } | |
| .uga-terminal-heading { display: grid; grid-template-columns: 28px 1fr auto; gap: 8px; align-items: center; } | |
| .uga-terminal-heading > .uga-svg { width: 23px; height: 23px; color: var(--uga-amber); } | |
| .uga-terminal-heading small { display: block; color: #9d7b4c; font: 5px/1 Consolas, monospace; letter-spacing: .13em; } | |
| .uga-terminal-heading b { display: block; margin-top: 4px; font-size: 10px; letter-spacing: .12em; } | |
| .uga-terminal-live { padding: 4px; color: var(--uga-green); border: 1px solid rgba(116, 224, 162, .3); font: 5px/1 Consolas, monospace; } | |
| .uga-classic-terminal > p { margin: 8px 0; color: #8e9eaa; font-size: 7px; line-height: 1.45; } | |
| .uga-mode-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; } | |
| .uga-mode-grid button { min-height: 48px; padding: 5px 24px 5px 7px; position: relative; border: 1px solid rgba(255, 181, 74, .18); background: rgba(76, 47, 13, .12); text-align: left; cursor: pointer; } | |
| .uga-mode-grid button:hover { border-color: rgba(255, 181, 74, .56); background: rgba(105, 60, 9, .28); } | |
| .uga-mode-grid button:disabled { color: #6b7780; border-color: rgba(109, 132, 147, .2); background: rgba(41, 52, 60, .2); cursor: not-allowed; } | |
| .uga-mode-grid button:disabled:hover { border-color: rgba(109, 132, 147, .2); background: rgba(41, 52, 60, .2); } | |
| .uga-mode-grid button span { display: block; font-size: 8px; font-weight: 700; } | |
| .uga-mode-grid button small { display: block; margin-top: 3px; color: #806d55; font-size: 5px; } | |
| .uga-mode-grid button .uga-svg { position: absolute; right: 6px; top: 12px; width: 12px; height: 12px; color: var(--uga-amber); } | |
| .uga-mode-support { margin-top: 9px; padding-top: 8px; border-top: 1px solid rgba(255, 181, 74, .15); } | |
| .uga-mode-support > small { display: block; margin-bottom: 6px; color: #8b7557; font: 5px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .uga-section-title { padding: 1px 0 13px; border-bottom: 1px solid rgba(92, 196, 232, .18); } | |
| .uga-section-title p { margin-top: 8px; } | |
| .uga-command-visual { | |
| --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/operations-war-table-v1.webp'); | |
| position: relative; | |
| min-height: clamp(92px, 17vh, 142px); | |
| margin: 10px 0; | |
| overflow: hidden; | |
| border: 1px solid rgba(66, 221, 255, .3); | |
| border-radius: 9px; | |
| background: #050c14 var(--uga-command-art) center / cover no-repeat; | |
| box-shadow: 0 10px 25px rgba(0, 0, 0, .3), inset 0 1px rgba(255, 255, 255, .06); | |
| isolation: isolate; | |
| } | |
| .uga-command-visual.is-arsenal { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/arsenal-fabrication-bay-v1.webp'); } | |
| .uga-command-visual.is-research { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/research-directorate-v1.webp'); } | |
| .uga-command-visual.is-contracts { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/contracts-intel-table-v1.webp'); } | |
| .uga-command-visual.is-navigation { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-navigation-bridge-v1.webp'); } | |
| .uga-command-visual.is-survey { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-survey-lab-v1.webp'); } | |
| .uga-command-visual.is-habitat { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-habitat-medical-v1.webp'); } | |
| .uga-command-visual.is-hangar { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-strike-hangar-v1.webp'); } | |
| .uga-command-visual.is-logistics { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-logistics-cargo-v1.webp'); } | |
| .uga-command-visual.is-embassy { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-coalition-embassy-v1.webp'); } | |
| .uga-command-visual.is-concourse, | |
| .uga-command-visual.is-systems { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-command-concourse-v1.webp'); } | |
| .uga-command-visual.is-engineering { --uga-command-art: url('../../assets/runtime/ui/menu-art-v1/uga-engineering-systems-v1.webp'); } | |
| .uga-command-visual::before { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| z-index: 1; | |
| pointer-events: none; | |
| background: linear-gradient(90deg, rgba(2, 10, 17, .52), transparent 28%, transparent 72%, rgba(2, 10, 17, .52)), | |
| linear-gradient(0deg, rgba(2, 10, 17, .62), transparent 52%, rgba(2, 10, 17, .08)); | |
| box-shadow: inset 0 0 0 5px rgba(1, 8, 14, .2); | |
| } | |
| .uga-command-visual::after { | |
| content: ""; | |
| position: absolute; | |
| z-index: 2; | |
| left: -32%; | |
| top: 0; | |
| width: 28%; | |
| height: 100%; | |
| pointer-events: none; | |
| background: linear-gradient(90deg, transparent, rgba(66, 221, 255, .16), transparent); | |
| transform: skewX(-17deg); | |
| animation: uga-command-art-scan 8.4s ease-in-out infinite; | |
| } | |
| .uga-command-visual > i { | |
| position: absolute; | |
| z-index: 3; | |
| left: 50%; | |
| top: 50%; | |
| width: 34px; | |
| height: 34px; | |
| border: 1px solid rgba(255, 181, 74, .56); | |
| border-radius: 50%; | |
| transform: translate(-50%, -50%); | |
| box-shadow: 0 0 16px rgba(255, 181, 74, .14); | |
| opacity: .64; | |
| } | |
| .uga-command-visual > i::before, | |
| .uga-command-visual > i::after { content: ""; position: absolute; background: rgba(255, 181, 74, .72); } | |
| .uga-command-visual > i::before { left: -7px; right: -7px; top: 50%; height: 1px; } | |
| .uga-command-visual > i::after { top: -7px; bottom: -7px; left: 50%; width: 1px; } | |
| @keyframes uga-command-art-scan { | |
| 0%, 30% { transform: translateX(0) skewX(-17deg); opacity: 0; } | |
| 46% { opacity: .72; } | |
| 72%, 100% { transform: translateX(470%) skewX(-17deg); opacity: 0; } | |
| } | |
| .uga-record-list { display: grid; gap: 7px; margin-top: 10px; } | |
| .uga-record-card { min-height: 89px; padding: 9px; display: grid; grid-template-columns: 35px 1fr auto; gap: 9px; align-items: start; border: 1px solid rgba(92, 196, 232, .16); background: rgba(14, 40, 53, .18); } | |
| .uga-record-sigil { width: 34px; height: 34px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .24); } | |
| .uga-record-sigil .uga-svg { width: 19px; height: 19px; } | |
| .uga-record-card small, .uga-intel-card small { color: var(--uga-cyan); font: 5px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .uga-record-card h3, .uga-mission-card h3, .uga-research-card h3, .uga-intel-card h3 { margin: 4px 0 0; font-size: 10px; letter-spacing: .06em; } | |
| .uga-record-card p, .uga-mission-card p, .uga-research-card p, .uga-intel-card p { margin: 5px 0; color: #829baa; font-size: 7px; line-height: 1.4; } | |
| .uga-reputation { position: relative; height: 10px; margin-top: 7px; background: rgba(0, 0, 0, .28); overflow: hidden; } | |
| .uga-reputation span { position: absolute; inset: 0 auto 0 0; width: var(--value); background: linear-gradient(90deg, #197e9f, var(--uga-cyan)); opacity: .55; } | |
| .uga-reputation b { position: absolute; inset: 0 4px auto auto; color: #d9f6ff; font: 5px/10px Consolas, monospace; } | |
| .uga-commander-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 5px; margin-top: 7px; } | |
| .uga-commander-card { min-height: 69px; padding: 6px; display: grid; grid-template-columns: 43px 1fr; grid-template-rows: 1fr 1fr; align-items: center; column-gap: 7px; border: 1px solid rgba(92, 196, 232, .17); background: rgba(8, 30, 43, .22); text-align: left; cursor: pointer; } | |
| .uga-personnel-portrait { position: relative; display: block; overflow: hidden; border: 1px solid rgba(92, 196, 232, .32); background: #091823; } | |
| .uga-personnel-portrait[hidden] { display: none; } | |
| .uga-personnel-portrait::after { content: ""; position: absolute; inset: 0; border: 1px solid rgba(211, 244, 255, .08); box-shadow: inset 0 -12px 18px rgba(0, 9, 15, .35); pointer-events: none; } | |
| .uga-personnel-portrait img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: 50% 18%; } | |
| .uga-commander-card > .uga-personnel-portrait { grid-row: span 2; width: 42px; height: 54px; } | |
| .uga-commander-card b { font-size: 8px; } | |
| .uga-commander-card small { color: var(--uga-green); font: 5px/1 Consolas, monospace; } | |
| .uga-mission-card { width: 100%; min-height: 105px; padding: 10px; position: relative; border: 1px solid rgba(92, 196, 232, .18); background: rgba(10, 33, 47, .26); text-align: left; cursor: pointer; } | |
| .uga-mission-card:hover:not(:disabled), .uga-mission-card.is-selected { border-color: rgba(66, 221, 255, .52); background: rgba(17, 67, 89, .3); } | |
| .uga-mission-card.is-locked { border-color: rgba(124, 94, 85, .2); } | |
| .uga-mission-code { color: var(--uga-amber); font: 6px/1 Consolas, monospace; letter-spacing: .13em; } | |
| .uga-mission-card > div { margin-top: 8px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid rgba(92, 196, 232, .1); padding-top: 6px; } | |
| .uga-mission-card > div small { color: #627f91; font-size: 5px; } | |
| .uga-mission-card > div b { color: #c6e1ee; font-size: 6px; } | |
| .uga-mission-card ul { margin: 8px 0 0; padding: 0; list-style: none; } | |
| .uga-mission-card li { display: flex; align-items: center; gap: 5px; color: #bb7e7e; font-size: 6px; line-height: 1.5; } | |
| .uga-mission-card li .uga-svg, .uga-mission-ready .uga-svg { width: 10px; height: 10px; } | |
| .uga-mission-ready { margin-top: 8px; display: flex; align-items: center; gap: 5px; color: var(--uga-green); font: 6px/1 Consolas, monospace; } | |
| .uga-debrief-archive { margin-top: 14px; padding-top: 12px; border-top: 1px solid rgba(114, 229, 178, .24); } | |
| .uga-debrief-archive > header { display: flex; align-items: end; justify-content: space-between; gap: 8px; } | |
| .uga-debrief-archive > header small { display: block; color: var(--uga-green); font: 5px/1 Consolas, monospace; letter-spacing: .13em; } | |
| .uga-debrief-archive > header h3 { margin: 4px 0 0; color: #d8edf4; font-size: 11px; letter-spacing: .07em; } | |
| .uga-debrief-archive > header > b { padding: 4px 6px; color: var(--uga-green); border: 1px solid rgba(114, 229, 178, .3); font: 5px/1 Consolas, monospace; white-space: nowrap; } | |
| .uga-debrief-archive > p { margin: 7px 0 0; color: #7996a5; font-size: 7px; line-height: 1.45; } | |
| .uga-debrief-list { display: grid; gap: 6px; margin-top: 8px; } | |
| .uga-debrief-record { padding: 8px; border: 1px solid rgba(92, 196, 232, .16); border-left: 2px solid #6d8998; background: rgba(7, 27, 39, .46); } | |
| .uga-debrief-record.is-victory { border-left-color: var(--uga-green); } | |
| .uga-debrief-record.is-partial { border-left-color: var(--uga-amber); } | |
| .uga-debrief-record.is-setback { border-left-color: #ff6d72; } | |
| .uga-debrief-record > div:first-child { min-width: 0; display: flex; align-items: baseline; justify-content: space-between; gap: 8px; } | |
| .uga-debrief-record > div:first-child small { max-width: 54%; overflow: hidden; color: #628696; font: 5px/1 Consolas, monospace; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-debrief-record > div:first-child strong { min-width: 0; overflow: hidden; color: #cbe6ef; font-size: 8px; letter-spacing: .04em; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-debrief-record dl { margin: 7px 0 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; } | |
| .uga-debrief-record dl div { min-width: 0; padding: 5px; border: 1px solid rgba(92, 196, 232, .1); background: rgba(1, 13, 20, .36); } | |
| .uga-debrief-record dt { color: #58798a; font: 5px/1 Consolas, monospace; } | |
| .uga-debrief-record dd { margin: 3px 0 0; overflow: hidden; color: #b8d3dd; font: 6px/1.2 Consolas, monospace; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-debrief-record > p { margin: 7px 0 0; color: #88a998; font: 5px/1.4 Consolas, monospace; } | |
| .operation-modal[data-operation-state="debrief"] .operation-card { border-top-color: var(--uga-green); } | |
| .operation-modal[data-operation-state="debrief"] .operation-payload { white-space: normal; } | |
| .operation-modal[data-operation-state="launch-rejected"] .operation-card { border-top-color: #ff6d72; } | |
| .operation-debrief-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; } | |
| .operation-debrief-section { min-width: 0; padding: 8px; border: 1px solid rgba(92, 196, 232, .14); background: rgba(8, 27, 38, .42); } | |
| .operation-debrief-section:last-child { grid-column: 1 / -1; border-color: rgba(114, 229, 178, .3); } | |
| .operation-debrief-section h3 { margin: 0 0 6px; color: var(--uga-cyan); font: 7px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .operation-debrief-section dl { margin: 0; display: grid; gap: 4px; } | |
| .operation-debrief-section dl div { min-width: 0; display: grid; grid-template-columns: minmax(90px, .8fr) minmax(0, 1.2fr); gap: 6px; } | |
| .operation-debrief-section dt { color: #628292; } | |
| .operation-debrief-section dd { min-width: 0; margin: 0; overflow-wrap: anywhere; color: #c1dbe5; text-align: right; } | |
| .uga-deployment-planner { --deployment-faction: #70e5ff; --deployment-faction-wash: rgba(40, 123, 153, .22); margin-top: 12px; padding: 11px; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; border: 1px solid var(--deployment-faction); background: linear-gradient(135deg, var(--deployment-faction-wash), rgba(4, 19, 28, .75) 48%); } | |
| .uga-deployment-planner[data-faction-id="dominion"] { --deployment-faction: #ff9471; --deployment-faction-wash: rgba(153, 54, 31, .25); } | |
| .uga-deployment-planner[data-faction-id="syndicate"] { --deployment-faction: #d1a2ff; --deployment-faction-wash: rgba(91, 45, 137, .27); } | |
| .uga-deployment-planner .uga-deployment-summary > span, | |
| .uga-deployment-planner .uga-deployment-summary strong, | |
| .uga-deployment-planner [data-deployment-station="base_deployer"].is-active > span { color: var(--deployment-faction); } | |
| .uga-deployment-planner [data-deployment-station="base_deployer"].is-active { border-color: var(--deployment-faction); box-shadow: inset 0 -2px 0 var(--deployment-faction); background: linear-gradient(135deg, var(--deployment-faction-wash), rgba(7, 26, 37, .7)); } | |
| .uga-deployment-planner.is-invalid { border-color: rgba(255, 94, 98, .68); box-shadow: inset 0 0 24px rgba(255, 94, 98, .08); } | |
| .uga-deployment-planner header { grid-column: 1 / -1; } | |
| .uga-deployment-planner header small { color: var(--uga-amber); font: 6px/1 Consolas, monospace; } | |
| .uga-deployment-planner header h3 { margin: 4px 0 2px; font-size: 12px; } | |
| .uga-deployment-planner > header p { margin: 5px 0 0; color: #7d98a7; font-size: 8px; line-height: 1.45; } | |
| .uga-deployment-identity { grid-column: 1 / -1; min-width: 0; display: grid; grid-template-columns: minmax(120px, .7fr) minmax(180px, 1.3fr); gap: 7px; align-items: end; } | |
| .uga-deployment-identity > label { min-width: 0; } | |
| .uga-ground-route { | |
| grid-column: 1 / -1; | |
| min-width: 0; | |
| min-height: 54px; | |
| padding: 6px 8px; | |
| display: grid; | |
| grid-template-columns: minmax(104px, .8fr) minmax(154px, 1.2fr); | |
| align-items: end; | |
| gap: 8px; | |
| border: 1px solid var(--uga-line); | |
| border-radius: 7px; | |
| background: rgba(6, 27, 39, .76); | |
| } | |
| .uga-ground-route > div { min-width: 0; align-self: center; } | |
| .uga-ground-route > div small, | |
| .uga-ground-route > div strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-ground-route > div small { color: var(--uga-cyan); font: 8px/1 Consolas, monospace; letter-spacing: .08em; } | |
| .uga-ground-route > div strong { margin-top: 4px; color: #dceff6; font-size: 11px; } | |
| .uga-ground-route > label { min-width: 0; } | |
| .uga-ground-route > label > span { display: block; margin-bottom: 3px; color: #8fa9b5; font-size: 9px; } | |
| .uga-ground-route select { width: 100%; min-height: 44px; color: #dceff6; border: 1px solid rgba(92, 196, 232, .28); background: #071c28; } | |
| .uga-portrait-unavailable { width: 100%; height: 100%; min-height: 32px; display: grid; place-items: center; color: var(--uga-muted); background: rgba(12, 33, 44, .85); } | |
| .uga-portrait-unavailable .uga-svg { width: 24px; height: 24px; } | |
| .uga-deployment-identity .uga-personnel-select { grid-template-columns: 32px minmax(0, 1fr); } | |
| .uga-deployment-identity .uga-deployment-portrait { width: 31px; height: 42px; } | |
| .uga-deployment-stations { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 5px; } | |
| .uga-deployment-station { min-width: 0; min-height: 48px; padding: 6px; display: grid; grid-template-columns: 24px minmax(0, 1fr); grid-template-rows: auto auto; align-items: center; column-gap: 7px; border: 1px solid rgba(92, 196, 232, .18); background: rgba(5, 23, 34, .66); color: #bfd8e3; text-align: left; cursor: pointer; } | |
| .uga-deployment-station > span { grid-row: 1 / 3; width: 24px; height: 24px; display: grid; place-items: center; border: 1px solid rgba(66, 221, 255, .24); color: var(--uga-cyan); } | |
| .uga-deployment-station .uga-svg { width: 14px; height: 14px; } | |
| .uga-deployment-station b { min-width: 0; color: #d8edf4; font-size: 11px; line-height: 1.2; white-space: normal; overflow-wrap: anywhere; } | |
| .uga-deployment-station small { min-width: 0; color: #9abac9; font: 10px/1.3 Consolas, monospace; white-space: normal; overflow-wrap: anywhere; } | |
| .uga-deployment-station.is-active { border-color: rgba(66, 221, 255, .75); background: linear-gradient(135deg, rgba(20, 91, 119, .46), rgba(7, 26, 37, .7)); box-shadow: inset 0 -2px 0 rgba(66, 221, 255, .74), 0 0 15px rgba(30, 193, 230, .08); } | |
| .uga-deployment-station.is-active small { color: var(--uga-green); } | |
| .uga-deployment-readiness { grid-column: 1 / -1; min-height: 50px; padding: 4px 4px 4px 9px; display: grid; grid-template-columns: minmax(0, 1fr) minmax(150px, .85fr); align-items: center; gap: 8px; border: 1px solid rgba(92, 196, 232, .24); background: linear-gradient(90deg, rgba(4, 20, 29, .88), rgba(7, 31, 42, .64)); } | |
| .uga-deployment-readiness > span { min-width: 0; display: grid; gap: 4px; } | |
| .uga-deployment-readiness small { color: #6f91a2; font: 6px/1 Consolas, monospace; letter-spacing: .08em; } | |
| .uga-deployment-readiness b { color: #cbeaf2; font: 700 10px/1 Consolas, monospace; letter-spacing: .08em; } | |
| .uga-deployment-readiness.is-ready { border-color: rgba(114, 229, 178, .54); box-shadow: inset 3px 0 0 rgba(114, 229, 178, .82); } | |
| .uga-deployment-readiness.is-ready b { color: var(--uga-green); } | |
| .uga-deployment-readiness.is-blocked { border-color: rgba(255, 94, 98, .52); } | |
| .uga-deployment-readiness .uga-primary-button { grid-column: auto; min-height: 44px; margin: 0; } | |
| .uga-deployment-planner label { display: grid; gap: 4px; } | |
| .uga-deployment-planner label > span, .uga-deployment-planner legend { color: #748e9e; font-size: 6px; text-transform: uppercase; } | |
| .uga-deployment-planner fieldset { grid-column: 1 / -1; margin: 0; padding: 7px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; border: 1px solid rgba(92, 196, 232, .16); } | |
| .uga-deployment-planner fieldset legend { padding: 0 3px; } | |
| .uga-personnel-field { min-width: 0; } | |
| .uga-personnel-select { min-width: 0; display: grid; grid-template-columns: 37px minmax(0, 1fr); gap: 5px; align-items: center; } | |
| .uga-personnel-select.is-unavailable { grid-template-columns: minmax(0, 1fr); } | |
| .uga-deployment-portrait { width: 36px; height: 45px; } | |
| .uga-personnel-select select { min-width: 0; } | |
| .uga-personnel-lock { grid-column: 1 / -1; min-height: 30px; padding: 6px 8px; display: flex; align-items: center; gap: 7px; color: #b8968b; border-left: 2px solid rgba(255, 181, 74, .55); background: rgba(78, 43, 17, .18); font-size: 6px; line-height: 1.35; } | |
| .uga-personnel-lock[hidden] { display: none; } | |
| .uga-personnel-lock .uga-svg { width: 13px; height: 13px; flex: 0 0 auto; } | |
| .uga-deployment-planner .uga-primary-button { grid-column: 1 / -1; margin-top: 3px; } | |
| .uga-deployment-manifest { grid-column: 1 / -1; padding: 8px; border: 1px solid rgba(92, 196, 232, .18); background: rgba(2, 15, 24, .42); } | |
| .uga-deployment-manifest.is-over-capacity { border-color: rgba(255, 94, 98, .65); } | |
| .uga-manifest-heading { min-height: 30px; display: flex; align-items: center; justify-content: space-between; gap: 8px; border-bottom: 1px solid rgba(92, 196, 232, .12); } | |
| .uga-manifest-heading span { color: var(--uga-amber); font: 700 7px/1 Consolas, monospace; letter-spacing: .1em; } | |
| .uga-manifest-heading b { color: var(--uga-green); font: 700 10px/1 Consolas, monospace; } | |
| .uga-manifest-groups { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } | |
| .uga-manifest-groups fieldset, .uga-mod-picker { min-width: 0; margin: 8px 0 0; padding: 6px; border: 1px solid rgba(92, 196, 232, .14); } | |
| .uga-manifest-groups legend, .uga-mod-picker legend { padding: 0 4px; color: #7895a8; font-size: 7px; } | |
| .uga-manifest-control { min-height: 48px; display: grid; grid-template-columns: minmax(0, 1fr) 58px; align-items: center; gap: 8px; border-bottom: 1px solid rgba(92, 196, 232, .08); } | |
| .uga-manifest-control span { min-width: 0; } | |
| .uga-manifest-control b, .uga-mod-control b { display: block; font-size: 8px; } | |
| .uga-manifest-control small, .uga-mod-control small { display: block; margin-top: 3px; color: var(--uga-muted); font-size: 6px; line-height: 1.25; } | |
| .uga-manifest-control select { min-width: 52px; } | |
| .uga-mod-picker { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 5px; } | |
| .uga-mod-picker legend { grid-column: 1 / -1; } | |
| .uga-mod-control { position: relative; min-height: 48px; padding: 6px 6px 6px 38px; display: grid; align-content: center; border: 1px solid rgba(92, 196, 232, .12); cursor: pointer; } | |
| .uga-mod-control input { position: absolute; left: 10px; top: 13px; width: 20px; height: 20px; accent-color: var(--uga-cyan); } | |
| .uga-slot-warning { min-height: 38px; margin-top: 7px; padding: 6px 8px; display: flex; align-items: center; gap: 7px; color: #ffc1c1; border-left: 2px solid var(--uga-red); background: rgba(91, 20, 24, .3); font-size: 7px; } | |
| .uga-slot-warning[hidden] { display: none; } | |
| .uga-slot-warning .uga-svg { width: 16px; height: 16px; color: var(--uga-red); } | |
| .uga-research-bank { margin-top: 10px; height: 49px; padding: 8px; display: grid; grid-template-columns: 31px 1fr auto; grid-template-rows: 1fr 1fr; align-items: center; color: var(--uga-cyan); border: 1px solid rgba(189, 113, 255, .3); background: rgba(78, 31, 100, .16); } | |
| .uga-research-bank .uga-svg { grid-row: span 2; width: 23px; height: 23px; color: #d283ff; } | |
| .uga-research-bank span { color: #b891c9; font-size: 6px; } | |
| .uga-research-bank b { grid-row: span 2; font: 17px/1 Consolas, monospace; color: #e7c6ff; } | |
| .uga-research-card { position: relative; min-height: 90px; padding: 10px 84px 10px 10px; border: 1px solid rgba(187, 111, 237, .18); background: rgba(52, 22, 68, .12); } | |
| .uga-research-card > span { color: #d283ff; font: 6px/1 Consolas, monospace; text-transform: uppercase; } | |
| .uga-research-card > .uga-mini-button { position: absolute; right: 8px; bottom: 8px; } | |
| .uga-progress { position: relative; height: 11px; margin-top: 7px; background: rgba(0, 0, 0, .3); } | |
| .uga-progress i { display: block; height: 100%; width: var(--value); background: linear-gradient(90deg, #7739a0, #d283ff); opacity: .72; } | |
| .uga-progress b { position: absolute; inset: 0 4px auto auto; font: 5px/11px Consolas, monospace; } | |
| .uga-intel-card { min-height: 75px; padding: 9px; display: grid; grid-template-columns: 31px 1fr; gap: 9px; border: 1px solid rgba(92, 196, 232, .16); } | |
| .uga-intel-card > span { width: 30px; height: 30px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .23); } | |
| .uga-intel-card .uga-svg { width: 16px; height: 16px; } | |
| .uga-logistics-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 5px; margin-top: 10px; } | |
| .uga-logistics-grid article { min-height: 45px; padding: 6px 8px; display: grid; grid-template-columns: 24px 1fr auto; grid-template-rows: 1fr 1fr; align-items: center; border: 1px solid rgba(92, 196, 232, .13); background: rgba(12, 37, 50, .2); } | |
| .uga-logistics-grid .uga-svg { grid-row: span 2; width: 17px; height: 17px; color: var(--uga-cyan); } | |
| .uga-logistics-grid span { color: #728b9b; font-size: 6px; text-transform: uppercase; } | |
| .uga-logistics-grid b { grid-row: span 2; font: 11px/1 Consolas, monospace; } | |
| .uga-manifest-row { min-height: 39px; display: grid; grid-template-columns: 28px 1fr auto; gap: 7px; align-items: center; border-bottom: 1px solid rgba(92, 196, 232, .1); } | |
| .uga-manifest-row > span { width: 26px; height: 26px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .2); } | |
| .uga-manifest-row .uga-svg { width: 13px; height: 13px; } | |
| .uga-manifest-row b { display: block; font-size: 7px; } | |
| .uga-manifest-row small { display: block; margin-top: 3px; color: #6a8494; font-size: 5px; } | |
| .uga-manifest-row strong { font: 9px/1 Consolas, monospace; color: var(--uga-green); } | |
| .uga-campaign-hub { overscroll-behavior: contain; } | |
| .uga-campaign-depart { | |
| width: 100%; | |
| min-height: 48px; | |
| margin-top: 10px; | |
| padding: 7px 12px; | |
| display: grid; | |
| grid-template-columns: 24px minmax(0, 1fr); | |
| align-items: center; | |
| gap: 9px; | |
| border: 1px solid rgba(66, 221, 255, .46); | |
| background: linear-gradient(110deg, rgba(9, 68, 89, .72), rgba(4, 24, 36, .9)); | |
| color: var(--uga-cyan); | |
| text-align: left; | |
| cursor: pointer; | |
| } | |
| .uga-campaign-depart:hover, .uga-campaign-depart:focus-visible { border-color: var(--uga-cyan); background: rgba(20, 82, 105, .82); } | |
| .uga-campaign-depart .uga-svg { width: 20px; height: 20px; transform: rotate(180deg); } | |
| .uga-campaign-depart span, .uga-campaign-depart small, .uga-campaign-depart b { min-width: 0; display: block; } | |
| .uga-campaign-depart small { color: #7ea4b3; font: 7px/1 Consolas, monospace; letter-spacing: .11em; } | |
| .uga-campaign-depart b { margin-top: 4px; color: #e7f7ff; font-size: 10px; letter-spacing: .08em; } | |
| .uga-basic-access { margin-top: 12px; } | |
| .uga-basic-access > header { padding-bottom: 6px; border-bottom: 1px solid rgba(92, 196, 232, .16); } | |
| .uga-basic-access > header small { color: #b7d5e0; font: 7px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .uga-basic-access-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; margin-top: 8px; } | |
| .uga-basic-access-grid button { | |
| position: relative; | |
| isolation: isolate; | |
| min-width: 0; | |
| min-height: 50px; | |
| padding: 5px 10px; | |
| display: grid; | |
| grid-template-columns: 22px minmax(0, 1fr) 13px; | |
| align-items: center; | |
| gap: 7px; | |
| border: 1px solid var(--uga-line); | |
| border-radius: 7px; | |
| background: var(--uga-panel-soft); | |
| color: #d9edf4; | |
| cursor: pointer; | |
| text-align: left; | |
| } | |
| /* No frame plate on a passive Basic Access entry. These four cards are a plain | |
| list of doors, not a selected state, and the tab frame was painted on all of | |
| them at once: a 17px border-image band top AND bottom on a 50px button covers | |
| 34px of its 50px height, so the art crossed the label — that is what bisected | |
| "War Table" in landscape — and repeating it four times is what made the whole | |
| surface read as ornament rather than hierarchy. The button already carries | |
| 1px solid var(--uga-line) with a radius; that is the border it should have. | |
| Selection art stays reserved for a real selected state (see .uga-command-nav | |
| button.is-active), per docs/UGA_PLAYER_FLOW.md. */ | |
| .uga-basic-access-grid button:not(:disabled):hover, | |
| .uga-basic-access-grid button:not(:disabled):focus-visible { border-color: rgba(66, 221, 255, .62); color: var(--uga-cyan); background: rgba(17, 87, 113, .3); } | |
| .uga-basic-access-grid button:focus-visible { outline: 2px solid var(--uga-cyan); outline-offset: -2px; } | |
| .uga-basic-access-grid button:disabled { color: #617987; cursor: not-allowed; } | |
| .uga-basic-access-grid button > .uga-svg { width: 17px; height: 17px; } | |
| .uga-basic-access-grid button > .uga-svg:last-child { width: 12px; height: 12px; justify-self: end; } | |
| .uga-basic-access-grid button > span { min-width: 0; overflow: hidden; font-size: 10px; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-campaign-services { overscroll-behavior: contain; } | |
| .uga-strategic-layer-model { margin-top: 12px; padding: 10px; border: 1px solid rgba(66, 221, 255, .28); background: linear-gradient(135deg, rgba(7, 45, 62, .8), rgba(4, 18, 29, .9)); box-shadow: inset 0 0 28px rgba(66, 221, 255, .04); } | |
| .uga-strategic-layer-model > header { display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: 9px; align-items: center; } | |
| .uga-strategic-layer-model > header > span { width: 34px; height: 34px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .3); background: rgba(24, 99, 126, .18); } | |
| .uga-strategic-layer-model > header .uga-svg { width: 19px; height: 19px; } | |
| .uga-strategic-layer-model > header small { display: block; color: #6c9db1; font: 6px/1 Consolas, monospace; letter-spacing: .11em; } | |
| .uga-strategic-layer-model > header b { display: block; margin-top: 4px; color: #e4f7ff; font-size: 11px; letter-spacing: .1em; } | |
| .uga-strategic-horizons { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; margin-top: 10px; } | |
| .uga-strategic-horizons article { min-width: 0; padding: 8px; border: 1px solid rgba(92, 196, 232, .16); background: rgba(4, 21, 31, .62); } | |
| .uga-strategic-horizons article.is-live { border-left: 2px solid var(--uga-green); } | |
| .uga-strategic-horizons article.is-future { border-left: 2px solid #607589; } | |
| .uga-strategic-horizons small, .uga-strategic-horizons b, .uga-strategic-horizons span { display: block; } | |
| .uga-strategic-horizons small { color: #718b9a; font: 5px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .uga-strategic-horizons b { margin-top: 5px; color: #dceff7; font-size: 9px; letter-spacing: .07em; } | |
| .uga-strategic-horizons span { margin-top: 4px; color: #7993a1; font-size: 7px; line-height: 1.35; } | |
| .uga-session-types, .uga-hub-services { margin-top: 12px; } | |
| .uga-session-types > header, .uga-hub-services > header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-bottom: 6px; border-bottom: 1px solid rgba(92, 196, 232, .16); } | |
| .uga-session-types > header small, .uga-hub-services > header small { color: #b7d5e0; font: 7px/1 Consolas, monospace; letter-spacing: .12em; } | |
| .uga-session-types > header span, .uga-hub-services > header span { color: #668696; font: 5px/1 Consolas, monospace; letter-spacing: .1em; } | |
| .uga-session-type-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; margin-top: 8px; } | |
| .uga-session-type { min-width: 0; display: grid; grid-template-columns: 32px minmax(0, 1fr); grid-template-rows: 1fr auto; gap: 8px; padding: 9px; border: 1px solid rgba(92, 196, 232, .2); background: linear-gradient(145deg, rgba(8, 35, 48, .88), rgba(4, 17, 26, .92)); } | |
| .uga-session-type.is-offline-ready { border-top: 2px solid var(--uga-green); } | |
| .uga-session-type.is-network-unavailable { border-top: 2px solid #607589; background: rgba(7, 20, 30, .7); } | |
| .uga-session-type-icon { width: 32px; height: 32px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .22); } | |
| .uga-session-type-icon .uga-svg { width: 17px; height: 17px; } | |
| .uga-session-type > div { min-width: 0; } | |
| .uga-session-type > div > small { color: var(--uga-green); font: 5px/1.2 Consolas, monospace; letter-spacing: .07em; } | |
| .uga-session-type.is-network-unavailable > div > small { color: #7d91a0; } | |
| .uga-session-type h3 { margin: 4px 0 0; color: #e7f7ff; font-size: 10px; line-height: 1.2; } | |
| .uga-session-type p { margin: 5px 0; color: #8fa8b6; font-size: 7px; line-height: 1.4; } | |
| .uga-session-type > div > b { display: block; color: #5f8191; font: 5px/1.3 Consolas, monospace; letter-spacing: .06em; } | |
| .uga-session-type > button { grid-column: 1 / -1; min-height: 44px; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .38); background: rgba(22, 80, 104, .24); font: 700 7px/1 Consolas, monospace; letter-spacing: .08em; cursor: pointer; } | |
| .uga-session-type > button:disabled { color: #627887; border-color: rgba(109, 132, 147, .24); background: rgba(41, 52, 60, .28); cursor: not-allowed; } | |
| .uga-hub-route-list { display: grid; gap: 8px; margin-top: 12px; padding-bottom: 4px; } | |
| .uga-hub-route { | |
| min-width: 0; | |
| display: grid; | |
| grid-template-columns: 40px minmax(0, 1fr) 82px; | |
| gap: 9px; | |
| align-items: center; | |
| padding: 9px; | |
| border: 1px solid rgba(92, 196, 232, .18); | |
| background: linear-gradient(135deg, rgba(9, 31, 44, .88), rgba(4, 16, 25, .92)); | |
| } | |
| .uga-hub-route.is-implemented { border-left: 2px solid var(--uga-green); } | |
| .uga-hub-route.is-local-preview { border-left: 2px solid var(--uga-amber); } | |
| .uga-hub-route.is-host-required { border-left: 2px solid #607589; background: rgba(7, 20, 30, .7); } | |
| .uga-hub-route.is-selected { box-shadow: inset 0 0 0 1px rgba(66, 221, 255, .28); } | |
| .uga-hub-route-icon { width: 40px; height: 40px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .25); background: rgba(26, 94, 119, .18); } | |
| .uga-hub-route-icon .uga-svg { width: 20px; height: 20px; } | |
| .uga-hub-route-copy { min-width: 0; } | |
| .uga-hub-route-copy > div { display: flex; align-items: center; justify-content: space-between; gap: 7px; } | |
| .uga-hub-route-copy h3 { margin: 0; color: #e7f7ff; font-size: 10px; line-height: 1.25; letter-spacing: .04em; } | |
| .uga-hub-route-copy > div > span { flex: 0 0 auto; color: var(--uga-green); font: 6px/1 Consolas, monospace; letter-spacing: .08em; } | |
| .uga-hub-route.is-local-preview .uga-hub-route-copy > div > span { color: var(--uga-amber); } | |
| .uga-hub-route.is-host-required .uga-hub-route-copy > div > span { color: #7d91a0; } | |
| .uga-hub-route-copy p { margin: 4px 0; color: #91a9b8; font-size: 8px; line-height: 1.4; overflow-wrap: anywhere; } | |
| .uga-hub-route-copy small { display: block; color: #88a9bd; font: 8px/1.2 Consolas, monospace; letter-spacing: .08em; } | |
| .uga-hub-route > button { | |
| min-width: 82px; | |
| min-height: 44px; | |
| padding: 0 8px; | |
| color: var(--uga-cyan); | |
| border: 1px solid rgba(66, 221, 255, .42); | |
| background: rgba(22, 80, 104, .27); | |
| font: 700 7px/1 Consolas, monospace; | |
| letter-spacing: .08em; | |
| cursor: pointer; | |
| } | |
| .uga-hub-route > button:disabled { color: #627887; border-color: rgba(109, 132, 147, .24); background: rgba(41, 52, 60, .28); cursor: not-allowed; } | |
| .uga-crew-summary { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin-top: 12px; } | |
| .uga-crew-summary article { min-height: 54px; padding: 8px 10px; display: flex; align-items: center; justify-content: space-between; border: 1px solid rgba(92, 196, 232, .18); background: rgba(12, 37, 50, .28); } | |
| .uga-crew-summary span { color: #7e9aaa; font-size: 7px; letter-spacing: .1em; } | |
| .uga-crew-summary b { color: var(--uga-cyan); font: 14px/1 Consolas, monospace; } | |
| .uga-quick-actions { | |
| position: absolute; | |
| left: 50%; | |
| bottom: calc(61px + env(safe-area-inset-bottom)); | |
| transform: translateX(-50%); | |
| min-height: 54px; | |
| display: flex; | |
| align-items: stretch; | |
| padding: 4px; | |
| pointer-events: auto; | |
| border: 1px solid rgba(92, 196, 232, .24); | |
| background: rgba(4, 15, 24, .75); | |
| } | |
| .uga-quick-actions button { min-width: 70px; min-height: 44px; padding: 2px 10px; display: flex; align-items: center; justify-content: center; gap: 6px; border: 0; border-right: 1px solid rgba(92, 196, 232, .13); background: transparent; color: #7796a8; cursor: pointer; } | |
| .uga-quick-actions button:last-child { border-right: 0; } | |
| .uga-quick-actions button:hover, .uga-quick-actions button.is-active { color: var(--uga-cyan); background: rgba(24, 92, 118, .23); } | |
| .uga-quick-actions .uga-svg { width: 16px; height: 16px; } | |
| .uga-quick-actions span { font-size: 7px; font-weight: 700; text-transform: uppercase; letter-spacing: .1em; } | |
| .uga-command-nav { | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| min-height: calc(61px + env(safe-area-inset-bottom)); | |
| padding: 0 max(12px, env(safe-area-inset-right)) env(safe-area-inset-bottom) max(12px, env(safe-area-inset-left)); | |
| display: flex; | |
| justify-content: center; | |
| align-items: stretch; | |
| pointer-events: auto; | |
| border-top: 1px solid rgba(92, 196, 232, .28); | |
| background: linear-gradient(0deg, rgba(2, 10, 17, .98), rgba(4, 16, 25, .91)); | |
| } | |
| .uga-command-nav button { position: relative; min-width: clamp(74px, 10vw, 112px); min-height: 44px; padding: 7px clamp(6px, 1vw, 18px) 6px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; border: 0; border-right: 1px solid rgba(92, 196, 232, .09); background: transparent; color: #617d90; cursor: pointer; } | |
| .uga-command-nav button:first-child { border-left: 1px solid rgba(92, 196, 232, .09); } | |
| .uga-command-nav button::before { content: ""; position: absolute; top: -1px; left: 26%; right: 26%; height: 2px; background: transparent; } | |
| .uga-command-nav button:hover { color: #9fc0d0; } | |
| .uga-command-nav button.is-active { color: var(--uga-cyan); background: linear-gradient(180deg, rgba(28, 105, 135, .23), transparent); } | |
| .uga-command-nav button.is-active::before { background: var(--uga-cyan); box-shadow: 0 0 12px rgba(66, 221, 255, .8); } | |
| .uga-command-nav .uga-svg { width: 20px; height: 20px; } | |
| .uga-command-nav span { font-size: 7px; font-weight: 800; letter-spacing: .12em; text-transform: uppercase; } | |
| .uga-rail-top { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 8px; | |
| margin-bottom: 8px; | |
| } | |
| .uga-deck-summary { | |
| min-height: 56px; | |
| margin: 0 0 8px; | |
| padding: 8px 10px; | |
| display: grid; | |
| gap: 3px; | |
| border-left: 2px solid var(--uga-cyan); | |
| background: linear-gradient(90deg, rgba(13, 58, 78, .48), rgba(4, 18, 28, .7)); | |
| } | |
| .uga-deck-summary small { color: var(--uga-cyan); font: 700 7px/1 Consolas, monospace; letter-spacing: .13em; } | |
| .uga-deck-summary b { color: #edfaff; font-size: 10px; letter-spacing: .08em; } | |
| .uga-deck-summary span { color: var(--uga-muted); font-size: 7px; line-height: 1.3; } | |
| .uga-ship-telemetry-badge { | |
| display: grid; | |
| grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); | |
| min-width: 0; | |
| gap: 6px; | |
| padding: 8px 10px; | |
| background: rgba(3, 16, 26, .92); | |
| border: 1px solid rgba(66, 221, 255, .25); | |
| border-radius: 4px; | |
| } | |
| .uga-telemetry-rating, .uga-telemetry-power { | |
| display: flex; | |
| min-width: 0; | |
| flex-direction: column; | |
| gap: 2px; | |
| } | |
| /* Section-damage readout — per-compartment condition chip and the deck rollup | |
| in the telemetry badge. Tones reuse the front card's convention so DANGER / | |
| WARN read the same everywhere on the ship. The badge grid is two columns; | |
| the condition block takes its own full-width row beneath rating + power. */ | |
| .uga-telemetry-condition { | |
| display: flex; | |
| min-width: 0; | |
| flex-direction: column; | |
| gap: 2px; | |
| grid-column: 1 / -1; | |
| } | |
| .uga-telemetry-condition small { | |
| font-size: 8px; | |
| color: var(--uga-muted); | |
| letter-spacing: .08em; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| } | |
| .uga-telemetry-condition b { font-size: 11px; color: #fff; white-space: nowrap; } | |
| .uga-telemetry-condition span { font-size: 7px; color: var(--uga-muted); letter-spacing: .06em; } | |
| .uga-telemetry-condition.is-danger b { color: #ff8d7a; } | |
| .uga-telemetry-condition.is-warning b { color: #ffcf7a; } | |
| .uga-telemetry-condition.is-stable b { color: #7ae0a2; } | |
| .uga-district-condition { | |
| flex: 0 0 auto; | |
| align-self: center; | |
| padding: 2px 6px; | |
| border-radius: 4px; | |
| font: 700 7px/1 Consolas, monospace; | |
| letter-spacing: .1em; | |
| } | |
| .uga-district-condition.is-danger { color: #ffb3a7; background: rgba(255, 107, 82, .16); } | |
| .uga-district-condition.is-warning { color: #ffe0a7; background: rgba(255, 190, 82, .14); } | |
| .uga-telemetry-rating small, .uga-telemetry-power small { | |
| font-size: 8px; | |
| color: var(--uga-muted); | |
| letter-spacing: .08em; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| } | |
| .uga-telemetry-rating b { | |
| font-size: 11px; | |
| color: #fff; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .uga-telemetry-rating span { | |
| font-size: 9px; | |
| color: var(--uga-amber); | |
| font-weight: 700; | |
| } | |
| .uga-telemetry-power b { | |
| font-size: 11px; | |
| color: var(--uga-cyan); | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| } | |
| .uga-telemetry-power span { | |
| font-size: 9px; | |
| color: var(--uga-green); | |
| font-weight: 700; | |
| overflow-wrap: anywhere; | |
| } | |
| .uga-telemetry-power.is-brownout b, .uga-telemetry-power.is-brownout span { | |
| color: var(--uga-red); | |
| } | |
| .uga-sector-filter-bar { | |
| display: flex; | |
| gap: 4px; | |
| } | |
| .uga-filter-chip { | |
| flex: 1; | |
| min-height: 44px; | |
| padding: 5px 6px; | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: .06em; | |
| background: rgba(6, 22, 34, .8); | |
| border: 1px solid rgba(66, 221, 255, .2); | |
| color: var(--uga-muted); | |
| border-radius: 3px; | |
| cursor: pointer; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 4px; | |
| transition: all .15s ease; | |
| } | |
| .uga-filter-chip:hover { | |
| color: #fff; | |
| border-color: rgba(66, 221, 255, .5); | |
| } | |
| .uga-filter-chip.is-active { | |
| background: rgba(20, 87, 117, .5); | |
| color: #fff; | |
| border-color: var(--uga-cyan); | |
| box-shadow: 0 0 10px rgba(66, 221, 255, .3); | |
| } | |
| .uga-filter-chip.func.is-active { | |
| border-color: var(--uga-cyan); | |
| color: var(--uga-cyan); | |
| } | |
| .uga-filter-chip.civil.is-active { | |
| border-color: var(--uga-green); | |
| color: var(--uga-green); | |
| background: rgba(20, 90, 60, .4); | |
| } | |
| .uga-sector-tag { | |
| font-style: normal; | |
| font-size: 8px; | |
| font-weight: 700; | |
| padding: 1px 4px; | |
| border-radius: 2px; | |
| } | |
| .uga-sector-tag.function { | |
| background: rgba(66, 221, 255, .15); | |
| color: var(--uga-cyan); | |
| } | |
| .uga-sector-tag.civil { | |
| background: rgba(116, 224, 162, .15); | |
| color: var(--uga-green); | |
| } | |
| .uga-sector-pill { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 6px; | |
| padding: 2px 8px; | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: .08em; | |
| border-radius: 3px; | |
| margin-bottom: 4px; | |
| } | |
| .uga-sector-pill.is-function { | |
| background: rgba(66, 221, 255, .15); | |
| color: var(--uga-cyan); | |
| border: 1px solid rgba(66, 221, 255, .3); | |
| } | |
| .uga-sector-pill.is-civil { | |
| background: rgba(116, 224, 162, .15); | |
| color: var(--uga-green); | |
| border: 1px solid rgba(116, 224, 162, .3); | |
| } | |
| .uga-power-pill { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 4px; | |
| padding: 3px 7px; | |
| font-size: 10px; | |
| font-weight: 700; | |
| background: rgba(3, 16, 26, .9); | |
| color: var(--uga-amber); | |
| border: 1px solid rgba(255, 181, 74, .4); | |
| border-radius: 3px; | |
| } | |
| .uga-power-pill .uga-svg { | |
| width: 14px; | |
| height: 14px; | |
| } | |
| .uga-heading-badges { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .uga-synergy-banner { | |
| margin: 6px 0 10px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| } | |
| .uga-synergy-item { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| padding: 8px 12px; | |
| background: linear-gradient(90deg, rgba(20, 87, 117, .3) 0%, rgba(6, 25, 38, .6) 100%); | |
| border: 1px solid rgba(66, 221, 255, .4); | |
| border-left: 3px solid var(--uga-cyan); | |
| border-radius: 3px; | |
| } | |
| .uga-synergy-item small { | |
| font-size: 9px; | |
| font-weight: 800; | |
| color: var(--uga-cyan); | |
| letter-spacing: .08em; | |
| display: block; | |
| } | |
| .uga-synergy-item p { | |
| margin: 2px 0 0; | |
| font-size: 10px; | |
| color: #fff; | |
| } | |
| .uga-synergy-icon { | |
| color: var(--uga-cyan); | |
| width: 22px; | |
| height: 22px; | |
| } | |
| .uga-staff-list, .uga-visual-list { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 8px; | |
| } | |
| .uga-staff-card { | |
| background: rgba(4, 18, 28, .8); | |
| border: 1px solid rgba(66, 221, 255, .2); | |
| border-radius: 4px; | |
| padding: 8px 10px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| } | |
| .uga-staff-card.is-locked { | |
| opacity: .5; | |
| border-style: dashed; | |
| } | |
| .uga-staff-card.is-assigned { | |
| border-color: rgba(116, 224, 162, .4); | |
| background: linear-gradient(135deg, rgba(6, 28, 22, .7) 0%, rgba(4, 18, 28, .85) 100%); | |
| } | |
| .uga-staff-header { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .uga-staff-mark { | |
| width: 26px; | |
| height: 26px; | |
| display: grid; | |
| place-items: center; | |
| background: rgba(20, 87, 117, .3); | |
| border-radius: 3px; | |
| color: var(--uga-cyan); | |
| font-size: 10px; | |
| font-weight: 800; | |
| } | |
| .uga-staff-title { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .uga-staff-title small { | |
| font-size: 8px; | |
| color: var(--uga-muted); | |
| display: block; | |
| } | |
| .uga-staff-title b { | |
| font-size: 11px; | |
| color: #fff; | |
| } | |
| .uga-staff-assigned-body { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| padding: 4px 6px; | |
| background: rgba(0, 0, 0, .25); | |
| border-radius: 3px; | |
| } | |
| .uga-staff-portrait { | |
| width: 38px; | |
| height: 38px; | |
| border-radius: 3px; | |
| overflow: hidden; | |
| border: 1px solid var(--uga-green); | |
| flex: 0 0 38px; | |
| } | |
| .uga-staff-portrait img { | |
| width: 100%; | |
| height: 100%; | |
| object-fit: cover; | |
| } | |
| .uga-staff-perk-copy small { | |
| font-size: 8px; | |
| font-weight: 700; | |
| color: var(--uga-green); | |
| text-transform: uppercase; | |
| } | |
| .uga-staff-perk-copy p { | |
| margin: 2px 0 0; | |
| font-size: 10px; | |
| color: var(--uga-text); | |
| line-height: 1.3; | |
| } | |
| .uga-staff-assign-box { | |
| display: flex; | |
| gap: 6px; | |
| align-items: center; | |
| } | |
| .uga-staff-picker { | |
| flex: 1; | |
| } | |
| .uga-staff-picker select { | |
| width: 100%; | |
| min-height: 44px; | |
| padding: 5px 8px; | |
| background: rgba(2, 10, 16, .9); | |
| color: #fff; | |
| border: 1px solid rgba(66, 221, 255, .3); | |
| border-radius: 3px; | |
| font-size: 10px; | |
| } | |
| .uga-visual-upgrade-row { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 10px; | |
| padding: 8px 10px; | |
| background: rgba(4, 18, 28, .6); | |
| border: 1px solid rgba(66, 221, 255, .15); | |
| border-radius: 4px; | |
| } | |
| .uga-visual-upgrade-row.is-active { | |
| border-color: rgba(66, 221, 255, .4); | |
| background: rgba(6, 25, 38, .75); | |
| } | |
| .uga-visual-badge { | |
| font-size: 9px; | |
| font-weight: 800; | |
| padding: 2px 6px; | |
| border-radius: 2px; | |
| background: rgba(20, 87, 117, .4); | |
| color: var(--uga-cyan); | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| flex: 0 0 auto; | |
| } | |
| .uga-visual-upgrade-row.is-active .uga-visual-badge { | |
| background: var(--uga-cyan); | |
| color: #020a10; | |
| } | |
| .uga-visual-copy b { | |
| font-size: 11px; | |
| color: #fff; | |
| display: block; | |
| } | |
| .uga-visual-copy p { | |
| margin: 2px 0 0; | |
| font-size: 10px; | |
| color: var(--uga-muted); | |
| line-height: 1.35; | |
| } | |
| .uga-visual-upgrade-row.is-active .uga-visual-copy p { | |
| color: var(--uga-text); | |
| } | |
| @supports (backdrop-filter: blur(8px)) { | |
| .uga-district-list, .uga-context-panel, .uga-quick-actions { backdrop-filter: blur(11px) saturate(120%); } | |
| } | |
| @media (max-width: 900px), (max-height: 620px) and (max-width: 1024px) { | |
| .uga-command-header { min-height: 56px; padding: max(6px, env(safe-area-inset-top)) 44px 6px 10px; grid-template-columns: 1fr; gap: 4px; } | |
| .uga-command-identity { padding-right: 4px; gap: 8px; } | |
| .uga-command-crest { width: 30px; height: 30px; } | |
| .uga-command-crest .uga-svg { width: 16px; height: 16px; } | |
| .uga-command-identity strong { font-size: 13px; font-weight: 800; letter-spacing: .08em; } | |
| .uga-command-identity span:not(.uga-command-crest) { display: none; } | |
| .uga-command-exit { right: 6px; top: max(6px, env(safe-area-inset-top)); width: 44px; height: 44px; } | |
| /* Smooth horizontal scrolling resource ribbon with edge mask */ | |
| .uga-resource-ribbon { | |
| justify-content: flex-start; | |
| overflow-x: auto; | |
| overscroll-behavior-x: contain; | |
| touch-action: pan-x; | |
| -webkit-overflow-scrolling: touch; | |
| scrollbar-width: none; | |
| gap: 4px; | |
| padding: 0 4px; | |
| -webkit-mask-image: linear-gradient(90deg, #000 88%, transparent 100%); | |
| mask-image: linear-gradient(90deg, #000 88%, transparent 100%); | |
| } | |
| .uga-resource-ribbon::-webkit-scrollbar { display: none; } | |
| .uga-resource { flex: 0 0 auto; min-width: 52px; height: 28px; padding: 2px 6px 2px 18px; border-radius: 3px; } | |
| .uga-resource > span { left: 4px; top: 6px; } | |
| .uga-resource > span .uga-svg { width: 11px; height: 11px; } | |
| .uga-resource b { font-size: 11px; font-weight: 700; } | |
| .uga-resource small { font-size: 8px; font-weight: 600; letter-spacing: .04em; } | |
| .uga-command-stage { inset: 58px 0 54px; } | |
| /* Compact 1-Row Telemetry & Sector Filter */ | |
| .uga-rail-top { | |
| position: absolute; | |
| top: 60px; | |
| left: 8px; | |
| right: 8px; | |
| display: flex; | |
| flex-direction: row; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 6px; | |
| z-index: 10; | |
| pointer-events: auto; | |
| } | |
| .uga-ship-telemetry-badge { | |
| padding: 3px 8px; | |
| gap: 6px; | |
| height: 30px; | |
| flex: 1 1 auto; | |
| min-width: 118px; | |
| max-width: 180px; | |
| /* Two columns so the section-state rollup sits beside power instead of | |
| overflowing the single-column stack past the badge box — at 412px it | |
| painted over the deck filter chips. */ | |
| grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); | |
| border-radius: 4px; | |
| background: rgba(3, 14, 23, .9); | |
| } | |
| .uga-telemetry-rating { display: none; } | |
| .uga-telemetry-condition { grid-column: auto; } | |
| /* Icon + caption cannot fit the ~56px column at 412px; the tone-colored | |
| code (DAMAGE / STRAINED / NOMINAL) identifies the block on its own. */ | |
| .uga-telemetry-condition small, .uga-telemetry-condition span { display: none; } | |
| /* Three inline labels wrapped unpredictably inside the 118px mobile badge and | |
| painted over the ship/deck controls. Keep the actual power values on two | |
| deterministic rows; the lightning icon already identifies this telemetry. */ | |
| .uga-telemetry-power { display: grid; grid-template-columns: 1fr; gap: 1px; align-content: center; } | |
| .uga-telemetry-power small { display: none; } | |
| .uga-telemetry-power b, .uga-telemetry-power span { white-space: nowrap; line-height: 1; } | |
| .uga-telemetry-power b { font-size: 9px; font-weight: 800; } | |
| .uga-telemetry-power span { font-size: 8px; } | |
| .uga-sector-filter-bar { | |
| padding: 2px; | |
| gap: 3px; | |
| min-height: 44px; | |
| flex: 0 0 150px; | |
| min-width: 126px; | |
| justify-content: flex-end; | |
| background: rgba(3, 14, 23, .9); | |
| border-radius: 4px; | |
| } | |
| .uga-filter-chip { min-height: 44px; font-size: 9px; font-weight: 800; padding: 0 8px; border-radius: 2px; } | |
| /* Mobile District Rail */ | |
| .uga-district-rail { | |
| /* The stage already starts below the identity header. Leave just the | |
| resource-row clearance instead of reserving that header twice. */ | |
| top: 40px; | |
| left: 8px; | |
| right: 8px; | |
| bottom: auto; | |
| width: auto; | |
| height: 48px; | |
| flex-direction: row; | |
| gap: 4px; | |
| z-index: 10; | |
| } | |
| .uga-overview-button { | |
| width: 48px; | |
| height: 48px; | |
| flex: 0 0 48px; | |
| padding: 0; | |
| display: grid; | |
| place-items: center; | |
| border: 1px solid var(--uga-line); | |
| border-radius: 4px; | |
| background: rgba(3, 14, 23, .9); | |
| } | |
| .uga-overview-button span, .uga-overview-button::after { display: none; } | |
| .uga-overview-button .uga-svg { width: 18px; height: 18px; } | |
| .uga-district-list { | |
| flex: 1; | |
| display: flex; | |
| overflow-x: auto; | |
| overflow-y: hidden; | |
| overscroll-behavior-x: contain; | |
| touch-action: pan-x; | |
| -webkit-overflow-scrolling: touch; | |
| scrollbar-width: none; | |
| border-radius: 4px; | |
| gap: 4px; | |
| padding: 2px; | |
| background: rgba(3, 14, 23, .9); | |
| } | |
| .uga-district-list::-webkit-scrollbar { display: none; } | |
| .uga-district-button { | |
| flex: 0 0 144px; | |
| width: 144px; | |
| min-height: 44px; | |
| padding: 2px; | |
| display: grid; | |
| grid-template-columns: 28px minmax(0, 1fr); | |
| place-items: center; | |
| border: 1px solid rgba(92, 196, 232, .15); | |
| border-radius: 4px; | |
| } | |
| .uga-district-button::before { inset: auto 2px 0; width: auto; height: 2.5px; } | |
| .uga-district-index, .uga-row-chevron { display: none; } | |
| /* Labels stay in the existing 48px rail; widening scrollable choices costs | |
| no additional ship viewport and avoids an unexplained row of icons. */ | |
| .uga-district-copy { display: block; min-width: 0; text-align: left; } | |
| .uga-district-copy b { display: block; font-size: 11px; line-height: 1.2; white-space: normal; overflow-wrap: anywhere; } | |
| .uga-district-copy small { display: none; } | |
| .uga-district-icon { width: 28px; height: 28px; } | |
| .uga-district-icon .uga-svg { width: 16px; height: 16px; } | |
| .uga-scene-title { display: none; } | |
| .uga-camera-readout { display: none; } | |
| /* Mobile Bottom Sheet Inspector */ | |
| .uga-context-panel { | |
| top: auto; | |
| left: 0; | |
| right: 0; | |
| bottom: 4px; | |
| width: 100%; | |
| min-width: 0; | |
| height: 44px; | |
| border-radius: 14px 14px 0 0; | |
| clip-path: none; | |
| border: 1px solid var(--uga-cyan); | |
| border-bottom: none; | |
| box-shadow: 0 -12px 36px rgba(0, 0, 0, .92); | |
| z-index: 20; | |
| background: rgba(2, 12, 20, .96); | |
| } | |
| .uga-command-shell.is-sheet-expanded .uga-context-panel { height: min(40%, 360px); } | |
| .uga-context-panel::before { display: none; } | |
| .uga-sheet-toggle { position: absolute; inset: 0 0 auto; width: 100%; min-height: 44px; padding: 0 14px; display: grid; grid-template-columns: 38px 1fr 22px; align-items: center; gap: 8px; border: 0; border-bottom: 1px solid rgba(92, 196, 232, .2); background: rgba(4, 19, 30, .97); color: var(--uga-muted); cursor: pointer; z-index: 3; } | |
| .uga-sheet-toggle > span { width: 38px; height: 4px; background: rgba(66, 221, 255, .5); border-radius: 2px; } | |
| .uga-sheet-toggle b { text-align: left; font-size: 9px; letter-spacing: .12em; } | |
| .uga-sheet-toggle .uga-svg { width: 16px; height: 16px; transform: rotate(-90deg); transition: transform .16s ease; } | |
| .uga-command-shell.is-sheet-expanded .uga-sheet-toggle .uga-svg { transform: rotate(90deg); } | |
| .uga-deployment-toolbar { position: absolute; inset: 0 0 auto; min-height: 48px; padding: 0 10px 0 6px; grid-template-columns: minmax(132px, auto) 1fr auto; align-items: center; gap: 8px; border-bottom: 1px solid rgba(92, 196, 232, .3); background: linear-gradient(90deg, rgba(3, 24, 35, .99), rgba(6, 35, 47, .97)); z-index: 4; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar { display: grid; } | |
| .uga-deployment-toolbar > button { min-height: 44px; padding: 0 9px; display: flex; align-items: center; gap: 6px; border: 0; border-right: 1px solid rgba(92, 196, 232, .2); background: transparent; color: #9dc4d3; font-size: 8px; font-weight: 800; letter-spacing: .06em; } | |
| .uga-deployment-toolbar > button .uga-svg { width: 13px; height: 13px; transform: rotate(180deg); } | |
| .uga-deployment-toolbar > b { color: #d8edf4; font-size: 10px; letter-spacing: .12em; } | |
| .uga-deployment-toolbar > small { padding: 4px 5px; color: var(--uga-green); border: 1px solid rgba(114, 229, 178, .36); font: 7px/1 Consolas, monospace; } | |
| .uga-context-body { inset: 44px 0 0; overflow: hidden; } | |
| .uga-command-shell.is-deployment-mode .uga-context-body { inset: 48px 0 0; } | |
| .uga-command-shell:not(.is-sheet-expanded) .uga-context-body { display: none; } | |
| .uga-context-scroll { padding: 8px 12px 14px; } | |
| .uga-campaign-hub { padding-bottom: max(16px, env(safe-area-inset-bottom)); } | |
| .uga-strategic-horizons, .uga-session-type-grid { grid-template-columns: 1fr; } | |
| .uga-hub-route { grid-template-columns: 36px minmax(0, 1fr) 76px; gap: 7px; padding: 7px; } | |
| .uga-hub-route-icon { width: 36px; height: 36px; } | |
| .uga-hub-route > button { min-width: 76px; } | |
| .uga-hub-route-copy > div { align-items: flex-start; flex-direction: column; gap: 2px; } | |
| .uga-hub-route-copy h3 { font-size: 11px; } | |
| .uga-hub-route-copy p { font-size: 9px; } | |
| .uga-context-heading { grid-template-columns: 32px 1fr auto; gap: 8px; padding-bottom: 6px; } | |
| .uga-heading-icon { width: 30px; height: 30px; border-radius: 4px; } | |
| .uga-heading-icon .uga-svg { width: 18px; height: 18px; } | |
| .uga-context-heading h2, .uga-section-title h2 { font-size: 14px; font-weight: 800; } | |
| .uga-tier-rail { margin: 6px 0; height: 26px; gap: 4px; } | |
| .uga-tier-pill { font-size: 10px; font-weight: 700; } | |
| .uga-activity-line { margin: 4px 0 6px; font-size: 10px; } | |
| .uga-panel-section { margin-top: 8px; } | |
| .uga-socket { grid-template-columns: 28px minmax(70px, 1fr) minmax(80px, .8fr) auto; min-height: 48px; border-radius: 4px; } | |
| /* Mobile Bottom Nav */ | |
| .uga-command-nav { min-height: calc(54px + env(safe-area-inset-bottom)); padding-right: max(4px, env(safe-area-inset-right)); padding-bottom: env(safe-area-inset-bottom); padding-left: max(4px, env(safe-area-inset-left)); display: grid; grid-auto-flow: column; grid-auto-columns: minmax(44px, 1fr); justify-content: stretch; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none; background: rgba(3, 14, 23, .98); z-index: 25; } | |
| .uga-command-nav::-webkit-scrollbar { display: none; } | |
| .uga-command-nav button { width: 100%; min-width: 44px; padding: 4px 1px; gap: 2px; min-height: 46px; } | |
| .uga-command-nav .uga-svg { width: 18px; height: 18px; } | |
| .uga-command-nav span { max-width: 100%; overflow: hidden; font-size: clamp(8px, 2.35vw, 10px); font-weight: 700; letter-spacing: .02em; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-quick-actions { display: none; } | |
| .uga-deployment-planner { grid-template-columns: 1fr; } | |
| .uga-deployment-planner header, .uga-deployment-identity, .uga-deployment-stations, .uga-deployment-readiness, .uga-deployment-planner fieldset, .uga-deployment-planner > .uga-primary-button { grid-column: 1; } | |
| .uga-deployment-stations { grid-template-columns: repeat(3, minmax(0, 1fr)); } | |
| .uga-deployment-station { padding: 4px; grid-template-columns: 19px minmax(0, 1fr); column-gap: 4px; } | |
| .uga-deployment-station > span { width: 19px; height: 24px; } | |
| .uga-deployment-station .uga-svg { width: 12px; height: 12px; } | |
| .uga-deployment-station b { font-size: 11px; letter-spacing: 0; overflow-wrap: anywhere; } | |
| .uga-deployment-station small { font-size: 10px; overflow-wrap: anywhere; } | |
| .uga-deployment-planner fieldset { grid-template-columns: 1fr; } | |
| .uga-manifest-groups, .uga-mod-picker { grid-template-columns: 1fr; } | |
| .uga-deck-summary { display: none; } | |
| } | |
| /* A 360-412px phone cannot show seven resources and every room in one row. | |
| Preserve the 44px controls, expose a real swipe lane, and leave a labelled | |
| continuation edge instead of making the remaining content look absent. The | |
| eight primary destinations do fit at this width when their full labels use | |
| compact command typography, so none of those labels are ellipsized. */ | |
| @media (max-width: 480px) { | |
| .uga-resource-ribbon { | |
| padding-right: 62px; | |
| scroll-padding-inline: 4px 62px; | |
| } | |
| .uga-resource-scroll-cue, | |
| .uga-district-scroll-cue { | |
| position: absolute; | |
| z-index: 12; | |
| width: 58px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: flex-end; | |
| gap: 5px; | |
| padding-right: 7px; | |
| pointer-events: none; | |
| color: #b9eefe; | |
| background: linear-gradient(90deg, rgba(3, 14, 23, 0), rgba(3, 14, 23, .93) 34%, #030e17 100%); | |
| font: 800 7px/1 Consolas, monospace; | |
| letter-spacing: .08em; | |
| text-shadow: 0 0 8px rgba(66, 221, 255, .65); | |
| } | |
| .uga-resource-scroll-cue { right: 4px; bottom: 6px; height: 28px; } | |
| .uga-resource-scroll-cue b, | |
| .uga-district-scroll-cue b { color: var(--uga-cyan); font-size: 17px; line-height: 1; } | |
| .uga-district-list { | |
| padding-right: 58px; | |
| scroll-padding-inline: 2px 58px; | |
| scroll-snap-type: x proximity; | |
| } | |
| .uga-district-button { | |
| flex-basis: 122px; | |
| width: 122px; | |
| scroll-snap-align: start; | |
| } | |
| .uga-district-copy b { overflow-wrap: normal; word-break: normal; } | |
| .uga-district-scroll-cue { top: 0; right: 0; height: 48px; } | |
| .uga-command-nav { | |
| grid-template-columns: repeat(8, minmax(44px, 1fr)); | |
| grid-auto-columns: unset; | |
| touch-action: pan-x; | |
| -webkit-overflow-scrolling: touch; | |
| } | |
| .uga-command-nav span { | |
| overflow: visible; | |
| font-size: clamp(7px, 1.95vw, 8px); | |
| letter-spacing: 0; | |
| text-overflow: clip; | |
| } | |
| } | |
| @media (max-height: 620px) and (orientation: landscape) { | |
| .uga-command-header { min-height: 54px; padding-top: 4px; padding-bottom: 4px; } | |
| .uga-command-stage { inset: 54px 0 54px; } | |
| .uga-district-rail { top: 8px; left: 8px; right: 8px; } | |
| .uga-district-button { min-height: 44px; } | |
| .uga-resource { height: 34px; } | |
| .uga-command-nav { min-height: 48px; } | |
| .uga-context-panel { left: auto; right: 8px; bottom: 0; width: min(36%, 340px); height: 44px; border: 1px solid var(--uga-cyan); border-radius: 10px 10px 0 0; } | |
| .uga-command-shell.is-sheet-expanded .uga-context-panel { top: 120px; height: auto; } | |
| .uga-campaign-hub .uga-hub-route-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } | |
| .uga-campaign-hub .uga-hub-route { grid-template-columns: 34px minmax(0, 1fr); } | |
| .uga-campaign-hub .uga-hub-route > button { grid-column: 1 / -1; width: 100%; } | |
| .uga-quick-actions { bottom: 48px; min-height: 44px; } | |
| .uga-command-visual { min-height: 78px; } | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| .uga-command-shell *, .uga-command-shell *::before, .uga-command-shell *::after { animation-duration: .01ms ; transition-duration: .01ms ; } | |
| .uga-command-visual::after { animation: none ; opacity: .18; transform: translateX(190%) skewX(-17deg); } | |
| } | |
| /* NEXUS-VII authored interior construction */ | |
| .uga-construction-view { display: grid; gap: 12px; } | |
| .uga-construction-queue, | |
| .uga-district-plots, | |
| .uga-facility-choices, | |
| .uga-commission-card { | |
| border: 1px solid rgba(92, 196, 232, .2); | |
| background: linear-gradient(135deg, rgba(6, 29, 43, .92), rgba(3, 14, 23, .95)); | |
| box-shadow: inset 0 1px rgba(255, 255, 255, .025); | |
| } | |
| .uga-construction-queue > header, | |
| .uga-district-plots > header, | |
| .uga-facility-choices > header { | |
| display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; | |
| padding: 12px 14px; border-bottom: 1px solid rgba(92, 196, 232, .14); | |
| } | |
| .uga-construction-queue header small, | |
| .uga-district-plots header small, | |
| .uga-facility-choices header small { display: block; color: var(--uga-cyan); font-size: 8px; letter-spacing: .15em; } | |
| .uga-construction-queue h3, | |
| .uga-district-plots h3, | |
| .uga-facility-choices h3, | |
| .uga-commission-card h3 { margin: 3px 0 0; color: #d9f5ff; font-size: 14px; } | |
| .uga-construction-queue > header > span, | |
| .uga-district-plots > header > span { color: #85a9ba; font: 700 9px/1.3 inherit; letter-spacing: .08em; text-align: right; } | |
| .uga-construction-power { margin: 10px 12px 0; min-height: 44px; padding: 7px 10px; display: flex; align-items: center; gap: 10px; border: 1px solid rgba(85, 226, 164, .22); background: rgba(20, 83, 69, .14); color: #75e3b0; } | |
| .uga-construction-power.is-deficit { border-color: rgba(255, 126, 76, .42); background: rgba(107, 36, 19, .2); color: #ff9d70; } | |
| .uga-construction-power .uga-svg { width: 18px; height: 18px; } | |
| .uga-construction-power div { display: grid; gap: 2px; } | |
| .uga-construction-power b { font-size: 10px; } | |
| .uga-construction-power small { color: #7193a4; font-size: 8px; letter-spacing: .08em; } | |
| .uga-job-list { display: grid; gap: 7px; padding: 10px 12px 12px; } | |
| .uga-job-card { min-height: 72px; display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 8px; border: 1px solid rgba(92, 196, 232, .15); background: rgba(4, 17, 27, .8); } | |
| .uga-job-card.is-active { border-color: rgba(66, 221, 255, .42); } | |
| .uga-job-card.is-paused_power { border-color: rgba(255, 158, 76, .42); } | |
| .uga-job-order { align-self: stretch; display: grid; place-content: center; text-align: center; border-right: 1px solid rgba(92, 196, 232, .12); } | |
| .uga-job-order b { color: var(--uga-cyan); font-size: 16px; } | |
| .uga-job-order span { max-width: 48px; color: #9abac9; font-size: 10px; overflow-wrap: anywhere; } | |
| .uga-job-copy { min-width: 0; display: grid; gap: 3px; } | |
| .uga-job-copy > small { color: #9abac9; font-size: 11px; } | |
| .uga-job-copy > b { overflow: hidden; color: #d9f5ff; font-size: 11px; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-job-progress { position: relative; height: 17px; overflow: hidden; border: 1px solid rgba(92, 196, 232, .13); background: rgba(0, 0, 0, .35); } | |
| .uga-job-progress i { position: absolute; inset: 0 auto 0 0; width: var(--value); background: linear-gradient(90deg, rgba(16, 114, 145, .45), rgba(66, 221, 255, .55)); } | |
| .uga-job-progress span { position: relative; z-index: 1; display: block; padding: 2px 5px; color: #c8e4ef; font-size: 11px; } | |
| .uga-job-controls { display: grid; grid-template-columns: 44px 44px; gap: 4px; } | |
| .uga-job-controls button { min-width: 44px; min-height: 44px; padding: 5px; border: 1px solid rgba(92, 196, 232, .2); background: rgba(7, 34, 48, .8); color: #9bcddd; font-size: 8px; font-weight: 800; cursor: pointer; } | |
| .uga-job-controls button:nth-child(1) .uga-svg { transform: rotate(-90deg); } | |
| .uga-job-controls button:nth-child(2) .uga-svg { transform: rotate(90deg); } | |
| .uga-job-controls button.is-danger { grid-column: 1 / -1; color: #ff9b83; border-color: rgba(255, 105, 75, .28); } | |
| .uga-job-controls button.is-confirming, | |
| .uga-primary-button.is-confirming { color: #081217; background: #ffbb56; border-color: #ffe09c; } | |
| .uga-job-controls button:disabled { opacity: .3; cursor: default; } | |
| .uga-build-plot-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; padding: 10px 12px 12px; } | |
| .uga-build-plot { min-height: 70px; padding: 8px; display: grid; grid-template-columns: 32px 1fr; grid-template-rows: 1fr auto; gap: 4px 8px; text-align: left; border: 1px solid rgba(92, 196, 232, .17); background: rgba(3, 17, 27, .83); color: #789aa9; cursor: pointer; } | |
| .uga-build-plot:hover, | |
| .uga-build-plot.is-selected { border-color: var(--uga-cyan); background: rgba(14, 69, 88, .38); color: #d9f5ff; } | |
| .uga-build-plot.is-complete { border-color: rgba(75, 215, 157, .28); } | |
| .uga-build-plot.is-building { border-color: rgba(245, 184, 76, .48); } | |
| .uga-build-plot:disabled { opacity: .48; cursor: default; } | |
| .uga-build-plot-tier { grid-row: 1 / -1; width: 32px; height: 32px; display: grid; place-items: center; align-self: center; border: 1px solid currentColor; color: var(--uga-cyan); font-size: 10px; font-weight: 900; } | |
| .uga-build-plot-copy { min-width: 0; display: grid; align-content: center; } | |
| .uga-build-plot-copy small { color: #688999; font-size: 7px; letter-spacing: .08em; } | |
| .uga-build-plot-copy b { overflow: hidden; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-build-plot-state { grid-column: 2; color: #6fcba6; font-size: 7px; font-weight: 800; letter-spacing: .08em; } | |
| .uga-facility-choices > header { display: block; } | |
| .uga-facility-choices > header p { margin: 5px 0 0; color: #7894a2; font-size: 10px; } | |
| .uga-facility-choice { display: grid; grid-template-columns: 74px minmax(0, 1fr) 160px; gap: 12px; align-items: stretch; padding: 12px; border-bottom: 1px solid rgba(92, 196, 232, .13); } | |
| .uga-facility-choice:last-child { border-bottom: 0; } | |
| .uga-facility-choice.is-installed { background: rgba(29, 93, 75, .12); } | |
| .uga-facility-choice.is-unavailable { opacity: .76; } | |
| .uga-facility-preview { position: relative; min-height: 94px; display: grid; place-items: center; overflow: hidden; border: 1px solid rgba(92, 196, 232, .2); background: radial-gradient(circle, rgba(40, 168, 199, .22), rgba(3, 14, 23, .9) 65%); } | |
| .uga-facility-preview::before, | |
| .uga-facility-preview::after { content: ''; position: absolute; inset: 12px; border: 1px solid rgba(66, 221, 255, .13); transform: rotate(45deg); } | |
| .uga-facility-preview::after { inset: 24px; } | |
| .uga-facility-preview > i { position: absolute; left: 12%; right: 12%; bottom: 12%; height: 18%; background: rgba(66, 221, 255, .2); clip-path: polygon(0 100%, 15% 25%, 35% 50%, 50% 0, 70% 45%, 86% 18%, 100% 100%); } | |
| .uga-facility-preview .uga-svg { position: relative; z-index: 1; width: 27px; height: 27px; color: var(--uga-cyan); } | |
| .uga-facility-preview b { position: absolute; top: 5px; right: 6px; color: #8ab1c0; font-size: 8px; } | |
| .uga-facility-copy { min-width: 0; } | |
| .uga-facility-copy > small { color: var(--uga-cyan); font-size: 7px; letter-spacing: .12em; } | |
| .uga-facility-copy h3 { margin: 4px 0; color: #e0f7ff; font-size: 13px; } | |
| .uga-facility-copy p { margin: 0; color: #86a3af; font-size: 10px; line-height: 1.45; } | |
| .uga-facility-effects { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 7px; } | |
| .uga-facility-effects span { padding: 4px 6px; border: 1px solid rgba(83, 210, 159, .2); background: rgba(19, 88, 69, .13); color: #a7dcc8; font-size: 11px; } | |
| .uga-facility-effects b { color: #65e0ab; margin-right: 2px; } | |
| .uga-facility-authorization { min-width: 0; display: grid; align-content: center; gap: 7px; } | |
| .uga-facility-cost { display: flex; flex-wrap: wrap; gap: 5px; } | |
| .uga-facility-cost > span { min-width: 44px; padding: 4px; display: grid; grid-template-columns: 12px 1fr; align-items: center; border: 1px solid rgba(92, 196, 232, .13); color: #b9dae6; } | |
| .uga-facility-cost .uga-svg { width: 11px; height: 11px; color: var(--uga-cyan); } | |
| .uga-facility-cost b { font-size: 12px; } | |
| .uga-facility-cost small { grid-column: 1 / -1; font-size: 11px; color: #a1bdca; } | |
| .uga-facility-authorization dl { margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 5px; } | |
| .uga-facility-authorization dl div { padding: 4px; border: 1px solid rgba(92, 196, 232, .11); } | |
| .uga-facility-authorization dt { color: #a1bdca; font-size: 11px; } | |
| .uga-facility-authorization dd { margin: 2px 0 0; color: #c6e5ef; font-size: 12px; } | |
| .uga-construction-issue { margin: 0; display: flex; align-items: flex-start; gap: 5px; color: #ffb08f; font-size: 12px; line-height: 1.4; } | |
| .uga-construction-issue .uga-svg { flex: 0 0 12px; width: 12px; height: 12px; } | |
| .uga-commission-card { padding: 14px; display: grid; grid-template-columns: 1fr minmax(170px, auto); align-items: end; gap: 14px; } | |
| .uga-commission-card small { color: var(--uga-cyan); font-size: 8px; letter-spacing: .13em; } | |
| .uga-commission-card p { margin: 5px 0 10px; color: #7e9aa7; font-size: 10px; line-height: 1.45; } | |
| .uga-commission-card.is-complete { border-color: rgba(75, 215, 157, .25); } | |
| /* The desktop inspector is narrow even on a wide display. Stacking only in | |
| that surface avoids squeezing the explanation beside a 170px action. */ | |
| .uga-context-panel .uga-commission-card { grid-template-columns: minmax(0, 1fr); align-items: start; } | |
| .uga-context-panel .uga-commission-card > button { width: 100%; white-space: normal; } | |
| .uga-context-panel .uga-commission-card p { font-size: 12px; line-height: 1.45; } | |
| @media (max-width: 760px) { | |
| /* Keep the selected compartment visible while its details are open. The | |
| later construction override used to replace the mobile bottom sheet's | |
| 40% contract with 66%, covering the room on real phone portrait screens. */ | |
| .uga-command-shell.is-sheet-expanded .uga-context-panel { height: min(40%, 360px); } | |
| .uga-construction-view { gap: 8px; } | |
| .uga-build-plot-grid { grid-template-columns: 1fr; } | |
| .uga-build-plot { min-height: 48px; } | |
| .uga-facility-choice { grid-template-columns: 58px minmax(0, 1fr); } | |
| .uga-facility-preview { min-height: 84px; } | |
| .uga-facility-authorization { grid-column: 1 / -1; grid-template-columns: 1fr; } | |
| .uga-commission-card { grid-template-columns: 1fr; } | |
| .uga-job-card { grid-template-columns: 42px minmax(0, 1fr); } | |
| .uga-job-controls { grid-column: 1 / -1; grid-template-columns: 44px 44px 1fr; } | |
| .uga-job-controls button.is-danger { grid-column: auto; } | |
| .uga-construction-queue > header, | |
| .uga-district-plots > header { align-items: flex-start; } | |
| .operation-debrief-grid { grid-template-columns: 1fr; } | |
| .operation-debrief-section:last-child { grid-column: 1; } | |
| .operation-debrief-section dl div { grid-template-columns: minmax(84px, .85fr) minmax(0, 1.15fr); } | |
| } | |
| @media (max-width: 760px) and (orientation: portrait) { | |
| /* Keep the scrollable resource row below the fixed 44px exit target. */ | |
| .uga-command-header { gap: 15px; } | |
| .uga-command-shell.is-deployment-mode .uga-command-header, | |
| .uga-command-shell.is-deployment-mode .uga-district-rail, | |
| .uga-command-shell.is-deployment-mode .uga-scene-overlay, | |
| .uga-command-shell.is-deployment-mode .uga-command-nav, | |
| .uga-command-shell.is-deployment-mode .uga-quick-actions { display: none; } | |
| .uga-command-shell.is-deployment-mode .uga-command-stage { inset: 0; } | |
| .uga-command-shell.is-deployment-mode .uga-context-panel { bottom: 0; } | |
| /* Strike Bay remains a 3D-first preparation space. Even with the planner | |
| expanded, the cutaway keeps more than the required 45% of usable height. */ | |
| .uga-command-shell[data-district="hangar"].is-sheet-expanded .uga-context-panel { height: min(40%, 360px); } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-planner { margin-top: 6px; padding: 7px; gap: 5px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-planner > header p { display: none; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-planner > header { min-height: 18px; display: flex; align-items: center; gap: 8px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-planner > header small { flex: 0 0 auto; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-planner > header h3 { margin: 0; font-size: 11px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-identity { grid-template-columns: minmax(116px, .72fr) minmax(0, 1.28fr); gap: 5px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-identity .uga-personnel-select { grid-template-columns: 28px minmax(0, 1fr); gap: 4px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-identity .uga-deployment-portrait { width: 27px; height: 38px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-identity select { min-height: 44px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-readiness { min-height: 48px; grid-template-columns: minmax(0, 1fr) minmax(154px, .95fr); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness { position: sticky; bottom: 0; z-index: 5; box-shadow: 0 -8px 20px rgba(0, 0, 0, .42); } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-station { min-height: 48px; } | |
| } | |
| @media (max-height: 620px) and (orientation: landscape) { | |
| .uga-command-shell.is-sheet-expanded .uga-context-panel { top: 120px; height: auto; } | |
| .uga-facility-choice { grid-template-columns: 54px minmax(0, 1fr) 142px; padding: 8px; } | |
| .uga-facility-preview { min-height: 72px; } | |
| .uga-build-plot { min-height: 54px; } | |
| } | |
| /* Deployment is its own preparation route on compact screens. Keep the | |
| hangar and its dedicated loadout controls, but remove management chrome. */ | |
| @media (max-width: 900px), (max-height: 620px) and (max-width: 1024px) { | |
| .uga-command-shell.is-deployment-mode .uga-command-header, | |
| .uga-command-shell.is-deployment-mode .uga-district-rail, | |
| .uga-command-shell.is-deployment-mode .uga-scene-overlay, | |
| .uga-command-shell.is-deployment-mode .uga-command-nav, | |
| .uga-command-shell.is-deployment-mode .uga-quick-actions { display: none; } | |
| .uga-command-shell.is-deployment-mode .uga-command-stage { inset: 0; } | |
| } | |
| @media (max-height: 620px) and (orientation: landscape) and (max-width: 1024px) { | |
| .uga-command-shell.is-deployment-mode .uga-context-panel, | |
| .uga-command-shell.is-deployment-mode.is-sheet-expanded .uga-context-panel { | |
| top: 0; | |
| right: 0; | |
| bottom: 0; | |
| width: min(40%, 360px); | |
| height: auto; | |
| border-radius: 0; | |
| } | |
| } | |
| /* The deployment inspector stays narrow even on a landscape monitor. Do not | |
| squeeze long station names and a commander picker into desktop columns. */ | |
| .uga-command-shell.is-deployment-mode .uga-deployment-identity { grid-template-columns: minmax(0, 1fr); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-stations { grid-template-columns: repeat(2, minmax(0, 1fr)); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-station { grid-template-columns: 20px minmax(0, 1fr); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-station b, | |
| .uga-command-shell.is-deployment-mode .uga-deployment-station small { overflow-wrap: normal; word-break: normal; } | |
| /* Give the action its own grid row, rather than painting a sticky button over | |
| stations and loadout controls. All fields scroll inside the remaining row. */ | |
| .uga-command-shell.is-deployment-mode .uga-deployment-view { overflow: hidden; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-planner { height: 100%; min-height: 0; margin-top: 0; grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto; } | |
| .uga-deployment-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; min-width: 0; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-fields { min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; grid-template-columns: minmax(0, 1fr); padding-right: 3px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness { position: static; background: #071c28; box-shadow: none; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness .uga-primary-button { grid-column: auto; min-width: 0; min-height: 44px; margin: 0; } | |
| .uga-deployment-fields > header p { margin: 5px 0 0; color: #7d98a7; font-size: 8px; line-height: 1.45; } | |
| @media (max-width: 760px) and (orientation: portrait) { | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-fields > header p { display: none; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-fields > header { min-height: 18px; display: flex; align-items: center; gap: 8px; } | |
| .uga-command-shell[data-district="hangar"] .uga-deployment-fields > header h3 { margin: 0; font-size: 11px; } | |
| } | |
| @media (max-height: 620px) and (orientation: landscape) and (max-width: 1024px) { | |
| /* Identity + resource captions occupy two real rows (30 + 4 + 34px), | |
| so the rail cannot start at the old single-row 54px offset. */ | |
| .uga-command-header { min-height: 80px; } | |
| .uga-command-stage { top: 80px; } | |
| .uga-command-shell.is-deployment-mode .uga-command-stage { top: 0; } | |
| } | |
| /* The ship is an object inside a large bay, not a menu-filling portrait. | |
| Keep its first view open; the existing real form expands without resetting | |
| its draft, and the renderer fits these actual panel bounds. */ | |
| .uga-deployment-context[hidden] { display: none ; } | |
| .uga-deployment-context { | |
| position: absolute; | |
| top: max(8px, env(safe-area-inset-top)); | |
| left: max(8px, env(safe-area-inset-left)); | |
| max-width: calc(100% - 16px); | |
| min-height: 48px; | |
| display: grid; | |
| grid-template-columns: auto minmax(0, 1fr); | |
| align-items: center; | |
| gap: 12px; | |
| padding: 0 14px 0 0; | |
| border: 1px solid rgba(92, 196, 232, .3); | |
| background: rgba(3, 18, 28, .92); | |
| pointer-events: auto; | |
| z-index: 22; | |
| } | |
| .uga-deployment-context > button { min-height: 46px; min-width: 138px; padding: 0 10px; display: flex; align-items: center; justify-content: center; gap: 6px; border: 0; border-right: 1px solid rgba(92, 196, 232, .25); background: rgba(17, 50, 67, .5); cursor: pointer; } | |
| .uga-deployment-context > button .uga-svg { width: 14px; height: 14px; transform: rotate(180deg); } | |
| .uga-deployment-context > button span { font-size: 10px; font-weight: 700; } | |
| .uga-deployment-context > div { min-width: 0; display: grid; gap: 4px; } | |
| .uga-deployment-context small { color: #92b4c3; font: 9px/1.15 Consolas, monospace; } | |
| .uga-deployment-context strong { color: #d7eef5; font-size: 12px; letter-spacing: .12em; } | |
| .uga-command-shell.is-deployment-mode .uga-context-panel { | |
| top: auto; | |
| right: max(12px, env(safe-area-inset-right)); | |
| bottom: max(12px, env(safe-area-inset-bottom)); | |
| left: auto; | |
| width: min(390px, 40vw); | |
| min-width: 0; | |
| height: 204px; | |
| border-radius: 8px; | |
| clip-path: none; | |
| } | |
| .uga-command-shell.is-deployment-mode.is-loadout-expanded .uga-context-panel { top: 76px; height: auto; } | |
| .uga-command-shell.is-deployment-mode .uga-context-body { display: block; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0; padding: 0 4px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar > button { justify-content: center; font-size: 10px; padding: 0 6px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toolbar > .uga-deployment-toggle { border-right: 0; color: var(--uga-cyan); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-toggle .uga-svg { transform: rotate(-90deg); } | |
| .uga-command-shell.is-deployment-mode.is-loadout-expanded .uga-deployment-toggle .uga-svg { transform: rotate(90deg); } | |
| .uga-deployment-summary { display: none; } | |
| .uga-command-shell.is-deployment-mode:not(.is-loadout-expanded) .uga-deployment-fields { display: none; } | |
| .uga-command-shell.is-deployment-mode:not(.is-loadout-expanded) .uga-deployment-summary { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 9px; align-items: center; min-height: 55px; } | |
| .uga-deployment-summary > span { height: 32px; display: grid; place-items: center; color: var(--uga-cyan); border: 1px solid rgba(66, 221, 255, .3); } | |
| .uga-deployment-summary > div { min-width: 0; } | |
| .uga-deployment-summary small { display: block; color: #89aab9; font: 9px/1.2 Consolas, monospace; } | |
| .uga-deployment-summary strong { display: block; margin-top: 3px; color: #e1f2f8; font-size: 13px; line-height: 1.2; } | |
| .uga-deployment-summary p { margin: 4px 0 0; color: #a9c7d4; font-size: 10px; line-height: 1.3; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-view { padding: 8px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-planner { padding: 7px; gap: 7px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness { grid-template-columns: minmax(0, 1fr) minmax(144px, .9fr); } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness small { font-size: 8px; line-height: 1.2; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness .uga-primary-button { font-size: 11px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-planner label > span, | |
| .uga-command-shell.is-deployment-mode .uga-deployment-planner legend { font-size: 10px; line-height: 1.3; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-planner select { min-height: 44px; font-size: 11px; } | |
| @media (max-width: 760px) and (orientation: portrait) { | |
| .uga-command-shell.is-deployment-mode .uga-context-panel, | |
| .uga-command-shell.is-deployment-mode.is-sheet-expanded .uga-context-panel { top: auto; right: 0; left: 0; bottom: 0; width: 100%; height: calc(204px + env(safe-area-inset-bottom)); padding-bottom: env(safe-area-inset-bottom); border-radius: 12px 12px 0 0; } | |
| .uga-command-shell.is-deployment-mode.is-loadout-expanded .uga-context-panel { height: min(44%, 396px); } | |
| .uga-command-shell.is-deployment-mode .uga-context-body { bottom: env(safe-area-inset-bottom); } | |
| } | |
| @media (max-height: 620px) and (orientation: landscape) and (max-width: 1024px) { | |
| .uga-command-shell.is-deployment-mode .uga-context-panel, | |
| .uga-command-shell.is-deployment-mode.is-sheet-expanded .uga-context-panel { top: auto; right: max(8px, env(safe-area-inset-right)); bottom: max(8px, env(safe-area-inset-bottom)); width: min(40%, 360px); height: 204px; } | |
| .uga-command-shell.is-deployment-mode.is-loadout-expanded .uga-context-panel { top: max(8px, env(safe-area-inset-top)); height: auto; } | |
| } | |
| /* Reserve authored frame art for the primary action role. Repeating those | |
| surrounds on every room, resource rail, inspector and record read as a | |
| selected-state overlay and covered the live labels on a phone. */ | |
| .uga-primary-button { position: relative; min-height: 54px; } | |
| /* The primary action keeps its plate — docs/CLAUDE_HANDOFF.md §4 names primary | |
| actions as a sanctioned frame surface — but not at 23px. A 23px band top AND | |
| bottom on a 44-48px control is 46px of frame around one line of text, so the | |
| ornament crossed its own label and the corner brackets closed over the ends. | |
| Trimmed to 12px so it frames the action instead of wearing it, and dropped | |
| below the label so a band can never sit on top of the text again. */ | |
| .uga-primary-button::after { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| z-index: 0; | |
| pointer-events: none; | |
| border: 12px solid transparent; | |
| border-image-source: var(--mf-gui-primary); | |
| border-image-slice: 41.0714% 7.5658%; | |
| border-image-width: 12px; | |
| } | |
| .uga-primary-button { position: relative; isolation: isolate; } | |
| .uga-primary-button > * { position: relative; z-index: 1; } | |
| /* Prevent the original microtype from defeating the now-available page zoom. */ | |
| .uga-record-card small, .uga-intel-card small, .uga-commander-card small, | |
| .uga-mission-card > div small, .uga-mission-card > div b, | |
| .uga-mission-card li, .uga-manifest-row small { font-size: 10px; line-height: 1.3; } | |
| .uga-record-card p, .uga-mission-card p, .uga-research-card p, .uga-intel-card p, | |
| .uga-manifest-control small, .uga-mod-control small { font-size: 11px; line-height: 1.4; } | |
| .uga-commander-card b, .uga-manifest-control b, .uga-mod-control b, | |
| .uga-manifest-row b { font-size: 11px; } | |
| /* Phone command chrome has three measured structural bands: the two-row | |
| identity header, the scene, and the fixed navigation dock. Keeping those | |
| dimensions in variables prevents the inspector and room controls from | |
| inheriting the old single-row offsets when safe-area insets are present. */ | |
| @media (max-width: 480px) and (orientation: portrait) { | |
| .uga-command-shell { | |
| --uga-mobile-header: calc(86px + max(6px, env(safe-area-inset-top))); | |
| --uga-mobile-dock: calc(56px + env(safe-area-inset-bottom)); | |
| } | |
| .uga-command-header { | |
| height: var(--uga-mobile-header); | |
| min-height: var(--uga-mobile-header); | |
| padding: max(6px, env(safe-area-inset-top)) 52px 6px 10px; | |
| grid-template-columns: minmax(0, 1fr); | |
| grid-template-rows: 44px 30px; | |
| align-content: start; | |
| gap: 4px; | |
| } | |
| .uga-command-identity { min-width: 0; align-self: center; } | |
| .uga-command-identity strong { min-width: 0; font-size: 14px; } | |
| .uga-resource-ribbon { | |
| width: 100%; | |
| min-width: 0; | |
| padding: 0 28px 0 0; | |
| gap: 0; | |
| border-top: 1px solid rgba(92, 196, 232, .14); | |
| border-bottom: 1px solid rgba(92, 196, 232, .2); | |
| border-radius: 0; | |
| background: rgba(3, 14, 23, .76); | |
| -webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 20px), transparent 100%); | |
| mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 20px), transparent 100%); | |
| } | |
| .uga-resource { height: 28px; min-width: 58px; padding-right: 7px; } | |
| .uga-resource-scroll-cue { display: none; } | |
| .uga-command-stage { inset: var(--uga-mobile-header) 0 var(--uga-mobile-dock); } | |
| .uga-district-rail { top: 6px; height: 48px; } | |
| .uga-district-list { padding-right: 28px; scroll-padding-inline: 2px 28px; } | |
| .uga-district-button { flex-basis: 96px; width: 96px; min-width: 96px; } | |
| .uga-district-copy b { font-size: 10px; } | |
| .uga-district-scroll-cue { | |
| top: 0; | |
| right: 0; | |
| width: 28px; | |
| height: 48px; | |
| padding: 0 5px 0 0; | |
| font-size: 0; | |
| } | |
| .uga-district-scroll-cue b { font-size: 18px; } | |
| .uga-rail-top { | |
| top: 58px; | |
| display: grid; | |
| grid-template-columns: 48px minmax(0, 1fr); | |
| align-items: stretch; | |
| gap: 6px; | |
| } | |
| .uga-overview-button { grid-column: 1; grid-row: 1; } | |
| .uga-ship-telemetry-badge { | |
| grid-column: 2; | |
| grid-row: 1; | |
| width: auto; | |
| max-width: none; | |
| min-width: 0; | |
| height: 48px; | |
| } | |
| .uga-sector-filter-bar { | |
| grid-column: 1 / -1; | |
| grid-row: 2; | |
| width: 100%; | |
| min-width: 0; | |
| min-height: 44px; | |
| display: grid; | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| justify-content: stretch; | |
| } | |
| .uga-filter-chip { min-width: 0; min-height: 44px; padding: 0 4px; white-space: nowrap; } | |
| .uga-context-panel { bottom: 0; } | |
| .uga-command-shell.is-sheet-expanded .uga-context-panel { height: min(42%, 320px); } | |
| .uga-sheet-toggle { min-height: 44px; padding-inline: 12px; } | |
| .uga-context-scroll { padding: 10px 14px max(20px, env(safe-area-inset-bottom)); overscroll-behavior: contain; } | |
| .uga-command-nav { | |
| min-height: var(--uga-mobile-dock); | |
| padding: 0 max(4px, env(safe-area-inset-right)) env(safe-area-inset-bottom) max(4px, env(safe-area-inset-left)); | |
| grid-template-columns: none; | |
| grid-auto-columns: 44px; | |
| justify-content: start; | |
| scroll-padding-inline: 4px; | |
| scroll-snap-type: x proximity; | |
| } | |
| .uga-command-nav button { width: 44px; min-width: 44px; min-height: 54px; scroll-snap-align: nearest; } | |
| .uga-command-nav span { max-width: 42px; overflow: visible; font-size: 7px; line-height: 1; text-overflow: clip; } | |
| } | |
| /* The isolated UGA document shares the War Table's structural cadence through | |
| a small token bridge. Authored neutral frame rasters supply chrome; live CSS | |
| alone communicates active, locked, enemy, and consequential states. */ | |
| .uga-command-shell { | |
| --uga-edge: 12px; | |
| --uga-gap: 8px; | |
| --uga-touch: 44px; | |
| --uga-radius: 10px; | |
| --uga-panel: var(--mf-ui-surface, rgba(3, 14, 23, .92)); | |
| --uga-panel-soft: var(--mf-ui-surface-soft, rgba(6, 23, 34, .78)); | |
| --uga-line: var(--mf-ui-line, rgba(103, 183, 207, .22)); | |
| --uga-muted: var(--mf-ui-muted, #7893a1); | |
| font-family: var(--font, "Bahnschrift"), "Arial Narrow", "Segoe UI", sans-serif; | |
| letter-spacing: .025em; | |
| } | |
| .uga-command-header { | |
| border-bottom-color: var(--uga-line); | |
| background: linear-gradient(180deg, rgba(2, 10, 17, .97), rgba(3, 14, 23, .9)); | |
| } | |
| .uga-command-header::after, | |
| .uga-context-panel::before { display: none; } | |
| .uga-resource-ribbon { | |
| position: relative; | |
| isolation: isolate; | |
| /* 252px fitted five unlabelled values in portrait, but the rail actually holds | |
| seven — landscape adds word labels and CREDITS…RESEARCH, FUEL and PROBES were | |
| simply clipped away, so the player lost stockpiles by rotating the phone. | |
| Take the width that is there and scroll rather than silently truncate: a | |
| resource the player cannot see is a resource they cannot plan with. */ | |
| max-width: 100%; | |
| overflow-x: auto; | |
| scrollbar-width: none; | |
| /* Clear the frame's own bands. The plate below draws inside the box, so without | |
| this the bottom band lands exactly on the CREDITS/ALLOYS/COMPONENTS/BIO | |
| baseline and shears the labels in half. */ | |
| padding-block: 5px; | |
| border: 0; | |
| background: rgba(3, 15, 24, .78); | |
| } | |
| /* The resource rail keeps its plate: docs/CLAUDE_HANDOFF.md §4 names resources as | |
| a sanctioned frame surface, and it is the one HUD element the art was drawn | |
| for. Trimmed from 17px to 11px so it reads as a border rather than a housing. */ | |
| .uga-resource-ribbon::-webkit-scrollbar { display: none; } | |
| .uga-resource-ribbon::after { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| z-index: 3; | |
| pointer-events: none; | |
| border: 11px solid transparent; | |
| border-image-source: var(--mf-gui-resource); | |
| border-image-slice: 35.4167% 6.7460%; | |
| border-image-width: 11px; | |
| } | |
| .uga-resource { border-left-color: rgba(101, 180, 204, .13); background: transparent; } | |
| .uga-resource:first-child { border-left-color: transparent; } | |
| .uga-resource > span { color: #80b8ca; } | |
| .uga-resource small { color: var(--uga-muted); } | |
| .uga-icon-button, | |
| .uga-more-shortcuts button { position: relative; border: 0; border-radius: 7px; background: rgba(5, 22, 33, .88); } | |
| .uga-icon-button.uga-command-exit { position: absolute; } | |
| /* No frame plate on small controls. A 44px icon button given a 15px border-image | |
| band on every side is 30px of frame around a 18px glyph, at full opacity — the | |
| plate became the button. It already has a 1px cyan border and a chamfered | |
| clip-path, which is the whole shape language; the frame only muddied it. | |
| Same for the three More shortcuts: they are a passive row of links, so they | |
| take a line, not a machined plate. */ | |
| .uga-more-shortcuts button { border: 1px solid var(--uga-line); } | |
| .uga-district-list, | |
| .uga-overview-button, | |
| .uga-ship-telemetry-badge, | |
| .uga-sector-filter-bar, | |
| .uga-context-panel, | |
| .uga-session-type, | |
| .uga-hub-route, | |
| .uga-quick-actions { | |
| border-color: var(--uga-line); | |
| border-radius: var(--uga-radius); | |
| background: var(--uga-panel); | |
| box-shadow: none; | |
| clip-path: none; | |
| } | |
| .uga-district-button, | |
| .uga-filter-chip, | |
| .uga-session-type > button, | |
| .uga-hub-route > button { border-radius: 7px; } | |
| .uga-district-button.is-active, | |
| .uga-filter-chip.is-active { | |
| color: var(--uga-cyan); | |
| background: rgba(17, 87, 113, .32); | |
| box-shadow: inset 0 -2px var(--uga-cyan); | |
| } | |
| .uga-district-button.is-active::before { background: var(--uga-cyan); box-shadow: none; } | |
| .uga-context-panel { isolation: isolate; } | |
| /* The inspector does not get a machined plate. This painted a 27px submenu frame | |
| on all four sides of the whole context panel at z-index:5 — ABOVE its own | |
| content, not behind it — so the bottom band cut straight through whatever the | |
| panel was scrolling: "War Table" in the landscape hub, and the second row of | |
| COMMAND SYSTEMS & SERVICES in More. Reserving padding would not have helped, | |
| because at z-index:5 the band overlays regardless. It is also the exact case | |
| docs/UGA_PLAYER_FLOW.md rules out — selection art "is not a generic border for | |
| top bars, inspectors, or passive panels" — and an expanded sheet is a layout | |
| state, not a selection. The panel keeps its own line, radius and background | |
| from the shared .uga-context-panel rule above. */ | |
| .uga-activity-line { border: 0; border-radius: 7px; background: rgba(6, 28, 26, .64); } | |
| .uga-primary-button { | |
| border-color: rgba(255, 181, 74, .52); | |
| border-radius: 8px; | |
| color: #ffe0a3; | |
| background: linear-gradient(115deg, rgba(104, 59, 9, .72), rgba(25, 25, 23, .9)); | |
| } | |
| .uga-primary-button:hover { border-color: var(--uga-amber); background: rgba(118, 69, 11, .82); box-shadow: none; } | |
| .uga-primary-button:disabled { color: #657987; border-color: rgba(107, 133, 146, .2); background: rgba(32, 42, 48, .58); } | |
| .uga-primary-button:disabled::after { opacity: .35; } | |
| .uga-command-nav { border-top-color: var(--uga-line); background: rgba(2, 10, 17, .98); } | |
| .uga-command-nav button { position: relative; isolation: isolate; border: 0; background: transparent; color: #708b99; } | |
| /* The dock says "selected" in its own language and does not borrow the tab | |
| plate to do it. The active destination already carries three cues — cyan icon | |
| and label, a background tint, and the 2px cyan rule along its top edge — so | |
| the machined frame was a redundant fourth, and it was the same tab_frame | |
| asset used by the quick row, the shortcuts and the access cards. Reusing one | |
| piece of border art on every tab-shaped thing is what made the interface read | |
| as ornament; the plate is worth more where it appears once. */ | |
| .uga-command-nav button.is-active { color: var(--uga-cyan); background: rgba(17, 87, 113, .22); } | |
| .uga-command-nav button.is-active::before { background: var(--uga-cyan); box-shadow: 0 0 10px rgba(66, 221, 255, .45); } | |
| .uga-command-nav button[data-nav-primary="true"]:not(.is-active) { color: #d6a95f; } | |
| .uga-more-shortcuts { display: none; } | |
| .uga-progress-grid { display: grid; gap: 8px; margin-top: 12px; } | |
| .uga-progress-route { | |
| position: relative; | |
| isolation: isolate; | |
| width: 100%; | |
| min-height: 84px; | |
| padding: 10px 15px; | |
| display: grid; | |
| grid-template-columns: 34px minmax(0, 1fr) 18px; | |
| align-items: center; | |
| gap: 10px; | |
| border: 1px solid var(--uga-line); | |
| border-radius: 8px; | |
| --uga-progress-art: url('../../assets/runtime/ui/menu-art-v1/operations-war-table-v1.webp'); | |
| background: linear-gradient(90deg, rgba(3, 15, 24, .96) 0%, rgba(3, 15, 24, .85) 55%, rgba(3, 15, 24, .42) 100%), var(--uga-progress-art) 76% center / cover no-repeat; | |
| color: #d9edf4; | |
| text-align: left; | |
| cursor: pointer; | |
| } | |
| .uga-progress-route:nth-child(2) { --uga-progress-art: url('../../assets/runtime/ui/menu-art-v1/contracts-intel-table-v1.webp'); } | |
| .uga-progress-route:nth-child(3) { --uga-progress-art: url('../../assets/runtime/ui/menu-art-v1/research-directorate-v1.webp'); } | |
| .uga-progress-route > * { position: relative; z-index: 1; } | |
| .uga-progress-route::after { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| z-index: 2; | |
| pointer-events: none; | |
| border: 23px solid transparent; | |
| border-image-source: var(--mf-gui-entry); | |
| border-image-slice: 27.380952% 7.565789%; | |
| border-image-width: 23px; | |
| } | |
| .uga-progress-route > span { width: 34px; height: 34px; display: grid; place-items: center; color: #83a9b8; } | |
| .uga-progress-route > div { min-width: 0; } | |
| .uga-progress-route small, | |
| .uga-progress-route strong, | |
| .uga-progress-route p { display: block; } | |
| .uga-progress-route small { color: var(--uga-green); font: 8px/1 Consolas, monospace; letter-spacing: .1em; } | |
| .uga-progress-route strong { margin-top: 4px; font-size: 14px; } | |
| .uga-progress-route p { margin: 3px 0 0; overflow: hidden; color: var(--uga-muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-progress-route > .uga-svg { width: 16px; height: 16px; color: var(--uga-cyan); } | |
| .uga-progress-route.is-locked small, | |
| .uga-progress-route.is-locked > .uga-svg, | |
| .uga-progress-route.is-objective-locked small { color: var(--uga-amber); } | |
| @media (max-width: 480px) and (orientation: portrait) { | |
| .uga-command-shell { | |
| --uga-edge: 10px; | |
| --uga-gap: 7px; | |
| --uga-mobile-header: calc(94px + max(6px, env(safe-area-inset-top))); | |
| } | |
| .uga-command-header { padding-right: 54px; padding-left: var(--uga-edge); grid-template-rows: 42px 36px; gap: 4px; } | |
| .uga-command-crest { width: 34px; height: 34px; border-color: var(--uga-line); background: rgba(10, 45, 61, .46); filter: none; } | |
| .uga-command-identity strong { font-size: 15px; letter-spacing: .08em; } | |
| .uga-resource-ribbon { | |
| width: min(100%, 252px); | |
| height: 36px; | |
| padding: 4px 18px 4px 12px; | |
| scroll-padding-inline: 12px 18px; | |
| gap: 0; | |
| border: 0; | |
| border-radius: 7px; | |
| -webkit-mask-image: none; | |
| mask-image: none; | |
| } | |
| .uga-resource { min-width: 48px; height: 28px; padding: 2px 5px 2px 17px; } | |
| .uga-resource > span { left: 4px; top: 7px; } | |
| .uga-resource b { font-size: 11px; } | |
| .uga-resource small { display: none; } | |
| .uga-command-stage { inset: var(--uga-mobile-header) 0 var(--uga-mobile-dock); } | |
| .uga-district-rail { left: var(--uga-edge); right: var(--uga-edge); gap: var(--uga-gap); } | |
| .uga-district-list { gap: 5px; padding: 2px 24px 2px 2px; scroll-padding-inline: 2px 24px; } | |
| .uga-district-button { | |
| flex-basis: calc((100vw - 58px) / 3); | |
| width: calc((100vw - 58px) / 3); | |
| min-width: calc((100vw - 58px) / 3); | |
| border-color: rgba(101, 180, 204, .14); | |
| } | |
| .uga-district-copy b { font-size: 10px; line-height: 1.15; } | |
| .uga-district-scroll-cue { width: 24px; padding: 0 4px 0 0; background: linear-gradient(90deg, transparent, rgba(3, 14, 23, .96)); } | |
| .uga-district-scroll-cue b { font-size: 17px; } | |
| .uga-rail-top { left: var(--uga-edge); right: var(--uga-edge); gap: var(--uga-gap); } | |
| .uga-ship-telemetry-badge { border-color: var(--uga-line); } | |
| .uga-telemetry-power span { display: none; } | |
| .uga-sector-filter-bar { gap: 4px; padding: 2px; } | |
| .uga-filter-chip { font-size: 10px; letter-spacing: .04em; } | |
| .uga-context-panel { border-color: var(--uga-line); border-radius: 12px 12px 0 0; box-shadow: 0 -12px 32px rgba(0, 0, 0, .72); } | |
| .uga-command-shell.is-sheet-expanded .uga-context-panel { height: min(38%, 304px); } | |
| .uga-sheet-toggle { border-bottom-color: var(--uga-line); background: rgba(3, 16, 25, .97); } | |
| .uga-sheet-toggle > span { width: 30px; height: 3px; background: rgba(111, 154, 170, .55); } | |
| .uga-sheet-toggle b { font-size: 10px; letter-spacing: .08em; } | |
| .uga-context-scroll { padding: 10px 16px max(18px, env(safe-area-inset-bottom)); } | |
| .uga-context-heading { gap: var(--uga-gap); } | |
| .uga-context-heading h2, | |
| .uga-section-title h2 { overflow: hidden; font-size: 15px; line-height: 1.15; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-context-heading small, | |
| .uga-section-title > small { font-size: 8px; letter-spacing: .1em; } | |
| .uga-district-description, | |
| .uga-section-title p { display: -webkit-box; overflow: hidden; font-size: 10px; line-height: 1.35; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } | |
| .uga-tier-rail { height: 24px; margin: 5px 0; } | |
| .uga-activity-line { min-height: 36px; margin: 5px 0 7px; font-size: 9px; } | |
| .uga-command-nav { | |
| grid-template-columns: repeat(5, minmax(0, 1fr)); | |
| grid-auto-columns: unset; | |
| overflow: visible; | |
| padding-right: max(4px, env(safe-area-inset-right)); | |
| padding-left: max(4px, env(safe-area-inset-left)); | |
| } | |
| .uga-command-nav [data-nav="galaxy"], | |
| .uga-command-nav [data-nav="settings"], | |
| .uga-command-nav [data-nav="crew"] { display: none; } | |
| .uga-command-nav button { width: 100%; min-width: 0; min-height: 54px; gap: 3px; } | |
| .uga-command-nav button::after { width: min(calc(100% - 2px), 74px); } | |
| .uga-command-nav .uga-svg { width: 18px; height: 18px; } | |
| .uga-command-nav span { max-width: 100%; overflow: hidden; font-size: 8px; line-height: 1; letter-spacing: .015em; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-campaign-hub > .uga-section-title > small, | |
| .uga-campaign-hub > .uga-section-title > p, | |
| .uga-strategic-layer-model { display: none; } | |
| .uga-more-shortcuts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--uga-gap); margin: 9px 0 12px; } | |
| .uga-more-shortcuts button { min-width: 0; min-height: var(--uga-touch); display: flex; align-items: center; justify-content: center; gap: 6px; color: #8ca6b2; } | |
| .uga-more-shortcuts .uga-svg { width: 16px; height: 16px; } | |
| .uga-more-shortcuts span { overflow: hidden; font-size: 9px; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-progress-grid { gap: var(--uga-gap); margin-top: 9px; } | |
| .uga-progress-route { min-height: 76px; padding: 8px 13px; grid-template-columns: 30px minmax(0, 1fr) 16px; gap: 8px; } | |
| .uga-progress-route > span { width: 30px; height: 30px; } | |
| .uga-progress-route strong { font-size: 13px; } | |
| .uga-progress-route p { font-size: 9px; } | |
| .uga-session-types, | |
| .uga-hub-services { margin-top: 10px; } | |
| .uga-campaign-hub > .uga-session-types { display: none; } | |
| .uga-session-types > header span, | |
| .uga-hub-services > header span { display: none; } | |
| .uga-session-types > header small, | |
| .uga-hub-services > header small { font-size: 9px; } | |
| .uga-session-type-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--uga-gap); margin-top: var(--uga-gap); } | |
| .uga-session-type { grid-template-columns: 28px minmax(0, 1fr); gap: 6px; padding: 7px; } | |
| .uga-session-type-icon { width: 28px; height: 28px; } | |
| .uga-session-type > div > small { font-size: 7px; } | |
| .uga-session-type h3 { margin-top: 3px; font-size: 11px; } | |
| .uga-session-type p, | |
| .uga-session-type > div > b { display: none; } | |
| .uga-session-type > button { min-height: var(--uga-touch); font-size: 9px; } | |
| .uga-session-type.is-network-unavailable { border-color: rgba(255, 181, 74, .2); } | |
| .uga-session-type.is-network-unavailable > div > small { color: var(--uga-amber); } | |
| .uga-hub-route-list { gap: 6px; margin-top: var(--uga-gap); } | |
| .uga-hub-route { grid-template-columns: 32px minmax(0, 1fr) 64px; gap: 7px; min-height: 54px; padding: 5px 7px; } | |
| .uga-hub-route:has(> button[data-hub-route="crew"]), | |
| .uga-hub-route:has(> button[data-hub-route="settings"]) { display: none; } | |
| .uga-hub-route-icon { width: 32px; height: 32px; border-color: var(--uga-line); background: rgba(12, 48, 62, .38); } | |
| .uga-hub-route-copy > div { align-items: center; flex-direction: row; gap: 5px; } | |
| .uga-hub-route-copy h3 { overflow: hidden; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } | |
| .uga-hub-route-copy > div > span { font-size: 7px; } | |
| .uga-hub-route-copy p, | |
| .uga-hub-route-copy small { display: none; } | |
| .uga-hub-route > button { min-width: 64px; min-height: var(--uga-touch); padding: 0 5px; font-size: 8px; } | |
| } | |
| /* Campaign Hub is the compact strategic home, not another ship-room view. | |
| Its single Depart action replaces the header close control, while the | |
| Play dock remains the persistent route back from the rest of UGA Command. */ | |
| .uga-command-shell[data-view="campaign_hub"] .uga-command-exit, | |
| .uga-command-shell[data-view="campaign_hub"] .uga-district-rail, | |
| .uga-command-shell[data-view="campaign_hub"] .uga-scene-overlay, | |
| .uga-command-shell[data-view="campaign_hub"] .uga-quick-actions, | |
| .uga-command-shell[data-view="campaign_hub"] .uga-sheet-toggle { display: none ; } | |
| .uga-command-shell[data-view="campaign_hub"] .uga-context-body { inset: 0; } | |
| .uga-basic-access-grid button::after, | |
| .uga-more-shortcuts button::after, | |
| .uga-command-nav button:not(.is-active)::after { display: none; } | |
| @media (max-width: 900px), (max-height: 620px) and (max-width: 1024px) { | |
| .uga-command-shell[data-view="campaign_hub"] .uga-command-header { padding-right: var(--uga-edge); } | |
| /* The hub takes the full frame in BOTH sheet states, and the toggle above is | |
| hidden, so the panel cannot be collapsed. That is deliberate: the hub view | |
| never mounts the scene - its canvas measures 0x0 - so collapsing would | |
| reveal an empty black viewport rather than NEXUS-VII. test-galactic- | |
| campaign-product-model.mjs holds this as "must use the available compact | |
| stage instead of leaving an empty ship viewport". Unseal this only in the | |
| change that makes the scene actually render here; doing it first is how you | |
| ship a hole. */ | |
| .uga-command-shell[data-view="campaign_hub"] .uga-context-panel, | |
| .uga-command-shell[data-view="campaign_hub"].is-sheet-expanded .uga-context-panel { | |
| top: var(--uga-gap); | |
| right: var(--uga-edge); | |
| bottom: var(--uga-gap); | |
| left: var(--uga-edge); | |
| width: auto; | |
| height: auto; | |
| border-radius: var(--uga-radius); | |
| } | |
| } | |
| /* Account ledger vs expedition materials. | |
| The first two rail entries are Cores and XP, read from the classic account | |
| record, and the rest are UGA expedition materials. Without a break the player | |
| sees nine equal numbers and cannot tell which ones the main menu also spends. | |
| A tint plus one divider after the group is enough; a second frame here would | |
| just be more of the ornament we removed elsewhere. */ | |
| .uga-resource.is-account b { color: #ffe0a3; } | |
| .uga-resource.is-account .uga-svg { color: var(--uga-amber, #ffb54a); } | |
| .uga-resource.is-account + .uga-resource:not(.is-account) { | |
| margin-left: 6px; | |
| border-left: 1px solid rgba(255, 181, 74, .32); | |
| padding-left: 10px; | |
| } | |
| /* Current objective — the hub's answer to "what do I do next". | |
| It sits above Depart because it is the instruction; Depart is one of the ways | |
| to carry it out. Amber marks it as the live directive, matching the primary | |
| action language used elsewhere, and it is the only emphasised block on the | |
| home so there is never a question about where to look first. */ | |
| .uga-objective { | |
| position: relative; | |
| margin-top: 10px; | |
| padding: 13px 15px; | |
| display: grid; | |
| gap: 7px; | |
| border: 1px solid rgba(255, 181, 74, .42); | |
| border-radius: 9px; | |
| background: linear-gradient(135deg, rgba(74, 46, 8, .5), rgba(6, 20, 30, .92)); | |
| } | |
| .uga-objective > header > small { color: var(--uga-amber, #ffb54a); font: 700 7px/1 Consolas, monospace; letter-spacing: .16em; } | |
| .uga-objective > header > h3 { margin: 4px 0 0; color: #fff3dc; font-size: 15px; line-height: 1.18; } | |
| .uga-objective > p { margin: 0; color: #b6c9d4; font-size: 10px; line-height: 1.45; } | |
| .uga-objective-progress { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; | |
| padding-top: 7px; border-top: 1px solid rgba(255, 181, 74, .2); } | |
| .uga-objective-progress span { color: #97b0bd; font: 700 7px/1 Consolas, monospace; letter-spacing: .14em; } | |
| .uga-objective-progress b { color: #ffe0a3; font-size: 12px; } | |
| .uga-objective .uga-primary-button { width: 100%; min-height: var(--uga-touch, 44px); margin-top: 2px; } | |
| /* A cleared frontier is information, not a command; drop the urgency. */ | |
| .uga-objective.is-scan { border-color: rgba(92, 196, 232, .38); background: linear-gradient(135deg, rgba(9, 48, 66, .5), rgba(6, 20, 30, .92)); } | |
| .uga-objective.is-scan > header > small { color: var(--uga-cyan, #42ddff); } | |
| /* Territory readout: two label/value pairs on one row. */ | |
| .uga-objective-progress { display: grid; grid-template-columns: auto 1fr auto 1fr; align-items: baseline; gap: 4px 8px; } | |
| .uga-objective-progress b:not(:last-child) { justify-self: start; } | |
| .uga-objective-progress b:last-child { justify-self: end; } | |
| /* COMMAND JOURNEY RAIL | |
| The hub used to show only the step the player was standing on, so the path | |
| ahead was invisible and the screen read as a dead end with one button. The | |
| rail shows all five, which is the same device the expedition directive | |
| already uses successfully - the player can see where COMMISSION leads before | |
| they commit to it. | |
| Steps stagger in off --uga-journey-index rather than a keyframe per child, so | |
| the count can change without touching this file. Only transform and opacity | |
| animate; both are compositor-only, which matters because a 3D renderer is | |
| running behind this panel. */ | |
| .uga-journey { display: flex; flex-direction: column; gap: 8px; margin: 0 0 10px; } | |
| .uga-journey-rail { | |
| display: flex; align-items: stretch; gap: 4px; | |
| margin: 0; padding: 0; list-style: none; | |
| } | |
| .uga-journey-step { | |
| flex: 1 1 0; min-width: 0; | |
| display: flex; flex-direction: column; align-items: center; gap: 2px; | |
| padding: 6px 2px 7px; border-radius: 7px; | |
| border: 1px solid var(--uga-line, rgba(120,170,200,.22)); | |
| background: rgba(9, 20, 30, .55); | |
| animation: ugaJourneyIn .32s cubic-bezier(.22,.61,.36,1) both; | |
| animation-delay: calc(var(--uga-journey-index, 0) * 45ms); | |
| transition: border-color .22s ease, background-color .22s ease, transform .22s ease; | |
| } | |
| .uga-journey-step > b { | |
| color: var(--uga-muted, #7f9cb0); font: 800 9px/1 Consolas, monospace; letter-spacing: .1em; | |
| transition: color .22s ease; | |
| } | |
| .uga-journey-step > span { | |
| color: var(--uga-muted, #7f9cb0); font: 700 6.5px/1.1 Consolas, monospace; letter-spacing: .09em; | |
| text-align: center; overflow-wrap: anywhere; | |
| transition: color .22s ease; | |
| } | |
| .uga-journey-step.is-done { border-color: rgba(96, 200, 140, .34); background: rgba(12, 30, 24, .5); } | |
| .uga-journey-step.is-done > b { color: var(--uga-green, #5fd39a); } | |
| .uga-journey-step.is-current { | |
| border-color: var(--uga-cyan, #4fd8ff); background: rgba(10, 38, 52, .72); | |
| transform: translateZ(0) scale(1.03); | |
| } | |
| .uga-journey-step.is-current > b, | |
| .uga-journey-step.is-current > span { color: #dff6ff; } | |
| /* Ahead is legible, not hidden. Greying it to invisibility would recreate the | |
| original problem of a player not knowing what comes next. */ | |
| .uga-journey-step.is-ahead { opacity: .5; } | |
| .uga-journey-keel { | |
| margin: 0; padding: 7px 9px; border-radius: 7px; | |
| border: 1px solid rgba(120, 170, 200, .18); | |
| border-left: 2px solid var(--uga-cyan, #4fd8ff); | |
| background: rgba(8, 18, 27, .6); | |
| color: #b6c9d4; font-size: 9.5px; line-height: 1.45; | |
| animation: ugaJourneyIn .34s cubic-bezier(.22,.61,.36,1) both; | |
| animation-delay: 250ms; | |
| } | |
| .uga-journey-keel > small { | |
| display: block; margin-bottom: 2px; | |
| color: var(--uga-cyan, #4fd8ff); font: 800 7px/1 Consolas, monospace; letter-spacing: .18em; | |
| } | |
| @keyframes ugaJourneyIn { | |
| from { opacity: 0; transform: translate3d(0, 6px, 0); } | |
| to { opacity: 1; transform: none; } | |
| } | |
| /* is-current keeps its scale when reduced motion removes the entrance, or the | |
| active step would visibly shrink for those users. */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .uga-journey-step, .uga-journey-keel { animation: none; } | |
| .uga-journey-step { transition: none; } | |
| } | |
| /* AUTHORED PLATE ON THE DIRECTIVE CARD | |
| The module drew every surface with CSS gradients while the main menu ran on | |
| the authored UI Production V3 pack, so the two halves of the game did not | |
| look like the same product. It was not a choice: the OTA inliner only | |
| resolved '../../assets/...', and this stylesheet sits four levels deep, so | |
| any authored reference here would have shipped as a corrupt data URL. | |
| bundle-update.mjs now resolves the module depth, so the pack is reachable. | |
| Slice comes from ASSET_MANIFEST.json, not from measuring the PNG: | |
| borders_logical [24,24,24,24] x (png_2x 768 / logical 384) = 48. The border | |
| box stays at the logical 24px so the plate's chamfers land at authored size | |
| rather than being stretched to whatever the card happens to be. */ | |
| .uga-objective { | |
| border: 24px solid transparent; | |
| border-image: url('../../../../assets/textures/ui/mf-ui-v3/panel_player_info.png') 48 fill / 24px / 0 stretch; | |
| background: none; | |
| padding: 2px 6px 10px; | |
| } | |
| /* The plate supplies the frame, so the amber rule that used to stand in for one | |
| would now read as a second border drawn over authored art. */ | |
| .uga-objective.is-commission, | |
| .uga-objective[data-objective] { box-shadow: none; } | |
| /* The home directive is an illustrated action card, not a second text panel | |
| beneath a decorative hero. Each scene depicts the actual next service. */ | |
| .uga-campaign-hub .uga-objective { gap: 9px; } | |
| .uga-objective-hero { | |
| position: relative; | |
| isolation: isolate; | |
| min-height: clamp(148px, 22vh, 190px); | |
| overflow: hidden; | |
| border: 1px solid rgba(142, 211, 239, .3); | |
| border-radius: 7px; | |
| background: #06111a; | |
| text-align: left; | |
| } | |
| .uga-objective-hero.is-embassy { --uga-objective-art: url('../../assets/runtime/ui/menu-art-v1/uga-coalition-embassy-v1.webp'); } | |
| .uga-objective-hero.is-survey { --uga-objective-art: url('../../assets/runtime/ui/menu-art-v1/uga-survey-lab-v1.webp'); } | |
| .uga-objective-hero.is-hangar { --uga-objective-art: url('../../assets/runtime/ui/menu-art-v1/uga-strike-hangar-v1.webp'); } | |
| .uga-objective-hero.is-navigation { --uga-objective-art: url('../../assets/runtime/ui/menu-art-v1/uga-navigation-bridge-v1.webp'); } | |
| .uga-objective-art { | |
| position: absolute; | |
| inset: 0; | |
| display: block; | |
| background: #06111a var(--uga-objective-art) center / cover no-repeat; | |
| } | |
| .uga-objective-hero::after { | |
| content: ''; | |
| position: absolute; | |
| inset: 0; | |
| z-index: 1; | |
| pointer-events: none; | |
| background: linear-gradient(0deg, rgba(2, 8, 14, .96), rgba(2, 8, 14, .55) 42%, transparent 85%); | |
| } | |
| .uga-objective-hero-copy { | |
| position: absolute; | |
| z-index: 2; | |
| right: 12px; | |
| bottom: 12px; | |
| left: 12px; | |
| min-width: 0; | |
| text-shadow: 0 2px 8px #02070c; | |
| } | |
| .uga-objective-hero-copy small { color: #ffcb7c; font: 800 9px/1.15 Consolas, monospace; letter-spacing: .1em; } | |
| .uga-objective-hero-copy h3 { margin: 5px 0 0; color: #fff8eb; font-size: clamp(17px, 4.5vw, 22px); line-height: 1.16; overflow-wrap: anywhere; } | |
| .uga-campaign-hub .uga-journey { margin: 0; } | |
| .uga-objective-brief { border-top: 1px solid rgba(137, 186, 205, .24); color: #b6c9d4; text-align: left; } | |
| .uga-objective-brief > summary { | |
| display: flex; | |
| align-items: center; | |
| min-height: 44px; | |
| list-style: none; | |
| color: #91c6d9; | |
| font: 800 9px/1 Consolas, monospace; | |
| letter-spacing: .1em; | |
| cursor: pointer; | |
| } | |
| .uga-objective-brief > summary::-webkit-details-marker { display: none; } | |
| .uga-objective-brief > summary::after { content: '+'; margin-left: auto; color: #ccecf7; font: 700 18px/1 system-ui; } | |
| .uga-objective-brief[open] > summary::after { content: '−'; } | |
| .uga-objective-brief > summary:focus-visible { outline: 2px solid var(--uga-cyan); outline-offset: -2px; } | |
| .uga-objective-brief > p { margin: 0 0 8px; font-size: 11px; line-height: 1.4; overflow-wrap: anywhere; } | |
| .uga-objective-brief > p > b { color: var(--uga-cyan); } | |
| @media (max-width: 380px) and (orientation: portrait) { | |
| .uga-objective-hero { min-height: 150px; } | |
| .uga-objective-hero-copy h3 { font-size: 17px; } | |
| } | |
| @media (orientation: landscape) and (max-height: 560px) { | |
| .uga-objective-hero { min-height: 112px; } | |
| } | |
| /* Command already shows the real cutaway above its inspector. A second tall | |
| picture and a grey 24px plate buried the next action below the phone fold. | |
| Keep the commissioned scene as a short place cue and let work lead. */ | |
| .uga-campaign-hub.is-room-embedded .uga-objective { | |
| margin-top: 0; | |
| padding: 6px; | |
| gap: 6px; | |
| border: 1px solid rgba(255, 181, 74, .45); | |
| border-image: none; | |
| background: linear-gradient(145deg, rgba(8, 29, 42, .96), rgba(3, 13, 22, .96)); | |
| } | |
| .uga-campaign-hub.is-room-embedded .uga-objective-hero { | |
| min-height: 82px; | |
| border-color: rgba(255, 181, 74, .34); | |
| } | |
| .uga-campaign-hub.is-room-embedded .uga-objective-hero-copy { right: 10px; bottom: 8px; left: 10px; } | |
| .uga-campaign-hub.is-room-embedded .uga-objective-hero-copy small { font-size: 10px; } | |
| .uga-campaign-hub.is-room-embedded .uga-objective-hero-copy h3 { font-size: 16px; line-height: 1.15; } | |
| .uga-campaign-hub.is-room-embedded .uga-objective .uga-primary-button { min-height: 44px; font-size: 12px; letter-spacing: .04em; } | |
| /* The selected ship tab and sheet handle already identify Command Core. On | |
| compact screens its duplicate inspector heading pushed the actual work out | |
| of sight; Room Systems below still carries the full hardware information. */ | |
| @media (max-width: 900px), (max-height: 620px) and (max-width: 1024px) { | |
| .uga-command-shell[data-stage="room"][data-district="command"] .uga-context-heading { display: none; } | |
| } | |
| @media (max-width: 1024px) and (max-height: 620px) and (orientation: landscape) { | |
| /* Clear the district rail at 102px while reclaiming enough inspector height | |
| for both the illustrated directive and its full-size action above dock. */ | |
| .uga-command-shell[data-stage="room"][data-district="command"].is-sheet-expanded .uga-context-panel { top: 102px; } | |
| .uga-command-shell[data-stage="room"][data-district="command"] .uga-campaign-hub.is-room-embedded .uga-objective { padding: 5px; gap: 5px; } | |
| .uga-command-shell[data-stage="room"][data-district="command"] .uga-campaign-hub.is-room-embedded .uga-objective-hero { min-height: 60px; } | |
| .uga-command-shell[data-stage="room"][data-district="command"] .uga-campaign-hub.is-room-embedded .uga-objective-hero-copy { bottom: 6px; } | |
| .uga-command-shell[data-stage="room"][data-district="command"] .uga-campaign-hub.is-room-embedded .uga-objective-hero-copy h3 { margin-top: 3px; } | |
| } | |
| /* FOLDABLE CATEGORIES | |
| Header carries the affordance so the whole bar is the target - a 12px | |
| chevron is not a touch target, and the header already spans the panel. */ | |
| .uga-panel-section > header { cursor: pointer; position: relative; padding-right: 26px; user-select: none; } | |
| .uga-panel-section > header::after { | |
| content: ""; position: absolute; right: 9px; top: 50%; | |
| width: 7px; height: 7px; margin-top: -5px; | |
| border-right: 1.5px solid var(--uga-cyan, #4fd8ff); | |
| border-bottom: 1.5px solid var(--uga-cyan, #4fd8ff); | |
| transform: rotate(45deg); | |
| transition: transform .2s ease; | |
| } | |
| .uga-panel-section.is-collapsed > header::after { transform: rotate(-45deg); margin-top: -2px; } | |
| .uga-panel-section.is-collapsed > *:not(header) { display: none; } | |
| /* A folded section still reports what it is hiding, so folding does not mean | |
| forgetting. */ | |
| .uga-panel-section.is-collapsed > header { opacity: .72; } | |
| .uga-panel-section > header:focus-visible { outline: 2px solid var(--uga-cyan, #4fd8ff); outline-offset: 2px; } | |
| .uga-service-shelf { | |
| --uga-service-art: url('../../assets/runtime/ui/menu-art-v1/operations-war-table-v1.webp'); | |
| } | |
| .uga-service-shelf[data-service-group="massfront"] { --uga-service-art: url('../../assets/runtime/ui/menu-art-v1/arsenal-fabrication-bay-v1.webp'); } | |
| .uga-service-shelf[data-service-group="account"] { --uga-service-art: url('../../assets/runtime/ui/menu-art-v1/career-service-record-v1.webp'); } | |
| .uga-service-shelf > header { | |
| min-height: 62px; | |
| align-items: flex-end; | |
| padding: 12px 32px 12px 14px; | |
| border: 1px solid rgba(66, 221, 255, .2); | |
| border-radius: 7px; | |
| background-image: linear-gradient(90deg, rgba(2, 10, 17, .92), rgba(2, 10, 17, .54) 56%, rgba(2, 10, 17, .76)), var(--uga-service-art); | |
| background-position: center; | |
| background-size: cover; | |
| box-shadow: inset 0 1px rgba(255, 255, 255, .05); | |
| } | |
| .uga-service-shelf.is-collapsed > header { min-height: 78px; opacity: 1; } | |
| .uga-service-shelf > header > span { color: #e6f7fc; text-shadow: 0 2px 8px #000; } | |
| .uga-service-shelf > header > small { color: var(--uga-amber); text-shadow: 0 2px 8px #000; } | |
| @media (prefers-reduced-motion: reduce) { | |
| .uga-panel-section > header::after { transition: none; } | |
| } | |
| /* The generic player-info plate made every UGA card a grey image box. Use the | |
| ship's own navy glass, cyan divisions and amber next-action edge instead. */ | |
| .uga-basic-access, | |
| .uga-command-front { | |
| border: 1px solid rgba(92, 196, 232, .3); | |
| border-left: 3px solid var(--uga-amber); | |
| border-image: none; | |
| border-radius: 7px; | |
| background: linear-gradient(110deg, rgba(7, 33, 48, .94), rgba(3, 15, 25, .88)); | |
| padding: 10px; | |
| } | |
| .uga-panel-section { | |
| border: 0; | |
| border-top: 1px solid rgba(92, 196, 232, .25); | |
| border-image: none; | |
| background: transparent; | |
| padding: 6px 0 0; | |
| } | |
| .uga-basic-access > header, | |
| .uga-panel-section > header { border-bottom: 1px solid rgba(92, 196, 232, .16); } | |
| .uga-basic-access { margin-top: 10px; } | |
| /* The hub's own top-level blocks fold too, not just district sections. */ | |
| .uga-basic-access > header { cursor: pointer; position: relative; padding-right: 26px; user-select: none; } | |
| .uga-basic-access > header::after { | |
| content: ""; position: absolute; right: 9px; top: 50%; | |
| width: 7px; height: 7px; margin-top: -5px; | |
| border-right: 1.5px solid var(--uga-cyan, #4fd8ff); | |
| border-bottom: 1.5px solid var(--uga-cyan, #4fd8ff); | |
| transform: rotate(45deg); transition: transform .2s ease; | |
| } | |
| .uga-basic-access.is-collapsed > header::after { transform: rotate(-45deg); margin-top: -2px; } | |
| .uga-basic-access.is-collapsed > *:not(header) { display: none; } | |
| @media (prefers-reduced-motion: reduce) { .uga-basic-access > header::after { transition: none; } } | |
| /* THE AMBER SIGNAL | |
| One shared class for the two things a commander must not miss: the single | |
| action that advances the journey, and the construction job whose completion | |
| is the next unlock. It is a slow pulse rather than a fast one because this | |
| is a strategic screen - a blink at UI speed reads as an error state, and | |
| everything it lands on is already a legitimate control the player can take | |
| their time over. | |
| Scope is the whole point. The moment a third and fourth surface wear this, | |
| it stops meaning "here" and becomes decoration, so the rule is: exactly one | |
| action-level attention at a time plus any genuinely active job. Reduced | |
| motion keeps the amber ring and drops only the movement - the signal is | |
| information, not an effect, so it must survive the preference. */ | |
| .uga-attention { | |
| position: relative; | |
| animation: ugaAttention 2600ms ease-in-out infinite; | |
| } | |
| @keyframes ugaAttention { | |
| 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 181, 74, 0); } | |
| 50% { box-shadow: 0 0 0 3px rgba(255, 181, 74, .34), 0 0 20px rgba(255, 181, 74, .26); } | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| .uga-attention { animation: none; box-shadow: 0 0 0 2px rgba(255, 181, 74, .44); } | |
| } | |
| /* FULL STAGE FOR THE VIEWS THAT ARE NOT A PLACE. | |
| The campaign_hub rules above do this for the strategic home by naming that | |
| one view. data-stage says the same thing about a category instead, so | |
| Services, Progress, Inventory and the debrief stop reserving a room | |
| viewport they never fill - and the next directory view inherits it rather | |
| than shipping with a black band nobody notices until a screenshot. The exit | |
| control stays: unlike the hub, these are places you have navigated into. */ | |
| .uga-command-shell[data-stage="full"] .uga-district-rail, | |
| .uga-command-shell[data-stage="full"] .uga-scene-overlay, | |
| .uga-command-shell[data-stage="full"] .uga-quick-actions, | |
| .uga-command-shell[data-stage="full"] .uga-sheet-toggle { display: none ; } | |
| .uga-command-shell[data-stage="full"] .uga-context-body { inset: 0; } | |
| .uga-command-shell[data-stage="full"] .uga-context-panel, | |
| .uga-command-shell[data-stage="full"].is-sheet-expanded .uga-context-panel { | |
| top: var(--uga-gap); | |
| height: auto; | |
| } | |
| /* Full-frame directories no longer reveal the orbital renderer around their | |
| panels. They sit inside NEXUS-VII, while room stages retain the live 3D | |
| compartment and its new inspection-bay enclosure. */ | |
| .uga-command-shell[data-stage="full"] { | |
| background: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .32) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-command-concourse-v1.webp') center / cover no-repeat; | |
| } | |
| .uga-command-shell[data-view="campaign_hub"] { | |
| background: | |
| linear-gradient(90deg, rgba(2, 10, 17, .9), rgba(2, 10, 17, .28) 46%, rgba(2, 10, 17, .8)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-navigation-bridge-v1.webp') center / cover no-repeat; | |
| } | |
| .uga-command-shell[data-view="progress"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-navigation-bridge-v1.webp'); | |
| } | |
| .uga-command-shell[data-view="services"], | |
| .uga-command-shell[data-view="return-services"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-command-concourse-v1.webp'); | |
| } | |
| .uga-command-shell[data-view="inventory"], | |
| .uga-command-shell[data-view="logistics"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-logistics-cargo-v1.webp'); | |
| } | |
| .uga-command-shell[data-view="crew"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-habitat-medical-v1.webp'); | |
| } | |
| .uga-command-shell[data-view="factions"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-coalition-embassy-v1.webp'); | |
| } | |
| .uga-command-shell[data-view="research"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/research-directorate-v1.webp'); | |
| } | |
| .uga-command-shell[data-view="intel"] { | |
| background-image: | |
| linear-gradient(90deg, rgba(2, 10, 17, .88), rgba(2, 10, 17, .3) 42%, rgba(2, 10, 17, .76)), | |
| url('../../assets/runtime/ui/menu-art-v1/uga-survey-lab-v1.webp'); | |
| } | |
| /* AUDIT FLOOR | |
| Measured on 2026-09-11 across eleven compartments and five menus at 412x900 | |
| and 915x412: 66 controls under the 44px minimum and 183 text runs under the | |
| WCAG AA floor, the worst at 2.88:1 in 7px type. Both had a single cause - | |
| captions that became controls without being resized, and a 6-7px monospace | |
| scale inherited from a desktop mock. | |
| Only the tap floor is set globally, because that one is unconditional: a | |
| thing you press is at least 44px regardless of what it says. The type fixes | |
| above are deliberately per-rule instead - a blanket minimum font-size would | |
| reflow components this audit never measured, and guessing at a hundred | |
| surfaces is how you trade a contrast problem for a layout one. The rest of | |
| the 6-7px scale is logged in the audit and gets measured before it moves. */ | |
| .uga-panel-section > header, | |
| .uga-basic-access > header { min-height: 44px; } | |
| /* On phones the 28px watch buttons squeezed the current-system readout into | |
| ellipses. Give the controls their own row and keep pressure visible. */ | |
| @media (max-width: 480px) and (orientation: portrait) { | |
| .uga-command-front { | |
| grid-template-columns: 27px minmax(0, 1fr); | |
| grid-template-rows: auto auto auto; | |
| } | |
| .uga-command-front > span { grid-column: 1; grid-row: 1 / 3; } | |
| .uga-command-front > div:not(.uga-front-actions) { grid-column: 2; grid-row: 1; } | |
| .uga-command-front > div p { overflow: visible; text-overflow: clip; white-space: normal; line-height: 1.25; } | |
| .uga-command-front dl { grid-column: 2; grid-row: 2; } | |
| .uga-command-front > .uga-front-actions { | |
| grid-column: 1 / -1; | |
| grid-row: 3; | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| max-height: none; | |
| } | |
| .uga-front-actions button { min-width: 0; min-height: 44px; padding: 0 5px; font-size: 8px; } | |
| } | |
| @media (max-width: 340px) and (orientation: portrait) { | |
| .uga-command-front dl { display: none; } | |
| .uga-command-front > span { grid-row: 1; } | |
| .uga-command-front > .uga-front-actions { grid-row: 2; } | |
| } | |
| /* The inherited native button paint made these two controls flat grey blocks | |
| inside an authored NEXUS-VII plate. Color communicates action and state. */ | |
| .uga-command-shell .uga-front-actions button { | |
| min-height: 44px; | |
| border: 1px solid rgba(66, 221, 255, .42); | |
| border-radius: 6px; | |
| background: rgba(7, 39, 55, .9); | |
| color: #c8f1fb; | |
| font: 800 9px/1.15 "Segoe UI", sans-serif; | |
| letter-spacing: .04em; | |
| cursor: pointer; | |
| } | |
| .uga-command-shell .uga-front-actions button[data-front-watch] { | |
| border-color: rgba(255, 181, 74, .48); | |
| background: rgba(71, 42, 11, .82); | |
| color: #ffdfa6; | |
| } | |
| .uga-command-shell .uga-front-actions button:disabled { | |
| border-color: rgba(111, 145, 160, .22); | |
| background: rgba(8, 25, 34, .72); | |
| color: #7894a2; | |
| } | |
| /* A room opens on its actual work. Keep every crew, tier and socket control | |
| available behind one large, explicit systems hatch rather than eleven long | |
| inspectors that push the job below the phone fold. */ | |
| .uga-hardware-details { margin-top: 14px; border-top: 1px solid rgba(92, 196, 232, .27); } | |
| .uga-hardware-details > summary { | |
| min-height: 54px; | |
| padding: 6px 9px; | |
| display: grid; | |
| grid-template-columns: 22px minmax(0, 1fr) auto 14px; | |
| gap: 8px; | |
| align-items: center; | |
| color: #d8eef5; | |
| background: linear-gradient(90deg, rgba(10, 53, 72, .72), rgba(4, 23, 35, .76)); | |
| cursor: pointer; | |
| list-style: none; | |
| } | |
| .uga-hardware-details > summary::-webkit-details-marker { display: none; } | |
| .uga-hardware-details > summary .uga-svg:first-child { width: 19px; height: 19px; color: var(--uga-cyan); } | |
| .uga-hardware-details > summary span { font-size: 12px; font-weight: 800; letter-spacing: .06em; } | |
| .uga-hardware-details > summary small { color: #a5c6d3; font: 11px/1.2 Consolas, monospace; } | |
| .uga-hardware-details > summary .uga-svg:last-child { width: 13px; height: 13px; color: var(--uga-amber); transform: rotate(90deg); } | |
| .uga-hardware-details[open] > summary .uga-svg:last-child { transform: rotate(-90deg); } | |
| .uga-hardware-details > summary:focus-visible { outline: 2px solid var(--uga-cyan); outline-offset: -2px; } | |
| .uga-hardware-body { padding: 4px 2px 8px; background: rgba(3, 20, 31, .56); } | |
| .uga-hardware-body .uga-panel-section > header span { font-size: 11px; letter-spacing: .04em; } | |
| .uga-hardware-body .uga-feature span { font-size: 11px; line-height: 1.3; } | |
| .uga-hardware-body .uga-feature span b { font-size: 10px; line-height: 1.2; } | |
| .uga-hardware-body .uga-socket-copy small { font-size: 10px; line-height: 1.2; } | |
| .uga-hardware-body .uga-socket-copy b { overflow: visible; font-size: 12px; line-height: 1.2; text-overflow: clip; white-space: normal; } | |
| .uga-hardware-body .uga-socket-effects, | |
| .uga-hardware-body .uga-socket-effects b { font-size: 10px; line-height: 1.3; } | |
| .uga-hardware-body .uga-module-picker select { min-height: 44px; font-size: 12px; } | |
| .uga-command-shell[data-stage="room"] .uga-upgrade-block { display: grid; grid-template-columns: minmax(0, 1fr) minmax(120px, auto); align-items: center; gap: 8px; padding: 8px 10px; } | |
| .uga-command-shell[data-stage="room"] .uga-upgrade-block .uga-primary-button { grid-column: auto; min-height: 44px; margin: 0; } | |
| .uga-command-shell[data-stage="room"] .uga-context-heading h2, | |
| .uga-command-shell[data-stage="full"] .uga-section-title h2 { overflow: visible; line-height: 1.2; text-overflow: clip; white-space: normal; overflow-wrap: break-word; } | |
| /* Full-screen directories already have commissioned room art behind their | |
| panels. Repeating the same picture as an inline card is decorative scroll. */ | |
| .uga-command-shell[data-stage="full"] .uga-command-visual { display: none; } | |
| /* Strike Bay opens with the actual battlefield and commander selectors. The | |
| 3D hangar stays visible above the bottom sheet, and all later loadout | |
| stations remain available by scrolling its field row. */ | |
| .uga-ground-route .uga-selected-map { display: block; margin: 1px 0 3px; color: #f9dba3; font-size: 12px; line-height: 1.25; white-space: normal; overflow-wrap: break-word; } | |
| @media (max-width: 760px) and (orientation: portrait) { | |
| .uga-command-shell.is-deployment-mode.is-loadout-expanded .uga-context-panel { height: min(58dvh, calc(100dvh - 125px)); } | |
| .uga-command-shell[data-district="hangar"].is-deployment-mode .uga-deployment-fields > header { display: none; } | |
| .uga-command-shell.is-deployment-mode .uga-ground-route { grid-template-columns: minmax(0, 1fr); gap: 5px; padding: 7px 9px; } | |
| .uga-command-shell.is-deployment-mode .uga-ground-route > div { display: flex; align-items: baseline; gap: 6px; } | |
| .uga-command-shell.is-deployment-mode .uga-ground-route > div strong { margin: 0; overflow: visible; text-overflow: clip; white-space: normal; } | |
| .uga-command-shell.is-deployment-mode .uga-ground-route > label > span { font-size: 10px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-identity { grid-template-columns: minmax(108px, .75fr) minmax(0, 1.25fr); gap: 7px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness { grid-template-columns: minmax(0, 1fr); gap: 5px; padding: 7px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness > span { grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 6px; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness small { color: #b6d9e4; font-size: 11px; line-height: 1.25; letter-spacing: 0; white-space: normal; overflow-wrap: break-word; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness b { font-size: 10px; white-space: nowrap; } | |
| .uga-command-shell.is-deployment-mode .uga-deployment-readiness .uga-primary-button { width: 100%; } | |
| .uga-hardware-details > summary { grid-template-columns: 22px minmax(0, 1fr) 14px; } | |
| .uga-hardware-details > summary small { display: none; } | |
| #moduleFrame[data-uga-visual-state="ready"] .uga-command-shell[data-stage="room"] .uga-command-visual { display: none; } | |
| .uga-command-shell[data-stage="room"] .uga-upgrade-block { grid-template-columns: minmax(0, 1fr); } | |
| .uga-hardware-body .uga-socket { grid-template-columns: 28px minmax(0, 1fr); gap: 5px 8px; padding: 7px 0; } | |
| .uga-hardware-body .uga-socket > :nth-child(n + 3) { grid-column: 2; } | |
| } | |
| /* The WebGL canvas is shared with orbit. Until the optional cutaway has | |
| actually loaded, its render() does not paint a frame, so the last planet | |
| frame otherwise remains visible behind transparent room chrome. Seal only | |
| place-based views with their authored interior; full directories have their | |
| own art, and the real pickable cutaway returns at the ready state. */ | |
| .uga-command-shell[data-stage="room"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-command-concourse-v1.webp'); } | |
| .uga-command-shell[data-district="navigation"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-navigation-bridge-v1.webp'); } | |
| .uga-command-shell[data-district="survey"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-survey-lab-v1.webp'); } | |
| .uga-command-shell[data-district="mission_ops"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/contracts-intel-table-v1.webp'); } | |
| .uga-command-shell[data-district="research"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/research-directorate-v1.webp'); } | |
| .uga-command-shell[data-district="fabricator"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/arsenal-fabrication-bay-v1.webp'); } | |
| .uga-command-shell[data-district="engineering"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-engineering-systems-v1.webp'); } | |
| .uga-command-shell[data-district="factions"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-coalition-embassy-v1.webp'); } | |
| .uga-command-shell[data-district="habitat"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-habitat-medical-v1.webp'); } | |
| .uga-command-shell[data-district="hangar"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-strike-hangar-v1.webp'); } | |
| .uga-command-shell[data-district="logistics"] { --uga-room-seal-art: url('../../assets/runtime/ui/menu-art-v1/uga-logistics-cargo-v1.webp'); } | |
| #moduleFrame[data-scene="uga"]:not([data-uga-visual-state="ready"]) .uga-command-shell[data-stage="room"] { | |
| background-color: #06131f; | |
| background-image: linear-gradient(90deg, rgba(2, 10, 17, .72), rgba(2, 10, 17, .25) 48%, rgba(2, 10, 17, .73)), var(--uga-room-seal-art); | |
| background-position: center; | |
| background-size: cover; | |
| background-repeat: no-repeat; | |
| } | |
| /* The room rail is a map of the explorer's interior, not three anonymous | |
| decks. On phones its old DOM order painted room buttons before their deck | |
| selector and stacked two telemetry bands over the same scene. */ | |
| .uga-ship-location { display: none; } | |
| .uga-deck-filter-bar .uga-filter-chip small { color: var(--uga-cyan); font: 800 9px/1 Consolas, monospace; } | |
| .uga-deck-filter-bar .uga-filter-chip span { min-width: 0; overflow-wrap: anywhere; } | |
| @media (max-width: 480px) and (orientation: portrait) { | |
| .uga-command-shell[data-stage="room"] { | |
| --uga-mobile-header: calc(102px + max(6px, env(safe-area-inset-top))); | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-command-header { | |
| height: var(--uga-mobile-header); | |
| min-height: var(--uga-mobile-header); | |
| grid-template-rows: 44px 40px; | |
| gap: 2px; | |
| padding-top: max(6px, env(safe-area-inset-top)); | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-command-identity span:not(.uga-command-crest) { | |
| display: block; | |
| margin-top: 3px; | |
| color: #9dcddd; | |
| font: 800 9px/1.1 Consolas, monospace; | |
| letter-spacing: .04em; | |
| white-space: nowrap; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-resource-ribbon { | |
| width: 100%; | |
| height: 40px; | |
| padding: 2px 0; | |
| border-top: 1px solid rgba(100, 198, 229, .3); | |
| border-bottom: 1px solid rgba(100, 198, 229, .3); | |
| border-radius: 0; | |
| background: rgba(3, 15, 24, .9); | |
| -webkit-mask-image: none; | |
| mask-image: none; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-resource-ribbon::after { display: none; } | |
| .uga-command-shell[data-stage="room"] .uga-resource { | |
| flex: 0 0 70px; | |
| min-width: 70px; | |
| height: 34px; | |
| padding: 3px 5px 2px 18px; | |
| border-left: 1px solid rgba(101, 180, 204, .15); | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-resource > span { left: 3px; top: 7px; } | |
| .uga-command-shell[data-stage="room"] .uga-resource b { font-size: 11px; line-height: 1; } | |
| .uga-command-shell[data-stage="room"] .uga-resource small { display: block; margin-top: 3px; font-size: 8px; line-height: 1; } | |
| .uga-command-shell[data-stage="room"] .uga-district-rail { | |
| top: 4px; | |
| left: var(--uga-edge); | |
| right: var(--uga-edge); | |
| height: 132px; | |
| display: block; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-rail-top { | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| display: grid; | |
| grid-template-columns: 44px minmax(0, 1fr) 93px; | |
| grid-template-rows: 34px 44px; | |
| gap: 4px; | |
| margin: 0; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-ship-location { | |
| grid-column: 1 / 3; | |
| grid-row: 1; | |
| min-width: 0; | |
| display: grid; | |
| align-content: center; | |
| padding: 3px 7px; | |
| border-left: 2px solid var(--uga-cyan); | |
| background: rgba(3, 17, 27, .92); | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-ship-location b { color: #e8f7fd; font-size: 10px; line-height: 1.1; letter-spacing: .04em; } | |
| .uga-command-shell[data-stage="room"] .uga-ship-location small { color: #93c4d8; font: 800 8px/1.1 Consolas, monospace; } | |
| .uga-command-shell[data-stage="room"] .uga-location-power { display: none; } | |
| .uga-command-shell[data-stage="room"] .uga-ship-telemetry-badge { | |
| grid-column: 3; | |
| grid-row: 1; | |
| width: auto; | |
| min-width: 0; | |
| height: 34px; | |
| padding: 3px 5px; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-telemetry-power small { display: flex; font-size: 8px; line-height: 1; } | |
| .uga-command-shell[data-stage="room"] .uga-telemetry-power small .uga-svg { width: 9px; height: 9px; } | |
| .uga-command-shell[data-stage="room"] .uga-telemetry-power b { font-size: 10px; line-height: 1.1; white-space: nowrap; } | |
| .uga-command-shell[data-stage="room"] .uga-overview-button { grid-column: 1; grid-row: 2; width: 44px; height: 44px; } | |
| .uga-command-shell[data-stage="room"] .uga-sector-filter-bar { | |
| grid-column: 2 / 4; | |
| grid-row: 2; | |
| width: auto; | |
| min-width: 0; | |
| min-height: 44px; | |
| gap: 3px; | |
| padding: 0; | |
| background: transparent; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-filter-chip { min-width: 0; min-height: 44px; padding: 3px 2px; gap: 3px; font-size: 9px; letter-spacing: 0; } | |
| .uga-command-shell[data-stage="room"] .uga-district-list { | |
| position: absolute; | |
| top: 82px; | |
| left: 0; | |
| right: 0; | |
| width: auto; | |
| height: 48px; | |
| padding: 2px 24px 2px 2px; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-district-scroll-cue { top: 82px; } | |
| } | |
| @media (max-width: 1024px) and (max-height: 620px) and (orientation: landscape) { | |
| .uga-command-shell[data-stage="room"] .uga-command-header { | |
| height: 88px; | |
| min-height: 88px; | |
| grid-template-columns: minmax(0, 1fr); | |
| grid-template-rows: 38px 36px; | |
| gap: 2px; | |
| padding: 4px 54px 4px 10px; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-command-identity span:not(.uga-command-crest) { | |
| display: block; | |
| margin-top: 2px; | |
| color: #9dcddd; | |
| font: 800 9px/1.1 Consolas, monospace; | |
| letter-spacing: .04em; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-resource-ribbon { | |
| width: 100%; | |
| height: 36px; | |
| padding: 2px 0; | |
| border-top: 1px solid rgba(100, 198, 229, .3); | |
| border-bottom: 1px solid rgba(100, 198, 229, .3); | |
| border-radius: 0; | |
| background: rgba(3, 15, 24, .9); | |
| -webkit-mask-image: none; | |
| mask-image: none; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-resource-ribbon::after { display: none; } | |
| .uga-command-shell[data-stage="room"] .uga-resource { height: 30px; min-width: 68px; padding-block: 2px; } | |
| .uga-command-shell[data-stage="room"] .uga-resource small { display: block; font-size: 8px; } | |
| .uga-command-shell[data-stage="room"] .uga-command-stage { inset: 88px 0 54px; } | |
| .uga-command-shell[data-stage="room"] .uga-district-rail { | |
| top: 4px; | |
| left: 10px; | |
| right: 10px; | |
| bottom: auto; | |
| width: auto; | |
| height: 100px; | |
| display: block; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-rail-top { | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| display: grid; | |
| grid-template-columns: 44px minmax(0, 1fr) 282px; | |
| grid-template-rows: 44px; | |
| align-items: stretch; | |
| gap: 5px; | |
| margin: 0; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-overview-button { grid-column: 1; grid-row: 1; width: 44px; height: 44px; } | |
| .uga-command-shell[data-stage="room"] .uga-ship-location { | |
| grid-column: 2; | |
| grid-row: 1; | |
| min-width: 0; | |
| display: grid; | |
| align-content: center; | |
| padding: 4px 10px; | |
| border-left: 2px solid var(--uga-cyan); | |
| background: rgba(3, 17, 27, .92); | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-ship-location b { color: #e8f7fd; font-size: 11px; line-height: 1.1; } | |
| .uga-command-shell[data-stage="room"] .uga-ship-location small { color: #93c4d8; font: 800 9px/1.15 Consolas, monospace; } | |
| .uga-command-shell[data-stage="room"] .uga-ship-telemetry-badge { display: none; } | |
| .uga-command-shell[data-stage="room"] .uga-sector-filter-bar { | |
| grid-column: 3; | |
| grid-row: 1; | |
| width: auto; | |
| min-width: 0; | |
| min-height: 44px; | |
| display: grid; | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| gap: 3px; | |
| padding: 0; | |
| background: transparent; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-filter-chip { min-width: 0; min-height: 44px; padding: 3px 2px; gap: 3px; font-size: 9px; letter-spacing: 0; } | |
| .uga-command-shell[data-stage="room"] .uga-district-list { | |
| position: absolute; | |
| top: 50px; | |
| left: 0; | |
| right: 0; | |
| width: auto; | |
| height: 48px; | |
| padding: 2px 24px 2px 2px; | |
| } | |
| .uga-command-shell[data-stage="room"] .uga-district-scroll-cue { top: 50px; } | |
| } | |