/* === 动画关键帧 === */

/* ---- 动画关键帧（使用 cubic-bezier 缓动曲线，更自然流畅） ---- */

/* 登录卡片入场：上浮 + 淡入 + 微缩放，ease-out-expo 缓动 */
@keyframes loginSlideIn {
    0%   { opacity: 0; transform: translateY(30px) scale(0.96); filter: blur(4px); }
    60%  { opacity: 1; transform: translateY(-4px) scale(1.01); filter: blur(0px); }
    100% { opacity: 1; transform: translateY(0) scale(1); filter: blur(0px); }
}

/* 文件网格卡片入场：依次上浮淡入，带 stagger 延迟 */
@keyframes cardFadeIn {
    0%   { opacity: 0; transform: translateY(16px) scale(0.97); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* 文件列表行入场：从左滑入 */
@keyframes rowFadeIn {
    0%   { opacity: 0; transform: translateX(-12px); }
    100% { opacity: 1; transform: translateX(0); }
}

/* 弹窗内容入场：从下方滑入 + 淡入 + 微弹跳 */
@keyframes modalIn {
    0%   { opacity: 0; transform: translateY(24px) scale(0.95); }
    70%  { opacity: 1; transform: translateY(-3px) scale(1.005); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* 弹窗背景淡入 */
@keyframes modalBackdropIn {
    0%   { opacity: 0; }
    100% { opacity: 1; }
}

/* 下拉菜单/右键菜单入场：缩放 + 淡入，从顶部中心展开 */
@keyframes menuIn {
    0%   { opacity: 0; transform: scale(0.92) translateY(-6px); }
    100% { opacity: 1; transform: scale(1) translateY(0); }
}

/* Toast 滑入：从右侧滑入 + 弹性效果 */
@keyframes toastSlideIn {
    0%   { opacity: 0; transform: translateX(80px) scale(0.9); }
    60%  { opacity: 1; transform: translateX(-6px) scale(1.01); }
    100% { opacity: 1; transform: translateX(0) scale(1); }
}

/* Toast 滑出 */
@keyframes toastSlideOut {
    0%   { opacity: 1; transform: translateX(0) scale(1); }
    100% { opacity: 0; transform: translateX(80px) scale(0.9); }
}

/* 上传进度面板入场 */
@keyframes uploadSlideIn {
    0%   { opacity: 0; transform: translateY(20px) scale(0.96); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* 旋转动画 */
@keyframes spin {
    0%   { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

/* AI 消息入场 */
@keyframes msgIn {
    0%   { opacity: 0; transform: translateY(10px) scale(0.98); }
    100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* 存储条填充动画 */
@keyframes storageFill {
    0%   { width: 0%; }
    100% { width: var(--storage-width, 0%); }
}

/* 脉冲光晕（用于上传/处理中的状态指示） */
@keyframes pulseGlow {
    0%, 100% { box-shadow: 0 0 0 0 rgba(74, 158, 255, 0.3); }
    50%      { box-shadow: 0 0 0 8px rgba(74, 158, 255, 0); }
}

/* 呼吸动画（用于空状态、加载提示） */
@keyframes breathe {
    0%, 100% { opacity: 0.5; transform: scale(1); }
    50%      { opacity: 1; transform: scale(1.02); }
}
