/* Jasca 项目空间：黑绿终端风格，和机身屏幕的配色一致 */
:root{
  --bg:#040605; --panel:#080d0a; --panel2:#0b120e;
  --line:#13221a; --line2:#1d3727;
  --g:#4dfa8a; --g-soft:rgba(77,250,138,.14); --g-glow:rgba(77,250,138,.5); --g-dim:#2a7d4b;
  --text:#cfe9d7; --muted:#6c8b77; --faint:#3a5444;
  --red:#ff5468; --red-glow:rgba(255,84,104,.5);
  --mono:ui-monospace,"JetBrains Mono","Cascadia Code","Cascadia Mono",Consolas,"SFMono-Regular",Menlo,"Liberation Mono","PingFang SC","Microsoft YaHei","Noto Sans CJK SC",monospace;
  --sans:"Inter","PingFang SC","Microsoft YaHei","Noto Sans CJK SC","Segoe UI",system-ui,sans-serif;
  --cut:14px;
}
*{box-sizing:border-box}
html{background:var(--bg)}
body{margin:0;min-height:100vh;background:var(--bg);color:var(--text);font:15px/1.65 var(--sans);-webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:var(--g);text-decoration:none}
a:hover{text-decoration:underline}
::selection{background:var(--g);color:#000}
[hidden]{display:none!important}
button{font-family:inherit}

/* background: grid + glow + scanlines */
.jx-bg{position:fixed;inset:0;z-index:-1;pointer-events:none;
  background:
    radial-gradient(900px 520px at 50% 18%,rgba(77,250,138,.09),transparent 70%),
    linear-gradient(rgba(77,250,138,.07) 1px,transparent 1px) 0 0/36px 36px,
    linear-gradient(90deg,rgba(77,250,138,.07) 1px,transparent 1px) 0 0/36px 36px,
    var(--bg)}
.jx-bg::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(0,0,0,.22) 0 1px,transparent 1px 3px);mix-blend-mode:multiply}
.jx-bg::before{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.7))}

/* ===== top bar ===== */
.jx-bar{position:sticky;top:0;z-index:30;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 20px;min-height:47px;font:12px/1 var(--mono);letter-spacing:.06em;border-bottom:1px solid var(--line);background:rgba(4,6,5,.82);backdrop-filter:blur(8px)}
.jx-brand{display:flex;align-items:center;gap:10px;color:var(--text);font-weight:600;white-space:nowrap}
.jx-brand:hover{text-decoration:none;color:var(--g)}
.jx-brand .dim{color:var(--muted);font-weight:400}
.jx-mini{position:relative;width:24px;height:22px;flex:none;background:#020302;border:1px solid var(--line2);clip-path:polygon(4px 0,calc(100% - 4px) 0,100% 4px,100% calc(100% - 4px),calc(100% - 4px) 100%,4px 100%,0 calc(100% - 4px),0 4px)}
.jx-mini i{position:absolute;top:5px;width:3px;height:8px;border-radius:2px;background:var(--g);box-shadow:0 0 6px var(--g-glow);animation:blink 5s infinite}
.jx-mini i:first-child{left:7px}.jx-mini i:last-child{right:7px}
.jx-bar-r{display:flex;align-items:center;gap:14px;color:var(--muted);min-width:0}
.jx-state{display:flex;align-items:center;gap:7px;color:var(--text)}
.jx-state .dot{width:7px;height:7px;border-radius:50%;background:var(--muted)}
body.unlocked .jx-state .dot{background:var(--g);box-shadow:0 0 8px var(--g-glow);animation:pulse 2s infinite}
body.denied .jx-state .dot{background:var(--red);box-shadow:0 0 8px var(--red-glow)}
.jx-sync{font:12px/1 var(--mono);letter-spacing:.06em;color:#021007;background:var(--g);border:0;padding:7px 10px;cursor:pointer;box-shadow:0 0 14px rgba(77,250,138,.35)}
.jx-sync:hover{filter:brightness(1.1)}
.jx-user{position:relative}
.jx-user .jx-btn{max-width:42vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.jx-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:40;min-width:168px;padding:6px 0;background:var(--panel);border:1px solid var(--line2);box-shadow:0 14px 40px rgba(0,0,0,.6)}
.jx-menu button{all:unset;box-sizing:border-box;display:block;width:100%;padding:10px 16px;font:13px/1.3 var(--mono);color:var(--text);cursor:pointer}
.jx-menu button:hover,.jx-menu button:focus-visible{background:var(--g-soft);color:var(--g)}

/* ===== buttons & inputs ===== */
.jx-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;font:12px/1 var(--mono);letter-spacing:.06em;color:var(--g);background:transparent;border:1px solid var(--g-dim);padding:8px 11px;cursor:pointer;white-space:nowrap;text-decoration:none}
.jx-btn:hover{background:var(--g);color:#000;border-color:var(--g);text-decoration:none}
.jx-btn:focus-visible,.jx-tool:focus-visible{outline:2px solid var(--g);outline-offset:2px}
.jx-btn.solid{background:var(--g);color:#021007;border-color:var(--g);font-weight:600}
.jx-btn.solid:hover{filter:brightness(1.12)}
.jx-btn.ghost{border-color:var(--line2);color:var(--muted)}
.jx-btn.ghost:hover{border-color:var(--g);color:#000}
.jx-btn.danger{border-color:#5a2a31;color:var(--red)}
.jx-btn.danger:hover{background:var(--red);border-color:var(--red);color:#1a0306}
.jx-btn:disabled{opacity:.5;cursor:progress;filter:none}
.jx-tool{all:unset;cursor:pointer;font:11px/1 var(--mono);letter-spacing:.06em;color:var(--muted);padding:5px 7px;border:1px solid transparent;white-space:nowrap}
.jx-tool:hover{color:var(--g);border-color:var(--g-dim)}
.jx-tool.danger:hover{color:var(--red);border-color:var(--red)}
.jx-in{display:block;width:100%;padding:9px 12px;font:14px/1.5 var(--mono);color:var(--text);caret-color:var(--g);background:rgba(77,250,138,.03);border:1px solid var(--line2);border-radius:0;outline:0;transition:border-color .15s,box-shadow .15s}
.jx-in:focus{border-color:var(--g);box-shadow:0 0 0 3px var(--g-soft)}
.jx-in::placeholder{color:var(--faint)}
textarea.jx-in{resize:vertical}
select.jx-in{width:auto;padding-right:30px;appearance:none;-webkit-appearance:none;cursor:pointer;
  background:linear-gradient(45deg,transparent 50%,var(--g) 50%) calc(100% - 15px) 52%/5px 5px no-repeat,linear-gradient(135deg,var(--g) 50%,transparent 50%) calc(100% - 10px) 52%/5px 5px no-repeat,#06100a}
select.jx-in option{background:#06100a;color:var(--text)}
.row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.row.end{justify-content:flex-end}
.jx-note{margin:0 0 12px;font:12px/1.7 var(--mono);color:var(--muted)}
.jx-err{margin:10px 0 0;color:var(--red);font:13px/1.6 var(--mono)}
.jx-err:empty{display:none}

/* ===== gate (login) ===== */
.jx-gate{min-height:calc(100vh - 47px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px 56px;transition:opacity .5s,transform .5s}
body.granted .jx-gate{opacity:0;transform:scale(.97);transition-delay:.4s}
.jx-bot{position:relative;display:flex;flex-direction:column;align-items:center}
.jx-bot::after{content:"";position:absolute;left:4%;right:4%;bottom:-22px;height:26px;background:radial-gradient(ellipse at center,rgba(77,250,138,.13),transparent 70%)}
.jx-head{position:relative;width:min(300px,74vw);aspect-ratio:1/.9;background:linear-gradient(155deg,#252a27 0%,#141816 38%,#0b0d0c 100%);
  clip-path:polygon(9% 0,91% 0,100% 10%,100% 90%,91% 100%,9% 100%,0 90%,0 10%);transition:transform .2s}
.jx-screen{position:absolute;inset:6.5%;background:radial-gradient(120% 90% at 50% 35%,#07100b,#010201 70%);
  clip-path:polygon(5% 0,95% 0,100% 6%,100% 94%,95% 100%,5% 100%,0 94%,0 6%);box-shadow:inset 0 0 40px rgba(77,250,138,.06)}
.jx-screen .sc{position:absolute;width:6px;height:6px;border-radius:50%;background:#3b413e;box-shadow:inset 0 1px 1px rgba(255,255,255,.18)}
.sc.a{left:4%;top:5%}.sc.b{right:4%;top:5%}.sc.c{left:4%;bottom:5%}.sc.d{right:4%;bottom:5%}
.jx-cam{position:absolute;left:50%;top:4.5%;width:10px;height:10px;margin-left:-5px;border-radius:50%;border:2px solid #4a514d;background:#000}
.jx-face{position:absolute;inset:0;transition:transform .35s ease}
body.typing .jx-face{transform:translateY(5%)}
.eye{position:absolute;top:21%;width:11.5%;height:29%;border-radius:999px;background:var(--g);box-shadow:0 0 18px var(--g-glow),0 0 2px var(--g);transform-origin:50% 60%;animation:blink 5.2s infinite;transition:background .2s,box-shadow .2s,height .25s,top .25s}
.eye.l{left:29%}.eye.r{right:29%}
.mouth{position:absolute;left:50%;top:55%;width:14%;aspect-ratio:1.5/1;transform:translateX(-50%);background:var(--g);clip-path:polygon(0 0,100% 0,50% 100%);filter:drop-shadow(0 0 6px var(--g-glow));transition:background .2s}
.jx-readout{position:absolute;left:8%;right:8%;bottom:9%;display:grid;grid-template-columns:repeat(3,1fr);font:10px/1.25 var(--mono);text-align:center}
.jx-readout div+div{border-left:1px solid var(--g-dim)}
.jx-readout b{display:block;font-weight:400;color:var(--g-dim);letter-spacing:.06em}
.jx-readout span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 4px;color:var(--g);font-size:11.5px}
.jx-base{position:relative;width:min(300px,74vw);height:clamp(40px,12vw,52px);margin-top:10px;background:linear-gradient(180deg,#1d211f,#0c0e0d);
  clip-path:polygon(6% 0,94% 0,100% 30%,100% 72%,94% 100%,6% 100%,0 72%,0 30%)}
.jx-base .port{position:absolute;bottom:30%;width:6%;height:14%;border-radius:4px;background:#020302;box-shadow:inset 0 0 0 1px #2c322f}
.port.p1{left:9%}.port.p2{left:17%}.port.p3{right:17%}.port.p4{right:9%}
.jx-base .sd{position:absolute;bottom:32%;left:28%;width:15%;height:10%;border-radius:2px;background:#020302;box-shadow:inset 0 0 0 1px #2c322f}
.jx-led{position:absolute;left:50%;top:18%;width:clamp(16px,5vw,22px);aspect-ratio:1;transform:translateX(-50%);
  clip-path:polygon(30% 0,70% 0,100% 30%,100% 70%,70% 100%,30% 100%,0 70%,0 30%);background:var(--g);animation:breathe 3.2s ease-in-out infinite}
.jx-led::after{content:"";position:absolute;inset:3px;clip-path:inherit;background:#06110a}

body.busy .eye{animation:scan .7s ease-in-out infinite alternate}
body.denied .eye,body.denied .mouth,body.denied .jx-led{background:var(--red);box-shadow:0 0 18px var(--red-glow)}
body.denied #jx-ro{color:var(--red)}
body.denied .jx-head{animation:shake .42s}
body.granted .eye{top:28%;height:10%;background:transparent;box-shadow:none;border:4px solid var(--g);border-bottom:0;border-radius:999px 999px 0 0;animation:none;filter:drop-shadow(0 0 6px var(--g-glow))}

.jx-term{width:min(520px,100%);margin-top:34px;font:13px/1.6 var(--mono)}
.jx-line{margin:0 0 14px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.jx-line .u{color:var(--g)}.jx-line .h{color:#7fb3ff}
.cur{display:inline-block;width:8px;height:15px;vertical-align:-3px;background:var(--g);animation:caret 1s steps(1) infinite}
.jx-field{display:block;margin:0 0 12px}
.jx-field>span{display:block;margin-bottom:7px;color:var(--muted)}
.jx-field>span::before{content:"# ";color:var(--faint)}
.jx-field input{all:unset;box-sizing:border-box;display:block;width:100%;padding:12px 14px 12px 34px;font:15px/1.4 var(--mono);letter-spacing:.06em;color:var(--g);caret-color:var(--g);
  background:linear-gradient(90deg,var(--g) 0 0) 14px 50%/8px 2px no-repeat,rgba(77,250,138,.035);border:1px solid var(--line2);transition:border-color .2s,box-shadow .2s}
.jx-field input[type=password]{letter-spacing:.2em}
.jx-field input::placeholder{color:var(--faint);letter-spacing:.12em}
.jx-field input:focus{border-color:var(--g);box-shadow:0 0 0 3px var(--g-soft),0 0 24px rgba(77,250,138,.12)}
body.denied .jx-field input{border-color:var(--red);box-shadow:0 0 0 3px rgba(255,84,104,.14)}
.jx-go{all:unset;box-sizing:border-box;display:block;width:100%;margin-top:16px;padding:12px;text-align:center;cursor:pointer;
  font:600 13px/1 var(--mono);letter-spacing:.24em;color:#021007;background:var(--g);box-shadow:0 0 22px rgba(77,250,138,.25);
  clip-path:polygon(10px 0,100% 0,100% calc(100% - 10px),calc(100% - 10px) 100%,0 100%,0 10px);transition:filter .15s,transform .1s}
.jx-go:hover{filter:brightness(1.12)}
.jx-go:active{transform:translateY(1px)}
.jx-go:focus-visible{outline:2px solid #fff;outline-offset:3px}
.jx-go:disabled{filter:grayscale(.6) brightness(.7);cursor:progress}
.jx-form .jx-err{min-height:1.6em;display:block;margin-top:12px}
.jx-form .jx-err:not(:empty)::before{content:"✗ "}
body.granted .jx-form{display:none}
.jx-ok{display:none;margin:6px 0 0;color:var(--g);font:13px/1.6 var(--mono)}
body.granted .jx-ok{display:block}
.jx-hint{margin-top:22px;color:var(--faint);font:11px/1.6 var(--mono);text-align:center;letter-spacing:.04em}

/* ===== dashboard ===== */
.jx-dash{width:min(1180px,100%);margin:0 auto;padding:28px 16px 64px;animation:rise .6s ease both}
.jx-top{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:16px;margin-bottom:16px}
.jx-top.solo{grid-template-columns:minmax(0,1fr)}
.jx-intro{position:relative;padding:26px 26px 24px;border:1px solid var(--line);background:linear-gradient(135deg,rgba(77,250,138,.07),transparent 55%),var(--panel);clip-path:polygon(0 0,calc(100% - var(--cut)) 0,100% var(--cut),100% 100%,0 100%)}
.jx-intro .jx-tools{position:absolute;right:20px;top:14px}
.jx-kicker,.jx-intro p.jx-kicker{margin:0 0 6px;font:11px/1.4 var(--mono);letter-spacing:.18em;color:var(--g)}
.jx-intro h1{margin:0 0 10px;font:700 clamp(38px,6vw,58px)/1 var(--mono);letter-spacing:-.02em;color:#eafff0;text-shadow:0 0 28px rgba(77,250,138,.35)}
.jx-intro h1::after{content:"_";color:var(--g);animation:caret 1s steps(1) infinite}
.jx-intro p{margin:0 0 10px;max-width:62ch}
.jx-intro>p:last-of-type{margin-bottom:0}
.jx-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border:1px solid var(--line);background:#020302}
.jx-stats>div{display:flex;flex-direction:column;justify-content:center;padding:18px 20px;border-bottom:1px solid var(--line);border-right:1px solid var(--line)}
.jx-stats>div:nth-child(2n){border-right:0}
.jx-stats>div:nth-last-child(-n+2){border-bottom:0}
.jx-stats>div:nth-child(odd):nth-last-child(2){border-bottom:1px solid var(--line)}
.jx-stats b{display:block;font:400 10.5px/1.3 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--g-dim)}
.jx-stats span{display:block;margin-top:6px;font:600 20px/1.2 var(--mono);color:var(--g);text-shadow:0 0 14px rgba(77,250,138,.3)}

.jx-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.jx-panel{position:relative;min-width:0;padding:20px 22px 18px;border:1px solid var(--line);background:linear-gradient(180deg,rgba(77,250,138,.035),transparent 120px),var(--panel);
  clip-path:polygon(0 0,calc(100% - var(--cut)) 0,100% var(--cut),100% 100%,0 100%)}
.jx-panel.wide,.jx-panel.fill,.jx-panel.editing{grid-column:1/-1}
.jx-panel.editing{border-color:var(--g-dim)}
.jx-panel::after,.jx-intro::after{content:"";position:absolute;left:calc(100% - var(--cut));top:0;width:calc(var(--cut) * 1.4142);height:1px;background:var(--line);transform-origin:0 0;transform:rotate(45deg)}
.jx-panel::before{content:"";position:absolute;left:0;top:0;width:36px;height:2px;background:var(--g);box-shadow:0 0 10px var(--g-glow)}
.jx-panel h2{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;margin:0 0 16px;font:600 14px/1.3 var(--mono);letter-spacing:.08em;color:#eafff0}
.jx-panel h2 .idx{color:var(--g);font-weight:400}
.jx-panel h2 .rule{flex:1;min-width:24px;height:1px;background:linear-gradient(90deg,var(--line2),transparent)}
.jx-tools{display:flex;flex-wrap:wrap;gap:2px;font-weight:400;letter-spacing:0}
.jx-panel.editing h2 .jx-tools{display:none}
.jx-pfoot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 14px;margin-top:16px;padding-top:11px;border-top:1px dashed var(--line);font:11px/1.4 var(--mono);color:var(--faint)}
.jx-pfoot .cbtn{all:unset;cursor:pointer;color:var(--muted);padding:2px 0}
.jx-pfoot .cbtn:hover,.jx-pfoot .cbtn:focus-visible{color:var(--g)}
.jx-pfoot .cbtn.has{color:var(--g)}
.jx-pfoot .cbtn::before{content:"▸ "}
.jx-pfoot .cbtn[aria-expanded=true]::before{content:"▾ "}

/* rendered markdown */
.jx-md{overflow-wrap:anywhere}
.jx-md>:first-child{margin-top:0}
.jx-md>:last-child{margin-bottom:0}
.jx-md p{margin:0 0 12px}
.jx-md h1,.jx-md h3,.jx-md h4,.jx-md h5{margin:18px 0 10px;font:600 13px/1.4 var(--mono);letter-spacing:.08em;color:#eafff0}
.jx-md h1{font-size:16px}
.jx-md h2{display:block;margin:18px 0 10px;font-size:14px}
.jx-md ul,.jx-md ol{margin:0 0 12px;padding-left:0;list-style:none}
.jx-md ol{counter-reset:li}
.jx-md li{position:relative;padding:6px 0 6px 20px;border-bottom:1px dashed var(--line)}
.jx-md li:last-child{border-bottom:0}
.jx-md ul>li::before{content:"›";position:absolute;left:4px;top:5px;color:var(--g)}
.jx-md ol>li{padding-left:28px}
.jx-md ol>li::before{counter-increment:li;content:counter(li) ".";position:absolute;left:0;top:6px;font:12px/1.65 var(--mono);color:var(--g)}
.jx-md li li{border-bottom:0;padding-top:3px;padding-bottom:3px}
.jx-md li>ul,.jx-md li>ol{margin:4px 0 0}
.jx-md li.task::before{content:none}
.jx-md li.task{padding-left:30px}
.jx-md li.task input{position:absolute;left:0;top:9px;appearance:none;-webkit-appearance:none;width:16px;height:16px;margin:0;border:1px solid var(--g-dim);background:transparent}
.jx-md li.task input:not(:disabled){cursor:pointer}
.jx-md li.task input:not(:disabled):hover{border-color:var(--g);box-shadow:0 0 0 3px var(--g-soft)}
.jx-md li.task input:checked{background:var(--g);box-shadow:0 0 8px var(--g-glow)}
.jx-md li.task input:checked::after{content:"";position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid #021007;border-width:0 2px 2px 0;transform:rotate(45deg)}
.jx-md li.task:has(input:checked){color:var(--muted);text-decoration:line-through;text-decoration-color:var(--faint)}
.jx-md strong{color:var(--g);font-weight:600}
.jx-md code{font:12.5px var(--mono);color:var(--g);background:var(--g-soft);padding:1px 5px}
.jx-md pre{margin:0 0 12px;padding:12px 14px;overflow:auto;background:#020302;border:1px solid var(--line)}
.jx-md pre code{padding:0;background:none;color:var(--text)}
.jx-md blockquote{margin:0 0 12px;padding:8px 14px;border-left:2px solid var(--g-dim);background:rgba(77,250,138,.03);color:var(--muted);font-size:14px}
.jx-md blockquote p:last-child{margin:0}
.jx-md hr{border:0;border-top:1px dashed var(--line2);margin:16px 0}
.jx-md img{display:block;max-width:100%;height:auto;background:#e9ecef;cursor:zoom-in}
.jx-fig{position:relative;display:block;margin:4px 0 18px;border:1px solid var(--line2);background:#e9ecef}
.jx-fig::before,.jx-fig::after{content:"";position:absolute;width:22px;height:22px;border:2px solid var(--g);pointer-events:none}
.jx-fig::before{left:-6px;top:-6px;border-right:0;border-bottom:0}
.jx-fig::after{right:-6px;bottom:-6px;border-left:0;border-top:0}
.jx-fig img{margin:0 auto}

/* tables (in panels and dialogs) */
.jx-tw{overflow-x:auto;margin:0 -4px 12px}
.jx-tw:last-child{margin-bottom:0}
.jx-md table,.jx-table{width:100%;border-collapse:collapse;font-size:14px}
.jx-md th,.jx-table th{padding:8px 10px;text-align:left;font:400 11px/1.3 var(--mono);letter-spacing:.12em;color:var(--g-dim);border-bottom:1px solid var(--line2);white-space:nowrap}
.jx-md td,.jx-table td{padding:10px;border-bottom:1px solid var(--line);vertical-align:top;overflow-wrap:break-word}
.jx-md tr:last-child td,.jx-table tr:last-child td{border-bottom:0}
.jx-md tbody tr{transition:background .15s}
@media (hover:hover){.jx-md tbody tr:hover,.jx-table tbody tr:hover{background:rgba(77,250,138,.04)}}
.jx-md td:first-child{font-family:var(--mono);font-size:13px;color:#eafff0;white-space:nowrap}
.jx-md td.rep{color:transparent}
.jx-md tr.grp td{border-top:1px solid var(--line2)}
.jx-md td.todo{color:var(--faint);font-family:var(--mono);font-size:12.5px}
.jx-table td{vertical-align:middle}
.jx-table td.acts{white-space:nowrap;text-align:right}
.jx-table td.acts .jx-btn+.jx-btn{margin-left:6px}
.jx-table tr.off td{color:var(--faint)}

.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;font:11.5px/1.3 var(--mono);letter-spacing:.06em;white-space:nowrap;border:1px solid var(--line2);color:var(--muted)}
.chip::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.chip.ok{color:#021007;background:var(--g);border-color:var(--g)}
.chip.run{color:var(--g);border-color:var(--g-dim);background:var(--g-soft)}
.chip.run::before{box-shadow:0 0 8px var(--g-glow);animation:pulse 1.6s infinite}
.chip.idle{border-style:dashed}
.bar{display:flex;align-items:center;gap:10px;min-width:140px;font:12px var(--mono);color:var(--g)}
.bar i{flex:1;height:8px;background:repeating-linear-gradient(90deg,var(--line2) 0 6px,transparent 6px 8px);position:relative}
.bar i b{position:absolute;inset:0 auto 0 0;background:repeating-linear-gradient(90deg,var(--g) 0 6px,transparent 6px 8px);box-shadow:0 0 10px rgba(77,250,138,.3)}

/* timeline: a list whose items all start with bold text */
.jx-md ul.jx-tl{position:relative;padding-left:4px}
.jx-md ul.jx-tl::before{content:"";position:absolute;left:8px;top:10px;bottom:10px;width:1px;background:linear-gradient(var(--g-dim),var(--line))}
.jx-md ul.jx-tl>li{border-bottom:0;padding:4px 0 14px 28px}
.jx-md ul.jx-tl>li::before{content:"";left:4px;top:10px;width:9px;height:9px;background:var(--bg);border:1px solid var(--g);transform:rotate(45deg)}
.jx-md ul.jx-tl>li:first-child::before{background:var(--g);box-shadow:0 0 10px var(--g-glow)}
.jx-md ul.jx-tl>li strong:first-child{display:block;font:12px/1.5 var(--mono);letter-spacing:.08em}

/* comments */
.jx-cm{margin-top:12px}
.jx-cm-item{padding:10px 0;border-bottom:1px dashed var(--line)}
.jx-cm-item:first-child{padding-top:2px}
.jx-cm-head{display:flex;align-items:center;gap:10px;font:11.5px/1.4 var(--mono);color:var(--faint)}
.jx-cm-head b{color:var(--g);font-weight:600}
.jx-cm-head .jx-tool{margin-left:auto;padding:2px 6px}
.jx-cm-body{margin-top:4px;font-size:14px;white-space:pre-wrap;overflow-wrap:anywhere}
.jx-cm-new{display:flex;align-items:flex-end;gap:8px;margin-top:12px}
.jx-cm-new textarea{flex:1;min-height:42px;font-size:13.5px}

/* editor */
.jx-ed-title{margin-bottom:10px;font-weight:600}
.jx-ed-tabs{display:none;gap:6px;margin-bottom:8px}
.jx-ed-tabs .jx-btn[aria-pressed=true]{background:var(--g-soft);color:var(--g);border-color:var(--g-dim)}
.jx-ed-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px}
.jx-ed-ta{min-height:360px;font:13px/1.65 var(--mono);tab-size:2;white-space:pre-wrap}
.jx-ed.drag .jx-ed-ta{border-color:var(--g);box-shadow:0 0 0 3px var(--g-soft);background:var(--g-soft)}
.jx-ed-pv{min-height:360px;max-height:72vh;overflow:auto;padding:12px 14px;border:1px dashed var(--line2);background:rgba(0,0,0,.25)}
.jx-ed-pv:empty::before{content:"预览";color:var(--faint);font:12px var(--mono)}
.jx-ed-pv .jx-top{margin:0}
.jx-ed-msg:not(:empty){margin-top:10px}
.jx-ed-msg .info{margin:0;font:12px/1.6 var(--mono);color:var(--g)}
.jx-ed-msg .bad{margin:0;font:12px/1.6 var(--mono);color:var(--red)}
.jx-conflict{padding:10px 12px;border:1px solid var(--red);background:rgba(255,84,104,.07);color:#ffd3d9;font:12.5px/1.6 var(--mono)}
.jx-conflict p{margin:0 0 8px}
.jx-ed-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px}
.jx-ed-hint{flex:1 1 300px;font:11px/1.6 var(--mono);color:var(--faint)}

/* new panel tile */
.jx-add{all:unset;box-sizing:border-box;grid-column:1/-1;display:flex;align-items:center;justify-content:center;min-height:52px;padding:14px 20px;border:1px dashed var(--line2);color:var(--muted);font:13px var(--mono);letter-spacing:.12em;cursor:pointer;transition:border-color .15s,color .15s,background .15s}
.jx-add:hover,.jx-add:focus-visible{border-color:var(--g);color:var(--g);background:var(--g-soft)}

/* files */
.jx-drop{margin:0 0 12px;padding:14px;border:1px dashed var(--line2);text-align:center;font:12px/1.6 var(--mono);color:var(--faint);transition:border-color .15s,color .15s,background .15s}
.jx-panel.drag .jx-drop{border-color:var(--g);color:var(--g);background:var(--g-soft)}
.jx-ups:not(:empty){margin:0 0 10px;font:12px/1.7 var(--mono);color:var(--g)}
.jx-files{margin:0;padding:0;list-style:none}
.jx-file{display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto auto;column-gap:12px;align-items:center;padding:9px 0;border-bottom:1px dashed var(--line)}
.jx-file:last-child{border-bottom:0}
.jx-file .ic{grid-row:1/span 2;min-width:42px;padding:5px 4px;text-align:center;font:10px/1 var(--mono);letter-spacing:.06em;color:#021007;background:var(--g-dim)}
.jx-file .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}
.jx-file .meta{grid-column:2;font:11px/1.5 var(--mono);color:var(--faint)}
.jx-file .acts{grid-row:1/span 2;grid-column:3;display:flex;gap:2px}
.jx-empty{font:12px/1.6 var(--mono);color:var(--faint)}

/* activity */
.jx-act{margin:0;padding:0;list-style:none}
.jx-act li{display:grid;grid-template-columns:78px minmax(0,1fr);gap:10px;padding:7px 0;border-bottom:1px dashed var(--line);font-size:14px}
.jx-act li:last-child{border-bottom:0}
.jx-act time{font:11px/1.9 var(--mono);color:var(--faint);white-space:nowrap}
.jx-act b{color:var(--g);font-weight:600}
.jx-act a{cursor:pointer}
.jx-act li.jx-empty{display:block;padding:0;border-bottom:0}
.jx-more{all:unset;cursor:pointer;display:block;margin-top:10px;font:11px/1.4 var(--mono);color:var(--muted)}
.jx-more:hover,.jx-more:focus-visible{color:var(--g)}

/* dialogs */
.jx-modal{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-start;justify-content:center;padding:7vh 16px 24px;background:rgba(1,3,2,.74);backdrop-filter:blur(3px);overflow:auto}
.jx-dlg{position:relative;width:min(540px,100%);padding:20px 22px 22px;background:var(--panel);border:1px solid var(--line2);box-shadow:0 30px 80px rgba(0,0,0,.6);
  clip-path:polygon(0 0,calc(100% - var(--cut)) 0,100% var(--cut),100% 100%,0 100%);animation:rise .22s ease both}
.jx-dlg::before{content:"";position:absolute;left:0;top:0;width:36px;height:2px;background:var(--g);box-shadow:0 0 10px var(--g-glow)}
.jx-dlg.wide{width:min(980px,100%)}
.jx-dlg h3{display:flex;align-items:center;gap:10px;margin:0 0 16px;font:600 14px/1.4 var(--mono);letter-spacing:.08em;color:#eafff0}
.jx-dlg h3 .x{margin-left:auto}
.jx-dlg form+form{margin-top:4px}
.jx-f{display:block;margin:0 0 12px;font:12px/1.4 var(--mono);color:var(--muted)}
.jx-f .jx-in{margin-top:6px}
.jx-hr{border:0;border-top:1px dashed var(--line2);margin:18px 0}
.jx-secret{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;margin:12px 0 8px;padding:12px 14px;border:1px solid var(--g-dim);background:var(--g-soft);font:13px/1.6 var(--mono);color:var(--text)}
.jx-secret b{color:var(--g);font-size:15px;letter-spacing:.06em;user-select:all;overflow-wrap:anywhere}
.jx-adduser{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto;gap:8px;margin:0 0 4px}
.jx-trash{margin:0;padding:0;list-style:none}
.jx-trash li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;padding:10px 0;border-bottom:1px dashed var(--line)}
.jx-trash li span{flex:1;min-width:120px;color:#eafff0}
.jx-trash li small{font:11px var(--mono);color:var(--faint)}
.jx-hist{display:grid;grid-template-columns:230px minmax(0,1fr);gap:18px}
.jx-hist ol{margin:0;padding:0 8px 0 0;list-style:none;max-height:64vh;overflow:auto;border-right:1px solid var(--line)}
.jx-hist ol button{all:unset;box-sizing:border-box;display:block;width:100%;padding:8px 10px;cursor:pointer;font:12px/1.5 var(--mono);color:var(--muted);border-left:2px solid transparent}
.jx-hist ol button:hover{color:var(--text);background:rgba(77,250,138,.04)}
.jx-hist ol button.on{color:var(--g);background:var(--g-soft);border-left-color:var(--g)}
.jx-hist ol b{color:#eafff0}
.jx-hist ol small{color:var(--faint);font-size:11px}
.jx-hist .pv{min-width:0;max-height:64vh;overflow:auto}
.jx-hist-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;margin:0 0 12px;padding-bottom:10px;border-bottom:1px dashed var(--line);font:12px/1.5 var(--mono);color:var(--muted)}
.jx-hist-title{margin:0 0 12px;font:600 14px/1.4 var(--mono);color:#eafff0}

/* toasts & lightbox */
.jx-toasts{position:fixed;right:16px;bottom:16px;z-index:80;display:flex;flex-direction:column;align-items:flex-end;gap:8px;max-width:min(400px,calc(100vw - 32px));pointer-events:none}
.jx-toast{padding:10px 14px;background:#06100a;border:1px solid var(--g-dim);color:var(--text);font:12.5px/1.5 var(--mono);box-shadow:0 10px 30px rgba(0,0,0,.5);animation:rise .2s ease both}
.jx-toast::before{content:"› ";color:var(--g)}
.jx-toast.err{border-color:var(--red);color:#ffd3d9}
.jx-toast.err::before{content:"✗ ";color:var(--red)}
.jx-lb{position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;padding:16px;background:rgba(0,0,0,.9);cursor:zoom-out}
.jx-lb img{max-width:100%;max-height:100%;box-shadow:0 0 0 1px var(--line2),0 20px 60px rgba(0,0,0,.6);background:#e9ecef}
.jx-offscreen{position:fixed;left:-9999px;top:0;opacity:0}

.jx-foot{padding:22px 16px 30px;text-align:center;font:11px/1.7 var(--mono);color:var(--faint);letter-spacing:.05em}
.jx-foot a{color:var(--muted)}
body.booting .jx-foot{visibility:hidden}

@keyframes blink{0%,93%,100%{transform:scaleY(1)}96%{transform:scaleY(.08)}}
@keyframes scan{from{transform:translateX(-35%)}to{transform:translateX(35%)}}
@keyframes breathe{0%,100%{opacity:.45;filter:drop-shadow(0 0 2px var(--g-glow))}50%{opacity:1;filter:drop-shadow(0 0 10px var(--g-glow))}}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
@keyframes caret{50%{opacity:0}}
@keyframes shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-8px)}40%{transform:translateX(7px)}60%{transform:translateX(-5px)}80%{transform:translateX(3px)}}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

@media (max-width:860px){
  .jx-top,.jx-grid{grid-template-columns:minmax(0,1fr)}
  .jx-ed-split{grid-template-columns:minmax(0,1fr)}
  .jx-ed-tabs{display:flex}
  .jx-ed[data-tab=edit] .jx-ed-pv,.jx-ed[data-tab=preview] .jx-ed-ta{display:none}
  .jx-hist{grid-template-columns:minmax(0,1fr)}
  .jx-hist ol{max-height:190px;padding:0 0 8px;border-right:0;border-bottom:1px solid var(--line)}
  .jx-adduser{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
}
@media (max-width:560px){
  .jx-bar{padding:8px 16px;gap:8px}
  .jx-brand .dim,.jx-clock{display:none}
  .jx-bar-r{gap:10px}
  .jx-intro{padding:20px 18px}
  .jx-intro .jx-tools{position:static;margin-top:12px}
  .jx-panel{padding:18px 16px 16px}
  .jx-stats>div{padding:14px 16px}
  .jx-stats span{font-size:17px}
  .jx-dlg{padding:18px 16px 18px}
  .jx-modal{padding-top:4vh}
  .jx-act li{grid-template-columns:minmax(0,1fr);gap:0}
  .jx-file .acts{grid-row:3;grid-column:2;margin:2px 0 0 -7px}
  .jx-file .meta{grid-row:2}
  .jx-file .ic{grid-row:1/span 3}
  .jx-md .jx-tw{overflow:visible;margin:0 0 12px}
  .jx-md table,.jx-md tbody,.jx-md tr,.jx-md td{display:block;width:100%}
  .jx-md thead{display:none}
  .jx-md tbody tr{padding:10px 0;border-bottom:1px dashed var(--line)}
  .jx-md tbody tr:last-child{border-bottom:0}
  .jx-md tr.grp td{border-top:0}
  .jx-md tr.grp{border-top:1px solid var(--line2);margin-top:6px;padding-top:14px}
  .jx-md td{display:grid;grid-template-columns:64px minmax(0,1fr);gap:10px;align-items:baseline;padding:3px 0;border:0;white-space:normal;overflow-wrap:anywhere}
  .jx-md td::before{content:attr(data-label);font:11px/1.6 var(--mono);letter-spacing:.06em;color:var(--g-dim)}
  .jx-md td:first-child{white-space:normal}
  .jx-md td.rep,.jx-md td.empty{display:none}
  .jx-md td .chip,.jx-md td .bar{justify-self:start}
  .jx-adduser{grid-template-columns:minmax(0,1fr)}
  .jx-adduser select.jx-in{width:100%}
  .jx-table th:nth-child(5),.jx-table td:nth-child(5){display:none}
}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
