/* Autonomous Traders dashboard, dark by default. Palette: accent yellow #ecad0a, blue #209dd7, purple #753991, elegant greys. No gradients in the chrome; the only gradient is the soft fill under each chart. */ :root { --yellow: #ecad0a; --blue: #209dd7; --purple: #753991; --trend-up: #3fbf7f; --trend-down: #e05560; --flash-up: #6fe8a8; --flash-down: #ff7b86; } :root[data-theme="dark"] { --bg: #0f1115; --bg-raised: #171a21; --bg-sunk: #0a0c10; --border: #2a2f38; --grid: #232831; --fg: #e6e8ec; --fg-muted: #8a93a1; --fg-dim: #5d6672; } :root[data-theme="light"] { --bg: #f6f7f9; --bg-raised: #ffffff; --bg-sunk: #edf0f3; --border: #dadfe5; --grid: #e8ecf1; --fg: #1a1d22; --fg-muted: #5b6470; --fg-dim: #8a93a1; } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; height: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif; font-size: 14px; background: var(--bg); color: var(--fg); } body { display: grid; grid-template-columns: 220px 1fr; /* Lock the body to the viewport so each panel row (1fr) has a concrete size for uPlot's canvas to fill. Without this, 1fr falls back to content height and the chart collapses to its minimum. */ height: 100vh; overflow: hidden; } /* ---- Sidebar ---- */ .sidebar { display: flex; flex-direction: column; gap: 20px; padding: 24px 18px; background: var(--bg-raised); border-right: 1px solid var(--border); overflow-y: auto; } .brand-block { display: flex; flex-direction: column; gap: 3px; } .brand { margin: 0; font-size: 20px; font-weight: 700; letter-spacing: 0.01em; line-height: 1.15; color: var(--yellow); } .brand-sub { margin: 0; font-size: 10px; text-transform: uppercase; letter-spacing: 0.16em; color: var(--fg-dim); } .market { display: flex; flex-direction: column; gap: 7px; padding: 16px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); } .market-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--fg-dim); } .market-badge { display: inline-flex; align-items: center; gap: 8px; font-size: 15px; font-weight: 600; color: var(--fg); } .market-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--fg-muted); } .market-badge[data-source="simulator"] .market-dot { background: var(--blue); } .market-badge[data-source="massive"] .market-dot { background: var(--trend-up); } .market-status { font-size: 11px; color: var(--fg-muted); } .returns { display: flex; flex-direction: column; gap: 8px; } .returns-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--fg-dim); } .returns-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 7px; } .returns-row { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; } .returns-name { font-size: 13px; color: var(--fg); } .returns-pct { font-variant-numeric: tabular-nums; font-size: 13px; font-weight: 600; color: var(--fg-muted); } .returns-pct[data-trend="up"] { color: var(--trend-up); } .returns-pct[data-trend="down"] { color: var(--trend-down); } .sidebar-spacer { flex: 1; } .theme-toggle { align-self: flex-start; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; border-radius: 6px; border: 1px solid var(--border); background: transparent; color: var(--fg-muted); cursor: pointer; transition: color 120ms, border-color 120ms; } .theme-toggle:hover { color: var(--fg); border-color: var(--fg-muted); } .theme-icon { display: none; } [data-theme="dark"] .icon-moon { display: block; } [data-theme="light"] .icon-sun { display: block; } /* ---- Panels ---- */ .panels { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 12px; padding: 12px; min-height: 0; } .panel { display: grid; grid-template-rows: auto 2fr minmax(44px, 84px) 1fr; gap: 10px; padding: 16px; background: var(--bg-raised); border: 1px solid var(--border); border-radius: 10px; min-height: 0; overflow: hidden; cursor: pointer; transition: border-color 200ms, box-shadow 200ms; } .panel:hover, .panel:focus-visible { outline: none; border-color: var(--fg-muted); box-shadow: 0 0 0 1px var(--fg-muted); } /* Live leader: the trader with the highest portfolio value right now. */ .panel[data-leader="true"] { border-color: var(--yellow); box-shadow: 0 0 0 1px var(--yellow), 0 0 20px color-mix(in srgb, var(--yellow) 22%, transparent); } .panel-head { display: flex; flex-direction: column; align-items: center; gap: 2px; text-align: center; } .panel-name { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.12em; color: var(--fg); } .panel-sub { font-size: 11px; color: var(--fg-muted); } .panel-value { font-variant-numeric: tabular-nums; font-size: 34px; font-weight: 500; color: var(--fg); line-height: 1.15; margin-top: 4px; } .panel-value[data-trend="up"] { color: var(--trend-up); } .panel-value[data-trend="down"] { color: var(--trend-down); } .panel-pnl { font-variant-numeric: tabular-nums; font-size: 13px; font-weight: 600; color: var(--fg-muted); } .panel-pnl[data-trend="up"] { color: var(--trend-up); } .panel-pnl[data-trend="down"] { color: var(--trend-down); } .panel-strategy { margin-top: 6px; max-width: 94%; font-size: 11px; line-height: 1.4; color: var(--fg-muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; cursor: default; } .panel-strategy.empty { color: var(--fg-dim); font-style: italic; } .panel-chart { min-height: 120px; min-width: 0; height: 100%; position: relative; overflow: hidden; } /* ---- Heatmap ---- */ .heatmap { display: flex; flex-wrap: wrap; gap: 4px; min-height: 44px; background: var(--bg-sunk); border: 1px solid var(--border); border-radius: 6px; padding: 4px; overflow-y: auto; align-content: flex-start; } .heatmap[data-empty="true"]::before { content: "No holdings"; display: grid; place-items: center; width: 100%; color: var(--fg-dim); font-size: 12px; } .heatmap-tile { display: flex; flex-direction: column; justify-content: space-between; padding: 6px 8px; min-width: 56px; flex-basis: 0; border-radius: 4px; background: color-mix(in srgb, var(--trend-up) 20%, var(--bg-sunk)); color: var(--fg); font-variant-numeric: tabular-nums; transition: background 180ms; } .heatmap-tile[data-pnl="down"] { background: color-mix(in srgb, var(--trend-down) 20%, var(--bg-sunk)); } .heatmap-ticker { font-weight: 600; font-size: 11px; letter-spacing: 0.06em; } .heatmap-value { font-size: 11px; color: var(--fg-muted); } .heatmap-tile.flash-up { animation: flash-up 600ms ease-out; } .heatmap-tile.flash-down { animation: flash-down 600ms ease-out; } @keyframes flash-up { 0% { background: var(--flash-up); } 100% { background: color-mix(in srgb, var(--trend-up) 20%, var(--bg-sunk)); } } @keyframes flash-down { 0% { background: var(--flash-down); } 100% { background: color-mix(in srgb, var(--trend-down) 20%, var(--bg-sunk)); } } /* ---- Log ---- */ .log { height: 100%; overflow-y: auto; background: var(--bg-sunk); border: 1px solid var(--border); border-radius: 6px; padding: 6px 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; line-height: 1.5; } .log-empty { color: var(--fg-dim); font-style: italic; } .log-row { display: flex; gap: 6px; padding: 1px 0; align-items: baseline; white-space: nowrap; } .log-time { flex: none; color: var(--fg-dim); } .log-type { flex: none; text-transform: uppercase; font-size: 9px; letter-spacing: 0.08em; font-weight: 700; } .log-text { flex: 1; min-width: 0; color: var(--fg-muted); overflow: hidden; text-overflow: ellipsis; } /* ---- Bottom row: activity log + recent trades ---- */ .panel-bottom { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; min-height: 0; } .panel-col { display: grid; grid-template-rows: auto 1fr; gap: 4px; min-height: 0; } .panel-col-label { font-size: 9px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--fg-dim); } .txns { height: 100%; overflow-y: auto; background: var(--bg-sunk); border: 1px solid var(--border); border-radius: 6px; padding: 6px 8px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; line-height: 1.5; } .txn-empty { color: var(--fg-dim); font-style: italic; } .txn-row { display: flex; gap: 6px; padding: 1px 0; align-items: baseline; white-space: nowrap; } .txn-date { flex: none; color: var(--fg-dim); } .txn-side { flex: none; font-size: 9px; font-weight: 700; letter-spacing: 0.06em; } .txn-side[data-side="buy"] { color: var(--trend-up); } .txn-side[data-side="sell"] { color: var(--trend-down); } .txn-detail { flex: 1; min-width: 0; color: var(--fg-muted); overflow: hidden; text-overflow: ellipsis; } /* ---- Modal ---- */ #modal-root { display: none; position: fixed; inset: 0; z-index: 1000; } #modal-root.open { display: block; } .modal-backdrop { display: grid; place-items: center; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(2px); } .modal-card { display: flex; flex-direction: column; width: 90vw; max-width: 960px; height: 85vh; background: var(--bg-raised); border: 1px solid var(--border); border-radius: 12px; padding: 24px; overflow: hidden; } .modal-loading { display: grid; place-items: center; color: var(--fg-muted); font-size: 16px; } .modal-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex: none; } .modal-trader-name { font-size: 18px; font-weight: 700; color: var(--fg); } .modal-trader-sub { font-size: 13px; color: var(--fg-muted); flex: 1; } .modal-close { flex: none; width: 32px; height: 32px; padding: 0; border: 1px solid var(--border); border-radius: 6px; background: transparent; color: var(--fg-muted); font-size: 20px; line-height: 1; cursor: pointer; display: grid; place-items: center; transition: color 120ms, border-color 120ms; } .modal-close:hover { color: var(--fg); border-color: var(--fg-muted); } .modal-body { display: flex; flex-direction: column; gap: 16px; flex: 1; min-height: 0; } .modal-chart { flex: 1; min-height: 200px; position: relative; } .modal-bottom { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; flex: 1; min-height: 0; } .modal-col { display: flex; flex-direction: column; gap: 4px; min-height: 0; } .modal-col-label { font-size: 9px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--fg-dim); flex: none; } .modal-log, .modal-txns { flex: 1; min-height: 0; }