Files
set50-system/frontend/src/style.css
Kunthawat Greethong fc592d8aa9 [verified] Real backtest engine + backtest UI section (start/end dates, P&L, persisted)
- backtest.py: buy-and-hold backtest over [start,end] — allocates 50/20/30 at first available rebalance date, marks to market to end, accrues dividend, reports {final_value, price_pnl, dividend_income, net_return, trades, holdings}
- Fixed double-spend bug (was allocating full capital every rebalance -> negative cash)
- dashboard.default_scores(): per-symbol combined/dividend/yield baseline for backtest
- POST /api/v1/backtest + GET /api/v1/backtest/runs (results persisted in app state -> survive refresh)
- Frontend: backtest section w/ start/end/capital/freq inputs + P&L KPIs + run history table
- Honest note: uses current combined scores as static baseline (non-PIT); PIT score_fn pluggable
- Verified: 1M -> 1.088M (+8.80%) over 2024-06..2026-06; history persists across refresh
2026-08-26 16:00:17 +07:00

328 lines
24 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import url('https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=Manrope:wght@400;500;600;700;800&display=swap');
:root {
color-scheme: dark;
font-family: 'Manrope', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
color: #edf2f7;
background: #0b1018;
font-synthesis: none;
text-rendering: optimizeLegibility;
--bg: #0b1018;
--panel: #111925;
--panel-soft: #151f2d;
--line: #263344;
--line-bright: #35465c;
--text: #edf2f7;
--muted: #8794a6;
--faint: #5b6a7e;
--mint: #52d6bd;
--mint-soft: rgba(82, 214, 189, 0.12);
--amber: #e6b96c;
--amber-soft: rgba(230, 185, 108, 0.12);
--red: #ef8b8b;
--red-soft: rgba(239, 139, 139, 0.12);
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body { margin: 0; min-width: 320px; background: var(--bg); }
button, input { font: inherit; }
button { cursor: pointer; }
.app-shell { min-height: 100vh; display: flex; background: radial-gradient(circle at 85% -10%, rgba(82, 214, 189, 0.08), transparent 32rem), var(--bg); }
.sidebar { width: 248px; flex: 0 0 248px; min-height: 100vh; padding: 28px 18px 22px; border-right: 1px solid var(--line); display: flex; flex-direction: column; background: rgba(11, 16, 24, 0.76); }
.brand-lockup { display: flex; align-items: center; gap: 11px; padding: 0 9px 33px; }
.brand-mark { width: 32px; height: 32px; display: grid; place-items: center; border: 1px solid rgba(82, 214, 189, .7); border-radius: 9px; color: var(--mint); font: 500 11px 'DM Mono', monospace; letter-spacing: -.08em; box-shadow: 0 0 24px rgba(82, 214, 189, .12); }
.brand-name { font-size: 13px; font-weight: 800; letter-spacing: .01em; }
.brand-caption { margin-top: 2px; color: var(--faint); font: 10px 'DM Mono', monospace; }
.nav-stack { display: grid; gap: 5px; }
.nav-item { display: flex; align-items: center; gap: 11px; padding: 11px 12px; border: 1px solid transparent; border-radius: 8px; color: var(--muted); text-decoration: none; font-size: 12px; font-weight: 600; transition: .2s ease; }
.nav-item:hover { color: var(--text); background: rgba(255,255,255,.025); }
.nav-item.active { color: var(--mint); background: var(--mint-soft); border-color: rgba(82,214,189,.18); }
.nav-glyph { width: 16px; color: currentColor; font-size: 15px; text-align: center; }
.sidebar-footer { margin-top: auto; padding: 12px 8px 0; }
.mode-card { display: flex; gap: 10px; align-items: center; padding: 12px; border: 1px solid var(--line); border-radius: 10px; background: rgba(255,255,255,.02); }
.mode-dot, .freshness-dot { width: 7px; height: 7px; flex: 0 0 7px; border-radius: 99px; background: var(--mint); box-shadow: 0 0 12px var(--mint); }
.mode-label { font-size: 11px; font-weight: 700; }
.mode-detail, .version-line { margin-top: 3px; color: var(--faint); font: 10px 'DM Mono', monospace; }
.version-line { padding: 14px 3px 0; }
.content { width: min(100%, 1440px); margin: 0 auto; padding: 42px clamp(22px, 4vw, 64px) 70px; }
.topbar { display: flex; justify-content: space-between; gap: 24px; align-items: flex-start; padding-bottom: 35px; }
.eyebrow, .section-kicker { color: var(--mint); font: 500 10px 'DM Mono', monospace; letter-spacing: .14em; text-transform: uppercase; }
h1, h2, p { margin: 0; }
h1 { margin-top: 10px; font-size: clamp(28px, 4vw, 46px); line-height: 1.04; letter-spacing: -.055em; }
h2 { margin-top: 7px; font-size: 17px; letter-spacing: -.025em; }
.subtitle { max-width: 560px; margin-top: 12px; color: var(--muted); font-size: 13px; line-height: 1.7; }
.topbar-meta { text-align: right; color: var(--muted); font: 10px 'DM Mono', monospace; }
.freshness-pill { display: inline-flex; align-items: center; gap: 8px; padding: 7px 10px; border: 1px solid rgba(82,214,189,.25); border-radius: 99px; color: var(--mint); background: var(--mint-soft); }
.freshness-pill.pill-fixture { border-color: rgba(230,185,108,.35); color: var(--amber); background: var(--amber-soft); }
.freshness-pill.pill-fixture .freshness-dot { background: var(--amber); box-shadow: 0 0 12px var(--amber); }
.as-of { margin-top: 10px; }
.kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 12px; }
.kpi-card, .panel, .state-card { border: 1px solid var(--line); background: linear-gradient(145deg, rgba(21,31,45,.86), rgba(14,21,31,.94)); box-shadow: 0 18px 42px rgba(0,0,0,.12); }
.kpi-card { min-height: 132px; padding: 19px 19px 16px; border-radius: 10px; }
.accent-card { border-color: rgba(82,214,189,.3); background: linear-gradient(145deg, rgba(25,56,59,.8), rgba(14,31,38,.92)); }
.kpi-label { color: var(--muted); font: 10px 'DM Mono', monospace; text-transform: uppercase; letter-spacing: .08em; }
.kpi-value { margin-top: 12px; color: var(--text); font-size: 29px; font-weight: 700; letter-spacing: -.055em; }
.kpi-unit { margin-left: 4px; color: var(--mint); font: 14px 'DM Mono', monospace; }
.quality-value { font-size: 22px; text-transform: capitalize; }
.kpi-foot { margin-top: 10px; color: var(--faint); font: 10px 'DM Mono', monospace; }
.long-count, .positive-text { color: var(--mint); }
.short-count, .negative-text { color: var(--red); }
.hero-grid, .bottom-grid { display: grid; grid-template-columns: 1.45fr 1fr; gap: 12px; margin-bottom: 12px; }
.panel { border-radius: 10px; padding: 22px; }
.panel-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; }
.confidence-tag, .status-tag { padding: 6px 8px; color: var(--mint); border: 1px solid rgba(82,214,189,.22); border-radius: 6px; background: var(--mint-soft); font: 10px 'DM Mono', monospace; white-space: nowrap; }
.pulse-lead { display: flex; gap: 15px; align-items: baseline; margin: 26px 0 25px; }
.pulse-number { color: var(--mint); font-size: 32px; font-weight: 700; letter-spacing: -.06em; }
.pulse-copy { max-width: 380px; color: var(--muted); font-size: 12px; line-height: 1.6; }
.observation-list { display: grid; gap: 16px; }
.observation-row { display: grid; grid-template-columns: minmax(145px, 1fr) 1.3fr 58px; align-items: center; gap: 14px; }
.observation-name { color: var(--muted); font: 10px 'DM Mono', monospace; text-transform: uppercase; }
.observation-track { height: 6px; overflow: hidden; border-radius: 99px; background: #253140; }
.observation-bar { height: 100%; border-radius: inherit; }
.bar-positive { background: var(--mint); box-shadow: 0 0 16px rgba(82,214,189,.42); }
.bar-negative { background: var(--red); }
.observation-value { text-align: right; font: 11px 'DM Mono', monospace; }
.lineage-panel { display: flex; flex-direction: column; }
.lineage-list { display: grid; gap: 0; margin-top: 24px; border-top: 1px solid var(--line); }
.lineage-item { display: flex; justify-content: space-between; gap: 15px; padding: 13px 0; border-bottom: 1px solid var(--line); color: var(--muted); font-size: 11px; }
.lineage-item strong { color: var(--text); font: 10px 'DM Mono', monospace; text-align: right; }
.lineage-note { margin-top: auto; padding-top: 22px; color: var(--faint); font-size: 11px; line-height: 1.7; }
.signal-panel { padding: 0; overflow: hidden; }
.signal-header { padding: 22px; border-bottom: 1px solid var(--line); }
.signal-header > div:first-child { flex: 1 1 auto; min-width: 0; }
.stock-panel .signal-header { align-items: center; flex-wrap: wrap; }
.stock-panel .panel-subtitle { max-width: 620px; }
.strategy-meta { color: var(--faint); font: 10px 'DM Mono', monospace; }
.strategy-meta span { color: var(--line-bright); padding: 0 5px; }
.table-wrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; min-width: 850px; }
th { padding: 12px 16px; color: var(--faint); border-bottom: 1px solid var(--line); font: 10px 'DM Mono', monospace; font-weight: 400; text-align: left; text-transform: uppercase; letter-spacing: .06em; }
td { padding: 14px 16px; border-bottom: 1px solid rgba(38,51,68,.72); color: var(--muted); font-size: 11px; vertical-align: middle; }
tbody tr:last-child td { border-bottom: 0; }
tbody tr:hover { background: rgba(255,255,255,.025); }
.muted-cell, .score-cell, .target-cell { font-family: 'DM Mono', monospace; }
.symbol-name { display: block; color: var(--text); font-size: 12px; }
.confidence-cell { display: block; margin-top: 4px; color: var(--faint); font: 9px 'DM Mono', monospace; }
.side-pill { display: inline-block; min-width: 52px; padding: 5px 7px; border-radius: 5px; font: 10px 'DM Mono', monospace; text-align: center; }
.side-pill.long { color: var(--mint); background: var(--mint-soft); }
.side-pill.short { color: var(--red); background: var(--red-soft); }
.side-pill.neutral { color: var(--amber); background: var(--amber-soft); }
.reason-code { display: inline-block; margin: 2px 3px 2px 0; padding: 4px 5px; border: 1px solid var(--line-bright); border-radius: 4px; color: var(--faint); font: 9px 'DM Mono', monospace; }
/* ---- Theme panel (multi-theme) ---- */
.theme-panel { margin-top: 18px; }
.theme-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.theme-card { border: 1px solid var(--line-bright); border-radius: 10px; padding: 14px; background: var(--card); }
.theme-card-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.theme-chip { background: var(--accent-soft, rgba(63,161,255,0.12)); color: var(--accent); font: 9px 'DM Mono', monospace; padding: 2px 6px; border-radius: 4px; text-transform: uppercase; }
.theme-label-en { font: 600 12px/1.4 var(--font); color: var(--foreground); }
.theme-label-th { font-weight: 700; margin-bottom: 2px; }
.theme-source { font: 10px 'DM Mono', monospace; color: var(--faint); margin-bottom: 10px; }
.theme-read-value { font-size: 22px; font-weight: 700; color: var(--foreground); }
.theme-read-meta { font-size: 11px; color: var(--faint); margin-top: 2px; }
.theme-read-error { font-size: 11px; color: var(--danger, #e5484d); }
@media (max-width: 720px) { .theme-grid { grid-template-columns: 1fr; } }
/* ---- Rebuilt theme panel: surprise + thesis ---- */
.theme-surprise { display: flex; flex-direction: column; gap: 2px; margin: 8px 0 6px; }
.theme-surprise-label { font-size: 10px; color: var(--faint); }
.theme-surprise-value { font-size: 22px; font-weight: 700; color: var(--accent); }
.theme-thesis { font-size: 11px; color: var(--text-2, #99a); border-top: 1px dashed var(--line-bright); padding-top: 6px; margin-top: 6px; }
.macro-panel { margin-top: 14px; border-top: 1px solid var(--line-bright); padding-top: 12px; }
.macro-chips { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.macro-chip { background: var(--card); border: 1px solid var(--line-bright); border-radius: 6px; padding: 6px 9px; font-size: 11px; }
.macro-chip strong { color: var(--mint); }
/* ---- Lineage / sources table ---- */
.lineage-panel { margin-top: 18px; }
.source-table { width: 100%; border-collapse: collapse; }
.source-table th { text-align: left; font: 700 10px 'DM Mono', monospace; color: var(--faint); padding: 6px 8px; border-bottom: 1px solid var(--line-bright); }
.source-table td { padding: 7px 8px; font-size: 12px; border-bottom: 1px solid var(--line-weak, rgba(255,255,255,.04)); }
.source-name { color: var(--accent); }
.combined-cell { color: var(--mint); font-weight: 600; font-family: 'DM Mono', monospace; }
/* theme tag chips */
.theme-tag { display: inline-block; margin: 2px 3px 2px 0; padding: 2px 6px; border-radius: 4px; background: rgba(63,161,255,.12); color: var(--accent); font-size: 10px; }
.theme-tag.large { font-size: 12px; padding: 4px 8px; }
.clickable-row { cursor: pointer; transition: background .15s ease; }
.clickable-row:hover { background: rgba(63,161,255,.06); }
/* theme narrative (long-form) */
.theme-narrative { font-size: 12px; line-height: 1.6; color: var(--text-2, #9aa); border-top: 1px dashed var(--line-bright); padding-top: 8px; margin-top: 8px; }
/* per-symbol detail modal */
.modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.6); display: flex; align-items: flex-start; justify-content: center; padding: 40px 16px; z-index: 50; overflow: auto; }
.modal-card { background: var(--card, #0e1218); border: 1px solid var(--line-bright); border-radius: 12px; max-width: 640px; width: 100%; padding: 20px; }
.modal-head { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 14px; }
.modal-kicker { font: 700 10px 'DM Mono', monospace; color: var(--faint); letter-spacing: .08em; text-transform: uppercase; }
.modal-head h3 { font-size: 24px; margin: 4px 0 0; }
.modal-close { background: none; border: 1px solid var(--line-bright); color: var(--text); width: 30px; height: 30px; border-radius: 6px; cursor: pointer; }
.modal-body { display: flex; flex-direction: column; gap: 16px; }
.modal-section { border-top: 1px solid var(--line-weak, rgba(255,255,255,.06)); padding-top: 12px; }
.modal-section-title { font: 700 11px 'DM Mono', monospace; color: var(--faint); margin-bottom: 8px; }
.modal-sub { font-size: 11px; color: var(--faint); margin-top: 6px; }
.contrib-line { display: flex; justify-content: space-between; padding: 3px 0; font-size: 13px; }
.contrib-calc em { font-style: normal; color: var(--accent); }
.contrib-calc strong { color: var(--mint); font-family: 'DM Mono', monospace; }
.contrib-calc { color: var(--text-2, #9aa); font-size: 12px; }
.fund-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; font-size: 12px; }
.fund-grid span { background: rgba(255,255,255,.03); border-radius: 6px; padding: 6px 8px; }
.fund-grid strong { color: var(--text); font-family: 'DM Mono', monospace; }
.score-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.score-table td { padding: 7px 6px; border-bottom: 1px solid var(--line-weak, rgba(255,255,255,.05)); }
.score-table tr.score-total td { border-top: 1px solid var(--line-bright); font-weight: 700; color: var(--mint); }
/* calculation steps in the symbol modal */
.calc-box { background: rgba(0,0,0,.25); border: 1px solid var(--line-bright); border-radius: 8px; padding: 12px; }
.calc-line { font: 700 14px 'DM Mono', monospace; color: var(--mint); padding: 6px 0 10px; border-bottom: 1px dashed var(--line-bright); margin-bottom: 8px; }
.calc-step { padding: 6px 0; border-bottom: 1px solid var(--line-weak, rgba(255,255,255,.05)); }
.calc-step-head { display: flex; justify-content: space-between; font-size: 13px; }
.calc-step-head strong { color: var(--text); font-family: 'DM Mono', monospace; }
.calc-step-note { font-size: 11px; color: var(--faint); margin-top: 3px; line-height: 1.5; }
.calc-z { font-size: 11px; color: var(--faint); margin-top: 8px; line-height: 1.6; }
/* backtest section */
.backtest-controls { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; padding: 16px 0; }
.backtest-controls label { display: flex; flex-direction: column; gap: 4px; font-size: 11px; color: var(--faint); }
.backtest-controls input, .backtest-controls select { background: #0a0e14; border: 1px solid var(--line-bright); color: var(--text); border-radius: 6px; padding: 7px 9px; font-size: 12px; }
.primary-btn { background: var(--mint); color: #062a1f; border: none; border-radius: 7px; padding: 9px 16px; font-weight: 700; cursor: pointer; font-size: 12px; }
.primary-btn:disabled { opacity: .5; cursor: not-allowed; }
.bt-kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin: 12px 0; }
.bt-kpi { background: rgba(255,255,255,.03); border: 1px solid var(--line-bright); border-radius: 8px; padding: 12px; }
.bt-kpi span { display: block; font-size: 11px; color: var(--faint); margin-bottom: 6px; }
.bt-kpi strong { font-size: 15px; font-family: 'DM Mono', monospace; }
.bt-meta { margin: 4px 0 10px; font-size: 11px; }
.bt-holdings { margin-top: 8px; font-size: 12px; color: var(--text-2); display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.bt-history { margin-top: 20px; }
.bt-history .source-table td { font-size: 12px; padding: 6px 8px; }
.thesis-list { display: flex; flex-direction: column; gap: 10px; margin: 12px 0; }
.thesis-row { display: flex; gap: 10px; align-items: baseline; padding-bottom: 8px; border-bottom: 1px solid var(--line-weak, rgba(255,255,255,.05)); }
.thesis-theme { min-width: 130px; color: var(--accent); }
.thesis-text { flex: 1; font-size: 12px; color: var(--text-2, #99a); }
.thesis-surprise { font-family: 'DM Mono', monospace; color: var(--mint); }
/* ---- Simulation panel ---- */
.sim-panel { margin-top: 18px; }
.sim-controls { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; margin-bottom: 14px; }
.sim-field { display: flex; flex-direction: column; gap: 4px; }
.sim-field label { font-size: 11px; color: var(--faint); }
.sim-field input, .sim-field select { background: var(--card); border: 1px solid var(--line-bright); color: var(--text); padding: 7px 9px; border-radius: 5px; font-size: 12px; }
.sim-result { display: flex; flex-direction: column; gap: 12px; }
.sim-sums { display: flex; gap: 24px; }
.sim-sum span { display: block; font-size: 11px; color: var(--faint); }
.sim-sum strong { font-size: 20px; }
.sim-note { font-size: 11px; color: var(--amber); font-style: italic; }
.sim-buckets { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.sim-bucket { border: 1px solid var(--line-bright); border-radius: 8px; padding: 10px; }
.sim-bucket-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.sim-bucket-tag { font: 700 10px 'DM Mono', monospace; padding: 2px 6px; border-radius: 4px; }
.sim-bucket-tag.b1 { background: var(--accent-soft, rgba(63,161,255,.15)); color: var(--accent); }
.sim-bucket-tag.b2 { background: var(--amber-soft, rgba(245,158,11,.15)); color: var(--amber); }
.sim-bucket-tag.b3 { background: var(--mint-soft, rgba(94,234,212,.15)); color: var(--mint); }
.sim-order-table { width: 100%; border-collapse: collapse; }
.sim-order-table td { padding: 3px 4px; font-size: 12px; }
@media (max-width: 720px) { .sim-buckets { grid-template-columns: 1fr; } }
.row-action, .primary-button { padding: 8px 10px; border: 1px solid var(--line-bright); border-radius: 5px; color: var(--text); background: transparent; font-size: 10px; white-space: nowrap; transition: .2s ease; }
.row-action:hover { color: var(--mint); border-color: var(--mint); }
/* Stock board (alternative factor × signal merged table) */
.stock-panel { padding: 0; overflow: hidden; margin-bottom: 12px; }
.panel-subtitle { margin-top: 10px; color: var(--faint); font-size: 11px; line-height: 1.6; }
.panel-subtitle em { color: var(--mint); font-style: normal; }
.stock-controls { display: flex; align-items: center; gap: 14px; }
.toggle-filter { display: inline-flex; align-items: center; gap: 8px; color: var(--muted); font: 10px 'DM Mono', monospace; cursor: pointer; user-select: none; }
.toggle-filter input { width: auto; accent-color: var(--mint); }
.toggle-filter span { white-space: nowrap; }
.dividend-dot { margin-left: 6px; color: var(--amber); }
th.sortable { cursor: pointer; transition: color .15s ease; }
th.sortable:hover { color: var(--text); }
th.sortable.active { color: var(--mint); }
.research-panel { margin-bottom: 12px; }
.research-grid { display: grid; grid-template-columns: 1fr 1.4fr; gap: 24px; align-items: center; margin-top: 22px; }
.research-status { display: inline-block; padding: 7px 9px; border-radius: 5px; font: 11px 'DM Mono', monospace; text-transform: uppercase; }
.status-ready { color: var(--mint); background: var(--mint-soft); }
.status-blocked { color: var(--amber); background: var(--amber-soft); }
.status-descriptive { color: var(--amber); background: var(--amber-soft); }
.research-reason { margin-top: 12px; color: var(--muted); font-size: 12px; }
.research-meta { margin-top: 10px; color: var(--faint); font: 9px 'DM Mono', monospace; overflow-wrap: anywhere; }
.gate-list { display: grid; gap: 0; border-top: 1px solid var(--line); }
.gate-row { display: flex; justify-content: space-between; gap: 15px; padding: 12px 0; border-bottom: 1px solid var(--line); color: var(--muted); font-size: 11px; }
.gate-row strong { color: var(--text); font: 10px 'DM Mono', monospace; text-align: right; }
.research-results { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin-top: 18px; }
.research-result-row { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--line); border-radius: 6px; color: var(--faint); font: 9px 'DM Mono', monospace; }
.research-result-row strong { font-size: 14px; }
.empty-research { margin-top: 18px; padding: 14px; border: 1px dashed var(--line-bright); border-radius: 6px; color: var(--faint); font: 10px 'DM Mono', monospace; }
.bottom-grid { grid-template-columns: 1fr 1fr; }
.thesis-panel { background: linear-gradient(145deg, rgba(36,48,64,.9), rgba(15,23,34,.95)); }
.thesis-panel p, .ledger-panel p { margin-top: 14px; color: var(--muted); font-size: 12px; line-height: 1.8; }
.thesis-rule { display: flex; align-items: center; gap: 9px; margin-top: 24px; color: var(--mint); font: 10px 'DM Mono', monospace; }
.thesis-rule span { width: 22px; height: 1px; background: var(--mint); }
.warning-tag { color: var(--amber); border-color: rgba(230,185,108,.3); background: var(--amber-soft); }
.neutral-tag { color: var(--amber); border-color: rgba(230,185,108,.25); background: var(--amber-soft); }
.auth-form { display: grid; gap: 10px; margin-top: 16px; }
.auth-copy { color: var(--muted); font-size: 11px; line-height: 1.65; }
.paper-auth-warning { margin-top: 14px; padding: 9px 10px; border: 1px solid rgba(230,185,108,.3); border-radius: 5px; color: var(--amber); background: var(--amber-soft); font: 10px 'DM Mono', monospace; line-height: 1.55; }
.entry-form { display: grid; gap: 10px; margin-top: 16px; }
.selected-entry { display: flex; justify-content: space-between; gap: 12px; align-items: center; color: var(--muted); font: 10px 'DM Mono', monospace; }
.selected-entry strong { color: var(--text); font-size: 13px; }
input { width: 100%; padding: 10px 11px; outline: none; border: 1px solid var(--line-bright); border-radius: 6px; color: var(--text); background: rgba(11,16,24,.7); font: 11px 'DM Mono', monospace; }
input:focus { border-color: var(--mint); box-shadow: 0 0 0 3px rgba(82,214,189,.09); }
.primary-button { color: #071411; border-color: var(--mint); background: var(--mint); font-weight: 700; }
.primary-button:disabled { opacity: .5; cursor: wait; }
.empty-ledger { margin-top: 18px; padding: 14px; border: 1px dashed var(--line-bright); border-radius: 6px; color: var(--faint); font: 10px 'DM Mono', monospace; text-align: center; }
.notice { margin-top: 14px; padding: 9px 10px; border-radius: 5px; font: 10px 'DM Mono', monospace; }
.notice-success { color: var(--mint); background: var(--mint-soft); }
.notice-error { color: var(--red); background: var(--red-soft); }
.state-card { margin-top: 12px; padding: 28px; border-radius: 10px; color: var(--muted); font: 12px 'DM Mono', monospace; }
.error-state { color: var(--red); border-color: rgba(239,139,139,.3); }
@media (max-width: 1040px) {
.sidebar { width: 208px; flex-basis: 208px; }
.kpi-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 760px) {
.app-shell { display: block; }
.sidebar { width: 100%; min-height: auto; padding: 15px 18px; border-right: 0; border-bottom: 1px solid var(--line); }
.brand-lockup { padding: 0; }
.nav-stack { display: flex; overflow-x: auto; margin-top: 14px; gap: 5px; }
.nav-item { flex: 0 0 auto; padding: 8px 10px; font-size: 10px; }
.nav-glyph { display: none; }
.sidebar-footer { display: none; }
.content { padding: 30px 16px 44px; }
.topbar { display: block; padding-bottom: 25px; }
.topbar-meta { display: flex; justify-content: space-between; align-items: center; margin-top: 18px; text-align: left; }
.hero-grid, .bottom-grid { grid-template-columns: 1fr; }
.panel { padding: 18px; }
.research-grid { grid-template-columns: 1fr; gap: 18px; }
.research-results { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 500px) {
.kpi-grid { grid-template-columns: 1fr 1fr; gap: 7px; }
.kpi-card { min-height: 112px; padding: 14px; }
.kpi-value { font-size: 22px; }
.kpi-foot { font-size: 9px; }
.pulse-lead { display: block; margin: 20px 0; }
.pulse-copy { display: block; margin-top: 8px; }
.observation-row { grid-template-columns: 1fr 55px; gap: 8px; }
.observation-track { grid-column: 1 / -1; grid-row: 2; }
.observation-value { grid-column: 2; grid-row: 1; }
.lineage-item { display: block; }
.lineage-item strong { display: block; margin-top: 5px; text-align: left; }
h1 { font-size: 31px; }
.subtitle { font-size: 11px; }
}