/* x0gp · PoC web client stylesheet Минималистичный тёмный UI. Без зависимостей, без сборки. */ * { box-sizing: border-box; } html, body { margin: 0; padding: 0; height: 100%; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif; background: #0e1117; color: #e6edf3; font-size: 14px; line-height: 1.4; } .topbar { display: flex; align-items: center; gap: 18px; padding: 10px 16px; background: #161b22; border-bottom: 1px solid #30363d; } .brand .logo { font-weight: 700; letter-spacing: 0.5px; color: #58a6ff; font-size: 18px; } .brand .tag { margin-left: 8px; padding: 2px 6px; font-size: 11px; background: #1f6feb; color: #fff; border-radius: 4px; text-transform: uppercase; } .conn { padding: 4px 10px; border-radius: 4px; background: #6e7681; color: #fff; font-size: 12px; } .conn.connected { background: #2ea043; } .conn.connecting { background: #d29922; } .conn.error { background: #f85149; } .hud-top { margin-left: auto; display: flex; gap: 14px; font-size: 12px; color: #8b949e; } .hud-top b { color: #e6edf3; font-weight: 600; } .layout { display: grid; grid-template-columns: 1fr 360px; gap: 16px; padding: 16px; align-items: start; } /* Track canvas */ .track-wrap { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 12px; } .track-wrap canvas { width: 100%; height: auto; display: block; background: #0a0d12; border-radius: 4px; image-rendering: pixelated; } .legend { display: flex; gap: 16px; margin-top: 8px; font-size: 12px; color: #8b949e; } .legend i.dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 4px; vertical-align: middle; } .dot.me { background: #58a6ff; } .dot.other { background: #f0883e; } .dot.ghost { background: #d29922; } /* Controls aside */ .controls { display: flex; flex-direction: column; gap: 12px; } .card { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 12px; } .card h3 { margin: 0 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px; color: #8b949e; } .card label { display: block; font-size: 12px; color: #8b949e; margin-bottom: 8px; } .card input[type=text] { display: block; width: 100%; margin-top: 4px; padding: 6px 8px; background: #0e1117; border: 1px solid #30363d; border-radius: 4px; color: #e6edf3; font-family: inherit; font-size: 13px; } .card input[type=text]:focus { outline: none; border-color: #58a6ff; } .btn-row { display: flex; gap: 6px; margin-top: 8px; } .btn { flex: 1; padding: 6px 10px; background: #21262d; border: 1px solid #30363d; border-radius: 4px; color: #e6edf3; cursor: pointer; font-size: 12px; font-family: inherit; } .btn:hover:not(:disabled) { background: #30363d; } .btn:disabled { opacity: 0.4; cursor: not-allowed; } .btn.primary { background: #238636; border-color: #2ea043; } .btn.primary:hover:not(:disabled) { background: #2ea043; } .hint { margin: 0 0 8px; font-size: 11px; color: #8b949e; } /* Pedals / bars */ .pedals { display: flex; flex-direction: column; gap: 6px; } .bar { display: grid; grid-template-columns: 60px 1fr 44px; gap: 8px; align-items: center; font-size: 12px; } .bar-track { position: relative; height: 12px; background: #0e1117; border: 1px solid #30363d; border-radius: 3px; overflow: hidden; } .bar-fill { position: absolute; top: 0; bottom: 0; left: 50%; width: 0%; transition: left 60ms linear, width 60ms linear; } .bar-fill.green { background: #2ea043; } .bar-fill.red { background: #f85149; } .bar-fill.blue { background: #58a6ff; } .bar b { text-align: right; font-variant-numeric: tabular-nums; color: #e6edf3; font-size: 12px; } /* Steering wheel visual */ .wheel { display: flex; justify-content: center; margin-top: 10px; } .wheel-disc { width: 90px; height: 90px; border-radius: 50%; background: radial-gradient(circle at center, #30363d 0%, #21262d 70%); border: 2px solid #484f58; position: relative; transition: transform 80ms linear; } .wheel-disc::after { content: ''; position: absolute; top: 4px; left: 50%; width: 4px; height: 14px; background: #f0883e; transform: translateX(-50%); border-radius: 2px; } /* Telemetry */ .tel { display: grid; grid-template-columns: 100px 1fr; gap: 4px 12px; margin: 0; font-size: 12px; } .tel dt { color: #8b949e; } .tel dd { margin: 0; font-variant-numeric: tabular-nums; color: #e6edf3; } /* Log */ .log-card .log { margin: 0; padding: 8px; background: #0a0d12; border: 1px solid #30363d; border-radius: 4px; height: 160px; overflow-y: auto; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 11px; line-height: 1.45; color: #c9d1d9; white-space: pre-wrap; word-break: break-word; } .log .l-info { color: #58a6ff; } .log .l-warn { color: #d29922; } .log .l-error { color: #f85149; } .log .l-rx { color: #2ea043; } .log .l-tx { color: #f0883e; } .log .l-meta { color: #8b949e; } @media (max-width: 900px) { .layout { grid-template-columns: 1fr; } }