
*{box-sizing:border-box}
body{margin:0;font:16px/1.55 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#1f2430;background:#f6f7f9}
a{color:#1a5fd0}
header{background:#fff;border-bottom:1px solid #e2e5ea}
.wrap{max-width:1100px;margin:0 auto;padding:0 16px}
header .wrap{display:flex;flex-wrap:wrap;align-items:center;gap:8px 20px;padding:12px 16px}
.logo{font-weight:700;font-size:20px;text-decoration:none;color:#1f2430}
nav a{margin-right:14px;text-decoration:none;font-size:14px}
.layout{display:grid;grid-template-columns:minmax(0,1fr);gap:24px;padding:20px 16px}
main{background:#fff;border:1px solid #e2e5ea;border-radius:8px;padding:20px;min-width:0}
h1{font-size:28px;margin:.2em 0 .4em}
h2{font-size:20px;margin:1.4em 0 .4em}
.btn{background:#1a5fd0;color:#fff;border:0;border-radius:6px;padding:10px 16px;font-size:15px;cursor:pointer}
.btn:hover{background:#154ca6}.btn:disabled{opacity:.5;cursor:not-allowed}
.btn.alt{background:#e8ebf0;color:#1f2430}.btn.small{padding:4px 10px;font-size:13px;margin-left:8px}
.row{margin:12px 0;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
select{padding:8px;font-size:15px;max-width:100%}
.status{padding:10px 12px;background:#eef1f6;border-radius:6px}
.status.ok{background:#e1f5e6;color:#14602b}.status.bad{background:#fde8e8;color:#9b1c1c}
.meter{height:22px;background:#e8ebf0;border-radius:11px;overflow:hidden;margin:12px 0}
.meter>div{height:100%;width:0;background:linear-gradient(90deg,#2ecc71,#f1c40f,#e74c3c)}
.meter.small{height:10px;flex:1;margin:0 10px}.meter.small>div{background:#1a5fd0}
.video{width:100%;max-width:640px;background:#000;border-radius:8px;display:block}
.kb{user-select:none;outline:0;overflow-x:auto;padding:8px 0}
.kb-row{display:flex;gap:4px;margin-bottom:4px}
.key{min-width:42px;padding:10px 6px;text-align:center;background:#e8ebf0;border:1px solid #c8ced8;border-radius:5px;font-size:12px}
.key.wide{min-width:70px}.key.space{min-width:240px}
.key.seen{background:#bfe9c8;border-color:#5cb874}.key.down{background:#1a9c46;color:#fff}
.pad{border:2px dashed #aab2c0;border-radius:10px;height:240px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#fafbfc;cursor:crosshair;user-select:none}
.mbtns span{display:inline-block;padding:10px 18px;margin:0 4px;border:1px solid #c8ced8;border-radius:6px;background:#e8ebf0}
.mbtns span.on{background:#1a9c46;color:#fff}
.fs{position:fixed;inset:0;z-index:9999;cursor:pointer}
.sw{width:44px;height:44px;border:2px solid #aab2c0;border-radius:6px;cursor:pointer}
.gb{display:inline-block;min-width:34px;padding:6px;text-align:center;background:#e8ebf0;border-radius:5px;font-size:13px}
.gb.on{background:#1a9c46;color:#fff}
.axis{display:flex;align-items:center;margin:4px 0;font-size:14px}.axis span{width:60px}.axis b{width:50px;text-align:right}.dim{color:#8a93a3}
.touch{width:100%;border:2px dashed #aab2c0;border-radius:10px;background:#fafbfc;display:block}
.hint{font-size:14px;color:#5b6577}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;margin:16px 0}
.card{display:block;padding:16px;border:1px solid #e2e5ea;border-radius:8px;text-decoration:none;color:inherit;background:#fafbfc}
.card:hover{border-color:#1a5fd0}.card b{display:block;color:#1a5fd0;margin-bottom:4px}
.faq details{border-bottom:1px solid #e2e5ea;padding:10px 0}.faq summary{cursor:pointer;font-weight:600}
.related a{display:inline-block;margin:4px 10px 4px 0}
footer{padding:24px 16px;font-size:14px;color:#5b6577;text-align:center}
footer a{margin:0 8px}

/* ============ AD SLOTS ============
   Hidden by default. To show them: add class "ads-on" to <body>
   (or set ADS_ENABLED = True in build.py and rebuild).
   Replace the placeholder text inside each .ad-slot with your ad network's tag.
   Sizes are the standard IAB sizes. */
.ad-slot{display:none;margin:16px auto;text-align:center;background:#f0f2f5;border:1px dashed #c8ced8;color:#8a93a3;font-size:12px;overflow:hidden}
body.ads-on .ad-slot{display:block}
.ad-728x90{width:728px;max-width:100%;height:90px}
.ad-300x250{width:300px;height:250px}
.ad-320x50{width:320px;height:50px}
.ad-160x600{width:160px;height:600px}
.ad-slot.has-house{border:0;background:none;position:relative}
.adtag{position:absolute;top:2px;right:4px;font-size:9px;line-height:1;color:#fff;opacity:.7;background:rgba(0,0,0,.35);padding:2px 4px;border-radius:3px;pointer-events:none}
.house{display:flex;width:100%;height:100%;text-decoration:none;color:#fff;overflow:hidden;border-radius:6px;text-align:left}
.house.jd{background:linear-gradient(135deg,#06202b,#0b4a60);--ac:#22d3ee}
.house.dr{background:linear-gradient(135deg,#1e1b4b,#5b21b6);--ac:#c4b5fd}
.house .hn{font-weight:800;letter-spacing:.3px;color:var(--ac)}
.house b{display:block;font-weight:700}
.house i{display:block;font-style:normal;opacity:.85}
.house .hc{background:var(--ac);color:#0b1220;font-weight:700;border-radius:5px;white-space:nowrap}
.house:hover .hc{filter:brightness(1.1)}
.house.h728{align-items:center;gap:14px;padding:0 16px}
.house.h728 .hm{flex:1;min-width:0}.house.h728 b{font-size:16px;line-height:1.2}.house.h728 i{font-size:12px;margin-top:2px}
.house.h728 .hn{font-size:15px}.house.h728 .hc{padding:9px 14px;font-size:13px}
.house.h320{align-items:center;gap:8px;padding:0 10px}
.house.h320 .hm{flex:1;min-width:0}.house.h320 b{font-size:12px;line-height:1.15;white-space:normal}
.house.h320 .hn{font-size:12px}.house.h320 .hc{padding:6px 10px;font-size:13px}
.house.h300{flex-direction:column;justify-content:space-between;padding:18px}
.house.h300 .hn{font-size:15px}.house.h300 b{font-size:21px;line-height:1.2}.house.h300 i{font-size:14px}.house.h300 .hc{text-align:center;padding:11px;font-size:15px}
@media (max-width:480px){.layout{padding:12px 0}main{padding:14px;border-radius:6px}.ad-slot{max-width:100%}}
.house.h160{flex-direction:column;justify-content:space-between;padding:14px 12px}
.house.h160 .hn{font-size:15px}.house.h160 b{font-size:18px;line-height:1.2}.house.h160 i{font-size:13px}.house.h160 .hc{text-align:center;padding:10px 6px;font-size:13px}
/* desktop leaderboard vs mobile banner */
.ad-mobile{display:none!important}
.ad-side{display:none!important}
@media (max-width:767px){.ad-desktop{display:none!important}body.ads-on .ad-mobile{display:block!important}}
@media (min-width:1100px){
  .layout{grid-template-columns:minmax(0,1fr) 160px}
  body.ads-on .ad-side{display:block!important;position:sticky;top:16px;align-self:start;margin:0}
}

.lead{font-size:18px;color:#3a4254}
.updated{font-size:13px;color:#5b6577;margin-top:24px}
.crumbs{font-size:13px;color:#5b6577;margin:0 0 8px}
.crumbs a{text-decoration:none}
.fcols{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;text-align:left;max-width:900px;margin:0 auto 16px}
.fcols b{display:block;margin-bottom:6px;color:#1f2430}
.fcols a{display:block;margin:2px 0;font-size:13px}
code{background:#eef1f6;padding:1px 5px;border-radius:4px;font-size:90%}
ol li,ul li{margin:6px 0}
