/* =============================================================================
   MemSignal Design System — v2.1 tokens + component primitives
   权威副本: 30-站点工程/memsignal/assets/memsignal-design.css
   部署位置: /www/wwwroot/www.memsignal.com/wp-content/memsignal-assets/memsignal-design.css
   取值来源: 40-品牌与设计/memsignal/VI设计规范-合并定稿-v2.1草案.md（逐条核对，非凭记忆）
   规范包为 AI 渲染，仅取其数值；图内中文文案含错字，一律不作为文案来源。
   ============================================================================= */

/* -----------------------------------------------------------------------------
   变更须知（改本文件前先读这一段）
   1. 成对/并排的组件必须**同一条规则里改完**。只改一边＝把偏差从一处搬到另一处。
      例：.ms-pager__* 与 .ms-ppage__* 的行盒由同一条 line-height:18px 统一（#426）。
   2. 不要留**重复声明**。同一约束写两处必漂移；判据会数声明次数（见
      ops/verify-parts-pager-unify-20261011.sh 的 C 组）。
   3. 数值不硬编码进判据。字节数/像素数一律"取证值 vs 现值"比对，逐字节交回
      30-站点工程/verify-drift.sh。
   4. ⚠ **量这个文件的改动效果时，量具的字体上下文必须与线上一致**。本文件多数组件
      **不写 line-height** ⇒ 走 normal ⇒ 行盒由"字号 × 字体度量"推。探针若自拟
      font-family:sans-serif，Windows 浏览器落到 Arial，与线上真实栈（Astra 未设 body
      字号行高 ⇒ 16px/normal + 系统字体串，落到 Segoe UI）差 1–2px，**绝对读数全错、
      差值却可能对**——据此推荐"改完的高度"就会凭错数上线（10-12 实撞，#426/#427）。
      完整案例与方法论在全局分册 memory/hb-web-verify.md「版式改动验收第四查」。
   5. 纯注释改动也算生产变更：走带 md5 守卫的单件重投（现值守卫 → 备份断言 →
      落地复核 → 清缓存 → 判据复跑 → verify-drift 零漂移），不留漂移过夜。
   -------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------
   1. Design tokens
   -------------------------------------------------------------------------- */
:root {
  /* 主色 */
  --ms-navy:       #062B52;  /* Semiconductor Navy — 品牌主色/导航/页眉/深色背景 */
  --ms-blue-deep:  #073B6F;  /* Deep Blue — 品牌延伸/模块标题/重要区域 */
  --ms-blue:       #0068B7;  /* Technology Blue — 链接/重点元素/图表 */
  --ms-cyan:       #00A8E8;  /* Electric Cyan — CTA/强调/Hover */
  --ms-gradient:   linear-gradient(135deg, #0068B7 0%, #00C6FF 100%);

  /* 语义色 */
  --ms-success:    #22C55E;
  --ms-warning:    #F59E0B;
  --ms-danger:     #EF4444;
  --ms-info:       #6366F1;  /* 仅设计规范 PNG 有，两份 PDF 均无 */

  /* 中性色 */
  --ms-bg:         #F7FAFC;
  --ms-card:       #FFFFFF;
  --ms-border:     #DCE6F0;
  --ms-text:       #0F172A;  /* V1 已决（09-28）：原规范值 #082B52 与 GARDARA 主色 #082B5A 仅差两色位；两站既定性为互不所属，主文字改中性深以拉开识别。对白底 17.9:1 */
  --ms-text-2:     #425466;
  --ms-text-muted: #64748B;  /* 规范值 #718096 对白底仅 4.02:1 不达 AA(4.5)；微调至 4.76:1，色相不变。偏差已记入 VI 稿 §13 */
  --ms-disabled:   #A0AEC0;  /* 对白底 2.26:1，但 WCAG 1.4.3 豁免非激活/禁用组件 —— 刻意不加深，否则禁用态会像可用态 */

  /* 间距：8px 基础体系 */
  --ms-sp-1: 4px;  --ms-sp-2: 8px;  --ms-sp-3: 12px; --ms-sp-4: 16px;
  --ms-sp-6: 24px; --ms-sp-8: 32px; --ms-sp-12: 48px; --ms-sp-16: 64px; --ms-sp-24: 96px;

  /* 圆角 */
  --ms-radius-sm: 8px; --ms-radius: 10px; --ms-radius-lg: 12px;

  /* 排版 */
  --ms-font-sans: Inter, "Source Han Sans SC", "Noto Sans SC", "PingFang SC",
                  "Microsoft YaHei", system-ui, -apple-system, sans-serif;
  --ms-font-mono: "Roboto Mono", ui-monospace, SFMono-Regular, Menlo, monospace;

  --ms-fs-hero:     56px;  --ms-lh-hero:     1.15; --ms-fw-hero:     700;
  --ms-fs-h1:       40px;  --ms-lh-h1:       1.2;  --ms-fw-h1:       700;
  --ms-fs-h2:       28px;  --ms-lh-h2:       1.3;  --ms-fw-h2:       700;
  --ms-fs-h3:       20px;  --ms-lh-h3:       1.4;  --ms-fw-h3:       600;
  --ms-fs-body-lg:  18px;  --ms-lh-body-lg:  1.6;  --ms-fw-body:     400;
  --ms-fs-body:     16px;  --ms-lh-body:     1.6;
  --ms-fs-caption:  13px;  --ms-lh-caption:  1.5;
  --ms-fs-overline: 12px;  --ms-lh-overline: 1.4;  --ms-fw-overline: 600;

  /* 版式：12 栏 / 1280 容器 / gutter 24 / 列宽 80 / 页边距 32 */
  --ms-container: 1280px;
  --ms-gutter:    24px;
  --ms-page-pad:  32px;
  --ms-measure:   720px;   /* 正文可读宽度 600–720px 的上限 */

  /* 结构高度 */
  --ms-header-h:  72px;
  --ms-hero-min:  240px;
  --ms-hero-max:  320px;
  --ms-footer-h:  240px;

  /* 触控 */
  --ms-touch-min: 44px;
}

/* -----------------------------------------------------------------------------
   2. 基础排版（限定在 .ms-ds 作用域，避免与 FSE 主题的全局样式互相覆写）
   -------------------------------------------------------------------------- */
.ms-ds {
  font-family: var(--ms-font-sans);
  font-size: var(--ms-fs-body);
  line-height: var(--ms-lh-body);
  color: var(--ms-text-2);
  background: var(--ms-bg);
  -webkit-font-smoothing: antialiased;
}
.ms-ds h1, .ms-ds .ms-h1 { font-size: var(--ms-fs-h1); line-height: var(--ms-lh-h1); font-weight: var(--ms-fw-h1); color: var(--ms-text); margin: 0 0 var(--ms-sp-4); }
.ms-ds h2, .ms-ds .ms-h2 { font-size: var(--ms-fs-h2); line-height: var(--ms-lh-h2); font-weight: var(--ms-fw-h2); color: var(--ms-text); margin: 0 0 var(--ms-sp-4); }
.ms-ds h3, .ms-ds .ms-h3 { font-size: var(--ms-fs-h3); line-height: var(--ms-lh-h3); font-weight: var(--ms-fw-h3); color: var(--ms-text); margin: 0 0 var(--ms-sp-3); }
.ms-ds .ms-hero-text { font-size: var(--ms-fs-hero); line-height: var(--ms-lh-hero); font-weight: var(--ms-fw-hero); color: #fff; }
.ms-ds .ms-body-lg { font-size: var(--ms-fs-body-lg); line-height: var(--ms-lh-body-lg); }
.ms-ds .ms-caption { font-size: var(--ms-fs-caption); line-height: var(--ms-lh-caption); color: var(--ms-text-muted); }
.ms-ds .ms-overline {
  font-size: var(--ms-fs-overline); line-height: var(--ms-lh-overline); font-weight: var(--ms-fw-overline);
  letter-spacing: .08em; text-transform: uppercase; color: var(--ms-blue);
}
/* ⚠ 必须排除 .ms-btn：`a` 元素选择器的特异性 (0,1,1) 会压过 .ms-btn--primary 的 (0,1,0)，
   结果是蓝字压蓝底、主按钮文字不可见 —— 该缺陷由 1440px 截图发现，静态检查看不出来。 */
.ms-ds a:not(.ms-btn) { color: var(--ms-blue); text-decoration-thickness: 1px; text-underline-offset: 2px; }
.ms-ds a:not(.ms-btn):hover { color: var(--ms-cyan); }
.ms-ds :focus-visible { outline: 3px solid var(--ms-cyan); outline-offset: 2px; }
.ms-ds .ms-num { font-family: var(--ms-font-mono); font-variant-numeric: tabular-nums; }

/* -----------------------------------------------------------------------------
   3. 版式骨架
   -------------------------------------------------------------------------- */
.ms-container { width: 100%; max-width: var(--ms-container); margin-inline: auto; padding-inline: var(--ms-page-pad); }
.ms-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--ms-gutter); }
.ms-grid > * { grid-column: span 12; }
@media (min-width: 768px)  { .ms-md-12 { grid-column: span 12; } .ms-md-6 { grid-column: span 6; } .ms-md-4 { grid-column: span 4; } }
@media (min-width: 1024px) { .ms-lg-4 { grid-column: span 4; } .ms-lg-3 { grid-column: span 3; } .ms-lg-6 { grid-column: span 6; } .ms-lg-8 { grid-column: span 8; } }
.ms-measure { max-width: var(--ms-measure); }
.ms-stack > * + * { margin-top: var(--ms-sp-4); }
.ms-section { padding-block: var(--ms-sp-16); }
@media (max-width: 767px) { .ms-section { padding-block: var(--ms-sp-8); } }

/* -----------------------------------------------------------------------------
   4. 组件
   -------------------------------------------------------------------------- */
/* 4.1 按钮 —— 四态齐备，触控区不小于 44px */
.ms-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--ms-sp-2);
  min-height: var(--ms-touch-min); padding: 0 var(--ms-sp-6);
  font: inherit; font-weight: 600; font-size: var(--ms-fs-body); line-height: 1;
  border-radius: var(--ms-radius); border: 1px solid transparent; cursor: pointer;
  /* ⚠ text-decoration 必须显式重置并提到元素级：Astra 给 `a` 加了 underline，
     原先只写在本类里被主题的 `a` 规则压过，按钮文字全部带下划线（1440px 截图发现）。 */
  text-decoration: none !important;
  transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
.ms-ds a.ms-btn, .ms-ds .ms-btn { text-decoration: none }
.ms-ds .ms-btn--primary, .ms-ds a.ms-btn--primary { background: var(--ms-blue); color: #fff; }
/* 规范原样是「青底 + 白字」，实测 2.70:1 不达 AA。保留品牌的青色 hover，改文字为 navy ⇒ 5.26:1 */
.ms-ds .ms-btn--primary:hover, .ms-ds a.ms-btn--primary:hover { background: var(--ms-cyan); color: var(--ms-navy); }
.ms-btn--primary:active { background: var(--ms-blue-deep); }
.ms-ds .ms-btn--secondary, .ms-ds a.ms-btn--secondary { background: #fff; color: var(--ms-blue); border-color: var(--ms-blue); }
.ms-btn--secondary:hover { background: rgba(0,104,183,.08); }
.ms-ds .ms-btn--ghost, .ms-ds a.ms-btn--ghost { background: transparent; color: var(--ms-text-2); border-color: var(--ms-border); }
.ms-btn--ghost:hover { border-color: var(--ms-blue); color: var(--ms-blue); }
.ms-btn:disabled, .ms-btn[aria-disabled="true"] {
  background: var(--ms-bg); color: var(--ms-disabled); border-color: var(--ms-border); cursor: not-allowed;
}
.ms-btn--lg { min-height: 52px; padding: 0 var(--ms-sp-8); font-size: var(--ms-fs-body-lg); }
.ms-btn--sm { min-height: 36px; padding: 0 var(--ms-sp-4); font-size: var(--ms-fs-caption); }

/* 4.2 标签 / 徽章 —— 状态色只用于"已核实"的数据，见 R-NUM */
.ms-tag {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 2px 10px; border-radius: 999px; font-size: var(--ms-fs-caption); font-weight: 500;
  background: rgba(0,104,183,.10); color: var(--ms-blue-deep); border: 1px solid transparent;
}
.ms-tag--success { background: rgba(34,197,94,.12); color: #15803D; }
.ms-tag--warning { background: rgba(245,158,11,.14); color: #B45309; }
.ms-tag--danger  { background: rgba(239,68,68,.12);  color: #B91C1C; }
.ms-tag--info    { background: rgba(99,102,241,.12); color: #4F46E5; }
.ms-tag--outline { background: transparent; border-color: var(--ms-border); color: var(--ms-text-2); }
.ms-dot { width: 8px; height: 8px; border-radius: 50%; background: currentColor; flex: none; }

/* 4.3 卡片 */
.ms-card {
  background: var(--ms-card); border: 1px solid var(--ms-border); border-radius: var(--ms-radius-lg);
  padding: var(--ms-sp-6); break-inside: avoid;
}
.ms-card--raised { box-shadow: 0 1px 2px rgba(6,43,82,.06), 0 8px 24px rgba(6,43,82,.06); }
.ms-card__title { font-size: var(--ms-fs-h3); font-weight: var(--ms-fw-h3); color: var(--ms-text); margin: 0 0 var(--ms-sp-2); }
.ms-card__meta  { font-size: var(--ms-fs-caption); color: var(--ms-text-muted); }

/* 4.4 提示条 */
.ms-alert {
  display: flex; gap: var(--ms-sp-3); align-items: flex-start;
  padding: var(--ms-sp-4); border-radius: var(--ms-radius);
  border: 1px solid var(--ms-border); background: #fff; font-size: var(--ms-fs-body);
}
/* 单个子元素要占满整行。否则 flex 会把 `<strong>引导句</strong> + 正文` 拆成两列
   （About 页实测踩到）。图标+文本的多子形态不受本条影响。 */
.ms-alert > :only-child { flex: 1 1 auto; }
.ms-alert--success { border-color: rgba(34,197,94,.45);  background: rgba(34,197,94,.07);  color: #14532D; }
.ms-alert--warning { border-color: rgba(245,158,11,.5);  background: rgba(245,158,11,.09); color: #78350F; }
.ms-alert--danger  { border-color: rgba(239,68,68,.45);  background: rgba(239,68,68,.07);  color: #7F1D1D; }
.ms-alert--info    { border-color: rgba(99,102,241,.4);  background: rgba(99,102,241,.07); color: #312E81; }

/* 4.5 表格（料号库 / 报价表主载体） */
.ms-table { width: 100%; border-collapse: collapse; font-size: var(--ms-fs-body); background: #fff; }
.ms-table caption { text-align: left; color: var(--ms-text-muted); font-size: var(--ms-fs-caption); padding-bottom: var(--ms-sp-2); }
.ms-table th {
  text-align: left; font-weight: 600; color: var(--ms-text); font-size: var(--ms-fs-caption);
  letter-spacing: .04em; text-transform: uppercase;
  padding: var(--ms-sp-3) var(--ms-sp-4); border-bottom: 2px solid var(--ms-border); white-space: nowrap;
}
.ms-table td { padding: var(--ms-sp-4); border-bottom: 1px solid var(--ms-border); color: var(--ms-text-2); vertical-align: middle; }
.ms-table tbody tr:hover { background: rgba(0,104,183,.04); }
.ms-table .is-num { font-family: var(--ms-font-mono); font-variant-numeric: tabular-nums; text-align: right; }
/* 移动端：表格横向滚动，不缩字号（规范：移动端正文不小于 14px） */
.ms-table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch }
@media (max-width: 767px) { .ms-table-scroll table { min-width: 720px } }

/* 4.6 表单 */
.ms-field { display: block; margin-bottom: var(--ms-sp-4); }
.ms-field__label { display: block; font-size: var(--ms-fs-caption); font-weight: 600; color: var(--ms-text); margin-bottom: var(--ms-sp-1); }
.ms-field__req { color: var(--ms-danger); }
.ms-input, .ms-select, .ms-textarea {
  width: 100%; min-height: var(--ms-touch-min); padding: 0 var(--ms-sp-4);
  font: inherit; font-size: var(--ms-fs-body); color: var(--ms-text);
  background: #fff; border: 1px solid var(--ms-border); border-radius: var(--ms-radius);
}
.ms-textarea { min-height: 120px; padding: var(--ms-sp-3) var(--ms-sp-4); resize: vertical; }
.ms-input:focus, .ms-select:focus, .ms-textarea:focus { border-color: var(--ms-blue); outline: 2px solid rgba(0,168,232,.35); outline-offset: 1px; }
.ms-input::placeholder, .ms-textarea::placeholder { color: var(--ms-disabled); }
.ms-input[disabled], .ms-select[disabled] { background: var(--ms-bg); color: var(--ms-disabled); cursor: not-allowed; }
.ms-input--error { border-color: var(--ms-danger); }
.ms-field__error { display: block; margin-top: var(--ms-sp-1); font-size: var(--ms-fs-caption); color: #B91C1C; }

/* 4.7 导航与页脚 */
.ms-nav { background: #fff; border-bottom: 1px solid var(--ms-border); }
.ms-nav__inner { display: flex; align-items: center; gap: var(--ms-sp-6); min-height: var(--ms-header-h); }
.ms-nav__links { display: flex; gap: var(--ms-sp-6); list-style: none; margin: 0; padding: 0; flex: 1 1 auto; }
.ms-ds .ms-nav__links a { color: var(--ms-text-2); text-decoration: none; font-size: 15px; font-weight: 500; padding: var(--ms-sp-2) 0; }
.ms-nav__links a:hover, .ms-nav__links [aria-current="page"] a { color: var(--ms-blue); }
@media (max-width: 1023px) { .ms-nav__links { display: none } }   /* 折叠进抽屉，一期由主题实现 */
/* ⚠ 两处规范源冲突的处置（已记入 VI 稿 §13）：
   VI《结构高度》写 Hero 240–320px，但《网站设计规范》第一页的首页 Hero 含大标题+副文案+
   搜索框+四条信任条，实测远超 320px。两者不是一回事——前者是**页头条幅**，后者是**首页主视觉**。
   ⇒ 拆成两个组件：.ms-pagehead 承接 240–320 的条幅语义；.ms-hero 不再设 max-height，
     由内容决定高度（给内容容器设 max-height 本身是错的：内容一定会溢出，溢出即被裁）。 */
.ms-pagehead { background: var(--ms-navy) var(--ms-gradient); color: #fff; min-height: var(--ms-hero-min); max-height: var(--ms-hero-max); }
.ms-hero { background: var(--ms-navy); color: #fff; min-height: var(--ms-hero-min); }
.ms-footer { background: var(--ms-navy); color: rgba(255,255,255,.78); padding-block: var(--ms-sp-12); }
.ms-footer h4 { color: #fff; font-size: var(--ms-fs-caption); letter-spacing: .08em; text-transform: uppercase; margin: 0 0 var(--ms-sp-3); }
.ms-footer a { color: rgba(255,255,255,.78); text-decoration: none; }
.ms-footer a:hover { color: var(--ms-cyan); }
.ms-footer__legal { border-top: 1px solid rgba(255,255,255,.14); margin-top: var(--ms-sp-8); padding-top: var(--ms-sp-6); font-size: var(--ms-fs-caption); color: rgba(255,255,255,.6); }

/* 4.8 数据展示（行情卡） */
.ms-stat { background: #fff; border: 1px solid var(--ms-border); border-radius: var(--ms-radius-lg); padding: var(--ms-sp-6); }
.ms-stat__value { font-family: var(--ms-font-mono); font-size: var(--ms-fs-h2); font-weight: 700; color: var(--ms-text); line-height: 1.2; }
.ms-stat__label { font-size: var(--ms-fs-caption); color: var(--ms-text-muted); margin-top: var(--ms-sp-1); }
.ms-stat__delta--up { color: #15803D; } .ms-stat__delta--down { color: #B91C1C; }

/* 4.9 未核实标记 —— R-NUM 闸门的视觉落点，必须显眼，不能是灰字脚注 */
.msct-notice, .ms-unverified {
  border-left: 4px solid var(--ms-warning); background: rgba(245,158,11,.10);
  color: #78350F; padding: var(--ms-sp-4); border-radius: 0 var(--ms-radius) var(--ms-radius) 0;
  font-size: var(--ms-fs-body); margin-bottom: var(--ms-sp-6);
}

/* -----------------------------------------------------------------------------
   5. 断点（IA 待决 V2 的处置：A 套为断点定义，B 套仅作测试机型清单）
      Mobile <768 / Tablet 768–1023 / Laptop 1024–1279 / Desktop ≥1280
   -------------------------------------------------------------------------- */
@media (max-width: 767px) {
  :root { --ms-page-pad: 20px; --ms-gutter: 16px; }
  .ms-ds { font-size: 16px; }                    /* 规范：移动端正文不小于 14px，这里不降 */
  .ms-ds .ms-hero-text { font-size: 32px; }
  .ms-ds h1, .ms-ds .ms-h1 { font-size: 30px; }
  .ms-grid > * { grid-column: span 12 !important; }
}
@media (prefers-reduced-motion: reduce) {
  .ms-ds *, .ms-ds *::before, .ms-ds *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}
@media print { .ms-nav, .ms-btn { display: none !important } }


/* -----------------------------------------------------------------------------
   6. 站点外壳（header / 汉堡导航 / hero / 页脚 / 原型横幅）
   由 mu-plugin `memsignal-site-chrome.php` 渲染对应标记；本节是其唯一样式来源。
   取值全部用上面的 token，本节不新造颜色。
   从设计定稿预览站移植，已在 1440 / 390 两档截图验收。
   -------------------------------------------------------------------------- */

/* 6.0 原型横幅：内容未定稿期间常驻。撤除 = 关掉 mu-plugin 里的 MS_CHROME_BANNER 常量 */
.ms-proto-bar {
  background: var(--ms-warning); color: #4A2B00; font-size: var(--ms-fs-caption);
  padding: 8px var(--ms-page-pad); text-align: center; font-weight: 600; line-height: 1.5;
}
.ms-proto-bar strong { color: #3A2200; }

/* 6.1 页头 */
.ms-topbar { background: #fff; border-bottom: 1px solid var(--ms-border); position: sticky; top: 0; z-index: 100; }
.ms-topbar__in {
  max-width: 1440px; margin-inline: auto; padding: 12px var(--ms-page-pad);
  display: flex; align-items: center; gap: var(--ms-sp-6); min-height: 48px;
}
.ms-logo { display: flex; align-items: center; gap: 10px; text-decoration: none !important; flex: none; color: inherit; }
.ms-logo img { max-height: 38px; width: auto; display: block; }
.ms-logo__mark {
  width: 30px; height: 30px; background: var(--ms-gradient); border-radius: 7px;
  clip-path: polygon(0 0, 100% 0, 100% 72%, 72% 100%, 0 100%);
  display: grid; place-items: center; color: #fff; font-weight: 800; font-size: 15px; flex: none;
}
.ms-logo__txt { font-size: 20px; font-weight: 800; color: var(--ms-navy); letter-spacing: -0.02em; line-height: 1.1; display: block; }
.ms-logo__txt em { font-style: normal; color: var(--ms-blue); }
.ms-logo__tag { display: block; font-size: 8.5px; letter-spacing: 0.13em; color: var(--ms-text-muted); font-weight: 600; margin-top: 1px; }
.ms-topbar__spacer { flex: 1 1 auto; }
.ms-topbar__cta { display: flex; align-items: center; gap: 10px; flex: none; }
@media (max-width: 720px) { .ms-topbar__cta .ms-btn--ghost { display: none } }

/* 6.2 横排导航（用户 09-28 裁决：放弃汉堡，回到设计规范的横排） */
.ms-nav { flex: 1 1 auto; min-width: 0; }
.ms-nav__list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 2px 12px; justify-content: flex-start; }
.ms-nav__list a {
  display: block; padding: 7px 0; font-size: 13px; font-weight: 500; color: var(--ms-text-2);
  text-decoration: none !important; border-bottom: 2px solid transparent; white-space: nowrap;
}
.ms-nav__list a:hover { color: var(--ms-blue); border-bottom-color: var(--ms-cyan); }
.ms-nav__list a[aria-current] { color: var(--ms-navy); font-weight: 700; border-bottom-color: var(--ms-blue); }

/* 6.3 首页主视觉 */
.ms-hero {
  position: relative; overflow: hidden; color: #fff;
  background: var(--ms-navy) url("./img/hero-chip.jpg") center right / cover no-repeat;
}
@supports (background-image: url(a.webp)) { .ms-hero { background-image: url("./img/hero-chip.webp") } }
/* 遮罩：文字所在的左 2/3 必须足够暗，白字才达 AA；右侧留白让芯片露出来 —— 与规范截图同构图。 */
.ms-hero::before {
  content: ""; position: absolute; inset: 0; z-index: 0;
  background: linear-gradient(90deg, rgba(6,43,82,.97) 0%, rgba(6,43,82,.95) 34%,
    rgba(6,43,82,.72) 58%, rgba(6,43,82,.30) 82%, rgba(6,43,82,.16) 100%);
}
.ms-hero::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .5;
  background:
    radial-gradient(1100px 460px at 88% -12%, rgba(0, 198, 255, .30), transparent 62%),
    repeating-linear-gradient(135deg, rgba(255, 255, 255, .045) 0 2px, transparent 2px 15px);
}
.ms-hero__in {
  position: relative; z-index: 1; max-width: var(--ms-container); margin-inline: auto;
  padding: 72px var(--ms-page-pad) 0; display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
  gap: 48px; align-items: center;
}
@media (max-width: 980px) { .ms-hero__in { grid-template-columns: 1fr; padding-top: 48px } }
.ms-hero h1, .ms-hero h2, .ms-hero__title {
  font-size: var(--ms-fs-hero); line-height: var(--ms-lh-hero); font-weight: var(--ms-fw-hero);
  margin: 0 0 18px; letter-spacing: -.025em; color: #fff;
}
/* ⚠ 必须显式覆盖 Astra 的 `.entry-content :where(h2)`（它给的是深色文字）。
   正文里 hero 标题写的是 <h2>，不写这条就是深字压深蓝底 —— 实测首页主标题几乎看不见。
   特异性 .ms-ds .ms-hero h2 = (0,2,1) > (0,1,0)，稳定胜出。 */
.ms-ds .ms-hero h2 { color: #fff }
/* 首页 hero 自带大标题，Astra 再输出一次页面标题就成了重复的 h1 ⇒ 前端页隐藏它。
   body.home 由 WP 在静态首页上输出（实测 class 列表含 home）。 */
.ms-ds.home > #page .entry-title, .ms-ds.home .ast-plain-container .entry-title { display: none }
.ms-hero__title span { color: var(--ms-cyan) }
.ms-hero__lead { font-size: var(--ms-fs-body-lg); line-height: 1.65; color: rgba(255, 255, 255, .82); margin: 0 0 28px; max-width: 46ch }
.ms-hero .ms-btn--ghost { border-color: rgba(255, 255, 255, .4); color: #fff }
.ms-hero .ms-btn--ghost:hover { background: rgba(255, 255, 255, .12); color: #fff }
.ms-bin { display: flex; gap: 4px; margin-bottom: 26px }
.ms-bin i { width: 34px; height: 7px; border-radius: 2px; display: block }
.ms-search { display: flex; gap: 10px; max-width: 620px }
.ms-search input {
  flex: 1; padding: 14px 16px; border-radius: var(--ms-radius); border: 1px solid rgba(255, 255, 255, .28);
  background: rgba(255, 255, 255, .10); color: #fff; font: inherit; font-size: 15px
}
.ms-search input::placeholder { color: rgba(255, 255, 255, .62) }
.ms-search--light input { background: #fff; color: var(--ms-text); border-color: var(--ms-border) }
.ms-search--light input::placeholder { color: var(--ms-text-muted) }
.ms-trust {
  position: relative; z-index: 1; max-width: var(--ms-container); margin: 56px auto 0;
  padding: 22px var(--ms-page-pad) 30px; border-top: 1px solid rgba(255, 255, 255, .16);
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px;
}
@media (max-width: 860px) { .ms-trust { grid-template-columns: repeat(2, minmax(0, 1fr)) } }
.ms-trust b { display: block; color: #fff; font-size: 15px; font-weight: 700 }
.ms-trust span { display: block; color: rgba(255, 255, 255, .66); font-size: var(--ms-fs-caption); margin-top: 2px }
/* 芯片示意：纯几何，不用照片，避免虚构实拍 */
/* 照片接手主视觉后，原来的 CSS 芯片盒会像一张浮在照片上的卡片。
   ⇒ 去掉盒子（边框/底色/阴影/虚线内框/引脚点），只留规范包里那句芯片标语，压在照片上。 */
.ms-die {
  width: 100%; max-width: 360px; min-height: 300px; margin-inline: auto;
  display: grid; place-items: center; position: relative;
}
/* Q-b-a（10-03 LM 拍板）：字距 .22em + 行高 2.2 把四行标语拉成散点，截图里被读成乱码
   而非装饰性 tagline。收到 .12em / 1.6 后仍保留等宽装饰感，但字与行都成组。
   ⚠ .ms-die 只有首页 hero 在用（11 模板 + 12 mu-plugin 零命中）⇒ 本改动零波及。 */
.ms-die span { font-family: var(--ms-font-mono); font-size: 12px; letter-spacing: .12em; color: var(--ms-cyan); text-align: center; line-height: 1.6; text-shadow: 0 1px 10px rgba(6,43,82,.85) }
@media (max-width: 980px) { .ms-die { display: none } }

/* 6.4 版面骨架 */
.ms-wrap { max-width: var(--ms-container); margin-inline: auto; padding: 56px var(--ms-page-pad) }
.ms-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; margin-bottom: 24px; flex-wrap: wrap }
.ms-head h2 { font-size: var(--ms-fs-h2); font-weight: 700; color: var(--ms-navy); margin: 0; letter-spacing: -.02em }
.ms-head p { margin: 8px 0 0; color: var(--ms-text-muted); font-size: 15px }
.ms-tabs { display: flex; gap: 6px; flex-wrap: wrap; border-bottom: 1px solid var(--ms-border); margin-bottom: 24px }
.ms-tabs a {
  padding: 10px 15px; font-size: 14px; color: var(--ms-text-2); text-decoration: none !important;
  border-bottom: 2px solid transparent; margin-bottom: -1px; font-weight: 500
}
.ms-tabs a:hover { color: var(--ms-blue) }
.ms-tabs a[aria-current="page"] { color: var(--ms-blue); border-bottom-color: var(--ms-blue); font-weight: 700 }
/* 9.6b 面包屑（10-06 新增，台账 #331）。**不复用 .ms-tabs**：那是"可切换 Tab 条"，
   它的 `a` 带 `padding:10px 15px` + `border-bottom:2px`，而层级路径的中间项（分类词）不是 Tab、
   拿不到这套盒模型 ⇒ 同一个 flex 行里三者盒子等高（43px）但**文字基线差 12px**，
   肉眼就是"中间那项飘上去了"（LM 截图圈的那处，两条料号详情页实测同值）。
   正解＝按基线对齐（`align-items:baseline`），而不是给中间项补 padding——那是局部补丁，
   下次再加一项又会歪。分隔符用 ::before 生成，不进 HTML 语义（复核须查本文件，产物里搜不到它）。 */
.ms-crumb { display: flex; align-items: baseline; flex-wrap: wrap; gap: 7px; margin-bottom: 14px;
  font-size: 13.5px; line-height: 1.5; color: var(--ms-text-muted) }
.ms-crumb > * + *::before { content: "›"; margin-right: 7px; color: var(--ms-text-muted); font-weight: 400 }
.ms-crumb a { color: var(--ms-text-2); text-decoration: none }
.ms-crumb a:hover { color: var(--ms-blue) }
.ms-crumb [aria-current="page"] { color: var(--ms-blue); font-weight: 700 }
.ms-split { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 28px; align-items: start }
@media (max-width: 1024px) { .ms-split { grid-template-columns: 1fr } }
.ms-panel { background: #fff; border: 1px solid var(--ms-border); border-radius: var(--ms-radius-lg); padding: 24px }
.ms-panel > h3 { margin: 0 0 12px; font-size: 15px; font-weight: 700; color: var(--ms-navy) }
.ms-list { list-style: none; margin: 0; padding: 0 }
.ms-list li { padding: 12px 0; border-bottom: 1px solid var(--ms-border) }
.ms-list li:last-child { border-bottom: 0; padding-bottom: 0 }
.ms-list a { color: var(--ms-text); text-decoration: none !important; font-weight: 600; font-size: 14.5px; display: block; line-height: 1.45 }
.ms-list a:hover { color: var(--ms-blue) }
.ms-list small { color: var(--ms-text-muted); font-size: 12.5px; display: block; margin-top: 3px; font-weight: 400 }
.ms-cardlink { display: block; text-decoration: none !important; color: inherit }
.ms-cardlink > .ms-card { height: 100% }
.ms-cardlink:hover .ms-card__title { color: var(--ms-blue) }
.ms-cta-row { display: flex; gap: 12px; flex-wrap: wrap; align-items: center }
.ms-filterbar { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 18px }
.ms-filterbar select {
  padding: 9px 12px; border: 1px solid var(--ms-border); border-radius: var(--ms-radius-sm);
  background: #fff; font: inherit; font-size: 13.5px; color: var(--ms-text-2)
}
.ms-prose { max-width: var(--ms-measure) }
.ms-phase {
  font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ms-text-muted); border: 1px dashed var(--ms-border); border-radius: 999px; padding: 3px 9px
}

/* 6.5 页脚 */
.ms-foot { background: var(--ms-navy); color: rgba(255, 255, 255, .78); margin-top: 64px }
/* ⚠ 网格列数必须等于 `.ms-foot__in` 的实际子元素数（品牌 + 各链接组）。
   规范 §11 预置四组（About/Resources/Support/Follow Us）＝5 列；但 #268 撤 Follow Us、
   #274 撤 Part Request 后 DOM 只剩 品牌 + 3 组 = 4 个子元素。声明留成 5 列会让右侧
   永远空一列、链接挤在左边铺不满（10-02 实测计算值 `297px 198px 198px 198px 198px`
   对 4 个子元素，即此缺陷）。
   **10-07 社媒 URL 到位后的落位＝不加第 5 列**（决策 D3-C，见 §6.5.1）：Follow Us 进品牌块
   下方横排，网格保持 4 列。⇒ 这条"列数＝子元素数"的判据仍然成立，别因为
   "规范说四组"就顺手把 Follow Us 塞成第 5 列——那样三组链接列会从 248.9px 挤到 197.8px。 */
.ms-foot__in {
  max-width: var(--ms-container); margin-inline: auto; padding: 52px var(--ms-page-pad) 26px;
  display: grid; grid-template-columns: minmax(0, 1.5fr) repeat(3, minmax(0, 1fr)); gap: 32px
}
@media (max-width: 900px) { .ms-foot__in { grid-template-columns: repeat(2, minmax(0, 1fr)) } }
.ms-foot h4 { color: #fff; font-size: var(--ms-fs-caption); letter-spacing: .1em; text-transform: uppercase; margin: 4px 0 14px; font-weight: 700 }
.ms-foot ul { list-style: none; margin: 0; padding: 0 }
.ms-foot li { margin-bottom: 9px }
.ms-foot a { color: rgba(255, 255, 255, .76); text-decoration: none !important; font-size: 13.5px }
.ms-foot a:hover { color: var(--ms-cyan) }
.ms-foot__brand p { font-size: 13px; line-height: 1.7; color: rgba(255, 255, 255, .66); max-width: 34ch; margin: 12px 0 0 }
/* 页脚底栏（10-02 重做，台账 #284）：旧版＝全出血深色免责带（居中）+ 下面一条
   space-between 的法务链接行（内缩到 container）——一个通栏一个内缩、中线对不齐，
   且 4 条链接被 space-between 拉到两端、`·` 悬在空处；"Terms of Use/Disclaimers"
   还在带里链一次、法务行又链一次。改为单条容器宽底栏：左免责正文、右法务链接簇，
   基线对齐、窄屏自动换行。链接用 gap/内联而非 space-between，不再散开。 */
.ms-foot__bar {
  max-width: var(--ms-container); margin-inline: auto;
  padding: 22px var(--ms-page-pad) 30px;
  border-top: 1px solid rgba(255, 255, 255, .14);
  display: flex; justify-content: space-between; align-items: baseline; gap: 10px 32px; flex-wrap: wrap
}
.ms-foot__note { margin: 0; font-size: 12.5px; line-height: 1.6; color: rgba(255, 255, 255, .58); max-width: 64ch }
.ms-foot__legal { font-size: 12.5px; color: rgba(255, 255, 255, .42) }
.ms-foot__legal a { color: rgba(255, 255, 255, .74); text-decoration: none }
.ms-foot__legal a:hover { color: var(--ms-cyan) }

/* 6.5.1 页脚社媒 Follow Us（LM 10-07 给出三条官方 URL，台账 #345）
   背景：#268 曾因"三条 href 是 `#`、点击静默跳回首页、对外暗示存在我们没有的主页"整组撤下，
   当时留的恢复条件是"拿到真实 URL"。条件已满足，但落位改了——见 §6.5 末段，不进第 5 列。
   图标＝**内联 SVG**（`memsignal-site-chrome.php::msd_social_channels()`），不走 CSS mask：
   mask 指 file:// 在无头渲染里取不到图（元素整块被遮没），`<img>` 指 file:// 时 SVG 内的
   `currentColor` 会落成黑色 ⇒ 内联是唯一一条"量具与生产同路径"的引法，且顺带免掉
   3 次 HTTP 请求与 3 个部署对象（不用登记 verify-drift 别名 / 素材清单）。
   统一性放在**容器与配色**层，不靠描边粗细：34px 圆形 + 1px 半透明白描边，与
   `.ms-gate__lock` / `.ms-play` 的圆形语言同源；hover 转 --ms-cyan 并亮边框。
   文字只给读屏（决策 D4-a）——可见语义由组标题 FOLLOW US 承担。 */
.ms-foot__follow { display: flex; align-items: center; gap: 12px; margin-top: 18px; flex-wrap: wrap }
.ms-foot__followlab { font-size: var(--ms-fs-caption); font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: rgba(255, 255, 255, .5) }
.ms-foot__social { list-style: none; margin: 0; padding: 0; display: flex; gap: 10px; flex-wrap: wrap }
.ms-foot__social li { margin: 0 }
.ms-foot__social a { display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border: 1px solid rgba(255, 255, 255, .22); border-radius: 50%;
  color: rgba(255, 255, 255, .82); text-decoration: none !important;
  transition: color .15s ease, border-color .15s ease }
.ms-foot__social a:hover { border-color: var(--ms-cyan); color: var(--ms-cyan) }
.ms-foot__social svg { width: 15px; height: 15px; display: block }

/* 只给读屏的可见隐藏文字。本站此前没有这个工具类（grep 确认无 .ms-visually-hidden /
   .screen-reader 定义），WP 核心的 `.screen-reader-text` 只在后台样式里加载，前台不可依赖。 */
.ms-visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap }

/* 6.5.2 页脚链接对比度修复（10-07，台账 #345，决策 D1-a）
   缺陷不是本批引入的：第 438 行 `.ms-foot a{color:rgba(255,255,255,.76)}` 特异性 0-1-1，
   被第 95 行 `.ms-ds a:not(.ms-btn)` 的 0-2-1 盖掉 ⇒ 页脚链接实际计算色 #0068B7 压在
   #062B52 上，**实测 2.48:1，WCAG AA（13.5px 正文需 ≥4.5:1）FAIL**。
   修法＝用更高特异性的作用域规则把作者本意（半透明白）拿回来，不删第 95 行那条全局规则
   （它管的是浅底正文页的链接色，那边是对的）。修后 9.17:1。
   ⚠ 社媒图标继承 `currentColor`，不修就会跟页脚文字一起糊——所以这条与本批同批上。
   ⚠ **作用域必须是 `.ms-foot` 而不是 `.ms-foot__in`**：底部法务行 `.ms-foot__legal`
      在 `.ms-foot__bar` 里，与 `.ms-foot__in` 是**兄弟节点**。首版只写 __in，
      结果 10 条链接修好了、`.ms-foot__bar` 里那 4 条（Terms/Privacy/Cookie/Disclaimers）
      照旧 2.48:1——是扩大量具范围到 `.ms-foot a` 之后才暴露的（本仓第 N 次印证：
      验证覆盖度必须 ≥ 修复覆盖度）。
   法务行按原设计比主链接暗一档（.74 vs .78）：两条规则特异性同为 0-3-1，
   靠"写在后面"取胜，不要误以为可以调换顺序。 */
.ms-ds .ms-foot a:not(.ms-btn) { color: rgba(255, 255, 255, .78) }
.ms-ds .ms-foot__legal a:not(.ms-btn) { color: rgba(255, 255, 255, .74) }
.ms-ds .ms-foot a:not(.ms-btn):hover { color: var(--ms-cyan) }

/* 6.6 与 Astra 共存：Astra 自己的头/脚由 mu-plugin 摘除，这里兜住残留容器 */
.ms-ds #ast-fixed-header { display: none }

/* 6.7 窄屏（实测 390px 才发现的问题：56px 主标题溢出视口、CTA 组把 Menu 按钮挤出屏幕）
   这里只覆盖尺寸与显隐，不新造颜色。 */
@media (max-width: 720px) {
  .ms-topbar__in { gap: 8px; padding: 10px 16px }
  .ms-topbar__in > * { min-width: 0 }
  /* 实测：logo + Request Live Quote + Menu 三者合计 > 390px，把 Menu 挤出视口、
     整页横向裁切。两个 CTA 已在抽屉内，顶栏窄屏只留 logo + Menu。 */
  .ms-topbar__cta { gap: 6px }
  .ms-topbar__cta .ms-btn { padding: 7px 9px; font-size: 12px }
  .ms-logo__txt { font-size: 18px }
  .ms-logo__tag { display: none }
  .ms-topbar__in { flex-wrap: wrap; row-gap: 2px }
  .ms-nav { order: 3; flex-basis: 100%; }
  .ms-topbar__cta { margin-left: auto; }
  .ms-nav__list { gap: 0 14px; justify-content: space-between }
  .ms-nav__list a { font-size: 13px; padding: 6px 0; white-space: normal }
  .ms-hero__in { padding: 32px 16px 0; gap: 24px }
  .ms-hero h1, .ms-hero h2, .ms-hero__title { font-size: 30px; line-height: 1.18; letter-spacing: -.02em; overflow-wrap: anywhere }
  .ms-hero__lead { font-size: 16px; overflow-wrap: anywhere }
  .ms-search { flex-wrap: wrap }
  .ms-search input { flex: 1 1 100%; min-width: 0 }
  .ms-trust { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 14px; padding: 16px 16px 24px; margin-top: 32px }
  .ms-wrap { padding: 32px 16px }
  .ms-head h2 { font-size: 24px }
  .ms-foot__in { padding: 32px 16px 24px; gap: 24px }
  .ms-foot__bar { padding: 16px 16px 24px }
  .ms-panel { padding: 16px }
  .ms-proto-bar { padding: 8px 14px }
}


/* 面板小标题（模板里用 ms-panel__h 标第二个及以后的标题） */
.ms-panel__h { margin: 0 0 12px; font-size: 15px; font-weight: 700; color: var(--ms-navy); }
.ms-panel .ms-panel__h:not(:first-child) { margin-top: 22px; }

/* 6.7 页头站点搜索弹层（v2.7.0，26-10-26 LM 裁 C 案：页头 Contact → 搜索触发；移动底栏第 5 格同触发）。
   token 全用既有变量；弹层独立 fixed 层不占页头宽度（B 案实测常驻输入框在 1280 下挤爆 8 项导航，此为上策）。 */
.ms-so { position: fixed; inset: 0; z-index: 1200; background: rgba(6,43,82,.55);
  display: none; align-items: flex-start; justify-content: center; padding: 0 16px; }
.ms-so.is-open { display: flex; }
.ms-so__card { margin-top: 12vh; width: min(640px, 100%); background: var(--ms-surface, #fff);
  border-radius: var(--ms-radius-lg, 12px); padding: 22px 22px 18px; box-shadow: 0 18px 60px rgba(2,17,34,.35); }
.ms-so__form { display: flex; border: 1.5px solid var(--ms-blue); border-radius: var(--ms-radius); overflow: hidden; background: #fff; }
.ms-so__form input { flex: 1; min-width: 0; border: 0; padding: 13px 14px; font: inherit; font-size: 16px; color: var(--ms-text); background: transparent; }
.ms-so__form input:focus { outline: none; }
.ms-so__form button { border: 0; background: var(--ms-blue); color: #fff; padding: 0 16px; display: inline-flex; align-items: center; cursor: pointer; }
.ms-so__chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.ms-so__chips a { font-size: 13px; padding: 6px 12px; border-radius: 999px; border: 1px solid var(--ms-border); color: var(--ms-text-muted); text-decoration: none; }
.ms-so__chips a:hover { border-color: var(--ms-blue); color: var(--ms-blue); }
.ms-so__hint { font-size: 12px; color: var(--ms-text-muted); margin: 12px 0 0; }
/* 触发钮＝ghost 胶囊带放大镜（桌面顶栏）。≤720 顶栏不保留本钮：沿用旧规 `.ms-topbar__cta .ms-btn--ghost{display:none}`
   自动隐藏（LM 26-10-26 裁：移动端底部栏已有 Search 格，顶栏不重复＝顶栏恢复 logo＋主钮两项）。 */
.ms-so-btn { display: inline-flex; align-items: center; gap: 7px; }
.ms-so-btn__ico { width: 15px; height: 15px; display: block; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; }

/* 生成的无字标替换了 CSS 画的 "M" 方块 */
.ms-logo__img { width: 30px; height: 30px; display: block; border-radius: 7px; flex: none; }

/* -----------------------------------------------------------------------------
   7. 窄屏实测修正（390px 并排对比表抓出的两处；均为新模板自身问题，非缓存）
   -------------------------------------------------------------------------- */

/* 7.1 导航：8 项在 390px 会折成 3 行，内容区被推到第二屏。
       用户裁决不做汉堡 ⇒ 改成单行横向滑动（chip 行的通用做法），
       右侧渐隐 + 隐藏滚动条，避免看起来"被切掉了"却不知道能滑。 */
@media (max-width: 720px) {
  .ms-nav { order: 3; flex-basis: 100%; min-width: 0; }
  .ms-nav__list {
    flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none; -ms-overflow-style: none; padding-bottom: 6px; gap: 0 16px;
    mask-image: linear-gradient(90deg, #000 88%, transparent 100%);
    -webkit-mask-image: linear-gradient(90deg, #000 88%, transparent 100%);
  }
  .ms-nav__list::-webkit-scrollbar { display: none }
  .ms-nav__list li { flex: none }
  .ms-nav__list a { font-size: 13px; padding: 8px 0 }
}

/* 7.2 表格：长订购码是不可断词，会把表撑破视口且无滚动提示。
       ⇒ 允许断词 + 两列规格表用 fixed 布局均分 + 保留横向滚动兜底。 */
@media (max-width: 720px) {
  .ms-table th, .ms-table td { padding: 9px 10px; font-size: 13px }
  .ms-table .ms-num, .ms-table td .ms-num { overflow-wrap: anywhere; word-break: break-word }
  .ms-table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch }
  /* Parameter/Value 这类两列表：fixed 布局 + 均分，避免 Value 列被挤到屏幕外 */
  .ms-panel .ms-table { table-layout: fixed; width: 100% }
  .ms-panel .ms-table th:first-child, .ms-panel .ms-table td:first-child { width: 42% }
  .ms-panel .ms-table caption { font-size: 12px }
  .ms-panel { padding: 16px 14px }
}

/* 7.3 规格表在 ≤560px 改为堆叠式（标签在上、值在下）。
   ⚠ 为什么不用"继续调列宽"：7.2 已经给了 table-layout:fixed + width:100% + 42%/58% 分配，
   实测 Value 列仍被切，说明溢出根因不在列宽（可能是 caption 或滚动容器的 min-content 传导）。
   在没有量到实锤之前，堆叠式对列宽计算完全免疫 —— 宁可换个不依赖它的布局，
   也不要继续凭猜测叠 CSS 规则。 */
@media (max-width: 560px) {
  .ms-panel .ms-table-scroll { overflow-x: visible }
  .ms-panel .ms-table, .ms-panel .ms-table tbody, .ms-panel .ms-table tr,
  .ms-panel .ms-table th, .ms-panel .ms-table td { display: block; width: 100% }
  .ms-panel .ms-table { table-layout: auto }
  .ms-panel .ms-table thead { display: none }
  .ms-panel .ms-table tr { padding: 10px 0; border-bottom: 1px solid var(--ms-border) }
  .ms-panel .ms-table tr:last-child { border-bottom: 0 }
  .ms-panel .ms-table td { padding: 2px 0; border: 0 }
  .ms-panel .ms-table td:first-child { font-size: 12px; color: var(--ms-text-muted); text-transform: uppercase; letter-spacing: .05em }
  .ms-panel .ms-table td.ms-num, .ms-panel .ms-table td:last-child { font-size: 15px; color: var(--ms-text) }
  /* 归档表（料号列表）列数多，堆叠会丢列语义 ⇒ 保留横向滚动，但给出明确提示 */
  .ms-wrap > .ms-table-scroll::after {
    content: "swipe \2192"; display: block; text-align: right;
    font-size: 11px; color: var(--ms-text-muted); padding-top: 6px; letter-spacing: .05em;
  }
}

/* 7.4 真正的溢出根因（7.3 之后才看清）：超长等宽料号是不可断的长 token，
   会把整页撑破视口 —— 症状是连表格外的正文都被横向切掉，很容易误判成"表格列宽问题"。
   ⇒ 所有 .ms-num（料号/日期/参数值）在窄屏允许任意断词；标题与面包屑同样处理。 */
@media (max-width: 720px) {
  .ms-num, .ms-h2.ms-num, .ms-table .ms-num, .ms-tabs a.ms-num {
    overflow-wrap: anywhere; word-break: break-word;
  }
  .ms-head h2, .ms-hero h2 { overflow-wrap: anywhere }
  /* 7.3 的副作用：caption 被挤成窄列、一行两三个词。给它整行宽度。 */
  .ms-panel .ms-table caption { display: block; width: 100%; max-width: 100%; color: var(--ms-text-muted) }
  /* 兜底：任何不可断 token 都不该把页面撑破 */
  .ms-wrap, .ms-panel, .ms-head, .ms-prose { min-width: 0; overflow-wrap: break-word }
}

/* -----------------------------------------------------------------------------
   8. 横向溢出的真因（探针定位，推翻 7.2–7.4 的三次猜测）
   探针输出：无 class 的 DIV 与 .ms-panel 同为 750px ⇒ .ms-split 的**网格子元素**
   是 single-part.php 里那层无名列包裹 div，不是 .ms-panel。网格项默认 min-width:auto，
   会被内部表格的 min-content 顶开，1fr 轨道随之膨胀 ⇒ 整页撑破视口。
   ⇒ 7.4 把 min-width:0 加在 .ms-panel 上，加错了对象。
   -------------------------------------------------------------------------- */

/* 8.1 根因修复：所有栅格/分栏的**直接子元素**都允许收缩到 0（CSS 网格溢出的标准解法）。
       不加媒体查询 —— 这个 blowout 在任何宽度都可能被宽表格触发。 */
.ms-split > *, .ms-grid > *, .ms-hero__in > * { min-width: 0 }

/* 8.2 撤销 7.3 的错误：我把滚动容器的 overflow-x 改成 visible，等于亲手拆掉唯一的
       兜底机制。堆叠是视觉布局问题，不需要靠取消滚动来"解决"。恢复滚动容器。 */
@media (max-width: 560px) {
  .ms-panel .ms-table-scroll { overflow-x: auto }
}

/* 8.3 堆叠后表格仍被内部 min-content 撑到 720px，导致表注（caption）在滚动容器里被切。
       堆叠布局本不需要横向滚动 ⇒ 让表格宽度锁在容器上，caption 允许折行。
       ⚠ 这里刻意不动 overflow-x（保持 auto 作为兜底），只约束表格自身宽度 ——
         7.3 就是因为动了 overflow-x 才引发 8 的整页溢出，不再重复同一个错。 */
@media (max-width: 560px) {
  .ms-panel .ms-table { table-layout: fixed; width: 100%; max-width: 100% }
  .ms-panel .ms-table caption { white-space: normal; overflow-wrap: anywhere; width: 100% }
  .ms-panel .ms-table td { width: 100% }
}

/* -----------------------------------------------------------------------------
   9. 新闻与料号筛选组件（2026-09-29 · 用户选定「列表 A + 内容页 A + 料号多选筛选」）
   —— 与审定 mockup（design-proposals-20260929）同源，生产版做了语义化整理。
   规则只作用于下列自身类，不影响既有页面。
   -------------------------------------------------------------------------- */

/* 9.1 新闻页骨架 */
.ms-news { padding-top: 0; padding-bottom: var(--ms-sp-16) }
.ms-hero--news { --ms-hero-min: 300px }
.ms-hero--news .ms-hero__in { grid-template-columns: 1fr; padding: 46px var(--ms-page-pad) 52px }
.ms-hero--news .ms-hero__title { font-size: 42px }
.ms-toolrow { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin: 6px 0 18px }
.ms-catchips { display: flex; gap: 8px; flex-wrap: wrap }
.ms-catchips a { display: inline-block; border: 1px solid var(--ms-border); border-radius: 999px; padding: 4px 12px; font-size: 13.5px; color: var(--ms-text-2); text-decoration: none; background: #fff }
.ms-catchips a.on, .ms-catchips a:hover { background: var(--ms-blue); border-color: var(--ms-blue); color: #fff }
/* 9.x 芯片滑带变体（26-10-27 方案 C，台账 #786）：料号库/分类法归档顶部的 part_category 芯片条
   改单行横滑——规则值照 §7 .ms-nav__list（390 导航横滑，已上线件），零新造 token。
   mask 右端渐隐＝"可继续滑"的可见 affordance；内容不溢出时渐隐落在空白区、不可见（桌面正常态）。
   min-width:0 承接 §8.1 栅格/flex 收缩教训；a{flex:0 0 auto} 防胶囊被压扁。 */
.ms-toolrow .ms-catchips--scroll { flex: 1 1 auto; min-width: 0; flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none; padding-bottom: 4px; mask-image: linear-gradient(90deg, #000 90%, transparent) }
.ms-catchips--scroll a { flex: 0 0 auto }
/* Filter Parts 行右锚（26-10-27，台账 #787，LM 指截图中下拉组贴左、右半全空）：
   桌面段整行靠右——Apply 落在右上 Reset 正下方，行内元素整体右移；
   窄屏不作用（保持换行左排的移动端既有形态）。#ms-filter-region 限定＝只咬料号库/
   分类法归档（archive-part.php 独有包裹层），挂牌板同名 .ms-fbar__row（spot-desk）零波及。 */
@media (min-width:981px) { #ms-filter-region .ms-fbar__row { justify-content: flex-end } }
/* 挂牌板同步（26-10-27 #790，LM 裁 a＝两步照方）：板内筛选行桌面段同样右锚。
   body.page-id-61 限定＝只咬 /live-quotes/（线上 HTML 实证该 body class），料号库与未来
   任何复用 .ms-fbar__row 的页面零波及；窄屏不作用（保持换行左排）。 */
@media (min-width:981px) { body.page-id-61 .ms-fbar__row { justify-content: flex-end } }
.ms-sortsel { font-size: 13.5px; color: var(--ms-text-2); display: flex; gap: 10px; align-items: center }
.ms-sortsel a { color: inherit }
.ms-sortsel a.on { font-weight: 700; color: var(--ms-text); text-decoration: none }

/* 9.1-B 分页导航（N58／台账 #382；10-11 N63 起 /news/ 也接进来）：由 ms_tpl_pagination() 产出，
   /parts/ 与 /market/ 与 /news/ 共用。刻意不居中：meta 段要贴右，整块居中会让它飘在中间。
   ⚠ 原 .ms-loadmore / .ms-loadmore__nav 三条规则已随 N1 删除——archive-news.php 是本仓
   唯一生产者，它改用 .ms-pager 之后这三条无人产出（留着的"看着生效其实没人读"＝死配置）。 */
.ms-pager { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 22px }
.ms-pager__n, .ms-pager__on { display: inline-block; min-width: 34px; text-align: center; border: 1px solid var(--ms-border); border-radius: 8px; padding: 5px 10px; font-size: 13.5px; text-decoration: none; color: var(--ms-text-2); background: #fff }
.ms-pager__n:hover { background: var(--ms-blue); border-color: var(--ms-blue); color: #fff }
.ms-pager__on { font-weight: 700; color: #fff; background: var(--ms-blue); border-color: var(--ms-blue) }
.ms-pager__meta { font-size: 13px; color: var(--ms-text-muted); margin-left: auto }
.ms-pager__gap { padding: 0 2px; font-size: 13.5px; color: var(--ms-text-muted) }
/* 10-12（LM 裁 B′）：页码与每页条数**统一 line-height:18px**。
   两边都没有显式 line-height ⇒ 走 `normal`，行盒由字号推：13.5px→18、13px→17，
   于是同一行里两个"当前项"差 1px（实测 30 vs 29，真实字体栈下）。
   ⚠ 钉 18px 而不是 20px：20px 会让两边都比现状高 2px（四臂实测量出来的，
     见 50-研究与证据/memsignal分页导航统一-20261011/ 的续记与 pp-pg高差四臂对比图）；
     18px 正是页码当前的自然行盒 ⇒ 谁都不变高，只把每页条数补 1px。
   ⚠ 也**没有**用"把 ppage 字号改成 13.5"来对齐——那会抹掉刻意的主次字号差。
   ⚠ 四个选择器必须一起改：只改一边就是把 1px 差从一处搬到另一处。 */
.ms-pager__n, .ms-pager__on,
.ms-ppage__n, .ms-ppage__on { line-height: 18px }
@media (max-width: 560px) { .ms-pager__meta { margin-left: 0; flex-basis: 100% } }

/* 9.2 文章卡（图文） */
.ms-card--article { overflow: hidden }
.ms-card--article .ms-card__title { font-size: 19px; line-height: 1.35; margin: 10px 0 6px }
.ms-card--article .ms-card__title a { color: inherit; text-decoration: none }
.ms-card--article:hover .ms-card__title a { color: var(--ms-blue) }
.ms-card__media { display: block; aspect-ratio: 16 / 9; overflow: hidden; background: #0B2240 }
.ms-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .25s }
.ms-card__body { padding: 14px 16px 16px }
.ms-ameta { font-size: 13px; color: var(--ms-text-muted); display: flex; gap: 8px; flex-wrap: wrap; align-items: center }
.ms-ameta .sep { opacity: .5 }

/* 9.3 Featured 与侧栏 */
.ms-feature { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: 24px; align-items: center }
@media (max-width: 900px) { .ms-feature { grid-template-columns: 1fr } }
.ms-feature__media { display: block; aspect-ratio: 16 / 10; border-radius: var(--ms-radius-lg); overflow: hidden; background: #0B2240 }
.ms-feature__media img { width: 100%; height: 100%; object-fit: cover }
.ms-feature__title { font-size: 30px; line-height: 1.25; margin: 10px 0 8px }
.ms-feature__title a { color: inherit; text-decoration: none }
.ms-feature__title a:hover { color: var(--ms-blue) }
.ms-rail { align-self: start }
.ms-rail__block { border-top: 2px solid #E5E9F0; padding-top: 14px; margin-top: 20px }
.ms-rail__block:first-child { border-top: 0; margin-top: 0; padding-top: 0 }
.ms-rail__head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px }
.ms-rail__head h3 { margin: 0; font-size: 16px }
.ms-rail__head a { font-size: 12.5px }
.ms-rank { list-style: none; margin: 0; padding: 0 }
.ms-rank li { display: flex; gap: 10px; padding: 10px 0; border-bottom: 1px solid #EEF1F6; align-items: flex-start }
.ms-rank .n { font: 600 15px/1.2 ui-monospace, monospace; color: var(--ms-blue); min-width: 18px; padding-top: 3px }
.ms-rank img { width: 64px; height: 42px; object-fit: cover; border-radius: 4px; flex: 0 0 auto; background: #0B2240 }
.ms-rank .t { font-size: 14px; line-height: 1.35 }
.ms-rank .t a { color: inherit; text-decoration: none }
.ms-rank .t a:hover { color: var(--ms-blue) }
.ms-rank .m { font-size: 12px; color: var(--ms-text-muted); margin-top: 3px }

/* 9.4 无图回退：品牌色块 + 文章图标（CSS mask）。置于卡片/Featured 基样式之后以确保覆盖底色 */
.ms-card__media--ph { position: relative; background: linear-gradient(135deg, #0A2A4F, var(--ms-navy)) }
.ms-card__media--ph::after {
  content: ""; position: absolute; inset: 0; margin: auto; width: 44px; height: 44px;
  background: #7FD8FF; opacity: .85;
  -webkit-mask: url("brand/icons/article.svg") center / contain no-repeat;
          mask: url("brand/icons/article.svg") center / contain no-repeat;
}

/* 9.5 内容页 */
.ms-article { max-width: 880px; margin: 0 auto }
.ms-crumbs { font-size: 12.5px; color: var(--ms-text-muted); margin-bottom: 6px }
.ms-crumbs a { color: inherit }
.ms-article__title { font-size: 36px; line-height: 1.22; margin: 10px 0 12px }
.ms-article__hero { aspect-ratio: 16 / 8; overflow: hidden; border-radius: var(--ms-radius-lg); margin: 18px 0 24px; background: #0B2240 }
.ms-article__hero img { width: 100%; height: 100%; object-fit: cover; display: block }
.ms-article__related { border-top: 1px solid var(--ms-border); margin-top: 34px; padding-top: 22px }
.ms-article__back { margin-top: 26px }
.ms-source { background: #F4F7FB; border-left: 3px solid var(--ms-blue); padding: 12px 16px; border-radius: 0 var(--ms-radius-sm) var(--ms-radius-sm) 0; font-size: 13.5px; color: var(--ms-text-2); margin-top: 26px }
.ms-source em { font-style: normal }

/* 9.6 正文排版（阅读宽由 .ms-prose 既有 --ms-measure 720px 控制） */
/* 9.6.1 正文里可能出现不可断的长 token（百分比编码的中文 URL、长料号、base64 串）。
   .ms-prose 的 overflow-wrap 原本只在 §7.4 的 @media(max-width:720px) 里给，桌面宽度不生效 ⇒
   单篇 Sources 的 URL（如 china.counterpointresearch.com/%E6… 连续 300+ 不可断字符）把
   .ms-prose(880) 撑到 2004，整页横向滚动（实测 2026-10-15 ymtc-q2-nand-shipments-third）。
   在块容器上设 anywhere 会被 inline 子元素（.ms-prose a）继承，长 URL 才在 880 宽内断行。 */
.ms-prose { font-size: 16.5px; line-height: 1.75; color: var(--ms-text-2); overflow-wrap: anywhere }
.ms-prose > * + * { margin-top: 1.1em }
.ms-prose h2, .ms-prose h3 { color: var(--ms-text); line-height: 1.35; margin: 1.6em 0 0 }
.ms-prose h2 { font-size: 24px }
.ms-prose h3 { font-size: 20px }
.ms-prose h2 + *, .ms-prose h3 + * { margin-top: .5em }
.ms-prose a { color: var(--ms-blue) }
.ms-prose ul, .ms-prose ol { padding-left: 22px }
.ms-prose li + li { margin-top: .35em }
.ms-prose img { max-width: 100%; height: auto; border-radius: var(--ms-radius-sm) }
.ms-prose blockquote { margin: 1.4em 0; padding: 2px 0 2px 16px; border-left: 3px solid var(--ms-border); color: var(--ms-text-muted) }
.ms-prose code { font-family: var(--ms-font-mono); font-size: .95em; background: #F1F5F9; border-radius: 4px; padding: 1px 5px }
.ms-prose > p:first-child { font-size: var(--ms-fs-body-lg); color: var(--ms-text) }

/* 9.7 料号筛选条（多选 · 无 JS；<details> 原生下拉；二期即时刷新的结构预留见模板注释）
   两行结构（2026-10-06 用户指令）：第一行 = 标题 + Reset（两端对齐），第二行 = 五组下拉 + Apply。
   ⚠ 第二行的自然需求 643px 内容 + 5×8 gap = 683px，可用 698px ⇒ 余量 15px（部署后线上复测值）。
     所以 gap 从 10 收到 8、fbar 左右 padding 从 12 收到 10；再放不下时 flex-wrap 会折成三行
     （**不会**溢出成横向滚动条，这是刻意的降级路径——折行只是难看，出条是功能坏了）。
     若将来加第六组下拉，这一行必然折行：届时把 "Temperature grade" 显示为 "Temp grade"
     （同页表头已用这个短词），可腾出 ~63px。 */
.ms-fbar { display: block; border: 1px solid var(--ms-border); border-radius: var(--ms-radius); padding: 10px; background: #fff }
.ms-fbar__top { display: flex; align-items: center; gap: 8px }
.ms-fbar__row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 12px }
.ms-fbar__label { font-weight: 600; display: inline-flex; gap: 8px; align-items: center }
.ms-fbar__label::before {
  content: ""; width: 16px; height: 16px; background: var(--ms-blue);
  -webkit-mask: url("brand/icons/filter.svg") center / contain no-repeat;
          mask: url("brand/icons/filter.svg") center / contain no-repeat;
}
/* .ms-fbar__btns 自 10-06 起无消费者（Apply 进第二行、Reset 进第一行），故删除该规则 */
.ms-fbar__reset { font-size: 13.5px; margin-left: auto }
details.ms-fdrop { position: relative }
details.ms-fdrop > summary { list-style: none; cursor: pointer; user-select: none }
details.ms-fdrop > summary::-webkit-details-marker { display: none }
details.ms-fdrop > summary::marker { content: "" }
details.ms-fdrop[open] > summary { border-color: var(--ms-blue); color: var(--ms-blue) }
.ms-fdrop--on { border-color: var(--ms-blue); color: var(--ms-blue) }
.ms-fdrop__panel { position: absolute; z-index: 40; top: calc(100% + 6px); left: 0; min-width: 270px; background: #fff; border: 1px solid var(--ms-border); border-radius: var(--ms-radius); box-shadow: 0 14px 34px rgba(6,43,82,.14); padding: 10px 12px }
.ms-fdrop__panel label { display: flex; align-items: center; gap: 9px; padding: 6px 2px; font-size: 14px; color: var(--ms-text); cursor: pointer }
.ms-fdrop__panel label:hover { background: #F7FAFC }
.ms-fdrop__panel input { accent-color: var(--ms-blue) }
.ms-fdrop__panel .cnt { margin-left: auto; color: var(--ms-text-muted); font-size: 12.5px }
.ms-fchips { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-top: 12px }
.ms-chip { display: inline-flex; gap: 7px; align-items: center; border: 1px solid #C9D6E8; border-radius: 999px; padding: 4px 11px; font-size: 13px; background: #F4F7FB; color: var(--ms-text-2) }
.ms-chip b { color: var(--ms-text); font-weight: 600 }
.ms-chip .x { color: var(--ms-text-muted); font-weight: 700; margin-left: 2px; text-decoration: none }
.ms-chip .x:hover { color: var(--ms-danger) }
.ms-fchips__clear { font-size: 13px }
.ms-stateline { display: flex; justify-content: space-between; align-items: center; gap: 14px; flex-wrap: wrap; font-size: 13.5px; color: var(--ms-text-muted); margin: 10px 0 18px }
/* 9.7-A 每页条数选择器（LM 10-10 裁决：默认 10，可选 10／25／50）。无 JS、纯链接，
   与 .ms-sortsel 同一视觉语言（文字标签 + 并排链接 + 当前项加粗），不新造一套控件样式。 */
.ms-ppage { display: flex; gap: 8px; align-items: center; font-size: 13px; white-space: nowrap }
.ms-ppage__l { color: var(--ms-text-muted) }
/* 10-11（N63／LM 裁 B）：每页条数的"可选／当前"改与 .ms-pager **同一套盒模型**。
   此前页码当前项是实心蓝胶囊、每页条数当前项是裸加粗黑字——同一行里两套"你在这里"的画法，
   且裸文字容易被读成说明文字而不是三个可切换的档。
   ⚠ 胶囊比裸文字宽：10-11 无头 Edge 实量同一份线上标记，视口 1226 下 .ms-ppage 组宽
   120.7px → **244.4px（+123.7px）**，单项 14.4px → 56.0px（与 .ms-pager 单项 56.0 一致）。
   实测结论：桌面仍与计数行同行、492px 视口仍折到第二行（与改前一致）、两个视口
   hOverflow=false、组右边界不越出计数行。**别拿"约 60–70px"这种估数当依据——我第一版注释里
   写的就是这个错数，被实量推翻。**（判行尾/换行不靠肉眼读缩放截图，#385 的标准） */
.ms-ppage__n, .ms-ppage__on { display: inline-block; min-width: 34px; text-align: center;
   border: 1px solid var(--ms-border); border-radius: 8px; padding: 5px 10px;
   font-size: 13px; text-decoration: none; color: var(--ms-text-2); background: #fff }
.ms-ppage__n:hover { background: var(--ms-blue); border-color: var(--ms-blue); color: #fff }
.ms-ppage__on { font-weight: 700; color: #fff; background: var(--ms-blue); border-color: var(--ms-blue) }

/* 9.8 Market 列表（方案 B · 编辑时间线 + 强化侧栏；2026-09-29 用户选定，台账 #248） */
.ms-hero--market .ms-hero__in { padding-bottom: 48px }
.ms-catchips .ms-num { opacity: .8; font-size: 12.5px }
.ms-tl { display: flex; gap: 20px; padding: 22px 0; border-bottom: 1px solid var(--ms-border) }
.ms-tl:first-child { padding-top: 6px }
.ms-tl__date { flex: 0 0 118px; font: 600 12px/1.6 ui-monospace, monospace; color: var(--ms-text-muted); letter-spacing: .05em; text-transform: uppercase; padding-top: 6px }
.ms-tl__body { flex: 1; min-width: 0 }
.ms-tl__body h3 { font-size: 23px; line-height: 1.3; margin: 8px 0 8px }
.ms-tl__body h3 a { color: inherit; text-decoration: none }
.ms-tl__body h3 a:hover { color: var(--ms-blue) }
.ms-tl__body > p { color: var(--ms-text-2); margin: 0 }
.ms-tl__topics { margin: 12px 0 0 }
.ms-tl__topics .ms-tag { text-decoration: none }
.ms-record__meta { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; font-size: 13px; color: var(--ms-text-muted) }
.ms-srcfoot { font-size: 13px; color: var(--ms-text-muted); margin-top: 12px; padding-top: 12px; border-top: 1px solid #EEF1F6 }
/* N48（2026-10-16，台账 #554）：1060–1115 视口两列模板给侧栏轨道只有 123–163px，而 ul.ms-desk
   的长不可断串（料号／URL）实测 min-content 258px ⇒ 轨道顶不住，整页 scrollWidth 钉在 1081 出横滚
   （逐元素取证＝隐藏 .ms-desk 后 1081→1021／1061，溢出全消）。同 §9.6 `.ms-prose`（#553）修法类。 */
.ms-desk { margin: 0; padding-left: 18px; font-size: 14px; line-height: 1.6; color: var(--ms-text-2); overflow-wrap: anywhere }
.ms-desk li { margin-top: 8px }
@media (max-width: 720px) {
  .ms-tl { flex-direction: column; gap: 6px }
  .ms-tl__date { flex-basis: auto }
}

/* -----------------------------------------------------------------------------
   9.9 「未开放」的标准表达件（2026-09-30 用户选定方案 P-A / S-A，台账 #___）
   本站此前缺这一件：模块在、数据不够格时，只能用 ms-alert 或 msct-notice 顶一下，
   两者都是"提示条"语义，读起来像通知，不像"这里有一个已定义好的槽位、按规则暂不发布"。
   /market/ 的 Publication gate 面板是这段判断的先行实现，本件把它抽成可复用的。
   -------------------------------------------------------------------------- */
.ms-gate { border: 1px dashed #B9C7DC; border-radius: var(--ms-radius-lg); background: #F7FAFD; padding: 24px }
.ms-gate__h { display: flex; gap: 10px; align-items: center; margin: 0 0 10px; font-size: 16px; font-weight: 700; color: var(--ms-navy) }
.ms-gate__lock { width: 22px; height: 22px; border-radius: 50%; background: #E3EAF4; color: #4B5F7C;
  display: grid; place-items: center; font-size: 12px; font-weight: 700; flex: 0 0 auto }
.ms-gate ul { margin: 10px 0 0; padding-left: 18px; font-size: 13.5px; color: var(--ms-text-2); line-height: 1.65 }
/* 替代料 / 交叉对照区块：与上方正文之间用 2px 分隔，标题行留 CTA 位 */
.ms-xref { border-top: 2px solid var(--ms-border); margin-top: 30px; padding-top: 20px }
.ms-xref__h { display: flex; justify-content: space-between; align-items: baseline; gap: 14px; flex-wrap: wrap; margin-bottom: 12px }
/* 空态闸门行：列头常驻、数据行位置给一句"为什么是空的"。
   斜纹底是刻意的——它读起来像"占位"，不像"这里本该有东西但坏了"。 */
.ms-gate-row td { background: repeating-linear-gradient(135deg, #FBFCFE 0 10px, #F1F5FB 10px 20px);
  text-align: center; color: var(--ms-text-muted); padding: 26px 14px }
.ms-gate-row td .msct-notice { text-align: left; margin: 0 }
/* 密集表：给 /parts/ 的 7 列结果表用（10-06 收紧，台账 #328；本段注释同日按 #329 订正）。
   对照方法＝拿 git 里本条之前那份 CSS 原件（md5 38960d5b…）与当前件渲染同一页，三条独立判据：
   容器 scrollWidth−clientWidth ／ offsetHeight−clientHeight（滚动条是否真被画出）／逐格 scrollWidth vs clientWidth。
     收紧前  容器 720／内容 720 ⇒ **不出条**；但数据行高 71px——"Automotive (AEC-Q100)" 与
             "Manufacturer ↗" 各被折成两行。
     收紧后  同样不出条；数据行高 39px，两格回到单行。
   ⇒ 本条的真实收益是**消除单元格折行**，不是"消除横向滚动条"。
   ⚠ 本注释先后写过两组数字，**两组都不成立**：① "787px 需／739px 容器／留 64px 余量"是料号库
     空态（只有列头）下量的；② "712／823px、余量 8px"出自一个 `width:min-content` 克隆探针，
     而**克隆体会污染同一容器上的 scrollWidth 读数**——该探针随后在 /live-quotes/ 上被证伪
     （它报"溢 96px"，纯净探针与像素都说 0）。⇒ 判"表格会不会出条"请用上面三条判据，别再用克隆探针。
   ⚠ 用户截图里那条滚动条**至今无法在本地复现**（收紧前后都不出），真实成因未定；候选＝Edge
     自动翻译的中间态、字体加载时序、窗口/DPR 差异。**不要在这里补一个听起来合理的根因。**
   仍成立的取舍：**不砍列、不改 `table-layout:fixed`**（前者丢信息，后者会把列宽平均化、反而挤坏料号列）。
   边界：≤767px 按 §4.5 既定移动端规范走横向滚动（移动端不缩字号、正文不小于 14px），本次未动。 */
.ms-table--dense { font-size: 13.5px }
.ms-table--dense th { white-space: normal; letter-spacing: .02em; font-size: 11.5px; line-height: 1.25 }
.ms-table--dense th, .ms-table--dense td { padding: 8px 6px }
.ms-table--dense .ms-num { overflow-wrap: anywhere }

/* -----------------------------------------------------------------------------
   9.10 批 2 净增件：报价板 / 视频卡 / 状态词表 / 方向标记（2026-09-30 用户选定
        Q-A＋并入 Q-B 字段表、V-A，台账 #264）
   只带上被选中的方案——S-B 的 .ms-keyval 与 mockup 专用的 .ms-note 一律不进生产。
   -------------------------------------------------------------------------- */
/* 补齐件：`.ms-md-12` 自 09-29 起被 archive-news.php 使用（featured 与 rail），
   但 §3 只定义了 .ms-md-6 / .ms-md-4 —— 今天不出问题纯粹因为 `.ms-grid > *{span 12}`
   的默认值恰好等于 12。默认值一改，这个类会静默失效。并进 §3 的 md 块（在 lg 之前，
   顺序天然安全），**不要另起一个裸 min-width:768px 块追加到文件末尾**——那会在同特异性下
   盖掉生产的 .ms-lg-*，把右栏压成全宽（09-30 提案轮踩过一次，靠截图高度 +316px 暴露）。 */

/* 报价板（规范③十字段；表头吸顶、数字等宽） */
.ms-qtable thead th { position: sticky; top: 0; background: #F4F7FB; z-index: 2 }
.ms-qtable td.q-part, .ms-qtable th.q-part { font-family: var(--ms-font-mono); color: var(--ms-text); white-space: nowrap }
.ms-qtable td.q-price { font-family: var(--ms-font-mono); font-variant-numeric: tabular-nums; text-align: right }

/* #519（10-14，LM 看图返工）：板面行单行化——固定表宽＋列宽分配＋spec 省略号（悬停 title 出全量）
   ＋CTA 按钮不折行。列序＝Part/Brand/Grade/Spec/Qty/Valid/DC/CTA（8 列，蓝图 §六）。
   ⚠ 只作用 .ms-spot-board（live 板面）；L2 预告表 .ms-qtable 是 10 列，别误伤。
   ⚠ 单行化的另一半在模型件：ms_spot_spec_trim 按空白 token 截断（旧 str_word_count 闸对
   数字/符号串恒不截断，是这次两行高的根因）。 */
.ms-spot-board { table-layout: fixed; width: 100% }
/* 表头 th 全局 white-space:nowrap（§4.5 行 202）在固定表宽下会把窄列撑爆整表（横向滚动条根因）
   ——板面列头允许两行换行，列宽才真正生效。 */
.ms-spot-board th { white-space: normal }
.ms-spot-board th:nth-child(1), .ms-spot-board td:nth-child(1) { width: 14% }
.ms-spot-board th:nth-child(2), .ms-spot-board td:nth-child(2) { width: 8% }
.ms-spot-board th:nth-child(3), .ms-spot-board td:nth-child(3) { width: 10% }
.ms-spot-board th:nth-child(4), .ms-spot-board td:nth-child(4) { width: 22%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.ms-spot-board th:nth-child(5), .ms-spot-board td:nth-child(5) { width: 12% }
.ms-spot-board th:nth-child(6), .ms-spot-board td:nth-child(6) { width: 10% }
.ms-spot-board th:nth-child(7), .ms-spot-board td:nth-child(7) { width: 8% }
.ms-spot-board th:nth-child(8), .ms-spot-board td:nth-child(8) { width: 16% }
.ms-spot-board td { padding: var(--ms-sp-3) var(--ms-sp-4) }
.ms-spot-board .ms-btn { white-space: nowrap }

/* #523（10-14，LM 三改）：①split 两列同顶——首子元素顶边距在网格里会塌出列顶，
   造成"Listing detail"与侧栏卡片错位；归零后两列真正对齐。
   ②决策信息条（顶部四数＋价格窗口倒计时）。③DC 成色三色芯片（新料绿／库存琥珀／拆机红）。 */
.ms-split > * > :first-child { margin-top: 0 }
.ms-decision { display: flex; flex-wrap: wrap; gap: 12px 24px; align-items: center; justify-content: space-between;
  background: #fff; border: 1px solid var(--ms-border); border-left: 4px solid var(--ms-blue);
  border-radius: var(--ms-radius-lg); padding: 12px 18px; margin: 0 0 16px }
.ms-decision__facts { display: flex; flex-wrap: wrap; gap: 8px 22px; font-size: 14.5px; color: var(--ms-text) }
.ms-decision__k { display: block; font-size: 11px; color: var(--ms-text-muted); text-transform: uppercase; letter-spacing: .05em }
.ms-decision__cd { text-align: right }
.ms-decision__cdlabel { display: block; font-size: 11px; color: var(--ms-text-muted); text-transform: uppercase; letter-spacing: .05em }
.ms-decision__cdval { font-size: 21px; font-weight: 700; color: var(--ms-navy) }
.ms-decision__cd small { display: block }
.ms-dc { display: inline-block; padding: 2px 9px; border-radius: 6px; font-weight: 600; font-size: 13px; line-height: 1.5; white-space: nowrap }
.ms-dc--new    { background: #E6F6EE; color: #0F7A45; border: 1px solid #BFE7D2 }
.ms-dc--stock  { background: #FFF4DC; color: #8A5A00; border: 1px solid #F2DFAE }
.ms-dc--pulled { background: #FDECEA; color: #B3261E; border: 1px solid #F5C6C0 }
/* 灰档（2026-10-22 LM 裁"成色新增灰色未知"）：DC 给不出 ⇒ 等级 unverified。
   刻意用**中性灰**不复用黄/红：红＝不可行动（Expired／拆机）、琥珀＝库存，三色已把"能判的成色"占满，
   灰是第四种语义＝信息不全、不是坏消息。色值取 slate 族（与 --ms-text-2 同族），
   对比度 #334155 on #F2F4F7 ≈ 9.2:1（AA 大字 3:1／正文 4.5:1 双过），与绿/琥珀/红三色正交、色盲不混淆。 */
.ms-dc--unknown { background: #F2F4F7; color: #334155; border: 1px solid #D8DEE7 }
/* #606（LM 截图报溢出）：多 DC 同行（24+/25+ 类）时 `/` 不构成断行点 ⇒ inline-block 整串撑破 DC 列、
   压进按钮列。板面芯片允许按最小溢出断行（anywhere 实际落点就在 `/` 后），列宽收缩回 td 内；
   对外文字一字不改、其他页的 .ms-dc（图例/详情页）不受影响。 */
.ms-spot-board .ms-dc { max-width: 100%; overflow-wrap: anywhere; }

/* #530（10-15，LM 裁决反转 v1.2"过期即 404"）：过期挂牌可见化——原位混排＋明显标记。
   板面行＝Expired 芯片＋整行弱化；详情页＝红系横幅＋决策条换"窗口已关闭"。
   色彩沿用 ms-dc--pulled／ms-alert--danger 同族（红＝不可行动状态），不引入新色。 */
.ms-dc--expired { background: #FDECEA; color: #B3261E; border: 1px solid #F5C6C0 }
.ms-spot-board tr.is-expired td { background: #FDF6F5; color: var(--ms-text-muted) }
.ms-spot-board tr.is-expired .q-part a { color: var(--ms-text-muted) }
.ms-spot-board tr.is-expired .ms-btn--secondary { opacity: .55 }
.ms-alert--expired { border-color: rgba(239,68,68,.45); background: rgba(239,68,68,.07); color: #7F1D1D }
.ms-decision--expired { border-left-color: rgba(239,68,68,.55) }

/* #533（10-15，LM 圈"提示条与下方盒列无距"）：挂牌详情顶部堆叠的节奏补齐。
   计算值取证改前＝decision→alert 16px、alert→split 0px、盒与盒 20px——两套语言撞在一起。
   补齐＝连续提示条之间 12px（同组内收紧），最后一条提示条/决策条→盒列 20px（与盒间距同尺）。
   只咬"相邻兄弟"形态，不动各件自身 margin；live-quotes 的 alert/gate 自带 margin-top 不受影响。 */
.ms-alert + .ms-alert { margin-top: 12px }
.ms-alert + .ms-split { margin-top: 20px }
.ms-decision + .ms-split { margin-top: 20px }

/* #534（10-15，LM 令详情页 DC 提示条色卡对齐板面 DC 芯片）：色调与 .ms-dc--* 一一对应；
   底色取芯片底色再浅一档、正文取芯片文字再深一档（WCAG 实测 7.78/7.73/8.44＝AAA）。
   等级→色调的映射单点在 content-types 的 ms_spot_grade_tone()；未知等级不在此表，退回 info。
   2026-10-22 灰档：底色 #F8FAFC／正文 #334155（≈10.2:1＝AAA），与上三档同一把尺、不引入新色族。 */
.ms-alert--dc-new    { border-color: #BFE7D2; background: #F0FAF4; color: #0F5A33 }
.ms-alert--dc-stock  { border-color: #F2DFAE; background: #FFF9EC; color: #6E4800 }
.ms-alert--dc-pulled { border-color: #F5C6C0; background: #FEF4F2; color: #8C1D18 }
.ms-alert--dc-unknown { border-color: #D8DEE7; background: #F8FAFC; color: #334155 }

/* 视频卡：16:9 框 + 播放三角。有真封面（本站代抓的 YouTube 封面，见 ms_video_thumb_url）时叠在框内，
   无封面（非 YouTube / 解析不到 ID）时回退这层品牌色渐变占位。⚠ 仍不用生成图冒充实拍——
   与 single-part.php "不放产品照片"同一条判断；真封面随视频导入（台账 #718）。 */
.ms-vcard { overflow: hidden }
.ms-vcard__media { display: block; position: relative; aspect-ratio: 16/9; overflow: hidden; border-radius: var(--ms-radius-sm) var(--ms-radius-sm) 0 0;
  background: linear-gradient(135deg, #0A3160 0%, #062B52 55%, #04203d 100%) }
.ms-vcard__media--feat { aspect-ratio: 16/10; border-radius: var(--ms-radius-lg) var(--ms-radius-lg) 0 0 }
.ms-play { position: absolute; inset: 0; display: grid; place-items: center }
.ms-play i { width: 58px; height: 58px; border-radius: 50%; background: rgba(255,255,255,.16);
  border: 1.5px solid rgba(255,255,255,.55); display: grid; place-items: center }
.ms-play i::after { content: ""; margin-left: 4px; border-left: 16px solid #fff;
  border-top: 10px solid transparent; border-bottom: 10px solid transparent }
.ms-vdur { position: absolute; right: 8px; bottom: 8px; font: 600 12px/1 var(--ms-font-mono);
  background: rgba(4,20,38,.82); color: #fff; padding: 4px 7px; border-radius: 4px }
.ms-vplat { position: absolute; left: 8px; top: 8px; font-size: 11.5px; font-weight: 700; letter-spacing: .05em;
  background: rgba(255,255,255,.9); color: #0B2240; padding: 4px 8px; border-radius: 4px; text-transform: uppercase }
.ms-vcard__body { padding: 14px 16px 16px }
.ms-vcard__title { font-size: 17px; line-height: 1.35; margin: 9px 0 6px; font-weight: 600 }
.ms-vcard__title a { color: inherit; text-decoration: none }
.ms-vcard__title a:hover { color: var(--ms-blue) }
.ms-vrow { display: flex; gap: 8px; align-items: center; font-size: 12.5px; color: var(--ms-text-muted); flex-wrap: wrap }

/* 状态词表图例（D2 词表 + 语义色；色点之外还带文字，不靠颜色单独承载信息） */
.ms-legend { display: flex; gap: 14px; flex-wrap: wrap; margin: 0; padding: 0; list-style: none; font-size: 13.5px; color: var(--ms-text-2) }
.ms-legend li { display: flex; gap: 7px; align-items: center }
.ms-legend .d { width: 9px; height: 9px; border-radius: 50%; display: inline-block; flex: 0 0 auto }
.d--success { background: #16A34A } .d--warning { background: #D97706 } .d--danger { background: #DC2626 }
.d--info { background: #2563EB } .d--muted { background: #94A3B8 }

/* 方向标记（公开层只给方向，不给单价） */
.ms-dir { display: inline-flex; gap: 6px; align-items: center; font-weight: 700; font-size: 12.5px;
  padding: 3px 9px; border-radius: 999px }
.ms-dir--up { background: rgba(22,163,74,.1); color: #14532D }
.ms-dir--slow { background: rgba(217,119,6,.12); color: #78350F }
.ms-dir--down { background: rgba(220,38,38,.1); color: #7F1D1D }

/* hero 里的规则声明条（与 /market/ 的 ms-caption 白 66% 同层级，但可枚举） */
.ms-hero__facts { list-style: none; display: flex; gap: 20px; flex-wrap: wrap; margin: 14px 0 0; padding: 0;
  color: #CFE3F6; font-size: 14px; position: relative; z-index: 1 }
.ms-hero__facts li { padding-left: 19px; position: relative }
.ms-hero__facts li::before { content: "✓"; position: absolute; left: 0; color: #7FD8FF; font-weight: 700 }

/* -----------------------------------------------------------------------------
   9.11 通用内容页（批 3，八页从主题的 .entry-content 迁到 .ms-prose）
   ⚠ .ms-prose 原本**没有表格规则**——那些页面的表格此前一直靠主题的
     `.entry-content table` 出样式。接管后表格会裸奔（实测 data-methodology 有 1 个表）。
     所以这里补上，而不是把页面留在主题排版里。
   -------------------------------------------------------------------------- */
.ms-prose table { width: 100%; border-collapse: collapse; font-size: var(--ms-fs-body); color: var(--ms-text-2) }
.ms-prose th { text-align: left; font-weight: 600; color: var(--ms-text); font-size: var(--ms-fs-caption);
  letter-spacing: .04em; text-transform: uppercase; padding: 10px 12px; border-bottom: 2px solid var(--ms-border); white-space: nowrap }
.ms-prose td { padding: 10px 12px; border-bottom: 1px solid var(--ms-border); vertical-align: top }
.ms-prose tbody tr:hover { background: rgba(0, 104, 183, .04) }
/* 长表格在窄屏要能横向滚，不能把 .ms-article 撑破（同 .ms-split 的网格溢出教训） */
.ms-prose table { display: block; overflow-x: auto }
@media (min-width: 768px) { .ms-prose table { display: table } }

/* -----------------------------------------------------------------------------
   9.12 内容页宽度回归的修正（2026-09-30，台账 #267）
   批 3 把八页正文套进 .ms-article(880) + .ms-prose(720) 之后，实测整块塌到 784px：
     1440 视口  .ms-wrap=784 / .ms-article=720 / .ms-prose=720 / 卡片最窄 162
     对照老页   .ms-wrap=1200
   784 = 720 + 32×2 ⇒ 不是"正文窄"，是 **main 被内容反向缩小**：
   Astra 的 `.site-content .ast-container{display:flex}` 让 main 成为 flex item，
   默认按内容定宽。老页面内容本来就宽所以看不出这个 latent 缺陷。两处都要修。
   -------------------------------------------------------------------------- */
/* ① 让 main 撑满容器，不再被内容拉着缩。min-width:0 是网格防溢出的同一条规则。
      ⚠ 作用对象是 `> main` 而不是 `> .ms-wrap`：批 4 的枢纽页模板是
        `<main class="ms-news">` + 正文自带 ms-wrap，类名不在 main 上，
        只写 `.ms-wrap` 会盖不到它们（09-30 加这条时没想到第四种模板形状）。 */
.site-content .ast-container > main { flex: 1 1 auto; min-width: 0 }

/* ② 阅读宽度只作用于**文字块**，不再夹住整块正文——这些页面里混着为宽容器设计的
      ms-grid / ms-card / table，一起压到 720 会把栅格挤成一列、卡片压到 162px。 */
.ms-article--wide { max-width: 1180px }
.ms-prose--wide { max-width: none }
.ms-prose--wide > p, .ms-prose--wide > ul, .ms-prose--wide > ol,
.ms-prose--wide > blockquote, .ms-prose--wide > h2, .ms-prose--wide > h3,
.ms-prose--wide > .ms-overline, .ms-prose--wide > .ms-body-lg { max-width: var(--ms-measure) }

/* -----------------------------------------------------------------------------
   9.13 纯散文法务页单栏居中（2026-10-02，接 #267）
   #267 为容纳带栅格/卡片的页面把容器放到 1180，但**纯散文页**（无 grid/card/table）
   因此正文被夹在 720 却左顶在一个 ~1136 的宽栏里，右侧空一大条——hero 通栏、正文只占
   左半，观感失衡（LM 报 disclaimer「宽度不符合要求」）。VI 规范定稿 §排版：文本 600–720、
   正文左对齐。处置＝给纯散文页的 main 加 `.ms-wrap--narrow`，把整栏收到 784
   （784 − 32×2 padding = 720 = measure），于是 hero 与正文同宽、margin-inline:auto 居中。
   ⚠ 只给**确认无栅格**的页面用：实测 disclaimer grid/card/table 计数 0/0/0，
     而 terms 18 卡、privacy 24 卡、cookie 15 卡、editorial 1 卡——收窄会把它们挤成一列
     （正是 #267 的同一条教训），故 narrow 名单由模板按 slug 精确控制，不在此处泛用。
   ⚠ 与 §9.12① 的 `> main{flex:1 1 auto}` 共存：flex item 上的 `margin-inline:auto`
     会先吸收剩余空间（flex-grow 被视作 0），所以 784 宽、居中，二者不冲突。
   -------------------------------------------------------------------------- */
.ms-wrap--narrow { max-width: 784px }
@media (max-width: 720px) { .ms-wrap--narrow { max-width: none } }

/* -----------------------------------------------------------------------------
   9.14 详情页图文同宽 ~880（2026-10-02，#289→#290 改判）
   #289 把内容块撑到 1136、正文仍锁 720 左顶 → 头图满宽、正文只占左半、右侧大片留白，
   LM 判"正文宽度不对"。#290 改判＝图文同宽 ~880：内容块 880、正文填满 880、头图随块到
   880，三者齐边、整栏居中。① 仍把单篇(post)容器从 Astra 的 750 提到 1240（否则 880 块被
   夹到 686）；② .ms-article 用默认 880（不再撑 1180）、.ms-prose 放开填满块（不再 cap 720）。
   ⚠ 880 正文比 VI 的 600–720 宽——LM 明确选"图文同宽"优先于阅读宽。/about/ 仍 1136/720
     （带卡片、另一取向；是 body.page，不受本块影响）。只作用 body.single，不碰归档/首页/页面。
   -------------------------------------------------------------------------- */
body.single .site-content .ast-container { max-width: 1240px }
body.single .ms-prose { max-width: none }

/* -----------------------------------------------------------------------------
   9.15 详情页宽度统一（2026-10-02，台账 #291，LM 定档）
   统一口径：主容器 .ms-wrap 一律 1200；内容块 1136（栅格/卡片页）；纯正文页 880
   （图文同宽）；带侧栏的 split 主栏 720。本轮落地 LM 已明确的三处——
   disclaimer → B 档 880（不再走 §9.13 的 784 窄栏）；market 列表 / parts 列表 /
   part 单篇 → C 档主栏 720（`.ms-split--720`，主栏定宽 720、侧栏吃剩余）。
   ⚠ news 列表、live-quotes、about 等"散文+卡片"混排页、sitemap 均「不动」（LM 指定）；
     live-quotes 仍用普通 .ms-split（2fr:1fr），所以 720 是**新增变体**、不改全局 .ms-split。
   ⚠ §9.13 的 .ms-wrap--narrow 自此无页面使用（disclaimer 是它唯一消费者），保留规则但已停用。
   -------------------------------------------------------------------------- */
.ms-prose--880 { max-width: 880px }
.ms-split--720 { grid-template-columns: 720px minmax(0, 1fr) }
@media (max-width: 1024px) { .ms-split--720 { grid-template-columns: 1fr } }

/* -----------------------------------------------------------------------------
   9.16 视频 facade（点击加载 youtube-nocookie iframe）（2026-10-02，台账 #292）
   复用 .ms-vcard__media(--feat) 的固定比例框 + .ms-play 播放键。facade 是叠在框里的
   按钮（缩略图 cover + 居中播放键），点击后由内联脚本换成 .ms-yt-frame（absolute 填满框）。
   框的 aspect-ratio 固定 ⇒ 换 iframe 前后同尺寸 ⇒ 无 CLS；不点 ⇒ 不加载 iframe ⇒ 无 Google cookie。
   非 YouTube（Facebook 等）走 .ms-yt-external 外链分支，不注入 iframe。
   -------------------------------------------------------------------------- */
.ms-yt-facade { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; margin: 0; padding: 0; background: #0B2240; cursor: pointer; display: block; color: inherit; font: inherit }
.ms-yt-facade__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block }
.ms-yt-facade .ms-play, .ms-yt-external .ms-play { z-index: 1 }
.ms-yt-frame { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; display: block }

/* --------------------------------------------------------------------------
10. 首页动态区块（2026-10-03 首页布局定稿 H-C，design-proposals-20261003）
   消费方 = mu-plugin memsignal-home-blocks.php 的三个 shortcode。
   ⚠ 本批**只并净增件**：.ms-md-* / .ms-lg-* / .ms-h2 / .ms-overline / .ms-gate /
     .ms-dir--up|slow|down / .ms-cardlink>.ms-card 等已在 §3 与 §84–89 定义，此处不得重写。
     原因（09-30 与 10-03 各踩过一次）：后写的裸 `.ms-md-6` 会在 1024+ 盖掉生产 `.ms-lg-4`
     ——media query 不参与特异性比较，胜负只看源码顺序。
   ⚠ 提案件的 .ms-proto-banner / .ms-note / .ms-hero--tight / .ms-entry / .ms-matrix /
     .entry-header{display:none} 六类**刻意不进生产**（最后一条是 mockup 里的临时隐藏手段，
     生产改用 Astra 页面级设置关标题，不把 display:none 写进 CSS）。
   -------------------------------------------------------------------------- */

/* 10.1 B2 今日信号一行带 */
.ms-signal-bar { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; background: #F4F8FD; border: 1px solid var(--ms-border); border-left: 4px solid var(--ms-blue); border-radius: var(--ms-radius); padding: 11px 16px; margin: 18px 0 0; font-size: 14px; color: var(--ms-text-2) }
.ms-signal-bar__k { font: 700 11.5px/1 var(--ms-font-sans); letter-spacing: .09em; text-transform: uppercase; color: var(--ms-navy) }
.ms-signal-bar a { color: var(--ms-blue-deep); font-weight: 600; text-decoration: none; flex: 1 1 auto; min-width: 220px }
.ms-signal-bar a:hover { text-decoration: underline }
.ms-signal-bar__src { margin-left: auto; font-size: 12.5px; color: var(--ms-text-muted) }
.ms-dir--flat { background: rgba(148, 163, 184, .16); color: #475569 }

/* 10.2 B4 四路动态卡（每类动态一个固定落位；空态写状态词不写 0 records） */
.ms-chan { display: flex; flex-direction: column; border: 1px solid var(--ms-border); border-radius: var(--ms-radius-lg); background: #fff; padding: 16px 18px 14px; height: 100% }
.ms-chan__h { display: flex; gap: 8px; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; border-bottom: 2px solid var(--ms-navy); padding-bottom: 10px }
.ms-chan__h h3 { margin: 0; font-size: 15.5px; font-weight: 700; color: var(--ms-navy) }
.ms-chan__b { flex: 1 1 auto; padding: 12px 0 8px }
.ms-chan__b ul { list-style: none; margin: 0; padding: 0 }
.ms-chan__b li { padding: 9px 0; border-bottom: 1px dashed #E6ECF4; font-size: 14px; line-height: 1.5 }
.ms-chan__b li:last-child { border-bottom: 0 }
.ms-chan__b li a { color: var(--ms-text); text-decoration: none; font-weight: 500 }
.ms-chan__b li a:hover { color: var(--ms-blue-deep); text-decoration: underline }
.ms-chan__b li small { display: block; margin-top: 3px; color: var(--ms-text-muted); font-size: 12px; font-weight: 400 }
.ms-chan__f { border-top: 1px solid var(--ms-border); padding-top: 10px; font-size: 13.5px }
.ms-chan__f a { color: var(--ms-blue-deep); font-weight: 600; text-decoration: none }

/* 10.3 B5 订阅带（Q-a 选①：槽位形态先上，不收数据，服务商定了再接）
   ⚠ 10-15 V2 修复（台账 #541／问题台账 N74）：品牌渐变亮端 `#00C6FF` 上任何浅色文字都不达 AA
   （白字仅 2.00、原 caption `#9FC3E4` 只有 **1.08**），且 `.ms-subscribe__h` 从未显式取色 ⇒
   被 h2 规则压成 `#1F2937`，标题在**深端**就是深色压深蓝。数学上不存在"只压暗背景"的解
   （亮端压到 #006E8E 时 #9FC3E4 仍只 3.15），故按 LM 选的 V2＝保留品牌渐变＋给两块直接子元素加暗色盒衬。
   盒衬 α 取 **.58 而非 mockup 里的 .42**：实测 .42 时白字亮端仅 4.62、浅蓝字 4.15（不达标）；
   .58 下白 6.78／浅蓝 6.10，两端均远超 AA 4.5。 */
.ms-subscribe { display: grid; grid-template-columns: 1.4fr 1fr; gap: 26px; align-items: center; background: var(--ms-gradient); color: #fff; border-radius: var(--ms-radius-lg); padding: 26px 28px; margin: 34px 0 0 }
.ms-subscribe > div, .ms-subscribe > p { background: rgba(0, 26, 48, .58); padding: 14px 16px; border-radius: 10px }
/* ⚠ 必须用两级选择器：`ms-ds` 挂在 <body> 上（实测 ancestorChain 确认），于是
   `.ms-ds h2`(0,1,1) 会压掉单 class 的 `.ms-subscribe__h`(0,1,0)、
   `.ms-ds a:not(.ms-btn)`(0,2,1) 会压掉 `.ms-subscribe a`(0,1,1)——首轮 V2 就是这样
   "规则存在且匹配、computed 仍是深色"，只有 getComputedStyle 能发现，读 CSS 看不出来。 */
.ms-subscribe .ms-subscribe__h { margin: 0 0 8px; font-size: 22px; font-weight: 700; color: #FFFFFF }
.ms-subscribe p { margin: 0; font-size: 14.5px; line-height: 1.7; color: #EAF4FF }
.ms-subscribe p.ms-caption { color: #EAF4FF !important }
.ms-subscribe .ms-caption a { color: #FFFFFF; text-decoration: underline }
/* 原 `.ms-subscribe__f label`／`.ms-subscribe__row`／`.ms-subscribe .ms-input` 三条已删：
   表单于 #538 撤下后生产侧零消费者（引用只剩 design-proposals 的历史 CSS 副本与本批补丁锚点）。
   留此注释防后人"顺手加回"。窄屏单列规则（原 1148 行 `grid-template-columns:1fr`）未动。 */

/* 10.4 B1 信任条压暗：hero 背景是芯片实拍，第四格落在高光区上，
   副文 rgba(255,255,255,.66) 对比度不足（10-03 截图实测）。只加背景层，不动 §352 的栅格。 */
.ms-hero .ms-trust { background: linear-gradient( 180deg, rgba(4, 20, 38, .42), rgba(4, 20, 38, .80) ) }

@media ( max-width: 900px ) {
  .ms-subscribe { grid-template-columns: 1fr }
  .ms-signal-bar__src { margin-left: 0; width: 100% }
}

/* 10.5 首页 hero 与内容同缘（10-03 LM 指出"顶部图与下方内容宽度不协调"）
   量算根因（ops/measure-home-widths-20261003.py，1440 视口）：
     .ms-hero  x=108→1308 w=1200 padding 0      ← 色块与背景图铺满 1200
     .ms-hero__in / .ms-trust  padding 32       ← hero 内文字落在 140→1276
     .ms-wrap  padding 32                       ← 下方内容也落在 140→1276
   ⇒ 下方内容与 hero 内文字本就对齐，不齐的只有**色块边界**（108 vs 140，差 32px）。
   反方向（把 .ms-wrap 的 padding 去掉扩到 1200）不可取：① .ms-wrap 是全站公共类
   （11 个模板 + 2 个 mu-plugin 在用），改它＝一次改掉全站内容宽度；
   ② 下方内容会跑到 108 而 hero 文字仍在 140，制造新的错位。
   ⇒ 本件只作用于带 --home-inset 的首页 hero：色块内缩到与内容同缘，
     同时把 __in / .ms-trust 的左右内距归零，使**所有可视左缘统一在 140**。 */
.ms-hero--home-inset { margin-inline: var(--ms-page-pad) }
/* 内距取 24px 而非 0：首版归零后主标题、搜索框与信任条全部压住色块左缘（10-03 截图实测，
   比改前更局促）。banner 内的文字本就该有呼吸——**色块边缘**与下方内容对齐是 LM 要的那件事，
   文字再内缩 24px 属正常构图，不是"没对齐"。 */
.ms-hero--home-inset .ms-hero__in, .ms-hero--home-inset .ms-trust { padding-inline: 24px }
@media ( max-width: 860px ) {
  /* 窄屏下 --ms-page-pad 已由 §352 的 .ms-trust 分支重排，此处同步收边距避免双重内缩 */
  .ms-hero--home-inset { margin-inline: calc(var(--ms-page-pad) / 2) }
}



/* --------------------------------------------------------------------------
11. 内容页垂直间距修正（2026-10-04 LM 指出"图片与文字、表格与文字间距太小"）
   探针实测（ops/measure-content-gaps-20261004.py，12 页 × 1280 档）：
     G1  hero 底边 → .ms-article 顶边 = **0px**，12 页全部一致
         根因是三条叠加：.ms-article{margin:0 auto} 上下为 0、
         .ms-hero__in 的 padding-bottom 为 0、.ms-prose > * + * 只管非首元素
         ⇒ 首块 margin-top 也是 0，hero 大图直接压在第一个标题上。
     G2  标题 → 后随块 = 16px，来自 .ms-ds h2{margin-bottom:var(--ms-sp-4)}
        覆盖 p / ul / .ms-card / .ms-grid / .ms-table 全部后随形态 ⇒ **统一改基础值**，
        不逐类打补丁。首版我只给 grid/panel/table 加 margin-top，复测发现 h2→p、h2→ul、
        h2→.ms-card 仍是 16px（探针当场暴露），只改一半会造出 h2→grid 24 而 h2→p 16 的新不一致。
     G3  .ms-article 直接子里的 .ms-alert 与后随 h2 间隙 = 0（.ms-alert 只有 padding 无 margin、
        h2 的 margin-top 为 0）⇒ 只给"直接子"补下边距；.ms-prose 内的 alert 不动，
        那里已有 > * + * 的 1.1em 正文节奏。
   三条都用**后段覆盖**，不改 §84／§165 的原始规则行。首页只受 G2 影响
   （h2 后随 16→24，与 G1 同向、更舒展）；hub 页走 .ms-hub-body + 正文自带
   .ms-wrap padding 56px，实测无 G1 问题，不在本批范围。
   -------------------------------------------------------------------------- */
.ms-article { margin-top: var(--ms-sp-12) }                       /* G1: 0 → 48px */
.ms-ds h2, .ms-ds .ms-h2 { margin-bottom: var(--ms-sp-6) }     /* G2: 16 → 24px，统一覆盖所有后随形态 */
.ms-article > .ms-alert { margin-bottom: var(--ms-sp-6) }      /* G3: 0 → 24px，只给直接子补，不碰 prose 内 */
/* G4：真正的根因是 §84 的 `.ms-ds h2{margin:0 0 …}` 把 h2 **上**边距强制归零 ⇒
   任何元素后面跟 h2 都会贴住（探针在 /editorial-policy/ 实测 alert→h2 gap=0，
   而我原先按"alert 的直接父是 .ms-article"写的选择器没命中，说明层级比猜的深）。
   所以不逐个补 alert，而是给"非首元素的 h2"统一上间距——特异性 (0,2,1) 压过 §84 的 (0,1,1)。 */
.ms-article h2:not(:first-child), .ms-prose h2:not(:first-child) { margin-top: var(--ms-sp-8) }
/* G5：相邻 alert 堆叠间距 16 → 24px（2026-10-04 LM 看 A/B 对比图后拍板 B）。
   /about/ 的 "What MemSignal is not" 一节有四条**各自独立**的合规声明连续堆叠
   （不持库存 / 报价非交易价 / 与原厂无关联 / 不托管规格书），16px 让它们读起来像
   一条 bullet list；其中"无关联、勿推断授权背书"是商标合规的关键声明，被挤在一起会削弱。
   与 G2/G3 的 24px 同档，消除同页两种节奏。 */
.ms-alert + .ms-alert { margin-top: var(--ms-sp-6) }
/* G6（2026-10-04 #304 立、同日 #309 撤销）：容器类是否纳入 measure 约束。
   #304 当时的判断＝"段落 720、卡片 1136 混排、右缘不齐"，于是把 .ms-prose--wide 的
   直接子容器也压到 720。**LM 看渲染图后否掉了这个取向**：卡片收到 720 后整页变成一条
   窄栏、右侧空出一条，比"右缘不齐"更难看（对照图 ops/variants-shot-20261004.py 的
   disc-CUR 带）。LM 选 方案二＝卡片整条通栏到右边缘、与顶部横幅齐边、保持自上而下的
   阅读顺序。
   实测更正 #304 的一处前提：参考页 /about/ 的卡片其实都在 .ms-grid / .ms-stack 内
   （探针 lw2r-about 直子序列＝overline/body-lg/h2/grid…，无直子 .ms-card/.ms-alert），
   所以 #304 的 G6 从未作用于 About——About 一直呈现的正是"文字 720 + 宽块 1136"，
   这本身就是 LM 要对齐的目标。撤销 G6 只会把 6 个法务页（disclaimer/editorial/
   data-methodology/terms/privacy/cookie）的**直子**卡片/提示框放回全宽，About、contact
   等栅格页零变化。§844-847 的文字 measure 约束保留不动。 */
.ms-prose--wide > .ms-card, .ms-prose--wide > .ms-alert,
.ms-prose--wide > .ms-panel, .ms-prose--wide > .ms-gate { max-width: none }
/* 引导条 .ms-lead（2026-10-05 #312，LM 选方案B；#314 扩到 About）：全卡片式页
   （editorial-policy / data-methodology）与 About 顶部那句"本页用途"引导段，之前是裸在
   卡片外的散字（"混排"族）。做成浅色引导条：淡底 + 左侧蓝描边 + 圆角 + padding，既不再
   孤立、又与下方编号卡片区分。⚠ 只在正文显式挂 .ms-lead 的块生效（按页 opt-in）。
   选择器用 `.ms-prose--wide > .ms-lead`（不限元素）：editorial/data-method 是 `<p.ms-lead>`
   直接命中；About 是 `<div class="ms-lead">` 包住 overline+正文，内部段落再单独放开
   §845 的 720 限宽（About 正文原带 ms-measure，seed 已去掉；这里再兜一层）。 */
.ms-prose--wide > .ms-lead {
  max-width: none; margin: 0 0 var(--ms-sp-6);
  background: #F4F8FD; border: 1px solid var(--ms-border); border-left: 4px solid var(--ms-blue);
  border-radius: var(--ms-radius); padding: 20px 24px;
}
.ms-prose--wide > .ms-lead > p { max-width: none; margin: 0; }
.ms-prose--wide > .ms-lead > p + p { margin-top: 10px; }
@media ( max-width: 782px ) {
  .ms-article { margin-top: var(--ms-sp-8) }                   /* 窄屏收一档，避免首屏过半是空白 */
}

/* --------------------------------------------------------------------------
   12. 内容分享到社媒（2026-10-08，LM 拍 D1-B／D2-四枚／D6 纯外链，台账 #349 · 关闭 N47）
   消费方 = mu-plugin `memsignal-site-chrome.php::msd_share_block()`，
   由 single-news / single-market / single-part 三个模板在正文之后各调一次。
   归档页、首页、报价板、视频页不放（D3 只裁了三类单篇）。

   几何与 §6.5.1 的页脚社媒芯片**刻意同源**（34px 圆 / 15px 图标 / 1px 边框 / hover 换色），
   但配色不共用一份规则：页脚那组压在 navy 上（白 76% + cyan hover），这组在浅底上。
   ⇒ 抽成同一个类会让一处改动同时动两处，而两处的对比度判据不同（#345 就是为 2.48:1 返工的）。
   ⚠ hover 不用 --ms-cyan：#00A8E8 压白底只有 2.7:1（浅底上不达标），改用 --ms-blue（5.7:1）。
   ⚠ 特异性：本站有 `.ms-ds a:not(.ms-btn)`（0-2-1）在 §2 统管链接色，#345 已因低估它返工一次
     ⇒ 这里写 `.ms-ds .ms-share a.ms-share__chip`（0-3-1），不靠源码顺序赌。
   -------------------------------------------------------------------------- */
.ms-share {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin: 34px 0 8px; padding: 16px 0 0; border-top: 1px solid var(--ms-border);
}
.ms-share__lab {
  font: 700 11px/1 var(--ms-font-sans); letter-spacing: .1em; text-transform: uppercase;
  color: var(--ms-text-muted);
}
.ms-share__list { list-style: none; margin: 0; padding: 0; display: flex; gap: 10px; flex-wrap: wrap }
.ms-share__list li { margin: 0 }
.ms-share__chip {
  position: relative; box-sizing: border-box;
  width: 34px; height: 34px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--ms-border); border-radius: 50%;
  background: var(--ms-card); color: var(--ms-blue-deep);
  font: inherit; cursor: pointer;
}
.ms-share__chip:hover { border-color: var(--ms-blue); color: var(--ms-blue) }
.ms-share__chip:focus-visible { outline: 2px solid var(--ms-blue); outline-offset: 2px }
.ms-share__chip svg { width: 15px; height: 15px; display: block }
/* 复制反馈：绝对定位在芯片右侧 ⇒ 出现/消失都不撑动布局（无 CLS，同 §9.16 facade 的处理） */
.ms-share__state {
  position: absolute; left: calc(100% + 8px); top: 50%; transform: translateY(-50%);
  font-size: 12px; line-height: 1; color: var(--ms-text-2); white-space: nowrap;
}
/* 浅底上的链接色必须盖过 §2 的全局规则（见上方特异性说明） */
.ms-ds .ms-share a.ms-share__chip { color: var(--ms-blue-deep); text-decoration: none !important }
.ms-ds .ms-share a.ms-share__chip:hover { color: var(--ms-blue) }
@media ( max-width: 782px ) {
  .ms-share { margin-top: 26px }
}

/* -----------------------------------------------------------------------------
   13. China Parts 品牌子页（2026-10-10，LM 拍板 B 方案，台账 #388）
   组件：ms-hero__status / ms-bp-cols / ms-bp-cards / ms-bp-part / ms-bp-single / ms-bp-kv
   形态源：design-proposals-20261010-brandpages/mockups/B-dossier-cards.html（mk-* 转正 ms-bp-*）
   消费者：assets/templates/page-brand.php（mu-plugin v1.7.0 路由）
   -------------------------------------------------------------------------- */
.ms-hero__status { display: flex; gap: 14px; flex-wrap: wrap; font-size: var(--ms-fs-caption); color: rgba(255,255,255,.66); margin: 8px 0 0 }
.ms-bp-cols { display: grid; grid-template-columns: minmax(0, 8fr) minmax(0, 4fr); gap: var(--ms-gutter); align-items: start; margin-top: var(--ms-sp-8) }
.ms-bp-cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--ms-gutter) }
.ms-bp-part { display: flex; flex-direction: column; gap: 8px }
.ms-bp-part > .ms-tag { align-self: flex-start }
.ms-bp-part__pn { font-family: var(--ms-font-mono); font-weight: 700; font-size: 15px; letter-spacing: .01em }
.ms-bp-part__pn a { color: var(--ms-text); text-decoration: none; border-bottom: 1px solid var(--ms-border) }
.ms-bp-part__pn a:hover { color: var(--ms-blue); border-color: var(--ms-blue) }
.ms-bp-part__meta { font-size: var(--ms-fs-caption); color: var(--ms-text-muted) }
.ms-bp-part__foot { display: flex; justify-content: space-between; align-items: center; margin-top: auto; padding-top: 8px; border-top: 1px solid var(--ms-border); font-size: var(--ms-fs-caption) }
.ms-bp-part__foot a { color: var(--ms-blue); text-decoration: none }
.ms-bp-single { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 14px 18px }
.ms-bp-single__main { display: flex; flex-direction: column; gap: 2px; min-width: 0 }
.ms-bp-kv { display: flex; justify-content: space-between; gap: 12px; font-size: 14px; padding: 6px 0; border-bottom: 1px dashed var(--ms-border) }
.ms-bp-kv:last-child { border-bottom: 0 }
.ms-bp-kv b { color: var(--ms-text) }
@media ( max-width: 1100px ) { .ms-bp-cards { grid-template-columns: repeat(2, minmax(0, 1fr)) } }
@media ( max-width: 900px )  { .ms-bp-cols { grid-template-columns: 1fr } }

/* 报价询盘表单的验证码行（10-13 加，配合工作台 v2.0.0）。
   只用既有 token；.ms-rfq__* 此前无任何定义＝裸用零样式（见 memsignal 分册那条"判类名有没有样式要 grep 基础定义"）。 */
.ms-rfq__cap { margin-top: .5rem; }
.ms-rfq__caprow { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; }
.ms-rfq__capimg { border: 1px solid var(--ms-border, #E5E7EB); border-radius: 4px; vertical-align: middle; background: #F5F7FA; }
.ms-rfq__caprefresh { font-size: .8rem; padding: .35rem .7rem; }

/* --------------------------------------------------------------------------
   14. 族汇总页卡片等高 + 字号收档（2026-10-20 LM 看对比图选方案 B，台账 #616）
   根因：卡片吃全站 .ms-card__title=20px 偏大、长族名换行；描述按 24 词截长短不一、
     且有族无描述（Metorage）→ grid 同行 top 对齐却高度参差。
   方案 B＝去描述（汇总页只当导航卡，描述在族页里都在）+ 内容形状统一（标题/计数/View 三项），
     卡撑满 grid 格子等高 + flex 垂直居中。作用域限本页 .fh-cards，不改全站 .ms-card__title。
   诚实性：卡片仍只给族词条名 + 真实成员计数（可自证），无编造数字（R-NUM 不跨页继承）。
   -------------------------------------------------------------------------- */
.fh-cards .ms-card{display:flex;flex-direction:column;justify-content:center;gap:8px;height:100%}
.fh-cards .ms-card__title{font-size:14px;line-height:1.3;font-weight:700;margin:0}
.fh-cards .ms-card__meta{font-size:12.5px;margin:0}

/* --------------------------------------------------------------------------
   15. 首页方向 A · Signal Desk 落地（2026-10-20，X1 裁决：四格状态带占 hero 底 .ms-trust）
   原则：四格带**直接复用既有 .ms-trust**（b=#fff/15px、span=caption、4 列网格、对遮罩达 AA），
     X1 只是"同槽换文本"，桌面几乎不需重排；本节只补三处 scoped 净增，
     全部限定首页选择器，不写裸 .ms-md/.ms-lg 工具类（media query 不比特异性、后写裸类会
     在 1024+ 盖掉生产规则），不新造颜色（沿用 token 与 .ms-trust 既有取值）。
   -------------------------------------------------------------------------- */
/* 值用等宽（承 mockup 的 .mono），仅作用于首页状态带，不做全局 .mono */
.ms-hero .ms-trust--status b.mono { font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; letter-spacing: .01em; }
/* 主标题 38（仅 ≥1024，避开 ≤980 的 30px 与既有断点，不污染窄屏） */
@media (min-width: 1024px) {
  .ms-hero--home-inset .ms-hero__title { font-size: 38px; margin: 0 0 14px; }
  /* 方向 A：首页 hero 去 .ms-die 改单栏装箱，右侧留白消失（仅首页变体，≤980 既有单栏规则不受影响） */
  .ms-hero--home-inset .ms-hero__in { grid-template-columns: minmax(0, 1fr); }
}
/* 搜索框 ↔ 四格带的死档收紧（现 .ms-trust margin-top:56px → 首页带 24px）；副标 12px。特异性同 .ms-trust span，靠文件末尾顺序胜出，仅咬 --status 修饰类 */
.ms-hero--home-inset .ms-trust--status { margin-top: 24px; padding-top: 16px; padding-bottom: 18px; }
.ms-hero .ms-trust--status span { font-size: 12px; }

/* --------------------------------------------------------------------------
   16. 窄屏（≤1023）卡片堆 + 底部固定标签栏（第二批 2026-10-20，方向 A 窄屏定稿）
   铁律：断点隔离——所有新规则都封在 media query 里，≥1024 桌面零影响（宽表/横排导航/无底栏）；
     卡片堆与表格同页双输出、纯 CSS 切换（零 JS）；新类前缀 .ms-spot-card/.ms-part-card/.ms-tabbar
     全站无消费者（上线前已 grep）；颜色全用既有 token，不新造。
   -------------------------------------------------------------------------- */
/* 16.1 桌面（≥1024）：卡片堆与底部栏一律不渲染（占位零高度） */
.ms-spot-cards, .ms-part-cards, .ms-tabbar { display: none; }

@media (max-width: 1023px) {
  /* 16.2 顶栏 8 项沉底：导航入口单一化（防双导航并存），logo+CTA 保留 */
  .ms-nav { display: none; }

  /* 16.3 卡片堆：spot（板面+首页预览）与 part（/parts/ 归档）通用 */
  .ms-spot-cards, .ms-part-cards { display: grid; gap: 12px; }
  .ms-spot-board, .ms-part-table { display: none !important; }   /* 宽表窄屏退场（首页预览+板面+料库归档）。⚠ 必须 !important：§7 里 .ms-panel .ms-table{display:block}（≤560 表格堆叠）特异度 0,2,0 会压过本条 0,1,0，导致超窄手机宽表漏出、与卡片堆并存（2026-10-21 台账#655 实测修复）。 */
  .ms-spot-card, .ms-part-card {
    background: var(--ms-surface, #fff); border: 1px solid var(--ms-border, #E5E7EB);
    border-radius: var(--ms-radius, 10px); padding: 12px 14px;
  }
  .ms-spot-card.is-expired, .ms-part-card.is-expired { opacity: .78; }
  .ms-spot-card__head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; border-bottom: 1px solid var(--ms-border, #E5E7EB); padding-bottom: 8px; margin-bottom: 8px; }
  .ms-spot-card__id { font-weight: 700; margin-right: auto; }
  .ms-spot-card__brand { color: var(--ms-text-2, #52606D); font-size: 13px; }
  .ms-spot-card__view { font-size: 13px; white-space: nowrap; }
  .ms-spot-card__row { display: flex; gap: 10px; padding: 3px 0; font-size: 13.5px; line-height: 1.55; }
  .ms-spot-card__k { flex: 0 0 96px; color: var(--ms-text-muted, #64748B); }
  .ms-spot-card__v { flex: 1; min-width: 0; overflow-wrap: anywhere; }

  /* 16.5 方向 B：现货挂牌窄屏卡（分组网格）——2026-10-21 LM 选定。全复用现有 token 与 .ms-dc/.ms-tag 色卡，
     宽屏（≥1024）与 /parts/ 归档卡的 .ms-spot-card__* 老类不受影响（新规则只挂在 .ms-spot-card--v2 作用域内）。 */
  .ms-spot-card--v2 { position: relative; border-radius: var(--ms-radius-lg); padding: 14px 14px 13px; overflow: hidden; box-shadow: 0 2px 8px rgba(6,43,82,.07); }
  .ms-spot-card--v2::before { content: ""; position: absolute; left: 0; top: 0; right: 0; height: 3px; background: var(--ms-gradient); }
  .ms-spot-card--v2 .sc-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
  .ms-spot-card--v2 .sc-id { font-family: var(--ms-font-mono); font-weight: 700; font-size: 16px; color: var(--ms-navy); text-decoration: none; letter-spacing: .2px; }
  .ms-spot-card--v2 .sc-brand { display: inline-block; font-size: 11px; font-weight: 600; color: var(--ms-blue-deep); background: rgba(0,104,183,.08); border: 1px solid rgba(0,104,183,.18); padding: 1px 7px; border-radius: 5px; margin-top: 5px; }
  .ms-spot-card--v2 .sc-dc { display: flex; gap: 5px; flex-wrap: wrap; justify-content: flex-end; }
  .ms-spot-card--v2 .sc-tags { display: flex; gap: 6px; margin: 10px 0 2px; flex-wrap: wrap; }
  .ms-spot-card--v2 .sc-spec { margin: 2px 0 10px; padding-bottom: 10px; border-bottom: 1px dashed var(--ms-border); }
  .ms-spot-card--v2 .sc-spec .spec { font-size: 13px; color: var(--ms-text); line-height: 1.5; overflow-wrap: anywhere; margin-top: 2px; }
  .ms-spot-card--v2 .sc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .ms-spot-card--v2 .sc-m .lab, .ms-spot-card--v2 .sc-spec .lab { font-size: 10.5px; letter-spacing: .4px; text-transform: uppercase; color: var(--ms-text-muted); }
  .ms-spot-card--v2 .sc-m .val { font-family: var(--ms-font-mono); font-size: 18px; font-weight: 700; color: var(--ms-blue); line-height: 1.25; overflow-wrap: anywhere; }
  .ms-spot-card--v2 .sc-m.alt .val { font-size: 15px; color: var(--ms-text); font-weight: 600; }
  .ms-spot-card--v2 .sc-foot { display: flex; gap: 8px; margin-top: 12px; }
  .ms-spot-card--v2 .sc-btn { font-size: 13px; font-weight: 600; text-decoration: none; padding: 10px 8px; border-radius: var(--ms-radius-sm); min-height: var(--ms-touch-min); display: flex; align-items: center; justify-content: center; }
  .ms-spot-card--v2 .sc-btn--ghost { flex: 0 0 auto; padding: 10px 14px; color: var(--ms-blue); border: 1px solid var(--ms-blue); background: var(--ms-card); text-decoration: none; }
  /* 站点对 a 有全局色（部分带 !important），故 CTA 文字色用更高特异度 + !important 兜住，确保白字压在渐变上有足够对比。 */
  .ms-spot-card--v2 a.sc-btn--primary { flex: 1; color: #fff !important; text-decoration: none !important; background: var(--ms-gradient); }

  /* 16.4 底部固定标签栏：四项 + 「更多」零 JS 展开；不盖页脚（body/页脚留安全间距） */
  .ms-tabbar {
    display: grid; grid-template-columns: repeat(5, minmax(0,1fr));  /* v2.7：底栏 4→5 格（+Search），列数固定非自适应 */
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 90;
    background: var(--ms-navy, #062B52); border-top: 1px solid rgba(255,255,255,.14);
    padding-bottom: env(safe-area-inset-bottom, 0px);
  }
  /* 隐藏 Astra「返回顶部」悬浮钮：它 fixed bottom:30px right:30px z-99，正好压在
     本站底部标签栏（z-90、高≈56px）的第四列「More」上。此断点与 .ms-tabbar 可见范围一致
     （≤1023px），两者不共存即无遮挡。!important 压过 Astra JS 注入的内联 display:block。
     回顶/回首页由底部栏 Home 承担（常驻可达）。26-10-23 LM 选方案 B。 */
  #ast-scroll-top { display: none !important; }
  .ms-tabbar__item {
    position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 3px; color: rgba(255,255,255,.8) !important; text-align: center; font-size: 11px;
    padding: 8px 4px 7px; text-decoration: none; min-height: 54px;
  }
  .ms-tabbar__ico { width: 22px; height: 22px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; display: block; }
  .ms-tabbar__lb { font-size: 11px; font-weight: 500; line-height: 1; }
  /* v2.7 页头搜索入口（LM 裁 C 案）：底栏第 5 格是 <button>（动作不改 URL）——复位 UA 按钮样式，
     其余视觉全继承上面的 .ms-tabbar__item；列数原为固定 repeat(4)，同批改 repeat(5)。 */
  button.ms-tabbar__item { appearance: none; background: transparent; border: 0; font: inherit; cursor: pointer; }
  .ms-tabbar__item.is-cur, .ms-tabbar__item[aria-current="page"] { color: var(--ms-cyan, #00A8E8) !important; font-weight: 700; }
  .ms-tabbar__item.is-cur::before, .ms-tabbar__item[aria-current="page"]::before {
    content: ""; position: absolute; top: 0; left: 27%; right: 27%; height: 3px;
    background: var(--ms-cyan, #00A8E8); border-radius: 0 0 3px 3px;
  }
  .ms-tabbar__sub { display: none; }   /* T1：副标仍不展示，主标＋图标两行足够 */
  .ms-tabbar__more { position: relative; }
  .ms-tabbar__more summary { list-style: none; cursor: pointer; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; min-height: 54px; color: rgba(255,255,255,.8); font-size: 11px; }
  .ms-tabbar__more summary::-webkit-details-marker { display: none; }
  .ms-tabbar__panel {
    position: fixed; left: 0; right: 0; bottom: 56px; z-index: 89;
    background: var(--ms-navy, #062B52); border-top: 1px solid rgba(255,255,255,.14);
    display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 2px 8px;
    padding: 10px 14px calc(12px + env(safe-area-inset-bottom, 0px));
  }
  .ms-tabbar__panel a { color: rgba(255,255,255,.88); padding: 9px 6px; font-size: 14px; border-bottom: 1px solid rgba(255,255,255,.08); }
  /* 固定栏不盖内容：页面与页脚让位（含 iOS 安全区）；栏加图标抬高后让位随之 57→56→含图标实测高度 */
  body.ms-ds { padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px)); }
  .ms-foot { margin-bottom: 0; }
}

/* -----------------------------------------------------------------------------
   17. 详情页决策优先 hero（2026-10-21 方案 D2·吸收 D3 图示 · D2详情页·见变更台账）
   现货详情(single-spot)与料号详情(single-part)共用头部：深色渐变 + 大号带图标指标 tiles。
   全复用 §1 token，不新造色；桌面 hero 全宽置顶，移动 ≤720 tiles 降 2 列 + sticky 主 CTA。
   只作用于新增类名（.ms-dhero/.ms-dtile/.ms-timeline/.ms-cta-dock），不改既有页面。
   ⚠ 判据不变量（落地模板须保住）：现货无价格/货币(G10)、出口管制措辞唯一来源、
      倒计时 data-deadline 北京口径、expired 处理；料号 .ms-crumb 恰 1 且末项 span、
      Compiled specifications 表在位、Provenance 在位、不放产品照片。
   -------------------------------------------------------------------------- */
.ms-dhero { position: relative; overflow: hidden; border-radius: var(--ms-radius-lg);
  padding: 20px 22px 18px; margin: 0 0 22px; color: #fff;
  background: linear-gradient(135deg, var(--ms-navy) 0%, var(--ms-blue-deep) 55%, var(--ms-blue) 100%); }
.ms-dhero .ms-crumb { color: rgba(255,255,255,.72); }
.ms-dhero .ms-crumb a { color: var(--ms-cyan); }
.ms-dhero .ms-crumb > * + *::before { color: rgba(255,255,255,.4); }
.ms-dhero__h1 { font-family: var(--ms-font-mono); font-weight: 700; font-size: 21px;
  line-height: 1.25; color: #fff; margin: 5px 0 6px; overflow-wrap: anywhere; }
.ms-dhero__meta { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 4px; }
.ms-dhero__meta .ms-tag { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.22); color: #fff; }
.ms-dhero__sub { font-size: var(--ms-fs-caption); color: rgba(255,255,255,.75); margin: 0; }
.ms-dhero__sub a { color: var(--ms-cyan) !important; }
/* v3 视频详情页（2026-10-23）：深色 hero 的**无衬线白字大标题**变体，给长视频标题用。
   .ms-dhero__h1 是等宽体（料号型号用），长句会显得突兀；本类改回无衬线并降一档。
   ⚠ 必须把 color 与 font-size 都写进 `.ms-ds .ms-dhero__title`（特异度 0,2,0）——
     全局 `.ms-ds h1`（0,1,1）会同踩两者，只修一个会漏另一个（分册§五已知坑）。 */
.ms-ds .ms-dhero__title { font-family: var(--ms-font-sans); font-weight: 700; font-size: 21px;
  line-height: 1.3; color: #fff; margin: 9px 0 7px; overflow-wrap: anywhere; }
.ms-dhero__tiles { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 10px; margin: 14px 0 0; }
.ms-dtile { background: rgba(255,255,255,.09); border: 1px solid rgba(255,255,255,.16);
  border-radius: 9px; padding: 9px 11px; min-width: 0; }
.ms-dtile__k { display: flex; align-items: center; gap: 5px; font-size: 10px; letter-spacing: .4px;
  text-transform: uppercase; color: rgba(255,255,255,.68); }
.ms-dtile__ic { width: 15px; height: 15px; stroke: rgba(255,255,255,.85); fill: none; stroke-width: 1.8;
  stroke-linecap: round; stroke-linejoin: round; flex: 0 0 auto; }
.ms-dtile__v { font-family: var(--ms-font-mono); font-weight: 700; font-size: 19px; line-height: 1.2;
  color: #fff; margin-top: 3px; overflow-wrap: anywhere; }
.ms-dtile--cd { background: rgba(0,168,232,.16); border-color: rgba(0,168,232,.46); }
.ms-dtile--cd .ms-dtile__v, .ms-dtile--cd .ms-dtile__ic { color: var(--ms-cyan); stroke: var(--ms-cyan); }

/* 有效期时间轴（现货详情·D3 图示，新增信息维度、不与参数表重复） */
.ms-timeline { display: flex; align-items: flex-start; margin: 12px 0 2px; }
.ms-timeline__seg { flex: 1; text-align: center; position: relative; font-size: 10.5px; color: rgba(255,255,255,.72); overflow-wrap: anywhere; }
.ms-timeline__seg::before { content: ""; width: 11px; height: 11px; border-radius: 50%; background: var(--ms-success);
  box-shadow: 0 0 0 3px rgba(34,197,94,.2); display: block; margin: 0 auto 5px; position: relative; z-index: 2; }
.ms-timeline__seg--end::before { background: var(--ms-warning); box-shadow: 0 0 0 3px rgba(245,158,11,.22); }
.ms-timeline__line { position: absolute; top: 5px; left: 12%; right: 12%; height: 2px; background: rgba(255,255,255,.24); z-index: 1; }

/* 移动 sticky 主 CTA 坞（贴底部栏上方，与顶栏 CTA 呼应；桌面不出现） */
.ms-cta-dock { display: none; }

@media (max-width: 720px) {
  .ms-dhero { padding: 16px 15px 15px; margin-bottom: 16px; }
  .ms-dhero__h1 { font-size: 18px; }
  .ms-dhero__tiles { grid-template-columns: 1fr 1fr; }
  .ms-dtile__v { font-size: 16px; }
  .ms-cta-dock { position: sticky; bottom: 56px; z-index: 60; display: flex; gap: 8px;
    margin: 16px -14px 0; padding: 10px 14px; background: var(--ms-navy);
    box-shadow: 0 -2px 10px rgba(6,43,82,.2); }
  .ms-cta-dock .ms-btn { flex: 1; min-height: var(--ms-touch-min); }
}

/* -----------------------------------------------------------------------------
   18. 详情页 D②：决策条 + 三卡（2026-10-21 变更台账 D2fix；桌面+移动，含两处回归内联修）
   ── 回归修复 A（标题黑字压深蓝）：.ms-ds h1(0,1,1) 盖过 .ms-dhero__h1(0,1,0)，用
      .ms-ds 作用域把特异度抬到 (0,2,0) 稳压，同时治好现货页与料号页型号。
   ── 回归修复 B（深色 hero 里浮白盒）：D② 起现货 hero 不再复用带白底的老 .ms-decision 当
      外层，改中性 .ms-dbar（透明、无白底）；倒计时值仍挂 .ms-decision__cdval，JS 选择器改 [data-deadline]。
   值全走真实字段，字符串不增删（仅重排/搬家）；价格/货币仍不出现。
   -------------------------------------------------------------------------- */
.ms-ds .ms-dhero__h1 { color: #fff; font-size: 21px; line-height: 1.25; }

.ms-dbar { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 22px; margin-top: 12px; }
.ms-dbar__id { flex: 1 1 240px; min-width: 0; }
.ms-dbar__id .ms-dhero__h1 { margin: 2px 0 3px; }
.ms-dbar__meta { font-size: 12px; color: rgba(255,255,255,.72); }
.ms-dbar__facts { display: flex; gap: 8px 20px; flex-wrap: wrap; }
.ms-dbar__fact .k { display: flex; align-items: center; gap: 5px; font-size: 9.5px; letter-spacing: .4px;
  text-transform: uppercase; color: rgba(255,255,255,.66); }
.ms-dbar__fact .k .ms-dtile__ic { width: 14px; height: 14px; stroke: rgba(255,255,255,.85); fill: none; stroke-width: 1.8; }
.ms-dbar__fact .v { font-family: var(--ms-font-mono); font-weight: 700; font-size: 15px; color: #fff; margin-top: 2px; overflow-wrap: anywhere; }
.ms-dbar__cd { text-align: center; flex: 0 0 auto; background: rgba(0,168,232,.16); border: 1px solid rgba(0,168,232,.5);
  border-radius: 10px; padding: 7px 14px; min-width: 74px; }
.ms-dbar__cd .ms-decision__cdval { font-family: var(--ms-font-mono); font-weight: 800; font-size: 17px; color: var(--ms-cyan); line-height: 1; }
.ms-dbar__cd .lab { display: block; font-size: 9.5px; color: rgba(255,255,255,.72); margin-top: 3px; }
.ms-dbar__cd .ms-dc { font-size: 15px; }
.ms-dbar__cta { flex: 0 0 auto; min-height: 44px; }
.ms-dbar__cta.ms-btn--primary { background: #fff; color: var(--ms-navy) !important; }

/* 三卡：把一堵长表拆成 标识 / 技术规格 / 来源核验（值不增删，仅重排） */
.ms-dgrid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 14px; margin-top: 18px; }
.ms-dcard { background: var(--ms-card); border: 1px solid var(--ms-border); border-radius: var(--ms-radius); padding: 14px 15px; }
.ms-dcard__h { display: flex; align-items: center; gap: 8px; font-size: 11px; letter-spacing: .5px;
  text-transform: uppercase; color: var(--ms-text-muted); font-weight: 700; margin: 0 0 9px; }
.ms-dcard__h .ib { width: 26px; height: 26px; border-radius: 8px; flex: 0 0 auto;
  background: rgba(0,104,183,.09); color: var(--ms-blue); display: flex; align-items: center; justify-content: center; }
.ms-dcard__h .ib svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.ms-kvr { display: flex; justify-content: space-between; gap: 12px; font-size: 12.5px; padding: 5px 0; border-bottom: 1px dashed var(--ms-border); }
.ms-kvr:last-child { border-bottom: 0; }
.ms-kvr .k { color: var(--ms-text-muted); flex: 0 0 auto; }
.ms-kvr .v { color: var(--ms-text); text-align: right; min-width: 0; overflow-wrap: anywhere; }
.ms-kvr .v.mono { font-family: var(--ms-font-mono); }
.ms-dspec { font-size: 13px; line-height: 1.6; color: var(--ms-text); overflow-wrap: anywhere; }

@media (max-width: 900px) {
  .ms-dgrid { grid-template-columns: 1fr; }
}
@media (max-width: 720px) {
  .ms-dbar { gap: 10px 14px; }
  .ms-dbar__facts { width: 100%; justify-content: space-between; }
  .ms-dbar__cta { width: 100%; }
  .ms-ds .ms-dhero__h1 { font-size: 18px; }
  .ms-ds .ms-dhero__title { font-size: 19px; }
}


/* =============================================================================
   @2026-10-23 首页间距规范节（方案 A 后续收紧：LM 定 32→16、块内 14→12，走 CSS 类/变量，去内联魔数）
   目的：首页四个大模块之间的垂直间隙统一为 16（--ms-gap-module）；模块内
        标题→内容、内容→次级卡组的间距统一为 12（--ms-gap-block）。原首页正文
        与 home-blocks.php 里散落的 padding-top:32 / margin-*:14 / gap:14 一并撤除，
        统一由本节供给。取值仍是 8px 体系（VI §102/§112）成员。
   ⚠ 本节的 .ms-wrap 覆盖只作用于「首页 .entry-content 直接子级 ms-wrap」，
     不外溢到全站其它 .ms-wrap（其它页的 ms-wrap 仍是 §4 L392 的默认 padding）。
   回滚：删除本节 + 恢复正文/模板内联（见 ops/rollback-20261023-home-gap）。
   -------------------------------------------------------------------------- */
:root {
  --ms-gap-module: 16px;  /* 首页大模块之间的间隙（原 32，LM 反馈偏大→16） */
  --ms-gap-block:  12px;  /* 模块内 标题↔内容、内容↔次级卡组 的间隙（原 14） */
}
/* 首页大模块间隙：覆盖正文里遗留的内联 padding-top（!important 保平权，正/模两处都吃） */
.ms-ds .entry-content > .ms-wrap {
  padding-top: var(--ms-gap-module) !important;
  padding-bottom: 0;
}
/* 最后一个内容模块保留桌面底距，喂页脚/订阅区呼吸（不咬 subscribe 所在块之外的东西） */
.ms-ds .entry-content > .ms-wrap:last-child { padding-bottom: 56px; }
/* 块内小标题：紧贴其内容，12 */
.ms-ds .ms-subhead { margin-bottom: var(--ms-gap-block) !important; }
/* 次级卡组上移 12 */
.ms-ds .ms-subblock { margin-top: var(--ms-gap-block); }
/* 卡组列间距 12 */
.ms-ds .ms-cardstack { gap: var(--ms-gap-block); }


/* =============================================================================
   @2026-10-23 首页收尾间距（方案 B 首页收尾，LM 定「非 8 倍数就近吸附到 8px 阶」）
   把首页残留的裸像素内联（18/6/4/10px + 已在阶上的 8/12/16px）统一收进 token+类，
   与 round2 的 --ms-gap-module(16)/--ms-gap-block(12) 同一套 8px 体系（VI §102/§112）。
   吸附映射：信任卡内距 18→16；卡内说明上距 4→8；订阅说明 10→12；spot 副标 6→12。
   ⚠ 仅动首页 post#60 与 home-blocks.php 的消费者；不改 .ms-card/.ms-head 等全站默认值（那属 C）。
   -------------------------------------------------------------------------- */
:root {
  --ms-card-pad: 16px;   /* 信任卡内距（原内联 18→吸 16） */
  --ms-sub-gap: 8px;     /* 卡内 标签↔说明 小距（原 4→吸 8） */
}
.ms-ds .ms-cardpad { padding: var(--ms-card-pad); }
.ms-ds .ms-gap-sub { margin: var(--ms-sub-gap) 0 0; }
/* 副标/免责/订阅说明 统一吃 block 档（复用 round2 的 --ms-gap-block:12） */
.ms-ds .ms-gap-block { margin-top: var(--ms-gap-block); }

/* -----------------------------------------------------------------------------
   9.17 视频中心·频道式（方案 A，2026-10-24 落地，design-proposals-20261023）
   消费方 = 模板 page-video-center.php。与 news/market 的 8/4 侧栏列表**刻意不同**
   =「视频优先、通栏、无侧栏」。三件生产里不存在的结构：横向头条 .ms-vfeat、
   四列卡网格 .ms-vshelf、底部发布横条 .ms-vpub。
   ⚠ 只并净增件，不复用/不重写 .ms-grid 与 .ms-md/.ms-lg 列类——.ms-vshelf 自带
     repeat() 网格，卡不挂列类。原因（09-30 与 10-03 各踩过一次）：后写的裸列类会在
     1024+ 盖掉生产列宽，media query 不参与特异性比较、胜负只看源码顺序。
   ⚠ 其余全部复用既有件：ms-hero--news / ms-toolrow / ms-catchips / ms-h2 / ms-alert /
     ms-vcard / ms-vcard__media / ms-play / ms-vdur / ms-vplat / ms-vrow / ms-tag /
     ms-yt-facade__img。本块不得重复定义它们。
   -------------------------------------------------------------------------- */
/* 头条：媒体占 1.35、文案占 1，容器 overflow 裁圆角（媒体本身不留圆角，避免与容器角错位） */
.ms-vfeat { display: grid; grid-template-columns: minmax(0,1.35fr) minmax(0,1fr);
  background: var(--ms-card); border: 1px solid var(--ms-border);
  border-radius: var(--ms-radius-lg); overflow: hidden; margin-top: 22px }
.ms-vfeat .ms-vcard__media { border-radius: 0 }
.ms-vfeat__body { padding: 26px 28px; display: flex; flex-direction: column; justify-content: center; gap: 10px }
.ms-vfeat__title { font-size: 24px; line-height: 1.25; margin: 2px 0 0; font-weight: 600 }
.ms-vfeat__title a { color: var(--ms-text); text-decoration: none }
.ms-vfeat__title a:hover { color: var(--ms-blue) }
@media (max-width: 960px) { .ms-vfeat { grid-template-columns: 1fr } }

/* 卡网格：桌面 4 列 / 平板 2 列 / 手机 1 列。卡视觉（白底+描边+圆角，缩略图齐边）在此挂，
   不靠 .ms-card（.ms-card 有 24px 内距，会把缩略图缩进一圈、与 mockup 不符）。 */
.ms-vshelf { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 18px; margin-top: 16px }
.ms-vshelf .ms-vcard { background: var(--ms-card); border: 1px solid var(--ms-border);
  border-radius: var(--ms-radius-sm) }
@media (max-width: 1023px) { .ms-vshelf { grid-template-columns: repeat(2, minmax(0,1fr)) } }
@media (max-width: 560px)  { .ms-vshelf { grid-template-columns: 1fr } }

/* 底部「Where we publish」横条（原侧栏 rail 内容下沉，通栏） */
.ms-vpub { margin-top: 30px; display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
  background: var(--ms-card); border: 1px solid var(--ms-border); border-radius: var(--ms-radius); padding: 14px 18px }
.ms-vpub__t { font-size: 12.5px; font-weight: 700; letter-spacing: .04em; color: var(--ms-text-muted); text-transform: uppercase }
.ms-vpub a { font-size: 13px; font-weight: 600; color: var(--ms-blue); text-decoration: none }
.ms-vpub a:hover { text-decoration: underline }
.ms-vpub__note { margin-left: auto; font-size: 12.5px; color: var(--ms-text-muted) }
@media (max-width: 640px) { .ms-vpub__note { margin-left: 0; flex-basis: 100% } }
