@import url("fonts.css");

/* ═══════════════════════════════════════
   XuYiqi Cloud — 统一样式
   ═══════════════════════════════════════ */

/* ── 全站统一弹窗（替代原生 confirm/alert/prompt，动画与考研专注一致） ── */
.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:300;display:flex;align-items:center;justify-content:center;padding:20px;opacity:0;transition:opacity .18s ease}
.modal-mask.show{opacity:1}
.modal-mask .modal-box{background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.18);padding:24px 22px 18px;width:100%;max-width:340px;text-align:center;transform:scale(.88);transition:transform .18s ease}
.modal-mask.show .modal-box{transform:none}
.modal-mask.from-bottom .modal-box{transform:translateY(60px);transition:transform .22s ease}
.modal-mask.from-bottom.show .modal-box{transform:none}
.modal-mask .modal-msg{font-size:.88em;line-height:1.7;color:var(--ink);margin-bottom:18px;word-break:break-word}
.modal-mask .modal-input{width:100%;border:1px solid var(--border);border-radius:2px;padding:9px 12px;font-family:inherit;font-size:.9em;outline:none;background:var(--paper);color:var(--ink);margin-bottom:18px;text-align:center}
.modal-mask .modal-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(212,72,60,.08)}
.modal-mask .modal-btns{display:flex;gap:10px;justify-content:center}
.modal-mask .modal-btns .btn-primary{padding:9px 28px;letter-spacing:1px;font-size:.85em}
.modal-mask .modal-btns .btn-ghost{padding:9px 20px;font-size:.85em}
.btn-primary{background:var(--accent);color:#fff;border:none;padding:12px 40px;border-radius:2px;font-family:inherit;font-size:.9em;cursor:pointer;letter-spacing:3px;transition:opacity .15s,transform .15s}
.btn-primary:hover{opacity:.88;transform:translateY(-1px)}
.btn-primary:active{transform:translateY(0)}
.btn-primary.danger{background:#b9372e}
.btn-ghost{background:none;border:1px solid var(--border);color:var(--muted);padding:12px 20px;border-radius:2px;font-family:inherit;font-size:.85em;cursor:pointer;transition:color .15s,border-color .15s,transform .15s}
.btn-ghost:hover{color:var(--accent);border-color:var(--accent);transform:translateY(-1px)}

/* ── 全站统一动画节奏 ── */
/* ── 全站统一日期选择器（替代原生 date input，动画与弹窗一致） ── */
input[data-date-picker]{cursor:pointer}
.dp-panel{position:fixed;z-index:320;width:264px;background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.18);padding:12px 12px 10px;opacity:0;transform:scaleY(.65);transform-origin:top center;transition:transform .35s ease,opacity .2s ease;pointer-events:none}
.dp-panel.show{opacity:1;transform:scaleY(1);pointer-events:auto}
.dp-panel.above{transform-origin:bottom center}
.dp-head{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.dp-nav{width:28px;height:28px;border:1px solid var(--border);border-radius:2px;background:var(--card);color:var(--muted);cursor:pointer;font-family:"IBM Plex Mono",monospace;font-size:1em;line-height:1;transition:color .15s,border-color .15s,transform .15s}
.dp-nav:hover{color:var(--accent);border-color:var(--accent);transform:translateY(-1px)}
.dp-title{flex:1;text-align:center;font-family:"IBM Plex Mono","Noto Serif SC",monospace;font-size:.78em;color:var(--ink);letter-spacing:.5px;white-space:nowrap}
.dp-today{height:28px;padding:0 14px;border:1px solid var(--border);border-radius:2px;background:var(--card);color:var(--accent);font-family:"Noto Serif SC",serif;font-size:.72em;cursor:pointer;transition:color .15s,border-color .15s,background .15s}
.dp-today:hover{border-color:var(--accent);background:var(--accent-soft)}
.dp-week{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-family:"IBM Plex Mono",monospace;font-size:.6em;color:var(--muted);margin-bottom:4px}
.dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dp-day{height:30px;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--ink);font-family:"Noto Serif SC",serif;font-size:.78em;cursor:pointer;transition:background .12s,color .12s,border-color .12s}
.dp-day:hover{background:var(--accent-soft);color:var(--accent)}
.dp-day.other{color:#c9c4be}
.dp-day.today{border-color:rgba(212,72,60,.35)}
.dp-day.sel{background:var(--accent);color:#fff}
.dp-day.sel:hover{background:var(--accent);color:#fff}
.dp-day.disabled{color:#c9c4be;cursor:not-allowed;background:transparent}
.dp-day.disabled:hover{background:transparent;color:#c9c4be}

/* ── 全站统一自定义下拉（替代原生 select，动画与日期选择器/弹窗一致） ── */
.ui-select{position:relative}
.ui-select::after{content:"";position:absolute;top:50%;right:12px;width:6px;height:6px;border-top:1.6px solid var(--muted);border-right:1.6px solid var(--muted);transform:translateY(-50%) rotate(45deg);transition:transform .35s ease;pointer-events:none}
.ui-select.open::after{transform:translateY(-50%) rotate(135deg)}
.ui-select .sel-trigger{cursor:pointer;padding-right:34px;user-select:none}
.sel-panel{position:fixed;z-index:320;min-width:200px;background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.18);padding:6px;opacity:0;transform:scaleY(.65);transform-origin:top center;transition:transform .35s ease,opacity .2s ease;pointer-events:none}
.sel-panel.show{opacity:1;transform:scaleY(1);pointer-events:auto}
.sel-panel.above{transform-origin:bottom center}
.sel-option{display:flex;align-items:center;gap:8px;width:100%;padding:9px 16px;border:none;border-radius:4px;background:transparent;font-family:"Noto Serif SC",serif;font-size:.82em;color:var(--ink);text-align:left;cursor:pointer;transition:background .12s,color .12s}
.sel-option:hover{background:var(--accent-soft);color:var(--accent)}
.sel-option.sel{color:var(--accent);font-weight:600}
.sel-option .sel-mark{font-family:"IBM Plex Mono",monospace;font-size:.68em;color:var(--accent);opacity:0}
.sel-option.sel .sel-mark{opacity:1}
@media (prefers-reduced-motion: reduce){
  *{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
}

/* ── 变量 ── */
:root {
  --ink: #1a1a1a;
  --paper: #faf8f5;
  --card: #fff;
  --accent: #d4483c;
  --accent-soft: #fef0ee;
  --green: #2d8a56;
  --blue: #3b82f6;
  --muted: #8c8c8c;
  --border: #e8e4df;
  --shadow: 0 1px 3px rgba(0,0,0,.04), 0 1px 2px rgba(0,0,0,.06);
  --btn-bg: #1a1a1a;
  --btn-text: #fff;
}

/* 暗色模式：跟随系统，支持手动覆盖 */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --ink:#e8e4df; --paper:#171513; --card:#201d1a; --accent:#e06a5e;
    --accent-soft:#3a2622; --green:#4caf7d; --blue:#6ea8fe; --muted:#9a938b;
    --border:#3a3530; --shadow:0 1px 3px rgba(0,0,0,.5),0 1px 2px rgba(0,0,0,.6);
    --btn-bg:#3a3530; --btn-text:#f0ebe5;
  }
}
:root[data-theme="dark"] {
  --ink:#e8e4df; --paper:#171513; --card:#201d1a; --accent:#e06a5e;
  --accent-soft:#3a2622; --green:#4caf7d; --blue:#6ea8fe; --muted:#9a938b;
  --border:#3a3530; --shadow:0 1px 3px rgba(0,0,0,.5),0 1px 2px rgba(0,0,0,.6);
  --btn-bg:#3a3530; --btn-text:#f0ebe5;
}

/* ── 重置 ── */
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

/* ── 滚动条 ── */
::-webkit-scrollbar { width: 4px; height: 4px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 0; }
::-webkit-scrollbar-thumb:hover { background: var(--muted); }
* { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }

/* ── 选中 ── */
::selection { background: rgba(212,72,60,.18); color: inherit; }
::-moz-selection { background: rgba(212,72,60,.18); color: inherit; }

/* ── 基础 ── */
html { scrollbar-gutter: stable; }
body {
  font-family: "Noto Serif SC", "PingFang SC", "Microsoft YaHei", serif;
  background: var(--paper);
  color: var(--ink);
  min-height: 100vh;
}

/* ── 顶栏 ── */
.masthead {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin-bottom: 40px;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--border);
}
.masthead .wordmark {
  font-family: "DM Serif Display", "Noto Serif SC", serif;
  font-size: 2em;
  font-weight: 400;
  letter-spacing: -.3px;
}
.masthead .tagline {
  font-family: "IBM Plex Mono", monospace;
  font-size: .82em;
  color: var(--muted);
  font-weight: 400;
}
.masthead a {
  font-size: .72em;
  color: var(--muted);
  text-decoration: none;
  font-family: "IBM Plex Mono", monospace;
}
.masthead a:hover { color: var(--accent); }

/* ── 区块标题 ── */
/* 全局标题：页面大标题用 DM Serif Display（中文自动回退衬线），其余标题用衬线 */
h1 { font-family: "DM Serif Display", "Noto Serif SC", serif; }
h2, h3 { font-family: "Noto Serif SC", "PingFang SC", "Microsoft YaHei", serif; }

.section-head {
  font-family: "Noto Serif SC", "PingFang SC", "Microsoft YaHei", serif;
  font-size: .75em;
  font-weight: 400;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 1.5px;
  margin: 28px 0 14px;
}

/* ── 网格 & 卡片 ── */
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-bottom: 24px;
}
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 2px;
  padding: 20px;
  box-shadow: var(--shadow);
  transition: transform .15s, box-shadow .15s;
  text-decoration: none;
  color: inherit;
  display: block;
  cursor: pointer;
}
.card:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(0,0,0,.08);
}
.card .label {
  font-family: "IBM Plex Mono", monospace;
  font-size: .72em;
  color: var(--accent);
  text-transform: uppercase;
  letter-spacing: 1.2px;
  margin-bottom: 8px;
}
.card .title {
  font-size: 1.1em;
  font-weight: 600;
  margin-bottom: 4px;
  line-height: 1.4;
}
.card .sub {
  font-size: .88em;
  color: var(--muted);
  line-height: 1.5;
}
.card.disabled {
  opacity: .45;
  pointer-events: none;
  cursor: not-allowed;
  filter: grayscale(1);
}
.card.disabled:hover {
  transform: none;
  box-shadow: var(--shadow);
}

/* ── 页脚 ── */
.footer {
  padding: 16px 0 12px;
  border-top: 1px solid var(--border);
  font-family: "IBM Plex Mono", monospace;
  font-size: .7em;
  color: var(--muted);
  text-align: center;
}
.footer a { color: var(--muted); text-decoration: none; }
.footer a:hover { color: var(--accent); }
.footer .sep { opacity: .6; margin: 0 3px; }
.footer-copy { margin-bottom: 6px; }
.footer-beian img { height: 14px; vertical-align: middle; margin-right: 3px; }

.theme-toggle {
  display: inline-block;
  margin: 0;
  background: none;
  border: 1px solid var(--border);
  color: var(--ink);
  cursor: pointer;
  padding: 4px 12px;
  font-size: .72em;
  border-radius: 2px;
  font-family: inherit;
  transition: color .15s, border-color .15s, background .15s, transform .12s ease;
}
.theme-toggle:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.theme-toggle:active { transform: scale(.94); }

/* 暗色模式下热力图柔化：降低饱和度与亮度，避免刺眼 */
[data-theme="dark"] .heatmap-cell,
[data-theme="dark"] .heatmap-legend-cell { filter: saturate(.6) brightness(.78); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .heatmap-cell,
  :root:not([data-theme="light"]) .heatmap-legend-cell { filter: saturate(.6) brightness(.78); }
}

/* 暗色模式下全站彩色元素统一柔化（数字、条、饼图、标签、徽章、头像、气泡等） */
[data-theme="dark"] .stat-card .num,
[data-theme="dark"] .stat-box .v,
[data-theme="dark"] .countdown-num,
[data-theme="dark"] .today-num,
[data-theme="dark"] .tp-icon,
[data-theme="dark"] .tp-amt,
[data-theme="dark"] .p-net,
[data-theme="dark"] .exp-amount,
[data-theme="dark"] .t-amt,
[data-theme="dark"] .net-val,
[data-theme="dark"] .stat-value,
[data-theme="dark"] .weather-meta-dot,
[data-theme="dark"] .h-dot,
[data-theme="dark"] .status-dot,
[data-theme="dark"] .chip .dot,
[data-theme="dark"] .f-chip .dot,
[data-theme="dark"] .dot,
[data-theme="dark"] .tag,
[data-theme="dark"] .mon-bar,
[data-theme="dark"] .hour-bar,
[data-theme="dark"] .dist-bar,
[data-theme="dark"] .pie,
[data-theme="dark"] .pie-row .dot,
[data-theme="dark"] .tl-seg,
[data-theme="dark"] .avatar-circle,
[data-theme="dark"] .si-icon,
[data-theme="dark"] .fi-badge,
[data-theme="dark"] .role-badge,
[data-theme="dark"] .status-badge,
[data-theme="dark"] .me-tag,
[data-theme="dark"] .part-mini.payer,
[data-theme="dark"] .top-payer,
[data-theme="dark"] .btn-mini.ok,
[data-theme="dark"] .btn-mini.warn,
[data-theme="dark"] .msg.user .msg-bubble { filter: saturate(.72) brightness(.9); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .stat-card .num,
  :root:not([data-theme="light"]) .stat-box .v,
  :root:not([data-theme="light"]) .countdown-num,
  :root:not([data-theme="light"]) .today-num,
  :root:not([data-theme="light"]) .tp-icon,
  :root:not([data-theme="light"]) .tp-amt,
  :root:not([data-theme="light"]) .p-net,
  :root:not([data-theme="light"]) .exp-amount,
  :root:not([data-theme="light"]) .t-amt,
  :root:not([data-theme="light"]) .net-val,
  :root:not([data-theme="light"]) .stat-value,
  :root:not([data-theme="light"]) .weather-meta-dot,
  :root:not([data-theme="light"]) .h-dot,
  :root:not([data-theme="light"]) .status-dot,
  :root:not([data-theme="light"]) .chip .dot,
  :root:not([data-theme="light"]) .f-chip .dot,
  :root:not([data-theme="light"]) .dot,
  :root:not([data-theme="light"]) .tag,
  :root:not([data-theme="light"]) .mon-bar,
  :root:not([data-theme="light"]) .hour-bar,
  :root:not([data-theme="light"]) .dist-bar,
  :root:not([data-theme="light"]) .pie,
  :root:not([data-theme="light"]) .pie-row .dot,
  :root:not([data-theme="light"]) .tl-seg,
  :root:not([data-theme="light"]) .avatar-circle,
  :root:not([data-theme="light"]) .si-icon,
  :root:not([data-theme="light"]) .fi-badge,
  :root:not([data-theme="light"]) .role-badge,
  :root:not([data-theme="light"]) .status-badge,
  :root:not([data-theme="light"]) .me-tag,
  :root:not([data-theme="light"]) .part-mini.payer,
  :root:not([data-theme="light"]) .top-payer,
  :root:not([data-theme="light"]) .btn-mini.ok,
  :root:not([data-theme="light"]) .btn-mini.warn,
  :root:not([data-theme="light"]) .msg.user .msg-bubble { filter: saturate(.72) brightness(.9); }
}

/* 暗色模式：View Transitions 圆形揭示（从按钮圆心扩散） */
::view-transition-old(root),
::view-transition-new(root) {
  animation: none;
  mix-blend-mode: normal;
}

/* 统一自定义复选框（对勾严格居中） */
input[type="checkbox"].ui-check {
  appearance: none;
  -webkit-appearance: none;
  width: 14px;
  height: 14px;
  margin: 0;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 3px;
  background: var(--card);
  cursor: pointer;
  display: inline-block;
  vertical-align: -2px;
  position: relative;
  flex-shrink: 0;
  box-shadow: inset 0 1px 2px rgba(0,0,0,.03);
  transition: border-color .15s, background .15s, box-shadow .15s;
}
input[type="checkbox"].ui-check:hover { border-color: var(--accent); }
input[type="checkbox"].ui-check:checked {
  background: var(--accent);
  border-color: var(--accent);
}
input[type="checkbox"].ui-check:checked::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 4px;
  height: 8px;
  border: solid #fff;
  border-width: 0 2px 2px 0;
  transform: translate(-50%, -58%) rotate(45deg);
}
input[type="checkbox"].ui-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
input[type="checkbox"].ui-check:disabled { opacity: .5; cursor: not-allowed; }

/* 隐藏原生数字输入框上下箭头 */
input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

/* 统一键盘焦点样式（替代浏览器默认） */
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* 权限勾选区 */
.perm-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 12px; }
.check-row { display: flex; align-items: center; gap: 8px; font-size: .82em; color: var(--ink); cursor: pointer; }

/* ── 横幅 ── */
.banner {
  background: var(--accent-soft);
  border: 1px solid rgba(212,72,60,.15);
  border-radius: 8px;
  padding: 12px 18px;
  margin-bottom: 28px;
  font-size: .82em;
  color: var(--accent);
  text-align: center;
  font-family: "IBM Plex Mono", monospace;
}

/* ── 页面标题 ── */
.page-title {
  text-align: left;
  margin-bottom: 36px;
}
.page-title h1 {
  font-family: "DM Serif Display", "Noto Serif SC", serif;
  font-size: 2.8em;
  font-weight: 400;
  letter-spacing: -.5px;
  margin-bottom: 6px;
}
.page-title .sub {
  font-family: "IBM Plex Mono", monospace;
  font-size: .72em;
  color: var(--muted);
}

/* ── 系统状态条 ── */
.stats-bar {
  display: flex;
  gap: 10px;
  margin-bottom: 36px;
}
.stat-card {
  flex: 1;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 2px;
  padding: 14px 16px;
  box-shadow: var(--shadow);
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
  align-self: stretch;
}
.stat-icon {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: "IBM Plex Mono", monospace;
  font-size: .72em;
  font-weight: 500;
  flex-shrink: 0;
}
.stat-icon.cpu { background: #eef5ff; color: var(--blue); }
.stat-icon.mem { background: #fef3f2; color: #ef4444; }
.stat-icon.disk { background: #f0fdf4; color: #22c55e; }
.stat-icon.net { background: #fefce8; color: #eab308; }
.net-card .net-rows { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.net-row { display: flex; align-items: center; gap: 6px; font-size: .78em; overflow: hidden; }
.net-dir { font-size: .85em; width: 16px; flex-shrink: 0; text-align: center; }
.net-val { font-family: "Noto Serif SC", serif; font-size: 1.3em; font-weight: 400; }
.net-unit { font-size: .6em; color: var(--muted); margin-left: 1px; }
.stat-body { min-width: 0; flex: 1; overflow: hidden; }
.stat-label {
  font-family: "IBM Plex Mono", monospace;
  font-size: .72em;
  font-weight: 500;
  color: #555;
  text-transform: uppercase;
  letter-spacing: 1px;
  white-space: nowrap;
}
.stat-value {
  font-family: "Noto Serif SC", serif;
  font-size: 1.4em;
  font-weight: 400;
  line-height: 1.2;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.stat-unit { font-size: .45em; color: var(--muted); margin-left: 2px; }
.stat-bar-wrap {
  height: 3px;
  background: var(--border);
  margin-top: 4px;
  border-radius: 2px;
  overflow: hidden;
}
.stat-bar-fill {
  height: 100%;
  border-radius: 2px;
  transition: width .6s ease;
}
.stat-bar-fill.cpu { background: var(--blue); }
.stat-bar-fill.mem { background: #ef4444; }
.stat-bar-fill.disk { background: #22c55e; }
.stat-bar-fill.net-dl { background: #3b82f6; }
.stat-bar-fill.net-ul { background: #eab308; }
.stat-bar-wrap.split { display: flex; gap: 1px; }
.stat-bar-wrap.split .stat-bar-fill { flex: 1; }

/* ── Toast ── */
.toast {
  position: fixed;
  top: 20px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--ink);
  color: #fff;
  padding: 10px 24px;
  border-radius: 20px;
  font-size: .82em;
  z-index: 200;
  font-family: "IBM Plex Mono", monospace;
  animation: toastIn .3s ease;
}
.toast.info { background: #555; }
.toast.success { background: var(--green); box-shadow: 0 2px 8px rgba(45,138,86,.25); }
.toast.error { background: var(--accent); box-shadow: 0 2px 8px rgba(212,72,60,.25); }
.toast.out { animation: toastOut .25s ease forwards; }

/* 全局按钮不折行（如“同意”这类短词保持单行） */
button { white-space: nowrap; }

/* Cookie 同意横幅 */
.cookie-banner{position:fixed;left:16px;right:16px;bottom:16px;z-index:400;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;row-gap:8px;gap:12px;max-width:640px;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.18);padding:12px 16px;font-size:.8em;color:var(--ink)}
.cookie-banner > span{flex:1;min-width:0}
.cookie-banner .btn-ghost{flex-shrink:0}
.cookie-banner a{color:var(--accent)}
.cookie-banner .btn-ghost{padding:6px 16px;font-size:.8em}

/* Spinner / 骨架屏 */
.spinner{width:16px;height:16px;border:2px solid rgba(0,0,0,.15);border-top-color:var(--accent);border-radius:50%;display:inline-block;vertical-align:-3px;animation:ui-spin .7s linear infinite}
@keyframes ui-spin{to{transform:rotate(360deg)}}
.skeleton{position:relative;overflow:hidden;background:var(--border);border-radius:4px}
.skeleton::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent);animation:ui-shimmer 1.4s infinite}
@keyframes ui-shimmer{to{transform:translateX(100%)}}

@keyframes toastIn {
  from { opacity: 0; transform: translateX(-50%) translateY(-10px); }
  to { opacity: 1; transform: translateX(-50%) translateY(0); }
}
@keyframes toastOut {
  to { opacity: 0; transform: translateX(-50%) translateY(-8px); }
}

/* ── 响应式 ── */
@media (max-width: 600px) {
  .grid { grid-template-columns: 1fr; }
}
@media (min-width: 800px) {
  .grid { grid-template-columns: 1fr 1fr 1fr; }
}
@media (max-width: 700px) {
  .stats-bar { flex-wrap: wrap; align-items: stretch; }
  .stat-card { flex: 1 1 calc(50% - 5px); padding: 10px 12px; gap: 8px; min-height: 80px; }
  .stat-value { font-size: 1.15em; }
  .stat-icon { width: 32px; height: 32px; font-size: .65em; }
  .net-val { font-size: 1.05em; }
}
@media (max-width: 380px) {
  .stats-bar { flex-direction: column; }
  .stat-card { flex: 1 1 auto; padding: 12px 14px; gap: 10px; }
}
