/* ---------- projects index ---------- */
.plist{border-top:1px solid var(--line)}
.prow{display:grid;grid-template-columns:72px minmax(0,1fr) minmax(0,1.1fr);gap:clamp(20px,3.5vw,56px);align-items:center;padding:clamp(28px,3.5vw,48px) 0;border-bottom:1px solid var(--line);color:var(--ink);position:relative}
.prow:hover{color:var(--ink)}
.prow::before{content:"";position:absolute;left:0;top:-1px;height:1px;width:0;background:var(--live);transition:width .7s var(--ease)}
.prow:hover::before{width:100%}
.prow .i{align-self:start;font-family:var(--disp);font-stretch:72%;font-weight:600;font-size:44px;line-height:.8;color:var(--line2);transition:color .3s}
.prow:hover .i{color:var(--live)}
.prow .mon{transition:border-color .4s}
.prow:hover .mon{border-color:var(--muted)}
.prow .mon-s img{transition:transform 1.2s var(--ease)}
.prow:hover .mon-s img{transform:scale(1.03)}
.prow h2{font-family:var(--disp);font-stretch:118%;font-weight:780;font-size:clamp(28px,3.6vw,52px);letter-spacing:-.035em;line-height:1}
.prow .k{color:var(--faint);margin-top:12px}
.prow p{color:var(--muted);margin-top:16px;max-width:48ch}
.prow .tags{margin-top:20px}
.prow .go{display:inline-flex;align-items:center;gap:10px;margin-top:24px;color:var(--live)}
.prow .go span{transition:transform .3s var(--ease)}
.prow:hover .go span{transform:translateX(5px)}
@media (max-width:900px){.prow{grid-template-columns:1fr}.prow .i{font-size:32px}}

/* ---------- server checker ---------- */
.gcards{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px}
.gcard{position:relative;text-align:left;border:1px solid var(--line);background:var(--g900);display:flex;flex-direction:column;transition:border-color .3s}
.gcard:hover{border-color:var(--muted)}
.gcard.sel{border-color:var(--live)}
.gcard .im{position:relative;aspect-ratio:4/3;overflow:hidden;background:var(--g850);border-bottom:1px solid var(--line)}
.gcard .im img{width:100%;height:100%;object-fit:cover;filter:saturate(.5);transition:filter .5s,transform 1s var(--ease)}
.gcard:hover .im img,.gcard.sel .im img{filter:none;transform:scale(1.04)}
.gcard .b{padding:14px 16px 16px;display:grid;gap:6px}
.gcard b{font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:17px;line-height:1.15}
.gcard .go{color:var(--live);margin-top:6px}
@media (max-width:1100px){.gcards{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:640px){.gcards{grid-template-columns:repeat(2,minmax(0,1fr))}}
.check{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.check>div{background:var(--g950);padding:clamp(18px,2.4vw,32px)}
.game-tabs{display:flex;flex-wrap:wrap;gap:8px;margin:18px 0 22px}
.game-tab{font-family:var(--mono);font-size:12.5px;padding:9px 13px;border:1px solid var(--line2);color:var(--muted);transition:.25s}
.game-tab:hover{color:var(--ink)}
.game-tab.active{background:var(--ink);color:var(--g950);border-color:var(--ink)}
.check-f{display:grid;grid-template-columns:minmax(0,1fr) 120px auto;gap:12px;align-items:end}
.check-f .btn{height:50px}
.check-out{display:grid;align-content:start;gap:14px}
@media (max-width:900px){.check{grid-template-columns:1fr}}
@media (max-width:560px){.check-f{grid-template-columns:1fr 100px}.check-f .btn{grid-column:1/-1}}

/* ---------- dashboard / bots ---------- */
.dash-g{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:20px;align-items:start}
@media (max-width:1000px){.dash-g{grid-template-columns:1fr}}
.bot-row{display:grid;grid-template-columns:44px minmax(0,1fr) auto;gap:14px;align-items:center;padding:14px 0;border-bottom:1px solid var(--line)}
.bot-row:last-child{border-bottom:0}
.bot-av{position:relative;width:44px;height:44px;display:grid;place-items:center;font-family:var(--mono);font-size:13px;font-weight:600;color:var(--g950)}
.pres{position:absolute;right:-3px;bottom:-3px;width:11px;height:11px;border-radius:50%;border:2px solid var(--g950);background:var(--faint)}
.pres.on{background:var(--live)}.pres.off{background:var(--fault)}
.bot-meta{min-width:0}
.bn{font-weight:600}
.bot-tag{font-family:var(--mono);font-size:12px;color:var(--faint)}
.bot-stats{display:flex;gap:18px}
.bs,.bcs{display:grid;text-align:right}
.bs b,.bcs b{font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:20px;font-variant-numeric:tabular-nums}
.bs span,.bcs span{font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--faint)}
.bot-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.botcard{border:1px solid var(--line);background:var(--g900);padding:18px;display:grid;gap:16px}
.botcard-hd{display:grid;grid-template-columns:44px minmax(0,1fr) auto;gap:14px;align-items:center}
.botcard-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.botcard-stats .bcs{background:var(--g950);padding:12px;text-align:left}
.botcard-id{font-family:var(--mono);font-size:11.5px;color:var(--faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.botcard-actions{display:flex;gap:8px}
.botcard-actions .btn{height:36px;font-size:11px;padding:0 12px}
.verify-f{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:end}
.verify-result{display:none;margin-top:16px;border:1px solid var(--line2);padding:14px 16px;font-family:var(--mono);font-size:13px}
.verify-result.show{display:grid;gap:8px}
.verify-result.ok{border-color:var(--live-dim)}.verify-result.bad{border-color:#4d322c}
.kv{display:flex;justify-content:space-between;gap:14px}
.kv .k{color:var(--faint)}.kv .v{color:var(--ink);text-align:right;overflow-wrap:anywhere}
.ts-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}
.ts-name{font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:20px}
.ts-kv{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);border:1px solid var(--line);margin:16px 0}
.ts-kv>div{background:var(--g950);padding:12px 14px}
.ts-kv b{display:block;font-family:var(--mono);font-weight:500;font-size:14px;margin-top:4px}
.ts-chan{display:flex;gap:10px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line);font-size:14.5px;color:var(--muted)}
.ts-chan .ico{color:var(--faint);font-size:11px}
.mval{display:flex;align-items:baseline;gap:4px}
.mval span{font-size:.5em;color:var(--faint)}

/* ---------- beathub player ---------- */
.bh-player{display:grid;grid-template-columns:120px minmax(0,1fr);gap:22px;align-items:center;border:1px solid var(--line2);background:var(--g900);padding:20px}
.bh-art{position:relative;width:120px;height:120px;background:var(--g850);border:1px solid var(--line);overflow:hidden}
.bh-art img{width:100%;height:100%;object-fit:cover}
.bh-art .disc{position:absolute;inset:18px;border-radius:50%;border:1px solid var(--line2);background:radial-gradient(circle,var(--g950) 0 9%,var(--g800) 10% 100%)}
.bh-art .disc::after{content:"";position:absolute;inset:22%;border-radius:50%;border:1px solid var(--line)}
.bh-player.playing .disc{animation:spin 4s linear infinite}
.bh-live{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}
.bh-live .rec{width:7px;height:7px;border-radius:50%;background:var(--faint)}
.bh-player.playing .bh-live{color:var(--live)}.bh-player.playing .rec{background:var(--live);animation:blink 1.4s infinite}
.bh-track{font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:clamp(20px,2.2vw,28px);letter-spacing:-.02em;margin-top:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bh-artist{color:var(--muted);margin-top:2px}
.bh-controls{display:flex;align-items:center;gap:14px;margin-top:16px;flex-wrap:wrap}
.bh-play{width:48px;height:48px;display:grid;place-items:center;background:var(--live);color:var(--g950);transition:background .3s}
.bh-play:hover{background:var(--ink)}
.bh-play svg{width:20px;height:20px;fill:currentColor}
.bh-vol{display:flex;align-items:center;gap:8px;color:var(--faint)}
.bh-vol svg{width:18px;height:18px;fill:currentColor}
.bh-vol input{width:110px;accent-color:var(--live)}
.bh-req{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:1px solid var(--line2);font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.bh-req:hover{color:var(--ink);border-color:var(--muted)}
.bh-req svg{width:14px;height:14px;fill:currentColor}
#bhHistory{list-style:none}
.bh-hitem{display:grid;grid-template-columns:64px minmax(0,1fr);gap:14px;padding:12px 0;border-bottom:1px solid var(--line)}
.bh-hitem .t{font-family:var(--mono);font-size:12.5px;color:var(--faint)}
.bh-hitem b{font-weight:600}.bh-hitem span{display:block;color:var(--muted);font-size:14.5px}
.bh-modal{position:fixed;inset:0;z-index:110;background:color-mix(in srgb,var(--g950) 75%,transparent);display:none;align-items:center;justify-content:center;padding:20px}
.bh-modal.open{display:flex}
.bh-modal-card{width:min(460px,100%);background:var(--g900);border:1px solid var(--line2);padding:28px}
.bh-modal-card h3{font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:24px}
.bh-modal-card p{color:var(--muted);margin:8px 0 18px;font-size:15.5px}
.bh-modal-card form{display:grid;gap:12px}
.bh-modal-card input{width:100%;background:var(--g950);border:1px solid var(--line2);padding:12px 14px;outline:none}
.bh-modal-card input:focus{border-color:var(--live)}
.bh-modal-actions{display:flex;gap:10px;flex-wrap:wrap}
.bh-modal-note{font-family:var(--mono);font-size:13px;min-height:18px}
@media (max-width:520px){.bh-player{grid-template-columns:1fr}.bh-art{width:100%;height:auto;aspect-ratio:1/1;max-width:160px}}

/* ---------- gate / 404 ---------- */
.gate{min-height:100svh;display:grid;place-items:center;padding:100px var(--pad) 60px;background-image:linear-gradient(var(--line) 1px,transparent 1px),linear-gradient(90deg,var(--line) 1px,transparent 1px);background-size:160px 160px;background-position:center}
.gate-card{width:min(560px,100%);background:var(--g950);border:1px solid var(--line2);padding:clamp(24px,4vw,44px)}
.gate-card h1{font-size:clamp(32px,5vw,52px);margin:16px 0 14px}
.gate-card p{color:var(--muted)}
.gate-card .cta-row{margin-top:28px}
.node404{position:relative;height:220px;margin:8px 0 24px}
.node404 .n{position:absolute;top:50%;width:120px;height:44px;translate:0 -50%;display:grid;place-items:center;border:1px solid var(--line2);background:var(--g900);font-family:var(--mono);font-size:13px;transition:border-color .5s,color .5s}
.node404 .n.a{left:0}.node404 .n.b{right:0;border-color:var(--fault);color:var(--fault)}
.node404 .w{position:absolute;top:50%;left:120px;right:120px;height:1px;background:repeating-linear-gradient(90deg,var(--fault) 0 6px,transparent 6px 12px);transform-origin:left;transform:scaleX(.45);transition:transform .9s var(--ease),background .5s}
.node404.ok .w{transform:none;background:var(--live)}
.node404.ok .n.b{border-color:var(--live-dim);color:var(--live)}

/* case-study 3D stack */
.beneath-g{display:grid;grid-template-columns:1fr;gap:clamp(24px,4vw,48px);align-items:center}
.beneath-g.has3d{grid-template-columns:minmax(0,1.15fr) minmax(0,1fr)}
.case3d{position:relative;height:clamp(420px,46vw,600px);width:100%;border:1px solid var(--line);border-radius:var(--r);background:radial-gradient(70% 70% at 50% 40%,var(--g900),var(--g950));overflow:hidden}
.beneath-g:not(.has3d) .case3d{display:none}
.case3d canvas{display:block;width:100%!important;height:100%!important}
.case3d[data-inspect]:not([data-inspect="false"]){cursor:crosshair}
.lyr.hot{background:linear-gradient(90deg,var(--wash),transparent 70%);padding-left:16px}.lyr.hot .d{color:var(--live)}
@media (max-width:900px){.beneath-g.has3d{grid-template-columns:1fr}.case3d{height:clamp(320px,80vw,460px)}}
/* status page */
.days{display:grid;grid-template-columns:repeat(30,minmax(0,1fr));gap:3px;align-items:end;height:64px}
.days i{display:block;height:100%;border-radius:2px;background:var(--g700);position:relative}
.days i.ok{background:var(--live)}.days i.part{background:var(--warn)}.days i.bad{background:var(--fault)}
.days i:hover{outline:1px solid var(--ink)}
.days-l{display:flex;justify-content:space-between;margin-top:10px}
.spark{display:block;width:100%;height:120px}
.spark polyline{fill:none;stroke:var(--live);stroke-width:1.5;vector-effect:non-scaling-stroke}
.spark .ar{fill:color-mix(in srgb,var(--live) 10%,transparent);stroke:none}
.svc{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;gap:14px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line);font-size:15px}
.svc:last-child{border-bottom:0}
.svc .t{font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--faint)}
.svc .v{font-family:var(--mono);font-size:13px;color:var(--muted);text-align:right;min-width:70px}
.beneath-g .lyr{grid-template-columns:56px minmax(0,1fr);gap:4px 18px;padding:16px 0}.beneath-g .lyr p{grid-column:2}.beneath-g .lyr:hover,.beneath-g .lyr.hot{padding-left:12px}

.gate-card .sp-o{display:grid;gap:12px}
.gate-card .sp-c{grid-template-columns:40px minmax(0,1fr) auto}

/* profile */
.prof{display:grid;grid-template-columns:112px minmax(0,1fr) auto;gap:28px;align-items:center}
.prof-av{width:112px;height:112px;border-radius:var(--r);overflow:hidden;border:1px solid var(--line2);background:var(--g850);display:grid;place-items:center;box-shadow:0 0 0 6px color-mix(in srgb,var(--live) 6%,transparent)}
.prof-av img{width:100%;height:100%;object-fit:cover}
.prof-av span{font-family:var(--disp);font-weight:800;font-size:44px;color:var(--live)}
.prof h1{font-size:clamp(2rem,4vw,3.4rem);margin-top:14px;max-width:none}
.prof .lead{margin-top:10px}
.prof-act{align-self:end}
.idn{display:grid;grid-template-columns:40px minmax(0,1fr) auto;gap:16px;align-items:center;padding:16px 0;border-bottom:1px solid var(--line)}
.idn b{display:block;font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:18px}
.idn .lbl{text-transform:none;letter-spacing:.04em;font-size:12.5px}
.idn .ic{width:34px;height:34px;fill:var(--faint)}
.idn .ic.on{fill:var(--live);filter:drop-shadow(0 0 8px color-mix(in srgb,var(--live) 40%,transparent))}
.plat-l{display:grid;gap:6px;color:var(--ink);transition:background .3s}
.plat-l b{font-family:var(--disp);font-stretch:112%;font-weight:700;font-size:19px}
.plat-l .live-t{margin-top:8px}
.plat-l:hover{background:var(--g900);color:var(--ink)}
@media (max-width:760px){.prof{grid-template-columns:72px minmax(0,1fr)}.prof-av{width:72px;height:72px}.prof-act{grid-column:1/-1}}
