:root{--bg:#07080a;--fg:#f4f4f5;--muted:#8b9098;--accent:#4b7bec;--line:rgb(244 244 245 / .14);--ok:#20bf6b;--warn:#f5a524;--bad:#ff4848;--card:#0e1013;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--gap:.75rem;--r:10px;--m-screener:#4b7bec;--m-cartographer:#8fb0f5;--m-jev:#20bf6b;--m-claude:#f5a524;--m-executor:#f4f4f5;--m-risk:var(--bad)}
*{box-sizing:border-box}
html{background:var(--bg);color:var(--fg)}
body{margin:0;min-height:100svh;background:var(--bg);color:var(--fg);font-family:"Google Sans",system-ui,sans-serif;font-size:1rem;line-height:1.5}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
a{color:inherit;text-decoration:none}
::selection{background:var(--accent);color:var(--bg)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.skip{position:absolute;left:-999px;top:0;z-index:50;background:var(--accent);color:var(--bg);padding:.5rem 1rem}
.skip:focus{left:0}
.display{font-weight:500;letter-spacing:-.035em;line-height:.95}
.wordmark{letter-spacing:.22em;font-size:.875rem}
.kicker,.nav-link,.lang button,.lbl{letter-spacing:.14em;text-transform:uppercase}
.kicker{font-size:.75rem;color:var(--accent);margin:0;font-family:var(--mono);text-transform:none;letter-spacing:.02em}
.muted{color:var(--muted)}
.accent{color:var(--accent)}
.wrap{width:min(72rem,100%);margin:0 auto;padding:0 1.25rem}
@media(min-width:768px){.wrap{padding:0 2.5rem}}
header{position:fixed;inset:0 0 auto 0;z-index:30;border-bottom:1px solid var(--line);background:rgb(7 8 10 / .8);backdrop-filter:blur(12px)}
.topbar{display:flex;align-items:center;justify-content:space-between;height:3.5rem}
.desk{display:none;align-items:center;gap:1.5rem}
@media(min-width:768px){.desk{display:flex}.nav-toggle,.mobile-panel{display:none!important}}
@media(min-width:768px){.topbar{position:relative;justify-content:center}.wordmark{position:absolute;left:2.5rem}.desk .lang{position:absolute;right:2.5rem}}
.nav-link{font-size:.75rem;color:var(--muted);padding:.75rem 0}
.nav-link:hover,.nav-link[aria-current],.lang button.on{color:var(--accent)}
.lang{display:flex;gap:.25rem;font-size:.75rem}
.lang button{color:var(--muted);min-width:2.75rem;min-height:2.75rem}
@media(min-width:768px){.lang button{min-width:2rem;min-height:2rem}}
.nav-toggle{display:grid;width:2.75rem;height:2.75rem;place-items:center}
.nav-toggle span,.nav-toggle span::before,.nav-toggle span::after{display:block;width:1.25rem;height:1px;background:var(--fg);position:relative;transition:transform .28s ease,background .2s ease}
.nav-toggle span::before,.nav-toggle span::after{content:"";position:absolute;left:0}
.nav-toggle span::before{top:-6px}
.nav-toggle span::after{top:6px}
.nav-toggle.open span{background:transparent}
.nav-toggle.open span::before{top:0;transform:rotate(45deg)}
.nav-toggle.open span::after{top:0;transform:rotate(-45deg)}
.mobile-panel{position:fixed;z-index:20;inset:3.5rem 0 0;display:flex;flex-direction:column;justify-content:space-between;padding:2.5rem 1.5rem 2rem;background:var(--bg);opacity:0;visibility:hidden;transition:opacity .28s ease,visibility .28s ease}
.mobile-panel.open{opacity:1;visibility:visible}
.sheet-link{display:block;width:100%;padding:1.05rem 0;border-bottom:1px solid var(--line);font-size:clamp(2rem,9vw,2.75rem);font-weight:500;letter-spacing:-.035em;text-align:left}
.banner{border:1px solid var(--warn);color:var(--warn);padding:.6rem .9rem;font-family:var(--mono);font-size:.8125rem}
.banner.err{border-color:var(--bad);color:var(--bad)}
.ok{color:var(--ok)}.warn{color:var(--warn)}.bad{color:var(--bad)}
code{font-family:var(--mono)}
footer{border-top:1px solid var(--line);padding:2.5rem 1.25rem;text-align:center;color:var(--muted);font-size:.875rem}
.mark{width:1.15rem;height:1.15rem;flex:none}
.mark-spacexai{width:3.4rem;height:auto}
footer .mark-spacexai{width:2.4rem}
.mark-bitpanda{width:1.7rem;height:1.7rem}
.mark-typesafe{width:.8rem}
/* footer: "Powered by" as a moving band. One set of logos spans at least the full
   viewport width (6 x 30vw), so the copy needed for the loop never shows a company twice at once. */
.ticker{margin-top:1.25rem;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
.ticker-track{display:flex;width:max-content;animation:slide 42s linear infinite}
.ticker-track a{flex:0 0 max(30vw,11rem);display:inline-flex;justify-content:center;align-items:center;gap:.5rem;color:var(--fg);white-space:nowrap}
.ticker-track a:hover{color:var(--accent)}
.ticker:hover .ticker-track{animation-play-state:paused}
@keyframes slide{to{transform:translateX(-50%)}}

main.wrap{padding-top:5rem;padding-bottom:3rem}
.dash{display:grid;gap:var(--gap)}
.head{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.title{font-size:clamp(2rem,6vw,3.25rem);font-weight:700;letter-spacing:-.03em;margin:.5rem 0 0}
.lbl{font-size:.6875rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);margin:0}
.live{display:flex;align-items:center;gap:.5rem;margin:0;font-family:var(--mono);font-size:.8125rem;letter-spacing:.16em;color:var(--muted)}
.live .dot{width:.5rem;height:.5rem;border-radius:50%;background:var(--muted)}
.live.on{color:var(--ok)}.live.on .dot{background:var(--ok);animation:pulse 1s ease-in-out infinite}
.live.stale{color:var(--warn)}.live.stale .dot{background:var(--warn)}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.7)}}
.meta{font-family:var(--mono);font-size:.75rem;margin:0}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:1rem 1.1rem;min-width:0}
.kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--gap)}
@media(max-width:820px){.kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}
.big{font-size:clamp(1.4rem,3.2vw,2rem);font-weight:700;letter-spacing:-.02em;margin:.45rem 0 .15rem;font-variant-numeric:tabular-nums;font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-height:1.2em}
.sub{font-size:.75rem;margin:0;color:var(--muted);min-height:1.2em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ok{color:var(--ok)}.warn{color:var(--warn)}.bad{color:var(--bad)}
.positions .lbl{margin-bottom:.75rem}
.positions #positions{display:grid}
.pos{margin:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(7.5rem,1fr));gap:.7rem 1.25rem;font-family:var(--mono);font-size:.875rem}
.pos + .pos{margin-top:.85rem;padding-top:.85rem;border-top:1px solid var(--line)}
.pos dt{color:var(--muted);font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase}
.pos dd{margin:.15rem 0 0;font-size:1rem;font-variant-numeric:tabular-nums}
.positions .empty{padding:.15rem 0 0;text-align:left}
.panels{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--gap)}
@media(max-width:820px){.panels{grid-template-columns:minmax(0,1fr)}}
.panel{display:flex;flex-direction:column;height:26rem}
.ph{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.6rem}
.pv{margin:0;font-family:var(--mono);font-weight:700;font-size:1.25rem;font-variant-numeric:tabular-nums}
.chart{flex:1;min-height:0;position:relative}
.chart svg,.bars svg,.ecg svg{display:block;width:100%;height:100%}
.bars{height:2.5rem;margin-top:.5rem;border-top:1px solid var(--line);padding-top:.4rem}
.grid{stroke:var(--line);stroke-width:1}
.axis{fill:var(--muted);font-family:var(--mono);font-size:10px}
.line{fill:none;stroke:var(--accent);stroke-width:2;vector-effect:non-scaling-stroke}
.area{fill:url(#eqfill)}
.bar.up{fill:var(--ok)}.bar.dn{fill:var(--bad)}
.empty{color:var(--muted);font-family:var(--mono);font-size:.8125rem;margin:0;padding:1rem 0;text-align:center}
.chart .empty{position:absolute;inset:0;display:grid;place-items:center}
.act{list-style:none;margin:0;padding:0;overflow:auto;flex:1;font-family:var(--mono);font-size:.78rem;font-variant-numeric:tabular-nums}
.act li{display:grid;grid-template-columns:6.6rem .6rem 4rem minmax(0,1fr) 4.8rem 5.4rem;gap:.4rem;align-items:center;padding:.35rem .3rem;border-radius:6px}
.act li.empty{display:block}
.act .md{width:.45rem;height:.45rem;border-radius:50%;background:var(--m-executor)}
.act .q,.act .v{text-align:right}
.act .p{text-align:right;color:var(--fg)}
.act .buy{color:var(--ok)}.act .sell{color:var(--bad)}
.act li.new{animation:slidein .2s ease-out,glow .5s ease-out .2s}
@keyframes slidein{from{transform:translateY(-100%);opacity:0}to{transform:none;opacity:1}}
@keyframes glow{from{background:rgb(75 123 236 / .28)}to{background:transparent}}
.hb{padding:.75rem 1.1rem}
.hb .ph{margin-bottom:.3rem}
.ecg{height:2.75rem}
.ecg .base{fill:none;stroke:var(--accent);stroke-width:1.5;vector-effect:non-scaling-stroke;stroke-linejoin:round}
.ecg .now{fill:var(--accent)}
.ecg .nxt{stroke:var(--muted);stroke-dasharray:2 3;stroke-width:1;vector-effect:non-scaling-stroke}
.mods{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--gap)}
@media(max-width:820px){.mods{grid-template-columns:repeat(3,minmax(0,1fr))}}
.mod{aspect-ratio:1;display:flex;flex-direction:column;justify-content:space-between;align-items:center;padding:.7rem;transition:border-color .3s}
.mod .top{display:flex;justify-content:space-between;width:100%;font-family:var(--mono);font-size:.625rem;letter-spacing:.12em;color:var(--muted)}
.mod .st{display:flex;align-items:center;gap:.3rem}
.mod .sd{width:.4rem;height:.4rem;border-radius:50%;background:var(--muted)}
.mod.s-RUN .sd{background:var(--ok)}.mod.s-SCAN .sd{background:var(--accent)}.mod.s-SKIP .sd{background:var(--warn)}.mod.err .sd{background:var(--bad)}
.mod.s-RUN .st,.mod.s-SCAN .st{color:var(--fg)}
.mod svg{width:42%;height:auto;color:var(--mc)}
.mod .nm{font-size:.75rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase}
.mod.m-SCREENER{--mc:var(--m-screener)}.mod.m-CARTOGRAPHER{--mc:var(--m-cartographer)}.mod.m-JEV{--mc:var(--m-jev)}.mod.m-CLAUDE{--mc:var(--m-claude)}.mod.m-EXECUTOR{--mc:var(--m-executor)}.mod.m-RISK{--mc:var(--m-risk)}
.mod.flash{animation:modglow 1.2s ease-out}
@keyframes modglow{0%{border-color:var(--mc);box-shadow:0 0 0 1px var(--mc),0 0 18px -4px var(--mc)}100%{border-color:var(--line);box-shadow:none}}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
@media(max-width:820px){.panel{height:auto}.chart{height:14rem;flex:none}.act{max-height:22rem}}
@media(max-width:820px){.mod .nm{font-size:.5625rem;letter-spacing:.06em}.act{font-size:.7rem}.act li{grid-template-columns:5.6rem .5rem 3.4rem minmax(0,1fr) 4.4rem}.act .p{grid-column:1/-1;text-align:left;color:var(--muted);margin-top:-.2rem}}
.logs{padding:0}
.logs>summary{padding:1rem 1.1rem;cursor:pointer;list-style-position:inside}
.runlist{display:grid;gap:.4rem;padding:0 1.1rem 1rem}
.run{border:1px solid var(--line);border-left:3px solid var(--ok);border-radius:6px;font-family:var(--mono);font-size:.78rem}
.run.lv-warn{border-left-color:var(--warn)}.run.lv-error{border-left-color:var(--bad)}
.run>summary{display:flex;flex-wrap:wrap;gap:.25rem 1rem;padding:.5rem .75rem;cursor:pointer;font-variant-numeric:tabular-nums}
.run .rl{font-weight:700;letter-spacing:.12em}.run .rn{margin-left:auto}
.run .lines{list-style:none;margin:0;padding:.25rem .75rem .6rem;border-top:1px solid var(--line)}
.run .lines li{display:grid;grid-template-columns:9.5rem minmax(0,1fr);gap:.75rem;padding:.15rem 0;overflow-wrap:anywhere}
@media(max-width:820px){.run .lines li{grid-template-columns:minmax(0,1fr);gap:0}}
.mod .ico{display:block;width:42%;aspect-ratio:1;background:var(--mc);-webkit-mask:var(--ico) center/contain no-repeat;mask:var(--ico) center/contain no-repeat}
.ico-screener{--ico:url(/tradebot/icons/bot-screener.svg)}.ico-cartographer{--ico:url(/tradebot/icons/bot-cartographer.svg)}
.ico-executor{--ico:url(/tradebot/icons/bot-executor.svg)}.ico-risk{--ico:url(/tradebot/icons/bot-risk.svg)}
/* ERROR must stay distinguishable from the red Risk module colour: ringed dot + red status text + "!" marker. */
.mod.err .sd{background:var(--bad);box-shadow:0 0 0 2px var(--card),0 0 0 3px var(--fg)}
.mod.err .stt{color:var(--bad)}
.mod.err .stt::after{content:" !"}
.ico-jev{--ico:url(/tradebot/icons/bot-jev.svg)}.ico-claude{--ico:url(/tradebot/icons/bot-claude.svg)}
/* Affiliate disclosure: directly in the link, same size, never truncated */
.ad-note{font-size:inherit;color:var(--fg);white-space:normal;overflow:visible}
.ad-fixed{margin:1.5rem auto 0;max-width:40rem;padding:0 1.25rem}
.ad-fixed a{display:inline-flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:.25rem .5rem;color:var(--fg)}
.ad-fixed a:hover{color:var(--accent)}
