rts-commander / static /styles.css
Luigi's picture
fix(ui): prevent camera controls overlap with topbar
66bb04b
raw
history blame
32.4 kB
/* Production source indicator */
#production-source {
display: flex;
align-items: center;
gap: var(--space-sm);
margin: var(--space-sm) 0 var(--space-md);
padding: var(--space-sm);
background: var(--bg-tertiary);
border-radius: var(--radius-md);
border: 1px solid var(--border-light);
font-size: 0.875rem;
}
#production-source .label {
opacity: 0.8;
color: var(--text-secondary);
}
#production-source-name {
font-weight: 600;
color: var(--primary);
}
#production-source-clear {
border: none;
background: transparent;
cursor: pointer;
padding: var(--space-xs);
border-radius: var(--radius-sm);
transition: all var(--transition-fast);
color: var(--text-muted);
}
#production-source-clear:hover {
background: var(--bg-hover);
color: var(--danger);
}
/* Modern Loading Screen */
#loading-screen {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--bg-primary);
display: flex;
justify-content: center;
align-items: center;
z-index: var(--z-modal);
transition: opacity var(--transition-slow);
}
#loading-screen.hidden {
opacity: 0;
pointer-events: none;
}
.loading-content {
text-align: center;
max-width: 400px;
padding: var(--space-2xl);
}
.loading-content h2 {
font-size: 2rem;
margin-bottom: var(--space-xl);
background: linear-gradient(135deg, var(--primary), var(--secondary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
font-weight: 700;
letter-spacing: -0.025em;
}
.loading-bar {
width: 100%;
height: 8px;
background: var(--bg-tertiary);
border-radius: var(--radius-md);
overflow: hidden;
margin: var(--space-xl) auto;
position: relative;
}
.loading-progress {
height: 100%;
background: linear-gradient(90deg, var(--primary), var(--secondary));
animation: loading 2s ease-in-out infinite;
width: 60%;
border-radius: var(--radius-md);
position: relative;
}
.loading-progress::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
animation: shimmer 1.5s infinite;
}
@keyframes loading {
0% { transform: translateX(-100%); }
100% { transform: translateX(200%); }
}
.loading-content p {
color: var(--text-secondary);
margin-top: var(--space-md);
font-size: 0.9rem;
}
/* Game Over Overlay */
#game-over-overlay {
position: fixed;
inset: 0;
background: rgba(15, 23, 42, 0.9);
display: flex;
align-items: center;
justify-content: center;
z-index: var(--z-modal);
backdrop-filter: blur(10px);
transition: opacity var(--transition-slow);
}
#game-over-overlay.hidden {
display: none;
}
.game-over-content {
background: var(--bg-secondary);
color: var(--text-primary);
padding: var(--space-2xl);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-xl);
min-width: 400px;
text-align: center;
border: 1px solid var(--border-light);
animation: gameOverSlideIn 0.5s ease;
}
@keyframes gameOverSlideIn {
from {
transform: translateY(-50px) scale(0.9);
opacity: 0;
}
to {
transform: translateY(0) scale(1);
opacity: 1;
}
}
.game-over-content h2 {
margin: 0 0 var(--space-lg);
font-size: 1.5rem;
font-weight: 700;
color: var(--primary);
}
.game-over-actions {
display: flex;
gap: var(--space-md);
justify-content: center;
margin-top: var(--space-lg);
}
.game-over-actions button {
background: linear-gradient(135deg, var(--primary), var(--primary-dark));
color: var(--text-primary);
border: none;
border-radius: var(--radius-lg);
padding: var(--space-md) var(--space-xl);
cursor: pointer;
font-weight: 600;
transition: all var(--transition-fast);
font-size: 1rem;
}
.game-over-actions button:hover {
background: linear-gradient(135deg, var(--primary-light), var(--primary));
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.game-over-actions button:active {
transform: translateY(0);
}
/* Modern RTS Game Styles */
:root {
/* Modern Color Palette */
--primary: #3B82F6;
--primary-dark: #2563EB;
--primary-light: #60A5FA;
--secondary: #10B981;
--secondary-dark: #059669;
--accent: #F59E0B;
--accent-dark: #D97706;
--danger: #EF4444;
--danger-dark: #DC2626;
--warning: #F59E0B;
--success: #10B981;
--info: #06B6D4;
/* Dark Theme Colors */
--bg-primary: #0F172A;
--bg-secondary: #1E293B;
--bg-tertiary: #334155;
--bg-card: #1E293B;
--bg-hover: #334155;
--bg-active: #475569;
/* Text Colors */
--text-primary: #F8FAFC;
--text-secondary: #CBD5E1;
--text-muted: #94A3B8;
--text-inverse: #0F172A;
/* Border Colors */
--border-light: #334155;
--border-medium: #475569;
--border-dark: #64748B;
/* Spacing Scale */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2rem;
--space-2xl: 3rem;
/* Border Radius */
--radius-sm: 0.375rem;
--radius-md: 0.5rem;
--radius-lg: 0.75rem;
--radius-xl: 1rem;
/* Shadows */
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
--shadow-glow: 0 0 20px rgba(0, 130, 246, 0.5);
/* Transitions */
--transition-fast: 150ms ease;
--transition-normal: 250ms ease;
--transition-slow: 350ms ease;
/* Z-Index Scale */
--z-dropdown: 1000;
--z-sticky: 1020;
--z-fixed: 1030;
--z-modal-backdrop: 1040;
--z-modal: 1050;
--z-popover: 1060;
--z-tooltip: 1070;
--z-toast: 1080;
}
/* Legacy Variables (for compatibility) */
:root {
--primary-color: var(--primary);
--secondary-color: var(--secondary);
--success-color: var(--success);
--warning-color: var(--warning);
--dark-bg: var(--bg-primary);
--dark-panel: var(--bg-secondary);
--light-text: var(--text-primary);
--border-color: var(--border-light);
--hover-color: var(--bg-hover);
}
/* Fix for iframe embedding (HF Spaces) */
html, body {
height: 100vh;
width: 100vw;
overflow: hidden;
}
#app {
min-height: 100vh;
min-width: 100vw;
}
/* Ensure desktop layout works in iframe */
@media screen and (min-width: 1200px) {
#game-container {
min-height: calc(100vh - 80px); /* Subtract topbar height */
}
#canvas-container {
min-width: 600px; /* Ensure minimum playable area */
}
}
/* Prevent iframe scrolling issues */
body {
overflow: hidden;
position: fixed;
width: 100%;
height: 100%;
}
/* Additional iframe fixes for HF Spaces */
.space-iframe {
width: 100% !important;
height: 100vh !important;
border: none !important;
}
/* Force desktop layout in iframe environments */
.iframe-env #left-sidebar,
.iframe-env #right-sidebar {
width: 320px !important;
min-width: 320px !important;
}
.iframe-env #canvas-container {
min-width: calc(100vw - 640px) !important; /* 320px * 2 sidebars */
}
/* Detect iframe environment via JavaScript */
@media screen {
#app {
display: flex;
flex-direction: column;
height: 100vh;
width: 100vw;
}
}
/* Modern Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
overflow: hidden;
user-select: none;
line-height: 1.6;
font-size: 14px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
#app {
display: flex;
flex-direction: column;
height: 100vh;
width: 100vw;
}
/* Modern Scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--bg-secondary);
}
::-webkit-scrollbar-thumb {
background: var(--border-medium);
border-radius: var(--radius-md);
transition: background var(--transition-fast);
}
::-webkit-scrollbar-thumb:hover {
background: var(--border-dark);
}
/* Focus Styles */
*:focus {
outline: 2px solid var(--primary);
outline-offset: 2px;
}
*:focus:not(:focus-visible) {
outline: none;
}
/* Selection Styles */
::selection {
background: var(--primary);
color: var(--text-inverse);
}
/* Top Bar */
#topbar {
background: var(--bg-secondary);
padding: var(--space-md) var(--space-lg);
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--border-light);
box-shadow: var(--shadow-md);
z-index: var(--z-fixed); /* Ensure topbar stays above camera controls */
backdrop-filter: blur(10px);
background: rgba(30, 41, 59, 0.8);
}
.topbar-left {
display: flex;
align-items: center;
gap: var(--space-xl);
}
.topbar-left h1 {
font-size: 1.5rem;
font-weight: 700;
background: linear-gradient(135deg, var(--primary), var(--secondary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: -0.025em;
}
#game-info {
display: flex;
gap: var(--space-md);
}
.info-badge {
background: var(--bg-tertiary);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-lg);
font-size: 0.875rem;
border: 1px solid var(--border-light);
font-weight: 500;
transition: all var(--transition-fast);
}
.info-badge:hover {
background: var(--bg-hover);
border-color: var(--primary);
transform: translateY(-1px);
}
.topbar-right {
display: flex;
align-items: center;
gap: var(--space-xl);
}
.resource-display {
display: flex;
gap: var(--space-md);
}
.resource-item {
display: flex;
align-items: center;
gap: var(--space-sm);
background: var(--bg-tertiary);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-lg);
font-weight: 600;
border: 1px solid var(--border-light);
transition: all var(--transition-fast);
}
.resource-item:hover {
background: var(--bg-hover);
border-color: var(--success);
transform: translateY(-1px);
}
.resource-icon {
font-size: 1.25rem;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2));
}
/* Modern Nuke Indicator */
#nuke-indicator {
background: var(--bg-tertiary);
border: 1px solid var(--border-light);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-lg);
min-width: 180px;
transition: all var(--transition-normal);
position: relative;
overflow: hidden;
}
#nuke-indicator::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, transparent, rgba(239, 68, 68, 0.1), transparent);
transform: translateX(-100%);
transition: transform 0.6s ease;
}
#nuke-indicator.ready::before {
transform: translateX(100%);
}
#nuke-indicator.ready {
background: var(--bg-tertiary);
border-color: var(--success);
animation: nukeReady 2s ease-in-out infinite;
box-shadow: 0 0 15px rgba(16, 185, 129, 0.3);
}
@keyframes nukeReady {
0%, 100% {
box-shadow: 0 0 10px rgba(16, 185, 129, 0.3);
border-color: var(--success);
}
50% {
box-shadow: 0 0 25px rgba(16, 185, 129, 0.6);
border-color: var(--secondary);
}
}
.nuke-status {
font-size: 0.75rem;
font-weight: 600;
margin-bottom: var(--space-xs);
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
#nuke-indicator.ready .nuke-status {
color: var(--success);
}
.nuke-charge-container {
width: 100%;
height: 6px;
background: var(--bg-primary);
border-radius: var(--radius-md);
overflow: hidden;
position: relative;
}
.nuke-charge-bar {
height: 100%;
width: 0%;
background: linear-gradient(90deg, var(--danger), var(--warning));
transition: width var(--transition-normal);
border-radius: var(--radius-md);
position: relative;
overflow: hidden;
}
.nuke-charge-bar::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
transform: translateX(-100%);
animation: shimmer 2s infinite;
}
@keyframes shimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
#nuke-indicator.ready .nuke-charge-bar {
background: linear-gradient(90deg, var(--success), var(--secondary));
}
/* Modern Sound Control */
.sound-control {
display: flex;
align-items: center;
}
.sound-btn {
background: var(--bg-tertiary);
border: 1px solid var(--border-light);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-lg);
cursor: pointer;
transition: all var(--transition-fast);
color: var(--text-primary);
font-size: 1.25rem;
display: flex;
align-items: center;
justify-content: center;
min-width: 44px;
min-height: 44px;
position: relative;
overflow: hidden;
}
.sound-btn::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
background: rgba(59, 130, 246, 0.2);
border-radius: 50%;
transform: translate(-50%, -50%);
transition: width var(--transition-normal), height var(--transition-normal);
}
.sound-btn:hover {
background: var(--bg-hover);
border-color: var(--primary);
transform: scale(1.05);
box-shadow: var(--shadow-md);
}
.sound-btn:hover::before {
width: 100%;
height: 100%;
}
.sound-btn:active {
transform: scale(0.95);
}
.sound-btn.muted {
opacity: 0.6;
border-color: var(--danger);
color: var(--text-muted);
}
.sound-btn.muted::after {
content: '🔇';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 1rem;
}
.sound-icon {
display: inline-block;
position: relative;
z-index: 1;
}
/* Modern Language Selector */
.language-selector {
display: flex;
align-items: center;
gap: var(--space-sm);
background: var(--bg-tertiary);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-lg);
border: 1px solid var(--border-light);
transition: all var(--transition-fast);
}
.language-selector:hover {
border-color: var(--primary);
background: var(--bg-hover);
}
.language-selector label {
font-size: 1.125rem;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2));
}
#language-select {
background: var(--bg-primary);
color: var(--text-primary);
border: 1px solid var(--border-light);
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-md);
font-size: 0.875rem;
cursor: pointer;
outline: none;
transition: all var(--transition-fast);
min-width: 100px;
}
#language-select:hover {
border-color: var(--primary);
}
#language-select:focus {
border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
#language-select option {
background: var(--bg-secondary);
color: var(--text-primary);
padding: var(--space-xs);
}
/* Modern Game Container */
#game-container {
display: flex;
flex: 1;
overflow: hidden;
background: var(--bg-primary);
}
/* Modern Sidebars */
#left-sidebar, #right-sidebar {
width: 320px;
background: var(--bg-secondary);
border-right: 1px solid var(--border-light);
overflow-y: auto;
overflow-x: hidden;
transition: all var(--transition-normal);
position: relative;
}
#right-sidebar {
border-right: none;
border-left: 1px solid var(--border-light);
}
.sidebar-section {
padding: var(--space-lg);
border-bottom: 1px solid var(--border-light);
transition: background var(--transition-fast);
}
.sidebar-section:hover {
background: var(--bg-tertiary);
}
.sidebar-section:last-child {
border-bottom: none;
}
.sidebar-section h3 {
margin-bottom: var(--space-md);
color: var(--primary);
font-size: 1rem;
font-weight: 600;
display: flex;
align-items: center;
gap: var(--space-sm);
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Modern Intel Panel */
.intel-section {
background: linear-gradient(135deg, rgba(59, 130, 246, 0.1), rgba(16, 185, 129, 0.1));
border: 1px solid var(--primary);
border-radius: var(--radius-lg);
padding: var(--space-lg);
position: relative;
overflow: hidden;
}
.intel-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, var(--primary), var(--secondary));
animation: intelGlow 3s ease-in-out infinite;
}
@keyframes intelGlow {
0%, 100% { opacity: 0.7; }
50% { opacity: 1; }
}
#intel-panel {
background: rgba(15, 23, 42, 0.6);
padding: var(--space-md);
border-radius: var(--radius-md);
border: 1px solid var(--border-light);
min-height: 100px;
backdrop-filter: blur(10px);
}
.intel-status {
font-size: 0.875rem;
color: var(--warning);
margin-bottom: var(--space-sm);
font-style: italic;
opacity: 0.8;
}
.intel-summary {
font-size: 0.9rem;
color: var(--text-primary);
margin-bottom: var(--space-md);
line-height: 1.6;
font-weight: 500;
}
.intel-tips {
font-size: 0.875rem;
color: var(--success);
line-height: 1.5;
}
.intel-tips > div {
margin-bottom: var(--space-xs);
padding-left: var(--space-md);
position: relative;
}
.intel-tips > div::before {
content: "→";
position: absolute;
left: 0;
color: var(--primary);
font-weight: bold;
}
#intel-header {
color: var(--primary);
font-size: 0.9rem;
font-weight: 600;
margin-bottom: var(--space-md);
display: flex;
align-items: center;
gap: var(--space-sm);
}
#intel-header.offline {
color: var(--text-muted);
}
#intel-header.updating {
color: var(--warning);
}
#intel-header.active {
color: var(--success);
}
.intel-source-badge {
background: var(--bg-tertiary);
color: var(--text-secondary);
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-sm);
font-size: 0.75rem;
font-weight: 500;
border: 1px solid var(--border-light);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.intel-refresh-btn {
background: var(--primary);
color: white;
border: none;
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-md);
cursor: pointer;
font-size: 0.875rem;
transition: all var(--transition-fast);
display: flex;
align-items: center;
justify-content: center;
min-width: 32px;
min-height: 32px;
}
.intel-refresh-btn:hover {
background: var(--primary-dark);
transform: rotate(180deg);
}
.intel-refresh-btn:active {
transform: scale(0.95) rotate(180deg);
}
/* Intel/AI Analysis Panel */
.intel-section {
background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), rgba(46, 204, 113, 0.1));
border: 2px solid var(--primary-color);
border-radius: 8px;
padding: 15px;
}
#intel-panel {
background: rgba(0, 0, 0, 0.3);
padding: 12px;
border-radius: 5px;
border: 1px solid var(--border-color);
min-height: 80px;
}
.intel-status {
font-size: 12px;
color: var(--warning-color);
margin-bottom: 8px;
font-style: italic;
}
.intel-summary {
font-size: 13px;
color: var(--light-text);
margin-bottom: 10px;
line-height: 1.5;
font-weight: 500;
}
.intel-tips {
font-size: 11px;
color: var(--success-color);
line-height: 1.4;
}
.intel-tips > div {
margin-bottom: 4px;
padding-left: 12px;
position: relative;
}
.intel-tips > div::before {
content: "→";
position: absolute;
left: 0;
color: var(--primary-color);
}
#intel-header {
color: var(--primary-color);
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
}
#intel-header.offline {
color: var(--secondary-color);
}
#intel-header.updating {
color: var(--warning-color);
}
#intel-header.active {
color: var(--success-color);
}
.intel-refresh-btn {
background: var(--primary-color);
color: white;
border: none;
padding: 6px 12px;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
transition: all 0.3s ease;
}
.intel-refresh-btn:hover {
background: var(--success-color);
transform: rotate(180deg);
}
.intel-refresh-btn:active {
transform: scale(0.95) rotate(180deg);
}
/* Modern Action Buttons */
.action-buttons {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.action-btn {
background: linear-gradient(135deg, var(--primary), var(--primary-dark));
border: 1px solid var(--primary);
color: white;
padding: var(--space-md);
border-radius: var(--radius-lg);
cursor: pointer;
font-weight: 600;
transition: all var(--transition-fast);
position: relative;
overflow: hidden;
text-align: left;
font-size: 0.875rem;
}
.action-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left var(--transition-slow);
}
.action-btn:hover {
transform: translateX(4px);
box-shadow: var(--shadow-lg);
border-color: var(--primary-light);
}
.action-btn:hover::before {
left: 100%;
}
.action-btn:active {
transform: translateX(2px);
}
/* Modern Game Stats */
#game-stats {
background: var(--bg-tertiary);
padding: var(--space-md);
border-radius: var(--radius-lg);
border: 1px solid var(--border-light);
}
.stat-row {
display: flex;
justify-content: space-between;
padding: var(--space-sm) 0;
border-bottom: 1px solid var(--border-light);
transition: all var(--transition-fast);
}
.stat-row:last-child {
border-bottom: none;
}
.stat-row:hover {
background: var(--bg-hover);
margin: 0 calc(-1 * var(--space-md));
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-sm);
}
.stat-row span:last-child {
color: var(--primary);
font-weight: 600;
}
/* Modern Notifications */
#notifications {
position: fixed;
top: 80px;
right: var(--space-lg);
z-index: var(--z-toast);
display: flex;
flex-direction: column;
gap: var(--space-sm);
pointer-events: none;
}
.notification {
background: rgba(15, 23, 42, 0.95);
border: 1px solid var(--border-light);
padding: var(--space-md) var(--space-lg);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-xl);
backdrop-filter: blur(10px);
animation: slideIn 0.3s ease, fadeOut 0.3s ease 2.7s;
pointer-events: all;
transition: all var(--transition-fast);
max-width: 400px;
}
.notification:hover {
transform: translateX(-4px);
box-shadow: var(--shadow-glow);
}
.notification.success {
border-color: var(--success);
background: rgba(16, 185, 129, 0.1);
}
.notification.warning {
border-color: var(--warning);
background: rgba(245, 158, 11, 0.1);
}
.notification.error {
border-color: var(--danger);
background: rgba(239, 68, 68, 0.1);
}
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes fadeOut {
to {
opacity: 0;
transform: translateX(100%);
}
}
/* Modern Hint System */
.hint-container {
position: fixed;
left: 50%;
transform: translateX(-50%);
background: linear-gradient(135deg, var(--primary), var(--primary-dark));
color: white;
padding: var(--space-md) var(--space-xl);
border-radius: var(--radius-lg);
font-size: 1rem;
font-weight: 500;
box-shadow: var(--shadow-xl);
z-index: var(--z-tooltip);
max-width: 600px;
text-align: center;
opacity: 0;
transition: all var(--transition-normal);
pointer-events: none;
border: 1px solid rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
}
.hint-container.center {
top: 50%;
transform: translate(-50%, -50%);
}
.hint-container.top {
top: 80px;
transform: translateX(-50%) translateY(0);
}
.hint-container.bottom {
bottom: 80px;
top: auto;
transform: translateX(-50%) translateY(0);
}
.hint-container.visible {
opacity: 1;
}
.hint-container.center.visible {
transform: translate(-50%, -50%) scale(1.05);
}
.hint-container.top.visible {
transform: translateX(-50%) translateY(8px);
}
.hint-container.bottom.visible {
transform: translateX(-50%) translateY(-8px);
}
/* Hint glow effect */
.hint-container::before {
content: '';
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
background: linear-gradient(45deg, var(--primary), var(--secondary), var(--primary));
border-radius: var(--radius-lg);
z-index: -1;
opacity: 0;
transition: opacity var(--transition-normal);
}
.hint-container.visible::before {
opacity: 0.6;
animation: hintGlow 3s ease-in-out infinite;
}
@keyframes hintGlow {
0%, 100% { opacity: 0.4; }
50% { opacity: 0.8; }
}
/* Modern Canvas Container */
#canvas-container {
flex: 1;
position: relative;
background: var(--bg-primary);
overflow: hidden;
}
#game-canvas {
width: 100%;
height: 100%;
display: block;
cursor: crosshair;
image-rendering: crisp-edges;
image-rendering: pixelated;
}
/* Modern Minimap - Base Styles */
#minimap-container {
position: absolute;
bottom: var(--space-lg);
right: var(--space-lg);
width: 240px;
height: 180px;
background: rgba(15, 23, 42, 0.9);
border: 1px solid var(--primary);
border-radius: var(--radius-lg);
overflow: hidden;
box-shadow: var(--shadow-xl);
backdrop-filter: blur(10px);
transition: all var(--transition-fast);
z-index: var(--z-fixed);
/* Ensure it doesn't overlap with right sidebar */
max-width: calc(100% - (var(--space-lg) * 2));
max-height: calc(100% - (var(--space-lg) * 2));
}
#minimap-container:hover {
transform: scale(1.05);
box-shadow: var(--shadow-glow);
/* Prevent overflow on hover */
transform-origin: bottom right;
}
#minimap {
width: 100%;
height: 100%;
display: block;
cursor: pointer;
}
#minimap-viewport {
position: absolute;
border: 2px solid rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.1);
pointer-events: none;
border-radius: var(--radius-sm);
}
/* Additional responsive minimap adjustments */
@media (max-width: 1400px) {
#minimap-container {
right: var(--space-md);
bottom: var(--space-md);
width: 200px;
height: 150px;
}
}
@media (max-width: 1200px) {
#minimap-container {
width: 180px;
height: 135px;
}
}
/* Modern Camera Controls */
#camera-controls {
position: absolute;
top: calc(var(--space-xl) + var(--space-md)); /* Position below topbar */
right: var(--space-lg);
display: flex;
flex-direction: column;
gap: var(--space-sm);
z-index: var(--z-sticky);
}
.camera-btn {
width: 48px;
height: 48px;
background: rgba(15, 23, 42, 0.9);
border: 1px solid var(--border-light);
border-radius: var(--radius-lg);
color: var(--text-primary);
font-size: 1.125rem;
cursor: pointer;
transition: all var(--transition-fast);
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(10px);
}
.camera-btn:hover {
background: var(--primary);
transform: scale(1.1);
box-shadow: var(--shadow-lg);
}
.camera-btn:active {
transform: scale(0.95);
}
/* Responsive camera controls adjustments */
@media (max-width: 1400px) {
#camera-controls {
top: calc(var(--space-xl) + var(--space-sm));
right: var(--space-md);
}
.camera-btn {
width: 44px;
height: 44px;
font-size: 1rem;
}
}
@media (max-width: 1024px) {
#camera-controls {
top: var(--space-xl);
right: var(--space-md);
}
.camera-btn {
width: 40px;
height: 40px;
font-size: 1rem;
}
}
/* Responsive Design - Optimized for Desktop Gaming */
/* Large Desktop (>1600px) - Optimal gaming experience */
@media (min-width: 1600px) {
#left-sidebar, #right-sidebar {
width: 360px;
}
#minimap-container {
width: 280px;
height: 210px;
}
.build-buttons, .unit-buttons {
grid-template-columns: repeat(2, 1fr);
}
}
/* Standard Desktop (1200px-1600px) - Good gaming experience */
@media (max-width: 1600px) {
#left-sidebar, #right-sidebar {
width: 320px;
}
#minimap-container {
width: 240px;
height: 180px;
}
}
/* Small Desktop/Large Tablet (1024px-1200px) - Still playable */
@media (max-width: 1200px) {
#left-sidebar, #right-sidebar {
width: 280px;
}
.build-buttons, .unit-buttons {
grid-template-columns: 1fr;
}
#minimap-container {
width: 200px;
height: 150px;
}
.sidebar-section {
padding: var(--space-md);
}
}
/* Tablet (768px-1024px) - Compact but playable */
@media (max-width: 1024px) {
#left-sidebar, #right-sidebar {
width: 240px;
}
#minimap-container {
width: 180px;
height: 135px;
bottom: var(--space-md);
right: var(--space-md);
}
#camera-controls {
top: var(--space-md);
right: var(--space-md);
}
.camera-btn {
width: 40px;
height: 40px;
font-size: 1rem;
}
.hint-container {
font-size: 0.875rem;
padding: var(--space-md) var(--space-lg);
max-width: 500px;
}
.game-over-content {
min-width: 320px;
padding: var(--space-xl);
}
}
/* Mobile (<768px) - Touch optimized */
@media (max-width: 768px) {
#topbar {
padding: var(--space-sm) var(--space-md);
flex-wrap: wrap;
gap: var(--space-sm);
}
.topbar-left h1 {
font-size: 1.25rem;
}
.resource-display {
gap: var(--space-sm);
}
.resource-item {
padding: var(--space-xs) var(--space-sm);
font-size: 0.875rem;
}
#left-sidebar, #right-sidebar {
width: 200px;
}
.build-buttons, .unit-buttons {
grid-template-columns: 1fr;
gap: var(--space-sm);
}
.build-btn, .unit-btn {
padding: var(--space-sm);
}
.build-icon, .unit-icon {
font-size: 1.5rem;
}
#minimap-container {
width: 160px;
height: 120px;
}
.hint-container {
font-size: 0.8rem;
padding: var(--space-sm) var(--space-md);
max-width: 400px;
}
.game-over-content {
min-width: 280px;
padding: var(--space-lg);
}
.game-over-content h2 {
font-size: 1.25rem;
}
}
/* Touch-friendly adjustments for tablets/mobile */
@media (hover: none) and (pointer: coarse) {
.build-btn, .unit-btn, .action-btn, .camera-btn, .sound-btn {
min-height: 44px;
min-width: 44px;
}
.control-group {
min-height: 48px;
}
#language-select {
min-height: 44px;
padding: var(--space-sm);
}
}