Private
Public Access
1
0
Files
star-wars-wild-space/public/style.css
2026-03-31 10:17:26 +02:00

1186 lines
24 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ── Reset & base ─────────────────────────────────────────────────────────── */
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, "Helvetica Neue", Arial,
"Noto Sans", "Apple Color Emoji", "Segoe UI Emoji";
color: #e9eef6;
/* background: radial-gradient(1200px 800px at 10% 10%, #16223a 0%, #0b1020 55%, #070a14 100%); */
background: black;
min-height: 100vh;
}
/* ── Auth overlay ─────────────────────────────────────────────────────────── */
.authOverlay {
position: fixed;
inset: 0;
z-index: 100;
background: rgba(5, 8, 18, 0.88);
backdrop-filter: blur(12px);
display: flex;
align-items: center;
justify-content: center;
}
.authOverlay.hidden {
display: none;
}
.authModal {
width: 360px;
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(15, 22, 42, 0.95);
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
overflow: hidden;
}
.authTabs {
display: grid;
grid-template-columns: 1fr 1fr;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.authTab {
padding: 14px;
border: none;
background: transparent;
color: rgba(233, 238, 246, 0.55);
font-size: 14px;
font-weight: 600;
cursor: pointer;
border-radius: 0;
transition: color 0.15s, background 0.15s;
}
.authTab:hover {
color: #e9eef6;
background: rgba(255, 255, 255, 0.04);
}
.authTab--active {
color: #e9eef6;
background: rgba(113, 199, 255, 0.1);
border-bottom: 2px solid rgba(113, 199, 255, 0.7);
}
.authForm {
padding: 20px 22px 24px;
display: flex;
flex-direction: column;
gap: 14px;
}
.authForm.hidden {
display: none;
}
.authField {
display: flex;
flex-direction: column;
gap: 5px;
}
.authField label {
font-size: 12px;
font-weight: 600;
opacity: 0.75;
}
.authHint {
font-weight: 400;
opacity: 0.55;
}
.authField input[type="text"],
.authField input[type="email"],
.authField input[type="password"] {
padding: 10px 12px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.06);
color: #e9eef6;
font-size: 14px;
outline: none;
transition: border-color 0.15s;
}
.authField input:focus {
border-color: rgba(113, 199, 255, 0.5);
}
.authTeamChoice {
display: flex;
gap: 10px;
}
.authTeamOption {
flex: 1;
cursor: pointer;
}
.authTeamOption input[type="radio"] {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.authTeamBadge {
display: block;
padding: 10px;
border-radius: 10px;
border: 2px solid rgba(255, 255, 255, 0.1);
text-align: center;
font-weight: 700;
font-size: 13px;
transition: border-color 0.15s, background 0.15s;
}
.authTeamBadge--blue {
color: rgba(90, 200, 255, 0.9);
}
.authTeamBadge--red {
color: rgba(220, 75, 85, 0.9);
}
.authTeamOption input:checked + .authTeamBadge--blue {
border-color: rgba(90, 200, 255, 0.8);
background: rgba(90, 200, 255, 0.12);
}
.authTeamOption input:checked + .authTeamBadge--red {
border-color: rgba(220, 75, 85, 0.8);
background: rgba(220, 75, 85, 0.12);
}
.authError {
font-size: 12px;
color: rgba(255, 130, 100, 0.95);
padding: 8px 10px;
border-radius: 8px;
background: rgba(200, 50, 30, 0.12);
border: 1px solid rgba(200, 50, 30, 0.25);
}
.authError.hidden {
display: none;
}
.authSubmit {
margin-top: 4px;
padding: 12px;
border-radius: 12px;
border: 1px solid rgba(113, 199, 255, 0.3);
background: rgba(113, 199, 255, 0.18);
color: #e9eef6;
font-size: 14px;
font-weight: 700;
cursor: pointer;
transition: background 0.15s;
}
.authSubmit:hover {
background: rgba(113, 199, 255, 0.28);
}
/* ── Team corner (admin only) ─────────────────────────────────────────────── */
.teamCorner {
position: fixed;
top: 12px;
left: 12px;
z-index: 10;
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(7, 10, 20, 0.85);
backdrop-filter: blur(8px);
}
.teamCornerLabel {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
opacity: 0.75;
}
.teamCorner--hidden {
display: none !important;
}
.teamSegmented {
min-width: 148px;
}
.teamSegmentedTrack {
position: relative;
display: grid;
grid-template-columns: 1fr 1fr;
border-radius: 12px;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.18);
background: rgba(0, 0, 0, 0.25);
}
.teamSegmentedTrack::before {
content: "";
position: absolute;
top: 2px;
bottom: 2px;
left: 2px;
width: calc(50% - 4px);
border-radius: 9px;
background: linear-gradient(180deg, rgba(90, 200, 255, 0.42), rgba(35, 95, 150, 0.55));
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12);
transition: left 0.22s ease, background 0.22s ease;
z-index: 0;
pointer-events: none;
}
.teamSegmentedTrack[data-active="red"]::before {
left: calc(50% + 2px);
background: linear-gradient(180deg, rgba(255, 130, 130, 0.42), rgba(150, 45, 45, 0.55));
}
.teamSegmentedBtn {
position: relative;
z-index: 1;
margin: 0;
padding: 9px 12px;
border: none;
background: transparent;
color: #e9eef6;
font-weight: 700;
font-size: 13px;
cursor: pointer;
}
.teamSegmentedBtn:hover {
color: #ffffff;
}
/* ── Score board ──────────────────────────────────────────────────────────── */
.scoreBoard {
display: flex;
flex-direction: row;
align-items: center;
gap: 8px;
padding: 10px 12px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.04);
font-family: "Courier New", Courier, monospace;
font-variant-numeric: tabular-nums;
}
.scoreBoardContent {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.scoreBoardRow {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.scoreBoardEcon {
display: flex;
flex-direction: column;
gap: 6px;
padding: 8px 0 0;
border-top: 1px solid rgba(255, 255, 255, 0.08);
margin-top: 8px;
}
.team-logo {
width: 54px;
height: 54px;
display: block;
flex-shrink: 0;
}
.scoreTeam {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
flex: 1;
}
.scoreTeam--blue {
align-items: center;
text-align: center;
}
.scoreTeam--red {
align-items: center;
text-align: center;
}
.scoreTeamName {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
opacity: 0.75;
}
.scoreTeam--blue .scoreTeamName { color: rgba(90, 200, 255, 0.9); }
.scoreTeam--red .scoreTeamName { color: rgba(220, 75, 85, 0.9); }
.scoreStats {
display: flex;
gap: 10px;
align-items: flex-end;
justify-content: center;
flex: 1;
width: 100%;
}
.scoreStat {
display: flex;
flex-direction: column;
align-items: center;
gap: 1px;
flex: 1;
}
.scoreStatVal {
font-size: 20px;
font-weight: 800;
line-height: 1;
}
.scoreStatLabel {
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.55;
}
.scoreTeam--blue .scoreValue {
color: rgba(90, 200, 255, 1);
text-shadow: 0 0 16px rgba(90, 200, 255, 0.4);
}
.scoreTeam--blue .scoreVP {
color: rgba(130, 230, 130, 1);
text-shadow: 0 0 16px rgba(90, 200, 130, 0.35);
}
.scoreTeam--red .scoreValue {
color: rgba(220, 75, 85, 1);
text-shadow: 0 0 16px rgba(220, 75, 85, 0.4);
}
.scoreTeam--red .scoreVP {
color: rgba(230, 150, 80, 1);
text-shadow: 0 0 16px rgba(220, 130, 60, 0.35);
}
.scoreSep {
opacity: 0.35;
font-size: 18px;
font-weight: 800;
flex-shrink: 0;
flex: 0 0 auto;
}
/* ── Main app layout ──────────────────────────────────────────────────────── */
.app {
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: center;
min-height: 100vh;
}
/* ── Left information column ──────────────────────────────────────────────── */
.infoColumn {
flex: 0 0 500px;
width: 500px;
display: flex;
flex-direction: column;
gap: 16px;
padding: 22px 18px 18px;
overflow-y: auto;
overflow-x: hidden;
background: rgba(7, 10, 20, 0.55);
border-right: 1px solid rgba(255, 255, 255, 0.07);
height: 100vh;
position: sticky;
top: 0;
}
/* Scrollbar styling for the info column */
.infoColumn::-webkit-scrollbar {
width: 5px;
}
.infoColumn::-webkit-scrollbar-track {
background: transparent;
}
.infoColumn::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.12);
border-radius: 4px;
}
/* Mobile close button — hidden on desktop */
.closeMenuBtn {
display: none;
align-self: flex-end;
padding: 6px 10px;
font-size: 16px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(255, 255, 255, 0.07);
color: #e9eef6;
border-radius: 8px;
cursor: pointer;
margin-bottom: 4px;
}
.infoSection--title .h1 {
font-size: 17px;
font-weight: 700;
letter-spacing: 0.2px;
}
.infoSection--title .sub {
font-size: 11px;
opacity: 0.65;
margin-top: 4px;
}
/* ── Info table (rows of key/value pairs) ─────────────────────────────────── */
.infoTable {
display: flex;
flex-direction: column;
gap: 4px;
font-family: "Courier New", Courier, monospace;
}
.infoRow {
display: flex;
align-items: baseline;
gap: 0;
min-height: 22px;
}
.infoKey {
flex: 0 0 55%;
font-size: 11px;
opacity: 0.65;
white-space: nowrap;
text-align: right;
padding-right: 8px;
overflow: hidden;
text-overflow: ellipsis;
}
.infoVal {
flex: 0 0 45%;
font-size: 11px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-family: "Courier New", Courier, monospace;
text-align: left;
}
.infoVal code {
font-size: 11px;
font-family: "Courier New", Courier, monospace;
padding: 2px 7px;
border-radius: 7px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
word-break: break-all;
white-space: normal;
}
/* Countdown row */
#countdownWrap {
opacity: 1;
}
.countdownLabel {
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: rgba(255, 193, 113, 0.9);
opacity: 1 !important;
}
.countdownVal {
font-size: 15px;
font-weight: 700;
color: rgba(255, 193, 113, 1);
display: flex;
align-items: baseline;
gap: 2px;
font-family: "Courier New", Courier, monospace;
}
/* When cooldown is available (not active) */
#countdownWrap.cooldown--available .countdownLabel {
color: inherit;
opacity: 0.65 !important;
font-weight: normal;
text-transform: none;
letter-spacing: normal;
}
#countdownWrap.cooldown--available .countdownVal {
color: inherit;
font-size: 11px;
font-weight: normal;
}
.countdown {
font-family: "Courier New", Courier, monospace;
font-variant-numeric: tabular-nums;
min-width: 2ch;
text-align: right;
}
.countdownUnit {
font-size: 12px;
opacity: 0.8;
}
/* User display */
#userDisplay {
font-weight: 600;
font-size: 12px;
font-family: "Courier New", Courier, monospace;
}
.logoutBtn {
margin-left: 8px;
padding: 3px 8px;
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(255, 255, 255, 0.07);
color: rgba(233, 238, 246, 0.75);
font-size: 11px;
cursor: pointer;
}
.logoutBtn:hover {
background: rgba(255, 255, 255, 0.12);
color: #e9eef6;
}
.logoutBtn.hidden {
display: none;
}
.muted {
opacity: 0.55;
}
/* ── Controls ──────────────────────────────────────────────────────────────── */
.controls {
display: flex;
align-items: center;
gap: 10px;
}
button {
padding: 9px 14px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(113, 199, 255, 0.16);
color: #e9eef6;
font-size: 13px;
cursor: pointer;
transition: background 0.15s;
}
button:hover {
background: rgba(113, 199, 255, 0.24);
}
/* ── Selection panel ─────────────────────────────────────────────────────── */
.panel {
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.09);
background: rgba(255, 255, 255, 0.03);
overflow: hidden;
flex-shrink: 0;
min-height: 80px;
}
.panelTitle {
padding: 10px 14px;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
opacity: 0.7;
border-bottom: 1px solid rgba(255, 255, 255, 0.07);
}
.details {
margin: 0;
padding: 12px 14px 14px;
font-size: 12px;
font-family: "Courier New", Courier, monospace;
line-height: 1.5;
white-space: pre-wrap;
word-break: break-word;
color: rgba(233, 238, 246, 0.92);
}
.details--hidden {
color: rgba(233, 238, 246, 0.4);
font-style: italic;
}
/* ── Collapsible panel variant ────────────────────────────────────────────── */
.panelCollapsible {
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.09);
background: rgba(255, 255, 255, 0.03);
overflow: hidden;
min-height: unset;
}
.panelTitleSummary {
padding: 10px 14px;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
opacity: 0.7;
cursor: pointer;
list-style: none;
user-select: none;
display: flex;
align-items: center;
gap: 6px;
border-bottom: 1px solid rgba(255, 255, 255, 0.07);
transition: opacity 0.15s;
}
.panelTitleSummary::after {
content: "";
margin-left: auto;
font-size: 18px;
font-weight: 400;
opacity: 0.45;
display: inline-block;
transform: rotate(0deg);
transition: transform 0.2s ease, opacity 0.15s;
flex-shrink: 0;
}
.panelCollapsible[open] .panelTitleSummary::after {
transform: rotate(90deg);
opacity: 0.7;
}
.panelTitleSummary::-webkit-details-marker {
display: none;
}
.panelCollapsible[open] .panelTitleSummary {
opacity: 0.9;
}
.panelTitleSummary:hover {
opacity: 1;
}
/* ── Team income summary ──────────────────────────────────────────────────── */
.econSummaryTeam {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
}
.econSummaryTeam--blue {
justify-content: flex-end;
}
.econSummaryTeam--red {
justify-content: flex-start;
}
.econSummaryTeam--blue .econSummaryLabel { color: rgba(90, 200, 255, 0.85); font-size: 12px; }
.econSummaryTeam--blue .econSummaryVal { color: rgba(90, 200, 255, 1); font-weight: 700; font-size: 12px; }
.econSummaryTeam--red .econSummaryLabel { color: rgba(220, 75, 85, 0.85); font-size: 12px; }
.econSummaryTeam--red .econSummaryVal { color: rgba(220, 75, 85, 1); font-weight: 700; font-size: 12px; }
.econSummaryTeam--center { justify-content: center; }
.econSummarySep {
opacity: 0.3;
flex: 0 0 auto;
margin: 0 6px;
}
/* ── Economic score (cumulative) ──────────────────────────────────────────── */
.econSummaryRow {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
gap: 0;
}
.econSummaryRow--score {
border-top: 1px solid rgba(255, 255, 255, 0.06);
padding-top: 6px;
margin-top: 4px;
}
.econScoreVal {
font-size: 13px;
font-weight: 800;
font-family: "Courier New", Courier, monospace;
font-variant-numeric: tabular-nums;
}
.econSummaryTeam--blue .econScoreVal { color: rgba(90, 200, 255, 1); }
.econSummaryTeam--red .econScoreVal { color: rgba(220, 75, 85, 1); }
/* Delta badge */
@keyframes econDeltaFade {
0% { opacity: 0; transform: translateY(2px); }
12% { opacity: 1; transform: translateY(-3px); }
70% { opacity: 1; transform: translateY(-3px); }
100% { opacity: 0; transform: translateY(-7px); }
}
.econDelta {
font-weight: 700;
font-size: 11px;
font-family: "Courier New", Courier, monospace;
color: rgba(90, 210, 130, 0.95);
opacity: 0;
min-width: 6ch;
display: inline-block;
text-align: center;
}
.econDelta--active {
animation: econDeltaFade 3s ease forwards;
}
/* ── Economy resource table ───────────────────────────────────────────────── */
.econTableWrap {
padding: 4px 8px 10px;
overflow-x: auto;
}
.econEmpty {
margin: 10px 14px;
font-size: 12px;
opacity: 0.5;
font-style: italic;
font-family: "Courier New", Courier, monospace;
}
.econTable {
width: 100%;
border-collapse: collapse;
font-size: 11px;
font-family: "Courier New", Courier, monospace;
}
.econTable thead th {
padding: 6px 8px;
text-align: left;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.55;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
white-space: nowrap;
}
.econTh {
cursor: pointer;
user-select: none;
transition: opacity 0.15s;
}
.econTh:hover {
opacity: 0.9;
}
.econTh--active {
opacity: 0.9;
color: rgba(113, 199, 255, 0.95);
}
.econSortIcon {
font-style: normal;
opacity: 0.55;
margin-left: 2px;
font-size: 9px;
}
.econTh--active .econSortIcon {
opacity: 1;
color: rgba(113, 199, 255, 1);
}
.econTable tbody tr:hover {
background: rgba(255, 255, 255, 0.04);
}
.econTable td {
padding: 4px 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
vertical-align: middle;
}
.econ-label {
color: rgba(233, 238, 246, 0.9);
white-space: nowrap;
}
.econ-cat {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
white-space: nowrap;
}
.econ-cat--commun {
color: rgba(170, 180, 200, 0.7);
}
.econ-cat--rare {
color: rgba(255, 210, 100, 0.85);
}
.econ-worth {
text-align: right;
color: rgba(113, 199, 255, 0.85);
font-weight: 600;
white-space: nowrap;
}
.econ-income {
text-align: right;
color: rgba(233, 238, 246, 0.4);
white-space: nowrap;
}
.econ-income--positive {
color: rgba(90, 210, 130, 0.95);
font-weight: 700;
}
/* ── Element bonus section ────────────────────────────────────────────────── */
.elemBonusTotals {
display: flex;
align-items: center;
justify-content: center;
gap: 0;
padding: 8px 12px 4px;
font-family: "Courier New", Courier, monospace;
font-size: 12px;
flex-wrap: wrap;
row-gap: 4px;
}
.elemBonusEffective {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
padding-top: 5px;
margin-top: 2px;
font-size: 11px;
font-family: "Courier New", Courier, monospace;
}
.elemBonusTeam {
display: flex;
align-items: center;
gap: 5px;
flex: 1;
}
.elemBonusTeam--blue {
justify-content: flex-end;
}
.elemBonusTeam--red {
justify-content: flex-start;
}
.elemBonusTeam--blue .elemBonusLabel { color: rgba(90, 200, 255, 0.75); font-size: 10px; }
.elemBonusTeam--blue .elemBonusVal { color: rgba(90, 200, 255, 1); font-weight: 800; font-size: 13px; }
.elemBonusTeam--red .elemBonusLabel { color: rgba(220, 75, 85, 0.75); font-size: 10px; }
.elemBonusTeam--red .elemBonusVal { color: rgba(220, 75, 85, 1); font-weight: 800; font-size: 13px; }
.elemBonusUnit {
font-size: 10px;
opacity: 0.6;
}
.elemBonusSep {
opacity: 0.3;
flex: 0 0 auto;
margin: 0 6px;
}
.elemBonusDetailLabel {
opacity: 0.55;
}
.elemBonusDetailVal {
font-weight: 700;
color: rgba(255, 220, 100, 0.9);
}
/* ── Options / admin section ──────────────────────────────────────────────── */
.infoSection--options {
padding-top: 8px;
}
.optionsDetails {
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.07);
overflow: hidden;
}
.optionsSummary {
padding: 8px 12px;
font-size: 11px;
font-weight: 600;
opacity: 0.6;
cursor: pointer;
list-style: none;
user-select: none;
display: flex;
align-items: center;
}
.optionsSummary::after {
content: "";
margin-left: auto;
font-size: 16px;
font-weight: 400;
opacity: 0.4;
display: inline-block;
transform: rotate(0deg);
transition: transform 0.2s ease, opacity 0.15s;
}
.optionsDetails[open] .optionsSummary::after {
transform: rotate(90deg);
opacity: 0.7;
}
.optionsSummary::-webkit-details-marker {
display: none;
}
.optionsSummary:hover {
opacity: 0.9;
}
.optionsPanel {
padding: 12px;
display: flex;
flex-direction: column;
gap: 10px;
border-top: 1px solid rgba(255, 255, 255, 0.07);
}
.optionsPanel .authField input[type="password"] {
padding: 8px 10px;
font-size: 12px;
font-family: "Courier New", Courier, monospace;
}
.adminUnlockBtn {
padding: 7px 12px;
font-size: 12px;
align-self: flex-start;
}
.adminStatus {
font-size: 11px;
padding: 6px 10px;
border-radius: 7px;
font-family: "Courier New", Courier, monospace;
}
.adminStatus.hidden {
display: none;
}
.adminStatus--ok {
color: rgba(90, 200, 130, 0.95);
background: rgba(30, 120, 60, 0.15);
border: 1px solid rgba(30, 150, 70, 0.25);
}
.adminStatus--err {
color: rgba(255, 130, 100, 0.95);
background: rgba(200, 50, 30, 0.12);
border: 1px solid rgba(200, 50, 30, 0.25);
}
/* ── Galaxy: square, fills viewport height, 1:1 ratio ────────────────────── */
.galaxyMain {
/* Fit the tallest square that fits in the viewport without overlapping the info column */
--map-size: min(100vh, calc(100vw - 340px));
position: relative;
width: var(--map-size);
height: var(--map-size);
flex-shrink: 0;
flex-grow: 0;
background: #050810;
overflow: hidden;
align-self: flex-start;
}
canvas {
display: block;
width: 100%;
height: 100%;
image-rendering: pixelated;
}
/* ── Burger button (hidden on desktop) ────────────────────────────────────── */
.burgerBtn {
display: none;
position: absolute;
top: 12px;
left: 12px;
z-index: 20;
width: 44px;
height: 44px;
padding: 0;
font-size: 22px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.18);
background: rgba(7, 10, 20, 0.82);
backdrop-filter: blur(8px);
color: #e9eef6;
align-items: center;
justify-content: center;
cursor: pointer;
}
.hint {
position: absolute;
left: 14px;
bottom: 14px;
padding: 10px 12px;
font-size: 12px;
font-family: "Courier New", Courier, monospace;
opacity: 0.8;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(7, 10, 20, 0.65);
backdrop-filter: blur(6px);
max-width: calc(100% - 28px);
pointer-events: none;
}
/* ── Mobile responsive (≤768px) ───────────────────────────────────────────── */
@media (max-width: 768px) {
.app {
flex-direction: column;
align-items: center;
min-height: 100dvh;
}
/* Hide the left column by default on mobile */
.infoColumn {
display: none;
position: fixed;
inset: 0;
z-index: 50;
width: 100%;
max-width: 420px;
height: 100dvh;
overflow-y: auto;
background: rgba(7, 10, 20, 0.97);
backdrop-filter: blur(16px);
border-right: none;
flex-shrink: 0;
}
/* Show the panel when open */
.infoColumn--open {
display: flex;
}
/* Show close button on mobile */
.closeMenuBtn {
display: flex;
}
/* Show burger button on mobile */
.burgerBtn {
display: flex;
}
/* Galaxy scales to viewport width (square) */
.galaxyMain {
--map-size: 100vw;
width: 100vw;
height: 100vw;
}
/* Scoreboard wraps nicely on narrow screens */
.scoreBoard {
flex-wrap: wrap;
}
.team-logo {
width: 40px;
height: 40px;
}
.scoreStatVal {
font-size: 16px;
}
}