
:root{
  --night:#05090c; --side:#070b11; --panel:#0e141bf2; --panel-2:#121a23; --line:#1b2430; --line-soft:#1b243099;
  --text:#e8ebf0; --muted:#767d89; --faint:#535a66;
  --duck:#fcbb51; --duck-hi:#ffcb6b; --ok:#3fcb57; --bad:#f06a78; --blue:#458efc;
  --track:#212a37;
  --radius:16px;
  font-family: ui-rounded, "SF Pro Rounded", "Segoe UI Variable Display", "Segoe UI", system-ui, sans-serif;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{background:var(--night);color:var(--text);overflow-x:hidden}
button,a{font:inherit;color:inherit;border:0;background:none;cursor:pointer;text-decoration:none}
.faint{color:var(--faint)}


.bob{animation:bob 4.5s ease-in-out infinite;transform-origin:center bottom}
.bob.slow{animation-duration:6s}.bob.late{animation-delay:-2s}
@keyframes bob{0%,100%{transform:translateY(0) rotate(-1.5deg)}50%{transform:translateY(4px) rotate(1.5deg)}}
.zz{position:absolute;font-weight:800;color:#c9d3ff;opacity:0;animation:zz 3.6s ease-in-out infinite;pointer-events:none}
@keyframes zz{0%{opacity:0;transform:translate(0,0) scale(.7)}30%{opacity:.9}100%{opacity:0;transform:translate(16px,-30px) scale(1.2)}}
.dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px #3fcb5722;flex:none}
.dot.off{background:var(--faint);box-shadow:none}

/* ================= dashboard ================= */
.app{display:none;min-height:100%}
.app.show{display:grid;grid-template-columns:262px 1fr}
.side{position:sticky;top:0;height:100vh;padding:22px 16px 18px;background:var(--side);border-right:1px solid var(--line-soft);display:flex;flex-direction:column;gap:4px;overflow:hidden}
.brand{display:flex;align-items:center;gap:12px;padding:0 6px 26px}
.brand img{height:54px;filter:drop-shadow(0 6px 10px #0009)}
.brand b{display:block;font-size:28px;letter-spacing:-.4px;line-height:1}
.brand b span{color:var(--duck)}
.brand small{display:block;font-size:13px;color:var(--muted);margin-top:5px}
.nav{display:flex;align-items:center;gap:14px;padding:13px 14px;border-radius:13px;color:var(--muted);font-size:16px}
.nav svg{width:22px;height:22px;flex:none}
.nav.on{background:linear-gradient(90deg,#fcbb5126,#fcbb510a);color:var(--duck);box-shadow:inset 3px 0 0 var(--duck);font-weight:600}
.nav:hover:not(.on){background:#ffffff08;color:var(--text)}
.side .grow{flex:1}
.nest{position:relative;margin:0 -16px;height:170px}
.nest img{position:absolute;left:4px;bottom:0;height:150px;filter:drop-shadow(0 10px 16px #000a)}
.nest .zz{left:150px;top:20px;font-size:22px}
.conn{padding:10px 6px 0;font-size:14px;line-height:1.6}
.conn .row{display:flex;align-items:center;gap:10px;color:var(--text)}
.conn small{display:block;color:var(--muted);font-size:13px;padding-left:19px}

main{position:relative;min-width:0;padding:0 28px 100px}
.top{position:absolute;z-index:5;right:28px;top:20px;display:flex;gap:10px}
.top .topbtn{width:46px;height:46px;border-radius:14px;background:#05090cb3;border:1px solid var(--line);display:grid;place-content:center;backdrop-filter:blur(8px)}
.top .topbtn svg{width:21px;height:21px;color:var(--text)}
.top .me{border-radius:50%;border-color:#fcbb5188;overflow:hidden;background:#1e1a10}
.top .me img{width:52px;margin-top:6px}
.tip{position:absolute;right:0;top:56px;width:250px;padding:12px 14px;border-radius:14px;background:#05090cf2;border:1px solid var(--line);font-size:13px;color:var(--muted);line-height:1.55;display:none}
.top .topbtn:hover + .tip,.tip:hover{display:block}
.tip b{color:var(--text)}

.hero{position:relative;margin:0 -28px;height:clamp(320px,30vw,560px);overflow:hidden}
.hero img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 50%}
.hero::after{content:"";position:absolute;inset:0;background:radial-gradient(34% 46% at 12% 82%,#05090cd9,transparent 75%),linear-gradient(180deg,transparent 72%,var(--night) 100%)}
.hero .copy{position:absolute;z-index:2;left:50px;bottom:86px;max-width:360px}
.hero h1{font-size:40px;letter-spacing:-.8px;line-height:1.05;text-shadow:0 2px 18px #000e,0 0 40px #000a}
.hero p{margin-top:8px;font-size:17px;color:#d5d9e0;text-shadow:0 2px 12px #000e}

.grid{position:relative;z-index:3;display:grid;gap:18px;margin-top:-64px;grid-template-columns:repeat(12,1fr)}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:20px 22px;backdrop-filter:blur(10px);min-width:0;position:relative}
.card h2{display:flex;align-items:center;gap:12px;font-size:19px;font-weight:700}
.card h2 svg{width:24px;height:24px;color:var(--blue)}
.state{display:flex;align-items:center;gap:7px;font-size:14px;font-weight:600;color:var(--ok);margin-left:6px}
.state.off{color:var(--faint)}
.s7{grid-column:span 7}.s5{grid-column:span 5}.s8{grid-column:span 8}.s4{grid-column:span 4}.s3{grid-column:span 3}

/* PC card */
.pc{display:flex;gap:20px;align-items:center;margin-top:16px}
.screen{position:relative;width:150px;flex:none}
.screen .bezel{height:94px;border-radius:8px;border:3px solid #222b37;background:linear-gradient(160deg,#2c3150,#141a26 55%,#c8723f44);overflow:hidden;display:grid;place-content:center;box-shadow:0 8px 20px #0008}
.screen .bezel img{height:84px;margin-top:10px}
.screen .stand{width:34px;height:14px;margin:0 auto;background:#222b37;clip-path:polygon(25% 0,75% 0,100% 100%,0 100%)}
.screen .foot{width:70px;height:5px;margin:0 auto;border-radius:3px;background:#222b37}
.facts{flex:1;font-size:15px;line-height:1.8;color:var(--muted);min-width:0}
.facts b{display:block;color:var(--text);font-size:19px;letter-spacing:.3px;margin-bottom:2px}
.actions{display:grid;gap:10px;width:220px;flex:none}
.btn{display:flex;align-items:center;justify-content:center;gap:9px;height:46px;padding:0 16px;border-radius:13px;background:#ffffff0b;border:1px solid var(--line);font-size:15px;font-weight:600}
.btn:hover{background:#ffffff15}
.btn svg{width:19px;height:19px}
.btn.primary{background:linear-gradient(180deg,var(--duck-hi),var(--duck));color:#2a1d00;border-color:transparent;box-shadow:0 6px 20px #fcbb5130}
.btn.danger{color:var(--bad)}
.actions>span{display:grid;gap:8px}
.actions>span.pc-off,.asleep .actions>span.pc-on{display:none}.asleep .actions>span.pc-off{display:grid}

/* Pi card */
.pi{display:flex;gap:16px;align-items:center;margin-top:14px}
.berry{width:46px;height:46px;flex:none}
.pi .who{min-width:120px;font-size:14px;color:var(--muted);line-height:1.75}
.pi .who b{display:block;color:var(--text);font-size:18px}
.bars{flex:1;display:grid;gap:12px;font-size:14px;color:var(--muted);min-width:0}
.bar span{display:flex;justify-content:space-between}
.bar span b{color:var(--text);font-weight:600}
.bar i{display:block;height:7px;margin-top:5px;border-radius:7px;background:var(--track);overflow:hidden}
.bar i u{display:block;height:100%;border-radius:7px;background:var(--ok)}
.pi-duck{height:118px;flex:none;margin:-14px -6px -10px 0;filter:drop-shadow(0 10px 14px #0009)}

/* monitoring */
.mon{display:flex;gap:22px;align-items:center;margin-top:18px;flex-wrap:wrap}
.ring{position:relative;width:118px;height:118px}
.ring svg{transform:rotate(-90deg)}
.ring div{position:absolute;inset:0;display:grid;place-content:center;text-align:center;font-size:14px;color:var(--muted)}
.ring div b{font-size:25px;color:var(--text);font-weight:600}
.spark{flex:1;min-width:220px;display:grid;gap:14px}
.spark .row{display:flex;justify-content:space-between;font-size:15px}
.spark svg{width:100%;height:46px;display:block;margin-top:4px}
.asleep-note{display:none;align-items:center;gap:14px;margin-top:16px;color:var(--muted);font-size:15px}
.asleep-note img{height:86px}
.asleep .mon{opacity:.22;filter:grayscale(1)}
.asleep .asleep-note{display:flex}

/* storage */
.disk{margin-top:18px;font-size:14px}
.disk .top-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.disk .top-row em{font-style:normal;margin-left:auto;color:var(--text)}
.disk .ic{width:15px;height:15px;border-radius:4px;background:var(--blue)}
.disk i{display:block;height:9px;border-radius:9px;background:var(--track);overflow:hidden}
.disk i u{display:block;height:100%;border-radius:9px;background:linear-gradient(90deg,#3a7ef0,#458efc)}
.disk small{display:block;color:var(--muted);margin-top:7px;font-size:13px}

/* quick links */
.quick{display:flex;align-items:center;gap:16px;padding:20px 22px}
.quick svg.big{width:40px;height:40px;flex:none}
.quick b{display:block;font-size:17px}
.quick small{display:block;color:var(--muted);font-size:14px;margin-top:3px}
.quick .chev{margin-left:auto;width:18px;height:18px;color:var(--muted)}
.quick:hover{border-color:#fcbb5166}

/* apps + events */
.launch{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:16px}
.tile{border:1px solid var(--line);border-radius:14px;padding:14px 10px;text-align:center;font-size:14px;background:#ffffff05}
.tile svg{width:26px;height:26px;color:var(--duck);display:block;margin:0 auto 8px}
.tile small{display:block;color:var(--faint);margin-top:3px;font-size:12px}
.tile.running small{color:var(--ok)}
.appr{display:flex;align-items:center;gap:12px;padding:11px 2px;border-bottom:1px solid var(--line-soft);font-size:15px}
.appr:last-child{border:0}
.appr .ic{width:32px;height:32px;border-radius:9px;display:grid;place-content:center;background:#ffffff0d;font-weight:700;font-size:13px;color:var(--duck)}
.appr small{display:block;color:var(--faint);font-size:12.5px}
.appr .grow{flex:1}
.appr button{font-size:13px;color:var(--muted);padding:7px 12px;border-radius:10px;border:1px solid var(--line)}
.asleep .apps-card .launch,.asleep .apps-card .list{opacity:.22;filter:grayscale(1);pointer-events:none}
.ev{display:grid;grid-template-columns:54px 1fr;gap:10px;padding:10px 2px;border-bottom:1px solid var(--line-soft);font-size:14px}
.ev:last-child{border:0}
.ev time{color:var(--faint);font-variant-numeric:tabular-nums}
.ev.red span{color:var(--bad)}.ev.green span{color:var(--ok)}.ev.amber span{color:var(--duck)}

/* ================= sign-in ================= */
.gate{display:grid;position:relative;min-height:100vh;place-items:center;padding:24px;overflow:hidden}
.gate.show{display:grid}
.gate .bg{position:absolute;inset:0;background:url(ducks/banner.webp) center/cover;filter:blur(6px) brightness(.45);transform:scale(1.06)}
.gate .box{position:relative;z-index:2;width:min(430px,100%);background:#0b1117e6;border:1px solid var(--line);border-radius:26px;padding:30px 28px 26px;backdrop-filter:blur(14px);text-align:center}
.gate .logo{font-size:22px;font-weight:800;letter-spacing:-.3px;margin-top:4px}.gate .logo span{color:var(--duck)}
.gate h1{font-size:25px;margin-top:10px}
.gate p{color:var(--muted);margin-top:6px;font-size:14px;line-height:1.5}
.mascot{height:150px;margin-top:-104px;filter:drop-shadow(0 14px 18px #000a)}
.field{margin-top:20px;text-align:left}
.field label{font-size:12px;color:var(--muted)}
.field input{margin-top:6px;width:100%;height:48px;border-radius:13px;border:1px solid var(--line);background:#070b11;color:var(--text);padding:0 14px;font:inherit;font-size:16px;outline:none}
.field input:focus{border-color:var(--duck);box-shadow:0 0 0 3px #fcbb5122}
.gate .btn{width:100%;margin-top:14px;height:52px;font-size:16px}
.fine{margin-top:16px;font-size:12px;color:var(--faint);line-height:1.5}
.req{margin-top:16px;padding:12px 14px;border-radius:14px;background:#070b11;border:1px solid var(--line);text-align:left;font-size:13px;color:var(--muted);line-height:1.6}
.req b{color:var(--text)}
.timer{margin-top:12px;font-size:13px;color:var(--duck);font-variant-numeric:tabular-nums}
.step{display:none}
.gate[data-step="login"] .s-login,.gate[data-step="waiting"] .s-waiting,.gate[data-step="approved"] .s-approved{display:block}

/* ================= small screens ================= */
@media (max-width:1100px){
  .s7,.s5,.s8,.s4{grid-column:span 12}.s3{grid-column:span 6}
}
@media (max-width:760px){
  .app.show{grid-template-columns:1fr}
  .side{position:fixed;z-index:30;top:auto;bottom:0;left:0;right:0;height:auto;flex-direction:row;justify-content:space-around;padding:6px 4px calc(6px + env(safe-area-inset-bottom));border-right:0;border-top:1px solid var(--line)}
  .brand,.side .grow,.nest,.conn,.nav .lbl,.nav.hide-m{display:none}
  .nav{padding:10px 13px}.nav.on{box-shadow:inset 0 -3px 0 var(--duck)}
  main{padding:0 14px 150px}
  .top{right:14px;top:14px}
  .hero{margin:0 -14px;height:auto;overflow:visible;padding-top:calc((100vw) / 3)}
  .hero img{height:calc(100vw / 3);bottom:auto}
  .hero::after{bottom:auto;height:calc(100vw / 3);background:linear-gradient(180deg,transparent 60%,var(--night) 100%)}
  .hero .copy{position:relative;left:auto;top:auto;padding:10px 16px 0;max-width:none}
  .hero h1{font-size:28px}.hero p{font-size:15px}
  .top .topbtn{width:40px;height:40px}.top .me img{width:46px}
  .grid{margin-top:16px;gap:14px}.s3{grid-column:span 12}
  .pc{flex-wrap:wrap}.actions{width:100%}.screen{width:120px}
  .pi-duck{display:none}.pi .who{min-width:0}.pi{flex-wrap:wrap}.bars{min-width:100%}
}

/* ================= app pages ================= */
[hidden]{display:none!important}
.page-head{position:relative;z-index:3;display:flex;align-items:center;gap:14px;padding:30px 0 6px}
.page-head h1{font-size:30px;letter-spacing:-.4px}
.page-head img{height:64px;filter:drop-shadow(0 8px 12px #0009)}
.page-head p{color:var(--muted);margin-top:4px}
.page:not([data-page="home"]) .grid{margin-top:18px}
.nav{user-select:none}
.empty{color:var(--muted);font-size:14px;padding:18px 2px}
.err{color:var(--bad)}
.ok{color:var(--ok)}
.crumbs{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:14px;font-size:14px;color:var(--muted)}
.crumbs button{padding:5px 9px;border-radius:9px;border:1px solid var(--line);color:var(--text)}
.toolbar{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}
.toolbar input[type=search]{flex:1;min-width:180px;height:42px;border-radius:12px;border:1px solid var(--line);background:#070b11;color:var(--text);padding:0 12px;font:inherit;font-size:15px;outline:none}
.toolbar input[type=search]:focus{border-color:var(--duck)}
.files{margin-top:10px}
.frow{display:flex;align-items:center;gap:12px;padding:10px 4px;border-bottom:1px solid var(--line-soft);font-size:15px;cursor:pointer;border-radius:8px}
.frow:hover{background:#ffffff06}
.frow svg{width:22px;height:22px;flex:none}
.frow .name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.frow small{color:var(--muted);font-size:12.5px;white-space:nowrap}
.frow .st{font-size:12.5px;color:var(--duck);white-space:nowrap}
.logline{font:12.5px/1.55 ui-monospace,Consolas,monospace;padding:3px 2px;border-bottom:1px solid #1b243055;word-break:break-word}
.logline.red{color:var(--bad)}.logline.green{color:var(--ok)}.logline.amber{color:var(--duck)}
.logs{max-height:520px;overflow:auto;margin-top:10px}
.sess{display:flex;align-items:center;gap:12px;padding:12px 2px;border-bottom:1px solid var(--line-soft);font-size:14px}
.sess:last-child{border:0}
.sess .grow{flex:1}.sess small{display:block;color:var(--muted)}
.sess button{font-size:13px;padding:7px 12px;border-radius:10px;border:1px solid var(--line);color:var(--muted)}
.chip{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:6px 11px;border-radius:999px;border:1px solid var(--line);color:var(--muted);background:#ffffff05}
.chip b{color:var(--text);font-weight:600}
.chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
.btn[disabled]{opacity:.45;pointer-events:none}
.toast{position:fixed;z-index:80;left:50%;bottom:24px;transform:translateX(-50%);max-width:min(520px,calc(100% - 28px));padding:12px 18px;border-radius:14px;background:#0e141bf7;border:1px solid var(--line);font-size:14px;box-shadow:0 10px 30px #000a;display:none}
.toast.show{display:block}
.toast.bad{border-color:#f06a7888;color:#ffc2c9}
dialog{margin:auto;border:1px solid var(--line);border-radius:20px;background:#0b1117;color:var(--text);padding:24px;width:min(420px,calc(100% - 28px));box-shadow:0 20px 60px #000c}
dialog::backdrop{background:#000a;backdrop-filter:blur(3px)}
dialog h3{font-size:20px}dialog p{color:var(--muted);margin-top:8px;line-height:1.5;font-size:14px}
dialog .row{display:flex;gap:10px;margin-top:20px;flex-wrap:wrap}.dialog-btns .btn{flex:1}
.progress{height:6px;border-radius:6px;background:var(--track);overflow:hidden;margin-top:10px}
.progress u{display:block;height:100%;background:var(--duck);width:0}
@media (max-width:760px){
  .toast{bottom:84px}
  .page-head{padding-top:70px}
}
