Files
star-wars-wild-space/public/style.css
T
2026-04-02 22:09:27 +02:00

1400 lines
29 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 ─────────────────────────────────────────────────────────── */
.hidden { display: none !important; }
*,
*::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: flex;
align-items: center;
justify-content: space-between;
padding: 10px;
border-radius: 10px;
border: 2px solid rgba(255, 255, 255, 0.1);
font-weight: 700;
font-size: 13px;
transition: border-color 0.15s, background 0.15s;
}
.authTeamLogo {
width: 32px;
height: 32px;
flex-shrink: 0;
}
.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;
}
.authNotice {
margin: 0;
font-size: 11px;
color: rgba(255, 193, 113, 0.85);
text-align: center;
opacity: 0.8;
}
.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);
}
.authTeamCount {
display: block;
text-align: center;
font-size: 10px;
font-weight: 600;
margin-top: 4px;
opacity: 0.7;
}
.authTeamCount--blue { color: rgba(90, 200, 255, 0.9); }
.authTeamCount--red { color: rgba(220, 75, 85, 0.9); }
/* ── 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;
}
.teamLogoWrap {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
flex-shrink: 0;
}
.teamPlayerCount {
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
opacity: 0.75;
white-space: nowrap;
}
.teamPlayerCount--blue { color: rgba(90, 200, 255, 0.9); }
.teamPlayerCount--red { color: rgba(220, 75, 85, 0.9); }
.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(90, 200, 255, 1);
text-shadow: 0 0 16px rgba(90, 200, 255, 0.4);
}
.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(220, 75, 85, 1);
text-shadow: 0 0 16px rgba(220, 75, 85, 0.4);
}
.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: flex-start;
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;
}
.titleBanderol {
display: block;
max-height: 100px;
width: auto;
max-width: 100%;
object-fit: contain;
}
.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;
}
/* ── Resource section tabs ────────────────────────────────────────────────── */
.resTabs {
display: flex;
gap: 2px;
padding: 6px 8px 0;
}
.resTabBtn {
flex: 1;
padding: 4px 8px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 4px 4px 0 0;
color: rgba(233, 238, 246, 0.55);
font-family: "Courier New", Courier, monospace;
font-size: 11px;
font-weight: 600;
cursor: pointer;
letter-spacing: 0.03em;
transition: color 0.15s, background 0.15s, border-color 0.15s;
text-transform: uppercase;
}
.resTabBtn:hover {
color: rgba(233, 238, 246, 0.85);
background: rgba(255, 255, 255, 0.09);
}
.resTabBtn--active {
background: rgba(113, 199, 255, 0.12);
border-color: rgba(113, 199, 255, 0.35);
color: rgba(113, 199, 255, 0.95);
}
/* ── 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);
}
/* ── Military power section ───────────────────────────────────────────────── */
.milPowerTotals {
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;
}
.milPowerTeam {
display: flex;
align-items: center;
gap: 5px;
flex: 1;
}
.milPowerTeam--blue { justify-content: flex-end; }
.milPowerTeam--red { justify-content: flex-start; }
.milPowerTeam--blue .milPowerLabel { color: rgba(90, 200, 255, 0.75); font-size: 10px; }
.milPowerTeam--blue .milPowerVal { color: rgba(90, 200, 255, 1); font-weight: 800; font-size: 13px; }
.milPowerTeam--red .milPowerLabel { color: rgba(220, 75, 85, 0.75); font-size: 10px; }
.milPowerTeam--red .milPowerVal { color: rgba(220, 75, 85, 1); font-weight: 800; font-size: 13px; }
.milPowerUnit {
font-size: 10px;
opacity: 0.6;
}
.milPowerSep {
opacity: 0.3;
flex: 0 0 auto;
margin: 0 6px;
}
/* ── Rules / Credits content ──────────────────────────────────────────────── */
.rulesContent {
padding: 8px 12px 12px;
font-size: 12px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.78);
}
.rulesContent p {
margin: 0 0 10px;
}
.rulesContent ul {
margin: 4px 0 10px 16px;
padding: 0;
}
.rulesContent li {
margin-bottom: 4px;
}
.rulesContent a {
color: rgba(90, 200, 255, 0.9);
text-decoration: none;
}
.rulesContent a:hover {
text-decoration: underline;
}
/* ── Military attack modal ────────────────────────────────────────────────── */
.attackOverlay {
position: absolute;
inset: 0;
z-index: 20;
background: rgba(5, 8, 18, 0.72);
backdrop-filter: blur(6px);
display: flex;
align-items: center;
justify-content: center;
}
.attackOverlay.hidden {
display: none;
}
.attackModal {
width: 340px;
border-radius: 18px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(15, 22, 42, 0.97);
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.7);
padding: 28px 28px 24px;
text-align: center;
font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif;
}
.attackModal__icon {
font-size: 36px;
line-height: 1;
margin-bottom: 10px;
}
.attackModal__title {
font-size: 17px;
font-weight: 700;
letter-spacing: 0.04em;
color: #e9eef6;
margin-bottom: 14px;
}
.attackModal__body {
font-size: 13px;
color: rgba(233, 238, 246, 0.8);
line-height: 1.6;
white-space: pre-line;
margin-bottom: 22px;
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 10px;
background: rgba(255, 255, 255, 0.03);
padding: 12px 14px;
text-align: left;
}
.attackModal__actions {
display: flex;
gap: 10px;
justify-content: center;
}
.attackModal__btn {
flex: 1;
padding: 9px 0;
border-radius: 10px;
border: none;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: filter 0.15s;
}
.attackModal__btn--cancel {
background: rgba(255, 255, 255, 0.08);
color: rgba(233, 238, 246, 0.75);
}
.attackModal__btn--cancel:hover {
filter: brightness(1.3);
}
.attackModal__btn--confirm {
background: rgba(220, 75, 85, 0.85);
color: #fff;
}
.attackModal__btn--confirm:hover {
filter: brightness(1.2);
}
/* ── Galaxy: fills remaining viewport space, map maintains 1:1 tile ratio via JS ── */
.galaxyMain {
position: relative;
flex: 1 1 0;
min-width: 0;
height: 100vh;
background: #050810;
overflow: hidden;
}
canvas {
display: block;
width: 100%;
height: 100%;
image-rendering: pixelated;
touch-action: none; /* prevent browser pinch-zoom on canvas */
}
/* ── 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 fills the full screen on mobile */
.galaxyMain {
width: 100%;
height: 100dvh;
}
/* Scoreboard wraps nicely on narrow screens */
.scoreBoard {
flex-wrap: wrap;
}
.team-logo {
width: 40px;
height: 40px;
}
.scoreStatVal {
font-size: 16px;
}
}
/* ── Captor info banner ────────────────────────────────────────────────────── */
.captorInfo {
padding: 6px 14px 10px;
font-family: "Courier New", Courier, monospace;
font-size: 11px;
opacity: 0.85;
}
.captorInfo.hidden {
display: none;
}
.captorInfo--blue {
color: rgba(90, 200, 255, 0.9);
}
.captorInfo--red {
color: rgba(220, 75, 85, 0.9);
}
/* ── Players list panel ───────────────────────────────────────────────────── */
.playerListPanel {
padding: 10px 10px 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
.playerListFilter {
display: flex;
gap: 6px;
align-items: center;
}
.playerListSearchInput {
flex: 1;
padding: 6px 10px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.06);
color: #e9eef6;
font-size: 12px;
outline: none;
font-family: "Courier New", Courier, monospace;
transition: border-color 0.15s;
}
.playerListSearchInput:focus {
border-color: rgba(113, 199, 255, 0.5);
}
.playerListSearchInput::placeholder {
color: rgba(233, 238, 246, 0.35);
}
.playerListSortBtn {
padding: 5px 10px;
font-size: 11px;
font-weight: 700;
font-family: "Courier New", Courier, monospace;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(255, 255, 255, 0.07);
color: rgba(233, 238, 246, 0.75);
cursor: pointer;
white-space: nowrap;
transition: background 0.15s;
}
.playerListSortBtn:hover {
background: rgba(255, 255, 255, 0.13);
color: #e9eef6;
}
.playerListTableWrap {
overflow-x: auto;
}
.playerListTable {
width: 100%;
border-collapse: collapse;
font-size: 11px;
font-family: "Courier New", Courier, monospace;
}
.playerListTable thead th {
padding: 5px 8px;
text-align: left;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.playerListTable thead th.playerListTh--blue {
color: rgba(90, 200, 255, 0.85);
}
.playerListTable thead th.playerListTh--red {
color: rgba(220, 75, 85, 0.85);
}
.playerListTable tbody tr:hover {
background: rgba(255, 255, 255, 0.04);
}
.playerListTable td {
padding: 3px 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
vertical-align: top;
}
.playerListCell--blue {
color: rgba(90, 200, 255, 0.9);
}
.playerListCell--red {
color: rgba(220, 75, 85, 0.9);
}
/* ── Map action animation ─────────────────────────────────────────────────── */
.mapAnimFloat {
position: absolute;
line-height: 1;
pointer-events: none;
z-index: 20;
user-select: none;
white-space: nowrap;
}