/* ============================================================
 * 公共样式层: 设计令牌 + 公用组件(按钮/弹窗/Toast/图标/涟漪)
 * 风格: Material Design 3 · 主色: 拼多多红 #e02e24
 * ============================================================ */
:root{
  --md-primary:#e02e24;
  --md-on-primary:#ffffff;
  --md-primary-container:#ffdad5;
  --md-on-primary-container:#410000;
  --md-surface:#fffbff;
  --md-bg:#f8f9fa;
  --md-on-surface:#201a19;
  --md-outline:#e0e0e0;
  --md-error:#b3261e;
  --md-shadow:0 1px 2px rgba(0,0,0,.08),0 1px 3px 1px rgba(0,0,0,.06);
  --md-shadow-lg:0 2px 6px rgba(0,0,0,.1),0 8px 24px rgba(0,0,0,.08);
  --radius:16px;
}

/* ---------- SVG 图标 ---------- */
.icon{display:inline-flex;align-items:center;justify-content:center;line-height:0;flex:none}
.icon svg{display:block}
.spin{animation:ui-spin 1s linear infinite}
@keyframes ui-spin{to{transform:rotate(360deg)}}

/* ---------- 按钮 ---------- */
.ripple-host{position:relative;overflow:hidden}
.ripple{
  position:absolute;border-radius:50%;background:currentColor;
  opacity:.16;transform:scale(0);pointer-events:none;
  animation:ui-ripple .55s ease-out forwards;
}
@keyframes ui-ripple{to{transform:scale(2.8);opacity:0}}

.btn-filled,.btn-tonal,.btn-text,.btn-danger{
  display:inline-flex;align-items:center;justify-content:center;gap:7px;
  border:none;cursor:pointer;font-weight:500;letter-spacing:.3px;
  transition:box-shadow .15s,background .15s,filter .15s,transform .05s;
  -webkit-user-select:none;user-select:none;
}
.btn-filled{
  height:48px;padding:0 24px;border-radius:24px;font-size:14px;
  background:var(--md-primary);color:var(--md-on-primary);box-shadow:var(--md-shadow);
}
.btn-filled:hover{box-shadow:var(--md-shadow-lg)}
.btn-filled:active{transform:scale(.98)}
.btn-filled:disabled{background:#dadce0;color:#9aa0a6;box-shadow:none;cursor:not-allowed}
.btn-tonal{
  height:40px;padding:0 20px;border-radius:20px;font-size:13px;
  background:var(--md-primary-container);color:var(--md-on-primary-container);
}
.btn-tonal:hover{filter:brightness(.97)}
.btn-tonal:active{transform:scale(.98)}
.btn-tonal:disabled{background:#f1f3f4;color:#9aa0a6;cursor:not-allowed}
.btn-text{
  height:40px;padding:0 16px;border-radius:20px;font-size:13px;
  background:transparent;color:var(--md-primary);
}
.btn-text:hover{background:rgba(224,46,36,.08)}
.btn-danger{
  height:40px;padding:0 20px;border-radius:20px;font-size:13px;
  background:#fce8e6;color:var(--md-error);
}
.btn-danger:hover{filter:brightness(.97)}
.btn-sm{height:34px;padding:0 14px;font-size:12px;border-radius:17px}

/* ---------- Toast (Snackbar) ---------- */
#ui-toast{
  position:fixed;left:50%;bottom:28px;z-index:200;
  transform:translateX(-50%) translateY(16px);
  display:flex;align-items:center;gap:9px;
  background:#201a19;color:#fff;padding:12px 20px;border-radius:12px;
  font-size:14px;opacity:0;pointer-events:none;
  transition:opacity .22s,transform .22s;
  max-width:86vw;box-shadow:var(--md-shadow-lg);
}
#ui-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
#ui-toast.success .icon{color:#81c995}
#ui-toast.error .icon{color:#f28b82}
#ui-toast.info .icon{color:#8ab4f8}

/* ---------- 公用弹窗 (Material Dialog) ---------- */
.ui-modal-backdrop{
  position:fixed;inset:0;z-index:100;background:rgba(32,26,25,.42);
  display:flex;align-items:center;justify-content:center;padding:24px;
  opacity:0;transition:opacity .18s;
}
.ui-modal-backdrop.show{opacity:1}
.ui-modal{
  width:100%;max-width:360px;background:var(--md-surface);
  border-radius:28px;padding:28px 24px 20px;box-shadow:var(--md-shadow-lg);
  transform:scale(.92) translateY(8px);transition:transform .18s;
  max-height:82vh;overflow-y:auto;
}
.ui-modal-backdrop.show .ui-modal{transform:scale(1) translateY(0)}
.ui-modal-icon{
  width:56px;height:56px;border-radius:50%;margin:0 auto 14px;
  display:flex;align-items:center;justify-content:center;
  background:var(--md-primary-container);color:var(--md-on-primary-container);
}
.ui-modal-icon.success{background:#e6f4ea;color:#188038}
.ui-modal-icon.error{background:#fce8e6;color:var(--md-error)}
.ui-modal-title{font-size:18px;font-weight:500;text-align:center}
.ui-modal-body{font-size:14px;color:#5f6368;margin-top:10px;text-align:center;line-height:1.7}
.ui-modal-actions{
  display:flex;justify-content:flex-end;gap:8px;margin-top:22px;flex-wrap:wrap;
}
.ui-modal-actions .btn-filled,.ui-modal-actions .btn-tonal,
.ui-modal-actions .btn-text,.ui-modal-actions .btn-danger{height:40px;font-size:13px}
.ui-loading{
  display:flex;align-items:center;justify-content:center;gap:10px;
  padding:8px 0;color:#5f6368;font-size:14px;
}
.ui-loading .icon{color:var(--md-primary)}

/* ================= 动态动效库(前台共用) ================= */

/* 入场: 渐显上浮 */
@keyframes ui-fade-up{
  from{opacity:0;transform:translateY(14px)}
  to{opacity:1;transform:translateY(0)}
}
.anim-in{animation:ui-fade-up .45s ease-out both}
.anim-in-d1{animation:ui-fade-up .45s .08s ease-out both}
.anim-in-d2{animation:ui-fade-up .45s .16s ease-out both}
.anim-in-d3{animation:ui-fade-up .45s .24s ease-out both}

/* 按钮呼吸脉动: 光晕扩散 */
@keyframes ui-pulse-glow{
  0%,100%{box-shadow:0 0 0 0 rgba(224,46,36,.45),0 3px 10px rgba(0,0,0,.18)}
  50%{box-shadow:0 0 0 8px rgba(224,46,36,0),0 3px 10px rgba(0,0,0,.18)}
}
.pulse-glow{animation:ui-pulse-glow 1.8s ease-in-out infinite}

/* 图标轻微跳动 */
@keyframes ui-wiggle{
  0%,100%{transform:rotate(0)}
  25%{transform:rotate(-6deg)}
  75%{transform:rotate(6deg)}
}
.wiggle{display:inline-flex;animation:ui-wiggle 2.2s ease-in-out infinite}

/* 数字滚动 */
@keyframes ui-countup{
  from{opacity:.2;transform:translateY(6px)}
  to{opacity:1;transform:translateY(0)}
}
.count-up{display:inline-block;animation:ui-countup .4s ease-out both}

/* 跑马灯(滚动播报) */
.marquee{
  overflow:hidden;white-space:nowrap;position:relative;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
}
.marquee-track{
  display:inline-flex;align-items:center;gap:28px;
  padding-right:28px;white-space:nowrap;
  animation:ui-marquee 18s linear infinite;
  will-change:transform;
}
@keyframes ui-marquee{
  from{transform:translateX(0)}
  to{transform:translateX(-50%)}
}
.marquee:hover .marquee-track{animation-play-state:paused}

/* 列表项入场交错 */
@keyframes ui-stagger{
  from{opacity:0;transform:translateY(10px) scale(.98)}
  to{opacity:1;transform:translateY(0) scale(1)}
}
.stagger-in{animation:ui-stagger .35s ease-out both}

/* 尊重系统减弱动效设置 */
@media (prefers-reduced-motion:reduce){
  .anim-in,.anim-in-d1,.anim-in-d2,.anim-in-d3,.stagger-in{animation:none;opacity:1;transform:none}
  .pulse-glow,.wiggle,.count-up,.marquee-track{animation:none}
}
