/* ══════════ 顶部通栏 banner ══════════
   只在移动端出现，把 Download iOS 从导航里挪出来。
   它**不** sticky，而 .nav 是 —— 于是往下滚时 banner 自然滚出视口、
   导航条贴顶，不需要任何 JS。 */
.mkf-banner{display:none;align-items:center;justify-content:center;gap:var(--s-2);
  height:48px;padding:0 var(--gutter);
  background:var(--accent);color:var(--accent-ink);
  font-size:var(--fs-xs);line-height:1;white-space:nowrap;overflow:hidden}
.mkf-banner__n{font-weight:400;overflow:hidden;text-overflow:ellipsis}
.mkf-banner__cta{font-weight:700;flex:none;display:inline-flex;align-items:center;gap:var(--s-1)}
.mkf-banner__ico{width:16px;height:16px;flex:none}

/* ══════════ NAV ══════════ */
.mkf-nav{position:sticky;top:0;z-index:var(--z-nav);background:rgba(11,9,7,.9);
  backdrop-filter:blur(var(--glass-blur));border-bottom:1px solid var(--line)}
.mkf-nav__in{display:flex;align-items:center;gap:var(--s-5);height:52px;
  max-width:var(--wrap);margin:0 auto;padding:0 var(--gutter)}
.mkf-nav__brand{display:flex;align-items:center;gap:var(--s-2);flex:none;color:var(--accent)}
.mkf-nav__logo{width:38px;height:auto}
/* ── 汉堡 + 抽屉：桌面不出现 ──
   开关用 <details> 而不是 JS 加类：无脚本时也能开合，
   而 [open] 又能被 CSS 直接选中，图标切换不需要一行脚本。
   三条线与叉是临时自画的，待换成 icon 库的 menu / close。 */
.mkf-mnav{display:none;flex:none}
.mkf-mnav>summary{list-style:none;width:32px;height:32px;display:grid;place-items:center;
  border-radius:var(--r-sm);color:var(--text);cursor:pointer}
.mkf-mnav>summary::-webkit-details-marker{display:none}
.mkf-mnav>summary svg{grid-area:1/1;width:20px;height:20px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round}
.mkf-mnav__x{display:none}
.mkf-mnav[open]>summary .mkf-mnav__i{display:none}
.mkf-mnav[open]>summary .mkf-mnav__x{display:block}

/* 抽屉贴在导航条底边展开。定位基准是 .nav（sticky 本身就是定位上下文），
   所以导航条贴顶之后抽屉跟着走，不必用 fixed 去算 top。 */
.mkf-mnav__panel{position:absolute;top:100%;left:0;right:0;z-index:var(--z-drawer);
  max-height:calc(100dvh - 52px);overflow-y:auto;overscroll-behavior:contain;
  padding:var(--s-2) var(--gutter) var(--s-7);
  background:var(--bg);border-top:1px solid var(--line)}
.mkf-mnav__row{display:flex;align-items:center;justify-content:space-between;gap:var(--s-2);
  padding:13px 2px;font-size:var(--fs-lg);color:var(--text);
  border-bottom:1px solid var(--line);cursor:pointer;list-style:none}
.mkf-mnav__row::-webkit-details-marker{display:none}
.mkf-mnav__row>span{display:inline-flex;align-items:center;gap:var(--s-2)}
.mkf-mnav__row svg{width:12px;height:12px;flex:none;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;opacity:.7;transition:transform var(--t-base) ease}
.mkf-mnav__grp[open]>.mkf-mnav__row{color:var(--accent);border-bottom-color:transparent}
.mkf-mnav__grp[open]>.mkf-mnav__row svg{transform:rotate(180deg)}
.mkf-mnav__sub{padding:2px 0 10px;border-bottom:1px solid var(--line)}
.mkf-mnav__sub .mkf-drop__i{width:auto}
.mkf-nav__word{font-family:var(--font-display);font-size:var(--fs-lg);font-weight:700;
  letter-spacing:var(--ls-title);color:var(--text)}
.mkf-nav__word b{color:var(--accent)}

/* align-self:stretch 让菜单撑满 52 的导航条高度，.nav__item 跟着撑满 ——
   于是下拉的 top:100% 正好落在导航条底边上，指针从菜单项移到下拉时
   全程都在 .nav__item 内部。原来 .drop 是 top:calc(100% + 6px)，
   那 6px 空隙一穿过 hover 就断了，下拉当场消失、根本点不到子项。 */
.mkf-nav__menu{display:flex;align-items:stretch;align-self:stretch;gap:2px;flex:1 1 auto;min-width:0}
.mkf-nav__item{position:relative;display:flex;align-items:center}
.mkf-nav__link{display:inline-flex;align-items:center;gap:5px;padding:6px 10px;
  border-radius:var(--r-sm);font-size:var(--fs-sm);color:var(--mute);white-space:nowrap;
  transition:var(--tr-tint)}
.mkf-nav__link:hover{color:var(--text);background:rgba(255,255,255,.05)}
.mkf-nav__link--on{color:var(--accent);font-weight:700}
.mkf-nav__caret{width:8px;height:8px;fill:none;stroke:currentColor;stroke-width:2;opacity:.7}
/* 菜单项上的小标签（一级菜单 Video 的 new、下拉里的 new / hot）。
   实心面 —— 原来是 20% 掺透明的淡底，实测合成后与下拉底只差 1.03，
   等于没有底、读成一个彩色单词而不是标签；2026-08-23 改成实心。
   两档靠色相分：new = 强调橙（黑字 7.18 AAA），hot = 辅助蓝（白字 5.25 AA）。 */
.mkf-nav__tag{display:inline-flex;align-items:center;height:16px;padding:0 4px;
  border-radius:var(--r-xs);font-size:var(--fs-2xs);font-weight:600;line-height:var(--lh-tight);
  color:var(--accent-ink);background:var(--accent)}
/* hot 与 new 同形（都是实心块），只换色相 —— 蓝取自 --glow-hi 那支已有的辅助色，
   不是新色，也不是 amber/rose 那类功能色（功能色禁止用于装饰强调）。
   白字对蓝面 5.25 AA。蓝与主推格的高亮发光同源，语义都是「重点推」。 */
.mkf-nav__tag--hot{color:var(--hot-on);background:var(--hot)}
/* .drop__t 是普通 <b>，没有 .nav__link 那个 gap，间距与基线要手动补 */
.mkf-drop__t .mkf-nav__tag{margin-left:6px;vertical-align:1px}

/* ── 下拉：图标 + 标题 + 描述，9 行一列自动分栏 ── */
.mkf-drop{position:absolute;top:100%;left:0;z-index:var(--z-drop);
  display:grid;grid-auto-flow:row;gap:2px;
  padding:var(--s-3);border-radius:var(--r-sm);
  background:var(--surface);border:1px solid var(--line-strong);
  /* 用 visibility 而不是 display 才能做过渡。移出时故意拖 .2s 再开始淡出 ——
     斜着划过相邻菜单项、或短暂滑出边界，下拉不会当场消失。 */
  opacity:0;visibility:hidden;transform:translateY(-4px);
  transition:opacity var(--t-fast) ease var(--t-base),transform var(--t-fast) ease var(--t-base),visibility 0s .35s}
.mkf-nav__item:hover .mkf-drop,.mkf-nav__item:focus-within .mkf-drop{
  opacity:1;visibility:visible;transform:translateY(0);
  transition:opacity var(--t-fast) ease,transform var(--t-fast) ease,visibility 0s}
/* 只有超过 9 项才分栏。写死 repeat(9,auto) 的话，条目少于 9 时
   空行虽然高 0，行间距照算 —— 6 项的面板会平白高出 6px。 */
.mkf-drop:has(.mkf-drop__i:nth-of-type(10)){
  grid-auto-flow:column;grid-template-rows:repeat(9,auto);
  column-gap:var(--s-2)}
.mkf-drop__i{display:flex;align-items:center;gap:10px;width:300px;min-width:0;
  padding:8px 10px;border-radius:var(--r-sm);transition:var(--tr-tint)}
.mkf-drop__i:hover{background:var(--surface-2)}
/* 图标位先用色块占位，等 Figma 里换成 icon 库的图标再导出替换 */
.mkf-ico-defs{display:none}
/* 图标位 —— 32×32 满幅线稿，不再加底色块；色走 currentColor 便于随主题切换 */
.mkf-drop__ico{width:32px;height:32px;flex:none;color:var(--mute)}
.mkf-drop__tx{display:flex;flex-direction:column;min-width:0}
.mkf-drop__t{font-size:var(--fs-sm);font-weight:600;color:var(--text);line-height:var(--lh-snug)}
.mkf-drop__d{font-size:var(--fs-xs);color:var(--faint);line-height:var(--lh-snug);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.mkf-nav__right{display:flex;align-items:center;align-self:stretch;
  gap:var(--s-2);flex:none;margin-left:auto}
/* 语言项复用 .nav__item 那套 hover 逻辑，所以同样要撑满导航条高度 ——
   否则按钮只有 32 高，下拉与导航条底边之间又会空出 10px。 */
.mkf-nav__item--lang{align-self:stretch}
/* 语言下拉贴右边缘展开：left:0 会从按钮左侧往右画，直接冲出版心。 */
.mkf-drop--lang{left:auto;right:0;grid-auto-flow:row}
.mkf-drop--lang a{display:flex;align-items:center;gap:var(--s-2);width:auto;min-width:150px;
  padding:8px 10px;border-radius:var(--r-sm);
  font-size:var(--fs-sm);color:var(--mute);white-space:nowrap;transition:var(--tr-tint)}
.mkf-drop--lang a:hover{background:var(--surface-2);color:var(--text)}
.mkf-drop--lang a[aria-current="true"]{color:var(--accent)}
.mkf-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:32px;padding:0 14px;border-radius:var(--r-sm);border:0;
  font-family:var(--font-sans);font-size:var(--fs-sm);font-weight:400;
  cursor:pointer;white-space:nowrap;transition:var(--tr-tint)}
.mkf-btn__ico{width:24px;height:24px;flex:none}
/* 只有语言按钮是 600，Login 与 Download 是 400 —— 照 Figma 的定稿 */
.mkf-btn--ghost{background:transparent;color:var(--mute);font-weight:600}
.mkf-btn--ghost:hover{color:var(--text)}
.mkf-btn--line{background:transparent;color:var(--accent);border:1px solid var(--line-strong)}
.mkf-btn--line:hover{border-color:rgba(255,255,255,.3)}
.mkf-btn--solid{background:var(--accent);color:var(--accent-ink)}
.mkf-btn--solid:hover{background:#FF7A40}
.mkf-btn--lg{height:40px;padding:0 20px;font-size:var(--fs-md)}
.mkf-btn--xl{height:48px;padding:0 24px;font-size:var(--fs-lg);font-weight:700;border-radius:var(--r-sm)}
/* 描边款的内边距比实心款窄一档（画布上 16 vs 24） */
.mkf-btn--xl.mkf-btn--line{padding:0 16px;font-weight:400}
/* 立体 CTA：一层**不带模糊**的下偏移阴影当底座，按钮看起来有 4px 厚度。
   带模糊的话就成了普通投影，立体感全无 —— blur 必须是 0。
   只管厚度，尺寸与底色仍由 --solid / --xl 决定。 */
.mkf-btn--3d{background:var(--grad-cta);color:var(--accent-ink);
  box-shadow:0 4px 0 var(--accent-shade);
  transition:transform var(--t-press) ease,box-shadow var(--t-press) ease,filter var(--t-fast)}
.mkf-btn--3d:hover{filter:brightness(1.06)}
/* 玻璃 CTA —— 压在素材上的那颗（画布 56:180）。
   底是 30% 的 accent + 8px 背景模糊，不是实心；字重 500，比 xl 的 700 轻一档。 */
.mkf-btn--glass{height:48px;padding:0 var(--s-4);gap:var(--s-1);
  font-size:var(--fs-lg);font-weight:500;border-radius:var(--r-sm);color:var(--accent);
  background:color-mix(in srgb, var(--accent) 30%, transparent);
  -webkit-backdrop-filter:blur(var(--glass-blur-sm));backdrop-filter:blur(var(--glass-blur-sm))}
.mkf-btn--glass:hover{background:color-mix(in srgb, var(--accent) 40%, transparent)}
/* 按下去时把按钮压到底座上：位移与阴影同时收 3px，总高不变，看着像真被按下去 */
.mkf-btn--3d:active{transform:translateY(3px);box-shadow:0 1px 0 var(--accent-shade)}

/* ══════════ 顶部滚动模型条 ══════════ */
.mkf-ticker{border-bottom:1px solid var(--line);overflow:hidden}
.mkf-ticker__in{display:flex;gap:var(--s-5);align-items:center;
  max-width:var(--wrap);margin:0 auto;padding:9px var(--gutter);
  overflow-x:auto;scrollbar-width:none}
.mkf-ticker__in::-webkit-scrollbar{display:none}
.mkf-chip{display:inline-flex;align-items:center;gap:7px;flex:none;
  font-size:var(--fs-xs);letter-spacing:var(--ls-caps);text-transform:uppercase;
  color:var(--faint);white-space:nowrap}
.mkf-chip b{color:var(--mute);font-weight:600}
.mkf-chip::before{content:"";width:4px;height:4px;border-radius:var(--r-full);
  background:var(--surface-3);flex:none}
.mkf-chip--hot::before{background:var(--accent)}
.mkf-chip--hot b{color:var(--accent)}

/* ══════════ SECTION ══════════ */
.mkf-sec{padding-top:var(--s-7)}
.mkf-sec + .mkf-sec{padding-top:var(--s-5)}
/* 以下四条是通用的 section 头（标题 / 副标题 / 「查看更多」）。
   案例墙用了前三条；`.sec__more` 目前零处使用 —— 留着是给后续 section 的，
   不是漏删。孤儿检测报到它属于预期。Hero Rail 明确不要标题区。 */
.mkf-sec__hd{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--s-4);margin-bottom:var(--s-4)}
.mkf-sec__t{font-family:var(--font-display);font-size:var(--fs-xl);font-weight:600;
  line-height:24px;letter-spacing:var(--ls-caps-lg);text-transform:uppercase;margin:0}
.mkf-sec__sub{font-size:var(--fs-sm);color:var(--faint);margin:4px 0 0}
.mkf-sec__more{font-size:var(--fs-sm);color:var(--faint);white-space:nowrap}
.mkf-sec__more:hover{color:var(--accent)}
/* higgsfield 的段标题是品牌色，我们照做 —— 用 --accent 不用 --text */
.mkf-sec__t--accent{color:var(--accent)}

/* ══════════ 主推 + 六工具 ══════════
   骨架照 higgsfield：左边一张大促销卡，右边 3×2 的功能格。
   内容原样取自线上同一个区块（"START FREE. NO SUBSCRIPTION" 那段），
   只换版式不换文案。线上那块用的是紫→橙渐变，这里改纯色 —— 守「渐变 ≤2」。

   促销卡用 1fr 而不是写死 620：在 1888 基准处 1fr 恰好是 618.7（差 1.3px，看不出），
   而写死 620 会让 1280 那档右边只剩 596，功能格每列不足 200 —— 描述整行都被截掉。
   改成比例后 1280 处每列 265、1440 处 300，不必为此再加一个断点。 */
.mkf-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:var(--s-4)}
.mkf-promo{position:relative;display:flex;flex-direction:column;align-items:flex-start;
  justify-content:space-between;gap:var(--s-2);min-height:222px;
  padding:var(--s-4);border-radius:var(--r-sm);overflow:hidden;
  background:var(--surface);border:1px solid var(--line);
  transition:var(--tr-tint)}
.mkf-promo:hover{border-color:var(--line-strong)}
.mkf-promo__badge{align-self:flex-start;padding:5px 11px;border-radius:var(--r-xs);
  background:var(--accent);color:var(--accent-ink);
  font-size:var(--fs-xs);font-weight:700;line-height:1;text-transform:uppercase}
.mkf-promo__t{font-family:var(--font-display);font-size:var(--fs-d-promo);font-weight:700;
  line-height:var(--lh-tight);text-transform:uppercase;margin:0;letter-spacing:var(--ls-title);}

.mkf-tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  grid-template-rows:repeat(2,minmax(0,1fr));gap:var(--s-2)}
.mkf-tile{position:relative;display:flex;flex-direction:column;padding:var(--s-3);
  border-radius:var(--r-sm);background:var(--surface);border:1px solid var(--line);
  transition:var(--tr-tint)}
.mkf-tile:hover{background:var(--surface-2);border-color:var(--line-strong)}
/* 图标位先用色块占位，等 Figma 里换成 icon 库的图标再导出替换 */
.mkf-tile__ico{width:24px;height:24px;flex:none;color:var(--mute)}
.mkf-tile__t{font-size:var(--fs-md);line-height:20px;font-weight:600;letter-spacing:var(--ls-title);margin:0 0 4px}
.mkf-tile__d{font-size:var(--fs-xs);line-height:16px;color:var(--faint);margin:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mkf-tile__flag{position:absolute;top:var(--s-3);right:var(--s-3);
  display:inline-flex;align-items:center;gap:var(--s-1);
  font-size:var(--fs-2xs);font-weight:700;line-height:12px;
  padding:4px 6px;border-radius:var(--r-xs);
  background:var(--surface-3);color:var(--mute)}
.mkf-tile__flagico{width:12px;height:12px;flex:none}
/* 主推格与 Hero Rail 的重点卡用同一套语言：蓝色内发光，不另起一种高亮方式 */
.mkf-tile--hi{border-color:color-mix(in srgb, var(--glow-hi) 45%, transparent)}
.mkf-tile--hi::after{content:"";position:absolute;inset:0;pointer-events:none;
  border-radius:inherit;box-shadow:inset 0 0 var(--glow-blur) var(--glow-hi)}
.mkf-tile--hi .mkf-tile__flag{background:var(--accent);color:var(--accent-ink)}

/* ══════════ 模型介绍 ══════════
   骨架照 higgsfield 的 Seedance 2.5 段：上面一条文案（标题 / 描述 / 两个 CTA），
   下面一整片素材墙。makefun 有三个模型，Seedance 独占一行、另两个并排 —— 用户 2026-08-19 定。
   文案、描述、CTA、素材 URL 全部取自线上首页同名段落。 */
.mkf-models{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s-4)}
.mkf-model{position:relative;grid-column:span 1;display:flex;flex-direction:column;gap:var(--s-4);
  padding:var(--s-4);border-radius:var(--r-sm);overflow:hidden;
  background:var(--surface);border:1px solid var(--line);
  transition:var(--tr-tint)}
.mkf-model:hover{border-color:color-mix(in srgb, var(--tint) 34%, var(--line-strong))}
/* 通栏卡不描边，改用强调色内发光 —— 与 Hero Rail 重点卡、Feature 主推格同一套语言 */
.mkf-model--wide{grid-column:span 2;border-color:transparent}
/* hover 也不描边 —— 通栏卡的悬停反馈全交给内发光，
   不写这条的话 .model:hover 会把边缘重新点亮，和发光打架。 */
.mkf-model--wide:hover{border-color:transparent}
/* z-index 必须高过墙底遮罩的 1 —— 内发光是卡片最外的一层，
   它下面才是遮罩、再下面是素材。不写的话伪元素虽然 DOM 靠后，
   却压不过带 z-index 的遮罩，卡片底部的发光会被整条吃掉。 */
.mkf-model--wide::after{content:"";position:absolute;inset:0;z-index:var(--z-raise);pointer-events:none;
  border-radius:inherit;box-shadow:inset 0 0 var(--glow-blur) var(--accent)}
.mkf-model--a{--tint:var(--tint-a)}
.mkf-model--b{--tint:var(--tint-b)}
.mkf-model--c{--tint:var(--tint-a)}   /* MiniMax H3 —— 蓝 */
/* 辅助色现在只在 hover 时的卡边缘露面 —— 标题前的色点画布上已去掉 */
.mkf-model__hd{display:flex;flex-direction:column;gap:var(--s-3)}
/* 半宽卡的头部是一行：文案占满、Explore 按钮靠右顶对齐（画布 43:91，
   HORIZONTAL / gap 16 / counterAxis MIN）。通栏卡仍是居中竖排，不受影响。 */
.mkf-model:not(.mkf-model--wide) .mkf-model__hd{flex-direction:row;gap:var(--s-4);align-items:flex-start}
.mkf-model:not(.mkf-model--wide) .mkf-model__tx{flex:1 1 auto}
/* 头部那颗是 32 高的小号线框按钮（画布 56:165），不是墙底那颗 48 的 xl。
   左右内边距 16，比 .btn 默认的 14 宽 2 —— 画布给的就是 16。 */
.mkf-model__hd .mkf-btn--line{padding:0 16px}
/* 通栏卡的文案整体居中，只有上内边距 16 —— 与半宽卡的左对齐刻意不同。
   描述在 1536 宽里是单行，所以不设 max-width。 */
.mkf-model--wide .mkf-model__hd{align-items:center;text-align:center;
  gap:var(--s-4);padding-top:var(--s-4)}
/* 通栏的描述在画布上是单行、行高走字体默认（约 16），不是半宽卡那条 20.15 */
.mkf-model--wide .mkf-model__d{line-height:normal}
.mkf-model--wide .mkf-model__tx{display:contents}
.mkf-model__tx{min-width:0}
.mkf-model__t{margin:0 0 6px;font-family:var(--font-display);
  font-size:var(--fs-3xl);line-height:30px;font-weight:700;letter-spacing:var(--ls-title);}
/* 通栏卡的标题是一张图（256×36，源图 512×72 @2x），不是文字。
   这条必须写在 .model__t 之后 —— 同优先级下后者赢，
   否则 .model__t 的 margin-bottom:6 会漏过来，文案区平白高 6px。 */
.mkf-model__t--img{display:block;margin:0}
.mkf-model__logo{width:256px;height:36px;object-fit:contain}
.mkf-model__d{margin:0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--mute)}
.mkf-model__wall{position:relative;display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-2)}
/* 墙底的淡出遮罩 + CTA。两处细节都不是随手写的：
   ① 绝对定位 —— 它盖在最后一行图上，不占墙的高度；
   ② **往下越过墙的边界、一直铺到卡片底边**（bottom 负值 + 等量的下内边距）。
      只铺到墙底的话，墙底与卡内边距之间会切出一条明显的横线 ——
      墙内是深色素材、内边距那 16px 是卡底色且正处在内发光最强的地方，
      两边亮度差就成了一条边。顺带也把末行格子的圆角一起盖住，
      不再出现「第二行是直角」的观感。下内边距补回同样的量，CTA 位置不变。 */
.mkf-model__more{position:absolute;left:0;right:0;bottom:calc(-1 * var(--s-4));z-index:var(--z-base);
  --fade-to:var(--surface);
  display:flex;align-items:center;justify-content:center;gap:var(--s-4);
  padding:var(--s-6) 0 calc(var(--s-6) + var(--s-4));pointer-events:none}
/* 两处淡出遮罩共用同一条渐变声明，只换收敛色 —— 全页渐变数因此还是 2。
   ⚠ --fade-to 必须在用它的那个元素上取值：写成 :root 里的一条
   `--grad-fade` 这类把整条渐变塞进自定义属性的写法会在 :root 上就替换完，
   两处都拿到同一个色，且不报错。 */
.mkf-model__more,.mkf-gal__more,.mkf-mas__more,.mkf-foot,.mkf-foot__word{
  background:linear-gradient(var(--fade-dir, 180deg), transparent 0%, var(--fade-to) 100%)}
.mkf-model:not(.mkf-model--wide) .mkf-model__more{padding:var(--s-4) 0 calc(var(--s-4) * 2)}
.mkf-model__more > *{pointer-events:auto}
/* 通栏墙的行数：≥768 恒为 2 行，列数 5→4→3→2 随断点降，多出来的格子直接
     display:none 藏掉；≤767 那档 2026-08-23 改为 3 行（2 列 × 3 格），
     手机上一屏能看到的素材太少，多给一行。*/
.mkf-model--wide .mkf-model__wall{grid-template-columns:repeat(5,minmax(0,1fr))}
.mkf-model__cell{position:relative;aspect-ratio:16/9;border-radius:var(--r-xs);
  overflow:hidden;background:var(--surface-2)}
.mkf-model__cell img,.mkf-model__cell video{width:100%;height:100%;object-fit:cover;
  transition:transform var(--t-media) var(--ease-out)}
.mkf-model__cell:hover img,.mkf-model__cell:hover video{transform:scale(1.04)}

/* ══════════ 案例墙（Image to Video）══════════
   骨架照 higgsfield 的 SEEDANCE 2.0 段：小号大写标题 + 一行副标题，
   下面 4 列 16:9 的例子铺满通栏，**第四行被硬切**、CTA 压在切口上。
   切口本身就是「还有更多」的表达，所以这里不加淡出遮罩 ——
   与 .model__wall 的 .model__more 是两套不同的语言，别互相套用。
   素材与文案取自线上 /image-to-video/ 的 Effects Showcase（11 个案例 + 首图）。 */
.mkf-gal{position:relative;overflow:hidden}
/* 前三行按 16:9 自然撑开，第四行被压成 --gal-peek 那么高。
   行高一确定，格子默认 stretch 就填满它，aspect-ratio 自动让位 ——
   不需要再给末行单写高度。 */
.mkf-gal__grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  grid-template-rows:repeat(3,auto) var(--gal-peek);gap:var(--s-2)}
.mkf-gal__cell{position:relative;border-radius:var(--r-sm);overflow:hidden;
  background:var(--surface-2);aspect-ratio:16/9}
.mkf-gal__cell img,.mkf-gal__cell video{width:100%;height:100%;object-fit:cover;
  transition:transform var(--t-media) var(--ease-out)}
.mkf-gal__cell:hover img,.mkf-gal__cell:hover video{transform:scale(1.04)}
/* CTA 压在切口上，外面裹一层淡出遮罩：176 高 = 96 上 + 48 按钮 + 32 下。
   上下**不对称**是画布定的（56:173 的 pad 96/0/32/0）——按钮压得比中线低，
   更贴近切口。遮罩比切口(112)高出 64，也就是往上盖住第三行的下沿。
   渐变收在 --bg 而不是 --surface：这块没有卡片容器，底下直接是页面底色。 */
.mkf-gal__more,.mkf-mas__more{position:absolute;left:0;right:0;bottom:0;--fade-to:var(--bg);
  display:flex;justify-content:center;pointer-events:none;
  padding:calc(var(--s-8) + var(--s-6)) 0 var(--s-6)}
.mkf-gal__more > *,.mkf-mas__more > *{pointer-events:auto}

/* ══════════ 瀑布流（makefun Creative Videos）══════════
   骨架照 higgsfield 的 VIRAL PRESETS 段：同一套段头，下面是**高度不齐**的瀑布流。
   用 CSS 多列而不是 grid —— grid 的行高由整行最高的格子决定，做不出错落；
   多列是内容顺着列往下流，天然就是瀑布。
   `column-fill:auto` 是关键：默认的 balance 会把各列拉平，
   我们要的是「一列填满再进下一列」，这样裁切线以上每列都是满的。
   素材是线上同名板块的 12 个视频封面，比例原样保留（9:16 / 16:9 / 3:4）。 */
.mkf-mas{position:relative;overflow:hidden;height:var(--mas-h)}
/* 素材少到一屏能放完时（text-to-image 的 Explore 只有 8 张），
   不裁切、也就不需要 .mas__more 那颗按钮 —— 裁掉一半反而是内容缺失。 */
.mkf-mas--auto{height:auto}
/* 列是**手写的**，不是 CSS 多列。多列试过，不行：
   `break-inside:avoid` 让每列只能整块地堆，容器 840 高、格子 546 高时
   一列就只塞得下一个，底下空 294px —— 换 column-fill 也一样，实测两种模式
   排布逐像素相同。列写死之后每列都能被填满到裁切线以下，才有瀑布的样子。
   代价是断点变窄时只能整列隐藏（末列的素材不再出现）——
   反正它们本来也在裁切线以外，看不见。 */
.mkf-mas__grid{display:flex;gap:var(--s-2);height:100%}
.mkf-mas__col{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:var(--s-2)}
.mkf-mas__cell{flex:none;border-radius:var(--r-sm);overflow:hidden;background:var(--surface-2)}
/* 比例走类不走内联 style —— 全页禁内联 style */
.mkf-mas__cell--v{aspect-ratio:9/16}
.mkf-mas__cell--h{aspect-ratio:16/9}
.mkf-mas__cell--p{aspect-ratio:3/4}
.mkf-mas__cell--s{aspect-ratio:1/1}
.mkf-mas__cell--t{aspect-ratio:2/3}
.mkf-mas__cell--f{aspect-ratio:4/5}
.mkf-mas__cell--w{aspect-ratio:3/2}   /* 3:2 横构图，seedream-4.5 的 Explore-7 */
.mkf-mas__cell img,.mkf-mas__cell video{width:100%;height:100%;object-fit:cover;
  transition:transform var(--t-media) var(--ease-out)}
.mkf-mas__cell:hover img,.mkf-mas__cell:hover video{transform:scale(1.04)}

/* ══════════ 开发者三卡（Developer Friendly）══════════
   higgsfield 没有对口的段，按本页已有的语汇拼：段头照 .sec__hd，
   卡壳照 .model（surface 底 + line 描边 + hover 上辅助色），
   按钮照模型卡头部那颗 32 高的线框。
   与 .model 的唯一区别是内边距给到 24 而不是 16 ——
   纯文字卡没有素材顶住四边，16 会显得字贴边。 */
.mkf-dev{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
.mkf-dev__card{display:flex;flex-direction:column;gap:var(--s-3);
  padding:var(--s-5);border-radius:var(--r-sm);
  background:var(--surface);border:1px solid var(--line);transition:var(--tr-tint)}
.mkf-dev__card:hover{border-color:color-mix(in srgb, var(--tint) 34%, var(--line-strong))}
.mkf-dev__card--a{--tint:var(--tint-a)}
.mkf-dev__card--b{--tint:var(--tint-b)}
.mkf-dev__card--c{--tint:var(--tint-c)}
/* 图标占位 —— 等 icon 库，尺寸与下拉菜单那套一致 */
.mkf-dev__ico{width:32px;height:32px;flex:none;color:var(--mute)}
.mkf-dev__t{margin:0;font-family:var(--font-display);
  font-size:var(--fs-xl);line-height:24px;font-weight:700;letter-spacing:var(--ls-title);}
.mkf-dev__d{margin:0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--mute)}
/* 三张卡的正文长短不一，按钮靠 margin-top:auto 压到卡底对齐 */
.mkf-dev__card .mkf-btn{margin-top:auto;align-self:flex-start;padding:0 var(--s-4)}

/* ══════════ 通栏 banner（AI Safety）══════════
   画布定稿：220 高的矮条，素材整幅铺满（object-fit:cover，居中裁），没有压暗层 ——
   素材左暗右亮，文案压在左边的暗部上。徽章 / 标题 / 说明 / 链接是一列，全部在左侧。
   **文案列宽写死 520，不随视口缩放**（用户 2026-08-20 定）：一缩宽度就改折行数，
   折行数一改列高就变，220 的条会被顶开。max-width:100% 只在容器比 520 还窄时才兜底。 */
.mkf-bnr{position:relative;display:flex;align-items:stretch;
  overflow:hidden;min-height:220px;padding:var(--s-4);
  border-radius:var(--r-md);background:var(--surface)}
/* picture 只是 source 的载体，让它从 flex 流里消失；img 仍绝对定位在 .bnr 上。
   移动端换的是**构图不同的另一张图**（盾牌在右、左侧留渐变给文字），
   不是同一张图的偏移 —— 原图 16:9 主体居中，窄屏下 cover 后横向
   零裁剪余量，object-position 平移不了（实测 430 以上可裁量为 0）。 */
.mkf-bnr picture{display:contents}
.mkf-bnr__bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* 上下两块两端对齐：label 单独一块贴顶，标题 / 正文 / 链接一块贴底。
   靠 .bnr 的 align-items:stretch 把列撑满 188（220 − 上下各 16），
   space-between 才有东西可分；内容超过 188 时 min-height 允许 banner 长高。

   **列宽是 clamp(232, 34%, 520)，不是定值** —— 素材里的盾牌横向占 41.5%–58.6%
   （逐列扫描实测，不是目测），而素材永远整幅铺满、盾牌恒在横向正中，
   所以文案列的右缘必须跟着 banner 宽度按比例退。34% 给盾牌左缘留约 7% 余量；
   520 是 1530 以上的封顶（那时 34% 已经超过 520，桌面观感不变）；
   232 是下限 —— 徽章本身就有 232 宽，再窄它会顶出列外。 */
.mkf-bnr__in{position:relative;z-index:var(--z-base);flex:none;display:flex;flex-direction:column;
  align-items:flex-start;justify-content:space-between;gap:var(--s-4);
  width:clamp(232px, 34%, 520px);max-width:100%}
.mkf-bnr__body{display:flex;flex-direction:column;align-items:flex-start;gap:var(--s-2)}
.mkf-bnr__t{margin:0;font-family:var(--font-display);font-weight:700;
  font-size:var(--fs-d-bnr);line-height:var(--lh-tight);letter-spacing:var(--ls-display);}
/* 正文一句话，520 宽下正好一行（76 字符 / 单行上限约 81，填充 93%）。
   窄屏随列宽自然折行、不隐藏 —— banner 靠 min-height 跟着长高。 */
.mkf-bnr__d{margin:0;font-size:var(--fs-md);line-height:var(--lh-relaxed);color:var(--mute)}
/* 画布上这颗从玻璃按钮改成了纯文字链接：无底、无边、无模糊，只有 accent 字 + 箭头 */
.mkf-bnr__more{display:inline-flex;align-items:center;gap:var(--s-2);
  padding:4px 0;font-size:var(--fs-lg);font-weight:500;color:var(--accent)}
.mkf-bnr__more:hover{color:var(--accent-lit)}

/* ══════════ 用例三卡（Use Cases）══════════
   骨架照 higgsfield 的 EXPLORE THE INSIDE OF EVERY PROJECT：
   16:9 素材 + **素材下面一条信息栏**（头像 · 标题 · by 作者 · 右侧标签）——
   这条栏是本页其他素材卡都没有的，也是这块唯一的新东西。
   higgs 是 4 列 2 行、末行被裁 + "Explore community"；makefun 只有 3 个用例，
   一行就排完，所以没有裁切也没有那颗 CTA（线上这块本来也没有链接）。 */
.mkf-uc{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
.mkf-uc__card{border-radius:var(--r-sm);overflow:hidden;
  background:var(--surface);border:1px solid var(--line);transition:var(--tr-tint)}
.mkf-uc__card:hover{border-color:var(--line-strong)}
.mkf-uc__media{position:relative;aspect-ratio:16/9;background:var(--surface-2)}
.mkf-uc__media img,.mkf-uc__media video{width:100%;height:100%;object-fit:cover;
  transition:transform var(--t-media) var(--ease-out)}
.mkf-uc__card:hover .mkf-uc__media img,.mkf-uc__card:hover .mkf-uc__media video{transform:scale(1.04)}
.mkf-uc__bar{display:flex;align-items:center;gap:var(--s-2);padding:var(--s-3)}
/* 头像占位 —— 等 icon 库 / 真实作者头像 */
.mkf-uc__ava{width:20px;height:20px;flex:none;border-radius:var(--r-full);background:var(--surface-2)}
/* 名字这段要能被挤扁：min-width:0 是 flex 子项能收缩的前提，
   不写的话它按内容撑开，右边的标签会被挤出卡外。 */
.mkf-uc__name{flex:1;min-width:0;font-size:var(--fs-sm);color:var(--mute);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mkf-uc__name b{font-weight:600;color:var(--text)}
.mkf-uc__tag{flex:none;display:inline-flex;align-items:center;gap:var(--s-1);
  padding:4px 8px;border-radius:var(--r-xs);
  background:var(--surface-2);font-size:var(--fs-xs);color:var(--mute)}

/* ══════════ 口碑双跑马灯（Testimonials）══════════
   两排反向匀速滚动。做法上有两处不能省：
   ① **卡片用 margin-right 而不是 track 上的 gap** —— 一整份内容重复两遍、
      动画走到 translateX(-50%) 接回原点。用 gap 的话整条轨道是
      「2N 张卡 + (2N−1) 个间隙」，一半刚好差半个间隙，接缝每圈错一次；
      改成每张卡自带右外边距（--tm-gap），一份就是 N×(卡宽+间隙)，-50% 才是精确的一份。
   ② 第二份必须 aria-hidden —— 它是纯视觉复制，读屏会把六条评价念两遍。
   两排用同一批六条，只是起始顺序不同 + 方向相反：一排只放三条的话，
   一份宽度（约 1308）小于版心，接缝处会露出空档。 */
.mkf-tm{--tm-w:420px;--tm-dur:70s;--tm-gap:var(--s-2)}
/* 出血到版心边缘：整页 main 有 16 的水平内边距，这里抵消掉，卡片贴边被裁 */
.mkf-tm__row{overflow:hidden;margin-inline:calc(-1 * var(--gutter))}
.mkf-tm__row + .mkf-tm__row{margin-top:var(--tm-gap)}
.mkf-tm__track{display:flex;width:max-content;
  animation:tmScroll var(--tm-dur) linear infinite}
.mkf-tm__row--rev .mkf-tm__track{animation-direction:reverse}
.mkf-tm__set{display:flex}
@keyframes tmScroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.mkf-tm__card{flex:none;width:var(--tm-w);margin-right:var(--tm-gap);
  display:flex;flex-direction:column;gap:var(--s-4);
  padding:var(--s-5);border-radius:var(--r-md);
  background:var(--surface);border:1px solid var(--line);
  transition:var(--tr-tint)}
/* hover 只换卡片颜色，**不停滚动** —— 停下来会让两排失去同步感 */
.mkf-tm__card:hover{background:var(--surface-2);border-color:var(--line-strong)}
.mkf-tm__top{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--s-4)}
.mkf-tm__q{font-family:var(--font-display);font-size:var(--fs-4xl);line-height:.7;color:var(--surface-3)}
/* 五颗星是线上原样的文字字符，不是图标 —— 等 icon 库时可以换掉 */
.mkf-tm__stars{flex:none;font-size:var(--fs-sm);letter-spacing:var(--ls-wide);color:var(--accent)}
.mkf-tm__body{margin:0;font-size:var(--fs-lg);line-height:var(--lh-relaxed);color:var(--text)}
/* 卡片在一行里等高（flex 默认 stretch），署名靠 auto 压到卡底对齐 */
.mkf-tm__who{margin-top:auto;display:flex;align-items:center;gap:var(--s-3)}
.mkf-tm__ava{width:36px;height:36px;flex:none;border-radius:var(--r-full);
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--surface-2);font-size:var(--fs-sm);font-weight:600;color:var(--mute)}
/* 圆圈里放线上的真人头像。**留着字母那套样式不删** —— 头像取不到时它就是回退，
   而且 `overflow:hidden` 由 `border-radius` + 图片自身的 inherit 一起完成。 */
.mkf-tm__ava{overflow:hidden}
.mkf-tm__ava img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}
.mkf-tm__name{font-size:var(--fs-md);font-weight:600}

/* ══════════ 通栏展示位（Free, Personal AI Videos）══════════
   2026-08-23 按 Figma 72:161 重做。与上一版相比是一次大幅简化：

   删掉了整张紫色霓虹底图（.fp__bg）和为它换色的两层混合（.fp__tint）——
   原来那套是「图 grayscale+screen 压在纯黑上，再盖一层 accent multiply」，
   连带 isolation:isolate 和橙色外发光 box-shadow 一起去掉。
   现在的底就是一层 --surface（#171310），靠 1px --line 描边与页面底
   （--bg = --c-void #0B0907）分开，层次由两者的明度差给，不再靠发光。

   四张装饰图保留。它们在设计稿里是 --surface-3 色块占位（画布不画图片），
   代码里仍用真实素材；位置按 1568×320 逐个换算成百分比。
   注意右上那张（--tr）这一版从右侧挪到了左上角，不是微调。 */
.mkf-fp{position:relative;overflow:hidden;width:100%;
  aspect-ratio:1568/320;min-height:280px;border-radius:var(--r-xl);
  background:var(--surface);border:1px solid var(--line)}
/* min-height 是设计稿没有的、必须自己兜的一档：4.9 这个比例比上一版的 3.28 扁得多，
   纯按比例走，容器宽 977（1024 视口）时高只有 199，而内容自然高 208 —— 直接被裁。
   280 让容器 <1372 宽时改为锁高，各宽度下的上下余量落在 44–65px，与设计宽度下的
   65px 同量级。≤767 那档的 min-height:420px 写在后面的媒体查询里，会覆盖它。

   width:100% 不能省：min-height 一旦生效，aspect-ratio 会掉头用高去算宽，
   把容器撑成 280×4.9=1372 而不再跟随父容器，1024–1372 全段横向溢出。
   写死宽度方向后，比例只用来算高。 */
/* 容器在桌面必须 display:contents ——「消失」掉。四张图都是 absolute、
   本就不占位，但容器自身是 .fp__hd 的 flex 子项，留着会平白多出一个 gap。
   移动端它会变回真实的 flex 行，见 767 那档。 */
.mkf-fp__decos{display:contents}
/* 四张装饰图的百分比位置逐个照抄设计稿，改一个就对不上构图了。
   百分比的基准是 padding box（容器有 1px border），比设计稿的 border box
   两边各少 1px，实测偏差 ≤0.26%（≈0.8px）—— 是这个原因，不是抄错了。 */
.mkf-fp__deco{position:absolute;z-index:var(--z-over);display:block;height:auto;pointer-events:none;user-select:none}
.mkf-fp__deco--l {top:44.47%;left:7.18%;  width:13%}
.mkf-fp__deco--tr{top:8.12%; left:3.12%;  width:8.17%}
.mkf-fp__deco--r {top:8.09%; right:6.06%; width:10%}
.mkf-fp__deco--br{top:59.79%;left:75.85%; width:13%}
.mkf-fp__in{position:absolute;inset:0;z-index:var(--z-top);display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;pointer-events:none;
  gap:var(--s-4);padding:0}
.mkf-fp__hd{display:flex;flex-direction:column;align-items:center;width:100%;gap:14.4px}
.mkf-fp__logo{display:block;width:23.68%;aspect-ratio:527/108;object-fit:contain}
/* 字号是设计稿在 1568 下的定值，用 clamp 让窄一些的桌面等比退，上限锁在设计值 */
.mkf-fp__t{margin:0;font-family:var(--font-display);color:var(--accent);
  font-size:var(--fs-d-band);font-weight:700;line-height:var(--lh-display);letter-spacing:var(--ls-display)}
.mkf-fp__d{margin:0;max-width:960px;color:var(--text);
  font-size:var(--fs-lead);line-height:var(--lh-relaxed)}
/* 按钮区要能点，外层是 pointer-events:none */
.mkf-fp__btns{display:flex;align-items:center;justify-content:center;
  gap:var(--s-3);pointer-events:auto}

/* ══════════ 价格三路（Pricing Plans）══════════
   线上这块的三个按钮就是它的三件事：Pricing Plans Details / Enterprise Solutions /
   Affiliate Programs。所以三栏对应的是这三条路，不是 Free/Pro/Ultra 三个档
   （那三档在 /pricing/ 页上，是「第一条路」点进去之后的内容）。
   每栏顶一个真实数字：$0 forever / $0.20 per minute / 10% commission ——
   分别来自 /pricing/、/about-a2es-enterprise-plans/、/join-affiliate/。
   首页原有的三句话一句没丢：一句做段落副标题，另两句进了对应的卡。

   按钮靠 margin-top:auto 压到卡底对齐 —— 三段描述长短不一，只有这样按钮才齐。 */
.mkf-pr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
.mkf-pr__card{position:relative;display:flex;flex-direction:column;gap:var(--s-3);
  padding:var(--s-5);border-radius:var(--r-sm);
  background:var(--surface);border:1px solid var(--line);transition:var(--tr-tint)}
.mkf-pr__card:hover{border-color:var(--line-strong)}
/* 主推那条不描边，改用强调色内发光 —— 与 Seedance 通栏卡、Hero 重点卡同一套语言 */
.mkf-pr__card--hi{border-color:transparent}
.mkf-pr__card--hi:hover{border-color:transparent}
.mkf-pr__card--hi::after{content:"";position:absolute;inset:0;z-index:var(--z-base);pointer-events:none;
  border-radius:inherit;box-shadow:inset 0 0 var(--glow-blur) var(--accent)}
.mkf-pr__eyebrow{font-size:var(--fs-xs);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--faint)}
.mkf-pr__price{display:flex;align-items:baseline;gap:6px}
.mkf-pr__num{font-family:var(--font-display);font-size:var(--fs-5xl);line-height:1;
  font-weight:700;letter-spacing:var(--ls-display);color:var(--accent)}
.mkf-pr__unit{font-size:var(--fs-sm);color:var(--mute)}
.mkf-pr__d{margin:0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--mute)}
.mkf-pr__feats{margin:0;padding:var(--s-3) 0 0;list-style:none;
  display:flex;flex-direction:column;gap:var(--s-2);border-top:1px solid var(--line)}
.mkf-pr__feats li{display:flex;gap:var(--s-2);font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--mute)}
/* ✓ 是文字字符，不是图标 —— 等 icon 库时可以换掉 */
.mkf-pr__feats li::before{content:"\2713";flex:none;color:var(--accent)}
.mkf-pr__card .mkf-btn{margin-top:auto;width:100%}


/* ══════════ 常见问题（Makefun FAQ）══════════
   两栏：左边段头，右边折叠列表 —— 线上这块本来就是这个结构，
   而且用的就是原生 <details>/<summary>，这里照用（键盘与读屏白拿）。
   列表宽度收在 70ch：一行 100+ 字符的答案很难扫读，版心 1568 全铺会正好这样。 */
/* 左右按比例分，不写死 520 —— 写死的话 1024 那档会变成「左 520 / 右 440」，
   段头比内容还宽。1 : 1.9 在 1600 下正好是 530 / 1006。 */
.mkf-faq{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.9fr);gap:var(--s-6)}
/* 行内容走满右栏：问题文字撑开、+/− 顶到最右、答案也铺满，
   不留半途而废的留白（用户 2026-08-20 定）。右栏之所以不至于长到没法读，
   是靠**左栏加宽到 520** 把它压下来 —— 这两处是一件事，改一个要连着改另一个。 */
.mkf-faq__list{border-top:1px solid var(--line)}
.mkf-faq__i{border-bottom:1px solid var(--line)}
.mkf-faq__q{display:flex;align-items:flex-start;gap:var(--s-4);
  padding:var(--s-4) 0;cursor:pointer;list-style:none;
  font-size:var(--fs-lg);font-weight:600;line-height:var(--lh-normal);color:var(--text)}
.mkf-faq__qt{flex:1}
/* 两条都要写：Safari 认前者，其余浏览器认后者，少一条就会多出一个默认三角 */
.mkf-faq__q::-webkit-details-marker{display:none}
.mkf-faq__q::marker{content:""}
/* +/− 是文字字符，不是图标 —— 等 icon 库时可以换掉 */
.mkf-faq__q::after{content:"+";flex:none;color:var(--accent);font-size:var(--fs-xl);line-height:var(--lh-snug)}
.mkf-faq__i[open] .mkf-faq__q::after{content:"\2212"}
.mkf-faq__i[open] .mkf-faq__q{color:var(--accent)}
.mkf-faq__a{margin:0;padding:0 0 var(--s-4);
  font-size:var(--fs-md);line-height:var(--lh-relaxed);color:var(--mute)}

/* 正文里的内链 —— 全局 a 是 color:inherit + 无下划线（导航与按钮需要如此），
   所以散文里的链接必须单独给样式，否则**完全看不出来是链接**。 */
.mkf-faq__a a,.mkf-pr__d a{color:var(--accent);text-decoration:underline;
  text-underline-offset:2px;text-decoration-thickness:1px;
  text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-faq__a a:hover,.mkf-pr__d a:hover{text-decoration-color:var(--accent)}

/* ══════════ 快速链接（Explore more AI features）══════════
   照 a2e.com.cn 那块（.a2e-more / .a2e-btn--label）搬过来：居中标题 + 居中换行的标签云，
   容器收在 1080 —— 37 个标签铺满 1568 会摊成又宽又扁的一片，认不出行。
   标题按用户 2026-08-20 的要求去掉了，只剩标签云。
   标签样式沿用它那条规则（surface 底 / mute 字，hover 换 surface-2 + accent），
   只把变量名换成本页的。**这是全页唯一居中的段落**，因为它是收尾的导航区，
   不是内容区；其余段落一律左对齐的 .sec__hd。 */
/* 2026-08-23：从「1080 居中」改为「满版心左对齐」。
   居中 + max-width 1080 时是 5 行 9/10/9/7/2，末行只剩 2 个、空 798，
   孤零零吊在中间；放开到版心 1888 后收成 3 行 17/15/5，末行靠左，
   读起来像段落的最后一行。末行残缺消不掉 —— 37 个不等宽元素排到最后
   剩几个是算术决定的，能改的只是它残得难不难看。 */
.mkf-more__tags{display:flex;flex-wrap:wrap;justify-content:flex-start;
  gap:var(--s-2)}
.mkf-btn--label{background:var(--surface);color:var(--mute);
  transition:var(--tr-tint)}
.mkf-btn--label:hover{background:var(--surface-2);color:var(--accent)}

/* ══════════ 页脚（骨架照 a2e.com.cn 的 .a2e-foot，配色照 openart）══════════
   a2e-cn 那份是整块 accent 实底 + 黑字；换成 openart 的做法之后底色变成
   **上深下亮的渐变**（页面底色 → accent），底部压一个巨型 logo + 字标做背景。
   连带必须改的是**文字颜色**：渐变顶端接近页面底色，原来的黑字会看不见，
   所以全部改回常规的 --text / --mute / --faint。

   两处渐变都没有新增声明：
   ① 页脚底色复用全页那条唯一的 CSS 渐变声明（--fade-dir/--fade-to）；
   ② 字标同样复用它，加 background-clip:text 把渐变裁进字里。
   logo 是 SVG，裁不进去，所以它用 **SVG 自带的渐变元素**（写在标记里，
   不是 CSS 渐变），两者都做成「上透明 → 下实色」，接得上。

   折叠仍用原生 checkbox，不用 <details>：后者关闭时内容盒宽度为 0，
   桌面端没法用 CSS 强制展开，而这里要的正是「手机折叠、桌面常开」。 */
.mkf-foot{position:relative;overflow:hidden;color:var(--text);
  --fade-dir:180deg;--fade-to:var(--accent);
  padding:var(--s-8) var(--gutter) var(--s-5)}
/* ⚠ 这里是 `--wrap` **减掉两边 gutter**，不是 `--wrap` 本身。
   别处（.mkf-wrap / .mkf-nav__in / .mkf-ticker__in）都是「max-width:--wrap + 自带
   padding:0 --gutter」，盒宽 1920、内容 1888；而页脚的 gutter 加在**外层** .mkf-foot 上，
   内层若再写 max-width:--wrap 就变成内容 1920，比全页其余部分宽 32px。
   ⚠ 这个错**只在视口 ≥1952 时看得见** —— 窄屏下两者都被视口压到同一个值，
   1756 宽下量出来是齐的（2026-08-24 用户在宽屏上看出来的）。 */
.mkf-foot__in{position:relative;z-index:var(--z-base);
  max-width:calc(var(--wrap) - var(--gutter) * 2);margin:0 auto}
.mkf-foot__grid{display:grid;gap:var(--s-5) var(--s-5);align-items:start;
  grid-template-columns:minmax(200px,1fr) repeat(5,minmax(0,1fr))}
.mkf-foot__head{max-width:340px}
.mkf-foot__h{margin:0;font-family:var(--font-display);text-wrap:balance;
  font-size:var(--fs-d-foot);line-height:var(--lh-display);letter-spacing:var(--ls-display);}
.mkf-foot__about{margin:var(--s-4) 0 0;font-size:var(--fs-md);line-height:var(--lh-normal);color:var(--mute)}
.mkf-foot__nav{display:flex;flex-direction:column;gap:11px}
.mkf-foot__toggle{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.mkf-foot__toggle:focus-visible + .mkf-foot__title{outline:2px solid var(--accent);outline-offset:2px}
.mkf-foot__title{display:flex;align-items:center;justify-content:space-between;
  font-size:var(--fs-sm);line-height:1;color:var(--faint)}
/* 折叠箭头只在手机出现（a2e-cn 那份漏在了媒体查询外面，这里收进去） */
.mkf-foot__title::after{content:"";display:none;width:8px;height:8px;margin-left:var(--s-2);
  border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;
  transform:rotate(45deg) translate(-2px,-2px);transition:transform var(--t-base) ease}
.mkf-foot__toggle:checked + .mkf-foot__title::after{transform:rotate(-135deg) translate(-2px,-2px)}
.mkf-foot__links{display:flex;flex-direction:column;gap:11px}
.mkf-foot__link{font-size:var(--fs-lg);line-height:var(--lh-tight);color:var(--mute)}
.mkf-foot__link:hover{color:var(--text);text-decoration:underline}
/* 版权与政策那一行压在最底下、在巨型标记之下。那里底色已经接近纯 accent，
   常规的 --mute/--faint 在橙底上看不清，所以这一行整体换成 --accent-ink（黑）。 */
.mkf-foot__bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:var(--s-4) 28px;margin-top:var(--s-4);color:var(--accent-ink)}
.mkf-foot__meta{font-size:var(--fs-sm)}
.mkf-foot__bar .mkf-foot__meta{color:color-mix(in srgb, var(--accent-ink) 72%, transparent)}
.mkf-foot__bar .mkf-foot__link{color:var(--accent-ink)}
.mkf-foot__bar .mkf-foot__link:hover{color:var(--accent-ink)}
.mkf-foot__social{display:flex;flex-wrap:wrap;gap:26px}
.mkf-foot__social .mkf-foot__link{font-size:var(--fs-sm)}
/* 底部巨型标记。整块完整显示、不被页脚底边切。
   **align-items 用 baseline 不是 flex-end**：SVG 作为替换元素，它的基线就是自己的
   下边缘，所以基线对齐会让 logo 底边正好落在字标的基线上；再把字标缩到
   「M 的 cap 高 = logo 高」，两者的顶边也就自动齐了。用 flex-end 只能对齐盒子，
   而字标的盒子底边（line-height .8）和它的基线差着一大截。 */
.mkf-foot__mark{display:flex;align-items:baseline;justify-content:center;gap:.04em;
  margin:var(--s-7) 0 0;pointer-events:none;user-select:none}
.mkf-foot__glyph{width:.98em;height:auto;flex:none;color:var(--text)}
/* .912 = logo 高(.616em) ÷ Space Grotesk Bold 的 cap 比(.6758)，两个数都是实测的。
   改 logo 的 width 或换字体，这个数要跟着重算。 */
.mkf-foot__word{font-size:.912em}
/* 字号只写在 .foot__mark 上 —— 字标要按 .912em 相对缩小，
   一旦把 .foot__word 也列进来，clamp 会盖掉那条 em，字标就跟着 mark 一样大了。 */
.mkf-foot__mark{font-family:var(--font-display);font-weight:700;
  /* 字标缩小之后标记总宽从 4.87 × 字号降到约 4.53，所以字号相应放大 7.5%
     才能维持「占内容宽 92–95%」。329 的上限是给 1600 以上封顶的 ——
     版心到 1568 就不再涨，vw 继续涨的话标记会被两侧裁掉。 */
  font-size:var(--fs-mark);line-height:.8;letter-spacing:var(--ls-display);}
.mkf-foot__word{--fade-dir:180deg;--fade-to:var(--text);
  -webkit-background-clip:text;background-clip:text;color:transparent}

/* ══════════ Hero Rail — 卡片轨道 ══════════
   卡片形态：图在上、文字在下（不是文字压图）。 */
.mkf-feat{display:flex;gap:var(--hero-gap);overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x proximity;
  /* 关键：吸附点整体右移一个 --peek，否则 snap 会把 peek 吃掉、
     初始位置被吸回卡片边缘对齐（实测 2584 被吸到 2664）。 */
  scroll-padding-inline-start:var(--peek);
  padding-bottom:var(--s-2);scrollbar-width:none}
.mkf-feat::-webkit-scrollbar{display:none}
.mkf-card{flex:0 0 auto;width:var(--hero-w);scroll-snap-align:start;min-width:0}
.mkf-card__media{position:relative;aspect-ratio:16/9;border-radius:var(--r-sm);
  overflow:hidden;background:var(--surface)}
.mkf-card__media img,.mkf-card__media video{width:100%;height:100%;object-fit:cover;
  transition:transform var(--t-media) var(--ease-out)}
.mkf-card:hover .mkf-card__media img,.mkf-card:hover .mkf-card__media video{transform:scale(1.04)}
.mkf-card--hi .mkf-card__media::after{content:"";position:absolute;inset:0;pointer-events:none;
  border-radius:inherit;box-shadow:inset 0 0 var(--glow-blur) var(--glow-hi)}
/* hover 时发光在 32 ↔ 48 之间往复。alternate 负责「再变回去」，
   所以关键帧只写两端，不必手写三段。 */
@keyframes glowBreath{
  from{box-shadow:inset 0 0 var(--glow-blur) var(--glow-hi)}
  to  {box-shadow:inset 0 0 var(--glow-blur-hi) var(--glow-hi)}
}
.mkf-card--hi:hover .mkf-card__media::after,
.mkf-card--hi:focus-visible .mkf-card__media::after{
  animation:glowBreath 1.4s ease-in-out infinite alternate}
.mkf-card__pin{position:absolute;top:16px;right:16px;font-size:var(--fs-2xs);font-weight:700;
  line-height:1;padding:5px 7px;border-radius:var(--r-xs);
  background:var(--accent);color:var(--accent-ink)}
.mkf-card__t{font-family:var(--font-display);font-size:var(--fs-sm);font-weight:500;
  letter-spacing:var(--ls-caps);text-transform:uppercase;margin:var(--s-2) 0 2px}
.mkf-card__d{font-size:var(--fs-sm);color:var(--faint);margin:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ══════════ Hero Rail 控制条 ══════════
   无缝循环：真实卡整份克隆追加一次，滚过一整份宽度后把 scrollLeft 减掉一份，
   视觉上接不出缝 —— 所以永远单向前进，不回退也不反向。
   数值照 a2e.com.cn 线上实测：点 7px、当前点 34px、停留 5000ms。 */
/* ── 控制条：‹ + 进度点 + › ── */
.mkf-rail__nav{display:flex;align-items:center;justify-content:center;
  gap:var(--s-4);margin-top:var(--s-4)}
/* ⚠ padding / font 必须显式写死。主题给全站 <button> 发的是
   `padding:14.06px 26.1px; font-size:18.08px`（em 算出来的），我们只声明 width/height
   时它照样漏进来：border-box 下左右内边距合计 52.2px > width:32px，
   盒子被撑成 **54.2×32**（2026-08-23 实测，用户先看出来的）。
   高度没事纯属巧合 —— 上下 28.1px 恰好小于 32px。
   `03-reset.css` 有意不重置 `button`（`:where()` 特异性 0 压不过主题的 `button`），
   所以**每个自带的 button 组件都要自己写 padding**。`.mkf-rail__dot` 早就写了。 */
.mkf-rail__btn{width:32px;height:32px;flex:none;display:grid;place-items:center;
  padding:0;font:inherit;
  border-radius:var(--r-sm);border:1px solid var(--line-strong);background:transparent;
  color:var(--mute);cursor:pointer;
  transition:var(--tr-tint)}
.mkf-rail__btn:hover{color:var(--text);border-color:rgba(255,255,255,.3);background:var(--surface)}
.mkf-rail__btn svg{width:16px;height:16px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

.mkf-rail__dots{display:flex;align-items:center;gap:var(--s-2)}
/* tooltip 必须挂在外包一层上：.rail__dot 自己有 overflow:hidden（用来裁 fill 的方角），
   写在它身上的伪元素会被整个裁掉。
   wrapper 的上下 padding 顺便把 7px 的点扩成 27px 高的热区，
   配 -10px 的外边距抵消掉，视觉尺寸一点不变；横向不能这么做 ——
   负的横向外边距会把 flex 的 gap 吃掉，点就贴到一起了。 */
.mkf-rail__dotw{position:relative;display:inline-flex;padding:10px 0;margin:-10px 0}
.mkf-rail__dotw:hover,.mkf-rail__dotw:focus-within{z-index:var(--z-raise)}
.mkf-rail__dotw::after{content:attr(data-tip);position:absolute;z-index:var(--z-over);
  left:50%;bottom:100%;transform:translateX(-50%) translateY(4px);
  padding:6px 10px;border-radius:var(--r-sm);
  background:var(--surface-2);border:1px solid var(--line-strong);color:var(--text);
  font-size:var(--fs-xs);line-height:1;white-space:nowrap;
  opacity:0;pointer-events:none;transition:opacity var(--t-fast) ease,transform var(--t-fast) ease}
.mkf-rail__dotw:hover::after,.mkf-rail__dotw:focus-within::after{
  opacity:1;transform:translateX(-50%) translateY(0)}
/* 触屏上 :hover 会粘住，不给它 tooltip —— 那里也没有指针可悬停。 */
@media(hover:none){ .mkf-rail__dotw::after{content:none} }
.mkf-rail__dot{width:7px;height:7px;flex:none;padding:0;border:0;border-radius:var(--r-xs);
  overflow:hidden;position:relative;cursor:pointer;background:rgba(245,241,238,.26);
  transition:width var(--t-slow) var(--ease-out),background var(--t-base) ease}
.mkf-rail__dot[aria-current="true"]{width:34px;background:rgba(245,241,238,.18)}
/* 停留进度：横向填充。非当前点不画。 */
.mkf-rail__fill{display:none}
.mkf-rail__dot[aria-current="true"] .mkf-rail__fill{display:block;position:absolute;inset:0;
  background:var(--accent);transform-origin:left;transform:scaleX(0);
  animation:railFill var(--dwell,5000ms) linear forwards}
.mkf-rail__dots[data-autoplay="off"] .mkf-rail__fill{animation:none;transform:scaleX(1)}
/* 鼠标停在卡上时进度条也跟着停，否则条走完了却没翻页，读起来像坏了。
   用 data 属性而不是 JS 写内联 style —— 硬禁令第 1 条。 */
.mkf-rail__dots[data-paused="1"] .mkf-rail__fill{animation-play-state:paused}
@keyframes railFill{from{transform:scaleX(0)}to{transform:scaleX(1)}}

@media(prefers-reduced-motion:reduce){
  .mkf-tm__track{animation:none}
  .mkf-rail__dot[aria-current="true"] .mkf-rail__fill{animation:none;transform:scaleX(1)}
  .mkf-card--hi:hover .mkf-card__media::after,
  .mkf-card--hi:focus-visible .mkf-card__media::after{animation:none}
  .mkf-card:hover .mkf-card__media img,.mkf-card:hover .mkf-card__media video{transform:none}
}

/* ══════════ 断点 ══════════
   三个断点 1280 / 1024 / 768，照 higgsfield.ai 实测（在它自己的页面里插同源
   iframe 逐档量渲染宽度的众数，它的列数正切在这三处）—— 与 Tailwind 默认的
   xl / lg / md 完全重合。

   Hero Rail 的卡是定尺的，所以 1280 与 1024 两处**不需要改任何值** ——
   可见卡数自然从 4.00 降到 1.56，这正是「只改数量、不改尺寸」。
   空的媒体查询不写；后续组件（nav / ticker / 网格类）要用时再在这里补。
     ≥1920  4.00     1280  2.64     1024  2.10     768  1.56 */

/* 移动端：448 的卡在 390 屏（内容宽 358）根本放不下，换 272（16:9 → 高 153）。 */
/* 促销卡在 1280 以下转全宽：620 的固定宽会把右边挤到每列不足 200 */
@media(max-width:1279px){ .mkf-split{grid-template-columns:minmax(0,1fr)} }
/* 页脚：1280 以上是「标语列 + 5 组」；1024–1279 收成 4 列、标语独占一行；
   768–1023 两列；767 以下单列并折叠。a2e-cn 在 768–1023 是单列，
   那会让 19 条的 Tools 和 16 条的 Video Model 拉出很长一条，这里改成两列。 */
@media(max-width:1279px){
  .mkf-foot__grid{grid-template-columns:repeat(4,minmax(0,1fr))}
  .mkf-foot__head{grid-column:1 / -1;max-width:none}
}
/* 半宽里塞 3 列素材：版心收到 1600 后，1280 那档每格只剩 189，转单列铺开。
   与 .split 用同一个断点，不新增档位。 */
@media(max-width:1279px){
  .mkf-models{grid-template-columns:minmax(0,1fr)}
  .mkf-model--wide{grid-column:span 1}
  .mkf-model--wide .mkf-model__hd{flex-direction:column;align-items:stretch}
  /* 上一行把 align-items 从 center 换成 stretch（描述要满宽），定宽的标题图
     就此失去 flex 居中而贴左。text-align:center 救不了它 —— 全局 img{display:block}
     让它是块级，text-align 只管 inline 内容。块级居中只能靠 margin。 */
  .mkf-model--wide .mkf-model__logo{margin-inline:auto}
  .mkf-model--wide .mkf-model__wall{grid-template-columns:repeat(4,minmax(0,1fr))}
  .mkf-model--wide .mkf-model__cell:nth-child(n+9){display:none}
  /* 案例墙：列数降到 3，仍是三整行 + 一道切口，多的格子藏掉 */
  .mkf-gal__grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .mkf-gal__cell:nth-child(n+13){display:none}
  /* 降到四列后可见高度一并收到 760：1024 那档列宽只剩 242，
     v+s+h 一列才 808，撑不到 840 会在列尾露出空白。收高度比硬塞第四格划算。 */
  :root{--mas-h:min(760px, 62vw)}
  .mkf-mas__col:nth-child(n+5){display:none}
}

/* 菜单换汉堡的断点比其余移动端样式早一档。
   导航条内容实测 906 宽（16+126+24+431+24+269+16），1023 及以下就放不下了；
   更隐蔽的是 Video 那个 634 宽的下拉 —— 它 visibility:hidden 但仍是绝对定位的盒子，
   照样撑大 scrollWidth，768 时整页横向溢出 106px。
   banner / 字标 / Download 这些留在 767，平板宽度够放。 */
@media(max-width:1023px){
  .mkf-nav__menu{display:none}
  .mkf-mnav{display:block}
  .mkf-foot__grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* 三栏在 768 时每卡只剩 234 宽，长段落会摊成十几行 —— 直接转单栏 */
  /* 三档在 768 时每张只剩 234 宽，价格数字就顶到边了 —— 提前一档转单列 */
  .mkf-pr{grid-template-columns:minmax(0,1fr)}
  .mkf-faq{grid-template-columns:minmax(0,1fr);gap:var(--s-4)}
  .mkf-dev{grid-template-columns:minmax(0,1fr)}
  /* 中间档：比例放扁到 5:2，装饰图收起，只留顶部图标组 + 文案 + 按钮 */
  .mkf-fp{aspect-ratio:5/2}
  .mkf-fp__deco{display:none}
  .mkf-fp__in{gap:var(--s-5);padding:28px 40px}
  .mkf-fp__logo{width:420px;max-width:62%}
  .mkf-fp__t{font-size:var(--fs-d-band-m);line-height:var(--lh-tight)}
  .mkf-fp__d{font-size:var(--fs-lg)}
  :root{--mas-h:min(700px, 75vw)}
  .mkf-mas__col:nth-child(n+4){display:none}
  .mkf-model--wide .mkf-model__wall{grid-template-columns:repeat(3,minmax(0,1fr))}
  .mkf-model--wide .mkf-model__cell:nth-child(n+7){display:none}
}
@media(max-width:767px){
  :root{--hero-w:272px;--hero-gap:var(--s-4);--glow-blur:16px;--glow-blur-hi:24px}
  /* 单列时当前卡摆正中间，两侧露出的量相等，不再单边偏左。
     100% 在 scroll-padding 上就是轨道的 scrollport 宽度。
     ⚠ JS 的 origin 必须用同一个量，见 base() 里对 % 的处理。 */
  .mkf-feat{--peek:calc((100% - var(--hero-w)) / 2)}
  /* 导航只留：图形 logo + 汉堡 …… 语言 + Login。
     字标让位给「窄」，Download 让位给 banner。 */
  .mkf-banner{display:flex}
  .mkf-nav__in{gap:var(--s-3)}
  /* 移动端链接只留 "Learn more"；正文保留，随列宽折行 */
  .mkf-bnr__more-x{display:none}
  /* 用例卡三栏保留到 767 —— 更早转单栏会让 16:9 的素材涨到近 500 高，
     三张叠起来就是一屏半。转单栏只在真·移动端做。 */
  .mkf-uc{grid-template-columns:minmax(0,1fr)}
  .mkf-tm{--tm-w:300px}
  /* 卡高 262 → 207。跑马灯里卡片 flex 等高，高度由**整行最长的那张**决定
     （最长文案 146 字符），所以只看第一张会判断错。
     压到 4 行有两条路：卡宽加到 316，或正文降到 14px。选后者——
     前者要吃掉 16px peek 且只到 214，后者 peek 一点不动还更矮 7px。
     padding 24→16、gap 16→12 各再省 16 / 8。文案不截断。 */
  .mkf-tm__card{padding:16px;gap:var(--s-3)}
  .mkf-tm__body{font-size:var(--fs-md)}
  /* 页脚：渐变是 transparent → accent，桌面六列并排、文字全落在 t≤25% 的暗段，
     所以 --faint / --mute 够用；移动端纵向堆叠后同样的文字被推到 t=29–91%，
     底色已经很橙，--faint 在 69% 处只剩 1.40、展开链接后 42 处不达标。
     统一改 --text。注意黑字在这里更糟（全程最差 1.08）——
     底色亮度穿过了黑白的交叉点，单色盖不住整条渐变，白是较优的那个。
     最底 .foot__bar 仍用黑字：它在 91–96%，那里底色最橙，黑字 6.65。 */
  .mkf-foot__title{color:var(--text)}
  .mkf-foot__link{color:var(--text)}
  /* 线上原件在这一档换成竖版卡：装饰图与顶部图标组全部收起，按钮竖排铺满。
     比例**不照抄它的 343/420** —— 那是按 343 宽的手机算的，我们这一档最宽到 735，
     照抄会得到 735×900 的巨幅竖条。改成高度由内容定、只保底 420。 */
  /* 2026-08-23 按 Figma 95:162 重做 —— 移动端不再是「卡片」，是通栏内容：
     卡的底色 / 圆角 / 描边整个去掉，直接露页面底；装饰图从卡角的绝对定位
     改成内容流里的一行，夹在描述与按钮之间左右顶边；间距统一 16；按钮撑满。 */
  .mkf-fp{aspect-ratio:auto;min-height:0;border:0;border-radius:0;background:none;overflow:visible}
  .mkf-fp__in{position:relative;inset:auto;padding:0;gap:var(--s-4)}
  .mkf-fp__hd{gap:var(--s-4)}
  .mkf-fp__logo{display:none}
  .mkf-fp__decos{display:flex;align-items:center;justify-content:space-between;width:100%}
  /* position 必须显式改回 static —— 基础样式里它是 absolute，不改就还挂在卡角上 */
  .mkf-fp__deco{display:none;position:static;width:auto;height:80px}
  .mkf-fp__deco--l,.mkf-fp__deco--br{display:block}
  .mkf-fp__t{font-size:var(--fs-d-band-s);line-height:var(--lh-tight);letter-spacing:var(--ls-display)}
  .mkf-fp__d{font-size:var(--fs-sm)}
  .mkf-fp__btns{flex-direction:column;width:100%;max-width:none;gap:var(--s-4)}
  .mkf-fp__btns .mkf-btn{width:100%}
  /* 页脚每组折叠。全量 5 组在手机上摊开有 60 条，光 Tools 就 19 条。 */
  .mkf-foot__grid{grid-template-columns:minmax(0,1fr)}
  .mkf-foot__links{display:none}
  .mkf-foot__toggle:checked ~ .mkf-foot__links{display:flex}
  .mkf-foot__nav{padding-bottom:var(--s-3);
    border-bottom:1px solid var(--line)}
  .mkf-foot__title{padding-block:var(--s-3);cursor:pointer}
  .mkf-foot__title::after{display:block}
  .mkf-tiles{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(3,minmax(110px,1fr))}
  .mkf-model__wall,.mkf-model--wide .mkf-model__wall{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* 手机档是唯一的 3 行：2 列 × 3 行 = 6 格（其余断点都是 2 行）。
     6 格正好落在前 8 张真素材内，碰不到第 9/10 那两张 data-dup 的重复图。 */
  .mkf-model--wide .mkf-model__cell:nth-child(n+7){display:none}
  :root{--gal-peek:72px}
  .mkf-gal__more,.mkf-mas__more{padding:var(--s-7) 0 var(--s-5)}
  .mkf-gal__grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-gal__cell:nth-child(n+9){display:none}
  :root{--mas-h:min(560px, 140vw)}
  .mkf-mas__col:nth-child(n+3){display:none}
  .mkf-model__t{font-size:var(--fs-2xl)}
  .mkf-model:not(.mkf-model--wide) .mkf-model__hd{flex-direction:column;gap:var(--s-3);align-items:flex-start}
  .mkf-nav__word{display:none}
  .mkf-nav__right .mkf-btn--solid{display:none}
}

/* ══════════════════════════════════════════════════════════════════
   ↑ 以上全部与 _lab-higgs.html 逐字节相同（CSS / 图标库 / nav / 页脚 /
   抽屉 JS 原样搬来）。各类型页面都跑通之后，这条线以上就是要抽出去的共享壳。
   ↓ 以下是二级页的组件库。它是**跨页共用**的一份，不是这一页专有的 ——
   同一个组件在两页里各改各的，正是 aspect-ratio 那次歪掉的原因。
   ══════════════════════════════════════════════════════════════════ */

/* ══════════ 页头（.mh）══════════
   居中大标题 + 副标题，下面接「提示条 + CTA」（flux-2）或「按钮组 + 视频」（wan-3-0）。
   **不照搬线上那张紫色底图与 radial 光晕**：都属于旧紫色体系，而且 radial
   会让全页渐变声明从 2 变 3，破坏自检判据。要收敛色请改 --fade-to。 */
.mkf-mh{text-align:center}
/* H1 是全页最大的字：比 .fp__t（clamp 40/3.4vw/52）高一档，到此为止 ——
   再往上就是页脚字标那种尺寸，那是页脚专属的。 */
.mkf-mh__t{margin:0;font-family:var(--font-display);font-weight:700;
  font-size:var(--fs-d-hero);line-height:var(--lh-display);letter-spacing:var(--ls-display);
  text-wrap:balance}
.mkf-mh__sub{margin:var(--s-4) auto 0;max-width:760px;
  font-size:var(--fs-lead);line-height:var(--lh-relaxed);color:var(--mute)}
/* 徽标片。底色用 color-mix 跟着 --accent 走，不写死 rgba —— 与 nav 的
   .nav__tag 同一条路子。字色直接用 --accent 本身（对这个底 5.90，AA）。 */
.mkf-mh__badge{display:inline-flex;align-items:center;gap:var(--s-2);
  margin:0 0 var(--s-4);padding:5px 11px;border-radius:var(--r-full);
  background:color-mix(in srgb, var(--accent) 16%, transparent);
  color:var(--accent);font-size:var(--fs-xs);font-weight:600;
  letter-spacing:var(--ls-caps);text-transform:uppercase}
.mkf-mh__btns{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:var(--s-3);margin-top:var(--s-6)}
.mkf-mh__btns--after{margin-top:var(--s-6)}
.mkf-mh__media{margin-top:var(--s-7)}
/* hero 按钮下面那行小字免责说明。链接必须自己上色 ——
   共享壳的散文内链规则只挑 .faq__a a / .pr__d a，够不到 hero。 */
.mkf-mh__note{margin:var(--s-4) 0 0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--mute)}
.mkf-mh__note a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;
  text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-mh__note a:hover{text-decoration-color:var(--accent)}
/* 提示条宽度与副标题同为 760，两条的中轴与边界才对得齐。
   线上那张是 20 圆角 + 紫描边 + #110d29 底，这里换成本页语汇：
   surface 底 + --line 描边 + --r-md，按钮换成立体 CTA。 */
.mkf-mh__bar{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s-4);margin:var(--s-6) auto 0;max-width:760px;text-align:left;
  padding:var(--s-3) var(--s-3) var(--s-3) var(--s-5);
  border-radius:var(--r-md);background:var(--surface);border:1px solid var(--line)}
.mkf-mh__hint{margin:0;font-size:var(--fs-md);line-height:var(--lh-normal);color:var(--mute)}

/* ══════════ 段首/段尾导语（.lead）══════════
   居中一段，收在 960 —— 1888 全铺一行会到 190+ 字符。 */
.mkf-lead{margin:0 auto var(--s-5);max-width:960px;text-align:center;
  font-size:var(--fs-lead);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-lead--after{margin:var(--s-5) auto 0}
.mkf-lead--fine{font-size:var(--fs-sm);color:var(--faint)}   /* 线上那句 12px 的图注 */

/* ══════════ 素材条（.strip）══════════
   线上是 .pure-carousel：8 张整份克隆一次、匀速左移。这里照 .tm 那套做，
   两处不能省的做法完全一样：① 间距走卡片自己的 margin-right 而不是轨道的 gap
   —— 一份就是 N×(宽+隙)，translateX(-50%) 才是精确的一份，用 gap 会每圈错半个；
   ② 第二份必须 aria-hidden，否则读屏把 8 张图念两遍。

   ⚠ 尺寸是素材逼出来的，不是挑的：**8 张源图高度全是 324**，宽度
   182/324/182/309/291/324/162/182（合计 1956）—— 它们本来就是为「等高一条」
   做的。--strip-h 取 312 是源高 324 以内的最大整数档，再大就是放大糊图。
   一份宽 = 1956×(312/324) + 8×12 = 1979 > 版心上限 1920，接缝处不会露空档。 */
.mkf-strip{--strip-h:312px;--strip-gap:var(--s-3);overflow:hidden;
  margin-inline:calc(-1 * var(--gutter))}
.mkf-strip__track{display:flex;width:max-content;
  animation:stripScroll 60s linear infinite}
.mkf-strip__set{display:flex}
@keyframes stripScroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
/* ⚠ width:auto 要靠固有比例算宽，所以每张 <img> 都写了 width/height 属性
   （值就是上面那组实测尺寸）。不写的话图片加载完成前每张宽都是 0、整条轨道宽 0，
   接缝几何算不出来 —— 后台标签页里 lazy 图不请求，这个坑一测就撞上。
   首屏这 16 张因此也不写 loading="lazy"。 */
.mkf-strip__i{flex:none;height:var(--strip-h);width:auto;margin-right:var(--strip-gap);
  border-radius:var(--r-sm);object-fit:cover;background:var(--surface)}

/* ══════════ 视频带（.eng__media）══════════
   一段 16:9 的通栏视频。高度上限 840 不是挑的，是**首页已有的那条线**：
   瀑布流 --mas-h 的 px 那半就是 840，案例墙 .gal__grid 在 1920 下实测 916 ——
   这两个是全页最高的单块素材。16:9 铺满 1873 会是 1054，比它们高 15–25%，
   整段会被这一块压垮。所以按高度反推宽度上限：840 × 16/9 = 1493.3。
   1525 以下内容宽本来就不足 1493，这一条自动失效，不必为它加断点。
   --eng-h 写成带默认值的 var()，所以这个类**挂在哪儿都能用**（页头里也用）。 */
.mkf-eng{--eng-h:840px}
.mkf-eng__media{width:100%;max-width:calc(var(--eng-h, 840px) * 16 / 9);margin-inline:auto;
  height:auto;aspect-ratio:16/9;display:block;
  border-radius:var(--r-md);background:var(--surface);
  border:1px solid var(--line);object-fit:cover}
/* 1080×608 —— 比 16:9 略高一点点的源（character-animation 的 guide.mp4）。
   cover 会切掉上下各 ~2%，人物头顶正好在那条线上，所以按原比例排。 */
.mkf-eng__media--1080x608{aspect-ratio:1080/608;max-width:calc(var(--eng-h, 840px) * 1080 / 608)}
.mkf-eng__media--1944x1080{aspect-ratio:1944/1080;max-width:calc(var(--eng-h, 840px) * 1944 / 1080)}
/* landingpage_i2v.mp4 只有 640×480 —— 4:3 且源就这么小，按源宽封顶，别放大。 */
.mkf-eng__media--640x480{aspect-ratio:4/3;max-width:640px}

/* ══════════ 图文交替（.alt）══════════
   N 行，文与图左右互换。媒体可以是 <img> 也可以是 <video>（wan-3-0 那五行是视频）。 */
.mkf-alt{display:flex;flex-direction:column;gap:var(--s-7)}
.mkf-alt__row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:var(--s-7);align-items:center}
/* 偶数行图在左，用 order 而不是调换 HTML 顺序 —— 阅读顺序（先标题后图）
   要在所有断点上保持一致，单列时把 order 复位即可，不必写第二套标记。 */
.mkf-alt__row--rev .mkf-alt__media{order:-1}
.mkf-alt__t{margin:0;font-family:var(--font-display);font-weight:700;
  font-size:var(--fs-d-row);line-height:var(--lh-tight);letter-spacing:var(--ls-title);}
.mkf-alt__d{margin:var(--s-4) 0 0;font-size:var(--fs-lg);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-alt__cta{margin-top:var(--s-5)}
.mkf-alt__ul{margin:var(--s-4) 0 0;padding-left:1.25em;list-style:disc;
  font-size:var(--fs-md);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-alt__ul li + li{margin-top:var(--s-2)}
.mkf-alt__t a,.mkf-alt__d a,.mkf-alt__ul a{color:var(--accent);text-decoration:underline;
  text-underline-offset:2px;text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-alt__t a{color:inherit;text-decoration-color:color-mix(in srgb, var(--accent) 70%, transparent)}
.mkf-alt__t a:hover,.mkf-alt__d a:hover,.mkf-alt__ul a:hover{text-decoration-color:var(--accent)}
/* ⚠ height:auto 不能省，而且**恰恰是因为 <img> 上写了 width/height 属性**。
   属性是 presentational hint，会映射到 CSS 的 height；只要 height 不是 auto，
   aspect-ratio 就完全不参与计算 —— 表现是 css 里 aspect-ratio 明明是 16/9，
   实际盒子却是 920×988（源图 1742×988 的 height 原样当了像素值），
   16:9 的图被 cover 横向裁掉一大半。**computed style 里 aspect-ratio 显示正常，
   查 CSS 看不出来，只有量盒子才知道。** */
.mkf-alt__media{width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;
  border-radius:var(--r-md);border:1px solid var(--line);background:var(--surface)}

/* ══════════ 素材墙（.wall）══════════
   ⚠ 列数与宽度上限是**素材分辨率反推的**，不是版式偏好：
   wan-3-0 那 9 段素材是 768×432，DPR2 下每格最多 **384 CSS** 才不放大。
   于是 --band = 384×3 + 8×2 = **1168**，每格正好 384，DPR2 恰好 768 = 源宽。
   （第一版写 1200，算出来 394.7，超 2.8% —— 数字对不上就是没对上。）
   在 1888 里铺 5 列也是 364.8（同样合格），但 9 格排 5 列是 5+3+1 的残行；
   3 列正好 3×3。线上那版自己的注释算的也是这个数（它版心 1200、同样 3 列）。

   --band 是「比版心窄一档」的通用带宽，参数表也用它 —— 页面上因此只有两个
   非通栏尺度：960（散文）与 1168（宽带），不是每个组件各挑一个数。 */
.mkf-wall{--band:1168px;--wall-ar:16/9;
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-2);
  max-width:var(--band);margin-inline:auto}
.mkf-wall__cell{position:relative;aspect-ratio:var(--wall-ar);border-radius:var(--r-sm);
  overflow:hidden;background:var(--surface-2)}
.mkf-wall__cell video,.mkf-wall__cell img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform var(--t-media) var(--ease-out)}
.mkf-wall__cell:hover video,.mkf-wall__cell:hover img{transform:scale(1.04)}

/* ══════════ 对 .dev 卡片组的三处补丁 ══════════
   ① 表情当图标位：.dev__ico 原本挂在 <svg> 上（svg 认 width/height 属性），
      挂到 <span> 上要自己给字号与居中。**表情不是我们选的，是线上正文里的
      字符** —— 与首页那批 ★ ✓ − + 同一类占位，等 icon 库补齐时一起换。
   ② .dev__hd：有些卡比别的多一行小标题，标题与它的间距要比卡内其余元素紧一档。
      包一层比写负 margin 干净。
   ③ .dev--4：四列变体。 */
span.mkf-dev__ico{display:inline-flex;align-items:center;font-size:26px;line-height:1}
.mkf-dev__hd{display:flex;flex-direction:column;gap:var(--s-1)}
/* 小标（kicker）。`.alt__k` 与 `.dev__k` 共用一条 —— 同样的字号字重与 accent，
   **没有任何新数值**。营销版模型页的图文交替行大量带这种小标
   （"Intelligent Generations" / "Smart Text" 之类），线上是独立一行。 */
.mkf-dev__k,.mkf-alt__k{margin:0;font-size:var(--fs-sm);font-weight:600;color:var(--accent)}
.mkf-alt__k{margin-bottom:var(--s-2)}

/* 成对媒体位 —— 前后对照（Original / result）。工具页大量用这个形状：
   同一行里放两张图，左原图右结果。放在 .alt__row 的媒体格里，
   两个孩子仍然是 .alt__media，各自保持 16:9。零新增数值。 */
.mkf-alt__pair{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-2);align-items:start}

/* 合作方 logo 一排（voice-clone 的 Minimax / ElevenLabs / Cartesia 之类）。
   高度固定 + width:auto —— 与 .strip__i 同一个道理，**必须写 width/height 属性**，
   否则没有内在比例会塌成 0 宽。opacity 压一档，避免第三方 logo 抢主色。 */
.mkf-logos{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:var(--s-5) var(--s-7)}
.mkf-logos__i{height:44px;width:auto;opacity:.72}
.mkf-dev--4{grid-template-columns:repeat(4,minmax(0,1fr))}

/* ══════════ 参数表（.tbl）══════════
   宽内容必须在自己的容器里横向滚动，页面本身永远不横滚 —— 所以有 .tbl__wrap。
   第一列 nowrap 是有意的：参数名折行会让两列对不齐；窄屏靠 wrap 滚出去。 */
.mkf-tbl__wrap{--band:1168px;max-width:var(--band);margin-inline:auto;overflow-x:auto}
.mkf-tbl{width:100%;border-collapse:collapse;font-size:var(--fs-md);line-height:var(--lh-relaxed)}
.mkf-tbl th,.mkf-tbl td{padding:var(--s-3) var(--s-4);text-align:left;vertical-align:top;
  border-bottom:1px solid var(--line)}
.mkf-tbl thead th{font-family:var(--font-display);font-size:var(--fs-xs);font-weight:600;
  letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--accent);
  border-bottom:1px solid var(--line-strong)}
.mkf-tbl td:first-child{white-space:nowrap;color:var(--text);font-weight:600}
.mkf-tbl td:last-child{color:var(--mute)}

/* ══════════ 纯文字 + CTA（.cta）══════════ */
.mkf-cta{max-width:960px;margin-inline:auto;text-align:center;
  padding:var(--s-6);border-radius:var(--r-md);
  background:var(--surface);border:1px solid var(--line)}
.mkf-cta__d{margin:0;font-size:var(--fs-lead);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-cta__btns{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:var(--s-3);margin-top:var(--s-5)}

/* ══════════ 链接清单（.list）══════════
   共享壳里那条散文内链规则只挑了 .faq__a a 与 .pr__d a，够不到这里 ——
   全局 a 是 color:inherit + 无下划线，不单独给样式就**完全看不出是链接**
   （首页 10.5 节踩过）。新增散文段落一律要检查这一条。 */
.mkf-list{max-width:960px;margin:0 auto;padding:0;list-style:none;
  border-top:1px solid var(--line)}
.mkf-list li{padding:var(--s-4) 0;border-bottom:1px solid var(--line);
  font-size:var(--fs-lg);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-list a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;
  text-decoration-thickness:1px;
  text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-list a:hover{text-decoration-color:var(--accent)}

/* ══════════ 通栏背景视频页头（.mh--full）══════════
   骨架照 a2e.com.cn 的 .a2e-mhero--full（模型详情页首屏）。
   --nav-h 是实测值：导航条 52 + 1px 下边框 = 53。移动端顶上还有 48 的 banner，
   但它是 static、会随页面滚走，贴顶的只有 nav，所以两档共用同一个数。

   ⚠ **scrim 密度是量出来的，不是拍的。** 文字压在任意视频帧上，对比度不能靠运气：
   把 wan3-hero-hd.mp4 按 2fps 抽了 28 帧，逐帧取文案带（中央 50%×32%）的平均色，
   最亮的一帧是 #CD9C71（相对亮度 .3795）。按它反解：
       50% --bg → 合成 #6C533C → --text 对它 6.36  （AA，不到 AAA）
       55% --bg → 合成 #624B37 → --text 对它 7.25  ✔ AAA
   所以 wan-3-0 取 **55%**。
   ⚠ 这个数**只对那条素材成立**，不是对任意素材的上界 —— 纯白帧下 55% 只有 3.92。
   换视频必须重新抽帧量一遍，**而且第二页就验证了这不是空话**：
   image-to-video 的 hero 最坏帧是 #F0DBC5（L .7322，接近纯白），55% 下只有 4.91（AA），
   要 **68%** 才回到 AAA（7.50）。所以 scrim 做成 --scrim，**每页按自己的素材填实测值**。
   ⚠ 也因此，视频底上的副标题走不透明的 --text 而不是 --mute
   （--mute 对 55% 后的最坏帧只有 2.42，等于看不见）。 */
/* ⚠ 这一段**放在 <main class="wrap"> 之外**，紧跟 </nav>。
   放在 main 里的话它最宽只有版心 1920 —— 2560 屏上左右各留 320 的页面底，
   那就不叫全屏了。想在 main 里做只能靠 100vw + 负 margin，而 100vw **含滚动条**，
   会稳定横向溢出 15px；挪出去是唯一没有副作用的做法。
   --nav-h 是实测值：导航条 52 + 1px 下边框 = 53。移动端顶上还有 48 的 banner，
   但它是 static、会随页面滚走，贴顶的只有 nav，所以两档共用同一个数。 */
.mkf-sec.mkf-mh--full{padding-top:0}
.mkf-mh--full{--nav-h:53px;
  position:relative;overflow:hidden;
  min-height:calc(100svh - var(--nav-h));
  display:grid;place-items:center}
.mkf-mh__bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.mkf-mh__scrim{position:absolute;inset:0;pointer-events:none;
  background:color-mix(in srgb, transparent, var(--bg) var(--scrim, 55%))}
/* 辉光只做一圈内边，不画描边（通栏形态没有卡片边界）。用 box-shadow 不用渐变。 */
.mkf-mh__glow{position:absolute;inset:0;pointer-events:none;
  box-shadow:inset 0 0 var(--glow-hero) var(--glow-hero-spread) color-mix(in srgb, transparent, var(--accent) 10%)}
/* 每页按自己 hero 素材实测的 scrim 密度 —— 数字后面记的是「最坏帧 → 该密度下 --text 的对比度」。
   新做一页 hero 就在这里加一条，别复用别页的数字。 */
.mkf-mh--scrim35{--scrim:35%}   /* seedance-2-5       最坏帧 #7A695D (L .1503) → 7.90 AAA */
.mkf-mh--scrim55{--scrim:55%}   /* wan-3-0            最坏帧 #CD9C71 (L .3795) → 7.25 AAA */
.mkf-mh--scrim68{--scrim:68%}   /* image-to-video     最坏帧 #F0DBC5 (L .7322) → 7.50 AAA */
/* ↑ 三页三个值，跨度两倍多。seedance 那条素材本来就暗，30% 就够 AAA（7.36），
   照 55% 压会把它压成一块黑；image-to-video 那条接近纯白，55% 只有 4.91。
   **没有一个通用值**，每做一页 hero 必须重新抽帧量。 */
.mkf-mh__fade{position:absolute;left:0;right:0;bottom:0;height:24%;pointer-events:none}
.mkf-mh__body{position:relative;z-index:var(--z-raise);max-width:760px;margin-inline:auto;
  padding:var(--s-7) var(--gutter) var(--s-8);
  display:flex;flex-direction:column;align-items:center;gap:var(--s-4);text-align:center}
.mkf-mh--full .mkf-mh__t,.mkf-mh--full .mkf-mh__badge{margin:0}
.mkf-mh--full .mkf-mh__sub{margin:0;max-width:56ch;color:var(--text)}
.mkf-mh--full .mkf-mh__btns{margin-top:var(--s-2)}

/* ══════════ 全页新增的第 3 条渐变声明 ══════════
   页头底缘淡出与跑马灯左右两侧共用这一条，方向走自定义属性。
   写法照共享壳里那条 --fade-to（**每个使用者自己声明方向**，不在 :root 上替换 ——
   自定义属性的 var() 在声明它的元素上替换，写 :root 会让所有使用者拿到同一个值
   且不报错，CLAUDE.md 里 --*-tint 那个坑）。
   ⚠ 注意这段注释本身踩过一次：原来写的是「判据从 0/0/2/4 变成 0/0/3/4」，
   但当时给数字加了星号强调，于是出现 `*` 紧跟 `/` 的组合，**提前关掉了注释**，
   把紧跟其后的这条渐变规则整个吃掉 —— CSSOM 里查不到它、页面上渐隐层全空，
   而 CSS 文件看着完全正常。判据现在是 0 / 0 / 3 / 4。 */
.mkf-mh__fade,.mkf-mq__fade{background:linear-gradient(var(--fd, 180deg), transparent, var(--bg))}
.mkf-mq__fade--l{--fd:270deg}
.mkf-mq__fade--r{--fd:90deg}

/* ══════════ 素材跑马灯（.mq）══════════
   骨架照 a2e.com.cn 的 .a2e-showcase：两行反向匀速滚动 + 左右边缘渐隐。
   两处做法与首页 .tm 一致，都不能省：
   ① 间距走 set 自己的 margin-right，不用轨道的 gap —— 一份就是 N×(宽+隙)，
      translateX(-50%) 才是精确的一份，用 gap 会每圈错半个；
   ② 第二份必须 aria-hidden，否则读屏把素材念两遍。

   ⚠ **两行都放全部 9 条**，只是起始顺序不同 + 方向相反。分成 5+4 的话
      第二行一份宽 4×396=1584 < 版心 1920，接缝处会露空档 —— 首页 .tm 的注释
      写着同一件事（"一排只放三条的话…接缝处会露出空档"）。
   ⚠ 格宽 384 是素材反推的：源 768×432，DPR2 下 384 正好 1:1，与 .wall 同一个数。
   边缘渐隐用一层 --bg 渐变盖上去，**不用 mask-image** —— 轨道本身是 transform，
   父级一带 mask 就会把子级提升为独立合成层，圆角裁剪当场失效（a2e 那边踩过）。 */
.mkf-mq{position:relative;margin-inline:calc(-1 * var(--gutter))}
.mkf-mq__row{display:flex;overflow:hidden}
.mkf-mq__row + .mkf-mq__row{margin-top:var(--s-3)}
.mkf-mq__track{display:flex;width:max-content;
  animation:mqScroll var(--mq-dur, 90s) linear infinite;
  animation-play-state:var(--mq-play, running)}
.mkf-mq__row--rev .mkf-mq__track{animation-direction:reverse}
.mkf-mq__row:hover{--mq-play:paused}
.mkf-mq__set{display:flex}
@keyframes mqScroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.mkf-mq__tile{flex:none;width:var(--mq-w, 384px);margin-right:var(--s-3);
  aspect-ratio:16/9;border-radius:var(--r-sm);overflow:hidden;background:var(--surface-2)}
.mkf-mq__tile video,.mkf-mq__tile img{width:100%;height:100%;object-fit:cover;display:block}
.mkf-mq__fade{position:absolute;top:0;bottom:0;width:120px;pointer-events:none;z-index:var(--z-raise)}
.mkf-mq__fade--l{left:0}
.mkf-mq__fade--r{right:0}

/* ══════════ 文档段的脊（.doc）══════════
   用户 2026-08-23 看了下半页：「排版、布局、分块都堆叠在一起，不整齐」。
   量出来根因不是间距，是**同一屏里有四个不同的左边缘**：
   段标题在版心左沿 36、导语居中 960、卡片组通栏 1888、表格居中 1168、
   CTA 与清单居中 960 —— 每一段的起止 x 都不一样。
   解法是给这些段一条统一的脊：左栏放标题+导语，右栏放内容，
   比例照共享壳里已有的 .faq（1 : 1.9），于是全页只剩两个左边缘。
   左栏 sticky，长段落滚动时标题跟着走。 */
.mkf-doc{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.9fr);gap:var(--s-6)}
.mkf-sec.mkf-sec--doc{padding-top:var(--s-7)}
.mkf-doc__hd{position:sticky;top:calc(53px + var(--s-5));align-self:start}
/* 脊里的导语左对齐、不再自己收窄 —— 收窄交给左栏本身（1888 下 640）。 */
.mkf-lead--start{text-align:left;margin:var(--s-3) 0 0;max-width:none}
/* 右栏里的块一律满栏，取消它们各自的居中收窄 —— 那正是四个左边缘的来源。 */
.mkf-doc__bd .mkf-tbl__wrap,.mkf-doc__bd .mkf-cta,.mkf-doc__bd .mkf-list{max-width:none;margin-inline:0}
/* 4 条一组的卡在脊里排 2×2（右栏 1216 → 每张 600），不是挤成 4×292。 */
.mkf-dev--2{grid-template-columns:repeat(2,minmax(0,1fr))}
/* 通栏媒体段的段头居中，与脊段的左对齐分成两种明确的模式，不混用。 */
.mkf-sec__hd--center{justify-content:center;text-align:center}

/* ══════════ 页头里的促销条与特性行（.mh__promo / .mh__feats）══════════
   线上是 hero 视频下面一张紫描边的小卡：左边一句话、右边一颗按钮，下面一行特性。
   ⚠ 线上那颗 Upgrade 按钮**没有 href**（死按钮），这里照原样保留、没有替用户补链接。
   ⚠ 特性行在线上是一个 <p> 里用多个空格分隔的四段文字，没有任何分隔标记。
      这里拆成四个 <span> 排成一行 —— 是排版决定，一个词没改。 */
.mkf-mh__promo{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:var(--s-3);width:100%;max-width:560px;
  padding:var(--s-2) var(--s-2) var(--s-2) var(--s-4);
  border-radius:var(--r-sm);border:1px solid var(--line-strong);
  background:color-mix(in srgb, transparent, var(--bg) 55%)}
.mkf-mh__promo p{margin:0;font-size:var(--fs-md)}
.mkf-mh__feats{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--s-2) var(--s-4);
  margin:0;padding:0;list-style:none;font-size:var(--fs-sm);color:var(--text)}
.mkf-mh__feats li{display:inline-flex;align-items:center;gap:7px}
.mkf-mh__feats li::before{content:"";width:4px;height:4px;flex:none;
  border-radius:var(--r-full);background:var(--accent)}

/* ══════════ 卡片里的媒体位与内链（.dev__media / .dev__d a）══════════
   卡顶一块 16:9 素材。放在 .dev__card 的第一个子元素，靠负内边距顶到卡边。 */
.mkf-dev__media{display:block;height:auto;aspect-ratio:var(--dev-ar, 16/9);object-fit:cover;
  /* ⚠ max-width:none 不能省 —— 共享壳里有一条 img{max-width:100%}，
     会把下面这个「内容宽 + 两侧内边距」的出血宽度卡回内容宽（实测 611.7 被压回 563.7）。 */
  width:calc(100% + var(--s-5) * 2);max-width:none;
  margin:calc(-1 * var(--s-5)) calc(-1 * var(--s-5)) 0;
  border-radius:var(--r-sm) var(--r-sm) 0 0;background:var(--surface-2)}
/* 卡正文里的内链 —— 共享壳那条只挑了 .faq__a a 与 .pr__d a，够不到这里。
   全局 a 是 color:inherit + 无下划线，不给样式就完全看不出是链接（首页 10.5 节）。 */
/* 图表类素材**保持自身比例**，不裁。
   ⚠ 第一版写死成 `--dev-ar:1128/822`，那是 seedance-1.5 那两张雷达图的尺寸；
   到了 seedream-4.5 的雷达图（1280×1160）就又不对了。写死一个数只能服务一页。
   改成 `aspect-ratio:auto` + `height:auto`：比例交给图片自己的 width/height 属性，
   任何画幅都对 —— 前提是**属性必须写**（首页踩过，见 03-reset.css 的注记）。 */
.mkf-dev__media--chart{--dev-ar:auto;height:auto;object-fit:contain;background:var(--surface)}
.mkf-dev__d a,.mkf-ex__p a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;
  text-decoration-thickness:1px;
  text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-dev__d a:hover,.mkf-ex__p a:hover{text-decoration-color:var(--accent)}

/* ══════════ 例子行（.ex）══════════
   线上是「输入图 + 提示词」对「结果视频」的四组对照。布局直接复用 .alt__row，
   只多两条：输入图收在源宽 640 以内（放大就糊了），提示词跟在它下面。 */
.mkf-ex__in{display:block;width:100%;max-width:640px;height:auto;aspect-ratio:16/9;
  object-fit:cover;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--surface)}
.mkf-ex__p{margin:var(--s-3) 0 0;max-width:640px;font-size:var(--fs-md);line-height:var(--lh-relaxed);color:var(--mute)}

/* ══════════ .wall / .alt 的两个画幅开关 ══════════
   ⚠ 画幅必须跟真实素材对上。image-to-video 的 Effects 那四条是**竖版**
   （视频 1080×1926，不是 poster 那个 800×1421 —— 差 0.4%，以视频为准），
   照 16:9 排会把人裁掉一半。
   ⚠ 尺寸要按**视频**的分辨率算，不是按 poster：这一页 poster 只有 800 宽，
   但视频是 1920×1080 / 1080×1926。通栏 1888 下每格 466，DPR2 需 932 < 1080，够清。 */
.mkf-wall--4{grid-template-columns:repeat(4,minmax(0,1fr))}
.mkf-wall--full{--band:none}
.mkf-wall--v{--wall-ar:1080/1926}
.mkf-wall--9x16{--wall-ar:9/16}                 /* ai-avatars 的 Aa-1..6.mp4 1080×1920 */
.mkf-wall--712x1280{--wall-ar:712/1280}         /* talking-video 的 misic/music 712×1280 */
.mkf-wall--480x852{--wall-ar:480/852}           /* ai-avatar-api 的四条 talking photo 样片 */
.mkf-wall--6{grid-template-columns:repeat(6,minmax(0,1fr))}
/* 非 16:9 的素材：画幅按实测写死，并且不放大过源宽。
   ⚠ 别用 `aspect-ratio:auto; width:auto` 来「让它自己决定」——
   <img> 的 width/height 属性是**映射成 aspect-ratio** 的，把 aspect-ratio 设成 auto
   等于把属性给的那个比例也一起清掉；图片没加载完时就没有任何固有尺寸，
   盒子塌成 0×0（加 1px 描边后实测 **2×2**）。这和「属性顶掉 aspect-ratio」是同一枚硬币的两面。
   所以每种画幅在这里写一条，像上面的 scrim 预设一样按素材实测。 */
.mkf-alt__media--api{aspect-ratio:575/528;max-width:575px;margin-inline:auto}   /* Api-pic.png 575×528 */
.mkf-alt__media--vc{aspect-ratio:1706/1080}                                 /* VC-1/2.jpg 1706×1080，非 16/9，用原比例免裁切 */
.mkf-alt__media--43{aspect-ratio:4/3;max-width:478px;margin-inline:auto}    /* 0807-5.mp4 478×360，源就这么小，不放大 */
.mkf-alt__media--v{aspect-ratio:9/16}                                       /* 竖构图（v2v-why3/3.1.mp4 720×1280） */

/* ══════════ 口碑卡的静态排法（.tm__grid）══════════
   首页那套是无限滚动的跑马灯（.tm__row/__track/__set）。product-avatar 只有四条、
   且带职位行，滚动没有意义 —— 复用卡壳 .tm__card，只换外层排布。 */
.mkf-tm__grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--tm-gap)}
.mkf-tm__grid .mkf-tm__card{width:auto;margin-right:0}
.mkf-tm__grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}

/* ══════════ 品牌资源页（.sw 色卡 / .brand 标志下载）══════════
   媒体资源页只写「怎么用」，不写为什么这么定 —— 推导在 design/ 的规范里。 */
.mkf-sw{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s-4)}
.mkf-sw__i{border-radius:var(--r-md);border:1px solid var(--line);background:var(--surface);overflow:hidden}
/* 色块高度写死 —— 比例没有意义，要的是一眼可比。 */
.mkf-sw__chip{height:104px;display:block}
/* 色块的底色走类不走内联 style —— 全页禁内联 style。 */
.mkf-sw__chip--orange{background:var(--c-orange)}
.mkf-sw__chip--blue{background:var(--c-blue)}
.mkf-sw__chip--amber{background:var(--c-amber)}
.mkf-sw__chip--cream{background:var(--c-cream)}
/* 深色三格与页面底几乎同色，不描边就看不出边界在哪。 */
.mkf-sw__chip--void{background:var(--c-void);box-shadow:inset 0 0 0 1px var(--line)}
.mkf-sw__chip--night{background:var(--c-night);box-shadow:inset 0 0 0 1px var(--line)}
.mkf-sw__chip--text{background:#F5F1EE}
.mkf-sw__chip--mute{background:var(--c-mute-dark)}
.mkf-sw__bd{padding:var(--s-3) var(--s-4) var(--s-4)}
.mkf-sw__n{margin:0;font-size:var(--fs-md);font-weight:600}
/* 十六进制值用等宽，且**大写** —— 复制粘贴时肉眼对得上。 */
.mkf-sw__hex{margin:2px 0 0;font-family:var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
  font-size:var(--fs-sm);letter-spacing:.04em;color:var(--mute);text-transform:uppercase}
.mkf-sw__use{margin:var(--s-2) 0 0;font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--faint)}

.mkf-brand{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
.mkf-brand__i{display:flex;flex-direction:column;gap:var(--s-3);
  padding:var(--s-5);border-radius:var(--r-md);border:1px solid var(--line);background:var(--surface)}
/* 预览底色跟着变体走：白色标志必须放在深底上、黑色标志放在浅底上，
   否则「有没有这个文件」根本看不出来。 */
.mkf-brand__pv{display:flex;align-items:center;justify-content:center;
  min-height:132px;padding:var(--s-5);border-radius:var(--r-sm);background:var(--bg)}
.mkf-brand__pv--lite{background:var(--c-cream)}
.mkf-brand__logo{width:100%;max-width:180px;height:auto;display:block}
.mkf-brand__n{margin:0;font-size:var(--fs-md);font-weight:600}
.mkf-brand__dl{display:flex;flex-wrap:wrap;gap:var(--s-2);margin-top:auto}

/* ══════════ 数字条（.stat）与 about 的机构徽标 ══════════ */
.mkf-stat{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s-5) var(--s-6)}
.mkf-stat__n{margin:0;font-family:var(--font-display);font-weight:700;
  font-size:var(--fs-2xl);line-height:1.1;color:var(--accent)}
.mkf-stat__d{margin:var(--s-1) 0 0;font-size:var(--fs-md);line-height:var(--lh-normal);color:var(--mute)}
/* 徽标是 300×300 的方图，但画面内容只占中间一条 —— 按线上给的 262 宽排，别铺满整栏。 */
.mkf-about__logo{display:block;width:100%;max-width:262px;height:auto;margin-inline:auto}

/* ══════════ 第三方看板嵌入（.embed）══════════
   iframe 的 src 与高度原样保留，这一层只负责描边与圆角。 */
.mkf-embed{border-radius:var(--r-md);border:1px solid var(--line);overflow:hidden;background:var(--surface)}
.mkf-embed iframe{display:block;width:100%;border:0}

/* ══════════ 一排标签式链接（.chips）══════════
   FAQ 分类页在线上是一行用「·」分隔的纯文本链接。拆成按钮是排版决定，
   链接与文字一个字没改 —— 这条写在页面的注释里，别只留在这。 */
.mkf-chips{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--s-3)}

/* ══════════ 套餐卡（.plan）══════════
   四档并排。线上是 wp:columns 加一段 12 条 !important 的 <style> 拉等高 ——
   grid 的 stretch 本来就是默认值，那段补丁在这里没有对象可打。
   分组之间用上边框分隔（线上是 <hr>），所以第一组不画线。 */
.mkf-plan{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s-4);align-items:stretch}
.mkf-plan__i{display:flex;flex-direction:column;gap:var(--s-3);
  padding:var(--s-5);border-radius:var(--r-md);border:1px solid var(--line);background:var(--surface)}
.mkf-plan__i--b{border-color:var(--line-strong)}
.mkf-plan__n{margin:0;font-family:var(--font-display);font-size:var(--fs-lg);font-weight:600}
.mkf-plan__p{margin:0;font-family:var(--font-display);font-size:var(--fs-2xl);
  font-weight:700;line-height:1.1;color:var(--accent)}
.mkf-plan__per{font-size:var(--fs-sm);font-weight:400;color:var(--mute)}
.mkf-plan__cta{align-self:stretch}
.mkf-plan__bonus{margin:0;font-size:var(--fs-sm);color:var(--mute)}
.mkf-plan__bonus a{color:var(--accent);text-decoration:none}
.mkf-plan__grp{padding-top:var(--s-3);border-top:1px solid var(--line)}
.mkf-plan__grp:first-of-type{padding-top:0;border-top:0}
.mkf-plan__f{margin:0;font-size:var(--fs-sm);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-plan__f + .mkf-plan__f{margin-top:var(--s-2)}
.mkf-plan__f strong{color:var(--text)}
.mkf-plan__f a{color:var(--accent);text-decoration:underline;text-underline-offset:2px}
.mkf-plan__ul{margin:0;padding-left:1.1em;list-style:disc}
.mkf-plan__ul li + li{margin-top:4px}

/* 套餐对比表：39 个功能行 × 4 列，比常规表宽，放开 --band 走整个版心。 */
.mkf-tbl__wrap--wide{--band:none}
.mkf-tbl--plans th[scope="row"]{white-space:normal;color:var(--text);font-weight:600;width:22%}
.mkf-tbl--plans td{color:var(--mute);vertical-align:top}

/* ══════════ 博客列表（.posts）══════════
   列表本身是 Gutenberg 的 wp:query 动态块，标记由 WordPress 渲染 ——
   **我们不能改它的标记**（改了博客就不再自动收新文章），只能从外面挂样式。

   为什么这里可以直接选 .wp-block-* ：makefun 的 CSS **没有用 @layer**
   （a2e-cn 才有），所以就是普通层叠，`body.mkf-lp .wp-block-post-title`
   的 (0,2,1) 压得过主题那些 `:where()` 的 (0,0,x)，一条 !important 都不用。
   ⚠ 别把这套搬去 a2e-cn —— 那边分了层，分层是主动降权，选择器再具体也没用。 */
body.mkf-lp .mkf-posts .wp-block-post-template{display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-6) var(--s-5);
  margin:0;padding:0;list-style:none}
body.mkf-lp .mkf-posts .wp-block-post{width:auto;margin:0}
body.mkf-lp .mkf-posts .wp-block-post-featured-image{margin:0 0 var(--s-3)}
body.mkf-lp .mkf-posts .wp-block-post-featured-image img{width:100%;height:auto;
  aspect-ratio:16/9;object-fit:cover;border-radius:var(--r-sm);display:block;
  background:var(--surface-2)}
body.mkf-lp .mkf-posts .wp-block-post-date{margin:0;font-size:var(--fs-sm);color:var(--faint)}
/* 字号跟 .dev__t 一档（--fs-xl 18px），不是 --fs-lg —— 同一页上面就是三张
   .dev 卡，文章标题小一档会读成两个层级。 */
body.mkf-lp .mkf-posts .wp-block-post-title{margin:var(--s-1) 0 0;
  font-family:var(--font-display);font-size:var(--fs-xl);font-weight:600;
  line-height:var(--lh-tight)}
body.mkf-lp .mkf-posts .wp-block-post-title a{color:var(--text);text-decoration:none}
body.mkf-lp .mkf-posts .wp-block-post-title a:hover{color:var(--accent)}
body.mkf-lp .mkf-posts .wp-block-post-excerpt{margin:var(--s-2) 0 0}
body.mkf-lp .mkf-posts .wp-block-post-excerpt p{margin:0;font-size:var(--fs-md);
  line-height:var(--lh-relaxed);color:var(--mute)}
body.mkf-lp .mkf-posts .wp-block-post-excerpt a{color:var(--accent)}
body.mkf-lp .mkf-posts .wp-block-query-pagination{display:flex;flex-wrap:wrap;
  align-items:center;justify-content:center;gap:var(--s-3);
  margin-top:var(--s-7);font-size:var(--fs-md)}
body.mkf-lp .mkf-posts .wp-block-query-pagination a{color:var(--mute);text-decoration:none}
body.mkf-lp .mkf-posts .wp-block-query-pagination a:hover{color:var(--accent)}
body.mkf-lp .mkf-posts .wp-block-query-pagination-numbers .current{color:var(--accent);font-weight:600}
.mkf-tm__id{display:flex;flex-direction:column;gap:2px;min-width:0}
.mkf-tm__role{font-size:var(--fs-sm);line-height:var(--lh-normal);color:var(--mute)}

/* ══════════ 长文正文（.prose）与截图（.shot）══════════
   给教程 / 政策这类「一段标题 + 一堆段落列表 + 若干截图」的内容用。

   行长收在 66ch：右栏 1216 全铺一行 160+ 字符，排版建议 45–90。
   ⚠ **ch 不等于字符**：Inter 的 "0" 比平均字宽窄，74ch(699px) 实测是 **88 字符/行**，
   压在建议区间的上沿。收到 66ch(624px) 实测 78 字符，落在中段。这个换算量过才算数。
   ⚠ **截图不收在这个行长里**，它是 .doc__bd 的直接子元素、铺满右栏 ——
   界面截图里的字要能看清，跟着正文收窄就白截了。
   所以正文与截图在标记上是**兄弟**，不是嵌套。 */
.mkf-doc__bd > * + *{margin-top:var(--s-5)}
.mkf-prose{max-width:66ch;font-size:var(--fs-lg);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-prose > * + *{margin-top:var(--s-4)}
.mkf-prose p{margin:0}
.mkf-prose ul{margin:0;padding-left:1.25em;list-style:disc}
.mkf-prose li{margin:0}
.mkf-prose li + li{margin-top:var(--s-2)}
.mkf-prose strong{color:var(--text);font-weight:600}
.mkf-prose em{font-style:normal;color:var(--text)}
/* 散文里的链接必须自己给样式 —— 全局 a 是 color:inherit + 无下划线（首页 10.5 节）。 */
.mkf-prose a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;
  text-decoration-thickness:1px;
  text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-prose a:hover{text-decoration-color:var(--accent)}
.mkf-prose--center{margin-inline:auto}
.mkf-prose--after{margin-top:var(--s-6)}
.mkf-prose__h3{margin:0;font-family:var(--font-display);font-weight:700;
  font-size:var(--fs-2xl);line-height:var(--lh-snug);letter-spacing:var(--ls-title);color:var(--text)}
.mkf-prose__h4{margin:0;font-size:var(--fs-lg);font-weight:600;color:var(--text)}
/* 锚点跳转时别被贴顶的导航条盖住标题 —— 53 是导航实测高。 */
.mkf-prose__h3[id],.mkf-prose__h4[id],.mkf-prose p[id],.mkf-doc__hd [id]{scroll-margin-top:calc(53px + var(--s-5))}
/* 界面截图。画幅走 <img> 的 width/height 属性（值从线上 URL 的 ?resize=W,H 里取），
   **不写 aspect-ratio 也不写 width:auto** —— 前者会被属性顶掉、后者会连属性给的比例
   一起清空，两个坑都记在上面。 */
.mkf-shot{display:block;width:100%;height:auto;
  border-radius:var(--r-sm);border:1px solid var(--line);background:var(--surface)}
.mkf-shot--604{max-width:604px}   /* results.jpeg 604×413 —— 铺满右栏是 2× 放大 */

/* ══════════ 操作步骤（.steps）══════════
   ⚠ 这是**转写层**的产物，不是样式补救：线上把步骤存成了一串以 "1." "2." 开头的
   普通段落（10 处）、把要点存成了一串以 "•" 开头的普通段落（25 处），
   还把连续的一套步骤按插图位置拆成了三个各自独立的 <ul>。
   照原样渲染就是一屏没有结构的文字 —— 用户 2026-08-23 的原话是「文字堆砌」。
   所以先把块归一化（连续圆点段 → 一个 ul、连续编号段 → 一个 ol、编号里剥掉字面数字），
   再交给这里出序号。序号走 CSS 计数器，插图因此可以落在某一步**里面**而不打断编号。 */
.mkf-steps{counter-reset:step;list-style:none;margin:0;padding:0}
.mkf-steps > li{counter-increment:step;position:relative;padding-left:44px}
.mkf-steps > li + li{margin-top:var(--s-5)}
.mkf-steps > li::before{content:counter(step);position:absolute;left:0;top:-1px;
  width:28px;height:28px;border-radius:var(--r-full);
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--surface-2);color:var(--accent);
  font-family:var(--font-display);font-size:var(--fs-sm);font-weight:700;line-height:1}
/* 步骤里的文字跟正文同一个行长，截图不跟着收 —— 与 .prose / .shot 是同一条规矩。 */
.mkf-steps > li > p,.mkf-steps > li > ul{max-width:66ch}
.mkf-steps > li > * + *{margin-top:var(--s-3)}
.mkf-steps p{margin:0;font-size:var(--fs-lg);line-height:var(--lh-relaxed);color:var(--mute)}
.mkf-steps ul{margin:0;padding-left:1.25em;list-style:disc}
.mkf-steps li li + li{margin-top:var(--s-2)}
.mkf-steps strong{color:var(--text);font-weight:600}
.mkf-steps a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;
  text-decoration-thickness:1px;
  text-decoration-color:color-mix(in srgb, var(--accent) 45%, transparent)}
.mkf-steps a:hover{text-decoration-color:var(--accent)}

/* ══════════ h3 子节（.sub）══════════
   一个 h2 段里若干个 h3 子节（「进阶功能」下面有 4 个），
   彼此之间要有边界，否则四段文字加四张图连成一片。 */
.mkf-sub + .mkf-sub{margin-top:var(--s-7);padding-top:var(--s-7);border-top:1px solid var(--line)}
.mkf-sub > * + *{margin-top:var(--s-5)}

/* FAQ 的答案体要能放块级内容（小标题 + 列表），所以 .faq__a 也挂在 <div> 上。
   共享壳里 .faq__a 是类选择器，本来就不限元素。
   ⚠ 答案里的正文**不放开行长**：第一版给了 max-width:none，答案铺到右栏 1206 宽，
   实测 ~150 字符/行 —— 折叠是折叠了，展开后还是「一整片文字」，跟页面其余部分也对不上。
   现在跟正文同走 66ch。 */
.mkf-faq__a .mkf-prose__h4{margin-top:var(--s-4)}
.mkf-faq__a .mkf-prose__h4:first-child{margin-top:0}

/* ══════════ 代码（.code / 行内 code）══════════
   ⚠ **不写 font-family** —— <pre> / <code> 的等宽字体来自浏览器 UA 样式表，本来就有；
   自己再写一条会让自检的「字体族」从 4 变 5。这里只调字号、颜色与底色。
   ⚠ 代码块横向不换行（命令折行会读错），所以它自己滚 —— 页面本身永远不横滚。 */
.mkf-code{margin:0;padding:var(--s-4);border-radius:var(--r-sm);
  background:var(--surface-2);border:1px solid var(--line);
  overflow-x:auto;font-size:var(--fs-sm);line-height:var(--lh-relaxed);color:var(--text);white-space:pre}
.mkf-code code{font-size:inherit;color:inherit;background:none;padding:0;border:0}
.mkf-prose code,.mkf-dev__d code,.mkf-lead code,.mkf-steps code,.mkf-faq__a code,.mkf-list code{
  padding:1px 5px;border-radius:var(--r-xs);
  background:var(--surface-2);color:var(--accent);font-size:.9em}
/* 卡片正文里也可能有列表（sd2.5 的「硬上限 / 实际好用的量」两张卡就是）。 */
.mkf-dev__d ul{margin:var(--s-2) 0 0;padding-left:1.25em;list-style:disc}
.mkf-dev__d li + li{margin-top:var(--s-2)}

/* ══════════ 组件库的断点 ══════════
   ⚠ 顺序有讲究，踩点在这：共享壳的 @media(max-width:1023px) 里有一条
   `.dev{grid-template-columns:minmax(0,1fr)}`，而 `.dev--4` 与 `.dev` **同优先级**。
   `.dev--4` 写在那条之后，所以在 1023 以下它会反过来盖住收单列 ——
   必须在这里把每一档都重写一遍。首页 10.7 节那个 .foot__word 是同一类错。
   1279 那条要写在 1023 前面：同优先级下窄的那条得在后面才赢。 */
@media(max-width:1279px){
  .mkf-dev--4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-tm__grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-tm__grid--3{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-plan{grid-template-columns:repeat(2,minmax(0,1fr))}
  body.mkf-lp .mkf-posts .wp-block-post-template{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-sw{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* 脊在这一档就收单列，不等到 1023 —— 1024 时右栏只有 619，
     三卡每张 195，字全摊成十几行。复用站点已有的 1279，不新增档位。 */
  .mkf-doc{grid-template-columns:minmax(0,1fr);gap:var(--s-4)}
  .mkf-doc__hd{position:static}
  .mkf-lead--start{max-width:72ch}
}
@media(max-width:1023px){
  .mkf-dev--2{grid-template-columns:minmax(0,1fr)}
  .mkf-mq{--mq-w:300px}
  .mkf-wall--4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-wall--6{grid-template-columns:repeat(3,minmax(0,1fr))}
  .mkf-alt{gap:var(--s-6)}
  .mkf-alt__row{grid-template-columns:minmax(0,1fr);gap:var(--s-5)}
  /* 单列时图一律落在文字之后，两侧交替就失去意义了 */
  .mkf-alt__row--rev .mkf-alt__media{order:0}
  .mkf-dev--4{grid-template-columns:minmax(0,1fr)}
  .mkf-wall{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mkf-tm__grid{grid-template-columns:minmax(0,1fr)}
  .mkf-tm__grid--3{grid-template-columns:minmax(0,1fr)}
  .mkf-brand{grid-template-columns:minmax(0,1fr)}
  .mkf-stat{grid-template-columns:minmax(0,1fr)}
  .mkf-plan{grid-template-columns:minmax(0,1fr)}
  body.mkf-lp .mkf-posts .wp-block-post-template{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:767px){
  .mkf-mq{--mq-w:220px}
  .mkf-mq__fade{width:56px}
  .mkf-mh__body{padding:var(--s-6) var(--gutter) var(--s-7)}
  .mkf-strip{--strip-h:180px;--strip-gap:var(--s-2)}
  .mkf-mh__bar{flex-direction:column;align-items:stretch;gap:var(--s-3);
    padding:var(--s-4);text-align:center}
  .mkf-mh__bar .mkf-btn{width:100%}
  .mkf-cta{padding:var(--s-5) var(--s-4)}
  .mkf-tbl th,.mkf-tbl td{padding:var(--s-3)}
}
