/* ============================================================
   AITHRIX — Interactive Demos page
   Vertical, scroll-driven. Inherits tokens + nav/footer/buttons
   from style.css; this file styles the demo sections + the
   re-skinned animated UI widgets (jade-on-dark).
   ============================================================ */

/* ---- page chrome ---- */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ============ AGENT EXPLORER ============ */
/* top padding clears the fixed nav now that the hero is gone */
.explorer{padding:112px 0 40px;position:relative}
.exp-grid{display:grid;grid-template-columns:264px minmax(0,1fr);gap:40px;align-items:start}

/* --- neural rail navigator --- */
.exp-rail{position:sticky;top:96px;align-self:start;display:flex;flex-direction:column;gap:2px;
  justify-content:space-between;padding:8px 4px;height:calc(100vh - 130px);max-height:760px}
.exp-track,.exp-fill{position:absolute;left:20px;top:18px;bottom:18px;width:2px;border-radius:2px}
.exp-track{background:linear-gradient(180deg,transparent,var(--line) 12%,var(--line) 88%,transparent)}
.exp-fill{bottom:auto;height:0;background:linear-gradient(180deg,rgba(var(--ac,55,224,176),.15),var(--accent));
  transition:height .5s var(--ease);box-shadow:0 0 10px rgba(var(--ac,55,224,176),.4)}
/* qi pulse — a slow comet travelling the channel down to the active node
   (--qi-end is kept in sync with the fill height by positionRail) */
.exp-qi{position:absolute;left:21px;top:18px;width:6px;height:6px;margin-left:-3px;border-radius:50%;
  background:#c6ffec;box-shadow:0 0 8px 2px rgba(var(--ac,55,224,176),.65);opacity:0;
  animation:expQi 4.6s linear infinite}
@keyframes expQi{
  0%{transform:translateY(0);opacity:0}
  10%{opacity:.85}
  86%{opacity:.85}
  100%{transform:translateY(var(--qi-end,0px));opacity:0}}
/* 得气 ripple — one expanding ring when a node becomes active */
.exp-node-dot::after{content:"";position:absolute;inset:-2px;border-radius:50%;
  border:1.5px solid var(--accent);opacity:0;pointer-events:none}
.exp-node.on .exp-node-dot::after{animation:qiRipple .9s var(--ease-out,ease-out) 1}
@keyframes qiRipple{0%{opacity:.7;transform:scale(1)}100%{opacity:0;transform:scale(2.6)}}

.exp-node{position:relative;display:grid;grid-template-columns:14px 1fr;align-items:center;gap:12px;
  font:inherit;text-align:left;cursor:pointer;background:none;border:0;border-radius:11px;
  padding:11px 10px;color:var(--dim);transition:background .25s var(--ease),color .25s var(--ease);z-index:1}
.exp-node:hover{background:rgba(255,255,255,.035);color:var(--ink)}
.exp-node:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.exp-node-dot{position:relative;justify-self:center;width:11px;height:11px;border-radius:50%;background:var(--bg2);
  border:1.6px solid rgba(var(--ac,55,224,176),.4);transition:background .3s var(--ease),border-color .3s var(--ease),box-shadow .3s var(--ease),transform .3s var(--ease)}
.exp-node:hover .exp-node-dot{border-color:var(--accent)}
.exp-node-body{display:flex;flex-direction:column;gap:2px;min-width:0}
.exp-dept{font-family:var(--sans);font-weight:600;font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);opacity:.8}
.exp-node-name{font-size:14px;font-weight:600;letter-spacing:-.01em;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.exp-node.on{color:var(--ink)}
.exp-node.on .exp-node-dot{background:var(--accent);border-color:var(--accent);transform:scale(1.18);box-shadow:0 0 10px rgba(var(--ac,55,224,176),.85)}
.exp-node.on .exp-node-name{color:var(--accent)}
.exp-node.on .exp-dept{opacity:1;color:var(--accent)}

/* --- stage column --- */
.exp-main{min-width:0}
.exp-bar{display:flex;align-items:center;gap:12px;margin-bottom:22px}
.exp-bar .exp-prev,.exp-bar .exp-next{width:38px;height:38px;border-radius:50%;border:1px solid var(--line);
  background:rgba(255,255,255,.03);color:var(--ink);font-size:20px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center;transition:border-color .2s,background .2s,color .2s}
.exp-bar .exp-prev:hover,.exp-bar .exp-next:hover{border-color:var(--accent);color:var(--accent);background:rgba(var(--ac,55,224,176),.06)}
.exp-counter{font-family:var(--mono);font-size:13px;color:var(--dim);letter-spacing:.06em}
.exp-counter b{color:var(--accent);font-size:18px;margin-right:3px}
.exp-replay{margin-left:auto;display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:12px;
  letter-spacing:.04em;cursor:pointer;color:var(--dim);background:rgba(255,255,255,.03);
  border:1px solid var(--line);border-radius:30px;padding:8px 15px;transition:color .2s,border-color .2s,background .2s}
.exp-replay:hover{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.06)}
.exp-replay .ic{font-size:14px;line-height:1;display:inline-block}
.exp-replay.spin .ic{animation:replaySpin .6s var(--ease)}
@keyframes replaySpin{from{transform:rotate(0)}to{transform:rotate(-360deg)}}

/* --- a single agent demo (only the active one is shown) --- */
.exp-demo{display:none}
.exp-demo.active{display:block;animation:expIn .55s var(--ease) both}
@keyframes expIn{0%{opacity:0;transform:translateY(14px)}100%{opacity:1;transform:none}}
/* copy is a slim header (tag + title left · one-line blurb right; no KPI strip) so the
   demo UI gets the full column width beneath it and never crops */
.exp-demo .wrap{display:block;max-width:none;margin:0;padding:0}
.exp-demo .demo-copy{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);
  column-gap:52px;margin-bottom:26px;align-items:center}
.exp-demo .demo-tag{grid-column:1;grid-row:1;margin-bottom:14px}
.exp-demo .demo-title{grid-column:1;grid-row:2;margin:0}
.exp-demo .demo-blurb{grid-column:2;grid-row:2;margin:0;max-width:none}
.exp-demo .demo-metrics{grid-column:1 / -1;grid-row:3;margin-top:30px}

.demo-tag{display:inline-flex;align-items:center;gap:9px;font-family:var(--mono);
  font-size:12px;letter-spacing:.14em;color:var(--nav,var(--accent));text-transform:uppercase;margin-bottom:16px}
.demo-tag .n{opacity:.55}
.demo-title{font-size:clamp(22px,2.5vw,31px);font-weight:800;letter-spacing:-.01em;line-height:1.18}
.demo-blurb{color:var(--dim);font-size:15.5px;line-height:1.72;margin:16px 0 28px;max-width:46ch}
.demo-metrics{display:flex;flex-wrap:wrap;gap:16px 36px}
.dm-num{font-weight:800;font-size:clamp(26px,3vw,38px);line-height:1;color:var(--accent);display:inline-flex;align-items:baseline;letter-spacing:-.01em}
.dm-pre,.dm-suf{font-size:.58em;margin:0 .04em}
.dm-lab{color:var(--dim);font-size:12px;letter-spacing:.04em;margin-top:8px;max-width:18ch}

/* 舞台 = 唯一的一张卡（与首页 .cdir / onboarding .ob-detail / 通脉 .pipe-diag 同一套）：
   无光斑、无点阵、无主色染色；里面的面板都是平的 hairline 区块，不再嵌套卡片。 */
.demo-stage{position:relative;border:1px solid var(--line);border-radius:var(--r-card);overflow:hidden;
  background:linear-gradient(180deg,var(--panel),var(--bg));padding:30px;min-height:320px;
  display:flex;flex-direction:column;justify-content:center}
.stage-cap{position:absolute;left:18px;bottom:14px;font-family:var(--sans);font-size:11px;
  letter-spacing:.08em;color:var(--dim)}
.stage-cap b{color:var(--accent)}

@media(max-width:860px){
  .exp-demo .demo-copy{grid-template-columns:1fr;column-gap:0}
  .exp-demo .demo-tag,.exp-demo .demo-title,
  .exp-demo .demo-blurb,.exp-demo .demo-metrics{grid-column:1;grid-row:auto}
  .exp-demo .demo-blurb{margin-top:16px}
  .exp-demo .demo-metrics{margin-top:24px}
}

/* ============ WIDGET 1 · KNOWLEDGE GRAPH ============ */
.kg{width:100%;height:auto;display:block;overflow:visible}
.kg-edge{stroke:rgba(var(--ac,55,224,176),.45);stroke-width:1.4;fill:none;stroke-dasharray:1;stroke-dashoffset:1}
.kg.go .kg-edge{animation:kgDraw .9s var(--ease) forwards;animation-delay:var(--d,.1s)}
@keyframes kgDraw{to{stroke-dashoffset:0}}
.kg-node{fill:var(--panel);stroke:var(--accent);stroke-width:1.6;
  transform:scale(0);transform-box:fill-box;transform-origin:center}
.kg.go .kg-node{animation:kgPop .5s var(--ease) forwards;animation-delay:var(--d,0s)}
@keyframes kgPop{0%{transform:scale(0)}68%{transform:scale(1.18)}100%{transform:scale(1)}}
.kg-node.core{fill:var(--accent);stroke:none}
.kg.go .kg-node.core{animation:kgPop .55s var(--ease) forwards, kgPulse 2.4s ease-in-out 1s infinite}
@keyframes kgPulse{0%,100%{filter:drop-shadow(0 0 0 rgba(var(--ac,55,224,176),0))}50%{filter:drop-shadow(0 0 7px rgba(var(--ac,55,224,176),.85))}}
.kg-dot{fill:var(--accent)}
.kg-label{fill:var(--dim);font-size:9px;font-family:var(--sans);opacity:0;letter-spacing:.04em}
.kg.go .kg-label{animation:kgFade .5s ease forwards;animation-delay:var(--d,.4s)}
@keyframes kgFade{to{opacity:1}}

/* ============ WIDGET 2 · RISK ALERT FEED ============ */
.feed{display:flex;flex-direction:column;gap:10px;width:100%}
.feed-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:6px}
.feed-head .t{font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
.feed-head .c{font-weight:800;font-size:22px;color:var(--accent)}
.feed-row{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:13px;
  padding:10px 2px;border:0;border-bottom:1px solid rgba(242,239,233,.08);border-radius:0;background:none;
  opacity:0;transform:translateX(16px)}
.feed.go .feed-row{animation:feedIn .55s var(--ease) both;animation-delay:calc(var(--i)*.14s)}
@keyframes feedIn{to{opacity:1;transform:none}}
.feed-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
.feed-dot.hi{background:#ff6a6a}
.feed-dot.md{background:#ffc24d}
.feed-dot.lo{background:var(--accent)}
.feed-v{font-size:13.5px;color:var(--ink);line-height:1.3}
.feed-v small{display:block;color:var(--dim);font-size:11px;letter-spacing:.02em}
.feed-chip{font-size:11px;padding:4px 10px;border-radius:20px;white-space:nowrap;font-weight:600}
.feed-chip.ok{color:var(--accent);background:rgba(var(--ac,55,224,176),.1);border:1px solid rgba(var(--ac,55,224,176),.32)}
.feed-chip.esc{color:#ff9a9a;background:rgba(255,90,90,.1);border:1px solid rgba(255,90,90,.34)}

/* ============ WIDGET 3 · FHIR TRANSFORM ============ */
.fhir{display:grid;grid-template-columns:1fr auto 1.12fr;gap:16px;align-items:center;width:100%}
.fhir-h{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);margin-bottom:12px}
.fhir-raw .ln{height:8px;border-radius:4px;background:rgba(255,255,255,.08);margin:9px 0}
.fhir-arrow{color:var(--accent);font-size:22px;opacity:.7;text-align:center}
.fhir-field{display:flex;align-items:center;gap:10px;margin:11px 0;opacity:0;transform:translateY(8px)}
.fhir.go .fhir-field{animation:feedIn .5s var(--ease) both;animation-delay:calc(var(--i)*.16s + .2s)}
.fhir-field .k{color:var(--accent);font-family:var(--mono);font-size:11px;min-width:92px}
.fhir-field .val{flex:1;height:7px;border-radius:4px;background:linear-gradient(90deg,var(--accent),var(--accent2));width:0}
.fhir.go .fhir-field .val{animation:fhirFill 1s var(--ease) both;animation-delay:calc(var(--i)*.16s + .34s)}
@keyframes fhirFill{to{width:100%}}
.fhir-badge{margin-top:18px;display:inline-flex;align-items:center;gap:8px;font-size:12.5px;color:var(--accent);
  background:rgba(var(--ac,55,224,176),.08);border:1px solid rgba(var(--ac,55,224,176),.3);border-radius:30px;padding:8px 14px;
  opacity:0;transform:translateY(8px)}
.fhir-badge-wrap{text-align:center}
.fhir.go .fhir-badge{animation:feedIn .6s var(--ease) both;animation-delay:1.1s}

/* ============ WIDGET 4 · GENERATION (waveform + render) ============ */
.gen{display:flex;flex-direction:column;gap:24px;width:100%}
.gen-wave{display:flex;align-items:center;gap:4px;height:84px}
.gen-wave i{flex:1;background:linear-gradient(180deg,var(--accent),var(--accent2));border-radius:3px;height:12%;align-self:center}
.gen.go .gen-wave i{animation:wf 1.15s ease-in-out infinite;animation-delay:calc(var(--i)*.045s)}
@keyframes wf{0%,100%{height:12%}50%{height:var(--h,70%)}}
.gen-prog{position:relative;height:8px;border-radius:5px;background:rgba(255,255,255,.07);overflow:hidden}
.gen-prog i{display:block;height:100%;width:0;border-radius:5px;background:linear-gradient(90deg,var(--accent),var(--accent2))}
.gen.go .gen-prog i{animation:genFill 2.6s var(--ease) forwards}
@keyframes genFill{to{width:100%}}
.gen-slides{display:flex;gap:12px}
.gen-slide{flex:1;aspect-ratio:16/10;border:1px solid var(--line);border-radius:9px;background:rgba(255,255,255,.03);
  position:relative;overflow:hidden;opacity:0;transform:translateY(14px)}
.gen.go .gen-slide{animation:feedIn .55s var(--ease) both;animation-delay:calc(var(--i)*.18s + .4s)}
.gen-slide::before{content:"";position:absolute;left:10%;top:22%;width:46%;height:10%;border-radius:3px;background:rgba(var(--ac,55,224,176),.5)}
.gen-slide::after{content:"";position:absolute;left:10%;top:42%;right:14%;height:6%;border-radius:3px;background:rgba(255,255,255,.16)}

/* ---- closing CTA ---- */
.demos-cta{padding:110px 0;border-top:1px solid var(--line);text-align:center}
.demos-cta .big{font-size:clamp(34px,6vw,72px);font-weight:800;letter-spacing:-.02em;line-height:1}
.demos-cta .big .accent{color:var(--accent)}
.demos-cta .btn{margin-top:34px}
.demos-cta .cta-cross{display:block;margin-top:22px;font-size:13px;color:var(--accent);opacity:.8;transition:opacity .2s}
.demos-cta .cta-cross:hover{opacity:1}

/* ============ COMPOSITE MINI-UI SUB-PANELS ============ */
.demo-stage{gap:14px;padding:24px}
/* 面板：平的、只有一条顶部 hairline（首页 services 行的语法），不是窗口、不是卡片 */
.dpanel{width:100%;border:0;border-top:1px solid var(--line);border-radius:0;background:none;padding:14px 0 0}
/* 面板头 = kicker 行：穴位环 + 小标题 + 右侧 mono meta，下方一条淡 hairline */
.dp-head{display:flex;align-items:center;gap:8px;font-family:var(--sans);font-weight:600;font-size:10.5px;line-height:1.3;
  letter-spacing:.12em;text-transform:uppercase;color:var(--dim);
  padding-bottom:8px;border-bottom:1px solid rgba(242,239,233,.10);margin-bottom:12px}
/* 穴位环：stage 到位时点亮（得气）。仅绘制属性——lockHeight 量高时无 .on，不受影响 */
.dp-head::before{content:"";width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:var(--bg2);
  border:1.5px solid rgba(55,224,176,.45);
  transition:background .45s var(--ease),border-color .45s var(--ease),box-shadow .45s var(--ease)}
.story-stage.on .dp-head::before{background:var(--accent);border-color:var(--accent);box-shadow:0 0 9px rgba(55,224,176,.85);transition-delay:.35s}
.dp-head .dot{display:none}
.dp-head .meta{margin-left:auto;font-family:var(--mono);font-weight:400;font-size:10.5px;letter-spacing:.02em;text-transform:none;color:var(--dim)}
.dp-head .mt-rec{margin-left:auto}
.dpanel .kg{height:150px}

/* chat bubbles */
.cb{max-width:88%;padding:9px 13px;border-radius:var(--r-well);font-size:12.5px;line-height:1.5;margin:7px 0;opacity:0;transform:translateY(8px)}
.go .cb{animation:feedIn .5s var(--ease) both;animation-delay:calc(var(--i)*.55s + .2s)}
.cb.user{background:none;border:1px solid var(--line);color:var(--ink);margin-left:auto}
.cb.ai{background:rgba(55,224,176,.05);border:0;border-left:2px solid var(--accent);border-radius:0 var(--r-well) var(--r-well) 0;color:#cfeee6}
.cb.sys{max-width:100%;text-align:center;font-size:11.5px;color:#ffb98a;background:none;border:1px solid rgba(255,150,80,.3)}
.cb .cite{display:inline-flex;align-items:center;gap:5px;margin-top:8px;font-family:var(--mono);font-size:10.5px;
  color:var(--accent);background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.32);border-radius:6px;padding:3px 8px}
.cb .cite::before{content:"📄";font-size:10px}

/* source chips */
.srcs{display:flex;gap:8px;flex-wrap:wrap;margin-top:11px}
.src{font-size:10.5px;color:var(--dim);border:1px solid var(--line);border-radius:6px;padding:5px 9px;font-family:var(--mono);opacity:0;transform:translateY(6px)}
.go .src{animation:feedIn .45s var(--ease) both;animation-delay:calc(var(--i)*.12s + 1.5s)}
.src.hit{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.42);background:rgba(var(--ac,55,224,176),.08)}

/* checklist */
.checklist{display:flex;flex-direction:column;gap:2px}
.ck-row{display:flex;align-items:center;gap:11px;padding:9px 2px;font-size:13px;color:var(--ink);opacity:0;transform:translateX(12px)}
.checklist.go .ck-row{animation:feedIn .5s var(--ease) both;animation-delay:calc(var(--i)*.55s + .15s)}
.ck-box{width:18px;height:18px;border-radius:3px;border:1.5px solid var(--accent);position:relative;flex:0 0 auto;background:rgba(var(--ac,55,224,176),.08)}
.ck-box::after{content:"✓";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--accent);opacity:0}
.checklist.go .ck-row .ck-box::after{animation:kgFade .3s ease forwards;animation-delay:calc(var(--i)*.55s + .5s)}
.ck-row .lab{flex:1}
.ck-row small{color:var(--dim);font-size:10.5px;font-family:var(--mono);white-space:nowrap}
.ck-row small.ok{color:var(--accent)}

/* appointment card */
.appt{display:flex;align-items:center;gap:13px;border:1px solid var(--line);background:none;
  border-radius:var(--r-well);padding:12px 14px;margin-top:11px;opacity:0;transform:translateY(8px)}
.followup.go .appt{animation:feedIn .55s var(--ease) both;animation-delay:2s}
.appt .cal{width:38px;height:38px;border-radius:var(--r-mark);background:var(--bg2);border:1px solid var(--line);display:flex;flex-direction:column;
  align-items:center;justify-content:center;flex:0 0 auto;line-height:1.1}
.appt .cal b{color:var(--accent);font-size:13px}
.appt .cal span{font-size:8px;color:var(--accent);letter-spacing:.12em}
.appt .info{font-size:12.5px;color:var(--ink)}
.appt .info small{display:block;color:var(--dim);font-size:11px;margin-top:3px}
.appt .ok{margin-left:auto;font-size:11px;color:var(--accent);font-family:var(--mono)}

/* ingest dropzone */
.drop{border:1.5px dashed var(--line);border-radius:var(--r-well);padding:16px;display:flex;gap:10px;flex-wrap:wrap;justify-content:center}
.file{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink);background:rgba(255,255,255,.04);
  border:1px solid var(--line);border-radius:var(--r-well);padding:8px 12px;opacity:0;transform:translateY(-12px)}
.ingest.go .file{animation:fileDrop .55s var(--ease) both;animation-delay:calc(var(--i)*.2s + .15s)}
@keyframes fileDrop{0%{opacity:0;transform:translateY(-14px)}62%{opacity:1;transform:translateY(3px)}100%{opacity:1;transform:none}}
.file .ic{width:9px;height:9px;border-radius:2px;background:var(--accent);flex:0 0 auto}
.file .ext{font-family:var(--mono);font-size:9.5px;color:var(--accent)}

/* assistant reasoning + deploy targets */
.qa-status{display:flex;align-items:center;gap:8px;font-size:10.5px;color:var(--dim);font-family:var(--mono);margin:2px 0 4px;opacity:0}
.go .qa-status{animation:kgFade .4s ease forwards;animation-delay:.5s}
.qa-status .tick{color:var(--accent)}
.deploy{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:12px;padding-top:11px;border-top:1px solid var(--line)}
.deploy .lbl{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.dchip{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--ink);border:1px solid var(--line);border-radius:20px;padding:3px 10px;opacity:0;transform:translateY(5px)}
.go .dchip{animation:feedIn .4s var(--ease) both;animation-delay:calc(var(--i)*.1s + 1.9s)}
.dchip::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--accent)}

/* risk dossier */
.dossier .drow{display:flex;align-items:center;gap:10px;margin-bottom:11px;flex-wrap:wrap;row-gap:7px}
.sev{font-size:10px;font-weight:700;letter-spacing:.06em;padding:3px 8px;border-radius:5px}
.sev.high{color:#ff9a9a;background:rgba(255,90,90,.12);border:1px solid rgba(255,90,90,.34)}
.geo{font-family:var(--mono);font-size:11px;color:var(--dim);border:1px solid var(--line);border-radius:5px;padding:3px 7px}
.conf{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--accent);white-space:nowrap}
.evid{display:flex;gap:8px}
.evid .ev{flex:1;border:0;border-top:1px solid var(--line);border-radius:0;padding:8px 2px;font-size:10px;color:var(--dim);background:none;opacity:0;transform:translateY(6px)}
.dossier.go .ev{animation:feedIn .45s var(--ease) both;animation-delay:calc(var(--i)*.14s + .35s)}
.evid .ev b{display:block;color:var(--ink);font-size:10.5px;margin-bottom:5px}
.evid .ev .thumb{height:26px;border-radius:4px;background:linear-gradient(135deg,rgba(var(--ac,55,224,176),.16),rgba(255,255,255,.03));margin-bottom:6px;
  display:flex;align-items:center;justify-content:center;font-size:13px}

/* FHIR coded values */
.fhir-field .v{font-family:var(--mono);font-size:9.5px;color:var(--accent);white-space:nowrap;flex:0 0 auto}
.fhir-trace{margin-top:12px;font-size:10px;color:var(--dim);font-family:var(--mono);display:flex;align-items:center;gap:6px;opacity:0}
.fhir.go .fhir-trace{animation:kgFade .4s ease forwards;animation-delay:1.1s}
.fhir-trace .tick{color:var(--accent)}

/* brand-gene extraction */
.brand-gene{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--dim);margin-top:12px;padding-top:11px;border-top:1px solid var(--line);opacity:0}
.ingest.go .brand-gene{animation:kgFade .4s ease forwards;animation-delay:1.1s}
.brand-gene .lbl{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase}
.sw{display:flex;gap:5px}
.sw i{width:14px;height:14px;border-radius:4px;border:1px solid rgba(255,255,255,.12)}
.brand-gene .font{font-family:var(--mono);color:var(--accent)}

/* slide editable handles */
.gen-slide.edit{outline:1.5px solid rgba(var(--ac,55,224,176),.6);outline-offset:1px}
.gen-slide .handle{position:absolute;width:6px;height:6px;background:var(--accent);border-radius:1px}
.gen-slide .handle.tl{left:-3px;top:-3px}.gen-slide .handle.tr{right:-3px;top:-3px}
.gen-slide .handle.bl{left:-3px;bottom:-3px}.gen-slide .handle.br{right:-3px;bottom:-3px}
.gen-slide .etag{position:absolute;left:6px;bottom:5px;font-family:var(--mono);font-size:8px;color:var(--accent);background:rgba(27,33,44,.7);padding:1px 4px;border-radius:3px}

/* MP4 output card */
.outcard{display:flex;align-items:center;gap:12px;border:1px solid var(--line);background:none;
  border-radius:var(--r-well);padding:11px 14px;margin-top:14px;opacity:0;transform:translateY(8px)}
.gen.go .outcard{animation:feedIn .55s var(--ease) both;animation-delay:1.9s}
.outcard .play{width:30px;height:30px;border-radius:50%;background:rgba(var(--ac,55,224,176),.16);display:flex;align-items:center;justify-content:center;color:var(--accent);flex:0 0 auto;font-size:11px}
.outcard .nm{font-size:12.5px;color:var(--ink)}
.outcard .nm small{display:block;color:var(--dim);font-size:11px;margin-top:2px}
.outcard .dur{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--accent)}

/* ============ SCENE STATES (shared) ============
   Generic states the scene engine (demos.js) flips on elements inside a demo.
   All demos are scene-driven: panels render as empty UI shells, then the scene
   reveals/updates elements as the "agent" works. Specific overrides (.file,
   .mt-*, …) must come after the generic .sc-on rule to win source order. */
.exp-demo .sc-on{animation:feedIn .45s var(--ease) both}
.file.sc-on{animation:fileDrop .55s var(--ease) both}
.file.sc-read{border-color:rgba(55,224,176,.55);transition:border-color .35s}
/* checklist: box pulses while the step is in flight, ticks + result on sc-done */
.ck-row.sc-on:not(.sc-done) .ck-box{animation:boxRun 1s ease-in-out infinite}
@keyframes boxRun{0%,100%{background:rgba(var(--ac,55,224,176),.05)}50%{background:rgba(var(--ac,55,224,176),.3)}}
.ck-row.sc-done .ck-box::after{animation:kgFade .3s ease forwards}
.ck-row small{opacity:0}
.ck-row.sc-done small{animation:kgFade .35s ease forwards}
/* feed rows: dim "working" chip until the verdict flips in */
.feed-chip.wait{color:var(--dim);background:none;border:1px solid var(--line)}
.feed-row .feed-chip.wait ~ .feed-chip{display:none}
.feed-row.sc-flip .feed-chip.wait{display:none}
.feed-row.sc-flip .feed-chip.wait ~ .feed-chip{display:inline-block;animation:capPop .4s var(--ease) both}
/* fhir/contract: scan sweep over the raw document, fields fill as extracted */
.fhir-raw{position:relative}
.fhir.sc-scan .fhir-raw::after{content:"";position:absolute;left:4px;right:4px;height:20px;border-radius:4px;pointer-events:none;
  background:linear-gradient(180deg,transparent,rgba(var(--ac,55,224,176),.14),transparent);animation:scanY 1.7s ease-in-out both}
@keyframes scanY{0%{top:16%;opacity:0}12%{opacity:1}88%{opacity:1}100%{top:86%;opacity:0}}
.fhir-field.sc-on .val{animation:fhirFill .7s var(--ease) both;animation-delay:.15s}
.xrow.sc-on{animation:kgFade .45s ease forwards}
.fhir-trace.sc-on{animation:kgFade .45s ease forwards}
/* score: bars fill row by row, total lands last */
.sr.sc-on .track i{animation:scoreFill .9s var(--ease) both;animation-delay:.15s}
.score .total{opacity:0}
/* three-way match: cells appear neutral, discrepancies flagged on sc-bad */
.match .mr.bad{color:#c2cde0}
.match .mr.bad::after{content:none}
.match .mr.bad.sc-bad{color:#ff9a9a;animation:badFlash .55s var(--ease) both}
.match .mr.bad.sc-bad::after{content:"⚠";margin-left:4px}
@keyframes badFlash{0%{background:rgba(255,90,90,.22);opacity:1}100%{background:transparent;opacity:1}}
/* redline: the offending clause is struck live */
.redline .del{text-decoration:none}
.redline .del.sc-strike{text-decoration:line-through;animation:badFlash .55s var(--ease) both}
/* sla: clock runs on sc-run, verdict appears once resolved inside target */
.sla.sc-run .bar i{animation:genFill 2.2s var(--ease) forwards}
.sla .meta .ok{opacity:0}
.sla .meta .ok.sc-on{animation:kgFade .4s ease forwards}
/* generation: narration + render are separate phases the scene starts */
.gen.sc-wave .gen-wave i{animation:wf 1.15s ease-in-out infinite;animation-delay:calc(var(--i)*.045s)}
.gen.sc-render .gen-prog i{animation:genFill 2.6s var(--ease) forwards}
.brand-gene.sc-on{animation:kgFade .5s ease forwards}
.dossier .drow{opacity:0}
.dossier .drow.sc-on{animation:feedIn .45s var(--ease) both}

/* ===== MEETING / WORKSHOP AGENT — scene-driven (scenes.meeting in demos.js) =====
   Elements are hidden until the scene adds .sc-on; the transcript .txt spans are
   typed live; .sc-cap fires the capture highlight + tag; the ticket badge flips
   from "creating…" to its id via .sc-done. */
@keyframes recPulse{0%,100%{opacity:1}50%{opacity:.3}}
.mt-rec{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;color:#ff8a8a;text-transform:none;letter-spacing:.04em}
.mt-rec i{width:7px;height:7px;border-radius:50%;background:#ff5a5a;animation:recPulse 1.6s ease-in-out infinite}
.mt-rec .rec-t{font-weight:400;font-variant-numeric:tabular-nums}
.mt-ppl{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:11px}
.mt-pp{font-size:10px;color:var(--dim);border:1px solid var(--line);border-radius:20px;padding:3px 9px;opacity:0;transform:translateY(4px)}
.mt-pp.sc-on{animation:feedIn .4s var(--ease) both}
.mt-pp.ai{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.34);background:rgba(var(--ac,55,224,176),.08)}
.mt-line{font-size:12px;line-height:1.5;color:#c2cde0;padding:7px 0;border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateY(8px)}
.mt-line.sc-on{animation:feedIn .4s var(--ease) both}
.mt-line .tm{font-family:var(--mono);font-size:9.5px;color:var(--dim);margin-right:8px}
.mt-line .sp{color:var(--ink);font-weight:600;margin-right:4px}
.mt-line.ai,.mt-line.ai .sp{color:var(--accent)}
/* speaker lines stay neutral until the agent captures them */
.mt-line.hl-bug,.mt-line.hl-feat{border-left:2px solid transparent;padding-left:9px;
  transition:border-color .4s var(--ease),background .4s var(--ease)}
.mt-line.hl-bug.sc-cap{border-left-color:#ff5a5a;background:rgba(255,90,90,.05)}
.mt-line.hl-feat.sc-cap{border-left-color:var(--accent);background:rgba(var(--ac,55,224,176),.05)}
.mt-cap{display:inline-block;margin-left:7px;font-size:9px;padding:2px 7px;border-radius:5px;white-space:nowrap;font-family:var(--mono);opacity:0;transform:scale(.55)}
.mt-line.sc-cap .mt-cap{animation:capPop .42s var(--ease) both}
@keyframes capPop{0%{opacity:0;transform:scale(.55)}70%{opacity:1;transform:scale(1.14)}100%{opacity:1;transform:scale(1)}}
.mt-cap.bug{color:#ff9a9a;background:rgba(255,90,90,.12);border:1px solid rgba(255,90,90,.3)}
.mt-cap.feat{color:var(--accent);background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.3)}
.mt-cap.fup{color:var(--dim);border:1px solid var(--line)}
/* typewriter caret (any scene) */
.typing::after{content:"▍";color:var(--accent);margin-left:2px;animation:caretBlink .75s steps(1) infinite}
@keyframes caretBlink{0%,100%{opacity:1}50%{opacity:0}}
.mt-pt{display:flex;gap:10px;font-size:12px;color:#c2cde0;line-height:1.45;padding:7px 0;border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateX(10px)}
.mt-pt.sc-on{animation:ptIn .7s var(--ease) both}
@keyframes ptIn{0%{opacity:0;transform:translateX(10px);background:rgba(var(--ac,55,224,176),.14)}
  55%{background:rgba(var(--ac,55,224,176),.1)}100%{opacity:1;transform:none;background:transparent}}
.mt-pt .tm{font-family:var(--mono);font-size:9.5px;color:var(--accent);flex:0 0 auto}
.mt-task{border:1px solid var(--line);border-radius:9px;padding:10px 12px;margin-bottom:9px;opacity:0;transform:translateY(8px)}
.go .mt-task{animation:feedIn .5s var(--ease) both;animation-delay:calc(var(--i)*.2s + .4s)} /* non-scene demos (e.g. #sla) */
.mt-task.sc-on{animation:feedIn .5s var(--ease) both}
.mt-task .t{font-size:12.5px;color:var(--ink);margin-bottom:6px}
.mt-task .m{display:flex;flex-wrap:wrap;gap:8px;font-size:10px;color:var(--dim);align-items:center}
.mt-task .m .badge{color:var(--accent);font-family:var(--mono);border:1px solid rgba(var(--ac,55,224,176),.3);border-radius:5px;padding:1px 6px}
/* ticket badge: "creating…" pulses until the scene flips it to the id */
.badge .b-wait{color:var(--dim);animation:waitPulse 1.1s ease-in-out infinite}
@keyframes waitPulse{0%,100%{opacity:1}50%{opacity:.4}}
.badge .b-wait + .b-id{display:none}
.badge.sc-done .b-wait{display:none}
.badge.sc-done .b-wait + .b-id{display:inline;animation:kgFade .35s ease both}
.mt-ping{display:flex;align-items:center;gap:8px;font-size:10.5px;color:#ffc24d;background:rgba(255,180,60,.07);
  border:1px solid rgba(255,180,60,.24);border-radius:8px;padding:8px 10px;margin-top:4px;opacity:0;transform:translateY(6px)}
.mt-ping.sc-on{animation:feedIn .5s var(--ease) both}
.mt-ping .bell{display:inline-block}
.mt-ping.sc-on .bell{animation:bellRing .8s .35s var(--ease) both}
@keyframes bellRing{0%,100%{transform:rotate(0)}25%{transform:rotate(14deg)}55%{transform:rotate(-12deg)}80%{transform:rotate(6deg)}}

/* ============ MEETING · STAGED STORYBOARD (scenes.meeting + `story`) ============ */
.demo-stage.story{display:block;padding:22px 24px 26px}
/* --- stepper --- */
.story-nav{position:relative;display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:24px}
.story-line{position:absolute;left:12.5%;right:12.5%;top:13px;height:2px;background:var(--line);border-radius:2px}
.story-line i{display:block;height:100%;width:0;border-radius:2px;background:var(--nav,var(--accent));transition:width .5s var(--ease)}
.story-step{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:9px;
  background:none;border:0;font:inherit;color:var(--dim);padding:0;cursor:default}
.story.story-done .story-step{cursor:pointer}
.story.story-done .story-step:hover .ss-lab{color:var(--ink)}
.story.story-done .story-step:not(.on):hover .ss-dot{border-color:var(--nav,var(--accent));color:var(--nav,var(--accent));
  box-shadow:0 0 0 4px rgba(255,255,255,.06)}
.story-step:focus-visible{outline:2px solid var(--nav,var(--accent));outline-offset:3px;border-radius:6px}
/* 节点 = 带编号的环（与 onboarding 的 .ob-node .dot 同一语法）：
   done = 主色环 + 主色编号（不换 ✓），on = 主色实心盘 + 深色编号 + 得气 ripple；颜色读导航层 --nav */
.ss-dot{position:relative;width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-weight:600;font-size:11px;background:var(--bg2);border:1.5px solid var(--line);color:var(--dim);
  transition:background .3s var(--ease),border-color .3s var(--ease),color .3s var(--ease),box-shadow .3s var(--ease)}
.story-step.on .ss-dot{background:var(--nav,var(--accent));border-color:var(--nav,var(--accent));color:#04130e;box-shadow:0 0 0 6px rgba(255,255,255,.06)}
/* 得气 ripple on stage arrival (::before) */
.ss-dot::before{content:"";position:absolute;inset:-2px;border-radius:50%;
  border:1.5px solid var(--nav,var(--accent));opacity:0;pointer-events:none}
.story-step.on .ss-dot::before{animation:qiRipple .8s var(--ease-out,ease-out) 1}
.story-step.done .ss-dot{background:var(--bg2);border-color:var(--nav,var(--accent));color:var(--nav,var(--accent))}
.ss-lab{font-size:11.5px;line-height:1.25;text-align:center;max-width:12ch;letter-spacing:.01em;transition:color .3s var(--ease)}
.story-step.on .ss-lab{color:var(--ink)}
/* --- stage viewport --- */
.story-view{position:relative;min-height:320px}
.story-stage{display:none}
/* --- stage transitions ---
   Each stage declares its entrance via data-fx, chosen for what the stage means:
   wipe = scanning/parsing · zoom-in = drilling deeper · zoom-out = stepping back
   slide = handoff / part-2 boundary · focus = scrutiny · flip = a deck materialises
   drop = a verdict lands · (default) rise. The outgoing stage cross-fades out as an
   absolute overlay — the height-locked .story-view keeps the page perfectly still. */
.story-stage.on{display:block;position:relative;z-index:1;animation:fxRise .55s var(--ease) both}
.story-stage[data-fx="slide"].on{animation:fxSlide .55s var(--ease) both}
.story-stage[data-fx="wipe"].on{animation:fxWipe .6s var(--ease) both}
.story-stage[data-fx="zoom-in"].on{animation:fxZoomIn .55s var(--ease) both}
.story-stage[data-fx="zoom-out"].on{animation:fxZoomOut .55s var(--ease) both}
.story-stage[data-fx="flip"].on{animation:fxFlip .6s var(--ease) both;transform-origin:50% 0}
.story-stage[data-fx="focus"].on{animation:fxFocus .55s var(--ease) both}
.story-stage[data-fx="drop"].on{animation:fxDrop .5s cubic-bezier(.2,1.3,.4,1) both}
@keyframes fxRise{0%{opacity:0;transform:translateY(16px)}100%{opacity:1;transform:none}}
@keyframes fxSlide{0%{opacity:0;transform:translateX(44px)}100%{opacity:1;transform:none}}
@keyframes fxWipe{0%{clip-path:inset(0 100% 0 0);opacity:1}100%{clip-path:inset(0 0 0 0);opacity:1}}
@keyframes fxZoomIn{0%{opacity:0;transform:scale(.94)}100%{opacity:1;transform:scale(1)}}
@keyframes fxZoomOut{0%{opacity:0;transform:scale(1.05)}100%{opacity:1;transform:scale(1)}}
@keyframes fxFlip{0%{opacity:0;transform:perspective(900px) rotateX(8deg) translateY(10px)}100%{opacity:1;transform:perspective(900px) rotateX(0deg) translateY(0)}}
@keyframes fxFocus{0%{opacity:0;filter:blur(9px)}100%{opacity:1;filter:blur(0)}}
@keyframes fxDrop{0%{opacity:0;transform:scale(1.07)}100%{opacity:1;transform:scale(1)}}
/* outgoing stage: overlays briefly while the next one enters */
.story-stage.leaving{display:block;position:absolute;left:0;right:0;top:0;z-index:0;pointer-events:none}
.story-stage.leave-fade{animation:fxLeaveFade .4s var(--ease) both}
.story-stage.leave-slide{animation:fxLeaveSlide .45s var(--ease) both}
@keyframes fxLeaveFade{0%{opacity:1}100%{opacity:0;transform:scale(.985)}}
@keyframes fxLeaveSlide{0%{opacity:1}100%{opacity:0;transform:translateX(-48px)}}

/* STAGE 0 · meeting + captured side panel */
.st0{display:grid;grid-template-columns:1.55fr 1fr;gap:14px;align-items:start}
.cap-item{display:flex;gap:10px;align-items:flex-start;border:0;border-top:1px solid rgba(242,239,233,.08);border-radius:0;
  padding:10px 2px;margin-top:6px;background:none;opacity:0;transform:translateX(12px)}
.cap-item.sc-on{animation:feedIn .5s var(--ease) both}
.cap-item .cap-ic{width:24px;height:24px;border-radius:var(--r-mark);display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:800;flex:0 0 auto}
.cap-item.bug .cap-ic{color:#ff9a9a;background:rgba(255,90,90,.14);border:1px solid rgba(255,90,90,.32)}
.cap-item.story .cap-ic{color:var(--accent);background:rgba(var(--ac,55,224,176),.14);border:1px solid rgba(var(--ac,55,224,176),.32)}
.cap-tx b{display:block;font-size:10px;letter-spacing:.08em;text-transform:uppercase;margin-bottom:3px}
.cap-item.bug .cap-tx b{color:#ff9a9a}
.cap-item.story .cap-tx b{color:var(--accent)}
.cap-tx span{font-size:12.5px;color:#c2cde0;line-height:1.4}

/* STAGE 1 · Jira board */
.jira-col-h{display:flex;align-items:center;gap:8px;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);margin-bottom:11px}
.jira-col-h .jc-count{background:rgba(255,255,255,.06);border-radius:20px;padding:1px 8px;font-size:10px}
.jira-card{border:0;border-left:2px solid var(--accent);border-radius:0;padding:3px 0 6px 14px;
  margin-bottom:16px;background:none;opacity:0;transform:translateY(12px) scale(.98)}
.jira-card.sc-on{animation:cardIn .55s var(--ease) both}
@keyframes cardIn{0%{opacity:0;transform:translateY(12px) scale(.98)}100%{opacity:1;transform:none}}
.jira-card:first-of-type{border-left-color:#ff5a5a}
.jc-top{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.jc-type{font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:2px 7px;border-radius:4px}
.jc-type.bug{color:#ff9a9a;background:rgba(255,90,90,.12);border:1px solid rgba(255,90,90,.3)}
.jc-type.story{color:var(--accent);background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.3)}
.jc-key{margin-left:auto;font-family:var(--mono);font-size:10.5px;color:var(--dim)}
.jc-title{font-size:13px;color:var(--ink);line-height:1.4;margin-bottom:10px}
.jc-foot{display:flex;align-items:center;gap:8px;font-size:10.5px}
.jc-pri{font-family:var(--mono);padding:2px 7px;border-radius:4px}
.jc-pri.high{color:#ff9a9a;background:rgba(255,90,90,.1)}
.jc-pri.med{color:#ffc24d;background:rgba(255,180,60,.1)}
.jc-assignee{margin-left:auto;color:var(--accent);display:inline-flex;align-items:center;gap:4px}
.jira-note{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--dim);margin-top:6px;opacity:0}
.jira-note.sc-on{animation:kgFade .5s ease forwards}
.jira-note .tick{color:var(--accent)}

/* STAGE 2 · coding agent terminal */
.term{font-family:var(--mono);font-size:11.5px;line-height:1.75;background:rgba(0,0,0,.28);
  border:1px solid var(--line);border-radius:var(--r-well);padding:13px 15px}
.term .tl{color:#c2cde0;opacity:0;transform:translateX(8px)}
.term .tl.sc-on{animation:feedIn .4s var(--ease) both}
.term .tl.ok{color:var(--accent)}
.term .tl .cmd{color:var(--accent);margin-right:5px}
.term .tl.ok .cmd{color:var(--accent)}
.diff{margin:9px 0;border-left:2px solid var(--line);padding:2px 0 2px 11px}
.diff .dfile,.diff .dline{opacity:0}
.diff .dfile{color:var(--dim);margin:6px 0 3px}
.diff .dfile:first-child{margin-top:0}
.diff .dnew{font-size:8.5px;color:var(--accent);background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.3);border-radius:4px;padding:0 6px;margin-left:6px;text-transform:uppercase;letter-spacing:.05em}
.diff.sc-on .dfile,.diff.sc-on .dline{animation:feedIn .35s var(--ease) both;animation-delay:calc(var(--i)*.12s + .1s)}
.dline.del{color:#ff9a9a;background:rgba(255,90,90,.06)}
.dline.ins{color:var(--accent);background:rgba(var(--ac,55,224,176),.06)}
.dline.ctx{color:var(--dim)}

/* STAGE 3 · pull request */
.pr .pr-row{opacity:0;transform:translateY(8px)}
.pr .pr-row.sc-on{animation:feedIn .5s var(--ease) both}
.pr-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.pr-state{font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--accent);
  background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.32);border-radius:20px;padding:3px 11px}
.pr-title{font-size:15px;color:var(--ink);font-weight:600}
.pr-num{color:var(--dim);font-family:var(--mono);font-size:13px}
.pr-branch{display:flex;align-items:center;gap:8px;margin-top:13px;font-size:11px;color:var(--dim)}
.pr-branch code{font-family:var(--mono);background:rgba(255,255,255,.05);border:1px solid var(--line);
  border-radius:5px;padding:2px 8px;color:#c2cde0}
.pr-branch .arr{color:var(--accent)}
.pr-files{display:flex;align-items:center;gap:11px;margin-top:12px;font-size:11.5px;color:var(--dim)}
.pr-files .add{color:var(--accent);font-family:var(--mono)}
.pr-files .del{color:#ff9a9a;font-family:var(--mono)}
.pr-checks{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:14px}
.pr-check{display:flex;align-items:center;gap:10px;font-size:12px;color:#c2cde0;padding:8px 2px;
  border:0;border-bottom:1px solid rgba(242,239,233,.08);border-radius:0;transition:border-color .4s var(--ease)}
.pr-check::before{content:"";width:13px;height:13px;border-radius:50%;flex:0 0 auto;
  border:2px solid rgba(255,180,60,.55);border-top-color:transparent;animation:spin .7s linear infinite}
.pr-check.sc-ok{color:var(--ink);border-bottom-color:rgba(55,224,176,.45)}
.pr-check.sc-ok::before{content:"✓";border:0;width:14px;height:14px;background:var(--accent);color:#04130e;
  display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;animation:capPop .4s var(--ease) both}
@keyframes spin{to{transform:rotate(360deg)}}
.pr-foot{display:flex;align-items:center;gap:10px;margin-top:15px;padding-top:13px;border-top:1px solid var(--line)}
.pr-review{font-size:11.5px;color:var(--dim)}
.pr-btn{margin-left:auto;font-size:12px;font-weight:600;color:#04130e;background:var(--accent);border-radius:7px;padding:7px 17px}

/* --- Jira ticket detail --- */
.jc-pts{margin-left:8px;font-family:var(--mono);font-size:10px;color:var(--dim);border:1px solid var(--line);border-radius:4px;padding:1px 6px}
.jc-desc{font-size:12px;color:#aab6c8;line-height:1.55;margin-bottom:11px}
.jc-sec{margin-bottom:11px}
.jc-sec-h{font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);margin-bottom:6px}
.jc-steps{margin:0;padding-left:18px;font-size:11.5px;color:#c2cde0;line-height:1.65}
.jc-steps li{margin:1px 0}
.jc-ac{display:flex;align-items:flex-start;gap:8px;font-size:11.5px;color:#c2cde0;line-height:1.45;margin:5px 0}
.jc-ac-box{width:13px;height:13px;border-radius:4px;border:1.5px solid rgba(var(--ac,55,224,176),.5);background:rgba(var(--ac,55,224,176),.08);flex:0 0 auto;margin-top:1px}
.jc-labels{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:11px}
.jc-lab{font-family:var(--mono);font-size:9.5px;color:var(--dim);background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:20px;padding:2px 9px}
.jira-card .jc-foot{flex-wrap:wrap;gap:8px 10px;align-items:center;padding-top:10px;border-top:1px solid var(--line)}
.jc-people{margin-left:auto;font-size:10px;color:var(--accent);text-align:right;line-height:1.5}
.jc-meta-k{color:var(--dim);text-transform:uppercase;letter-spacing:.06em;font-size:8.5px;margin-right:2px}

/* --- PR detail --- */
.pr-link{margin-left:8px;font-size:10px;font-family:var(--mono);color:var(--accent);background:rgba(var(--ac,55,224,176),.1);border:1px solid rgba(var(--ac,55,224,176),.28);border-radius:5px;padding:2px 8px}
.pr-desc{margin-top:13px;font-size:12.5px;color:#aab6c8;line-height:1.6}
.pr-desc p{margin:0}
.pr-desc code,.pr-branch code{font-family:var(--mono)}
.pr-desc code{font-size:11.5px;color:var(--accent);background:rgba(var(--ac,55,224,176),.08);border-radius:4px;padding:1px 5px}
.pr-commits{margin-top:13px;display:flex;flex-direction:column;gap:7px}
.pr-commit{display:flex;align-items:center;gap:9px;font-size:11.5px;color:#c2cde0;line-height:1.3}
.pr-commit code{font-family:var(--mono);font-size:10.5px;color:var(--dim);flex:0 0 auto}
.pc-dot{width:8px;height:8px;border-radius:50%;border:2px solid var(--accent);flex:0 0 auto}
.pr-files{flex-wrap:wrap}
.pr-filelist{display:inline-flex;flex-wrap:wrap;gap:7px;margin-left:4px}
.pr-filelist code{font-family:var(--mono);font-size:10.5px;color:#c2cde0;background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:5px;padding:1px 7px}
.pr-review{display:inline-flex;align-items:center}
.pr-avs{display:inline-flex;margin-right:9px}
.pr-avs i{width:20px;height:20px;border-radius:50%;background:var(--panel);border:1.5px solid var(--bg);color:var(--dim);
  font-size:9px;font-weight:700;font-style:normal;display:inline-flex;align-items:center;justify-content:center;margin-left:-7px}
.pr-avs i:first-child{margin-left:0}

/* ============ TPRM · TWO-PART STORYBOARD (scenes.risk) ============ */
/* part captions above a 6-step rail */
.story-parts{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:12px}
.story-part{display:flex;align-items:center;justify-content:center;gap:8px;font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--dim);padding-bottom:9px;border-bottom:1px solid var(--line);text-align:center}
.story-part::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--accent);opacity:.75;flex:0 0 auto;box-sizing:border-box}
.story-part.p2::before{background:none;border:1.5px solid rgba(55,224,176,.55)}   /* 第二部分：空心环 */
.story-nav-6{grid-template-columns:repeat(6,1fr)}
.story-nav-6 .story-line{left:8.33%;right:8.33%;top:12px}
.story-nav-6 .ss-lab{font-size:10px;max-width:10ch}
.story-nav-6 .ss-dot{width:26px;height:26px;font-size:10.5px}
.story-nav-6 .story-step{gap:8px}

/* stage layouts */
.st0-risk{display:grid;grid-template-columns:1.15fr 1fr;gap:14px;align-items:start}
.st2-risk,.st5-risk{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start}
.st2-risk .decision{grid-column:1 / -1}
.risk-low{color:var(--accent)}.risk-med{color:#ffc24d}.risk-high{color:#ff9a9a}

/* engagement card */
.eng-top{display:flex;align-items:flex-start;gap:12px;margin-bottom:13px}
.eng-name{font-size:16px;font-weight:700;color:var(--ink);line-height:1.2}
.eng-name small{display:block;font-size:11px;color:var(--dim);font-weight:400;margin-top:4px}
.eng-tier{margin-left:auto;font-size:10px;font-weight:700;letter-spacing:.05em;color:#ffc24d;
  background:rgba(255,180,60,.12);border:1px solid rgba(255,180,60,.32);border-radius:20px;padding:3px 10px;flex:0 0 auto}
.eng-facts{display:grid;grid-template-columns:1fr 1fr;gap:7px 16px;margin-bottom:13px}
.eng-facts>div{display:flex;justify-content:space-between;gap:8px;font-size:11.5px;
  border-bottom:1px solid rgba(255,255,255,.05);padding-bottom:6px}
.eng-facts .k{color:var(--dim)}
.eng-facts .v{color:#c2cde0}
.eng-sec{display:flex;gap:10px;align-items:flex-start;margin-top:10px}
.eng-sec .k2{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);min-width:88px;padding-top:3px;flex:0 0 auto}
.eng-sec .chips{display:flex;flex-wrap:wrap;gap:5px}
.eng-sec .chips i{font-style:normal;font-family:var(--mono);font-size:9.5px;color:#c2cde0;
  background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:5px;padding:2px 8px}

/* questionnaire rows (IRQ + DDQ) */
.qa-row{display:grid;grid-template-columns:1fr auto 72px 34px auto;align-items:center;gap:11px;padding:9px 8px;
  border-bottom:1px solid rgba(255,255,255,.05);font-size:12px;opacity:0;transform:translateY(6px);border-radius:6px}
.qa-row .q{color:#c2cde0}
.qa-row .a{font-size:9.5px;font-weight:700;padding:2px 8px;border-radius:5px;white-space:nowrap}
.qa-row .a.yes{color:var(--accent);background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.3)}
.qa-row .a.no{color:#ffc24d;background:rgba(255,180,60,.12);border:1px solid rgba(255,180,60,.3)}
.qa-row .cbar{height:6px;border-radius:4px;background:rgba(255,255,255,.08);overflow:hidden}
.qa-row .cbar i{display:block;height:100%;width:0;border-radius:4px;background:linear-gradient(90deg,var(--accent),var(--accent2))}
.qa-row.sc-on .cbar i{animation:scoreFill .8s var(--ease) both;animation-delay:.15s}
.qa-row .cpc{font-family:var(--mono);font-size:10px;color:var(--accent);text-align:right}
.qa-row .ref{font-family:var(--mono);font-size:9px;color:var(--dim);white-space:nowrap;text-align:right}
.qa-row.flag{background:rgba(255,180,60,.05)}
.qa-note{margin-top:12px;font-size:12px;color:var(--dim)}

/* screening summary */
.scr-row{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:9px 0;
  border-bottom:1px solid rgba(255,255,255,.05);font-size:12px;color:#c2cde0;opacity:0;transform:translateX(10px)}
.scr-row .tag{font-size:10px;padding:2px 9px;border-radius:20px;white-space:nowrap}
.scr-row .tag.ok{color:var(--accent);background:rgba(var(--ac,55,224,176),.1);border:1px solid rgba(var(--ac,55,224,176),.3)}
.scr-row .tag.md{color:#ffc24d;background:rgba(255,180,60,.1);border:1px solid rgba(255,180,60,.3)}
.scr-sum{margin-top:11px;font-size:12.5px;color:var(--dim);opacity:0}

/* risk decision card */
.decision,.decision.dpanel{border:0;border-left:2px solid var(--accent);border-radius:0;background:none;padding:4px 0 4px 16px;opacity:0;transform:translateY(8px)}
.dec-scores{display:flex;align-items:flex-end;gap:16px;margin-bottom:13px;flex-wrap:wrap}
.dec-scores .ds{display:flex;flex-direction:column;gap:4px}
.dec-scores .ds small{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.dec-scores .ds b{font-size:17px;line-height:1;color:var(--ink)}
.dec-scores .arrow{color:var(--accent);font-size:16px;padding-bottom:2px}
.dec-cta{display:flex;align-items:center;gap:10px;font-size:11.5px;color:#c2cde0;border-top:1px solid var(--line);padding-top:12px;line-height:1.4}
.ok-badge{font-size:11px;font-weight:700;color:#04130e;background:var(--accent);border-radius:6px;padding:3px 10px;white-space:nowrap;flex:0 0 auto}

/* AI adjudication pipeline */
.ai-stage{display:grid;grid-template-columns:26px 1fr auto auto;align-items:center;gap:13px;padding:12px 0;
  border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateY(8px)}
.ai-stage:last-child{border-bottom:none}
.ai-stage.dual{grid-template-columns:26px 1fr auto;align-items:start}
.ai-stage .ai-n{width:24px;height:24px;border-radius:50%;border:1.5px solid var(--line);display:flex;align-items:center;
  justify-content:center;font-family:var(--mono);font-size:11px;color:var(--dim);flex:0 0 auto}
.ai-stage.sc-on .ai-n{border-color:var(--accent);color:var(--accent)}
.ai-stage.dual .ai-n{margin-top:1px}
.ai-b b{display:block;font-size:12.5px;color:var(--ink);margin-bottom:3px}
.ai-b>span{font-size:11px;color:var(--dim);line-height:1.4}
.ai-conf{font-family:var(--mono);font-size:11px;color:var(--accent)}
.ai-st{font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding:3px 9px;border-radius:5px;white-space:nowrap}
.ai-st.pass{color:var(--accent);background:rgba(var(--ac,55,224,176),.12);border:1px solid rgba(var(--ac,55,224,176),.3)}
.ai-st.off{color:var(--dim);border:1px solid var(--line)}
.ai-st.esc{color:#ff9a9a;background:rgba(255,90,90,.12);border:1px solid rgba(255,90,90,.3)}
.ai-agents{margin-top:9px;display:flex;flex-direction:column;gap:7px;border-left:2px solid rgba(var(--ac,55,224,176),.3);padding-left:11px}
.ai-agents .agent{display:grid;grid-template-columns:64px 34px 1fr;align-items:center;gap:9px;font-size:11px}
.ai-agents .ag-name{font-family:var(--mono);color:var(--accent)}
.ai-agents .ag-conf{font-family:var(--mono);color:var(--dim)}
.ai-agents .ag-say{color:#c2cde0}
.ai-agents .consensus{font-size:10.5px;color:var(--accent);margin-top:3px;padding-top:7px;border-top:1px solid rgba(255,255,255,.06)}

/* triage / outcome extras */
.feed-note{margin-top:11px;font-size:11px;color:var(--dim);opacity:0;line-height:1.4}
.feed-chip.q{color:var(--dim);background:none;border:1px solid var(--line)}
.doss-foot{margin-top:12px;font-size:11px;color:#ffc24d;opacity:0}

/* ============ FHIR ENGINE · storyboard (scenes.medical) ============ */
.fx-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start}
/* extracted-property rows */
.fx-kv{display:grid;grid-template-columns:150px 1fr auto;gap:10px;align-items:center;padding:8px 4px;
  border-bottom:1px solid rgba(255,255,255,.05);font-size:11.5px;opacity:0;transform:translateY(6px)}
.fx-kv:last-of-type{border-bottom:none}
.fx-kv .k{font-family:var(--mono);font-size:10.5px;color:var(--accent);word-break:break-all}
.fx-kv .v{color:#c2cde0;line-height:1.45}
.fx-chip{font-family:var(--mono);font-size:9px;padding:2px 7px;border-radius:5px;white-space:nowrap}
.fx-chip.pend{color:#ffc24d;background:rgba(255,180,60,.08);border:1px solid rgba(255,180,60,.3)}
.fx-chip.ok{color:var(--accent);background:rgba(var(--ac,55,224,176),.08);border:1px solid rgba(var(--ac,55,224,176),.3)}
/* bundle resource tree */
.fx-res{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-size:11px;color:#c2cde0;
  padding:5px 2px;line-height:1.5;opacity:0;transform:translateX(8px)}
.fx-res .prof{font-size:8.5px;color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.3);border-radius:4px;padding:1px 6px;flex:0 0 auto}
/* validation log error line */
.term .tl.err,.term .tl.err .cmd{color:#ff9a9a}

/* ============ DECK & VIDEO STUDIO (scenes.generation) ============ */
/* --- mini-PPT slide previews (white slides, extracted brand #0052CC/#FFB81C) --- */
.gen-slide.rich{aspect-ratio:16/9;background:#f4f7fb;border-color:rgba(255,255,255,.28);
  padding:9px 13px;display:flex;flex-direction:column;justify-content:center;gap:5px;overflow:hidden}
.gen-slide.rich::before,.gen-slide.rich::after{content:none}
.gen-slide.rich .sl-no{position:absolute;right:6px;bottom:4px;font-family:var(--mono);font-size:7px;color:#9aa7b8}
.sl-kick{font-family:var(--mono);font-size:6.5px;letter-spacing:.14em;color:#0052CC}
.sl-title .sl-t{font-size:13px;font-weight:800;color:#1a1a1a;line-height:1.12;letter-spacing:-.01em;
  transition:color .5s var(--ease),font-size .5s var(--ease)}
.sl-title .sl-bar{width:24%;height:3px;border-radius:2px;background:#FFB81C}
.sl-title .sl-sub{font-size:6.5px;color:#5a6b80}
.gen-slide.sc-applied .sl-t{color:#0052CC;font-size:15px}   /* the NL edit lands on the deck */
.sl-h{font-size:8.5px;font-weight:800;color:#0052CC;line-height:1.2}
.sl-b{margin:2px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px}
.sl-b li{font-size:6.3px;color:#3a4656;line-height:1.35;display:flex;align-items:center;gap:4px}
.sl-b li::before{content:"";width:3.5px;height:3.5px;border-radius:1px;background:#FFB81C;flex:0 0 auto}
.sl-steps{display:flex;gap:2px;margin-top:3px;min-width:0}
.sl-steps i{font-style:normal;font-size:4.9px;font-weight:600;color:#fff;background:#0052CC;border-radius:3px;padding:2.5px 3px;white-space:nowrap;flex:0 1 auto;overflow:hidden;text-overflow:ellipsis}
.sl-steps i:nth-child(even){background:#3B76D9}
.gen-slide.rich .etag{left:auto;right:5px;top:4px;bottom:auto}
.sl-cap{font-family:var(--mono);font-size:5.4px;color:#9aa7b8;margin-top:2px}

/* ============ DEFINITION EXTRACTION (scenes.definitions) ============ */
/* lineage tree: indented rows with element-type chips */
.lin{display:flex;flex-direction:column;margin-top:4px}
.lin-row{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11px;color:#c2cde0;
  padding:5px 2px;padding-left:calc(var(--d,0)*20px);opacity:0;transform:translateX(8px)}
.lin-row .op{color:var(--dim);width:10px;text-align:center;flex:0 0 auto}
.tchip{font-family:var(--mono);font-size:7.5px;letter-spacing:.05em;padding:1.5px 6px;border-radius:4px;white-space:nowrap;flex:0 0 auto}
.t-metric{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.35);background:rgba(var(--ac,55,224,176),.08)}
.t-int{color:#7db4ff;border:1px solid rgba(125,180,255,.35);background:rgba(125,180,255,.08)}
.t-root{color:#ffc24d;border:1px solid rgba(255,180,60,.35);background:rgba(255,180,60,.08)}
.t-const{color:var(--dim);border:1px solid var(--line)}
/* conflict: competing definition versions */
.defv{border:1px solid var(--line);border-left-width:2px;border-radius:var(--r-well);padding:10px 12px;margin-bottom:9px;opacity:0;transform:translateY(8px)}
.defv.keep{border-left-color:var(--accent)}
.defv.alt{border-left-color:#ffc24d}
.defv .dv-h{display:flex;gap:10px;align-items:baseline;font-size:10px;color:var(--dim);margin-bottom:6px;flex-wrap:wrap}
.defv .dv-v{font-weight:700;font-size:11px}
.defv.keep .dv-v{color:var(--accent)}
.defv.alt .dv-v{color:#ffc24d}
.defv .dv-f{font-family:var(--mono);font-size:11.5px;color:#c2cde0;line-height:1.5}
.defv .dv-f b{color:#ffc24d;font-weight:700}
/* misc: db column names, high-priority queue tag */
.mono-db{font-family:var(--mono);font-weight:400;color:#ffc24d;font-size:10.5px}
.scr-row .tag.hi{color:#ff9a9a;background:rgba(255,90,90,.1);border:1px solid rgba(255,90,90,.3)}
/* 3D lineage explorer — force-graph look with a slow orbiting tilt */
.g3d-grid{grid-template-columns:1.25fr 1fr}
.g3d{width:100%;height:auto;display:block;overflow:visible;margin-top:2px;
  transform:perspective(700px) rotateX(7deg)}
.g3d.sc-on{animation:g3dOrbit 10s ease-in-out infinite}
@keyframes g3dOrbit{0%,100%{transform:perspective(700px) rotateX(7deg) rotateY(-6deg)}
  50%{transform:perspective(700px) rotateX(7deg) rotateY(6deg)}}
.g3e{stroke:rgba(125,180,255,.32);stroke-width:1.2;stroke-dasharray:1;stroke-dashoffset:1}
.g3d.sc-on .g3e{animation:kgDraw .8s var(--ease) forwards;animation-delay:var(--d,.2s)}
.g3n circle{stroke-width:1.6;transform:scale(0);transform-box:fill-box;transform-origin:center}
.g3d.sc-on .g3n circle{animation:kgPop .5s var(--ease) forwards;animation-delay:var(--d,0s)}
.g3n text{fill:#aab6c8;font-size:8px;text-anchor:middle;opacity:0}
.g3d.sc-on .g3n text{animation:kgFade .4s ease forwards;animation-delay:calc(var(--d,0s) + .35s)}
.g3n.nm circle{stroke:var(--accent);fill:rgba(var(--ac,55,224,176),.16)}
.g3n.ni circle{stroke:#7db4ff;fill:rgba(125,180,255,.12)}
.g3n.nr circle{stroke:#ffc24d;fill:rgba(255,180,60,.12)}
.g3n.nc circle{stroke:#9aa7b8;fill:rgba(154,167,184,.1)}
.g3d.sc-on .g3n.nm circle{animation:kgPop .55s var(--ease) forwards, kgPulse 2.6s ease-in-out 1.2s infinite}
/* selection ring: appears when the scene "clicks" the node */
.g3sel{stroke:var(--accent);fill:none;stroke-width:1.3;stroke-dasharray:2.2 1.6;opacity:0}
.g3d.sc-sel .g3sel{opacity:1;animation:g3selSpin 5s linear infinite}
@keyframes g3selSpin{to{stroke-dashoffset:-24}}
.g3d.sc-sel .g3n.nm circle{filter:drop-shadow(0 0 9px rgba(var(--ac,55,224,176),.85))}
.g3d-legend{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px;justify-content:center}

/* --- video timeline: NLE-style clips (slide thumb + audio wave + label) --- */
.vtl{display:flex;gap:4px;height:66px;margin:4px 0 12px}
.vtl i{position:relative;flex:0 0 0%;border-radius:var(--r-well);overflow:hidden;opacity:0;padding:4px 5px;
  display:flex;flex-direction:column;background:rgba(var(--ac,55,224,176),.07);border:1px solid rgba(var(--ac,55,224,176),.35)}
.vtl i.sc-on{animation:vtlGrow .6s var(--ease) both}
@keyframes vtlGrow{0%{opacity:0;flex-basis:0%}100%{opacity:1;flex-basis:var(--w,16%)}}
/* slide thumbnail strip (video track) */
.vc-thumb{position:relative;flex:1;border-radius:3px;background:#f4f7fb;overflow:hidden}
.vc-thumb::before{content:"";position:absolute;left:8%;top:15%;width:54%;height:15%;border-radius:1px;background:#0052CC}
.vc-thumb::after{content:"";position:absolute;left:8%;top:48%;width:76%;height:8%;border-radius:1px;
  background:rgba(26,26,26,.22);box-shadow:0 4px 0 rgba(26,26,26,.14)}
.vtl i:first-child .vc-thumb::before{width:72%;background:#FFB81C}
/* audio track */
.vc-wave{display:flex;align-items:center;gap:2px;height:9px;margin-top:4px}
.vc-wave s{flex:1;height:30%;border-radius:1px;background:rgba(var(--ac,55,224,176),.75);text-decoration:none}
.vc-wave s:nth-child(2n){height:85%}
.vc-wave s:nth-child(3n){height:55%}
.vc-wave s:nth-child(5n){height:100%}
.vtl i b{font-family:var(--mono);font-size:7.5px;font-weight:400;color:var(--accent);white-space:nowrap;margin-top:3px;line-height:1}
/* the S2 trim: clip shortens, label shows the new duration */
.vtl i.sc-trim{--w:14%;border-color:rgba(255,180,60,.55)}
.vtl i.sc-trim b{color:#ffc24d}
.vtl i.sc-trim b::after{content:" → 44s"}

/* ============ P&L ANALYSIS · mock demo widgets (scenes.pnl) ============ */
/* mini spreadsheet window */
.xls{position:relative;border:1px solid var(--line);border-radius:var(--r-well);overflow:hidden;background:rgba(0,0,0,.28);font-family:var(--mono)}
.xls-row{display:grid;grid-template-columns:26px 1.6fr 1fr 1fr .9fr;border-bottom:1px solid rgba(255,255,255,.05);opacity:0}
.xls-row:last-child{border-bottom:none}
.xls-row.xls-h{opacity:1;background:rgba(255,255,255,.04)}
.xls .xn{font-size:9px;color:var(--dim);display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.03)}
.xls .xc{padding:6.5px 9px;font-size:10.5px;color:#c2cde0;text-align:right;border-left:1px solid rgba(255,255,255,.05);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
.xls .xc.xl{text-align:left;color:#aab6c8}
.xls-h .xc{color:var(--dim);font-size:9px;text-align:center;padding:4px 9px}
.xls-beam{position:absolute;left:0;right:0;top:24px;height:26px;pointer-events:none;opacity:0;
  background:linear-gradient(90deg,transparent,rgba(var(--ac,55,224,176),.13),transparent)}
.xls.sc-scan .xls-beam{animation:xlsScan 2.6s var(--ease) forwards}
/* animate `top` (not a fixed translate) so the sweep always reaches the last row */
@keyframes xlsScan{0%{opacity:1;top:24px}88%{opacity:1}100%{opacity:0;top:calc(100% - 26px)}}
.xls-tabs{display:flex;gap:3px;margin-top:0;padding:0 6px}
.xt{font-family:var(--mono);font-size:9px;color:var(--dim);border:1px solid var(--line);border-top:none;
  border-radius:0 0 4px 4px;background:rgba(255,255,255,.02);padding:4px 9px;white-space:nowrap}
.xt.on{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.35);background:rgba(var(--ac,55,224,176),.06)}
.xt.sc-on{color:var(--accent);background:rgba(var(--ac,55,224,176),.07);animation:none}
/* scan stats */
.xstat{display:flex;align-items:baseline;gap:12px;padding:10px 2px;border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateY(6px)}
.xstat:last-of-type{border-bottom:none}
.xstat b{font-family:var(--mono);font-size:21px;color:var(--accent);min-width:64px;text-align:right;font-weight:400}
.xstat span{font-size:12px;color:#c2cde0;line-height:1.45}
/* P&L statement with sparklines */
.pl-row{display:grid;grid-template-columns:1.35fr 72px 1fr 1fr auto;gap:10px;align-items:center;padding:8px 6px;
  border-bottom:1px solid rgba(255,255,255,.05);border-left:2px solid transparent;opacity:0;transform:translateY(6px)}
.pl-row.pl-h{opacity:1;transform:none}
.pl-h span{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);text-align:right}
.pl-h span:first-child{text-align:left}
.pl-row .pi{font-size:12.5px;color:#c2cde0}
.pl-row .pa{font-family:var(--mono);font-size:11.5px;color:#c2cde0;text-align:right;font-variant-numeric:tabular-nums}
.pl-row .ps svg{width:64px;height:18px;display:block}
.pl-row .ps polyline{fill:none;stroke:rgba(var(--ac,55,224,176),.65);stroke-width:1.5;stroke-dasharray:130;stroke-dashoffset:130}
.pl-row.sc-on .ps polyline{animation:plSpark .9s .25s var(--ease) forwards}
@keyframes plSpark{to{stroke-dashoffset:0}}
.pl-row.plf .ps polyline{stroke:rgba(255,154,154,.8)}
.pl-row .pv{font-family:var(--mono);font-size:10px;padding:2px 8px;border-radius:20px;white-space:nowrap}
.pv.ok{color:var(--accent);background:rgba(var(--ac,55,224,176),.1);border:1px solid rgba(var(--ac,55,224,176),.3)}
.pv.bad{color:#ff9a9a;background:rgba(255,90,90,.1);border:1px solid rgba(255,90,90,.3)}
.pl-row.plf.sc-flag{border-left-color:#ff5a5a;background:rgba(255,90,90,.05)}
.pl-row.plf.sc-flag .pv.bad{animation:waitPulse 1.1s ease-in-out 2}
/* drill treemap */
.tm-crumb{display:flex;flex-wrap:wrap;gap:7px;font-family:var(--mono);font-size:10px;color:var(--dim);margin-bottom:10px}
.tm-crumb span{opacity:0}
.tm-crumb .c1{color:#c2cde0}
.tm-crumb .c4{color:#ffc24d}
.tmap.sc-on .tm-crumb .c1{animation:kgFade .4s ease forwards}
.tmap.sc-drill .tm-crumb .c2{animation:kgFade .4s ease forwards}
.tmap.sc-drill .tm-crumb .c3{animation:kgFade .4s ease .15s forwards}
.tmap.sc-leaf .tm-crumb .c4{animation:kgFade .4s ease forwards}
.tm-l1{display:flex;gap:5px;height:168px}
.tm-tile{position:relative;flex:var(--f,1);min-width:0;border:1px solid rgba(125,180,255,.3);background:rgba(125,180,255,.06);
  border-radius:var(--r-well);padding:9px 10px;overflow:hidden;opacity:0;transform:scale(.94)}
.tm-tile b{display:block;font-size:11px;font-weight:600;color:#c2cde0;margin-bottom:3px;transition:opacity .4s var(--ease);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tm-tile>span{display:block;font-family:var(--mono);font-size:10px;color:#7db4ff;transition:opacity .4s var(--ease);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tm-tile.hot{border-color:rgba(255,180,60,.45);background:rgba(255,180,60,.07)}
.tm-tile.hot>span{color:#ffc24d}
.tmap.sc-on .tm-l1>.tm-tile{animation:tmIn .55s var(--ease) forwards}
.tmap.sc-on .tm-l1>.tm-tile:nth-child(2){animation-delay:.15s}
.tmap.sc-on .tm-l1>.tm-tile:nth-child(3){animation-delay:.3s}
@keyframes tmIn{0%{opacity:0;transform:scale(.94)}100%{opacity:1;transform:scale(1)}}
.tm-sub{position:absolute;inset:5px;display:flex;gap:4px;opacity:0;pointer-events:none}
.tmap.sc-drill .tm-sub{opacity:1}
.tmap.sc-drill .tm-l1>.tm-tile.hot>b,.tmap.sc-drill .tm-l1>.tm-tile.hot>span{opacity:0}
.tm-sub .tm-tile{border-radius:var(--r-well);padding:7px 8px;min-width:58px;background:rgba(15,21,30,.92)}
.tm-sub .tm-tile.hot{background:rgba(38,30,15,.92)}
.tmap.sc-drill .tm-sub .tm-tile{animation:tmIn .5s var(--ease) forwards}
.tmap.sc-drill .tm-sub .tm-tile:nth-child(2){animation-delay:.14s}
.tmap.sc-drill .tm-sub .tm-tile:nth-child(3){animation-delay:.28s}
.tm-leaf{position:absolute;left:6px;right:6px;bottom:6px;font-family:var(--mono);font-size:9.5px;line-height:1.4;
  color:#ffc24d;background:rgba(31,26,14,.85);border:1px solid rgba(255,180,60,.55);border-radius:6px;padding:6px 8px;opacity:0;transform:scale(.55)}
.tmap.sc-leaf .tm-leaf{animation:capPop .45s var(--ease) forwards;box-shadow:0 0 16px rgba(255,180,60,.25)}
/* investigation strip */
/* ---- P&L S2 · 逐层下钻（迭代式，一层一问） ---- */
.drill{display:flex;flex-direction:column;gap:9px;padding:2px 0}
.dl-lv{display:flex;align-items:stretch;gap:11px;margin-left:calc(var(--i,0)*26px);position:relative;
  padding:9px 2px;border:0;border-bottom:1px solid rgba(242,239,233,.08);border-radius:0;background:none;
  opacity:0}
.dl-lv.sc-on{animation:feedIn .45s var(--ease) both}
/* 层级间的肘形连接线 */
.dl-lv:not(:first-child)::before{content:"";position:absolute;left:-15px;top:-10px;bottom:50%;width:14px;
  border-left:1.5px solid rgba(var(--ac,55,224,176),.35);border-bottom:1.5px solid rgba(var(--ac,55,224,176),.35);
  border-bottom-left-radius:8px}
.dl-depth{align-self:center;font-family:var(--mono);font-size:9.5px;font-weight:700;color:var(--dim);
  border:1px solid var(--line);border-radius:6px;padding:3px 6px;letter-spacing:.06em;flex:0 0 auto}
.dl-lv.hot .dl-depth{color:#ffc24d;border-color:rgba(255,180,60,.45)}
.dl-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.dl-top{display:flex;align-items:center;gap:9px;font-size:10px}
.dl-src{font-family:var(--mono);color:var(--accent);background:rgba(var(--ac,55,224,176),.07);
  border:1px solid rgba(var(--ac,55,224,176),.28);border-radius:5px;padding:1.5px 7px;letter-spacing:.02em}
.dl-q{color:var(--dim);font-style:italic}
.dl-find{display:flex;align-items:center;gap:10px;font-size:12.5px;color:#dde5f0}
.dl-nm{flex:0 0 auto;font-weight:600}
.dl-bar{flex:1;height:5px;border-radius:3px;background:rgba(255,255,255,.06);position:relative;overflow:hidden}
.dl-bar::after{content:"";position:absolute;inset:0;width:var(--w,50%);border-radius:3px;
  background:linear-gradient(90deg,rgba(var(--ac,55,224,176),.85),rgba(125,180,255,.75));transform:scaleX(0);transform-origin:left}
.dl-lv.sc-on .dl-bar::after{animation:dlFill .7s var(--ease) .15s forwards}
@keyframes dlFill{to{transform:scaleX(1)}}
.dl-lv.hot .dl-bar::after{background:linear-gradient(90deg,#ffc24d,#ff8a5c)}
.dl-val{font-family:var(--mono);font-size:12.5px;color:var(--accent);flex:0 0 auto}
.dl-lv.hot{border-bottom-color:rgba(255,180,60,.45)}
.dl-lv.hot .dl-val{color:#ffc24d}
.dl-stop{margin:4px 0 0 calc(3*26px + 15px);font-size:11px;color:var(--dim);font-style:italic;
  padding:7px 11px;border:1px dashed var(--line);border-radius:var(--r-well);opacity:0}
.dl-stop.sc-on{animation:feedIn .45s var(--ease) both}
/* ---- P&L S3 · 源系统溯源（MCP + API 调用轨迹） ---- */
.src-call{display:flex;align-items:center;gap:10px;padding:9px 2px;margin:0;font-size:12px;color:#c9d3e2;
  border:0;border-bottom:1px solid rgba(242,239,233,.08);border-radius:0;background:none;opacity:0}
.src-call.sc-on{animation:feedIn .45s var(--ease) both}
.sp-proto{font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.1em;
  border-radius:6px;padding:3px 7px;flex:0 0 auto}
.sp-proto.mcp{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.08)}
.sp-proto.api{color:#8db8ff;border:1px solid rgba(125,180,255,.4);background:rgba(125,180,255,.08)}
.sp-proto.doc{color:#ffc24d;border:1px solid rgba(255,180,60,.4);background:rgba(255,180,60,.08)}
.sp-ep{font-family:var(--mono);font-size:10.5px;color:#e6ecf5;flex:0 0 auto;letter-spacing:.01em}
.sp-txt{flex:1;min-width:0;line-height:1.5;font-size:11.5px;color:var(--dim)}
.sp-lat{font-family:var(--mono);font-size:9.5px;color:var(--dim);flex:0 0 auto}
.src-call.hit{box-shadow:inset 2px 0 0 #ffc24d;padding-left:12px}
.src-call.hit .sp-txt{color:#f0d9b0}
.src-verdict{display:flex;align-items:center;gap:11px;padding:6px 0 6px 14px;margin:12px 0 4px;
  border:0;border-left:2px solid var(--accent);border-radius:0;background:none;opacity:0}
.src-verdict.sc-on{animation:capPop .5s var(--ease) both}
.sv-tag{font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.12em;color:#04231b;
  background:var(--accent);border-radius:6px;padding:4px 8px;flex:0 0 auto}
.sv-txt{font-size:12px;line-height:1.55;color:#dff5ec}
/* 报告页的书写指示点（替代 ✎ emoji） */
.fp-dot{width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 9px var(--accent);
  flex:0 0 auto;animation:fpDot 1.1s ease-in-out infinite}
@keyframes fpDot{0%,100%{opacity:1}50%{opacity:.25}}

.inv-row{display:flex;align-items:center;gap:10px;padding:7px 4px;font-size:12px;color:#c2cde0;
  border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateX(8px)}
.inv-row .iv-ic{width:20px;height:20px;border-radius:6px;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--dim);flex:0 0 auto}
.inv-row .iv-t{flex:1;line-height:1.45}
.inv-row .iv-c{font-family:var(--mono);font-size:10px;color:var(--accent);white-space:nowrap}
.inv-row.hit .iv-ic{color:#ffc24d;border-color:rgba(255,180,60,.4);background:rgba(255,180,60,.1)}
.inv-row.hit .iv-t{color:#ffd8a8}
/* variance bridge */
.bridge{display:flex;gap:8px;height:150px;margin:20px 2px 28px;padding-top:12px}
.br-col{position:relative;flex:1;height:100%;opacity:0}
.br-bar{position:absolute;left:13%;right:13%;bottom:var(--b,0%);height:0;border-radius:3px}
.br-col.sc-on{animation:kgFade .3s ease forwards}
.br-col.sc-on .br-bar{animation:brGrow .7s var(--ease) forwards}
@keyframes brGrow{to{height:var(--h,10%)}}
.br-bar.base{background:rgba(125,180,255,.28);border:1px solid rgba(125,180,255,.5)}
.br-bar.up{background:rgba(255,180,60,.22);border:1px solid rgba(255,180,60,.45)}
.br-bar.hot{background:rgba(255,180,60,.4);border:1px solid #ffc24d}
.br-v{position:absolute;left:-6px;right:-6px;text-align:center;bottom:calc(var(--b,0%) + var(--h,0%) + 4px);
  font-family:var(--mono);font-size:9.5px;color:#c2cde0}
.br-l{position:absolute;left:-8px;right:-8px;top:calc(100% + 6px);text-align:center;font-size:9px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* dark finance deck */
.findeck{display:flex;gap:12px}
.fin-slide{position:relative;flex:1;aspect-ratio:16/9;border-radius:8px;overflow:hidden;padding:9px 13px;
  display:flex;flex-direction:column;justify-content:center;gap:4px;
  background:linear-gradient(135deg,#16243D,#0F1A2E);border:1px solid rgba(125,180,255,.25);opacity:0;transform:translateY(10px)}
.fin-slide .fk{font-family:var(--mono);font-size:6.5px;letter-spacing:.18em;color:#C9A227}
.fin-slide .ft{font-size:14px;color:#F4F6FA;font-weight:800}
.fin-slide .fbar{width:26%;height:2.5px;background:#C9A227;border-radius:2px}
.fin-slide .fsub{font-size:6.5px;color:#8FA3C4}
.fin-slide .fno{position:absolute;right:6px;bottom:4px;font-family:var(--mono);font-size:6.5px;color:#5A6E92}
.fin-slide .fh{font-size:9px;color:#F4F6FA;font-weight:700}
.fs-line{display:flex;justify-content:space-between;font-size:7px;color:#B9C6DD;border-bottom:1px solid rgba(255,255,255,.08);padding:2.5px 0}
.fs-line .fok{color:#7fe0bd}
.fs-line .fhot{color:#C9A227}
.fs-bars{display:flex;gap:4px;align-items:flex-end;height:52%}
.fs-bars i{flex:1;background:rgba(125,180,255,.4);border-radius:2px 2px 0 0}
.fs-bars i.g{background:rgba(201,162,39,.55)}
.fin-prog{display:flex;gap:9px;align-items:flex-start;margin-top:13px;font-size:11.5px;line-height:1.5;color:var(--dim);opacity:0}
.fin-prog .fp-pen{color:#C9A227;animation:waitPulse 1.2s ease-in-out infinite}
.fin-out{display:flex;align-items:center;gap:12px;border:1px solid var(--line);background:none;
  border-radius:var(--r-well);padding:11px 14px;margin-top:12px;opacity:0;transform:translateY(8px)}
.fin-out .fo-ic{font-family:var(--mono);font-size:9px;font-weight:700;color:#0F1A2E;background:#C9A227;border-radius:6px;padding:7px 8px;flex:0 0 auto}
.fin-out .fo-nm{font-size:12.5px;color:var(--ink)}
.fin-out .fo-nm small{display:block;color:var(--dim);font-size:11px;margin-top:2px}
.fin-out .fo-chip{margin-left:auto;font-family:var(--mono);font-size:10px;color:#e8ce7a;border:1px solid rgba(201,162,39,.45);border-radius:5px;padding:2px 8px}
/* monthly cadence + distribution */
.mcal{display:flex;gap:0;flex-wrap:wrap;padding:1px 0 0 1px}
.mc{position:relative;flex:1;min-width:52px;text-align:center;font-family:var(--mono);font-size:9.5px;color:var(--dim);
  border:1px solid var(--line);border-radius:0;margin:-1px 0 0 -1px;padding:9px 2px 8px;opacity:0;transform:translateY(6px)}
.mc small{display:block;font-size:7.5px;margin-top:3px;color:var(--dim);letter-spacing:.02em}
.mc.done{color:#8fa3b8}
.mc.done::after{content:" ✓";color:rgba(var(--ac,55,224,176),.55)}
.mc.now{color:#04130e;background:var(--accent);border-color:var(--accent);font-weight:700;z-index:1}
.mc.now small{color:#04130e}
.mc.next{color:var(--accent);border-color:rgba(55,224,176,.5);z-index:1}
.mc.next small{color:var(--accent)}
.mc.next::before{content:"";position:absolute;inset:-1px;border-radius:0;border:1px solid rgba(var(--ac,55,224,176),.6);opacity:0;animation:mcPulse 2.2s ease-in-out infinite}
@keyframes mcPulse{0%{opacity:.7;transform:scale(1)}70%,100%{opacity:0;transform:scale(1.14)}}
.dist{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:14px}
.dist-lbl{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}
.dv{display:inline-flex;align-items:center;gap:6px;font-size:10.5px;color:#c2cde0;border:1px solid var(--line);border-radius:20px;padding:3px 9px 3px 4px;opacity:0;transform:translateY(5px)}
.dv i{width:18px;height:18px;border-radius:50%;background:var(--bg2);border:1px solid var(--line);color:var(--dim);font-style:normal;font-size:8px;font-weight:700;display:flex;align-items:center;justify-content:center}
.dv b{color:var(--accent);font-size:9px;opacity:0;transition:opacity .3s}
.dv.sc-done b{opacity:1}
.act-chip{display:flex;gap:9px;align-items:flex-start;margin-top:13px;font-size:11.5px;line-height:1.5;color:#ffd8a8;
  background:none;border:0;border-left:2px solid #ffc24d;border-radius:0;padding:3px 0 3px 12px;opacity:0;transform:translateY(6px)}
.act-chip span:first-child{color:#ffc24d;flex:0 0 auto}

/* ============ SOURCING AGENT · mock demo widgets (scenes.procurement) ============ */
/* email client */
.eml{border:1px solid var(--line);border-radius:var(--r-well);overflow:hidden;background:rgba(0,0,0,.28)}
.eml-bar{display:flex;align-items:center;gap:5px;padding:8px 11px;background:rgba(255,255,255,.04);border-bottom:1px solid var(--line);
  font-family:var(--mono);font-size:10px;color:var(--dim)}
.eml-bar i{display:none}  /* 曾是第二组 macOS 窗控点 */
.eml-bar>span{margin-left:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.eml-row{display:flex;gap:10px;align-items:baseline;padding:9px 12px;border-bottom:1px solid rgba(255,255,255,.06);
  background:rgba(var(--ac,55,224,176),.04);opacity:0}
.eml-row.sc-on{animation:emlIn .5s var(--ease) both}
@keyframes emlIn{0%{opacity:0;transform:translateX(-12px)}100%{opacity:1;transform:none}}
.eml-row b{font-size:12px;color:var(--ink);white-space:nowrap}
.eml-row b::before{content:"●";color:var(--accent);font-size:8px;margin-right:6px;vertical-align:1px}
.er-sub{font-size:11.5px;color:#c2cde0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.er-t{font-family:var(--mono);font-size:10px;color:var(--dim)}
.eml-open{padding:10px 12px;opacity:0}
.eh{display:flex;gap:10px;font-size:10.5px;color:#c2cde0;padding:2.5px 0}
.eh .ek{width:56px;color:var(--dim);font-family:var(--sans);font-weight:600;font-size:9px;text-transform:uppercase;letter-spacing:.06em;flex:0 0 auto}
.eml-body{margin:9px 0 2px;font-size:12px;line-height:1.6;color:#dde5f0;border-top:1px solid rgba(255,255,255,.06);padding-top:9px;min-height:58px}
/* parsed requirement pills */
.parse{display:flex;flex-wrap:wrap;gap:7px}
.pp{display:inline-flex;flex-direction:column;gap:1px;border:1px solid var(--line);background:none;
  border-radius:var(--r-mark);padding:5px 9px;opacity:0;transform:scale(.7)}
.pp.sc-on{animation:capPop .4s var(--ease) both}
.pp small{font-family:var(--sans);font-weight:600;font-size:8px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.pp b{font-size:11.5px;color:var(--accent);font-weight:600}
.eml-reply{display:flex;gap:9px;margin-top:13px;font-size:11.5px;line-height:1.5;color:#c2cde0;
  border:1px dashed rgba(55,224,176,.35);border-radius:var(--r-well);padding:9px 11px;opacity:0;transform:translateY(6px)}
.eml-reply span:first-child{color:var(--accent);flex:0 0 auto}
/* supplier discovery cards */
.sup{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.sup-card{display:flex;align-items:center;gap:10px;border:0;border-left:2px solid var(--line);border-radius:0;padding:6px 0 6px 12px;opacity:0;transform:translateY(8px)}
.sup-card.int{border-left-color:var(--accent)}
.sup-card.ext{border-left-color:#ffc24d}
.sup .sa{width:28px;height:28px;border-radius:var(--r-mark);border:1px solid var(--line);background:var(--bg2);display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:800;flex:0 0 auto}
.sup-card.int .sa{color:var(--accent)}
.sup-card.ext .sa{color:#ffc24d}
.sup .sb{min-width:0;flex:1}
.sup .sb b{display:block;font-size:12px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sup .sb span{display:block;font-size:10px;color:var(--dim);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sup .sr{font-family:var(--mono);font-size:8px;padding:2px 7px;border-radius:4px;white-space:nowrap;flex:0 0 auto}
.sup .sr.int{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.35)}
.sup .sr.ext{color:#ffc24d;border:1px solid rgba(255,180,60,.35)}
.sup-search{grid-column:1 / -1;display:flex;align-items:center;gap:10px;font-size:11px;color:var(--dim);
  padding:8px 11px;border:1px dashed var(--line);border-radius:var(--r-well);opacity:0}
.ss-spin{width:12px;height:12px;border-radius:50%;border:2px solid rgba(255,180,60,.5);border-top-color:transparent;animation:spin .8s linear infinite;flex:0 0 auto}
/* RFQ fan-out —— 光纤扇出（渐变曲线 + 脉冲中枢 + 玻璃徽章 + 流光） */
.rfq{width:100%;height:auto;display:block;overflow:visible;margin-top:2px}
.rq-line{fill:none;stroke:url(#rqWire);stroke-width:1.5;stroke-linecap:round;
  stroke-dasharray:1;stroke-dashoffset:1;opacity:.75}
.rfq.sc-on .rq-line{animation:kgDraw .7s var(--ease) forwards}
.rfq.sc-on .rq-line:nth-of-type(2){animation-delay:.12s}
.rfq.sc-on .rq-line:nth-of-type(3){animation-delay:.24s}
.rfq.sc-on .rq-line:nth-of-type(4){animation-delay:.36s}
.rfq.sc-on .rq-line:nth-of-type(5){animation-delay:.48s}
.rq-line.dead{stroke:rgba(255,255,255,.14);stroke-width:1.2}
/* 最低价链路：加粗提亮 */
.rq-line.best{stroke-width:2.3;opacity:1}
.rq-flow.best{stroke-width:2;stroke:rgba(var(--ac,55,224,176),.9)}
.rfq.sc-quote .rq-flow.best{opacity:.85}
/* 报价落地后：活跃光纤上持续流动的光点 */
.rq-flow{fill:none;stroke:rgba(var(--ac,55,224,176),.65);stroke-width:1.6;stroke-linecap:round;
  stroke-dasharray:1.5 14;opacity:0;transition:opacity .6s ease}
.rfq.sc-quote .rq-flow{opacity:.55;animation:rqFlowMove 1.3s linear infinite}
@keyframes rqFlowMove{to{stroke-dashoffset:-15.5}}
/* RFQ 光包：沿贝塞尔曲线飞行 */
.rq-pkt{fill:#cffff0;opacity:0;offset-rotate:0deg;offset-distance:0%}
.rq-pkt,.rq-core{filter:none}  /* 覆盖 HTML 里的 filter="url(#rqGlow)" 表现属性 */
.rfq.sc-fly .rq-pkt{animation:rqFly 1.15s var(--ease) forwards;animation-delay:var(--d,0s)}
@keyframes rqFly{0%{opacity:0;offset-distance:0%}12%{opacity:1}86%{opacity:1}100%{opacity:0;offset-distance:100%}}
/* 中枢节点：光晕 + 脉冲环 + 实心核 */
.rq-agent{opacity:0}
.rfq.sc-on .rq-agent{animation:kgFade .4s ease forwards}
.rq-agent .rq-ring{fill:none;stroke:var(--accent);stroke-width:1.3;opacity:0;
  transform-box:fill-box;transform-origin:center}
.rfq.sc-on .rq-agent .rq-ring{animation:rqPulse 2.2s ease-out .4s infinite}
@keyframes rqPulse{0%{transform:scale(.55);opacity:.9}70%{opacity:.15}100%{transform:scale(1.55);opacity:0}}
.rq-agent .rq-core{fill:var(--accent)}
.rq-agent .rq-bolt{fill:var(--accent)}
.rq-agent text{fill:#c6d2e2;font-size:8.5px;text-anchor:middle;letter-spacing:.04em}
/* 供应商徽章：玻璃芯片 + 蓝环头像 */
.rq-end{opacity:0}
.rfq.sc-on .rq-end{animation:rqEndIn .5s var(--ease) forwards;animation-delay:var(--ed,.55s)}
@keyframes rqEndIn{0%{opacity:0;transform:translateX(8px)}100%{opacity:1;transform:none}}
.rq-end rect{fill:rgba(14,20,29,.88);stroke:rgba(125,180,255,.28);stroke-width:1}
.rq-end circle{fill:rgba(125,180,255,.12);stroke:#7db4ff;stroke-width:1.3}
.rq-in{fill:#a8c8f5;font-size:6.3px;font-weight:700;text-anchor:middle;letter-spacing:.03em}
.rq-nm{fill:#d5ddea;font-size:8px;letter-spacing:.02em}
.rq-end.dead rect{stroke:rgba(255,255,255,.14)}
.rq-end.dead circle{fill:rgba(255,255,255,.05);stroke:rgba(255,255,255,.28)}
.rq-end.dead .rq-in{fill:rgba(255,255,255,.4)}
.rq-end.dead .rq-nm{fill:var(--dim)}
/* 回价胶囊：玻璃 + 辉光 */
.rq-tag{opacity:0;transform-box:fill-box;transform-origin:center;transform:scale(.6)}
.rfq.sc-quote .rq-tag{animation:rqTag .45s var(--ease) forwards;animation-delay:var(--d,0s)}
@keyframes rqTag{0%{opacity:0;transform:scale(.6)}70%{opacity:1;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}
.rq-tag rect{fill:rgba(8,19,15,.94);stroke:rgba(var(--ac,55,224,176),.75);stroke-width:1.1}
.rq-tag text{fill:#7dffd8;font-size:9.5px;font-weight:700;letter-spacing:.05em;text-anchor:middle;font-family:var(--mono)}
.rq-tag.dead{filter:none}
.rq-tag.dead rect{fill:rgba(15,20,28,.92);stroke:rgba(255,255,255,.2)}
.rq-tag.dead text{fill:var(--dim);font-size:8px;font-weight:400}
/* 最低价胶囊：实心玉绿反白 + 角标 */
.rq-tag.best{filter:none}
.rq-tag.best rect{fill:var(--accent);stroke:#c8ffe9;stroke-width:1.2}
.rq-tag.best text{fill:#04231b}
.rq-tag.best .rq-bl{fill:var(--accent);font-size:6.5px;font-weight:700;letter-spacing:.12em;text-anchor:start}
/* 行内闪电图标（替代 emoji） */
.bolt-ic{width:8px;height:11px;fill:var(--accent);vertical-align:-1px;margin-right:2px}
/* negotiation thread + live price */
.nego{display:grid;grid-template-columns:1.45fr 1fr;gap:14px;align-items:start}
.ng-msg{display:flex;flex-direction:column;gap:4px;margin:8px 0;padding:9px 12px;border-radius:var(--r-well);max-width:94%;
  font-size:12px;line-height:1.55;opacity:0;transform:translateY(8px)}
.ng-msg.out{background:rgba(55,224,176,.05);border:0;border-left:2px solid var(--accent);border-radius:0 var(--r-well) var(--r-well) 0}
.ng-msg.in{background:none;border:1px solid var(--line);margin-left:auto}
.ng-who{font-family:var(--sans);font-weight:600;font-size:9px;color:var(--dim);letter-spacing:.08em;text-transform:uppercase}
.ng-msg.out .ng-who{color:var(--accent)}
.ng-txt{color:#dde5f0;min-height:15px}
.ng-att{font-family:var(--mono);font-size:9.5px;color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.3);border-radius:5px;padding:2px 7px;align-self:flex-start;margin-top:2px}
.np-val{font-size:42px;font-weight:800;color:var(--ink);letter-spacing:-.02em;line-height:1;margin:6px 0 4px;
  font-variant-numeric:tabular-nums;transition:color .4s var(--ease)}
.np-val.sc-drop{color:var(--accent)}
.np-delta{font-family:var(--mono);font-size:10.5px;color:var(--dim);margin-bottom:16px;transition:color .4s}
.np-delta.sc-good{color:var(--accent)}
.np-steps{display:flex;gap:8px;align-items:flex-end;height:84px}
.np-steps i{position:relative;flex:1;height:0;background:rgba(125,180,255,.16);border:1px solid rgba(125,180,255,.4);border-radius:5px 5px 0 0;opacity:0}
.np-steps i:last-child{background:rgba(var(--ac,55,224,176),.15);border-color:rgba(var(--ac,55,224,176),.5)}
.np-steps i.sc-on{animation:npGrow .6s var(--ease) forwards}
@keyframes npGrow{0%{opacity:0;height:0}100%{opacity:1;height:var(--h,50%)}}
.np-steps i b{position:absolute;top:-16px;left:0;right:0;text-align:center;font-family:var(--mono);font-size:9px;color:#c2cde0;font-weight:400}
.np-rounds{display:flex;gap:8px;margin-top:8px}
.np-rounds span{flex:1;text-align:center;font-family:var(--mono);font-size:8.5px;color:var(--dim)}
.nego-note{margin-top:12px}
/* comms swimlanes */
.lane-axis{display:flex;justify-content:space-between;font-family:var(--sans);font-size:8.5px;color:var(--dim);margin:0 116px 7px 98px}
.lane{display:grid;grid-template-columns:88px 1fr 106px;gap:10px;align-items:center;padding:8px 0;
  border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateX(8px)}
.lane:last-child{border-bottom:none}
.ln-nm{font-size:11px;color:#c2cde0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ln-track{position:relative;height:14px;border-radius:7px;background:linear-gradient(90deg,rgba(255,255,255,.045),rgba(255,255,255,.015))}
.ln-track i{position:absolute;top:50%;left:var(--x,0%);width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;background:var(--accent);opacity:0;transform:scale(.4)}
.lane.sc-on .ln-track i{animation:lnDot .4s var(--ease) forwards}
.lane.sc-on .ln-track i:nth-child(2){animation-delay:.14s}
.lane.sc-on .ln-track i:nth-child(3){animation-delay:.28s}
.lane.sc-on .ln-track i:nth-child(4){animation-delay:.42s}
.lane.sc-on .ln-track i:nth-child(5){animation-delay:.56s}
.lane.sc-on .ln-track i:nth-child(6){animation-delay:.7s}
@keyframes lnDot{0%{opacity:0;transform:scale(.4)}70%{opacity:1;transform:scale(1.25)}100%{opacity:1;transform:scale(1)}}
.ln-seal{font-family:var(--mono);font-size:8.5px;text-align:center;padding:3px 6px;border-radius:5px;white-space:nowrap;opacity:0;transform:scale(.7)}
.ln-seal.sc-on{animation:capPop .4s var(--ease) both}
.ln-seal.win{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.1)}
.ln-seal.run{color:#7db4ff;border:1px solid rgba(125,180,255,.4);background:rgba(125,180,255,.07)}
.ln-seal.out{color:var(--dim);border:1px solid var(--line)}
.ln-seal.dead{color:#ff9a9a;border:1px solid rgba(255,90,90,.3);background:rgba(255,90,90,.06)}
/* deal sheet + PO stamp */
.dl-win{display:flex;align-items:center;gap:11px;padding:6px 0 6px 14px;border:0;border-left:2px solid var(--accent);
  background:none;border-radius:0;opacity:0;transform:translateY(8px)}
.dl-av{width:34px;height:34px;border-radius:var(--r-mark);background:var(--bg2);border:1px solid var(--line);color:var(--accent);font-weight:800;font-size:12px;display:flex;align-items:center;justify-content:center;flex:0 0 auto}
.dl-name{font-size:13.5px;font-weight:700;color:var(--ink);line-height:1.25;min-width:0}
.dl-name small{display:block;font-weight:400;font-size:10.5px;color:var(--dim);margin-top:2px}
.dl-badge{margin-left:auto;font-family:var(--mono);font-size:9px;letter-spacing:.08em;color:#04130e;background:var(--accent);border-radius:5px;padding:3px 9px;flex:0 0 auto}
.dl-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:0;margin-top:10px;padding:1px 0 0 1px}
.dl-grid>div{border:1px solid var(--line);border-radius:0;margin:-1px 0 0 -1px;padding:8px 5px;text-align:center;opacity:0;transform:translateY(6px)}
.dl-grid small{display:block;font-size:8px;letter-spacing:.05em;text-transform:uppercase;color:var(--dim);margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dl-grid b{font-size:12.5px;color:var(--ink);white-space:nowrap}
.dl-grid b.good{color:var(--accent)}
.dl-save{display:flex;align-items:center;gap:10px;margin-top:11px;font-family:var(--mono);font-size:9.5px;color:var(--dim);opacity:0}
.ds-track{flex:1;height:7px;border-radius:4px;background:rgba(255,255,255,.07);overflow:hidden}
.ds-track i{display:block;height:100%;width:0;border-radius:4px;background:linear-gradient(90deg,rgba(var(--ac,55,224,176),.45),var(--accent))}
.dl-save.sc-on .ds-track i{animation:scoreFill .9s var(--ease) both}
.ds-final{color:var(--accent)}
.dl-runner{margin-top:10px;font-size:11px;line-height:1.5;color:var(--dim);border:1px dashed var(--line);border-radius:var(--r-well);padding:8px 11px;opacity:0}
.dl-approve{display:flex;align-items:center;gap:10px;margin-top:13px;padding-top:12px;border-top:1px solid var(--line);opacity:0}
.da-who{font-size:11px;font-weight:700;color:var(--ink);flex:0 0 auto}
.da-msg{font-size:12.5px;color:#dde5f0;font-style:italic;min-width:64px}
.po-stamp{margin-left:auto;font-family:var(--mono);font-size:11px;font-weight:700;letter-spacing:.08em;color:var(--accent);
  border:2px solid rgba(var(--ac,55,224,176),.75);border-radius:var(--r-mark);padding:5px 12px;opacity:0;transform:rotate(-7deg) scale(1.7);white-space:nowrap}
.po-stamp.sc-on{animation:stampIn .45s cubic-bezier(.2,1.4,.4,1) forwards}
@keyframes stampIn{0%{opacity:0;transform:rotate(-7deg) scale(1.7)}100%{opacity:1;transform:rotate(-7deg) scale(1)}}

@media(max-width:720px){
  .st0{grid-template-columns:1fr}
  .demo-stage.story{padding:18px}
  .story-line{left:12.5%;right:12.5%;top:11px}
  .ss-lab{font-size:10px;max-width:9ch}
  .ss-dot{width:24px;height:24px;font-size:10px}
  /* TPRM/FHIR stages stack; 6-step rail drops labels to stay legible.
     minmax(0,1fr) (not 1fr): nowrap content min-content would blow a 1fr
     track past the viewport (413px eml panel on a 375px phone) */
  .st0-risk,.st2-risk,.st5-risk,.fx-grid{grid-template-columns:minmax(0,1fr)}
  .fx-grid>.dpanel{min-width:0}
  /* mini-PPT previews: 3-up flex row leaves 74px slides whose fixed-px
     type overflows the canvas — stack them full-width instead */
  .gen-slides{flex-direction:column;align-items:center}
  .gen-slides .gen-slide{width:100%;max-width:280px;flex:0 0 auto}
  /* long warehouse column paths must be able to break */
  .mono-db{word-break:break-all}
  .fx-kv{grid-template-columns:104px 1fr auto;gap:8px}
  /* P&L + sourcing mock demos */
  .nego{grid-template-columns:1fr}
  .sup{grid-template-columns:1fr}
  .dl-grid{grid-template-columns:repeat(3,1fr)}
  .np-val{font-size:34px}
  .pl-row{grid-template-columns:1.2fr 1fr 1fr auto;gap:8px}
  .pl-row .ps{display:none}
  .bridge{height:122px}
  .br-l{font-size:8px}
  .xls .xc{font-size:9.5px;padding:6px 6px}
  .mc{min-width:44px}
  .lane{grid-template-columns:72px 1fr 92px;gap:7px}
  .lane-axis{margin:0 100px 6px 82px}
  .ln-seal{font-size:7.5px}
  .pr-checks{grid-template-columns:1fr}
  .story-nav-6 .ss-lab{font-size:9px;max-width:7ch}
  .story-nav-6 .ss-dot{width:22px;height:22px;font-size:9.5px}
  .story-nav-6 .story-line{left:8.33%;right:8.33%;top:10px}
  .story-part{font-size:9px;letter-spacing:.06em}
  .qa-row{grid-template-columns:1fr auto 50px auto;gap:8px}
  .qa-row .cbar{display:none}
  .ai-agents .agent{grid-template-columns:58px 30px 1fr;gap:7px}
}

/* ===== TPRM · due-diligence email chase ===== */
.mail{border:0;border-top:1px solid rgba(242,239,233,.08);border-radius:0;padding:10px 2px;margin-bottom:4px;font-size:12px;opacity:0;transform:translateY(8px)}
.chase.go .mail{animation:feedIn .5s var(--ease) both;animation-delay:calc(var(--i)*.5s + .2s)}
.mail .from{display:flex;align-items:center;gap:8px;font-size:10px;color:var(--dim);margin-bottom:5px}
.mail .from .who{color:var(--ink);font-weight:600}
.mail.out .from .who{color:var(--accent)}
.mail .body{color:#c2cde0;line-height:1.5}
.mail .att{display:inline-flex;align-items:center;gap:5px;margin-top:7px;font-size:10px;color:var(--accent);
  font-family:var(--mono);border:1px solid rgba(var(--ac,55,224,176),.3);border-radius:5px;padding:3px 7px}

/* ===== MEDICAL · enhanced detail ===== */
.fhir-raw .note{margin-top:4px}
.note .nl{font-family:var(--mono);font-size:10px;line-height:1.9;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fhir .xlog{grid-column:1 / -1;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.xrow{display:flex;gap:6px;align-items:baseline;font-family:var(--mono);font-size:9.5px;color:var(--dim);padding:3px 0;opacity:0}
.fhir.go .xrow{animation:kgFade .4s ease forwards;animation-delay:calc(var(--i)*.2s + 1s)}
.xrow .fn{color:var(--accent)}
.proto .pstep{display:flex;align-items:center;gap:12px;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.05);opacity:0;transform:translateX(10px)}
.proto .pstep:last-child{border-bottom:none}
.proto.go .pstep{animation:feedIn .45s var(--ease) both;animation-delay:calc(var(--i)*.2s + .2s)}
.pstep .day{font-family:var(--mono);font-size:10px;color:var(--dim);min-width:46px;flex:0 0 auto}
.pstep .ch{font-size:11.5px;color:#c2cde0;flex:1}
.pstep .ps{font-size:9px;font-family:var(--mono);padding:2px 8px;border-radius:5px;white-space:nowrap;flex:0 0 auto}
.pstep .ps.done{color:var(--accent);background:rgba(var(--ac,55,224,176),.1);border:1px solid rgba(var(--ac,55,224,176),.28)}
.pstep .ps.now{color:#06231b;background:var(--accent);font-weight:700}
.pstep .ps.sched{color:var(--dim);border:1px solid var(--line)}

/* ============ EXPLORER · MOBILE RAIL (horizontal stepper) ============ */
@media(max-width:920px){
  .exp-grid{grid-template-columns:1fr;gap:24px}
  .exp-rail{position:static;flex-direction:row;gap:8px;height:auto;max-height:none;justify-content:flex-start;
    overflow-x:auto;padding:4px 2px 12px;scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .exp-rail::-webkit-scrollbar{display:none}
  .exp-track,.exp-fill,.exp-qi{display:none}
  .exp-node{flex:0 0 auto;grid-template-columns:auto auto;gap:8px;padding:9px 13px;
    border:1px solid var(--line);border-radius:30px;background:rgba(255,255,255,.02)}
  .exp-node-name{font-size:13px}
  .exp-node.on{border-color:var(--accent);background:rgba(var(--ac,55,224,176),.07)}
}

/* ============ WIDGET · THREE-WAY MATCH (finance) ============ */
.match{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;width:100%}
.match .mcol{border:1px solid var(--line);border-radius:8px;padding:10px;background:rgba(255,255,255,.02)}
.match .mcol h5{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);margin:0 0 8px;font-weight:600}
.match .mr{display:flex;justify-content:space-between;gap:8px;font-size:10.5px;color:#c2cde0;
  font-family:var(--mono);padding:4px 0;opacity:0;transform:translateY(6px)}
.match.go .mr{animation:feedIn .45s var(--ease) both;animation-delay:calc(var(--i)*.12s + .3s)}
.match .mr.ok{color:var(--accent)}
.match .mr.bad{color:#ff9a9a}
.match .mr.bad::after{content:"⚠";margin-left:4px}

/* ============ WIDGET · SCORE BARS (sales BANT / HR fit) ============ */
.score{display:flex;flex-direction:column;gap:10px;width:100%}
.score .sr{display:grid;grid-template-columns:84px 1fr auto;align-items:center;gap:10px;font-size:11px;color:var(--dim)}
.score .track{height:7px;border-radius:4px;background:rgba(255,255,255,.07);overflow:hidden}
.score .track i{display:block;height:100%;width:0;border-radius:4px;background:linear-gradient(90deg,var(--accent),var(--accent2))}
.score.go .track i{animation:scoreFill 1s var(--ease) both;animation-delay:calc(var(--i)*.16s + .3s)}
@keyframes scoreFill{to{width:var(--w,80%)}}
.score .pct{font-family:var(--mono);font-size:10px;color:var(--accent);min-width:24px;text-align:right}
.score .total{margin-top:6px;display:flex;align-items:center;gap:10px}
.score .total b{font-size:24px;color:var(--accent);font-weight:800;line-height:1}

/* ============ WIDGET · REDLINE DIFF (legal) ============ */
.redline{font-family:var(--mono);font-size:11px;line-height:1.6;display:flex;flex-direction:column;gap:3px}
.redline .dl{padding:5px 9px;border-radius:6px;opacity:0;transform:translateX(10px)}
.redline.go .dl{animation:feedIn .45s var(--ease) both;animation-delay:calc(var(--i)*.18s + .25s)}
.redline .del{color:#ff9a9a;background:rgba(255,90,90,.07);text-decoration:line-through}
.redline .ins{color:var(--accent);background:rgba(var(--ac,55,224,176),.07)}
.redline .warn{color:#ffc24d;background:rgba(255,180,60,.07);border:1px solid rgba(255,180,60,.24)}
.redline .warn::before{content:"⚠ "}

/* ============ WIDGET · SLA CLOCK (operations) ============ */
.sla .bar{position:relative;height:8px;border-radius:5px;background:rgba(255,255,255,.07);margin-top:2px}
.sla .bar i{display:block;height:100%;width:0;border-radius:5px;background:linear-gradient(90deg,var(--accent),var(--accent2))}
.sla.go .bar i{animation:genFill 2.2s var(--ease) forwards}
.sla .mark{position:absolute;top:-3px;width:2px;height:14px;background:var(--ink);opacity:.5;left:var(--target,75%)}
.sla .meta{display:flex;justify-content:space-between;gap:10px;margin-top:10px;font-size:10.5px;
  font-family:var(--mono);color:var(--dim);text-transform:none;letter-spacing:.02em}
.sla .meta .ok{color:var(--accent)}

/* narrow phones: stack the dense panels so nothing clips (placed last to win source order) */
@media(max-width:600px){
  .explorer{padding:94px 0 20px}
  .demo-stage{padding:18px}
  .dp-head{flex-wrap:wrap;gap:6px}
  .fhir{grid-template-columns:1fr;gap:6px}
  .fhir-arrow{transform:rotate(90deg);text-align:left;width:max-content;margin:2px 0 2px 2px}
  .fhir-field .k{min-width:74px}
  .demo-metrics{gap:14px 24px}
  .exp-bar{gap:9px}
  .exp-auto span:not(.exp-auto-ic){display:none}
  .exp-auto{padding:9px 12px}
  .match{grid-template-columns:1fr}
  .score .sr{grid-template-columns:64px 1fr auto}
}

@media(prefers-reduced-motion:reduce){
  .kg-edge{stroke-dashoffset:0}
  .kg-node{transform:none}
  .kg-label{opacity:1}
  .feed-row,.fhir-field,.fhir-badge,.gen-slide,.cb,.src,.ck-row,.appt,.file,.dchip,.ev,.outcard,.mt-line,.mt-pt,.mt-task,.mt-ping,.mt-pp,.mt-cap,.mail,.xrow,.pstep,.match .mr,.redline .dl{opacity:1;transform:none;animation:none!important}
  .typing::after{content:none}
  .badge .b-wait{animation:none}
  .ck-row small,.score .total,.dossier .drow,.sla .meta .ok{opacity:1}
  .feed-chip{animation:none!important}
  .ck-row .ck-box{animation:none!important}
  .cap-item,.jira-card,.jira-note,.term .tl,.diff .dfile,.diff .dline,.pr .pr-row{opacity:1;transform:none;animation:none!important}
  .eng,.qa-row,.scr-row,.scr-sum,.decision,.ai-stage,.doss-foot,.feed-note,.fx-kv,.fx-res{opacity:1;transform:none;animation:none!important}
  .fx-chip.pend,.feed-chip.wait::before,.fx-chip.pend::before{animation:none!important}
  .dl-lv,.dl-stop,.src-call,.src-verdict,.fhir-prev,.fj-line,.fj-tag,.his-banner,.his-th,.fdoc,.web-head,.wfind,.frm-sec,.frm-th,.fr-field i,.eml-subj,.ateam,.at-sub,.rpt,.rpt-dec{opacity:1;transform:none;animation:none!important}
  .vtl i{opacity:1;flex-basis:var(--w,16%);animation:none!important}
  .lin-row,.defv{opacity:1;transform:none;animation:none!important}
  .g3d,.g3sel{animation:none!important}
  .g3e{stroke-dashoffset:0;animation:none!important}
  .g3n circle{transform:scale(1);animation:none!important}
  .g3n text{opacity:1;animation:none!important}
  /* P&L + sourcing mock demos: jump to end state */
  .xls-row,.xstat,.pl-row,.tm-crumb span,.tm-tile,.tm-sub,.tm-leaf,.inv-row,.br-col,.fin-slide,.fin-prog,.fin-out,.mc,.dv,.act-chip,
  .eml-row,.eml-open,.pp,.eml-reply,.sup-card,.sup-search,.ng-msg,.lane,.ln-track i,.ln-seal,
  .dl-win,.dl-grid>div,.dl-save,.dl-runner,.dl-approve,.rq-agent,.rq-end,.rq-tag{opacity:1;transform:none;animation:none!important}
  .dv b{opacity:1}
  .pl-row .ps polyline{stroke-dashoffset:0;animation:none!important}
  .xls-beam,.rq-pkt{display:none}
  .rq-line{stroke-dashoffset:0;animation:none!important}
  .br-bar{height:var(--h,10%);animation:none!important}
  .np-steps i{opacity:1;height:var(--h,50%);animation:none!important}
  .ds-track i{width:var(--w,80%);animation:none!important}
  .po-stamp{opacity:1;transform:rotate(-7deg) scale(1);animation:none!important}
  .ss-spin,.fp-pen,.mc.next::before{animation:none!important}
  .mc.next::before{opacity:0}
  .qa-row .cbar i{width:var(--w,100%);animation:none!important}
  .story-line i{transition:none}
  .story-stage.on,.story-stage[data-fx].on{animation:none!important}
  .story-stage.leaving{display:none!important;animation:none!important}
  .pr-check::before{animation:none}
  .score .track i{width:var(--w,100%);animation:none!important}
  .sla .bar i{width:100%;animation:none!important}
  .qa-status,.fhir-trace,.brand-gene{opacity:1}
  .fhir-field .val{width:100%}
  .gen-prog i{width:100%}
  .gen-wave i{height:var(--h,50%)}
  .ck-box::after{opacity:1}
  .mt-rec i{animation:none}
  .kg.go .kg-node,.kg.go .kg-edge,.kg.go .kg-label{animation:none}
  .exp-demo.active{animation:none}
  .exp-fill{transition:none}
  .exp-qi{display:none}
  .exp-node-dot::after,.ss-dot::before{animation:none!important}
}

/* ============ PER-DEMO NAV HUES ============
   七色只做「你在哪」的路标：左侧导轨节点、demo kicker、stepper（读 --nav）。
   舞台内部一律 jade --accent + 语义色（琥珀 #ffc24d 警告 / 红 #ff9a9a 错误 / 蓝 #8db8ff 信息），
   不再按 demo 换色——避免 risk/definitions/pnl 主色与警告色撞色。 */
#meeting{--nav:#37e0b0}
#risk{--nav:#ffb35c}
#medical{--nav:#5cd6ff}
#generation{--nav:#b08cff}
#definitions{--nav:#ffd166}
#pnl{--nav:#ff7d9c}
#procurement{--nav:#7dffa7}
/* 左侧导航节点跟随各自 demo 的颜色 */
.exp-node[data-target="meeting"]{--accent:#37e0b0;--ac:55,224,176}
.exp-node[data-target="risk"]{--accent:#ffb35c;--ac:255,179,92}
.exp-node[data-target="medical"]{--accent:#5cd6ff;--ac:92,214,255}
.exp-node[data-target="generation"]{--accent:#b08cff;--ac:176,140,255}
.exp-node[data-target="definitions"]{--accent:#ffd166;--ac:255,209,102}
.exp-node[data-target="pnl"]{--accent:#ff7d9c;--ac:255,125,156}
.exp-node[data-target="procurement"]{--accent:#7dffa7;--ac:125,255,167}
/* ============ PAUSE BUTTON (speech build) ============ */
.exp-pause{margin-left:auto;display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:12px;
  letter-spacing:.04em;cursor:pointer;color:var(--dim);background:rgba(255,255,255,.03);
  border:1px solid var(--line);border-radius:30px;padding:8px 15px;
  transition:color .2s,border-color .2s,background .2s}
.exp-pause:hover{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.06)}
.exp-pause.paused{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.5);background:rgba(var(--ac,55,224,176),.1)}
.exp-pause .st-p,.exp-pause .st-r{display:inline-flex;align-items:center;gap:7px}
.exp-pause [hidden],.exp-pause .st-r[hidden]{display:none}
.exp-bar .exp-replay{margin-left:0}

/* ============ SKIP BUTTON (speech build) ============ */
.exp-skip{display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:12px;
  letter-spacing:.04em;cursor:pointer;color:var(--dim);background:rgba(255,255,255,.03);
  border:1px solid var(--line);border-radius:30px;padding:8px 15px;
  transition:color .2s,border-color .2s,background .2s}
.exp-skip:hover{color:var(--accent);border-color:rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.06)}
.exp-skip .ic{font-size:14px;line-height:1;display:inline-block}
.exp-skip.zip .ic{animation:skipZip .45s var(--ease)}
@keyframes skipZip{
  0%{transform:none;opacity:1}
  45%{transform:translateX(10px);opacity:0}
  55%{transform:translateX(-10px);opacity:0}
  100%{transform:none;opacity:1}}
/* fast-forward mode: while Skip compresses the rest of the timeline into ~.8s,
   every entrance plays at sprint speed instead of being frozen — the demo looks
   like it's racing ahead of you rather than teleporting */
.sc-fast *{transition-duration:.12s!important;transition-delay:0s!important;
  animation-duration:.18s!important;animation-delay:0s!important}
/* accent scanline sweeping the panel while it fast-forwards */
.exp-demo.sc-sweep{position:relative}
.exp-demo.sc-sweep::after{content:'';position:absolute;inset:0;pointer-events:none;z-index:6;
  border-radius:var(--r-card);
  background:linear-gradient(100deg,transparent 34%,rgba(var(--ac,55,224,176),.11) 47%,
    rgba(255,255,255,.07) 50%,rgba(var(--ac,55,224,176),.11) 53%,transparent 66%) no-repeat;
  background-size:260% 100%;
  animation:scSweep .85s cubic-bezier(.3,.1,.25,1) both}
@keyframes scSweep{from{background-position:135% 0}to{background-position:-135% 0}}

/* ============ MEDICAL · FHIR JSON PREVIEW (speech build) ============ */
.fhir-prev{opacity:0}
.fjson{font-family:var(--mono);font-size:10.5px;line-height:1.8;background:rgba(0,0,0,.28);
  border:1px solid var(--line);border-radius:var(--r-well);padding:10px 12px 10px 8px;counter-reset:fj;overflow:hidden}
.fj-line{opacity:0;white-space:nowrap;counter-increment:fj;position:relative;padding-left:26px}
.fj-line::before{content:counter(fj);position:absolute;left:0;width:16px;text-align:right;
  color:rgba(255,255,255,.18);font-size:9px}
.fj-line.ind1{padding-left:40px}
.fj-line.ind2{padding-left:54px}
.fk{color:var(--accent)}
.fs{color:#e8e2d4}
.fp{color:rgba(255,255,255,.42)}
.fc{color:rgba(255,255,255,.28);font-style:italic}
.fj-tag{opacity:0;margin-left:8px;font-size:8.5px;padding:1.5px 7px;border-radius:4px;
  color:#04231b;background:var(--accent);font-weight:700;letter-spacing:.05em;font-family:var(--sans)}
.fj-fix.sc-hl{background:rgba(var(--ac,55,224,176),.09);border-radius:4px}
.fj-fix.sc-hl .fj-tag{animation:capPop .45s var(--ease) both}
.fo-json{font-family:var(--mono);font-size:10px;letter-spacing:-1px}

/* ============ MEDICAL · HIS / ERP chrome (speech build) ============ */
.his-banner{display:flex;align-items:center;gap:13px;padding:9px 13px;margin-bottom:11px;opacity:0;
  border:1px solid var(--line);border-radius:var(--r-well);background:none}
.hb-av{width:31px;height:31px;border-radius:50%;background:rgba(var(--ac,55,224,176),.13);
  border:1px solid rgba(var(--ac,55,224,176),.42);color:var(--accent);display:flex;align-items:center;
  justify-content:center;font-size:10.5px;font-weight:700;flex:0 0 auto}
.hb-id{display:flex;flex-direction:column;gap:2px;min-width:0}
.hb-id b{font-size:12.5px;color:var(--ink);letter-spacing:.02em}
.hb-id span{font-family:var(--mono);font-size:9.5px;color:var(--dim)}
.hb-kv{display:flex;flex-direction:column;gap:2px;padding-left:13px;border-left:1px solid var(--line)}
.hb-kv small{font-size:8.5px;color:var(--dim);letter-spacing:.09em;text-transform:uppercase}
.hb-kv span{font-size:10.5px;color:#c9d3e2}
.hb-flag{margin-left:auto;font-family:var(--mono);font-size:8.5px;color:#ffc24d;
  border:1px solid rgba(255,180,60,.4);border-radius:5px;padding:2.5px 8px;flex:0 0 auto}
.his-callmeta{margin-left:auto;display:flex;align-items:center;gap:7px}
.cm-kv{font-family:var(--mono);font-size:9px;color:var(--dim);
  border:1px solid var(--line);border-radius:5px;padding:2.5px 8px}
.cm-kv.rec{color:#ff9d9d;border-color:rgba(255,120,120,.35)}
.his-th{display:flex;gap:12px;padding:3px 0 7px;font-size:8.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--dim);border-bottom:1px solid var(--line);opacity:0}
.his-th span:nth-child(1){min-width:46px}
.his-th span:nth-child(2){min-width:46px}
.his-th span:nth-child(3){flex:1}
.ch-chip{font-family:var(--mono);font-size:8.5px;font-weight:700;letter-spacing:.06em;
  border-radius:5px;padding:2.5px 7px;flex:0 0 auto;min-width:32px;text-align:center}
.ch-chip.sms{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.07)}
.ch-chip.call{color:#8db8ff;border:1px solid rgba(125,180,255,.4);background:rgba(125,180,255,.07)}
.his-audit{font-family:var(--mono);font-size:9.5px;letter-spacing:.02em}
.al-chip{font-family:var(--mono);font-size:8.5px;font-weight:700;letter-spacing:.1em;
  color:#2b1206;background:#ffb35c;border-radius:5px;padding:2.5px 8px;flex:0 0 auto}
.cb.sys.alert{display:flex;align-items:center;justify-content:center;gap:8px;text-align:left;
  border:0;border-left:2px solid #ff6a6a;border-radius:0 var(--r-well) var(--r-well) 0;background:rgba(255,90,90,.05)}
.stat-chip,.appt .ok.stat-chip{font-size:9px;font-weight:700;letter-spacing:.08em;color:#04231b;
  background:var(--accent);border-radius:5px;padding:3.5px 10px}

/* ============ RISK · uploads tray + web screening (speech build) ============ */
.ftray{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.fdoc{display:flex;align-items:center;gap:9px;padding:7px 2px;border:0;border-bottom:1px solid rgba(242,239,233,.08);border-radius:0;
  background:none;opacity:0;min-width:0}
.fdoc.sc-on{animation:fileDrop .5s var(--ease) both}
.fd-ic{font-family:var(--mono);font-size:8px;font-weight:700;letter-spacing:.04em;
  border-radius:5px;padding:5px 6px;flex:0 0 auto}
.fd-ic.pdf{color:#ff9d9d;border:1px solid rgba(255,120,120,.4);background:rgba(255,120,120,.08)}
.fd-ic.xls{color:#7fe6a8;border:1px solid rgba(90,220,150,.4);background:rgba(90,220,150,.08)}
.fd-nm{font-size:10px;color:#dde5f0;min-width:0;line-height:1.35;font-family:var(--mono);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fd-nm small{display:block;color:var(--dim);font-size:9px;font-family:var(--sans)}
.fd-st{margin-left:auto;width:14px;height:14px;border-radius:50%;border:1.5px solid var(--line);flex:0 0 auto;position:relative}
.fdoc.sc-done .fd-st{border-color:var(--accent);background:rgba(var(--ac,55,224,176),.15)}
.fdoc.sc-done .fd-st::after{content:"";position:absolute;left:4px;top:1.5px;width:3px;height:7px;
  border:solid var(--accent);border-width:0 1.5px 1.5px 0;transform:rotate(40deg)}
.fdoc.sc-done .fd-st.warn{border-color:#ffc24d;background:rgba(255,180,60,.12)}
.fdoc.sc-done .fd-st.warn::after{border-color:#ffc24d}
.web-head{margin:12px 0 5px;font-size:8.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);
  border-bottom:1px solid var(--line);padding-bottom:5px;opacity:0}
.wfind{display:flex;align-items:center;gap:9px;padding:6px 2px;font-size:10.5px;color:#c9d3e2;opacity:0}
.wf-src{font-family:var(--mono);font-size:8px;font-weight:700;letter-spacing:.08em;
  border-radius:5px;padding:2.5px 7px;flex:0 0 auto;min-width:44px;text-align:center}
.wf-src.reg{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.07)}
.wf-src.news{color:#ffc24d;border:1px solid rgba(255,180,60,.4);background:rgba(255,180,60,.07)}
.wf-src.web{color:#8db8ff;border:1px solid rgba(125,180,255,.4);background:rgba(125,180,255,.07)}
.wf-txt{min-width:0;line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* ============ RISK · DDQ form table (speech build) ============ */
.frm-sec{display:flex;justify-content:space-between;align-items:center;padding:5px 2px 7px;
  font-size:8.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);
  border-bottom:1px solid var(--line);opacity:0}
.frm-prog{font-family:var(--sans);font-weight:600;letter-spacing:.06em;color:var(--accent)}
.frm-th{display:grid;grid-template-columns:40px 1.3fr 118px 108px 40px;gap:10px;padding:6px 2px 5px;
  font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);opacity:0}
.qa-row.frm-row{display:grid;grid-template-columns:40px 1.3fr 118px 108px 40px;gap:10px;align-items:center;
  padding:7px 2px}
.fr-no{font-family:var(--mono);font-size:9px;color:var(--dim)}
.fr-q{font-size:11.5px;color:#c9d3e2;line-height:1.4}
.fr-field{height:26px;border:1px solid var(--line);border-radius:var(--r-well);background:rgba(0,0,0,.28);
  display:flex;align-items:center;padding:0 9px;font-size:10.5px;overflow:hidden;
  transition:border-color .35s ease,box-shadow .35s ease}
.fr-field i{font-style:normal;opacity:0;transform:translateY(5px)}
.qa-row.frm-row.sc-on .fr-field{border-color:rgba(var(--ac,55,224,176),.55);
  box-shadow:inset 0 0 0 1px rgba(var(--ac,55,224,176),.12)}
.qa-row.frm-row.sc-on .fr-field i{animation:frFill .4s var(--ease) .3s both}
@keyframes frFill{to{opacity:1;transform:none}}
.fr-field.yes i{color:var(--accent);font-weight:600}
.fr-field.warn i{color:#ffc24d;font-weight:600}
.qa-row.frm-row.sc-on .fr-field.warn{border-color:rgba(255,180,60,.55);
  box-shadow:inset 0 0 0 1px rgba(255,180,60,.12)}
.qa-row.frm-row .ref{font-family:var(--mono);font-size:9px;color:var(--dim);
  border:1px solid var(--line);border-radius:5px;padding:2.5px 6px;text-align:center;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qa-row.frm-row .cpc{font-family:var(--mono);font-size:9.5px;color:var(--accent);text-align:right}

/* ============ RISK · email chase thread (speech build) ============ */
.eml-subj{font-size:10.5px;color:var(--dim);padding:2px 2px 8px;border-bottom:1px solid var(--line);
  margin-bottom:9px;opacity:0}
.eml-subj b{color:#e6ecf5;font-weight:600}
.eml-meta{display:flex;align-items:center;gap:9px;margin-bottom:7px}
.eml-av{width:25px;height:25px;border-radius:50%;background:rgba(255,255,255,.07);border:1px solid var(--line);
  display:flex;align-items:center;justify-content:center;font-size:8.5px;font-weight:700;color:#c9d3e2;flex:0 0 auto}
.eml-av.agent{background:rgba(var(--ac,55,224,176),.12);border-color:rgba(var(--ac,55,224,176),.42)}
.eml-fromto{display:flex;flex-direction:column;gap:1px;min-width:0}
.eml-fromto b{font-size:10.5px;color:#e6ecf5}
.eml-fromto span{font-size:9px;color:var(--dim);font-family:var(--mono)}
.eml-time{margin-left:auto;font-family:var(--mono);font-size:9px;color:var(--dim)}
.att-ic{font-family:var(--mono);font-size:7.5px;font-weight:700;color:#ff9d9d;
  border:1px solid rgba(255,120,120,.4);background:rgba(255,120,120,.08);border-radius:4px;padding:2px 5px}
.att-ok{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.35);border-radius:4px;
  padding:1.5px 6px;font-size:8.5px;font-weight:700;letter-spacing:.05em}

/* ============ RISK · alert-console rows (speech build) ============ */
.feed-row.alert-row{grid-template-columns:auto 1fr auto auto;gap:11px;border-left:3px solid var(--line);padding-left:11px}
.feed-row.alert-row.hi{border-left-color:#ff6a6a}
.feed-row.alert-row.md{border-left-color:#ffc24d}
.feed-row.alert-row.lo{border-left-color:rgba(var(--ac,55,224,176),.65)}
.al-sev{font-family:var(--mono);font-size:8.5px;font-weight:700;letter-spacing:.08em;
  border-radius:5px;padding:3px 7px;flex:0 0 auto;min-width:34px;text-align:center}
.al-sev.hi{color:#ff9a9a;border:1px solid rgba(255,90,90,.45);background:rgba(255,90,90,.1)}
.al-sev.md{color:#ffc24d;border:1px solid rgba(255,180,60,.45);background:rgba(255,180,60,.1)}
.al-sev.lo{color:var(--accent);border:1px solid rgba(var(--ac,55,224,176),.4);background:rgba(var(--ac,55,224,176),.08)}
.al-id{font-family:var(--mono);font-size:9px;color:var(--dim);white-space:nowrap}

/* ============ AGENT TEAM — 终端式并行任务树（Claude Code 风格）(speech build) ============ */
.ateam{display:flex;flex-direction:column;margin-bottom:11px;opacity:0;
  font-family:var(--mono);background:rgba(0,0,0,.28);border:1px solid var(--line);
  border-radius:var(--r-well);padding:9px 13px 8px}
.at-main{display:flex;align-items:center;gap:9px;padding:1px 0 5px}
.at-core{width:9px;height:9px;border-radius:50%;background:var(--accent);
  box-shadow:0 0 9px var(--accent);animation:fpDot 1.5s ease-in-out infinite;flex:0 0 auto}
.at-id{display:flex;align-items:baseline;gap:9px;min-width:0}
.at-id b{font-size:11px;color:#e6ecf5;font-weight:700;white-space:nowrap}
.at-main .at-id b{color:var(--accent)}
.at-id small{font-size:9px;color:var(--dim);letter-spacing:.03em;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.at-link{display:none}
.at-subs{display:flex;flex-direction:column;min-width:0}
.at-sub{display:flex;align-items:center;gap:8px;padding:3.5px 0;min-width:0;opacity:.42;
  transition:opacity .4s ease}
/* 树状分支肘线（每行一个 ⎿） */
.at-sub::before{content:"";width:12px;height:15px;margin:-13px 0 0 3px;flex:0 0 auto;
  border-left:1px solid rgba(255,255,255,.18);border-bottom:1px solid rgba(255,255,255,.18);
  border-bottom-left-radius:6px}
/* 状态图标：空心圈 → 自旋 spinner → 对勾 */
.at-dot{width:10px;height:10px;border-radius:50%;border:1.5px solid rgba(255,255,255,.28);
  flex:0 0 auto;position:relative}
.at-sub.sc-run{opacity:1}
.at-sub.sc-run .at-dot{border-color:rgba(var(--ac,55,224,176),.25);border-top-color:var(--accent);
  animation:spin .7s linear infinite}
.at-sub.sc-done{opacity:.95}
.at-sub.sc-done .at-dot{border-color:var(--accent);background:rgba(var(--ac,55,224,176),.14);animation:none}
.at-sub.sc-done .at-dot::after{content:"";position:absolute;left:2.5px;top:.5px;width:2.5px;height:5.5px;
  border:solid var(--accent);border-width:0 1.5px 1.5px 0;transform:rotate(40deg)}
.at-sub .at-id{flex:0 0 auto}
.at-sub .at-id b{font-size:10.5px}
.at-sub.lead .at-id b{color:var(--accent)}
/* 活动流：每个子智能体一条实时状态文本，运行时带流光 */
.at-st{flex:1;min-width:0;font-size:9.5px;letter-spacing:.02em;text-align:left;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.at-st i{font-style:normal;display:none}
.at-sub .at-st .q{display:inline;color:rgba(255,255,255,.28)}
.at-sub.sc-run .at-st .q{display:none}
.at-sub.sc-run .at-st .w{display:inline;color:transparent;
  background:linear-gradient(90deg,#7ea99c 20%,#eafff8 50%,#7ea99c 80%);
  background-size:200% 100%;-webkit-background-clip:text;background-clip:text;
  animation:atShimmer 1.5s linear infinite}
.at-sub.sc-done .at-st .q,.at-sub.sc-done .at-st .w{display:none}
.at-sub.sc-done .at-st .d{display:inline;color:var(--accent)}
@keyframes atShimmer{to{background-position:-200% 0}}

/* ============ NEGOTIATE · 子智能体回报 + 主智能体敲定 (speech build) ============ */
.rpt{display:flex;align-items:center;gap:9px;padding:7px 2px;margin:0;font-size:11px;
  border:0;border-bottom:1px solid rgba(242,239,233,.08);border-radius:0;background:none;
  opacity:0;transform:translateX(16px)}
.rpt.sc-on{animation:feedIn .45s var(--ease) both}
.rpt-who{font-family:var(--mono);font-size:9px;color:#8db8ff;flex:0 0 auto;
  border:1px solid rgba(125,180,255,.35);border-radius:5px;padding:2px 7px}
.rpt-txt{flex:1;min-width:0;color:var(--dim);line-height:1.4}
.rpt-px{font-family:var(--mono);font-size:11.5px;color:var(--ink);flex:0 0 auto}
.rpt.win{box-shadow:inset 2px 0 0 var(--accent);padding-left:10px}
.rpt.win .rpt-px{color:var(--accent);font-weight:700}
.rpt-dec{display:flex;align-items:center;gap:10px;margin-top:12px;padding:6px 0 6px 14px;
  border:0;border-left:2px solid var(--accent);border-radius:0;background:none;opacity:0}
.rpt-dec.sc-on{animation:capPop .5s var(--ease) both}
.rd-tag{font-family:var(--mono);font-size:8.5px;font-weight:700;letter-spacing:.1em;
  color:#04231b;background:var(--accent);border-radius:5px;padding:3px 8px;flex:0 0 auto}
.rd-txt{font-size:11px;color:#dff5ec;line-height:1.5}
/* 第二次降价：换个类名重新触发同一段动画 */
.np-val.sc-drop2{color:var(--accent)}
/* RFQ 扇出图收敛宽度，避免元素过大 */
.rfq{max-width:540px;margin-left:auto;margin-right:auto}

/* ============ STUDIO · 三轮 NL 编辑各命中一页 (speech build) ============ */
/* 应用瞬间：目标页闪一圈品牌色 */
.gen-slide.rich.sc-applied::after{content:"";position:absolute;inset:0;border-radius:9px;
  pointer-events:none;animation:slApplied .8s var(--ease)}
@keyframes slApplied{0%{box-shadow:0 0 0 0 rgba(var(--ac,55,224,176),0)}
  30%{box-shadow:0 0 0 3px rgba(var(--ac,55,224,176),.65)}
  100%{box-shadow:0 0 0 0 rgba(var(--ac,55,224,176),0)}}
/* 第 2 页：要点转双栏 + 蓝色圆点 + 标题金色侧条 */
.sl-b li::before{transition:width .4s var(--ease),height .4s var(--ease),background .4s var(--ease),border-radius .4s var(--ease)}
.sl-h{transition:padding .4s var(--ease),border-color .4s var(--ease)}
.sl-content.sc-applied .sl-b{display:grid;grid-template-columns:1fr 1fr;gap:3px 7px}
.sl-content.sc-applied .sl-b li::before{width:5px;height:5px;border-radius:50%;background:#0052CC}
.sl-content.sc-applied .sl-h{border-left:3px solid #FFB81C;padding-left:4px}
/* 第 3 页：五阶段各配一色，Prototype 高亮放大 */
.sl-steps i{transition:background .45s var(--ease),color .45s var(--ease),transform .45s var(--ease)}
.sl-flow.sc-applied .sl-steps i:nth-child(1){background:#0052CC}
.sl-flow.sc-applied .sl-steps i:nth-child(2){background:#00A3A3}
.sl-flow.sc-applied .sl-steps i:nth-child(3){background:#7A5AF8}
.sl-flow.sc-applied .sl-steps i:nth-child(4){background:#FFB81C;color:#1a1a1a;transform:scale(1.14);
  box-shadow:0 1px 5px rgba(255,184,28,.55);font-weight:800}
.sl-flow.sc-applied .sl-steps i:nth-child(5){background:#2BA24C}


/* ============ MARKS · 语义记号系统 ============
   三种记号替代满屏同形的 pill（本块位于所有 widget 基础规则之后、末尾移动端块之前，
   用各记号「最强的既有复合选择器」原样列出，靠源顺序覆盖同权重旧规则）：
   · dot-label（状态/裁决）：无边框无底色，6px 同色圆点 + 小号无衬线大写；颜色只按语义
     （玉=好 / 琥珀 #ffc24d=警告 / 红 #ff9a9a=错误 / 蓝 #8db8ff=信息 / dim=中性）
   · seal（类别/类型/ID）：首页 .svc-seal 的形状——1px 米色 .22 边、2px 圆角、mono、无填充、不大写；
     彩色变体只改字色+边色
   · stamp（每个 stage 至多一个强裁决）：玉色实底、深字、2px 圆角、mono 700 大写
   999px 胶囊只留给真正的控件（工具栏按钮、移动端导轨节点、与会者 chip）。
   注意：不设 display——.feed-chip 的显隐由场景控制（sc-flip）。 */

/* --- dot-label --- */
.feed-row .feed-chip,.feed-chip.ok,.feed-chip.esc,.feed-chip.q,.feed-chip.wait,
.fx-chip,.fx-chip.ok,.fx-chip.pend,
.ai-st,.ai-st.pass,.ai-st.off,.ai-st.esc,
.pstep .ps.done,.pstep .ps.sched,
.ln-seal,.ln-seal.win,.ln-seal.run,.ln-seal.out,.ln-seal.dead,
.pr-state,.jc-pri,.jc-pri.high,.jc-pri.med,.eng-tier,
.al-sev,.al-sev.hi,.al-sev.md,.al-sev.lo,.sev.high,.att-ok{
  background:none;border:0;border-radius:0;padding:0;
  font-family:var(--sans);font-weight:600;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;line-height:1.3;
  color:var(--dim)}
.feed-row .feed-chip::before,.fx-chip::before,.ai-st::before,.pstep .ps.done::before,.pstep .ps.sched::before,
.ln-seal::before,.pr-state::before,.jc-pri::before,.eng-tier::before,.al-sev::before,.sev.high::before,.att-ok::before{
  content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:currentColor;margin-right:6px;vertical-align:1px}
.feed-chip.ok,.fx-chip.ok,.ai-st.pass,.pstep .ps.done,.ln-seal.win,.pr-state,.al-sev.lo,.att-ok{color:var(--accent)}
.feed-chip.esc,.ai-st.esc,.ln-seal.dead,.jc-pri.high,.al-sev.hi,.sev.high{color:#ff9a9a}
.fx-chip.pend,.jc-pri.med,.eng-tier,.al-sev.md{color:#ffc24d}
.ln-seal.run{color:#8db8ff}
.feed-chip.q,.feed-chip.wait,.ai-st.off,.pstep .ps.sched,.ln-seal.out{color:var(--dim)}
.feed-chip.wait::before,.fx-chip.pend::before{animation:waitPulse 1.1s ease-in-out infinite}
.ln-seal{font-size:9px;letter-spacing:.02em;text-transform:none;text-align:left}   /* 泳道里是整句（"Best offer £225"），列宽 78–106px */
.al-sev{text-align:left;min-width:0}
.pr-state,.eng-tier{flex:0 0 auto}

/* --- seal --- */
.scr-row .tag,.scr-row .tag.ok,.scr-row .tag.md,.scr-row .tag.hi,
.jc-type,.jc-type.bug,.jc-type.story,.jc-lab,.jira-col-h .jc-count,.jc-pts,
.mt-cap,.mt-cap.bug,.mt-cap.feat,.mt-cap.fup,
.tchip,.wf-src,.wf-src.reg,.wf-src.news,.wf-src.web,.ch-chip,.ch-chip.sms,.ch-chip.call,
.fd-ic,.fd-ic.pdf,.fd-ic.xls,.att-ic,.sup .sr,.sup .sr.int,.sup .sr.ext,
.sp-proto,.sp-proto.mcp,.sp-proto.api,.sp-proto.doc,
.geo,.diff .dnew,.pr-link,.eng-sec .chips i,.qa-row .a,.qa-row .a.yes,.qa-row .a.no,
.dl-depth,.dl-src,.fin-out .fo-chip,.ng-att,.mail .att,.hb-flag,.cm-kv,.cm-kv.rec,
.qa-row.frm-row .ref,.rpt-who,.outcard .dur,.pl-row .pv,.pl-row .pv.ok,.pl-row .pv.bad,.fx-res .prof,
.pr-branch code,.pr-filelist code{
  border:1px solid rgba(242,239,233,.22);border-radius:var(--r-mark);background:none;padding:1px 6px;
  font-family:var(--mono);font-weight:400;font-size:9.5px;letter-spacing:0;text-transform:none;line-height:1.5;color:var(--dim)}
/* 密集行里的小号 seal */
.tchip,.wf-src,.fd-ic,.att-ic,.sup .sr,.hb-flag,.cm-kv,.cm-kv.rec,.qa-row.frm-row .ref,.rpt-who,.ch-chip,.ch-chip.sms,.ch-chip.call,.fx-res .prof,.diff .dnew{font-size:8.5px;padding:0 5px}
.tchip.t-metric,.tchip.t-int,.tchip.t-root,.tchip.t-const{background:none}
.scr-row .tag.ok,.jc-type.story,.mt-cap.feat,.wf-src.reg,.ch-chip.sms,.fd-ic.xls,.sup .sr.int,.sp-proto.mcp,
.diff .dnew,.pr-link,.qa-row .a.yes,.dl-src,.ng-att,.mail .att,.outcard .dur,.pl-row .pv.ok,.fx-res .prof{color:var(--accent);border-color:rgba(55,224,176,.45)}
.scr-row .tag.hi,.jc-type.bug,.mt-cap.bug,.fd-ic.pdf,.att-ic,.cm-kv.rec,.pl-row .pv.bad{color:#ff9a9a;border-color:rgba(255,120,120,.45)}
.scr-row .tag.md,.qa-row .a.no,.wf-src.news,.sp-proto.doc,.hb-flag,.sup .sr.ext{color:#ffc24d;border-color:rgba(255,180,60,.45)}
.wf-src.web,.ch-chip.call,.sp-proto.api,.rpt-who{color:#8db8ff;border-color:rgba(125,180,255,.45)}
.fin-out .fo-chip{color:#e8ce7a;border-color:rgba(201,162,39,.45)}
.pr-branch code,.pr-filelist code{color:#c2cde0}

/* --- stamp --- */
.ok-badge,.dl-badge,.sv-tag,.rd-tag,.stat-chip,.appt .ok.stat-chip,.fj-tag,.al-chip,.pstep .ps.now{
  background:var(--accent);color:#04130e;border:0;border-radius:var(--r-mark);
  font-family:var(--mono);font-weight:700;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;padding:2px 7px;line-height:1.5}
.al-chip{background:#ffc24d}
.fin-out .fo-ic{border-radius:var(--r-mark)}
.rq-tag rect{rx:2}
.pr-btn{border-radius:var(--r-ctl);background:rgba(55,224,176,.1);border:1px solid rgba(55,224,176,.45);color:var(--accent);
  font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;padding:6px 14px}

/* --- 控件保留胶囊；其余去胶囊 --- */
.mt-pp{border-radius:999px}
.mt-pp::before{content:"";display:inline-block;width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.7;margin-right:5px;vertical-align:1px}
.mt-pp.ai{background:none}
.dv{border-radius:var(--r-mark);padding:2px 8px 2px 3px}

/* --- 每个 stage 一句安静的旁白：站点的衬线 voice line（首页 .st-echo 的语法；zh 回到 --cjk） --- */
.feed-note,.scr-sum,.qa-note,.jira-note,.doss-foot,.dl-stop{font-family:var(--serif);font-style:italic;font-size:13.5px;line-height:1.5;letter-spacing:0;color:var(--dim)}
.doss-foot{color:#ffc24d}
.dl-q,.da-msg{font-family:var(--serif);font-size:12.5px}
body.zh .feed-note,body.zh .scr-sum,body.zh .qa-note,body.zh .jira-note,body.zh .doss-foot,body.zh .dl-stop,body.zh .dl-q,body.zh .da-msg{font-family:var(--cjk);font-style:normal;letter-spacing:.04em}

/* ===== MOBILE FIXES (≤720px) — must stay at end of file to win source order ===== */
@media(max-width:720px){
  /* marks on narrow stages: swimlane seals lose the dot (78px column), alert severity stays left-aligned */
  .ln-seal{font-size:8px;letter-spacing:0}
  .ln-seal::before{display:none}
  .al-sev{text-align:left;min-width:0}
  /* 6-step rail: six min-content tracks (~340px) overflow a ~281px stage.
     minmax(0,1fr) + visually-hidden labels = numbered dots only; the labels
     stay in the DOM as the steps' accessible names. */
  .story-nav-6{grid-template-columns:repeat(6,minmax(0,1fr))}
  .story-nav-6 .ss-lab{position:absolute;width:1px;height:1px;overflow:hidden;
    clip:rect(0 0 0 0);white-space:nowrap}

  /* widgets with no mobile rules */
  .findeck{flex-direction:column;align-items:center}
  .findeck .fin-slide{width:100%;max-width:280px;flex:0 0 auto}
  .vtl{height:56px}
  .vtl i{min-width:0}
  .vtl i b{overflow:hidden;text-overflow:ellipsis}
  .g3d{transform:none}
  .g3d.sc-on{animation:none}
  .g3n text{font-size:11px}
  .g3d-grid{grid-template-columns:minmax(0,1fr)}
  .rq-nm,.rq-agent text{font-size:11px}
  .term{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .eng-facts{grid-template-columns:1fr}
  .ai-stage{grid-template-columns:26px minmax(0,1fr) auto;gap:10px}
  .ai-stage .ai-conf{display:none}
  /* 1fr = minmax(auto,1fr): nowrap/unbreakable content blows the track past the
     container — clamp the flexible tracks to 0 and let long values break */
  .sup{grid-template-columns:minmax(0,1fr)}
  .fx-kv{grid-template-columns:104px minmax(0,1fr);row-gap:3px}
  .fx-kv .v{overflow-wrap:anywhere}
  .xls-tabs{flex-wrap:wrap}
  .dl-approve{flex-wrap:wrap;row-gap:8px}
  /* DDQ form table: five fixed tracks (~346px + padding) overflow a phone —
     drop the source-ref column and clamp the question track */
  .frm-th{display:none}
  .qa-row.frm-row{grid-template-columns:26px minmax(0,1fr) 84px 34px;gap:8px}
  .qa-row.frm-row .ref{display:none}
  /* rotate hint (portrait only, dismissible — see demos.js) */
  .rotate-hint{display:flex;align-items:center;gap:10px;
    margin:0 0 10px;padding:8px 12px;border:1px solid var(--line);border-radius:var(--r-well);
    font-size:12px;line-height:1.45;color:var(--dim);background:rgba(255,255,255,.03)}
  .rotate-hint[hidden]{display:none}
  .rotate-hint .rh-ic{width:17px;height:17px;flex:0 0 auto;color:var(--accent)}
  .rotate-hint span{flex:1}
  .rotate-hint button{background:none;border:0;color:var(--dim);font-size:16px;
    line-height:1;cursor:pointer;padding:4px 8px;flex:0 0 auto}

  /* ---- CJK text-squeeze fixes: fixed-width siblings (pills, mono ids,
     chips, endpoints) starve the flexible text track, which then wraps
     one character per line. Recipe: wrap the row and give the text its
     own full-width line, or let the eater shrink. ---- */
  /* #risk alert feed: id drops to a second line under the text */
  .feed-row.alert-row{grid-template-columns:auto minmax(0,1fr) auto;row-gap:3px}
  .feed-row.alert-row .feed-v{grid-column:2;min-width:0}
  .feed-row.alert-row .al-id{grid-column:2;grid-row:2;justify-self:start}
  .feed-row.alert-row .feed-chip{grid-column:3;grid-row:1}
  /* #risk adjudicate: agent verdict text gets its own full-width line */
  .ai-agents .agent{grid-template-columns:58px minmax(0,1fr);gap:4px 7px}
  .ai-agents .ag-say{grid-column:1 / -1}
  /* #medical/#generation kv rows: status chip wraps under the value */
  .fx-kv .fx-chip{grid-column:2;grid-row:2;justify-self:start}
  /* #medical HIS banner: kv cells wrap instead of crushing */
  .his-banner{flex-wrap:wrap;row-gap:7px}
  .his-banner .hb-kv{flex:1 1 42%;min-width:0}
  /* #pnl drill: the question wraps below the cell ref */
  .dl-top{flex-wrap:wrap;row-gap:2px}
  .dl-top .dl-q{flex:1 1 100%;min-width:0}
  /* #pnl source calls: finding text on its own line under proto/endpoint */
  .src-call{flex-wrap:wrap;row-gap:4px}
  .src-call .sp-ep{min-width:0;overflow:hidden;text-overflow:ellipsis}
  .src-call .sp-txt{flex:1 1 100%;order:5}
  /* #pnl waterfall: tiny labels may spill into the column gaps instead of
     ellipsizing into nothing */
  .br-l{font-size:7.5px;left:-10px;right:-10px;overflow:visible;text-overflow:clip}
  /* toolbar: keep button labels + counter on one line at phone widths */
  .exp-bar{gap:8px}
  .exp-pause,.exp-replay,.exp-skip{white-space:nowrap;padding:7px 11px;flex:0 0 auto}
  .exp-counter{white-space:nowrap}
  .exp-bar .exp-prev,.exp-bar .exp-next{width:34px;height:34px;flex:0 0 auto}
}
@media(max-width:480px){
  /* pause+skip+replay+arrows+counter is one button more than this row was
     designed for — go icon-only. Labels are clip-hidden, not display:none,
     so the buttons keep their accessible names. */
  .exp-pause,.exp-replay,.exp-skip{position:relative;padding:7px 10px}
  .exp-pause .st-p>span:not(.ic),.exp-pause .st-r>span:not(.ic),
  .exp-skip>span:not(.ic),.exp-replay>span:not(.ic){
    position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
}
@media(max-width:420px){
  .lane{grid-template-columns:62px 1fr 78px;gap:6px}
  .lane-axis{margin:0 86px 6px 70px}
  .story-parts{gap:8px}
  .exp-bar{gap:6px}
  .exp-bar .exp-prev,.exp-bar .exp-next{width:30px;height:30px}
}
