:root{
  --ink:#16212b; --ink-soft:#54636d; --line:#d0d9dd;
  --ground:#eceff1; --surface:#fff; --surface-2:#f4f7f8;
  --accent:#1f6feb; --gate:#bd3d1c;
}
*{box-sizing:border-box}
body{
  margin:0; background:var(--ground); color:var(--ink);
  font-family:-apple-system,"PingFang SC","Segoe UI",system-ui,sans-serif;
  line-height:1.6;
}
.topbar{max-width:960px;margin:0 auto;padding:28px 20px 8px}
.topbar h1{margin:0 0 4px;font-size:1.5rem}
.topbar .sub{margin:0;color:var(--ink-soft);font-size:.9rem}

.wrap{max-width:960px;margin:0 auto;padding:12px 20px 60px;display:flex;flex-direction:column;gap:20px}

.upload{border:1px solid var(--line);border-radius:12px;background:var(--surface);padding:18px 20px;display:flex;flex-direction:column;gap:14px}
.field{display:flex;flex-direction:column;gap:6px}
.field[hidden]{display:none}
.field label{font-size:.8rem;color:var(--ink-soft);font-weight:600}
select,textarea,input[type=url],input[type=file]{
  font:inherit;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);color:var(--ink);
}
textarea{resize:vertical}
button.primary{
  align-self:flex-start;background:var(--accent);color:#fff;border:0;border-radius:8px;
  padding:10px 20px;font:inherit;font-weight:600;cursor:pointer;
}
button.ghost{
  align-self:flex-start;background:none;border:1px dashed var(--line);border-radius:8px;
  padding:6px 12px;font:inherit;font-size:.8rem;color:var(--ink-soft);cursor:pointer;
}
.status{margin:0;font-size:.85rem;color:var(--ink-soft)}

.result h2{margin:0 0 4px}
.section-h{margin:18px 0 6px;font-size:.95rem;font-weight:700;color:var(--ink)}
.summary-block, .dag-block{
  border:1px solid var(--line);border-radius:10px;background:var(--surface);
  padding:6px 16px 16px;
}
.summary-text{margin:0;font-size:.92rem;line-height:1.7}
.hint-line{margin:0 0 8px;font-size:.78rem;color:var(--ink-soft)}

/* 悬停术语解释 */
.term{position:relative;border-bottom:1px dotted var(--accent);cursor:help}
.term .tip{
  position:absolute;left:0;bottom:calc(100% + 6px);z-index:30;
  display:none;width:max-content;max-width:260px;
  background:var(--ink);color:var(--surface);font-size:.78rem;line-height:1.5;
  padding:7px 10px;border-radius:6px;box-shadow:0 8px 20px -8px rgba(0,0,0,.45);
}
.term:hover .tip, .term:focus .tip{display:block}

.backdrop{
  position:fixed;inset:0;background:rgba(10,15,18,.5);
  display:flex;align-items:flex-start;justify-content:center;padding:30px 14px;
  overflow-y:auto;z-index:50;
}
.modal{
  background:var(--surface);border-radius:14px;max-width:720px;width:100%;
  padding:22px 22px 26px;position:relative;box-shadow:0 24px 60px -20px rgba(0,0,0,.4);
}
.modal .close{
  position:absolute;top:12px;right:12px;width:32px;height:32px;border-radius:8px;
  border:1px solid var(--line);background:var(--surface-2);font-size:1.1rem;cursor:pointer;
}
.eyebrow{font-family:monospace;font-size:.75rem;color:var(--accent);margin:0 0 6px}
.intro{margin:0 0 12px;font-size:.88rem;color:var(--ink-soft)}
.struct{margin:0 0 12px;font-size:.85rem;background:var(--surface-2);border-left:3px solid var(--accent);border-radius:0 8px 8px 0;padding:8px 12px}
.struct b{color:var(--accent)}
.diagram, .step-diagram{border:1px solid var(--line);border-radius:8px;background:var(--surface-2);padding:10px;margin:8px 0}
.diagram svg, .step-diagram svg{width:100%;height:auto;max-width:480px;margin:0 auto;display:block}
.mm-error{color:var(--gate);font-size:.8rem;white-space:pre-wrap}

.nav{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
.nav button{
  font-family:monospace;font-size:.75rem;border:1px solid var(--line);background:var(--surface);
  color:var(--ink-soft);border-radius:6px;padding:4px 10px;cursor:pointer;
}
.nav button.active{border-color:var(--accent);color:var(--accent);font-weight:700}

.step-title{font-weight:700;margin:14px 0 0}
.why{background:var(--surface-2);border-left:3px solid var(--accent);border-radius:0 8px 8px 0;padding:10px 12px;margin:8px 0}
.src{border:1px solid var(--line);border-radius:8px;padding:0 12px;background:var(--surface-2);margin:10px 0}
.src summary{cursor:pointer;font-size:.78rem;color:var(--ink-soft);padding:9px 0}
.src pre{white-space:pre-wrap;font-size:.8rem;margin:0 0 10px;background:var(--surface);border-left:3px solid var(--accent);padding:8px 10px;border-radius:0 6px 6px 0}
.src-zh{margin-top:-4px}
.src-zh pre{border-left-color:var(--ink-soft)}

.viz-text{
  white-space:pre;overflow-x:auto;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:.78rem;line-height:1.55;
  background:var(--surface);border:1px solid var(--line);border-radius:8px;
  padding:10px 12px;margin:0;
}
.viz-text .dl{display:block}
.viz-text .dl.add{color:#1a7f37}
.viz-text .dl.del{color:var(--gate)}
.step-diagram > .viz-text{border:0;background:transparent;padding:0;margin:0}
.terms{list-style:none;padding:0;margin:10px 0 0;display:flex;flex-direction:column;gap:6px}
.terms li{font-size:.82rem}
.terms b{color:var(--accent)}

/* ---- 常驻问答浮窗 ---- */
.chat-fab{
  position:fixed;right:18px;bottom:18px;z-index:60;
  border:0;border-radius:22px;padding:10px 16px;
  background:var(--accent);color:#fff;font:inherit;font-weight:600;font-size:.85rem;
  cursor:pointer;box-shadow:0 10px 26px -10px rgba(0,0,0,.5);
}
.chat-panel{
  position:fixed;right:18px;bottom:18px;z-index:60;
  width:340px;max-width:calc(100vw - 24px);height:460px;max-height:calc(100vh - 36px);
  display:flex;flex-direction:column;
  background:var(--surface);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 24px 60px -20px rgba(0,0,0,.45);overflow:hidden;
}
.chat-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:9px 12px;border-bottom:1px solid var(--line);background:var(--surface-2);
}
.chat-title{font-size:.85rem;font-weight:700}
.chat-tools{display:flex;gap:6px}
.chat-tools button{
  border:1px solid var(--line);background:var(--surface);color:var(--ink-soft);
  font:inherit;font-size:.75rem;border-radius:6px;padding:3px 9px;cursor:pointer;line-height:1.4;
}
.chat-tools button:hover{color:var(--accent);border-color:var(--accent)}
.chat-log{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:10px}
.chat-empty{margin:0;font-size:.8rem;color:var(--ink-soft);line-height:1.6}
.chat-msg{font-size:.85rem;line-height:1.6;padding:8px 11px;border-radius:10px;max-width:88%;word-wrap:break-word}
.chat-user{align-self:flex-end;background:var(--accent);color:#fff;border-bottom-right-radius:3px}
.chat-assistant{align-self:flex-start;background:var(--surface-2);border:1px solid var(--line);border-bottom-left-radius:3px}
.chat-assistant pre{white-space:pre-wrap;background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:7px 9px;margin:6px 0;font-size:.78rem;overflow-x:auto}
.chat-assistant code{background:var(--surface);border:1px solid var(--line);border-radius:4px;padding:0 4px;font-size:.82em}
.chat-form{display:flex;gap:6px;padding:9px;border-top:1px solid var(--line);background:var(--surface-2)}
.chat-form textarea{
  flex:1;resize:none;font:inherit;font-size:.85rem;line-height:1.5;
  border:1px solid var(--line);border-radius:8px;padding:7px 9px;background:var(--surface);color:var(--ink);
  max-height:120px;
}
.chat-form button{
  align-self:flex-end;background:var(--accent);color:#fff;border:0;border-radius:8px;
  padding:8px 14px;font:inherit;font-weight:600;font-size:.82rem;cursor:pointer;
}
.chat-form button:disabled{opacity:.5;cursor:default}
