@font-face{font-family:"JV Digits";src:url(components/orbitron-subset.woff) format("woff");font-weight:400 900;font-display:swap}
:root{
  --jv-bg-0:#01060c;--jv-bg-1:#041220;--jv-bg-2:rgba(8,32,52,.55);--jv-bg-3:rgba(14,52,80,.72);
  --jv-cyan:#00e5ff;--jv-cyan-2:#5ff4ff;--jv-cyan-dim:#1b8fa8;--jv-blue:#2a7fff;
  --jv-line:rgba(0,229,255,.28);--jv-line-strong:rgba(0,229,255,.65);--jv-grid:rgba(0,229,255,.05);
  --jv-text:#e6fbff;--jv-text-2:#9cc7d4;--jv-text-3:#5f8a99;
  --jv-amber:#ffb627;--jv-red:#ff3b5c;--jv-green:#3dffa8;--jv-violet:#b583ff;
  --jv-aqi-1:#3dffa8;--jv-aqi-2:#ffe14d;--jv-aqi-3:#ffb627;--jv-aqi-4:#ff3b5c;--jv-aqi-5:#b583ff;--jv-aqi-6:#c2185b;
  --jv-ai:#b583ff;--jv-ai-2:#d9c2ff;
  --jv-glow-sm:0 0 6px rgba(0,229,255,.55);--jv-glow-md:0 0 10px rgba(0,229,255,.6),0 0 24px rgba(0,229,255,.25);--jv-glow-lg:0 0 14px rgba(0,229,255,.7),0 0 40px rgba(0,229,255,.35);
  --jv-ai-glow:0 0 10px rgba(181,131,255,.6),0 0 26px rgba(181,131,255,.25);
  --jv-font-num:"JV Digits","Orbitron","DIN Alternate","Bahnschrift",ui-monospace,monospace;
  --jv-font-cn:"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC","Noto Sans CJK SC","Source Han Sans SC",system-ui,sans-serif;
  --jv-ease-out:cubic-bezier(.16,1,.3,1);--jv-ease-io:cubic-bezier(.65,0,.35,1);
  /* v2 orb */
  --orb-size:320px;--orb-top:42%;--orb-c:0,229,255;--orb-dock-scale:.25;--orb-dock-top:62px;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;background:var(--jv-bg-0);color:var(--jv-text);font-family:var(--jv-font-cn);overflow:hidden}
body{background:radial-gradient(900px 640px at 50% 42%,rgba(0,120,180,.16),transparent 65%),var(--jv-bg-0)}
body::before{content:"";position:fixed;inset:0;pointer-events:none;background-image:linear-gradient(var(--jv-grid) 1px,transparent 1px),linear-gradient(90deg,var(--jv-grid) 1px,transparent 1px);background-size:40px 40px;mask-image:radial-gradient(ellipse at 50% 42%,#000 20%,transparent 75%);-webkit-mask-image:radial-gradient(ellipse at 50% 42%,#000 20%,transparent 75%)}
body::after{content:"";position:fixed;inset:0;pointer-events:none;z-index:200;background:repeating-linear-gradient(0deg,rgba(0,229,255,.03) 0 1px,transparent 1px 3px)}
.num{font-family:var(--jv-font-num);font-variant-numeric:tabular-nums;letter-spacing:.04em}
.lbl{font-family:var(--jv-font-num);font-size:10px;letter-spacing:.22em;color:var(--jv-cyan-dim);text-transform:uppercase}
.demo-tag{position:fixed;left:12px;bottom:10px;z-index:210;font-size:11px;color:var(--jv-amber);border:1px dashed rgba(255,182,39,.6);padding:2px 8px;background:rgba(0,0,0,.5)}
button{font-family:inherit}
/* top line */
.top{position:fixed;top:0;left:0;right:0;height:56px;z-index:60;display:flex;align-items:center;justify-content:space-between;padding:0 28px}
.top .g{font-size:14px;color:var(--jv-text-2);letter-spacing:.06em}.top .g b{color:var(--jv-cyan);font-weight:500}
.top .brand{font-family:var(--jv-font-num);font-size:11px;letter-spacing:.5em;color:var(--jv-cyan-dim);position:absolute;left:50%;transform:translateX(-50%)}
.top .r{display:flex;align-items:center;gap:14px}
.top .clk{font-family:var(--jv-font-num);font-size:15px;font-weight:400;color:var(--jv-text-2);letter-spacing:.12em}
.top .clk .s{color:var(--jv-cyan-dim);font-size:12px}
.ghost{height:36px;padding:0 12px;display:inline-flex;align-items:center;gap:6px;border:1px solid transparent;background:none;color:var(--jv-text-3);font-size:13px;cursor:pointer;transition:all .2s}
.ghost:hover,.ghost.on{color:var(--jv-cyan);border-color:var(--jv-line)}
.ghost svg{width:16px;height:16px}
/* ===== ORB ===== */
.orb{position:fixed;left:50%;top:var(--orb-top);width:var(--orb-size);height:var(--orb-size);z-index:120;transform:translate(-50%,-50%);transition:top .5s var(--jv-ease-io),transform .5s var(--jv-ease-io);pointer-events:none}
.orb svg.ring{position:absolute;inset:0;width:100%;height:100%;overflow:visible;transition:opacity .4s}
.orb .ring circle,.orb .ring path{transition:stroke .5s}
.ring.r1{animation:spin 30s linear infinite}.ring.r2{animation:spin 18s linear infinite reverse}.ring.r3{animation:spin 46s linear infinite}.ring.r4{animation:spin 11s linear infinite reverse}
.ring.scan{opacity:0;animation:spin 1.1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.core{position:absolute;left:50%;top:50%;width:38%;height:38%;margin:-19% 0 0 -19%;border-radius:50%;
 background:radial-gradient(circle at 50% 45%,#fff 0,rgba(var(--orb-c),1) 22%,rgba(var(--orb-c),.55) 48%,rgba(var(--orb-c),.08) 72%,transparent 74%);
 box-shadow:0 0 40px rgba(var(--orb-c),.55),0 0 110px rgba(var(--orb-c),.28),inset 0 0 30px rgba(var(--orb-c),.6);animation:breathe 4s ease-in-out infinite;transition:background .5s,box-shadow .5s}
.core::after{content:"";position:absolute;inset:-14%;border-radius:50%;border:1px solid rgba(var(--orb-c),.45)}
@keyframes breathe{0%,100%{transform:scale(.94);opacity:.85}50%{transform:scale(1.04);opacity:1}}
.halo{position:absolute;left:50%;top:50%;width:40%;height:40%;margin:-20% 0 0 -20%;border-radius:50%;border:2px solid rgba(var(--orb-c),.9);opacity:0}
.wave{position:absolute;left:50%;top:calc(100% + 6px);transform:translateX(-50%);display:flex;gap:3px;align-items:center;height:34px;opacity:0;transition:opacity .3s}
.wave i{width:3px;height:4px;border-radius:2px;background:linear-gradient(var(--jv-ai-2),var(--jv-ai));box-shadow:0 0 6px rgba(181,131,255,.7)}
/* states */
.s-listening .orb{--orb-c:95,244,255}
.s-listening .core{animation:none;transform:scale(1.08);box-shadow:0 0 60px rgba(95,244,255,.75),0 0 150px rgba(0,229,255,.35),inset 0 0 30px rgba(255,255,255,.4)}
.s-listening .orb .ring{opacity:1}
.orb.blip .core{filter:brightness(1.45)}
.s-thinking .orb,.s-speaking .orb{--orb-c:181,131,255}
.s-thinking .ring.r1{animation-duration:3s;animation-direction:reverse}.s-thinking .ring.r2{animation-duration:2s;animation-direction:normal}.s-thinking .ring.r3{animation-duration:6s;animation-direction:reverse}.s-thinking .ring.r4{animation-duration:1.4s;animation-direction:normal}
.s-thinking .ring.scan{opacity:1}
.s-thinking .core{animation:breathe 1.2s ease-in-out infinite}
.s-speaking .core{animation:talk .32s ease-in-out infinite alternate}
.s-speaking .halo{animation:halo 1.6s var(--jv-ease-out) infinite}.s-speaking .halo.b{animation-delay:.8s}
.s-speaking .wave{opacity:1}
@keyframes talk{from{transform:scale(.92);filter:brightness(1)}to{transform:scale(1.1);filter:brightness(1.35)}}
@keyframes halo{0%{transform:scale(1);opacity:.85}100%{transform:scale(2.6);opacity:0}}
/* docked (board open) */
.docked .orb{top:var(--orb-dock-top);transform:translate(-50%,-50%) scale(var(--orb-dock-scale))}
.docked .orb .wave{display:none}
.release{position:fixed;left:50%;top:var(--orb-top);width:120px;height:120px;margin:-60px 0 0 -60px;border-radius:50%;border:2px solid var(--jv-cyan);box-shadow:var(--jv-glow-lg);opacity:0;z-index:119;pointer-events:none}
.releasing .release{animation:rel .7s var(--jv-ease-out)}
@keyframes rel{0%{opacity:.9;transform:scale(.6)}100%{opacity:0;transform:scale(9)}}
/* ===== answer area ===== */
.stage{position:fixed;left:50%;top:calc(var(--orb-top) + var(--orb-size)/2 + 40px);transform:translateX(-50%);width:min(720px,92vw);text-align:center;z-index:50;transition:opacity .3s}
.docked .stage{opacity:0;pointer-events:none}
.sline{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--jv-ai-2);letter-spacing:.04em;min-height:20px}
.sline .sp{width:12px;height:12px;border:2px solid rgba(181,131,255,.3);border-top-color:var(--jv-ai);border-radius:50%;animation:spin .8s linear infinite}
.sline.src{color:var(--jv-text-3)}.sline.src .sp{animation:none;border-color:var(--jv-green)}
.ans{margin-top:10px;font-size:20px;line-height:1.65;color:var(--jv-text);letter-spacing:.02em;min-height:34px}
.ans .num{color:var(--jv-cyan-2);text-shadow:var(--jv-glow-sm)}
.ans .fresh{color:#fff;text-shadow:0 0 12px var(--jv-ai),0 0 2px #fff}
.caret{display:inline-block;width:10px;height:22px;margin-left:3px;vertical-align:-4px;background:var(--jv-ai);box-shadow:var(--jv-ai-glow);animation:blink .9s steps(1) infinite}
@keyframes blink{50%{opacity:0}}
.ans .q{display:block;font-size:13px;color:var(--jv-text-3);margin-bottom:6px}
.hint{font-size:12px;color:var(--jv-text-3);margin-top:10px;letter-spacing:.06em}
/* alerts */
.alert{display:inline-grid;grid-template-columns:22px 1fr;gap:4px 10px;text-align:left;border:1px solid;padding:12px 16px;font-size:14px;line-height:1.5;max-width:560px;margin-top:6px}
.alert svg{width:20px;height:20px;margin-top:1px}
.alert b{display:block;font-size:15px}.alert p{color:var(--jv-text-2);font-size:13px}
.alert .acts{grid-column:2;display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.alert.amber{color:var(--jv-amber);border-color:rgba(255,182,39,.6);background:rgba(255,182,39,.07)}
.alert.red{color:var(--jv-red);border-color:rgba(255,59,92,.6);background:rgba(255,59,92,.08)}
.btn{height:44px;padding:0 14px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid var(--jv-line);background:rgba(0,229,255,.05);color:var(--jv-text);font-size:13px;cursor:pointer;white-space:nowrap}
.btn.pri{background:var(--jv-cyan);color:var(--jv-bg-0);border-color:var(--jv-cyan);font-weight:600}
.btn[disabled]{opacity:.45}
/* history */
.hist{display:none;margin:0 auto 14px;max-height:220px;overflow:auto;text-align:left;border-left:1px solid var(--jv-line);padding-left:14px}
.show-hist .hist{display:block}
.hist .t{padding:8px 0;border-bottom:1px dashed rgba(0,229,255,.15)}
.hist .t .uq{font-size:13px;color:var(--jv-text-3)}
.hist .t .ua{font-size:14px;color:var(--jv-text-2);margin-top:3px;line-height:1.55}
.hist .t .ua .num{color:var(--jv-cyan)}
.chipk{display:inline-flex;align-items:center;gap:4px;margin-top:5px;height:26px;padding:0 8px;font-size:11px;border:1px solid var(--jv-line);color:var(--jv-cyan);background:rgba(0,229,255,.05);cursor:pointer}
/* ===== input ===== */
.cmdwrap{position:fixed;left:50%;bottom:56px;transform:translateX(-50%);width:min(640px,92vw);z-index:150;transition:bottom .5s var(--jv-ease-io),width .5s var(--jv-ease-io)}
.docked .cmdwrap{bottom:20px;width:min(760px,92vw)}
.cmd{height:56px;display:flex;align-items:center;gap:10px;padding:0 6px 0 18px;border:1px solid var(--jv-line);background:rgba(4,18,32,.82);
 clip-path:polygon(14px 0,100% 0,100% calc(100% - 14px),calc(100% - 14px) 100%,0 100%,0 14px);transition:border-color .25s,box-shadow .25s,background .25s}
.cmd .p{font-family:var(--jv-font-num);font-size:13px;color:var(--jv-cyan)}
.cmd input{flex:1;min-width:0;background:none;border:0;outline:0;color:var(--jv-text);font-size:16px;font-family:inherit}
.cmd input::placeholder{color:var(--jv-text-3)}
.cmd .cnt{font-family:var(--jv-font-num);font-size:11px;color:var(--jv-text-3)}
.cmd .send{width:44px;height:44px;display:grid;place-items:center;border:0;background:rgba(0,229,255,.15);color:var(--jv-cyan);cursor:pointer;clip-path:polygon(8px 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%,0 8px)}
.cmd .send svg{width:18px;height:18px}
.s-listening .cmd{border-color:var(--jv-cyan);background:rgba(0,229,255,.07);box-shadow:inset 0 0 20px rgba(0,229,255,.12)}
.s-listening .cmd .send{background:var(--jv-cyan);color:var(--jv-bg-0)}
.s-thinking .cmd,.s-speaking .cmd{border-color:rgba(181,131,255,.5)}
.cmd.over{border-color:var(--jv-amber)}.cmd.over .cnt{color:var(--jv-amber)}
.cmdwrap .under{display:flex;justify-content:space-between;font-size:11px;color:var(--jv-text-3);margin-top:6px;padding:0 4px}
/* ===== BOARD (通用容器 .jb) ===== */
.jb-mask{position:fixed;inset:0;z-index:90;background:rgba(1,6,12,.55);opacity:0;visibility:hidden;transition:opacity .35s var(--jv-ease-io),visibility .35s}
.board-open .jb-mask{opacity:1;visibility:visible}
.jb{position:fixed;z-index:100;left:50%;top:104px;bottom:108px;transform:translateX(-50%);width:min(1360px,calc(100vw - 48px));display:flex;flex-direction:column;visibility:hidden;pointer-events:none}
.board-open .jb{visibility:visible;pointer-events:auto}
.jb--md{width:min(900px,calc(100vw - 48px))}.jb--sm{width:min(560px,calc(100vw - 48px));bottom:auto}
.jb-h{display:flex;align-items:center;gap:14px;padding:0 4px 10px;opacity:0;transition:opacity .3s .5s}
.board-open .jb-h{opacity:1}
.jb-h h2{font-size:22px;font-weight:600;letter-spacing:.06em}
.jb-h h2 .num{color:var(--jv-cyan-2);font-size:18px;margin-left:6px;text-shadow:var(--jv-glow-sm)}
.jb-h .skill{font-family:var(--jv-font-num);font-size:10px;letter-spacing:.3em;color:var(--jv-cyan-dim);border:1px solid var(--jv-line);padding:3px 8px}
.jb-h .src{margin-left:auto;font-size:12px;color:var(--jv-text-3)}
.jb-h .src i{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--jv-green);box-shadow:0 0 6px var(--jv-green);margin-right:6px}
.icbtn{width:44px;height:44px;display:inline-grid;place-items:center;border:1px solid var(--jv-line);background:rgba(0,229,255,.04);color:var(--jv-cyan);cursor:pointer;flex:none}
.icbtn svg{width:20px;height:20px}
.grab{display:none}
.jb-b{flex:1;min-height:0;display:grid;gap:14px;grid-template-columns:repeat(12,minmax(0,1fr));grid-template-rows:150px 1fr 1fr}
/* subtitle when docked */
.sub{position:fixed;left:50%;top:22px;transform:translateX(-50%);z-index:125;width:min(1000px,84vw);display:flex;justify-content:center;pointer-events:none;opacity:0;transition:opacity .3s}
.docked .sub{opacity:1}
.sub .tx{margin-left:150px;margin-top:0;font-size:16px;line-height:1.5;color:var(--jv-text);text-align:left;max-width:640px;min-height:24px}
.sub .tx .num{color:var(--jv-cyan-2)}
/* cards */
.card{position:relative;min-width:0;background:linear-gradient(160deg,rgba(10,40,64,.78),rgba(4,18,32,.72));border:1px solid var(--jv-line);padding:14px 16px;
 backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:inset 0 0 30px rgba(0,229,255,.05);overflow:hidden;
 opacity:0;transform:translate(var(--fx,0),var(--fy,0)) scale(.18);transition:transform .46s var(--jv-ease-out),opacity .3s ease-out;transition-delay:calc(var(--i,0) * 60ms)}
.board-open .card{opacity:1;transform:none}
.closing .card{transition-delay:calc((6 - var(--i,0)) * 40ms);transition-duration:.32s}
.card::before,.card::after{content:"";position:absolute;width:12px;height:12px;border:2px solid var(--jv-cyan);filter:drop-shadow(0 0 4px var(--jv-cyan))}
.card::before{top:-1px;left:-1px;border-right:0;border-bottom:0}.card::after{bottom:-1px;right:-1px;border-left:0;border-top:0}
.ch{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.ch h3{font-size:14px;font-weight:600;letter-spacing:.06em;display:flex;align-items:center;gap:8px}
.ch h3::before{content:"";width:6px;height:6px;background:var(--jv-cyan);box-shadow:var(--jv-glow-sm);transform:rotate(45deg)}
.c-verdict{grid-column:span 8;border-color:var(--jv-line-strong);background:linear-gradient(120deg,rgba(0,229,255,.16),rgba(4,18,32,.75) 60%);padding:18px 24px;display:flex;flex-direction:column;justify-content:center}
.c-verdict h1{font-size:32px;line-height:1.3;font-weight:700;color:#fff;text-shadow:0 0 18px rgba(0,229,255,.45)}
.c-verdict .hl{color:var(--jv-cyan-2)}.c-verdict .warn{color:var(--jv-amber);text-shadow:0 0 16px rgba(255,182,39,.5)}
.badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.badge{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;font-size:14px;font-weight:600;border:1px solid currentColor;background:rgba(0,0,0,.25)}
.b-rain{color:var(--jv-amber)}.b-ok{color:var(--jv-cyan)}
.c-now{grid-column:span 4;display:grid;grid-template-columns:auto 1fr;gap:16px;align-items:center}
.c-now .t{font-family:var(--jv-font-num);font-size:56px;font-weight:700;color:var(--jv-cyan-2);text-shadow:var(--jv-glow-lg);line-height:1}
.c-now .t sup{font-size:22px;vertical-align:top}
.c-now .w{font-size:14px;margin-top:6px;text-align:center}
.kv{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px}
.kv div{border-left:2px solid var(--jv-line);padding-left:8px;font-size:11px;color:var(--jv-text-3)}
.kv .num{display:block;font-size:17px;color:var(--jv-text)}
.c-wear{grid-column:span 5}.c-commute{grid-column:span 4}.c-air{grid-column:span 3}
.c-trend{grid-column:span 7}.c-week{grid-column:span 5}
.who{display:grid;grid-template-columns:40px 1fr;gap:10px;padding:8px 0;border-bottom:1px dashed var(--jv-line)}
.who:last-of-type{border-bottom:0}
.who .av{width:40px;height:40px;border:1px solid var(--jv-line-strong);border-radius:50%;display:grid;place-items:center;font-size:12px;color:var(--jv-cyan);background:rgba(0,229,255,.06)}
.who b{font-size:15px;color:#fff;display:block}.who p{font-size:12px;color:var(--jv-text-2);margin-top:3px}
.tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.tag{font-size:12px;padding:3px 8px;border:1px solid var(--jv-line);color:var(--jv-text-2)}.tag.a{border-color:var(--jv-amber);color:var(--jv-amber)}
.slot{display:grid;grid-template-columns:auto 1fr;gap:12px;padding:10px 12px;border:1px solid var(--jv-line);margin-bottom:8px;align-items:center}
.slot.rain{border-color:rgba(255,182,39,.6);background:rgba(255,182,39,.06)}
.slot .tm{font-family:var(--jv-font-num);font-size:12px;color:var(--jv-cyan);line-height:1.5}.slot .tm b{display:block;font-size:11px;color:var(--jv-text-3);font-family:var(--jv-font-cn);font-weight:400}
.slot p{font-size:14px;line-height:1.45}.slot.rain p{color:var(--jv-amber)}
.gauge{display:flex;align-items:center;gap:10px;margin-bottom:10px}.gauge svg{width:54px;height:54px;flex:none}
.gauge .v{font-family:var(--jv-font-num);font-size:20px}.gauge .s{font-size:12px;color:var(--jv-text-2)}
.cw{height:calc(100% - 30px);min-height:150px}.cw svg{width:100%;height:100%;display:block}
.days{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;height:calc(100% - 30px);min-height:150px}
.day{border:1px solid var(--jv-line);display:flex;flex-direction:column;align-items:center;justify-content:space-between;padding:8px 2px;background:rgba(0,229,255,.03)}
.day.tg{border-color:var(--jv-cyan);background:rgba(0,229,255,.12);box-shadow:inset 0 0 14px rgba(0,229,255,.2)}
.day .n{font-size:12px;color:var(--jv-text-2);text-align:center;line-height:1.3}.day.tg .n{color:var(--jv-cyan);font-weight:600}
.day svg{width:28px;height:28px}.day .hi{font-family:var(--jv-font-num);font-size:15px}.day .lo{font-family:var(--jv-font-num);font-size:12px;color:var(--jv-text-3)}
.day .pp{font-family:var(--jv-font-num);font-size:11px;color:var(--jv-blue)}.day .pp.h{color:var(--jv-amber)}
.rng{display:none}
.wx{stroke:var(--jv-cyan);fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 3px rgba(0,229,255,.7))}
.wx .rain{stroke:var(--jv-blue)}.wx .sun{stroke:var(--jv-amber)}
/* auth */
.modal-mask{position:fixed;inset:0;z-index:180;background:rgba(1,4,10,.72);display:none;grid-template-columns:minmax(0,420px);justify-content:center;align-content:center;padding:16px}
.auth-open .modal-mask{display:grid}
.modal{position:relative;padding:26px 24px 22px;background:linear-gradient(170deg,rgba(10,40,64,.97),rgba(3,12,22,.98));border:1px solid var(--jv-line-strong);box-shadow:0 0 50px rgba(0,229,255,.2)}
.modal::before,.modal::after{content:"";position:absolute;width:16px;height:16px;border:2px solid var(--jv-cyan)}
.modal::before{top:-2px;left:-2px;border-right:0;border-bottom:0}.modal::after{bottom:-2px;right:-2px;border-left:0;border-top:0}
.lock{width:72px;height:72px;margin:0 auto 14px;position:relative}.lock svg{position:absolute;inset:0;width:100%;height:100%}.lock .lr{animation:spin 10s linear infinite}
.modal h3{text-align:center;font-size:19px;letter-spacing:.06em}
.modal .sb{text-align:center;font-size:13px;color:var(--jv-text-2);margin:6px 0 18px;line-height:1.6}
.pw{display:flex;align-items:center;height:52px;border:1px solid var(--jv-cyan);background:rgba(0,229,255,.06);box-shadow:var(--jv-glow-sm);padding:0 4px 0 14px}
.pw input{flex:1;min-width:0;background:none;border:0;outline:0;color:var(--jv-cyan-2);font-size:20px;letter-spacing:.35em}
.pw .eye{width:44px;height:44px;display:grid;place-items:center;background:none;border:0;color:var(--jv-text-2)}.pw .eye svg{width:20px;height:20px}
.modal .note{font-size:12px;color:var(--jv-text-3);margin:8px 2px 18px}
.modal .err{font-size:13px;color:var(--jv-red);margin:8px 2px 0;display:none}
.auth-bad .modal .err{display:block}.auth-bad .pw{border-color:var(--jv-red);box-shadow:0 0 10px rgba(255,59,92,.35);animation:shake .35s}
@keyframes shake{25%{transform:translateX(-6px)}75%{transform:translateX(6px)}}
.modal .acts{display:grid;grid-template-columns:1fr 1.6fr;gap:10px}.modal .acts .btn{height:48px}
/* errors overview */
.errs{position:fixed;inset:0;z-index:190;background:var(--jv-bg-0);display:none;padding:28px 32px;overflow:auto}
.errs-open .errs{display:block}
.errs h2{font-size:20px;letter-spacing:.08em}.errs .sb{font-size:13px;color:var(--jv-text-3);margin:4px 0 18px}
.egrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.ecard{border:1px solid var(--jv-line);padding:14px;background:rgba(6,24,40,.7)}
.ecard .k{font-family:var(--jv-font-num);font-size:11px;letter-spacing:.2em;color:var(--jv-cyan-dim);margin-bottom:10px}
.ecard .alert{display:grid;max-width:none;margin:0}
.ecard .mini{font-size:12px;color:var(--jv-text-3);margin-top:8px}
/* ===== mobile ===== */
@media (max-width:900px){
 :root{--orb-size:220px;--orb-top:36%;--orb-dock-scale:.2;--orb-dock-top:40px}
 .top{height:48px;padding:0 14px;padding-top:env(safe-area-inset-top)}
 .top .brand{display:none}.top .g{font-size:13px}.top .clk{font-size:13px}
 .top .r{gap:4px}.ghost{height:44px;padding:0 8px}.ghost .t{display:none}
 .ring.r3,.ring.r4{display:none}
 .card,.modal{backdrop-filter:none;-webkit-backdrop-filter:none}
 .card{background:rgba(6,24,40,.95)}
 .stage{top:calc(var(--orb-top) + var(--orb-size)/2 + 44px);width:calc(100vw - 32px)}
 .ans{font-size:17px}
 .cmdwrap{left:0;right:0;transform:none;width:auto!important;bottom:0!important;padding:8px 10px calc(8px + env(safe-area-inset-bottom));background:linear-gradient(180deg,rgba(1,6,12,0),rgba(1,6,12,.95) 35%)}
 .cmdwrap .under{display:none}
 .cmd{height:52px}
 .jb{left:0;right:0;top:0;bottom:0;width:auto!important;transform:translateY(0);background:#030e1a;padding:calc(76px + env(safe-area-inset-top)) 12px 84px;overflow-y:auto;transition:transform .35s var(--jv-ease-out)}
 .jb-mask{display:none}
 .jb-h{position:fixed;top:0;left:0;right:0;z-index:5;background:linear-gradient(#030e1a 80%,rgba(3,14,26,0));padding:calc(8px + env(safe-area-inset-top)) 12px 8px 64px;flex-wrap:wrap;gap:4px 10px}
 .jb-h h2{font-size:17px}.jb-h h2 .num{font-size:14px}.jb-h .skill{display:none}
 .jb-h .src{order:5;width:100%;margin-left:0;font-size:11px}
 .jb-h .icbtn{margin-left:auto}
 .grab{display:block;position:fixed;top:4px;left:50%;width:40px;height:4px;margin-left:-20px;border-radius:2px;background:var(--jv-line-strong);z-index:6}
 .jb-b{display:flex;flex-direction:column;gap:12px}
 .c-verdict{padding:16px}.c-verdict h1{font-size:24px}
 .c-now .t{font-size:44px}
 .cw{height:auto;overflow-x:auto}.cw svg{width:640px;height:170px}
 .days{grid-template-columns:1fr;height:auto;gap:0}
 .day{flex-direction:row;height:46px;padding:0 8px;border-width:0 0 1px 0;background:none}
 .day.tg{border:1px solid var(--jv-cyan)}
 .day .n{width:64px;text-align:left}.day .hi,.day .lo{width:34px;text-align:right}.day .pp{width:40px;text-align:right}
 .rng{display:block;flex:1;height:4px;margin:0 8px;background:rgba(0,229,255,.1);position:relative}.rng i{position:absolute;top:0;bottom:0;background:linear-gradient(90deg,var(--jv-blue),var(--jv-cyan));border-radius:2px}
 .sub{top:calc(48px + env(safe-area-inset-top));z-index:130;width:auto;left:12px;right:12px;transform:none;justify-content:flex-start}
 .sub .tx{margin-left:0;font-size:14px}
 .docked .sub{opacity:1}
 .board-open.docked .jb{padding-top:calc(120px + env(safe-area-inset-top))}
 .board-open .jb-h{top:0}
 .docked .orb{left:36px}
 .egrid{grid-template-columns:1fr}.errs{padding:16px}
}
@media (prefers-reduced-motion:reduce){
 *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;transition-delay:0s!important}
}

@media (max-width:900px){
 .jb-b>.card{flex:0 0 auto;height:auto!important;min-height:0}
 .sub{top:calc(80px + env(safe-area-inset-top));background:#030e1a;padding:4px 0 8px;box-shadow:0 10px 12px -4px #030e1a}
 .board-open.docked .jb{padding-top:calc(150px + env(safe-area-inset-top))}
 .demo-tag{top:auto;bottom:calc(84px + env(safe-area-inset-bottom));left:auto;right:12px;font-size:9px;opacity:.6}
 .board-open .demo-tag,.errs-open .demo-tag{display:none}
}
