/* ================= 基础层 ================= */
*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}

html{
  font-size:var(--fs-md);
  -webkit-text-size-adjust:100%;
  scroll-behavior:smooth;
}

body{
  font-family:var(--font);
  font-size:var(--fs-md);
  line-height:var(--lh-body);
  color:var(--text-1);
  background:var(--bg);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  font-feature-settings:"cv11","ss01","tnum";
  /* 后台数据密集：数字等宽，竖列天然对齐 */
  font-variant-numeric:tabular-nums;
  overflow-x:hidden;
}

/* 原生标题标签也纳入规范：字号 / 字重 / 行高全部引用 token。
   这样即便内容里直接写 <h3>，也不会脱离全站排版体系。
   中文标题不要负字距——汉字是等宽方块，紧缩会挤成一团。 */
h1,h2,h3,h4,h5{font-weight:var(--fw-strong);letter-spacing:var(--ls-normal)}
h1{font-size:var(--fs-2xl);line-height:var(--lh-h1);color:var(--text-1)}
h2{font-size:var(--fs-xl);line-height:var(--lh-h2);color:var(--text-1)}
h3{font-size:var(--fs-lg);line-height:var(--lh-h3);color:var(--text-1)}
h4{font-size:var(--fs-md);line-height:var(--lh-h4);color:var(--text-1)}
h5{font-size:var(--fs-sm);line-height:var(--lh-caption);color:var(--text-1)}
p{font-size:var(--fs-body);line-height:var(--lh-body)}

/* ══════════════════════════════════════════════════════════════════
   排版语义类 —— 页面统一的文字角色
   规范表在 tokens.css 顶部（字号/字重/行高/字距/颜色 一一对应）。
   新页面直接用这些类，不要再写 font-size；改 token = 全站同步。
   ══════════════════════════════════════════════════════════════════ */
.t-display{font-size:var(--fs-3xl);font-weight:var(--fw-strong);line-height:var(--lh-display);letter-spacing:var(--ls-tight);color:var(--text-1)}
.t-h1{font-size:var(--fs-2xl);font-weight:var(--fw-strong);line-height:var(--lh-h1);letter-spacing:var(--ls-normal);color:var(--text-1)}
.t-h2{font-size:var(--fs-xl);font-weight:var(--fw-strong);line-height:var(--lh-h2);letter-spacing:var(--ls-normal);color:var(--text-1)}
.t-h3{font-size:var(--fs-lg);font-weight:var(--fw-strong);line-height:var(--lh-h3);letter-spacing:var(--ls-normal);color:var(--text-1)}
.t-h4{font-size:var(--fs-md);font-weight:var(--fw-strong);line-height:var(--lh-h4);letter-spacing:var(--ls-normal);color:var(--text-1)}
.t-sec{font-size:var(--fs-xs);font-weight:var(--fw-strong);line-height:var(--lh-caption);letter-spacing:var(--ls-caps);color:var(--text-4)}
.t-body{font-size:var(--fs-md);font-weight:var(--fw-body);line-height:var(--lh-body);letter-spacing:var(--ls-normal);color:var(--text-1)}
.t-list{font-size:var(--fs-base);font-weight:var(--fw-body);line-height:var(--lh-list);letter-spacing:var(--ls-normal);color:var(--text-2)}
.t-detail{font-size:var(--fs-base);font-weight:var(--fw-body);line-height:var(--lh-detail);letter-spacing:var(--ls-normal);color:var(--text-2)}
.t-strong{font-size:var(--fs-base);font-weight:var(--fw-strong);line-height:var(--lh-list);letter-spacing:var(--ls-normal);color:var(--text-1)}
.t-control{font-size:var(--fs-base);font-weight:var(--fw-strong);line-height:var(--lh-control);letter-spacing:var(--ls-normal);color:var(--text-2)}
.t-label{font-size:var(--fs-sm);font-weight:var(--fw-strong);line-height:var(--lh-caption);letter-spacing:var(--ls-normal);color:var(--text-2)}
.t-caption{font-size:var(--fs-sm);font-weight:var(--fw-body);line-height:var(--lh-caption);letter-spacing:var(--ls-normal);color:var(--text-3)}
.t-hint{font-size:var(--fs-xs);font-weight:var(--fw-body);line-height:var(--lh-hint);letter-spacing:var(--ls-normal);color:var(--text-3)}
.t-micro{font-size:var(--fs-xs);font-weight:var(--fw-strong);line-height:var(--lh-caption);letter-spacing:var(--ls-wide);color:var(--text-4)}
/* 侧栏深空域：字号字重同上，只换颜色 */
.t-nav{font-size:var(--fs-base);font-weight:var(--fw-strong);line-height:var(--lh-nav);letter-spacing:var(--ls-normal);color:var(--nav-text)}
.t-nav-sub{font-size:var(--fs-xs);font-weight:var(--fw-strong);line-height:var(--lh-nav);letter-spacing:var(--ls-caps);color:var(--nav-dim)}

/* 中英混排：给汉字与拉丁之间补一丝自动间距（支持的浏览器生效，不支持则忽略） */
:lang(zh-CN){text-autospace:normal}

button,input,select,textarea{font:inherit;color:inherit}
button{background:none;border:none;cursor:pointer}
a{color:inherit;text-decoration:none}
ul,ol{list-style:none}
img,svg{display:block;max-width:100%}
table{border-collapse:collapse;width:100%}

::selection{background:rgba(47,107,255,.16);color:var(--text-1)}

/* 焦点环：键盘可达性，鼠标点击不显示 */
:focus{outline:none}
:focus-visible{outline:2px solid var(--brand-500);outline-offset:2px;border-radius:var(--r-xs)}

/* 滚动条 —— 细、扁平 */
*{scrollbar-width:thin;scrollbar-color:var(--line-strong) transparent}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#D5DCE6;border-radius:8px;border:2px solid transparent;background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:#B4BECD;background-clip:content-box}
.dk ::-webkit-scrollbar-thumb{background:rgba(94,138,220,.28)}
.dk ::-webkit-scrollbar-thumb:hover{background:rgba(94,138,220,.45)}

/* ================= 图标 ================= */
.ic{
  width:16px;height:16px;flex:0 0 auto;
  display:inline-block;vertical-align:-.14em;
  stroke-width:1.6;
}
.ic--sm{width:14px;height:14px}
.ic--lg{width:20px;height:20px}
.ic--xl{width:24px;height:24px}
.ic--fill{fill:currentColor;stroke:none}

/* ================= 文本工具类 ================= */
.num{font-variant-numeric:tabular-nums;font-feature-settings:"tnum";letter-spacing:var(--ls-normal)}
.mono{font-family:var(--mono);font-variant-numeric:tabular-nums;letter-spacing:var(--ls-tight)}
.t-1{color:var(--text-1)}
.t-2{color:var(--text-2)}
.t-3{color:var(--text-3)}
.t-4{color:var(--text-4)}
.t-ok{color:var(--c-ok)}
.t-warn{color:var(--c-warn)}
.t-danger{color:var(--c-danger)}
.t-info{color:var(--c-info)}
.t-teal{color:var(--c-teal)}
.t-violet{color:var(--c-violet)}
.t-brand{color:var(--brand-500)}
/* 字重工具类名保留，但值统一收敛到规范两档（中文上限 500）：
   历史代码里的 w-600 / w-700 不再产生"更粗"，全站最粗就是 --fw-strong。 */
.w-400{font-weight:var(--fw-body)}
.w-500{font-weight:var(--fw-strong)}
.w-600{font-weight:var(--fw-strong)}
.w-700{font-weight:var(--fw-strong)}
.t-xs{font-size:var(--fs-xs);line-height:var(--lh-caption)}
.t-sm{font-size:var(--fs-sm);line-height:var(--lh-caption)}
.t-md{font-size:var(--fs-base);line-height:var(--lh-list)}
.t-lg{font-size:var(--fs-md);line-height:var(--lh-h4)}
.nowrap{white-space:nowrap}
.center{text-align:center}
.right{text-align:right}
.ellip{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}

/* ================= 布局工具类 ================= */
.row{display:flex;align-items:center;gap:var(--sp-2);min-width:0}
.row-3{gap:var(--sp-3)}
.row-4{gap:var(--sp-4)}
.col{display:flex;flex-direction:column;min-width:0}
.grow{flex:1;min-width:0}
.wrap{flex-wrap:wrap}
.spacer{margin-left:auto}
.gap-1{gap:var(--sp-1)}.gap-2{gap:var(--sp-2)}.gap-3{gap:var(--sp-3)}.gap-4{gap:var(--sp-4)}

/* 通用栅格：auto-fit 天然响应式 */
.grid{display:grid;gap:var(--sp-3);min-width:0}
.grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}
.grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}
.grid--4{grid-template-columns:repeat(4,minmax(0,1fr))}
.grid--auto{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
.grid--auto-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.grid--auto-lg{grid-template-columns:repeat(auto-fit,minmax(340px,1fr))}
.grid--kpi{grid-template-columns:repeat(auto-fit,minmax(212px,1fr))}

/* ================= 动效 ================= */
@keyframes fadeUp{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes pulseRing{
  0%{box-shadow:0 0 0 0 rgba(34,224,200,.55)}
  70%{box-shadow:0 0 0 7px rgba(34,224,200,0)}
  100%{box-shadow:0 0 0 0 rgba(34,224,200,0)}
}
@keyframes sweep{0%{transform:translateX(-100%)}100%{transform:translateX(300%)}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes dash{to{stroke-dashoffset:0}}

.anim-in{animation:fadeUp .32s var(--ease-out) both}

.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
}
