 * reduced-motion 由上方全局规则兜底;Mascot 组件的 JS 生命循环
 * (眨眼/瞳孔追踪)自行检测 usePrefersReducedMotion 关闭。 */
/* 点击只落在角色涂色区(SVG 透明角落不挡宿主交互——地图球/正文选区) */
.cp-mascot { pointer-events: none; cursor: default; overflow: visible; /* v0.18 旋转/抬臂越界不裁剪 */ }
.cp-mascot * { pointer-events: visiblePainted; }

/* 悬浮生命:整机缓浮 + 尾焰闪烁 + 天线辉光 */
.cp-bot { transform-box: fill-box; transform-origin: 50% 90%; animation: cp-bob 3.4s ease-in-out infinite alternate; }
@keyframes cp-bob { from { transform: translateY(0); } to { transform: translateY(-5px); } }
.cp-thrust { transform-box: fill-box; transform-origin: center; animation: cp-flick 0.38s ease-in-out infinite alternate; }
@keyframes cp-flick { from { transform: scaleY(1); } to { transform: scaleY(0.72); } }
.cp-ant-glow { animation: cp-glow 2.2s ease-in-out infinite; }
@keyframes cp-glow { 0%, 100% { opacity: 0.15; } 50% { opacity: 0.4; } }

/* 姿势:hop(庆祝跳)/punch(答对冲拳)/oops(答错摊手鼓励)/lean(思考·倾听)/doze(打盹) */
.cp-pose-hop .cp-bot { animation: cp-hop 0.9s cubic-bezier(0.3, 1.4, 0.5, 1) 1, cp-bob 3.4s ease-in-out 0.95s infinite alternate; }
@keyframes cp-hop {
  0% { transform: none; }
  18% { transform: translateY(2px) scale(1.05, 0.92); }
  45% { transform: translateY(-16px) scale(0.96, 1.07); }
  75% { transform: translateY(0) scale(1.04, 0.95); }
  100% { transform: none; }
}
.cp-pose-punch .cp-armR { transform-box: fill-box; transform-origin: 30% 20%; animation: cp-punch 0.5s cubic-bezier(0.2, 1.6, 0.4, 1) 1; }
@keyframes cp-punch { 0% { transform: rotate(0deg); } 35% { transform: rotate(-72deg); } 100% { transform: rotate(0deg); } }
.cp-pose-punch .cp-bot { animation: cp-tilt 0.5s ease-out 1, cp-bob 3.4s ease-in-out 0.55s infinite alternate; }
@keyframes cp-tilt { 0% { transform: none; } 30% { transform: rotate(-4deg); } 100% { transform: none; } }
.cp-pose-oops .cp-head { transform-box: fill-box; transform-origin: 50% 95%; animation: cp-oops-head 0.8s ease-in-out 1; }
.cp-pose-oops .cp-armL { transform-box: fill-box; transform-origin: 70% 15%; animation: cp-oops-armL 0.8s ease-in-out 1; }
.cp-pose-oops .cp-armR { transform-box: fill-box; transform-origin: 30% 15%; animation: cp-oops-armR 0.8s ease-in-out 1; }
@keyframes cp-oops-head { 0%, 100% { transform: rotate(0deg); } 40% { transform: rotate(6deg); } 70% { transform: rotate(3deg); } }
@keyframes cp-oops-armL { 0%, 100% { transform: rotate(0deg); } 40% { transform: rotate(24deg); } }
@keyframes cp-oops-armR { 0%, 100% { transform: rotate(0deg); } 40% { transform: rotate(-24deg); } }
/* 思考姿势(流式回答/卡点指向,v0.22.1):手托下巴+头微倾慢摆。旧版整机
   歪 -5° 曾被误读成"飞歪了"——身体现在保持水平,悬浮浮动(cp-bob)照常;
   头部倾斜以颈为轴,与整机倾角(飞行 banking)语义分开。 */
.cp-pose-thinking .cp-armL { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(108deg); }
.cp-pose-thinking .cp-head { transform-box: fill-box; transform-origin: 50% 95%; transform: rotate(-7deg); animation: cp-think-head 3.2s ease-in-out infinite alternate; }
@keyframes cp-think-head { from { transform: rotate(-7deg); } to { transform: rotate(-3deg); } }
.cp-pose-lean-right .cp-bot { transform: rotate(5deg); animation: none; }
.cp-pose-doze .cp-bot { transform: translateY(4px) rotate(2.5deg); animation: cp-breath 4.5s ease-in-out infinite alternate; }
@keyframes cp-breath {
  from { transform: translateY(4px) rotate(2.5deg) scale(1, 1); }
  to { transform: translateY(5px) rotate(2.5deg) scale(1.015, 0.985); }
}

/* 表情附属动画:汗滴/声波/zzz */
.cp-sweat { animation: cp-drip 1.1s ease-in-out infinite; }
@keyframes cp-drip { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(3px); } }
.cp-waves path { animation: cp-wave 1s ease-in-out infinite; }
.cp-waves path:nth-child(2) { animation-delay: 0.15s; }
.cp-waves path:nth-child(3) { animation-delay: 0.3s; }
@keyframes cp-wave { 0%, 100% { opacity: 0.25; } 50% { opacity: 1; } }
.cp-zzz path { animation: cp-z 2.4s ease-in-out infinite; }
.cp-zzz path:nth-child(2) { animation-delay: 0.8s; }
.cp-zzz path:nth-child(3) { animation-delay: 1.6s; }
@keyframes cp-z { 0% { opacity: 0; transform: translate(2px, 2px); } 30% { opacity: 1; } 100% { opacity: 0; transform: translate(-3px, -6px); } }

/* 口型弹性 + 问候气泡 */
.cp-mouth { transition: transform 0.06s linear; }
.cp-bubble { animation: cp-bubble-in 0.18s cubic-bezier(0.3, 1.4, 0.5, 1) 1; }
@keyframes cp-bubble-in { from { opacity: 0; transform: translateY(4px) scale(0.9); } to { opacity: 1; transform: none; } }

/* ---- v2 动效升级 ---- */
/* 打字姿势(Bongo Cat 式待击):双臂对称向外微抬,随时拍下;逐键按压由 WAAPI additive 叠加 */
.cp-pose-typing .cp-armL { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(12deg); }
.cp-pose-typing .cp-armR { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(-12deg); }
/* 天线滞后弹簧:相位落后整机悬浮 0.35s,移动时天线「拖尾」 */
.cp-antenna { transform-box: fill-box; transform-origin: 80% 96%; animation: cp-ant-sway 3.4s ease-in-out -0.35s infinite alternate; }
@keyframes cp-ant-sway { from { transform: rotate(-2deg); } to { transform: rotate(2deg); } }
/* 表情切换弹跳:五官组按表情 key 重挂载,0.16s 缩放弹入盖住硬切 */
.cp-face-pop { transform-box: fill-box; transform-origin: center; animation: cp-pop 0.16s cubic-bezier(0.2, 1.6, 0.4, 1) 1; }
@keyframes cp-pop { from { transform: scale(0.9); } to { transform: scale(1); } }
/* 朗读说话:头部随口型微弹(整机 bob 之外的次级运动) */
.cp-expr-talking .cp-head { transform-box: fill-box; transform-origin: 50% 100%; animation: cp-talk-bob 0.55s ease-in-out infinite alternate; }
@keyframes cp-talk-bob { from { transform: translateY(0); } to { transform: translateY(-1.4px); } }
/* 听写声波弧:初态隐藏,首帧由 rAF 按麦克风包络点亮/缩放 */
.cp-waves-wrap { opacity: 0; }

/* ---- v3 单生物(跨栏连续行动) ---- */
/* 根层覆盖层:点击只落在角色涂色区(svg 默认 visiblePainted),不挡底下的 UI */
.cp-creature { pointer-events: none; transition: opacity 0.45s ease; }
.cp-creature > svg { pointer-events: visiblePainted; }
/* 纱帘后(待机隐匿):半透明+轻模糊,像躲在透明纱帘后面;点击即唤醒 */
.cp-veil { opacity: 0.3; filter: blur(1px) saturate(0.72); transition: opacity 0.6s ease, filter 0.6s ease; }
/* v0.28 左栏纱帘分档:地图锁定深色,0.3 透明度叠加夜空后待机点几乎不可见
   (实测全屏找不到他)——rail 深底少淡出少模糊,保住"待机"示意的同时他还在
   原地看得见;内容栏浅底维持 0.3 不变(浅底上 0.3 已可辨) */
.cp-creature[data-zone="rail"].cp-veil { opacity: 0.55; filter: blur(0.5px) saturate(0.85); }
/* v11.5 锚点全部候选都压句(极端窄屏):半透明让出高亮文字可读性 */
.cp-occluding { opacity: 0.45; transition: opacity 0.3s ease; }
/* v13 标题栏栖息:与栏内可交互元素(按钮/输入)重叠时半透明+完全点击穿透,
   不遮按钮;离开重叠区自动恢复(渲染层 rAF 按矩形重叠切换) */
.cp-titlebar-dim { opacity: 0.25; transition: opacity 0.25s ease; }
.cp-titlebar-dim > svg { pointer-events: none; }
/* 飞行姿势(跨栏 transit / 被拍翻滚恢复):双臂后掠,倾角由包装层 rotate 负责 */
.cp-pose-flying .cp-armL { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(26deg); }
.cp-pose-flying .cp-armR { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(-26deg); }
/* 记笔记姿势:右臂快速小幅书写运动(划线加笔记触发) */
.cp-pose-writing .cp-armR { transform-box: fill-box; transform-origin: 50% 12%; animation: cp-write 0.42s ease-in-out infinite; }
@keyframes cp-write {
  0% { transform: rotate(-4deg) translateY(0); }
  50% { transform: rotate(8deg) translateY(-1.5px); }
  100% { transform: rotate(-4deg) translateY(0); }
}
/* 挥手姿势(打招呼/poke 花样):右臂高举左右摆动 */
.cp-pose-wave .cp-armR { transform-box: fill-box; transform-origin: 50% 12%; animation: cp-wave-arm 0.38s ease-in-out 3; transform: rotate(-108deg); }
@keyframes cp-wave-arm {
  0% { transform: rotate(-96deg); }
  50% { transform: rotate(-124deg); }
  100% { transform: rotate(-96deg); }
}
/* 转圈姿势(poke 花样):整机原地旋转一圈(内组转,不碰包装层的物理倾角) */
.cp-pose-spin .cp-bot { transform-box: fill-box; transform-origin: 50% 60%; animation: cp-spin 0.75s cubic-bezier(0.45, 0.1, 0.3, 1) 1; }
@keyframes cp-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
/* 朗读指句姿势(v6):生物站在句子旁边,抬起一侧手臂水平指向文字。
   方向约定(与挥手 armR -108° 同款):SVG y 向下,正角=屏幕顺时针;
   下垂手臂 +92° 从 6 点扫向 9 点=向左外伸,−92° 从 6 点扫向 3 点=向右外伸。
   armL 在屏幕左侧,+92° 向左外伸(point);armR −92° 向右外伸(pointr)。
   符号写反会让手臂横穿身体从脸前掠过(藏在头后面,实测踩过)。 */
/* 纸偶 idle 呼吸(float):整身微缩放,部件一起动不产生头身分离;盘在呼吸层外 */
.cp-pose-float .cp-puppet-figure { transform-box: fill-box; transform-origin: 50% 100%; animation: cp-puppet-breath 3.2s ease-in-out infinite alternate; }
@keyframes cp-puppet-breath { from { transform: scale(1, 1); } to { transform: scale(1.015, 0.988); } }
.cp-pose-point .cp-armL { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(92deg); }
.cp-pose-point .cp-bot { transform-box: fill-box; transform-origin: 50% 62%; transform: rotate(-3deg); }
.cp-pose-pointr .cp-armR { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(-92deg); }
.cp-pose-pointr .cp-bot { transform-box: fill-box; transform-origin: 50% 62%; transform: rotate(3deg); }
/* v11.5 竖向指向:生物在句子下方→抬臂近乎竖直指上;在句子上方→手臂外展斜下指 */
.cp-pose-pointu .cp-armL { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(172deg); }
.cp-pose-pointu .cp-bot { transform-box: fill-box; transform-origin: 50% 62%; transform: rotate(-3deg); }
.cp-pose-pointd .cp-armR { transform-box: fill-box; transform-origin: 50% 12%; transform: rotate(-38deg); }
.cp-pose-pointd .cp-bot { transform-box: fill-box; transform-origin: 50% 62%; transform: rotate(3deg); }
/* 朗读句高亮(karaoke):accent 蓝轻底,不遮字;跨行句子逐行都着色(clone)。 */
.cp-reading-mark {
  background-color: rgba(28, 176, 246, 0.16);
  border-radius: 4px;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
  transition: background-color 0.25s ease;
}
/* 星星眼(考试通过/连击):高频闪烁,喜悦感翻倍 */
.cp-star-tw { transform-box: fill-box; transform-origin: center; animation: cp-star-tw 0.62s ease-in-out infinite alternate; }
@keyframes cp-star-tw { from { transform: scale(0.82); opacity: 0.75; } to { transform: scale(1.12); opacity: 1; } }
/* 睡眠呼吸:打盹时整机缓缓起伏,不是一张静止贴图 */
.cp-expr-sleeping .cp-bot { transform-box: fill-box; transform-origin: 50% 100%; animation: cp-sleep-breath 2.8s ease-in-out infinite alternate; }
@keyframes cp-sleep-breath { from { transform: scale(1, 1); } to { transform: scale(1.015, 0.985); } }
/* ---- v4 细化 ---- */
/* v0.18 整身投影:drop-shadow 跟随剪影(自动随抬臂/旋转/压缩变,模糊抽象零逐帧
   运算——纯 transform 移动走合成器缓存);偏移右下=左上光源方向。
   左栏在天空无地面 → 无影。椭圆地影(GroundShadow)已删。 */
[data-zone="chat"] .cp-mascot,
[data-zone="notebook"] .cp-mascot {
  filter: drop-shadow(4px 6px 5px rgb(15 12 20 / 0.32));
}
/* 喷焰:速度驱动(推进质感,不再是幽灵漂浮)——Creature rAF 直写
   --cp-speed(0..1)与 --cp-thrust-deg(焰朝向=运动反方向),CSS 零 JS 侧代价 */
.cp-creature { --cp-speed: 0; --cp-thrust-deg: 90deg; }
.cp-thruster {
  opacity: 0;
  transform-box: view-box;
  transform-origin: 100px 135px;
  rotate: var(--cp-thrust-deg, 90deg);
  /* v0.18 焰长随速度伸缩:静止缩半贴身,全速完全展开(粒子已推出身形半径外) */
  scale: calc(0.5 + 0.6 * min(1, var(--cp-speed, 0)));
  transition: opacity 0.16s linear;
}
.cp-creature .cp-thruster { opacity: calc(min(1, var(--cp-speed, 0)) * 0.95); }
/* v8 跨栏飞行姿势:焰更长更亮+脉动(动画接管 opacity) */
.cp-pose-flying .cp-thruster circle { r: 6.4; }
.cp-pose-flying .cp-thruster circle:nth-child(2) { r: 8; }
.cp-pose-flying .cp-thruster { scale: 1.15; filter: drop-shadow(0 0 6px rgba(53, 224, 232, 0.8)); animation: cp-thruster-pulse 0.28s ease-in-out infinite alternate; }
@keyframes cp-thruster-pulse { from { opacity: 0.85; } to { opacity: 1; } }
/* v8 朗读句高亮(CSS Custom Highlight API,零 DOM 改动) */
::highlight(cp-reading) { background-color: rgba(28, 176, 246, 0.2); }
/* v0.35.1 持久画线(Highlight API 通道;与旧 <mark> 通道同观感:绿下划线无底色)。
   ::highlight() 只支持 color/background/text-decoration/text-shadow 系,下划线
   用 text-decoration 实现(border 方案是 <mark> 通道专属)。 */
::highlight(cp-user-note) {
  color: inherit;
  background-color: transparent;
  text-decoration-line: underline;
  text-decoration-color: rgb(34, 197, 94);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
/* 溯源跳转闪烁:淡黄底 + 加粗绿线,1.5s 后由 JS 撤注册 */
::highlight(cp-user-note-flash) {
  background-color: rgba(250, 204, 21, 0.35);
  text-decoration-line: underline;
  text-decoration-color: rgb(34, 197, 94);
  text-decoration-thickness: 4px;
}
/* v7 航灯:左红右绿导航灯(航空惯例),常态慢呼吸,飞行/起飞时急闪交错 */
.cp-beacons circle { fill: currentColor; opacity: 0.55; }
/* v10 胸屏键入字符:打字时身体圆屏显示按键,弹入定格 */
.cp-screen-key {
  font: 700 15px ui-monospace, "Cascadia Mono", Consolas, monospace;
  fill: #0e2a38;
  paint-order: stroke;
  stroke: rgba(53, 224, 232, 0.85);
  stroke-width: 2.5px;
  animation: cp-key-pop 0.18s cubic-bezier(0.2, 1.6, 0.4, 1);
  pointer-events: none;
}
@keyframes cp-key-pop {
  0% { opacity: 0; transform: scale(0.4); }
  100% { opacity: 1; transform: scale(1); }
}
.cp-screen-key { transform-box: fill-box; transform-origin: center; }
/* v0.18 键盘反馈三件套:整机击键 squash / 胸屏信号面板 / Enter·退格闪发 */
.cp-keypress .cp-mascot {
  transform-box: fill-box;
  transform-origin: 50% 92%;
  animation: cp-key-squash 0.15s ease-out;
}
@keyframes cp-key-squash {
  0% { transform: scaleY(1); }
  35% { transform: scaleY(0.965) scaleX(1.02); }
  100% { transform: scaleY(1); }
}
.cp-scope-bar {
  fill: #0e2a38; /* 与听写声波同族(胸屏亮底上的深色信号条) */
  opacity: 0.8;
  transform-box: fill-box;
  transform-origin: 50% 100%;
  animation: cp-scope-pulse 0.5s ease-out backwards;
}
@keyframes cp-scope-pulse {
  from { transform: scaleY(1.9); opacity: 1; }
  to { transform: scaleY(1); opacity: 0.55; }
}
.cp-screen-key-flash {
  animation: cp-key-pop 0.18s cubic-bezier(0.2, 1.6, 0.4, 1), cp-key-flash 0.55s ease-out forwards;
}
@keyframes cp-key-flash {
  0%, 55% { opacity: 1; }
  100% { opacity: 0; }
}
/* v11 听写胸屏波形:五条声纹错相跳动(胸屏是亮底,用深色条) */
.cp-screen-wave rect {
  fill: #0e2a38;
  opacity: 0.88;
  transform-box: fill-box;
  transform-origin: center;
  animation: cp-wave-bar 0.9s ease-in-out infinite;
}
.cp-screen-wave rect:nth-child(2),
.cp-screen-wave rect:nth-child(4) { animation-delay: 0.13s; }
.cp-screen-wave rect:nth-child(3) { animation-delay: 0.26s; }
@keyframes cp-wave-bar {
  0%, 100% { transform: scaleY(0.35); }
  50% { transform: scaleY(1); }
}

/* v10 记笔记道具:本笔弹入,笔尖伏案写划 */
.cp-writing {
  animation: cp-notebook-in 0.28s cubic-bezier(0.2, 1.4, 0.4, 1);
  pointer-events: none;
}
@keyframes cp-notebook-in {
  0% { opacity: 0; transform: translateY(10px) scale(0.7); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}
.cp-writing { transform-box: fill-box; transform-origin: 50% 100%; }
.cp-pen {
  animation: cp-scribble 0.42s ease-in-out infinite alternate;
  transform-box: fill-box;
  transform-origin: 50% 90%;
}
@keyframes cp-scribble {
  from { transform: rotate(0deg) translate(0, 0); }
  to { transform: rotate(-5deg) translate(-1.5px, 1px); }
}

/* v11 勾销金勾:一笔划出 */
.cp-note-tick {
  stroke-dasharray: 26;
  stroke-dashoffset: 26;
  animation: cp-note-tick 0.36s cubic-bezier(0.3, 1.2, 0.4, 1) forwards;
}
@keyframes cp-note-tick {
  to { stroke-dashoffset: 0; }
}

/* v11 连对点燃:能量核金环呼吸脉动 */
.cp-core-lit {
  opacity: 0.85;
  stroke-dasharray: 8 6;
  animation: cp-core-lit 0.9s ease-in-out infinite alternate;
}
@keyframes cp-core-lit {
  from { opacity: 0.45; stroke-width: 2.5; }
  to { opacity: 1; stroke-width: 3.6; }
}

/* v10 肩甲(R-06 式宽肩,全形态共享) */
.cp-shoulders { pointer-events: none; }

.cp-beacon-l { color: #ff4b4b; animation: cp-beacon 2.6s ease-in-out infinite; }
.cp-beacon-r { color: #58cc02; animation: cp-beacon 2.6s ease-in-out 1.3s infinite; }
.cp-pose-flying .cp-beacon-l, .cp-takeoff .cp-beacon-l { animation-duration: 0.62s; }
.cp-pose-flying .cp-beacon-r, .cp-takeoff .cp-beacon-r { animation-duration: 0.62s; }
@keyframes cp-beacon { 0%, 100% { opacity: 0.18; } 50% { opacity: 1; } }
/* v7 起飞喷焰增强:蓄力弹射窗口里喷焰更长更亮 */
.cp-takeoff .cp-thruster { opacity: 1; }
.cp-takeoff .cp-thruster circle { animation-duration: 0.12s; r: 6; }
.cp-pose-flying .cp-thruster { opacity: 1; }
.cp-thruster circle { fill: #ffc800; }
.cp-thruster circle:nth-child(2) { fill: #ff9a3d; }
.cp-pose-flying .cp-thruster circle { animation: cp-thruster 0.22s ease-in-out infinite alternate; }
.cp-pose-flying .cp-thruster circle:nth-child(2) { animation-delay: 0.08s; }
.cp-pose-flying .cp-thruster circle:nth-child(3) { animation-delay: 0.14s; }
@keyframes cp-thruster { from { transform: translateY(0) scale(1); opacity: 1; } to { transform: translateY(4px) scale(0.55); opacity: 0.55; } }
.cp-thruster circle { transform-box: fill-box; transform-origin: center; }
/* 等级徽标:高等级金光环缓慢旋转;皇冠轻微悬浮 */
.cp-halo { animation: cp-halo-spin 7s linear infinite; transform-box: fill-box; transform-origin: center; }
@keyframes cp-halo-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
.cp-crown-badge { animation: cp-crown-float 2.4s ease-in-out infinite alternate; transform-box: fill-box; transform-origin: center; }
@keyframes cp-crown-float { from { transform: translateY(0); } to { transform: translateY(-1.6px); } }
/* 抓取中:抓取光标 + 轻微挣扎抖动 */
.cp-creature > svg { cursor: grab; }
.cp-grabbed { cursor: grabbing; }
.cp-grabbed > svg { cursor: grabbing; }
.cp-grabbed .cp-bot { animation: cp-struggle 0.3s ease-in-out infinite; transform-box: fill-box; transform-origin: center; }
@keyframes cp-struggle { from { transform: rotate(-2.5deg); } to { transform: rotate(2.5deg); } }
/* 雨天抖水:快速横颤 */
.cp-shiver { animation: cp-shiver 0.09s linear 5; }
@keyframes cp-shiver { from { margin-left: -2px; } to { margin-left: 2px; } }
/* 鼓脸生气:两颊一鼓一鼓 */
.cp-huffy { transform-box: fill-box; transform-origin: center; animation: cp-huffy-puff 0.8s ease-in-out infinite alternate; }
@keyframes cp-huffy-puff { from { transform: scale(0.85); } to { transform: scale(1.1); } }
@media (prefers-reduced-motion: reduce) {
  .cp-pose-writing .cp-armR { animation: none; transform: rotate(2deg); }
  .cp-pose-thinking .cp-head { animation: none; }
  .cp-pose-wave .cp-armR { animation: none; }
  .cp-pose-spin .cp-bot { animation: none; }
  .cp-star-tw { animation: none; }
  .cp-expr-sleeping .cp-bot { animation: none; }
  .cp-veil { filter: none; }
  .cp-thruster, .cp-pose-flying .cp-thruster { opacity: 0; }
  .cp-beacons circle { animation: none; opacity: 0.35; }
  .cp-pose-flying .cp-thruster circle { animation: none; }
  .cp-halo, .cp-crown-badge, .cp-grabbed .cp-bot, .cp-shiver, .cp-huffy { animation: none; }
}

/* ---------- M2 自定义纸偶(SPEC §16):第 6 形态 custom,作用域全限 .cp-form-custom ----------
   载具 v2.2(2026-09-11):机械飞行平台 + 五款形态主题换装(manifest.vehicle →
   veh-themes.ts 调色,缺省 silver 兼容旧包)。颜色全部内联 TSX(渐变/填充/描边),
   本文件只持描边宽与动画/透明度 —— 换主题零 CSS 分支。 */
.cp-veh .cp-veh-top { stroke-width: 1.5; }
.cp-veh .cp-veh-specular { fill: #ffffff; }
.cp-veh .cp-veh-wall { stroke-width: 1; }
.cp-veh .cp-veh-glow { opacity: 0.16; }
.cp-veh .cp-veh-energy-fill { fill: #58cc02; }
.cp-veh .cp-veh-port-bezel { stroke-width: 2.5; }
.cp-veh .cp-veh-nozzle-body { stroke-width: 1; }
.cp-veh .cp-veh-flame-outer { opacity: 0.55; }
.cp-veh .cp-veh-flame-core { opacity: 0.9; }
.cp-veh .cp-veh-flame { transform-box: fill-box; transform-origin: 50% 0; animation: cp-veh-burn 1.5s ease-in-out infinite alternate; }
.cp-veh .cp-veh-flame-core { animation-duration: 1.1s; }
@keyframes cp-veh-burn { from { transform: scaleY(0.72); opacity: 0.55; } to { transform: scaleY(1.12); opacity: 1; } }
/* 飞行/起飞:喷口加力——焰拉长变亮 */
.cp-pose-flying .cp-veh-flame, .cp-takeoff .cp-veh-flame {
  animation: cp-veh-blast 0.14s ease-in-out infinite alternate;
}
@keyframes cp-veh-blast { from { transform: scaleY(1.5); opacity: 0.9; } to { transform: scaleY(2.1); opacity: 1; } }
/* 壳层装饰按形态裁剪:航灯(左红右绿)与喷焰都假设火箭机身存在——五款内置形态
   贴着身体轮廓是"机灯",纸偶身体窄,灯悬在半空成了游离绿点(用户当脏东西)。 */
.cp-form-custom .cp-beacons, .cp-form-custom .cp-thruster { display: none; }
/* 胸屏内容搬家(载具 v2,2026-09-11):壳层胸屏元素坐标固定在 (100,135)(行为文件
   G1 零 diff 不可改)。Chromium 实测:独立 translate 在 g/circle 上 computed 有值
   但渲染不动,text/rect 可用——所以分两路:
   - 壳层装饰件(信号条组/听写波形/金环)对 custom 隐藏,载具自绘等价物
     (cp-veh-eq,按 expression/pose class 点亮,无数据依赖);
   - 唯一真实数据=击键字符(cp-screen-key 文字),text 的独立 translate 可用且与
     自身 pop/flash transform 动画合成 → 平移进仪表舱玻璃。 */
.cp-form-custom .cp-key-scope,
.cp-form-custom .cp-screen-wave,
.cp-form-custom .cp-core-lit { display: none; }
.cp-form-custom .cp-screen-key { translate: 0 52px; font-size: 12px; }
/* 载具自绘均衡器(listening/typing 时点亮):三根深色信号条落在亮底玻璃上 */
.cp-veh .cp-veh-eq { opacity: 0; }
.cp-expr-listening .cp-veh-eq,
.cp-pose-typing .cp-veh-eq { opacity: 1; }
.cp-form-custom .cp-veh-eq-bar {
  fill: #0e2a38;
  transform-box: fill-box;
  transform-origin: 50% 100%;
  animation: cp-veh-eq 0.9s ease-in-out infinite;
}
.cp-form-custom .cp-veh-eq-bar:nth-of-type(2) { animation-delay: 0.13s; }
.cp-form-custom .cp-veh-eq-bar:nth-of-type(3) { animation-delay: 0.26s; }
@keyframes cp-veh-eq {
  0%, 100% { transform: scaleY(0.45); }
  50% { transform: scaleY(1); }
}
/* rest 角补偿(SPEC §17.12):内置五形态臂恒竖直垂放(rest=90°),姿势固定角隐含
   该前提;纸偶臂 rest 由像素量测注入 --cp-rest,A-pose 任意夹角都按 目标−rest
   求差值。目标角 = 内置调校角的隐含目标(90+旋转):point 182°/pointr −2°/
   pointu 262°/pointd 52°/wave −18°±14°。var 缺省 90° = 与内置完全同行为。
   注意 cp-form-custom 与 cp-pose-* 同在 svg 根上——必须复合选择器(无空格),
   后代组合器永不命中(实测踩过:斜着指向,姿势走的仍是原固定角)。 */
.cp-form-custom.cp-pose-point .cp-armL { transform: rotate(calc(182deg - var(--cp-rest, 90deg))); }
.cp-form-custom.cp-pose-pointr .cp-armR { transform: rotate(calc(-2deg - var(--cp-rest, 90deg))); }
.cp-form-custom.cp-pose-pointu .cp-armL { transform: rotate(calc(262deg - var(--cp-rest, 90deg))); }
.cp-form-custom.cp-pose-pointd .cp-armR { transform: rotate(calc(52deg - var(--cp-rest, 90deg))); }
.cp-form-custom.cp-pose-wave .cp-armR {
  animation: cp-wave-arm-custom 0.38s ease-in-out 3;
  transform: rotate(calc(-18deg - var(--cp-rest, 90deg)));
}
@keyframes cp-wave-arm-custom {
  0%, 100% { transform: rotate(calc(-6deg - var(--cp-rest, 90deg))); }
  50% { transform: rotate(calc(-34deg - var(--cp-rest, 90deg))); }
}
.cp-form-custom .cp-disc { animation: cp-disc-float 3.4s ease-in-out infinite alternate; transform-box: fill-box; transform-origin: center; }
.cp-form-custom .cp-puppet-bot { animation: cp-puppet-hover 3.4s ease-in-out infinite alternate; transform-box: fill-box; transform-origin: 50% 62%; }
@keyframes cp-disc-float { from { transform: translateY(0) rotate(-1.2deg); } to { transform: translateY(-3px) rotate(1.2deg); } }
@keyframes cp-puppet-hover { from { transform: translateY(0); } to { transform: translateY(-2.5px); } }
@keyframes cp-disc-lamp { from { opacity: 0.4; } to { opacity: 1; } }
/* ---------- 载具机械臂(2026-09-12 用户拍板):飞行器长臂接管手臂动作 ----------
   refs.armL/armR 挂在 VehArms 臂组上,姿势 CSS(.cp-pose-*)与逐键 WAAPI 零接线
   落机械臂;纸偶 PNG 臂改挂 cp-puppet-arm* 私有类不再吃姿势(rest 补偿保留)。 */
.cp-veh-arm { transform-box: fill-box; transform-origin: 50% 12%; }
/* shimeji:载具+机械臂常驻(2026-09-12 三次拍板:bot 本就悬浮,脚下没平台没道理),
   仅爬墙/爬顶时收起(贴边攀爬时平台碍事)——由 shimeji-art 的 data-mode 驱动
   cp-veh-hide 类(wall/ceiling),淡出保留。 */
.cp-form-shimeji .cp-veh-mount { transition: opacity 0.35s ease; }
.cp-form-shimeji .cp-veh-mount.cp-veh-hide { opacity: 0; }
.cp-form-shimeji .cp-beacons, .cp-form-shimeji .cp-thruster { display: none; }
.cp-form-shimeji .cp-key-scope,
.cp-form-shimeji .cp-screen-wave,
.cp-form-shimeji .cp-core-lit { display: none; }
/* 击键字符入舱(与 custom 同链):胸屏位(100,135)→ 平台仪表舱玻璃(100,187) */
.cp-form-shimeji .cp-screen-key { translate: 0 52px; font-size: 12px; }

@media (prefers-reduced-motion: reduce) {
  .cp-form-custom .cp-disc, .cp-form-custom .cp-puppet-bot, .cp-form-custom .cp-disc-lamp { animation: none; }
  .cp-veh .cp-veh-flame { animation: none; opacity: 0.6; transform: scaleY(0.9); }
  .cp-pose-flying .cp-veh-flame, .cp-takeoff .cp-veh-flame { animation: none; transform: scaleY(1.6); }
