/**
 * MythosX Anvil 使用教程 · 版式系统（g- 前缀）
 *
 * 业务定位：教程页「照着做」的版式——吸顶教程条、首屏（文案 + 选择器 + 舞台挂载点）、节头、准备硬件清单、
 * 竖排步骤、BIOS 规格条与提示、核对清单。以后新增章节的页面复用这一份，不另起样式。
 *
 * 取舍（控件规范 v2「去油」，work/briefs/controls-v2.md）：
 *   - Owner 嫌原来的拨档「土」、BIOS 控件「油腻」：病根是装饰叠加（渐变底、内高光、发光投影、套框、圆点灯、暖金状态词）。
 *     现在的质感只靠发丝细线、字重与字色的层级、对齐和间距；本文件里不许出现渐变底色和 box-shadow（焦点环用 outline）。
 *   - 暖金只用在三处：当前项的 2px 指示线、键盘焦点环、首屏舞台（B）。状态词、进度、链接悬停一律中性色。
 *   - 悬停和选中只改线色、字色、透明度，不动 transform、不加底色。
 *   - 连接方式的显隐与选中态全部跟 <html data-guide-route> 走（head 里的内联脚本首帧前就定好），不跟 :checked 走——首帧就是对的；
 *   - 首屏和清单里随方式变化的内容叠在同一格里（.g-swap），高度取最长那条，切换只淡入淡出，页面不跳。
 *
 * 舞台（gt-）归 B，BIOS 分步界面（gb-）归 E；这里只给它们的挂载点预留尺寸和间距。
 */

/* 本页标题补字：站点标题字子集是按全站已有标题裁的，本页新标题的字大多不在里面；不改三站共用的那份，
   缺的字逐字回退到这份补字（由 NotoSerifSC-VF 按字重 500 实例化后只裁本页用到的字） */
@font-face { font-family: "MythosX Display Guide"; font-style: normal; font-weight: 500; font-display: swap; src: url("fonts/guide-display-500.woff") format("woff"); }

/* 页面级令牌 ------------------------------------------------------------ */
/* 锚点跳转的偏移要同时让开站点顶栏和教程条，否则 #bios 和 E 的深链跳过去标题会压在教程条底下。
   mx.css 只算了站点顶栏；这里用 html 属性选择器提高优先级覆盖它：第一章的 html 带 data-guide-route（连接方式状态），
   没有连接方式的章节（第一次使用）带 data-guide-page，两者只是为了命中这条规则，别的页面不受影响 */
html[data-guide-route], html[data-guide-page] {
  --g-bar-h: 56px;
  scroll-padding-top: calc(var(--bar-h) + var(--g-bar-h) + 24px);
}
/* 控件规范 v2 的线色三档：细线（分隔、默认边）· 悬停线 · 选中线（中性、清楚，不用暖金）；过渡只动颜色和透明度 */
.guide-page {
  --display: "MythosX Display", "MythosX Display Guide", "Noto Serif SC", "Songti SC", "STSong", serif;
  --g-line: rgba(240, 238, 233, .09);
  --g-line-hover: rgba(240, 238, 233, .2);
  --g-line-on: rgba(240, 238, 233, .55);
  --g-ring: rgba(232, 196, 147, .8);
  --g-fade: color .18s var(--ease), border-color .18s var(--ease), opacity .18s var(--ease);
}
/* 键盘焦点环（规范 v2）：只在 :focus-visible，细一点、离元素 3px；只管正文，不改外壳顶栏、页脚 */
.g :focus-visible { outline: 1.5px solid var(--g-ring); outline-offset: 3px; }
/* 正文默认 text-wrap: pretty：浏览器排最后几行时避开「末行只剩一两个字」的孤字（11-11 Owner：孤字也算不对齐）。
   放在教程正文的段落、列表项、定义、图注上，三章共用；标题各自用 balance（在各自的规则里），不受这条影响 */
.g p, .g li, .g dd, .g dt, .g figcaption { text-wrap: pretty; }
/* 窄屏目录面板打开时锁住页面滚动；不借用外壳的 is-locked，外壳菜单开合时会把它清掉 */
html.g-lock { overflow: hidden; }

/* 按连接方式显隐（架构 §4.1 契约，B、E 也可以直接用 data-route-only）。
   :not(.g-swap) > 把叠放容器的直接子元素排除在外：它们不走 display:none，见下面的叠放变体 */
html[data-guide-route="x520-direct"] :not(.g-swap) > [data-route-only]:not([data-route-only~="x520-direct"]),
html[data-guide-route="x520-switch"] :not(.g-swap) > [data-route-only]:not([data-route-only~="x520-switch"]),
html[data-guide-route="x520-remote"] :not(.g-swap) > [data-route-only]:not([data-route-only~="x520-remote"]),
html[data-guide-route="fpga"] :not(.g-swap) > [data-route-only]:not([data-route-only~="fpga"]) { display: none; }

/* 叠放变体：.g-swap 的直接子元素占同一格，格高取最长的那条；不是当前方式的那几条只「看不见但占位」，
   切换时只有透明度在变，周围的内容一个像素都不动。visibility:hidden 同时把它们移出读屏和 Tab 顺序。
   这里绝不能改 display：早先写成 display:block，隐藏的接法瓦片组从两列网格塌成上下两块（格高 98）、
   FPGA 那行从横排变成竖排（格高 70），切换方式时首屏跳 28px。每个子元素保持自己的 display，格高才稳定 */
.g-swap { display: grid; }
.g-swap > * { grid-area: 1 / 1; min-width: 0; transition: opacity .4s var(--ease) .08s, visibility 0s linear 0s; }
html[data-guide-route="x520-direct"] .g-swap > [data-route-only]:not([data-route-only~="x520-direct"]),
html[data-guide-route="x520-switch"] .g-swap > [data-route-only]:not([data-route-only~="x520-switch"]),
html[data-guide-route="x520-remote"] .g-swap > [data-route-only]:not([data-route-only~="x520-remote"]),
html[data-guide-route="fpga"] .g-swap > [data-route-only]:not([data-route-only~="fpga"]) {
  visibility: hidden;
  opacity: 0;
  transition: opacity .14s var(--ease), visibility 0s linear .14s;
}

/* 正文里的链接：中性下划线，悬停时字和线各提一级（不转暖金）。链接文字都很短，整条不折行
   （实测「查看兼容 / 主板名单」「设 / 置 BIOS」被拦腰折断）；.g-nw 把链接和前后的「」括号绑在一起 */
.g-link { color: var(--text); white-space: nowrap; text-decoration: underline 1px rgba(var(--ink-rgb), .3); text-underline-offset: 4px; transition: color .18s var(--ease), text-decoration-color .18s var(--ease); }
.g-nw { white-space: nowrap; }
.g-link:hover { color: #fff; text-decoration-color: var(--g-line-on); }
.g-link i { display: inline-block; margin-left: 3px; font-style: normal; font-size: .86em; color: var(--text-3); transition: color .18s var(--ease); }
.g-link:hover i { color: var(--text-2); }

/* 页面骨架 --------------------------------------------------------------- */
/* 站点顶栏是 fixed，正文从它下面开始；教程条是 main 的第一个子元素，自然位置就是吸顶位置 */
.g { padding-top: var(--bar-h); }

/* 教程条 ----------------------------------------------------------------- */
/* 高度固定；吸顶后（与站点顶栏转实底同一个阈值）只加实色底和底线。z-index 低于站点顶栏，外壳菜单能盖住它。
   这里不许加 transform / filter：窄屏目录面板是 position:fixed，祖先一旦有 transform 就会被困在教程条里 */
.g-bar {
  position: sticky;
  top: var(--bar-h);
  z-index: 40;
  height: var(--g-bar-h);
  border-bottom: 1px solid transparent;
  transition: background-color .3s var(--ease), border-color .3s var(--ease);
}
.g-bar.is-stuck, .g-bar.is-toc { background: var(--bg); border-color: var(--line); }
.g-bar-in { height: 100%; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 24px; }

/* 左侧：宽屏是「教程名 / 当前章」，窄屏是「当前章 · 当前小节」。几种写法叠在同一格里交叉淡入，宽度变化不推动别的东西。
   这一格撑满教程条的高度（align-self: stretch）：章节菜单面板以它为定位基准，top: 100% 正好落在教程条下沿，不用写死像素 */
.g-bar-id { position: relative; justify-self: start; align-self: stretch; display: grid; align-items: center; min-width: 0; max-width: 100%; }
/* 不再 overflow: hidden：章名现在是按钮，键盘焦点环画在行框外面，裁掉就看不见了。几种写法都量过，在 360–1920 都放得下，不需要省略号兜底 */
.g-id {
  grid-area: 1 / 1;
  font-size: 13px;
  line-height: 20px;
  color: var(--text-3);
  white-space: nowrap;
  transition: opacity .3s var(--ease), visibility 0s;
}
.g-id i { margin: 0 8px; font-style: normal; color: rgba(var(--ink-rgb), .22); }
.g-id b { font-weight: 500; color: var(--text-2); }
.g-id-past { display: none; }
/* 首屏标题还在视口里时，「MythosX Anvil 使用教程 /」和眉题写成两遍，先不显示，标题滚到教程条后面再出现（同一屏一个词只写一次）。
   章节菜单按钮是导航，不算重复，一直显示（主线 11-10 定）：标题在视口里时它贴版心左边线，和眉题、H1 同一列 */
.g-js .g-bar:not(.is-past-title) .g-id-prefix { display: none; }

/* 章节切换菜单：「当前章」是一个按钮（写法同 b：字重 500、次级字色，后面一个细箭头），点开教程条下沿的面板，
   面板里按章节顺序列出各章，当前章字提亮、左缘一条 2px 暖金指示线。宽屏的 .g-id-wide 和窄屏的 .g-id-past 各有一个按钮，共用一张面板。
   面板是细线框加页面底色，没有阴影和渐变（规范 v2）；左边对齐版心左边线，和下面的节头线在同一条线上 */
.g-ch-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 20px;
  padding: 0;
  border: 0;
  border-radius: 4px;
  background: none;
  font: inherit;
  font-weight: 500;
  line-height: 20px;
  color: var(--text-2);
  cursor: pointer;
  transition: color .18s var(--ease);
}
.g-ch-btn:hover, .g-ch-btn[aria-expanded="true"] { color: var(--text); }
.g-ch-btn svg { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; transition: transform .25s var(--ease); }
.g-ch-btn[aria-expanded="true"] svg { transform: rotate(180deg); }
.g-ch {
  position: absolute;
  top: calc(100% + 1px);
  left: 0;
  z-index: 41;
  min-width: 220px;
  padding: 14px 0 8px;
  border: 1px solid var(--g-line-hover);
  border-top: 0;
  border-radius: 0 0 10px 10px;
  background: var(--bg);
  opacity: 0;
  visibility: hidden;
  transition: opacity .18s var(--ease), visibility 0s linear .18s;
}
.g-bar.is-ch .g-ch { opacity: 1; visibility: visible; transition: opacity .18s var(--ease), visibility 0s; }
.g-ch-title { padding: 0 18px 8px; font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
.g-ch-list a {
  position: relative;
  display: flex;
  align-items: center;
  height: 44px;
  padding: 0 18px;
  font-size: 14px;
  color: var(--text-2);
  white-space: nowrap;
  transition: color .18s var(--ease);
}
.g-ch-list a:hover, .g-ch-list a[aria-current] { color: var(--text); }
.g-ch-list a[aria-current] { font-weight: 500; }
.g-ch-list a::before { content: ""; position: absolute; left: 0; top: 13px; bottom: 13px; width: 2px; background: var(--accent); opacity: 0; transition: opacity .18s var(--ease); }
.g-ch-list a[aria-current]::before { opacity: 1; }
/* 焦点环画在面板里：面板没有 overflow: hidden，不会被裁 */
.g-ch-list a:focus-visible { outline-offset: -4px; }

/* 中间：五个小节。当前小节文字提亮，下沿一条 2px 暖金指示线，贴着教程条下沿 */
.g-toc { justify-self: center; }
.g-toc-sheet { display: contents; }
.g-toc-title, .g-toc-val { display: none; }
.g-toc-list { display: flex; align-items: center; }
.g-toc-list a {
  position: relative;
  display: inline-flex;
  align-items: center;
  height: var(--g-bar-h);
  padding: 0 14px;
  font-size: 14px;
  color: var(--text-2);
  white-space: nowrap;
  transition: color .18s var(--ease);
}
.g-toc-list a:hover, .g-toc-list a[aria-current] { color: var(--text); }
.g-toc-list a::after {
  content: "";
  position: absolute;
  left: 14px;
  right: 14px;
  bottom: -1px;
  height: 2px;
  background: var(--accent);
  opacity: 0;
  transition: opacity .18s var(--ease);
}
.g-toc-list a[aria-current]::after { opacity: 1; }

/* 右侧：当前方式。写成「X520 直连 ⌃」，不带圆点（规范 v2 第五节）。选择器还在视口里时它和选择器写的是同一件事，先隐去；
   滚过选择器后淡入，点它回到首屏 */
.g-bar-route {
  justify-self: end;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 36px;
  padding: 0 2px 0 10px;
  font-size: 13px;
  color: var(--text-2);
  white-space: nowrap;
  transition: color .18s var(--ease), opacity .3s var(--ease), visibility 0s;
}
.g-bar-route:hover { color: var(--text); }
/* 四份文字叠放，格宽取最长那条；文字靠右，字和箭头始终挨在一起（短的那条不会和箭头之间空出一截） */
.g-bar-route .g-swap { justify-items: end; }
.g-bar-route-chev { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
.g-js .g-bar:not(.is-past-picker) .g-bar-route { opacity: 0; visibility: hidden; transition: opacity .2s var(--ease), visibility 0s linear .2s; }
.g-toc-btn { display: none; }

/* 页头（没有首屏舞台的章节，例如「第一次使用」）：眉题、H1、导语一列，宽度同首屏文案块；标题比首屏的小一号，下面直接接第一节的节头线 */
.g-head { padding: clamp(28px, 3.6vw, 52px) 0 clamp(20px, 2.6vw, 36px); }
.g-head .g-title { font-size: clamp(40px, 4.2vw, 64px); }

/* 首屏 ------------------------------------------------------------------- */
/* 所有零件都是同一个网格的直接子元素：宽屏左文右图（舞台跨满左侧各行、上下各留一行 1fr 让文案垂直居中），
   窄屏一列，顺序是 标题导语 → 选择器 → 舞台 → 方式说明。不铺底光（规范 v2 去掉渐变底色；舞台自己的地面暗角归 B） */
.g-hero { position: relative; padding: clamp(28px, 3.6vw, 52px) 0 clamp(64px, 7vw, 104px); }
.g-hero-in {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-areas: "copy" "picker" "stage" "desc";
  column-gap: clamp(40px, 4vw, 72px);
}
.g-hero-copy { grid-area: copy; }
.g-eyebrow { font: 500 13px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
.g-title { margin: 18px 0 20px; font: 500 clamp(48px, 5vw, 80px) / 1.06 var(--display); letter-spacing: -.01em; color: var(--text); }
.g-lead { max-width: 34em; font-size: clamp(16px, calc(12px + .3vw), 18px); line-height: 1.85; color: var(--text-2); text-wrap: pretty; }

/* 舞台挂载点：只预留尺寸，画面归 B。按舞台自身宽度切比例（外层是查询容器），不按视口切 */
.g-hero-stage { grid-area: stage; align-self: center; min-width: 0; margin-top: 36px; container-type: inline-size; }
.gt-mount { position: relative; width: 100%; aspect-ratio: 16 / 10; }
@container (width < 560px) { .gt-mount { aspect-ratio: 4 / 5; } }
/* 无脚本兜底：四种方式的文字说明铺在舞台位置上（4/5 比例的窄舞台里四段放不下时可以在挂载点内滚动，不撑破舞台尺寸） */
.g-noscript { position: absolute; inset: 0; display: grid; align-content: safe center; gap: 12px; overflow-y: auto; padding: clamp(20px, 3vw, 40px); border: 1px solid var(--g-line); border-radius: 10px; font-size: 14px; line-height: 1.7; color: var(--text-2); }

/* 方式说明：左侧一条细线把它挂在选择器下面，读起来是「你选的这种是这样连的」；和提示块是同一种写法。
   竖线画在每一段自己身上、段落只有文字那么高（align-self: start），不画在叠放容器上——容器按最长的那段（跨房间 5 行）占位，
   选「直连」时文字两行、线也只有两行高（Owner 11-10：「文字明明没那么高，左边的线还是很高」）。
   容器高度仍取最长那段：切换方式时下面的内容一个像素都不动（规矩：切换不许跳），代价是短说明下面留一段空白 */
.g-hero-desc { grid-area: desc; margin-top: 28px; font-size: 15px; line-height: 1.8; color: var(--text-2); }
.g-hero-desc > p { align-self: start; padding-left: 18px; border-left: 1px solid var(--line-2); text-wrap: pretty; }

@media (min-width: 1024px) {
  .g-hero-in {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    grid-template-rows: 1fr auto auto auto 1fr;
    grid-template-areas: ". stage" "copy stage" "picker stage" "desc stage" ". stage";
  }
  .g-hero-stage { margin-top: 0; }
}
/* 1200 起文案约 5 栏、舞台约 7 栏，舞台是视觉中心 */
@media (min-width: 1200px) {
  .g-hero-in { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
}

/* 选择器：选项瓦片（规范 v2 第一节） ------------------------------------- */
/* 没有外框容器；两组上下排，组标签在瓦片上方。选择器是查询容器：太窄时瓦片里的字收小一号 */
.g-picker { grid-area: picker; display: grid; gap: 22px; margin-top: clamp(28px, 3vw, 40px); container-type: inline-size; }
.g-pick-group { display: grid; gap: 10px; min-width: 0; }
.g-pick-label { font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
/* 同组瓦片等宽（两列 1fr）、等高（网格默认拉伸），左右边与组标签、方式说明对齐 */
.g-tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }

/* 瓦片三态都没有底色、没有阴影：默认细线 + 次级字色；悬停换悬停线、字提亮；选中换选中线、字重 500、顶边内侧一条暖金指示线。
   --tile-on 是 0 / 1 开关：选中规则只写一遍，标题字重、产品图透明度、指示线都从它算出来 */
.g-tile {
  --tile-on: 0;
  position: relative;
  display: flex;
  min-width: 0;
  border: 1px solid var(--g-line);
  border-radius: 10px;
  color: var(--text-2);
  cursor: pointer;
  transition: var(--g-fade);
}
.g-tile::before {
  content: "";
  position: absolute;
  top: 0;
  left: 14px;
  right: 14px;
  height: 2px;
  background: var(--accent);
  opacity: var(--tile-on);
  transition: opacity .18s var(--ease);
}
.g-tile:hover { border-color: var(--g-line-hover); color: var(--text); }
/* 原生单选框透明地铺满整块瓦片：点击区域就是整块，方向键在同组之间切换（原生行为），读屏照常读到 */
.g-tile input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
.g-tile:has(input:focus-visible) { outline: 1.5px solid var(--g-ring); outline-offset: 3px; }
.g-tile-title { font-size: 15px; font-weight: calc(400 + 100 * var(--tile-on)); line-height: 1.4; }
.g-tile-note { font: 400 11px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }

/* 选中态（跟 html 属性走，首帧就对）。FPGA 时接法瓦片是隐藏的，按记住的 X520 接法摆好，切回 X520 时不再闪一下；
   记忆值没有（首次就是 FPGA）时默认摆在「直连」 */
html[data-guide-route^="x520"] .g-tile[data-opt="x520"],
html[data-guide-route="fpga"] .g-tile[data-opt="fpga"],
html[data-guide-route="x520-direct"] .g-tile[data-opt="direct"],
html[data-guide-route="x520-switch"] .g-tile[data-opt="switch"],
html[data-guide-route="x520-remote"] .g-tile[data-opt="remote"],
html[data-guide-route="fpga"] [data-seg="wiring"]:not([data-last-wiring="switch"]):not([data-last-wiring="remote"]) .g-tile[data-opt="direct"],
html[data-guide-route="fpga"] [data-seg="wiring"][data-last-wiring="switch"] .g-tile[data-opt="switch"],
html[data-guide-route="fpga"] [data-seg="wiring"][data-last-wiring="remote"] .g-tile[data-opt="remote"] {
  --tile-on: 1;
  border-color: var(--g-line-on);
  color: var(--text);
}

/* 通讯卡瓦片：上方产品图（R 出透明底 webp，到位前按 2:1 留好尺寸，空着不塌），下方标题和一行副标。
   未选中的图压到 .45，选中 1；不用滤镜、不用发光 */
.g-tile-media { flex-direction: column; padding: 12px 14px 14px; }
/* 产品图挂成背景图：图还没到（404）时这一块只是空的 2:1 槽位，不会出现坏图图标；到了以后按比例缩放、居中，不裁切 */
.g-tile-thumb { display: block; aspect-ratio: 2 / 1; margin-bottom: 12px; background: center / contain no-repeat; opacity: calc(.45 + .55 * var(--tile-on)); transition: opacity .18s var(--ease); }
.g-tile-thumb[data-thumb="x520"] { background-image: url("topology/thumb-x520.webp?v=20261110-guide-r2"); }
.g-tile-thumb[data-thumb="fpga"] { background-image: url("topology/thumb-fpga.webp?v=20261110-guide-r2"); }
.g-tile-sub { margin-top: 4px; font-size: 12.5px; line-height: 1.5; color: var(--text-3); }

/* 接法瓦片（X520 三种接法）：三列等宽，瓦片里竖排——线路示意在上，标题在下，小标（「推荐」「调试机放别的房间」）在标题下一行。
   三列各约 140–230px，横排放不下「跨房间 + 调试机放别的房间」，竖排时三块等高（网格拉伸）、内容顶对齐 */
.g-tiles-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.g-tile-line { flex-direction: column; align-items: flex-start; gap: 10px; padding: 14px; }
.g-tile-line .g-tile-title { display: flex; flex-direction: column; gap: 3px; }
.g-wire { flex: none; width: 44px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
/* FPGA 的接法只有一种：不是选项，是一块不可点的说明块——和瓦片同样的细线外框、没有暖金指示线（它不是选项）。
   它和瓦片组叠在同一格里并撑满这一格（网格默认拉伸）：宽屏三列时等于那一行瓦片的高，窄屏三行时等于三行的总高，切换方式只做透明度交叉淡入淡出。
   示意放大 1.5 倍（线宽用 non-scaling-stroke 保持 1.25px），「DATA 口接调试机」在示意下方，整体上下左右居中。
   早先只放一行文字顶在格子上沿，窄屏下面空出约 110px，违反「槽位不留空」 */
.g-tile-static { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; margin: 0; padding: 12px 14px; border: 1px solid var(--g-line); border-radius: 10px; color: var(--text); text-align: center; }
.g-tile-static .g-wire { width: 66px; height: 24px; color: var(--text-2); }
.g-tile-static .g-wire * { vector-effect: non-scaling-stroke; }

@container (width < 400px) {
  .g-tile-media { padding: 10px 12px 12px; }
  .g-tile-title { font-size: 14px; }
  .g-tile-sub { font-size: 12px; }
}
/* 选择器窄于 440px（手机、1200 宽的左栏）：三列每块不足 140px，小标会折成两行；改成三行，每块横排——示意、标题、小标一行排开。
   一列网格里三块同宽，左右边和组标签、通讯卡瓦片对齐 */
@container (width < 440px) {
  .g-tiles-3 { grid-template-columns: minmax(0, 1fr); }
  .g-tile-line { flex-direction: row; align-items: center; gap: 12px; padding: 12px 14px; }
  .g-tile-line .g-tile-title { flex-direction: row; align-items: baseline; gap: 8px; }
}

/* 节 --------------------------------------------------------------------- */
/* 节与节之间：一条与版心同宽的细线 + 足够的留白；线画在节头上，所以和下面的内容左右两边严格对齐 */
/* scroll-margin-top 抵掉节的上内边距：点小节导航或深链跳过来时，节头那条线落在教程条下面 24px（scroll-padding 的余量），
   而不是再空出一截内边距 */
.g-sec { padding: clamp(24px, 3vw, 40px) 0 clamp(72px, 8vw, 120px); scroll-margin-top: calc(-1 * clamp(24px, 3vw, 40px)); }
.g-sec-head { padding-top: clamp(28px, 3vw, 40px); margin-bottom: clamp(36px, 4vw, 56px); border-top: 1px solid var(--line); }
.g-sec-num { font: 500 13px/1 var(--mono); letter-spacing: .06em; color: var(--text-3); }
.g-sec-title { margin: 18px 0 0; font: 500 clamp(32px, 3.4vw, 48px) / 1.2 var(--display); letter-spacing: .005em; color: var(--text); }
/* 导语最长一句约 45 字：宽屏一行放下，不在「分步界 / 面」这种词中间折行 */
.g-sec-lead { max-width: 48em; margin-top: 14px; font-size: 17px; line-height: 1.8; color: var(--text-2); }

/* 准备硬件：整行清单。四行共用同一套列线——左栏定宽（编号圈 · 图标槽 · 名称 · 小标），右栏是内容（一句话 · 要点）。
   不用等高卡片：③④只有一句话，等高卡片下半截会空出约 300px；整行清单的行高随内容走，槽位不留空。
   行与行之间只用细线分隔、没有卡片框和底色；悬停/聚焦只把这一行上下两条线换成悬停线、编号提亮（规范 v2：只改线色和字色） */
.g-parts { --g-part-left: 288px; }
.g-part {
  position: relative;
  display: grid;
  grid-template-columns: var(--g-part-left) minmax(0, 1fr);
  column-gap: clamp(32px, 4vw, 64px);
  padding: 30px 0;
}
/* 上线画在本行顶边；下线画在本行底边往下 1px，正好盖住下一行的上线（z-index 1），悬停时上下两条一起换色。
   默认只有最后一行的下线可见，其余透明，看起来就是一条线一行 */
.g-part::before, .g-part::after { content: ""; position: absolute; left: 0; right: 0; height: 1px; transition: background-color .18s var(--ease); }
.g-part::before { top: 0; background: var(--g-line); }
.g-part::after { bottom: -1px; z-index: 1; background: transparent; }
.g-part:last-child::after { background: var(--g-line); }
.g-part:hover::before, .g-part:hover::after, .g-part:focus-within::before, .g-part:focus-within::after { background: var(--g-line-hover); }

/* 左栏：一行排开，固定 48px 高（图标槽的高度），名称在这一行里垂直居中 */
.g-part-head { display: flex; align-items: center; gap: 14px; min-width: 0; height: 48px; }
/* 编号圈：与舞台标注 ①–④ 对应；只有一圈细线，没有底色 */
.g-num { flex: none; display: inline-grid; place-items: center; width: 24px; height: 24px; border: 1px solid var(--g-line-hover); border-radius: 50%; font: 500 12px/1 var(--mono); color: var(--text-2); transition: var(--g-fade); }
.g-part:hover .g-num, .g-part:focus-within .g-num { border-color: var(--g-line-on); color: var(--text); }
/* 图标槽：尺寸固定，B 的精灵没到时是空的，但槽位照样占着，名称不会左移、行不会塌 */
.g-part-icon { flex: none; display: grid; width: 48px; height: 48px; color: var(--text-2); }
.g-icon { width: 48px; height: 48px; }
.g-part-name { display: flex; align-items: baseline; gap: 10px; min-width: 0; font: 500 24px/1.3 var(--display); color: var(--text); white-space: nowrap; }
.g-part-tag { font: 500 12px/1 var(--mono); letter-spacing: .04em; color: var(--text-3); }

/* 右栏：上内边距 10px 让正文首行（16px × 1.75 = 28px 行高）和左栏 48px 高的名称行垂直居中对齐 */
.g-part-body { min-width: 0; padding-top: 10px; container-type: inline-size; }
.g-part-say { max-width: 46em; font-size: 16px; line-height: 1.75; color: var(--text); }
.g-pts { display: grid; gap: 8px; margin-top: 12px; }
.g-pts li { position: relative; padding-left: 16px; font-size: 15px; line-height: 1.75; color: var(--text-2); }
.g-pts li::before { content: ""; position: absolute; left: 0; top: .9em; width: 7px; height: 1px; background: var(--text-3); }

/* ② 通讯卡的两种卡：并排两小栏，都不隐藏（一眼看出是二选一）。网格默认拉伸，两栏顶边、底边天然对齐；
   当前方式用的那栏正常亮度、顶边一条 2px 暖金指示线（盖在细线上，不占高度），另一栏压暗——切换只改颜色和透明度 */
.g-choices { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 40px; margin-top: 20px; }
.g-choice { position: relative; min-width: 0; padding-top: 14px; border-top: 1px solid var(--g-line); }
.g-choice::before { content: ""; position: absolute; top: -1px; left: 0; right: 0; height: 2px; background: var(--accent); opacity: 0; transition: opacity .18s var(--ease); }
.g-choice-name { font-size: 15px; font-weight: 500; color: var(--text-3); transition: color .18s var(--ease); }
.g-choice .g-pts { margin-top: 10px; }
.g-choice .g-pts li { color: var(--text-3); transition: color .18s var(--ease); }
html[data-guide-route^="x520"] .g-choice[data-card="x520"]::before,
html[data-guide-route="fpga"] .g-choice[data-card="fpga"]::before { opacity: 1; }
html[data-guide-route^="x520"] .g-choice[data-card="x520"] .g-choice-name,
html[data-guide-route="fpga"] .g-choice[data-card="fpga"] .g-choice-name { color: var(--text); }
html[data-guide-route^="x520"] .g-choice[data-card="x520"] .g-pts li,
html[data-guide-route="fpga"] .g-choice[data-card="fpga"] .g-pts li { color: var(--text-2); }
/* 兜底：右栏窄到两小栏各不足约 180px 时（641–700 宽这一段，左栏仍在左侧）先叠放，免得卡名折行；
   768 宽右栏约 428px，两栏各 194px，仍并排。≤640 的叠放见窄屏断点 */
@container (width < 400px) { .g-choices { grid-template-columns: minmax(0, 1fr); } }

/* 插卡接线：竖排步骤，编号圈之间一条细竖线串起来；编号圈只有一圈细线，没有底色和内高光 */
.g-steps { max-width: 820px; }
.g-step { position: relative; display: grid; grid-template-columns: 40px minmax(0, 1fr); column-gap: 22px; padding-bottom: 34px; }
.g-step:last-child { padding-bottom: 0; }
.g-step::before { content: ""; position: absolute; left: 19.5px; top: 48px; bottom: 8px; width: 1px; background: var(--g-line-hover); }
.g-step:last-child::before { display: none; }
.g-step-num { display: grid; place-items: center; width: 40px; height: 40px; border: 1px solid var(--g-line-hover); border-radius: 50%; font: 500 14px/1 var(--mono); color: var(--text); }
.g-step p { padding-top: 6px; font-size: 18px; line-height: 1.6; color: var(--text); }

/* 设置 BIOS：四项摘要是一行四栏的规格条（规范 v2 第四节）——上下各一条细线、栏间一条竖细线，没有底色和圆角框。
   每栏三层：名称 · 补充说明 · 要求（等宽、次级字色，不用暖金）；要求压在栏底，四栏的「关闭 / 开启」落在同一条水平线上 */
.g-bios-sum { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-top: 1px solid var(--g-line); border-bottom: 1px solid var(--g-line); }
.g-bios-sum li { display: flex; flex-direction: column; min-width: 0; padding: 20px 24px 22px; }
.g-bios-sum li:first-child { padding-left: 0; }
.g-bios-sum li + li { border-left: 1px solid var(--g-line); }
.g-bios-name { font-size: 17px; font-weight: 500; line-height: 1.4; color: var(--text); }
.g-bios-note { margin-top: 6px; font-size: 13px; line-height: 1.65; color: var(--text-3); text-wrap: pretty; }
.g-bios-req { margin-top: auto; padding-top: 14px; font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-2); }
/* 两栏的规格条（第一次使用 · 启动顺序）：同一套线和层级，只是两栏；≤1023 的两栏规则对它同样成立 */
.g-bios-sum-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* E 的分步界面挂载点：全宽，内容自己撑高；这里只管和上下的间距，不占位 */
.gb-mount { margin-top: 24px; }
/* 空挂载点（E 的组件还没交付、或脚本没跑）不占高度：margin 也收掉，节底的留白不会多出一截 */
.gb-mount:empty { margin-top: 0; }

/* F 的操作演示动画挂载点（第二章 04、07–11）：全宽（样式里自己收到 820px），内容自己撑高；脚本没跑时不占高度。
   分步列表里（.g-step 内）和总览处（.g-stp-body 直接子）都可能出现，间距都按「上一段内容下面空一截」来 */
.gf-mount { margin-top: 24px; }
.gf-mount:empty { margin-top: 0; }
.g-stp-body > .gf-mount:first-child { margin-top: 0; }
/* 演示后面紧跟分步列表（04、08、09）：隔开一截，不然分步的编号圈贴着控制条（Owner 截图里按钮下面「多出半个圆」就是它） */
.g-stp-body > .gf-mount + .g-steps { margin-top: clamp(32px, 3.4vw, 44px); }
.g-step .gf-mount { margin-top: 14px; }

/* 8-3 身份呈现子节（第二章 08 第 4 步正文下方）：节头 + 引子两句 + 八面（a–h）。
   不是一个新板块，是这一步正文的展开，所以左边不另起缩进，靠一条细线和标题层级和上面的分步分开 */
.g-sub { margin-top: clamp(28px, 3vw, 40px); padding-top: clamp(24px, 2.6vw, 34px); border-top: 1px solid var(--g-line); }
.g-sub-num { font: 500 13px/1 var(--mono); letter-spacing: .06em; color: var(--text-3); }
.g-sub-title { margin-top: 12px; }
.g-sub-say { max-width: 48em; margin-top: 12px; font-size: 15px; line-height: 1.75; color: var(--text-2); text-wrap: pretty; }
.g-sub-say + .g-sub-say { margin-top: 6px; }
/* 一面：字母编号 + 面名，下面是「是什么 / 怎么填 / 合法 / 示例」或短段落；面与面之间一条细线 */
.g-face { margin-top: clamp(26px, 2.8vw, 36px); padding-top: clamp(22px, 2.4vw, 30px); border-top: 1px solid var(--g-line); }
.g-sub-head + .g-face { border-top: 0; padding-top: clamp(10px, 1.4vw, 18px); }
.g-face-title { display: flex; align-items: baseline; gap: 12px; margin: 0; font-size: 18px; font-weight: 500; line-height: 1.4; color: var(--text); }
/* 字母编号：等宽小字、附属色，不加方框和底色（规范 v2） */
.g-face-key { flex: none; font: 500 13px/1 var(--mono); color: var(--text-3); text-transform: uppercase; }
/* 是什么 / 怎么填 / 合法 / 示例：左边等宽小标题，右边正文；窄屏上下排 */
.g-face-dl { margin: 16px 0 0; }
.g-face-dl > div { display: grid; grid-template-columns: 72px minmax(0, 1fr); gap: 4px 20px; padding: 7px 0; }
.g-face-dl > div + div { border-top: 1px solid var(--g-line); }
.g-face-dl dt { font: 500 12px/1.7 var(--mono); letter-spacing: .04em; color: var(--text-3); }
.g-face-dl dd { margin: 0; font-size: 15px; line-height: 1.75; color: var(--text-2); text-wrap: pretty; }
.g-face-dl .is-ex { align-items: start; }
.g-face-say { margin: 12px 0 0; font-size: 15px; line-height: 1.8; color: var(--text-2); text-wrap: pretty; }
.g-face-say b { font-weight: 500; color: var(--text); }
/* 面里的分步（EDID 两次采集）：和插卡接线的竖排步骤同一种意思，但这里短，用简单的编号列表 */
.g-face-steps { margin: 10px 0 0; padding-left: 0; list-style: none; counter-reset: face; }
.g-face-steps li { position: relative; padding-left: 28px; margin-top: 8px; font-size: 15px; line-height: 1.75; color: var(--text-2); text-wrap: pretty; }
.g-face-steps li::before { counter-increment: face; content: counter(face); position: absolute; left: 0; top: .15em; font: 500 12px/1.5 var(--mono); color: var(--text-3); }
/* 示例小表：真实值 / 呈现值两（或三）列，等宽字；上下各一条细线，没有底色和竖线框。窄屏每行拆成上下排，格子前用 data-l 标列名 */
.g-face-ex { width: 100%; border-collapse: collapse; margin-top: 2px; font: 400 12.5px/1.5 var(--mono); color: var(--text); }
.g-face-ex th, .g-face-ex td { padding: 6px 16px 6px 0; text-align: left; vertical-align: baseline; overflow-wrap: anywhere; }
.g-face-ex thead th { font-weight: 500; color: var(--text-3); letter-spacing: .04em; border-bottom: 1px solid var(--g-line); }
.g-face-ex tbody th { font-weight: 400; color: var(--text-3); white-space: nowrap; }
.g-face-ex tbody td { color: var(--text-2); }
.g-face-ex tbody td:last-child { color: var(--text); }
.g-face-ex tbody tr + tr th, .g-face-ex tbody tr + tr td { border-top: 1px solid var(--g-line); }
@media (max-width: 560px) {
  .g-face-dl > div { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  /* 示例表在窄屏拆成每格一行：列名（data-l）写在前面，一列堆叠 */
  .g-face-ex, .g-face-ex thead, .g-face-ex tbody, .g-face-ex tr, .g-face-ex th, .g-face-ex td { display: block; }
  .g-face-ex thead { display: none; }
  .g-face-ex tbody tr { padding: 8px 0; }
  .g-face-ex tbody tr + tr { border-top: 1px solid var(--g-line); }
  .g-face-ex tbody th { padding: 0 0 4px; }
  .g-face-ex tbody td { padding: 2px 0; }
  .g-face-ex tbody td[data-l]::before { content: attr(data-l) "　"; color: var(--text-3); }
}

/* 没有首屏舞台的章节（第一次使用）节与节之间的留白收窄：这一章每节只有一两句话加几个链接，用第一章那套为长节准备的间距会显得空；
   只有节头的节（制作启动 U 盘，等 Owner 补内容）节头下面不再留节头的下边距 */
html[data-guide-page] .g-sec { padding-bottom: clamp(56px, 6vw, 88px); }
html[data-guide-page] .g-sec-head:last-child { margin-bottom: 0; }

/* 第一次使用 01–03 三步合成一个网格（主线 11-10：每步只有一两句话加一个按钮，各占一整节太空太长）：宽屏三列一排、窄屏一列。
   每块：编号 · 步骤名（比节标题小一档的标题字）· 一句话 · 按钮；三块等高（网格拉伸），按钮 margin-top:auto 压到块底，三块的按钮底边齐。
   块之间只有发丝细线：每块一条顶线（合起来就是这一节的节线）、第二、三块一条左线、网格一条底线收尾；没有底色和阴影 */
.g-grid3 { --g-sg-gap: clamp(24px, 2.6vw, 40px); display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); border-bottom: 1px solid var(--g-line); }
.g-sg { display: flex; flex-direction: column; min-width: 0; padding: clamp(28px, 3vw, 40px) var(--g-sg-gap) clamp(32px, 3.4vw, 44px); border-top: 1px solid var(--g-line); }
.g-sg:first-child { padding-left: 0; }
.g-sg:last-child { padding-right: 0; }
.g-sg + .g-sg { border-left: 1px solid var(--g-line); }
.g-sg-title { margin-top: 14px; font: 500 clamp(24px, 2.2vw, 30px) / 1.3 var(--display); letter-spacing: .005em; color: var(--text); text-wrap: balance; }
.g-sg-say { margin-top: 12px; font-size: 16px; line-height: 1.75; color: var(--text-2); text-wrap: pretty; }
.g-sg .g-acts { margin-top: auto; padding-top: 26px; }

/* 第一次使用 · 阶段与步骤（第七轮，11 步按五个阶段分组）：
   阶段节头复用 .g-sec-head（编号范围 + 阶段名）；阶段里的每一步是 .g-stp——步骤编号（等宽小字）、h3 标题（比阶段名小一档，同 .g-sg-title）、一句话、正文。
   步与步之间一条细线；紧跟阶段节头的第一步不再画线（节头已经有线）。只有一步的阶段（06、11）直接用 .g-sec-head 当步骤头，不进这套 */
.g-stp { padding-top: clamp(28px, 3vw, 40px); border-top: 1px solid var(--g-line); }
.g-stp + .g-stp { margin-top: clamp(44px, 4.6vw, 64px); }
.g-sec-head + .g-stp { padding-top: 0; border-top: 0; }
.g-stp-title { margin-top: 14px; font: 500 clamp(24px, 2.2vw, 30px) / 1.3 var(--display); letter-spacing: .005em; color: var(--text); text-wrap: balance; }
.g-stp-say { max-width: 48em; margin-top: 12px; font-size: 16px; line-height: 1.75; color: var(--text-2); text-wrap: pretty; }
.g-stp-body { margin-top: 24px; }
.g-stp-head + .g-tip { margin-top: 18px; max-width: 48em; }

/* 第三章「使用指南」页头的两块路线入口（普通分析师 / 进阶分析师）：和首屏选项瓦片同一种写法——细线框、没有底色和阴影，两块等宽等高（网格拉伸），
   里面是标题字的路线名、一句定位、等宽小字的主题数；悬停或键盘焦点时边线提一级、顶边内侧一条 2px 暖金指示线（规范 v2 的「当前项」写法）。
   点击跳到对应的区（锚点），不是单选，所以没有常驻选中态。窄于 600px 时上下排 */
.g-routes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: clamp(28px, 3vw, 40px); }
.g-route {
  --tile-on: 0;
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;
  padding: 22px 24px 20px;
  border: 1px solid var(--g-line);
  border-radius: 10px;
  color: var(--text);
  transition: var(--g-fade);
}
.g-route::before { content: ""; position: absolute; top: 0; left: 14px; right: 14px; height: 2px; background: var(--accent); opacity: var(--tile-on); transition: opacity .18s var(--ease); }
.g-route:hover, .g-route:focus-visible { --tile-on: 1; border-color: var(--g-line-on); }
.g-route-name { font: 500 clamp(22px, 2vw, 28px) / 1.3 var(--display); letter-spacing: .005em; color: var(--text); }
.g-route-say { margin-top: 8px; font-size: 15px; line-height: 1.7; color: var(--text-2); text-wrap: pretty; }
.g-route-meta { margin-top: auto; padding-top: 18px; font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
@media (max-width: 599px) { .g-routes { grid-template-columns: minmax(0, 1fr); } }

/* 截图占位（Owner 11-10：「先留好占位的就行，内容我后面搞好再填充」）：16:10 的发丝细线图框，中间一行等宽小字「截图待补」，
   带 data-placeholder="screenshot" 方便以后搜；最宽 820px（和分步列表同宽），不铺满 1280 的版心。换成真截图时把这个 div 换成 <img>，宽高比不变 */
.g-shot { display: grid; place-items: center; width: 100%; max-width: 820px; aspect-ratio: 16 / 10; border: 1px solid var(--g-line); border-radius: 10px; font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
/* 分步列表里的图框：跟在这一步的一句话下面，列宽就是图宽 */
.g-step .g-shot { margin-top: 14px; }
.g-step .g-shot + p { margin-top: 0; }
/* 真截图（替换占位框时把 <div class="g-shot"> 换成 <img class="g-shot-img">，位置、间距、最大宽度都和占位框一致）：
   块级、宽 100%、最宽 820px、高度按图片自己的比例（不强制 16:10），同一条细线边框和 10px 圆角，没有阴影。
   带图注时外面包 <figure class="g-shot-fig">，<figcaption> 是 12px 次亮小字，图下 8px；figure 本身不加边距（和 img 一样占位） */
.g-shot-img { display: block; width: 100%; max-width: 820px; height: auto; border: 1px solid var(--g-line); border-radius: 10px; }
.g-shot-fig { margin: 0; max-width: 820px; }
.g-shot-fig figcaption { margin-top: 8px; font-size: 12px; line-height: 1.6; color: var(--text-2); text-wrap: pretty; }
.g-step .g-shot-img, .g-step .g-shot-fig { margin-top: 14px; }
.g-step .g-shot-img + p, .g-step .g-shot-fig + p { margin-top: 0; }

/* 动作链接（第一次使用 · 购买授权、下载站、绑定做法）：次按钮写法——透明底、细线、40px 高、10px 圆角；
   悬停时线和字各提一级；外链带 ↗。一节里几个并排，窄屏自动折行。紧跟节头时往上收一截：导语和链接是同一段话，不该隔着一整个节头下边距 */
.g-acts { display: flex; flex-wrap: wrap; gap: 12px 16px; }
/* 紧跟节头的动作链接或提示块（04 的「先备份」）往上收一截：它们和导语是同一段话，不该隔着一整个节头下边距 */
.g-sec-head + .g-acts, .g-sec-head + .g-tip { margin-top: calc(-1 * clamp(8px, 1.6vw, 24px)); }
.g-sec-head + .g-tip { max-width: 48em; }
.g-act {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 40px;
  padding: 0 16px;
  border: 1px solid var(--g-line-hover);
  border-radius: 10px;
  font-size: 14px;
  font-weight: 500;
  color: var(--text-2);
  white-space: nowrap;
  transition: var(--g-fade);
}
.g-act:hover { border-color: var(--g-line-on); color: var(--text); }
.g-act i { font-style: normal; font-size: .86em; color: var(--text-3); transition: color .18s var(--ease); }
.g-act:hover i { color: var(--text-2); }

/* ======================================================================
 * 演示控件统一按钮 .mx-btn（主线 11-11 统一规范 v3；Owner：「这按钮返工，文字丑死了，毫无质感，之前的同理」）
 * 用在：BIOS 分步演示（bios.*）、操作演示动画（flow.*）、U 盘视频的重播 / 播放（guide.*）、首屏转台的复位（topology.*）。
 * 各组件只给按钮加 mx-btn 和自己的定位类，外观一律在这里，不在组件里改字号、边线和高度——同一套按钮在四处长得一样。
 *
 * 为什么这样写：
 *   - 图标和文字同一行（inline-flex、垂直居中、间距 8px），图标画在 ::before 上，靠 data-ic 选图：
 *     图标是 CSS 蒙版（mask）里的一段 SVG，颜色取 currentColor，悬停时和字一起变亮；组件 JS 里不再塞 <svg>，
 *     这样不会被外面对 svg / span 的规则挤到文字上下（上一版 flow 的按钮就是被同名类名改成竖排的）；
 *     图标在文字右边（「下一步」）时加 is-ic-end，只反转排列方向；
 *   - 图标 14px，在 24 的画布里线宽 2.57 = 实际 1.5px，圆头圆角；一套六个：左、右箭头，暂停，播放，重播，复位；
 *   - 高 36px（≤768 宽 40px，手指好点），内边距 14px；字 13px / 500 / 字距 .04em，站点正文无衬线，数字等宽；
 *   - 线和底只用透明度分层：默认细线 14%、悬停 28% 加 4% 白底、按下 7% 白底；键盘焦点 2px 暖金外扩 2px；禁用 .35。
 *     不用渐变、阴影、发光、胶囊圆角（圆角 8px）；
 *   - 主按钮（一个控制条最多一个）：最亮的字、更亮的边，底边一条 2px 暖金指示线；
 *   - 叠在画面上的按钮（U 盘视频、窄屏 BIOS 的「看整屏」）加 is-overlay：底色是一块平的页面底色，保证压在画面上字读得清，仍然没有渐变阴影。
 * ==================================================================== */
.mx-btn {
  --mx-line: rgba(240, 238, 233, .14);
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 36px;
  padding: 0 14px;
  border: 1px solid var(--mx-line);
  border-radius: 8px;
  background-color: transparent;
  font: 500 13px/1 var(--sans);
  letter-spacing: .04em;
  font-variant-numeric: tabular-nums;
  color: var(--text-2);
  white-space: nowrap;
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
  transition: color .18s var(--ease), border-color .18s var(--ease), background-color .18s var(--ease);
}
/* hidden 属性要压过上面的 inline-flex（UA 的 [hidden] 优先级低于类选择器） */
.mx-btn[hidden] { display: none; }
.mx-btn:hover:not(:disabled) { border-color: rgba(240, 238, 233, .28); background-color: rgba(240, 238, 233, .04); color: var(--text); }
.mx-btn:active:not(:disabled) { background-color: rgba(240, 238, 233, .07); }
/* 焦点环：mx.css 的全站 :focus-visible 会把圆角改成 4px，这里把 8px 圆角留住，焦点环跟着按钮的圆角走 */
.mx-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 8px; }
.mx-btn:focus:not(:focus-visible) { outline: none; }
.mx-btn:disabled { opacity: .35; cursor: default; }
/* 图标：14px，颜色跟字 */
.mx-btn[data-ic]::before {
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  background-color: currentColor;
  -webkit-mask: var(--mx-ic) center / 14px 14px no-repeat;
  mask: var(--mx-ic) center / 14px 14px no-repeat;
}
.mx-btn.is-ic-end { flex-direction: row-reverse; }
.mx-btn[data-ic="prev"] { --mx-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.57' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14.5 6 8.5 12l6 6'/%3E%3C/svg%3E"); }
.mx-btn[data-ic="next"] { --mx-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.57' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 6l6 6-6 6'/%3E%3C/svg%3E"); }
.mx-btn[data-ic="pause"] { --mx-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.57' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6.5v11M15 6.5v11'/%3E%3C/svg%3E"); }
.mx-btn[data-ic="play"] { --mx-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.57' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8.5 5.75v12.5L18.5 12z'/%3E%3C/svg%3E"); }
.mx-btn[data-ic="replay"] { --mx-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.57' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 12a7.5 7.5 0 1 0 2.2-5.3M6.7 2.9v3.8h3.8'/%3E%3C/svg%3E"); }
.mx-btn[data-ic="reset"] { --mx-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.57' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='7.5'/%3E%3Ccircle cx='12' cy='12' r='2'/%3E%3C/svg%3E"); }
/* 主按钮：最亮的字、更亮的边，底边一条 2px 暖金指示线（规范 v2 的「当前项」写法） */
.mx-btn.is-primary { border-color: rgba(240, 238, 233, .42); color: var(--text); }
.mx-btn.is-primary:hover:not(:disabled) { border-color: rgba(240, 238, 233, .6); }
.mx-btn.is-primary::after { content: ""; position: absolute; left: 14px; right: 14px; bottom: -1px; height: 2px; background-color: var(--accent); }
.mx-btn.is-primary:disabled::after { opacity: 0; }
/* 叠在画面上：平的页面底色保证可读；悬停换一块稍亮的平底色（不叠两层） */
.mx-btn.is-overlay { background-color: rgba(6, 6, 7, .88); }
.mx-btn.is-overlay:hover:not(:disabled) { background-color: rgba(20, 20, 22, .92); }
.mx-btn.is-overlay:active:not(:disabled) { background-color: rgba(28, 28, 30, .94); }
@media (max-width: 768px) {
  .mx-btn { height: 40px; }
}

/* 控制条：左边按钮组、右边步数，同一条中线。控制条自己是容器查询的容器，按自身宽度收窄：
   窄于 520px 时，带 is-compact 的按钮（上一步、暂停、重播）只留图标、成正方形（读屏名字在 aria-label 上），主按钮「下一步」照样带字——
   手机上四个带字按钮加步数一行放不下，折成两行就是 Owner 截图里的「歪」；窄于 340px 时步数也收起（上面的分段进度已经说明第几步；四个按钮收窄后约 236px，加步数约 340px） */
.mx-ctl { container-type: inline-size; display: flex; align-items: center; justify-content: space-between; gap: 12px 16px; }
.mx-ctl-btns { display: flex; align-items: center; gap: 8px; min-width: 0; }
@container (width < 520px) {
  .mx-btn.is-compact { aspect-ratio: 1; padding: 0; gap: 0; }
  .mx-btn.is-compact .mx-btn-t { display: none; }
}
@container (width < 340px) {
  .mx-ctl .mx-step { display: none; }
}
/* 步数：12px 小标签「步骤」（次暗）+ 等宽数字「04 / 05」（次亮） */
.mx-step { display: inline-flex; align-items: baseline; gap: 8px; flex: none; white-space: nowrap; }
.mx-step-l { font: 500 12px/1 var(--sans); letter-spacing: .04em; color: var(--text-3); }
.mx-step-n { font: 500 13px/1 var(--sans); letter-spacing: .04em; font-variant-numeric: tabular-nums; color: var(--text-2); }
.mx-step-n i { font-style: normal; color: var(--text-3); }

/* U 盘转移动画（第一次使用 · 05）：视频铺满舞台宽度，四边 8% 羽化融进页面底色（与首屏舞台同一种蒙版）。
   宽 ≥560 用 wide 版（16:10），否则用 tall 版（4:5）——比例是预留尺寸，RU 的成片按这个比例出；万一不同，object-fit: contain 不裁画面。
   按钮（重播 / 播放）叠在画面右下、羽化区以内；播放中它不存在，不留槽位 */
.g-usb { position: relative; margin: 0; container-type: inline-size; }
.g-usb-video {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: contain;
  background: var(--bg);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent), linear-gradient(180deg, transparent, #000 8%, #000 92%, transparent);
  -webkit-mask-composite: source-in;
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent), linear-gradient(180deg, transparent, #000 8%, #000 92%, transparent);
  mask-composite: intersect;
}
@container (width < 560px) { .g-usb-video { aspect-ratio: 4 / 5; } }
/* 只有 wide 版的那段（data-usb-variants="wide"，例如 10 拔 U 盘的 tall 版还没渲出来）：窄屏也按 16:10 留位，画面不被拉成 4:5 的黑边 */
@container (width < 560px) { .g-usb[data-usb-variant="wide"] .g-usb-video { aspect-ratio: 16 / 10; } }
/* 按钮外观是上面的 .mx-btn.is-overlay（按钮规范 v3），这里只管位置：画面右下、羽化区以内 */
.g-usb-btn { position: absolute; right: 10%; bottom: 10%; }
.g-noscript-line { padding: 18px 22px; border: 1px solid var(--g-line); border-radius: 10px; font-size: 14px; color: var(--text-2); }
/* 提示块（规范 v2 第五节）：没有底色和框，左侧一条细线加文字；标题是等宽小字，退到附属层 */
.g-tips { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px 48px; margin-top: 40px; }
.g-tip { min-width: 0; padding: 2px 0 2px 18px; border-left: 1px solid var(--line-2); }
.g-tip-title { margin: 0; font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
.g-tip p { margin-top: 8px; font-size: 15px; line-height: 1.8; color: var(--text-2); }

/* 核对清单：纯静态列表，只告诉客户要核对哪些（Owner 11-10：不要让客户在浏览器里做无意义的勾选）。
   没有方框、圆圈、按钮，悬停也不变色——页面上没有任何东西看起来能点。
   一个 <ol> 排成两列网格、按列填充：左列 01–06（硬件与刷 BIOS，含 11-10 新加的 U 盘）、右列 07–11（BIOS 设置）；
   两列共用同一组六行，每一行的细线在两列间严格对齐；右列只有五项，分栏的竖细线画在 <ol> 上（::before 通高），不画在条目上，
   第六行右边空着时竖线也不断；最后一行下面一条细线收尾。编号是等宽小字、附属色，和条目文字按基线对齐 */
.g-check { position: relative; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-rows: repeat(6, auto); grid-auto-flow: column; border-bottom: 1px solid var(--g-line); }
.g-check::before { content: ""; position: absolute; top: 0; bottom: 0; left: 50%; width: 1px; background: var(--g-line); }
.g-check li { display: flex; align-items: baseline; gap: 16px; min-width: 0; padding: 14px 24px 14px 0; border-top: 1px solid var(--g-line); font-size: 16px; line-height: 1.6; color: var(--text); }
.g-check li:nth-child(n + 7) { padding-left: 32px; }
.g-check-num { flex: none; font: 500 12px/1 var(--mono); letter-spacing: .04em; color: var(--text-3); }

/* 下一章入口（核对清单之后，全页只此一处）：上下两条细线夹一行，左边「下一章」等宽小字、章名用标题字、一句说明，右边一个细箭头；
   顶线左端一段 2px 暖金指示线标出「当前要去的地方」。整行是一个链接，悬停只把线和箭头提一级，不位移、不加底色 */
.g-next-wrap { margin-top: clamp(40px, 5vw, 64px); }
.g-next {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  column-gap: 24px;
  padding: 24px 0 26px;
  border-top: 1px solid var(--g-line);
  border-bottom: 1px solid var(--g-line);
  color: var(--text);
  transition: border-color .18s var(--ease);
}
.g-next::before { content: ""; position: absolute; top: -1px; left: 0; width: 40px; height: 2px; background: var(--accent); }
.g-next:hover { border-color: var(--g-line-hover); }
.g-next-text, .g-next-kicker, .g-next-name, .g-next-say { display: block; min-width: 0; }
.g-next-kicker { font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
.g-next-name { margin-top: 8px; font: 500 24px/1.3 var(--display); color: var(--text); }
.g-next-say { margin-top: 6px; font-size: 14px; line-height: 1.7; color: var(--text-2); text-wrap: pretty; }
.g-next-arrow { width: 28px; height: 28px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; color: var(--text-2); transition: color .18s var(--ease); }
.g-next:hover .g-next-arrow { color: var(--text); }

/* 页尾 · 3D 模型署名：CC BY 4.0 的硬性要求，但不是阅读主线，做成最安静的一层——
   上方一条细线和正文分开，没有底色、没有框；收起时只有一行等宽小字，前面一个细线小三角，展开时只用 transform 转 90°。
   模型名很长（例如「Asus Strix b-550-f Gaming Motherboard Realistic」），链接不加 nowrap，窄屏自然折行；overflow-wrap 兜住无空格的长串 */
.g-credits-wrap { padding-bottom: clamp(56px, 6vw, 88px); }
.g-credits { padding-top: 20px; border-top: 1px solid var(--g-line); }
.g-credits summary {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font: 500 12px/1.6 var(--mono);
  letter-spacing: .04em;
  color: var(--text-3);
  cursor: pointer;
  list-style: none;
}
.g-credits summary::-webkit-details-marker { display: none; }
.g-credits summary:hover { color: var(--text-2); }
.g-credits-tri { flex: none; width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; transition: transform .2s var(--ease); }
.g-credits[open] .g-credits-tri { transform: rotate(90deg); }
.g-credits-body { max-width: 62em; margin-top: 14px; font-size: 13px; line-height: 1.75; color: var(--text-3); overflow-wrap: anywhere; }
.g-credits-list { display: grid; gap: 4px; margin-top: 12px; }
/* 「· 作者」整体不拆：窄屏折行时分隔点跟着作者一起到下一行，不会孤零零挂在上一行末尾 */
.g-credits-by { white-space: nowrap; }
/* 模型名是链接：比作者亮一级（作者是附属信息），细下划线标出可点；悬停只换字色 */
.g-credits a { color: var(--text-2); text-decoration: underline 1px var(--g-line-hover); text-underline-offset: 3px; transition: color .18s var(--ease), text-decoration-color .18s var(--ease); }
.g-credits a:hover { color: var(--text); text-decoration-color: var(--g-line-on); }

/* 断点 ------------------------------------------------------------------- */
/* 宽屏教程条三块同时出现（滚过首屏后）时的最窄情形：961 宽实测左侧教程名被省略号截掉 6px（217 / 211），
   靠收紧小节链接内边距和三块间距放下，不靠省略号兜底 */
@media (max-width: 1199px) {
  .g-toc-list a { padding: 0 11px; }
  .g-toc-list a::after { left: 11px; right: 11px; }
  /* 961–1199：第二章六个小节加「第一次使用」按钮，左格放不下「MythosX Anvil 使用教程 /」（实测 961 宽章名按钮压到第一个小节上、1100 宽还差 4.5px）；
     这一段只留章名按钮，教程名在页头眉题里有。1200 起左块文字和第一个小节之间还有 23px */
  .g-id-prefix { display: none; }
}
@media (max-width: 1099px) {
  .g-bar-in { gap: 16px; }
  .g-toc-list a { padding: 0 8px; }
  .g-toc-list a::after { left: 8px; right: 8px; }
}
@media (max-width: 1023px) {
  /* 左栏最宽的一行是「② 图标 通讯卡 二选一」，约 220px，232 放得下 */
  .g-parts { --g-part-left: 232px; }
  /* 规格条两栏两行：奇数栏贴左、不画竖线，第二行上面一条横细线，线照样对齐 */
  .g-bios-sum { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .g-bios-sum li:nth-child(odd) { padding-left: 0; border-left: 0; }
  .g-bios-sum li:nth-child(n + 3) { border-top: 1px solid var(--g-line); }
}

/* 窄屏教程条：左边「当前章 · 当前小节」，右边「目录」；小节列表变成从教程条下沿展开的面板，
   面板下面压一层暗幕，点暗幕或按 Esc 关闭，打开时页面不滚动 */
@media (max-width: 960px) {
  html[data-guide-route], html[data-guide-page] { --g-bar-h: 52px; }
  /* 章节菜单面板在窄屏贴版心左边线（.g-bar-id 已经在版心里），宽度不超过视口 */
  .g-ch { max-width: calc(100vw - 2 * var(--gutter)); }
  .g-bar-in { grid-template-columns: minmax(0, 1fr) auto; }
  /* 窄屏左块一直是「章名按钮 · 当前小节」：章节菜单要随时能用，不随首屏标题显隐 */
  .g-id-wide, .g-bar-route { display: none; }
  .g-id-past { display: block; }
  .g-id { font-size: 14px; }
  .g-id b { color: var(--text); }

  .g-toc-btn {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    height: 36px;
    margin-right: -10px;
    padding: 0 10px;
    border-radius: 10px;
    font-size: 14px;
    color: var(--text);
  }
  .g-toc-btn svg { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; transition: transform .25s var(--ease); }
  .g-toc-btn[aria-expanded="true"] svg { transform: rotate(180deg); }

  /* justify-self 必须改回 stretch：宽屏的 center 对定位元素同样生效，会把面板缩成居中的一窄条（实测 390 宽只剩 200px） */
  .g-toc {
    justify-self: stretch;
    position: fixed;
    inset: calc(var(--bar-h) + var(--g-bar-h)) 0 0;
    z-index: 39;
    background: rgba(4, 4, 5, .72);
    opacity: 0;
    visibility: hidden;
    transition: opacity .24s var(--ease), visibility 0s linear .24s;
  }
  .g-bar.is-toc .g-toc { opacity: 1; visibility: visible; transition: opacity .24s var(--ease), visibility 0s; }
  .g-toc-sheet {
    display: block;
    max-height: 100%;
    overflow-y: auto;
    padding: 18px var(--gutter) 22px;
    border-bottom: 1px solid var(--line);
    background: var(--bg);
    transform: translateY(-8px);
    transition: transform .32s var(--ease);
    overscroll-behavior: contain;
  }
  .g-bar.is-toc .g-toc-sheet { transform: none; }
  .g-toc-title { display: block; margin-bottom: 6px; font: 500 12px/1.4 var(--mono); letter-spacing: .04em; color: var(--text-3); }
  .g-toc-list { display: block; }
  .g-toc-list li + li { border-top: 1px solid var(--g-line); }
  .g-toc-list a { display: flex; justify-content: space-between; gap: 16px; width: 100%; height: 52px; padding: 0; font-size: 16px; }
  /* 当前小节：左缘一条 2px 暖金指示线，落在版心外的边距里，不挤文字 */
  .g-toc-list a::after { left: calc(-1 * var(--gutter)); right: auto; top: 14px; bottom: 14px; width: 2px; height: auto; }
  /* 第一行「连接方式」右侧带上当前方式，目录面板里就能看到自己选的是哪种 */
  .g-toc-val { display: grid; justify-items: end; font-size: 13px; line-height: 1; color: var(--text-3); }
}

@media (max-width: 767px) {
  .g-tips { grid-template-columns: minmax(0, 1fr); }
  /* 窄屏一列：11 项按顺序排下来，去掉分栏竖线和右列的左内边距 */
  .g-check { grid-template-columns: minmax(0, 1fr); grid-template-rows: none; grid-auto-flow: row; }
  .g-check::before { display: none; }
  .g-check li { padding-right: 0; }
  .g-check li:nth-child(n + 7) { padding-left: 0; }
  /* 下一章入口：箭头仍在右侧，章名和说明在左侧折行 */
  .g-next { column-gap: 16px; }
  /* 第一次使用 01–03：一列，块与块之间只剩横细线 */
  .g-grid3 { grid-template-columns: minmax(0, 1fr); }
  .g-sg, .g-sg + .g-sg { padding: 24px 0 28px; border-left: 0; }
}

/* 窄屏准备硬件：左栏变成行首的标题行，内容排在下面；② 的两小栏上下叠放 */
@media (max-width: 640px) {
  .g-part { grid-template-columns: minmax(0, 1fr); row-gap: 14px; padding-block: 24px; }
  .g-part-body { padding-top: 0; }
  .g-choices { grid-template-columns: minmax(0, 1fr); gap: 18px; }
}

@media (max-width: 599px) {
  .g-bios-sum li { padding: 16px 14px 18px; }
  .g-step { grid-template-columns: 36px minmax(0, 1fr); column-gap: 16px; padding-bottom: 28px; }
  .g-step::before { left: 17.5px; top: 44px; }
  .g-step-num { width: 36px; height: 36px; font-size: 13px; }
  .g-step p { padding-top: 5px; font-size: 16px; }
}

/* 减少动态效果：mx.css 已把所有过渡压到 0.01ms（瓦片、淡入淡出、目录面板都直接到位）；
   这里再把面板的位移去掉，打开时只出现，不从上方滑下 */
@media (prefers-reduced-motion: reduce) {
  .g-toc-sheet { transform: none; }
}

/* 英文版的 8-3 面板名：英文比中文长，pretty 仍会在两行的末行留下单个词；改用 balance 把两行排匀。
   只在英文页（html lang 为 en-US，由 i18n.js 设置）生效，中文版式不变 */
html[lang="en-US"] .g-face dt { text-wrap: balance; }

/* 英文版的部件名（第一章四个部件的标题与后面的小标签）：英文名比中文长，nowrap 下 768 宽会压出标题、小标签伸出标题行。
   改为允许换行（小标签整体换到下一行），行高随内容；最小高度保持 48px，单行时与右栏首行的对齐不变（只在英文页生效） */
html[lang="en-US"] .g-part-head { height: auto; min-height: 48px; }
html[lang="en-US"] .g-part-name { flex-wrap: wrap; row-gap: 2px; white-space: normal; text-wrap: balance; }
/* 英文版的路线磁贴：窄屏单列时某个磁贴的英文标题折成两行，同组磁贴高度就不一样；各行取同一高度（最高的那个） */
html[lang="en-US"] .g-tiles { grid-auto-rows: 1fr; }
/* 英文版的动作按钮：768 宽下卡片较窄，英文按钮文字比卡片宽；允许按钮内折行、高度随内容（最小 40px），
   同一行的按钮由 flex 拉伸保持同高 */
html[lang="en-US"] .g-act { height: auto; min-height: 40px; padding-block: 8px; white-space: normal; line-height: 1.35; }
