/* Web Terminal — modern dark UI */ :root { /* palette (design tokens) */ --bg: #0e0f13; /* terminal / deepest surface */ --surface-1: #15161c; /* tab bar, key bar */ --surface-2: #1c1e26; /* tabs, buttons, cards */ --surface-3: #252834; /* hover / active */ --border: rgba(255, 255, 255, 0.07); --border-strong: rgba(255, 255, 255, 0.13); --text: #e7e8ec; --text-dim: #9aa0ad; --text-faint: #6b7080; --accent: #7c8cff; /* indigo */ --accent-2: #9d7cff; --accent-soft: rgba(124, 140, 255, 0.16); --green: #46d07f; --amber: #f5b14c; --red: #ff6b6b; --shadow: 0 10px 40px rgba(0, 0, 0, 0.55); --radius: 9px; --radius-lg: 14px; --tabbar-h: 40px; --keybar-h: 46px; --ui-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; } @media (pointer: coarse) { :root { --tabbar-h: 48px; --keybar-h: 60px; } } html, body { margin: 0; padding: 0; width: 100%; height: 100%; background-color: var(--bg); color: var(--text); font-family: var(--ui-font); overflow: hidden; } * { scrollbar-width: thin; scrollbar-color: var(--surface-3) transparent; } /* ── Tab bar ─────────────────────────────────────────────────────── */ #tabbar { position: fixed; inset: 0 0 auto 0; height: var(--tabbar-h); background: linear-gradient(180deg, #181a22, var(--surface-1)); border-bottom: 1px solid var(--border); display: flex; align-items: stretch; z-index: 1001; } #tabs { flex: 1 1 auto; display: flex; align-items: center; gap: 2px; padding: 0 4px; overflow-x: auto; overflow-y: hidden; } #tabs::-webkit-scrollbar { height: 0; } /* tabs as floating rounded chips */ .tab { display: flex; align-items: center; gap: 2px; height: calc(var(--tabbar-h) - 12px); padding: 0 4px 0 10px; border-radius: 8px; color: var(--text-dim); background: transparent; cursor: pointer; white-space: nowrap; font-size: 13px; user-select: none; max-width: 220px; transition: background 0.12s ease, color 0.12s ease; } .tab:hover { background: var(--surface-2); color: var(--text); } .tab.active { background: var(--surface-3); color: #fff; box-shadow: inset 0 0 0 1px var(--border-strong); } .tab-dot { width: 7px; height: 7px; border-radius: 50%; margin-right: 8px; flex: none; background: var(--text-faint); } .dot-connected { background: var(--green); box-shadow: 0 0 6px rgba(70, 208, 127, 0.5); } .dot-connecting, .dot-reconnecting { background: var(--amber); } .dot-exited { background: var(--red); } .tab-label { padding-right: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .tab-rename { width: 120px; margin: 0 4px; padding: 3px 6px; font: inherit; font-size: 13px; color: #fff; background: var(--bg); border: 1px solid var(--accent); border-radius: 6px; outline: none; } /* unread / Claude-waiting accents */ .tab.unread .tab-dot { box-shadow: 0 0 0 3px var(--accent-soft); } .tab.unread .tab-label { color: #fff; font-weight: 600; } .tab-claude { margin-right: 4px; font-size: 12px; flex: none; } .tab.claude-waiting { background: rgba(245, 177, 76, 0.14); box-shadow: inset 0 0 0 1px rgba(245, 177, 76, 0.5); } .tab.dragging { opacity: 0.4; } .tab.drag-over { box-shadow: inset 3px 0 0 var(--accent); } .tab-close { background: none; border: none; color: var(--text-faint); cursor: pointer; font-size: 16px; line-height: 1; padding: 3px 6px; border-radius: 6px; flex: none; } .tab-close:hover { background: rgba(255, 255, 255, 0.1); color: #fff; } @media (pointer: fine) { .tab:not(.active):not(:hover) .tab-close { opacity: 0; } } .tab-add { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 18px; padding: 0 10px; flex: none; border-radius: 7px; } .tab-add:hover { color: #fff; background: var(--surface-2); } /* toolbar */ #toolbar { flex: 0 0 auto; display: flex; align-items: center; gap: 2px; padding: 0 6px; border-left: 1px solid var(--border); } .toolbtn { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 15px; padding: 7px 9px; border-radius: 8px; line-height: 1; transition: background 0.12s ease; } .toolbtn:hover { color: #fff; background: var(--surface-2); } /* ── Terminal area ───────────────────────────────────────────────── */ #term { position: absolute; inset: var(--tabbar-h) 0 var(--keybar-h) 0; background: var(--bg); overflow: hidden; } .term-pane { position: absolute; inset: 0; padding: 6px 8px 0; box-sizing: border-box; overflow: hidden; } /* ── Key bar (rounded chips) ─────────────────────────────────────── */ #keybar { position: fixed; inset: auto 0 0 0; height: var(--keybar-h); background: var(--surface-1); border-top: 1px solid var(--border); display: flex; align-items: center; gap: 5px; padding: 0 6px; overflow-x: auto; overflow-y: hidden; z-index: 1000; } #keybar::-webkit-scrollbar { height: 0; } #keybar button { flex: 1 0 auto; min-width: 50px; height: calc(var(--keybar-h) - 12px); padding: 0 10px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; border: 1px solid var(--border); background: var(--surface-2); color: var(--text); font-family: var(--ui-font); cursor: pointer; border-radius: 8px; transition: background 0.1s ease, transform 0.05s ease; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; } #keybar .kb-key { font-size: 13px; line-height: 1.1; } #keybar .kb-cap { font-size: 9px; line-height: 1; color: var(--text-faint); letter-spacing: 0.02em; } #keybar button:hover { background: var(--surface-3); } #keybar button:active { transform: translateY(1px); background: var(--surface-3); } #keybar button.keybar-btn-primary { background: var(--accent-soft); color: #cdd4ff; border-color: rgba(124, 140, 255, 0.4); font-weight: 600; min-width: 54px; } #keybar button.keybar-btn-primary:hover { background: rgba(124, 140, 255, 0.26); } #keybar button.keybar-btn-primary .kb-cap { color: rgba(205, 212, 255, 0.7); } /* ── Shared: overlays, cards, inputs, buttons ────────────────────── */ .overlay { position: fixed; inset: 0; z-index: 1200; display: flex; background: rgba(8, 9, 12, 0.6); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); } #searchbox { position: fixed; top: calc(var(--tabbar-h) + 8px); right: 10px; z-index: 1100; display: flex; gap: 5px; padding: 7px; background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: 10px; box-shadow: var(--shadow); } .search-input { width: 190px; padding: 5px 8px; font: inherit; font-size: 13px; color: #fff; background: var(--bg); border: 1px solid var(--border); border-radius: 7px; outline: none; } .search-input:focus { border-color: var(--accent); } #searchbox button { background: var(--surface-3); border: 1px solid var(--border); color: var(--text); cursor: pointer; border-radius: 7px; padding: 0 10px; } #searchbox button:hover { background: var(--accent-soft); } /* QR + share modals */ #qrmodal, #sharemodal { position: fixed; inset: 0; z-index: 1200; display: flex; align-items: center; justify-content: center; background: rgba(8, 9, 12, 0.6); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); } .qr-card { background: var(--surface-2); color: var(--text); border: 1px solid var(--border-strong); border-radius: var(--radius-lg); padding: 22px; text-align: center; max-width: 90vw; box-shadow: var(--shadow); } .qr-card canvas { border-radius: 10px; background: #fff; padding: 8px; } .qr-title { font-weight: 600; margin-bottom: 14px; } .qr-url { margin-top: 12px; font-size: 13px; color: var(--accent); word-break: break-all; } .qr-note { margin-top: 8px; font-size: 12px; color: var(--text-dim); max-width: 240px; } .qr-close { margin-top: 16px; padding: 8px 20px; border: 1px solid var(--border-strong); border-radius: 8px; background: var(--surface-3); color: #fff; cursor: pointer; font: inherit; } .qr-close:hover { background: var(--accent-soft); } /* Settings panel */ #settingspanel { position: fixed; top: calc(var(--tabbar-h) + 8px); right: 10px; z-index: 1100; background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: 12px; padding: 12px; min-width: 220px; box-shadow: var(--shadow); color: var(--text); } .settings-row { display: flex; align-items: center; gap: 6px; margin: 8px 0; } .settings-label { width: 48px; color: var(--text-dim); font-size: 13px; } .settings-opt { background: var(--surface-3); border: 1px solid var(--border); color: var(--text); border-radius: 7px; padding: 5px 10px; cursor: pointer; font: inherit; font-size: 12px; transition: background 0.1s ease; } .settings-opt:hover { background: var(--surface-1); } .settings-opt.active { background: var(--accent); color: #fff; border-color: var(--accent); } .settings-size { min-width: 22px; text-align: center; } /* Dashboard + history + shortcuts share the centered-card look */ #dashboard, #historymodal, #shortcutsmodal { position: fixed; inset: 0; z-index: 1200; display: flex; align-items: flex-start; justify-content: center; padding-top: 60px; background: rgba(8, 9, 12, 0.6); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); } .dash-card, .hist-card, .sc-card { background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: var(--radius-lg); min-width: 340px; max-width: 92vw; max-height: 72vh; overflow-y: auto; box-shadow: var(--shadow); } .sc-card { width: 540px; } .dash-title, .hist-title, .sc-title { padding: 14px 18px; font-weight: 600; color: #fff; border-bottom: 1px solid var(--border); position: sticky; top: 0; background: var(--surface-2); } /* Shortcut cheat-sheet */ .sc-group { padding: 12px 18px 4px; font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent); } .sc-row { display: flex; align-items: center; gap: 12px; padding: 6px 18px; } .sc-key { flex: none; min-width: 110px; font-family: Menlo, Consolas, monospace; font-size: 12px; color: #fff; background: var(--bg); border: 1px solid var(--border-strong); border-radius: 6px; padding: 3px 8px; text-align: center; } .sc-desc { flex: 1 1 auto; color: var(--text-dim); font-size: 13px; } .sc-tag { flex: none; font-size: 10px; color: var(--accent); background: var(--accent-soft); border-radius: 5px; padding: 2px 6px; } .dash-row, .hist-row { display: flex; align-items: center; gap: 10px; padding: 11px 18px; cursor: pointer; color: var(--text); border-bottom: 1px solid var(--border); transition: background 0.1s ease; } .dash-row:hover, .hist-row:hover { background: var(--surface-3); } .dash-row.active { box-shadow: inset 3px 0 0 var(--accent); } .dash-name { flex: 1; } .dash-claude { color: var(--text-dim); font-size: 13px; } .dash-claude.pending { color: var(--amber); font-weight: 600; } .hist-empty { padding: 18px; color: var(--text-dim); } .hist-row { cursor: default; } .hist-main { flex: 1 1 auto; min-width: 0; } .hist-proj { color: #fff; font-size: 13px; } .hist-prev { color: var(--text-dim); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .hist-resume { flex: none; background: var(--accent); color: #fff; border: none; border-radius: 8px; padding: 7px 15px; cursor: pointer; font: inherit; font-weight: 500; transition: background 0.1s ease; } .hist-resume:hover { background: var(--accent-2); } /* Approval banner (H3) */ #approvalbar { position: fixed; inset: auto 0 var(--keybar-h) 0; z-index: 1050; display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: linear-gradient(180deg, rgba(245, 177, 76, 0.16), rgba(245, 177, 76, 0.08)); border-top: 1px solid rgba(245, 177, 76, 0.5); color: #ffe0ad; font-size: 14px; } .approval-label { flex: 1 1 auto; } #approvalbar button { flex: none; border: none; border-radius: 8px; padding: 8px 16px; cursor: pointer; font: inherit; font-weight: 600; } .approval-yes { background: var(--green); color: #06210f; } .approval-no { background: var(--red); color: #2a0808; }