/* 全屏悬浮助手 · 2D 贴图，不阻挡页面点击（仅命中小人时可拖动） */
#portal-robot-layer {
  position: fixed;
  inset: 0;
  z-index: 50;
  pointer-events: none;
  overflow: visible;
  --robot-glow-x: 78%;
  --robot-glow-y: 72%;
}

.portal-robot-wrap {
  position: fixed;
  z-index: 51;
  width: 140px;
  height: 140px;
  transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg);
  transform-style: preserve-3d;
  pointer-events: auto;
  user-select: none;
  cursor: grab;
  transition:
    left 0.38s cubic-bezier(0.34, 1.1, 0.64, 1),
    top 0.38s cubic-bezier(0.34, 1.1, 0.64, 1),
    transform 0.38s cubic-bezier(0.34, 1.1, 0.64, 1),
    filter 0.2s ease;
}

.portal-robot-wrap.fr-docked-right {
  left: auto !important;
  right: 0;
  top: 50% !important;
  animation: none !important;
  clip-path: none;
  overflow: visible;
  transform: translate(30%, -50%) perspective(520px) rotateY(68deg) rotateX(5deg) rotateZ(-10deg);
  transform-origin: 34% 42%;
  cursor: grab;
}

.portal-robot-wrap::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 2%;
  width: 48%;
  height: 10px;
  transform: translateX(-50%) translateZ(-12px) rotateX(78deg);
  border-radius: 50%;
  background: radial-gradient(ellipse, rgba(0, 0, 0, 0.18), transparent 72%);
  pointer-events: none;
  filter: blur(1px);
  opacity: 0;
}

.portal-robot-sprite {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
  user-select: none;
  -webkit-user-drag: none;
  transform: translateZ(10px);
}

#portal-robot-layer.fr-dragging .portal-robot-wrap {
  cursor: grabbing;
  filter: brightness(1.06);
  transition: transform 0.16s ease, filter 0.2s ease;
}

#portal-robot-layer.fr-dragging .portal-robot-wrap.fr-docked-right {
  transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg);
  transform-origin: 50% 50%;
}

.portal-robot-wrap.fr-idle {
  animation: portal-robot-float 4.2s ease-in-out infinite;
}

.portal-robot-wrap.fr-anim-thinking {
  animation: portal-robot-think 1.4s ease-in-out infinite;
}

.portal-robot-wrap.fr-anim-speaking {
  animation: portal-robot-speak 0.5s ease-in-out infinite alternate;
}

.portal-robot-wrap.fr-anim-listening {
  animation: portal-robot-listen 2s ease-in-out infinite;
}

.portal-robot-wrap.fr-anim-awake {
  animation: portal-robot-awake 0.6s ease-in-out infinite alternate;
}

@keyframes portal-robot-float {
  0%, 100% {
    transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg) translateY(0);
  }
  50% {
    transform: translate(-50%, -50%) perspective(520px) rotateY(-11deg) rotateX(5deg) translateY(-5px);
  }
}

@keyframes portal-robot-think {
  0%, 100% {
    transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg) rotate(-2deg);
  }
  50% {
    transform: translate(-50%, calc(-50% - 6px)) perspective(520px) rotateY(-12deg) rotateX(5deg) rotate(2deg);
  }
}

@keyframes portal-robot-speak {
  0% {
    transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg) scale(1);
  }
  100% {
    transform: translate(-50%, calc(-50% - 4px)) perspective(520px) rotateY(-12deg) rotateX(5deg) scale(1.03);
  }
}

@keyframes portal-robot-listen {
  0%, 100% {
    transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg);
  }
  50% {
    transform: translate(-50%, calc(-50% - 3px)) perspective(520px) rotateY(-12deg) rotateX(5deg);
  }
}

@keyframes portal-robot-awake {
  0% {
    transform: translate(-50%, -50%) perspective(520px) rotateY(-14deg) rotateX(4deg) scale(1);
  }
  100% {
    transform: translate(-50%, calc(-50% - 8px)) perspective(520px) rotateY(-10deg) rotateX(6deg) scale(1.05);
  }
}

#portal-robot-layer.fr-hidden {
  visibility: hidden;
  opacity: 0;
  pointer-events: none;
}

#portal-robot-layer.fr-hidden .portal-robot-wrap {
  pointer-events: none;
}

/* 语音唤醒 · 模型上方 Hi 气泡 */
.portal-robot-hi {
  position: fixed;
  z-index: 60;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -100%) scale(0.6);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.25s ease, transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.portal-robot-hi.is-visible {
  opacity: 1;
  transform: translate(-50%, -100%) scale(1);
  animation: portal-robot-hi-pop 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.portal-robot-hi-text {
  display: block;
  padding: 8px 18px;
  border-radius: 999px;
  border: 2px solid rgba(52, 211, 153, 0.85);
  background: linear-gradient(135deg, rgba(6, 78, 59, 0.95), rgba(2, 44, 34, 0.92));
  box-shadow:
    0 0 24px rgba(52, 211, 153, 0.45),
    0 8px 24px rgba(0, 0, 0, 0.35);
  font-family: "Segoe UI", "Noto Sans SC", system-ui, sans-serif;
  font-size: 22px;
  font-weight: 800;
  font-style: italic;
  letter-spacing: 0.04em;
  color: #ecfdf5;
  text-shadow: 0 0 12px rgba(52, 211, 153, 0.6);
  white-space: nowrap;
}

.portal-robot-hi-tail {
  display: block;
  width: 14px;
  height: 14px;
  margin: -7px auto 0;
  background: rgba(2, 44, 34, 0.92);
  border-right: 2px solid rgba(52, 211, 153, 0.85);
  border-bottom: 2px solid rgba(52, 211, 153, 0.85);
  transform: rotate(45deg);
  box-shadow: 4px 4px 12px rgba(0, 0, 0, 0.2);
}

#portal-robot-layer.fr-voice-awake::after,
#portal-robot-layer.voice-awake::after {
  content: "";
  position: fixed;
  left: var(--robot-glow-x, 78%);
  top: var(--robot-glow-y, 72%);
  width: 160px;
  height: 160px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  pointer-events: none;
  background: radial-gradient(circle, rgba(52, 211, 153, 0.28), transparent 68%);
  animation: portal-robot-awake-pulse 1.6s ease-in-out infinite;
}

@keyframes portal-robot-hi-pop {
  0% { transform: translate(-50%, -80%) scale(0.4); opacity: 0; }
  70% { transform: translate(-50%, -105%) scale(1.08); opacity: 1; }
  100% { transform: translate(-50%, -100%) scale(1); opacity: 1; }
}

@keyframes portal-robot-awake-pulse {
  0%, 100% { opacity: 0.55; transform: translate(-50%, -50%) scale(0.95); }
  50% { opacity: 1; transform: translate(-50%, -50%) scale(1.08); }
}

/* 思考 / 说话 · 表情气泡 */
.portal-robot-expression {
  position: fixed;
  z-index: 61;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease;
}

.portal-robot-expression.is-visible {
  opacity: 1;
}

.portal-robot-ex-thinking,
.portal-robot-ex-speaking {
  display: none;
  align-items: center;
  justify-content: center;
  gap: 5px;
  padding: 8px 12px;
  border-radius: 14px;
  border: 1px solid rgba(56, 189, 248, 0.5);
  background: rgba(2, 20, 40, 0.92);
  box-shadow: 0 0 18px rgba(56, 189, 248, 0.25);
}

.portal-robot-expression.is-thinking .portal-robot-ex-thinking {
  display: inline-flex;
}

.portal-robot-expression.is-speaking .portal-robot-ex-speaking {
  display: inline-flex;
  border-color: rgba(251, 191, 36, 0.55);
  box-shadow: 0 0 18px rgba(251, 191, 36, 0.22);
}

.portal-robot-ex-thinking i {
  display: block;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #38bdf8;
  animation: portal-robot-dot 1.2s ease-in-out infinite;
}

.portal-robot-ex-thinking i:nth-child(2) { animation-delay: 0.15s; }
.portal-robot-ex-thinking i:nth-child(3) { animation-delay: 0.3s; }

.portal-robot-ex-speaking i {
  display: block;
  width: 4px;
  height: 14px;
  border-radius: 2px;
  background: linear-gradient(180deg, #fde68a, #f59e0b);
  animation: portal-robot-wave 0.55s ease-in-out infinite alternate;
}

.portal-robot-ex-speaking i:nth-child(1) { animation-delay: 0s; height: 10px; }
.portal-robot-ex-speaking i:nth-child(2) { animation-delay: 0.08s; height: 16px; }
.portal-robot-ex-speaking i:nth-child(3) { animation-delay: 0.16s; height: 22px; }
.portal-robot-ex-speaking i:nth-child(4) { animation-delay: 0.08s; height: 16px; }
.portal-robot-ex-speaking i:nth-child(5) { animation-delay: 0s; height: 10px; }

#portal-robot-layer.fr-voice-thinking::after {
  content: "";
  position: fixed;
  left: var(--robot-glow-x, 78%);
  top: var(--robot-glow-y, 72%);
  width: 140px;
  height: 140px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  pointer-events: none;
  background: radial-gradient(circle, rgba(56, 189, 248, 0.22), transparent 68%);
  animation: portal-robot-awake-pulse 1.8s ease-in-out infinite;
}

#portal-robot-layer.fr-voice-speaking::after {
  content: "";
  position: fixed;
  left: var(--robot-glow-x, 78%);
  top: var(--robot-glow-y, 72%);
  width: 150px;
  height: 150px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  pointer-events: none;
  background: radial-gradient(circle, rgba(251, 191, 36, 0.24), transparent 68%);
  animation: portal-robot-speak-pulse 0.45s ease-in-out infinite alternate;
}

#portal-robot-layer.fr-voice-listening::after {
  content: "";
  position: fixed;
  left: var(--robot-glow-x, 78%);
  top: var(--robot-glow-y, 72%);
  width: 120px;
  height: 120px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  pointer-events: none;
  background: radial-gradient(circle, rgba(52, 211, 153, 0.14), transparent 68%);
  animation: portal-robot-awake-pulse 2.4s ease-in-out infinite;
}

@keyframes portal-robot-dot {
  0%, 80%, 100% { transform: translateY(0); opacity: 0.45; }
  40% { transform: translateY(-5px); opacity: 1; }
}

@keyframes portal-robot-wave {
  0% { transform: scaleY(0.55); opacity: 0.65; }
  100% { transform: scaleY(1.15); opacity: 1; }
}

@keyframes portal-robot-speak-pulse {
  0% { opacity: 0.5; transform: translate(-50%, -50%) scale(0.92); }
  100% { opacity: 1; transform: translate(-50%, -50%) scale(1.06); }
}
