/* 生成文件：python3 -I design/server-ui/tools/sync_skins.py */
/* blob.css */
/* 团子皮肤。所有选择器都挂在 .blob 下，免得和别的皮肤串。 */

.blob {
  --talk: 0;
  --skin-hi: #ffd9b0;
  --skin-lo: #ff9f6b;
  --ink: #3b2a22;
}

.blob .skin-hi { stop-color: var(--skin-hi); transition: stop-color 0.6s; }
.blob .skin-lo { stop-color: var(--skin-lo); transition: stop-color 0.6s; }
.blob .shadow { fill: rgba(0, 0, 0, 0.12); }
.blob .cheek { fill: #ff7a7a; opacity: 0.35; }
.blob .glint { fill: #fff; }
.blob .eye-open ellipse { fill: var(--ink); }
.blob .eyes path, .blob .mouths path { fill: none; stroke: var(--ink); stroke-width: 3; stroke-linecap: round; }
.blob .mouth-open { fill: #6b2b2b; }
.blob .sweat { fill: #8fd3ff; opacity: 0; }
.blob .marker, .blob .zz, .blob .eye-happy, .blob .eye-closed, .blob .brows-sad,
.blob .mouth-open, .blob .mouth-flat, .blob .mouth-hoarse { display: none; }
.blob .zz text { font: 600 14px -apple-system, sans-serif; fill: #8a7cff; }

.blob .body-wrap { transform-origin: 85px 168px; }
.blob .body { transform-origin: 85px 168px; animation: blob-breathe 4.2s ease-in-out infinite; }
.blob .eyes { transform-origin: 85px 104px; transition: transform 0.08s; }
/* 看向鼠标：眼睛挪得多，嘴和腮红挪得少，像整张脸转过去 */
.blob .eye-open { transform: translate(calc(var(--gx, 0) * 9px), calc(var(--gy, 0) * 6px)); transition: transform 0.25s ease-out; }
.blob .mouths, .blob .cheek { transform: translate(calc(var(--gx, 0) * 6px), calc(var(--gy, 0) * 4px)); transition: transform 0.25s ease-out; }
.blob.blink .eyes { transform: scaleY(0.1); }

@keyframes blob-breathe {
  0%, 100% { transform: scale(1, 1); }
  50% { transform: scale(1.015, 0.985); }
}

/* 说话：嘴随音量开合，身体跟着轻微起伏 */
.blob[data-state="speaking"] .mouth-smile { display: none; }
.blob[data-state="speaking"] .mouth-open { display: inline; }
.blob[data-state="speaking"] .body {
  animation: none;
  transform: scale(calc(1 + var(--talk) * 0.025), calc(1 - var(--talk) * 0.02));
}

/* 干完：眼睛弯起来，弹一下 */
.blob[data-state="done"] .eye-open { display: none; }
.blob[data-state="done"] .eye-happy { display: inline; }
.blob[data-state="done"] .body-wrap { animation: blob-hop 0.9s ease-out 2; }
.blob[data-state="done"] .cheek { opacity: 0.6; }
@keyframes blob-hop {
  0%, 100% { transform: translateY(0) scale(1, 1); }
  30% { transform: translateY(-14px) scale(0.97, 1.04); }
  60% { transform: translateY(0) scale(1.05, 0.94); }
}

/* 失败：颜色变冷，往下塌，冒汗。挂着等人回来 */
.blob[data-state="failed"] { --skin-hi: #d6dde8; --skin-lo: #8d9db5; }
.blob[data-state="failed"] .body-wrap { transform: scale(1.04, 0.92); transition: transform 0.6s; }
.blob[data-state="failed"] .brows-sad { display: inline; }
.blob[data-state="failed"] .mouth-smile { display: none; }
.blob[data-state="failed"] .mouth-flat { display: inline; }
.blob[data-state="failed"] .sweat { opacity: 1; animation: blob-drip 2.4s ease-in infinite; }
.blob[data-state="failed"] .cheek { opacity: 0.1; }
@keyframes blob-drip {
  0% { transform: translateY(0); opacity: 1; }
  80% { transform: translateY(18px); opacity: 0; }
  100% { transform: translateY(18px); opacity: 0; }
}

/* 要你确认：头顶一个提示点在脉动，表示“我在等”，不做期待回答的脸 */
.blob[data-state="need_confirm"] .marker { display: inline; }
.blob[data-state="need_confirm"] .body-wrap { transform: translateY(-4px) scale(0.98, 1.03); transition: transform 0.5s; }
.blob .marker-dot { fill: #ff8a3d; }
.blob .marker-ring { fill: none; stroke: #ff8a3d; stroke-width: 2; transform-origin: 85px 22px; animation: blob-ping 1.8s ease-out infinite; }
@keyframes blob-ping {
  0% { transform: scale(0.6); opacity: 0.9; }
  100% { transform: scale(1.9); opacity: 0; }
}

/* 顺嘴提醒：点一下头 */
.blob[data-state="note"] .body-wrap { animation: blob-nod 0.7s ease-in-out 1; }
@keyframes blob-nod {
  0%, 100% { transform: rotate(0); }
  40% { transform: rotate(-5deg) translateY(3px); }
}

/* 收到：你回到了那个窗口，或者双击说了“知道了”。眯眼点两下头 */
.blob[data-state="ack"] .eye-open { display: none; }
.blob[data-state="ack"] .eye-happy { display: inline; }
.blob[data-state="ack"] .body-wrap { animation: blob-nod 0.6s ease-in-out 2; }

/* 静音：闭眼睡觉，看得出来是故意不出声，不是坏了 */
.blob[data-state="muted"] .eye-open { display: none; }
.blob[data-state="muted"] .eye-closed { display: inline; }
.blob[data-state="muted"] .zz { display: inline; }
.blob[data-state="muted"] .body { animation-duration: 6s; }
.blob[data-state="muted"] { --skin-hi: #f0d6c0; --skin-lo: #d39a7c; }
.blob .zz text { animation: blob-float 3s ease-in-out infinite; }
.blob .zz text:nth-child(2) { animation-delay: 1.5s; }
@keyframes blob-float {
  0% { transform: translateY(6px); opacity: 0; }
  50% { opacity: 1; }
  100% { transform: translateY(-8px); opacity: 0; }
}

/* 嗓子哑了：合成失败或没配 key */
.blob[data-state="hoarse"] { --skin-hi: #e8ddd3; --skin-lo: #b9a596; }
.blob[data-state="hoarse"] .mouth-smile { display: none; }
.blob[data-state="hoarse"] .mouth-hoarse { display: inline; }
.blob[data-state="hoarse"] .brows-sad { display: inline; }

/* kid.css */
/* 小应皮肤。所有选择器挂在 .kid 下。旋转都以肩膀、脖子、脚底为支点。 */

.kid {
  --talk: 0;
  --hoodie-hi: #ffb98a;
  --hoodie-lo: #ff8f57;
  --skin: #ffe3cf;
  --hair: #3b2a22;
  --ink: #3b2a22;
  --gear: #2f2b3a;
  --accent: #ff8a3d;
}

.kid .hoodie-hi { stop-color: var(--hoodie-hi); transition: stop-color 0.6s; }
.kid .hoodie-lo { stop-color: var(--hoodie-lo); transition: stop-color 0.6s; }
.kid .shadow { fill: rgba(0, 0, 0, 0.13); }
.kid .legs rect { fill: #4b4a6b; }
.kid .shoe { fill: var(--gear); }
.kid .pocket { fill: rgba(0, 0, 0, 0.07); }
.kid .string { stroke: rgba(255, 255, 255, 0.7); stroke-width: 1.5; stroke-linecap: round; fill: none; }
.kid .face, .kid .hand { fill: var(--skin); transition: fill 0.6s; }
.kid .hair, .kid .bangs { fill: var(--hair); }
.kid .ahoge { fill: none; stroke: var(--hair); stroke-width: 3; stroke-linecap: round; transform-origin: 85px 34px; }
.kid .cheek { fill: #ff7a7a; opacity: 0.35; }
.kid .glint { fill: #fff; }
.kid .eye-open ellipse { fill: var(--ink); }
.kid .eyes path, .kid .mouths path { fill: none; stroke: var(--ink); stroke-width: 2.4; stroke-linecap: round; }
.kid .mouth-open { fill: #6b2b2b; }
.kid .band, .kid .boom { fill: none; stroke: var(--gear); stroke-linecap: round; }
.kid .band { stroke-width: 3.5; }
.kid .boom { stroke-width: 2.2; }
.kid .cup { fill: var(--gear); }
.kid .mic { fill: var(--accent); }
.kid .arm path { fill: none; stroke: var(--hoodie-lo); stroke-width: 9; stroke-linecap: round; transition: stroke 0.6s; }
.kid .sweat { fill: #8fd3ff; opacity: 0; }
.kid .marker, .kid .zz, .kid .eye-happy, .kid .eye-closed, .kid .brows-sad,
.kid .mouth-open, .kid .mouth-flat, .kid .mouth-hoarse { display: none; }
.kid .zz text { font: 600 13px -apple-system, sans-serif; fill: #8a7cff; }

.kid .figure { transform-origin: 85px 182px; animation: kid-breathe 4.2s ease-in-out infinite; }
.kid .head { transform-origin: 85px 102px; transition: transform 0.4s ease; }
.kid .arm { transition: transform 0.35s ease; }
.kid .arm-left { transform-origin: 62px 112px; }
.kid .arm-right { transform-origin: 108px 112px; }
.kid .eyes { transform-origin: 85px 77px; transition: transform 0.08s; }
/* 看向鼠标：整个头偏过去、侧一点，眼珠再多挪一点 */
.kid .look { transform-origin: 85px 102px; transform: translate(calc(var(--gx, 0) * 5px), calc(var(--gy, 0) * 2.5px)) rotate(calc(var(--gx, 0) * 9deg)); transition: transform 0.3s ease-out; }
.kid .eye-open { transform: translate(calc(var(--gx, 0) * 3.5px), calc(var(--gy, 0) * 2.5px)); transition: transform 0.25s ease-out; }
.kid.blink .eyes { transform: scaleY(0.1); }

@keyframes kid-breathe {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(1.2px); }
}

/* 说话：嘴随音量开合，头跟着轻轻点，右手比划一下 */
.kid[data-state="speaking"] .mouth-smile { display: none; }
.kid[data-state="speaking"] .mouth-open { display: inline; }
.kid[data-state="speaking"] .head { transform: rotate(calc(var(--talk) * -4deg)) translateY(calc(var(--talk) * 1px)); transition: transform 0.08s; }
.kid[data-state="speaking"] .arm-right { transform: rotate(-30deg); }

/* 干完：双手举起来，眼睛弯起来，蹦一下 */
.kid[data-state="done"] .eye-open { display: none; }
.kid[data-state="done"] .eye-happy { display: inline; }
.kid[data-state="done"] .cheek { opacity: 0.6; }
.kid[data-state="done"] .arm-left { transform: rotate(145deg); }
.kid[data-state="done"] .arm-right { transform: rotate(-145deg); }
.kid[data-state="done"] .figure { animation: kid-hop 0.8s ease-out 2; }
.kid[data-state="done"] .ahoge { animation: kid-boing 0.4s ease-in-out 4; }
@keyframes kid-hop {
  0%, 100% { transform: translateY(0); }
  35% { transform: translateY(-12px); }
  65% { transform: translateY(0) scale(1.03, 0.97); }
}
@keyframes kid-boing {
  0%, 100% { transform: rotate(0); }
  50% { transform: rotate(-18deg); }
}

/* 失败：衣服褪色，低头，冒汗。挂着等人回来 */
.kid[data-state="failed"] { --hoodie-hi: #cdd5e2; --hoodie-lo: #8d9db5; --skin: #f1e4dc; }
.kid[data-state="failed"] .head { transform: rotate(7deg) translateY(3px); }
.kid[data-state="failed"] .arm-left { transform: rotate(-4deg); }
.kid[data-state="failed"] .arm-right { transform: rotate(4deg); }
.kid[data-state="failed"] .brows-sad { display: inline; }
.kid[data-state="failed"] .mouth-smile { display: none; }
.kid[data-state="failed"] .mouth-flat { display: inline; }
.kid[data-state="failed"] .cheek { opacity: 0.1; }
.kid[data-state="failed"] .sweat { opacity: 1; animation: kid-drip 2.4s ease-in infinite; }
@keyframes kid-drip {
  0% { transform: translateY(0); opacity: 1; }
  80% { transform: translateY(14px); opacity: 0; }
  100% { transform: translateY(14px); opacity: 0; }
}

/* 要你确认：举着右手等，手上方亮着提示点 */
.kid[data-state="need_confirm"] .arm-right { transform: rotate(-145deg); }
.kid[data-state="need_confirm"] .head { transform: rotate(-3deg); }
.kid[data-state="need_confirm"] .marker { display: inline; }
.kid .marker-dot { fill: var(--accent); }
.kid .marker-ring { fill: none; stroke: var(--accent); stroke-width: 2; transform-origin: 131px 60px; animation: kid-ping 1.8s ease-out infinite; }
@keyframes kid-ping {
  0% { transform: scale(0.6); opacity: 0.9; }
  100% { transform: scale(1.9); opacity: 0; }
}

/* 顺嘴提醒：点头，挥一下手 */
.kid[data-state="note"] .head { animation: kid-nod 0.7s ease-in-out 1; }
.kid[data-state="note"] .arm-right { animation: kid-wave 0.5s ease-in-out 3; transform: rotate(-125deg); }
@keyframes kid-nod {
  0%, 100% { transform: rotate(0); }
  40% { transform: rotate(4deg) translateY(2px); }
}
@keyframes kid-wave {
  0%, 100% { transform: rotate(-115deg); }
  50% { transform: rotate(-140deg); }
}

/* 收到：你回到了那个窗口，或者双击说了“知道了”。眯眼点两下头 */
.kid[data-state="ack"] .eye-open { display: none; }
.kid[data-state="ack"] .eye-happy { display: inline; }
.kid[data-state="ack"] .head { animation: kid-nod 0.6s ease-in-out 2; }

/* 静音：歪头睡觉，冒 z */
.kid[data-state="muted"] { --hoodie-hi: #f0c7a8; --hoodie-lo: #d69a76; }
.kid[data-state="muted"] .eye-open { display: none; }
.kid[data-state="muted"] .eye-closed { display: inline; }
.kid[data-state="muted"] .zz { display: inline; }
.kid[data-state="muted"] .head { transform: rotate(-9deg); }
.kid[data-state="muted"] .figure { animation-duration: 6s; }
.kid .zz text { animation: kid-float 3s ease-in-out infinite; }
.kid .zz text:nth-child(2) { animation-delay: 1.5s; }
@keyframes kid-float {
  0% { transform: translateY(6px); opacity: 0; }
  50% { opacity: 1; }
  100% { transform: translateY(-8px); opacity: 0; }
}

/* 嗓子哑了：手捂着喉咙，嘴是波浪线 */
.kid[data-state="hoarse"] { --hoodie-hi: #e6dcd3; --hoodie-lo: #b9a596; }
.kid[data-state="hoarse"] .arm-right { transform: rotate(117deg); }
.kid[data-state="hoarse"] .mouth-smile { display: none; }
.kid[data-state="hoarse"] .mouth-hoarse { display: inline; }
.kid[data-state="hoarse"] .brows-sad { display: inline; }

/* nova.css */
/* 星核皮肤。所有选择器挂在 .nova 下。整颗球的颜色由几个变量决定，情绪就是换一套变量。 */

.nova {
  --talk: 0;
  --c1: #effdff;
  --c2: #4fe3ff;
  --c3: #6a3dff;
  --glow: #3fd8ff;
  --r1: #4fe3ff;
  --r2: #ff4fd8;
  --eye: #ffffff;
}

.nova .g-c1 { stop-color: var(--c1); transition: stop-color 0.6s; }
.nova .g-c2 { stop-color: var(--c2); transition: stop-color 0.6s; }
.nova .g-c3 { stop-color: var(--c3); transition: stop-color 0.6s; }
.nova .g-glow { stop-color: var(--glow); transition: stop-color 0.6s; }
.nova .g-r1 { stop-color: var(--r1); transition: stop-color 0.6s; }
.nova .g-r2 { stop-color: var(--r2); transition: stop-color 0.6s; }

.nova .shadow { fill: var(--glow); opacity: 0.22; transition: fill 0.6s; }
.nova .gloss { fill: #fff; opacity: 0.38; }
.nova .eye { fill: var(--eye); }
.nova .eye-glow { fill: var(--c1); opacity: 0.3; }
.nova .eyes path, .nova .mouths path { fill: none; stroke: #fff; stroke-width: 3.2; stroke-linecap: round; }
.nova .brows-sad path { stroke-width: 2.4; }
.nova .bars rect { fill: #fff; }

.nova .ring { fill: none; stroke-width: 2.2; stroke-linecap: round; }
.nova .ring.r2 { stroke-width: 1.5; }
.nova .flow { fill: none; stroke: #fff; stroke-width: 2.6; stroke-linecap: round; stroke-dasharray: 9 60; }
.nova .flow.r2 { stroke-width: 1.8; stroke-dasharray: 6 46; }
.nova .rings-back { opacity: 0.5; }

.nova .ripple { fill: none; stroke: var(--glow); stroke-width: 2; opacity: 0; }
.nova .sparks path { fill: var(--c1); opacity: 0.5; }
.nova .burst circle { fill: var(--c1); }
.nova .marker-dot { fill: #ffb13d; }
.nova .marker-ring { fill: none; stroke: #ffb13d; stroke-width: 2; }
.nova .zz text { font: 600 14px -apple-system, sans-serif; fill: #b9adff; }

.nova .marker, .nova .zz, .nova .burst, .nova .eye-happy, .nova .eye-closed, .nova .brows-sad,
.nova .bars, .nova .mouth-flat, .nova .mouth-hoarse { display: none; }

/* 变换支点：球心 (85,100) */
.nova .body-wrap, .nova .body, .nova .halo, .nova .ripple { transform-origin: 85px 100px; }
.nova .eyes { transform-origin: 85px 96px; transition: transform 0.08s; }
.nova.blink .eyes { transform: scaleY(0.1); }

/* 看向鼠标：眼睛挪得多，整张脸挪得少 */
.nova .face { transform: translate(calc(var(--gx, 0) * 3px), calc(var(--gy, 0) * 2px)); transition: transform 0.3s ease-out; }
.nova .eye-open { transform: translate(calc(var(--gx, 0) * 5px), calc(var(--gy, 0) * 3.5px)); transition: transform 0.25s ease-out; }

/* 待机：核心呼吸，光晕起伏，环上的光在流，火花明灭 */
.nova .body { animation: nova-breathe 4.2s ease-in-out infinite; }
.nova .halo { animation: nova-halo 4.2s ease-in-out infinite; }
.nova .flow { animation: nova-flow 3.2s linear infinite; }
.nova .flow.r2 { animation-duration: 4.6s; animation-direction: reverse; }
.nova .sparks path { animation: nova-twinkle 3s ease-in-out infinite; }
.nova .sparks path:nth-child(2) { animation-delay: -1s; }
.nova .sparks path:nth-child(3) { animation-delay: -2s; }

@keyframes nova-breathe {
  0%, 100% { transform: translateY(0) scale(1); }
  50% { transform: translateY(-3px) scale(1.012); }
}
@keyframes nova-halo {
  0%, 100% { transform: scale(0.96); opacity: 0.85; }
  50% { transform: scale(1.04); opacity: 1; }
}
@keyframes nova-flow { to { stroke-dashoffset: -69; } }
@keyframes nova-twinkle {
  0%, 100% { opacity: 0.15; }
  50% { opacity: 0.85; }
}

/* 说话：嘴变成一排音柱，光晕随音量胀缩，环上的光流得更快 */
.nova[data-state="speaking"] .mouth-smile { display: none; }
.nova[data-state="speaking"] .bars { display: inline; }
.nova .bars rect { transform-box: fill-box; transform-origin: center; transform: scaleY(calc(0.22 + var(--talk) * var(--k, 1))); }
.nova .bars rect:nth-child(1) { --k: 0.55; }
.nova .bars rect:nth-child(2) { --k: 0.9; }
.nova .bars rect:nth-child(3) { --k: 1.15; }
.nova .bars rect:nth-child(4) { --k: 0.8; }
.nova .bars rect:nth-child(5) { --k: 0.5; }
.nova[data-state="speaking"] .halo { animation: none; transform: scale(calc(1 + var(--talk) * 0.14)); opacity: 1; transition: transform 0.06s; }
.nova[data-state="speaking"] .flow { animation-duration: 1.1s; }
.nova[data-state="speaking"] .eye-glow { opacity: calc(0.3 + var(--talk) * 0.5); }

/* 干完：薄荷绿，眯眼，炸一圈火花，蹦一下 */
.nova[data-state="done"] { --c2: #6bffc4; --c3: #1f8dff; --glow: #5dffb0; --r1: #5dffb0; --r2: #4fe3ff; }
.nova[data-state="done"] .eye-open { display: none; }
.nova[data-state="done"] .eye-happy { display: inline; }
.nova[data-state="done"] .burst { display: inline; }
.nova[data-state="done"] .burst circle { animation: nova-burst 1.2s ease-out forwards; }
.nova[data-state="done"] .body-wrap { animation: nova-hop 0.9s ease-out 2; }
@keyframes nova-burst {
  0% { opacity: 1; transform: translate(0, 0); }
  100% { opacity: 0; transform: translate(var(--dx), var(--dy)); }
}
@keyframes nova-hop {
  0%, 100% { transform: translateY(0) scale(1, 1); }
  30% { transform: translateY(-12px) scale(0.97, 1.04); }
  60% { transform: translateY(0) scale(1.04, 0.96); }
}

/* 顺嘴提醒：泛一圈涟漪，点一下头 */
.nova[data-state="note"] .ripple { animation: nova-ripple 1.1s ease-out forwards; }
.nova[data-state="note"] .body-wrap { animation: nova-nod 0.7s ease-in-out 1; }
@keyframes nova-ripple {
  0% { opacity: 0.8; transform: scale(1); }
  100% { opacity: 0; transform: scale(1.75); }
}
@keyframes nova-nod {
  0%, 100% { transform: rotate(0); }
  40% { transform: rotate(-6deg) translateY(3px); }
}

/* 要你确认：琥珀色，头顶信标脉动，光晕呼吸变快。不做期待回答的脸 */
.nova[data-state="need_confirm"] { --c2: #ffc24d; --c3: #ff5a1f; --glow: #ffa23d; --r1: #ffd23d; --r2: #ff6a3d; }
.nova[data-state="need_confirm"] .marker { display: inline; }
.nova[data-state="need_confirm"] .halo { animation-duration: 1.6s; }
.nova .marker-ring { transform-origin: 85px 22px; animation: nova-ping 1.8s ease-out infinite; }
@keyframes nova-ping {
  0% { transform: scale(0.6); opacity: 0.9; }
  100% { transform: scale(1.9); opacity: 0; }
}

/* 收到：薄荷绿，眯眼点两下头 */
.nova[data-state="ack"] { --c2: #6bffc4; --glow: #5dffb0; --r1: #5dffb0; }
.nova[data-state="ack"] .eye-open { display: none; }
.nova[data-state="ack"] .eye-happy { display: inline; }
.nova[data-state="ack"] .body-wrap { animation: nova-nod 0.6s ease-in-out 2; }

/* 失败：变红，光晕闪，抖两下，环断开，光不流了 */
.nova[data-state="failed"] { --c1: #ffe3e8; --c2: #ff4d6d; --c3: #7a0f3d; --glow: #ff3b5c; --r1: #ff4d6d; --r2: #ff9a3d; }
.nova[data-state="failed"] .halo { animation: nova-flicker 2.2s steps(1) infinite; }
.nova[data-state="failed"] .body-wrap { animation: nova-shake 0.45s ease-in-out 2; }
.nova[data-state="failed"] .ring { stroke-dasharray: 5 9; }
.nova[data-state="failed"] .flow { display: none; }
.nova[data-state="failed"] .brows-sad { display: inline; }
.nova[data-state="failed"] .mouth-smile { display: none; }
.nova[data-state="failed"] .mouth-flat { display: inline; }
@keyframes nova-flicker {
  0%, 100% { opacity: 1; }
  8% { opacity: 0.4; }
  12% { opacity: 1; }
  60% { opacity: 0.7; }
}
@keyframes nova-shake {
  0%, 100% { transform: translateX(0); }
  25% { transform: translateX(-4px); }
  75% { transform: translateX(4px); }
}

/* 静音：暗紫，闭眼，环停转，冒 z。看得出是在睡，不是坏了 */
.nova[data-state="muted"] { --c1: #d8d2ff; --c2: #7d6bff; --c3: #2c2366; --glow: #6a5cff; --r1: #7d6bff; --r2: #4b3dbb; }
.nova[data-state="muted"] .halo { animation: none; opacity: 0.45; }
.nova[data-state="muted"] .flow { animation-play-state: paused; }
.nova[data-state="muted"] .body { animation-duration: 6s; }
.nova[data-state="muted"] .eye-open { display: none; }
.nova[data-state="muted"] .eye-closed { display: inline; }
.nova[data-state="muted"] .zz { display: inline; }
.nova .zz text { animation: nova-float 3s ease-in-out infinite; }
.nova .zz text:nth-child(2) { animation-delay: 1.5s; }
@keyframes nova-float {
  0% { transform: translateY(6px); opacity: 0; }
  50% { opacity: 1; }
  100% { transform: translateY(-8px); opacity: 0; }
}

/* 嗓子哑了：褪成灰蓝，环停，嘴是波浪线 */
.nova[data-state="hoarse"] { --c1: #eef2f6; --c2: #8fa0b5; --c3: #46536b; --glow: #8fa0b5; --r1: #8fa0b5; --r2: #5f6f86; }
.nova[data-state="hoarse"] .flow { animation-play-state: paused; }
.nova[data-state="hoarse"] .halo { animation: none; opacity: 0.55; }
.nova[data-state="hoarse"] .mouth-smile { display: none; }
.nova[data-state="hoarse"] .mouth-hoarse { display: inline; }
.nova[data-state="hoarse"] .brows-sad { display: inline; }
