/* 官网贾维斯 · AI 开关 / 过场 / 悬浮球 / 全息舱 */
/* 不再 @import Google Fonts：国内访问会被阻塞，而 @import 是「渲染阻塞」的，
   会拖住整个样式表应用（首屏白屏 / 文字先无样式再换字体＝看起来一直闪）。
   字体一律走系统兜底，见下方 --jv-font / --jv-mono 的后备列表。 */

:root{
  --jv-cyan:#00ffd0;
  --jv-cyan2:#67ffe8;
  --jv-blue:#4db7ff;
  --jv-ink:#e8fffa;
  --jv-dim:rgba(200,255,245,.72);
  --jv-panel:rgba(1,10,16,.94);
  --jv-font:"Orbitron","Syne","Segoe UI",sans-serif;
  --jv-mono:"JetBrains Mono","Cascadia Mono","Consolas",monospace;
}

/* ===== AI 开关（导航栏右侧） ===== */
.nav-jarvis-slot{
  display:flex;align-items:center;flex:none;
}
#jarvis-switch,
#jarvis-switch.nav-jarvis-switch{
  position:relative;left:auto;bottom:auto;z-index:1001;
  display:flex;align-items:center;gap:8px;
  padding:6px 10px 6px 7px;border:1px solid rgba(0,255,208,.4);
  background:linear-gradient(135deg,rgba(0,255,208,.1),rgba(2,14,20,.75));
  color:var(--jv-ink);cursor:pointer;
  clip-path:polygon(8px 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%,0 8px);
  box-shadow:0 0 18px rgba(0,255,208,.15);
  backdrop-filter:blur(10px);
  transition:border-color .2s, box-shadow .2s, transform .2s, background .2s;
  white-space:nowrap;
}
#jarvis-switch:hover{
  border-color:rgba(0,255,208,.85);
  box-shadow:0 0 28px rgba(0,255,208,.35);
  transform:translateY(-1px);
  background:linear-gradient(135deg,rgba(0,255,208,.18),rgba(2,14,20,.85));
}
#jarvis-switch .jv-sw-track{
  width:46px;height:26px;border-radius:999px;position:relative;
  background:rgba(255,255,255,.08);border:1px solid rgba(0,255,208,.3);
  transition:background .25s, box-shadow .25s;
}
#jarvis-switch .jv-sw-knob{
  position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;
  background:linear-gradient(160deg,#9aa3a8,#5a646a);
  box-shadow:0 0 8px rgba(0,0,0,.35);
  transition:transform .28s cubic-bezier(.16,1,.3,1), background .25s, box-shadow .25s;
}
#jarvis-switch.on .jv-sw-track{
  background:rgba(0,255,208,.22);
  box-shadow:inset 0 0 12px rgba(0,255,208,.25);
}
#jarvis-switch.on .jv-sw-knob{
  transform:translateX(20px);
  background:linear-gradient(160deg,#b8fff5,#00e0b8);
  box-shadow:0 0 14px rgba(0,255,208,.7);
}
#jarvis-switch .jv-sw-copy{display:flex;flex-direction:column;align-items:flex-start;line-height:1.15;text-align:left}
#jarvis-switch .jv-sw-copy em{
  font-style:normal;font-family:var(--jv-font);font-size:10px;letter-spacing:.28em;color:var(--jv-cyan);
}
#jarvis-switch .jv-sw-copy b{font-weight:600;font-size:12px;color:var(--jv-dim)}
#jarvis-switch.on .jv-sw-copy b{color:#e8fffa}

/* ===== 过场：半透明进入未来 ===== */
#jarvis-intro{
  position:fixed;inset:0;z-index:1200;display:none;place-items:center;
  background:
    radial-gradient(ellipse 120% 80% at 50% 40%, rgba(0,255,208,.14), transparent 55%),
    radial-gradient(circle at 50% 50%, rgba(2,20,28,.62) 0%, rgba(0,4,8,.78) 100%);
  backdrop-filter:blur(3px) saturate(1.25);
  color:#e8fffa;overflow:hidden;
}
#jarvis-intro.show{display:grid}
#jarvis-intro::before{
  content:"";position:absolute;inset:0;
  background:repeating-linear-gradient(0deg, rgba(0,255,208,.06) 0 1px, transparent 1px 5px);
  animation:jvIntroScan 1.2s linear infinite;
  pointer-events:none;opacity:.85;
}
#jarvis-intro::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg, transparent 40%, rgba(0,255,208,.08) 50%, transparent 60%);
  animation:jvIntroSweep 2.4s ease-in-out infinite;
}
@keyframes jvIntroScan{to{transform:translateY(12px)}}
@keyframes jvIntroSweep{
  0%,100%{transform:translateX(-120%) skewX(-12deg);opacity:0}
  45%,55%{opacity:1}
  100%{transform:translateX(120%) skewX(-12deg);opacity:0}
}
.jv-intro-vignette{
  position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(circle at 50% 50%, transparent 35%, rgba(0,0,0,.45) 100%);
}
.jv-intro-grid{
  position:absolute;inset:-20%;pointer-events:none;opacity:.35;
  background:
    linear-gradient(rgba(0,255,208,.12) 1px, transparent 1px),
    linear-gradient(90deg, rgba(0,255,208,.12) 1px, transparent 1px);
  background-size:48px 48px;
  transform:perspective(600px) rotateX(58deg) scale(1.4);
  transform-origin:50% 80%;
  animation:jvGridDrift 3s linear infinite;
  mask-image:radial-gradient(ellipse 70% 55% at 50% 45%, #000 20%, transparent 72%);
}
@keyframes jvGridDrift{to{background-position:0 48px, 48px 0}}
.jv-intro-warp{
  position:absolute;left:50%;top:50%;width:min(90vw,520px);height:min(90vw,520px);
  transform:translate(-50%,-50%);pointer-events:none;border-radius:50%;
  background:conic-gradient(from 0deg, transparent, rgba(0,255,208,.25), transparent 35%, rgba(77,183,255,.2), transparent 70%);
  filter:blur(28px);opacity:.55;
  animation:jvWarpSpin 4s linear infinite;
}
@keyframes jvWarpSpin{to{transform:translate(-50%,-50%) rotate(360deg)}}
.jv-intro-stage{
  position:relative;z-index:2;display:grid;place-items:center;
  transition:opacity .35s ease, transform .35s ease, filter .35s ease;
}
#jarvis-intro.fade-ui .jv-intro-stage{
  opacity:0;transform:scale(.92);filter:blur(6px);
}
#jarvis-intro.fade-ui::before,
#jarvis-intro.fade-ui::after,
#jarvis-intro.fade-ui .jv-intro-vignette,
#jarvis-intro.fade-ui .jv-intro-grid,
#jarvis-intro.fade-ui .jv-intro-warp{
  opacity:0;transition:opacity .4s ease;
}
.jv-intro-tag{
  margin-bottom:18px;font-family:var(--jv-font);font-size:11px;letter-spacing:.42em;
  color:rgba(0,255,208,.9);text-shadow:0 0 16px rgba(0,255,208,.5);
  animation:jvTagPulse 1.6s ease-in-out infinite;
}
@keyframes jvTagPulse{
  0%,100%{opacity:.75;letter-spacing:.38em}
  50%{opacity:1;letter-spacing:.48em}
}
.jv-intro-core{
  position:relative;width:160px;height:160px;display:grid;place-items:center;margin-bottom:28px;
}
.jv-intro-spark{
  position:absolute;inset:-8px;border-radius:50%;pointer-events:none;
  background:conic-gradient(from 0deg, transparent, rgba(255,255,255,.5), transparent 25%);
  animation:jvOrbit 1.8s linear infinite;
  mix-blend-mode:screen;opacity:.6;
}
#jarvis-intro.condense .jv-intro-core .jv-intro-mark{
  animation:jvCondenseCore .5s ease-in-out infinite alternate;
}
@keyframes jvCondenseCore{
  from{box-shadow:0 0 40px rgba(0,255,208,.65)}
  to{box-shadow:0 0 64px rgba(0,255,208,.95), 0 0 100px rgba(77,183,255,.35)}
}
.jv-fly-ghost{
  transform-origin:center center;
  filter:drop-shadow(0 0 32px rgba(0,255,208,.75));
}
.jv-fly-ghost .jv-intro-lines,
.jv-fly-ghost .jv-intro-bar{display:none!important}
#jarvis-intro.out{animation:jvIntroFade .48s ease forwards}
@keyframes jvIntroFade{to{opacity:0;filter:blur(8px)}}
.jv-intro-ring{
  position:absolute;inset:0;border-radius:50%;
  border:1px solid rgba(0,255,208,.45);
  animation:jvOrbit 2.4s linear infinite;
  box-shadow:0 0 24px rgba(0,255,208,.2);
}
.jv-intro-ring.r2{inset:-18px;border-style:dashed;border-color:rgba(77,183,255,.4);animation-duration:3.6s;animation-direction:reverse}
.jv-intro-ring.r3{inset:-36px;border-color:rgba(0,255,208,.2);animation-duration:5s}
.jv-intro-mark{
  width:78px;height:78px;border-radius:50%;display:grid;place-items:center;
  font-family:var(--jv-font);font-size:28px;font-weight:800;color:#021014;letter-spacing:.12em;
  background:
    radial-gradient(circle at 32% 28%, #fff, transparent 28%),
    radial-gradient(circle at 50% 55%, #8dfff2 0%, #00d8b0 40%, #035a4e 70%, #021018 90%);
  box-shadow:0 0 40px rgba(0,255,208,.65);
  animation:jvCorePulse 1.2s ease-in-out infinite;
}
.jv-intro-lines{
  text-align:center;font-family:var(--jv-mono);font-size:11px;letter-spacing:.18em;
  color:rgba(200,255,245,.65);display:grid;gap:8px;
}
.jv-intro-lines .jv-intro-title{
  margin-top:10px;font-family:var(--jv-font);font-size:22px;letter-spacing:.2em;color:#fff;
  text-shadow:0 0 20px rgba(0,255,208,.5);
}
.jv-intro-bar{
  margin-top:22px;width:min(320px,70vw);height:3px;background:rgba(255,255,255,.08);overflow:hidden;
}
.jv-intro-bar i{
  display:block;height:100%;width:0;background:linear-gradient(90deg,transparent,#00ffd0,#4db7ff);
  box-shadow:0 0 12px #00ffd0;animation:jvIntroBar 2s ease forwards;
}
@keyframes jvIntroBar{to{width:100%}}

/* ===== FAB：呼吸悬浮球 ===== */
#jarvis-fab{
  position:fixed;right:22px;bottom:92px;z-index:1002;
  width:84px;height:84px;border:0;cursor:pointer;background:transparent;
  opacity:0;transform:scale(.4) translateY(24px);
  pointer-events:none;isolation:isolate;
  transition:opacity .45s ease, transform .55s cubic-bezier(.16,1,.3,1);
}
#jarvis-fab.visible{
  opacity:1;transform:none;pointer-events:auto;
}
#jarvis-fab.landed .jv-fab-core{animation:jvFabLand .75s cubic-bezier(.16,1,.3,1) both}
@keyframes jvFabLand{
  0%{transform:scale(1.18);filter:brightness(1.35)}
  55%{transform:scale(.94)}
  100%{transform:scale(1);filter:brightness(1)}
}
#jarvis-fab .jv-fab-pulse{
  position:absolute;inset:0;border-radius:50%;pointer-events:none;
  border:1px solid rgba(0,255,208,.45);
  box-shadow:0 0 24px rgba(0,255,208,.25);
  opacity:0;
}
#jarvis-fab.breathe .jv-fab-pulse{animation:jvFabRipple 2.6s ease-out infinite}
#jarvis-fab.breathe .jv-fab-pulse-2{animation-delay:1.3s}
@keyframes jvFabRipple{
  0%{transform:scale(.85);opacity:.75}
  100%{transform:scale(1.85);opacity:0}
}
#jarvis-fab .jv-fab-rings,
#jarvis-fab .jv-fab-rings::before,
#jarvis-fab .jv-fab-rings::after{
  content:"";position:absolute;border-radius:50%;pointer-events:none;
}
#jarvis-fab .jv-fab-rings{
  inset:-10px;
  background:
    conic-gradient(from 0deg, transparent 0 52%, rgba(0,255,208,.85) 64%, rgba(77,183,255,.6) 72%, transparent 84%);
  -webkit-mask:radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 1px));
  mask:radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 1px));
  animation:jvOrbit 3.2s linear infinite;
  filter:drop-shadow(0 0 8px rgba(0,255,208,.5));
}
#jarvis-fab.breathe .jv-fab-rings{
  animation:jvOrbit 3.2s linear infinite, jvRingBreath 2.6s ease-in-out infinite;
}
#jarvis-fab .jv-fab-rings::before{
  inset:-16px;
  border:1px dashed rgba(77,183,255,.5);
  animation:jvOrbit 5.5s linear infinite reverse;
  box-shadow:0 0 16px rgba(77,183,255,.2);
}
#jarvis-fab .jv-fab-rings::after{
  inset:-24px;
  border:1px solid rgba(0,255,208,.28);
  box-shadow:0 0 28px rgba(0,255,208,.2), inset 0 0 20px rgba(0,255,208,.08);
  animation:jvOrbit 8s linear infinite;
}
#jarvis-fab .jv-fab-core{
  position:absolute;inset:9px;border-radius:50%;
  display:grid;place-items:center;
  background:
    radial-gradient(circle at 32% 28%, rgba(255,255,255,.98), transparent 24%),
    radial-gradient(circle at 50% 55%, #b8fff5 0%, #00e8c0 30%, #048a72 58%, #021018 82%);
  box-shadow:
    0 0 0 1px rgba(0,255,208,.7),
    0 0 40px rgba(0,255,208,.65),
    0 14px 32px rgba(0,0,0,.42),
    inset 0 -10px 20px rgba(0,0,0,.3),
    inset 0 8px 16px rgba(255,255,255,.12);
  transition:transform .25s ease, box-shadow .25s ease, filter .25s ease;
}
#jarvis-fab.breathe .jv-fab-core{
  animation:jvFabBreath 2.6s ease-in-out infinite;
}
@keyframes jvFabBreath{
  0%,100%{
    transform:scale(1);
    filter:brightness(1);
    box-shadow:0 0 0 1px rgba(0,255,208,.65),0 0 36px rgba(0,255,208,.55),0 14px 32px rgba(0,0,0,.42),inset 0 -10px 20px rgba(0,0,0,.3);
  }
  50%{
    transform:scale(1.07);
    filter:brightness(1.18);
    box-shadow:0 0 0 2px rgba(0,255,208,.95),0 0 64px rgba(0,255,208,.85),0 0 100px rgba(77,183,255,.25),0 16px 36px rgba(0,0,0,.45),inset 0 -8px 18px rgba(0,0,0,.25);
  }
}
@keyframes jvRingBreath{
  0%,100%{opacity:.85;filter:drop-shadow(0 0 6px rgba(0,255,208,.4))}
  50%{opacity:1;filter:drop-shadow(0 0 14px rgba(0,255,208,.85))}
}
#jarvis-fab .jv-fab-core b{
  font-family:var(--jv-font);font-size:18px;font-weight:800;letter-spacing:.16em;color:#021014;
  text-shadow:0 0 12px rgba(255,255,255,.5);z-index:1;
}
#jarvis-fab .jv-fab-core i{
  position:absolute;inset:-3px;border-radius:50%;
  background:conic-gradient(from 180deg, transparent, rgba(255,255,255,.45), transparent 38%);
  animation:jvOrbit 2.4s linear infinite;
  mix-blend-mode:screen;opacity:.6;
}
#jarvis-fab .jv-fab-tag{
  position:absolute;left:50%;bottom:-18px;transform:translateX(-50%);
  font-family:var(--jv-font);font-size:9px;letter-spacing:.28em;color:rgba(0,255,208,.85);
  text-shadow:0 0 10px rgba(0,255,208,.45);white-space:nowrap;
}
#jarvis-fab.breathe .jv-fab-tag{animation:jvTagGlow 2.6s ease-in-out infinite}
@keyframes jvTagGlow{
  0%,100%{opacity:.75;text-shadow:0 0 8px rgba(0,255,208,.35)}
  50%{opacity:1;text-shadow:0 0 16px rgba(0,255,208,.75)}
}
#jarvis-fab:hover .jv-fab-core{
  transform:scale(1.08);
  box-shadow:0 0 0 1px rgba(0,255,208,.95),0 0 56px rgba(0,255,208,.85),0 16px 36px rgba(0,0,0,.48);
}
#jarvis-fab.on .jv-fab-core{animation:jvCorePulse 1.2s ease-in-out infinite}
#jarvis-fab.on.breathe .jv-fab-core{animation:jvCorePulse 1.2s ease-in-out infinite}
#jarvis-fab.on .jv-fab-rings{animation-duration:1.6s, 1.2s}
@keyframes jvOrbit{to{transform:rotate(360deg)}}
@keyframes jvCorePulse{
  0%,100%{box-shadow:0 0 0 1px rgba(0,255,208,.55),0 0 28px rgba(0,255,208,.5)}
  50%{box-shadow:0 0 0 2px rgba(0,255,208,.95),0 0 56px rgba(0,255,208,.9)}
}

/* ===== 全屏沉浸层：开舱后 ===== */
body.jarvis-open{--jv-active:1}
body.jarvis-open::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:900;
  background:
    radial-gradient(1000px 560px at 85% -8%, rgba(0,255,208,.2), transparent 55%),
    radial-gradient(820px 480px at -5% 110%, rgba(77,183,255,.14), transparent 52%),
    radial-gradient(circle at 50% 50%, transparent 40%, rgba(0,8,12,.35) 100%),
    repeating-linear-gradient(0deg, rgba(0,255,208,.035) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(0,255,208,.02) 0 1px, transparent 1px 28px);
  mix-blend-mode:screen;opacity:.9;
  animation:jvScanField 7s linear infinite;
}
@keyframes jvScanField{to{background-position:0 0,0 0,0 0,0 48px,14px 0}}
body.jarvis-open::after{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:901;
  box-shadow:inset 0 0 160px rgba(0,255,208,.1), inset 0 0 40px rgba(0,0,0,.35);
  border:1px solid rgba(0,255,208,.14);
}
body.jarvis-armed:not(.jarvis-open)::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:900;
  background:radial-gradient(500px 280px at 92% 88%, rgba(0,255,208,.08), transparent 60%);
  mix-blend-mode:screen;
}

#jarvis-fx{
  position:fixed;inset:0;pointer-events:none;z-index:902;overflow:hidden;
}
body.jarvis-armed:not(.jarvis-open) #jarvis-fx .radar,
body.jarvis-armed:not(.jarvis-open) #jarvis-fx .telemetry,
body.jarvis-armed:not(.jarvis-open) #jarvis-fx .hex,
body.jarvis-armed:not(.jarvis-open) #jarvis-fx .beam,
body.jarvis-armed:not(.jarvis-open) #jarvis-fx .scanline{
  opacity:.35;
}
#jarvis-fx .hex{
  position:absolute;inset:-10%;opacity:.18;
  background-image:
    linear-gradient(30deg, rgba(0,255,208,.18) 12%, transparent 12.5%, transparent 87%, rgba(0,255,208,.18) 87.5%, rgba(0,255,208,.18)),
    linear-gradient(150deg, rgba(0,255,208,.18) 12%, transparent 12.5%, transparent 87%, rgba(0,255,208,.18) 87.5%, rgba(0,255,208,.18)),
    linear-gradient(90deg, rgba(0,255,208,.1) 2px, transparent 2px);
  background-size:42px 72px;
  mask-image:radial-gradient(circle at 70% 30%, #000 0%, transparent 68%);
  animation:jvHexDrift 18s linear infinite;
}
@keyframes jvHexDrift{to{transform:translateY(-36px)}}
#jarvis-fx .radar{
  position:absolute;right:8%;top:18%;width:220px;height:220px;border-radius:50%;
  border:1px solid rgba(0,255,208,.25);
  background:
    radial-gradient(circle, transparent 42%, rgba(0,255,208,.05) 43%, transparent 44%),
    repeating-radial-gradient(circle, transparent 0 18px, rgba(0,255,208,.08) 18px 19px);
  box-shadow:0 0 40px rgba(0,255,208,.12);opacity:.55;
}
#jarvis-fx .radar::before{
  content:"";position:absolute;inset:8%;border-radius:50%;
  background:conic-gradient(from 0deg, transparent 0 70%, rgba(0,255,208,.35) 85%, transparent 100%);
  animation:jvRadar 3.6s linear infinite;
}
#jarvis-fx .radar::after{
  content:"";position:absolute;left:50%;top:50%;width:6px;height:6px;margin:-3px 0 0 -3px;
  border-radius:50%;background:#00ffd0;box-shadow:0 0 12px #00ffd0;
}
@keyframes jvRadar{to{transform:rotate(360deg)}}
#jarvis-fx .corner{
  position:absolute;width:68px;height:68px;border-color:var(--jv-cyan);border-style:solid;opacity:.85;
  filter:drop-shadow(0 0 8px rgba(0,255,208,.45));
}
#jarvis-fx .corner::before{
  content:"";position:absolute;width:10px;height:10px;background:var(--jv-cyan);
  box-shadow:0 0 10px var(--jv-cyan);
}
#jarvis-fx .tl{top:14px;left:14px;border-width:2px 0 0 2px}
#jarvis-fx .tl::before{top:-2px;left:-2px}
#jarvis-fx .tr{top:14px;right:14px;border-width:2px 2px 0 0}
#jarvis-fx .tr::before{top:-2px;right:-2px}
#jarvis-fx .bl{bottom:14px;left:14px;border-width:0 0 2px 2px}
#jarvis-fx .bl::before{bottom:-2px;left:-2px}
#jarvis-fx .br{bottom:14px;right:14px;border-width:0 2px 2px 0}
#jarvis-fx .br::before{bottom:-2px;right:-2px}
#jarvis-fx .beam{
  position:absolute;top:0;bottom:0;width:32%;left:-24%;
  background:linear-gradient(90deg,transparent,rgba(0,255,208,.12),rgba(77,183,255,.08),transparent);
  animation:jvBeam 4.8s linear infinite;
}
@keyframes jvBeam{to{transform:translateX(420%)}}
#jarvis-fx .scanline{
  position:absolute;left:0;right:0;height:120px;top:-120px;
  background:linear-gradient(180deg,transparent,rgba(0,255,208,.08),transparent);
  animation:jvHScan 5.5s ease-in-out infinite;
}
@keyframes jvHScan{0%{top:-120px}100%{top:110%}}
#jarvis-fx .chrome{
  position:absolute;top:0;left:0;right:0;height:32px;
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:0 78px;font-family:var(--jv-mono);font-size:10px;letter-spacing:.24em;
  color:rgba(215,255,246,.78);
  background:linear-gradient(180deg,rgba(0,255,208,.16),transparent);
  border-bottom:1px solid rgba(0,255,208,.22);
  text-shadow:0 0 12px rgba(0,255,208,.35);
}
#jarvis-fx .chrome .pulse{
  width:7px;height:7px;border-radius:50%;background:#00ffd0;
  box-shadow:0 0 10px #00ffd0;animation:jvDot 1.2s ease-in-out infinite;
  display:inline-block;margin-right:8px;vertical-align:middle;
}
@keyframes jvDot{50%{opacity:.35;transform:scale(.75)}}
#jarvis-fx .telemetry{
  position:absolute;left:22px;top:56px;width:148px;
  font-family:var(--jv-mono);font-size:10px;line-height:1.7;letter-spacing:.08em;
  color:rgba(180,255,240,.55);text-shadow:0 0 8px rgba(0,255,208,.2);
}
#jarvis-fx .telemetry b{color:#67ffe8;font-weight:600}
#jarvis-fx .sparks span{
  position:absolute;width:2px;height:2px;border-radius:50%;background:#00ffd0;
  box-shadow:0 0 8px #00ffd0;opacity:0;animation:jvSpark 3.8s linear infinite;
}
@keyframes jvSpark{
  0%{opacity:0;transform:translateY(0) scale(.6)}
  15%{opacity:.9}
  100%{opacity:0;transform:translateY(-120px) scale(1.4)}
}

/* ===== 对话坞：始终占位，用 open 控制显隐，避免 display 切换闪两下 ===== */
#jarvis-dock{
  /* 底边距：悬浮球 + 站点底部导航之间的安全间距。
     --jv-kb 是「被软键盘 / 浏览器底部工具栏吃掉的高度」，由 jarvis.js 的
     syncDockViewport() 写在 :root 上，这里只读它。 */
  --jv-dock-gap:170px;
  position:fixed;right:22px;bottom:calc(var(--jv-dock-gap) + var(--jv-kb, 0px));z-index:1003;
  width:min(460px,calc(100vw - 28px));
  display:flex;flex-direction:column;
  max-height:min(76vh,700px);   /* 老浏览器兜底（不认识 dvh / max() 时用这条） */
  /* 可用高度必须扣掉「底边距 + 键盘遮挡 + 顶部留白」，否则 overflow:hidden 会把
     底部的输入框和发送键直接裁掉。max(180px,…) 是防止键盘很高时算出 0 或负值；
     多留 6px 是给 flex 的亚像素取整，别让最后一行差 1px 被吃掉。 */
  max-height:max(180px, min(calc(100dvh - var(--jv-dock-gap) - var(--jv-kb, 0px) - 20px), 700px));
  background:
    linear-gradient(160deg, rgba(0,255,208,.1), transparent 38%),
    linear-gradient(180deg, rgba(3,16,24,.97), rgba(1,7,12,.96));
  border:1px solid rgba(0,255,208,.5);
  clip-path:polygon(0 18px,18px 0,100% 0,100% calc(100% - 18px),calc(100% - 18px) 100%,0 100%);
  box-shadow:
    0 0 0 1px rgba(0,255,208,.14),
    0 0 70px rgba(0,255,208,.22),
    0 28px 70px rgba(0,0,0,.55),
    inset 0 1px 0 rgba(255,255,255,.08);
  backdrop-filter:blur(18px) saturate(1.25);
  overflow:hidden;
  opacity:0;
  visibility:hidden;
  pointer-events:none;
  transform:translateY(18px) scale(.97);
  transition:
    opacity .38s cubic-bezier(.16,1,.3,1),
    transform .42s cubic-bezier(.16,1,.3,1),
    visibility 0s linear .42s;
  will-change:opacity, transform;
}
#jarvis-dock.open{
  opacity:1;visibility:visible;pointer-events:auto;
  transform:none;
  transition:
    opacity .38s cubic-bezier(.16,1,.3,1),
    transform .42s cubic-bezier(.16,1,.3,1),
    visibility 0s;
}

/* 对话坞 = 「固定高度块（顶栏 / 头像 / 快捷问 / 输入框）+ 可伸缩的对话区」。
   固定块一律不许被压缩，内容超高时只压 .jv-thread（它自带滚动），
   这样任何屏幕高度下（横屏、小屏机、软键盘顶上来）底部的输入框与发送键都不会被裁掉。 */
#jarvis-dock > .jv-topline,
#jarvis-dock > .jv-head,
#jarvis-dock > .jv-chips,
#jarvis-dock > .jv-composer{flex:0 0 auto}
#jarvis-dock > .jv-thread{flex:1 1 auto;min-height:0}
#jarvis-dock::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background:
    repeating-linear-gradient(0deg, rgba(255,255,255,.03) 0 1px, transparent 1px 3px),
    radial-gradient(240px 120px at 80% 0%, rgba(77,183,255,.12), transparent);
  opacity:.6;mix-blend-mode:overlay;
}
#jarvis-dock::after{
  content:"";position:absolute;left:0;right:0;height:2px;top:0;z-index:2;pointer-events:none;
  background:linear-gradient(90deg,transparent,#00ffd0,#4db7ff,transparent);
  box-shadow:0 0 16px #00ffd0;
  opacity:0;
}
#jarvis-dock.open::after{animation:jvDockScan 2.8s ease-in-out infinite;opacity:1}
@keyframes jvDockScan{0%{top:0;opacity:.25}45%{opacity:1}100%{top:100%;opacity:.1}}

.jv-frame{position:absolute;inset:0;pointer-events:none;z-index:3}
.jv-frame .c{position:absolute;width:18px;height:18px;border:2px solid rgba(0,255,208,.7)}
.jv-frame .tl{top:8px;left:8px;border-right:0;border-bottom:0}
.jv-frame .tr{top:8px;right:8px;border-left:0;border-bottom:0}
.jv-frame .bl{bottom:8px;left:8px;border-right:0;border-top:0}
.jv-frame .br{bottom:8px;right:8px;border-left:0;border-top:0}

.jv-topline{
  position:relative;z-index:1;
  display:flex;justify-content:space-between;align-items:center;
  padding:10px 16px 0;font-family:var(--jv-mono);font-size:10px;letter-spacing:.18em;
  color:rgba(0,255,208,.7);
}
.jv-topline-r{display:flex;align-items:center;gap:10px}
#jv-voice{
  display:grid;place-items:center;width:26px;height:22px;padding:0;cursor:pointer;
  border:1px solid rgba(0,255,208,.35);background:rgba(0,255,208,.08);
  color:var(--jv-ink);font-size:12px;line-height:1;
  transition:background .15s, box-shadow .15s, transform .15s;
}
#jv-voice:hover{background:rgba(0,255,208,.2);box-shadow:0 0 12px rgba(0,255,208,.35);transform:translateY(-1px)}
#jv-voice:active{transform:scale(.94)}

.jv-head{
  position:relative;z-index:1;
  display:flex;gap:12px;align-items:center;padding:12px 16px 12px;
  border-bottom:1px solid rgba(0,255,208,.22);
  background:
    linear-gradient(90deg,rgba(0,255,208,.16),transparent 70%),
    radial-gradient(120px 60px at 20% 0%, rgba(77,183,255,.18), transparent);
}
.jv-face-wrap{position:relative;width:68px;height:68px;flex:none}
.jv-face-wrap::before,
.jv-face-wrap::after{
  content:"";position:absolute;inset:-6px;border-radius:50%;
  border:1px solid rgba(0,255,208,.35);animation:jvOrbit 5s linear infinite;
}
.jv-face-wrap::after{
  inset:-12px;border-color:rgba(77,183,255,.28);border-style:dashed;
  animation-duration:8s;animation-direction:reverse;
}
.jv-face{
  width:68px;height:68px;border-radius:50%;position:relative;
  background:
    radial-gradient(circle at 35% 28%, rgba(255,255,255,.9), transparent 26%),
    radial-gradient(circle at 50% 55%, #8dfff2 0%, #00d8b0 38%, #046658 65%, #021018 85%);
  box-shadow:0 0 28px rgba(0,255,208,.55), inset 0 -8px 16px rgba(0,0,0,.25);
}
.jv-face.speaking{animation:jvBreath .85s ease-in-out infinite}
.jv-face.speaking .jv-eq{opacity:1}
@keyframes jvBreath{50%{transform:scale(1.07);filter:brightness(1.25)}}
.jv-face i{
  position:absolute;top:34%;width:7px;height:7px;border-radius:50%;background:#e8fffa;box-shadow:0 0 8px #fff;
}
.jv-face i:first-child{left:28%}
.jv-face i:nth-child(2){right:28%}
.jv-face b.mouth{
  position:absolute;left:50%;top:50%;width:22px;height:8px;margin-left:-11px;
  border-radius:0 0 12px 12px;border:1.5px solid rgba(255,255,255,.55);border-top:0;opacity:.6;
}
.jv-eq{
  position:absolute;left:50%;bottom:12px;transform:translateX(-50%);
  display:flex;gap:2px;align-items:flex-end;height:10px;opacity:0;transition:opacity .2s;
}
.jv-eq span{
  width:2px;background:#e8fffa;border-radius:1px;height:3px;
  box-shadow:0 0 6px #fff;animation:jvBar .5s ease-in-out infinite alternate;
}
.jv-eq span:nth-child(2){animation-delay:.1s}
.jv-eq span:nth-child(3){animation-delay:.2s}
.jv-eq span:nth-child(4){animation-delay:.05s}
.jv-eq span:nth-child(5){animation-delay:.15s}
@keyframes jvBar{to{height:10px}}

.jv-meta{min-width:0;flex:1}
.jv-meta .tag{
  font-family:var(--jv-font);font-size:10px;letter-spacing:.3em;color:var(--jv-cyan);font-weight:800;
  text-shadow:0 0 12px rgba(0,255,208,.45);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
.jv-mode{
  display:inline-block;padding:2px 7px;letter-spacing:.14em;font-size:9px;
  border:1px solid rgba(0,255,208,.35);color:rgba(200,255,245,.75);
  background:rgba(0,255,208,.06);
}
body.jarvis-elevated .jv-mode{
  border-color:rgba(77,183,255,.7);color:#dff4ff;
  background:rgba(77,183,255,.18);
  box-shadow:0 0 12px rgba(77,183,255,.35);
}
body.jarvis-elevated #jarvis-dock{
  border-color:rgba(77,183,255,.55);
  box-shadow:
    0 0 0 1px rgba(77,183,255,.18),
    0 0 70px rgba(0,255,208,.22),
    0 0 40px rgba(77,183,255,.15),
    0 28px 70px rgba(0,0,0,.55);
}
.jv-meta h3{
  margin:4px 0 2px;font-family:var(--jv-font);font-size:24px;font-weight:800;
  letter-spacing:.12em;
  background:linear-gradient(90deg,#fff,#9ffff0 55%,#4db7ff);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.jv-meta p{margin:0;font-size:12px;color:var(--jv-dim);line-height:1.4;font-family:var(--jv-mono)}
.jv-close{
  border:1px solid rgba(0,255,208,.4);background:rgba(0,255,208,.06);color:var(--jv-ink);
  width:36px;height:36px;cursor:pointer;font-size:16px;position:relative;z-index:1;
  clip-path:polygon(8px 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%,0 8px);
  transition:background .15s, box-shadow .15s;
}
.jv-close:hover{background:rgba(0,255,208,.18);box-shadow:0 0 16px rgba(0,255,208,.3)}

.jv-thread{
  position:relative;z-index:1;
  flex:1;overflow:auto;padding:14px 14px;display:flex;flex-direction:column;gap:12px;
  background:
    radial-gradient(200px 80px at 10% 0%, rgba(0,255,208,.06), transparent),
    linear-gradient(180deg, rgba(0,0,0,.12), transparent);
}
.jv-bubble{
  max-width:94%;padding:11px 13px;font-size:14px;line-height:1.65;color:var(--jv-ink);
  border:1px solid rgba(0,255,208,.25);background:rgba(0,255,208,.05);
  clip-path:polygon(0 0,calc(100% - 10px) 0,100% 10px,100% 100%,10px 100%,0 calc(100% - 10px));
  white-space:pre-wrap;
  box-shadow:0 0 20px rgba(0,255,208,.06);
}
.jv-bubble.jv-bubble-new{animation:jvMsg .35s cubic-bezier(.16,1,.3,1) both}
@keyframes jvMsg{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.jv-bubble.me{
  align-self:flex-start;
  background:linear-gradient(135deg,rgba(0,255,208,.16),rgba(77,183,255,.07));
  border-color:rgba(0,255,208,.45);
  box-shadow:0 0 24px rgba(0,255,208,.12);
}
.jv-bubble.you{
  align-self:flex-end;
  background:rgba(255,255,255,.04);
  border-color:rgba(255,255,255,.16);
}
.jv-bubble em{
  display:block;font-style:normal;font-family:var(--jv-mono);
  font-size:10px;letter-spacing:.16em;color:rgba(0,255,208,.75);margin-bottom:5px;
}
.jv-typing{
  align-self:flex-start;display:flex;gap:5px;padding:10px 14px;
  border:1px solid rgba(0,255,208,.28);background:rgba(0,255,208,.06);
}
.jv-typing i{
  width:6px;height:6px;border-radius:50%;background:#00ffd0;
  box-shadow:0 0 8px #00ffd0;animation:jvDot 1s ease-in-out infinite;
}
.jv-typing i:nth-child(2){animation-delay:.15s}
.jv-typing i:nth-child(3){animation-delay:.3s}

.jv-chips{position:relative;z-index:1;display:flex;flex-wrap:wrap;gap:7px;padding:0 14px 10px}
.jv-chips button{
  border:1px solid rgba(0,255,208,.4);background:rgba(0,255,208,.07);color:var(--jv-ink);
  font:inherit;font-size:12px;padding:8px 11px;cursor:pointer;
  clip-path:polygon(9px 0,100% 0,100% calc(100% - 9px),calc(100% - 9px) 100%,0 100%,0 9px);
  transition:border-color .15s, background .15s, transform .15s, box-shadow .15s;
  box-shadow:inset 0 0 12px rgba(0,255,208,.05);
}
.jv-chips button:hover{
  border-color:#00ffd0;background:rgba(0,255,208,.16);transform:translateY(-2px);
  box-shadow:0 0 18px rgba(0,255,208,.25);
}
.jv-composer{position:relative;z-index:1;display:flex;gap:8px;padding:0 14px 16px;align-items:flex-end}
.jv-composer textarea{
  flex:1;min-height:56px;max-height:120px;resize:vertical;font:inherit;font-size:14px;
  color:var(--jv-ink);background:rgba(0,6,10,.85);border:1px solid rgba(0,255,208,.4);
  padding:11px 12px;caret-color:#00ffd0;outline:none;border-radius:0;
  box-shadow:inset 0 0 24px rgba(0,255,208,.05);
}
.jv-composer textarea:focus{
  border-color:#00ffd0;
  box-shadow:0 0 0 3px rgba(0,255,208,.14), inset 0 0 28px rgba(0,255,208,.08);
}
.jv-composer .send{
  border:0;cursor:pointer;padding:13px 15px;font-family:var(--jv-font);font-weight:800;
  letter-spacing:.08em;color:#021014;
  background:linear-gradient(160deg,#b8fff5,#00e0b8 55%,#00a98a);
  clip-path:polygon(9px 0,100% 0,100% calc(100% - 9px),calc(100% - 9px) 100%,0 100%,0 9px);
  box-shadow:0 0 24px rgba(0,255,208,.4);
  transition:transform .15s, box-shadow .15s;
}
.jv-composer .send:hover{transform:translateY(-1px);box-shadow:0 0 32px rgba(0,255,208,.55)}
.jv-composer .send:disabled{opacity:.55;cursor:wait;transform:none}
/* 自动朗读开关（🔔 开 / 🔇 关）：放在输入框左侧。
   故意不复用 .jv-topline 里 #jv-voice 的样式 —— 顶栏在矮屏（max-height:560px）
   和软键盘态会被 display:none，而「太吵了想静音」恰好是那时候最需要点得到的。
   高度用 align-self:stretch 跟着 textarea 走（桌面 56px / 手机 46px），
   所以加这个按钮不会把 composer 撑高——几何实测必须和以前一致。 */
.jv-composer .jv-mute{
  flex:none;align-self:stretch;width:44px;padding:0;cursor:pointer;font-size:16px;line-height:1;
  border:1px solid rgba(0,255,208,.4);background:rgba(0,255,208,.08);color:var(--jv-ink);
  clip-path:polygon(8px 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%,0 8px);
  transition:background .15s, border-color .15s, transform .15s;
}
.jv-composer .jv-mute:hover{background:rgba(0,255,208,.18)}
.jv-composer .jv-mute:active{transform:scale(.95)}
.jv-composer .jv-mute.off{
  border-color:rgba(255,255,255,.22);background:rgba(255,255,255,.05);color:rgba(200,255,245,.5);
}

body.jarvis-open .back-to-top{right:22px;bottom:28px}

@media (max-width:720px){
  #jarvis-switch .jv-sw-copy em{letter-spacing:.18em}
  #jarvis-switch .jv-sw-copy b{font-size:11px}
  #jarvis-switch{padding:5px 8px 5px 6px;gap:6px}
  #jarvis-switch .jv-sw-track{width:40px;height:22px}
  #jarvis-switch .jv-sw-knob{width:16px;height:16px}
  #jarvis-switch.on .jv-sw-knob{transform:translateX(18px)}
  #jarvis-fab{right:14px;bottom:84px;width:74px;height:74px}
  /* 注意：#jarvis-dock 的 bottom / max-height 一律走 --jv-dock-gap（见文件末尾的手机段），
     这里绝不能再写死的 bottom，否则会覆盖掉「键盘遮挡补偿」的 calc()。 */
  #jarvis-fx .chrome{padding:0 20px;font-size:9px}
  #jarvis-fx .radar,#jarvis-fx .telemetry{display:none}
}
@media (prefers-reduced-motion:reduce){
  #jarvis-fab .jv-fab-rings,#jarvis-fab .jv-fab-rings::before,#jarvis-fab .jv-fab-rings::after,
  #jarvis-fab.breathe .jv-fab-core,#jarvis-fab.breathe .jv-fab-pulse,#jarvis-fab.breathe .jv-fab-tag,
  #jarvis-intro .jv-intro-grid,#jarvis-intro .jv-intro-warp,#jarvis-intro .jv-intro-tag,
  #jarvis-fx .beam,#jarvis-fx .scanline,#jarvis-fx .radar::before,#jarvis-dock.open::after,
  body.jarvis-open::before,#jarvis-intro::before,#jarvis-intro::after{animation:none !important}
  #jarvis-dock,#jarvis-fab{transition:none !important}
}

/* ===================================================================
   手机 / 低端机降级（脚本会自动在 <html> <body> 上打 .jv-lite）
   要治的「手机端界面一直闪」，根源全是「每帧重绘」：
   ① backdrop-filter + 常驻动画压在它上面（#jarvis-dock::after 扫描线每帧都要
      重新采样毛玻璃背景）
   ② box-shadow / filter:drop-shadow 关键帧：不在合成器上，只能逐帧重绘
   ③ 全屏 mix-blend-mode：固定层反复整屏重组
   ④ 全屏高斯模糊层（.jv-intro-warp 是 blur(28px) 全屏旋转）
   ⑤ 输入框 font-size<16px：iOS 聚焦时会整页放大，固定层跟着跳
   =================================================================== */
.jv-lite #jarvis-switch,
.jv-lite #jarvis-switch.nav-jarvis-switch,
.jv-lite #jarvis-intro,
.jv-lite #jarvis-dock{
  backdrop-filter:none !important;
  -webkit-backdrop-filter:none !important;
}
/* 去掉毛玻璃后用实心渐变顶上，观感不变但不再逐帧采样背景 */
.jv-lite #jarvis-switch,
.jv-lite #jarvis-switch.nav-jarvis-switch{
  background:linear-gradient(135deg,rgba(0,255,208,.14),rgba(2,14,20,.94));
}
.jv-lite #jarvis-intro{
  background:
    radial-gradient(ellipse 120% 80% at 50% 40%, rgba(0,255,208,.16), transparent 58%),
    radial-gradient(circle at 50% 50%, rgba(2,20,28,.96) 0%, rgba(0,4,8,.99) 100%);
}
.jv-lite #jarvis-dock{background:linear-gradient(180deg,#04141c 0%,#01070c 100%)}
/* 混合模式一律退回普通合成 */
.jv-lite body.jarvis-open::before,
.jv-lite #jarvis-fx .hex,
.jv-lite #jarvis-dock::before,
.jv-lite #jarvis-fab .jv-fab-core i{mix-blend-mode:normal}
.jv-lite #jarvis-dock::before{opacity:.3}
/* 大面积的装饰图层直接不画 */
.jv-lite #jarvis-intro .jv-intro-warp,
.jv-lite #jarvis-fx .hex,
.jv-lite #jarvis-fx .radar,
.jv-lite #jarvis-fx .beam,
.jv-lite #jarvis-fx .scanline,
.jv-lite #jarvis-fx .telemetry,
.jv-lite #jarvis-fx .sparks{display:none !important}
/* 过场与常驻特效：全部静止（保留静态造型，不再逐帧动） */
.jv-lite #jarvis-intro *,
.jv-lite #jarvis-fx *,
.jv-lite #jarvis-intro::before,
.jv-lite #jarvis-intro::after,
.jv-lite #jarvis-dock.open::after,
.jv-lite body.jarvis-open::before,
.jv-lite .jv-eq span{animation:none !important}
.jv-lite #jarvis-intro::before{opacity:.45}
.jv-lite #jarvis-dock.open::after{opacity:.5;top:0}
.jv-lite #jarvis-fx .corner{filter:none}
.jv-lite #jarvis-fx .chrome .pulse{opacity:.9}
/* 悬浮球呼吸：换成 transform 缩放（纯合成，零重绘），脉冲光圈同理 */
.jv-lite #jarvis-fab.breathe .jv-fab-core,
.jv-lite #jarvis-fab.on .jv-fab-core,
.jv-lite #jarvis-fab.on.breathe .jv-fab-core{
  animation:jvLiteBreath 3.2s ease-in-out infinite !important;
  box-shadow:0 0 0 1px rgba(0,255,208,.75), 0 0 26px rgba(0,255,208,.5), 0 12px 26px rgba(0,0,0,.42) !important;
}
@keyframes jvLiteBreath{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}
.jv-lite #jarvis-fab.breathe .jv-fab-pulse{animation:none !important;opacity:.45}
.jv-lite #jarvis-fab.breathe .jv-fab-tag{animation:none !important;opacity:.92}
.jv-lite .jv-face-wrap::before,
.jv-lite .jv-face-wrap::after{animation:none !important}
.jv-lite .jv-face.speaking{animation:jvLiteBreath .9s ease-in-out infinite}
/* 悬浮球外圈：保留旋转（纯 transform，很便宜），去掉逐帧重绘的 drop-shadow 呼吸 */
.jv-lite #jarvis-fab.breathe .jv-fab-rings{animation:jvOrbit 4s linear infinite !important;filter:none}
/* 进度条：动画被停掉后要补成「已走完」的状态，否则宽度停在 0 会看不见 */
.jv-lite #jarvis-intro .jv-intro-bar i{width:100%}
/* 图层提升：各固定层互不牵连，避免一次小变化触发整页重绘 */
.jv-lite #jarvis-intro,
.jv-lite #jarvis-fx,
.jv-lite #jarvis-dock,
.jv-lite #jarvis-fab{
  transform:translateZ(0);
  backface-visibility:hidden;
  contain:layout style;
}
.jv-lite #jarvis-dock{will-change:auto}
.jv-lite body.jarvis-armed:not(.jarvis-open)::before{
  background:radial-gradient(560px 320px at 92% 88%, rgba(0,255,208,.1), transparent 62%);
}

/* 手机端排版：16px 输入框（防 iOS 聚焦整页放大）、给软键盘留高度、独立滚动 */
@media (max-width:860px){
  #jarvis-dock{
    left:10px;right:10px;width:auto;
    --jv-dock-gap:calc(132px + env(safe-area-inset-bottom, 0px));
    max-height:min(58vh, 540px);
    max-height:max(180px, min(calc(100dvh - var(--jv-dock-gap) - var(--jv-kb, 0px) - 18px), 540px));
    overscroll-behavior:contain;
  }
  #jarvis-dock .jv-thread{min-height:0;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
  #jarvis-dock .jv-meta h3{font-size:20px}
  #jarvis-dock .jv-face-wrap,#jarvis-dock .jv-face{width:56px;height:56px}
  #jarvis-dock .jv-composer textarea{min-height:46px;font-size:16px}
  #jarvis-dock .jv-bubble{font-size:15px}
  #jarvis-fab{right:14px;bottom:calc(76px + env(safe-area-inset-bottom, 0px))}
  .jv-topline{padding:9px 14px 0}
}

/* 矮屏（手机横屏、小屏机）：固定块压到最小，把有限的高度留给输入框与对话区。
   软键盘那一种「矮」媒体查询看不见（布局视口高度没变），由 jarvis.js 打 .jv-kb 顶替。 */
@media (max-height:560px){
  #jarvis-dock .jv-topline{display:none}
  #jarvis-dock .jv-head{padding:6px 12px}
  #jarvis-dock .jv-face-wrap{display:none}
  #jarvis-dock .jv-meta .tag{display:none}
  #jarvis-dock .jv-meta h3{font-size:17px;margin:0}
  /* 对话区自身的内边距也是「压不下去的高度」，矮屏一并收窄 */
  #jarvis-dock .jv-thread{padding:10px 12px;gap:8px}
  /* 快捷问改成横向一行（不换行），高度就固定了，不会再长到 90px 把输入框挤出去 */
  #jarvis-dock .jv-chips{padding:0 12px 8px;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch}
  #jarvis-dock .jv-chips button{flex:none}
  #jarvis-dock .jv-composer{padding:0 12px 10px}
  #jarvis-dock .jv-composer textarea{min-height:40px;max-height:72px;padding:8px 10px;font-size:16px}
  #jarvis-dock .jv-composer .send{padding:11px 13px}
  #jarvis-dock .jv-composer .jv-mute{width:38px;font-size:15px}
}
/* 软键盘顶上来（jarvis.js 打 .jv-kb）：与矮屏同一套压缩，另加两条——
   ① 底部本来就该贴着键盘，不用再留 132px 去躲悬浮球/底部导航，省下的高度全给对话区；
   ② 快捷问保留但只占一行，输入时还能点。 */
.jv-kb #jarvis-dock{--jv-dock-gap:12px}
.jv-kb #jarvis-dock .jv-topline{display:none}
.jv-kb #jarvis-dock .jv-head{padding:6px 12px}
.jv-kb #jarvis-dock .jv-face-wrap{display:none}
.jv-kb #jarvis-dock .jv-meta .tag{display:none}
.jv-kb #jarvis-dock .jv-meta h3{font-size:17px;margin:0}
.jv-kb #jarvis-dock .jv-thread{padding:10px 12px;gap:8px}
.jv-kb #jarvis-dock .jv-chips{padding:0 12px 8px;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch}
.jv-kb #jarvis-dock .jv-chips button{flex:none}
.jv-kb #jarvis-dock .jv-composer{padding:0 12px 10px}
.jv-kb #jarvis-dock .jv-composer textarea{min-height:40px;max-height:64px;padding:8px 10px;font-size:16px}
.jv-kb #jarvis-dock .jv-composer .jv-mute{width:38px;font-size:15px}
