/* Carbonthesis design system v1 — shared stylesheet.
   Dark is the default; light is opt-in via [data-theme="light"]; print forces light.
   Self-host Inter + JetBrains Mono (woff2) under each app's /static/fonts/. */

@font-face{font-family:'Inter';font-style:normal;font-weight:400 600;font-display:swap;src:url('/static/fonts/Inter-Variable.woff2') format('woff2');}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 500;font-display:swap;src:url('/static/fonts/JetBrainsMono-Variable.woff2') format('woff2');}

/* ---- tokens: dark = default base ---- */
:root{
  --page:#0E1116; --surface:#161B22; --surface-sunken:#1B222C; --surface-raised:#1E2630;
  --text:#E7EBF1; --text-muted:#9BA5B3; --text-faint:#6B7585;
  --line:#242C37; --line-strong:#323C4A;
  --accent:#7B73F0; --accent-hover:#948DF4; --accent-tint:#23234A; --accent-text:#C7C2FA;
  --pos:#46C97A; --pos-tint:#15311E; --neg:#F0726F; --neg-tint:#3A1A1A;
  --warn:#E0A23A; --warn-tint:#33260E; --info:#34B3C9; --info-tint:#0E2B30;
  --sig-cluster-bg:#23234A; --sig-cluster-tx:#C7C2FA;
  --sig-gov-bg:#15293D;     --sig-gov-tx:#8FBDE6;
  --sig-short-bg:#33260E;   --sig-short-tx:#E8B872;
  --sig-activist-bg:#103029;--sig-activist-tx:#69C9AE;
  --font-sans:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  --font-mono:'JetBrains Mono',ui-monospace,'SF Mono',SFMono-Regular,Menlo,Consolas,monospace;
  --r-sm:4px; --r-md:6px; --r-lg:8px; --r-pill:999px;
  --shadow-pop:0 6px 22px rgba(0,0,0,.5),0 1px 3px rgba(0,0,0,.4);
  --focus:0 0 0 3px rgba(123,115,240,.40);
}

/* ---- light override ---- */
[data-theme="light"]{
  --page:#F7F8FA; --surface:#FFFFFF; --surface-sunken:#F2F4F8; --surface-raised:#FFFFFF;
  --text:#131820; --text-muted:#586273; --text-faint:#8A93A1;
  --line:#E5E9F0; --line-strong:#D2D8E2;
  --accent:#4F46E5; --accent-hover:#4138C9; --accent-tint:#ECEBFD; --accent-text:#3A33A8;
  --pos:#137A3B; --pos-tint:#E6F3EB; --neg:#C02626; --neg-tint:#FBEAEA;
  --warn:#B45309; --warn-tint:#FAF0E1; --info:#0E7490; --info-tint:#E1F1F4;
  --sig-cluster-bg:#ECEBFD; --sig-cluster-tx:#3A33A8;
  --sig-gov-bg:#E6EEF7;     --sig-gov-tx:#1E4E7A;
  --sig-short-bg:#FBEFDD;   --sig-short-tx:#92500B;
  --sig-activist-bg:#E0F0EC;--sig-activist-tx:#0E6B53;
  --shadow-pop:0 4px 16px rgba(19,24,32,.10),0 1px 3px rgba(19,24,32,.06);
  --focus:0 0 0 3px rgba(79,70,229,.28);
}

/* ---- print / PDF (weasyprint): force light, regardless of theme ---- */
@media print{
  :root{
    --page:#FFFFFF; --surface:#FFFFFF; --surface-sunken:#F2F4F8; --surface-raised:#FFFFFF;
    --text:#131820; --text-muted:#586273; --text-faint:#8A93A1;
    --line:#E5E9F0; --line-strong:#D2D8E2;
    --accent:#4F46E5; --accent-hover:#4138C9; --accent-tint:#ECEBFD; --accent-text:#3A33A8;
    --pos:#137A3B; --pos-tint:#E6F3EB; --neg:#C02626; --neg-tint:#FBEAEA;
    --warn:#B45309; --warn-tint:#FAF0E1; --info:#0E7490; --info-tint:#E1F1F4;
    --sig-cluster-bg:#ECEBFD; --sig-cluster-tx:#3A33A8; --sig-gov-bg:#E6EEF7; --sig-gov-tx:#1E4E7A;
    --sig-short-bg:#FBEFDD; --sig-short-tx:#92500B; --sig-activist-bg:#E0F0EC; --sig-activist-tx:#0E6B53;
  }
  .topbar,.toggle{display:none}
}

/* ---- base ---- */
*{box-sizing:border-box}
html,body{margin:0}
body{font-family:var(--font-sans);background:var(--page);color:var(--text);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;font-feature-settings:"cv05" 1,"ss01" 1;}
.num,.mono{font-variant-numeric:tabular-nums}
.mono{font-family:var(--font-mono)}
.wrap{max-width:1080px;margin:0 auto;padding:0 24px 80px}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
:focus-visible{outline:none;box-shadow:var(--focus)}
.faint{color:var(--text-faint)}
.fill-center{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}

/* ---- headings ---- */
h1{font-size:30px;line-height:1.15;letter-spacing:-.02em;font-weight:600;margin:0 0 10px}
h2{font-size:18px;font-weight:600;letter-spacing:-.01em;margin:0}
h3{font-size:13px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-muted);margin:0 0 14px}
.kicker{font-size:11px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--accent);margin:0 0 10px}

/* ---- shared app shell ---- */
.topbar{position:sticky;top:0;z-index:50;background:var(--surface);border-bottom:1px solid var(--line)}
.topbar-in{max-width:1080px;margin:0 auto;padding:0 24px;height:52px;display:flex;align-items:center;gap:8px}
.brand{display:flex;align-items:center;gap:9px;font-weight:600;letter-spacing:-.01em;margin-right:8px;color:var(--text)}
.brand .dot{width:14px;height:14px;border-radius:3px;background:var(--accent);transform:rotate(45deg)}
.nav{display:flex;gap:2px;flex:1;overflow:auto}
.nav a{padding:7px 11px;border-radius:var(--r-md);color:var(--text-muted);font-size:13px;font-weight:500;white-space:nowrap}
.nav a:hover{background:var(--surface-sunken);text-decoration:none;color:var(--text)}
.nav a.on{background:var(--accent-tint);color:var(--accent-text)}
.toggle{border:1px solid var(--line-strong);background:var(--surface);color:var(--text-muted);height:32px;padding:0 12px;border-radius:var(--r-md);font:inherit;font-size:13px;cursor:pointer}
.toggle:hover{color:var(--text);border-color:var(--text-faint)}
/* mobile nav menu button — hidden on desktop, shown <640px */
.nav-menu-btn{display:none;align-items:center;justify-content:center;width:36px;height:32px;padding:0;border:1px solid var(--line-strong);background:var(--surface);color:var(--text-muted);border-radius:var(--r-md);cursor:pointer}
.nav-menu-btn:hover{color:var(--text);border-color:var(--text-faint)}
.topbar-logout .ic{display:none}

/* ---- buttons ---- */
.btn{font:inherit;font-size:13px;font-weight:500;height:34px;padding:0 14px;border-radius:var(--r-md);border:1px solid transparent;cursor:pointer;display:inline-flex;align-items:center;gap:7px}
.btn.primary{background:var(--accent);color:#fff}
.btn.primary:hover{background:var(--accent-hover)}
.btn.secondary{background:var(--surface);border-color:var(--line-strong);color:var(--text)}
.btn.secondary:hover{border-color:var(--text-faint)}
.btn.ghost{background:transparent;color:var(--text-muted)}
.btn.ghost:hover{background:var(--surface-sunken);color:var(--text)}
.btn.danger{background:var(--neg);color:#fff}
.btn.icon{width:30px;height:30px;padding:0;justify-content:center}
.btn.sm{height:28px;padding:0 10px;font-size:12px}
.btn:disabled{opacity:.4;cursor:default}

/* ---- running/live pulse dot ---- */
.pulse-dot{width:8px;height:8px;border-radius:50%;background:var(--accent-text);flex-shrink:0}
.pulse-dot.live{background:var(--pos)}
@keyframes ct-pulse{0%,100%{opacity:1}50%{opacity:.4}}
@media (prefers-reduced-motion:no-preference){.pulse-dot{animation:ct-pulse 1.5s ease-in-out infinite}}

/* ---- forms ---- */
.field{margin-bottom:12px}
.field label{display:block;font-size:12px;font-weight:500;color:var(--text-muted);margin-bottom:5px}
.input{width:100%;height:34px;padding:0 11px;font:inherit;font-size:14px;color:var(--text);background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-md)}
.input::placeholder{color:var(--text-faint)}
.input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus)}
select.input{padding-right:8px}
textarea.input{height:auto;min-height:96px;padding:8px 11px;line-height:1.5;resize:vertical}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.form-grid .full{grid-column:1/-1}
@media (max-width:560px){.form-grid{grid-template-columns:1fr}}

/* ---- cards ---- */
.card{background:var(--surface-raised);border:1px solid var(--line);border-radius:var(--r-lg);padding:16px 18px}

/* ---- signal badges ---- */
.badge{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:500;line-height:1;padding:4px 9px 4px 7px;border-radius:var(--r-pill)}
.badge .g{font-size:12px;line-height:1}
.b-cluster{background:var(--sig-cluster-bg);color:var(--sig-cluster-tx)}
.b-gov{background:var(--sig-gov-bg);color:var(--sig-gov-tx)}
.b-short{background:var(--sig-short-bg);color:var(--sig-short-tx)}
.b-activist{background:var(--sig-activist-bg);color:var(--sig-activist-tx)}
.badge-stack{display:inline-flex;gap:4px;flex-wrap:wrap}

/* ---- status pills (inline state, e.g. health dashboard) ---- */
.pill{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:3px 9px;border-radius:var(--r-pill);line-height:1.4}
.pill .d{width:6px;height:6px;border-radius:50%}
.pill-pos{background:var(--pos-tint);color:var(--pos)} .pill-pos .d{background:var(--pos)}
.pill-neg{background:var(--neg-tint);color:var(--neg)} .pill-neg .d{background:var(--neg)}
.pill-warn{background:var(--warn-tint);color:var(--warn)} .pill-warn .d{background:var(--warn)}
.pill-muted{background:var(--surface-sunken);color:var(--text-muted)} .pill-muted .d{background:var(--text-faint)}

/* ---- status banners ---- */
.banner{display:flex;gap:10px;align-items:flex-start;padding:11px 14px;border-radius:var(--r-md);border-left:3px solid;font-size:13px;line-height:1.45}
.banner .t{font-weight:600}
.bn-pos{background:var(--pos-tint);border-color:var(--pos);color:var(--text)} .bn-pos .t{color:var(--pos)}
.bn-neg{background:var(--neg-tint);border-color:var(--neg);color:var(--text)} .bn-neg .t{color:var(--neg)}
.bn-warn{background:var(--warn-tint);border-color:var(--warn);color:var(--text)} .bn-warn .t{color:var(--warn)}
.bn-info{background:var(--info-tint);border-color:var(--info);color:var(--text)} .bn-info .t{color:var(--info)}

/* ---- data table (the hero) ---- */
.tbl-wrap{border:1px solid var(--line);border-radius:var(--r-lg);overflow:auto;background:var(--surface)}
table.data{width:100%;border-collapse:collapse;font-size:13px;min-width:720px}
table.data thead th{position:sticky;top:0;background:var(--surface);text-align:left;font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-muted);padding:10px 14px;border-bottom:1px solid var(--line-strong);white-space:nowrap}
table.data th.r,table.data td.r{text-align:right}
table.data tbody td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:middle}
table.data tbody tr:nth-child(even){background:var(--surface-sunken)}
table.data tbody tr:hover{background:var(--accent-tint)}
table.data tbody tr:last-child td{border-bottom:0}
.tk{font-family:var(--font-mono);font-weight:500;font-size:13px}
.co{color:var(--text-muted);font-size:12px}
.score{font-weight:500}
.sort-ind{color:var(--accent);font-size:10px;margin-left:4px}
.delta-pos{color:var(--pos);font-variant-numeric:tabular-nums}
.delta-neg{color:var(--neg);font-variant-numeric:tabular-nums}

@media (prefers-reduced-motion:no-preference){
  .btn,.toggle,.nav a{transition:background .12s ease,border-color .12s ease,color .12s ease}
}
@media (max-width:640px){
  h1{font-size:25px}
  /* collapse the top-bar app switcher into a menu dropdown (topbar only — #ct-nav, not the per-app sub-navs that also reuse .nav) */
  .brand-text{display:none}
  .nav-menu-btn{display:inline-flex;margin-left:auto}
  #ct-nav{display:none;position:absolute;top:52px;left:0;right:0;z-index:50;flex:none;flex-direction:column;gap:2px;overflow:visible;background:var(--surface);border-bottom:1px solid var(--line);box-shadow:var(--shadow-pop);padding:8px}
  #ct-nav.open{display:flex}
  #ct-nav a{min-height:44px;display:flex;align-items:center;padding:0 14px;font-size:15px;white-space:normal}
  .toggle-text{display:none}
  .topbar-logout.btn{width:34px;padding:0;justify-content:center}
  .topbar-logout .ic{display:inline-flex}
  .topbar-logout .logout-text{display:none}
}