:root { --bg:#141414; --panel:#1e1e1e; --fg:#e6e6e6; --mut:#9a9a9a; --acc:#3d8bfd; --live:#e74c3c; } html, body, #root { height:100%; margin:0; background:var(--bg); color:var(--fg); font:14px/1.4 system-ui, sans-serif; } .app { display:flex; flex-direction:column; height:100%; } .topbar { display:flex; align-items:center; gap:14px; padding:8px 14px; background:#101010; border-bottom:1px solid #2a2a2a; } .topbar h1 { font-size:15px; margin:0; font-weight:700; letter-spacing:.3px; } .topbar .count { color:var(--mut); font-size:13px; } .topbar .spacer { flex:1; } .topbar button { background:#2a2a2a; color:var(--fg); border:1px solid #3a3a3a; border-radius:6px; padding:5px 10px; cursor:pointer; font-size:13px; } .topbar button:hover { border-color:var(--acc); } .dock { flex:1; min-height:0; } .dockview-theme-vanguard { --dv-background-color:var(--bg); --dv-paneview-active-outline-color:var(--acc); --dv-tabs-and-actions-container-background-color:#181818; --dv-activegroup-visiblepanel-tab-background-color:var(--panel); --dv-activegroup-hiddenpanel-tab-background-color:#181818; --dv-inactivegroup-visiblepanel-tab-background-color:#1a1a1a; --dv-inactivegroup-hiddenpanel-tab-background-color:#181818; --dv-tab-divider-color:#2a2a2a; --dv-activegroup-visiblepanel-tab-color:var(--fg); --dv-activegroup-hiddenpanel-tab-color:var(--mut); --dv-inactivegroup-visiblepanel-tab-color:var(--mut); --dv-inactivegroup-hiddenpanel-tab-color:#777; --dv-separator-border:#2a2a2a; --dv-group-view-background-color:var(--panel); --dv-drag-over-background-color:rgba(61,139,253,.2); --dv-drag-over-border-color:var(--acc); --dv-tabs-container-scrollbar-color:#444; --dv-icon-hover-background-color:#333; } .player { position:relative; width:100%; height:100%; background:#000; display:flex; flex-direction:column; } .player .vwrap { flex:1; min-height:0; position:relative; display:flex; align-items:center; justify-content:center; background:#000; overflow:hidden; } /* .frame = game-aspect box (sized by Player.jsx); the video spans its width, so the timecode band rows overflow the bottom and are clipped */ .player .frame { position:relative; width:100%; height:100%; overflow:hidden; background:#000; } .player .frame video { position:absolute; top:0; left:0; width:100%; height:auto; display:block; background:#000; } .player .frame[style] video { height:auto; } .player .frame:not([style]) video { position:static; width:100%; height:100%; object-fit:contain; } /* before the size is known: plain contain */ .player .bar { display:flex; align-items:center; gap:10px; padding:6px 10px; background:#181818; border-top:1px solid #2a2a2a; font-size:13px; } .player .live { background:var(--live); color:#fff; font-weight:700; font-size:11px; padding:2px 6px; border-radius:4px; letter-spacing:.5px; } .player .who { font-weight:600; } .player .title { color:var(--mut); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex:1; min-width:0; } .player .viewers { color:var(--mut); } .player .mute { background:#2a2a2a; color:var(--fg); border:1px solid #3a3a3a; border-radius:6px; width:34px; height:28px; cursor:pointer; font-size:15px; } .player .mute.on { border-color:var(--acc); } .player .mute.pinned { border-color:#f1c40f; } .player input[type=range] { width:110px; accent-color:var(--acc); } .player .status { position:absolute; top:8px; left:8px; background:rgba(0,0,0,.6); color:var(--mut); font-size:12px; padding:3px 8px; border-radius:4px; } .player.focused .bar { background:#1c2333; } .empty { flex:1; display:flex; align-items:center; justify-content:center; flex-direction:column; gap:8px; color:var(--mut); } .empty h2 { color:var(--fg); margin:0; font-size:20px; } /* --- Go Live --------------------------------------------------------------------------------- */ .golive { flex:1; display:flex; flex-direction:column; min-height:0; } .golive-head { display:flex; align-items:center; gap:12px; padding:10px 14px; background:#101010; border-bottom:1px solid #2a2a2a; } .golive-head h2 { margin:0; font-size:16px; } .golive-head .who { color:var(--mut); } .golive-head .spacer { flex:1; } .golive-head button, .golive-form button { background:#2a2a2a; color:var(--fg); border:1px solid #3a3a3a; border-radius:6px; padding:8px 14px; cursor:pointer; font-size:14px; } .golive-head button.danger { background:var(--live); border-color:var(--live); color:#fff; font-weight:600; } .golive-form button.primary { background:var(--acc); border-color:var(--acc); color:#fff; font-weight:600; width:100%; padding:12px; margin-top:8px; } .golive-form button:disabled { opacity:.5; cursor:default; } .golive-body { flex:1; position:relative; display:flex; align-items:center; justify-content:center; min-height:0; background:#000; } .golive-body video { display:none; width:100%; height:100%; object-fit:contain; } .golive-body video.show { display:block; } .golive-form { position:absolute; width:min(520px, calc(100% - 32px)); background:var(--panel); border:1px solid #3a3a3a; border-radius:12px; padding:22px; display:grid; gap:10px; } .golive-form label { color:var(--mut); font-size:13px; } .golive-form input { padding:10px 12px; font-size:15px; background:#141414; color:var(--fg); border:1px solid #444; border-radius:8px; } .golive-form .hint { color:var(--mut); font-size:13px; line-height:1.5; } .golive-form .err { color:var(--live); font-size:13px; } .golive-stats { position:absolute; left:12px; bottom:12px; display:flex; gap:14px; align-items:center; background:rgba(0,0,0,.65); padding:8px 12px; border-radius:8px; font-size:13px; } .golive-stats .pill.live { background:var(--live); color:#fff; font-weight:700; font-size:11px; padding:2px 6px; border-radius:4px; } .golive-stats .warn { color:#f1c40f; } .topbar button.golive-btn { background:var(--live); border-color:var(--live); color:#fff; font-weight:700; } .golive-form .warn-box { background:#3a2a10; border:1px solid #f1c40f; color:#ffe9a8; border-radius:8px; padding:10px 12px; font-size:13px; line-height:1.5; } .golive-form .warn-box b { color:#fff; } .golive-stats .rec { background:#f1c40f; color:#000; font-weight:700; font-size:11px; padding:2px 6px; border-radius:4px; } .topbar a.signout { color:var(--mut); font-size:13px; text-decoration:none; border:1px solid #3a3a3a; border-radius:6px; padding:5px 10px; } .topbar a.signout:hover { color:var(--fg); border-color:#666; } /* renameable tabs + group names */ .vtab { display:flex; align-items:center; height:100%; padding:0 10px; min-width:0; } .vtab-text { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:260px; } .vtab input, .grouplabel input { background:#111; color:var(--fg); border:1px solid var(--acc); border-radius:4px; font:inherit; font-size:12px; padding:1px 6px; width:170px; outline:none; } .grouplabel { display:flex; align-items:center; height:100%; padding:0 10px; font-size:12px; white-space:nowrap; border-right:1px solid #2a2a2a; cursor:default; } .grouplabel .gname { color:var(--acc); font-weight:700; } .grouplabel .hint { color:#555; } .groupactions { display:flex; align-items:center; height:100%; padding:0 6px; } .gbtn { background:transparent; color:var(--mut); border:0; cursor:pointer; font-size:14px; padding:0 6px; line-height:1; } .gbtn:hover { color:var(--fg); }