/* ==========================================================
   bid-analysis-box.css — 投前诊断「文件箱」动画
   阶段 class（.bx-scene.is-*）：closed / opening / loading / shaking / error
   规范对齐 public-home 的 ph-bid-* 动画体系：小幅位移、reduced-motion 全禁用
   ========================================================== */

.bx-scene {
  display: inline-block;
  perspective: 640px;
}

.bx-svg {
  display: block;
  overflow: visible;
}

.bx-box,
.bx-lid,
.bx-file,
.bx-glow,
.bx-shadow {
  transform-box: fill-box;
}

/* ── 盖子：铰链在后上沿 ── */
.bx-lid {
  transform-origin: 50% 0%;
  transition: transform 0.35s cubic-bezier(0.34, 1.4, 0.64, 1);
}

/* ── 文件：默认藏起 ── */
.bx-file {
  opacity: 0;
}

/* ── closed：呼吸浮动，暗示可点 ── */
.is-closed .bx-box {
  animation: bx-breathe 3.2s ease-in-out infinite;
}

.is-closed .bx-shadow {
  animation: bx-shadow-breathe 3.2s ease-in-out infinite;
}

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

@keyframes bx-shadow-breathe {
  0%, 100% { transform: scaleX(1); opacity: 0.10; }
  50% { transform: scaleX(0.94); opacity: 0.07; }
}

/* ── opening：点击后开盖（等待文件选择器） ── */
.is-opening .bx-lid {
  transform: rotateX(-104deg);
}

/* ── loading：盖子开→文件落入→合盖 ── */
.is-loading .bx-lid {
  animation: bx-lid-cycle 1.1s ease-in-out forwards;
}

.is-loading .bx-file {
  animation: bx-file-drop 0.72s cubic-bezier(0.5, 0, 0.75, 0.6) forwards;
}

@keyframes bx-lid-cycle {
  0%, 55% { transform: rotateX(-104deg); }
  100% { transform: rotateX(0deg); }
}

@keyframes bx-file-drop {
  0% { opacity: 0; transform: translateY(-64px) rotate(-6deg); }
  22% { opacity: 1; }
  70% { opacity: 1; transform: translateY(28px) rotate(2deg); }
  100% { opacity: 0; transform: translateY(46px) scale(0.82); }
}

/* ── shaking：分析中抖动 + 光晕脉冲 ── */
.is-shaking .bx-box {
  animation: bx-working 1.15s ease-in-out infinite;
}

.is-shaking .bx-glow {
  animation: bx-glow-pulse 1.15s ease-in-out infinite;
}

@keyframes bx-working {
  0%, 38%, 100% { transform: translateX(0) rotate(0deg); }
  46% { transform: translateX(-2.5px) rotate(-1deg); }
  54% { transform: translateX(2.5px) rotate(1deg); }
  62% { transform: translateX(-1.5px) rotate(-0.6deg); }
  70% { transform: translateX(1.5px) rotate(0.6deg); }
  78% { transform: translateX(0) rotate(0deg); }
}

@keyframes bx-glow-pulse {
  0%, 100% { opacity: 0.05; }
  50% { opacity: 0.22; }
}

/* ── error：短促警示晃动一次 ── */
.is-error .bx-box {
  animation: bx-error-shake 0.5s ease-in-out 1;
}

.is-error .bx-lid rect:first-child {
  fill: var(--color-error, #dc2626);
}

@keyframes bx-error-shake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-7px); }
  40% { transform: translateX(6px); }
  60% { transform: translateX(-4px); }
  80% { transform: translateX(3px); }
}

/* ── 报告「弹出」入场（success 渲染报告时） ── */
.bar-report {
  animation: bar-report-rise 0.45s cubic-bezier(0.22, 0.9, 0.36, 1);
}

@keyframes bar-report-rise {
  from { opacity: 0; transform: translateY(26px); }
  to { opacity: 1; transform: translateY(0); }
}

/* ── 无障碍：reduced-motion 全部禁用，直接呈现目标态 ── */
@media (prefers-reduced-motion: reduce) {
  .bx-box,
  .bx-lid,
  .bx-file,
  .bx-glow,
  .bx-shadow,
  .bar-report {
    animation: none !important;
    transition: none !important;
  }

  .is-loading .bx-lid,
  .is-shaking .bx-lid {
    transform: rotateX(0deg);
  }
}
