/* ═══════════════════════════════════════════════════════════════════════ OSTP Desktop — Design System 0.4.0 Monochrome. Black background. White accents. Eagle watermark. ═══════════════════════════════════════════════════════════════════════ */ /* ── Tokens ─────────────────────────────────────────────────────────── */ :root { --c-bg: #080808; --c-surface: #111111; --c-card: rgba(var(--c-fg-rgb), 0.04); --c-card-border: rgba(var(--c-fg-rgb), 0.09); --c-card-hover: rgba(var(--c-fg-rgb), 0.07); --c-fg-rgb: 255, 255, 255; /* Accent = white */ --c-accent: #ffffff; --c-accent-dim: rgba(var(--c-fg-rgb),0.08); --c-accent-glow: rgba(var(--c-fg-rgb),0.18); /* Green only for "connected" state */ --c-green: #e8e8e8; --c-green-glow: rgba(232,232,232,0.25); --c-green-dim: rgba(232,232,232,0.07); --c-red: #ff5f5f; --c-amber: #f0b840; --c-txt-1: #f0f0f0; --c-txt-2: #6a6a6a; --c-txt-3: #333333; --r-xs: 5px; --r-sm: 10px; --r-md: 14px; --r-lg: 18px; --r-full: 9999px; --t-fast: 130ms ease; --t-med: 260ms cubic-bezier(0.4,0,0.2,1); --t-slow: 400ms cubic-bezier(0.34,1.56,0.64,1); font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; -webkit-font-smoothing: antialiased; color: var(--c-txt-1); } /* ── Light theme (inverted monochrome) ──────────────────────────────── */ :root.light { --c-bg: #f4f4f5; --c-surface: #ffffff; --c-card: rgba(0,0,0,0.03); --c-card-border: rgba(0,0,0,0.10); --c-card-hover: rgba(0,0,0,0.05); --c-fg-rgb: 0, 0, 0; --c-accent: #18181b; --c-accent-dim: rgba(0,0,0,0.08); --c-accent-glow: rgba(0,0,0,0.14); --c-green: #18181b; --c-green-glow: rgba(0,0,0,0.16); --c-green-dim: rgba(0,0,0,0.05); --c-red: #dc2626; --c-amber: #d97706; --c-txt-1: #18181b; --c-txt-2: #71717a; --c-txt-3: #c4c4cc; color: var(--c-txt-1); } /* Eagle watermark is a light asset — invert it so it stays visible on light bg */ :root.light .watermark img { filter: invert(1); } /* Theme toggle: show the icon of the theme you'd switch TO */ #icon-moon { display: none; } #icon-sun { display: block; } :root.light #icon-moon { display: block; } :root.light #icon-sun { display: none; } /* GUI version footer at the bottom of Settings */ .app-version { text-align: center; font-size: 0.68rem; letter-spacing: 0.05em; color: var(--c-txt-2); opacity: 0.7; padding: 16px 0 20px; } /* ── Reset ───────────────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: var(--c-bg); user-select: none; } button { cursor: pointer; font-family: inherit; border: none; background: none; } input, textarea, select { font-family: inherit; } a { text-decoration: none; } /* ── App root ────────────────────────────────────────────────────────── */ .app-root { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; } /* ── Eagle watermark ─────────────────────────────────────────────────── */ .watermark { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; pointer-events: none; z-index: 0; } .watermark img { width: 72%; max-width: 520px; opacity: 0.05; user-select: none; -webkit-user-drag: none; } /* ── Screen system ───────────────────────────────────────────────────── */ .screen { position: absolute; inset: 0; z-index: 2; display: flex; flex-direction: column; padding: 0 20px; opacity: 0; pointer-events: none; transform: translateX(14px); transition: opacity var(--t-med), transform var(--t-med); } .screen.active { opacity: 1; pointer-events: auto; transform: translateX(0); z-index: 3; } /* ── Top bar ─────────────────────────────────────────────────────────── */ .topbar { display: flex; align-items: center; justify-content: space-between; padding: 15px 0 12px; flex-shrink: 0; } .brand { display: flex; align-items: center; gap: 9px; } .brand-dot { width: 8px; height: 8px; border-radius: 2px; background: var(--c-txt-2); transition: background var(--t-med), box-shadow var(--t-med); } .brand-dot.connecting { animation: dot-blink 1.4s infinite ease-in-out; background: var(--c-accent); } .brand-dot.connected { background: var(--c-accent); box-shadow: 0 0 10px var(--c-accent-glow); } @keyframes dot-blink { 0%,100% { opacity: 1; } 50% { opacity: 0.25; } } .brand-name { font-size: 0.72rem; font-weight: 800; letter-spacing: 4px; text-transform: uppercase; color: var(--c-txt-2); } .topbar-title { font-size: 0.72rem; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; color: var(--c-txt-2); } .topbar-right { display: flex; align-items: center; gap: 6px; } /* ── Icon buttons ────────────────────────────────────────────────────── */ .icon-btn { width: 34px; height: 34px; display: flex; align-items: center; justify-content: center; border-radius: var(--r-sm); border: 1px solid var(--c-card-border); background: var(--c-card); color: var(--c-txt-2); transition: all var(--t-fast); backdrop-filter: blur(8px); } .icon-btn:hover { border-color: rgba(var(--c-fg-rgb),0.18); color: var(--c-txt-1); background: rgba(var(--c-fg-rgb),0.07); } .icon-btn:active { transform: scale(0.91); } .add-btn:hover { border-color: var(--c-accent); color: var(--c-accent); } /* ── Stage (home center) ─────────────────────────────────────────────── */ .stage { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; position: relative; z-index: 1; } /* ── Orbit rings ─────────────────────────────────────────────────────── */ .orbit-wrap { position: relative; width: 200px; height: 200px; display: flex; align-items: center; justify-content: center; } .orbit { position: absolute; border-radius: 50%; border: 1px solid transparent; opacity: 0; pointer-events: none; transition: opacity 0.5s ease, border-color 0.5s ease; } .orbit-1 { width: 100%; height: 100%; } .orbit-2 { width: 140%; height: 140%; } .orbit-3 { width: 175%; height: 175%; } .orbit-wrap.connecting .orbit { animation: orbit-spin 2.5s linear infinite; border-color: rgba(var(--c-fg-rgb),0.12); opacity: 1; } .orbit-wrap.connecting .orbit-2 { animation-duration: 3.8s; animation-direction: reverse; border-color: rgba(var(--c-fg-rgb),0.07); } .orbit-wrap.connecting .orbit-3 { animation-duration: 5.5s; border-color: rgba(var(--c-fg-rgb),0.04); } .orbit-wrap.connected .orbit { animation: orbit-spin 4s linear infinite; border-color: rgba(var(--c-fg-rgb),0.14); opacity: 1; } .orbit-wrap.connected .orbit-2 { animation-duration: 6s; animation-direction: reverse; border-color: rgba(var(--c-fg-rgb),0.08); } .orbit-wrap.connected .orbit-3 { animation-duration: 9s; border-color: rgba(var(--c-fg-rgb),0.04); } @keyframes orbit-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ── Power button ────────────────────────────────────────────────────── */ .power-btn { position: relative; z-index: 4; width: 112px; height: 112px; border-radius: 50%; border: 1.5px solid var(--c-card-border); background: var(--c-surface); color: var(--c-txt-3); display: flex; align-items: center; justify-content: center; transition: all var(--t-slow); box-shadow: 0 0 0 8px rgba(var(--c-fg-rgb),0.015), 0 8px 36px rgba(0,0,0,0.7); } .power-btn:hover { border-color: rgba(var(--c-fg-rgb),0.4); color: var(--c-txt-1); box-shadow: 0 0 0 10px rgba(var(--c-fg-rgb),0.04), 0 0 40px rgba(var(--c-fg-rgb),0.08), 0 8px 36px rgba(0,0,0,0.6); transform: scale(1.04); } .power-btn:active { transform: scale(0.96); } .power-btn.connecting { border-color: rgba(var(--c-fg-rgb),0.5); color: var(--c-txt-1); animation: btn-breathe 2s infinite ease-in-out; } .power-btn.connected { border-color: rgba(var(--c-fg-rgb),0.8); color: var(--c-txt-1); box-shadow: 0 0 0 8px rgba(var(--c-fg-rgb),0.04), 0 0 50px rgba(var(--c-fg-rgb),0.12), 0 8px 32px rgba(0,0,0,0.5); } .power-btn.error { border-color: var(--c-red); color: var(--c-red); } @keyframes btn-breathe { 0%,100% { box-shadow: 0 0 0 8px rgba(var(--c-fg-rgb),0.02), 0 0 20px rgba(var(--c-fg-rgb),0.05), 0 8px 32px rgba(0,0,0,0.6); } 50% { box-shadow: 0 0 0 12px rgba(var(--c-fg-rgb),0.06), 0 0 50px rgba(var(--c-fg-rgb),0.12), 0 8px 32px rgba(0,0,0,0.5); } } .power-icon { display: flex; align-items: center; justify-content: center; transition: transform var(--t-med); } .power-btn:hover .power-icon { transform: scale(1.07); } /* ── Status text ─────────────────────────────────────────────────────── */ .status-block { text-align: center; display: flex; flex-direction: column; gap: 5px; } .status-label { font-size: 1.05rem; font-weight: 600; letter-spacing: 0.1px; color: var(--c-txt-2); transition: color var(--t-med); } .status-label.is-connecting { color: rgba(var(--c-fg-rgb),0.7); } .status-label.is-connected { color: var(--c-txt-1); } .status-label.is-error { color: var(--c-red); } .status-sub { font-size: 0.72rem; color: var(--c-txt-2); opacity: 0.7; letter-spacing: 0.1px; } /* ── Error banner ────────────────────────────────────────────────────── */ .error-banner { font-size: 0.75rem; color: var(--c-red); text-align: center; padding: 6px 16px; border-radius: var(--r-sm); background: rgba(255,95,95,0.08); border: 1px solid rgba(255,95,95,0.18); max-width: 280px; animation: banner-in 0.25s ease; } .error-banner.hidden { display: none; } @keyframes banner-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } /* ── Connection info ─────────────────────────────────────────────────── */ .connection-info { display: flex; flex-direction: column; align-items: center; gap: 12px; transition: all var(--t-med); } .connection-info.hidden { opacity: 0; pointer-events: none; transform: translateY(5px); } .server-badge { display: inline-flex; align-items: center; gap: 8px; padding: 8px 16px; border-radius: var(--r-full); background: rgba(var(--c-fg-rgb),0.05); border: 1px solid rgba(var(--c-fg-rgb),0.10); font-size: 0.82rem; color: rgba(var(--c-fg-rgb),0.6); font-family: 'JetBrains Mono', monospace; font-weight: 500; } /* ── Live stats ──────────────────────────────────────────────────────── */ .live-stats { display: flex; align-items: center; gap: 0; background: rgba(var(--c-fg-rgb),0.03); border: 1px solid rgba(var(--c-fg-rgb),0.07); border-radius: var(--r-lg); overflow: hidden; } .live-stat { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 10px 4px; flex: 1; min-width: 80px; white-space: nowrap; } .live-stat-label { font-size: 0.6rem; font-weight: 700; letter-spacing: 0.8px; color: var(--c-txt-2); text-transform: uppercase; } .live-stat-value { font-size: 0.88rem; font-weight: 600; font-family: 'JetBrains Mono', monospace; color: var(--c-txt-1); font-variant-numeric: tabular-nums; } .live-stat-value.rtt-good { color: #9ef0c8; } .live-stat-value.rtt-warn { color: var(--c-amber); } .live-stat-value.rtt-bad { color: var(--c-red); } .live-stat-sep { width: 1px; height: 36px; background: rgba(var(--c-fg-rgb),0.07); flex-shrink: 0; } /* ── Metrics bar ─────────────────────────────────────────────────────── */ .metrics-bar { display: flex; align-items: center; padding: 20px; flex-shrink: 0; background: rgba(var(--c-fg-rgb),0.025); border-top: 1px solid rgba(var(--c-fg-rgb),0.06); margin: 0 -20px; padding-inline: 20px; } .metric { flex: 1; display: flex; align-items: center; justify-content: center; gap: 11px; } .metric-sep { width: 1px; height: 36px; background: rgba(var(--c-fg-rgb),0.08); flex-shrink: 0; } .metric-icon { width: 34px; height: 34px; border-radius: 9px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .down-icon { background: rgba(var(--c-fg-rgb),0.06); color: rgba(var(--c-fg-rgb),0.5); } .up-icon { background: rgba(var(--c-fg-rgb),0.04); color: rgba(var(--c-fg-rgb),0.35); } .metric-body { display: flex; flex-direction: column; gap: 1px; } .metric-label { font-size: 0.62rem; color: var(--c-txt-2); text-transform: uppercase; letter-spacing: 0.8px; font-weight: 700; } .metric-value { font-size: 0.95rem; font-weight: 700; font-family: 'JetBrains Mono', monospace; color: var(--c-txt-1); font-variant-numeric: tabular-nums; } /* ── Settings body ───────────────────────────────────────────────────── */ .settings-body { flex: 1; min-height: 0; overflow-y: scroll; scrollbar-width: none; padding-bottom: 20px; position: relative; z-index: 1; } .settings-body::-webkit-scrollbar { display: none; } /* ── Profile list ────────────────────────────────────────────────────── */ .profile-list { display: flex; flex-direction: column; gap: 8px; min-height: 60px; padding-bottom: 4px; } .profile-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 32px 0 20px; color: var(--c-txt-2); font-size: 0.8rem; text-align: center; line-height: 1.6; } .profile-empty svg { flex-shrink: 0; } .profile-empty strong { color: rgba(var(--c-fg-rgb),0.5); } /* ── Profile card ────────────────────────────────────────────────────── */ .profile-card { display: flex; align-items: center; gap: 12px; padding: 14px 14px 14px 12px; border-radius: var(--r-md); border: 1px solid var(--c-card-border); background: var(--c-card); backdrop-filter: blur(10px); transition: all var(--t-fast); cursor: pointer; } .profile-card:hover { border-color: rgba(var(--c-fg-rgb),0.14); background: var(--c-card-hover); } .profile-card.active { border-color: rgba(var(--c-fg-rgb),0.4); background: rgba(var(--c-fg-rgb),0.06); } .profile-radio { width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid var(--c-txt-3); flex-shrink: 0; display: flex; align-items: center; justify-content: center; transition: all var(--t-fast); } .profile-card.active .profile-radio { border-color: var(--c-accent); } .profile-radio-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--c-accent); transform: scale(0); transition: transform var(--t-fast); } .profile-card.active .profile-radio-dot { transform: scale(1); } .profile-info { flex: 1; min-width: 0; } .profile-name { font-size: 0.88rem; font-weight: 600; color: var(--c-txt-1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .profile-server { font-size: 0.72rem; font-family: 'JetBrains Mono', monospace; color: var(--c-txt-2); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .profile-transport-badge { font-size: 0.58rem; font-weight: 700; letter-spacing: 0.5px; padding: 2px 5px; border-radius: 4px; background: rgba(var(--c-fg-rgb),0.06); color: var(--c-txt-2); text-transform: uppercase; flex-shrink: 0; } .profile-actions { display: flex; gap: 4px; flex-shrink: 0; } .profile-action-btn { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; border-radius: var(--r-xs); color: var(--c-txt-2); transition: all var(--t-fast); } .profile-action-btn:hover { color: var(--c-txt-1); background: rgba(var(--c-fg-rgb),0.07); } /* ── Section dividers ────────────────────────────────────────────────── */ .section-divider { display: flex; align-items: center; gap: 10px; margin: 18px 0 10px; color: var(--c-txt-2); font-size: 0.62rem; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; } .section-divider::after { content: ''; flex: 1; height: 1px; background: rgba(var(--c-fg-rgb),0.06); } .section-divider-mini { display: flex; align-items: center; gap: 8px; margin: 12px 0 8px; color: var(--c-txt-3); font-size: 0.58rem; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; } .section-divider-mini::after { content: ''; flex: 1; height: 1px; background: rgba(var(--c-fg-rgb),0.04); } /* ── Client settings card ────────────────────────────────────────────── */ .client-settings-card { background: var(--c-card); border: 1px solid var(--c-card-border); border-radius: var(--r-lg); overflow: hidden; } /* ── Toggles ─────────────────────────────────────────────────────────── */ .toggle-row { display: flex; align-items: center; justify-content: space-between; padding: 13px 14px; border-top: 1px solid rgba(var(--c-fg-rgb),0.04); transition: background var(--t-fast); } .toggle-row:first-child { border-top: none; } .toggle-row:hover { background: rgba(var(--c-fg-rgb),0.025); } .toggle-row.sub-row { padding-left: 30px; } .toggle-text { display: flex; flex-direction: column; gap: 2px; } .toggle-name { font-size: 0.83rem; font-weight: 500; color: var(--c-txt-1); } .toggle-hint { font-size: 0.68rem; color: var(--c-txt-2); } /* CSS toggle switch */ .toggle { position: relative; display: inline-block; flex-shrink: 0; cursor: pointer; } .toggle input { opacity: 0; width: 0; height: 0; position: absolute; } .toggle-track { display: block; width: 36px; height: 20px; border-radius: var(--r-full); background: rgba(var(--c-fg-rgb),0.08); border: 1px solid rgba(var(--c-fg-rgb),0.1); transition: all var(--t-med); position: relative; } .toggle input:checked ~ .toggle-track { background: rgba(var(--c-fg-rgb),0.15); border-color: rgba(var(--c-fg-rgb),0.35); } .toggle-thumb { position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: var(--c-txt-2); transition: all var(--t-med); } .toggle input:checked ~ .toggle-track .toggle-thumb { transform: translateX(16px); background: var(--c-accent); } .toggle-with-gear { display: flex; align-items: center; gap: 10px; } .gear-btn { width: 26px; height: 26px; display: flex; align-items: center; justify-content: center; border-radius: var(--r-xs); color: var(--c-txt-2); transition: all var(--t-fast); background: transparent; } .gear-btn:hover { color: var(--c-txt-1); background: rgba(var(--c-fg-rgb),0.07); } :root.light .gear-btn:hover { background: rgba(0,0,0,0.05); } /* ── Inline field (label + input on one line) ────────────────────────── */ .inline-field { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-top: 1px solid rgba(var(--c-fg-rgb),0.04); gap: 12px; } .inline-field.sub-row { padding-left: 30px; } .inline-field .field-label { font-size: 0.83rem; font-weight: 500; color: var(--c-txt-1); white-space: nowrap; flex-shrink: 0; text-transform: none; letter-spacing: 0; } /* ── Form fields ─────────────────────────────────────────────────────── */ .field-group { display: flex; flex-direction: column; gap: 5px; margin-bottom: 12px; } .field-group:last-child { margin-bottom: 0; } .field-label { font-size: 0.6rem; font-weight: 700; color: var(--c-txt-2); text-transform: uppercase; letter-spacing: 0.8px; } .field-input { width: 100%; background: rgba(var(--c-fg-rgb),0.05); border: 1px solid rgba(var(--c-fg-rgb),0.08); border-radius: var(--r-sm); padding: 9px 11px; color: var(--c-txt-1); font-size: 0.83rem; outline: none; transition: border-color var(--t-fast), box-shadow var(--t-fast); } .field-input:focus { border-color: rgba(var(--c-fg-rgb),0.3); box-shadow: 0 0 0 3px rgba(var(--c-fg-rgb),0.04); } .field-input::placeholder { color: var(--c-txt-3); } .field-input.mono { font-family: 'JetBrains Mono', monospace; font-size: 0.8rem; } .field-input.compact { width: 110px; padding: 6px 9px; font-size: 0.8rem; } textarea.field-input { resize: none; line-height: 1.4; height: auto; } /* Input with icon (password reveal) */ .input-wrap { position: relative; } .field-input.has-icon { padding-right: 36px; } .peek-btn { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); color: var(--c-txt-3); transition: color var(--t-fast); } .peek-btn:hover { color: var(--c-txt-1); } /* ── Buttons ─────────────────────────────────────────────────────────── */ .btn { height: 36px; padding: 0 16px; border-radius: var(--r-sm); font-size: 0.78rem; font-weight: 600; letter-spacing: 0.2px; transition: all var(--t-fast); flex-shrink: 0; } .btn.primary { background: var(--c-accent); color: #000; border: none; } .btn.primary:hover { opacity: 0.88; } .btn.secondary { background: transparent; color: var(--c-txt-2); border: 1px solid var(--c-card-border); } .btn.secondary:hover { border-color: rgba(var(--c-fg-rgb),0.2); color: var(--c-txt-1); } .btn.danger { background: rgba(255,95,95,0.12); color: var(--c-red); border: 1px solid rgba(255,95,95,0.2); } .btn.danger:hover { background: rgba(255,95,95,0.2); } .btn:active { transform: scale(0.96); } /* ── Add profile dropdown menu ───────────────────────────────────────── */ .add-menu { position: absolute; top: 56px; right: 20px; z-index: 100; background: #1a1a1a; border: 1px solid rgba(var(--c-fg-rgb),0.12); border-radius: var(--r-md); overflow: hidden; box-shadow: 0 16px 48px rgba(0,0,0,0.8); animation: menu-in 0.18s cubic-bezier(0.34,1.56,0.64,1); } .add-menu.hidden { display: none; } @keyframes menu-in { from { opacity: 0; transform: scale(0.92) translateY(-6px); transform-origin: top right; } to { opacity: 1; transform: scale(1) translateY(0); transform-origin: top right; } } .add-menu-item { display: flex; align-items: center; gap: 10px; padding: 11px 18px; width: 100%; font-size: 0.83rem; font-weight: 500; color: var(--c-txt-1); background: transparent; border: none; border-bottom: 1px solid rgba(var(--c-fg-rgb),0.05); transition: background var(--t-fast); min-width: 180px; text-align: left; } .add-menu-item:last-child { border-bottom: none; } .add-menu-item:hover { background: rgba(var(--c-fg-rgb),0.06); } .add-menu-item svg { color: var(--c-txt-2); flex-shrink: 0; } /* ── Modals ──────────────────────────────────────────────────────────── */ .modal-overlay { position: fixed; inset: 0; z-index: 200; background: rgba(0,0,0,0.75); display: flex; align-items: center; justify-content: center; backdrop-filter: blur(4px); animation: overlay-in 0.2s ease; } .modal-overlay.hidden { display: none; } @keyframes overlay-in { from { opacity: 0; } to { opacity: 1; } } .modal-content { background: #111111; border: 1px solid rgba(var(--c-fg-rgb),0.1); border-radius: var(--r-lg); padding: 20px; width: calc(100% - 40px); max-width: 360px; box-shadow: 0 24px 64px rgba(0,0,0,0.9); animation: modal-in 0.25s cubic-bezier(0.34,1.2,0.64,1); } .modal-content.compact { max-width: 300px; } @keyframes modal-in { from { opacity: 0; transform: scale(0.94) translateY(8px); } to { opacity: 1; transform: scale(1) translateY(0); } } .modal-title { font-size: 1rem; font-weight: 700; color: var(--c-txt-1); margin-bottom: 14px; } .modal-text { font-size: 0.78rem; color: var(--c-txt-2); line-height: 1.5; margin-bottom: 14px; } .modal-steps { padding-left: 18px; font-size: 0.78rem; color: var(--c-txt-2); line-height: 1.8; margin-bottom: 16px; } .modal-steps code { font-family: 'JetBrains Mono', monospace; font-size: 0.75rem; color: var(--c-txt-1); background: rgba(var(--c-fg-rgb),0.06); padding: 1px 5px; border-radius: 3px; } .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; } /* ── Share QR ────────────────────────────────────────────────────────── */ .share-qr { display: flex; justify-content: center; margin: 8px 0 12px; } .share-qr svg { width: 200px; height: 200px; background: #fff; border-radius: var(--r-sm); padding: 10px; } #share-link { margin-bottom: 0; font-size: 0.72rem; } /* ── Toast ───────────────────────────────────────────────────────────── */ .toast { position: fixed; bottom: 28px; left: 50%; transform: translateX(-50%); z-index: 500; background: rgba(24,24,24,0.96); border: 1px solid rgba(var(--c-fg-rgb),0.1); color: var(--c-txt-1); font-size: 0.78rem; font-weight: 500; padding: 9px 18px; border-radius: var(--r-full); white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.22s ease, transform 0.22s ease; transform: translateX(-50%) translateY(6px); box-shadow: 0 8px 32px rgba(0,0,0,0.7); backdrop-filter: blur(12px); } .toast.show { opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0); } .toast.is-error { border-color: rgba(255,95,95,0.4); color: #ff9a9a; } .toast.is-ok { border-color: rgba(200,255,200,0.2); color: #a0f0b0; }