/* ══════════════════════════════════════════════════════════════
   Hyperkey 官网组件库 — 唯一定义
   ══════════════════════════════════════════════════════════════
   这里是官网组件的**唯一实现**。设计系统文档（index.html）和官网
   （website.html）都引用本文件，所以文档里演示的就是官网真正在跑的
   那份代码，不是照着画的样子。

   为什么必须只有一份：2026-08-14 实测，同一批组件曾在两处各写一遍，
   而且已经漂了——.btn 的 gap 一处 7px（还不在间距刻度上）一处 8px，
   .tag 更是同名不同物（控制台那个带前导圆点，营销这个定高 20）。
   同名不同物是「组件不可复用」最典型的形态。

   命名一律 mk- 前缀：控制台已有 .btn / .tag / .card / .panel / .steps
   等同名类，不加前缀会当场撞车。

   颜色一律走 tokens.css，本文件不得出现任何色值字面量——
   node check-tokens.js 会拦。
   ══════════════════════════════════════════════════════════════ */

/* ── 版心与章节节奏 ──
   营销页密度：章节上下 80px（--sp-20），是控制台章节间距的两倍。
   版心 1120，与控制台内容区同宽——落地时两边共用一套栅格。 */
/* 一屏化：节奏收一档（72–116 → 56–84），配合左右重排让各节逼近单屏 */
.mk-sec{padding:clamp(56px,7vw,84px) 0}
.mk-sec>.wrap{position:relative}
/* 节间分隔线：画布语汇——同一底色不做交替，节与节之间用内容宽的 1px 线分段，
   线压在下一节上内边距的顶端（top = 负的节上内边距）。 */
.mk-hero+.mk-sec>.wrap::before,.mk-sec+.mk-sec>.wrap::before{content:"";position:absolute;
  left:0;right:0;top:calc(-1*clamp(56px,7vw,84px));height:1px;
  background:color-mix(in srgb,var(--text-primary) 22%,transparent)}
.mk-sec.ink{background:var(--ink-900)}

/* ── 章节标题体系 ── */
/* 眉标：编号 + 名称。用 mono 是为了和正文拉开体裁，不是为了装饰；
   编号让老板和销售在会议里能直接说「第 6 屏」。 */
.mk-eyebrow{font-family:var(--font-mono);font-size:var(--fs-11);font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:var(--accent-text);margin-bottom:var(--sp-4)}
/* 画布式节头：巨号 accent 编号与小型大写 kicker 基线对齐，压住整节 */
.mk-secno{display:flex;align-items:baseline;gap:18px}
.mk-secno .num{font-weight:800;font-size:clamp(44px,4.6vw,68px);line-height:1;
  letter-spacing:-0.02em;color:var(--accent);font-variant-numeric:tabular-nums}
.mk-secno .kick{font-weight:800;font-size:var(--fs-13);letter-spacing:.1em;
  text-transform:uppercase;color:var(--text-secondary)}
h2.st{margin:0;font-size:clamp(32px,3.6vw,48px);font-weight:700;letter-spacing:-0.015em;line-height:1.08;
  max-width:26ch}
.mk-secno+h2.st{margin-top:22px}
.mk-lead{margin:var(--sp-4) 0 0;font-size:var(--fs-17);line-height:1.7;
  color:var(--text-secondary);max-width:56ch}
.mk-sechd{margin-bottom:var(--sp-8)}
/* 节头副标题不限宽（2026-08-28 用户拍板）：56ch 会把 02/03/05 的长 lead 折成
   两行，节头位一行写到容器右缘；hero/pagehead 的限宽是各自设计稿定的，不动。 */
.mk-sechd .mk-lead{max-width:none}

/* ── 分段控件：轨道内边距 4px，项高 = 容器高 − 4×2 ── */

/* ── 卡片 ── */
.mk-card{background:var(--card-bg);border:1px solid var(--card-border);
  border-radius:var(--radius-xl);padding:var(--sp-6)}
.mk-card p{margin:0;font-size:var(--fs-13);line-height:1.65;color:var(--text-secondary)}
/* 阵列：营销页的列数由「每格要放多少字」决定，不是由页面宽度决定。
   一句话用 4 列，一段话用 3 列，带小标题的完整论述用 2 列。 */
.mk-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--sp-5)}
.mk-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-4)}
.mk-grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-4)}

/* ── 标记 ── */
.mk-tag{display:inline-flex;align-items:center;white-space:nowrap;height:20px;padding:0 7px;
  border-radius:var(--radius-xs);font-size:var(--fs-11);font-weight:600;
  font-family:var(--font-mono);letter-spacing:.02em}
.mk-tag.ok{background:var(--green-subtle);color:var(--green)}
.mk-tag.bad{background:var(--red-subtle);color:var(--red-text)}
.mk-tag.warn{background:var(--orange-subtle);color:var(--orange)}
.mk-tag.mute{background:var(--glass-bg-active);color:var(--text-secondary)}
.mk-tag.acc{background:var(--accent-subtle);color:var(--accent-text)}

/* ── 品牌组标 ── */

/* 暗底站头处在明暗任一主题下都是深色，故轨道与按钮都要显式给暗底值——
   与设计系统 .hfdemo.dark 同一套作用域写法。 */

/* 内页页头（models 等列表页）：单栏标题+一句定位。mk-hero 是首页双栏大 hero
   的规格（上边距 64–112px、标题 34–60px），单栏一句话撑不起那个留白，故收敛
   一档：标题取页面级 30–40px（介于首页 60 与法务页 32 之间），上下边距减半。 */
.mk-pagehead{padding:clamp(36px,4.5vw,60px) 0 clamp(24px,3vw,40px)}
.mk-pagehead h1{margin:0;font-size:var(--fs-44);font-weight:700;letter-spacing:-0.02em;line-height:1.1}
.mk-pagehead .mk-lead{margin:var(--sp-3) 0 0;max-width:560px;font-size:var(--fs-17);line-height:1.6}
/* 统计（设计稿）：mono 大数字 + 小标签，无框直摆黑底上（.pstat 避开全局 .stat 统计卡的框）。 */
.mk-pagehead .pstat{margin-top:var(--sp-8);animation:mk-rise .5s var(--ease) both}
.mk-pagehead .pstat[hidden]{display:none}
.mk-pagehead .pstat .n{font-size:var(--fs-24);font-weight:650}
.mk-pagehead .pstat .l{font-size:var(--fs-12);color:var(--text-tertiary);margin-top:2px}
/* 黑底变体（models 页设计稿口径）：底色进 ink，文字色靠节上 data-theme="dark" 换挡
   （照 mk-final 先例，不手写反色）。黑白交界自成分隔，边距比同底版留得足一点。 */
.mk-pagehead.ink{background:var(--ink-900);padding:clamp(48px,6vw,84px) 0 clamp(40px,5vw,68px)}
.mk-pagehead+.mk-sec{padding-top:clamp(36px,4.5vw,56px)}
.mk-pagehead+.mk-sec>.wrap::before{content:none}

/* hero 标题（2026-08-28）：字号随左列容器宽缩放（cqw）——中文最长行约
   11.5em，8.4cqw × 11.5 ≈ 97cqw，任何宽度下每行正好装下、不再二次折行；
   nowrap 不可用：英文键无 <br> 且行长远超中文，禁折会整行溢屏，
   balance 让英文均衡折行、装得下的中文保持原行。 */
.mk-hero .inner>div:first-child{container-type:inline-size}
h1.mk-h1{text-wrap:balance}

/* 英雄区与页面同底（画布语汇：反色只留给收尾 CTA 一处），左右分栏居中 */
.mk-hero{padding:clamp(64px,8vw,112px) 0 clamp(56px,7vw,96px)}
/* 2026-08-27 改版（设计稿）：首屏与站头改常暗，与收尾 CTA 首尾呼应 */
.mk-hero.ink{background:var(--ink-900)}
/* 固定两列：左列挂 container-type 后 intrinsic 尺寸为 0，auto-fit 的
   minmax(min(100%,…)) 会把列压塌成 2px；1fr 纯按剩余空间分配不依赖内容。 */
.mk-hero .inner{display:grid;grid-template-columns:1fr 1fr;
  gap:48px clamp(32px,4.5vw,72px);align-items:center}
.mk-hero .mk-eyebrow{font-family:var(--font-sans);font-weight:800;font-size:var(--fs-13);
  letter-spacing:.1em}
/* 首屏分级入场：左列五块依次升起，右侧判定卡最后落位 */
@keyframes mk-rise{from{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}
.mk-hero .inner>div:first-child>*{animation:mk-rise .7s var(--ease) both}
.mk-hero .inner>div:first-child>*:nth-child(2){animation-delay:.08s}
.mk-hero .inner>div:first-child>*:nth-child(3){animation-delay:.18s}
.mk-hero .inner>div:first-child>*:nth-child(4){animation-delay:.28s}
.mk-hero .inner>div:first-child>*:nth-child(5){animation-delay:.36s}
.mk-hero .mk-dec{animation:mk-rise .8s var(--ease) .44s both}
@media (prefers-reduced-motion:reduce){
  .mk-hero .inner>div:first-child>*,.mk-hero .mk-dec{animation:none}
}
h1.mk-h1{margin:0;font-size:clamp(28px,10.5cqw,64px);font-weight:700;letter-spacing:-0.022em;line-height:1.12}
.mk-hero .mk-lead{font-size:clamp(16px,1.4vw,19px);line-height:1.7;max-width:50ch}
.mk-hero .mk-cta{display:flex;gap:var(--sp-3);margin-top:var(--sp-8)}
.mk-hero .foot{margin-top:var(--sp-6);font-size:var(--fs-12);letter-spacing:.06em;
  text-transform:uppercase;color:var(--text-tertiary)}

/* 实时决策面板：把 PDP 的判定过程直接摆出来，比任何形容词都有说服力 */
.mk-dec{background:var(--solid-bg);border:1px solid var(--card-border);
  border-radius:var(--radius-xl);overflow-x:auto}

.mk-dec .mk-ph{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);
  border-bottom:1px solid var(--card-border);font-family:var(--font-mono);
  font-size:var(--fs-11);color:var(--text-secondary);letter-spacing:.06em;text-transform:uppercase}
.mk-dec .mk-dot{width:6px;height:6px;border-radius:var(--radius-full);background:var(--green);flex:0 0 auto}
.mk-dec .mk-row{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--card-border)}
.mk-dec .mk-row:last-child{border-bottom:0}
.mk-dec .mk-r1{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px var(--sp-2);
  font-family:var(--font-mono);font-size:var(--fs-12)}
.mk-dec .mk-who,.mk-dec .mk-dept,.mk-dec .mk-model{white-space:nowrap}
.mk-dec .mk-who{font-weight:650;color:var(--text-primary)}
.mk-dec .mk-dept{color:var(--text-secondary)}
.mk-dec .mk-model{color:var(--text-secondary)}
.mk-dec .mk-cost{margin-left:auto;color:var(--text-secondary);font-variant-numeric:tabular-nums}
.mk-dec .mk-r2{display:flex;flex-wrap:wrap;align-items:center;gap:4px var(--sp-2);margin-top:6px}
.mk-dec .mk-why{font-family:var(--font-mono);font-size:var(--fs-11);color:var(--text-secondary)}
.mk-dec .mk-why.bad{color:var(--red-text)}
/* 七个检查点用七颗圆点表示进度——不靠颜色单独承担，右侧另有明文结论 */
.mk-pips{display:flex;gap:3px}
.mk-pips i{width:5px;height:5px;border-radius:var(--radius-full);background:var(--glass-bg-active)}
.mk-pips i.p-ok{background:var(--green)} .mk-pips i.p-bad{background:var(--red)}
.mk-pips i.p-run{background:var(--orange)}
.mk-dec .mk-pf{padding:var(--sp-3) var(--sp-4);font-family:var(--font-mono);font-size:var(--fs-10);
  color:var(--text-secondary);letter-spacing:.08em;line-height:1.8;border-top:1px solid var(--card-border)}

.mk-steps{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-6)}
.mk-step{display:flex;align-items:center;gap:var(--sp-2);padding:0 12px;height:32px;
  border-radius:var(--radius-sm);border:1px solid var(--card-border);background:var(--card-bg);
  font-size:var(--fs-13);color:var(--text-secondary);cursor:pointer;
  transition:all var(--dur) var(--ease)}
.mk-step .n{font-family:var(--font-mono);font-size:var(--fs-11);color:var(--text-tertiary)}
.mk-step:hover{background:var(--glass-bg-hover)}
.mk-step.on{background:var(--bg-selected);border-color:var(--accent-line);
  color:var(--text-primary);font-weight:600}
.mk-step.on .n{color:var(--accent-text)}
.mk-stepbody{border:1px solid var(--card-border);border-radius:var(--radius-xl);
  background:var(--card-bg);padding:var(--sp-6)}
.mk-stepbody p{margin:0;color:var(--text-secondary);line-height:1.7;max-width:52em}
.mk-stepbody .kv{margin-top:var(--sp-5);display:flex;flex-wrap:wrap;gap:var(--sp-2)}

.mk-tree{font-family:var(--font-mono);font-size:var(--fs-12);line-height:2.1;color:var(--text-secondary)}
.mk-tree b{color:var(--text-primary);font-weight:650}
.mk-loop{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-4)}

.mk-tier{display:flex;flex-direction:column;border:1px solid var(--card-border);
  border-radius:var(--radius-xl);background:var(--card-bg);padding:var(--sp-6)}
.mk-tier ul{margin:0 0 var(--sp-6);padding:0;list-style:none;display:grid;gap:var(--sp-3)}
.mk-tier li{display:flex;gap:var(--sp-3);font-size:var(--fs-13);line-height:1.6;
  color:var(--text-secondary)}
.mk-tier li::before{content:"—";color:var(--text-tertiary);flex:0 0 auto}
/* 主推档反色：整卡转深色，而不是只给按钮上色——
   一张卡里只做一个强调，避免与相邻卡的 primary 按钮打架 */
/* 反色卡挂 data-theme="dark"（HTML 属性），内部语义令牌自动换档：
   lab 取 accent-text 暗档 #2E93FF、::before 取 tertiary 暗档 .30——与原字面量逐位相同；
   li 由 .62 归到 secondary 暗档 .52、标题由纯白归到 primary .92——微调，向令牌靠拢。
   color 要在这里重取一次：换档只换变量表，不重取的话继续继承页面的亮档字色。 */
/* 主推档不用反色——系统原则：反色只留给英雄区和收尾 CTA。
   之前这里是 ink 底，亮档抢戏、暗档隐形（和暗页底只差一个色阶）。
   强调改用主色语汇：描边 + 眉标提色 + 「推荐」小标 + 唯一的 primary 按钮。 */
.mk-tier.hi{border-color:var(--accent-line)}
/* 主推卡的眉标提到主色调：普通卡眉标是 tertiary，这层强调是 .hi 的语义，
   不是暗档的副产品——挂了暗档后仍要显式给。 */
.mk-tier.hi .lab{color:var(--accent-text)}

.mk-final{background:var(--ink-900);padding:clamp(84px,10vw,128px) 0}
.mk-final h2{margin:0;font-size:clamp(38px,5vw,72px);font-weight:700;letter-spacing:-0.018em;line-height:1.05}
.mk-final .mk-lead{font-weight:800;font-size:clamp(18px,2vw,26px);line-height:1.4;
  color:var(--text-primary);max-width:none}
.mk-final .mk-cta{display:flex;gap:var(--sp-3);margin-top:36px}

/* .4 压在 #0B0B0C 上只有 3.78，不达正文门槛；实算 .45 才到 4.5，取 .5 留余量 */

/* ── 以下来自设计系统文档：官网尚未用到，但同属官网组件 ── */
/* ══ 官网独有组件 ══
   判据：只在营销页出现、不进控制台的，才放这里。
   与控制台组件的差别只在「密度」和「字阶」，调色板完全共用——
   官网不得引入控制台没有的颜色。
   全部用 mk- 前缀：.hero / .panel / .steps 在本文档里已另有所指
   （分别是本页页头、控制台面板、流程步骤条），不能复用。 */

/* 营销字阶只用两档大字：英雄区 56、章节标题 44。控制台最大只到 32，
   两边不共用——控制台出现 44 以上一律是错的。 */
.mk-h1{margin:0;font-size:clamp(34px,4.4vw,60px);font-weight:700;letter-spacing:-0.022em;line-height:1.08}
.mk-h2{margin:0;font-size:var(--fs-44);font-weight:700;letter-spacing:-0.03em;line-height:1.14;max-width:15em}

/* 英雄区：左文右证。右侧刻意放会动的真实产物（策略判定流），
   不放插画——形容词说服不了买单的人，判定结果可以。
   网格挂在 .mk-hero .inner 上（见上面英雄区那节），不挂在 .mk-hero 自身——
   .mk-hero 是通栏底色带，版心由内层 .inner 收；两者合一就没法做通栏反色。 */
.mk-hero .cta{display:flex;gap:var(--sp-3);margin-top:var(--sp-8)}
.mk-hero .fine{margin-top:var(--sp-6);font-family:var(--font-mono);
  font-size:var(--fs-11);color:var(--text-secondary);letter-spacing:.04em}

/* 实时判定面板 */
.mk-dec .h{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);
  border-bottom:1px solid var(--card-border);font-family:var(--font-mono);
  font-size:var(--fs-11);color:var(--text-secondary);letter-spacing:.06em;text-transform:uppercase}
.mk-dec .h i{width:6px;height:6px;border-radius:var(--radius-full);background:var(--green);flex:0 0 auto}
.mk-dec .row{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--card-border)}
.mk-dec .row:last-child{border-bottom:0}
.mk-dec .r1{display:flex;align-items:baseline;gap:var(--sp-2);font-family:var(--font-mono);font-size:var(--fs-12)}
.mk-dec .who{font-weight:650;color:var(--text-primary)}
.mk-dec .dept{color:var(--text-secondary)}
.mk-dec .model{color:var(--text-secondary)}
.mk-dec .cost{margin-left:auto;color:var(--text-secondary);font-variant-numeric:tabular-nums}
.mk-dec .r2{display:flex;align-items:center;gap:var(--sp-2);margin-top:6px}
.mk-dec .why{font-family:var(--font-mono);font-size:var(--fs-11);color:var(--text-secondary)}
.mk-dec .why.bad{color:var(--red-text)}
/* 七颗圆点 = 七道检查的进度。颜色不单独承担含义，右侧另有明文结论 */
.mk-pips i.ok{background:var(--green)} .mk-pips i.bad{background:var(--red)}
.mk-pips i.run{background:var(--orange)}

/* 步骤选择器：把一条长流程拆成可点的环，每次只讲一环。
   比一次铺七段文字的转化率高，也让销售能停在某一环上讲。 */
.mk-stepbody h4{margin:0 0 var(--sp-2);font-size:var(--fs-20);font-weight:650;letter-spacing:-0.02em}

/* 定价卡：主推档整卡反色，而不是只把按钮点亮——
   一张卡只做一个强调，否则会跟相邻卡的 primary 按钮抢。 */
.mk-tier .lab{font-family:var(--font-mono);font-size:var(--fs-11);letter-spacing:.12em;
  text-transform:uppercase;color:var(--text-tertiary);margin-bottom:var(--sp-3)}
.mk-tier h4{margin:0 0 var(--sp-5);font-size:var(--fs-20);font-weight:650;letter-spacing:-0.02em}
.mk-tier .btn{margin-top:auto;width:100%}

/* 收尾 CTA：整页唯一一处居中排版。居中在控制台是禁止的（扫读起点不定），
   这里成立是因为它没有后续内容，读者到此只需要做一个决定。 */
.mk-final .cta{display:flex;gap:var(--sp-3);justify-content:center;margin-top:var(--sp-8)}

/* ── 官网组件（续）：版心 / 阵列 / 流程 / 树 / 指标 / 对比 / FAQ / 表单 ── */
/* 营销卡内边距比控制台卡大一档（24 对 16）：营销页一屏只放三五张，
   控制台一屏可能有二十张，密度不同 */
.mk-card h5{margin:0 0 var(--sp-2);font-size:var(--fs-17);font-weight:650;letter-spacing:-0.01em}

/* 流程环：定长四步，每步一句。超过四步就该换成步骤选择器（一次只讲一环） */
.mk-loop .lp{border:1px solid var(--card-border);border-radius:var(--radius-lg);
  background:var(--card-bg);padding:var(--sp-5)}
.mk-loop .n{font-family:var(--font-mono);font-size:var(--fs-11);color:var(--accent-text);
  letter-spacing:.1em;text-transform:uppercase;margin-bottom:var(--sp-3)}
.mk-loop h5{margin:0 0 var(--sp-2);font-size:var(--fs-15);font-weight:650}
.mk-loop p{margin:0;font-size:var(--fs-12);line-height:1.65;color:var(--text-secondary)}

/* 组织树：用 mono 画字符树而不是画 SVG——层级关系用缩进就说清楚了，
   而且改一行文案不用重画图 */
.mk-tree .lv{color:var(--text-tertiary)}

/* 指标带：数字用 mono + tabular-nums，多个数字才能上下对齐。
   数字必须有真实出处，没有监控数据就不要放这一带。 */
.mk-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-5)}
.mk-stats .v{font-family:var(--font-mono);font-size:var(--fs-32);font-weight:700;
  letter-spacing:-0.03em;line-height:1;font-variant-numeric:tabular-nums}
.mk-stats .k{margin-top:var(--sp-2);font-size:var(--fs-12);color:var(--text-secondary)}

/* 场景节（困境行 → 能力行）的行距与对齐 */
/* 一屏化后左右列高接近，顶对齐比居中整齐（center 会让矮列下坠错位出大空隙）；
   上边距与列间距同步收紧（2026-08-28 用户点名） */
.mk-sol{margin-top:var(--sp-6);align-items:start;gap:var(--sp-4) clamp(24px,3vw,48px)}
/* 站头下拉导航：桌面浮层；窄容器下整个隐藏，面板走扁平链接 */
.navdd{position:relative;display:inline-flex;align-items:center}
.navdd > a{display:inline-flex;align-items:center;gap:6px}
.navdd > a .caret{opacity:.55;margin-top:1px;transition:transform var(--dur) var(--ease),opacity var(--dur) var(--ease)}
.navdd.open > a{color:var(--text-primary)}
.navdd.open > a .caret{opacity:1;transform:rotate(180deg)}
.navdd .menu{display:none;position:absolute;top:calc(100% + 10px);left:-12px;z-index:120;
  width:280px;padding:8px}
.navdd.open .menu{display:block}
/* 浮层内的菜单项：把站头 .links a 的导航配色重置回 .mi2 的语义，
   两行式（标题+一句解释）用块排；悬停走淡底而不是主色实底——
   大块双行项压实底会显得笨重。 */
.sitehead .links .menu a{display:block;padding:9px 12px;font-size:var(--fs-15);
  color:var(--text-primary)}
.sitehead .links .menu a:hover{background:var(--glass-bg-active);color:var(--text-primary)}
.navdd .menu .gl{margin-top:8px}
.navdd .menu .gl:first-child{margin-top:2px}
/* 菜单项副行：一句解释 */
.menu .mi2 .d{display:block;font-size:var(--fs-12);color:var(--text-secondary);
  margin-top:2px;white-space:normal;line-height:1.5}

/* 横滚表格后的说明段：与表拉开一档 */
.scrollx + .mk-lead{margin-top:var(--sp-4)}

/* 卡内标签组：换行排布，与正文拉开一档 */
.mk-card .kv{display:flex;flex-wrap:wrap;gap:6px;margin:var(--sp-3) 0}

/* 截图占位：控制台实拍位，图就位后把 .ph 换成 <img> 即可 */
.mk-shot{border:1px solid var(--card-border);background:var(--solid-bg);
  border-radius:var(--radius-xl);box-shadow:var(--shadow-md);overflow:hidden}
.mk-shot .ph{display:flex;align-items:center;justify-content:center;aspect-ratio:1440/1000;
  background:var(--card-inner-bg);color:var(--text-tertiary);font-size:var(--fs-13);
  padding:var(--sp-4);text-align:center}
.mk-cap{display:block;margin-top:10px;font-size:var(--fs-12);color:var(--text-tertiary)}
.mk-shotwrap{margin:0}

/* 实时演示面板：限速进度条 / 请求日志轮转（画布版式的组件化移植） */
.mk-live{border:1px solid var(--card-border);background:var(--solid-bg);
  border-radius:var(--radius-xl);box-shadow:var(--shadow-md);overflow:hidden}
.mk-live .hd{display:flex;justify-content:space-between;align-items:center;gap:16px;
  padding:12px var(--sp-5);border-bottom:1px solid var(--card-border)}
.mk-live .hd b{font-size:var(--fs-12);font-weight:700;letter-spacing:.08em;text-transform:uppercase}
.mk-live .liveflag{display:inline-flex;align-items:center;gap:7px;font-size:var(--fs-11);
  letter-spacing:.06em;text-transform:uppercase;color:var(--text-tertiary)}
.mk-live .liveflag i{width:8px;height:8px;border-radius:var(--radius-full);background:var(--accent);
  animation:mk-blink 1.4s ease-in-out infinite}
@keyframes mk-blink{50%{opacity:.25}}
.mk-live .rrow{padding:14px var(--sp-5);border-bottom:1px solid var(--card-border)}
.mk-live .rrow .rt{display:flex;justify-content:space-between;align-items:center;gap:10px;
  flex-wrap:wrap;font-family:var(--font-mono);font-size:var(--fs-12)}
.mk-live .rrow .rt b{font-weight:650}
.mk-live .rrow .rv{color:var(--text-secondary);display:inline-flex;gap:8px;align-items:center;
  font-variant-numeric:tabular-nums}
.mk-live .meter{height:8px;background:var(--glass-bg-active);margin-top:10px;
  border-radius:var(--radius-full);overflow:hidden}
.mk-live .meter i{display:block;height:100%;background:var(--accent);
  border-radius:var(--radius-full);transition:width 1.2s var(--ease)}
.mk-live .meter i.full{background:var(--red)}
.mk-live .ft{padding:10px var(--sp-5);font-size:var(--fs-10);letter-spacing:.08em;
  text-transform:uppercase;color:var(--text-tertiary)}
.mk-live .lgrid{display:grid;gap:10px;align-items:center;padding:10px var(--sp-5);
  border-bottom:1px solid var(--card-border);
  grid-template-columns:minmax(58px,.9fr) minmax(76px,1fr) minmax(0,1.5fr) auto minmax(52px,.7fr)}
.mk-live .lhd span{font-size:var(--fs-10);letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-tertiary)}
.mk-live .lrow{font-family:var(--font-mono);font-size:var(--fs-12)}
.mk-live .lrow .tm{color:var(--text-tertiary)}
.mk-live .lrow .md{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mk-live .lrow .ct{text-align:right}
/* 边框行列表：画布 01/04/05 的列内要点样式（细线上下夹行） */
.mk-rows{border-top:1px solid color-mix(in srgb,var(--text-primary) 22%,transparent);margin-top:36px}
.mk-rows .row{padding:18px 0;border-bottom:1px solid color-mix(in srgb,var(--text-primary) 22%,transparent)}
.mk-rows h5{margin:0;font-size:var(--fs-15);font-weight:700;line-height:1.3}
.mk-rows p{margin:6px 0 0;font-size:var(--fs-13);line-height:1.65;color:var(--text-secondary)}

/* 列内节头网格：画布 01/04/05 把节头放进左/右列 */
.mk-colgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));
  gap:48px clamp(32px,5vw,96px);align-items:center}
.mk-colgrid .mk-sechd{margin-bottom:0}

/* 宽幅三列行：画布 06 的「编号 · 标题 · 描述」通栏列表 */
.mk-krows{border-top:1px solid color-mix(in srgb,var(--text-primary) 22%,transparent);margin-top:44px}
.mk-krows .krow{display:grid;grid-template-columns:minmax(48px,120px) minmax(0,380px) minmax(0,1fr);
  gap:12px clamp(20px,3.5vw,56px);align-items:baseline;padding:28px 0;
  border-bottom:1px solid color-mix(in srgb,var(--text-primary) 22%,transparent)}
.mk-krows .kno{margin:0;font-weight:800;font-size:var(--fs-13);color:var(--accent-text)}
.mk-krows h5{margin:0;font-size:var(--fs-20);font-weight:700;line-height:1.25}
.mk-krows .krow>p:last-child{margin:0;font-size:var(--fs-13);line-height:1.65;
  color:var(--text-secondary);max-width:52ch}
@media (max-width:767px){
  .mk-krows .krow{grid-template-columns:auto minmax(0,1fr)}
  .mk-krows .krow>p:last-child{grid-column:1/-1}
}

/* 模型词条流：大写小标 + 标签流（画布 01 右列，不套卡片壳） */
.mk-klabel{margin:28px 0 0;font-weight:800;font-size:var(--fs-12);letter-spacing:.1em;
  text-transform:uppercase;color:var(--text-secondary)}
.mk-kv{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}

/* 通栏截图（画布 06 宽幅） */
.mk-shotwrap.solo{margin-top:40px}
.mk-shot.wide .ph{aspect-ratio:2880/1200}
.mk-shot img{display:block;width:100%;height:auto}

/* 窄屏：时间列让位给模型名，避免五列互相挤压 */
@media (max-width:767px){
  .mk-live .lgrid{grid-template-columns:minmax(72px,1fr) minmax(0,1.6fr) auto minmax(52px,.7fr)}
  .mk-live .lgrid span:first-child{display:none}
}
/* 滚动入场：JS 给节内主块打 data-reveal，进入视口加 .on 揭示 */
@media (prefers-reduced-motion:no-preference){
  [data-reveal]{opacity:0;transform:translateY(30px);
    transition:opacity .8s var(--ease),transform .8s var(--ease)}
  [data-reveal].on{opacity:1;transform:none}
}
@media (prefers-reduced-motion:reduce){
  .mk-live .liveflag i{animation:none}
  .mk-live .meter i{transition:none}
}

/* 能力行右侧的卡片堆叠列 */
.mk-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-3);align-content:start}
/* 困境卡：红边线指路 + ✗ 前缀。照对比表右列「边线只是指路」的先例，
   不铺红底；✗ 让色盲用户同样分得清（不只靠颜色的既有纪律）。 */
.mk-card.pain{box-shadow:inset 3px 0 0 var(--red)}
.mk-card.pain h5::before{content:"✗";color:var(--red-text);margin-right:7px}
/* 卡内表格后的脚注间距 */
.mk-card table.spec + p{margin-top:var(--sp-3)}

/* 场景面板（mk-stepbody 作控制台演示容器）内的布局节奏：
   间距进组件，演示字符串里不再写内联 style */
.mk-stepbody table.spec{margin-top:var(--sp-5)}
.mk-stepbody .kv{margin-top:var(--sp-5)}
.mk-stepbody .hbars{margin-top:var(--sp-6);display:grid;gap:var(--sp-3)}

/* 对比表：左列是别人的做法，右列是我们的。右列加主色左边线，
   不给整列铺底——铺底会让人觉得在推销，边线只是指路 */
.mk-vs{width:100%;border-collapse:collapse;font-size:var(--fs-13)}
.mk-vs th,.mk-vs td{padding:var(--sp-3) var(--sp-4);text-align:left;
  border-bottom:1px solid var(--card-border);vertical-align:top}
.mk-vs th{font-size:var(--fs-11);font-weight:650;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-tertiary)}
.mk-vs td:first-child{color:var(--text-secondary);width:26%}
.mk-vs .self{color:var(--text-secondary)}
.mk-vs .ours{border-left:2px solid var(--accent);color:var(--text-primary);font-weight:550}
.mk-vs thead .ours{color:var(--accent-text)}

/* FAQ：默认全收起。默认展开等于把一屏问题摊在读者面前，
   而 FAQ 的作用是「有疑问的人自己找」，不是让所有人读一遍 */
.mk-faq{border-top:1px solid var(--card-border)}
.mk-faq details{border-bottom:1px solid var(--card-border)}
.mk-faq summary{list-style:none;cursor:pointer;padding:var(--sp-4) 0;
  font-size:var(--fs-15);font-weight:550;display:flex;align-items:center;gap:var(--sp-3)}
.mk-faq summary::-webkit-details-marker{display:none}
.mk-faq summary::before{content:"+";font-family:var(--font-mono);color:var(--accent-text);
  font-size:var(--fs-17);width:14px;flex:0 0 auto}
.mk-faq details[open] summary::before{content:"−"}
.mk-faq p{margin:0 0 var(--sp-4) 26px;font-size:var(--fs-13);line-height:1.7;color:var(--text-secondary)}

/* 预约演示表单：字段只留三个。营销表单每多一个必填字段就掉一档提交率，
   公司规模、行业、职位这些销售自己能查，不该让访客填 */
.mk-form{display:grid;gap:var(--sp-4);max-width:420px}
.mk-form label{display:grid;gap:6px;font-size:var(--fs-12);color:var(--text-secondary)}
.mk-form input{height:42px;padding:0 14px;border-radius:var(--radius-md);
  border:1px solid var(--input-border);background:var(--input-bg);
  color:var(--text-primary);font-size:var(--fs-15)}
.mk-form input:focus{outline:none;border-color:transparent;box-shadow:0 0 0 3px var(--border-focus);
  background:var(--input-bg-focus)}
.mk-form .hint{font-size:var(--fs-11);color:var(--text-tertiary)}

/* ── 卡片（营销）── 官网用得最多的组件，22 处 */
.mk-card .cap{font-family:var(--font-mono);font-size:var(--fs-11);letter-spacing:.1em;
  text-transform:uppercase;color:var(--text-tertiary);margin-bottom:var(--sp-3)}
/* 一屏化（2026-08-28）：编号并入标题行省一行高度；h5 上不能挂 data-i18n
   （译文替换 innerHTML 会吞掉编号 span），i18n 在各自 span 上 */
.mk-card h5 .cap{margin:0 var(--sp-2) 0 0;display:inline}
/* 左列（mk-sol 半栏）里的仪表盘图区：两栏在半栏内太挤，降单列 */
.mk-sol .chartcols{grid-template-columns:1fr;gap:var(--sp-5)}
/* 官网方案面板加大内边距（20260829 用户反馈「右边太贴」）：右列全是右对齐的重量级
   数据（等宽金额/色条/提示框）顶在 16px 线，观感局促；只覆盖官网 mk-sol 上下文，
   控制台 .panel 不受影响。 */
.mk-sol .panel>header{padding:13px var(--sp-6)}
.mk-sol .panel>.body{padding:var(--sp-6)}
/* 半栏统计三联（2026-08-28）：格宽仅 ~105px，「12 次」在窄视口临界折行。
   值与脚注禁折，gap 与格内边距各收一档腾宽。 */
.mk-sol .statrow3{gap:var(--sp-2)}
.mk-sol .stat{padding:12px}
.stat .v,.stat .d{white-space:nowrap}
.mk-card .ic{width:32px;height:32px;border-radius:var(--radius-md);background:var(--accent-subtle);
  color:var(--accent-text);display:grid;place-items:center;margin-bottom:var(--sp-4)}
/* 可点卡：整卡是热区，不是卡里放个「了解更多」链接。
   链接只有几十像素的热区，整卡有几百——手上有鼠标的人不该被逼着去瞄准。 */
.mk-card.act{cursor:pointer;text-decoration:none;color:inherit;display:block;
  transition:all var(--dur) var(--ease)}
.mk-card.act:hover{border-color:var(--glass-border-hover);background:var(--glass-bg-hover)}
.mk-card.act .go{margin-top:var(--sp-4);display:flex;align-items:center;gap:6px;
  font-size:var(--fs-12);font-weight:550;color:var(--accent-text)}
.mk-card.act:hover .go .ar{transform:translateX(3px)}
.mk-card.act .go .ar{transition:transform var(--dur) var(--ease)}
/* 强调卡：整卡反色。一屏里最多一张，多了就没有强调可言 */
/* 强调卡靠 markup 上的 data-theme="dark" 让变量重新解析，不写死颜色——
   这正是本节文档里那条规矩，自己先守住。h5 与 p 由重解析后的
   --text-primary / --text-secondary 承担，眉标用 --accent-text（暗色档是提亮的 #2E93FF）。 */
.mk-card.hi{border-color:var(--accent-line)}
.mk-card.hi .cap{color:var(--accent-text)}
/* 横向卡：左侧定宽视觉位 + 右侧文字。用于一屏只放两三条、每条要展开讲的场景 */
.mk-card.row{display:grid;grid-template-columns:56px minmax(0,1fr);gap:var(--sp-5);align-items:start}
.mk-card.row .ic{margin-bottom:0;width:56px;height:56px;border-radius:var(--radius-lg)}
/* 一组卡必须等高：文字长短不齐时，不等高的卡底边会参差 */
.mk-grid-2>.mk-card,.mk-grid-3>.mk-card,.mk-grid-4>.mk-card{height:100%}

/* ── 功能矩阵表：套餐 × 能力。营销页最常被逐格比对的表，
   所以每一格必须能独立读懂，不能靠记住列头。 */
.mk-matrix{width:100%;border-collapse:collapse;font-size:var(--fs-13)}
.mk-matrix th,.mk-matrix td{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--card-border)}
.mk-matrix thead th{font-size:var(--fs-11);font-weight:650;letter-spacing:.06em;
  text-transform:uppercase;color:var(--text-tertiary);text-align:center;white-space:nowrap}
.mk-matrix thead th:first-child{text-align:left}
.mk-matrix tbody th{text-align:left;font-weight:550;color:var(--text-primary)}
.mk-matrix td{text-align:center;color:var(--text-secondary)}
/* 有/无不能只靠颜色：√ 与 — 本身就是两个不同的字形，色盲用户照样分得清 */
.mk-matrix .y{color:var(--green);font-weight:700}
.mk-matrix .n{color:var(--text-tertiary)}
/* 分组行把长表切段。一张十几行的矩阵不分组，读者会在中途丢失列头对应关系 */
.mk-matrix .grp td{background:var(--glass-bg-active);font-size:var(--fs-11);font-weight:650;
  letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);text-align:left}
/* 主推列整列描边，不铺底：铺底会把这一列的每一格都变成强调，读者反而找不到重点 */
.mk-matrix .hi{box-shadow:inset 1px 0 0 var(--accent-line),inset -1px 0 0 var(--accent-line)}
.mk-matrix thead .hi{color:var(--accent-text);box-shadow:inset 1px 1px 0 var(--accent-line),inset -1px 0 0 var(--accent-line)}
.mk-matrix tbody tr:last-child .hi{box-shadow:inset 1px 0 0 var(--accent-line),inset -1px -1px 0 var(--accent-line)}

/* ── 模型目录（官网 models 页）：工具条 + 卡片阵列 ──
   与营销卡片的区别在于「同构条目的可比阵列」：条目数不定、读者在横向比价。
   所以栅格用 auto-fill 而不是固定列数（.mk-grid-3 那种），价格一律等宽数字右对齐——
   左对齐的价格在小数位上参差，比价时得逐个数位数。
   卡片外壳直接复用 .mk-card，这里只补它内部缺的三件：调用 id、单价对、工具条。 */
.mdl-bar{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center;margin-bottom:var(--sp-6)}
/* 同 .mdl-grid[hidden]：UA 的 [hidden]{display:none} 压不过上面的类选择器。
   失败态要把工具条收起来——没有数据时留着搜索框和排序，点了什么都不会发生。 */
.mdl-bar[hidden]{display:none}
/* .input/.select 的基础样式带 width:100%（它们本是填满表单列的），
   放进这一行不覆盖掉就会各占一整行、把工具条撑成三行。 */
.mdl-bar .input{flex:1 1 240px;min-width:0;width:auto}
.mdl-bar .select{flex:0 0 auto;width:auto}
/* 条目数必须常驻：搜索把结果筛空时，没有这个数字读者会以为页面坏了而不是没搜到 */
/* 搜索框定宽 280（设计稿）——不跟 .mdl-bar 弹性伸缩 */
.mdl-bar .sw280{width:280px;flex:0 0 auto}
.mdl-count{margin-left:auto;font-size:var(--fs-12);color:var(--text-tertiary);
  font-variant-numeric:tabular-nums}
#mdl-cards[hidden]{display:none}
.mdl-grid{display:grid;gap:var(--sp-4);grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
.mdl-grid[hidden]{display:none}

/* 模型卡（2026-08-27 设计稿）：白卡 + 头行（品牌图标/mono 名/复制钮）+ 分隔线数据格 */
.mdl-card{background:var(--solid-bg);border:1px solid var(--card-border);border-radius:var(--radius-xl);
  padding:var(--sp-5);box-shadow:var(--shadow-xs);display:flex;flex-direction:column;gap:var(--sp-4);
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.mdl-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);border-color:var(--glass-border-hover)}
.mdl-card .hd{display:flex;align-items:center;gap:10px;min-width:0}
/* 品牌图标 20×20（设计稿）：真实 logo 优先（用户拍板），无 logo 族回落字母字标 */
.mdl-card .ic{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;
  border-radius:var(--radius-sm);flex:0 0 auto;overflow:hidden;color:var(--text-on-accent)}
.mdl-card .ic img{width:16px;height:16px;object-fit:contain;display:block}
.mdl-card .ic b{font-family:var(--font-mono);font-size:var(--fs-10);font-weight:700;letter-spacing:-.02em}
.mdl-card .name{font-family:var(--font-mono);font-weight:600;font-size:var(--fs-13);
  min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 复制按钮 hover 卡片才现（设计稿）；触屏没有 hover，media 兜底保持常驻 */
.mdl-card .cp{display:inline-flex;flex:0 0 auto;border:0;background:none;padding:3px;cursor:pointer;
  color:var(--text-tertiary);border-radius:var(--radius-xs);opacity:0;
  transition:opacity var(--dur) var(--ease)}
.mdl-card:hover .cp,.mdl-card .cp:focus-visible,.mdl-card .cp.done{opacity:1}
@media (hover:none){.mdl-card .cp{opacity:1}}
.mdl-card .cp:hover{color:var(--text-primary);background:var(--glass-bg-hover)}
.mdl-card .cp .ok{display:none;color:var(--green)}
.mdl-card .cp.done .ok{display:block}
.mdl-card .cp.done .dup{display:none}
.mdl-card .data{display:flex;gap:var(--sp-6);border-top:1px solid var(--grouped-row-border);padding-top:var(--sp-4)}
.mdl-card .data>span{flex:1 1 0;min-width:0}
.mdl-card .data .l{display:block;font-size:var(--fs-11);color:var(--text-tertiary);margin-bottom:2px}
.mdl-card .data .v{font-family:var(--font-mono);font-size:var(--fs-17);font-weight:650}
.mdl-card .data .u{font-size:var(--fs-11);color:var(--text-tertiary)}

/* 卡片骨架：头行圆标+名条，两格标签/值条 */
.mdl-skel .skel{display:block}
.mdl-skel .hd .i{width:20px;height:20px;border-radius:var(--radius-sm)}
.mdl-skel .hd .t{height:14px;width:55%}
.mdl-skel .data .l{height:10px;width:32px;margin-bottom:6px}
.mdl-skel .data .v{height:18px;width:70%}


/* 图标底色：直接复用 .mk-tag 那五组已验证过对比度的令牌对，不另立色板。
   按模型族确定性分配（见 models.html 的 FAMILIES），同族恒定同色；
   族数多于色数时会重色——这只是视觉区分，不是编码，重了不影响理解。 */
/* 模型族标识：品牌色实底 + 白色内容（白 logo 或白字标）。
   与 .av.brand-* 同一套令牌、同一个思路，只是方章而非圆章。

   为什么用实底而不是浅色底 + 品牌色图形：品牌 logo 都是为浅底设计的，
   直接摆在暗色档的卡片上会糊——实测纯黑的 kimi 标在暗底上对比度只有 1.69，
   远低于图形可辨识的 3.0。实底 + 白 knockout 则两个主题下逐像素一致，
   不需要为暗色档另做一套。
   品牌令牌不参与主题换档（见 tokens.css「第三方品牌色」区的说明）。 */
.ic.brand-openai{background:var(--brand-openai)}
.ic.brand-google{background:var(--brand-google)}
.ic.brand-anthropic{background:var(--brand-anthropic)}
.ic.brand-deepseek{background:var(--brand-deepseek)}
.ic.brand-zhipu{background:var(--brand-zhipu)}
.ic.brand-bailian{background:var(--brand-bailian)}
.ic.brand-kimi{background:var(--brand-kimi)}
.ic.brand-minimax{background:var(--brand-minimax)}
.ic.brand-meta{background:var(--brand-meta)}
.ic.brand-mistral{background:var(--brand-mistral)}
/* 没有登记品牌色的族（新厂商、认不出的名字）走中性底，不硬凑一个颜色 */
.ic.brand-none{background:var(--glass-bg-active);color:var(--text-secondary)}
/* 实底上的内容一律白：与 .av 的 --text-on-accent 同口径（两档都是 #fff） */
.mdl-card .ic{color:var(--text-on-accent)}
.mdl-card .ic.brand-none{color:var(--text-secondary)}

/* ── 规格表：键值对。不是数据表，不要给它加斑马纹和排序 ── */
.mk-spec{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:0;
  border-top:1px solid var(--card-border)}
.mk-spec dt,.mk-spec dd{margin:0;padding:var(--sp-3) 0;border-bottom:1px solid var(--card-border)}
.mk-spec dt{font-size:var(--fs-13);color:var(--text-secondary);padding-right:var(--sp-10)}
.mk-spec dd{font-size:var(--fs-13);color:var(--text-primary);font-family:var(--font-mono);
  font-variant-numeric:tabular-nums}

/* ── 编号要点：画布语汇——10px accent 方块 + 标题里「N — 」计数 ── */
.mk-ol{display:grid;gap:30px;counter-reset:mkol}
.mk-ol > li{display:grid;grid-template-columns:auto minmax(0,1fr);gap:16px;
  align-items:start;list-style:none;counter-increment:mkol}
.mk-ol > li::before{content:"";width:10px;height:10px;margin-top:7px;background:var(--accent)}
.mk-ol h5{margin:0;font-size:var(--fs-17);font-weight:700;line-height:1.3}
.mk-ol h5::before{content:counter(mkol) " — "}
.mk-ol p{margin:6px 0 0;font-size:var(--fs-13);line-height:1.65;color:var(--text-secondary);max-width:48ch}

/* ── 时间线：竖线串起里程碑。与编号步骤的区别是「时间既定」而非「按顺序做」 ── */
.mk-tl{display:grid;gap:0;position:relative}
.mk-tl > li{display:grid;grid-template-columns:14px minmax(0,1fr);gap:var(--sp-5);
  list-style:none;padding-bottom:var(--sp-6);position:relative}
.mk-tl > li::before{content:"";width:9px;height:9px;margin-top:6px;margin-left:2px;
  border-radius:var(--radius-full);background:var(--card-border);
  box-shadow:0 0 0 3px var(--bg-body);z-index:1}
.mk-tl > li.on::before{background:var(--accent)}
/* 竖线画在每一项上而不是容器上，最后一项去掉——否则线会拖出一截空尾巴 */
.mk-tl > li::after{content:"";position:absolute;left:6px;top:12px;bottom:0;width:1px;
  background:var(--card-border)}
.mk-tl > li:last-child{padding-bottom:0}
.mk-tl > li:last-child::after{display:none}
.mk-tl .when{font-family:var(--font-mono);font-size:var(--fs-11);color:var(--text-tertiary);
  letter-spacing:.06em}
.mk-tl h5{margin:2px 0 4px;font-size:var(--fs-15);font-weight:650}
.mk-tl p{margin:0;font-size:var(--fs-13);line-height:1.7;color:var(--text-secondary)}

/* ══════════════════════════════════════════════════════════════
   控制台组件
   ══════════════════════════════════════════════════════════════
   与上面的官网组件同处一个文件、同一套令牌，但用途不同：
   控制台是每天来八小时的工作面，密度高、字号小、不做大留白。
   两边共用调色板，不共用密度——详见文档里的密度对照表。
   ══════════════════════════════════════════════════════════════ */
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}

/* ── 按钮 ── */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;font-family:inherit;
  font-weight:550;font-size:var(--fs-13);border:1px solid transparent;cursor:pointer;
  transition:all var(--dur) var(--ease);text-decoration:none;white-space:nowrap;height:32px;padding:0 14px;
  border-radius:var(--radius-sm);background:var(--solid-bg);color:var(--text-primary);
  border-color:var(--btn-border-subtle)}
.btn:hover{background:var(--glass-bg-hover);border-color:var(--glass-border-hover)}
.btn-primary{background:var(--accent);color:var(--text-on-accent);border-color:transparent}
.btn-primary:hover{background:var(--accent-hover)}
.btn-tint{background:var(--accent-subtle);color:var(--accent);border-color:transparent}
.btn-danger{background:var(--red-subtle);color:var(--red-text);border-color:transparent}
.btn-ghost{background:transparent;border-color:transparent;color:var(--text-secondary)}
.btn-ghost:hover{background:var(--glass-bg-active);color:var(--text-primary)}
/* 控件尺寸阶梯只有三档：sm 28 / md 32 / lg 42。
   任何能与按钮并排出现的东西（分段控件、分页项、搜索框、Tag 输入）都必须落在这三档上，
   否则工具栏里会出现 26/30/32 混排——这是"没统一"最常见的来源。 */
.btn-sm{height:28px;padding:0 10px;font-size:var(--fs-12);border-radius:var(--radius-xs)}
.btn-lg{height:42px;padding:0 20px;font-size:var(--fs-15);border-radius:var(--radius-md)}
.btn:disabled{opacity:.42;cursor:not-allowed}
.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--border-focus)}

/* ── 输入 ── */
.input,.textarea,.select{font-family:inherit;font-size:var(--fs-13);color:var(--text-primary);
  background:var(--input-bg);border:1px solid var(--input-border);outline:none;width:100%;
  transition:all var(--dur) var(--ease);height:32px;padding:0 11px;border-radius:var(--radius-sm)}
.textarea{height:auto;padding:9px 11px;min-height:76px;resize:vertical;line-height:1.55}
/* select 必须去掉原生箭头。原生箭头贴右边缘、且各平台长相不一，
   是"没被设计系统接管"最显眼的一处。自绘 chevron 距右 11px，与 input 内边距同轴。 */
.select{
  appearance:none;-webkit-appearance:none;padding-right:30px;
  background-repeat:no-repeat;background-position:right 11px center;
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236E6E73' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
}
[data-theme="dark"] .select{
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23808085' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
}
.input::placeholder,.textarea::placeholder{color:var(--text-tertiary)}
/* 禁用态：与 .btn:disabled 同语义（不可交互），底色压成非交互档、文字降一级。
   原本两个控制台在内联 style 里各写一份（实测 12 处，值一模一样）——同一个决定重复 12 遍。 */
.input:disabled,.textarea:disabled,.select:disabled{
  background:var(--glass-bg-active);color:var(--text-tertiary);cursor:not-allowed}
.input:hover,.textarea:hover,.select:hover{border-color:var(--input-border-hover)}
.input:focus,.textarea:focus,.select:focus{background:var(--input-bg-focus);
  border-color:var(--accent);box-shadow:0 0 0 3px var(--border-focus)}
.field{display:flex;flex-direction:column;gap:6px}
.field label{font-size:var(--fs-12);color:var(--text-secondary);font-weight:550}
.searchwrap{position:relative}
.searchwrap .input{padding-left:31px}
.searchwrap svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);
  color:var(--text-tertiary);pointer-events:none}
.kbd{font-family:var(--font-mono);font-size:var(--fs-11);padding:2px 6px;border-radius:var(--radius-xs);
  background:var(--glass-bg-active);color:var(--text-secondary);border:1px solid var(--glass-border)}

/* ── 开关 / 勾选 ── */
/* 开关收小：40×24 是 iOS 原生尺寸，Web 表单里 34×20 更协调 */
.toggle{width:34px;height:20px;border-radius:var(--radius-full);background:var(--toggle-off-bg);
  position:relative;cursor:pointer;transition:background var(--dur) var(--ease);border:none;padding:0;flex:0 0 auto}
.toggle.on{background:var(--accent)}
.toggle i{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:var(--radius-full);
  background:var(--text-on-accent);box-shadow:var(--toggle-knob-shadow);transition:transform var(--dur) var(--ease)}
.toggle.on i{transform:translateX(14px)}
.check,.radio{width:18px;height:18px;border-radius:var(--radius-xs);border:1.5px solid var(--input-border);
  background:var(--input-bg);display:grid;place-items:center;cursor:pointer;flex:0 0 auto;
  transition:all var(--dur) var(--ease)}
.radio{border-radius:var(--radius-full)}
.check.on,.radio.on{background:var(--accent);border-color:var(--accent)}
/* 对勾用 ::after 画，和下面 radio 的圆点同一套做法。
   transform 顺序不能反：translate 必须在 rotate 前面。写成
   rotate(45deg) translate(...) 的话，平移是在旋转后的坐标系里做的，
   想往上 1px 会变成沿 45° 斜着走——实测对勾会偏到左下角去。
   原先写的是 .check.on svg{color:#fff}——指望调用方往 <span> 里塞一个 svg，
   但全站 8 处 check/radio 用例没有一处塞了，那条规则一次都没生效过，
   选中态只有蓝底没有勾。组件自己画，调用方只写 class 就够。 */
.check.on::after{content:"";width:5px;height:9px;
  border:solid var(--text-on-accent);border-width:0 2px 2px 0;
  transform:translate(0.5px,-1px) rotate(45deg)}
.radio.on::after{content:"";width:7px;height:7px;border-radius:var(--radius-full);
  background:var(--text-on-accent)}
.opt{display:inline-flex;align-items:center;gap:8px;font-size:var(--fs-13);cursor:pointer}

/* ── 分段控件 ── */
/* 轨道内边距用变量，方便并排对比取值；对应 AntD 的 Segmented.trackPadding */
/* 已定 4px：四边统一 + 项间距同值，选中块四周恒 4px（左右合计 8px），项高 32 − 4×2 = 24px。
   仍与 AntD 的 trackPadding 模型一致（padding 四边统一、labelHeight = controlHeight − trackPadding×2），
   落地是把 Segmented.trackPadding 设为 4——改的是 token，不是覆盖组件内部类。 */
/* 滑块由页面脚本注入（.seg-thumb）：滑动用过冲贝塞尔，落位时挤压回弹。
   脚本存在时选中片自身的底色转交给滑块（span.on 变透明）。
   减弱动效偏好下动画整体关闭。 */
.seg{--seg-pad:4px;position:relative;
  display:inline-flex;align-items:center;height:32px;background:var(--glass-bg-active);
  border-radius:var(--radius-sm);padding:var(--seg-pad);gap:var(--seg-pad);
  /* 光有 inline-flex 不够：一旦父级是 flex 容器，flex 项会被块化
     （inline-flex→flex），再遇上 align-items:stretch 就被拉满整行。
     实测 12 处 .seg 里有 3 处中招（在 .g-row>.v.col 里，宽 874px 而内容只要 88–222px），
     那个容器的 stretch 是给 .prog / .hint / .tabs 用的，不能改它。
     fit-content 是显式 width，会压过 stretch，且不管父级是 flex/grid/block 都成立。
     分段控件按内容宽是它的定义，没有需要全宽的用例——真要全宽时再加修饰类。 */
  width:fit-content}
.seg.seg-sm{height:28px}
.seg.pad2{--seg-pad:2px} .seg.pad3{--seg-pad:3px} .seg.pad4{--seg-pad:4px}
/* nowrap：容器被压窄时选项字宁可整体溢出也不许竖排折字——
   「跟随系统」在 232px 侧栏里折成两行就是这条缺失的实祸。 */
/* a11y（QA ISSUE-004）：分段项支持 <button>——原先是 <span onClick>，不可聚焦、
   键盘用户完全够不着。button 需重置 UA 的背景/边框/字体，其余样式与 span 共用。 */
.seg button{background:none;border:0;font-family:inherit}
/* 焦点环（QA ISSUE-004）：可聚焦却看不见焦点，对键盘用户等于没修。
   用 outline 而非 .btn 那套 box-shadow——分段项被 .seg 的圆角容器包着，
   实测 box-shadow 画不出来；outline + 负 offset 落在项内边缘，不撑破容器。
   :focus-visible 只在键盘导航时出现，鼠标点击不显示。 */
.seg button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.seg span,.seg button{display:inline-flex;align-items:center;height:100%;padding:0 12px;
  border-radius:var(--radius-xs);font-size:var(--fs-13);font-weight:550;white-space:nowrap;
  color:var(--text-secondary);cursor:pointer;transition:all var(--dur) var(--ease)}
/* 小档随高度同步收窄内边距：28px 高的控件配 12px 项边距，三个中文项就挤爆窄侧栏 */
.seg.seg-sm span,.seg.seg-sm button{padding:0 9px}
.seg span.on,.seg button.on{background:var(--solid-bg);color:var(--text-primary);box-shadow:var(--shadow-xs)}
.seg.accent span.on,.seg.accent button.on{background:var(--accent);color:var(--text-on-accent)}

/* ── 徽章 / 状态 ── */
.badge{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:var(--radius-sm);
  font-size:var(--fs-12);font-weight:600;white-space:nowrap;
  /* 无语义色那档用 secondary 压在 glass-bg-active 上只有 4.28，差一点到门槛。
     badge 是标签不是装饰，必须可读，故用 primary。 */
  background:var(--glass-bg-active);color:var(--text-primary)}
.badge-ok{background:var(--green-subtle);color:var(--green)}
.badge-warn{background:var(--orange-subtle);color:var(--orange)}
.badge-bad{background:var(--red-subtle);color:var(--red-text)}
/* 主色作文字必须用 --accent-text，这是系统自己的规则 */
.badge-acc{background:var(--accent-subtle);color:var(--accent-text)}
.badge-pur{background:var(--purple-subtle);color:var(--purple)}
.badge.pill{border-radius:var(--radius-full)}
.dot{width:7px;height:7px;border-radius:var(--radius-full);flex:0 0 auto}
.statusline{display:inline-flex;align-items:center;gap:7px;font-size:var(--fs-13)}

/* ── 统计卡 ── */
.stat{background:var(--card-inner-bg);border:1px solid var(--card-border);border-radius:var(--radius-xl);
  padding:var(--sp-4)}
.stat .k{font-size:var(--fs-12);color:var(--text-secondary)}
/* 统计卡说明图标（20260829）：纯说明文字收进标题旁 ⓘ 的悬浮提示，卡面留给数据；
   数据型副行（金额/期次）仍走 .d 直接展示 */
.stat .k .tipico{display:inline-flex;align-items:center;margin-left:4px;vertical-align:-2px;
  color:var(--text-tertiary);cursor:help}
.stat .k .tipico:hover{color:var(--text-secondary)}
.stat .v{font-size:var(--fs-24);font-weight:650;letter-spacing:-0.02em;margin-top:5px;font-family:var(--font-mono)}
.stat .d{font-size:var(--fs-12);margin-top:5px;color:var(--green);
  overflow:hidden;text-overflow:ellipsis}
.stat.accent{background:var(--accent);border-color:transparent;color:var(--text-on-accent)}
/* 副文字压 accent 降到 85%：用透明度而不是再造一个字面量 */
.stat.accent .k,.stat.accent .d{color:var(--text-on-accent);opacity:.85}

/* ── 分组列表 ── */
.grouped{background:var(--solid-bg);border:1px solid var(--card-border);border-radius:var(--radius-lg);overflow:hidden}
.grouped .row{display:flex;align-items:center;gap:var(--sp-3);padding:11px var(--sp-4);
  border-bottom:1px solid var(--grouped-row-border)}
.grouped .row:last-child{border-bottom:none}
.grouped .row .lb{font-size:var(--fs-13)}
.grouped .row .sb{font-size:var(--fs-12);color:var(--text-secondary);margin-top:2px}
.grouped .row .rt{margin-left:auto;display:flex;align-items:center;gap:var(--sp-3);
  font-size:var(--fs-13);color:var(--text-secondary)}

/* ── 面板 / 窗口 ── */
.panel{background:var(--solid-bg);border:1px solid var(--card-border);border-radius:var(--radius-lg);
  overflow:hidden;box-shadow:var(--shadow-xs)}
.panel > header{display:flex;align-items:center;gap:var(--sp-3);padding:11px var(--sp-4);
  border-bottom:1px solid var(--card-border);font-size:var(--fs-13);font-weight:600}
.panel > .body{padding:var(--sp-4)}

/* ── 表格：密集区用实色底，不铺玻璃 ── */
.tablewrap{background:var(--solid-bg);border:1px solid var(--card-border);
  border-radius:var(--radius-lg);overflow:hidden}
table.t{width:100%;border-collapse:collapse;font-size:var(--fs-13)}
table.t th{text-align:left;font-size:var(--fs-11);font-weight:700;letter-spacing:0.06em;
  /* 表头是内容不是装饰——列名决定整列怎么读，必须达门槛。
     --text-tertiary 在两个主题下都只有 2.6，不能用于承载语义的文字。 */
  text-transform:uppercase;color:var(--text-secondary);padding:9px var(--sp-4);
  border-bottom:1px solid var(--card-border);background:transparent}
table.t td{padding:10px var(--sp-4);border-bottom:1px solid var(--grouped-row-border)}
/* 半栏内的演示表：格内禁折——被压时逐字竖排比横滚糟得多；宽度不够走 tablewrap 横滚 */
.mk-sol table.t th,.mk-sol table.t td{white-space:nowrap}
table.t tbody tr:last-child td{border-bottom:none}
table.t tbody tr:hover{background:var(--glass-bg-hover)}
table.t th.n,table.t td.n{text-align:right}
/* 等宽列（ID、密钥、时间戳这类）用次要色：它们是定位用的标识，不是要读的内容。
   原本 13 处写在内联 style 里，同一个决定重复 13 遍。 */
table.t td.mono{color:var(--text-secondary)}
/* 零值降一档，和有值的行拉开——避免满屏 0 抢注意力 */
table.t td.zero{color:var(--text-tertiary)}
.n .pos{color:var(--green)} .n .neg{color:var(--red-text)} .n .zero{color:var(--text-secondary)}

/* ── 进度 ── */
.prog{height:8px;border-radius:var(--radius-full);background:var(--glass-bg-active);overflow:hidden;display:flex}
.prog i{height:100%;display:block}
.prog .a{background:var(--accent)} .prog .b{background:var(--accent);opacity:.45}
/* 预算/用量的告警档：与 .hbar .tr i 同一套语义色（近阈值橙、超限红） */
.prog i.warn{background:var(--orange)} .prog i.bad{background:var(--red)}
.prog.lg{height:12px}
.legend{display:flex;gap:var(--sp-4);margin-top:10px;font-size:var(--fs-12);color:var(--text-secondary);flex-wrap:wrap}
.legend i{width:9px;height:9px;border-radius:var(--radius-2xs);display:inline-block;margin-right:6px;vertical-align:-1px}

/* ── 提示 ── */
.hint{display:flex;gap:11px;padding:12px var(--sp-4);border-radius:var(--radius-lg);font-size:var(--fs-13);
  line-height:1.6;background:var(--accent-subtle);color:var(--text-primary);border:1px solid transparent}
.hint svg{flex:0 0 auto;margin-top:1px;color:var(--accent)}
.hint.ok{background:var(--green-subtle)} .hint.ok svg{color:var(--green)}
.hint.warn{background:var(--orange-subtle)} .hint.warn svg{color:var(--orange)}
.hint.bad{background:var(--red-subtle)} .hint.bad svg{color:var(--red-text)}
.hint b{display:block;margin-bottom:3px}
/* 提示条里放操作（切档/展开）时，正文占满剩余宽把操作推到右端；min-width:0 让长文本能省略而不撑破 */
.hint .grow{flex:1;min-width:0}
.hint .acts{display:flex;align-items:center;gap:var(--sp-2);flex:0 0 auto}
/* 外壳级横幅（受限提示 / 工作区状态 / 订阅锁定）：挂在 .hint 之后，只管外壳里的位置。
   左右边距必须与 .pagehd / .pagebody 同为 --sp-8——此前三处横幅硬编码 36px，比页面内容
   两侧各多缩 4px，横幅比下面的卡片窄一圈、左边也和标题对不齐。 */
.shellhint{margin:var(--sp-3) var(--sp-8) 0;align-items:center;flex-wrap:wrap;font-weight:600}

/* 就地编辑卡：详情抽屉里「点编辑就地展开」的那一小块（预算/允许模型等）。
   与整屉表单式提交相对——每段自己保存，故各自成卡，视觉上和只读行区分开。 */
.inlinecard{margin-top:10px;display:grid;gap:var(--sp-2);padding:12px 13px;
  border:1px solid var(--glass-bg-active);border-radius:var(--radius-md);background:var(--solid-bg)}

/* ── Toast ── */
.toast{display:flex;gap:11px;align-items:flex-start;padding:12px var(--sp-4);border-radius:var(--radius-lg);
  background:var(--bg-popover);border:1px solid var(--glass-border);box-shadow:var(--shadow-lg);
  backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);max-width:400px}
.toast .tt{font-size:var(--fs-13);font-weight:600}
.toast .td{font-size:var(--fs-12);color:var(--text-secondary);margin-top:2px;line-height:1.55}
/* 前导状态图标跟标题首行对齐（它标注的是这条通知的性质）；
   尾部动作按钮垂直居中于整条 Toast——它对应的是整条通知，不是标题那一行。
   容器是 align-items:flex-start，所以这里必须显式 align-self:center。 */
.toast .ta{margin-left:auto;align-self:center;flex:0 0 auto}
/* 浮动形态：整页级轻提示（如「即将上线」）。视觉沿用 .toast 本体，
   这里只管定位与出入场。 */
.toast.float{position:fixed;left:50%;bottom:32px;transform:translateX(-50%) translateY(8px);
  z-index:200;opacity:0;pointer-events:none;
  transition:opacity var(--dur) var(--ease),transform var(--dur) var(--ease)}
.toast.float.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ── 弹窗 ── */
.modal{max-width:420px;background:var(--bg-popover);border:1px solid var(--glass-border);
  border-radius:var(--radius-xl);box-shadow:var(--shadow-xl);backdrop-filter:blur(30px);
  -webkit-backdrop-filter:blur(30px);overflow:hidden}
.modal .mb{padding:var(--sp-6);text-align:center}
.modal .mi{width:46px;height:46px;border-radius:var(--radius-full);display:grid;place-items:center;
  margin:0 auto var(--sp-4)}
.modal h4{margin:0 0 7px;font-size:var(--fs-17);letter-spacing:-0.015em}
.modal p{margin:0;font-size:var(--fs-13);color:var(--text-secondary);line-height:1.6}
.modal .mf{display:flex;gap:var(--sp-2);padding:0 var(--sp-6) var(--sp-6)}
.modal .mf .btn{flex:1}

/* ── 下拉菜单 ── */
.menu{min-width:210px;background:var(--bg-popover);border:1px solid var(--glass-border);
  border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:5px;
  backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px)}
.menu .mi2{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:var(--radius-xs);
  font-size:var(--fs-15);cursor:pointer;color:var(--text-primary)}
.menu .mi2:hover{background:var(--accent);color:var(--text-on-accent)}
/* 危险项：常态红字，hover 走 --red-subtle 淡底——和 .btn-danger 同一套语言。
   原先写成内联 style="color:var(--red-text)"，内联压过 :hover 的 color，
   结果 hover 时变成「蓝底红字」：底色说这是普通选中，文字说这是危险操作。 */
.menu .mi2.danger{color:var(--red-text)}
.menu .mi2.danger:hover{background:var(--red-subtle);color:var(--red-text)}
/* 菜单行的双行结构：副行与图标块的用色由这里统一管——
   hover 翻 accent 底时必须跟着翻白，页面内联 color 会压过 :hover（同 .danger 的教训）。 */
.menu .mi2 .sub{display:block;font-size:var(--fs-11);color:var(--text-tertiary)}
.menu .mi2 .mk{background:var(--glass-bg-active);color:var(--text-secondary)}
.menu .mi2 .ck{color:var(--green);font-weight:700}
/* 选中行（.rowsel 的 bg-selected 带 !important，hover 底不变）保持常态用色；
   其余行 hover 翻 accent 底，副行/图标块/对勾必须跟着翻白 */
.menu .mi2:not(.rowsel):hover .sub{color:var(--text-on-accent);opacity:.72}
.menu .mi2:not(.rowsel):hover .mk{background:transparent;color:var(--text-on-accent)}
.menu .mi2:not(.rowsel):hover .ck{color:var(--text-on-accent)}
.menu .mi2.rowsel .mk{background:var(--accent);color:var(--text-on-accent)}
.menu .mi2.rowsel:hover{background:var(--bg-selected);color:var(--text-primary)}
.menu .sep{height:1px;background:var(--glass-border);margin:5px 0}
.menu .gl{font-size:var(--fs-11);font-weight:700;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--text-tertiary);padding:6px 10px 3px}

/* ── 折叠 ── */
.acc{border:1px solid var(--card-border);border-radius:var(--radius-lg);overflow:hidden;background:var(--grouped-bg)}
.acc details{border-bottom:1px solid var(--grouped-row-border)}
.acc details:last-child{border-bottom:none}
.acc summary{padding:12px var(--sp-4);font-size:var(--fs-13);font-weight:550;cursor:pointer;
  list-style:none;display:flex;align-items:center}
.acc summary::-webkit-details-marker{display:none}
.acc summary::after{content:"+";margin-left:auto;color:var(--text-tertiary);font-size:var(--fs-17);
  transition:transform var(--dur) var(--ease)}
.acc details[open] summary::after{transform:rotate(45deg)}
.acc .ac{padding:0 var(--sp-4) var(--sp-4);font-size:var(--fs-13);color:var(--text-secondary);line-height:1.7}

/* ── 步骤 ── */
.steps{display:flex;gap:var(--sp-3)}
.step{flex:1;display:flex;flex-direction:column;gap:8px}
.step .sn{width:26px;height:26px;border-radius:var(--radius-full);display:grid;place-items:center;
  font-size:var(--fs-12);font-weight:650;background:var(--glass-bg-active);color:var(--text-secondary)}
.step.done .sn{background:var(--green);color:var(--text-on-accent)}
.step.now .sn{background:var(--accent);color:var(--text-on-accent)}
.step .st{font-size:var(--fs-13);font-weight:600}
.step .sd{font-size:var(--fs-12);color:var(--text-secondary)}
.step .sl{height:2px;background:var(--glass-bg-active);border-radius:var(--radius-full)}
.step.done .sl,.step.now .sl{background:var(--accent)}

/* ── 代码块 ── */
/* overflow 用 auto 不用 hidden：6 个代码块里有 4 个没套 <pre>，内容直接挂在
   .code 上，hidden 会把长行切掉（实测 mk-case 的 URL 被切 78px）。
   套了 <pre> 的两个由 .code pre 的 overflow-x:auto 在内层接管，
   那时 pre 是 block、宽度等于容器，外层不会溢出也就不会多出一条滚动条。
   auto 一样能裁出圆角。 */
.code{background:var(--solid-bg);border:1px solid var(--card-border);border-radius:var(--radius-lg);
  overflow-x:auto;font-family:var(--font-mono);font-size:var(--fs-12)}
/* 代码块整块声明为暗色主题（HTML 上挂 data-theme="dark"），
   所以这里不再需要「亮档时强制刷暗」的特例，--solid-bg 自己就是暗的。
   干掉这条特例的连带好处：块内后代用语义令牌能拿到暗档取值，
   不会再出现「深红压在暗底上」这种事。 */
.code .ch{display:flex;align-items:center;gap:9px;padding:9px var(--sp-4);
  border-bottom:1px solid var(--glass-border);color:var(--text-tertiary);font-size:var(--fs-11)}
.code pre{margin:0;padding:var(--sp-4);overflow-x:auto;line-height:1.75;color:var(--text-primary)}
/* 代码高亮档。块内已是暗色主题，直接取语义令牌。 */
.tk{color:var(--accent-text)} .ts{color:var(--green)} .tc{color:var(--text-secondary)}
/* .skel/.spinner 的关键帧就近定义：此前只在 docs.css 里有，
   不引文档站样式的消费方（两个控制台）骨架屏与加载圈都不会动。 */
@keyframes shim{0%{background-position:180% 0}100%{background-position:-80% 0}}
@keyframes spin{to{transform:rotate(360deg)}}
.skel{border-radius:var(--radius-xs);
  background:linear-gradient(100deg,var(--skel-a) 30%,var(--skel-b) 50%,var(--skel-a) 70%);
  background-size:220% 100%;animation:shim 1.15s ease-in-out infinite}
.spinner{display:inline-block;width:16px;height:16px;border-radius:var(--radius-full);
  border:2px solid var(--glass-bg-active);border-top-color:var(--accent);
  animation:spin .65s linear infinite;flex:0 0 auto}
.spinner.sm{width:13px;height:13px;border-width:2px}
.spinner.lg{width:26px;height:26px;border-width:2.5px}
/* 环底 = 常量白的 32%：color-mix 保住「只有一份白」，不再抄一个 rgba */
.spinner.on-accent{border-color:color-mix(in srgb, var(--text-on-accent) 32%, transparent);border-top-color:var(--text-on-accent)}
.prog.indet{position:relative;overflow:hidden}
.prog.indet i{position:absolute;top:0;bottom:0;width:38%;left:-38%;
  background:var(--accent);animation:indet 1.1s cubic-bezier(.65,.05,.36,1) infinite}
.loadmask{position:absolute;inset:0;display:grid;place-items:center;gap:var(--sp-3);
  background:var(--solid-bg);opacity:.72;border-radius:inherit}

/* ── 空状态 ── */
.empty{text-align:center;padding:var(--sp-16) var(--sp-6)}
.empty .ei{width:52px;height:52px;border-radius:var(--radius-xl);background:var(--glass-bg-active);
  display:grid;place-items:center;margin:0 auto var(--sp-4);color:var(--text-tertiary)}
.empty h4{margin:0 0 6px;font-size:var(--fs-15)}
.empty p{margin:0 0 var(--sp-5);font-size:var(--fs-13);color:var(--text-secondary)}
table.spec{width:100%;border-collapse:collapse;font-size:var(--fs-13)}
table.spec th,table.spec td{text-align:left;padding:9px var(--sp-3);border-bottom:1px solid var(--grouped-row-border);vertical-align:top}
table.spec tr:last-child td{border-bottom:none}
table.spec th{font-size:var(--fs-11);font-weight:700;letter-spacing:0.06em;text-transform:uppercase;color:var(--text-tertiary)}
table.spec td.ok{color:var(--green)} table.spec td.bad{color:var(--red-text)}
/* 同因：.code 底是硬编码暗色，badge 取的 --green/--accent 却是亮色档，
   压上去只有 3.74 / 4.23。在这个作用域里换成暗色档取值。 */
.code .badge-ok{color:var(--green)}
.code .badge-acc{color:var(--accent-text)}
.spark{display:inline-block;vertical-align:middle}
.hbar{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-12);padding:5px 0}
.hbar .lb{flex:0 0 130px;color:var(--text-secondary)}
.hbar .tr{flex:1;height:8px;border-radius:var(--radius-full);background:var(--glass-bg-active);overflow:hidden}
.hbar .tr i{display:block;height:100%;background:var(--accent);border-radius:var(--radius-full)}
/* 定宽改最小宽：官网预算条的值是「已用 / 预算」双数，78px 放不下；
   短金额（index 图表）内容不足 78px 时仍按 78px 渲染，像素不变。 */
.hbar .vl{flex:0 0 auto;min-width:78px;text-align:right;font-family:var(--font-mono)}
/* 填充语义档：接近上限 / 已超限。默认 accent 是「正常水位」。 */
.hbar .tr i.warn{background:var(--orange)}
.hbar .tr i.bad{background:var(--red)}

/* ── 头像 ── */
.av{width:30px;height:30px;border-radius:var(--radius-full);display:grid;place-items:center;
  font-size:var(--fs-12);font-weight:650;color:var(--text-on-accent);flex:0 0 auto;letter-spacing:-0.01em}
.av.sm{width:22px;height:22px;font-size:var(--fs-11)}
.av.lg{width:44px;height:44px;font-size:var(--fs-15)}
/* 品牌 logo 版头像：白色 svg 配 brand-* 背景（素材同 models 页 img/model/）。
   圆章可用面积比 .mdl-card 的方章小，img 取 64% 而非 80% 留呼吸感。 */
.av img{width:14px;height:14px;object-fit:contain;display:block}
.avstack{display:flex}
.avstack .av{margin-left:-7px;box-shadow:0 0 0 2px var(--solid-bg)}
.avstack .av:first-child{margin-left:0}
/* 溢出计数必须用不透明实底：半透明底叠在前一个头像上会把底下的色透上来，
   同一个 +N 叠在不同颜色的头像上可读性完全不同。白字 + 实底与堆叠里其他头像同构。 */
.av.more{background:var(--av-more-bg);color:var(--text-on-accent)}
/* 第三方供应商首字标：底色取 tokens.css :root 品牌区的品牌令牌，不随主题换档 */
.av.brand-anthropic{background:var(--brand-anthropic)}.av.brand-openai{background:var(--brand-openai)}
.av.brand-bailian{background:var(--brand-bailian)}.av.brand-google{background:var(--brand-google)}
.av.brand-deepseek{background:var(--brand-deepseek)}.av.brand-kimi{background:var(--brand-kimi)}
.av.brand-zhipu{background:var(--brand-zhipu)}

/* ── Tabs / 面包屑 / 分页 ── */
.tabs{display:flex;gap:var(--sp-5);border-bottom:1px solid var(--card-border)}
.tabs span{padding:8px 0;font-size:var(--fs-15);color:var(--text-secondary);cursor:pointer;
  border-bottom:2px solid transparent;margin-bottom:-1px}
.tabs span.on{color:var(--accent-text);border-bottom-color:var(--accent);font-weight:600}
.crumb{display:flex;align-items:center;gap:7px;font-size:var(--fs-12);color:var(--text-secondary)}
.crumb b{color:var(--text-primary);font-weight:600}
/* 分隔符是纯装饰字形（斜杠），不承载信息，故可用 tertiary。
   面包屑的层级信息由 .crumb b（当前项）和顺序本身承担。 */
.crumb i{color:var(--text-tertiary);font-style:normal}
.pager{display:flex;align-items:center;gap:4px}
.pager span{min-width:28px;height:28px;padding:0 7px;border-radius:var(--radius-xs);display:grid;place-items:center;
  font-size:var(--fs-12);color:var(--text-secondary);cursor:pointer;border:1px solid transparent}
.pager span:hover{background:var(--glass-bg-active)}
.pager span.on{background:var(--accent);color:var(--text-on-accent)}
.pager span.dis{opacity:.4;cursor:not-allowed}

/* ── Tooltip / Tag ── */
.tipbox{background:var(--bg-popover);border:1px solid var(--glass-border);border-radius:var(--radius-sm);
  padding:6px 10px;font-size:var(--fs-12);box-shadow:var(--shadow-md);display:inline-block;
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}
.taginput{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:32px;padding:4px 8px;
  border:1px solid var(--input-border);border-radius:var(--radius-sm);background:var(--input-bg)}
.tag{display:inline-flex;align-items:center;gap:5px;padding:2px 5px 2px 8px;border-radius:var(--radius-xs);
  background:var(--accent-subtle);color:var(--accent-text);font-size:var(--fs-12);font-weight:550}
.tag b{cursor:pointer;opacity:.6;font-weight:400}

/* ── 二级导航 ── */
.subnav{width:216px;background:var(--bg-body);border-right:1px solid var(--card-border);padding:var(--sp-3) 8px}
/* 项外侧各留 1px：选中块和 hover 块相邻时不会糊成一整块 */
.subnav .si{margin:1px 0;padding:9px 12px;border-radius:var(--radius-sm);font-size:var(--fs-15);color:var(--text-secondary);
  cursor:pointer;display:flex;align-items:center;gap:8px}
.subnav .si:hover{background:var(--glass-bg-active)}
.subnav .si.on{background:var(--bg-selected);color:var(--text-primary);font-weight:600}
.ftxt{font-size:11.5px;color:var(--text-tertiary)}
.flink{color:var(--text-secondary);text-decoration:none;border-bottom:1px solid var(--card-border)}
.drawer{width:360px;background:var(--solid-bg);border-left:1px solid var(--card-border);
  box-shadow:var(--shadow-lg);display:flex;flex-direction:column;
  position:absolute;top:0;right:0;bottom:0;z-index:5}
.drawer > header{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-4);
  border-bottom:1px solid var(--card-border)}
.drawer > header .dt{font-size:var(--fs-15);font-weight:650;letter-spacing:-0.015em}
.drawer > header .dc{margin-left:auto;color:var(--text-tertiary);cursor:pointer}
.drawer .db{padding:var(--sp-4);overflow-y:auto;display:grid;gap:var(--sp-5)}
/* 抽屉体分组容器：分组间距由容器 gap 统一供给（.drawer .db 的同款节奏）。
   antd 承载的抽屉 body 没有 .db 这层，children 必须包在 .dbody 里，否则节与节挤成一段。 */
.dbody{display:grid;gap:var(--sp-6);align-content:start}
/* 小节标到首行的间距（20260823）：行距抬到 12px 后，原来的 8px 比行距还小，节标读起来像
   又一行内容。抬到 --sp-4，让层级成立——行距 12 < 节标 16 < 节间距 20(.drawer .db)/24(.dbody)。 */
.dgrp .dgl{font-size:var(--fs-11);font-weight:700;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--text-tertiary);margin-bottom:var(--sp-4)}
/* 键值表节奏（20260823 放松）：原本行距 7px / 字号 12px / 标签列 96px，是抽屉里最紧的一档
   （同抽屉的分组间距 20px、节间距 24px），八行挤成一坨。行距抬到 --sp-3、字号抬到 --fs-13、
   标签列给到 104px 容得下六字中文标签，行高 1.6 供给行内呼吸。 */
.dgrp dl{margin:0;display:grid;grid-template-columns:104px 1fr;gap:var(--sp-3);font-size:var(--fs-13)}
.dgrp dt{color:var(--text-secondary);line-height:1.6}
.dgrp dd{margin:0;font-family:var(--font-mono);word-break:break-all;line-height:1.6}
.rowsel{background:var(--bg-selected)!important}

/* ── 页头 / 内容容器 ──
   控制台每屏一个页头：sticky 顶栏 + 大标题 + 右侧动作组。
   原本两端各写了一份内联（tenant PageHeader.tsx、ops Page.tsx），值一模一样。 */
.pagehd{position:sticky;top:0;z-index:6;display:flex;align-items:center;gap:var(--sp-3);
  flex-wrap:wrap;padding:var(--sp-6) var(--sp-8) var(--sp-4);
  background:var(--bg-toolbar);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  border-bottom:1px solid var(--card-border)}
.pagehd h1{margin:0;flex:1 1 auto;font-size:var(--fs-24);font-weight:700;
  letter-spacing:-0.025em;line-height:1.12}
.pagehd .acts{display:flex;gap:var(--sp-2);flex-wrap:wrap}
/* 操作按钮组（页头之外）：一排按钮，间距 --sp-2，窄屏换行。与 .pagehd .acts 同形，
   但不挂在页头上——另起名是因为裸 .acts 已被 Collapse.tsx 与官网站头占用，
   提成全局类会改到它们的外观。
   .end 让整行靠右（页面顶部操作条）；.push 把自己顶到 flex 行末尾（与筛选器同排）。
   原本 Wallet 三套页面与 DimBar 各写一份内联 style，值一模一样——同一个决定重复 4 遍。 */
.actrow{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.actrow.end{justify-content:flex-end}
.actrow.push{margin-left:auto}
.pagebody{display:flex;flex-direction:column;gap:var(--sp-4);
  padding:var(--sp-5) var(--sp-8) var(--sp-16)}
.twocol{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:var(--sp-3)}
.statgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(188px,1fr));gap:var(--sp-2)}

/* ── 详情卡组：面板内的灰底小卡栅格 ── */
.detgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));
  gap:var(--sp-2);padding:var(--sp-4)}
.detcard{background:var(--card-inner-bg);border:1px solid var(--card-border);
  border-radius:var(--radius-sm);padding:var(--sp-3)}
.detcard .k{font-size:var(--fs-13);font-weight:600}
.detcard .v{margin-top:4px;font-size:var(--fs-12);color:var(--text-secondary)}

/* ── 建设中占位：空态的虚线变体。与 .empty 的区别是「接口还没有」而非「有接口没数据」 ── */
.empty.pending{border:1px dashed var(--card-border);border-radius:var(--radius-sm);
  background:var(--card-inner-bg);padding:var(--sp-8) var(--sp-4)}

/* ── Toast 堆叠容器（单条样式见上面的 .toast） ── */
/* 2050 对齐 AntD Notification 默认层级，确保高于 Drawer / Modal。 */
.toastwrap{position:fixed;top:var(--sp-5);right:var(--sp-5);z-index:2050;
  width:min(340px,calc(100vw - var(--sp-10)));
  display:flex;flex-direction:column;gap:var(--sp-2);pointer-events:none}
.toastwrap > *{pointer-events:auto}

/* ── 抽屉遮罩：--bg-overlay 此前只有令牌没有消费方 ── */
.drawermask{position:fixed;inset:0;z-index:80;background:var(--bg-overlay)}

/* ── 设置表单行：左说明右控件 ── */
.sfrow{display:grid;grid-template-columns:minmax(0,1fr) minmax(220px,340px);
  gap:var(--sp-6);align-items:center}
.sfrow .lb{font-size:var(--fs-15);font-weight:650}
.sfrow .lb .sb{margin-top:4px;font-size:var(--fs-13);font-weight:400;
  line-height:1.55;color:var(--text-secondary)}

/* ── 输入错误态 ── */
.input.err,.textarea.err,.select.err{border-color:var(--red);background:var(--red-subtle)}

/* ══════════════════════════════════════════════════════════════════════
   从 index.html 的内联 <style> 抽出的组件
   ══════════════════════════════════════════════════════════════════════
   这些原本写死在文档页里，等于产品要用时只能复制粘贴。
   判定依据是「产品里会不会复用」：侧栏与导航项、官网页脚、
   图表容器、品牌字标、抽屉外壳、加载态——都会。
   ══════════════════════════════════════════════════════════════════════ */

/* 区块级加载遮罩：数据刷新时压在内容上，保留布局不跳动 */
.loadwrap{position:relative}
/* ── 图标网格 ── */
.icons{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:var(--sp-2)}
/* ── 侧栏导航 ── */
/* 侧栏保留一点点半透明即可，不用 20px 大模糊 */
/* 侧栏左轴只有一条：外层内边距 8 + 子项内边距 8 = 内容一律距左 16px。
   品牌方块、分组标题、导航图标、账户头像必须共用这一条轴，否则左边缘参差。 */
.side{--side-inset:8px;
  width:232px;background:var(--bg-sidebar);border-right:1px solid var(--card-border);
  padding:var(--sp-3) var(--side-inset);
  /* flex 列：让 .acct 的 margin-top:auto 生效，账户区始终贴底 */
  display:flex;flex-direction:column}
/* 分组标题：此前只有 markup 没有样式，一直在继承正文字号 */
.side .grp{padding:var(--sp-3) var(--side-inset) 4px;color:var(--text-tertiary);
  font-size:var(--fs-11);font-weight:650;letter-spacing:.05em}
.side .grp:first-of-type{padding-top:var(--sp-2)}
.side .smark{width:28px;height:28px;border-radius:var(--radius-sm);background:var(--accent);
  display:grid;place-items:center;flex:0 0 auto}
.side .sn2{font-size:var(--fs-13);font-weight:650}
.side .ss{font-size:var(--fs-11);color:var(--text-tertiary)}
.side .gl2{font-size:var(--fs-11);font-weight:700;letter-spacing:0.06em;text-transform:uppercase;
  color:var(--text-tertiary);padding:7px var(--side-inset) 3px}
.nav{display:flex;align-items:center;gap:9px;padding:6px var(--side-inset);font-size:var(--fs-13);border-radius:var(--radius-sm);
  color:var(--text-secondary);cursor:pointer;transition:all var(--dur) var(--ease)}
/* 图标块：导航图标必须有一条硬左边，才能压在品牌方块/头像那条 16px 轴上。
   裸 SVG 靠不住——全套 20 个图标的墨迹在 24 网格里从 1.63 到 5.63 各画各的，
   盒子对齐了眼睛看到的墨迹仍然参差 1~3px。宽度取 22px，与 .acct 的头像列同值，
   于是导航文字与账户文字共用第二条轴（16+22+9=47）。
   2026-08-18 起图标块不再铺底色（用户拍板）：盒子只做对齐轴，
   激活态由行底 bg-selected + 图标着 accent 表达。 */
.nav .ico{width:26px;height:26px;flex:0 0 auto;display:grid;place-items:center;
  color:var(--text-secondary)}
.nav:hover{background:var(--glass-bg-hover);color:var(--text-primary)}
.nav.on{background:var(--bg-selected);color:var(--text-primary);font-weight:600}
.nav.on .ico{color:var(--accent-text)}
/* 激活圆点：此前只有 markup 没有样式，右侧位一直是空的，三重编码只落地了两重 */
.nav .pip{margin-left:auto;flex:0 0 auto;width:6px;height:6px;
  border-radius:var(--radius-full);background:var(--accent)}
/* ── 原则 / 对错 / 规范表 ── */
.pr{border:1px solid var(--card-border);border-radius:var(--radius-lg);padding:var(--sp-5);background:var(--solid-bg)}
.pr .pn{font-size:var(--fs-11);font-weight:700;letter-spacing:0.08em;color:var(--accent-text);margin-bottom:9px}
.pr h4{margin:0 0 7px;font-size:var(--fs-15);letter-spacing:-0.015em}
.pr p{margin:0;font-size:var(--fs-13);color:var(--text-secondary);line-height:1.7}
.dd{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-3)}
.dd > div{border:1px solid var(--card-border);border-radius:var(--radius-lg);overflow:hidden;background:var(--solid-bg)}
.dd > div > header{padding:8px var(--sp-4);font-size:var(--fs-12);font-weight:650;
  border-bottom:1px solid var(--card-border)}
.dd .no > header{background:var(--red-subtle);color:var(--red-text)}
.dd .yes > header{background:var(--green-subtle);color:var(--green)}
.dd .bd{padding:var(--sp-4)}
/* gap 必须为 0：Hyper 是匿名文本节点、key 是 span，各算一个 flex 项，
   给 .lockup 设 gap 会把单词从中间劈开。图形与字标的间距改挂在图形上，
   这样字标内部怎么切分都不影响，加不加图形也不用改 gap。 */
/* 字标由「图形 + 整词」两块组成，用 flex 居中，图形随字号自动对齐。
   ⚠️ 整词必须包在 .wm 里：直接放 "Hyper" 与 <span>key</span> 会变成两个 flex item，
   letter-spacing 收不到中间那道字缝，读起来像 "Hyper key"。 */
.lockup{display:inline-flex;align-items:center;font-weight:700}
.lockup>svg{flex:0 0 auto;margin-right:.5em}
.lockup .wm{white-space:nowrap;letter-spacing:-0.03em}
.lockup .lk{color:var(--accent-text)}
/* ── 图表 ── */
.chartbox{background:var(--solid-bg);border:1px solid var(--card-border);border-radius:var(--radius-lg);padding:var(--sp-4)}
.chartbox h5{margin:0 0 var(--sp-3);font-size:var(--fs-13);font-weight:600;display:flex;align-items:center}
.chartbox h5 .r{margin-left:auto;font-weight:400;font-size:var(--fs-11);color:var(--text-tertiary)}
/* 分类色板 --chart-1..6 的图例点：第 n 序列取第 n 档。
   控制台 echarts 侧 chartPalette() 读同名令牌，图例与画布永远同源。 */
.chartbox .c1{background:var(--chart-1)}.chartbox .c2{background:var(--chart-2)}
.chartbox .c3{background:var(--chart-3)}.chartbox .c4{background:var(--chart-4)}
.chartbox .c5{background:var(--chart-5)}.chartbox .c6{background:var(--chart-6)}
/* ── 一级导航（侧栏）独立组件 ── */
.side .sbrand{display:flex;align-items:center;gap:9px;padding:5px var(--side-inset) var(--sp-4)}
.side .sbrand .mark{width:32px;height:32px;border-radius:var(--radius-sm);background:var(--accent);
  display:grid;place-items:center;flex:0 0 auto}
.side .sbrand .bn{font-size:var(--fs-13);font-weight:650;letter-spacing:-0.015em}
.side .sbrand .bs{font-size:var(--fs-11);color:var(--text-tertiary)}
/* 导航项右侧位只承载激活圆点：不放计数角标，也不放锁图标（无权限项不渲染） */
.nav.nav-hover{background:var(--glass-bg-hover)}
/* 控制台以 <button> 承载导航/菜单项/账户区：清 UA 默认，视觉全由上面的类接管。
   只清结构不碰 color/background——否则 011 的特异度会压过 .nav(010) 的用色。 */
button.nav,.menu button.mi2,button.acct{border:0;background:none;font:inherit;
  text-align:left;width:100%;cursor:pointer}
/* .acct 自身不声明 color（.nav/.mi2 各自声明了），button 承载会把继承链断在 UA buttontext——
   显式 inherit 接回 body 的 --text-primary。不能并进上面那行：button.nav 的 011 会压过 .nav 的 010 用色 */
button.acct{color:inherit}
.menu button.mi2{padding:7px 10px}
a.nav{text-decoration:none}
/* margin-top:auto 把账户区顶到侧栏底部——侧栏比内容区矮时不能让它悬在导航下方。
   侧栏本身是 flex 列（见 .side），无多余空间时 auto 退化为 0，再由 sp-5 保底留白。 */
.side .acct{display:grid;grid-template-columns:22px minmax(0,1fr) auto;align-items:center;gap:9px;
  margin-top:auto;padding:5px var(--side-inset);border-radius:var(--radius-xs);border-top:1px solid var(--card-border);
  padding-top:9px}
.side .acct .an{font-size:var(--fs-12);font-weight:600;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.side .acct .aw{display:flex;align-items:center;gap:5px;min-width:0;
  font-size:var(--fs-11);color:var(--text-tertiary)}
/* 工作区名可长可短，压缩让位给角色——角色是定长的五选一，先保它 */
.side .acct .ws{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* 角色是一项治理事实，不是名字的一部分，所以不跟工作区名用中点串成一句话。
   不上色：五个角色之间没有严重度之分，上色等于凭空造出一个不存在的等级。 */
.side .acct .role{flex:0 0 auto;font-size:var(--fs-10);line-height:16px;padding:0 5px;
  border-radius:var(--radius-2xs);background:var(--glass-bg-active);color:var(--text-secondary)}
.side .acct .chev{color:var(--text-tertiary);display:flex}
/* ── 详情抽屉 ──
   浮在内容上层，不挤占表格宽度：7 列表格旁边放不下 360px 抽屉，
   挤占会导致列换行、末列被裁。 */
.drawerwrap{position:relative;overflow:hidden}

/* 规格与对照表：容器随时可能比表窄（两栏文档页的内容栏、演示卡、窄屏），
   横滚常开——放得下时本来就不会出滚动条，这条没有桌面代价。 */
div:has(> table.spec),
div:has(> table.mk-vs),
div:has(> table.mk-matrix) { overflow-x: auto; }
/* 显式横滚类：语义同上面的 :has 兜底，但不依赖 :has 支持度，
   包裹层直接挂 class="scrollx"。新写的横滚容器一律用它。 */
.scrollx { overflow-x: auto; }
/* 横滚容器统一常显细滚动条——macOS/iOS 默认把滚动条藏起来，
   看不见就等于不知道能滚。触屏照常拖，鼠标可拽滚动条。 */
.scrollx::-webkit-scrollbar, .tablewrap::-webkit-scrollbar, .mk-dec::-webkit-scrollbar,
div:has(> table.spec)::-webkit-scrollbar,
div:has(> table.mk-vs)::-webkit-scrollbar,
div:has(> table.mk-matrix)::-webkit-scrollbar { height: 6px; }
.scrollx::-webkit-scrollbar-thumb, .tablewrap::-webkit-scrollbar-thumb, .mk-dec::-webkit-scrollbar-thumb,
div:has(> table.spec)::-webkit-scrollbar-thumb,
div:has(> table.mk-vs)::-webkit-scrollbar-thumb,
div:has(> table.mk-matrix)::-webkit-scrollbar-thumb {
  background: var(--glass-border-hover); border-radius: var(--radius-full); }
.scrollx, .tablewrap { scrollbar-width: thin; }
table.spec, table.mk-vs, table.mk-matrix { min-width: 560px; }
/* 卡片里的小规格表（如预算链：三列、内容短）不进横滚族——
   560 是按文档站四列规格表实测的，套在这里只会把第三列推出屏外。
   窄档收紧内距与字号，三列原地放下。 */
.mk-card table.spec { min-width: 0; }
.tablewrap { overflow-x: auto; }
.tablewrap > table.t { min-width: 500px; }

/* ══════════════════════════════════════════════════════════════════════
   响应式
   ══════════════════════════════════════════════════════════════════════
   断点值对齐 Ant Design，登记在 tokens.css 的断点表里：
     screenMD 768（max 767） · screenLG 992（max 991）
   不自定义断点的原因写在那张表的注释里——控制台用 antd 的 Row/Col 与
   Layout.Sider 的 breakpoint，CSS 另立一套会出现「CSS 已塌、Col 还没塌」
   的错位区间。

   本区整体放在文件末尾，是有意的：同名规则后写的盖先写的，响应式必须在最后。
   （历史包袱：mk-* 曾有两代实现并存、14 个选择器重复，已于 2026-08-16 清理完，
   只保留一代——通栏底色带 .mk-hero + 版心网格 .mk-hero .inner 那一套。）

   每条规则都对应一处 375px 实测溢出，不做预防性铺设。
   ══════════════════════════════════════════════════════════════════════ */

/* ── ≤991：antd screenLG 以下，多列栅格降一档 ────────────────────── */
@media (max-width: 991px) {
  /* 正反例对照：两列并排在窄屏各只剩 157px，读不了。
     这条规则原本错放在 docs.css——react 项目只 import components.css，
     实测 HkCompare 在 375px 下塌不下来，就是这么来的。 */
  .dd { grid-template-columns: 1fr; }

  .mk-grid-2 { grid-template-columns: 1fr; }
  .mk-grid-3,
  .mk-grid-4,
  .mk-loop,
  .mk-stats { grid-template-columns: repeat(2, 1fr); }

  /* 英雄区两栏并排 → 单栏。网格在 .inner 上，.mk-hero 自身只是底色带。 */
  .mk-hero .inner { grid-template-columns: 1fr; }
}

/* ── ≤767：antd screenMD 以下，一律单列 ─────────────────────────── */
@media (max-width: 767px) {
  .mk-grid-3,
  .mk-grid-4,
  .mk-loop { grid-template-columns: 1fr; }

  /* 决策面板的移动排布：一行摆不下四个字段（英文档尤甚），
     改两层——首行「用户 ↔ 金额」对拉，次行「部门 → 模型」成对，
     第三行（.mk-r2 状态）原样。比横滚少一次交互，信息全量可见。 */
  .mk-dec .mk-r1{display:grid;grid-template-columns:auto 1fr;
    column-gap:var(--sp-2);row-gap:3px}
  .mk-dec .mk-who{grid-area:1/1}
  .mk-dec .mk-cost{grid-area:1/2;justify-self:end;margin-left:0}
  .mk-dec .mk-dept{grid-area:2/1}
  .mk-dec .mk-model{grid-area:2/2}

  /* 卡片里的小规格表：窄档收紧到能三列并存 */
  .mk-card table.spec th, .mk-card table.spec td{padding:var(--sp-2);font-size:var(--fs-12)}

  /* 定价矩阵窄档不横滚：勾叉列本来就窄，压缩后四列放得下——
     能力列让长文案折行，列头字号再降一档。560 的最小宽只留给横滚的大表。 */
  table.mk-matrix{min-width:0}
  .mk-matrix{font-size:var(--fs-12)}
  .mk-matrix th,.mk-matrix td{padding:10px var(--sp-2)}
  .mk-matrix thead th{font-size:var(--fs-10);letter-spacing:.04em}
  /* .mk-stats 不进单列组：数字块内容极短（"3"/"0"/"1:1"/"100%"），
     375px 下 2×2 每格仍有 ~160px，单列反而摞出一整屏空白。保持 991 档的两列。 */

  /* 表格：容器可横滚 + 表格保持最小可读宽度。
     两条缺一不可——先前只加了容器的 overflow-x:auto，实测没有任何效果：
     table 的 width:100% 让它正好等于容器宽，永远不溢出，也就永远不触发滚动，
     只是把列压窄。375px 下规格表被压到 277px，列宽只剩 50–69px，
     中文单元格竖排成一列一个字（"选中块高"折 3 行、"28px" 折 14 行）。
     给了 min-width 表格才会真的超出容器，滚动条才出得来。

     560 是实测出来的：先给 480，4 列的规格表表头仍被压到 37px，
     "主色淡底 + 主色图标" 折了 15 行。
     表格自身不能改 display:block 来滚——那会丢掉表格布局，列宽不再对齐。 */

  /* 数字与等宽列不折行：一个金额、一个 ID、一个时间戳是一个整体值，
     断成两行读不出来。实测 "1,284,905" 在 71px 的列里折了 4 行。 */
  table.t td.mono, table.t td.n, table.t th.n,
  table.spec td.mono, table.spec .mono { white-space: nowrap; }

  /* 实时判定面板的行：模型名 + 判定 + 耗时挤在一行，窄屏放不下 */
  .mk-dec .r1,
  .mk-dec .r2,
  .mk-dec .h { flex-wrap: wrap; }

  /* 步骤条横排 → 竖排。实测 375px 下它把外层卡片顶到 452px（容器只有 327px）：
     .step 是 flex:1，而 flex 项的 min-width 默认 auto，压不到比标题文字更窄。
     竖排是移动端惯例，也和 antd Steps 的 orientation="vertical" 对齐。 */
  .steps { flex-direction: column; }

  /* 营销卡与规格对里的两栏，窄屏塌单列——组件行为，从 docs.css 移入
     （教训同 .dd：错放在文档层，官网就拿不到） */
  .mk-card { grid-template-columns: 1fr; }
  .mk-spec { grid-template-columns: 1fr; gap: 2px; }
}

/* flex:1 的项默认 min-width:auto，撑破容器时不会收缩——给一道通用兜底。
   横排档下内容本来就放得下，这条不改变桌面渲染，只让它变得可压缩。 */
.step { min-width: 0; }

/* 同一个机制，网格版：grid 项的 min-width 默认 auto = min-content，
   项里有一个不换行的东西就把整列顶宽，而 1fr 不会把它压回去。
   塌成单列后更明显——列宽取所有项里最大的那个 min-content，会连坐。
   这在 v1 文档页实测过：一个代码块把同列每张卡片都撑到 452px（容器 327px）。
   桌面档内容放得下，这条不改变那里的渲染。 */
.dd > *,
.mk-grid-2 > *,
.mk-grid-3 > *,
.mk-grid-4 > *,
.mk-loop > *,
.mk-stats > * { min-width: 0; }

/* ── 与断点无关的窄屏加固 ───────────────────────────────────────── */
/* 骨架块自身不带宽度，宽度由用例内联给（v1 里有 width:280px 这样的写法）。
   窄屏容器只有 ~327px 时会顶出去，这里兜一道底。 */
.skel { max-width: 100%; }

/* ── Tabs 变体 ────────────────────────────────────────────────
   基础档（下划线）在上面。这三种都是控制台里真会遇到的形态。 */
/* 计数：跟在标签后面，不用 .badge——那个是独立状态标记，
   这里只是个附属数字，用它会喧宾夺主。 */
.tabs .tc2{font-style:normal;margin-left:6px;font-family:var(--font-mono);
  font-size:var(--fs-11);color:var(--text-tertiary)}
.tabs span.on .tc2{color:var(--accent-text)}
/* 禁用：留在原位但点不动。不用 opacity 整体调淡——那会把计数一起弄糊，
   分不清是"禁用"还是"没加载完"。 */
.tabs span.dis{color:var(--text-tertiary);cursor:not-allowed;pointer-events:none}
.tabs span.dis .tc2{font-size:var(--fs-10)}
/* 溢出：横滚不换行。换行会把页签区撑成两行，下面的内容跟着往下跳。 */
.tabs.scroll{overflow-x:auto;flex-wrap:nowrap}
.tabs.scroll span{flex:0 0 auto}

/* ── 搜索下拉 ──
   零件都是现成的：.searchwrap 管输入框，.menu 管结果面板。
   这里只补两个状态自己的样式。 */
/* 匹配段：加粗不换色——换色会和"已选中"的蓝撞车 */
.menu .hl{font-weight:700;color:inherit}
/* 空结果：必须给下一步，只写"无结果"等于把人晾在那 */
.menu .mzero{padding:14px 10px;text-align:center;font-size:var(--fs-13);
  color:var(--text-secondary)}
.menu .mzero span{display:block;margin-top:5px;font-size:var(--fs-12);
  color:var(--text-tertiary)}

/* ── 转化条 ──
   和 .mk-final 分工：那个是整屏反色的终点，一页只能有一个；
   这个是窄条，夹在长内容中间接住「看到这里已经想试」的人。
   所以它不反色、不居中、高度压到一行——不能和终点抢分量。 */
.mk-band{display:flex;align-items:center;gap:var(--sp-6);flex-wrap:wrap;
  padding:var(--sp-5) var(--sp-6);border:1px solid var(--card-border);
  border-radius:var(--radius-xl);background:var(--solid-bg)}
.mk-band .lockup{font-size:var(--fs-15);flex:0 0 auto}
.mk-band .bt{flex:1 1 260px;min-width:0}
.mk-band .bt b{display:block;font-size:var(--fs-15);font-weight:650;letter-spacing:-0.01em}
.mk-band .bt span{display:block;margin-top:3px;font-size:var(--fs-13);color:var(--text-secondary)}
.mk-band .ba{display:flex;gap:var(--sp-3);flex:0 0 auto}
@media (max-width:767px){
  .mk-band .ba{width:100%}
  .mk-band .ba .btn{flex:1}
}

/* ══════════════════════════════════════════════════════════════════════
   官网页面骨架：版心 / 站头 / 页脚
   ══════════════════════════════════════════════════════════════════════
   原先定义在 website.html 的 <style> 里。它们是组件不是页面脚手架——
   留在页面里，第二个营销页（定价页/文档页）就得整段复制。
   站头与页脚在 HTML 上挂 data-theme="dark"，内部全语义令牌。 */
/* ── 版心 ── */
.wrap{max-width:1120px;margin:0 auto;padding:0 var(--sp-8)}

/* ── 站头 ── */
.sitehead{position:sticky;top:0;z-index:80;container-type:inline-size;background:var(--bg-toolbar);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  border-bottom:1px solid var(--glass-border)}
.sitehead .inner{max-width:1120px;margin:0 auto;padding:var(--sp-3) var(--sp-8);
  display:flex;align-items:center;gap:var(--sp-4)}
.sitehead .lockup{font-size:var(--fs-17);flex:0 0 auto}
.sitehead .links{display:flex;gap:var(--sp-8);margin-left:var(--sp-8)}
.sitehead .links a{font-size:var(--fs-15);font-weight:500;padding:6px 0;color:var(--text-secondary);text-decoration:none;
  transition:color var(--dur) var(--ease)}
.sitehead .links a:hover{color:var(--text-primary)}
.sitehead .right{margin-left:auto;display:flex;align-items:center;gap:var(--sp-2)}
/* 手机端折叠菜单：汉堡钮只在窄屏出现；面板复用同一份 .links——
   不复制导航内容，桌面横排和手机竖排是同一组链接的两种排法。
   .m-only（登录入口）只活在面板里：窄屏右侧行放不下登录按钮，
   把它挪进面板而不是硬挤（实测挤下去会把整页顶出横向滚动）。 */
.sitehead .menu-btn{display:none}
.sitehead .links .m-only{display:none}
/* 暗色站头上的按钮：透明底 + 加重描边。规范出处是文档页 Header 演示
   （.hfdemo.dark .btn 同一取值）——默认档的 solid-bg 底和工具栏底几乎同色，
   会糊成一片看不出是按钮。primary 不受影响，accent 底自带对比。 */
.sitehead .btn{background:transparent;border-color:var(--input-border-hover)}
/* 图标钮（语言/主题/汉堡）保持幽灵形态：上面那条会把 ghost 的透明边框压掉。
   去框后按钮的内边距在视觉上全算空隙，收窄让图标群更紧凑。 */
.sitehead .btn-ghost{border-color:transparent;padding-left:7px;padding-right:7px}
.sitehead [data-theme-btn="icon"]{font-size:var(--fs-15)}
.sitehead .btn:hover{background:var(--glass-bg-active)}
.sitehead .btn-primary{background:var(--accent);border-color:transparent}
.sitehead .btn-primary:hover{background:var(--accent-hover)}

/* ── 页脚 ──
   类名用 .sitefoot 而不是 .foot：.foot 已经是组件里 .mk-hero .foot 的名字
   （hero 底部那行 11px 脚注）。两者撞名的后果实测过——页面层的
   background + padding:80px 0 40px 会一起命中 hero 里那行小字，
   给一行 11px 文字套上 80px 的上内边距。 */
.sitefoot{border-top:1px solid color-mix(in srgb,var(--text-primary) 22%,transparent);padding:56px 0 40px}
.sitefoot .fmain{display:flex;gap:var(--sp-16);align-items:flex-start}
.sitefoot .fbrand{max-width:300px}
.sitefoot .lockup{font-size:var(--fs-15)}
.sitefoot .ftag{margin:var(--sp-3) 0 0;font-size:var(--fs-12);line-height:1.65;
  color:var(--text-secondary);text-wrap:balance}
.sitefoot .fcols{margin-left:auto;display:flex;flex-wrap:wrap;gap:var(--sp-8) var(--sp-16)}
.sitefoot .fcols>div{min-width:96px}
.sitefoot h6{margin:0 0 var(--sp-4);font-size:var(--fs-11);font-weight:650;letter-spacing:.05em;
  text-transform:uppercase;color:var(--text-secondary)}
.sitefoot .fcols a{display:block;font-size:var(--fs-12);line-height:2.2;
  color:var(--text-secondary);text-decoration:none}
.sitefoot .fcols a:hover{color:var(--text-primary)}
.sitefoot .fbot{display:flex;align-items:center;gap:var(--sp-4);margin-top:var(--sp-8);
  padding-top:var(--sp-5);border-top:1px solid var(--glass-border)}
.sitefoot .ftxt{font-size:var(--fs-11);color:var(--text-secondary)}
/* ── 语言入口 ──
   图标按钮（「文A」）+ 复用 .menu 做下拉，与搜索下拉同一套模式。
   不用 select：要自定义选中态与菜单观感；不用分段：语言会一直加。 */

/* 防首屏语言闪烁：官网默认英语，但 HTML 里存的是中文原文（那是词典的 key，不能改），
   脚本改写完成前先藏起内容，setLang 末尾摘掉 data-lang-pending 放行。
   禁用 JS 时由页面 <noscript> 里的同名规则改回 visible，否则永久白屏。
   规则放这里而不是页面 <style>：漂移闸只许页面里留 reset/取色那几条基座规则。 */
html[data-lang-pending] body{visibility:hidden}

.lang{position:relative;display:inline-flex}
/* 菜单内的语言选择：外层已经是 .menu，再套 .lang 下拉就是菜单套菜单（点击冒泡会关掉
   外层、弹层还被裁切），故改用原生 select。宽度按内容走——.input 默认 width:100%，
   会撑满那一行把左侧标签挤没。 */
.lang-select{width:auto}
.lang > .btn svg{display:block}
.lang .menu{display:none;position:absolute;top:calc(100% + 6px);right:0;z-index:120}
.lang.open .menu{display:block}
/* 当前语言：主色 + 加重。悬停档必须单独给——
   .mi2.on 和 .mi2:hover 同特异性、本条在后，不写的话悬停时
   选中蓝字会压在悬停蓝底上，字直接消失（实测踩过）。 */
.menu .mi2.on{color:var(--accent-text);font-weight:600}
.menu .mi2.on:hover{color:var(--text-on-accent)}
/* 页脚里的入口贴右；菜单向上弹——页脚在页面最底，向下会被裁 */
.sitefoot .fbot .lang{margin-left:auto}
.sitefoot .lang .menu{top:auto;bottom:calc(100% + 6px)}

/* ── 手机端：下拉换成底部动作面板 ──
   小屏上挂在按钮下的小菜单既难点又容易被裁，
   换 bottom sheet：全宽贴底、圆角顶、遮罩、上滑入场、触区行 48px。
   display 换成 visibility+transform 驱动，否则出入场动不起来。 */
@media (max-width:767px){
  .lang::before{content:"";position:fixed;inset:0;z-index:129;
    background:var(--bg-overlay);opacity:0;pointer-events:none;
    transition:opacity .25s var(--ease)}
  .lang.open::before{opacity:1;pointer-events:auto}
  .lang .menu,.sitefoot .lang .menu{display:block;position:fixed;
    top:auto;left:0;right:0;bottom:0;z-index:130;min-width:0;
    border-radius:var(--radius-xl) var(--radius-xl) 0 0;
    padding:var(--sp-5) var(--sp-4) calc(var(--sp-4) + env(safe-area-inset-bottom));
    visibility:hidden;pointer-events:none;transform:translateY(100%);
    transition:transform .28s var(--ease),visibility 0s .28s}
  .lang.open .menu{visibility:visible;pointer-events:auto;transform:none;
    transition:transform .28s var(--ease)}
  /* 提手：面板顶部居中一道小杠，移动端「可拖动/可关闭」的通用暗示 */
  .lang .menu::before{content:"";position:absolute;top:8px;left:50%;
    transform:translateX(-50%);width:36px;height:4px;
    border-radius:var(--radius-full);background:var(--glass-bg-active)}
  .lang .menu .mi2{padding:13px 12px}
}
@media (prefers-reduced-motion:reduce){
  .lang::before,.lang .menu{transition:none}
}

/* ── 站头折叠：按容器宽换档（@container，容器=站头自身）──
   真站头铺满视口，行为与视口断点逐像素相同；
   文档页把它塞进 590px 的演示卡时自动进折叠态——演示天然真实。 */
/* 中间档收紧站头留白：导航定稿为 7 项 + 登录/免费双按钮 + 地球/主题双图标后，
   768px 视口实测整行所需宽（收紧档间距下）：中文 768 / 英文 935 / 葡 962 /
   西 990 / 俄 997 / 德 1052 / 法 1067——除中文外全部放不下，靠收间距救不回。
   故汉堡断点上移到 ≤1099（以最宽的法文 1067 + 版心内边距为准），
   1100–1199 保留收紧档过渡，≥1200 恢复全留白。 */
@container (min-width: 1100px) and (max-width: 1199px){
  .sitehead .links{gap:var(--sp-4);margin-left:var(--sp-4)}
  .sitehead .inner{padding-left:var(--sp-6);padding-right:var(--sp-6)}
}

@container (max-width: 1099px){
  .sitehead .links{display:none}
  .sitehead .menu-btn{display:inline-flex}
  .sitehead .m-hide{display:none}
  .sitehead .navdd{display:none}
  .sitehead .inner{padding:var(--sp-3) var(--sp-4);gap:var(--sp-2)}
  /* 展开态：实底面板——半透明玻璃会让底下内容透进来吃掉文字；行文字主档 17px。
     ⚠️ 页面压暗不能用 position:fixed 的伪元素：.sitehead 的 container-type
     自带 layout containment，站头内所有 fixed 后代都改以站头盒子为定位基准，
     inset:0 只能盖住站头自身那一条。改用面板阴影外扩 100vmax 铺满视口。 */
  .sitehead.open .links{display:flex;flex-direction:column;gap:0;margin:0;
    position:absolute;top:100%;left:0;right:0;
    padding:var(--sp-2) var(--sp-5) var(--sp-3);
    background:var(--solid-bg);
    border-bottom:1px solid var(--glass-border);
    box-shadow:0 0 0 100vmax var(--bg-overlay),var(--shadow-lg)}
  .sitehead.open .links a{padding:14px 4px;border-bottom:1px solid var(--glass-border);
    font-size:var(--fs-17);color:var(--text-primary)}
  .sitehead.open .links .m-only{display:block}
  /* 行动区：登录 + 免费开始 并排各半宽、置顶——通行的移动菜单式样
     （参照 Binance 等站的折叠菜单）：先给出口，再给目录。 */
  .sitehead.open .links .acts{display:flex;gap:var(--sp-3);
    margin:var(--sp-2) 0 var(--sp-2);padding-bottom:var(--sp-4);
    border-bottom:1px solid var(--glass-border)}
  .sitehead.open .links .acts .btn{flex:1;height:42px;font-size:var(--fs-15)}
  /* 工具行：暗色模式 / 语言与链接同一行式——工具在菜单里是"行"，
     不做孤立小钮。右侧控件（选段）由 space-between 顶到行尾。 */
  .sitehead.open .links .util{display:flex;align-items:center;justify-content:space-between;
    padding:10px 4px;border-bottom:1px solid var(--glass-border);
    font-size:var(--fs-17);color:var(--text-primary)}
  .sitehead.open .links .lang{display:flex;flex-direction:column;align-items:stretch}
  .sitehead.open .links .lang > .btn{justify-content:flex-start;gap:10px;
    padding:14px 4px;height:auto;font-size:var(--fs-17);color:var(--text-primary);
    border:none;background:transparent}
  /* 面板里的语言菜单不走底部 sheet（同上：containment 下 fixed 基准是站头盒子，
     sheet 会叠在面板顶上）——改为行内手风琴展开，靠层级缩进对齐标签文字。 */
  .sitehead .lang::before{content:none}
  .sitehead .lang .menu::before{content:none}   /* sheet 的提手横条，行内展开不需要 */
  .sitehead .lang .menu{position:static;display:none;visibility:visible;transform:none;
    box-shadow:none;border:none;border-radius:0;background:transparent;
    width:auto;padding:0 0 var(--sp-2) 26px}
  .sitehead .lang.open .menu{display:block}
}

/* ── 响应式 ──
   991 = antd 的 screenLG，登记在 tokens.css 的断点表；原本写的 900 不在那套序列里。
   栅格与英雄区的塌列已由 components.css 的响应式区统一处理，这里不再重复，
   只留页面层独有的三件事：导航收起、标题降档、页脚改竖排。 */
@media (max-width:991px){
  h2.st{font-size:var(--fs-32)}
}
/* 版心左右各 32px 在 375 屏吃掉 17% 宽度。站头尤其明显：
   减去内边距只剩 311px，而「字标 + 语言切换 + 登录 + 免费开始」需要 314px，
   差 3px 就把整页顶出 20px 的横向滚动。收到 16px 后可用 343px。 */
@media (max-width:767px){
  .wrap{padding:0 var(--sp-4)}
}
/* 页脚竖排断点：中文横排 970 就够（品牌 300 + 三列 416），但英文三列 ~440、
   俄文 ~528——768~1023 区间横排放不下，LEGAL 会折到 DOCS 下面右侧留空。
   992 起最宽语种也放得下（992-64-300-64=564 > 528），故收在 ≤991（antd LG 档）。 */
@media (max-width:991px){
  .sitefoot .fmain{flex-direction:column;gap:var(--sp-10)}
  .sitefoot .fcols{margin-left:0}
}

/* ── seg 果冻滑块 ── */
.seg .seg-thumb{position:absolute;z-index:0;border-radius:var(--radius-xs);
  background:var(--solid-bg);box-shadow:var(--shadow-xs);
  transition:left .3s cubic-bezier(.32,1.16,.36,1),width .3s cubic-bezier(.32,1.16,.36,1),
    top .2s var(--ease),height .2s var(--ease)}
.seg.accent .seg-thumb{background:var(--accent)}
.seg span,.seg button{position:relative;z-index:1}
.seg[data-jelly] span.on{background:transparent;box-shadow:none}
.seg-thumb.jelly{animation:seg-jelly .32s var(--ease)}
@keyframes seg-jelly{0%{transform:scale(1,1)}40%{transform:scale(1.04,.94)}
  75%{transform:scale(.985,1.015)}100%{transform:scale(1,1)}}
@media (prefers-reduced-motion:reduce){
  .seg .seg-thumb{transition:none;animation:none}
}

/* 字标可以是链接（法务页回官网）：链接形态下抹掉 UA 的下划线与链接色 */
a.lockup{color:inherit;text-decoration:none}

/* ── 法务长文：服务条款 / 隐私政策页的正文排版 ──
   营销字阶（44/56）到页脚为止——读条款的人要的是能一路读下去的正文，
   不是被卖点字号打断。版心收到 46em：法律文本行长一超过 90 字就读串行。 */
.mk-legal{max-width:46em;margin:0 auto;padding:var(--sp-16) 0 var(--sp-20)}
.mk-legal h1{margin:var(--sp-3) 0;font-size:var(--fs-32);font-weight:700;letter-spacing:-0.02em}
.mk-legal .meta{margin:0 0 var(--sp-10);font-family:var(--font-mono);
  font-size:var(--fs-12);color:var(--text-tertiary)}
.mk-legal h2{margin:var(--sp-12) 0 var(--sp-4);font-size:var(--fs-20);
  font-weight:650;letter-spacing:-0.01em}
.mk-legal h3{margin:var(--sp-6) 0 var(--sp-2);font-size:var(--fs-15);font-weight:650}
.mk-legal p,.mk-legal li{font-size:var(--fs-15);line-height:1.8;color:var(--text-secondary)}
.mk-legal p{margin:0 0 var(--sp-4)}
.mk-legal ul,.mk-legal ol{margin:0 0 var(--sp-4);padding-left:1.5em}
.mk-legal li{margin-bottom:var(--sp-2)}
.mk-legal a{color:var(--accent-text);text-decoration:none}
.mk-legal a:hover{text-decoration:underline}
/* 开篇速读框：全文最要紧的几条先说完。真正逐条读完的人不到一成，
   速读框保证剩下九成也知道自己同意了什么——这不是装饰，是诚意。 */
.mk-legal .tldr{margin:0 0 var(--sp-10);padding:var(--sp-5) var(--sp-6) var(--sp-4);
  background:var(--card-bg);border:1px solid var(--card-border);border-radius:var(--radius-xl)}
.mk-legal .tldr h2{margin:0 0 var(--sp-3);font-size:var(--fs-12);font-weight:650;
  letter-spacing:.08em;text-transform:uppercase;color:var(--text-tertiary)}
.mk-legal .tldr ul{margin:0}
.mk-legal .tldr li{font-size:var(--fs-13);line-height:1.7}

/* ═══ 2026-08-27 官网首页改版（设计稿：Hyperkey 官网.dc.html）═══
   稿子是画布导出，版式全写在内联 style 里（109 处）；本站闸门口径是内联只降
   不升，故全部归纳成下面这组类。命名按内容语义，shot- 前缀 = 演示截图块。 */

/* 节底交替：alt 节用窗口白，与 body 浅灰隔节相间（稿 02/04/06 节） */
.mk-sec.alt{background:var(--bg-window)}

/* 演示截图外壳（hero 右侧控制台卡）：亮色小窗浮在暗 hero 上 */
.shot{background:var(--bg-body);border:1px solid var(--glass-border);border-radius:var(--radius-xl);
  box-shadow:var(--shadow-xl);overflow:hidden}
.shot-bar{display:flex;align-items:center;gap:var(--sp-3);padding:10px var(--sp-4);
  background:var(--bg-toolbar);border-bottom:1px solid var(--glass-border)}
.shot-bar .mk-tag{margin-left:auto}
.shot-body{padding:var(--sp-4);display:grid;gap:var(--sp-3)}

/* 统计并排：hero 卡两联 / 仪表盘三联 */
/* 轨道用 minmax(0,1fr) 而非 1fr（20260829 修）：.stat .v/.d 的 nowrap 会把 1fr 轨道的
   min-content 撑爆，整行比容器宽，右侧内容（如预算面板的金额列）被面板边框裁掉；
   minmax(0,1fr) 允许轨道收缩，超长文案由 .stat .d 既有的省略号截断兜底。 */
.statrow2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3)}
.statrow3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4)}

/* 预算进度一行：标签 + 轨道 + 百分比 */
.budline{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-12);color:var(--text-secondary)}
.budline>span:first-child{flex:0 0 auto}
.budline .prog{flex:1}

/* 面板内列表行（模型列表/密钥/审计通用）：左内容 + 右 meta + 徽章 */
.prow{display:flex;align-items:center;gap:var(--sp-3);padding:11px var(--sp-4);
  border-bottom:1px solid var(--grouped-row-border)}
.prow:last-child{border-bottom:0}
.prow.tight{padding:9px var(--sp-4)}
.prow .main{min-width:0}
.prow .l1{font-size:var(--fs-13)}
.prow .l1.mono{font-family:var(--font-mono)}
.prow .l2{font-size:var(--fs-12);color:var(--text-secondary)}
.prow .meta{margin-left:auto;font-family:var(--font-mono);font-size:var(--fs-11);color:var(--text-tertiary)}

/* 仪表盘两栏图区 + 栏标题 + 花费占比条 */
.chartcols{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-8)}
.coltitle{font-size:var(--fs-12);font-weight:600;color:var(--text-secondary);margin-bottom:var(--sp-2)}
.prog.split{display:flex}

/* 徽标标签行（hero 卡底部） */
.tagline{display:flex;gap:6px;flex-wrap:wrap}

/* 权限结构面板的结论行区 */
.verdicts{display:grid;gap:var(--sp-2);margin-top:var(--sp-5);
  border-top:1px solid var(--card-border);padding-top:var(--sp-4)}

/* 定价档描述（稿内联版式收编） */
.mk-tier .desc{margin:0 0 var(--sp-5);font-size:var(--fs-13);line-height:1.65;color:var(--text-secondary)}

/* 节内块间距（稿里 margin-bottom:var(--sp-8/-6) 的散置内联收编） */
.mb8{margin-bottom:var(--sp-8)}
.mb6{margin-bottom:var(--sp-6)}

/* 改版正文的小件（面包屑分隔/面板行容器/树内头像行/面板头 meta/统计脚注色/结论点/审计头像色/间隔） */
.crumb .sep{color:var(--text-tertiary);margin:0 4px}
.panel .rows{display:grid}
.mk-tree .avline{display:flex;align-items:center;gap:var(--sp-3);line-height:1}
.panel header .hmeta{margin-left:auto;font-weight:400;color:var(--text-tertiary);font-size:var(--fs-11)}
.panel .body.vgap{display:grid;gap:var(--sp-5)}
.stat .d.dim{color:var(--text-secondary)}
.stat .d.bad{color:var(--red-text)}
.statusline .dot.ok{background:var(--green)}
.statusline .dot.no{background:var(--red)}
.av.av-purple{background:var(--purple)}
.av.av-accent{background:var(--accent)}
.mt4{margin-top:var(--sp-4)}
.code .del{display:block;color:var(--code-err)}
.code .add{display:block}

/* 改版新类的移动端（断点沿用 767 惯例）：三联统计与两栏图区窄屏竖排，
   否则 375px 下统计卡被挤成高窄条、右栏「按模型花费占比」整个切出屏外 */
@media (max-width:767px){
  .statrow3{grid-template-columns:1fr}
  .chartcols{grid-template-columns:1fr}
  /* 多语言窄屏防溢出：法/俄等长文案下，桌面端的 nowrap 与双 CTA 同行
     会把 375px 页面撑出横滚——窄屏一律放开折行/换行 */
  .mk-cta{flex-wrap:wrap}
  .stat .d{white-space:normal}
  .shot-bar .mk-tag{white-space:normal;height:auto;padding:2px 7px;text-align:right}
  .mk-sol table.t th,.mk-sol table.t td{white-space:normal}
}

/* ═ 卡片动效（2026-08-28）═
   悬停抬升照 .mdl-card 先例（同位移/同影档，全站一手感）；
   入场在节级 data-reveal 揭示之上加阵列错峰：网格容器让位（立即显示），
   子卡各自延迟浮入——整块一起浮看不出层次，错峰才读得出「一组卡」。 */
.mk-card,.mk-tier{transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),
  border-color var(--dur) var(--ease)}
.mk-card:hover,.mk-tier:hover{transform:translateY(-2px);box-shadow:var(--shadow-md);
  border-color:var(--glass-border-hover)}
@media (prefers-reduced-motion:no-preference){
  .mk-grid-2[data-reveal],.mk-grid-3[data-reveal],.mk-grid-4[data-reveal],.mk-stack[data-reveal]{
    opacity:1;transform:none;transition:none}
  .mk-grid-2[data-reveal]>*,.mk-grid-3[data-reveal]>*,.mk-grid-4[data-reveal]>*,.mk-stack[data-reveal]>*{
    opacity:0;transform:translateY(22px);transition:opacity .55s var(--ease),transform .55s var(--ease)}
  .mk-grid-2[data-reveal].on>*,.mk-grid-3[data-reveal].on>*,.mk-grid-4[data-reveal].on>*,.mk-stack[data-reveal].on>*{
    opacity:1;transform:none}
  .mk-grid-2[data-reveal]>*:nth-child(2),.mk-grid-3[data-reveal]>*:nth-child(2),
  .mk-grid-4[data-reveal]>*:nth-child(2),.mk-stack[data-reveal]>*:nth-child(2){transition-delay:.06s}
  .mk-grid-2[data-reveal]>*:nth-child(3),.mk-grid-3[data-reveal]>*:nth-child(3),
  .mk-grid-4[data-reveal]>*:nth-child(3),.mk-stack[data-reveal]>*:nth-child(3){transition-delay:.12s}
  .mk-grid-3[data-reveal]>*:nth-child(4),.mk-grid-4[data-reveal]>*:nth-child(4),
  .mk-stack[data-reveal]>*:nth-child(4){transition-delay:.18s}
  .mk-grid-3[data-reveal]>*:nth-child(5){transition-delay:.24s}
}
