/* SPX/US500: CFD marker is cyan and intentionally distinct from SPX levels. */
.level-dot--cfd{background:#38bdf8}

.user-bar{display:flex;justify-content:flex-end;gap:16px;align-items:center;margin:-8px 0 14px;color:var(--text-muted);font-size:.68rem}.user-bar strong{color:var(--text-primary)}.user-bar a{color:var(--cyan);text-decoration:none}.auth-body{min-height:100vh;display:grid;place-items:center;background:var(--bg-page);padding:20px}.auth-card{width:min(420px,100%);padding:30px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-card);box-shadow:0 18px 60px rgba(0,0,0,.3)}.auth-card h1{margin:10px 0 6px}.auth-muted{color:var(--text-secondary);font-size:.82rem;margin-bottom:22px}.auth-card form,.settings-form{display:grid;gap:14px}.auth-card label,.settings-form label{display:grid;gap:6px;color:var(--text-secondary);font-size:.72rem}.auth-card input,.settings-form input,.settings-form select{width:100%;padding:11px 12px;border:1px solid var(--border-active);border-radius:var(--radius-md);background:var(--bg-panel);color:var(--text-primary)}.auth-card button,.settings-form button{padding:11px 14px;border:0;border-radius:var(--radius-md);background:var(--accent);color:#fff;font-weight:800;cursor:pointer}.auth-error{margin:14px 0;padding:10px;border:1px solid rgba(239,68,68,.4);border-radius:var(--radius-md);color:#fca5a5;background:rgba(239,68,68,.08);font-size:.75rem}.settings-page{max-width:1120px;margin:0 auto}.settings-grid{display:grid;grid-template-columns:minmax(280px,.8fr) 1.4fr;gap:14px;margin-top:18px}.settings-form small,.user-row small{color:var(--text-muted);font-size:.62rem}.settings-form button{margin-top:4px}.user-table{display:grid;gap:2px}.user-row{display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center;padding:13px 4px;border-bottom:1px solid var(--border)}.user-row strong,.user-row small{display:block}.user-status{font-size:.62rem;font-weight:800}.user-status--on{color:var(--green)}.user-status--off{color:var(--red)}.button-secondary{padding:7px 9px;border:1px solid var(--border-active);border-radius:var(--radius-md);background:transparent;color:var(--text-secondary);cursor:pointer;font-size:.65rem}.settings-note{margin-top:15px;padding:12px 14px;border-left:3px solid var(--amber);color:var(--text-muted);font-size:.7rem;line-height:1.5;background:var(--bg-panel)}

/* ═══════════════════════════════════════════════════════════
   GEX Hub — Design System v1
   ═══════════════════════════════════════════════════════════ */

:root {
  /* Instrumento científico: neutros de sesgo frío (azulados), no slate plano.
     Fondo casi negro pero elegido, no #000. */
  --bg-deep: #090b10; --bg-panel: #10141d; --bg-card: #0d111a; --bg-hover: #19202d;
  --border: #1a212e; --border-active: #2a3547;
  --text-primary: #e6eaf2; --text-secondary: #9aa4b4; --text-muted: #616d80;
  /* Dominios anclados al tema: acero = Massive (opciones US), bronce = TTP
     (oro/metales/FX). El bronce evita chocar con el ámbar de "warning". */
  --massive: #5b9dff; --ttp: #c98a4b;
  /* Interacción/marca = acero. */
  --accent: #5b9dff; --accent-strong: #3d7fe6;
  /* Semántica RESERVADA: nunca se usa como color de marca. */
  --green: #3fb950; --red: #f0564a; --amber: #d99a2b; --purple: #a855f7; --cyan: #35c4c4; --gold: #c98a4b;
  --radius-sm: 3px; --radius-md: 5px; --radius-lg: 7px;
  --shadow: 0 8px 30px rgba(0,0,0,.4);
  --font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --mono: "JetBrains Mono", "SF Mono", "Fira Code", ui-monospace, "Cascadia Code", monospace;
  color-scheme: dark; font-family: var(--font); background: var(--bg-deep); color: var(--text-primary);
  font-feature-settings: "tnum" 1, "cv01" 1; -webkit-font-smoothing: antialiased;
}
*,*::before,*::after{box-sizing:border-box;margin:0}
body{min-height:100vh}

.app{display:grid;grid-template-columns:232px 1fr;min-height:100vh}
.sidebar{background:linear-gradient(180deg,var(--bg-panel),var(--bg-deep));border-right:1px solid var(--border);padding:22px 0;position:sticky;top:0;height:100vh;overflow-y:auto}
.sidebar-brand{padding:0 18px 18px;border-bottom:1px solid var(--border);margin-bottom:14px}
.sidebar-brand .eyebrow{color:var(--text-muted);font-family:var(--mono);font-size:.6rem;font-weight:600;letter-spacing:.22em}
.sidebar-brand h2{font-size:1.05rem;margin:6px 0 0;letter-spacing:-.01em;font-weight:650}
.sidebar-nav{list-style:none;padding:0}
.sidebar-nav a{display:flex;align-items:center;gap:10px;padding:8px 18px;color:var(--text-secondary);text-decoration:none;font-size:.83rem;border-left:2px solid transparent;transition:background .12s,color .12s,border-color .12s}
.sidebar-nav a:hover{background:var(--bg-hover);color:var(--text-primary)}
.sidebar-nav a.active{background:var(--bg-hover);color:var(--text-primary)}
.sidebar-nav a .icon{font-family:var(--mono);font-size:.62rem;font-weight:700;letter-spacing:.02em;width:22px;text-align:center;color:var(--text-muted)}
.sidebar-nav a.active .icon{color:inherit}
.mobile-nav{display:none}

.main{padding:26px 34px;max-width:1440px}
.topbar{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:22px;padding-bottom:16px;border-bottom:1px solid var(--border);flex-wrap:wrap;gap:12px}
.topbar h1{font-size:1.5rem;font-weight:650;letter-spacing:-.02em;text-wrap:balance}
.topbar .eyebrow{color:var(--text-muted);font-family:var(--mono);font-size:.62rem;font-weight:600;letter-spacing:.18em;margin-bottom:4px}
.topbar .status-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.badge{border:1px solid var(--border-active);border-radius:99px;padding:4px 11px;font-family:var(--mono);font-size:.63rem;font-weight:600;letter-spacing:.06em;color:var(--text-secondary)}
.badge.live{border-color:rgba(63,185,80,.5);color:var(--green)}
.badge.mock{border-color:rgba(217,154,43,.5);color:var(--amber)}
.badge.error{border-color:rgba(240,86,74,.5);color:var(--red)}

.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px;margin-bottom:16px}
.alert-card{border-color:var(--red);color:var(--red)}
.error-text{color:var(--red);padding:40px}
.filter-form{margin-bottom:18px}
.filter-form label{display:flex;align-items:center;gap:8px;color:var(--text-secondary);font-size:.78rem}
.health-list{padding-left:20px;display:grid;gap:6px;color:var(--text-primary)}
.timestamp-value{font-size:.95rem!important}
.batch-price-form{grid-column:span 2}
.form-help{color:var(--text-muted);font-size:.75rem;margin-bottom:12px}
.price-grid{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));gap:10px;margin-bottom:12px}
.price-grid label{display:grid;gap:5px;color:var(--text-secondary);font-size:.7rem}
.price-grid input{width:100%}
.card-header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:14px;gap:10px;padding-bottom:10px;border-bottom:1px solid var(--border)}
.card-header h3{font-size:.9rem;font-weight:600;letter-spacing:-.005em}
.card-header .meta{font-family:var(--mono);font-size:.66rem;color:var(--text-muted);letter-spacing:.03em}

.grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}

.stat-pill{display:flex;flex-direction:column;gap:5px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-md);padding:14px 16px;position:relative;overflow:hidden}
.stat-pill::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--border-active)}
.stat-pill .label{font-family:var(--mono);font-size:.62rem;color:var(--text-muted);letter-spacing:.1em;text-transform:uppercase}
.stat-pill .value{font-family:var(--mono);font-size:1.55rem;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.stat-pill .sub{font-size:.72rem;color:var(--text-secondary)}

/* CFD signal identity: asset colour is stable; event colour is independent. */
.asset-card{border-left:3px solid var(--asset-color,var(--border-active));}
.asset-card--xauusd{--asset-color:#d4af37;background:rgba(212,175,55,.08)}
.asset-card--eurusd{--asset-color:#4f9cff;background:rgba(79,156,255,.06)}
.asset-card--gbpusd{--asset-color:#b07cff;background:rgba(176,124,255,.06)}
.asset-card--usdjpy{--asset-color:#f59e0b;background:rgba(245,158,11,.06)}
.asset-card--usdchf{--asset-color:#cbd5e1;background:rgba(203,213,225,.05)}
.asset-card--audusd{--asset-color:#45c878;background:rgba(69,200,120,.06)}
.asset-card--usdcad{--asset-color:#f0564a;background:rgba(240,86,74,.06)}
.asset-card--nzdusd{--asset-color:#38bdf8;background:rgba(56,189,248,.06)}
.asset-card--xagusd{--asset-color:#d1d5db;background:rgba(209,213,219,.06)}
.asset-icon{font-size:.9rem}
.asset-badge,.event-badge{display:inline-flex;align-items:center;gap:5px;border-radius:4px;padding:3px 6px;border:1px solid;font-size:.69rem;font-weight:800;letter-spacing:.03em}
.asset-badge--xauusd{color:#e5c65c;border-color:rgba(212,175,55,.55);background:rgba(212,175,55,.12)}
.asset-badge--eurusd{color:#72b2ff;border-color:rgba(79,156,255,.5);background:rgba(79,156,255,.1)}
.asset-badge--gbpusd{color:#c39aff;border-color:rgba(176,124,255,.5);background:rgba(176,124,255,.1)}
.asset-badge--usdjpy{color:#fbbf24;border-color:rgba(245,158,11,.5);background:rgba(245,158,11,.1)}
.asset-badge--usdchf{color:#e2e8f0;border-color:rgba(203,213,225,.45);background:rgba(203,213,225,.08)}
.asset-badge--audusd{color:#62de91;border-color:rgba(69,200,120,.5);background:rgba(69,200,120,.1)}
.asset-badge--usdcad{color:#ff8178;border-color:rgba(240,86,74,.5);background:rgba(240,86,74,.1)}
.asset-badge--nzdusd{color:#67d3ff;border-color:rgba(56,189,248,.5);background:rgba(56,189,248,.1)}
.asset-badge--xagusd{color:#e5e7eb;border-color:rgba(209,213,219,.45);background:rgba(209,213,219,.08)}
.event-badge--buy{color:var(--green);border-color:rgba(63,185,80,.5);background:rgba(63,185,80,.1)}
.event-badge--sell{color:var(--red);border-color:rgba(240,86,74,.5);background:rgba(240,86,74,.1)}
.event-badge--tp{color:var(--green);border-color:rgba(63,185,80,.5);background:rgba(63,185,80,.1)}
.event-badge--sl{color:var(--red);border-color:rgba(240,86,74,.5);background:rgba(240,86,74,.1)}
.event-badge--di-exit{color:var(--amber);border-color:rgba(217,154,43,.55);background:rgba(217,154,43,.1)}
.event-badge--timeout{color:var(--purple);border-color:rgba(168,85,247,.5);background:rgba(168,85,247,.1)}
.event-badge--flip{color:var(--cyan);border-color:rgba(53,196,196,.5);background:rgba(53,196,196,.1)}
.signal-row td:first-child{border-left:3px solid var(--asset-color,var(--border-active))}
.asset-row--xauusd{--asset-color:#d4af37;background:rgba(212,175,55,.035)}
.asset-row--eurusd{--asset-color:#4f9cff}.asset-row--gbpusd{--asset-color:#b07cff}.asset-row--usdjpy{--asset-color:#f59e0b}.asset-row--usdchf{--asset-color:#cbd5e1}.asset-row--audusd{--asset-color:#45c878}.asset-row--usdcad{--asset-color:#f0564a}.asset-row--nzdusd{--asset-color:#38bdf8}.asset-row--xagusd{--asset-color:#d1d5db}
.signal-toolbar{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin:0 0 14px}.signal-toolbar__label{font-size:.68rem;color:var(--text-muted);font-family:var(--mono);text-transform:uppercase;letter-spacing:.06em;margin-right:3px}.signal-filter{padding:5px 9px;border-radius:99px;background:var(--bg-panel);color:var(--text-secondary);border-color:var(--border-active);font-size:.68rem;font-weight:700}.signal-filter:hover,.signal-filter.is-active{color:var(--text-primary);border-color:var(--accent);background:rgba(91,157,255,.1)}
.expiry-form{display:grid;gap:14px}.expiry-form label{display:grid;gap:5px;color:var(--text-secondary);font-size:.7rem}.expiry-form .price-grid{margin-bottom:0}.expiry-table{min-width:900px}.expiry-row--magnet{background:rgba(217,154,43,.08)}.expiry-row--expired{opacity:.48}.expiry-row.is-highlighted{border-left:3px solid var(--amber)}.expiry-state{display:inline-flex;padding:4px 7px;border:1px solid;border-radius:4px;font-size:.62rem;font-weight:800;letter-spacing:.06em}.expiry-state--magnet{color:var(--amber);border-color:rgba(217,154,43,.55);background:rgba(217,154,43,.1)}.expiry-state--active{color:var(--cyan);border-color:rgba(53,196,196,.5);background:rgba(53,196,196,.08)}.expiry-state--expired{color:var(--text-muted);border-color:var(--border-active)}

.chart{width:100%;height:380px}
.table-wrap{overflow-x:auto;margin:0 -18px}
table{width:100%;border-collapse:collapse;font-size:.8rem}
th,td{padding:9px 14px;border-bottom:1px solid var(--border);text-align:right;white-space:nowrap}
th:first-child,td:first-child{text-align:left}
tbody tr{transition:background .1s}
tbody tr:hover{background:var(--bg-hover)}
th{color:var(--text-muted);font-family:var(--mono);font-size:.61rem;letter-spacing:.09em;text-transform:uppercase;font-weight:600;border-bottom-color:var(--border-active)}
td{font-family:var(--mono);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
td:first-child,th:first-child{font-family:var(--font)}
td{font-variant-numeric:tabular-nums}
td small{display:block;color:var(--text-muted);margin-top:2px}

.controls{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin-bottom:24px}
form{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px}
.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
h2{margin:0 0 10px;font-size:.95rem}
select,input,button{border:1px solid var(--border-active);border-radius:var(--radius-sm);background:var(--bg-panel);color:var(--text-primary);padding:9px 12px;font-family:var(--font);font-size:.84rem}
button{cursor:pointer;background:var(--accent-strong);border-color:var(--accent);font-weight:700}
button:hover{background:var(--accent)}

.c-green{color:var(--green)} .c-red{color:var(--red)} .c-amber{color:var(--amber)}
.c-purple{color:var(--purple)} .c-cyan{color:var(--cyan)} .c-gold{color:var(--gold)}
.row-highlight td{background:rgba(59,130,246,.08);border-bottom-color:rgba(59,130,246,.25)}
.primary-payload-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin-top:6px}
.primary-payload-card{background:var(--bg-panel);border:1px solid rgba(59,130,246,.35);border-radius:var(--radius-md);padding:16px;display:grid;gap:12px}
.primary-payload-card__head{display:flex;justify-content:space-between;align-items:center;gap:10px}
.primary-payload-levels{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.primary-payload-levels>div{display:flex;flex-direction:column;gap:3px}
.primary-payload-levels span{font-size:.6rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em}
.primary-payload-levels strong{font-size:1.05rem;font-variant-numeric:tabular-nums}
.primary-payload-meta{display:flex;gap:12px;font-size:.7rem;color:var(--text-secondary)}
.copy-primary{width:100%;padding:11px;font-size:.82rem;background:var(--accent-strong);border-color:var(--accent)}
.copy-satsbos{width:100%;padding:9px;font-size:.75rem;background:var(--bg-panel);border-color:rgba(168,85,247,.5);color:var(--purple);margin-top:6px}

.quality-row{display:flex;gap:16px;flex-wrap:wrap}
.quality-item{flex:1;min-width:120px}
.quality-item .label{font-size:.65rem;color:var(--text-muted);margin-bottom:4px}
.quality-bar{height:6px;border-radius:3px;background:var(--bg-hover);overflow:hidden}
.quality-bar-fill{height:100%;border-radius:3px;transition:width .4s}
.quality-bar-fill.good{background:var(--green)}
.quality-bar-fill.warn{background:var(--amber)}
.quality-bar-fill.bad{background:var(--red)}

footer{margin-top:28px;padding-top:16px;border-top:1px solid var(--border);color:var(--text-muted);font-size:.72rem}

.eyebrow{color:var(--accent);font-size:.65rem;font-weight:800;letter-spacing:.16em;margin-bottom:5px}
.section-heading{display:flex;justify-content:space-between;gap:20px;align-items:flex-start;margin-bottom:16px}
.section-heading h2{font-size:1.2rem;margin-bottom:5px}
.section-heading p{color:var(--text-secondary);font-size:.82rem}
.method-chip,.symbol-pair{display:inline-flex;border:1px solid var(--border-active);border-radius:99px;padding:5px 10px;font-size:.68rem;font-weight:800;letter-spacing:.08em;color:var(--cyan)}
.opportunity-hero{margin:0 0 24px;padding:20px;background:linear-gradient(135deg,rgba(59,130,246,.09),rgba(6,182,212,.03));border:1px solid rgba(59,130,246,.25);border-radius:var(--radius-lg)}
.opportunity-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}
.opportunity-card{background:rgba(8,12,20,.68);border:1px solid var(--border);border-radius:var(--radius-md);padding:17px}
.opportunity-card__head{display:flex;justify-content:space-between;gap:15px;align-items:center}
.opportunity-card h3{font-size:1rem;margin:9px 0 0}
.score-ring{width:68px;height:68px;border-radius:50%;display:grid;place-content:center;text-align:center;border:5px solid var(--border-active);background:var(--bg-panel)}
.score-ring strong{font-size:1.25rem;line-height:1}.score-ring small{font-size:.58rem;color:var(--text-muted)}
.score-ring.score-high{border-color:var(--green)}.score-ring.score-medium{border-color:var(--amber)}.score-ring.score-low{border-color:var(--red)}
.score-ring.score-withheld{border-color:var(--text-muted)}.opportunity-withheld{border-color:rgba(245,158,11,.35)}.abstention-inline{margin:12px 0;padding:9px 11px;border-left:3px solid var(--amber);background:rgba(245,158,11,.06);color:var(--text-secondary);font-size:.68rem}
.confidence-line{display:grid;grid-template-columns:auto 1fr auto;gap:9px;align-items:center;margin:16px 0;font-size:.68rem;color:var(--text-secondary)}
.confidence-track{height:5px;background:var(--bg-hover);border-radius:5px;overflow:hidden}.confidence-track i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--cyan))}
.next-catalyst{display:grid;grid-template-columns:1fr auto;gap:3px 10px;padding:11px;background:var(--bg-panel);border-radius:var(--radius-sm);font-size:.75rem}.next-catalyst span{color:var(--text-muted)}.next-catalyst small{grid-column:1/-1;color:var(--text-secondary)}
.text-link{display:inline-flex;margin-top:14px;color:#7dd3fc;text-decoration:none;font-size:.78rem;font-weight:700}.text-link:hover{color:white}
.disclaimer-inline,.panel-note{font-size:.7rem;color:var(--text-muted);margin-top:13px;line-height:1.5}
.inline-selector{display:flex;padding:0;background:none;border:0;gap:8px}
.analysis-banner,.plan-hero{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:24px;margin-bottom:18px;border-radius:var(--radius-lg);border:1px solid rgba(59,130,246,.28);background:radial-gradient(circle at 100% 0,rgba(59,130,246,.18),transparent 45%),var(--bg-card)}
.analysis-banner h1,.plan-hero h2{font-size:1.55rem;margin:10px 0 6px}.analysis-banner p,.plan-hero p{color:var(--text-secondary);font-size:.8rem;max-width:760px;line-height:1.55}
.analysis-scores{display:flex;gap:10px}.analysis-scores>div{min-width:110px;padding:13px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-md);text-align:center}.analysis-scores small,.analysis-scores span{display:block;color:var(--text-muted);font-size:.62rem}.analysis-scores strong{font-size:1.65rem}
.evidence-notice{display:flex;gap:12px;align-items:center;border-left:3px solid var(--amber);background:rgba(245,158,11,.07);padding:12px 15px;margin-bottom:18px;font-size:.76rem}.evidence-notice span{color:var(--text-secondary)}
.data-status{font-size:.62rem;font-weight:800}.data-fresh{color:var(--green)}.data-aging{color:var(--amber)}.data-stale{color:var(--red)}
.stale-warning{display:flex;gap:10px;align-items:center;font-size:.74rem}.stale-warning span{color:var(--text-secondary)}
.abstention-card{border-color:var(--amber);display:grid;grid-template-columns:minmax(240px,.7fr) 1fr;gap:20px}.abstention-card>div{display:grid;gap:5px}.abstention-card span{color:var(--text-secondary);font-size:.74rem;line-height:1.5}.abstention-card ul{padding-left:18px;color:var(--text-secondary);font-size:.7rem;line-height:1.65}.pipeline-warning{margin-bottom:18px;padding:10px 13px;border:1px solid rgba(245,158,11,.35);border-radius:var(--radius-md);background:rgba(245,158,11,.06);color:var(--amber);font-size:.72rem}
.decision-badge{border-radius:99px;padding:6px 10px;font-size:.64rem;font-weight:800;letter-spacing:.08em;border:1px solid var(--border-active)}.decision-observe{color:var(--green);border-color:var(--green)}.decision-abstain{color:var(--amber);border-color:var(--amber)}.decision-no_data{color:var(--text-muted)}
.quality-symbol-card>.card-header>div h3{margin-top:9px}.gate-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(185px,1fr));gap:9px}.gate-check{display:grid;gap:5px;padding:11px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel)}.gate-check>span{font-size:.55rem;font-weight:900;letter-spacing:.08em}.gate-check>strong{font-size:.72rem}.gate-check>small{font-size:.62rem;color:var(--text-muted);line-height:1.4}.gate-pass{border-color:rgba(34,197,94,.25)}.gate-pass>span{color:var(--green)}.gate-fail{border-color:rgba(239,68,68,.35)}.gate-fail>span{color:var(--red)}
.quality-detail-grid{margin-top:20px}.quality-detail-grid h4{font-size:.76rem;margin-bottom:12px}.reference-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.reference-grid article{display:grid;gap:5px;padding:12px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-md)}.reference-grid strong{font-size:.8rem}.reference-grid small{font-size:.64rem;color:var(--text-muted)}.quality-subheading{margin-top:16px}.reason-chips{display:flex;flex-wrap:wrap;gap:6px}.reason-chips span{font-size:.62rem;padding:5px 7px;border-radius:5px;background:var(--bg-hover);color:var(--text-secondary)}.empty-inline{padding:14px;border:1px dashed var(--border-active);border-radius:var(--radius-md);color:var(--text-muted);font-size:.72rem}
.analysis-layout{align-items:start}.analysis-layout .card{height:100%}
.date-radar{display:grid;gap:13px}.date-radar__row{display:grid;grid-template-columns:95px 1fr 34px;gap:9px;align-items:center}.date-block{display:grid}.date-block strong{font-size:.75rem}.date-block small{color:var(--text-muted);font-size:.64rem}.radar-bar{height:8px;background:var(--bg-hover);border-radius:8px;overflow:hidden}.radar-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--accent-strong),var(--cyan));border-radius:8px}.radar-score{text-align:right;font-size:.78rem}.date-detail{grid-column:2/-1;display:flex;align-items:center;gap:7px}.date-detail small{color:var(--text-muted);font-size:.66rem}
.structure-chip{font-size:.56rem;font-weight:800;padding:3px 6px;border-radius:4px;border:1px solid var(--border-active)}.structure-chip.stabilizing{color:var(--green)}.structure-chip.expansion{color:var(--red)}
.timing-list{display:grid;gap:14px}.timing-list article{display:grid;grid-template-columns:105px 1fr;gap:12px;padding-bottom:13px;border-bottom:1px solid var(--border)}.timing-list article:last-child{border:0}.timing-list time{font-family:var(--mono);font-size:.74rem;color:var(--cyan)}.timing-list strong{font-size:.8rem}.timing-list p{font-size:.72rem;color:var(--text-secondary);margin-top:3px;line-height:1.45}
.setup-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}.setup-card{padding:14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel)}.setup-card>div{display:flex;align-items:center;gap:6px}.status-dot{width:7px;height:7px;background:var(--cyan);border-radius:50%;box-shadow:0 0 9px var(--cyan)}.setup-card small{color:var(--text-muted);font-size:.58rem}.setup-card b{margin-left:auto}.setup-card h4{font-size:.84rem;margin:10px 0 6px}.setup-card p{font-size:.72rem;color:var(--text-secondary);line-height:1.5}.setup-card footer{font-size:.64rem;line-height:1.45;margin-top:10px;padding-top:9px}
.market-chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:13px}.market-chips span{font-size:.62rem;padding:4px 7px;border-radius:5px;background:var(--bg-hover);color:var(--text-secondary)}
.metric-list{display:grid;gap:10px}.metric-list>div{display:flex;justify-content:space-between;border-bottom:1px solid var(--border);padding-bottom:9px;font-size:.75rem}.metric-list span{color:var(--text-secondary)}
.evidence-card .table-wrap{margin-top:4px}.evidence-card table{min-width:860px}.evidence-card th,.evidence-card td{font-size:.68rem}.evidence-intro{max-width:920px;margin-top:-5px;margin-bottom:14px}
.methodology-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:15px}.methodology-card summary{cursor:pointer;font-weight:700;font-size:.82rem}.methodology-card>div{margin-top:16px}.methodology-card h4{font-size:.76rem;margin-bottom:7px}.methodology-card ul,.capability-card ul{padding-left:18px;color:var(--text-secondary);font-size:.72rem;line-height:1.8}
.empty-state{text-align:center;padding:60px 20px}.empty-state__icon{font-size:2.4rem;color:var(--cyan)}.empty-state h2{font-size:1.1rem;margin:12px}.empty-state p{color:var(--text-secondary)}
.plan-price{display:inline-flex;color:var(--green);font-family:var(--mono);font-weight:800;font-size:.75rem}.plan-rule{min-width:250px;display:grid;gap:5px;padding:15px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel)}.plan-rule span{font-size:.72rem;color:var(--text-secondary);line-height:1.5}
.capability-card.included{border-top:2px solid var(--green)}.capability-card.excluded{border-top:2px solid var(--red)}
.universe-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}.universe-card{padding:14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-panel)}.universe-card>div:first-child{display:flex;justify-content:space-between}.universe-card h4{font-size:.82rem;margin:10px 0 5px}.universe-card p{font-size:.7rem;line-height:1.5;color:var(--text-secondary);min-height:43px}.priority{font-size:.55rem;font-weight:800;padding:4px 6px;border-radius:4px;background:var(--bg-hover)}.priority-core,.priority-high{color:var(--green)}.priority-medium{color:var(--amber)}
.universe-controls{margin-top:18px}

/* ── Fed Events / Economic Calendar ────────────────────── */
.fed-events-card .table-wrap table{min-width:700px}
.fed-events-card thead th{font-size:.7rem;text-transform:uppercase;letter-spacing:.04em}
.fed-row-today{background:rgba(239,68,68,.08) !important;border-left:3px solid var(--red)}
.impact-critical{color:var(--red);font-weight:800;font-size:.7rem;text-transform:uppercase;letter-spacing:.04em}
.impact-high{color:var(--amber);font-weight:700;font-size:.7rem;text-transform:uppercase;letter-spacing:.04em}
.impact-medium{color:var(--text-secondary);font-weight:600;font-size:.7rem;text-transform:uppercase;letter-spacing:.04em}

@media(max-width:900px){
  .app{display:block}.sidebar{display:none}.mobile-nav{display:flex;position:sticky;top:0;z-index:20;overflow-x:auto;background:rgba(17,24,39,.96);border-bottom:1px solid var(--border);backdrop-filter:blur(12px)}.mobile-nav a{flex:1;min-width:82px;text-align:center;padding:12px 9px;color:var(--text-secondary);font-size:.7rem;font-weight:700;text-decoration:none}.mobile-nav a.active{color:white;border-bottom:2px solid var(--accent)}
  .grid-2,.grid-3,.grid-4{grid-template-columns:1fr}.main{padding:18px}.batch-price-form{grid-column:auto}.price-grid{grid-template-columns:repeat(2,1fr)}
  .analysis-banner,.plan-hero,.section-heading{align-items:flex-start;flex-direction:column}.analysis-scores{width:100%;flex-wrap:wrap}.analysis-scores>div{flex:1}.opportunity-grid{grid-template-columns:1fr}.evidence-notice{align-items:flex-start;flex-direction:column}.abstention-card{grid-template-columns:1fr}.reference-grid{grid-template-columns:1fr}
}

/* ═══════════════════════════════════════════════════════════
   Design System v2 — dos dominios + evidencia visible
   ═══════════════════════════════════════════════════════════
   Principio: el rigor se VE. Ningún número desnudo. Cada cifra
   lleva su n; la abstención y los datos rancios son estados de
   primera clase, no errores. El pulido no debe transmitir una
   autoridad que los datos no se han ganado.
   ═══════════════════════════════════════════════════════════ */

:root{
  /* --massive / --ttp se definen en los tokens base (arriba). Aquí solo
     escala de espacio y tipografía. */
  --space-1:4px; --space-2:8px; --space-3:12px; --space-4:18px; --space-5:28px;
  --fs-micro:.62rem; --fs-xs:.7rem; --fs-sm:.8rem; --fs-md:.9rem;
  --fs-lg:1.15rem; --fs-xl:1.5rem; --fs-2xl:2rem;
}

/* ── Navegación agrupada por dominio ───────────────────── */
.nav-group{margin-bottom:var(--space-4)}
.nav-group-label{display:flex;align-items:center;gap:var(--space-2);
  padding:10px 18px 6px;font-family:var(--mono);font-size:var(--fs-micro);font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;color:var(--text-muted)}
.nav-group-label::before{content:"";width:6px;height:6px;border-radius:1px;flex:none}
.nav-group--massive .nav-group-label::before{background:var(--massive);box-shadow:0 0 8px rgba(91,157,255,.5)}
.nav-group--ttp .nav-group-label::before{background:var(--ttp);box-shadow:0 0 8px rgba(201,138,75,.5)}
.nav-group--massive a.active{border-left-color:var(--massive);color:#fff}
.nav-group--ttp a.active{border-left-color:var(--ttp);color:#fff}
.nav-group--massive a.active .icon{color:var(--massive)}
.nav-group--ttp a.active .icon{color:var(--ttp)}

/* ── Etiqueta de dominio ───────────────────────────────── */
.domain-badge{display:inline-flex;align-items:center;gap:6px;border-radius:99px;
  padding:3px 10px;font-size:var(--fs-micro);font-weight:800;letter-spacing:.1em;
  text-transform:uppercase;border:1px solid}
.domain-badge--massive{color:var(--massive);border-color:rgba(59,130,246,.45);
  background:rgba(59,130,246,.08)}
.domain-badge--ttp{color:var(--ttp);border-color:rgba(234,179,8,.45);
  background:rgba(234,179,8,.08)}

/* ── Evidencia: n y su fiabilidad ──────────────────────── */
.evidence{display:inline-flex;align-items:baseline;gap:6px;font-family:var(--mono);
  font-size:var(--fs-xs)}
.n-badge{border-radius:4px;padding:1px 6px;font-weight:700;font-family:var(--mono);
  font-size:var(--fs-micro);border:1px solid}
/* n<30 = no concluyente. Se marca SIEMPRE, sin excepción. */
.n-badge--thin{color:var(--red);border-color:rgba(239,68,68,.5);background:rgba(239,68,68,.1)}
.n-badge--weak{color:var(--amber);border-color:rgba(245,158,11,.5);background:rgba(245,158,11,.1)}
.n-badge--ok{color:var(--green);border-color:rgba(34,197,94,.45);background:rgba(34,197,94,.1)}
.uncertainty{color:var(--text-muted);font-size:var(--fs-xs);font-family:var(--mono)}

/* Un valor cuya muestra es insuficiente se atenúa y se raya:
   visualmente NO puede competir con un dato sólido. */
.is-thin{opacity:.55}
.is-thin .value{text-decoration:line-through solid rgba(148,163,184,.4)}

/* ── Abstención / datos rancios como estado de 1ª clase ── */
.state{display:flex;align-items:center;gap:var(--space-2);border-radius:var(--radius-md);
  padding:10px 14px;font-size:var(--fs-sm);border:1px dashed}
.state--abstain{color:var(--amber);border-color:rgba(245,158,11,.45);
  background:repeating-linear-gradient(45deg,rgba(245,158,11,.05) 0 10px,transparent 10px 20px)}
.state--stale{color:var(--text-muted);border-color:var(--border-active)}
.state--nodata{color:var(--text-muted);border-color:var(--border-active);justify-content:center}
.state strong{font-weight:700}

/* ── Tabla de instrumentos ─────────────────────────────── */
.instrument-table td:first-child{font-weight:700}
.instrument-table .sym{display:flex;align-items:center;gap:var(--space-2)}
.instrument-table .sym small{display:block;color:var(--text-muted);font-weight:400;margin-top:2px}
.instrument-table tr.is-core{background:rgba(234,179,8,.04)}
.prio{font-size:var(--fs-micro);letter-spacing:.08em;text-transform:uppercase;
  color:var(--text-muted);border:1px solid var(--border-active);border-radius:4px;padding:1px 6px}
.prio--core{color:var(--ttp);border-color:rgba(234,179,8,.45)}

/* ── Aviso metodológico ────────────────────────────────── */
.methodology{border-left:3px solid var(--border-active);padding:var(--space-3) var(--space-4);
  color:var(--text-secondary);font-size:var(--fs-sm);background:var(--bg-panel);
  border-radius:0 var(--radius-md) var(--radius-md) 0;margin-bottom:var(--space-4)}
.methodology strong{color:var(--text-primary)}
.cockpit-topbar .subhead{margin:.35rem 0 0;color:var(--text-secondary);font-size:.82rem}.cockpit-controls{display:flex;align-items:center;gap:12px;margin:18px 0;padding:12px 14px;background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-md)}.cockpit-controls label{font-size:.7rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.08em}.cockpit-controls select{min-width:150px}.cockpit-freshness{margin-left:auto;color:var(--text-secondary);font-size:.72rem}.cockpit-verdict{display:flex;justify-content:space-between;gap:24px;padding:24px 26px;border:1px solid var(--border);border-left:5px solid var(--border-active);border-radius:var(--radius-lg);background:linear-gradient(120deg,var(--bg-panel),var(--bg-hover))}.cockpit-verdict h2{margin:7px 0 8px;font-size:1.65rem}.cockpit-verdict p{max-width:760px;margin:0;color:var(--text-secondary);font-size:.92rem;line-height:1.55}.cockpit-verdict--bull{border-left-color:var(--green)}.cockpit-verdict--bear{border-left-color:#ef4444}.cockpit-verdict--wait,.cockpit-verdict--unknown{border-left-color:var(--amber)}.verdict-guard{align-self:center;min-width:210px;padding:13px 15px;border-radius:var(--radius-md);background:rgba(15,23,42,.5)}.verdict-guard span{display:block;color:var(--text-muted);font-size:.64rem;text-transform:uppercase;letter-spacing:.08em}.verdict-guard strong{display:block;margin-top:7px;color:var(--text-primary);font-size:.82rem;line-height:1.35}.cockpit-levels{margin-top:22px;padding:20px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-panel)}.cockpit-levels .section-heading{margin-bottom:0}.level-map{height:170px;margin-top:4px}.level-legend{display:flex;gap:18px;flex-wrap:wrap;color:var(--text-secondary);font-size:.7rem}.level-legend span{display:flex;align-items:center;gap:6px}.level-dot{display:inline-block;width:9px;height:9px;border-radius:50%}.level-dot--spot{background:#f8fafc}.level-dot--flip{background:#a855f7}.level-dot--upper{background:#22c55e}.level-dot--lower{background:#ef4444}.cockpit-scenarios{margin-top:18px}.scenario-card{padding:18px;border:1px solid var(--border);border-top:3px solid var(--border-active);border-radius:var(--radius-md);background:var(--bg-panel)}.scenario-card--bull{border-top-color:var(--green)}.scenario-card--bear{border-top-color:#ef4444}.scenario-card--avoid{border-top-color:var(--amber)}.scenario-kicker{font-size:.62rem;letter-spacing:.09em;color:var(--text-muted)}.scenario-card h3{margin:7px 0;font-size:1rem}.scenario-card p{margin:0;color:var(--text-secondary);font-size:.78rem;line-height:1.55}.cockpit-signals{margin-top:18px}.signal-timeline{display:grid;gap:2px}.timeline-item{display:grid;grid-template-columns:60px 30px 1fr auto;align-items:center;gap:10px;padding:11px 8px;border-bottom:1px solid var(--border);border-left:3px solid var(--border-active)}.timeline-item.event-row--buy{border-left-color:var(--green)}.timeline-item.event-row--sell,.timeline-item.event-row--di-exit,.timeline-item.event-row--sl{border-left-color:#ef4444}.timeline-item.event-row--tp{border-left-color:#22c55e}.timeline-time{font-size:.72rem;color:var(--text-primary)}.timeline-time small{display:block;color:var(--text-muted);font-size:.6rem}.timeline-mark{font-size:1rem;text-align:center}.timeline-item strong{font-size:.78rem}.timeline-item p{margin:3px 0 0;color:var(--text-muted);font-size:.68rem}.timeline-status{font-size:.65rem;color:var(--text-muted)}.cockpit-source-note{display:flex;gap:12px;margin-top:16px;color:var(--text-muted);font-size:.68rem;line-height:1.5}.cockpit-source-note span{color:var(--text-secondary);font-weight:800;letter-spacing:.08em}.empty-state{padding:18px;border:1px dashed var(--border-active);border-radius:var(--radius-md);color:var(--text-secondary);font-size:.78rem}.empty-state strong{color:var(--text-primary)}.empty-state p{margin:7px 0 0}@media(max-width:720px){.cockpit-controls{align-items:flex-start;flex-wrap:wrap}.cockpit-freshness{width:100%;margin-left:0}.cockpit-verdict{display:block}.verdict-guard{margin-top:18px}.timeline-item{grid-template-columns:48px 25px 1fr}.timeline-status{display:none}}

/* Secciones plegables de la ventana de instrumento.
   La ventana llegó a tener ocho bloques apilados. Plegar no esconde: deja de
   imponer. Lo esencial va abierto y el detalle denso —intervalos, n, umbrales—
   a un clic, que es lo que permite que la misma vista sirva a quien empieza y
   a quien ya sabe qué mira. */
details.bloque{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);margin-bottom:16px}
details.bloque>summary{padding:14px 18px;cursor:pointer;font-size:.9rem;font-weight:600;letter-spacing:-.005em;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:10px}
details.bloque>summary::-webkit-details-marker{display:none}
details.bloque>summary::after{content:"▾";color:var(--text-muted);font-size:.8rem;transition:transform .15s}
details.bloque[open]>summary::after{transform:rotate(180deg)}
details.bloque>summary .meta{font-family:var(--mono);font-size:.66rem;color:var(--text-muted);letter-spacing:.03em;font-weight:400}
details.bloque>.bloque-cuerpo{padding:0 18px 18px}
details.bloque .card{background:transparent;border:0;padding:0;margin-bottom:12px}

/* Mapa de niveles: la escala visual va por distancia, nunca por dirección.
   Un verde/rojo aquí se lee como comprar/vender, y esta vista no aconseja. */
.nivel-arriba,.nivel-abajo{font-family:var(--mono);font-size:.7rem;color:var(--text-muted)}
.nivel-cerca{font-weight:600}
.glosa{color:var(--text-muted);font-size:.72rem;display:block;margin-top:2px}
.para-que{background:var(--bg-card);border-left:3px solid var(--border);padding:12px 16px;margin-bottom:16px;border-radius:var(--radius-lg)}
.para-que strong{display:block;margin-bottom:4px}

/* --- Triaje de atención ---------------------------------------------------
   La portada es un selector: qué merece la mirada ahora. Un estado por
   instrumento, mutuamente excluyente, y la condición que lo invalidaría.

   ⚠️ Los colores codifican DISPONIBILIDAD DE DATO, nunca dirección. Verde para
   "call wall" y rojo para "put wall" se leen como largo/corto, y esta interfaz
   no aconseja. Aquí verde = hay datos; ámbar = falta algo; gris = no hay nada. */
.mesa-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;margin-bottom:16px}
.mesa-card{background:var(--bg-card);border:1px solid var(--border);border-left-width:3px;border-radius:var(--radius-lg);padding:14px 16px;display:flex;flex-direction:column;gap:6px}
.mesa-card--listo{border-left-color:#00C853}
.mesa-card--parcial{border-left-color:#FF9800}
.mesa-card--abstencion{border-left-color:#FF9800}
.mesa-card--viejo{border-left-color:#78909C}
.mesa-card--sin-datos{border-left-color:var(--border)}
.mesa-card__sym{font-size:1rem;font-weight:600;letter-spacing:-.01em}
.mesa-card__px{font-family:var(--mono);font-size:1.25rem;font-weight:600}
.mesa-card__estado{font-family:var(--mono);font-size:.68rem;letter-spacing:.06em;font-weight:600}
.mesa-card__motivo,.mesa-card__inval{color:var(--text-muted);font-size:.74rem;line-height:1.4}
.mesa-card__inval::before{content:"Deja de valer: ";font-weight:600}
.mesa-card__nivel{font-family:var(--mono);font-size:.74rem}

/* Tabla de procedencia: una sola, en vez de repetir fuente y frescura en cinco
   bloques. Repetirlas obliga a comparar a ojo cuál está viva. */
.procedencia{width:100%;font-size:.76rem}
.procedencia td{padding:4px 8px 4px 0}
.procedencia .viejo{color:#FF9800}

/* Menú móvil secundario. La barra superior solo cabe para mesa + instrumentos;
   sin esto, Calidad, Investigación y Universo eran inalcanzables desde el
   móvil, que es el caso de uso real cuando se mira el mercado de pie. */
.mobile-mas{display:none}
@media (max-width:900px){
  .mobile-mas{display:block;background:var(--bg-card);border-bottom:1px solid var(--border)}
  .mobile-mas>summary{padding:10px 16px;font-size:.72rem;font-weight:700;color:var(--text-secondary);cursor:pointer}
  .mobile-mas ul{list-style:none;margin:0;padding:0 16px 12px;display:grid;gap:8px}
  .mobile-mas a{color:var(--text-secondary);font-size:.78rem;text-decoration:none}
}

/* Secuencia de lectura A-B-C-D: decisión, contexto, explicación, auditoría.
   Los rótulos existen para que se note cuándo cambias de plano — sin ellos, la
   ventana es una pila de bloques y el lector no sabe cuál sostiene a cuál. */
.secuencia{font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;color:var(--text-muted);font-weight:700;margin:22px 0 8px;border-top:1px solid var(--border);padding-top:10px}
.secuencia span{font-weight:400;letter-spacing:.02em;text-transform:none;margin-left:8px}

.modo-switch{margin-left:auto;display:inline-flex;border:1px solid var(--border);border-radius:6px;overflow:hidden}
.modo-switch a{padding:5px 12px;font-size:.7rem;color:var(--text-muted);text-decoration:none}
.modo-switch a.activo{background:var(--bg-card);color:var(--text-primary);font-weight:600}

/* Rastro del último instrumento visitado en la barra móvil. Distinto de
   `.active`: no dices "estás aquí", dices "venías de aquí". */
.mobile-nav a.reciente{color:var(--text-primary);border-bottom:2px dotted var(--border)}

/* Sesión en el menú. "Cerrar sesión" estaba solo en una línea gris arriba a la
   derecha, que es donde nadie la busca. */
.sesion-quien{display:grid;padding:7px 10px;color:var(--text-secondary);font-size:.72rem}
.sesion-quien small{color:var(--text-muted);font-size:.62rem}
