/* Task 61 · 输出动效样式（只新增 .rv-* 临时节点，不覆盖既有类） */

.rv-caret {
  display: inline-block;
  width: 1px;
  height: 1em;
  background: currentColor;
  margin-left: 2px;
  vertical-align: -2px;
  animation: rv-blink 1s steps(1) infinite;
}
@keyframes rv-blink { 50% { opacity: 0; } }

.rv-pending {
  display: inline-flex;
  gap: 4px;
  padding: 6px 0 8px;
  align-items: center;
}
.rv-pending i {
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-text-tertiary);
  animation: rv-bounce 1s infinite;
}
.rv-pending i:nth-child(2) { animation-delay: .15s; }
.rv-pending i:nth-child(3) { animation-delay: .3s; }
@keyframes rv-bounce {
  0%, 80%, 100% { transform: translateY(0); opacity: .5; }
  40% { transform: translateY(-4px); opacity: 1; }
}

.rv-pending-card {
  padding: 10px 14px;
}
.rv-pending-card .rv-pending { padding: 0; }

/* 动画期间不阻断交互：动效只用 opacity / transform */
.rv-caret, .rv-pending, .rv-pending-card { pointer-events: none; }

@media (prefers-reduced-motion: reduce) {
  .rv-caret, .rv-pending i { animation: none !important; }
}


/* 结构化内容（表格/结果块）随消息出现时轻微上浮，避免整块硬切 */
@keyframes rv-rise {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: translateY(0); }
}
#stream > .card .result,
#stream > .card .mem-recall {
  animation: rv-rise .24s ease-out both;
}
@media (prefers-reduced-motion: reduce) {
  #stream > .card .result,
  #stream > .card .mem-recall { animation: none; }
}
