/* Game Stream App - dark theme, video fills viewport, minimal chrome. */ :root { --bg: #0a0a0b; --fg: #e6e6e6; --fg-dim: #8a8a8a; --accent: #4da3ff; --live: #34c759; --offline: #8a8a8a; --error: #ff453a; --card-bg: rgba(20, 20, 22, 0.92); --border: rgba(255, 255, 255, 0.08); --status-bar-height: 36px; } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; height: 100%; background: var(--bg); color: var(--fg); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 14px; overflow: hidden; } body { display: flex; flex-direction: column; } /* --- video stage ------------------------------------------------------- */ #stage { position: relative; flex: 1 1 auto; background: #000; overflow: hidden; } #video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; background: #000; } /* --- offline / loading overlay ---------------------------------------- */ .overlay { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.72); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); z-index: 10; transition: opacity 200ms ease; } .overlay[hidden] { display: none; } .overlay-card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 12px; padding: 32px 44px; text-align: center; min-width: 280px; box-shadow: 0 12px 48px rgba(0, 0, 0, 0.5); } .overlay-card h1 { margin: 0 0 8px 0; font-size: 20px; font-weight: 600; } .overlay-card p { margin: 0 0 20px 0; color: var(--fg-dim); font-size: 13px; } .spinner { width: 28px; height: 28px; margin: 0 auto; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 900ms linear infinite; } .overlay-card.error .spinner { display: none; } .overlay-card.error h1 { color: var(--error); } @keyframes spin { to { transform: rotate(360deg); } } /* --- status bar ------------------------------------------------------- */ #status-bar { flex: 0 0 var(--status-bar-height); display: flex; align-items: center; gap: 12px; padding: 0 16px; background: #111113; border-top: 1px solid var(--border); font-size: 12px; color: var(--fg-dim); font-variant-numeric: tabular-nums; } #status-bar b { color: var(--fg); font-weight: 600; } #status-bar .separator { color: #333; } #status-bar .spacer { flex: 1 1 auto; } .status { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; color: #000; } .status::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: currentColor; opacity: 0.4; } .status.live { background: var(--live); color: #003d15; } .status.live::before { background: #003d15; animation: pulse 1.4s ease-in-out infinite; } .status.offline { background: #2a2a2d; color: var(--fg-dim); } .status.error { background: var(--error); color: #3d0000; } @keyframes pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } } #unmute-btn { background: var(--accent); color: #00224d; border: none; border-radius: 6px; padding: 5px 12px; font-size: 12px; font-weight: 600; cursor: pointer; } #unmute-btn:hover { background: #66b5ff; }