/* style.css — extracted verbatim from swan_dashboard.py's inline <style>
   block. No visual changes; this is a pure extraction. */

*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{background:#0F172A;color:#E2E8F0;font-family:Inter,system-ui,-apple-system,sans-serif;font-size:13px;height:100vh;display:flex;flex-direction:column;overflow:hidden}
header{padding:10px 18px;border-bottom:1px solid #1E293B;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;position:relative}
header h1{font-size:14px;font-weight:600;color:#F59E0B;letter-spacing:-.01em}
header .tz-note{position:absolute;left:50%;transform:translateX(-50%);font-size:11px;color:#475569;text-align:center;white-space:nowrap}
header .sub{font-size:11px;color:#334155}
.layout{display:flex;flex:1;overflow:hidden}
.left{width:252px;border-right:1px solid #1E293B;display:flex;flex-direction:column;flex-shrink:0}
.controls{padding:10px 12px;border-bottom:1px solid #1E293B;flex-shrink:0}
.upload-row{display:flex;align-items:center;gap:8px;margin-bottom:4px}
.upload-btn{background:#1E293B;border:1px solid #334155;border-radius:4px;color:#F59E0B;font-size:11px;font-weight:600;padding:4px 10px;cursor:pointer;transition:background .1s,border-color .1s;white-space:nowrap;flex-shrink:0}
.upload-btn:hover{background:#334155;border-color:#F59E0B}
.upload-btn.disabled{opacity:.5;pointer-events:none}
.upload-status{font-size:10px;color:#64748B;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.upload-status.err{color:#EF4444}
.upload-status.ok{color:#4ade80}
.upload-note{font-size:9px;color:#334155;margin-bottom:8px}
.input-row{display:flex;align-items:center;gap:6px;margin-bottom:6px}
.input-label{font-size:11px;color:#64748B;white-space:nowrap}
input[type=number]{width:58px;background:#0F172A;border:1px solid #334155;border-radius:4px;color:#E2E8F0;font-size:12px;padding:4px 6px;text-align:right;-moz-appearance:textfield}
input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}
input[type=number]:focus{outline:none;border-color:#F59E0B}
.pct-sym{font-size:11px;color:#64748B}
.go-btn{background:#1E293B;border:1px solid #334155;border-radius:4px;color:#F59E0B;font-size:11px;font-weight:600;padding:4px 10px;cursor:pointer;transition:background .1s,border-color .1s}
.go-btn:hover{background:#334155;border-color:#F59E0B}
.go-btn:active{background:#F59E0B;color:#0F172A}
.event-count{font-size:11px;color:#475569}
.event-list{flex:1;overflow-y:auto;overflow-x:hidden}
.event-list::-webkit-scrollbar{width:4px}
.event-list::-webkit-scrollbar-track{background:transparent}
.event-list::-webkit-scrollbar-thumb{background:#334155;border-radius:2px}
.event-item{padding:9px 12px;border-bottom:1px solid #1E293B;cursor:pointer;border-left:2px solid transparent;transition:background .1s}
.event-item:hover{background:#1E293B}
.event-item.selected{background:#172033;border-left-color:#F59E0B}
.ev-date{font-size:10px;color:#475569;margin-bottom:4px;font-variant-numeric:tabular-nums}
.ev-row{display:flex;align-items:baseline;justify-content:space-between;gap:6px}
.ev-pfl{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.pfl-low{color:#64748B}.pfl-mid{color:#F59E0B}.pfl-high{color:#EF4444}
.ev-tags{display:flex;align-items:center;gap:4px;flex-shrink:0}
.tag{font-size:9px;font-weight:500;padding:1px 5px;border-radius:3px;background:#1E293B;color:#94A3B8;letter-spacing:.02em}
.tag-buy{background:#052e16;color:#4ade80}.tag-sell{background:#2d0a0a;color:#f87171}
.tag-old{background:#2d1b00;color:#fbbf24}.tag-sr{background:#0d1f3c;color:#60a5fa}
/* ── Right panel ── */
.right{flex:1;display:flex;flex-direction:column;overflow:hidden}
.right-placeholder{flex:1;display:flex;align-items:center;justify-content:center;color:#1E293B;font-size:13px;user-select:none}
.placeholder{text-align:center;line-height:2}
.placeholder .arrow{font-size:28px;display:block;margin-bottom:8px}
/* ── Chart layout ── */
.chart-header{padding:7px 14px;border-bottom:1px solid #1E293B;display:flex;align-items:center;gap:8px;flex-shrink:0;min-height:38px}
.chart-header .ev-pfl{font-size:16px}
.chart-meta{margin-left:auto;display:flex;align-items:center;gap:14px;font-size:10px;color:#475569}
.chart-controls{padding:5px 14px;border-bottom:1px solid #1E293B;display:flex;align-items:center;gap:0;flex-shrink:0;flex-wrap:wrap}
.ctrl-group{display:flex;align-items:center;gap:6px;padding:0 10px}
.ctrl-group:first-child{padding-left:0}
.ctrl-sep{width:1px;height:14px;background:#1E293B;flex-shrink:0}
.ctrl-lbl{font-size:9px;color:#475569;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}
.ctrl-group label{display:flex;align-items:center;gap:3px;cursor:pointer;color:#64748B;font-size:10px;white-space:nowrap;user-select:none}
.ctrl-group label:hover{color:#94A3B8}
.ctrl-group label input{accent-color:#60A5FA;cursor:pointer;width:11px;height:11px}
.ema-dot{display:inline-block;width:14px;height:2px;border-radius:1px;vertical-align:middle;margin-right:1px}
.chart-body{flex:1;position:relative;min-height:0}
#plotly-chart{position:absolute;top:0;left:0;right:0;bottom:0}
.chart-nodata{display:flex;align-items:center;justify-content:center;height:100%;color:#334155;font-size:11px}
/* ── Busy overlay (upload/processing) ──
   Covers the whole viewport (position:fixed) so it blocks interaction with
   BOTH the basket list and the chart panel while a report is uploading or
   being processed server-side — not just a small inline status message.
   Toggled via the .hidden class, never removed from the DOM. */
.busy-overlay{position:fixed;inset:0;background:rgba(15,23,42,.88);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;z-index:100}
.busy-overlay.hidden{display:none}
.busy-spinner{width:34px;height:34px;border-radius:50%;border:3px solid #1E293B;border-top-color:#F59E0B;animation:busy-spin .8s linear infinite}
.busy-text{font-size:13px;color:#E2E8F0;font-weight:500}
@keyframes busy-spin{to{transform:rotate(360deg)}}
/* ── Login overlay (two-stage password gate) ──
   Full-viewport, opaque (not translucent like busy-overlay — nothing behind
   it should be visible/interactive until authenticated). Higher z-index
   than busy-overlay since it's the outermost gate. Shown by default in the
   HTML (not .hidden) — index.html/app.js/style.css load unauthenticated,
   but no real data is fetched until stage2 succeeds; see auth.py /
   AUTH_DEPLOY_PLAN.md. Deliberately no "remember me" — closing/reloading
   this tab always comes back here. */
.login-overlay{position:fixed;inset:0;background:#0F172A;display:flex;align-items:center;justify-content:center;z-index:200}
.login-overlay.hidden{display:none}
.login-box{width:220px;display:flex;flex-direction:column;gap:10px}
.login-title{font-size:13px;font-weight:600;color:#F59E0B;letter-spacing:-.01em;text-align:center;margin-bottom:4px}
.login-stage{display:flex;flex-direction:column;gap:8px}
.login-stage.hidden{display:none}
input[type=password]{background:#0F172A;border:1px solid #334155;border-radius:4px;color:#E2E8F0;font-size:12px;padding:7px 10px;width:100%}
input[type=password]:focus{outline:none;border-color:#F59E0B}
.login-btn{background:#1E293B;border:1px solid #334155;border-radius:4px;color:#F59E0B;font-size:11px;font-weight:600;padding:7px 10px;cursor:pointer;transition:background .1s,border-color .1s;width:100%}
.login-btn:hover{background:#334155;border-color:#F59E0B}
.login-btn:active{background:#F59E0B;color:#0F172A}
.login-btn:disabled{opacity:.5;pointer-events:none}
.login-error{font-size:10px;color:#EF4444;min-height:12px;text-align:center}
